epiq 1.16.2 → 1.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env node
2
+ import{a as Ji,c as pd,d as fd,f as gd}from"./chunk-WUCQWBQE.js";import{a as sr,b as a,c as d,d as c,e as St}from"./chunk-5RIQL7P4.js";import{createHash as nv}from"node:crypto";var Jb=new Set(["https:","http:","ssh:","git:","file:"]),Zb=/^[A-Za-z0-9][\w.-]*@[A-Za-z0-9][\w.-]*:[^:]+$/,Qb=/^[\x21-\x7e]+$/,ev=2048,hd="Use https://, ssh://, git:// or user@host:path.",yd=()=>globalThis.process?.env?.EPIQ_ALLOW_LOCAL_REPOS==="1",Gr=(e,t=yd())=>{if(e.length>ev)return"is too long";if(!Qb.test(e))return"holds spaces or characters git would not";if(e.startsWith("-"))return"would be read as an option";if(/[\\#?]/.test(e))return"holds a character a clone URL has no use for";if(e.replace(/\[[^\]]*\]/g,"").includes("::"))return"names a remote helper";if(Zb.test(e))return null;let n;try{n=new URL(e)}catch{return"is not a remote URL"}return/%/.test(tv(e))?"percent-encodes its host":Jb.has(n.protocol)?n.password?"carries a password \u2014 use a credential helper":n.username&&n.protocol!=="ssh:"?"names a user before the host \u2014 leave it to a credential helper":n.protocol==="file:"?t?n.hostname?"names a host in a file:// URL":e.startsWith("file:///")?null:"is not a file:/// URL":"is a path on this machine, which nobody else can fetch":n.hostname?n.hostname.startsWith("-")||n.username.startsWith("-")?"would be read as an option":null:"names no host":"uses a transport epiq does not clone over"},tv=e=>{let t=e.indexOf("//");if(t===-1)return"";let n=e.slice(t+2),r=n.indexOf("/");return r===-1?n:n.slice(0,r)},tn=(e,t=yd())=>Gr(e,t)===null;var Qi=()=>({entries:{},seq:0}),ea="default",ta="board",An=20,rv=/^\d{4}-\d{2}-\d{2}$/,ov=/^[a-z0-9][a-z0-9._-]{0,23}$/,bd=/-[0-9a-f]{12}$/,Tn=e=>e==="board"||e==="all"||sv(e),sv=e=>{if(!rv.test(e)||e<"1970-01-01")return!1;let t=new Date(`${e}T00:00:00Z`);return!Number.isNaN(t.getTime())&&t.toISOString().slice(0,10)===e},Mn=e=>ov.test(e)&&!bd.test(e),iv=/^([^@/]+@)([^:/]+)(:.*)$/,av=/^([a-z][a-z0-9+.-]*:\/\/)([^/]*)(.*)$/i,cv=e=>{let t=iv.exec(e);if(t)return`${t[1]}${t[2].toLowerCase()}${t[3]}`;let n=av.exec(e);if(!n)return e;let r=n[2],o=r.lastIndexOf("@")+1;return`${n[1].toLowerCase()}${r.slice(0,o)}${r.slice(o).toLowerCase()}${n[3]}`},vd=e=>cv(e.trim().replace(/\/+$/,"").replace(/\.git$/i,"")),Pt=e=>(vd(e).toLowerCase().split(/[/:]/).filter(Boolean).pop()??"").replace(/[^a-z0-9._-]/g,"-").slice(0,24).replace(/^[.-]+/,"")||"repo",nn=e=>`${Pt(e)}-${nv("sha1").update(vd(e)).digest("hex").slice(0,12)}`,Wr=e=>e.replace(bd,""),xd=e=>{let t={},{branches:n,since:r,label:o}=e;return(n==="default"||n==="all")&&(t.branches=n),typeof r=="string"&&Tn(r)&&(t.since=r),typeof o=="string"&&(o===""||Mn(o))&&(t.label=o),t},Zi=(e,t)=>{let n={...e,...t.branches?{branches:t.branches}:{},...t.since?{since:t.since}:{}};return t.label===""?delete n.label:t.label&&(n.label=t.label),n},na=(e,t)=>{let n=t.payload&&typeof t.payload=="object"?t.payload:{},r=xd(n);if(t.action==="connect.repo"){let l=typeof n.url=="string"?n.url.trim():"";if(l==="")return a("no URL");let u=nn(l),m=Object.hasOwn(e.entries,u)?e.entries[u]:void 0,p=m?.live===!0?Zi(m,r):Zi({id:u,url:l,branches:ea,since:ta,live:!0,seq:e.seq+1},r);return m?.live||e.seq++,e.entries[u]=p,d("Connected repo",p)}let o=typeof n.repo=="string"?n.repo:"",s=Object.hasOwn(e.entries,o)?e.entries[o]:void 0;if(!s?.live)return a("no such connected repo");if(t.action==="disconnect.repo"){let l={...s,live:!1};return e.entries[o]=l,d("Disconnected repo",l)}if(Object.keys(r).length===0)return a("nothing this build reads to change");let i=Zi(s,r);return e.entries[o]=i,d("Edited repo",i)},lv=e=>e==="connect.repo"||e==="edit.repo"||e==="disconnect.repo",Rd=e=>{let t=Qi();for(let n of e)lv(n.action)&&na(t,{action:n.action,payload:n.payload});return t},Ed=e=>{let t=Object.values(e.entries),n=t.filter(s=>s.live&&tn(s.url)).sort((s,i)=>s.seq-i.seq),r=new Set,o=n.map(s=>{let i=[s.label,Pt(s.url)].find(l=>l!==void 0&&!r.has(l))??s.id;return r.add(i),{id:s.id,url:s.url,branches:s.branches,since:s.since,label:i}});return{live:o.slice(0,An),overLimit:o.slice(An),disconnected:t.filter(s=>!s.live).map(s=>s.id)}},ra=e=>{let t=e.payload&&typeof e.payload=="object"?e.payload:{},n=typeof t.label=="string"&&t.label!==""?t.label:null;if(e.action==="connect.repo")return typeof t.url=="string"?n??Pt(t.url):"";let r=typeof t.repo=="string"?Wr(t.repo):"";if(e.action!=="edit.repo")return r;let o=xd(t),s=[o.label!==void 0?o.label===""?"label cleared":`label ${o.label}`:null,o.branches?`${o.branches} branches`:null,o.since?`since ${o.since}`:null].filter(Boolean);return s.length>0?`${r} (${s.join(", ")})`:r};import In from"chalk";import Gb from"string-width";import{decodeTime as Sd}from"ulid";var as=1440*60*1e3,oa=(e,t=Date.now())=>e>t+as?t:e,kn=e=>oa(Sd(e)),cs=e=>{let t=Date.now()+as,n=e.find(o=>o!==null&&o<=t)??null;if(n===null)return[...e];let r=null;return e.map(o=>{if(o===null)return null;let s=o<=t?o:r??n;return r=s,s})},Cd=e=>{try{return d("Decoded date",new Date(kn(e)))}catch(t){return a("Decoding failed + "+t.message)}},ls=e=>{if(!e?.id)return null;try{return Sd(e.id)}catch{return null}};import ir from"chalk";var De={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#3a3e54",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},A={accent:De.cyan,accent2:De.magenta,primary:De.white,secondary:De.grayDark,secondary2:De.grayLight,gray:De.gray,green:De.green,yellow:De.yellow,red:De.red};var T={red:De.red,yellow:De.yellow,green:De.green,blue:De.blue,magenta:De.magenta,cyan:De.cyan},ds={urgent:T.red,critical:T.red,important:T.red,blocker:T.red,asap:T.red,immediate:T.red,fail:T.red,failure:T.red,broken:T.red,bug:T.red,error:T.red,incident:T.red,outage:T.red,production:T.red,crash:T.red,security:T.red,warning:T.yellow,warn:T.yellow,risky:T.yellow,risk:T.yellow,attention:T.yellow,pending:T.yellow,review:T.yellow,"needs-review":T.yellow,qa:T.yellow,testing:T.yellow,test:T.yellow,validate:T.yellow,verification:T.yellow,staging:T.yellow,check:T.yellow,"follow-up":T.yellow,followup:T.yellow,waiting:T.yellow,blocked:T.yellow,hold:T.yellow,done:T.green,complete:T.green,completed:T.green,success:T.green,ok:T.green,stable:T.green,resolved:T.green,fixed:T.green,closed:T.green,merged:T.green,released:T.green,deployed:T.green,approved:T.green,verified:T.green,working:T.green,healthy:T.green,pass:T.green,passing:T.green,info:T.blue,information:T.blue,note:T.blue,docs:T.blue,documentation:T.blue,doc:T.blue,guide:T.blue,help:T.blue,explanation:T.blue,detail:T.blue,details:T.blue,context:T.blue,design:T.blue,discussion:T.blue,proposal:T.blue,idea:T.blue,feature:T.magenta,enhancement:T.magenta,improvement:T.magenta,refactor:T.magenta,refactoring:T.magenta,cleanup:T.magenta,optimize:T.magenta,optimization:T.magenta,perf:T.magenta,performance:T.magenta,upgrade:T.magenta,migration:T.magenta,modernize:T.magenta,debt:T.magenta,todo:T.cyan,next:T.cyan,planned:T.cyan,plan:T.cyan,future:T.cyan,backlog:T.cyan,investigate:T.cyan,explore:T.cyan,prototype:T.cyan};var ia={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},aa=(e,t,n)=>Math.max(t,Math.min(n,e)),sa=(e,t,n)=>e+(t-e)*n,ca=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},wd=e=>e.toLowerCase().trim(),Id=(e,t,n)=>{let r=t/100,o=n/100,s=(1-Math.abs(2*o-1))*r,i=e/60,l=s*(1-Math.abs(i%2-1)),u=0,m=0,p=0;i>=0&&i<1?(u=s,m=l):i>=1&&i<2?(u=l,m=s):i>=2&&i<3?(m=s,p=l):i>=3&&i<4?(m=l,p=s):i>=4&&i<5?(u=l,p=s):(u=s,p=l);let f=o-s/2;return[Math.round((u+f)*255),Math.round((m+f)*255),Math.round((p+f)*255)]},us=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,Nd=e=>{let t=e.replace("#","");return[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]},Ad=(e,t,n)=>{let r=aa(n,0,1);return[Math.round(sa(e[0],t[0],r)),Math.round(sa(e[1],t[1],r)),Math.round(sa(e[2],t[2],r))]};var dv=(e,t,n)=>Ad(e,t,n),la=e=>{let t=ca(e)%360,n=Id(t,ia.stringColor.saturation,ia.stringColor.lightness);return us(n)},Ue=(e,t=ds)=>{let n=wd(e??"");return n&&t[n]?t[n]:la(n)},Td=e=>us(Id(ca(wd(e))%360,28,58));var Md=e=>{let t=ia.gradient.stops,n=aa(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let r=t.length-1,o=n*r,s=Math.min(Math.floor(o),r-1),i=o-s;return dv(t[s],t[s+1],i)},eA=(e,t)=>{if(e.length===0)return"#000000";if(e.length===1)return e[0];let n=e.length-1,r=aa(t,0,1)*n,o=Math.min(Math.floor(r),n-1);return us(Ad(Nd(e[o]),Nd(e[o+1]),r-o))},kd=e=>us(Md(e)),ms=e=>ca(e.toLowerCase().trim())/4294967295,Ld=e=>{let t=ms(e);return Md(t)},uv=e=>{let[t,n,r]=Ld(e);return{normal:o=>ir.bgRgb(t,n,r).black(o),cursor:o=>ir.bgRgb(t,n,r).white.bold(o)}},tA=e=>{let[t,n,r]=Ld(e);return{fg:o=>ir.rgb(t,n,r)(o),fgCursor:o=>ir.rgb(t,n,r).inverse(o),bg:o=>ir.bgRgb(t,n,r).black(o),bgCursor:o=>ir.bgRgb(t,n,r).white.bold(o)}},ps=e=>uv(e).normal(` ${e} `);var mv="Unknown",da=(e,t)=>t?.length?t:e?.length?e:mv,ua=(e,t)=>{let n=da(e,t);return{id:e?.length?e:n,name:n,color:Ue(n)}};var Pd="removed",tt=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?d("Found node",n):a("Unable to find node in breadcrumb")},Od=["png","jpg","gif","webp"];var nt=e=>e.trim().toLowerCase(),ar=e=>{let t=nt(e);return t.length>0&&t.length<=254&&/^[^\s@]+@[^\s@]+$/.test(t)},ma=(e,t)=>`${nt(e)} ${t}`,pa=e=>!e.tombstoned,cA=(e,t)=>{let n=nt(t),r=new Set;for(let o of Object.values(e))pa(o)&&o.email===n&&r.add(o.contributor);return[...r]},cr=(e,t)=>{let n=new Set;for(let r of Object.values(e))pa(r)&&r.contributor===t&&n.add(r.email);return[...n]},lA=e=>{let t=new Map;for(let r of Object.values(e)){if(!pa(r))continue;let o=t.get(r.email)??new Set;o.add(r.contributor),t.set(r.email,o)}let n=new Map;for(let[r,o]of t){let[s]=[...o];o.size===1&&s&&n.set(r,s)}return n};var Dd=(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 fa(e){return e.context===re.WORKSPACE}function j(e){return e.context===re.TICKET}function Fd(e){return e.context===re.TEXT}function Fe(e){return e.context===re.FIELD}function zr(e){return e.context===re.FIELD_LIST}var rt=e=>e.context===re.SWIMLANE,Vr=e=>e.context===re.BOARD,Kr=e=>e.context===re.COMMENT;import{useSyncExternalStore as hI}from"react";var y={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette",IDENTITY:"identity"};var _d=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",$d=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",Bd=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",Ud=(e,t)=>{if($d(e,e.sequence))return C.MoveCursorLeftOfWord;if(Bd(e,e.sequence))return C.MoveCursorRightOfWord;if(_d(e,e.sequence))return C.EraseInputWord;switch(e.name){case"tab":return C.AutoCompleteCommand;case"up":return C.GetLastCommandFromHistory;case"down":return C.GetNextCommandFromHistory;case"left":return C.MoveCursorLeft;case"right":return C.MoveCursorRight;case"return":return C.Confirm;case"backspace":return t?C.EraseInput:C.ExitCommandLine;case"escape":return C.ExitCommandLine;default:return C.CaptureInput}},jd=(e,t)=>{if($d(e,e.sequence))return C.MoveCursorLeftOfWord;if(Bd(e,e.sequence))return C.MoveCursorRightOfWord;if(_d(e,e.sequence))return C.EraseInputWord;switch(e.name){case"tab":return C.AutoCompleteCommand;case"up":return C.NavPreviousItem;case"down":return C.NavNextItem;case"left":return C.MoveCursorLeft;case"right":return C.MoveCursorRight;case"return":return C.Confirm;case"backspace":return t?C.EraseInput:C.ExitCommandLine;case"escape":return C.ExitCommandLine;default:return C.CaptureInput}};import Hd from"string-width";function fs(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var Ln=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",pv=/\u001B\[[0-9;]*m/,ga="\x1B[0m",fv=e=>[...new Intl.Segmenter(void 0,{granularity:"grapheme"}).segment(e)].map(({segment:t})=>t),Pn=(e,t)=>{if(t<=0)return"";if(Hd(e)<=t)return e;if(t<=3)return"...".slice(0,t);let r=t-3,o="",s=0,i=!1;for(let l of e.split(/(\u001B\[[0-9;]*m)/))if(l!==""){if(pv.test(l)){o+=l,i=l!==ga&&l!=="\x1B[m";continue}for(let u of fv(l)){let m=Hd(u);if(s+m>r)return`${o}...${i?ga:""}`;o+=u,s+=m}}return`${o}...${i?ga:""}`},dt=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim(),hA=e=>e.charAt(0).toUpperCase()+e.slice(1);var Gd=e=>{let t=new Map;for(let n of e){let r=n.toLowerCase();for(let o=1;o<=n.length;o++){let s=r.slice(0,o),i=t.get(s);i?i.push(n):t.set(s,[n])}}return t},Wd=(e,t)=>t?e.get(t)??[]:[];var zd=new WeakMap,gv=e=>{let t=zd.get(e);return t||(t=Gd(e),zd.set(e,t)),t};var Vd=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return Wd(gv(e),r).filter(s=>fs(r,s.toLowerCase())>=n)};var hv={hint:"",hints:[],overlap:0,remainder:""},qd=({inputToMatch:e,lastWord:t,isLastWordCompleted:n,inputString:r},o,s=[])=>{if(n||e===""){let[l]=s;return s.length===1&&l&&!r.trim()?Kd("",[l]):hv}let i=Vd({wordList:o,inputToMatch:e,overlapThreshold:1});return Kd(t,i)},Kd=(e,t)=>{let n=t[0]??"",r=fs(e.toLowerCase(),n.toLowerCase()),[o,s]=n.split(":"),i=r<(o??"").length,l=!!s,p=(l&&i?o:n)+(l&&i?":":" "),f=p.slice(r);return{hint:p,hints:t,overlap:r,remainder:f}};var lr=e=>{let t=typeof e=="number"?e:Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<3e3||t>864e5?null:t},gs=e=>e==null||!Number.isFinite(e)?1e4:Math.min(864e5,Math.max(1,e));import so from"node:fs";import io from"node:path";import{z as pr}from"zod";import oo from"node:fs";import{ulid as Xv}from"ulid";import{z as Rs}from"zod";import eo from"node:fs";import Dt from"node:path";import rn from"node:fs";import Ke from"node:path";import yv from"node:os";import bv from"node:path";var Ct=".epiq-global",ze=()=>process.env.EPIQ_GLOBAL_DIR??bv.join(yv.homedir(),Ct);var ha=(e,t)=>{let n=new Map,r=t??((...s)=>JSON.stringify(s)),o=((...s)=>{let i=r(...s);if(!n.has(i)){let l=e(...s).then(u=>(c(u)&&n.delete(i),u));n.set(i,l)}return n.get(i)});return o.clear=()=>n.clear(),o};import Nt from"fs";import Ra from"path";import vv from"util";var Yd=500,Ea=4*1024*1024,ya=16*1024,xv=50,ba=0,Xd=()=>process.env.EPIQ_MCP==="true",Rv=()=>{let e=process.cwd(),t=hs(e);return c(t)?Xd()?Ra.join(ze(),"epiq-mcp.log"):void 0:Ra.join(t.value,je,"log","epiq.log")},Ev=(e,t)=>{let n=Nt.statSync(e).size;if(n<=t)return Nt.readFileSync(e,"utf8");let r=Nt.openSync(e,"r");try{let o=Buffer.alloc(t);Nt.readSync(r,o,0,t,n-t);let s=o.toString("utf8"),i=s.indexOf(`
3
+ `);return i===-1?"":s.slice(i+1)}finally{Nt.closeSync(r)}};function Sv(e){if(!Nt.existsSync(e))return;let t=Nt.statSync(e).size,n=Ev(e,Ea).split(`
4
+ `);if(n[n.length-1]===""&&n.pop(),t<=Ea&&n.length<=Yd)return;let r=n.slice(-Yd).join(`
5
+ `)+`
6
+ `;Nt.writeFileSync(e,r,"utf8")}var Cv=e=>{if(e.length<=ya)return e;let t=e.length-ya;return`${e.slice(0,ya)} \u2026 [${t} more chars]`};function va(e,t,n=!1){let r=Rv();if(!r)return;let o=Cv(vv.format(...t)),s=new Date,l=`[${n?s.toISOString().slice(11,19):s.toISOString()}] ${e} ${o}
7
+ `;try{Nt.mkdirSync(Ra.dirname(r),{recursive:!0}),Nt.appendFileSync(r,l,"utf8"),ba++,(ba>=xv||Nt.statSync(r).size>Ea)&&(ba=0,Sv(r))}catch{}}var xa=()=>Xd()?process.env.EPIQ_MCP_LOG_LEVEL??"error":process.env.EPIQ_LOG_LEVEL??"debug",K={info(...e){let t=xa();(t==="info"||t==="debug")&&va("[Info]",e,!1)},debug(...e){xa()==="debug"&&va("[Debug]",e,!0)},error(...e){let t=xa();if(t==="error"||t==="info"||t==="debug"){let r=e.some(o=>o instanceof Error)?void 0:new Error().stack;va("[Error]",[...e,r].filter(Boolean),!1)}}};globalThis.logger=K;import{spawn as eu}from"node:child_process";import Ve from"node:fs";import we from"node:path";var fe={stage:({cwd:e,pathspec:t,ignoreRemoval:n=!1})=>_({args:["add",...n?["--ignore-removal"]:[],...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1,pathspec:r})=>_({args:["commit","--no-verify",...n?["--allow-empty"]:[],"-m",t,...r?.length?["--",...r]:[]],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>_({args:["fetch",t,`+refs/heads/${n}:refs/remotes/${t}/${n}`],cwd:e}),rebaseOnto:({cwd:e,ref:t})=>_({args:["-c","rebase.autoStash=true","rebase",t],cwd:e}),checkout:({cwd:e,branch:t})=>_({args:["checkout",t],cwd:e}),push:({cwd:e,remote:t,branch:n,setUpstream:r=!1})=>{let o=t&&n?["push","--no-verify",...r?["-u"]:[],t,n]:["push","--no-verify"];return _({args:o,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>_({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>_({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>_({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>_({args:["worktree","prune"],cwd:e})};var wt=e=>{let t=Ee(e);if(c(t))return a("Unable to resolve epiq project root");let n=He(t.value);return c(n)?a("Unable to read project.json"):d("Resolved state branch",n.value.stateBranch)},ot="origin";var tu="Output past",bs=e=>e.includes(tu),nu="Git command timed out",ru=e=>e.includes(nu),Ca=1e4,Nv=12e4,Na=256*1024*1024,ou=64*1024,wv=8*1024*1024,Iv=new Set(["fetch","push","pull","clone","ls-remote","rebase","checkout","worktree"]),Av=e=>{let t=iu(e);return t&&Iv.has(t)?Nv:Ca},Tv=()=>{let e=process.platform==="win32"?["git.exe","git"]:["git"];for(let t of(process.env.PATH??"").split(we.delimiter))if(t)for(let n of e){let r=we.join(t,n);try{if(!Ve.statSync(r).isFile())continue;return Ve.accessSync(r,Ve.constants.X_OK),r}catch{continue}}return"git"},su=Tv(),Mv=["GIT_DIR","GIT_WORK_TREE","GIT_INDEX_FILE","GIT_OBJECT_DIRECTORY","GIT_ALTERNATE_OBJECT_DIRECTORIES","GIT_COMMON_DIR","GIT_NAMESPACE"],kv=e=>Object.fromEntries(Object.entries(e).filter(([t])=>!Mv.includes(t))),wa={...kv(process.env),GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo",GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND??"ssh -o BatchMode=yes -o ConnectTimeout=10"},Lv=["-c","diff.noprefix=false","-c","diff.mnemonicPrefix=false","-c","diff.srcPrefix=a/","-c","diff.dstPrefix=b/","-c","log.showSignature=false"],Pv=new Set(["log","show","diff"]),iu=e=>e.find((t,n)=>!t.startsWith("-")&&e[n-1]!=="-c"),Ov=e=>Pv.has(iu(e)??"")?Lv:[],au=()=>["attr.tree=refs/epiq/no-attributes",`core.hooksPath=${we.join(ze(),"repos",".no-hooks")}`,"protocol.ext.allow=never","protocol.fd.allow=never","protocol.file.allow=always","submodule.recurse=false","fetch.recurseSubmodules=false","credential.interactive=never","core.longpaths=true","gc.auto=0","maintenance.auto=false","fetch.unpackLimit=1","fetch.writeCommitGraph=false","core.logAllRefUpdates=false"].flatMap(e=>["-c",e]),Dv=/^[\w-]+[\\/][a-z0-9._-]+-[0-9a-f]{12}\.git(\.\d+(-\d+)?(\.[0-9a-f-]{36})?\.pending)?$/,Jd=e=>{try{return Ve.realpathSync(e)}catch{return we.resolve(e)}},Ia=e=>{let t=we.join(ze(),"repos");return[[we.resolve(t),we.resolve(e)],[Jd(t),Jd(e)]].some(([n,r])=>Dv.test(we.relative(n,r)))},Fv=e=>Ia(e)?["--git-dir=.",...au()]:[],cu={...Object.fromEntries(Object.entries(wa).filter(([e])=>e!=="GIT_ALLOW_PROTOCOL")),LC_ALL:"C",LANGUAGE:"",GIT_PROTOCOL_FROM_USER:"0"},ys=new Set,Zd=!1,lu=process.platform!=="win32",du=(e,t)=>{try{if(lu&&e.pid){process.kill(-e.pid,t);return}}catch{}e.kill(t)},Sa=(e="SIGTERM")=>{for(let t of ys)du(t,e)},_v=["SIGTERM","SIGINT","SIGHUP"],uu=!1,mu=()=>uu,$v=2e3,pu=()=>{if(Zd)return;Zd=!0,process.once("exit",()=>Sa());let e=new Map;for(let t of _v)e.set(t,()=>{uu=!0;let n=()=>{for(let[s,i]of e)process.off(s,i);process.kill(process.pid,t)};Sa();let r=Date.now()+$v,o=()=>{if(ys.size===0)return n();if(Date.now()>=r)return Sa("SIGKILL"),n();setTimeout(o,20)};o()});for(let[t,n]of e)process.once(t,n)},fu=e=>{ys.add(e),e.once("close",()=>ys.delete(e))},gu=({args:e,cwd:t,allowFail:n,timeoutMs:r,maxOutput:o=Na,forClone:s=!1,keepPartial:i=!1,abort:l,input:u})=>new Promise(m=>{let p=Ia(t),f=p||s,g=[...Ov(e),...p?["--git-dir=."]:[],...f?au():[],...e];if(!Ve.existsSync(t)){let F=`Git cwd does not exist: ${t}`;if(n){m({stdout:"",stderr:F,exitCode:1});return}m(a(F));return}f&&pu();let v=eu(su,g,{cwd:t,stdio:["pipe","pipe","pipe"],env:f?cu:wa,detached:f&&lu});f&&fu(v),v.stdin.on("error",()=>{}),v.stdin.end(u??"");let w=F=>f?du(v,F):v.kill(F),x=!1,E="",N="",S=F=>{x||(x=!0,clearTimeout(P),m(F))},k=r??Av(g),L=!1,B=()=>[`git ${g.join(" ")}`,`cwd=${t}`,`${nu} after ${k}ms`].join(`
8
+ `),M=()=>S(n?{stdout:E,stderr:B(),exitCode:124}:a(B())),P=setTimeout(()=>{L=!0,w("SIGTERM"),setTimeout(()=>w("SIGKILL"),3e3).unref(),setTimeout(M,6e3).unref()},k),$=null,de=()=>{let F=[`git ${g.join(" ")}`,$].join(`
9
+ `);S(n?{stdout:E,stderr:F,exitCode:1}:a(F))},U=()=>{$=String(l?.reason??"stopped"),w("SIGTERM"),setTimeout(()=>w("SIGKILL"),3e3).unref(),setTimeout(de,6e3).unref()};l?.aborted?U():l?.addEventListener("abort",U,{once:!0}),v.stdout.setEncoding("utf8"),v.stderr.setEncoding("utf8"),v.stdout.on("data",F=>{if(E+=F,E.length>o){if(w("SIGTERM"),i&&!n){let en=E.slice(0,o);S(d("Git output cut",{stdout:en.slice(0,en.lastIndexOf(`
10
+ `)+1),stderr:N,exitCode:0,truncated:!0}));return}let Re=`git ${g.join(" ")}
11
+ ${tu} ${o} characters; stopped`;S(n?{stdout:"",stderr:Re,exitCode:1}:a(Re))}}),v.stderr.on("data",F=>{N.length<ou&&(N+=F)}),v.on("error",F=>{if(n){S({stdout:E,stderr:F.message,exitCode:1});return}S(a([`git ${g.join(" ")}`,`cwd=${t}`,F.message].join(`
12
+ `)))}),v.on("close",F=>{if(l?.removeEventListener("abort",U),L)return M();if($!==null)return de();let Re=F??1;if(n){S({stdout:E,stderr:N,exitCode:Re});return}if(Re!==0){S(a([`git ${g.join(" ")}`,N.trim()||E.trim()||"Git command failed"].filter(Boolean).join(`
13
+ `)));return}S(d("Git command succeeded",{stdout:E,stderr:N,exitCode:Re}))})}),_=({args:e,cwd:t,timeoutMs:n,maxOutput:r,forClone:o,keepPartial:s,abort:i,input:l})=>gu({args:e,cwd:t,allowFail:!1,timeoutMs:n,maxOutput:r,forClone:o,keepPartial:s,abort:i,input:l}),Se=({args:e,cwd:t})=>gu({args:e,cwd:t,allowFail:!0}),hu=(e,t)=>new Promise(n=>{if(e.length===0){n(d("No blobs to read",new Map));return}let r=Ia(t);r&&pu();let o=eu(su,[...Fv(t),"cat-file","--batch"],{cwd:t,stdio:["pipe","pipe","pipe"],env:r?cu:wa});r&&fu(o);let s=[],i="",l=!1,u=f=>{l||(l=!0,clearTimeout(m),n(f))},m=setTimeout(()=>{o.kill("SIGTERM"),u(a(`git cat-file --batch timed out after ${Ca}ms`))},Ca),p=0;o.stdout.on("data",f=>{if(p+=f.length,p>Na){o.kill("SIGTERM"),u(a(`git cat-file --batch: past ${Na} bytes; stopped`));return}s.push(f)}),o.stderr.setEncoding("utf8"),o.stderr.on("data",f=>{i.length<ou&&(i+=f)}),o.on("error",f=>u(a(f.message))),o.on("close",f=>{if(f!==0){u(a(`git cat-file --batch exited ${f}${i?`
14
+ ${i}`:""}`));return}let g=Buffer.concat(s),v=new Map,w=0;for(let x of e){let E=g.indexOf(10,w);if(E===-1){u(a(`git cat-file --batch output ended before a header for ${x}`));return}let N=g.toString("utf8",w,E);w=E+1;let S=/^[0-9a-f]{4,64} \S+ (\d+)$/.exec(N);if(!S||!S[1]){u(a(`Unexpected git cat-file --batch header: "${N}"`));return}let k=Number(S[1]);k<=wv&&v.set(x,g.toString("utf8",w,w+k)),w+=k+1}u(d("Read blobs",v))}),o.stdin.write(e.join(`
15
+ `)+`
16
+ `),o.stdin.end()}),ur=async({cwd:e,message:t,pathspec:n})=>{let r=await fe.commit({cwd:e,message:t,pathspec:n});if(c(r))return a(`Failed to create commit
17
+ ${r.message}`);let o=await _({args:["rev-parse","HEAD"],cwd:e});return c(o)?a(`Commit created, but failed to read HEAD SHA
18
+ ${o.message}`):d("Created commit and resolved SHA",o.value.stdout.trim())},qr=async e=>{let t=await _({cwd:e,args:["rev-parse","--git-dir"]});if(c(t))return a(t.message);let n=t.value.stdout.trim();return d("Resolved git dir",we.isAbsolute(n)?n:we.resolve(e,n))},Aa=async e=>{let t=await qr(e);if(c(t))return a(t.message);let n=t.value,r={MERGE_HEAD:"merge in progress"};for(let[s,i]of Object.entries(r))if(Ve.existsSync(we.join(n,s)))return d("Checked for in-progress Git operation",i);let o={"rebase-merge":"rebase in progress","rebase-apply":"rebase in progress"};for(let[s,i]of Object.entries(o))if(Ve.existsSync(we.join(n,s)))return d("Checked for in-progress Git operation",i);return d("Checked for in-progress Git operation",null)},yu=async e=>{let t=await Aa(e);return c(t)?a(t.message):d("Checked for in-progress Git operation",t.value!==null)},Gt=async({repoRoot:e})=>{let n=(await Se({args:["remote","get-url",ot],cwd:e})).exitCode===0;return d(`Checked remote ${n}`,n)},Yr=async({repoRoot:e,branch:t})=>{let n=await Se({args:["ls-remote","--heads",ot,t],cwd:e});return n.exitCode!==0?a(n.stderr.trim()||`Unable to inspect remote branch ${ot}/${t}`):d("Checked remote branch",n.stdout.trim().length>0)},vs=async({repoRoot:e,branch:t})=>{let n=await Se({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?d("Local branch exists",!0):n.exitCode===1?d("Local branch missing",!1):a(n.stderr.trim()||`Unable to inspect branch ${t}`)},dr=e=>{try{return Ve.realpathSync.native(e)}catch{return we.resolve(e)}},bu=async({repoRoot:e,worktreeRoot:t})=>{let n=await _({args:["worktree","list","--porcelain"],cwd:e});if(c(n))return a(n.message);let r=dr(t),o=n.value.stdout.split(`
19
+ `).filter(s=>s.startsWith("worktree ")).map(s=>s.slice(9)).map(dr).includes(r);return d("Checked worktree registration",o)},Ta=async e=>{let t=await Se({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return d("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},xs=async e=>{let t=await _({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return c(t)?a(t.message):d("Resolved current branch",t.value.stdout.trim())},vu=async e=>{let t=await _({args:["rev-parse","--short","HEAD"],cwd:e});return c(t)?a(t.message):d("Resolved short HEAD sha",t.value.stdout.trim())},xu=e=>e.includes("fetch first")||e.includes("non-fast-forward"),Ru=async e=>{let t=await Se({cwd:e,args:["rev-parse","--absolute-git-dir"]});if(t.exitCode!==0)return!1;let n=t.stdout.trim();return n?Ve.existsSync(we.join(n,"rebase-merge"))||Ve.existsSync(we.join(n,"rebase-apply")):!1},Bv=3,Uv=120,jv=e=>new Promise(t=>setTimeout(t,e)),Hv=async(e,t)=>{let n=await fe.rebaseOnto({cwd:e,ref:t});for(let r=1;r<Bv;r+=1){if(!c(n)||await Ru(e))return n;await jv(Uv),n=await fe.rebaseOnto({cwd:e,ref:t})}return n},Eu=async(e,{preserve:t=[]}={})=>{let n=await qr(e);if(c(n))return a(n.message);let r=n.value,o=[];for(let s of Ve.readdirSync(r))if(s.endsWith(".lock")&&!t.includes(s))try{Ve.rmSync(we.join(r,s),{force:!0}),o.push(s)}catch{}return d("Cleared stale git lock files",o)},Su=async(e,t)=>{let n=await Se({cwd:e,args:["rev-parse","--git-common-dir"]});if(n.exitCode!==0)return a(`Unable to resolve the common git directory at ${e}`);let r=we.resolve(e,n.stdout.trim()),o=we.join(r,"refs","heads"),s=we.resolve(o,`${t}.lock`);if(!s.startsWith(`${o}${we.sep}`))return a(`Refusing to clear a ref lock outside ${o}`);if(!Ve.existsSync(s))return d("No ref lock to clear",!1);try{Ve.rmSync(s,{force:!0})}catch{return d("Ref lock could not be cleared",!1)}return d("Cleared a stale ref lock",!0)},Ma=async e=>{if(!await Ru(e))return d("No rebase to abort",!1);let t=await Se({cwd:e,args:["rebase","--abort"]});return t.exitCode!==0?a(`Failed to abort the rebase in progress at ${e}
20
+ ${t.stderr.trim()}`):d("Aborted stale rebase",!0)},Qd=async e=>{let t=await Se({args:["rev-parse","HEAD"],cwd:e});return t.exitCode===0?t.stdout.trim():null},Xr=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),Gv=e=>e.includes("couldn't find remote ref")||e.includes("Could not find remote branch"),Jr=async({cwd:e,branch:t})=>{let n=await Ma(e);if(c(n))return a(n.message);let r=await Qd(e),o=await fe.fetch({cwd:e,remote:ot,branch:t});if(c(o))return Gv(o.message)?d("Remote branch missing, skipped pull",!1):a(`Failed to fetch ${t}
21
+ ${o.message}`);let s=await Hv(e,`${ot}/${t}`);if(c(s))return a(`Failed during rebase
22
+ ${s.message}`);let i=await Qd(e),l=r!==null&&i!==null&&r!==i;return d(l?"Pulled with rebase":"Already up to date",l)},Cu=async({branch:e,cwd:t})=>{let n=await Se({args:["rev-list","--count","@{u}..HEAD"],cwd:t});return n.exitCode===0?d("Compared against upstream",Number(n.stdout.trim())>0?"ahead":"up-to-date"):(await Se({args:["config","--get",`branch.${e}.merge`],cwd:t})).exitCode===1?d("Never published","unpublished"):d("Upstream gone","up-to-date")},Nu=async e=>{let t=await Se({args:["status","--porcelain","--untracked-files=all"],cwd:e});return t.exitCode!==0?a(t.stderr.trim()||"Unable to inspect the worktree for changes"):d("Inspected worktree for changes",t.stdout.trim().length>0)},wu=async(e,t)=>{let n=await Se({args:["diff","--cached","--quiet",...t?.length?["--",...t]:[]],cwd:e});return n.exitCode===0?d("No staged changes",!1):n.exitCode===1?d("Has staged changes",!0):a(n.stderr.trim()||"Unable to inspect staged changes")};var Iu=async e=>{let t=await xs(e);return c(t)?a(t.message):d("Checked detached HEAD state",t.value==="HEAD")};var Mu="4b825dc642cb6eb9a060e54bf8d69288fbee4904",ku=e=>Ke.join(je,Wt,e),Lu=()=>Ke.join(je,Pa),Pu=ze,On=()=>Ke.join(Pu(),"worktrees"),ve=({repoRoot:e})=>{let t=Ot(e);return c(t)?a(t.message):d("Resolved state branch root",Ke.join(On(),t.value))},Wv=e=>Ke.join(e,je),Au=e=>Ke.join(Wv(e),Wt);var Zr=e=>{try{return rn.mkdirSync(e,{recursive:!0}),d("Ensured directory",void 0)}catch(t){return a(t instanceof Error?t.message:String(t))}},Qr=()=>{let e=Pu(),t=On(),n=!rn.existsSync(e)||!rn.existsSync(t),r=Zr(e);if(c(r))return a(`Ensure epiq home failed.
23
+ `+r.message);let o=Zr(t);return c(o)?a(`Ensure worktrees dir failed.
24
+ `+o.message):d("Ensured epiq storage",n)},Ou=e=>{rn.existsSync(e)&&(K.debug("[sync] remove path",e),rn.rmSync(e,{recursive:!0,force:!0}))};var zv=`*.jsonl merge=union
25
+ `,Vv=`*~pending*.jsonl
26
+ `,ka=()=>Ke.join(je,Wt,".gitattributes"),La=()=>Ke.join(je,Wt,".gitignore"),Tu=(e,t)=>{try{rn.readFileSync(e,"utf8")!==t&&rn.writeFileSync(e,t)}catch{rn.writeFileSync(e,t)}},Du=(e,t)=>{for(let n of[Au(e),Au(t)]){let r=Zr(n);if(c(r))return a(r.message)}return Tu(Ke.join(t,ka()),zv),Tu(Ke.join(t,La()),Vv),d("Ensured state branch",void 0)},Fu=async e=>{let t=await _({args:["ls-tree","--name-only","HEAD"],cwd:e});if(c(t))return a(`ensure state branch is storage only failed
27
+ `+t.message);let r=t.value.stdout.trim().split(`
28
+ `).filter(Boolean).filter(i=>i!==je);if(r.length===0)return d("State branch is storage-only",!1);let o=await _({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(c(o))return a(`Failed to clean storage branch
29
+ ${o.message}`);let s=await ur({cwd:e,message:"[epiq:repair-storage-branch]",pathspec:r});return c(s)?a(s.message):d("Cleaned storage branch",!0)},It=ha(async(e=process.cwd())=>{let t=await _({args:["rev-parse","--show-toplevel"],cwd:e});return c(t)?a("Not inside a Git repository"):d("Resolved repo root",t.value.stdout.trim())},e=>Ke.resolve(e)),uT=ha(async e=>{let t=await _({args:["rev-parse","--git-dir"],cwd:e});if(c(t))return a(t.message);let n=t.value.stdout.trim(),r=Ke.isAbsolute(n)?n:Ke.join(e,n);return d("Resolved git dir",r)},e=>Ke.resolve(e));var bT=process.env.IS_LOCAL==="true",je=".epiq",Wt="events",Pa="media",Kv="project.json",to=e=>Dt.join(e,je),mr=e=>Dt.join(to(e),Kv),qe=e=>Dt.join(to(e),Wt),no=e=>Dt.join(to(e),Pa),_u=e=>Dt.join(e,je),qv=e=>{let t=Dt.join(e,je);return eo.existsSync(t)&&eo.statSync(t).isDirectory()},ro=e=>{let t=mr(e);return eo.existsSync(t)&&eo.statSync(t).isFile()},hs=e=>{let t=Dt.resolve(e);for(;;){if(qv(t))return d("Resolved closest .epiq root",t);let n=Dt.dirname(t);if(n===t)return a("No .epiq directory found in any parent");t=n}},Yv="No .epiq/project.json found in any parent",Ee=e=>{let t=Dt.resolve(e);for(;;){if(ro(t))return d("Resolved closest epiq project root",t);let n=Dt.dirname(t);if(n===t)return a(Yv);t=n}},$u=e=>{let t=qe(e);try{return eo.mkdirSync(t,{recursive:!0}),d("Resolved events dir",t)}catch(n){return a(n instanceof Error?`Failed to ensure events dir: ${n.message}`:"Failed to ensure events dir")}},ae=async()=>{let e=await It(process.cwd());if(c(e))return e;let t=ve({repoRoot:e.value});return c(t)?t:d("Resolved persist root",t.value)};var Oa="__epiq_state__",Jv=Rs.object({projectId:Rs.string().min(1),stateBranch:Rs.string().min(1),createdAt:Rs.iso.datetime()}),Es=()=>({projectId:Xv(),stateBranch:Oa,createdAt:new Date().toISOString()}),He=e=>{let t=mr(e);if(!oo.existsSync(t))return a("Missing .epiq/project.json");try{let n=oo.readFileSync(t,"utf8"),r=JSON.parse(n),o=Jv.safeParse(r);return o.success?d("Read project.json",o.data):a(`Invalid .epiq/project.json: ${o.error.issues.map(s=>`${s.path.join(".")}: ${s.message}`).join(", ")}`)}catch(n){return a(n instanceof Error?`Failed to read .epiq/project.json: ${n.message}`:"Failed to read .epiq/project.json")}},Ot=e=>{let t=He(e);return c(t)?a(t.message):d("Read projectId",t.value.projectId)},Da=({repoRoot:e,fileContents:t})=>{let n=to(e),r=mr(e);try{if(oo.mkdirSync(n,{recursive:!0}),oo.existsSync(r)){let o=He(e);return c(o)?a(o.message):d("Project already initialized",null)}return oo.writeFileSync(r,JSON.stringify(t,null,2)+`
30
+ `,"utf8"),d("Created project.json",null)}catch(o){return a(o instanceof Error?`Failed to initialize project: ${o.message}`:"Failed to initialize project")}};var Ss="recent-projects.json",Zv=20,Qv=pr.object({projectId:pr.string().min(1),root:pr.string().min(1),lastOpenedAt:pr.number().finite()}),ex=pr.object({projects:pr.array(Qv)}),Uu=()=>io.join(ze(),Ss),ju=e=>io.basename(e)||e,Bu=e=>{let t=io.resolve(e);try{return so.realpathSync(t)}catch{return t}},Hu=(e,t)=>t.lastOpenedAt-e.lastOpenedAt,Gu=e=>{if(!ro(e.root))return!1;let t=Ot(e.root);return!c(t)&&t.value===e.projectId},Wu=()=>{let e=Uu();if(!so.existsSync(e))return d("No recent projects recorded",[]);let t;try{t=JSON.parse(so.readFileSync(e,"utf8"))}catch(r){return a(`Invalid ${Ss}: ${r instanceof Error?r.message:String(r)}`)}let n=ex.safeParse(t);return n.success?d("Read recent projects",n.data.projects):a(`Invalid ${Ss} shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},tx=e=>{let t=Uu();try{so.mkdirSync(io.dirname(t),{recursive:!0}),so.writeFileSync(t,JSON.stringify({projects:e},null,2)+`
31
+ `,"utf8")}catch(n){return a(`Unable to write ${Ss}: ${n instanceof Error?n.message:String(n)}`)}return d("Recorded recent project",e)},Cs=({exclude:e}={})=>{let t=Wu();if(c(t))return t;let n=e===void 0?null:Bu(e);return d("Listed recent projects",t.value.filter(r=>n===null||Bu(r.root)!==n).filter(Gu).sort(Hu))},zu=({root:e,now:t=Date.now()})=>{let n=io.resolve(e),r=Ot(n);if(c(r))return a(r.message);let o=r.value,s=Wu(),i=c(s)?[]:s.value,l=[{projectId:o,root:n,lastOpenedAt:t},...i.filter(u=>u.projectId!==o&&u.root!==n)].filter(Gu).sort(Hu).slice(0,Zv);return tx(l)};import{useSyncExternalStore as nx}from"react";var ao={logLevel:"info",autoSyncIntervalMs:null,attachmentMaxKb:null,autoSync:null,preferredEditor:null,userName:null,userId:null,gitEmail:null,gitName:null,declinedEmailBoards:[],viewMode:null},Fa=new Set,rx=()=>{for(let e of Fa)e()},ne=()=>ao,$T=()=>nx(e=>(Fa.add(e),()=>{Fa.delete(e)}),()=>ao),ut=e=>(ao={...ao,...e},rx(),ao);var _a=null,Vu=e=>{_a=e},Ku=e=>_a?_a(e):[];var qu=[],Yu=e=>{qu=e},fr=()=>qu;var co=()=>{let e=ne(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim(),r=e.autoSync===!0||e.autoSync===!1,o=Xu(),s=o.length>0?null:$a(),i=s!==null&&(e.declinedEmailBoards??[]).includes(s),l=o.length>0||i||s===null;return{isSetupDone:n&&t&&r&&l,isSetPreferredEditor:n,isSetUserName:t,userName:e.userName,preferredEditor:e.preferredEditor,autoSync:e.autoSync===void 0?null:e.autoSync,isSetAutoSync:r,isSetEmails:l,claimedEmails:o,emailSetupDeclined:i}},$a=()=>{let e=Ee(process.cwd());if(c(e))return null;let t=Ot(e.value);return c(t)?null:t.value||null},Xu=()=>{let{userId:e}=ne();return e?Ku(e):[]},Ju=()=>Xu().length>0;var Ba=()=>{let e=Ee(process.cwd());if(c(e))return!1;let t=He(e.value);return St(t)},Zu=e=>e===!0?"on":e===!1?"off":null,Qu=e=>e==="on"?!0:e==="off"?!1:null,em=()=>{let e=co();if(!e.isSetUserName)return"config username ";if(!e.isSetPreferredEditor)return"config editor ";if(!e.isSetAutoSync)return"config autoSync ";if(!Ba())return"init";if(!e.isSetEmails){let{gitEmail:t}=ne(),n=fr()[0]??t;return n&&ar(n)?`config emails ${n}`:"config emails "}return null};var ox=e=>e.props.tags??[],sx=e=>e.props.assignees??[],on=e=>ox(e).map(t=>R.getTag(t)).filter(t=>!!t),sn=e=>sx(e).map(t=>R.getContributor(t)).filter(t=>!!t),Ns=()=>{let{breadCrumb:e,selectedNode:t}=h(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!j(n)?a("Invalid untag target"):d("Retrieved tags from ticket in breadcrumb",on(n))},ws=()=>{let{breadCrumb:e,selectedNode:t}=h(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!j(n)?a("Invalid unassign target"):d("Retrieved assignees from ticket in breadcrumb",sn(n))};var b={PALETTE:"?",EXIT:"exit",INIT:"init",OPEN:"open",HELP:"help",NEW:"new",TAG:"tag",UNTAG:"untag",GOAL:"goal",UNGOAL:"ungoal",RULE:"rule",UNRULE:"unrule",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 ix=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[mt,gr]=ix;var lo=["done"],Ua=e=>lo.includes(e);var Is=e=>lo.filter(t=>!Dn(e).includes(t)),Dn=e=>(e.props?.rules??[]).filter(Ua),tm=(e,t,n)=>Ua(t)?e.readonly?a("Swimlane is readonly"):(e.props.rules??[]).includes(t)===n?d("No changes made",null):d("Rule changed",{action:n?"add.swimlane.rule":"remove.swimlane.rule",payload:{id:e.id,rule:t}}):a(`No lane rule "${t}"`),ax=e=>e.title.trim().toLowerCase()==="done",As=e=>{let t=pe();if(c(t))return!1;let n=t.value.nodes[e];return!!(n&&rt(n)&&(Dn(n).includes("done")||ax(n)))};var nm=new WeakMap,cx=e=>{let t=R.getNode(e);if(!t)return[];let n=nm.get(t);if(n)return n;let r=new Set;t.parentNodeId&&r.add(t.parentNodeId);for(let s of t.log??[]){let i=s.payload;i.id===e&&i.parent&&r.add(i.parent)}let o=[...r];return nm.set(t,o),o},rm=new WeakMap,lx=e=>{let t=rm.get(e);if(t)return t;let n=new Set;e.parentNodeId&&n.add(e.parentNodeId);for(let o of e.log??[]){let s=o.payload;s.id===e.id&&s.parent&&n.add(s.parent)}let r=[...n];return rm.set(e,r),r},om=e=>{let t=new Set;for(let n of lx(e))for(let r of cx(n))t.add(r);return[...t]};var Ts=()=>{let e=pe();return c(e)?null:e.value},im=()=>Ts()?.nodes??{},dx=()=>Ts()?.goals??{},Ha=e=>Ts()?R.getGoal(e):void 0,Ga=()=>Object.values(dx()).filter(e=>!e.tombstoned).sort((e,t)=>e.id.localeCompare(t.id)),Ms=e=>dt(e).trim(),Wa=e=>{let t=Ms(e);if(!t)return;let n=Ha(t);if(n)return n;let r=t.toLowerCase();return Ga().find(o=>o.name.toLowerCase()===r)},an=e=>{for(let t of e.props?.goals??[]){let n=Ha(t);if(n)return n}},am=(e,t)=>{let n=e.props?.goals??[];return[...n.filter(r=>r!==t).map(r=>({action:"remove.issue.goal",payload:{id:e.id,goal:r}})),...t&&!n.includes(t)?[{action:"add.issue.goal",payload:{id:e.id,goal:t}}]:[]]},ux=e=>Td(e.id),hr=e=>e.parentNodeId===mt,mx=e=>(e.parentNodeId?im()[e.parentNodeId]:void 0)?.parentNodeId??void 0,px=e=>{if(hr(e))return om(e);let t=mx(e);return t?[t]:[]},sm=new WeakMap,ks=()=>{let e=Ts();if(!e)return{members:new Map,onBoard:new Map,closed:new Set};let t=sm.get(e);if(t)return t;let n=new Map,r=new Map;for(let i of Object.values(im())){if(!j(i)||i.isDeleted)continue;let l=an(i)?.id;if(!l)continue;let u=n.get(l)??[];u.push(i),n.set(l,u);let m=r.get(l)??new Map;for(let p of px(i)){let f=m.get(p)??[];f.push(i),m.set(p,f)}r.set(l,m)}let o=new Set;for(let[i,l]of n)l.every(hr)&&o.add(i);let s={members:n,onBoard:r,closed:o};return sm.set(e,s),s},fx=e=>ks().members.get(e)??[],ja=e=>ks().closed.has(e),cm=(e,t)=>gx(e,t).length>0&&(t===gr||!ja(e)),wM=e=>[...ks().onBoard.get(e)?.keys()??[]].filter(t=>cm(e,t)),gx=(e,t)=>ks().onBoard.get(e)?.get(t)??[],lm=e=>Ga().filter(t=>cm(t.id,e)),IM=e=>{let t=fx(e);return{done:t.filter(hx).length,total:t.length}},hx=e=>hr(e)||As(e.parentNodeId??""),dm=()=>Ga().sort((e,t)=>Number(ja(e.id))-Number(ja(t.id))),um=(e,t)=>{let n=Ms(e);if(!n)return"A goal needs a name";if(/^[0-9A-HJKMNP-TV-Z]{26}$/i.test(n)&&!Ha(n))return`No goal has the id ${n}`;let r=Wa(e);return r&&r.id!==t?`There is already a goal called "${r.name}"`:null},Ls=(e,t)=>{let n=an(e);if(!n)return null;let r=`\u25C6 ${dt(n.name)}`;return{text:r.length>t?`${r.slice(0,Math.max(1,t-1))}\u2026`:r,color:ux(n)}};var yx=/^(\d+)(h|d|w|mo|y)$/,bx=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,vx=({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},xx=(e,t=new Date)=>{let n=e.match(yx);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}},Rx=e=>{let t=e.match(bx);if(!t)return null;let[,n,r,o,s,i]=t,l=Number(n),u=Number(r),m=Number(o),p=s?Number(s):0,f=i?Number(i):0;return vx({year:l,month:u,day:m,hour:p,minute:f})?new Date(l,u-1,m,p,f):null},Fn=e=>{let t=e.trim().toLowerCase();return xx(t)??Rx(t)};var mm=/^(\d+)(s|m)?$/,Ps=e=>{let t=e.trim().toLowerCase().match(mm);if(!t)return null;let n=Number(t[1]);return!Number.isInteger(n)||n<=0?null:t[2]==="m"?n*6e4:n*1e3},Os=(e,t)=>{let n=(t??"").trim().split(/\s+/).filter(Boolean),r=n.length>0&&mm.test(n.at(-1))?n.pop():"";return{dateInput:e||n.join(" "),durationInput:r}},pm=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Ex=[{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}],za=(e=Ex)=>{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 Sx=["BOARD","TICKET","SWIMLANE","COMMENT"],ee={EDITOR:"editor",VIEW:"view",USERNAME:"username",EMAILS:"emails",EMAILS_UNCLAIM:"emails-unclaim",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs",ATTACHMENT_MAX_KB:"attachmentMaxKb",REPO_CLONE_MAX_MB:"repoCloneMaxMb",LOG_LEVEL:"logLevel",REPO_CONNECT:"repoConnect",REPO_DISCONNECT:"repoDisconnect"},pt={TITLE:"title",DESCRIPTION:"description",COMMENT:"comment"},Me={REF:"ref",TITLE:"title",DESCRIPTION:"description",TAGS:"tags",ASSIGNEES:"assignees"},Cx=[ee.EDITOR,ee.VIEW,ee.USERNAME,ee.EMAILS,ee.EMAILS_UNCLAIM,ee.AUTOSYNC,ee.SYNC_DEBOUNCE_MS,ee.ATTACHMENT_MAX_KB,ee.LOG_LEVEL,ee.REPO_CONNECT,ee.REPO_DISCONNECT,ee.REPO_CLONE_MAX_MB],Nx=(e=h().selectedNode?.context)=>{switch(e){case"TICKET":case"BOARD":case"SWIMLANE":return[pt.TITLE,pt.DESCRIPTION];case"COMMENT":return[pt.COMMENT];default:return[]}},Ka=[String(3e3),"5000","15000","30000","60000"],qa=["250","500","1000"],Ya=["512","2048","8192"],hm=["10s","20s","30s","45s"],_n=[b.EXIT,b.SYNC,b.HELP,b.EXPORT,b.CONFIG,b.YANK],Ds=[b.NEW,b.EDIT,b.DELETE,b.MOVE],Va=[b.TAG,b.UNTAG,b.GOAL,b.UNGOAL,b.ASSIGN,b.UNASSIGN,b.CLOSE_ISSUE,b.RE_OPEN_ISSUE,b.EDIT,b.COMMENT],fm=[b.RULE,b.UNRULE],gm=[b.FILTER,b.PEEK,b.REPLAY],wx={WORKSPACE:[..._n,...Ds],BOARD:[...gm,..._n,...Ds,...fm],SWIMLANE:[...gm,..._n,...Ds,...fm],TICKET:[..._n,...Ds,...Va],FIELD:[..._n,...Va],FIELD_LIST:[..._n,...Va],TEXT:[..._n],COMMENT:[b.EDIT,b.DELETE,b.YANK]},Ix=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],uo=({breadCrumb:e,selectedNode:t})=>[...e,t].find(n=>n!=null&&j(n)),zt=()=>{let{breadCrumb:e=[],selectedNode:t}=h();return[t,...[...e].reverse()].find(n=>n!=null&&rt(n))},Fs=()=>{let{breadCrumb:e=[],selectedNode:t}=h(),n=[...e,t].find(o=>o?.context==="BOARD"),r=n?lm(n.id):[];return[...r,...dm().filter(o=>!r.includes(o))].map(o=>o.name)},Ax=({selectedNode:e,breadCrumb:t})=>{let n=Nx(e?.context);return uo({breadCrumb:t,selectedNode:e})?n.includes(pt.DESCRIPTION)?n:[...n,pt.DESCRIPTION]:n},Tx=({selectedNode:e,breadCrumb:t})=>{let n=uo({breadCrumb:t,selectedNode:e});return n?[Me.REF,Me.TITLE,...n.props?.description?.trim()?[Me.DESCRIPTION]:[],...on(n).length>0?[Me.TAGS]:[],...sn(n).length>0?[Me.ASSIGNEES]:[]]:e?[Me.REF,Me.TITLE]:[]},Xa=()=>{let e=Cs({exclude:process.cwd()});return c(e)?[]:[...e.value.map((t,n)=>String(n+1)),...e.value.map(t=>t.root)]},Mx=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:r}=co();if(!r)return[b.HELP,b.CONFIG];if(!Ba())return[b.HELP,b.INIT,b.OPEN];if(t)return[b.HELP,b.PEEK,b.REPLAY,b.EXPORT,b.CONFIG,b.YANK];let o=e?.context,s=o&&Sx.includes(o),i=[...new Set([...n,e].map(u=>u?.context).flatMap(u=>u?wx[u]:[]))],l=uo({breadCrumb:n,selectedNode:e});return i.filter(u=>{if(u===b.MOVE)return!1;if(u===b.YANK)return!!(l??e);if(u===b.EDIT)return s||!!l;if(u===b.DELETE)return s;if(u===b.UNTAG)return!!(l&&on(l).length>0);if(u===b.UNGOAL)return!!(l&&an(l));if(u===b.RULE){let m=zt();return!!(m&&!m.readonly)}if(u===b.UNRULE){let m=zt();return!!(m&&!m.readonly&&Dn(m).length>0)}return u===b.UNASSIGN?!!(l&&sn(l).length>0):u===b.RE_OPEN_ISSUE?!!(l&&hr(l)):u===b.CLOSE_ISSUE?!!(l&&!hr(l)):!0})},ke=(e,{contextNode:t,selectedNode:n,readOnly:r,breadCrumb:o}=h())=>{let s=t.context??"WORKSPACE";return{[b.NONE]:Mx({breadCrumb:o,readOnly:r,selectedNode:n}),[b.EXIT]:["confirm"],[b.EXPORT]:[],[b.SYNC]:[],[b.INIT]:[],[b.OPEN]:e===b.OPEN?Xa():[],[b.HELP]:[],[b.PEEK]:[...za(),"now","prev","next"],[b.REPLAY]:[...za()],[b.EDIT]:Ax({selectedNode:n,breadCrumb:o}),[b.YANK]:Tx({selectedNode:n,breadCrumb:o}),[b.COMMENT]:[],[b.DELETE]:["confirm"],[b.RE_OPEN_ISSUE]:["confirm"],[b.CLOSE_ISSUE]:["confirm"],[b.MOVE]:["start","confirm","next","previous","jump-next","jump-previous","to-next","to-previous","cancel"],[b.FILTER]:["tag","goal","assignee","actor","description","title","ref","clear"],[b.TAG]:[...new Set([...Object.keys(ds),...R.getExistingTags()])],[b.UNTAG]:[...Ns()?.value?.map(({name:l})=>l)??[]],[b.GOAL]:Fs(),[b.RULE]:(()=>{let l=zt();return l?Is(l):[]})(),[b.UNRULE]:(()=>{let l=zt();return l?Dn(l):[]})(),[b.UNASSIGN]:[...ws()?.value?.map(({name:l})=>l)??[]],[b.ASSIGN]:R.getExistingAssignees(),[b.NEW]:Ix(s),[b.CONFIG]:[...Cx]}[e]??[]};import mg from"chalk";var ym=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import Kx from"zod";import $x from"node:path";import{z as ft}from"zod";import{accessSync as kx,copyFileSync as Lx,existsSync as _s,mkdirSync as bm,readdirSync as vm,readFileSync as Px,renameSync as Ox,rmSync as Dx,statSync as xm,unlinkSync as Fx,writeFileSync as _x}from"node:fs";import yr from"node:path";var Ja=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string",Oe={writeToFile:(e,t)=>{try{let n=yr.dirname(e);_s(n)||bm(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);_x(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return Px(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=Oe.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 _s(e)&&xm(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await kx(e),!0}catch{return!1}},mkDir:e=>bm(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=yr.parse(t);for(;;){let r=yr.join(t,e);try{if(_s(r)&&xm(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=yr.dirname(t)}return null},readFirstJSON(e){try{if(!Oe.dirExists(e))return null;let t=vm(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=yr.join(e,t);return Oe.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return Oe.dirExists(e)?vm(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{Fx(e)}catch(t){(!Ja(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Dx(e,{recursive:!0,force:!0})}catch(t){(!Ja(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(yr.dirname(t)),!n?.overwrite&&_s(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{Ox(e,t)}catch(r){if(Ja(r)&&r.code==="EXDEV"){Lx(e,t),this.rmFile(e);return}throw r}}};var Bx={logLevel:"info",userId:"",userName:"",preferredEditor:"",autoSync:!1},Em=ft.object({logLevel:ft.enum(["info","error","debug"]),preferredEditor:ft.string().optional(),userName:ft.string().optional(),userId:ft.string().optional(),autoSync:ft.boolean().nullable().optional(),autoSyncDebounceMs:ft.number().optional(),attachmentMaxKb:ft.number().optional(),repoCloneMaxMb:ft.number().optional(),viewMode:ft.enum(["dense","wide"]).optional(),declinedEmailBoards:ft.array(ft.string()).optional()}).partial(),Ux="config.json",Sm=ze,Za=()=>$x.join(Sm(),Ux),Qa=()=>{try{return Oe.mkDir(Sm()),d(`Ensured ~/${Ct} exists`,null)}catch{return a(`Unable to create ~/${Ct}`)}},jx=e=>{let t;try{t=JSON.parse(e)}catch{return a(`Invalid ~/${Ct}/config.json JSON`)}let n=Em.safeParse(t??{});return n.success?d("Parsed config",n.data):a(`Invalid ~/${Ct}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},Ft=()=>{let e=Qa();if(c(e))return a(e.message);let t=Za(),n=Oe.readFile(t);return n==null||n.trim()===""?d("No config found, using empty config",{logLevel:"info",autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):jx(n)},Cm=e=>{let t=Qa();if(c(t))return a(t.message);let n=Em.safeParse(e);if(!n.success)return a(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=Za();try{return Oe.writeToFile(r,JSON.stringify(n.data,null,2)+`
32
+ `),d("Config written",null)}catch{return a(`Unable to write ~/${Ct}/config.json`)}},Ye=e=>{let t=Ft();if(c(t))return a("Failed to read existing config");let n={...t.value,...e};return Cm(n)},Nm=()=>{let e=Za(),t=Qa();if(c(t))return a(`Unable to create ~/${Ct}`);if(!(Oe.readFile(e)!==null)){let x=Cm(Bx);if(c(x))throw new Error(`Unable to create ~/${Ct}/config.json`)}let r=Ft();if(c(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:s,userId:i,declinedEmailBoards:l,autoSync:u,autoSyncDebounceMs:m,attachmentMaxKb:p,logLevel:f,viewMode:g}=r.value,v=gd({userId:i,userName:s});if(c(v))return a(v.message);let w=v.value??{userId:i,userName:s};return!w.userName||!w.userId?a(`User name or ID not configured in ~/${Ct}/config.json`):(process.env.EPIQ_LOG_LEVEL=f,d("successfully loaded settings",{gitEmail:null,gitName:null,declinedEmailBoards:l??[],logLevel:f??"debug",preferredEditor:o??"",userName:w.userName,userId:w.userId,autoSync:u??!1,autoSyncIntervalMs:m??1e4,attachmentMaxKb:p??null,viewMode:g??"dense"}))};import Gx from"node:crypto";import mo from"node:fs";import Am from"node:path";var wm="/media/",Im=e=>`${wm}${e}`,Hx=(e,t)=>`![${e}](${Im(t)})`;var Bn=500,Wx=/^[a-f0-9]{64}\.(png|jpg|gif|webp)$/,ec=(e,t)=>`${e}.${t}`,zx=e=>Wx.test(e),Tm=e=>e.length>=8&&e.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))?d("Sniffed image type","png"):e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?d("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")))?d("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"))?d("Sniffed image type","webp"):a(`Unsupported image format. Allowed: ${Od.join(", ")}`),Mm=e=>Gx.createHash("sha256").update(e).digest("hex"),Vx=(e,t=Bn)=>{if(e.length===0)return a("Attachment is empty");if(e.length>t*1024)return a(`Attachment exceeds the ${t} KB size cap (${Math.ceil(e.length/1024)} KB)`);let n=Tm(e);return c(n)?n:d("Validated attachment data",{hash:Mm(e),ext:n.value,bytes:e.length})},yk=(e,t,n=Bn)=>{let r=Vx(t,n);if(c(r))return r;let o=no(e),s=Am.join(o,ec(r.value.hash,r.value.ext));try{mo.existsSync(s)||(mo.mkdirSync(o,{recursive:!0}),mo.writeFileSync(s,t))}catch(i){return a(`Unable to write attachment blob: ${i instanceof Error?i.message:String(i)}`)}return d("Wrote attachment blob",r.value)},bk=(e,t,n=Bn)=>{if(!zx(t))return a("Invalid attachment file name");let r=Am.join(no(e),t);if(!mo.existsSync(r))return a("Attachment blob not found");let o;try{o=mo.readFileSync(r)}catch(u){return a(`Unable to read attachment blob: ${u instanceof Error?u.message:String(u)}`)}if(o.length>n*1024)return a(`Attachment exceeds the ${n} KB size cap and will not be served`);let[s,i]=t.split(".");if(Mm(o)!==s)return a("Attachment blob does not match its content hash");let l=Tm(o);return c(l)?l:l.value!==i?a("Attachment blob content does not match its extension"):d("Resolved attachment blob",{filePath:r,ext:i,bytes:o.length})};var po=50,fo=5e3,km=()=>{let e=q().commandMeta.inputString,t=Kx.coerce.number().int().min(po).max(fo).safeParse(e);if(!t.success)return a(`Attachment size cap must be ${po}-${fo} KB (default ${Bn})`);let n=Ye({attachmentMaxKb:t.data});return c(n)?n:(ut({attachmentMaxKb:t.data}),d(`Attachment size cap set to ${t.data} KB`,null))};import Lm from"node:fs";import qx from"node:path";var tc=2048,br=1,vr=1048576,nc=e=>Number.isInteger(e)&&e>=br&&e<=vr,xr=()=>{let e=Ft(),t=c(e)?void 0:e.value.repoCloneMaxMb;return t!==void 0&&nc(t)?t:tc},cn=e=>{let t=0,n=r=>{let o;try{o=Lm.readdirSync(r,{withFileTypes:!0})}catch{return}for(let s of o){let i=qx.join(r,s.name);if(s.isDirectory()){n(i);continue}try{t+=Lm.lstatSync(i).size}catch{}}};return n(e),t},go=e=>`Its clone would pass this machine's ${e} MB cap for a connected repo: narrow its history, or raise repoCloneMaxMb`;var At=e=>{let t=Ee(e??process.cwd());return c(t)?a(t.message):d("Resolved Epiq repo root",t.value)},Un=e=>/^[0-9a-f]{7,40}$/i.test(e);import{createHash as OR}from"node:crypto";import Ep from"node:path";import DR from"node:fs";import{ulid as FR}from"ulid";import rc from"node:fs";import Yx from"node:path";var ho=e=>e?.code==="ENOENT",oc=3,sc=e=>rc.readdirSync(e).filter(t=>t.endsWith(".jsonl")).sort(),Tt=e=>{let t=qe(e);for(let n=1;;n++){if(!rc.existsSync(t))return"none";let r=[],o=!1;for(let s of sc(t))try{let{size:i,mtimeMs:l}=rc.statSync(Yx.join(t,s));r.push(`${s}:${i}:${l}`)}catch(i){if(!ho(i))throw i;if(n<oc){o=!0;break}}if(!o)return r.join("|")}},Pm=e=>new Map(e.split("|").filter(Boolean).map(t=>{let n=t.indexOf(":");return[t.slice(0,n),t.slice(n+1)]})),ic=(e,t,n,r)=>{let o=Pm(t),s=Tt(e),i=Pm(s),l=u=>u===void 0?0:Number(u.slice(0,u.indexOf(":")));if(l(i.get(n))!==l(o.get(n))+r)return null;for(let[u,m]of i)if(u!==n&&o.get(u)!==m)return null;for(let u of o.keys())if(u!==n&&!i.has(u))return null;return s},Vt=null,Om=e=>Vt&&Vt.root===e?Vt.signature:null,$s=(e,t)=>{Vt={root:e,signature:t}},Dm=(e,t,n)=>{if(!Vt||Vt.root!==e)return;let r=ic(e,Vt.signature,t,n);Vt=r===null?null:{root:e,signature:r}},Fm=()=>{Vt=null};import{z as jn}from"zod";var _m=1,$m=jn.tuple([jn.string().min(1),jn.string().min(1).nullable()]),Xx=jn.looseObject({v:jn.literal(_m),id:$m}),Wk=jn.looseObject({v:jn.number().int().positive(),id:$m}),Jx=e=>Object.prototype.hasOwnProperty.call(e,"__proto__"),Zx=e=>{let t={};for(let n of Object.keys(e))n!=="__proto__"&&(t[n]=e[n]);return t},Bm=e=>{if(typeof e!="object"||e===null||Array.isArray(e))return a("Invalid persisted event envelope: expected an object");let{v:t,id:n}=e;if(typeof t!="number"||!Number.isSafeInteger(t)||t<=0)return a("Invalid persisted event envelope: v");if(!Array.isArray(n)||n.length!==2)return a("Invalid persisted event envelope: id");let[r,o]=n;return typeof r!="string"||r.length===0?a("Invalid persisted event envelope: id.0"):o!==null&&(typeof o!="string"||o.length===0)?a("Invalid persisted event envelope: id.1"):d("Parsed persisted event envelope",Jx(e)?Zx(e):e)};var Qx=[1];var eR=new Set(Qx),ac=e=>eR.has(e),Um=e=>{let t=Xx.safeParse(e);return t.success?d("Parsed persisted event",t.data):a(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},cc=(e,t)=>{let n={[e.action]:e.payload,v:_m,id:t};return Um(n)};import vo from"node:fs";import Ws from"node:path";import{decodeTime as cR}from"ulid";import{z as uc}from"zod";import Ie from"node:fs";import Hn from"node:path";import{ulid as tR}from"ulid";var Us="~pending",lc=/~pending(-[0-9a-z]+)*$/i,Hm=/-f(\d+)$/,Gm=e=>{let t=e.indexOf(".");return t===-1?`${e}${Us}`:e.slice(0,t)+Us+e.slice(t)},js=e=>{let t=e.indexOf(".");return t===-1?[e,""]:[e.slice(0,t),e.slice(t)]},nR=e=>{let[t,n]=js(e);return lc.test(t)?t.replace(lc,"")+n:null},dc=e=>e.replace(lc,""),Gn=e=>e.endsWith(".jsonl")&&nR(e)!==null,yo=e=>dc(js(e)[0]),Wm=e=>{let[t]=js(e),n=Hm.exec(t);return n&&Gn(e)?Number(n[1]):null},rR=e=>Gm(e).replace(Us,`${Us}-${tR().toLowerCase()}`),oR=(e,t)=>{let[n,r]=js(e);return`${n.replace(Hm,"")}-f${t}${r}`},zm=(e,t)=>Hn.join(qe(e),Gm(t)),sR=(e,t)=>Math.max(0,Ie.statSync(e).size-(Wm(t)??0)),Vm=e=>{let t=qe(e);try{return Ie.existsSync(t)?Ie.readdirSync(t).filter(Gn).some(n=>sR(Hn.join(t,n),n)>0):!1}catch{return!0}},iR=3,Km=(e,t)=>{for(let n=1;;n++){let r=Ie.openSync(e,"a"),o;try{Ie.writeSync(r,t),o=Ie.fstatSync(r).ino}finally{Ie.closeSync(r)}let s;try{s=Ie.statSync(e).ino}catch{s=null}if(s===o||n>=iR)return}},aR=e=>{let t;try{t=Ie.openSync(e,"r")}catch{return!0}try{let{size:n}=Ie.fstatSync(t);if(n===0)return!0;let r=Buffer.alloc(1);return Ie.readSync(t,r,0,1,n-1),r[0]===10}finally{Ie.closeSync(t)}},Bs=10,jm=(e,t,n=!1)=>{let r=n?t.length:t.lastIndexOf(Bs)+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};Ie.appendFileSync(e,Buffer.concat([Buffer.from(aR(e)?"":`
33
+ `),o,Buffer.from(o[o.length-1]===Bs?"":`
34
+ `)]));let s=0;for(let i of o)i===Bs&&s++;return o[o.length-1]!==Bs&&s++,{bytes:r,lines:s}},Hs=(e,t)=>{let n=qe(e);if(!Ie.existsSync(n))return d("No events directory",0);try{let r=yo(t),o=Ie.readdirSync(n).filter(l=>Gn(l)&&yo(l)===r),s=Hn.join(n,t),i=0;for(let l of o){let u=Wm(l);if(u!==null){let g=Hn.join(n,l),v=Ie.readFileSync(g).subarray(u);i+=jm(s,v,!0).lines,Ie.rmSync(g,{force:!0});continue}let m=/~pending-/i.test(l)?l:rR(t),p=Hn.join(n,m);m!==l&&Ie.renameSync(Hn.join(n,l),p);let f=jm(s,Ie.readFileSync(p));i+=f.lines,Ie.renameSync(p,Hn.join(n,oR(m,f.bytes)))}return d("Folded pending logs",i)}catch(r){return a(`Unable to fold pending event logs in ${n}: ${r instanceof Error?r.message:String(r)}`)}};var zs="unknown",lR=uc.object({userId:uc.string().min(1).default(zs),userName:uc.string().min(1).default(zs)}),Jm=new Set(["id","v","userId","userName"]),Gs=e=>{let t=Object.entries(e).filter(([o])=>!Jm.has(o));if(t.length!==1)return null;let n=t[0]?.[1];if(typeof n!="object"||n===null)return null;let r=n.id;return typeof r=="string"&&r.length>0?r:null},dR=/^[0-9a-hjkmnp-tv-z]{26}$/i,uR=e=>dR.test(e)?e.toUpperCase():e,Zm=e=>{let t=Ws.basename(e,".jsonl"),n=t.indexOf("."),r=dc(n===-1?t:t.slice(0,n)),o=n===-1?void 0:t.slice(n+1),s=lR.safeParse({userId:uR(r),userName:o});return s.success?d("Parsed event file actor",s.data):a(`Invalid event file name ${Ws.basename(e)}: ${s.error.issues.map(i=>i.path.join(".")||i.message).join(", ")}`)},mR=e=>{let t=Object.keys(e).filter(n=>n!=="id"&&n!=="v");return t.length!==1?a(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?a("Invalid persisted event: action key is missing or invalid"):d("Resolved persisted action",t[0])},pR=(e,t)=>t in e,ln=new Map,fR=3e5,gR=512,bo=0,mc=e=>e.entries.length+e.quarantined.length,hR=(e,t,n,r)=>{let o=ln.get(e);o&&(bo-=mc(o));let s={stamp:t,entries:n,quarantined:r};ln.delete(e),ln.set(e,s),bo+=mc(s);for(let[i,l]of ln){if(bo<=fR&&ln.size<=gR)break;i!==e&&(ln.delete(i),bo-=mc(l))}},yR=()=>{ln.clear(),bo=0},bR=2n,qm=1000000n,vR=e=>{try{let{size:t,mtimeNs:n}=vo.statSync(e,{bigint:!0});return{value:`${t}:${n}`,settled:BigInt(Date.now())*qm-n>bR*qm}}catch{return null}},Qm=(e,t)=>{let n=Zm(e);if(c(n))return a(n.message);let r=vR(e),o=r?ln.get(e):void 0;if(r&&o&&o.stamp===r.value){if(t)for(let p of o.quarantined)t.push(p);return d("Parsed persisted events file",[...o.entries])}let s;try{s=vo.readFileSync(e,"utf8")}catch(p){if(ho(p))return d("Event file missing",null);throw p}let i=[],l=Ws.basename(e),u=[],m=(p,f)=>{u.push({eventId:null,reason:"corrupt-line",detail:`${l}:${p} (${f})`,targetNodeId:null})};for(let[p,f]of s.split(`
35
+ `).entries()){let g=f.trim();if(!g)continue;let v;try{v=JSON.parse(g)}catch{m(p+1,"invalid JSON");continue}let w=Bm(v);if(c(w)){m(p+1,w.message);continue}i.push({...w.value,userId:n.value.userId,userName:n.value.userName})}if(t)for(let p of u)t.push(p);return r?.settled&&hR(e,r.value,i,u),d("Parsed persisted events file",[...i])},Ym=(e,t)=>e<t?-1:e>t?1:0,pc=(e,t)=>{let n=Ym(e.id[0],t.id[0]);return n!==0?n:Ym(JSON.stringify(e),JSON.stringify(t))},Xm=(e,t)=>{let n=new Map,r=new Map;for(let p of e){let f=p.id[0],g=p.id[1]??null;n.set(f,p);let v=r.get(g)??[];v.push(p),r.set(g,v)}for(let p of r.values())p.sort(pc);let o=[],s=new Set,i=p=>{let f=[p];for(;f.length>0;){let g=f.pop(),v=g.id[0];if(s.has(v))continue;o.push(g),s.add(v);let w=r.get(v)??[];for(let x=w.length-1;x>=0;x--)f.push(w[x])}},l=(r.get(null)??[]).filter(p=>{let f=Object.keys(p).filter(g=>!Jm.has(g));return f.length===1&&f[0]===t});for(let p of l)i(p);let u=e.filter(p=>{let f=p.id[0],g=p.id[1]??null;return s.has(f)?!1:g===null||!n.has(g)}).sort(pc);for(let p of u)i(p);let m=e.filter(p=>!s.has(p.id[0])).sort(pc);for(let p of m)i(p);return o},fc=e=>cs(e.map(t=>{try{return cR(t.id[0])}catch{return null}})),ep=(e,t)=>{let n=new Set,r=[],o=[],s=fc(e);for(let i=0;i<e.length;i++){let l=e[i],u=l.id[0],m=l.id[1],p=s[i]??null;!(p!==null&&p<t)||m&&n.has(m)?(n.add(u),o.push(l)):r.push(l)}return{appliedEvents:r,unappliedEvents:o}},tp=e=>{let t=new Set(e.actions),n=N=>t.has(N),r=N=>{let{userId:S,userName:k,...L}=N,B=mR(L);if(c(B))return a(B.message);let M=B.value,P=N.id?.[0];return P?pR(L,M)?d("Decoded persisted event",{id:P,action:M,payload:L[M],userId:S}):a(`Persisted event is missing payload for action: ${M}`):a("Persisted event is missing id")},o=(N,S)=>{let k=[],L=new Map,B=new Map;for(let M of N){if(!ac(M.v)){B.set(M.v,(B.get(M.v)??0)+1),S?.push({eventId:M.id[0],reason:"unsupported-schema-version",detail:`v${M.v}`,targetNodeId:Gs(M)});continue}let P=r(M);if(c(P)){S?.push({eventId:M.id[0],reason:"invalid-payload",detail:P.message,targetNodeId:Gs(M)});continue}let $=P.value.action;if(!n($)){L.set($,(L.get($)??0)+1),S?.push({eventId:M.id[0],reason:"unknown-action",detail:$,targetNodeId:Gs(M)});continue}let de=e.readPayload($,P.value.payload);if(c(de)){S?.push({eventId:M.id[0],reason:"invalid-payload",detail:de.message,targetNodeId:Gs(M)});continue}k.push(P.value)}if(L.size>0){let M=[...L.entries()].map(([P,$])=>`${P} (x${$})`).join(", ");K.info(`Skipped events with unknown actions, likely created by a newer epiq version: ${M}. Upgrade to apply them.`)}if(B.size>0){let M=[...B.entries()].map(([P,$])=>`v${P} (x${$})`).join(", ");K.info(`Skipped events with unsupported schema versions, created by a newer epiq version: ${M}. Upgrade to apply them.`)}return d("Decoded reconstructed events",k)},s=null;function i(N,S){let k=qe(N),L=Tt(N);if(!vo.existsSync(k))return d("No events found",[]);let B=[],M=[];for(let $=1;;$++){B=[],M=[];let de=!1;for(let U of sc(k)){let F=Qm(Ws.join(k,U),M);if(c(F))return a(F.message);if(F.value===null){if($<oc){de=!0;break}continue}for(let Re of F.value)B.push(Re)}if(!de)break}if(S)for(let $ of M)S.push($);let P=Xm(B,e.genesis);return s={root:N,signature:L,edge:P.at(-1)?.id?.[0]??null},d("All events loaded",P)}function l(N){let S=[],k=i(N,S);if(c(k))return a(k.message);let L=o(k.value,S);return c(L)?a(L.message):d("Loaded merged events",{events:L.value,unreadable:S})}function u(N){let S=i(N);return c(S)?a(S.message):d("Loaded event actors",S.value.map(({userId:k,userName:L})=>({userId:k,userName:L})))}function m(N){let S=new Map,k=qe(N),L;try{if(!vo.existsSync(k))return S;L=vo.readdirSync(k)}catch{return S}let B=new Set;for(let P of L){if(!P.endsWith(".jsonl"))continue;let $=Zm(P);if(c($))continue;let{userId:de,userName:U}=$.value;if(!de||!U||U===zs)continue;let F=S.get(de);F!==void 0&&F!==U&&B.add(de),S.set(de,U)}if(B.size===0)return S;let M=u(N);if(c(M))return S;for(let{userId:P,userName:$}of M.value)B.has(P)&&(!$||$===zs||S.set(P,$));return S}function p(N){let S=l(N);return c(S)?a(S.message):d("Loaded merged events",S.value.events)}function f(N,S){let k=i(N);if(c(k))return a(k.message);let{appliedEvents:L,unappliedEvents:B}=ep(k.value,S),M=o(L);if(c(M))return a(M.message);let P=o(B);return c(P)?a(P.message):d("Loaded merged events before time",{appliedEvents:M.value,unappliedEvents:P.value})}function g(N=process.cwd()){let S=Tt(N);if(s&&s.root===N&&s.signature===S)return d("Loaded edge reference, unchanged",s.edge);let k=i(N);return c(k)?a(k.message):d("Loaded edge reference",k.value.at(-1)?.id?.[0]??null)}function v(N,S,k,L){if(!s||s.root!==N)return;let B=ic(N,s.signature,S,L);s=B===null?null:{root:N,signature:B,edge:k}}function w(){s=null,yR()}let x=N=>Xm(N,e.genesis);function E(N){let S=i(N);if(c(S))return a(S.message);let k=fc(S.value);return d("Loaded effective event times",new Map(S.value.map((L,B)=>[L.id[0],k[B]??null])))}return{fromPersistedEvent:r,decodeReconstructedEvents:o,loadMergedEventsWithUnreadable:l,loadEventActors:u,loadActorNames:m,loadMergedEvents:p,loadMergedEventsBefore:f,getEdgeRef:g,advanceEdgeRef:v,clearEdgeCache:w,getSortedEvents:x,loadEffectiveEventTimes:E}};var Vs=(e,t)=>a(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),O=(e,t)=>({...Vs(e,t),convergence:!0}),Rr=e=>c(e)&&e.convergence===!0,Wn=e=>{let t=e.filter(c);return{fatal:t.filter(n=>!Rr(n)),skipped:t.filter(Rr)}},zn=e=>{e.length!==0&&K.info(`Skipped ${e.length} event(s) that could not be applied to this state: ${e.map(t=>t.message).join("; ")}`)},xR=e=>e.userId?.length?null:Vs("Invalid user ID format",e),np=e=>{let t=null;function n(o,s=!1){let i=e.apply[o.action];if(!i)return a(`Unknown event action "${o.action}", likely created by a newer epiq version. Evt id: ${o.id}`);if(!e.replay.isInitialized()&&o.action!==e.genesis)return O(`${o.action} arrived before the state was initialized`,o);if(o.action===e.genesis&&t){if(t.genesisApplied)return O("the state is already initialized",o);t.genesisApplied=!0}let l;try{l=i(o)}catch(p){return O(`threw while materializing (${p instanceof Error?p.message:String(p)})`,o)}if(c(l))return l;let u=xR(o);if(u)return u;let m=e.replay.afterApply(o,{batched:t!==null,bypassLogging:s});return m||l}return{materialize:n,materializeAll:o=>{let s=e.replay.batch(()=>{let i=t===null;i&&(t={genesisApplied:!1});let l=!1;try{let u=o.map(m=>n(m));if(i){l=!0;let m=e.replay.flush();if(m)return o.map(()=>m)}return u}finally{i&&(t=null,l||e.replay.flush())}});return c(s)?o.map(()=>a(s.message)):s.value}}};import sp from"node:fs";import gc from"node:path";import{decodeTime as RR,monotonicFactory as ER}from"ulid";var rp=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/\.jsonl/g,"-jsonl").replace(/^-+|-+$/g,"")||"unknown";var Q=({userId:e})=>({userId:e}),op=e=>({action:e.action,payload:e.payload});var SR=0xffffffffffff,CR=as,NR=e=>{let t=Date.now(),n;try{n=RR(e)}catch{return t}return n>=SR?t:n>t+CR?(K.error("[persist] edge id is too far in the future; seeding from the wall clock instead",{edgeRef:e,edgeTime:n,now:t}),t):Math.max(t,n+1)},Er=({userId:e})=>`${rp(e)}.jsonl`,ip=(e,t)=>{let n;try{if(!sp.existsSync(e))return[t];n=sp.readdirSync(e)}catch{return[t]}let r=yo(t);return[...n.filter(s=>!s.endsWith(".jsonl")||s===t||Gn(s)?!1:yo(s)===r).sort(),t]},ap=(e,{userId:t})=>{let n=Er({userId:t});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(n))return a(`Invalid event log file name: ${n}`);let o=gc.join(qe(e),n);return d("Successfully resolved event log path",o)},cp=e=>{let t=ER();function n(o,s){let i;if(s&&s.current!==void 0)i=s.current;else{let u=e.getEdgeRef(o);if(c(u))return a(u.message);i=u.value}let l=i?t(NR(i)):t();return d("Minted event id",[l,i])}function r({event:o,rootDir:s,edge:i,id:l}){try{let u=$u(s);if(c(u))return u;let m=ap(s,{userId:o.userId});if(c(m))return m;let p=zm(s,gc.basename(m.value)),f=l?d("Minted event id",l):n(s,i);if(c(f))return a(f.message);let[g,v]=f.value,w=cc(op(o),[g,v]);if(c(w))return a(w.message);let x=`${JSON.stringify(w.value)}
36
+ `;Km(p,x),i&&(i.current=g);let E=gc.basename(p);return e.advanceEdgeRef(s,E,g,Buffer.byteLength(x)),Dm(s,E,Buffer.byteLength(x)),d("Event persisted",{path:p,entry:w.value})}catch(u){let m=u instanceof Error?u.message:"Unknown persist error";return a(`Failed to persist event: ${m}`)}}return{mintEventId:n,persist:r}};var lp=(e,t,n)=>{function r(s,i,l){let u=n.mintEventId(i,l);if(c(u))return a(u.message);let m={...s,id:u.value[0]},p=t.materialize(m);if(p.status!==sr.Success)return p;let f=n.persist({event:m,rootDir:i,edge:l,id:u.value});return c(f)?(Fm(),f):p}function o(s,i){if(s.length===0||!s[0])return a("No events provided");let l=e.write.readOnlyReason();if(l)return a(l);let u=e.replay.batch(()=>{let m={},p=e.write.beforeWrite(s[0],v=>r(v,i,m));if(c(p))return a(p.message);let f=s.map(v=>r(v,i,m)),g=f.filter(c);return g.length>0?a("Materialize and persist failed: "+g.map(v=>v.message).join(", ")):d("Materialization succeeded",f.map(v=>v.value))});return c(u)?a(u.message):u.value??a("Materialize and persist produced nothing")}return{materializeAndPersist:r,materializeAndPersistAll:o}};var dp=e=>{let t=np(e),n=tp(e),r=cp(n),o=lp(e,t,r);return{...t,...n,...r,...o}};import{z as W}from"zod";var G=W.string().min(1),st=W.string(),dn=W.string(),xo=W.looseObject({id:G}),up=W.string().min(1).max(64),hc=W.looseObject({id:G,name:st,parent:G,rank:dn}),wR={"init.workspace":W.looseObject({id:G,name:st,rank:dn}),"add.workspace":W.looseObject({id:G,name:st,rank:dn}),"add.board":hc,"add.swimlane":hc,"add.issue":hc,"add.field":W.looseObject({id:G,name:st,parent:G,rank:dn}),"edit.title":W.looseObject({id:G,name:st}),"delete.node":xo,"lock.node":xo,"move.node":W.looseObject({id:G,parent:G,rank:dn}),"edit.description":W.looseObject({id:G,md:W.string()}),"add.swimlane.rule":W.looseObject({id:G,rule:up}),"remove.swimlane.rule":W.looseObject({id:G,rule:up}),"close.issue":W.looseObject({id:G,parent:G,rank:dn}),"reopen.issue":W.looseObject({id:G,parent:G,rank:dn}),"create.tag":W.looseObject({id:G,name:st}),"tombstone.tag":xo,"restore.tag":W.looseObject({id:G,name:st}),"create.goal":W.looseObject({id:G,name:st}),"rename.goal":W.looseObject({id:G,name:st}),"edit.goal.description":W.looseObject({id:G,md:W.string()}),"tombstone.goal":xo,"create.contributor":W.looseObject({id:G,name:st}),"rename.contributor":W.looseObject({id:G,name:st}),"tombstone.contributor":xo,"restore.contributor":W.looseObject({id:G,name:st}),"link.contributor.user":W.looseObject({contributor:G}),"link.contributor.email":W.looseObject({contributor:G,email:G}),"unlink.contributor.email":W.looseObject({contributor:G,email:G}),"connect.repo":W.looseObject({url:W.string()}),"edit.repo":W.looseObject({repo:G}),"disconnect.repo":W.looseObject({repo:G}),"add.issue.assignee":W.looseObject({id:G,assignee:G}),"remove.issue.assignee":W.looseObject({id:G,assignee:G}),"add.issue.tag":W.looseObject({id:G,tag:G}),"remove.issue.tag":W.looseObject({id:G,tag:G}),"add.issue.goal":W.looseObject({id:G,goal:G}),"remove.issue.goal":W.looseObject({id:G,goal:G}),"add.issue.comment":W.looseObject({id:G,issue:G,md:W.string()}),"edit.issue.comment":W.looseObject({id:G,issue:G,md:W.string()}),"delete.issue.comment":W.looseObject({id:G,issue:G}),"add.issue.attachment":W.looseObject({id:G,issue:G,hash:W.string().min(1),ext:W.string().min(1),name:st,bytes:W.number()}),"delete.issue.attachment":W.looseObject({id:G,issue:G}),"rebalance.children":W.looseObject({parent:G,ranks:W.record(W.string(),dn)})},mp=(e,t)=>{let r=wR[e].safeParse(t);return r.success?d("Payload is readable",void 0):a(`${e}: ${r.error.issues.map(o=>`${o.path.join(".")||"payload"} ${o.message}`).join(", ")}`)};import{ulid as IR}from"ulid";var pp=(e,t)=>{if(e.action==="create.contributor"||e.action==="rename.contributor")return d("Contributor write already in flight",void 0);let{userId:n,userName:r}=ne();if(!r||n!==e.userId)return d("Not this actor own write",void 0);let o=R.getContributor(e.userId),s={id:IR(),action:o?"rename.contributor":"create.contributor",payload:{id:e.userId,name:r},userId:e.userId};if(o&&(o.tombstoned||o.name===r))return d("Contributor name is current",void 0);let i=t(s);return c(i)?a(i.message):d("Contributor name recorded",void 0)};var yc=["init.workspace","add.workspace","add.board","add.swimlane","add.issue","add.field","edit.title","delete.node","create.tag","tombstone.tag","restore.tag","create.goal","rename.goal","edit.goal.description","tombstone.goal","create.contributor","rename.contributor","tombstone.contributor","restore.contributor","add.issue.assignee","remove.issue.assignee","add.issue.tag","remove.issue.tag","add.issue.goal","remove.issue.goal","move.node","edit.description","add.swimlane.rule","remove.swimlane.rule","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","connect.repo","edit.repo","disconnect.repo"];var lP=new Set(yc);var ge={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History",DIFF:"Diff",COMMENTS:"Comments",ATTACHMENTS:"Attachments"};var it=e=>e.slice(-7).toUpperCase(),bc=(e,t)=>{let n=t.replace(/-/g,"").trim().toUpperCase();return n?it(e).includes(n):!0};var Ae={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,r,o=!1)=>({id:e,title:t,rank:r,isDeleted:!1,props:{ref:it(e)},context:re.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:re.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:re.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:re.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:it(e)},context:re.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:re.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:re.COMMENT,childRenderAxis:"vertical",parentNodeId:n,readonly:s,log:[],isVirtual:i})};var Ro=(e,t,n)=>R.getNode(e)?O(`a node with id ${e} already exists`,n):t===e?O("a node cannot be its own parent",n):null,vc=e=>{let t=h().repos,n=na(t,e);if(c(n))return{skip:O(n.message,e)};let r=ue(o=>({...o,repos:t}));return c(r)?{skip:O("Unable to update repos",e)}:{message:n.message,entry:n.value}},fp={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=Ae.workspace(t,n,r),s=Eo(o);if(c(s))return Vs(s.message,e);let i=R.createNode(o);return c(i)?O(i.message??"Failed to initialize workspace",e):fa(i.value)?d("Workspace initialized",{action:e.action,result:i.value}):a("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=Ro(t,void 0,e);if(o)return o;let s=R.createNode(Ae.workspace(t,n,r));return c(s)?O(s.message??"Failed to add workspace",e):fa(s.value)?d("Added workspace",{action:e.action,result:s.value}):a("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=Ro(t,r,e);if(s)return s;let i=R.createNode(Ae.board(t,n,r,o));return c(i)?O(i.message??"Unable to create board",e):Vr(i.value)?d("Added board",{action:e.action,result:i.value}):a("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=Ro(t,r,e);if(s)return s;let i=R.createNode(Ae.swimlane(t,n,r,o));return c(i)?O(i.message??"Unable to create swimlane",e):rt(i.value)?d("Added swimlane",{action:e.action,result:i.value}):a("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,s=Ro(t,r,e);if(s)return s;let i=R.createNode(Ae.ticket(t,n,r,o));return c(i)?O(i.message??"Unable to create issue",e):j(i.value)?d("Added issue",{action:e.action,result:i.value}):a("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:r,val:o,rank:s}=e.payload,i=Ro(t,r,e);if(i)return i;let l=R.createNode(Ae.field({id:t,name:n,parentNodeId:r,rank:s,props:{value:o},childRenderAxis:n.includes(ge.DESCRIPTION)?"vertical":"horizontal"}));return c(l)?O(l.message??`Unable to create field: ${n}`,e):Fe(l.value)?d("Added field",{action:e.action,result:l.value}):a("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!R.getNode(t))return O(`Unable to locate node with id ${t}`,e);let o=R.renameNode(t,n);return c(o)?O(o.message??"Unable to edit title",e):d("Edited title",{action:e.action,result:o.value})},"delete.node":e=>{let{id:t}=e.payload,n=R.tombstoneNode(t);return c(n)?O(n.message??"Unable to delete node",e):d("Deleted node",{action:e.action,result:n.value})},"create.tag":e=>{let{id:t,name:n}=e.payload,r=R.createTag({id:t,name:n});return c(r)?O(r.message??"Unable to create tag",e):d("Tag added",{action:e.action,result:r.value})},"tombstone.tag":e=>{let{id:t}=e.payload,n=R.tombstoneTag(t);return c(n)?O(n.message??"Unable to delete tag",e):d("Tag tombstoned",{action:e.action,result:n.value})},"restore.tag":e=>{let{id:t,name:n}=e.payload,r=R.restoreTag(t,n);return c(r)?O(r.message??"Unable to restore tag",e):d("Tag restored",{action:e.action,result:r.value})},"create.goal":e=>{let{id:t,name:n}=e.payload,r=R.createGoal({id:t,name:n});return c(r)?O(r.message??"Unable to create goal",e):d("Goal added",{action:e.action,result:r.value})},"rename.goal":e=>{let{id:t,name:n}=e.payload,r=R.renameGoal(t,n);return c(r)?O(r.message??"Unable to rename goal",e):d("Goal renamed",{action:e.action,result:r.value})},"edit.goal.description":e=>{let{id:t,md:n}=e.payload,r=R.setGoalDescription(t,n);return c(r)?O(r.message??"Unable to describe goal",e):d("Goal described",{action:e.action,result:r.value})},"tombstone.goal":e=>{let t=R.tombstoneGoal(e.payload.id);return c(t)?O(t.message??"Unable to remove goal",e):d("Goal tombstoned",{action:e.action,result:t.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,r=R.createContributor({id:t,name:n});return c(r)?O(r.message??"Unable to create contributor",e):d("Contributor created",{action:e.action,result:r.value})},"rename.contributor":e=>{let{id:t,name:n}=e.payload,r=R.renameContributor(t,n);return c(r)?O(r.message??"Unable to rename contributor",e):d("Contributor renamed",{action:e.action,result:r.value})},"tombstone.contributor":e=>{let{id:t}=e.payload,n=R.tombstoneContributor(t);return c(n)?O(n.message??"Unable to remove contributor",e):d("Contributor tombstoned",{action:e.action,result:n.value})},"restore.contributor":e=>{let{id:t,name:n}=e.payload,r=R.restoreContributor(t,n);return c(r)?O(r.message??"Unable to restore contributor",e):d("Contributor restored",{action:e.action,result:r.value})},"add.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=R.tag(t,n);return c(r)?O(r.message??"Unable to tag issue",e):d("Issue tagged",{action:e.action,result:{tag:n}})},"remove.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=R.untag(t,n);return c(r)?O(r.message??"Unable to untag issue",e):d("Issue untagged",{action:e.action,result:{tag:n}})},"add.swimlane.rule":e=>{let{id:t,rule:n}=e.payload,r=R.addLaneRule(t,n);return c(r)?O(r.message??"Unable to add rule",e):d("Added lane rule",{action:e.action,result:r.value})},"remove.swimlane.rule":e=>{let{id:t,rule:n}=e.payload,r=R.removeLaneRule(t,n);return c(r)?O(r.message??"Unable to remove rule",e):d("Removed lane rule",{action:e.action,result:r.value})},"add.issue.goal":e=>{let{id:t,goal:n}=e.payload,r=R.addGoal(t,n);return c(r)?O(r.message??"Unable to add goal",e):d("Added to goal",{action:e.action,result:r.value})},"remove.issue.goal":e=>{let{id:t,goal:n}=e.payload,r=R.removeGoal(t,n);return c(r)?O(r.message??"Unable to remove goal",e):d("Removed from goal",{action:e.action,result:r.value})},"add.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,r=R.assign(t,n);return c(r)?O(r.message??"Unable to assign issue",e):d("Assigned successfully",{action:e.action,result:{assignee:n}})},"remove.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,r=R.unassign(t,n);return c(r)?O(r.message??"Unable to unassign issue",e):d("Issue unassigned",{action:e.action,result:{assignee:n}})},"move.node":e=>{let{id:t,parent:n,rank:r}=e.payload,o=R.moveNodeToRank({id:t,parentId:n,rank:r});return c(o)?O(o.message??"Failed to move node",e):d("Moved node",{action:e.action,result:o.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,r=R.editValue(t,n);return c(r)?O(r.message??"Unable to edit description",e):d("Set node value",{action:e.action,result:r.value})},"close.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=R.getNode(t);if(!o)return O("Unable to locate issue",e);if(!j(o))return O("Can only close issues",e);let s=R.getNode(mt);if(!s)return O("Unable to locate target swimlane",e);if(n!==s.id)return O("Close target must be closed swimlane",e);let i=R.moveNodeToRank({id:t,parentId:n,rank:r});return c(i)?O(i.message??"Unable to close issue",e):d("Issue closed",{action:e.action,result:{id:t}})},"reopen.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=R.getNode(t);if(!o)return O("Unable to locate issue",e);if(!j(o))return O("Can only reopen issues",e);let s=R.getNode(mt);if(!s)return O("Unable to locate closed swimlane",e);if(n===s.id)return O("Cannot reopen issue into closed swimlane",e);if(!R.getNode(n))return O("Reopen parent no longer exists",e);let l=R.moveNodeToRank({id:t,parentId:n,rank:r});return c(l)?O(l.message??"Unable to reopen issue",e):d("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=R.lockNode(t);return c(n)?O(n.message??"Unable to lock node",e):d("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=R.getNode(r);if(!s)return O(`Unable to locate node ${r}`,e);if(s.parentNodeId!==t)return O(`Node ${r} is not child of ${t}`,e);let i=R.updateNode({...s,rank:o});if(c(i))return O(i.message??"Unable to rebalance child",e)}return d("Rebalanced children",{action:e.action,result:{parent:t}})},"add.issue.comment":e=>{let{id:t,issue:n,author:r,md:o}=e.payload,s=R.createComment({id:t,issue:n,authorId:r,md:o,deleted:!1});return c(s)?O(s.message??"Unable to add comment",e):d("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=R.getComment(t);if(!o)return O("Unable to locate comment",e);if(o.issue!==n)return O("Comment does not belong to issue",e);let s=R.editComment(t,r);return c(s)?O(s.message??"Unable to edit comment",e):d("Comment edited",{action:e.action,result:{id:t,issue:n,md:r}})},"delete.issue.comment":e=>{let{id:t,issue:n}=e.payload,r=R.getComment(t);if(!r)return O("Unable to locate comment",e);if(r.issue!==n)return O("Comment does not belong to issue",e);let o=R.deleteComment(t);return c(o)?O(o.message??"Unable to delete comment",e):d("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,l=R.createAttachment({id:t,issue:n,hash:r,ext:o,name:s,bytes:i,deleted:!1});return c(l)?O(l.message??"Unable to add attachment",e):d("Attachment added",{action:e.action,result:{id:t,issue:n,hash:r}})},"delete.issue.attachment":e=>{let{id:t,issue:n}=e.payload,r=R.getAttachment(t);if(!r)return O("Unable to locate attachment",e);if(r.issue!==n)return O("Attachment does not belong to issue",e);let o=R.deleteAttachment(t);return c(o)?O(o.message??"Unable to delete attachment",e):d("Attachment deleted",{action:e.action,result:{id:t,issue:n}})},"link.contributor.email":e=>{let{contributor:t,email:n}=e.payload;if(!ar(n))return O(`not an email address: ${n}`,e);let r=R.linkContributorEmail({email:n,contributor:t,authorId:e.userId});return c(r)?O(r.message??"Unable to link email",e):d("Email linked to contributor",{action:e.action,result:r.value})},"unlink.contributor.email":e=>{let{contributor:t,email:n}=e.payload,r=R.unlinkContributorEmail(n,t,e.userId);return c(r)?O(r.message??"Unable to unlink email",e):d("Email unlinked from contributor",{action:e.action,result:r.value})},"link.contributor.user":e=>{let{contributor:t}=e.payload,n=R.linkUserId({contributorId:t,userId:e.userId});return c(n)?O(n.message??"Unable to link contributor",e):d("Contributor linked to user",{action:e.action,result:{contributor:t,userId:e.userId}})},"connect.repo":e=>{let t=vc(e);return"skip"in t?t.skip:d(t.message,{action:e.action,result:t.entry})},"edit.repo":e=>{let t=vc(e);return"skip"in t?t.skip:d(t.message,{action:e.action,result:t.entry})},"disconnect.repo":e=>{let t=vc(e);return"skip"in t?t.skip:d(t.message,{action:e.action,result:t.entry})}};var gp=e=>{let t=R.getNode(e);if(!t||!j(t)||t.isDeleted)return null;let n=Rc(t);return c(n)?n:null},hp=e=>{if(!Ec())return null;for(let t of e){let n=gp(t);if(n)return n;let r=h().nodes[t]?.parentNodeId;if(!r)continue;let o=gp(r);if(o)return o}return null},AR=(e,t)=>{let n=R.getNode(e);n&&R.updateNode({...n,log:[...n.log??[],t]})},TR=e=>{let t=[e],n=h().nodes[e]?.parentNodeId;return n&&t.push(n),t},xc=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 TR(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.swimlane.rule":case"remove.swimlane.rule":case"add.issue.goal":case"remove.issue.goal":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.goal":case"rename.goal":case"edit.goal.description":case"tombstone.goal":case"create.contributor":case"rename.contributor":case"link.contributor.user":case"link.contributor.email":case"unlink.contributor.email":case"connect.repo":case"edit.repo":case"disconnect.repo":default:return[]}},MR=e=>{ue(t=>({...t,eventLog:[...t.eventLog,e]}))},Kt=null,kR=e=>{for(let[t,n]of e.nodeLog){let r=R.getNode(t);r&&R.updateNode({...r,log:[...r.log??[],...n]})}return e.appLog.length>0&&ue(t=>({...t,eventLog:[...t.eventLog,...e.appLog]})),hp([...e.virtualNodeIds])},yp={isInitialized:()=>gt(),batch:e=>Ks(e),afterApply(e,{batched:t,bypassLogging:n}){let r=[...new Set(xc(e))];if(t){Kt??={appLog:[],nodeLog:new Map,virtualNodeIds:new Set};for(let o of r){if(!n){let s=Kt.nodeLog.get(o);s?s.push(e):Kt.nodeLog.set(o,[e])}if(Ec()){Kt.virtualNodeIds.add(o);let s=h().nodes[o]?.parentNodeId;s&&Kt.virtualNodeIds.add(s)}}return n||Kt.appLog.push(e),null}return n||(r.forEach(o=>AR(o,e)),MR(e)),hp(r)},flush(){if(!Kt)return null;let e=Kt;return Kt=null,kR(e)}};var te=()=>{let{userName:e,userId:t}=ne();return e?t?pd(t)?fd(e)?d("Successfully resolved actor ID",{userId:t,userName:e}):a("Invalid user name in config"):a("Invalid user ID in config"):a("User ID not configured"):a("User name not configured")};var LR={genesis:"init.workspace",actions:yc,readPayload:mp,apply:fp,replay:yp,write:{readOnlyReason:()=>{let e=h();return e.readOnly?e.readOnlyReason??"Cannot change the board while time travelling":null},beforeWrite:pp}},PR=dp(LR),{materialize:So,materializeAll:un,fromPersistedEvent:r0,decodeReconstructedEvents:o0,loadMergedEventsWithUnreadable:Co,loadEventActors:s0,loadActorNames:bp,loadMergedEvents:qs,loadMergedEventsBefore:vp,getEdgeRef:i0,advanceEdgeRef:a0,clearEdgeCache:c0,getSortedEvents:l0,loadEffectiveEventTimes:xp,mintEventId:d0,persist:Rp,materializeAndPersist:u0,materializeAndPersistAll:Y}=PR;var Sc="Unchanged",Ys="Renamed ",_R={live:[],overLimit:[],disconnected:[]},No=null,$R=(e,t)=>{if(!gt())return null;let n=h();return n.timeMode==="live"&&n.replay===null&&Om(e)===t?n.repos:null},at=e=>{try{let t=ve({repoRoot:e});if(c(t))return a(t.message);let n=t.value,r=Tt(n);if(r==="none")return d("No log yet",_R);if(No&&No.root===n&&No.signature===r)return d("Read connected repos",No.repos);let o=$R(n,r);if(!o){let i=qs(n);if(c(i))return a(i.message);o=Rd(i.value)}let s=Ed(o);return No={root:n,signature:r,repos:s},d("Read connected repos",s)}catch(t){return a(`Could not read the connected repos: ${t instanceof Error?t.message:String(t)}`)}},Xs=e=>{let t=at(e);return c(t)?a(t.message):d("Read other repos",t.value.live)},Sp=(e,t)=>{let n=Xs(e);return!c(n)&&n.value.some(r=>r.id===t)},Cc=e=>{let t=e.url.trim(),n=Gr(t);if(n)return a(`That URL ${n}. ${hd}`);if(e.since!==void 0&&!Tn(e.since))return a(`"${e.since}" is not a history window: use board, all or YYYY-MM-DD.`);let r=e.label?.trim();if(r&&!Mn(r))return a(`"${r}" is not a label: up to 24 of a-z, 0-9, dot, dash or underscore, opening on a letter or digit.`);let o=at(e.repoRoot);if(c(o))return a(o.message);let s=[...o.value.live,...o.value.overLimit],i=nn(t),l=s.find(g=>g.id===i),u=r===void 0?void 0:r===Pt(l?.url??t)?"":r;if(u&&s.some(g=>g.id!==i&&g.label===u))return a(`Another repo is already called ${u}`);let m={...e.branches?{branches:e.branches}:{},...e.since?{since:e.since}:{},...u!==void 0?{label:u}:{}};if(!l){let g={id:i,url:t,branches:e.branches??ea,since:e.since??ta,label:u||Pt(t)};return d("Plan",{kind:"connect",repo:g,event:{url:t,...e.branches?{branches:e.branches}:{},...e.since?{since:e.since}:{},...u?{label:u}:{}}})}let p={...l,branches:e.branches??l.branches,since:e.since??l.since,label:u===void 0?l.label:u||Pt(l.url)};if(p.branches===l.branches&&p.since===l.since&&p.label===l.label)return d("Plan",{kind:"unchanged",repo:l});let f=p.branches===l.branches&&p.since===l.since;return d("Plan",{kind:"edit",repo:p,event:{repo:i,...m},message:`${f?Ys:"Updated "}${p.label}`})},wo=e=>{let t=ve({repoRoot:e.repoRoot});if(c(t))return a(t.message);let n=Y([{id:FR(),userId:e.actorId,...e.event}],t.value);return c(n)?a(n.message):d("Wrote repo event",null)},Nc=e=>{let t=at(e);return new Map(c(t)?[]:[...t.value.live,...t.value.overLimit].map(n=>[n.id,n.label]))},wc=e=>e.map(t=>e.filter(n=>n.label===t.label).length===1?t.label:t.id),Js=(e,t)=>{let n=t.trim(),r=e.filter(s=>s.label===n);if(r.length>1)return a(`Several repos are called ${n} \u2014 name one by its id or URL`);let o=r[0]??e.find(s=>s.id===n||tn(n)&&s.id===nn(n));return o?d("Found",o):a(`No repo "${n}" is connected`)},Ic=(e,t)=>{let n=at(e);return c(n)?a(n.message):Js([...n.value.live,...n.value.overLimit],t)},Ac=e=>Ep.join(ze(),"repos",/^[\w-]+$/.test(e)?e:OR("sha1").update(e).digest("hex")),Cp=/^[a-z0-9._-]+-[0-9a-f]{12}\.git$/,_t=(e,t)=>Ep.join(Ac(e),`${t}.git`),Sr=e=>`${e}.json`,Zs=/^(?!-)[A-Za-z0-9._/-]{1,100}$/,Np=e=>{try{let t=JSON.parse(DR.readFileSync(Sr(e),"utf8"));return typeof t.stateBranch=="string"&&Zs.test(t.stateBranch)?t.stateBranch:null}catch{return null}},mn=(e,t)=>e==="all"?null:e==="board"?t.slice(0,10):e,qt=e=>{let t=He(e);return c(t)?a(t.message):d("Read project",{projectId:t.value.projectId,createdAt:t.value.createdAt})};var BR=(e,t)=>{let n=(e.trim().split(/\s+/)[0]??"").toUpperCase();return n&&t.has(n)?n:null},wp=(e,t)=>{let n=BR(e.subject,t),r=(e.refs??[]).map(o=>o.toUpperCase());return[...new Set([...n?[n]:[],...r])].filter(o=>t.has(o))};import{randomUUID as Do}from"node:crypto";import D from"node:fs";import J from"node:path";import{execFileSync as UR}from"node:child_process";import{randomUUID as Tp}from"node:crypto";import Xe from"node:fs";import Io from"node:os";import Mp from"node:path";var ti="epiq-sync.lock",jR=600*1e3,kp=Date.now()-process.uptime()*1e3,Lp=()=>Math.round(kp),Pp=5e3,HR=5e3,Op=e=>{try{if(process.platform==="linux"){let s=Xe.readFileSync(`/proc/${e}/stat`,"utf8"),i=s.slice(s.lastIndexOf(")")+2).split(" "),l=Number(i[19]),u=/^btime (\d+)$/m.exec(Xe.readFileSync("/proc/stat","utf8"))?.[1];return u&&Number.isFinite(l)?Number(u)*1e3+l*10:null}if(process.platform==="win32")return null;let t=Ip.get(e);if(t&&Date.now()-t.at<GR)return t.value;let n=UR("ps",["-o","lstart=","-p",String(e)],{encoding:"utf8",timeout:2e3,stdio:["ignore","pipe","ignore"],env:{...process.env,LC_ALL:"C"}}).trim(),r=Date.parse(n),o=Number.isNaN(r)?null:r;return Ip.set(e,{at:Date.now(),value:o}),o}catch{return null}},Dp=(e,t)=>{let n=Op(e);return n!==null&&n>t+Pp},GR=5e3,Ip=new Map,WR=e=>{let t=Date.now()-Io.uptime()*1e3;if(e.startedAt<t)return!1;if(Date.now()-e.startedAt<HR||e.processStartedAt===void 0)return!0;let n=Op(e.pid);return n===null||Math.abs(n-e.processStartedAt)<=Pp},Qs=new Map,zR=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}},VR=e=>{try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}},Fp=(e,t=jR,n=!1)=>e?e.hostname!==Io.hostname()?Date.now()-e.startedAt>t?"stale":null:!VR(e.pid)||n&&!WR(e)?"dead":Date.now()-e.startedAt>t?"stale":null:"stale",KR=e=>{let t=Mp.join(e,ti);return Xe.existsSync(t)?Fp(Cr(t))===null:!1},ei=new Map,qR=e=>{let t=ei.get(e);if(t)return t;let n=qr(e).then(r=>c(r)?null:r.value,()=>null);return ei.set(e,n),n.then(r=>{r===null&&ei.get(e)===n&&ei.delete(e)}),n},V0=async e=>{let t=await qR(e);return t!==null&&KR(t)},_p=e=>`${e.operation} (pid ${e.pid} on ${e.hostname}, started ${new Date(e.startedAt).toISOString()})`,Cr=e=>{try{return zR(Xe.readFileSync(e,"utf8"))}catch{return null}},YR=(e,t)=>{let n={pid:process.pid,hostname:Io.hostname(),startedAt:Date.now(),operation:t,token:Tp(),processStartedAt:kp},r=`${e}.${process.pid}.pending.lock`;try{return Xe.writeFileSync(r,JSON.stringify(n)),Xe.linkSync(r,e),n}catch{return null}finally{try{Xe.rmSync(r,{force:!0})}catch{}}},XR=async({worktreeRoot:e,operation:t})=>{let n=await qr(e);return c(n)?a(n.message):d("Tried the sync lock",Ao({lockPath:Mp.join(n.value,ti),operation:t}))},Ao=({lockPath:e,operation:t,staleAfterMs:n,checkProcess:r=!1})=>{let o=null,s=()=>{try{let u=Cr(e);u&&Ap(u,o)&&Xe.rmSync(e)}catch{}finally{Qs.get(e)===o?.token&&Qs.delete(e)}},i=u=>(o=YR(e,t),o?(Qs.set(e,o.token),{acquired:!0,claim:u,release:s}):null);for(let u=0;u<5;u++){let m=i("clean");if(m)return m;let p=Cr(e);if(p===null&&(!Xe.existsSync(e)||(p=Cr(e),p!==null)||!Xe.existsSync(e)))continue;let g=p!==null&&p.pid===process.pid&&p.hostname===Io.hostname()&&Qs.get(e)!==p.token?"dead":Fp(p,n,r);if(g===null)return{acquired:!1,heldBy:p};K.info(`Breaking an abandoned sync lock: ${p?_p(p):"unreadable lock file"}`);let v=`${e}.${process.pid}.${Tp()}.broken.lock`;try{Xe.renameSync(e,v)}catch{continue}if(!Ap(Cr(v),p)){try{Xe.linkSync(v,e)}catch{}Xe.rmSync(v,{force:!0});continue}Xe.rmSync(v,{force:!0});let w=i(g);if(w)return w}return{acquired:!1,heldBy:Cr(e)??{pid:-1,hostname:Io.hostname(),startedAt:Date.now(),operation:"unknown"}}},Ap=(e,t)=>e===null||t===null?e===t:e.pid===t.pid&&e.hostname===t.hostname&&e.startedAt===t.startedAt&&e.token===t.token,To=async({worktreeRoot:e,operation:t,fn:n})=>{let r=await XR({worktreeRoot:e,operation:t});if(c(r))return a(r.message);if(!r.value.acquired)return K.info(`Skipping ${t}: the state worktree is held by ${_p(r.value.heldBy)}`),d("State worktree is held by another process",null);let{claim:o,release:s}=r.value;try{return d("Ran under the sync lock",await n(o))}finally{s()}};import{randomBytes as tE}from"node:crypto";import nE from"node:fs";var JR="EPIQ_CACHE_MS",ni=e=>{let t=process.env[JR];if(t===void 0||t.trim()==="")return e;let n=Number(t);return Number.isFinite(n)&&n>=0?n:e};import $p from"node:fs";import ZR from"node:path";var Bp=new Set,Tc=new Map,Mc=(e,t)=>{t?Tc.set(e,t):Tc.delete(e)},Up=e=>Tc.get(e)??null,QR=e=>{try{return new Set($p.readFileSync(ZR.join(e,"shallow"),"utf8").split(`
37
+ `).map(t=>t.trim()).filter(Boolean))}catch{return Bp}},Vn=async e=>{let t=At(e);if(c(t))return a(t.message);let n=t.value,r=He(n);if(c(r))return a(r.message);let o={cwd:n,revisions:["--branches","--not",r.value.stateBranch],exclude:Bp},s=Xs(n);if(c(s))return d("Listed sources",[o]);let i=s.value.flatMap(l=>{let u=_t(r.value.projectId,l.id);if(!$p.existsSync(u))return[];let m=mn(l.since,r.value.createdAt),p=new Set([r.value.stateBranch,Oa,Np(u)].filter(f=>f!==null));return[{repo:l.id,cwd:u,revisions:[...[...p].map(f=>`--exclude=${f}`),"--branches"],exclude:QR(u),...m?{notBefore:Date.parse(`${m}T00:00:00Z`)}:{}}]});return d("Listed sources",[o,...i])},kc=e=>t=>e.find(n=>(n.repo??"")===(t??""))?.cwd,eE=async(e,t)=>!c(await _({cwd:e,args:["cat-file","-e",`${t}^{commit}`]})),Mo=async e=>{let t=await Vn(e.repoRoot);if(c(t))return a(t.message);let n=t.value;if(e.repo){let r=n.find(o=>o.repo===e.repo);return r?d("Resolved repo",r.cwd):a(`No clone of repo "${e.repo}" here yet \u2014 sync to fetch it`)}if(n.length===1)return d("Resolved repo",n[0].cwd);for(let r of n)if(await eE(r.cwd,e.sha))return d("Resolved repo",r.cwd);return d("Resolved repo",n[0].cwd)};var Lc="",rE="",jp=5e3,oE=12e4,sE=32*1024*1024,ri=new Map,iE=e=>{try{return nE.statSync(`${e}.json`).mtimeMs}catch{return null}},aE=()=>{let e=tE(8).toString("hex");return{field:`${Lc}${e}`,record:`${rE}${e}`,body:`${Lc}B${e}`,end:`${Lc}E${e}`}},cE=/^[ \t]*Epiq-Ref:[ \t]*(.*)$/gim,lE=new RegExp(`^[0-9A-HJKMNP-TV-Z]{${7}}$`,"i"),Oc=e=>[...new Set([...e.matchAll(cE)].flatMap(t=>t[1].split(/[\s,]+/)).filter(t=>lE.test(t)).map(t=>t.toUpperCase()))],dE=/^[0-9a-f]{40}([0-9a-f]{24})?$/;var fn=()=>{ri.clear()},Hp=(e,t,n)=>(t===void 0||e>=Math.floor(t/1e3)*1e3)&&(n===void 0||e<=n),Pc=e=>dt(e).replace(/[\u0080-\u009f\u202a-\u202e\u2066-\u2069]/g,""),uE=async(e,t)=>{let n=t.start===void 0&&t.end===void 0,r=[e.cwd,e.revisions.join(" "),e.notBefore??"",e.exclude.size].join("\0"),o=n?ri.get(r):void 0,s=e.repo?iE(e.cwd):null;if(o&&(e.repo?o.version===s:Date.now()-o.fetchedAt<ni(jp)))return o.result;let i=aE(),l=await _({cwd:e.cwd,...e.repo?{timeoutMs:oE,maxOutput:sE}:{},args:["log",...e.revisions,...t.start!==void 0?[`--since=@${Math.floor(t.start/1e3)}`]:[],...t.end!==void 0?[`--until=@${Math.floor(t.end/1e3)}`]:[],"--shortstat",`--format=${i.record}%H${i.field}%at${e.notBefore?`${i.field}%ct`:""}${i.field}%an${i.field}%ae${i.field}%s${i.body}%b${i.end}`]});if(c(l))return e.repo&&n&&!ru(l.message)&&ri.set(r,{fetchedAt:Date.now(),version:s,result:a(l.message)}),a(l.message);let u=l.value.stdout.split(i.record).filter(m=>m.trim().length>0).map(m=>{let p=m.indexOf(i.end),[f="",...g]=m.split(`
38
+ `),v=p===-1?f:m.slice(0,p),w=p===-1?g:m.slice(p+i.end.length).split(`
39
+ `),x=v.indexOf(i.body),E=x===-1?v:v.slice(0,x),N=x===-1?[]:Oc(v.slice(x+i.body.length)),S=E.split(i.field),[k,L]=S;if(e.repo&&!dE.test(k??""))return null;let B=e.notBefore?S[2]:void 0,[M,P,...$]=S.slice(e.notBefore?3:2);if(!k||!L||e.exclude.has(k)||e.notBefore&&Number(B)*1e3<e.notBefore)return null;let de=w.join(" "),U=Number(/(\d+) insertion/.exec(de)?.[1]??0),F=Number(/(\d+) deletion/.exec(de)?.[1]??0);return{sha:k,...e.repo?{repo:e.repo}:{},time:Number(L)*1e3,author:Pc(M)||"unknown",authorEmail:Pc(P),subject:Pc($.join(i.field)),...N.length>0?{refs:N}:{},linesChanged:U+F,insertions:U,deletions:F}}).filter(m=>m!==null).filter(m=>Hp(m.time,t.start,t.end));return n&&ri.set(r,{fetchedAt:Date.now(),version:s,result:d("Computed commit timeline",u)}),d("Computed commit timeline",u)},Gp=async(e,t)=>{let n=await Vn(e);if(c(n))return a(n.message);let r=n.value,o=[];for(let i of r)o.push(await uE(i,t));let s=[];for(let[i,l]of o.entries()){let u=r[i].repo;if(c(l)){if(!u)return a(l.message);K.info(`[repos] could not read a clone: ${l.message}`),Mc(u,bs(l.message)?"its history is too long to read; narrow its window":"its history could not be read");continue}u&&Mc(u,null),s.push(l.value)}return d("Read every source",s)},ko=e=>{if(e.length<=1)return e;let t=new Set;return e.map(n=>{let r=n.filter(o=>!t.has(o.sha));for(let o of r)t.add(o.sha);return r})},Wp=e=>{let t=e.filter(n=>n.length>0);return t.length<=1?t[0]??[]:t.flat().sort((n,r)=>r.time-n.time)},mE=async(e={})=>{let t=await Gp(e.repoRoot,{start:e.start,end:e.end});return c(t)?a(t.message):d("Computed commit timeline",Wp(ko(t.value)))},zp=async e=>{let t=e.refs.find(s=>s.length!==7);if(t!==void 0)return a(`"${t}" is ${t.length} characters; a ref is ${7}. Read it off the issue rather than slicing the id by hand.`);let n=await Gp(e.repoRoot,{});if(c(n))return a(n.message);let r=new Set(e.refs.map(s=>s.toUpperCase())),o=s=>{let i=s.subject.slice(0,7).toUpperCase(),l=s.subject[7]===" "&&r.has(i)?[i]:[],u=(s.refs??[]).filter(m=>r.has(m));return u.length>0?[...new Set([...l,...u])].sort():l};return d("Matched commits by ref",n.value.map(s=>{let i=[];for(let[l,u]of s.entries()){let m=o(u);if(m.length===0||!Hp(u.time,void 0,e.end))continue;let p=s[l+1];i.push({...u,tickets:m,precedingSha:p&&o(p).some(f=>m.includes(f))?p.sha:null})}return i}))},Dc=async e=>{let t=e.ref.trim();if(!t)return a("ref must not be empty");let n=await zp({...e,refs:[t]});return c(n)?a(n.message):d(n.message,n.value.map(r=>r.map(({tickets:o,...s})=>s)))},Fc=async e=>{let t=await Dc(e);return c(t)?a(t.message):d("Matched commits by ref",Wp(ko(t.value)))},pE=async e=>{let t=await zp(e);return c(t)?a(t.message):d("Matched commits by refs",ko(t.value).flat().sort((n,r)=>r.time-n.time||(n.repo??"").localeCompare(r.repo??"")||n.sha.localeCompare(r.sha)))};var oi=1800*1e3,Bt=e=>`${e}.removed`,Vp=e=>{try{D.writeFileSync(Bt(e),"",{flag:"wx"})}catch(t){if(t.code!=="EEXIST")throw t;if(si(Bt(e)))throw new Error("The removal mark is a link, which epiq will not use")}},Uc=()=>`${process.pid}-${Lp()}`,Bc=e=>{try{let t=JSON.parse(D.readFileSync(Sr(e),"utf8"));return{fetchedAt:typeof t.fetchedAt=="number"?t.fetchedAt:null,attemptedAt:typeof t.attemptedAt=="number"?t.attemptedAt:null,error:typeof t.error=="string"?t.error:null,branches:t.branches==="all"||t.branches==="default"?t.branches:null,since:typeof t.since=="string"?t.since:null,restartedAt:typeof t.restartedAt=="number"?t.restartedAt:null,restartTriedAt:typeof t.restartTriedAt=="number"?t.restartTriedAt:null,restarts:typeof t.restarts=="number"&&t.restarts>=0?t.restarts:0,bytes:typeof t.bytes=="number"&&t.bytes>=0?t.bytes:null,stateBranch:typeof t.stateBranch=="string"&&Zs.test(t.stateBranch)?t.stateBranch:null}}catch{return null}},Qp=(e,t)=>{try{let n=`${Sr(e)}.${Uc()}.${Do()}.tmp`;D.writeFileSync(n,JSON.stringify(t)+`
40
+ `,{flag:"wx"}),D.renameSync(n,Sr(e))}catch(n){K.info(`[repos] could not record fetch status: ${String(n)}`)}},jc=e=>{let t=qt(e);if(c(t))return a(t.message);let n=at(e);if(c(n))return a(n.message);let r=(o,s)=>{let i=_t(t.value.projectId,o.id),l=Bc(i),u=D.existsSync(i);return{...o,cloned:u,overLimit:s,bytes:u?l?.bytes??null:null,fetchedAt:l?.fetchedAt??null,error:l?.error??Up(o.id)}};return d("Listed repos",[...n.value.live.map(o=>r(o,!1)),...n.value.overLimit.map(o=>r(o,!0))])},Ce=e=>_({...e,forClone:!0}),fE=(e,t)=>Ce({cwd:e,args:t,timeoutMs:oi}),gE=1e3,Po=async(e,t,n,{undo:r}={})=>{let o=xr(),s=o*1024*1024,i=new AbortController,l=setInterval(()=>{cn(n)>s&&i.abort(go(o))},gE),u;try{u=await Ce({cwd:e,args:t,timeoutMs:oi,abort:i.signal})}finally{clearInterval(l)}return i.signal.aborted||!c(u)&&cn(n)>s?(tf(n),r&&(bE(n,r),pf(n)),a(go(o))):u},Lo=e=>{try{return D.readFileSync(e)}catch{return null}},Hc=e=>{try{return D.readdirSync(e)}catch{return[]}},hE=e=>{let t=new Map,n=r=>{let o=J.join(e,r);for(let s of D.readdirSync(o,{withFileTypes:!0})){let i=J.join(r,s.name);s.isDirectory()?n(i):t.set(i,D.readFileSync(J.join(e,i)))}};return D.existsSync(J.join(e,"refs"))&&n("refs"),{refs:t,packedRefs:Lo(J.join(e,"packed-refs")),head:Lo(J.join(e,"HEAD")),config:Lo(J.join(e,"config")),shallow:Lo(J.join(e,"shallow")),packs:new Set(Hc(J.join(e,"objects","pack")))}},ef="epiq-restore-",Kp=(e,t,n)=>{let r=J.join(e,`${ef}${Do()}.tmp`);D.writeFileSync(r,n,{flag:"wx"}),D.mkdirSync(J.dirname(J.join(e,t)),{recursive:!0}),D.renameSync(r,J.join(e,t))},yE=e=>{let t=[],n=r=>{for(let o of D.readdirSync(J.join(e,r),{withFileTypes:!0})){let s=J.join(r,o.name);o.isDirectory()?n(s):t.push(s)}};return D.existsSync(J.join(e,"refs"))&&n("refs"),t},bE=(e,t)=>{for(let[r,o]of t.refs)Kp(e,r,o);for(let r of yE(e))t.refs.has(r)||D.rmSync(J.join(e,r),{force:!0});for(let[r,o]of[["packed-refs",t.packedRefs],["HEAD",t.head],["config",t.config],["shallow",t.shallow]])o?Kp(e,r,o):D.rmSync(J.join(e,r),{force:!0});let n=J.join(e,"objects","pack");for(let r of Hc(n))t.packs.has(r)||D.rmSync(J.join(n,r));Kn.delete(e)},tf=e=>{let t=J.join(e,"objects");for(let[n,r]of[[J.join(t,"pack"),"tmp_"],[J.join(t,"pack"),".tmp-"],[t,"incoming-"],[e,ef]])try{for(let o of D.readdirSync(n))o.startsWith(r)&&D.rmSync(J.join(n,o),{recursive:!0,force:!0})}catch{}},vE=/could not read from remote repository|the remote end hung up unexpectedly|early EOF|fetch-pack: invalid index-pack output/i,nf=e=>{let t=e.split(`
41
+ `).map(s=>s.replace(/[\x00-\x09\x0b-\x1f\x7f-\x9f]/g,"").trim()).filter(s=>s&&!s.startsWith("git ")),n=t.filter(s=>/^(fatal|error):/i.test(s));return(n.filter(s=>!vE.test(s))[0]??n[n.length-1]??t[t.length-1]??e).replace(/^(fatal|error):\s*/i,"").slice(0,300)},xE=64*1024,rf=async e=>{let t="HEAD:.epiq/project.json",n=await Ce({cwd:e,args:["cat-file","-s",t]});if(c(n)||!(Number(n.value.stdout.trim())<=xE))return null;let r=await Ce({cwd:e,args:["cat-file","blob",t]});if(c(r))return null;try{let{stateBranch:o}=JSON.parse(r.value.stdout);return typeof o=="string"&&Zs.test(o)?o:null}catch{return null}},Gc=async e=>{let t=await Ce({cwd:e,args:["symbolic-ref","--short","HEAD"]});return c(t)?null:t.value.stdout.trim()||null},RE=async(e,t)=>{if(t==="all")return d("All branches","+refs/heads/*:refs/heads/*");let n=await Gc(e);return n?d("Default branch",`+refs/heads/${n}:refs/heads/${n}`):a("Could not tell which branch is the default")},EE=async e=>{let t=await Gc(e);if(!t)return;let n=await Ce({cwd:e,args:["for-each-ref","--format=%(refname)","refs/heads/"]});if(!c(n))for(let r of n.value.stdout.split(`
42
+ `).filter(Boolean))r!==`refs/heads/${t}`&&await Ce({cwd:e,args:["update-ref","-d",r]})},of=async e=>{let t=await Ce({cwd:e,args:["for-each-ref","--count=1","--format=x","refs/heads/"]});return!c(t)&&t.value.stdout.trim()!==""},sf=e=>Math.floor(Date.parse(`${e}T00:00:00Z`)/1e3),af=e=>`--shallow-since=@${sf(e)}`,cf=async(e,t)=>{let n=await Ce({cwd:e,args:["for-each-ref","--format=%(committerdate:unix)","refs/heads/"]});return c(n)?!0:n.value.stdout.split(`
43
+ `).filter(Boolean).some(r=>Number(r)>=sf(t))},lf=async(e,t)=>{if(!await of(e))return d("Empty",null);let n=await Po(e,["fetch","--no-tags","--deepen=1","origin"],e,{undo:t});return c(n)?a(n.message):d("Deepened",null)},df=async(e,t,n)=>{let r=J.dirname(e);D.mkdirSync(r,{recursive:!0}),D.rmSync(e,{recursive:!0,force:!0});let o=async(i,l)=>{let u=await Po(r,["clone","--bare","--no-tags",t.branches==="default"?"--single-branch":"--no-single-branch",...i,"--",t.url,e],e);if(c(u))return a(u.message);let m=await RE(e,t.branches);return c(m)?a(m.message):(await Ce({cwd:e,args:["config","remote.origin.fetch",m.value]}),l?lf(e):d("Cloned",null))},s=await o(n?[af(n)]:[],!!n);if(c(s)&&n){let i=s;D.rmSync(e,{recursive:!0,force:!0}),s=await o(["--depth=1"],!1),!c(s)&&await cf(e,n)&&(s=i)}return c(s)?(D.rmSync(e,{recursive:!0,force:!0}),a(s.message)):d("Built clone",null)},qp=async(e,t,n,{replace:r=!1}={})=>{let o=`${e}.${Uc()}.pending`,s=await df(o,t,n);if(c(s))return s;if(r&&D.existsSync(e)){let i=`${e}.${Do()}.deleting`;D.renameSync(e,i),D.renameSync(o,e);try{D.rmSync(i,{recursive:!0,force:!0})}catch(l){K.info(`[repos] could not clear an old clone: ${ct(l)}`)}return d("Cloned anew",null)}return D.existsSync(e)?(D.rmSync(o,{recursive:!0,force:!0}),d("Cloned elsewhere",null)):si(e)?(D.rmSync(o,{recursive:!0,force:!0}),a("The clone path is a link, which epiq will not use")):(D.renameSync(o,e),d("Cloned",null))},SE=async(e,t)=>!/[*:]/.test(t)&&!c(await Ce({cwd:e,args:["check-ref-format",`refs/heads/${t}`]})),uf=async e=>{let t=await fE(e,["ls-remote","--symref","origin","HEAD"]);if(c(t))return null;let n=/^ref: refs\/heads\/(\S+)\tHEAD$/m.exec(t.value.stdout)?.[1],r=/^[0-9a-f]{40,64}\tHEAD$/m.test(t.value.stdout);return n&&r&&await SE(e,n)?n:null},mf=async(e,t)=>{let n=t??await uf(e);if(!n)return a("Could not tell which branch the remote now defaults to");let r=await Ce({cwd:e,args:["symbolic-ref","HEAD",`refs/heads/${n}`]});if(c(r))return a(r.message);let o=await Ce({cwd:e,args:["config","remote.origin.fetch",`+refs/heads/${n}:refs/heads/${n}`]});return c(o)?a(o.message):d("Followed",null)},pf=e=>{let t=(n,r)=>{for(let o of D.readdirSync(n,{withFileTypes:!0})){let s=J.join(n,o.name);o.isFile()&&o.name.endsWith(".lock")?D.rmSync(s,{force:!0}):o.isDirectory()&&r>0&&t(s,r-1)}};try{for(let r of D.readdirSync(e))r.endsWith(".lock")&&D.rmSync(J.join(e,r),{force:!0});let n=J.join(e,"refs");D.existsSync(n)&&t(n,16)}catch(n){K.info(`[repos] could not clear stale locks: ${String(n)}`)}},ff=e=>D.existsSync(J.join(e,"shallow")),CE=20,NE=async e=>{if(Hc(J.join(e,"objects","pack")).filter(r=>r.endsWith(".pack")).length<=CE)return;let n=await Ce({cwd:e,args:["repack","--geometric=2","-d","-q"],timeoutMs:oi});c(n)&&K.info(`[repos] repack: ${n.message}`)},wE=async e=>{let t=await Ce({cwd:e,args:["config","--get","remote.origin.fetch"]});return c(t)?null:t.value.stdout.trim()||null},IE=e=>`+refs/heads/${e}:refs/heads/${e}`,AE=async(e,t)=>{let n=await wE(e);if(t==="all"){let s="+refs/heads/*:refs/heads/*";if(n===s)return d("Tracking",null);let i=await Ce({cwd:e,args:["config","remote.origin.fetch",s]});return c(i)?a(i.message):d("Tracking",null)}let r=await Gc(e),o=await uf(e)??r;return o?r===o&&n===IE(o)?d("Tracking",null):mf(e,o):a("Could not tell which branch is the default")},Yp=async(e,t,n,r)=>{let o=xr();if(cn(e)>o*1024*1024)return a(go(o));let s=hE(e),i=await AE(e,t.branches);if(c(i))return a(i.message);let l=n===null?ff(e)?["--unshallow"]:[]:r?.since&&n<r.since?[af(n)]:[],u=["fetch","--prune","--no-tags",...l,"origin"],m=await Po(e,u,e,{undo:s});if(c(m)&&t.branches==="default"&&/couldn't find remote ref/i.test(m.message)){let g=await mf(e);if(c(g))return a(g.message);m=await Po(e,u,e,{undo:s})}let p=n!==null&&l.length>0,f=c(m)&&p;if(f){let g=m;if(m=await Po(e,["fetch","--prune","--no-tags","origin"],e,{undo:s}),!c(m)&&await cf(e,n))return a(g.message)}if(c(m))return a(m.message);if(p&&!f){let g=await lf(e,s);if(c(g))return a(g.message)}return t.branches==="default"&&await EE(e),await NE(e),d("Fetched",null)},_c=async e=>{if(!D.existsSync(e))return"";let t=await Ce({cwd:e,args:["for-each-ref","--format=%(objectname) %(refname)"]}),n=ff(e)?D.readFileSync(J.join(e,"shallow"),"utf8"):"";return`${c(t)?"":t.value.stdout}
44
+ ${n}`},Kn=new Map,Xp=(e,t)=>{let n=Kn.get(e);return Kn.set(e,t),n!==void 0&&n!==t},TE=async(e,t)=>{let n=await Ce({cwd:e,args:["config","--get","remote.origin.url"]});return c(n)?"unknown":nn(n.value.stdout.trim())===t.id?"this":"other"},gf=e=>{let t=J.join(e,".gitignore");try{if(D.lstatSync(t,{throwIfNoEntry:!1}))return;D.writeFileSync(t,`*
45
+ `,{flag:"wx"})}catch(n){K.info(`[repos] could not write ${t}: ${ct(n)}`)}},si=e=>{try{return D.lstatSync(e).isSymbolicLink()}catch{return!1}},ct=e=>e instanceof Error?e.message:String(e),Wc=".lock",zc=oi*4,hf=async(e,t,n)=>{let r=Date.now()+n;for(;;){let o=Ao({lockPath:`${e}${Wc}`,operation:t,staleAfterMs:zc,checkProcess:!0});if(o.acquired||Date.now()>=r)return o;await new Promise(s=>setTimeout(s,250))}},Oo=e=>{let t=`${e}.${Do()}.deleting`;try{D.renameSync(e,t)}catch(n){if(n.code!=="ENOENT")throw n}D.rmSync(t,{recursive:!0,force:!0}),D.rmSync(Sr(e),{force:!0}),D.rmSync(Bt(e),{force:!0}),Kn.delete(e)},yf=5e3,ME=async e=>{let t=await Ce({cwd:e,args:["config","--get","remote.origin.url"]});if(c(t)||!t.value.stdout.trim())return!1;let n=Lo(J.join(e,"shallow"));return n&&!/^(?:[0-9a-f]{40}(?:[0-9a-f]{24})?\n)*$/.test(n.toString("utf8"))?!1:await of(e)?!c(await Ce({cwd:e,args:["rev-list","--max-count=1","--branches"]})):!0},Jp=[0,6e4,10*6e4,60*6e4],bf=e=>{if(!e?.restartTriedAt||Date.now()<e.restartTriedAt)return!0;let t=Jp[Math.min(e.restarts,Jp.length-1)];return Date.now()-e.restartTriedAt>=t},kE=360*60*1e3,LE=e=>{let t=e?.restartTriedAt??e?.restartedAt;return bf(e)&&(!t||Date.now()<t||Date.now()-t>=kE)},PE=6e4,OE=async(e,t,n)=>{let r=xr();return cn(e)>r*1024*1024?"past the cap":n.endsWith(go(r))?null:await vf(e,t)?"remote answers":null},vf=async(e,t)=>!c(await Ce({cwd:J.dirname(e),args:["ls-remote","--",t.url,"HEAD"],timeoutMs:PE})),DE=async(e,t,n,r,o)=>{let s=(p,f,g=!1)=>({id:r.id,label:r.label,ok:p,changed:g,message:f}),i=_t(t,r.id),l=mn(r.since,n);try{D.mkdirSync(J.dirname(i),{recursive:!0}),gf(J.dirname(i))}catch(p){return s(!1,ct(p))}let u=Bc(i);if(u?.attemptedAt&&(u.error!==null||u.branches===r.branches&&u.since===l)&&Date.now()>=u.attemptedAt&&Date.now()-u.attemptedAt<o&&!D.existsSync(Bt(i))){let p=D.existsSync(i)&&Xp(i,await _c(i));return u.error?s(!1,u.error,p):s(!0,"Fetched recently",p)}if(si(i))return s(!1,"The clone path is a link, which epiq will not use");let m=await hf(i,`fetch ${r.label}`,o===0?yf:0);if(!m.acquired)return{...s(!0,"Being fetched by another process"),skipped:!0};try{let p=D.existsSync(Bt(i));p&&Oo(i);let f=D.existsSync(i);f&&await TE(i,r)==="other"&&(Oo(i),f=!1);let g=f?Bc(i):null;if(f&&!Kn.has(i)&&Kn.set(i,await _c(i)),f&&(pf(i),tf(i)),!f&&p&&!Sp(e,r.id))return s(!0,"Removed before it was cloned");let w=f&&!await ME(i)&&bf(g),x=w&&await vf(i,r),E=f?w?a(x?"Its clone will not open":"Its clone will not open, and its remote does not answer"):await Yp(i,r,l,g):await qp(i,r,l);if(f&&!x&&c(E)&&LE(g)){let L=await OE(i,r,E.message);L==="remote answers"&&(E=await Yp(i,r,l,g)),x=L!==null&&c(E)}x&&(K.info(`[repos] ${r.label}: starting its clone over`),E=await qp(i,r,l,{replace:!0}),Kn.delete(i));let N=x&&!(c(E)&&mu()),S=c(E)?nf(E.message):"Fetched",k=c(E)?g?.stateBranch??null:await rf(i);return Qp(i,{fetchedAt:c(E)?g?.fetchedAt??null:Date.now(),attemptedAt:Date.now(),error:c(E)?S:null,branches:c(E)?g?.branches??r.branches:r.branches,since:c(E)?g?.since??l:l,stateBranch:k,restartedAt:x&&!c(E)?Date.now():g?.restartedAt??null,restartTriedAt:N?Date.now():g?.restartTriedAt??null,restarts:N?(g?.restarts??0)+1:c(E)?g?.restarts??0:0,bytes:c(E)?g?.bytes??null:cn(i)}),c(E)?(K.info(`[repos] ${r.label}: ${E.message}`),s(!1,S)):s(!0,S,Xp(i,await _c(i))||!f||x)}catch(p){return K.info(`[repos] ${r.label}: ${ct(p)}`),s(!1,ct(p))}finally{try{D.existsSync(Bt(i))&&Oo(i)}catch(p){K.info(`[repos] ${r.label}: could not delete the clone: ${ct(p)}`)}m.release(),xf(i)}},xf=e=>{if(!D.existsSync(Bt(e)))return;let t=Ao({lockPath:`${e}${Wc}`,operation:"remove",staleAfterMs:zc,checkProcess:!0});if(t.acquired)try{D.existsSync(Bt(e))&&Oo(e)}catch(n){K.info(`[repos] could not delete a clone: ${ct(n)}`)}finally{t.release()}},FE=e=>{let t=Ac(e);if(D.existsSync(t))for(let n of D.readdirSync(t)){let r=/^.+\.git(?:\.json)?\.(\d+)(?:-(\d+))?(?:\.[0-9a-f-]{36})?\.(?:pending|tmp)$/.exec(n);if(r&&!$E(Number(r[1]),r[2]===void 0?null:Number(r[2]))||/\.git\.[0-9a-f-]{36}\.deleting$/.test(n))try{D.rmSync(J.join(t,n),{recursive:!0,force:!0})}catch(o){K.info(`[repos] could not sweep ${n}: ${ct(o)}`)}}},Rf=async(e,t)=>{let n=qt(e);if(c(n))return a(n.message);let r=_t(n.value.projectId,t.id),o=`${r}.${Uc()}.${Do()}.pending`;try{D.mkdirSync(J.dirname(r),{recursive:!0}),gf(J.dirname(r));let s=await df(o,t,mn(t.since,n.value.createdAt));return c(s)?a(nf(s.message)):d("Staged",{stagePath:o,bytes:cn(o)})}catch(s){return $t(o),a(ct(s))}},$t=e=>{try{D.rmSync(e,{recursive:!0,force:!0})}catch(t){K.info(`[repos] could not clear a stage: ${ct(t)}`)}},Ef=async(e,t,n)=>{let r=qt(e);if(c(r))return $t(n);let{projectId:o,createdAt:s}=r.value,i=_t(o,t.id),l=await hf(i,`connect ${t.label}`,yf);if(!l.acquired)return $t(n);try{if(D.rmSync(Bt(i),{force:!0}),D.existsSync(i)||si(i))return $t(n);D.renameSync(n,i),Qp(i,{fetchedAt:Date.now(),attemptedAt:Date.now(),error:null,branches:t.branches,since:mn(t.since,s),stateBranch:await rf(i),restartedAt:null,restartTriedAt:null,restarts:0,bytes:cn(i)}),fn()}catch(u){K.info(`[repos] could not place ${t.label}: ${ct(u)}`),$t(n)}finally{l.release()}},Vc=e=>{let t=Ic(e.repoRoot,e.repo);if(c(t))return t;let n=wo({repoRoot:e.repoRoot,actorId:e.actorId,event:{action:"disconnect.repo",payload:{repo:t.value.id}}});if(c(n))return a(n.message);let r=Kc({repoRoot:e.repoRoot,repoId:t.value.id});fn();let o=qt(e.repoRoot);!c(r)&&!c(o)&&Sf(o.value.projectId,t.value.id);let s=`Disconnected ${t.value.label}`;return c(r)?d(`${s}, but its clone stays: ${r.message}`,t.value):d(s,t.value)},Kc=e=>{let t=qt(e.repoRoot);if(c(t))return a(t.message);if(!Cp.test(`${e.repoId}.git`))return a("Not a clone epiq made");let n=_t(t.value.projectId,e.repoId);try{D.mkdirSync(J.dirname(n),{recursive:!0})}catch(o){return a(`Could not remove the clone: ${ct(o)}`)}let r=Ao({lockPath:`${n}${Wc}`,operation:"remove",staleAfterMs:zc,checkProcess:!0});try{return r.acquired?(Oo(n),Vp(n),d("Removed clone",null)):(Vp(n),xf(n),d("Removed once its fetch ends",null))}catch(o){return a(`Could not remove the clone: ${String(o)}`)}finally{r.acquired&&r.release()}},Sf=(e,t)=>{let n=_t(e,t);D.existsSync(n)||D.rmSync(Bt(n),{force:!0})},_E=(e,t,n)=>{for(let r of n){if(!D.existsSync(_t(t,r)))continue;let o=Kc({repoRoot:e,repoId:r});if(c(o)){K.info(`[repos] could not clear ${r}: ${o.message}`);continue}fn(),Sf(t,r)}},$E=(e,t)=>BE(e)&&(t===null||!Dp(e,t)),BE=e=>{try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}},Zp=4,ii=e=>{let t=e.minIntervalMs??0,n=$c.get(e.repoRoot);if(n)return n.minIntervalMs<=t?n.result:n.result.then(()=>ii(e));let r=UE(e.repoRoot,t).catch(o=>a(ct(o))).finally(()=>{$c.delete(e.repoRoot)});return $c.set(e.repoRoot,{result:r,minIntervalMs:t}),r},$c=new Map,UE=async(e,t)=>{let n=qt(e);if(c(n))return a(n.message);let r=at(e);if(c(r))return a(r.message);let{projectId:o,createdAt:s}=n.value,i=r.value.live;try{FE(o)}catch(u){K.info(`[repos] sweep failed: ${String(u)}`)}if(_E(e,o,r.value.disconnected),i.length===0)return d("No other repos",[]);let l=[];for(let u=0;u<i.length;u+=Zp)l.push(...await Promise.all(i.slice(u,u+Zp).map(m=>DE(e,o,s,m,t))));return l.some(u=>u.changed)&&fn(),d("Fetched other repos",l)},qc=e=>{let t=e.filter(o=>!o.ok),n=e.filter(o=>o.skipped),r=[t.length>0&&`could not fetch ${t.map(o=>`${o.label} (${o.message.slice(0,80)})`).join(", ")}`,n.length>0&&`another process is fetching ${n.map(o=>o.label).join(", ")}`].filter(Boolean);return r.length>0?r.join("; "):null};var Xc=900*1e3,Nr=new Map,Cf=0,Jc=new Map,Nf=e=>{let t=(Jc.get(e)??0)+1;return Jc.set(e,t),t},jE=(e,t)=>JSON.stringify([e,t.id,t.branches,t.since]),Zc=e=>{let t=Nr.get(e);t&&(clearTimeout(t.timer),Nr.delete(e),$t(t.stagePath))},HE=e=>{Nf(e),Zc(e)},wf=e=>{if(e.startsWith("file:"))return"this machine";let t=/^[^@/]+@([^:/]+):/.exec(e);if(t?.[1])return t[1];try{return new URL(e).host||e}catch{return e}},Yc=async(e,t)=>{let n=await _({cwd:e,args:t,forClone:!0,keepPartial:!0});return c(n)?null:n.value.stdout},GE=async(e,t,n)=>{let r=(await Yc(e,["symbolic-ref","--short","HEAD"]))?.trim().replace(/^refs\/heads\//,""),o=await Yc(e,["log","-1","--format=%s%x00%an%x00%cI","HEAD"]),[s,i,l]=(o??"").trim().split("\0"),m=(await Yc(e,["log","--branches","--max-count=100000",...t?[`--since=@${Math.floor(Date.parse(`${t}T00:00:00Z`)/1e3)}`]:[],"--format=%x1e%s%x1f%b"])??"").split("").filter(Boolean).map(p=>{let[f="",g=""]=p.split("");return{subject:f.trim(),refs:Oc(g)}});return{defaultBranch:r||null,latest:s!==void 0&&s!==""&&i&&l?{subject:s,author:i,date:l}:null,commits:m.length,ticketCommits:m.filter(p=>wp(p,n).length>0).length}},WE=()=>{if(!gt())return{knownRefs:new Set,contributors:0};let e=h();return{knownRefs:new Set(Object.values(e.nodes).filter(t=>j(t)).map(t=>it(t.id))),contributors:Object.values(e.contributors).filter(t=>!t.tombstoned).length}},If=e=>{let t=jc(e);return c(t)?0:t.value.reduce((n,r)=>n+(r.bytes??0),0)},Qc=async e=>{let t=Cc(e);if(c(t))return a(t.message);let n=t.value;if(n.kind!=="connect"&&e.mode==="preview")return a(`${n.repo.label} is already connected`);if(n.kind==="unchanged")return d(Sc,{kind:"unchanged",repo:n.repo});if(n.kind==="edit"){let x=wo({repoRoot:e.repoRoot,actorId:e.actorId,event:{action:"edit.repo",payload:n.event}});return c(x)?a(x.message):(n.message.startsWith(Ys)||fn(),d(n.message,{kind:"updated",repo:n.repo}))}let r=jE(e.repoRoot,n.repo),o=Nr.get(n.repo.id);if(e.mode==="confirm"&&o?.key!==r)return a("Nothing is staged for this connect here, or it was staged with other options: preview it again");if(e.mode==="confirm"&&o){clearTimeout(o.timer),Nr.delete(n.repo.id);let x=wo({repoRoot:e.repoRoot,actorId:e.actorId,event:{action:"connect.repo",payload:n.event}});if(c(x))return $t(o.stagePath),a(x.message);await Ef(e.repoRoot,n.repo,o.stagePath);let E=at(e.repoRoot),N=!c(E)&&E.value.overLimit.some(S=>S.id===n.repo.id);return d(N?`Connected ${n.repo.label}, but the board already reads ${An} repos: it is not fetched until one ahead of it is disconnected`:`Connected ${n.repo.label}`,{kind:"connected",repo:n.repo})}for(let x of[...Nr.keys()])Zc(x);let s=Nf(n.repo.id),i=++Cf,l=()=>Jc.get(n.repo.id)!==s||Cf!==i,u=qt(e.repoRoot);if(c(u))return a(u.message);let m=await Rf(e.repoRoot,n.repo);if(c(m))return a(`Could not clone it: ${m.message}`);if(l())return $t(m.value.stagePath),a("Cancelled");let p=WE(),f=await GE(m.value.stagePath,mn(n.repo.since,u.value.createdAt),p.knownRefs),g=at(e.repoRoot),v={repo:n.repo,host:wf(n.repo.url),...f,bytes:m.value.bytes,contributors:p.contributors,claimedBytes:If(e.repoRoot),overLimit:!c(g)&&g.value.live.length>=An,expiresAt:Date.now()+Xc};if(l())return $t(m.value.stagePath),a("Cancelled");let w=setTimeout(()=>Zc(n.repo.id),Xc);return w.unref(),Nr.set(n.repo.id,{stagePath:m.value.stagePath,key:r,preview:v,timer:w}),d("Preview: nothing is connected until you confirm",{kind:"preview",preview:v})};import zE from"node:path";var VE=async e=>{let t=await Se({cwd:e,args:["config","--get","remote.origin.url"]}),n=t.exitCode===0&&t.stdout.trim()||null;return{label:n?Pt(n):zE.basename(e),url:n,path:e}};import{randomBytes as KE}from"node:crypto";import qE from"node:fs";import YE from"node:path";var kf=e=>e.replace(/\r\n?/g,`
46
+ `).replace(/[\x00-\x08\x0B-\x1F\x7F\u0080-\u009f\u202a-\u202e\u2066-\u2069]/g,"").trim(),XE=async(e,t)=>{let n=await _({cwd:e,args:["log","-1","--no-show-signature","--format=%b",t,"--"]});return c(n)?"":kf(n.value.stdout)},JE=async(e,t)=>{if(c(t)||t.value.length===0)return t;let n=await Vn(e);if(c(n))return t;let r=KE(8).toString("hex"),o=`${r}`,s=`${r}`,i=new Map,l=async(m,p)=>{let f=await _({cwd:m,args:["cat-file","--batch-check=%(objectname) %(objecttype)"],input:`${p.join(`
47
+ `)}
48
+ `});return c(f)?[]:f.value.stdout.split(`
49
+ `).filter(g=>g.endsWith(" commit")).map(g=>g.slice(0,g.indexOf(" ")))},u=async(m,p)=>{let f=await _({cwd:m,args:["log","--no-walk=unsorted","--no-show-signature","--stdin",`--format=${o}%H${s}%b`,"--"],input:`${p.join(`
50
+ `)}
51
+ `});if(!c(f))for(let g of f.value.stdout.split(o)){let v=g.indexOf(s);if(v===-1)continue;let w=kf(g.slice(v+s.length));w&&i.set(g.slice(0,v).trim(),w)}};for(let m of n.value){let p=t.value.filter(g=>g.repo===m.repo).map(g=>g.sha).filter(Un);if(p.length===0)continue;let f=await l(m.cwd,p);f.length>0&&await u(m.cwd,f)}return d(t.message,t.value.map(m=>{let p=i.get(m.sha);return p?{...m,body:p}:m}))},ZE=8*1024*1024,nl=async e=>{if(!Un(e.sha))return a("Invalid commit sha");let t=await Mo(e);if(c(t))return a(t.message);let n=await _({cwd:t.value,maxOutput:ZE,args:["show","--no-ext-diff","--no-color","--patch","--find-renames","--format=",e.sha]});return c(n)?a(bs(n.message)?"This commit is too large to show here; open it in your editor":n.message):d("Read commit patch",n.value.stdout)},QE=200,Af=e=>/^0+$/.test(e),ai=/^:\d{6} \d{6} ([0-9a-f]{40}) ([0-9a-f]{40}) [A-Z]\d*\t(.+)$/,Tf=/^(\d+|-)\t(\d+|-)\t(.+)$/,el=async(e,t,n,r)=>{let o=await _({cwd:e,args:["diff","--raw","--numstat","--no-renames","--abbrev=40",t,n,...r&&r.length>0?["--",...r]:[]]});if(c(o))return K.info(`[commits] diff ${t} ${n}: ${o.message}`),a(Pf);let s=o.value.stdout.split(`
52
+ `).filter(m=>m!==""),i=s.filter(m=>!ai.test(m)&&!Tf.test(m));if(i.length>0)return a(`Could not parse ${i.length} line(s) of "git diff --raw --numstat" output, e.g. "${i[0]}"`);let l=new Map;for(let m of s){let p=Tf.exec(m);p&&l.set(p[3]??"",{insertions:p[1]==="-"?0:Number(p[1]),deletions:p[2]==="-"?0:Number(p[2]),isBinary:p[1]==="-"&&p[2]==="-"})}let u=s.filter(m=>ai.test(m)).map(m=>{let p=ai.exec(m),f=p?.[1]??"",g=p?.[2]??"",v=p?.[3]??"";return{path:v,beforeBlob:Af(f)?null:f,afterBlob:Af(g)?null:g,...l.get(v)??{insertions:0,deletions:0,isBinary:!1}}});return d("Listed changed files with blob hashes",u)},Lf=async(e,t)=>{if(t.length>QE)return a(`${t.length} files changed \u2014 too many to show as a diff`);let n=t.flatMap(i=>i.isBinary?[]:[i.beforeBlob,i.afterBlob].filter(l=>l!==null)),r=await hu(n,e);if(c(r))return a(r.message);let o=r.value,s=i=>i!==null&&!o.has(i);return d("Read changed file contents",t.map(i=>{let l=i.isBinary||s(i.beforeBlob)||s(i.afterBlob);return{path:i.path,before:l||!i.beforeBlob?"":o.get(i.beforeBlob)??"",after:l||!i.afterBlob?"":o.get(i.afterBlob)??"",insertions:i.insertions,deletions:i.deletions,isBinary:l}}))},eS=async e=>{if(!Un(e.sha))return a("Invalid commit sha");let t=await Mo(e);if(c(t))return a(t.message);let n=t.value,r=XE(n,e.sha),o=await el(n,`${e.sha}~1`,e.sha);if(c(o)&&o.message===Pf){let u=await Of(n,e.sha);if(c(u))return a(u.message);u.value===tl&&(o=await el(n,tl,e.sha))}if(c(o))return a(o.message);if(o.value.length===0)return a("No changed files found for this commit");let s=await Lf(n,o.value);if(c(s))return a(s.message);let i=s.value,l=await r;return d("Loaded commit diff",{sha:e.sha,...e.repo?{repo:e.repo}:{},files:i,...l?{body:l}:{}})},tS=/^[0-9a-f]{40}$/,nS=async(e,t,n)=>{let r=await _({cwd:e,args:["log","--raw","--no-renames","--abbrev=40","--format=%H",`${t}..${n}`]});if(c(r))return a(r.message);let o=new Map,s=null;for(let i of r.value.stdout.split(`
53
+ `)){if(tS.test(i)){s=new Set,o.set(i,s);continue}let l=ai.exec(i);l&&s&&s.add(l[3]??"")}return d("Listed changed paths per commit",o)},Mf=e=>{let t=new Set;for(let n of e)for(let r of n)t.add(r);return t},rS=async(e,t,n)=>{if(t===n)return!0;let r=await _({cwd:e,args:["merge-base","--is-ancestor",t,n]});return!c(r)},tl="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Pf="Could not read this commit's diff",oS="Its parent is outside the fetched history. Widen since to see this diff.",sS=async(e,t)=>{let n=await _({cwd:e,args:["rev-parse","--git-path","shallow"]});if(c(n))return!1;try{return qE.readFileSync(YE.resolve(e,n.value.stdout.trim()),"utf8").split(`
54
+ `).some(r=>r!==""&&r.startsWith(t))}catch{return!1}},Of=async(e,t)=>{let n=await _({cwd:e,args:["rev-parse","--verify","--quiet",`${t}^1`]});return c(n)?await sS(e,t)?a(oS):d("A root commit",tl):d("Parent",`${t}~1`)},iS=async e=>{let t=At(e.repoRoot);if(c(t))return a(t.message);let n=t.value,r=await Dc({repoRoot:n,ref:e.ref,end:e.end});if(c(r))return a(r.message);let o=new Set(r.value.flat().map(g=>g.sha)),s=await Vn(n);if(c(s))return a(s.message);let i=kc(s.value),l=new Map;for(let g of ko(r.value))g.length>0&&l.set(g[0].repo??"",g);let u=[],m=0;for(let[g,v]of l){let w=i(g);if(!w){m+=1;continue}let x=await aS(w,e.ref,v,o);if(c(x)){if(!g)return a(x.message);K.info(`[repos] could not squash ${g}: ${x.message}`),m+=1;continue}let E=g||void 0;u.push({repo:E,diff:{...x.value,files:x.value.files.map(N=>E?{...N,repo:E}:N),overlappingPaths:x.value.overlappingPaths.map(N=>E?`${E}:${N}`:N)}})}let[p,...f]=u;return p?f.length===0?d("Loaded squashed diff",p.diff):d("Loaded squashed diff",{...p.diff,commits:u.reduce((g,v)=>g+v.diff.commits,0),files:u.flatMap(g=>g.diff.files),contiguous:u.every(g=>g.diff.contiguous),overlappingPaths:u.flatMap(g=>g.diff.overlappingPaths),parts:u.map(({repo:g,diff:v})=>({...g?{repo:g}:{},from:v.from,to:v.to,commits:v.commits,contiguous:v.contiguous}))}):a(m>0?"The clone holding this ticket\u2019s commits could not be read":"No commits reference this ticket")},aS=async(e,t,n,r=new Set)=>{let o=n[0].sha,s=o;for(let M=n.length-1;M>0;M--){let P=n[M].sha;if(await rS(e,P,o)){s=P;break}}let i=await Of(e,s);if(c(i))return a(i.message);let l=i.value,u=await nS(e,l,o);if(c(u))return a(u.message);let m=u.value,p=new Set(n.map(M=>M.sha)),f=new Set([...p,...r]),g=[...m.keys()].filter(M=>p.has(M)),v=[...m.keys()].filter(M=>f.has(M)),w=v.length===m.size,x=v.length>g.length,E=new Map;for(let M of g)for(let P of m.get(M)??[])E.has(P)||E.set(P,M);let N=(M,P)=>d("Loaded squashed diff",{ref:t.trim().toUpperCase(),from:l,to:o,commits:g.length,files:M.map($=>({...$,sha:E.get($.path)??o})),contiguous:w,overlappingPaths:P}),S,k=[];if(!w||x){let M=Mf(g.map($=>m.get($)??new Set)),P=Mf([...m.entries()].filter(([$])=>!f.has($)).map(([,$])=>$));if(M.size===0)return N([],[]);S=[...M],k=[...M].filter($=>P.has($)).sort()}let L=await el(e,l,o,S);if(c(L))return a(L.message);let B=await Lf(e,L.value);return c(B)?a(B.message):N(B.value,k)};var Ff=/<!--\s*epiq-diff-comment:(.+?)-->\n?/,rl=e=>e.replace(Ff,""),cS=e=>`<!-- epiq-diff-comment:${JSON.stringify(e).replaceAll(">","\\u003e")} -->`,Df=e=>e==="additions"||e==="deletions",Fo=e=>{let t=Ff.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"||!Df(r.side)||!Df(r.endSide)||r.sha!==void 0&&typeof r.sha!="string"||r.issueRef!==void 0&&typeof r.issueRef!="string"?null:r};var _f=/```\n([\s\S]*?)\n?```\s*$/,$f=e=>_f.exec(e)?.[1]??null,lS=/`[^`\n]+`[^\n]*\n?$/,Bf=e=>rl(e).replace(_f,"").replace(lS,"").trim(),Uf=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})`},ol=e=>`${e.issueRef?`${e.issueRef} \xB7 `:""}${e.filePath} ${Uf(e)}`;var dS=e=>{let t=e.split(`
55
+ `),n=t.filter(r=>r.trim()!=="").reduce((r,o)=>{let s=/^[ \t]*/.exec(o)?.[0].length??0;return r===null?s:Math.min(r,s)},null);return n?t.map(r=>r.slice(n)).join(`
56
+ `):e},jf=({snippet:e,...t})=>{let n=t.note.trim();return[...n?[n,""]:[],cS({...t,note:n}),`\`${t.filePath}\` ${Uf(t)}`,"```",dS(e),"```"].join(`
57
+ `)};var uS=/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@(.*)$/,ci=e=>{if(!e.startsWith('"')||!e.endsWith('"'))return e;let t=e.slice(1,-1),n="";for(let r=0;r<t.length;r++){if(t[r]!=="\\"){n+=t[r];continue}let o=t[++r];if(o==="n")n+=`
58
+ `;else if(o==="t")n+=" ";else if(o==='"'||o==="\\")n+=o;else if(o&&/[0-7]/.test(o)){let s=t.slice(r,r+3);n+=String.fromCharCode(parseInt(s,8)),r+=2}else o!==void 0&&(n+=o)}try{return decodeURIComponent(escape(n))}catch{return n}},Hf=e=>{let t=ci(e.trim());return t==="/dev/null"?null:t.replace(/^[ab]\//,"")},il=e=>{let t=[],n=null,r=0,o=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(`
59
+ `)){if(i.startsWith("diff --git ")){n=s();let p=i.slice(11),f=p.lastIndexOf(" b/");f!==-1&&(n.path=ci(p.slice(f+1)).replace(/^b\//,""));continue}if(!n){if(!i.trim())continue;n=s()}let l=n,u=l.lines.length===0;if(u&&i.startsWith("--- ")){let p=Hf(i.slice(4));p&&(l.oldPath=p);continue}if(u&&i.startsWith("+++ ")){let p=Hf(i.slice(4));p&&(l.path=p);continue}if(u&&i.startsWith("rename from ")){l.oldPath=ci(i.slice(12));continue}if(u&&i.startsWith("rename to ")){l.path=ci(i.slice(10));continue}if(u&&(i.startsWith("Binary files ")||i.startsWith("GIT binary patch"))){l.binary=!0,l.lines.push({kind:"note",text:"Binary file"});continue}let m=uS.exec(i);if(m){r=Number(m[1]),o=Number(m[3]),l.lines.push({kind:"hunk",text:i});continue}if(!u){if(i.startsWith("\\")){l.lines.push({kind:"note",text:i.slice(1).trim()});continue}if(i.startsWith("+")){l.added++,l.lines.push({kind:"added",text:i.slice(1),newLine:o++});continue}if(i.startsWith("-")){l.removed++,l.lines.push({kind:"removed",text:i.slice(1),oldLine:r++});continue}if(i.startsWith(" ")){l.lines.push({kind:"context",text:i.slice(1),oldLine:r++,newLine:o++});continue}i===""&&l.lines.push({kind:"context",text:"",oldLine:r++,newLine:o++})}}for(let i of t)!i.path&&i.oldPath&&(i.path=i.oldPath);return t.filter(i=>i.path!=="")},sl=e=>e.oldPath&&e.oldPath!==e.path?e.oldPath:null;var al=e=>e.flatMap(t=>[{kind:"file",text:`${sl(t)?`${sl(t)} \u2192 `:""}${t.path}`,file:t},...t.lines]),li=e=>{let t="",n=-1;return e.map(r=>(r.kind==="file"&&(t=r.file.path),r.kind==="hunk"&&n++,{file:t,hunk:n}))},cl=(e,t,n)=>{let r=t.map(i=>Fo(i.md)).filter(i=>i!==null&&i.sha===n&&i.side==="additions");if(r.length===0)return new Set;let o=li(e),s=new Set;return e.forEach((i,l)=>{let u=i.newLine;if(u===void 0)return;let m=o[l]?.file;r.some(p=>p.filePath===m&&p.start<=u&&u<=p.end)&&s.add(l)}),s},Gf=(e,t)=>e===t?`line:${e}`:`lines:${e}-${t}`,mS=/^lines?:(\d+)(?:-(\d+))?(?:\s+|$)/,Wf=e=>{let t=mS.exec(e);if(!t)return null;let n=Number(t[1]),r=t[2]===void 0?n:Number(t[2]);return{start:Math.min(n,r),end:Math.max(n,r),note:e.slice(t[0].length)}},zf=(e,t)=>li(e)[t]?.file??null,Vf=(e,t,n,r)=>{let o=li(e),s=u=>e.findIndex((m,p)=>o[p]?.file===t&&(m.kind==="added"||m.kind==="context")&&m.newLine===u),i=s(n),l=s(r);return i===-1||l===-1?{ok:!1,reason:`${t} has no line ${i===-1?n:r} on the new side`}:ll(e,i,l)},ll=(e,t,n)=>{let[r,o]=t<=n?[t,n]:[n,t],s=e[r],i=e[o];if(!s||!i)return{ok:!1,reason:"That line is not in the diff"};let l=g=>(g.kind==="added"||g.kind==="context")&&g.newLine!==void 0;if(!l(s)||!l(i))return{ok:!1,reason:"Comments anchor to the new side: pick an added or unchanged line"};let u=li(e),m=u[r],p=u[o];if(m.file!==p.file)return{ok:!1,reason:"A comment covers one file at a time"};if(m.hunk!==p.hunk)return{ok:!1,reason:"A comment covers one hunk at a time"};let f=e.slice(r,o+1).filter(l);return{ok:!0,value:{filePath:m.file,start:f[0].newLine,end:f[f.length-1].newLine,snippet:f.map(g=>g.text).join(`
60
+ `)}}};import{existsSync as fl}from"node:fs";import{chmod as gl}from"node:fs/promises";import ui from"node:path";import{spawn as pS,spawnSync as fS}from"node:child_process";import gS from"node:os";import Kf from"node:path";import{ulid as hS}from"ulid";function dl(e){let t=[],n="",r=!1,o=null;for(let s of e.trim()){if(o){s===o?o=null:n+=s;continue}if(s==='"'||s==="'"){o=s,r=!0;continue}if(/\s/.test(s)){r&&t.push(n),n="",r=!1;continue}n+=s,r=!0}return r&&t.push(n),t}function yS(e){let t=e.trim();return t==="$EDITOR"?process.env.EDITOR:t==="$VISUAL"?process.env.VISUAL:t}function di(){let{preferredEditor:e}=ne(),t=[e?yS(e):void 0,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function ul(e){let[t=""]=dl(e);return/(^|\/)code(-insiders)?$/.test(t)}function qf(e,t){let[n="",...r]=dl(e);return{command:n,args:[...r,...t]}}function Yf(e,t){return qf(e,ul(e)?["--wait",t]:[t])}function bS(e,t,n,r="new"){return qf(e,[r==="new"?"--new-window":"--reuse-window","--diff",t,n])}function ml(e){let t=Kf.join(gS.tmpdir(),"epiq");Oe.mkDir(t);let n=Kf.join(t,hS());Oe.writeToFile(n,e??"");let r=di();for(let o of r){let{command:s,args:i}=Yf(o,n);if(!s)continue;let l=fS(s,i,{stdio:"inherit"});if(!l.error&&l.status===0){let u=Oe.readFile(n);if(u==null)return a("Unable to read edited file");let m=u.replace(/\r?\n$/,"");return d("Successfully edited",m)}}return a("Unable to open editor")}var vS=new Set(["vim","vi","nvim","nano","pico","ed"]);function xS(e){let[t=""]=dl(e),n=t.split("/").pop()??t;return vS.has(n)}var RS=600;function Xf({command:e,args:t},n){return new Promise(r=>{if(!e){r(a(`"${n}" is not a usable editor command`));return}let o=pS(e,t,{stdio:"ignore",detached:!0}),s=!1,i=u=>{s||(s=!0,clearTimeout(l),r(u))};o.on("error",u=>i(a(u.message))),o.on("exit",u=>{i(u===0?d("Opened editor",!0):a(`"${n}" exited with code ${u}`))});let l=setTimeout(()=>{o.unref(),i(d("Opened editor",!0))},RS)})}function ES(e,t){return xS(e)?Promise.resolve(a(`"${e}" is a terminal editor and can't open from the GUI (no terminal attached). Set preferredEditor to a GUI editor (e.g. "code"), or open the file yourself: ${t}`)):Xf(Yf(e,t),e)}function pl(e,t,n,r="new"){return Xf(bS(e,t,n,r),e)}async function Jf(e){let t=di();if(t.length===0)return a("No editor configured (preferredEditor, VISUAL, or EDITOR)");let n=a("Unable to open editor");for(let r of t){let o=await ES(r,e);if(!c(o))return o;n=o,logger.error(`Failed to open editor "${r}" for ${e}: ${o.message}`)}return n}import{chmodSync as SS,existsSync as CS,lstatSync as NS,mkdirSync as wS}from"node:fs";import IS from"node:os";import AS from"node:path";var _o=(...e)=>{let t=AS.join(IS.tmpdir(),"epiq",...e);try{return CS(t)&&NS(t).isSymbolicLink()?a(`Refusing to write through a symlink at ${t}`):(wS(t,{recursive:!0,mode:448}),SS(t,448),d("Prepared private temp dir",t))}catch(n){return a(`Unable to prepare ${t}: ${n instanceof Error?n.message:String(n)}`)}};var TS=async(e,t)=>{let n=await _({cwd:e,args:["show","--no-ext-diff",t]});if(c(n))return a(n.message);let r=_o("commit-diffs");if(c(r))return a(r.message);let o=ui.join(r.value,`${t}.diff`);return fl(o)||(Oe.writeToFile(o,n.value.stdout),await gl(o,292)),Jf(o)},MS=12,kS=800,Zf=async(e,t,n)=>{let r=await _({cwd:e,args:["show",`${t}:${n}`]});return c(r)?"":r.value.stdout},LS=async(e,t)=>{let n=await _({cwd:e,args:["diff","--name-only",`${t}~1`,t]});if(c(n))return a(n.message);let r=n.value.stdout.split(`
61
+ `).map(o=>o.trim()).filter(Boolean);return r.length===0?a("No changed files found for this commit"):d("Listed changed files",r)},PS=async(e,t,n)=>{let r=await LS(e,t);if(c(r))return a(r.message);let o=r.value;if(o.length>MS)return a(`Commit touches ${o.length} files \u2014 too many for a side-by-side view`);let s=_o("commit-diffs",t);if(c(s))return a(s.message);let i=s.value,l=await Promise.all(o.map(async(g,v)=>{let[w,x]=await Promise.all([Zf(e,`${t}~1`,g),Zf(e,t,g)]),E=ui.basename(g),N=ui.join(i,String(v),"before",E),S=ui.join(i,String(v),"after",E);return fl(N)||(Oe.writeToFile(N,w),await gl(N,292)),fl(S)||(Oe.writeToFile(S,x),await gl(S,292)),{beforePath:N,afterPath:S}})),[u,...m]=l;if(!u)return a("No changed files found for this commit");let p=await pl(n,u.beforePath,u.afterPath,"new");if(c(p)||m.length===0)return p;await new Promise(g=>setTimeout(g,kS));let f=await Promise.all(m.map(({beforePath:g,afterPath:v})=>pl(n,g,v,"reuse")));for(let g of f)c(g)&&logger.error(`Failed to open an additional diff tab for ${t}: ${g.message}`);return p},hl=async e=>{if(!Un(e.sha))return a("Invalid commit sha");let t=await Mo(e);if(c(t))return a(t.message);let n=t.value,r=di()[0];if(r&&ul(r)){let o=await PS(n,e.sha,r);if(!c(o))return o;logger.error(`Side-by-side diff failed for ${e.sha}, falling back to unified diff: ${o.message}`)}return TS(n,e.sha)};var Qf=e=>{if(e<1024)return`${e} B`;let t=["KB","MB","GB","TB"],n=e/1024,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r++;return`${n>=10?Math.round(n):n.toFixed(1)} ${t[r]}`};var yl=["branches=default","branches=all","since=board","since=all","since=YYYY-MM-DD","label=<name>","confirm"],bl=e=>{let[t="",...n]=e.trim().split(/\s+/).filter(Boolean);if(!t)return a("a remote URL to read commits from");if(!tn(t))return a("https://, ssh://, git://, file:/// or user@host:path");let r={url:t},o=new Set;for(let s of n){let i=s.indexOf("="),l=i===-1?s:s.slice(0,i),u=i===-1?"":s.slice(i+1);if(o.has(l))return a(`one ${l}=, not two`);if(o.add(l),s==="confirm")r.confirm=!0;else if(l==="branches"&&(u==="default"||u==="all"))r.branches=u;else if(l==="since"&&Tn(u))r.since=u;else if(l==="label"&&(u===""||Mn(u)))r.label=u;else return a(`${yl.join(", ")}; not "${s}"`)}return d("Parsed",r)},eg=()=>{let e=At();if(c(e))return[];let t=at(e.value);return c(t)?[]:[...t.value.live,...t.value.overLimit]},OS=e=>{let t=e.latest?`latest "${dt(e.latest.subject).slice(0,60)}" by ${dt(e.latest.author).slice(0,40)}`:"no commits",n=e.ticketCommits===0?"none linked, wrong repo?":`${e.ticketCommits} linked`;return[`${e.repo.label} from ${e.host}`,e.defaultBranch?dt(e.defaultBranch).slice(0,60):"no default branch",t,`${e.commits} commits, ${n}`,Qf(e.bytes),e.overLimit?"over the limit: not downloaded until another repo is disconnected":e.contributors>1?`all ${e.contributors} contributors download it on next sync`:"everyone downloads it on next sync"].join(" \xB7 ")},wr=null,DS=e=>`${e.trim()} confirm`,tg=e=>wr&&wr.line===e.trim()?wr.summary:null,ng=async()=>{let e=q().commandMeta.inputString,t=bl(e);if(c(t))return a(`Expected ${t.message}`);let{userId:n}=ne();if(!n)return a("Set a username first with :config username");let r=At();if(c(r))return r;let o=await Qc({repoRoot:r.value,actorId:n,url:t.value.url,branches:t.value.branches,since:t.value.since,label:t.value.label,mode:t.value.confirm?"confirm":"auto"});if(c(o))return a(o.message);if(o.value.kind==="preview"){let s=DS(e);return wr={line:s,summary:OS(o.value.preview)},d(wr.summary,{followUp:`config repoConnect ${s}`})}return t.value.confirm&&(wr=null),d(o.value.kind==="connected"?`${o.message} \u2014 it syncs with the board; :sync fetches it`:o.message,null)},rg=()=>{let{userId:e}=ne();if(!e)return a("Set a username first with :config username");let t=At();if(c(t))return t;let n=Vc({repoRoot:t.value,actorId:e,repo:q().commandMeta.inputString});return c(n)?a(n.message):d(`${n.message} \u2014 it syncs with the board`,null)};var og=e=>e==="board"||e==="goal"?4e3:2e3,sg=e=>e.trim()?e:"";var ig=(e,t,n)=>t.length>n?`${e} cannot exceed ${n} characters (got ${t.length})`:null;import{createHash as FS}from"node:crypto";var _S="0123456789ABCDEFGHJKMNPQRSTVWXYZ",$S=e=>{let t=FS("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+=_S[Number(n>>s&31n)]}return r},ag=new Map,he=(e,t)=>{let n=`${e}:virtual:${t}`,r=ag.get(n);if(r!==void 0)return r;let o=$S(n);return ag.set(n,o),o};import cg from"chalk";var ie=e=>cg.dim(e),me=e=>cg.hex(A.primary)(e),xe=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:s=1})=>{let i=o.trim();if(i.length<s)return"";let p=[...t.filter(Boolean).filter(f=>f.startsWith(i))].sort((f,g)=>ms(f)-ms(g)).slice(0,r).map(f=>ps(f)).join(" ");return p?`${ie(e)}${p}${ie(n)}`:""};var gn={None:"none",Invalid:"invalid",Valid:"valid"};var BS=["BOARD","TICKET","SWIMLANE"],lg=()=>{let e=h().selectedNode;if(!e?.context)return z({message:ie("Missing target context")});if(BS.includes(e.context))return Z();if(e.parentNodeId){let t=h().nodes[e.parentNodeId];if(t?.id===he(t?.parentNodeId??"","comments"))return Z()}return z({message:ie("Command not available in this context")})},se="<ENTER> to confirm",US=()=>{let{userId:e}=ne(),t=pe();return!e||c(t)?[]:cr(t.value.emailLinks,e)},Z=(e="",t=[],n=!0)=>({message:n?ie(e):e,validity:gn.Valid,completionWordList:t}),z=({message:e,completionWordList:t=[]})=>({validity:gn.Invalid,message:e,completionWordList:t}),hn=e=>e.length===0,dg=(e,t)=>{let n=tt(h().breadCrumb,"BOARD");if(c(n))return z({message:me("Command is not applicable in this context")});let r=Cd(n.value.id);return c(r)?z({message:me(`Unable to ${t}: board id is not a valid ULID`)}):pm({date:e,horizonDate:r.value})?null:z({message:me(`nothing to ${t} before ${r.value.toISOString().slice(0,16).replace("T"," ")}`)})},Ir=e=>` ${mg.hex("#000").bgHex(Ue(e))(` ${e} `)} `,vl=({modifier:e})=>{let t="confirm";return e===t?Z(se):z({message:hn(e)?ie("if you are certain, enter ")+ps(t):"",completionWordList:[t]})},jS=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?z({message:ie(n)}):Z():z({message:hn(r)?t:"",completionWordList:[...e]}),ug=e=>({modifier:t,inputString:n})=>{let r=e();return r.includes(t)?hn(n)?Z(se):z({message:me("Takes one rule"),completionWordList:[]}):z({message:hn(t)?ie("rule:")+r.map(Ir).join("")+ie(""):me(`Rules: ${lo.join(", ")}`),completionWordList:[...r]})},qn=({hint:e,onOk:t})=>({modifier:n,inputString:r})=>hn(n)&&hn(r)?z({message:e,completionWordList:[]}):Z(t??se),HS=({modifier:e,inputString:t})=>{let n=Xa();return!hn(e)||!hn(t)?Z(se):z({message:n.length?ie("number from the list, or a path"):ie("path to an epiq project"),completionWordList:n})},GS=({modifier:e,inputString:t})=>{let n=ke(b.CONFIG);if(!n.includes(e))return z({message:xe({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case ee.EDITOR:{let r=[...ym];return t.trim()?r.includes(t.trim())?Z(se):z({message:xe({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):z({message:xe({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case ee.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?Z(se):z({message:xe({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case ee.USERNAME:{let r=ne().gitName,o=r?[r]:[],s=t.trim(),i=o.filter(m=>m.startsWith(s)),u=i.length===1&&i[0]===s?"":xe({prefix:"name: ",wordList:o,inputString:s,minLengthForHints:0});return s?u?Z(`${u} ${ie(se)}`,o,!1):Z(se,o):z({message:u||me("Enter a user name. Saved in ")+mg.bgBlack("~/.epiq-global/config.json"),completionWordList:o})}case ee.EMAILS:{let r=ne().gitEmail,o=fr(),s=o.length>0||!r?o:[r],i=[...s,"none"],l=t.trim(),u=(w,x)=>z({message:xe({prefix:w,wordList:i,noOfHints:3,inputString:x,minLengthForHints:0}),completionWordList:i});if(!l)return Z(`${se} to see your addresses, or name one`,i);let m=l.split(/[,\s]+/).filter(Boolean),p=m[m.length-1]??"",f=w=>w==="none"||s.includes(w.toLowerCase()),g=w=>i.some(x=>x.startsWith(w.toLowerCase())),v=m.filter(w=>!f(w)&&!g(w));return v.length>0?z({message:me(`no address here matches ${v.join(", ")} \u2014 pick one from the list, or its number`),completionWordList:i}):f(p)?Z(se):u("",p)}case ee.EMAILS_UNCLAIM:{let r=US(),o=t.trim();return r.length===0?z({message:me("you have not claimed any addresses"),completionWordList:[]}):o&&r.includes(o.toLowerCase())?Z(se):z({message:xe({prefix:"give an address back ",wordList:r,noOfHints:3,inputString:o,minLengthForHints:0}),completionWordList:r})}case ee.LOG_LEVEL:{let r=["debug","error","info"],o=t.trim();return r.includes(o)?Z(se):z({message:xe({prefix:"one of: ",wordList:[...r],inputString:o,postfix:" persisted in ~/.epiq-global/config.json",minLengthForHints:0}),completionWordList:[...r]})}case ee.AUTOSYNC:{let r=["on","off"],o=ne().autoSync;if(!r.includes(t.trim())){let s=Zu(o);return z({message:xe({prefix:`should auto-sync (recommended)${s!==null?", currently: "+s:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return Z(se)}case ee.ATTACHMENT_MAX_KB:{let r=ne().attachmentMaxKb,o=Number.parseInt(t.trim(),10);if(!t.trim()||Number.isNaN(o)||o<po||o>fo){let s=xe({prefix:" examples: ",wordList:qa,minLengthForHints:0,inputString:t});return z({message:me(`provide a size cap in KB (${po}-${fo}). current: ${r??Bn} KB.`)+s,completionWordList:qa})}return Z(se)}case ee.REPO_CLONE_MAX_MB:{let r=t.trim();if(!/^\d+$/.test(r)||!nc(Number(r))){let o=xe({prefix:" examples: ",wordList:Ya,minLengthForHints:0,inputString:t});return z({message:me(`provide a connected repo's clone cap in MB (${br}-${vr}). current: ${xr()} MB.`)+o,completionWordList:Ya})}return Z(se)}case ee.REPO_CONNECT:{let r=bl(t);if(c(r))return z({message:me(r.message),completionWordList:[]});let o=r.value.confirm?tg(t):null;return r.value.confirm&&!o?z({message:me("preview it first: run the line without confirm"),completionWordList:[]}):Z(`${o??ie(yl.join(" "))} ${se}`,[],!1)}case ee.REPO_DISCONNECT:{let r=eg(),o=wc(r),s=t.trim();return o.length===0?z({message:me("no other repos are connected"),completionWordList:[]}):s&&!c(Js(r,s))?Z(se):z({message:xe({prefix:"stop reading ",wordList:o,noOfHints:3,inputString:s,minLengthForHints:0}),completionWordList:o})}case ee.SYNC_DEBOUNCE_MS:{let r=ne().autoSyncIntervalMs,o=lr(t);if(!t.trim()||o===null){let s=xe({prefix:" examples: ",wordList:Ka,minLengthForHints:0,inputString:t});return z({message:me(`provide a duration between ${3e3}ms and ${864e5}ms. current duration: ${r}ms.`)+s,completionWordList:Ka})}return Z(se)}default:return z({message:me("Unknown config option"),completionWordList:n})}},WS=({modifier:e,inputString:t})=>{let n=ke(b.EDIT);if(!n.length)return z({message:me("Command not available in this context")});if(!n.includes(e)){let r=xe({prefix:"edit... ",wordList:n,inputString:e,minLengthForHints:0});return z({message:r||me("Unknown edit option"),completionWordList:n})}switch(e){case pt.COMMENT:return t.trim()?Z(se):z({message:ie("write a comment...")});case pt.TITLE:return Z(se);case pt.DESCRIPTION:{let{preferredEditor:r}=ne();return r?Z(ie("<ENTER> to edit in ")+r):z({message:"No editor selected"})}default:return z({message:me("Unknown edit option"),completionWordList:n})}},zS=({modifier:e})=>{let t=ke(b.YANK);return t.length?t.includes(e)?Z(se+ie(" and copy to clipboard")):z({message:xe({prefix:"yank... ",wordList:t,inputString:e,minLengthForHints:0}),completionWordList:t}):z({message:me("Nothing selected to copy from")})},VS={[b.EXPORT]:()=>Z(se+ie(", and create export markdown file")),[b.PEEK]:e=>{let t=e.modifier;if(t==="now"||t==="prev"||t==="next")return Z(se);let n={message:ie("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")},r=t||e.inputString.trim(),o=Fn(r);if(!r||!o)return z(n);let s=dg(o,"peek");return s||Z(se)},[b.REPLAY]:e=>{let{dateInput:t,durationInput:n}=Os(e.modifier,e.inputString),r={message:ie("replay forward from: '1h', '2d', '1mo', '2y' or full date as YYYY-MM-DD, with optional duration (e.g. '2y 30s')")},o=Fn(t);if(!t||!o)return z(r);let s=dg(o,"replay");return s||(n&&Ps(n)===null?z({message:me("duration must be positive (e.g. 30s, 2m, or a number of seconds)")}):Z("<ENTER> to replay board history",n?hm:[]))},[b.EXIT]:()=>Z(se+ie(" and exit the application")),[b.INIT]:()=>Z(se),[b.OPEN]:HS,[b.PALETTE]:()=>Z(se),[b.FILTER]:e=>{if(e.modifier==="clear")return Z(se);let t=s=>ke(b.FILTER).includes(s);if(!e.modifier||!t(e.modifier))return z({message:xe({wordList:ke(b.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:ke(b.FILTER)});let n=Object.values(h().tags).map(s=>s.name),r=Object.values(h().contributors).map(s=>s.name),o=e.modifier==="tag"?n:e.modifier==="goal"?Fs():e.modifier==="assignee"?r:[];return e.inputString?o.length&&!o.includes(e.inputString.trim())?z({message:xe({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o}):Z():z({message:xe({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString,minLengthForHints:0}),completionWordList:o})},[b.NONE]:e=>{let t=ke(b.NONE);return z({message:xe({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[b.NEW]:e=>jS({list:ke(b.NEW),hint:xe({wordList:ke(b.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[b.HELP]:()=>Z(se),[b.EDIT]:WS,[b.COMMENT]:e=>{let t=qn({hint:ie(`write a comment (max ${4e3} char)...`),onOk:ie(`(${e.inputString.length}/${4e3})`)})(e);return t.validity===gn.Invalid?t:e.inputString.length>4e3?Z(me("max input exceeded")):t},[b.CONFIG]:GS,[b.YANK]:zS,[b.DELETE]:e=>{let t=lg();return t.validity==="invalid"?t:vl(e)},[b.GOAL]:e=>{let t=Fs().slice(0,10).map(Ir);return qn({hint:t.length?ie("goal:")+t.join("")+ie(""):ie("name a new goal ...")})(e)},[b.UNGOAL]:e=>e.modifier||e.inputString.trim()?z({message:me("Takes no argument"),completionWordList:[]}):Z(se),[b.RULE]:ug(()=>{let e=zt();return e?Is(e):[]}),[b.UNRULE]:ug(()=>{let e=zt();return e?Dn(e):[]}),[b.CLOSE_ISSUE]:e=>vl(e),[b.RE_OPEN_ISSUE]:e=>vl(e),[b.MOVE]:e=>{let t=lg();return t.validity==="invalid"?t:qn({hint:xe({prefix:"hey hacker! These commands are blocked for you... ",wordList:ke(b.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[b.TAG]:e=>{let n=R.getExistingTags().slice(0,10).map(Ir).join("");return qn({hint:n.length?ie("create tag or reuse:")+n+ie(""):ie("create tag ...")})(e)},[b.UNTAG]:e=>{let t=Ns();if(c(t))return z({message:me("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(Ir).slice(0,10);return n.length?qn({hint:ie(" ... ")+n.join("")})(e):z({message:me("Issue has no tags"),completionWordList:[]})},[b.ASSIGN]:e=>{let t=R.getExistingAssignees().map(Ir).slice(0,10);return qn({hint:ie("assignees... ")+t.join("")})(e)},[b.UNASSIGN]:e=>{let t=ws();if(c(t))return z({message:me("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(Ir).slice(0,10);return n.length?qn({hint:ie("remove assignee... ")+n.join("")})(e):z({message:me("Issue has no assignees"),completionWordList:[]})},[b.SYNC]:()=>Z(se)},pg=Object.fromEntries(Object.entries(VS).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var mi=["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 KS=3,qS=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"]),YS=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},XS=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=KS&&!qS.has(t)&&!/^\d+$/.test(t)),JS=e=>{let t=new Map;for(let s of YS(e))for(let i of XS(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=mi.filter(s=>!r.has(s));return[...n,...o]},fg=mi,gg=-1,hg=()=>{let e=pe();if(c(e))return mi;let t=e.value,n=t.eventLog.length;return n!==gg&&(fg=JS(t),gg=n),fg};var yg=e=>Object.values(b).includes(e),bg=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:s}=e,{message:i,validity:l,completionWordList:u}=pg[n].validate(n,r,s),m=n!==b.PEEK&&n!==b.REPLAY,p=o==="command"||o==="modifier"?ke(n):m?hg():[],{mode:f}=h(),g=f===y.COMMAND_LINE?i??"":"",v=[...u,...p];return{validity:l,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:g,autoCompletion:t?qd(e,v,u):{hint:"",hints:[],remainder:"",overlap:0}}};var vg=e=>{let t=e.trimStart(),n=QS(t),r=n[0]??"",o=n[1]??"",s=/\s$/.test(e),i=eC(e),l=yg(r)?r:null,u=l!==null,m=r!=="",p=l?ke(l)??[]:[],f=l&&p.includes(o)?o:"",g="word";n.length===0||n.length===1&&!s?g="command":(n.length===1&&s||n.length===2&&!s)&&(g="modifier");let v=s?"":i,w=ZS(t,l,f);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:i,hasCommand:m,command:l,isCommandKeyword:u,isLastWordCompleted:s,modifier:f,target:g,inputToMatch:v,inputString:w}},ZS=(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},QS=e=>e.trim()?e.trim().split(/\s+/):[],eC=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as tC}from"react";var Ar=e=>e===xl||e===":",xl=" ",Bo=40,Tr={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:gn.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},Rl=new Set,xg=()=>{for(let e of Rl)e()},nC=e=>(Rl.add(e),()=>Rl.delete(e)),ht=e=>{let n=e(Tr),r=vg(n.value),o=n.cursorPosition===n.value.length;Tr={...n,commandMeta:bg(r,o)},xg()},Uo=({message:e,status:t})=>{let n=structuredClone(Tr);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,Tr=n,xg(),d(e,null)},El=e=>{ht(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},Sl=e=>{ht(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&Ar(n[o-1]);)o--;for(;o>0&&!Ar(n[o-1]);)o--}else{for(;o<n.length&&!Ar(n[o]);)o++;for(;o<n.length&&Ar(n[o]);)o++}return{...t,cursorPosition:o}})},Rg=()=>{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}})},Eg=()=>{ht(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&Ar(t[r-1]);)r--;for(;r>0&&!Ar(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},pi=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,l=Math.max(0,Math.min(s.length,i.length));return{...t,value:i,cursorPosition:l,commandIsPending:!1}})},Sg=()=>{ht(e=>({...e,commandIsPending:!0}))},X=e=>{ht(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},Cg=({addToHistory:e=!0,line:t})=>{ht(n=>{let r=t??n.value;return{...n,commandHistory:e&&r.trim()?[r,...n.commandHistory].slice(0,Bo):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}})},Ng=e=>{ht(t=>({...t,commandHistory:e.slice(0,Bo),commandHistoryIndex:-1}))},wg=()=>{ht(e=>e.commandHistoryIndex===-1?e:{...e,commandHistoryIndex:-1})},Ig=()=>{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}})},Ag=()=>{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}})},q=()=>Tr,x_=()=>tC(nC,q,q),fi=()=>{let[e,...t]=Tr.value.split(xl);return t.join(xl).trim()};var C={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"},rC=e=>e.shift===!0,oC={[C.NavPreviousItem]:C.NavPreviousItemJump,[C.NavNextItem]:C.NavNextItemJump,[C.MovePreviousItem]:C.MovePreviousItemJump,[C.MoveNextItem]:C.MoveNextItemJump};function sC(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;default:return null}}function iC(e){switch(e.name){case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function aC(e,t,n){let r=h().contextNode.childNavigationAcrossParents;switch(t){case"up":return e==="vertical"?n.prevItem:r?n.prevContainer:null;case"down":return e==="vertical"?n.nextItem:r?n.nextContainer:null;case"left":return e==="horizontal"?n.prevItem:r?n.prevContainer:null;case"right":return e==="horizontal"?n.nextItem:r?n.nextContainer:null}}function A_(e,t){let n=q();if(e.sequence==="?"&&t!==y.PALETTE)return C.InitCommandPalette;if(e.sequence===":"&&t!==y.COMMAND_LINE)return C.InitCommandLine;if(t===y.MOVE)switch(e.name){case"m":case"return":return C.ConfirmMove}if(t===y.COMMAND_LINE)return Ud(e,n.value);if(t===y.PALETTE)return jd(e,n.value);let r=sC(e)||iC(e);if(r)return cC(r,t,rC(e));if(e.ctrl&&e.name==="c")return C.Exit;switch(e.name){case"r":return C.EditTitle;case"e":return C.EditDescription;case"n":return C.AddItem;case"m":return C.InitMove;case"d":return C.Delete;case"y":return C.Yank;case"o":return C.OpenInEditor;case"s":return C.MarkDiffLine;case"c":return C.CommentOnDiffLine;case"return":return C.Confirm;case"space":return C.Confirm;case"v":return ne().viewMode==="wide"?C.SetViewDense:C.SetViewWide;case"q":case"escape":return C.Exit;default:return null}}function cC(e,t,n=!1){let r=t===y.MOVE?{prevItem:C.MovePreviousItem,nextItem:C.MoveNextItem,prevContainer:C.MoveToPreviousContainer,nextContainer:C.MoveToNextContainer}:{prevItem:C.NavPreviousItem,nextItem:C.NavNextItem,prevContainer:C.NavToPreviousContainer,nextContainer:C.NavToNextContainer},o=aC(h().contextNode.childRenderAxis,e,r);return!o||!n?o:oC[o]??o}import{ulid as uC}from"ulid";var jo=24n,lC=jo*4n,Mt=(1n<<lC)-1n,dC=/^[0-9a-f]+$/;function Tg(e){return!e||!dC.test(e)?a(`Invalid hex rank: ${e}`):d("Converted rank to bigint",BigInt("0x"+e))}function lt(e,t=jo){if(e<0n)return a("Negative rank not allowed");let n=e.toString(16);return d("Converted bigint to hex rank",n.padStart(Number(t),"0"))}function Ge(e,t){if(!e&&!t)return lt(Mt/2n,jo);let n=e?Tg(e):d("Resolved lower bound",0n);if(c(n))return n;let r=t?Tg(t):d("Resolved upper bound",Mt);if(c(r))return r;let o=n.value,s=r.value;if(s<=o)return a("Neighbouring ranks leave no space between them");let i=(o+s)/2n;return i===o||i===s?a("No rank space available between neighbors"):lt(i,jo)}function Mg(e){if(e<=0)return d("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=Mt*BigInt(r+1)/(t+1n),s=lt(o,jo);if(c(s))return s;n.push(s.value)}return d("Resolved evenly spaced ranks",n)}var Cl=(e,t)=>{let n=be(e),r=Mg(n.length);if(c(r))return r;let o={};for(let s=0;s<n.length;s++){let i=n[s],l=r.value[s];if(!i||!l)return a("Unable to assign rebalance rank");o[i.id]=l}return d("Created rebalance event",{id:uC(),action:"rebalance.children",payload:{parent:e,ranks:o},...Q(t)})};var yn=e=>e.trim().toLocaleLowerCase(),Nl=(e,t)=>yn(e).includes(yn(t));var mC=e=>{let{tags:t}=h();return(e.props.tags??[]).map(n=>t[n]).filter(n=>n!==void 0&&!n.tombstoned).map(n=>n.name)},pC=e=>{let{contributors:t}=h();return(e.props.assignees??[]).map(n=>{let r=t[n];return r?r.name:void 0}).filter(n=>!!n)},kg=null,Lg=new Map,fC=()=>{let e=h().eventLog??[];if(e===kg)return Lg;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 kg=e,Lg=t,t},gC=e=>{let{contributors:t}=h(),n=fC().get(e.id);return n?[...n].map(r=>t[r]?.name).filter(r=>!!r):[]},Pg=(e,t)=>{let n=yn(t.value);if(!n)return!0;switch(t.target){case"title":return Nl(e.title??"",n);case"description":return Nl(e.props.description??"",n);case"tag":return mC(e).map(yn).some(o=>o.includes(n));case"goal":{let r=an(e);return r?yn(r.name).includes(n):!1}case"assignee":return pC(e).map(yn).some(o=>o.includes(n));case"actor":return gC(e).map(yn).some(o=>o.includes(n));case"ref":return bc(e.id,t.value);default:return!0}};var wl=(e,t)=>e.rank<t.rank?-1:e.rank>t.rank?1:0,hC=(e,t)=>!!e&&!e.isDeleted&&e.parentNodeId===t,Og=(e,t)=>Object.values(e).filter(n=>hC(n,t)).sort(wl),Dg=(e,t)=>{let n={};for(let r of Object.values(e)){if(j(r)&&t.length>0&&!t.every(s=>Pg(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(wl);return n},Fg=(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(wl);return n};var _g=e=>gi(be(e),{at:"end"}),gi=(e,t={at:"end"})=>{let n=o=>c(o)?d("Rank space exhausted",{rank:"",needsRebalance:!0}):d("Resolved rank",{rank:o.value,needsRebalance:!1});if(e.length===0)return n(Ge(void 0,void 0));let r=()=>n(Ge(e[e.length-1]?.rank,void 0));switch(t.at){case"start":{let o=e[0];return o?n(Ge(void 0,o.rank)):a("Unable to resolve first sibling")}case"end":{let o=e[e.length-1];return o?n(Ge(o.rank,void 0)):a("Unable to resolve last sibling")}case"before":{let o=$g(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(Ge(i?.rank,s.rank))}case"after":{let o=$g(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(Ge(s.rank,i?.rank))}}},be=e=>{let t=h();if(!Ug()&&t.filters.length===0){let n=t.renderedChildrenIndex[e];if(n)return n}return Og(t.nodes,e)},$g=(e,t)=>e.findIndex(n=>n.id===t),Bg=(e,t,n={at:"end"})=>gi(be(t).filter(r=>r.id!==e),n),hi=(e,t,n,r,o)=>{let s=Bg(t,e,n);if(c(s))return s;if(!s.value.needsRebalance)return d("Resolved rank",s.value.rank);let i=Cl(e,r);if(c(i))return i;let l=Y([i.value],o);if(c(l))return l;let u=Bg(t,e,n);return c(u)?u:u.value.needsRebalance?a("Rank rebalance failed to create space"):d("Resolved rank after rebalance",u.value.rank)},yi=(e,t,n)=>{let r=_g(e);if(c(r))return r;if(!r.value.needsRebalance)return d("Resolved rank",r.value.rank);let o=Cl(e,t);if(c(o))return o;let s=Y([o.value],n);if(c(s))return s;let i=_g(e);return c(i)?i:i.value.needsRebalance?a("Rank rebalance failed to create space"):d("Resolved rank after rebalance",i.value.rank)};var Ho=5,V={exit(){process.exit(0)},enterChildNode(){let e=h(),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"||V.navigate({contextNode:o,selectedIndex:le(o.id).length?0:-1}))},enterParentNode(){let{contextNode:e,nodes:t}=h();if(!e.parentNodeId){logger.info("Missing parent node id");return}let n=t[e.parentNodeId];if(!n){logger.error("Parent not found");return}let r=le(n.id),o=r.findIndex(({id:i})=>i===e.id),s=r.length===0?-1:o>=0?o:0;V.navigate({contextNode:n,selectedIndex:s})},navigateToNextItem:()=>jg(1),navigateToPreviousItem:()=>jg(-1),jumpToNextItem:()=>Hg(Ho),jumpToPreviousItem:()=>Hg(-Ho),navigateToNextContainer:()=>Gg(1),navigateToPreviousContainer:()=>Gg(-1),navigate:({contextNode:e,selectedIndex:t})=>{I({contextNodeId:e.id,selectedIndex:t})}},jg=e=>{let{selectedIndex:t,contextNode:n}=h(),r=le(n.id).length;if(r===0)return;let s=(Math.max(0,t)+e+r)%r;V.navigate({selectedIndex:s,contextNode:n})},Hg=e=>{let{selectedIndex:t,contextNode:n}=h(),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);V.navigate({selectedIndex:s,contextNode:n})},Gg=e=>{let{contextNode:t,nodes:n,selectedIndex:r}=h();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!o)return;let s=le(o.id),i=s.findIndex(g=>g.id===t.id);if(i<0)return;let l=s.at(i+e)??s.at(0);if(!l)return;let u=le(l.id),m=Math.max(0,u.length-1),p=Math.min(Math.max(0,r),m),f=u.length?p:-1;V.navigate({contextNode:l,selectedIndex:f})};var zg=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),Vg=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=h();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},yC=e=>{let t=h().nodes[e];return!!t&&!t.isDeleted&&Fe(t)&&t.childRenderAxis==="vertical"},bi=(e,t)=>{let{nodes:n}=h(),r=n[e];if(!r||r.isDeleted)return!1;let o=be(r.id);return V.navigate({contextNode:r,selectedIndex:zg(t,o.length)}),!0},Kg=e=>{let{nodes:t}=h(),n=t[e];if(!n||n.isDeleted)return!1;let r=n.parentNodeId;if(!r)return bi(n.id,0);let o=t[r];if(!o||o.isDeleted)return!1;let i=be(o.id).findIndex(l=>l.id===n.id);return i>=0?(V.navigate({contextNode:o,selectedIndex:i}),!0):Kg(o.id)},Wg=e=>{let{nodes:t}=h(),n=e,r=new Set;for(;n&&!r.has(n);){if(r.add(n),Kg(n))return!0;n=t[n]?.parentNodeId}return!1},bC=e=>{if(!e)return!1;let t=h().nodes[e];return!!t&&!t.isDeleted},qg=e=>{let{nodes:t,rootNodeId:n}=h();if(yC(e.contextNodeId)&&bi(e.contextNodeId,e.selectedIndex))return d("Restored navigation inside text container",null);if(bC(e.selectedNodeId)&&e.selectedNodeId&&Wg(e.selectedNodeId))return d("Restored navigation to selected node or ancestor",null);if(bi(e.contextNodeId,e.selectedIndex))return d("Restored navigation to previous container",null);if(e.parentNodeId&&bi(e.parentNodeId,e.selectedIndex))return d("Restored navigation to previous parent",null);if(Wg(e.contextNodeId))return d("Restored navigation to previous container or ancestor",null);let r=t[n];if(!r||r.isDeleted)return a("Unable to restore navigation");let o=be(r.id);return V.navigate({contextNode:r,selectedIndex:zg(e.selectedIndex,o.length)}),d("Restored navigation to root",null)};import{monotonicFactory as vC,ulid as Ut}from"ulid";var Go=vC();function xC(){let e=pe();if(c(e))return a("Unable to boot. State not initialized");let t=e.value,n=Object.values(t.nodes).find(s=>s.context==="WORKSPACE");if(!n)return a("No workspace found in event log");let[r]=le(n.id),[o]=r?le(r.id):[];if(o){let s=t.renderedChildrenIndex?.[o.id]??[];return d("Resolved boot nav target",{contextNode:o,selectedIndex:s.length>0?0:-1})}else return r?d("Resolved boot nav target",{contextNode:r,selectedIndex:0}):d("Resolved boot nav target",{contextNode:n,selectedIndex:0})}function RC(){let e=xC();return c(e)?e:V.navigate(e.value)}function Yg({userId:e,userName:t}){let n=Go(),r=Go(),o=Go(),s=Go(),i=Go(),l=Ge(void 0,void 0);if(c(l))return l;let u=Ge(void 0,void 0);if(c(u))return u;let m=Ge(u.value,void 0);if(c(m))return m;let p=Ge(void 0,void 0);if(c(p))return p;let f=Ge(p.value,void 0);if(c(f))return f;let g=Ge(f.value,void 0);if(c(g))return g;let v=Ge(void 0,void 0);return c(v)?v:d("Created default events",[{id:Ut(),userId:e,action:"init.workspace",payload:{id:n,name:"Workspace",rank:l.value}},{id:Ut(),userId:e,action:"create.contributor",payload:{id:e,name:t}},{id:Ut(),userId:e,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:u.value}},{id:Ut(),userId:e,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:p.value}},{id:Ut(),userId:e,action:"add.swimlane",payload:{id:s,name:"In progress",parent:r,rank:f.value}},{id:Ut(),userId:e,action:"add.swimlane",payload:{id:i,name:"Done",parent:r,rank:g.value}},{id:Ut(),userId:e,action:"add.board",payload:{id:gr,name:"Closed",parent:n,rank:m.value}},{id:Ut(),userId:e,action:"add.swimlane",payload:{id:mt,name:"Closed",parent:gr,rank:v.value}},{id:Ut(),userId:e,action:"lock.node",payload:{id:gr}},{id:Ut(),userId:e,action:"lock.node",payload:{id:mt}}])}var EC=()=>{let e=pe();if(c(e))return!1;let{timeMode:t}=e.value;return t==="peek"||t==="replay"},SC=e=>{if(e.length===0)return;let t=e.filter(r=>r.reason==="corrupt-line"||r.reason==="invalid-payload"),n=e.filter(r=>r.reason==="unsupported-schema-version"||r.reason==="unknown-action");if(n.length>0){let r=[...new Set(n.map(o=>o.detail))].join(", ");K.info(`This build cannot read ${n.length} event(s) in the log (${r}). They are skipped, so anything they changed may be out of date until you upgrade.`)}if(t.length>0){let r=[...new Set(t.map(o=>o.detail))].join(", ");K.info(`Skipped ${t.length} corrupt line(s) in the event log (${r}). The rest of the board loaded normally; those events are unrecoverable.`)}};function Wo(e,t=[]){if(EC())return d("Skipped boot while checked out at a historical point",null);if(!e.length){let s=Ae.workspace("temporary-uninitialized-workspace","Workspace","a0"),i=Eo(s);return c(i)?i:(I({hasProjectDefinition:!1,mode:y.DEFAULT}),d("Booted uninitialized workspace placeholder",null))}if(!e.some(s=>s.action==="init.workspace"))return a("Initialized Epiq project has no workspace init event");let n=un(e),{fatal:r,skipped:o}=Wn(n);return r.length>0?a(`Materializing failed:
62
+ ${r.map(s=>s.message).join(`
63
+ `)}`):(zn(o),RC(),I({hasProjectDefinition:!0}),SC(t),d("State booted successfully",null))}import{WebSocket as CC}from"ws";var vi=new Set,A$=e=>{vi.add(e),e.on("close",()=>{vi.delete(e)}),e.on("error",()=>{vi.delete(e)})},Xg=e=>{let t=JSON.stringify(e);for(let n of vi)n.readyState===CC.OPEN&&n.send(t)};var xi=e=>{gt()&&(I({syncStatus:e}),Xg({type:"sync-status",payload:e}))},Ri=(e="Syncing...")=>{xi({status:"syncing",msg:e})},zo=(e="Synced")=>{xi({status:"synced",msg:e})},NC=e=>{xi({status:"failed",msg:e})},Ei=e=>{xi({status:"offline",msg:e})},Te=e=>(NC(e),a(e));var Xn=(e,t)=>(logger.error(`[boot:${e}] ${t}`),a(`[boot:${e}] ${t}`)),Jg=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)}},ce=(e,t)=>(c(t)&&logger.info(`[${e}]:failed`,t.message),t);import fh from"node:fs";import Yt from"node:fs";import Xt from"node:path";import Si from"node:fs";import Zg from"node:path";var _e=".epiq/project.json",Qg=e=>Zg.join(e,_e),wC=e=>{if(!Si.existsSync(Qg(e)))return d("State branch carries no identity yet",null);let t=He(e);return c(t)?a(`On the state branch: ${t.message}`):d("Read the state branch identity",t.value)},Il=(e,t)=>{try{let n=Qg(e);return Si.mkdirSync(Zg.dirname(n),{recursive:!0}),Si.writeFileSync(n,JSON.stringify(t,null,2)+`
64
+ `,"utf8"),d("Wrote the state branch identity",void 0)}catch(n){return a(n instanceof Error?`Failed to write the state branch identity: ${n.message}`:"Failed to write the state branch identity")}},IC=({checkout:e,branch:t,stateBranch:n})=>[`This checkout's ${_e} 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}:${_e} > ${_e}`,"","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(`
65
+ `);var eh=({repoRoot:e,stateBranchRoot:t,stateBranch:n})=>{if(!Si.existsSync(mr(e)))return d("No project file to compare","no-checkout-file");let r=He(e);if(c(r))return a(r.message);let o=wC(t);if(c(o))return a(o.message);if(o.value===null){let s=Il(t,r.value);return c(s)?a(s.message):d("Stamped the state branch with this project","stamped")}return o.value.projectId!==r.value.projectId?a(IC({checkout:r.value,branch:o.value,stateBranch:n})):d("The checkout and the state branch agree","matched")};import jt from"node:fs";import Vo from"node:path";var Mr=e=>e.split(`
66
+ `).filter(t=>t.trim().length>0),th=e=>{let t=Vo.join(e,je,Wt);try{if(!jt.existsSync(t))return d("No events directory",[]);let n=jt.readdirSync(t).filter(r=>r.endsWith(".jsonl")).filter(r=>Mr(jt.readFileSync(Vo.join(t,r),"utf8")).length>0);return d("Looked for stranded event logs",n)}catch(n){return a(`Unable to check ${t} for event logs before deleting it: ${n instanceof Error?n.message:String(n)}`)}},nh=e=>Vo.join(e,je,Wt),rh=e=>{let t=nh(e),n=new Map;try{if(!jt.existsSync(t))return n;for(let r of jt.readdirSync(t))if(r.endsWith(".jsonl")&&!Gn(r))try{n.set(r,Mr(jt.readFileSync(Vo.join(t,r),"utf8")))}catch(o){if(!ho(o))throw o}}catch{return n}return n},AC=e=>{try{let t=JSON.parse(e);return typeof t=="object"&&t!==null}catch{return!1}},oh=(e,t)=>{if(t.size===0)return[];let n=nh(e),r=[];for(let[o,s]of t){if(s.length===0)continue;let i=Vo.join(n,o);try{let l=jt.existsSync(i)?jt.readFileSync(i,"utf8"):null,u=new Set(l===null?[]:Mr(l)),m=s.filter(f=>!u.has(f)).filter(AC);if(m.length===0)continue;jt.mkdirSync(n,{recursive:!0});let p=l!==null&&l.length>0&&!l.endsWith(`
67
+ `);jt.appendFileSync(i,`${p?`
68
+ `:""}${m.join(`
69
+ `)}
70
+ `,"utf8"),r.push(`${o} (${m.length})`)}catch{continue}}return r},TC=(e,t)=>{let n=new Set(Mr(t));return Mr(e).filter(r=>!n.has(r))},MC=(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(`
71
+ `),sh=async({stateBranchRoot:e,relativePath:t,workingContent:n})=>{let r=await Se({args:["show",`HEAD:${t}`],cwd:e});if(r.exitCode!==0)return d("No committed log to compare against",void 0);let o=TC(r.stdout,n);return o.length>0?a(MC(t,o,Mr(r.stdout).length)):d("Event log only grew",void 0)};var kC="[epiq:init-repo]",ah=async e=>{let t=await Se({args:["rev-parse","--verify","--quiet","HEAD"],cwd:e});if(t.exitCode===0)return d("Initial commit already exists",!1);if(!(t.exitCode===1&&t.stdout.trim()===""&&t.stderr.trim()===""))return a(["Could not determine whether the repository has any commits, so nothing was written.",`git rev-parse exited ${t.exitCode}`,t.stderr.trim()].filter(Boolean).join(`
72
+ `));K.info("Creating initial commit");let r=await _({args:["hash-object","-w","-t","tree","/dev/null"],cwd:e});if(c(r))return a(r.message);let o=await _({args:["commit-tree",r.value.stdout.trim(),"-m",kC],cwd:e});if(c(o))return a(o.message);let s=await _({args:["update-ref","HEAD",o.value.stdout.trim()],cwd:e});return c(s)?a(s.message):d("Created initial commit",!0)},ih=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",LC=async e=>{let t=await xs(e);if(c(t))return a(t.message);let n=await vu(e);return c(n)?a(n.message):d("Built sync commit message",`[sync|branch:${ih(t.value)}:sha:${ih(n.value)}]`)},Al=async({repoRoot:e,stateBranchName:t})=>{K.info(`Creating ${t}`);let n=await _({args:["commit-tree",Mu,"-m","[epiq:init-state-branch]"],cwd:e});if(c(n))return a(`Failed to create state branch commit
73
+ ${n.message}`);let r=n.value.stdout.trim(),o=await _({args:["update-ref",`refs/heads/${t}`,r],cwd:e});return c(o)?a(`Failed to create ${t}
74
+ ${o.message}`):d("Created state branch",!0)},Tl=async({repoRoot:e,stateBranchName:t})=>{let n=await vs({repoRoot:e,branch:t});if(c(n))return a(`Ensure local state branch failed
75
+ `+n.message);if(n.value)return d("Local state branch already exists",!1);let r=await Gt({repoRoot:e});if(c(r))return a(`Ensure local state branch failed
76
+ `+r.message);let o=r.value,s=o?await Yr({repoRoot:e,branch:t}):d("No remote, no remote state branch",!1);if(c(s))return a(`Ensure local state branch failed
77
+ `+s.message);let i=s.value;if(o&&i){let l=await fe.fetch({cwd:e,remote:ot,branch:t});if(c(l))return a(`Failed to fetch ${t} from remote
78
+ ${l.message}`)}if(i){let l=await _({args:["branch","--track",t,`${ot}/${t}`],cwd:e});return c(l)?a(`Failed to create local ${t} from remote
79
+ ${l.message}`):d("Created local state branch from remote",!0)}return Al({repoRoot:e,stateBranchName:t})},PC=async({repoRoot:e,branch:t})=>{let n=await _({args:["worktree","list","--porcelain"],cwd:e});if(c(n))return a(n.message);let r=n.value.stdout.split(`
80
+ `),o=null;for(let s of r){if(s.startsWith("worktree ")){o=s.slice(9);continue}if(s===`branch refs/heads/${t}`&&o)return d("Found worktree for branch",o)}return d("No worktree found for branch",null)},OC=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=Zr(Xt.dirname(t));if(c(r))return a(`Failed to create state branch worktree
81
+ `+r.message);if(Yt.existsSync(t)&&!Yt.existsSync(Xt.join(t,".git"))){let s=th(t);if(c(s))return a(s.message);if(s.value.length>0)return a([`Refusing to delete ${t}.`,"","It is not a usable worktree \u2014 it has no .git \u2014 but it still holds",`${s.value.length} event log(s) with content:`,...s.value.map(i=>` ${i}`),"","Deleting it would destroy them, and with no .git here there is no","committed copy to recover from. Move the directory aside and","salvage the logs before letting epiq recreate the worktree."].join(`
82
+ `));K.info("Removing broken state branch worktree path"),Ou(t)}K.info("Creating state branch worktree");let o=await fe.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return c(o)?a(`Failed to create state branch worktree
83
+ ${o.message}`):d("Created state branch worktree",!0)},kr=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await FC({repoRoot:e,stateBranchRoot:t,stateBranchName:n});if(c(r))return r;let o=eh({repoRoot:e,stateBranchRoot:t,stateBranch:n});return c(o)?a(o.message):(o.value==="stamped"&&K.info("Stamped the state branch with this project\u2019s identity"),r)},DC=(e,t)=>{let n=dr(On());return Xt.dirname(e)===n&&Xt.dirname(t)===n},FC=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await PC({repoRoot:e,branch:n});if(c(r))return a(r.message);let o=dr(t),s=r.value?dr(r.value):null;if(s&&s===o&&Yt.existsSync(s))return d("State branch already checked out in expected worktree",!1);if(s&&s!==o&&DC(s,o))return a([`The state branch ${n} is checked out under project ${Xt.basename(s)}, but this checkout names project ${Xt.basename(o)}.`,"","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 ${_e} here`,`with \`git show ${n}:${_e}\`, and keep the branch's.`].join(`
84
+ `));if(s&&s!==o){let u=await Nu(s);if(c(u))return a(u.message);if(u.value||Vm(s))return a([`Refusing to move the state branch worktree away from ${s}.`,"","It holds changes that are not committed yet, which for this","branch means events no sync has published. Removing it would","destroy them outright \u2014 there is no stash or reflog to recover","a deleted worktree from.","",`This worktree is expected at ${o}, so something else is`,"using a different EPIQ_GLOBAL_DIR against the same repository.","Sync from that location first, or point both at the same one."].join(`
85
+ `));K.info("Moving state branch worktree to expected location");let m=await fe.worktreeRemove({cwd:e,worktreeRoot:s});if(c(m))return a(`Failed to remove existing state branch worktree
86
+ ${m.message}`)}if(s&&!Yt.existsSync(s)){K.info("Pruning stale state branch worktree");let u=await fe.worktreePrune({cwd:e});if(c(u))return a(`Failed to prune stale worktrees
87
+ ${u.message}`)}let i=await bu({repoRoot:e,worktreeRoot:t});if(c(i))return a(i.message);let l=Yt.existsSync(t);if(i.value&&l)return d("State branch worktree already exists",!1);if(i.value&&!l){K.info("Pruning missing registered state branch worktree");let u=await fe.worktreePrune({cwd:e});if(c(u))return a(`Failed to prune stale worktrees
88
+ ${u.message}`)}return OC({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},_C=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await xs(e);if(c(n))return a(n.message);if(n.value===t)return d("State branch already checked out",!1);(await Se({cwd:e,args:["rebase","--abort"]})).exitCode===0&&K.info("Aborted stale state branch rebase");let o=await fe.checkout({cwd:e,branch:t});return c(o)?a(`Failed to checkout ${t}
89
+ ${o.message}`):d("Checked out state branch",!0)},$C=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Ta(t);if(c(n))return a(n.message);if(n.value)return d("State branch upstream already configured",!1);let r=await Gt({repoRoot:t});if(c(r))return a(r.message);if(!r.value)return d("No remote available for state branch upstream",!1);let o=wt(e);if(c(o))return o;let s=o.value,i=await Yr({repoRoot:t,branch:s});if(c(i))return a(i.message);if(!i.value)return d("Remote state branch missing; upstream will be configured on first push",!1);K.info(`Configuring ${s} upstream`);let l=await fe.fetch({cwd:t,remote:ot,branch:s});if(c(l))return a(`Failed to fetch ${s}
90
+ ${l.message}`);let u=await fe.setUpstream({cwd:t,branch:s,upstream:`${ot}/${s}`});return c(u)?a(`Failed to set state branch upstream
91
+ ${u.message}`):d("Configured state branch upstream",!0)},Ci=async({stateBranchRoot:e,eventFileName:t})=>{let n=ku(t),r=Xt.join(e,n);if(!Yt.existsSync(r))return d("No event file to stage",null);let o=await sh({stateBranchRoot:e,relativePath:n,workingContent:Yt.readFileSync(r,"utf8")});if(c(o))return a(o.message);let s=await fe.stage({cwd:e,pathspec:[n]});return c(s)?a(`Failed to stage state branch event file
92
+ ${s.message}`):d("Staged state branch event file",n)},ch=async({stateBranchRoot:e})=>{let t=Lu(),n=Xt.join(e,t);if(!Yt.existsSync(n))return d("No media directory to stage",null);let r=await fe.stage({cwd:e,pathspec:[t],ignoreRemoval:!0});return c(r)?a(`Failed to stage state branch media files
93
+ ${r.message}`):d("Staged state branch media files",t)},lh=async({stateBranchRoot:e})=>{let t=[ka(),La(),_e].filter(r=>Yt.existsSync(Xt.join(e,r)));if(t.length===0)return d("No event log config to stage",[]);let n=await fe.stage({cwd:e,pathspec:t});return c(n)?a(`Failed to stage event log config
94
+ ${n.message}`):d("Staged event log config",t)},dh=async({repoRoot:e,stateBranchRoot:t,pathspec:n})=>{let r=await LC(e);return c(r)?a(`Create state branch sync commit failed
95
+ `+r.message):ur({cwd:t,message:r.value,pathspec:n})},Ko=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Ta(t);if(c(n))return a(n.message);let r=wt(e);if(c(r))return r;let o=r.value,s=n.value?await fe.push({cwd:t}):await fe.push({cwd:t,remote:ot,branch:o,setUpstream:!0});if(c(s))return a(`Failed during state branch push
96
+ ${s.message}`);let i=!`${s.value.stdout}${s.value.stderr}`.includes("Everything up-to-date");return d(i?"Pushed state branch":"Remote already up to date",i)},uh=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=wt(e);if(c(o))return o;let s=o.value,i=[Qr(),await Tl({repoRoot:e,stateBranchName:s}),await kr({repoRoot:e,stateBranchRoot:t,stateBranchName:s}),await _C({stateBranchRoot:t,stateBranchName:s}),await Fu(t),n?await $C({stateBranchRoot:t,repoRoot:e}):d("Skipped state branch upstream bootstrap",!1)];for(let l of i){if(c(l))return a(l.message);r=r||!!l.value}return d(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",r)};var BC=async({claim:e,cwd:t,ensureUpstream:n})=>{logger.debug("[sync] ensureSyncReady:start",{cwd:t,ensureUpstream:n});let r=ce("getRepoRootDir",await It(t));if(c(r))return a(r.message);let o=r.value;logger.debug("[sync] repo root",o);let s=ce("getStateBranchRoot",ve({repoRoot:o}));if(c(s))return a(s.message);let i=s.value;if(logger.debug("[sync] state branch root",i),e!=="stale"&&fh.existsSync(i)){let p=await Eu(i,{preserve:[ti]});if(c(p))return a(p.message);p.value.length>0&&logger.info("[sync] cleared git lock files left by a dead process",{removed:p.value,stateBranchRoot:i});let f=wt(o);if(c(f))return a(f.message);let g=await Su(i,f.value);if(c(g))return a(g.message);g.value&&logger.info("[sync] cleared a ref lock left by a dead process",{branch:f.value,stateBranchRoot:i});let v=ce("abortRebaseIfPresent(stateBranchRoot)",await Ma(i));if(c(v))return a(v.message)}logger.debug("[sync] bootstrapping state branch storage",{repoRoot:o,stateBranchRoot:i,ensureUpstream:n});let l=ce("bootstrapStateBranchStorage",await uh({repoRoot:o,stateBranchRoot:i,ensureUpstream:n}));if(c(l))return a(l.message);logger.debug("[sync] bootstrap result",{bootstrapped:l.value,stateBranchRoot:i}),logger.debug("[sync] checking state branch git operation",{stateBranchRoot:i});let u=ce("getInProgressGitOperation(stateBranchRoot)",await Aa(i));if(c(u))return a(u.message);if(logger.debug("[sync] state branch git operation check result",{inProgress:u.value}),u.value!==null)return logger.info("[sync] state branch git operation in progress",{claim:e}),a(`Cannot sync while there is a ${u.value} in the state branch at ${i}`);logger.debug("[sync] ensuring state branch layout",{repoRoot:o,stateBranchRoot:i});let m=ce("ensureStateBranchLayout",Du(o,i));return c(m)?a(m.message):(logger.debug("[sync] state branch layout ready"),logger.debug("[sync] ensureSyncReady:done",{repoRoot:o,stateBranchRoot:i,bootstrapped:l.value}),d("Sync preconditions satisfied",{repoRoot:o,stateBranchRoot:i,bootstrapped:l.value}))},UC=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 m of ip(qe(t),n)){let p=ce("stageStateBranchOwnEventFile",await Ci({stateBranchRoot:t,eventFileName:m}));if(c(p))return a(p.message);r.push(p.value)}let o=ce("stageStateBranchMediaFiles",await ch({stateBranchRoot:t}));if(c(o))return a(o.message);let s=ce("stageStateBranchEventConfig",await lh({stateBranchRoot:t}));if(c(s))return a(s.message);let i=[...r,o.value,...s.value].filter(m=>m!==null);if(i.length===0)return d("Nothing to stage",{createdCommit:!1});let l=ce("hasStagedChanges(after stage)",await wu(t,i));if(c(l))return a(l.message);if(logger.debug("[sync] state branch change check after stage result",{changed:l.value}),!l.value)return logger.info("[sync] no own event file changes to commit"),d("No own event file changes to commit",{createdCommit:!1});logger.debug("[sync] creating sync commit");let u=ce("createStateBranchSyncCommit",await dh({repoRoot:e,stateBranchRoot:t,pathspec:i}));return c(u)?a(u.message):(logger.debug("[sync] created sync commit",u.value),d("Committed own event file",{createdCommit:!0,commitSha:u.value}))},jC=5*6e4,mh=new Map,HC={offline:"Offline","no remote":"No remote","not published":"Not published"},qo=(e,t="offline")=>{let n=e.createdCommit?`Committed locally, ${t}`:HC[t];return Ei(n),d(n,{...e,pulled:!1,pushed:!1,offline:!0})},ph=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}),a("Own event file must be a file name, not a path");if(!t.endsWith(".jsonl"))return logger.error("[sync] invalid own event file name: missing .jsonl suffix",{ownEventFileName:t}),a("Own event file must end with .jsonl");Ri();let r=ce("ensureSyncReady",await BC({claim:n,cwd:e,ensureUpstream:!0}));if(c(r))return Te(r.message);let{repoRoot:o,stateBranchRoot:s,bootstrapped:i}=r.value,l=ce("isDetachedHead(stateBranchRoot)",await Iu(s));if(c(l))return Te(l.message);if(logger.debug("[sync] detached state branch check result",{detached:l.value}),l.value)return Te("Cannot run :sync while the state branch is in detached HEAD state");let u=!1,m,p=!1,f=!1,g=ce("getStateBranch",wt(o));if(c(g))return Te(g.message);let v=g.value;logger.debug("[sync] resolved state branch",{stateBranch:v,stateBranchRoot:s});let w=ce("flushPendingLogs",Hs(s,t));c(w)&&logger.error(`[sync] ${w.message}`);let x=ce("commitOwnEventFileToStateBranch",await UC({repoRoot:o,stateBranchRoot:s,ownEventFileName:t}));if(c(x))return Te(x.message);u=x.value.createdCommit,m=x.value.commitSha;let E=ce("hasRemote",await Gt({repoRoot:s}));if(c(E))return Te(E.message);if(!E.value)return qo({repoRoot:o,stateBranchRoot:s,createdCommit:u,commitSha:m,bootstrapped:i},"no remote");let N=ce("pullBranchRebaseIfPresent",await Jr({cwd:s,branch:v}));if(c(N))return Xr(N.message)?qo({repoRoot:o,stateBranchRoot:s,createdCommit:u,commitSha:m,bootstrapped:i}):Te(N.message);p=N.value;let S=ce("getPublishState",await Cu({branch:v,cwd:s}));if(c(S))return Te(S.message);let k=S.value,L=k==="unpublished"&&!u&&!i,B=mh.get(s);if(L&&B!==void 0&&Date.now()-B<jC)return qo({repoRoot:o,stateBranchRoot:s,createdCommit:u,commitSha:m,bootstrapped:i},"not published");if(u||i||k!=="up-to-date"){logger.info("[sync] pushing state branch",{createdCommit:u,bootstrapped:i,stateBranchRoot:s});let M=ce("pushStateBranch",await Ko({stateBranchRoot:s,repoRoot:o}));if(c(M)&&xu(M.message)){let P=ce("pullBranchRebaseIfPresent(retry)",await Jr({cwd:s,branch:v}));if(c(P))return Te(P.message);p=p||P.value,M=ce("pushStateBranch(retry)",await Ko({stateBranchRoot:s,repoRoot:o}))}if(c(M))return Xr(M.message)?qo({repoRoot:o,stateBranchRoot:s,createdCommit:u,commitSha:m,bootstrapped:i}):L?(logger.error(`[sync] state branch not published: ${M.message}`),mh.set(s,Date.now()),qo({repoRoot:o,stateBranchRoot:s,createdCommit:u,commitSha:m,bootstrapped:i},"not published")):Te(M.message);f=M.value}if(u){logger.debug("[sync] resolving final sync commit sha",{stateBranchRoot:s});let M=ce("git rev-parse HEAD",await _({args:["rev-parse","HEAD"],cwd:s}));if(c(M))return Te(M.message);m=M.value.stdout.trim(),logger.debug("[sync] final sync commit sha",m)}return zo(f?"Synced and pushed":p||u?"Synced local state":"Already synced"),logger.debug("[sync] syncEpiqWithRemote:done"),d("Synced event logs with state branch",{repoRoot:o,stateBranchRoot:s,createdCommit:u,commitSha:m,pulled:p,pushed:f,bootstrapped:i,offline:!1})},Ni=async(e,t)=>{let n=rh(e);try{return await t()}finally{let r=oh(e,n);r.length>0&&logger.error(`[sync] restored event log lines git dropped from the worktree: ${r.join(", ")}`)}},gh=async e=>{let t=e.cwd??process.cwd(),n=await It(t);if(c(n))return Te(n.message);let r=ve({repoRoot:n.value});if(c(r))return Te(r.message);let o=r.value;if(!fh.existsSync(o))return ph(e,"clean");let s=await To({worktreeRoot:o,operation:"sync",fn:i=>Ni(o,()=>ph(e,i))});return c(s)?Te(s.message):s.value===null?d("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 Lr=null,wi=async({reposMinIntervalMs:e=0}={})=>(logger.debug("[sync] syncAndReloadState enter",{hasPromise:!!Lr,currentStatus:h().syncStatus?.status,currentMessage:h().syncStatus?.msg}),Lr?(logger.debug("[sync] syncAndReloadState joining existing promise"),Lr):(logger.debug("[sync] syncAndReloadState creating promise"),Lr=GC(e).finally(()=>{logger.debug("[sync] syncAndReloadState clearing promise",{statusBeforeClear:h().syncStatus?.status,statusMessageBeforeClear:h().syncStatus?.msg}),Lr=null}),Lr)),GC=async e=>{let t;try{t=await WC(e),logger.debug("[sync] syncAndReloadState promise resolved",{success:!c(t),message:t.message,statusAfterResolve:h().syncStatus?.status,statusMessageAfterResolve:h().syncStatus?.msg})}catch(r){let o=r instanceof Error?r.message:String(r);logger.error("[sync] syncAndReloadState promise threw",{message:o,error:r}),t=a(o)}let n=pe();return c(t)&&!c(n)&&n.value.syncStatus?.status==="syncing"&&(logger.debug("[sync] syncAndReloadState correcting stale syncing status"),I({syncStatus:{msg:t.message,status:"failed"}})),t},WC=async e=>{logger.debug("[sync] syncAndReloadStateUnsafe:start",{mode:h().mode,syncStatus:h().syncStatus});let t=hh();if(t)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by mode",{mode:h().mode,message:t.message,syncStatus:h().syncStatus}),t;logger.debug("[sync] syncAndReloadState:start");let n=ce("resolveActorId",te());if(c(n)||!n.value)return logger.info("[sync] unable to resolve actor id",{message:c(n)?n.message:"Missing actor id"}),a("Unable to resolve event log path");I({syncStatus:{msg:"Reloading synced state",status:"syncing"}}),logger.debug("[sync] sync status patched to syncing",{syncStatus:h().syncStatus});let r=Er(n.value);logger.debug("[sync] resolved own event file name",{ownEventFileName:r}),logger.debug("[sync] syncEpiqWithRemote:start");let o=ce("syncEpiqWithRemote",await gh({ownEventFileName:r}));if(logger.debug("[sync] syncEpiqWithRemote:result",{success:!c(o),message:(c(o),o.message)}),c(o))return logger.error("[sync] syncAndReloadState:sync failed",o.message),I({syncStatus:{msg:"Sync failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after sync failure",{syncStatus:h().syncStatus}),Te(`Unable to sync state. ${o.message}`);let{stateBranchRoot:s,offline:i,repoRoot:l}=o.value,{message:u}=o,m=Ml(s);return c(m)?m:(I({hasProjectDefinition:!0,syncStatus:i?{msg:u,status:"offline"}:{msg:"Synced",status:"synced"}}),logger.debug("[sync] syncAndReloadState:done",{syncStatus:h().syncStatus}),zC(l,e),d("Synced",!0))},zC=async(e,t)=>{let n=await ii({repoRoot:e,minIntervalMs:t}),r=c(n)?null:qc(n.value),o=h().syncStatus;r&&o?.status==="synced"&&I({syncStatus:{msg:`Synced \xB7 ${r}`,status:"synced"}})},Ml=e=>{logger.debug("[sync] loading merged events after sync",{stateBranchRoot:e});let t=Tt(e),n=ce("loadMergedEvents",Co(e));if(logger.debug("[sync] loadMergedEvents:result",{success:!c(n),message:(c(n),n.message),count:c(n)?void 0:n.value.events.length}),c(n))return I({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after load failure",{syncStatus:h().syncStatus}),a(`Unable to load events. ${n.message}`);logger.debug("[sync] loaded merged events after sync",{count:n.value.events.length});let r=hh();if(r)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by late mode check",{mode:h().mode,message:r.message,syncStatus:h().syncStatus}),r;let o=Vg(),s=h().filters;if(logger.debug("[sync] captured navigation anchor",{navigationAnchor:o,selectedNodeId:h().selectedNode?.id,contextNodeId:h().contextNode?.id,selectedNodeIsVirtual:h().selectedNode?.isVirtual,contextNodeIsVirtual:h().contextNode?.isVirtual}),!h().selectedNode?.isVirtual&&!h().contextNode?.isVirtual){logger.debug("[sync] bootStateFromEventLog:start",{eventCount:n.value.events.length});let l=pe(),u=!c(l)&&l.value.timeMode==="live",m=ce("bootStateFromEventLog",Wo(n.value.events,n.value.unreadable));if(logger.debug("[sync] bootStateFromEventLog:result",{success:!c(m),message:(c(m),m.message)}),c(m))return I({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after boot failure",{syncStatus:h().syncStatus}),a(`Unable to boot synced state. ${m.message}`);u&&$s(e,t)}else logger.debug("[sync] skipped bootStateFromEventLog for virtual node",{selectedNodeIsVirtual:h().selectedNode?.isVirtual,contextNodeIsVirtual:h().contextNode?.isVirtual});logger.debug("[sync] booted state from synced events"),I({filters:s}),logger.debug("[sync] restoreNavigationAnchor:start");let i=ce("restoreNavigationAnchor",qg(o));return logger.debug("[sync] restoreNavigationAnchor:result",{success:!c(i),message:c(i)?i.message:"Navigation restored",selectedNodeId:h().selectedNode?.id,contextNodeId:h().contextNode?.id}),c(i)?(I({syncStatus:{msg:"Reload failed",status:"failed"}}),logger.debug("[sync] sync status patched to failed after restore failure",{syncStatus:h().syncStatus}),i):d("Reloaded state from event log",null)},hh=()=>h().mode===y.DEFAULT?null:(logger.debug("[sync] failReloadIfNotDefaultMode",{mode:h().mode,syncStatus:h().syncStatus}),I({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),a("Will not re-materialize if not in default mode, to not lose edit data"));var yh=0,kl,Ll=!1,Yo=!1,Pl=()=>{if(Ll)return!0;let e=pe();return c(e)?!1:e.value.syncStatus.status==="syncing"},VC=()=>{let e=gs(ne().autoSyncIntervalMs),t=Date.now()-yh;return Math.max(0,e-t)},bh=()=>{kl||(kl=setTimeout(async()=>{if(kl=void 0,!!gt()){if(Pl()){Yo=!0;return}Yo=!1,await KC()}},VC()))},KC=async()=>{if(h().readOnly||h().timeMode==="peek"||h().timeMode==="replay")return a("Cannot auto-sync while peeking");if(!gt())return a("Cannot auto-sync before state is initialized");if(Pl())return Yo=!0,a("Sync already in progress");Ll=!0,yh=Date.now(),I({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await wi({reposMinIntervalMs:6e4})}finally{Ll=!1,Yo&&bh()}},vh=()=>{gt()&&(Yo=!0,!Pl()&&bh())};var xh=e=>{let{context:t}=h().contextNode;if(!t)return H.None;switch(e){case b.EXIT:return H.Exit;case b.EXPORT:return H.Export;case b.INIT:return H.Init;case b.OPEN:return H.OpenProject;case b.DELETE:return H.Delete;case b.EDIT:return H.Edit;case b.COMMENT:return H.Comment;case b.HELP:return H.ViewHelp;case b.RE_OPEN_ISSUE:return H.ReopenIssue;case b.CLOSE_ISSUE:return H.CloseIssue;case b.TAG:return H.TagTicket;case b.UNTAG:return H.UntagTicket;case b.GOAL:return H.GoalTicket;case b.UNGOAL:return H.UngoalTicket;case b.RULE:return H.RuleLane;case b.UNRULE:return H.UnruleLane;case b.ASSIGN:return H.AssignUserToTicket;case b.UNASSIGN:return H.UnassignUserFromTicket;case b.NEW:return H.NewItem;case b.FILTER:return H.Filter;case b.MOVE:return H.Move;case b.PEEK:return H.Peek;case b.REPLAY:return H.Replay;case b.CONFIG:return H.Config;case b.YANK:return H.Yank;case b.SYNC:return H.Sync;default:return H.None}},H={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",GoalTicket:"ticket-goal",UngoalTicket:"ticket-ungoal",RuleLane:"lane-rule",UnruleLane:"lane-unrule",AssignUserToTicket:"ticket-assign-user",UnassignUserFromTicket:"ticket-unassign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Comment:"comment-issue",Sync:"sync",Export:"export"};import dy from"node:fs";import rw from"node:path";import ow from"react";import{Box as tw}from"ink";import $i from"react";import Mh from"chalk";import{Box as Fl,Text as uN}from"ink";import Ht from"react";import{Text as Rh}from"ink";import Eh,{useEffect as Sh,useState as qC}from"react";var Ch={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "],identity:["\u276F "]},yt=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=Pe(),r=Ch[n]??Ch.default,[o,s]=qC(0);if(Sh(()=>{s(0)},[r]),Sh(()=>{if(!e)return;let l=setInterval(()=>{s(u=>(u+1)%r.length)},500);return()=>clearInterval(l)},[e,r]),!e)return Eh.createElement(Rh,null,t);let i=r[o]??r[0]??t;return Eh.createElement(Rh,{color:A.accent,dimColor:o===1},i)};import{Box as Ol,Text as YC}from"ink";import Ii from"react";var XC=(e,t,n,r)=>{let o=u=>Math.max(1,e[u]??1),s=n,i=n+1,l=o(n);for(;i<t&&l+o(i)<=r;)l+=o(i),i++;for(;s>0&&l+o(s-1)<=r;)s--,l+=o(s);return{start:s,end:i}},bt=({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)),l=Math.max(1,Math.ceil(r)),u=Math.max(0,Math.min(n,e.length-1)),m=Math.max(1,Math.floor(i/l)),p=Math.max(0,e.length-m),{start:f,end:g}=o?XC(o,e.length,u,i):s?{start:Math.min(p,Math.max(0,u-m+1)),end:Math.min(p,Math.max(0,u-m+1))+m}:{start:Math.min(p,Math.floor(u/m)*m),end:Math.min(p,Math.floor(u/m)*m)+m},v=Math.max(1,g-f),w=e.slice(f,g),x=e.length>v,E=i,N=x?Math.max(1,Math.floor(v/e.length*E)):E,S=Math.max(0,E-N),k=Math.max(1,e.length-v),L=x?Math.floor(f/k*S):0;return Ii.createElement(Ol,{flexDirection:"row",height:i,width:"100%"},Ii.createElement(Ol,{flexDirection:"column",flexGrow:1,height:i},w),Ii.createElement(Ol,{flexDirection:"column",width:1,height:E},Array.from({length:E}).map((B,M)=>Ii.createElement(YC,{key:M,color:x&&M>=L&&M<L+N?A.accent:A.secondary},x?"\u2502":" "))))};import{Box as Jn,Text as Zn}from"ink";import $e from"react";var Nh,Dl,JC=()=>{let{eventLog:e=[]}=h();if(Dl&&Nh===e)return Dl;let t=new Set;for(let n of e)n?.userId&&t.add(n.userId);return Nh=e,Dl=t,t},Ai=e=>JC().has(e);import{Text as ZC}from"ink";import QC from"react";var Pr=({id:e,isSelected:t,maxWidth:n})=>{let r=R.getContributor(e);if(!r)return;let o=r.name,s=n===void 0?o:Ln(o,n);return QC.createElement(ZC,{underline:t,color:Ue(o)},"@"+s,Ai(e)?"":"\u2197")};import{Text as eN}from"ink";import tN from"react";var Ti=({id:e,isSelected:t,maxWidth:n})=>{let r=R.getTag(e);if(!r)return;let o=n===void 0?r.name:Ln(r.name,n);return tN.createElement(eN,{underline:t,backgroundColor:Ue(r.name),color:A.secondary}," "+o+" ")};import{useEffect as nN,useState as rN}from"react";var oN=80,wh=1400,Mi=new Set,Xo=null,sN=e=>(Mi.add(e),Xo||(Xo=setInterval(()=>{for(let t of Mi)t()},oN)),()=>{Mi.delete(e),Mi.size===0&&Xo&&(clearInterval(Xo),Xo=null)}),iN=()=>{let e=Date.now()%wh/wh;return e<.5?e*2:(1-e)*2},Or=e=>{let[,t]=rN(0);return nN(()=>{if(e)return sN(()=>t(n=>n+1))},[e]),kd(iN())};var aN=(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),Ln(e.slice(o).trim(),n)]},Ih=3,cN=2,lN=(e,t)=>{let n=[],r=0;for(let[o,s]of e.entries()){let i=e.length-o-1,l=i>0?String(i).length+1:0;if(r+s.width+l>t)break;r+=s.width,n.push(s)}return{shown:n,hidden:e.length-n.length}},Ah=({width:e,ticket:t,isSelected:n,isFlashing:r=!1})=>{let o=Or(r),s=e-4,i=s-7-1,[l,u]=aN(dt(t.title),i,s),m=u?null:Ln(dt(t.props.description),s)||null,p=on(t),f=sn(t).map(k=>({...k,name:k.name})),g=Math.max(1,s-Ih),v=R.getCommentsByIssue(t.id),w=v.length?String(v.length).length+2+1:0,x=Ls(t,Math.max(1,Math.floor(s/2))),E=x?x.text.length+1:0,{shown:N,hidden:S}=lN([...p.map(k=>({id:k.id,isTag:!0,width:Math.min(k.name.length,g)+Ih})),...f.map(k=>({id:k.id,isTag:!1,width:Math.min(k.name.length,g)+cN+(Ai(k.id)?0:1)}))],s-w-E);return $e.createElement(Jn,{borderStyle:"round",height:5,flexDirection:"column",overflow:"hidden",borderDimColor:!n,borderColor:r?o:n?A.accent:A.secondary,justifyContent:"space-between"},$e.createElement(Jn,{paddingLeft:1,paddingRight:1,flexDirection:"column"},$e.createElement(Jn,{justifyContent:"space-between"},$e.createElement(Zn,{color:A.primary},l),$e.createElement(Zn,{color:A.secondary2,dimColor:!0},it(t.id))),u&&$e.createElement(Zn,{color:A.primary},u),m&&$e.createElement(Zn,{color:A.secondary2,dimColor:!0},m)),$e.createElement(Jn,{flexDirection:"row",paddingLeft:1,paddingRight:1,justifyContent:"space-between"},$e.createElement(Jn,{flexDirection:"row"},x&&$e.createElement(Jn,{paddingRight:1},$e.createElement(Zn,{color:x.color},x.text)),N.map(k=>$e.createElement(Jn,{paddingRight:1,key:k.id},k.isTag?$e.createElement(Ti,{id:k.id,maxWidth:g}):$e.createElement(Pr,{id:k.id,maxWidth:g}))),S>0&&$e.createElement(Zn,{color:A.secondary2,dimColor:!0},"+",S)),v.length>0&&$e.createElement(Zn,{color:A.accent},"[",v.length,"]")))};import{Box as bn,Text as Dr}from"ink";import We from"react";var dN=(e,t)=>e.length>t?e.slice(0,Math.max(0,t-1))+"\u2026":e,Th=({index:e,labelWidth:t,width:n,ticket:r,isSelected:o,isFlashing:s=!1,mode:i})=>{let l=Or(s),u=(r.props.tags??[]).map(P=>R.getTag(P)).filter(P=>!!P),m=(r.props.assignees??[]).map(P=>R.getContributor(P)).map(P=>P&&{...P,name:P.name}).filter(P=>!!P),p=1,f=Ls(r,0),g=f?1+p:0,v=u.length*(1+p)+g,w=m.length*(2+p),x=u.map(P=>We.createElement(bn,{key:P.id,paddingRight:p},We.createElement(Dr,{color:Ue(P.name)},"\u25A0"))),E=m.map(P=>We.createElement(bn,{key:P.id,paddingRight:p},We.createElement(Dr,{color:la(P.name)},"@"+P.name.at(0)))),N=s?l:o?A.accent:i===y.MOVE?A.secondary:A.primary,S=R.getCommentsByIssue(r.id),k=S.length?String(S.length).length+2+p:0,L=S.length?We.createElement(bn,{paddingRight:p},We.createElement(Dr,{color:A.accent},"[",S.length,"]")):null,B=v+w+k,M=Math.max(1,n-t-B-(B>0?1:0));return We.createElement(bn,{justifyContent:"space-between"},We.createElement(bn,null,We.createElement(bn,{width:t},o?We.createElement(yt,{isSelected:!0}):We.createElement(Dr,{color:"gray",dimColor:!0},String(e+1).padStart(t-1)+" ")),We.createElement(Dr,{wrap:"truncate",color:N},dN(r.title,M))),We.createElement(bn,null,f&&We.createElement(bn,{paddingRight:p},We.createElement(Dr,{color:f.color},"\u25C6")),x,E,L))};var mN=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:s,listSelectedIndex:i,mode:l})=>{let{renderedChildrenIndex:u,replay:m}=Pe(),p=u[e.id]??[],f=m?new Set(m.flashNodeIds):null,g=f?.has(e.id)??!1,v=Or(g),w=As(e.id),x=`${e.title} ${Mh.hex(A.secondary2).dim("("+p.length+")")}${w?Mh.hex(A.secondary2)(" \u2713"):""}`,E=3,N=o?1:5,S=s&&i===-1,k=n-3-(o?1:0)-(S?2:0),L=Math.max(2,String(p.length).length+1),B=r-E-1,M=Ht.createElement(Fl,{borderStyle:"round",borderColor:A.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1,marginRight:o?1:0},Ht.createElement(yt,{isSelected:t}),Ht.createElement(uN,{bold:!0,color:g?v:t?A.accent:A.primary},x," ",e.readonly?"\u{1F512}":"")),P=($,de)=>{let U=s&&i===de;if(!j($))return null;let F=f?.has($.id)??!1;return o?Ht.createElement(Th,{key:$.id,index:de,labelWidth:L,width:k,ticket:$,isSelected:U,isFlashing:F,mode:l}):Ht.createElement(Ah,{key:$.id,width:k,ticket:$,isSelected:U,isFlashing:F})};return Ht.createElement(Fl,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?A.accent:A.secondary,paddingRight:0,paddingLeft:o?1:0,height:r},M,Ht.createElement(Fl,null,p.length>0&&Ht.createElement(bt,{selectedIndex:i,height:B,itemHeight:N},p.map(P)),S&&Ht.createElement(yt,{isSelected:!0})))},kh=Ht.memo(mN);import{Box as Br,Text as YN}from"ink";import Ze,{useMemo as Ur}from"react";var Lh=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},Ph=(e,t,n)=>Ae.comment({id:e.id,parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.id,props:{value:e.md},readonly:!1,isVirtual:!0});var Oh=e=>e.action==="add.issue.comment";import{Box as Fr,Text as Jt}from"ink";import Be,{useEffect as pN,useMemo as fN,useRef as gN}from"react";import{decodeTime as Dh}from"ulid";var vn=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"},ki=e=>String(e).padStart(2,"0"),hj=e=>`${e.getFullYear()}-${ki(e.getMonth()+1)}-${ki(e.getDate())} ${ki(e.getHours())}:${ki(e.getMinutes())}`;var hN=e=>he(e,"attachments"),yN=e=>R.getAttachmentsByIssue(e.id).sort((t,n)=>Dh(t.id)-Dh(n.id)),Fh=e=>{for(let t of e)R.deleteNode(t.id)},bN=(e,t,n)=>Ae.field({id:e.id,name:e.name,parentNodeId:n,rank:String(t).padStart(6,"0"),isVirtual:!0}),vN=(e,t)=>{let n=R.getNode(hN(e.id));if(!n||!Fe(n))return[];let r=t.map((o,s)=>bN(o,s,n.id)).map(o=>R.createNode(o)).filter(St).map(({value:o})=>o).filter(Fe);return t.length>0&&h().selectedIndex<0&&V.navigate({contextNode:n,selectedIndex:0}),r},xN=e=>`${Math.max(1,Math.round(e/1024))} KB`;function _h({ticket:e,width:t,height:n}){let r=fN(()=>yN(e),[e]),o=gN([]);pN(()=>(Fh(o.current),o.current=vN(e,r),()=>{Fh(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=Pe(),l=Math.max(1,n-4),u=Math.max(12,t-32);return r.length===0?Be.createElement(Fr,{flexDirection:"column",width:t,height:n,padding:1},Be.createElement(Jt,{color:A.primary},"No attachments yet."),Be.createElement(Fr,{paddingTop:1},Be.createElement(Jt,{color:A.primary},"Attach images from the browser GUI"),Be.createElement(Jt,{color:A.accent}," epiq gui "),Be.createElement(Jt,{color:A.primary},"by dropping or pasting them."))):Be.createElement(Fr,{flexDirection:"column",width:t,height:n},Be.createElement(Fr,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:A.secondary,borderStyle:"single",paddingBottom:1},Be.createElement(Jt,{color:A.secondary2},"Attachments (",r.length,") \u2014 enter to open"," ")),Be.createElement(bt,{height:l,itemHeight:2,selectedIndex:s},r.map((m,p)=>{let f=p===s,g=m.name.length>u?m.name.slice(0,u-1)+"\u2026":m.name;return Be.createElement(Fr,{key:m.id,flexDirection:"row",paddingX:1,paddingBottom:1},Be.createElement(Jt,{color:A.accent},f?"\u276F ":" "),Be.createElement(Fr,{paddingLeft:1},Be.createElement(Jt,{color:A.secondary2},`#${p+1} `),Be.createElement(Jt,{color:f?A.accent:A.primary},g),Be.createElement(Jt,{color:A.secondary2}," "+xN(m.bytes)+" "+vn(kn(m.id)))))})))}import{Box as xn,Text as Rn}from"ink";import Le,{useEffect as wN,useMemo as Wh,useRef as IN}from"react";import{decodeTime as zh}from"ulid";var RN=(e,t)=>{let n=Math.max(1,Math.floor(t)),r=e.split(/\s+/).filter(Boolean);if(r.length===0)return[""];let o=[],s="";for(let i of r){let l=i;for(;l.length>n;)s&&(o.push(s),s=""),o.push(l.slice(0,n)),l=l.slice(n);s?s.length+1+l.length<=n?s=`${s} ${l}`:(o.push(s),s=l):s=l}return s&&o.push(s),o},Jo=e=>{let t=e.split("`");return t.length%2===0?[{text:e}]:t.map((n,r)=>r%2===1?{text:n,code:!0}:{text:n}).filter(n=>n.text.length>0)},EN=/!\[([^\]]*)\]\([^)]*\)/g,SN=e=>e.replace(EN,(t,n)=>n.trim()?`[image: ${n.trim()}]`:"[image]"),CN=e=>e.map(t=>t.code?`\`${t.text}\``:t.text).join(""),NN=4,Li=e=>e.replace(/\r$/,"").replaceAll(" "," ".repeat(NN)),_l=e=>{let t=!1;return e.map(Li).map(n=>{if(/^\s*```/.test(n))return t=!t,{kind:"fence"};if(t)return{kind:"code",text:n};let r=Fo(n);if(r)return{kind:"caption",text:ol(r)};let o=SN(n);if(o.trim()==="")return{kind:"blank"};let s=/^#{1,6}\s+(.*)$/.exec(o);return s?{kind:"heading",spans:Jo(s[1]??"")}:{kind:"text",spans:Jo(o)}})},Bh=(e,t)=>e.length<=t?[e]:e.match(new RegExp(`.{1,${t}}`,"g"))??[""],$h=(e,t)=>{let n=[];for(let r of _l(e))if(r.kind!=="fence"){if(r.kind==="blank"){n.length>0&&n[n.length-1]?.kind!=="blank"&&n.push(r);continue}if(r.kind==="code"){for(let o of Bh(r.text,t))n.push({kind:"code",text:o});continue}if(r.kind==="caption"){n.push(r);continue}for(let o of RN(CN(r.spans),t))n.push({kind:r.kind,spans:Jo(o)})}for(;n.length>0&&n[n.length-1]?.kind==="blank";)n.pop();return n},Uh=(e,t)=>{let n=Fo(e),r=n?$f(e):null;if(!n||r===null)return $h(rl(e).split(`
97
+ `),t);let o=Bf(e),s=r.split(`
98
+ `).map(Li),i=n.side===n.endSide?n.start:void 0,l=i===void 0?0:String(i+s.length-1).length+3;return[...o?[...$h(o.split(`
99
+ `),t),{kind:"blank"}]:[],{kind:"caption",text:ol(n)},...s.flatMap((u,m)=>Bh(u,Math.max(1,t-l)).map((p,f)=>({kind:"code",text:p,number:i===void 0||f>0?void 0:i+m})))]};import{Box as jh,Text as Qn}from"ink";import vt from"react";var Hh=({spans:e,bold:t,wrap:n})=>vt.createElement(Qn,{color:A.primary,bold:t,wrap:n},e.map((r,o)=>r.code?vt.createElement(Qn,{key:o,color:A.yellow},r.text):vt.createElement(Qn,{key:o},r.text))),$l=({line:e,width:t,gutter:n=0,wrap:r})=>{switch(e.kind){case"blank":return vt.createElement(Qn,null," ");case"fence":return vt.createElement(Qn,{color:A.secondary2},"```");case"caption":return vt.createElement(Qn,{color:A.accent,wrap:r},e.text);case"heading":return vt.createElement(Hh,{spans:e.spans,bold:!0,wrap:r});case"text":return vt.createElement(Hh,{spans:e.spans,wrap:r});case"code":{let o=n>0?`${e.number===void 0?"":String(e.number)}`.padStart(n-3)+" \u2502 ":"";return vt.createElement(Qn,{backgroundColor:A.secondary,color:A.primary,wrap:r},o,e.text.padEnd(Math.max(0,t-o.length)))}}},Gh=({lines:e,width:t})=>{let n=e.flatMap(o=>o.kind==="code"&&o.number!==void 0?[o.number]:[]),r=n.length>0?String(Math.max(...n)).length+3:0;return vt.createElement(jh,{flexDirection:"column"},e.map((o,s)=>vt.createElement(jh,{key:s},vt.createElement($l,{line:o,width:t,gutter:r}))))};var AN=4,TN=e=>he(e,"comments"),MN=e=>R.getCommentsByIssue(e.id).sort((t,n)=>zh(t.id)-zh(n.id)).map(t=>({id:t.id,issue:t.issue,authorId:t.authorId,md:t.md})),Vh=e=>{for(let t of e)R.deleteNode(t.id)},kN=(e,t)=>{let n=R.getNode(TN(e.id));if(!n||!Fe(n))return[];let r=t.map((o,s)=>Ph(o,s,n.id)).map(R.createNode).filter(St).map(({value:o})=>o).filter(Kr);return t.length>0&&h().selectedIndex<0&&V.navigate({contextNode:n,selectedIndex:0}),r};function Kh({ticket:e,width:t,height:n}){let r=Wh(()=>MN(e),[e]),o=IN([]);wN(()=>(Vh(o.current),o.current=kN(e,r),()=>{Vh(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=Pe(),l=Math.max(1,n-4),u=Math.max(20,t-8),m=Wh(()=>r.map(f=>{let g=Uh(f.md,u);return g.length>0?g:[{kind:"blank"}]}),[r,u]),p=m.map(f=>f.length+AN);return r.length===0?Le.createElement(xn,{flexDirection:"column",width:t,height:n,padding:1},Le.createElement(Rn,{color:A.primary},"No comments yet."),Le.createElement(xn,{paddingTop:1},Le.createElement(Rn,{color:A.primary},"Use"),Le.createElement(Rn,{color:A.accent}," :comment "),Le.createElement(Rn,{color:A.primary},"to add the first one."))):Le.createElement(xn,{flexDirection:"column",width:t,height:n},Le.createElement(xn,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:A.secondary,borderStyle:"single",paddingBottom:1},Le.createElement(Rn,{color:A.secondary2},"Comments (",r.length,") ")),Le.createElement(bt,{height:l,itemHeights:p,selectedIndex:s},r.map((f,g)=>{let v=g===s;return Le.createElement(xn,{key:f.id,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderRight:!1,borderColor:A.secondary,borderStyle:"single"},Le.createElement(xn,{flexDirection:"row",paddingBottom:1},Le.createElement(Rn,{color:A.accent},v?"\u276F ":" "),Le.createElement(xn,{paddingLeft:1},Le.createElement(Rn,{color:A.secondary2},`#${g+1} `),Le.createElement(Pr,{id:f.authorId}),Le.createElement(Rn,{color:A.secondary2}," "+vn(kn(f.id))))),Le.createElement(xn,{paddingLeft:3,paddingBottom:1},Le.createElement(Gh,{lines:m[g]??[],width:u})))})))}import{Box as Sn,Text as Je}from"ink";import ye,{useEffect as ny,useRef as BN,useState as UN}from"react";import{Box as kt,Text as Zt}from"ink";import Ne,{useEffect as Hl,useMemo as Jh,useRef as ON,useState as DN}from"react";var Pi=(e,t,n)=>{let r=[],o=Ks(()=>{for(let s=0;s<t;s++){let i=lt(BigInt(s+1));if(!St(i))continue;let l=R.createNode(Ae.text({id:n(s),name:`Line ${s+1}`,parentNodeId:e,rank:i.value,readonly:!0,isVirtual:!0}));St(l)&&r.push(l.value)}});return c(o)&&logger.error(`Line nodes: ${o.message}`),r},_r=e=>{R.deleteNodes(e.map(t=>t.id))};import{useSyncExternalStore as LN}from"react";var Di=null,Oi=null,Bl=new Set,qh=()=>{for(let e of Bl)e()},Ul=e=>{Di=e,qh()},Fi=()=>Di,Yh={mark:null},er=e=>{Oi=e,Yh={mark:e},qh()};var jl=e=>Oi&&Oi.sha===e?Oi.row:null,Xh=()=>LN(e=>(Bl.add(e),()=>{Bl.delete(e)}),()=>Yh),En=()=>{let{contextNode:e}=h();return Di&&Di.sha===e.id?e.id:null};import FN from"string-width";var Gl=(e,t)=>`${e}::patch::${t}`,Zh=e=>Li(e).replace(/[\x00-\x1f\x7f-\x9f]/g,"\uFFFD"),_N=e=>{switch(e){case"added":return A.green;case"removed":return A.red;case"hunk":return A.accent;case"file":return A.primary;default:return A.secondary2}},Qh=(e,t)=>{let n=FN(e);return n>=t?e:e+"\xA0".repeat(t-n)},$N=e=>e==="added"?"+":e==="removed"?"-":" ",ey=e=>e.kind==="file"||e.kind==="hunk"||e.kind==="note"||e.newLine===void 0?"":String(e.newLine);function ty({ticket:e,sha:t,repo:n,subject:r,width:o,height:s}){let[i,l]=DN({state:"loading"});Hl(()=>{let L=!0;return l({state:"loading"}),nl({sha:t,repo:n}).then(B=>{L&&l(c(B)?{state:"failed",message:B.message}:{state:"loaded",rows:al(il(B.value))})}),()=>{L=!1}},[t,n]);let u=i.state==="loaded"?i.rows:null,m=u!==null&&u.length>4e3,p=ON([]);Hl(()=>(_r(p.current),p.current=u&&!m?Pi(t,u.length,L=>Gl(t,L)):[],()=>{_r(p.current),p.current=[]}),[t,u,m]),Hl(()=>(Ul(u?{sha:t,rows:u}:null),er(null),()=>{Ul(null),er(null)}),[t,u]);let{selectedIndex:f}=Pe(),{mark:g}=Xh(),v=Jh(()=>u?cl(u,R.getCommentsByIssue(e.id),t):new Set,[u,t,e]),w=g&&g.sha===t?g.row:null,x=L=>w!==null&&L>=Math.min(w,f)&&L<=Math.max(w,f),E=Jh(()=>u?Math.max(5,u.reduce((L,B)=>Math.max(L,ey(B).length),0)+2):5,[u]),N=Math.max(1,s-4),S=Math.max(8,o-E-6);if(i.state!=="loaded")return Ne.createElement(kt,{flexDirection:"column",width:o,height:s,padding:1},Ne.createElement(Zt,{color:A.primary},i.state==="loading"?"Reading the diff\u2026":`Could not read the diff: ${i.message}`));let k=L=>Ne.createElement(kt,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:A.secondary,borderStyle:"single",paddingBottom:1},Ne.createElement(Zt,{color:A.secondary2,wrap:"truncate-end"},Pn(`${t.slice(0,7)} ${r} \u2014 ${L}`,Math.max(8,o-6))));return i.rows.length===0?Ne.createElement(kt,{flexDirection:"column",width:o,height:s},k("no changes"),Ne.createElement(kt,{paddingX:1},Ne.createElement(Zt,{color:A.primary},"This commit changed no files."))):m?Ne.createElement(kt,{flexDirection:"column",width:o,height:s},k("too large to draw here"),Ne.createElement(kt,{paddingX:1,flexDirection:"column"},Ne.createElement(Zt,{color:A.primary},`${i.rows.length.toLocaleString()} lines of diff.`),Ne.createElement(Zt,{color:A.secondary2},"Press o to open it in your editor."))):Ne.createElement(kt,{flexDirection:"column",width:o,height:s},k(w===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"),Ne.createElement(bt,{scrollByOne:!0,height:N,selectedIndex:f,itemHeight:1},i.rows.map((L,B)=>{let M=B===f,P=_N(L.kind);if(L.kind==="file")return Ne.createElement(kt,{key:Gl(t,B),paddingX:1},Ne.createElement(Zt,{backgroundColor:A.secondary,color:M?A.accent:P,bold:!0,wrap:"truncate-end"},Qh(` ${Pn(Zh(L.text),S)}`,S+E+1)));let $=x(B),de=`${$N(L.kind)}${Pn(Zh(L.text),S)}`;return Ne.createElement(kt,{key:Gl(t,B),paddingX:1},Ne.createElement(kt,{flexShrink:0},Ne.createElement(Zt,{color:M||$?A.accent:A.secondary2,dimColor:!M&&!$,wrap:"truncate-end"},`${M?"\u276F":"\xA0"}${$?"\u258C":"\xA0"}${ey(L).padStart(E-2,"\xA0")}`)),Ne.createElement(kt,{flexShrink:0},Ne.createElement(Zt,{color:A.yellow,wrap:"truncate-end"},v.has(B)?"\u2502":"\xA0")),Ne.createElement(Zt,{color:M?A.accent:P,backgroundColor:M||$?A.secondary:void 0,wrap:"truncate-end"},M||$?Qh(de,S+1):de))})))}var jN=e=>he(e,"diff"),ry=e=>{for(let t of e)R.deleteNode(t.id)},HN=(e,t,n)=>Ae.field({id:e.sha,name:e.subject,parentNodeId:n,rank:String(t).padStart(6,"0"),childRenderAxis:"vertical",isVirtual:!0}),GN=(e,t)=>{let n=R.getNode(jN(e.id));if(!n||!Fe(n))return[];let r=t.map((o,s)=>HN(o,s,n.id)).map(o=>R.createNode(o)).filter(St).map(({value:o})=>o).filter(Fe);return t.length>0&&h().selectedIndex<0&&h().contextNode.id===n.id&&V.navigate({contextNode:n,selectedIndex:0}),r},WN=e=>`+${e.insertions} -${e.deletions}`;function oy({ticket:e,width:t,height:n}){let[r,o]=UN({state:"loading"}),s=it(e.id);ny(()=>{let x=!0;return o({state:"loading"}),Fc({ref:s}).then(E=>{if(!x)return;let N=At();o(c(E)?{state:"failed",message:E.message}:{state:"loaded",commits:E.value,labels:c(N)?new Map:Nc(N.value)})}),()=>{x=!1}},[s]);let i=BN([]),l=r.state==="loaded"?r.commits:null,u=r.state==="loaded"?r.labels:null;ny(()=>(ry(i.current),i.current=l?GN(e,l):[],()=>{ry(i.current),i.current=[]}),[e,l]);let{selectedIndex:m,contextNode:p}=Pe(),f=l?.find(x=>x.sha===p.id)??null,v=Math.max(1,n-4),w=Math.max(12,t-34);return r.state!=="loaded"?ye.createElement(Sn,{flexDirection:"column",width:t,height:n,padding:1},ye.createElement(Je,{color:A.primary},r.state==="loading"?"Reading commits\u2026":`Could not read commits: ${r.message}`)):f?ye.createElement(ty,{ticket:e,sha:f.sha,repo:f.repo,subject:f.subject,width:t,height:n}):r.commits.length===0?ye.createElement(Sn,{flexDirection:"column",width:t,height:n,padding:1},ye.createElement(Je,{color:A.primary},"No commits reference this ticket."),ye.createElement(Sn,{paddingTop:1},ye.createElement(Je,{color:A.primary},"Link one with an"),ye.createElement(Je,{color:A.accent},` Epiq-Ref: ${s} `),ye.createElement(Je,{color:A.primary},"line in its body,")),ye.createElement(Sn,null,ye.createElement(Je,{color:A.primary},"or a"),ye.createElement(Je,{color:A.accent},` ${s} `),ye.createElement(Je,{color:A.primary},"prefix on its subject."))):ye.createElement(Sn,{flexDirection:"column",width:t,height:n},ye.createElement(Sn,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:A.secondary,borderStyle:"single",paddingBottom:1},ye.createElement(Je,{color:A.secondary2},`Diff (${r.commits.length}) \u2014 enter to read, o to open in your editor `)),ye.createElement(bt,{height:v,itemHeight:2,selectedIndex:m},r.commits.map((x,E)=>{let N=E===m,S=x.subject.length>w?x.subject.slice(0,w-1)+"\u2026":x.subject;return ye.createElement(Sn,{key:x.sha,flexDirection:"row",paddingX:1,paddingBottom:1},ye.createElement(Je,{color:A.accent},N?"\u276F ":" "),ye.createElement(Sn,{paddingLeft:1},ye.createElement(Je,{color:A.secondary2},`${x.sha.slice(0,7)} `),x.repo&&ye.createElement(Je,{color:A.secondary2},`[${u?.get(x.repo)??Wr(x.repo)}] `),ye.createElement(Je,{color:N?A.accent:A.primary},S),ye.createElement(Je,{color:A.secondary2},` ${WN(x)} ${vn(x.time)}`)))})))}import{Box as _i,Text as zN}from"ink";import Qt from"react";var sy=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:r}=Pe(),{title:o}=t,s=t.parentNodeId?R.getNode(t.parentNodeId):void 0,i=s&&j(s)?o===ge.ASSIGNEES?s.props.assignees??[]:o===ge.TAGS?(s.props.tags??[]).filter(l=>R.getTag(l)):[]:[];return Qt.createElement(_i,{alignItems:"center",paddingTop:1},Qt.createElement(_i,{minWidth:12},Qt.createElement(yt,{isSelected:n}),Qt.createElement(zN,{color:n?A.accent:A.secondary2},o,":")),Qt.createElement(_i,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((l,u)=>{let m=r.id===t.id&&u===e;return Qt.createElement(_i,{key:`${o}-${l}`,paddingRight:2,minHeight:1},Qt.createElement(yt,{isSelected:m}),o===ge.ASSIGNEES?Qt.createElement(Pr,{isSelected:m,id:l}):o===ge.TAGS?Qt.createElement(Ti,{isSelected:m,id:l}):null)})))};import{Box as $r,Text as Vl}from"ink";import xt,{useEffect as VN,useMemo as Kl,useRef as KN}from"react";var Wl=e=>Math.max(5,String(Math.max(e,1)).length+3),iy=(e,t)=>Math.max(0,e-6-Wl(t));var zl=(e,t=0,n=0)=>Math.max(1,e-5-2*t-(n>0?1+n:0));var qN="\u2029",ay=(e,t)=>`${e}::inline-line::${t}`,ql=({id:e,label:t,text:n,rows:r,selected:o,maxWidth:s})=>{let{selectedIndex:i,contextNode:l}=Pe(),u=Kl(()=>typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[],[n]),m=Kl(()=>u.join("\0"),[u]),p=KN([]);VN(()=>(_r(p.current),p.current=Pi(e,u.length,x=>ay(e,x)),()=>{_r(p.current),p.current=[]}),[e,m]);let f=Wl(u.length),g=iy(s,u.length),w=Kl(()=>_l(u).map(x=>{if(x.kind==="code"||x.kind==="caption")return{...x,text:Pn(x.text,g)};if(x.kind==="text"||x.kind==="heading"){let E=x.spans.map(N=>N.code?`\`${N.text}\``:N.text).join("");return{...x,spans:Jo(Pn(E,g))}}return x}),[u,g]).map((x,E)=>{let N=l.id===e&&i===E;return xt.createElement($r,{key:ay(e,E)},xt.createElement($r,{flexShrink:0},xt.createElement(Vl,{color:N?A.primary:A.secondary2,dimColor:!N},`${E+1} `.padStart(f,"\xA0"))),x.kind==="blank"?xt.createElement(Vl,{backgroundColor:N?"gray":void 0},qN):xt.createElement($r,null,xt.createElement($l,{line:x,width:x.kind==="code"?g:0,wrap:"truncate-end"})))});return xt.createElement($r,{flexDirection:"column",paddingTop:1},xt.createElement($r,null,xt.createElement(yt,{isSelected:o}),xt.createElement(Vl,{color:o?A.accent:A.secondary2},t)),xt.createElement($r,{flexDirection:"row",borderStyle:"round",borderColor:A.secondary,paddingLeft:1,marginLeft:1,overflowY:"hidden"},xt.createElement(bt,{scrollByOne:!0,height:r,selectedIndex:i,itemHeight:1},w)))};var XN=e=>he(e,"description"),JN=e=>he(e,"comments"),ZN=e=>he(e,"history"),QN=e=>he(e,"diff"),ew=e=>he(e,"attachments"),cy=({ticket:e,height:t})=>{let n=Ur(()=>Lh(e),[e]),{selectedIndex:r,contextNode:o}=Pe(),s=process.stdout.columns||120,i=Ur(()=>XN(e.id),[e.id]),l=Ur(()=>JN(e.id),[e.id]),u=Ur(()=>ZN(e.id),[e.id]),m=Ur(()=>QN(e.id),[e.id]),p=Ur(()=>ew(e.id),[e.id]),f=R.getAttachmentsByIssue(e.id).length,g=o.id===e.id,v=o.id===l||o.parentNodeId===l,w=o.id===u||o.parentNodeId===u,x=o.id===p||o.parentNodeId===p,E=o.id===m||o.parentNodeId===m,N=le(e.id);if(v){let F=t-3;return Ze.createElement(Br,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Ze.createElement(Kh,{ticket:e,width:s,height:F}))}if(x){let F=t-3;return Ze.createElement(Br,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Ze.createElement(_h,{ticket:e,width:s,height:F}))}if(E){let F=t-3;return Ze.createElement(Br,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Ze.createElement(oy,{ticket:e,width:s,height:F}))}if(w){let U=R.getNode(u),F=U&&Fe(U)?U.props.value??"":"",Re=zl(t);return Ze.createElement(Br,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},U?Ze.createElement(ql,{id:U.id,label:"Event log",text:F,selected:!1,maxWidth:s,rows:Re}):null)}let S=[u,m,l,p],k=U=>S.includes(U),L=N.reduce((U,F)=>zr(F)?U+1:U,0),B=N.reduce((U,F)=>k(F.id)?U+1:U,0),M=N.findIndex(U=>k(U.id)),P=zl(t,L,B),$=(U,F,Re,en)=>Ze.createElement(Br,{key:U.id,paddingTop:F===M?1:0},Ze.createElement(yt,{isSelected:Re}),Ze.createElement(YN,{backgroundColor:A.secondary,color:Re?A.accent:A.primary},en)),de=(U,F,Re)=>U.id===i?Ze.createElement(ql,{key:U.id,id:i,label:"Description (press e to edit)",text:e.props.description??"",selected:F,maxWidth:s,rows:P}):zr(U)?Ze.createElement(sy,{key:U.id,parent:U,selected:F,selectedIndex:r}):U.id===l?$(U,Re,F,` Comments (${n}) \u203A\u203A `):U.id===p?$(U,Re,F,` Attachments (${f}) \u203A\u203A `):U.id===u?$(U,Re,F," History \u203A\u203A "):U.id===m?$(U,Re,F," Diff \u203A\u203A "):null;return Ze.createElement(Br,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},N.map((U,F)=>de(U,g&&r===F,F)))};var nw=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:s,height:i,width:l})=>{let u=t.context,m=u===re.TICKET||u===re.FIELD_LIST||u===re.FIELD,p=u===re.BOARD||u===re.SWIMLANE,f=u===re.TICKET?t:r.find(E=>E.context===re.TICKET),g=Math.floor(l/3),v=Math.floor(l/Math.max(e.length,1)),w=Math.min(v,g),x=s==="dense";return $i.createElement(tw,{flexDirection:"row",height:i},p&&e.map((E,N)=>{let S=t.id===E.id,k=S?n:-1,L=t.context===re.BOARD&&n===N;return $i.createElement(kh,{key:E.id,height:i,width:w,swimlane:E,isSelected:L,isDense:x,isFocused:S,listSelectedIndex:k,mode:o})}),m&&f&&$i.createElement(cy,{height:i,ticket:f}))},ly=$i.memo(nw);import{render as sw}from"ink";import{Writable as iw}from"node:stream";var Zo=e=>String(e).padStart(2,"0"),aw=e=>{let t=e.getUTCFullYear(),n=Zo(e.getUTCMonth()+1),r=Zo(e.getUTCDate()),o=Zo(e.getUTCHours()),s=Zo(e.getUTCMinutes()),i=Zo(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${s}-${i}`},cw=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",lw=async(e,{width:t,height:n})=>{let r="",o=new iw({write(i,l,u){let m=dw(i.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),u()}});o.columns=t,o.rows=n,o.isTTY=!0;let s=sw(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(i=>setTimeout(i,0)),s.unmount(),r},dw=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),uy=async()=>{let{viewMode:e}=ne(),{contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:s}=h(),i=r.find(N=>N.context==="BOARD");if(!i)return a("No board found to export");let l=120,u=40,m=await lw(ow.createElement(ly,{height:u,width:l,swimlanes:(s[i.id]??[]).filter(N=>N!==void 0&&rt(N)),contextNode:t,selectedIndex:n,breadCrumb:r,viewMode:e??"dense",mode:o}),{width:l,height:u});if(!m)return a("Failed to render board export");let p=hs(process.cwd());if(c(p))return a("Unable to export, epiq root not found");let f=new Date,g=aw(f),v=`board_${cw(i.title)}_${g}.md`,w=_u(p.value);dy.mkdirSync(w,{recursive:!0});let x=rw.join(w,v),E=`# Board - ${i.title}
100
+ Date: ${f.toISOString()}
101
+
102
+ \`\`\`text
103
+ ${m}
104
+ \`\`\`
105
+ `;return dy.writeFileSync(x,E,"utf8"),d("Exported board layout",x)};import{useSyncExternalStore as lG}from"react";var Bi,uw=new Set,my=()=>{for(let e of uw)e()};var jr=()=>{if(!Bi)throw new Error("Ui state not initialized. Call initUiState() first.");return Bi};var mG=(e={})=>(Bi=e,my(),d("UX state initialized",null)),mw=e=>{let t=jr();return Bi=e(t),my(),d("UX state updated",null)},Cn=e=>mw(t=>({...t,...e}));import{ulid as Ui}from"ulid";var py=async e=>{let{contextNode:t,selectedIndex:n}=h(),r=le(t.id)[n];if(e.modifier===pt.DESCRIPTION){let{breadCrumb:o,selectedNode:s}=h();return[...o,s].some(l=>l&&j(l))?fw():gw()}if(r&&Kr(r))return pw(e);if(e.modifier===pt.TITLE){let o=te();if(c(o))return a("Unable to resolve user ID");let s=r;if(!s)return a("Missing node");if(s.readonly)return a("Cannot rename readonly node");let i=e.inputString.trim();if(!i)return a("Provide a title");let l=await ae();return c(l)?l:Y([{id:Ui(),action:"edit.title",payload:{id:s.id,name:i},...Q(o.value)}],l.value)}return a("Unknown edit command")},pw=async e=>{let t=te();if(c(t))return a("Unable to resolve user ID");let{contextNode:n,selectedIndex:r}=h(),o=le(n.id)[r];if(!o||!Kr(o))return a("Select a comment first");if(o.readonly)return a("Cannot edit readonly comment");let s=n.parentNodeId;if(!s)return a("Unable to resolve comment issue");let i=h().nodes[s];if(!i||!j(i))return a("Unable to resolve comment issue");if(i.readonly)return a("Cannot edit readonly issue");let l=o.id.split(":").at(0)??"",u=R.getComment(l);if(!u||u.deleted)return a("Unable to resolve comment");if(u.issue!==i.id)return a("Comment does not belong to selected issue");if(u.authorId!==t.value.userId)return a("You can only edit your own comments"+u.authorId+"<->"+t.value.userId);let m=e.inputString.trim();if(!m)return a("Provide a comment");let p=await ae();if(c(p))return p;let f=p.value;return Y([{id:Ui(),action:"edit.issue.comment",payload:{id:u.id,issue:i.id,md:m},...Q(t.value)}],f)},fw=async()=>{let e=te();if(c(e))return a("Unable to resolve user ID");let t=await ae();if(c(t))return t;let n=t.value,{breadCrumb:r,selectedNode:o}=h(),s=tt([...r,o],"TICKET");if(c(s))return a("Edit target must be an issue");let i=s.value;if(!j(i))return a("Edit target must be an issue");if(i.readonly)return a("Cannot edit readonly issue");let l=le(i.id).find(f=>f.title===ge.DESCRIPTION);if(!l)return a("No target found");if(l.readonly)return a("Cannot edit readonly field");let u=i.props.description??"";if(typeof u!="string")return a("Selected field is not editable text");let m=ml(u);if(c(m))return a("Failed to edit field");let p=m.value;return p===u?d("No changes made",null):Y([{id:Ui(),action:"edit.description",payload:{id:i.id,md:p},...Q(e.value)}],n)},gw=async()=>{let e=te();if(c(e))return a("Unable to resolve user ID");let{selectedNode:t}=h();if(!t||!(Vr(t)||rt(t)))return a("Edit target must be an issue, swimlane or board");if(t.readonly)return a("Cannot edit readonly node");let n=t.props?.description??"",r=ml(n);if(c(r))return a("Failed to edit field");let o=sg(r.value);if(o===n)return d("No changes made",null);let s=Vr(t)?"board":"swimlane",i=ig(s==="board"?"Board description":"Swimlane description",o,og(s));if(i)return a(i);let l=await ae();return c(l)?l:Y([{id:Ui(),action:"edit.description",payload:{id:t.id,md:o},...Q(e.value)}],l.value)};import yw from"node:fs";import Xl from"node:path";import Yl from"node:fs";import hw from"node:path";var fy=async e=>{let t=hw.join(e,".gitignore"),n=Yl.existsSync(t)?Yl.readFileSync(t,"utf8"):"",r=[".epiq/events/",".epiq/log/"],o=n.split(`
106
+ `).map(u=>u.trim()),s=r.filter(u=>!o.some(m=>m===u||m===u.replace(/\/$/,"")||m==="/"+u||m==="/"+u.replace(/\/$/,"")));if(s.length===0)return d("Local epiq paths already ignored",!1);let l=["# [epiq]: local hydrated state is never committed",...s].join(`
107
+ `);return n=n.trimEnd()+`
108
+
109
+ ${l}
110
+ `,Yl.writeFileSync(t,n,"utf8"),K.info(`Added ${s.join(", ")} to .gitignore (epiq local state)`),d("Local epiq paths ignored",!0)};var bw=async e=>{let t=await _({cwd:e,args:["status","--porcelain"]});return c(t)?t:d("Checked git diff",t.value.stdout.split(`
111
+ `).filter(n=>n.trim().length>0).map(n=>n.slice(3)))},oe=(e,t)=>a(`[${e}] ${t}`),gy=async({cwd:e,user:t})=>{let n=Es(),r=await It(e);if(c(r))return oe(1,r.message);let o=r.value,s=await yu(o);if(c(s))return oe(2,s.message);if(s.value)return oe(2,`Cannot initialize Epiq while a git operation is in progress: ${s.value}`);let i=await bw(o);if(c(i))return oe(2.5,i.message);if(i.value.length>0)return oe(3,`Cannot initialize Epiq with uncommitted changes (${i.value.join(", ")}). Commit or stash your changes first.`);if(ro(o))return oe(4,"Epiq project already initialized");let{userId:l,userName:u}=t;if(!l||!u)return oe(5,"Missing Epiq user id");let m=await ah(o);if(c(m))return oe(6,m.message);let p=n.stateBranch,f=await vs({repoRoot:o,branch:p});if(c(f))return oe(6,f.message);if(f.value)return oe(6,`State branch already exists: ${p}`);let g=await vw({repoRoot:o,stateBranch:p});if(c(g))return oe(6,g.message);if(g.value)return xw({repoRoot:o,stateBranch:p});let v=await Al({repoRoot:o,stateBranchName:p});if(c(v))return oe(6,v.message);let w=Qr();if(c(w))return oe(7,w.message);let x=Xl.join(On(),n.projectId),E=await kr({repoRoot:o,stateBranchRoot:x,stateBranchName:p});if(c(E))return oe(8,E.message);let N=Xl.join(x,".epiq");yw.mkdirSync(N,{recursive:!0});let S=Yg({userId:l,userName:u});if(c(S))return oe(9,S.message);for(let Xb of S.value){let md=Rp({event:Xb,rootDir:x});if(c(md))return oe(9,md.message)}let k=Er({userId:l}),L=Hs(x,k);if(c(L))return oe(9,L.message);let B=Il(x,n);if(c(B))return oe(9,B.message);let M=await Ci({stateBranchRoot:x,eventFileName:k});if(c(M))return oe(10,M.message);let P=await fe.stage({cwd:x,pathspec:[_e]});if(c(P))return oe(10,P.message);let $=await ur({cwd:x,message:"[epiq:init]"});if(c($))return oe(10,$.message);let de=await fy(o);if(c(de))return oe(11,de.message);let U=Da({repoRoot:o,fileContents:n});if(c(U))return oe(12,U.message);let F=await fe.stage({cwd:o,pathspec:[".epiq/project.json",".gitignore"]});if(c(F))return oe(13,F.message);let Re=await fe.commit({cwd:o,message:"[epiq:init-project]",pathspec:[".epiq/project.json",".gitignore"]});if(c(Re))return oe(13,Re.message);let en=[],dd=await _({cwd:o,args:["push","-u","origin","HEAD"]});c(dd)&&en.push(`[init:14] ${dd.message}`);let ud=await Ko({repoRoot:o,stateBranchRoot:x});return c(ud)&&en.push(`[init:15] ${ud.message}`),d("Project initialized",{repoRoot:o,projectId:n.projectId,stateBranch:p,stateBranchRoot:x,defaultEvents:S.value,warnings:en})},vw=async({repoRoot:e,stateBranch:t})=>{let n=await Gt({repoRoot:e});if(c(n))return a(n.message);if(!n.value)return d("No remote",!1);let r=await Yr({repoRoot:e,branch:t});return c(r)?a(`Could not ask origin whether ${t} exists: ${r.message}`):r},xw=async({repoRoot:e,stateBranch:t})=>{let n=await _({cwd:e,args:["fetch","origin",t]});if(c(n))return oe(6,n.message);let r=await _({cwd:e,args:["show",`origin/${t}:${_e}`]});if(c(r))return oe(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",`${_e} from a checkout that has it, for example:`,"",` git show origin/main:${_e} > ${_e}`,"","and commit it; every later boot then stamps the branch, and the next clone adopts it."].join(`
112
+ `));let o;try{o=JSON.parse(r.value.stdout)}catch(w){return oe(6,`The identity on origin/${t} is not readable: ${w instanceof Error?w.message:String(w)}`)}let s=Da({repoRoot:e,fileContents:o});if(c(s))return oe(12,s.message);let i=await fe.stage({cwd:e,pathspec:[_e]});if(c(i))return oe(13,i.message);let l=await fe.commit({cwd:e,message:"[epiq:adopt-project]",pathspec:[_e]});if(c(l))return oe(13,l.message);let u=Qr();if(c(u))return oe(7,u.message);let m=Xl.join(On(),o.projectId),p=await Tl({repoRoot:e,stateBranchName:t});if(c(p))return oe(8,p.message);let f=await kr({repoRoot:e,stateBranchRoot:m,stateBranchName:t});if(c(f))return oe(8,f.message);let g=[],v=await _({cwd:e,args:["push","-u","origin","HEAD"]});return c(v)&&g.push(`[init:14] ${v.message}`),d("Adopted the project origin already holds",{repoRoot:e,projectId:o.projectId,stateBranch:o.stateBranch,stateBranchRoot:m,defaultEvents:[],warnings:g})};var Qo=(e,t)=>a(`[${e}] ${t}`),hy=async()=>{X("");let e=co();if(!e.isSetupDone||!e.userName)return Qo(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let t=ne(),n=t.userName,r=t.userId;if(!r||!n)return Qo(5,"Missing Epiq user id");let o=await gy({cwd:process.cwd(),user:{userId:r,userName:n}});if(c(o))return o;let s="Project initialized!";for(let g of o.value.warnings)s+=` Warn: ${g}`;let l=un(o.value.defaultEvents).filter(c);if(l.length>0)return Qo(16,l.map(g=>g.message).join(`
113
+ `));let u=pe();if(c(u))return Qo(16,u.message);let{rootNodeId:m,nodes:p}=u.value,f=p[m];return f?(V.navigate({contextNode:f,selectedIndex:0}),I({hasProjectDefinition:!0}),d(s,null)):Qo(16,"Unable to resolve initialized root node")};import{ulid as Ew}from"ulid";import{ulid as Rw}from"ulid";var yy=null,Lt=()=>structuredClone(yy),es=e=>{yy=e},by=()=>{let{contextNode:e,selectedIndex:t}=h(),r=be(e.id)[t];return r?d("Resolved selected child",r):a("Target node not found")},Jl=({id:e,parentId:t,position:n={at:"end"}})=>{let r=be(t).filter(o=>o.id!==e);return gi(r,n)},vy=({id:e,parentId:t,position:n={at:"end"}})=>{let r=te();if(c(r))return a("Unable to resolve user ID");let o=Jl({parentId:t,id:e,position:n});return c(o)?o:d("Created pending move state",{id:Rw(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value.rank}})},xy=e=>{es(e);let t=So(e,!0);return c(t)?t:d("Node moved successfully",t.value)};function Zl(e){let t=by();if(c(t))return t;let{contextNode:n,nodes:r}=h();if(!n.parentNodeId)return a("Missing parent node id");let o=r[n.parentNodeId];if(!o)return a("Missing parent node");let s=be(o.id),i=s.findIndex(({id:m})=>m===n.id);if(i<0)return a("Current node not found among siblings");let l=s[i+e];if(!l)return a("Missing sibling node");let u=vy({id:t.value.id,parentId:l.id,position:{at:"end"}});return c(u)?u:xy(u.value)}function ts(e,t=1){let n=by();if(c(n))return n;let{contextNode:r,selectedIndex:o}=h(),s=be(r.id),i=Math.min(Math.max(o+e*t,0),s.length-1),l=i===o?void 0:s[i];if(!l)return a("Missing sibling node");let u=vy({id:n.value.id,parentId:r.id,position:{at:e===1?"after":"before",sibling:l.id}});return c(u)?u:xy(u.value)}var Ry=()=>{let e=Lt();if(!e)return a("No pending move state");let t=e.payload.id,n=e.payload.parent,r=h().nodes[n];if(!r)return a("Move parent not found");let o=be(n).findIndex(s=>s.id===t);return o===-1?a("Moved node not found among rendered children"):(V.navigate({contextNode:r,selectedIndex:o}),d("Synchronized navigation to moved node",null))},Hr=(e,t="Moved preview")=>{if(c(e))return Lt()&&I({mode:y.MOVE}),e;let n=Ry();return c(n)?n:(I({mode:y.MOVE}),d(t,null))},Ey=async()=>{let e=te();if(c(e))return a("Unable to resolve user ID");let{modifier:t}=q().commandMeta,{contextNode:n,selectedIndex:r}=h(),o=be(n.id)[r];if(!o)return I({mode:y.DEFAULT}),a("No move target");if(t==="start"){if(o.readonly)return a("Target node is read-only");if(r===-1)return a("No item selected");if(!o.parentNodeId)return a("Target has no parent");let s=be(o.parentNodeId),i=s.findIndex(({id:f})=>f===o.id);if(i===-1)return a("Target not found among siblings");let l=s[i-1],u=s[i+1],m=u!=null?{at:"before",sibling:u.id}:l!=null?{at:"after",sibling:l.id}:{at:"start"},p=Jl({parentId:o.parentNodeId,id:o.id,position:m});return c(p)?p:(es({id:Ew(),action:"move.node",payload:{id:o.id,parent:o.parentNodeId,rank:p.value.rank},...Q(e.value)}),I({mode:y.MOVE}),d("Move initialized",null))}if(t==="next")return Hr(ts(1));if(t==="previous")return Hr(ts(-1));if(t==="jump-next")return Hr(ts(1,Ho));if(t==="jump-previous")return Hr(ts(-1,Ho));if(t==="to-next")return Hr(Zl(1));if(t==="to-previous")return Hr(Zl(-1));if(t==="confirm"){let s=Lt();if(!s)return a("No pending move to confirm");let i=await ae();if(c(i))return i;let l=Y([s],i.value);if(c(l))return l;let u=Ry();return c(u)?u:(es(null),I({mode:y.DEFAULT}),d("Moved item",null))}return t==="cancel"?(es(null),I({mode:y.DEFAULT}),d("Cancelling move",null)):a("Invalid move modifier")};import{ulid as ji}from"ulid";import{monotonicFactory as Sw,ulid as Cw}from"ulid";var Nw=Sw(),Sy=({name:e,parent:t,rank:n,user:{userId:r}})=>{let o=Nw();return d("Created issue events",[{id:Cw(),userId:r,action:"add.issue",payload:{id:o,parent:t,name:e,rank:n}}])};var Cy=async(e,t)=>{let n=te();if(c(n))return a("Unable to resolve user ID");let r=await ae();if(c(r))return r;let o=r.value;if(!t.inputString)return a(`provide a name for your ${t.modifier}`);let{breadCrumb:s,contextNode:i,selectedIndex:l}=h(),u=m=>{let p=Y([m],o);if(c(p))return p;let f=R.getNode(p.value[0].result.id);if(!f)return a("Created node not found");if(!f.parentNodeId)return p;let g=R.getNode(f.parentNodeId);return g?(V.navigate({contextNode:g,selectedIndex:R.getSiblings(f.parentNodeId).findIndex(({id:v})=>v===f.id)}),p):a("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:m}=h(),p=R.getNode(m);if(!p)return a("Workspace not found");let f=yi(p.id,n.value,o);return c(f)?f:u({id:ji(),action:"add.board",payload:{id:ji(),name:t.inputString,parent:p.id,rank:f.value},...Q(n.value)})}if(t.modifier==="swimlane"){let m=tt(s,"BOARD");if(c(m))return a("Unable to add swimlane in this context");let p=yi(m.value.id,n.value,o);return c(p)?p:u({id:ji(),action:"add.swimlane",payload:{id:ji(),name:t.inputString,parent:m.value.id,rank:p.value},...Q(n.value)})}if(t.modifier==="issue"){let m=le(i.id)[l],p=i.context==="SWIMLANE"?i:i.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let S=tt(s,"SWIMLANE");return c(S)?null:S.value})();if(!p)return a("Unable to add issue in this context");let f=yi(p.id,n.value,o);if(c(f))return f;let g=Sy({name:t.inputString,parent:p.id,rank:f.value,user:n.value});if(c(g))return g;let v=g.value,w=Y([...v],o);if(c(w))return w;if(!w.value[0])return a("Issue creation failed");let N=v.find(S=>S.action==="add.issue")?.payload.id;return N?(V.navigate({contextNode:p,selectedIndex:R.getSiblings(p.id).findIndex(({id:S})=>S===N)}),d("Issue created",null)):a("Unable to determine ticket id")}return d("Success",null)};import Dw from"node:os";import Ly from"node:path";import ns from"node:fs";import ww from"node:path";import{z as tr}from"zod";var rs="command-history.json",Iw=20,Aw=tr.object({projectId:tr.string().min(1),commands:tr.array(tr.string()),lastUsedAt:tr.number().finite()}),Tw=tr.object({projects:tr.array(Aw)}),Ny=()=>{let e=_o();return c(e)?e:d("Resolved command history path",ww.join(e.value,rs))},Mw=()=>{try{let e=Ee(process.cwd());return c(e)?null:e.value}catch{return null}},wy=e=>{if(!ns.existsSync(e))return d("No command history recorded",{state:"read",projects:[]});let t;try{t=ns.readFileSync(e,"utf8")}catch(o){return a(`Unable to read ${rs}: ${o instanceof Error?o.message:String(o)}`)}let n;try{n=JSON.parse(t)}catch(o){return d("Unparsable command history",{state:"corrupt",reason:`Invalid ${rs}: ${o instanceof Error?o.message:String(o)}`})}let r=Tw.safeParse(n);return r.success?d("Read command history",{state:"read",projects:r.data.projects}):d("Command history in an unknown shape",{state:"corrupt",reason:`Invalid ${rs} shape: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`})},Iy=({root:e})=>{let t=Ot(e);if(c(t))return a(t.message);let n=Ny();if(c(n))return n;let r=wy(n.value);if(c(r))return r;let o=r.value;if(o.state==="corrupt")return a(o.reason);let s=o.projects.find(i=>i.projectId===t.value);return d("Read command history",s?.commands.slice(0,Bo)??[])},Ay=({commands:e,root:t=Mw(),now:n=Date.now()})=>{if(t===null)return d("No project; command history not stored",null);let r=Ot(t);if(c(r))return a(r.message);let o=Ny();if(c(o))return o;let s=o.value,i=wy(s);if(c(i))return i;let l=i.value,u=l.state==="read"?l.projects:[],m=[{projectId:r.value,commands:e.slice(0,Bo),lastUsedAt:n},...u.filter(f=>f.projectId!==r.value)].sort((f,g)=>g.lastUsedAt-f.lastUsedAt).slice(0,Iw),p=`${s}.${process.pid}.tmp`;try{ns.writeFileSync(p,JSON.stringify({projects:m},null,2)+`
114
+ `,"utf8"),ns.renameSync(p,s)}catch(f){try{ns.rmSync(p,{force:!0})}catch{}return a(`Unable to write ${rs}: ${f instanceof Error?f.message:String(f)}`)}return d("Stored command history",null)};var kw=e=>e.some(t=>t.action==="init.workspace"),Ty=async(e,t)=>{let n=wt(e);return c(n)?a(n.message):Jr({cwd:t,branch:n.value})},Lw=e=>{let t=Ee(process.cwd());if(c(t))return!1;let n=ve({repoRoot:t.value});return!c(n)&&n.value===e},Ql=!1,Iz=()=>Ql,My=async e=>{Ql=!0;try{return await Pw(e)}finally{Ql=!1}},Pw=async e=>{let t=ve({repoRoot:e});if(c(t))return Xn(3,t.message);let n=t.value,r=await kr({repoRoot:e,stateBranchRoot:n,stateBranchName:Es().stateBranch});if(c(r))return Xn(3,r.message);let o=Tt(n),s=Co(n);if(c(s))return Xn(3,s.message);if(!kw(s.value.events)){let f=await To({worktreeRoot:n,operation:"boot pull",fn:()=>Ni(n,()=>Ty(e,n))});if(c(f)?logger.info(3,f.message):f.value===null?logger.info(3,"Another process holds the state worktree, skipped pull"):c(f.value)&&logger.info(3,f.value.message),o=Tt(n),s=Co(n),c(s))return Xn(3,s.message)}let{events:i,unreadable:l}=s.value,u=Wo(i,l);if(c(u))return Xn(4,u.message);$s(n,o),I({hasProjectDefinition:!0,hasInitializingEvents:!!i.length});let m=zu({root:e});c(m)&&logger.info(m.message);let p=Iy({root:e});return c(p)&&logger.info(p.message),Ng(c(p)?[]:p.value),d("Loaded project",void 0)},Ow=async e=>{let t=ve({repoRoot:e});if(c(t))return a(t.message);let n=t.value,r=await Gt({repoRoot:n});if(c(r))return a(r.message);if(!r.value)return d("No remote to pull",void 0);let o=await To({worktreeRoot:n,operation:"boot pull",fn:()=>Ni(n,()=>(Ri("Pulling"),Ty(e,n)))});if(c(o))return Te(o.message);if(o.value===null)return d("Another process holds the state worktree",void 0);let s=o.value;if(c(s))return Xr(s.message)?(Ei("Offline"),d("Offline",void 0)):Te(s.message);if(!s.value)return zo("Already synced"),d("Already synced",void 0);if(!Lw(n))return d("Project changed during the pull",void 0);let i=Ml(n);return c(i)?i:(zo("Pulled"),d("Pulled and reloaded",void 0))},ky=e=>{Ow(e).then(t=>{c(t)&&logger.info(3,t.message)}).catch(t=>{logger.error(`[boot] pull failed: ${Jg(t)}`)})},Az=()=>{let e=Wo([]);return c(e)?Xn(4,e.message):(I({hasProjectDefinition:!1,hasInitializingEvents:!1}),d("Booted without a project",void 0))};var Fw=e=>e==="~"||e.startsWith("~/")?Ly.join(Dw.homedir(),e.slice(1)):e,_w=(e,t)=>{let n=e.trim();if(!n)return a("Provide a number from the list or a path to a project");if(/^\d+$/.test(n)){let o=t[Number(n)-1];return o?d("Resolved recent project",o.root):a(`No recent project #${n}`)}let r=Ee(Ly.resolve(Fw(n)));return c(r)?a(`No epiq project at ${n}`):d("Resolved project path",r.value)},Py=async()=>{let e=fi();if(X(""),h().hasProjectDefinition)return a("Already in a project; run epiq from another directory");let t=Cs({exclude:process.cwd()}),n=c(t)?[]:t.value,r=_w(e,n);if(c(r))return a(r.message);let o=r.value,s=process.cwd();try{process.chdir(o)}catch(l){return a(`Unable to enter ${o}: ${l instanceof Error?l.message:String(l)}`)}let i=await My(o);return c(i)?(process.chdir(s),a(i.message)):(ky(o),d(`Opened ${ju(o)}`,null))};var Hi=({boardId:e,targetTime:t,stateBranchRoot:n,selectedIndex:r})=>{let o=h(),s=vp(n,t);if(c(s))return a(s.message);let{appliedEvents:i,unappliedEvents:l}=s.value,u=Nn();if(c(u))return u;let m=un(i),{fatal:p,skipped:f}=Wn(m);if(p.length>0)return Nn(),I(o),a(p.map(v=>v.message).join(", "));zn(f);let g=h().nodes[e];return g?(V.navigate({contextNode:g,selectedIndex:r}),d("",{unappliedEvents:l})):(Nn(),I(o),a("Board did not exist at that date"))};var Oy=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 $w=20,Bw=16,Uw=150,Gi=null,Wi=null;var nr=()=>{Gi!==null&&(clearInterval(Gi),Gi=null),Wi!==null&&(clearTimeout(Wi),Wi=null)},Dy=()=>{nr(),I({mode:y.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null,selectedIndex:0})},Fy=({events:e,startTime:t,durationMs:n})=>{nr();let r=e.length,o=cs(e.map(f=>ls(f))).map(f=>f??t),s=o[r-1]??Date.now(),i=Oy(o),l=Math.max(1,Math.round(n*$w/1e3)),u=Math.max(Math.round(n/l),Bw),m=0,p=0;I({mode:y.DEFAULT,readOnly:!0,timeMode:"replay",unappliedEvents:e,replay:{progress:0,appliedCount:0,totalCount:r,currentTime:t,startTime:t,endTime:s,currentLabel:"",flashNodeIds:[]}}),Gi=setInterval(()=>{m++;let f=m/l,g=[],v,w;for(;p<r&&i[p]<=f;){let E=e[p],N=So(E);if(c(N)){if(Rr(N)){p++;continue}Dy();return}g.push(...xc(E)),v=E,w=o[p],p++}if(p>=r||m>=l){for(;p<r;p++){let N=So(e[p]);if(c(N)&&!Rr(N))break}let E=h().replay;I({unappliedEvents:[],replay:E&&{...E,progress:1,appliedCount:r}}),nr(),Wi=setTimeout(Dy,Uw);return}let x=h().replay;I({unappliedEvents:e.slice(p),replay:{progress:Math.min(1,f),appliedCount:p,totalCount:r,startTime:t,endTime:s,currentTime:v?w??x?.currentTime??t:x?.currentTime??t,currentLabel:v?_y(v):x?.currentLabel??"",flashNodeIds:v?[...new Set(g)]:x?.flashNodeIds??[]}})},u)};var $y=async()=>{let e=tt(h().breadCrumb,"BOARD");if(c(e))return e;let t=await It(process.cwd());if(c(t))return a("Unable to locate repo root");let n=ve({repoRoot:t.value});if(c(n))return n;let{modifier:r,inputString:o}=q().commandMeta;if(nr(),r==="now"){let l=qs(n.value);if(c(l))return a(l.message);let u=Nn();if(c(u))return u;let m=un(l.value),{fatal:p,skipped:f}=Wn(m);return p.length>0?a(p.map(g=>g.message).join(", ")):(zn(f),I({mode:y.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null}),d("Peeking now",!0))}let s;if(r==="prev"||r==="next"){let l=xp(n.value);if(c(l))return l;let u=r==="prev"?h().eventLog.at(-1):h().unappliedEvents.at(0),m=u===void 0?null:ls(u),p=(u===void 0?null:l.value.get(u.id)??null)??(m===null?null:oa(m));if(p===null)return a(r==="prev"?"No previous event to peek":"No next event to peek");s=r==="prev"?p:p+1}else{let l=Fn(r||o.trim());if(!l)return a("Invalid peek date");s=l.getTime()}let i=Hi({boardId:e.value.id,targetTime:s,stateBranchRoot:n.value,selectedIndex:0});return c(i)?i:(I({mode:y.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:i.value.unappliedEvents,replay:null}),d("Peeking",!0))};var By=async()=>{let e=tt(h().breadCrumb,"BOARD");if(c(e))return e;let t=await It(process.cwd());if(c(t))return a("Unable to locate repo root");let n=ve({repoRoot:t.value});if(c(n))return n;let{modifier:r,inputString:o}=q().commandMeta,{dateInput:s,durationInput:i}=Os(r,o);if(nr(),h().syncStatus.status==="syncing")return a("Cannot replay while syncing, try again in a moment");let l=Fn(s);if(!l)return a("Invalid replay date");let u=i?Ps(i):15e3;if(u===null)return a("Invalid replay duration (try e.g. 30s or 2m)");let m=l.getTime(),p=h(),f=Hi({boardId:e.value.id,targetTime:m,stateBranchRoot:n.value,selectedIndex:-1});if(c(f))return f;let{unappliedEvents:g}=f.value;return g.length===0?(Nn(),I(p),d("Nothing to replay from that point",!0)):(Fy({events:g,startTime:m,durationMs:u}),d("Replaying board history",!0))};import{spawn as Hw}from"node:child_process";var Gw=()=>{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"]}}},Uy=async e=>new Promise(t=>{let{command:n,args:r}=Gw();try{let o=Hw(n,r,{stdio:["pipe","ignore","ignore"]});o.on("error",()=>t(a(`Clipboard tool not available (${n})`))),o.on("close",s=>t(s===0?d("Copied to clipboard",null):a(`Clipboard tool failed (${n})`))),o.stdin.on("error",()=>{}),o.stdin.write(e),o.stdin.end()}catch{t(a(`Clipboard tool not available (${n})`))}});var os=async(e,t)=>{if(!e.trim())return a(`Nothing to copy: ${t} is empty`);let n=await Uy(e);return c(n)?n:d(`Copied ${t} to clipboard`,null)},jy=async e=>{let{breadCrumb:t,selectedNode:n}=h(),r=uo({breadCrumb:t,selectedNode:n}),o=r??n;if(!o)return a("Nothing selected to copy from");switch(e.modifier){case Me.REF:return os(it(o.id),"ref");case Me.TITLE:return os(o.title,"title");case Me.DESCRIPTION:return r?os(r.props?.description??"","description"):a("No issue in scope");case Me.TAGS:{if(!r)return a("No issue in scope");let s=on(r).map(({name:i})=>i);return os(s.join(", "),"tags")}case Me.ASSIGNEES:{if(!r)return a("No issue in scope");let s=sn(r).map(({name:i})=>i);return os(s.join(", "),"assignees")}default:return a("Yank one of: ref, title, description, tags, assignees")}};var Hy=async()=>{X(""),I({mode:y.DEFAULT});let e=pe();if(c(e))return a(e.message);if(e.value.syncStatus.status==="syncing")return a("Sync already in progress");I({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await wi();return c(t)?(I({syncStatus:{msg:t.message,status:"failed"}}),t):(I({mode:y.DEFAULT}),t)};import{ulid as Gy}from"ulid";var Wy=async()=>{let e=te();if(c(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=h(),r=le(t.id)[n];if(!r)return a("Unable to resolve child to delete");let o=await ae();if(c(o))return o;if(r.context==="COMMENT"){let s=r.id,i=j(t)?t.id:t.parentNodeId;if(!i)return a("Unable to resolve comment issue");let l=h().nodes[i];if(!l||!j(l))return a("Unable to resolve comment issue");let u=l.log?.filter(Oh).find(m=>m.payload.id===s);return u?u.payload.author!==e.value.userId?a("You can only delete your own comments"):Y([{id:Gy(),action:"delete.issue.comment",payload:{id:s,issue:i},...Q(e.value)}],o.value):a("Unable to resolve comment")}return Y([{id:Gy(),action:"delete.node",payload:{id:r.id},...Q(e.value)}],o.value)};import{ulid as Ww}from"ulid";var zy=async()=>{let e=te();if(c(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=h(),r=le(t.id)[n];if(!r)return a("Unable to close issue, no target found");if(!j(r))return a("Cannot close in this context");let o=h().nodes[mt];if(!o)return a("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return a("Issue is already closed");let s=await ae();if(c(s))return s;let i=s.value,l=hi(o.id,r.id,{at:"end"},e.value,i);if(c(l))return l;let u=Y([{id:Ww(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:l.value},...Q(e.value)}],i);return c(u)?u:d("Issue closed",null)};import{ulid as zw}from"ulid";var Vy=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 Ky=async()=>{let e=te();if(c(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=h(),r=le(t.id)[n];if(!r)return a("Unable to reopen issue, no target found");let o=r.context==="TICKET"?d("Resolved ticket",r):Qe(r.id,"TICKET");if(c(o))return a("Cannot reopen in this context");let s=o.value,i=h().nodes[mt];if(!i)return a("Unable to locate closed swimlane");if(s.parentNodeId!==i.id)return a("Issue is not closed");if(!j(s))return a("Target node is not issue");let l=Vy(s);if(!l)return a("Unable to resolve previous parent from issue history");if(l===i.id)return a("Previous parent resolves to closed swimlane");let u=h().nodes[l];if(!u)return a("Previous parent no longer exists");let m=await ae();if(c(m))return m;let p=m.value,f=hi(u.id,s.id,{at:"end"},e.value,p);if(c(f))return f;let g=Y([{id:zw(),action:"reopen.issue",payload:{id:s.id,parent:u.id,rank:f.value},...Q(e.value)}],p);return c(g)?g:d("Issue reopened",null)};import{ulid as Vw}from"ulid";var qy=async()=>{let e=te();if(c(e))return a("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=h(),r=le(t.id)[n];if(!r)return a("Missing node");if(r.readonly)return a("Cannot rename readonly node");let o=fi();if(!o)return a("Provide a title");let s=await ae();return c(s)?s:Y([{id:Vw(),action:"edit.title",payload:{id:r.id,name:o},...Q(e.value)}],s.value)};import{ulid as Kw}from"ulid";var Yy=async()=>{let e=te();if(c(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=q().commandMeta,r=(t||n).trim();if(!r)return a("Provide a tag");let o=R.findTagByName(r);if(!o)return a(`Tag "${r}" does not exist`);let{selectedNode:s}=h();if(!s)return a("Invalid untag target");let i=Qe(s.id,"TICKET");if(c(i))return a("Unable to untag issue in this context");let l=i.value;if(!j(l))return a("Target node is not issue");if(!(l.props.tags??[]).includes(o.id))return a("Issue is not tagged with that tag");let m=await ae();return c(m)?m:Y([{id:Kw(),action:"remove.issue.tag",payload:{id:l.id,tag:o.id},...Q(e.value)}],m.value)};import{ulid as ed}from"ulid";var Xy=async()=>{let e=te();if(c(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=q().commandMeta,r=(t||n).trim();if(!r)return a("Provide a tag");let{selectedNode:o}=h();if(!o)return a("Invalid tag target");let s=Qe(o.id,"TICKET");if(c(s))return a("Unable to tag issue in this context");let i=s.value;if(!j(i))return a("Target node is not issue");let l=await ae();if(c(l))return l;let u=R.findTagByName(r),m=u?.id??ed();return(i.props.tags??[]).includes(m)?a("Already tagged with that tag"):Y([...u?[]:[{id:ed(),action:"create.tag",payload:{id:m,name:r},...Q(e.value)}],{id:ed(),action:"add.issue.tag",payload:{id:i.id,tag:m},...Q(e.value)}],l.value)};import{ulid as Jy}from"ulid";var Zy=()=>{let{selectedNode:e}=h();if(!e)return a("Select an issue first");let t=Qe(e.id,"TICKET");if(c(t))return a("Not inside an issue");let n=t.value;return j(n)?d("Found issue",n):a("Target node is not issue")},td=async e=>{let t=await ae();return c(t)?t:Y(e,t.value)},nd=(e,t,n)=>am(t,n).map(r=>({id:Jy(),...r,...Q(e)})),Qy=async()=>{let{modifier:e,inputString:t}=q().commandMeta,n=Ms(e||t);if(!n)return a("Name the goal");let r=Zy();if(c(r))return r;let o=r.value,s=te();if(c(s))return a("Unable to resolve user ID");let i=s.value,l=Wa(n);if(l){let p=nd(i,o,l.id);return p.length===0?a("Already in that goal"):td(p)}let u=um(n);if(u)return a(u);let m=Jy();return td([{id:m,action:"create.goal",payload:{id:m,name:n},...Q(i)},...nd(i,o,m)])},eb=async()=>{let e=Zy();if(c(e))return e;let t=e.value;if(!an(t))return a("Not in a goal");let n=te();return c(n)?a("Unable to resolve user ID"):td(nd(n.value,t))};import{ulid as qw}from"ulid";var tb=async e=>{let{modifier:t,inputString:n}=q().commandMeta,r=(t||n).trim().toLowerCase(),o=zt();if(!o)return a("Select a swimlane first");let s=tm(o,r,e);if(c(s)||!s.value)return s;let i=te();if(c(i))return a("Unable to resolve user ID");let l=await ae();if(c(l))return l;let u=Y([{id:qw(),...s.value,...Q(i.value)}],l.value);return c(u)?u:d("Saved",null)},nb=()=>tb(!0),rb=()=>tb(!1);import{ulid as rd}from"ulid";var ob=({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)}))},AK=({authorName:e,authorEmail:t,owners:n,registry:r})=>{let o=nt(t),s=n.get(o),i=s?r[s]:void 0;return s?{...ua(s,i?.name),resolved:!0}:{...ua(o||e,e),resolved:!1}};var zi=e=>{let{eventLog:t=[],contributors:n}=h();return ob({events:t,registry:n,logFileNames:bp(e)})};var sb=async()=>{let e=te();if(c(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=q().commandMeta,r=(t||n).trim();if(!r)return a("Provide an assignee");let o=r.startsWith("!"),s=(o?r.slice(1):r).trim();if(!s)return a("Provide an assignee");let{selectedIndex:i,contextNode:l}=h(),u=le(l.id)[i];if(!u)return a("Invalid assign target");let m=Qe(u.id,"TICKET");if(c(m))return a("Unable to assign issue in this context");let p=m.value;if(!j(p))return a("Target node is not issue");let f=await ae();if(c(f))return f;let g=zi(f.value),v=!o&&s.toLowerCase()==="me",w,x;if(v)w=e.value.userId,x=g.find(S=>S.id===w)?.name??e.value.userName;else{let S=g.filter(L=>L.name===s);if(S.length>1)return a(`"${s}" matches ${S.length} contributors (${S.map(L=>L.id).join(", ")}). Assign from the GUI to choose by id.`);let k=S[0];if(!k&&!o)return a(`No contributor named "${s}". Use "!${s}" to add them as an external assignee.`);w=k?.id??rd(),x=k?.name??s}if((p.props.assignees??[]).includes(w))return a("Assignee already assigned");let N=!!h().contributors[w];return Y([...N?[]:[{id:rd(),action:"create.contributor",payload:{id:w,name:x},...Q(e.value)}],{id:rd(),action:"add.issue.assignee",payload:{id:p.id,assignee:w},...Q(e.value)}],f.value)};import{ulid as Yw}from"ulid";var ib=async()=>{let e=te();if(c(e))return a("Unable to resolve user ID");let{modifier:t,inputString:n}=q().commandMeta,r=(t||n).trim();if(!r)return a("Provide an assignee to remove");let{selectedNode:o}=h();if(!o)return a("Invalid unassign target");let s=Qe(o.id,"TICKET");if(c(s))return a("Unable to unassign in this context");let i=s.value;if(!j(i))return a("Target node is not issue");let l=i.props.assignees??[],u=r.toLowerCase()==="me",m=await ae();if(c(m))return m;let p=u?l.filter(g=>g===e.value.userId):zi(m.value).filter(g=>g.name===r&&l.includes(g.id)).map(g=>g.id);if(p.length>1)return a(`"${r}" matches ${p.length} assignees (${p.join(", ")}). Unassign from the GUI to choose by id.`);let f=p[0];return f?Y([{id:Yw(),action:"remove.issue.assignee",payload:{id:i.id,assignee:f},...Q(e.value)}],m.value):a(u?"Issue is not assigned to you":`Issue is not assigned to "${r}"`)};import{ulid as ab}from"ulid";var Xw=e=>{let t=e.trim(),n=En(),r=n?Wf(t):null;if(!n||!r)return{ok:!0,md:t,anchored:!1};let o=Fi();if(!o||o.sha!==n)return{ok:!1,reason:"No diff is open"};let s=zf(o.rows,Math.max(0,h().selectedIndex));if(!s)return{ok:!1,reason:"That line is not in a file"};let i=Vf(o.rows,s,r.start,r.end);return i.ok?{ok:!0,anchored:!0,md:jf({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}},cb=async e=>{let t=Xw(e.inputString);if(!t.ok)return a(t.reason);let{md:n,anchored:r}=t;if(!n)return a("Provide a comment");if(n.length>4e3)return a(r?`The note and the ${n.length} characters of quoted lines exceed ${4e3}; comment on fewer lines`:`Cannot exceed ${4e3} characters`);let o=te();if(c(o))return a("Unable to resolve user ID");let{breadCrumb:s,selectedNode:i}=h(),l=tt([...s,i],"TICKET");if(c(l))return a("Edit target must be an issue");let u=l.value;if(!u)return a("Invalid comment target");let m=u.context==="TICKET"?d("Resolved ticket",u):Qe(u.id,"TICKET");if(c(m))return a("Unable to comment on issue in this context");let p=m.value;if(!j(p))return a("Target node is not issue");let f=await ae();if(c(f))return f;let g=await Y([{id:ab(),action:"add.issue.comment",payload:{id:ab(),issue:p.id,author:o.value.userId,md:n},...Q(o.value)}],f.value);return r&&!c(g)&&er(null),g};import{ulid as rI}from"ulid";var lb=e=>e.userName?.trim()?e.preferredEditor?.trim()?null:"no editor configured":"no username configured",Jw=e=>{let t=Nm();return c(t)?lb({userName:e.userName,preferredEditor:e.preferredEditor})??t.message:lb(t.value)},db=()=>{let e=Ft();return c(e)?a(e.message):d("Read auto sync settings",{enabled:e.value.autoSync===!0,intervalMs:gs(e.value.autoSyncDebounceMs),blockedReason:Jw(e.value)})},Vi=e=>{let t=e.intervalMs===void 0?void 0:lr(e.intervalMs);if(e.intervalMs!==void 0&&t===null)return a(`Auto sync interval must be a whole number of milliseconds between ${3e3} and ${864e5}`);let n=db();if(c(n))return n;let r=Ye({...e.enabled===void 0?{}:{autoSync:e.enabled},...t==null?{}:{autoSyncDebounceMs:t}});if(c(r))return a(r.message);ut({...e.enabled===void 0?{}:{autoSync:e.enabled},...t==null?{}:{autoSyncIntervalMs:t}});let o=db();return c(o)?d("Changed auto sync settings",{...n.value,...e.enabled===void 0?{}:{enabled:e.enabled},...t==null?{}:{intervalMs:t}}):o};var ub=()=>{let e=q().commandMeta.inputString,t=lr(e);if(t===null)return a(`Auto sync duration must be a whole number of milliseconds between ${3e3} and ${864e5}`);let n=Vi({intervalMs:t});return c(n)?n:d(`Auto sync interval set to ${t}ms`,null)};import Zw from"zod";var mb=()=>{let e=Zw.coerce.number().int().min(br).max(vr).safeParse(q().commandMeta.inputString);if(!e.success)return a(`A connected repo's clone cap must be ${br}-${vr} MB (default ${tc})`);let t=Ye({repoCloneMaxMb:e.data});return c(t)?t:d(`Connected repo clone cap set to ${e.data} MB`,null)};var pb=()=>{let e=q().commandMeta.inputString.trim();if(e!=="on"&&e!=="off")return a("Invalid response");let t=Qu(e),n=Vi({enabled:t===!0});return c(n)?n:d(`Auto sync set to "${e}"`,null)};import{ulid as tI}from"ulid";var od=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=2),fb="",gb=new Map,Qw=15e3;var eI=async(e,t)=>{let n=`${e} ${t??""}`,r=gb.get(n);if(r&&Date.now()-r.at<ni(Qw))return d("Cached author scan",r.authors);let o=await Se({cwd:e,args:["log","--branches",...t?["--not",t]:[],`--format=%an${fb}%ae`]});if(o.exitCode!==0)return a(`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(`
115
+ `)){let l=i.lastIndexOf(fb);if(l===-1)continue;let u=i.slice(0,l),m=nt(i.slice(l+1));if(!ar(m))continue;let p=s.get(m)??{names:new Set,commits:0};u&&p.names.add(u),p.commits+=1,s.set(m,p)}return gb.set(n,{at:Date.now(),authors:s}),d("Scanned repository authors",s)},hb=async({repoRoot:e,stateBranch:t,names:n,links:r})=>{let o=await eI(e,t);if(c(o))return a(o.message);let s=o.value,i=new Map;for(let u of Object.values(r)){if(u.tombstoned)continue;let m=i.get(u.email)??new Set;m.add(u.contributor),i.set(u.email,m)}let l=new Set(n.flatMap(u=>od(u??"")));return d("Found candidates",[...s.entries()].map(([u,m])=>({email:u,names:[...m.names],commits:m.commits,looksLikeYours:[...m.names].some(p=>od(p).some(f=>l.has(f)))||od(u.split("@")[0]??"").some(p=>l.has(p)),claimedBy:[...i.get(u)??[]]})).sort((u,m)=>u.looksLikeYours===m.looksLikeYours?m.commits-u.commits:Number(m.looksLikeYours)-Number(u.looksLikeYours)))},yb=e=>e.filter(t=>t.claimedBy.length===0);var bb=()=>{let e=$a();if(!e)return d("Nothing here to decline",null);let t=Ft(),n=c(t)?[]:t.value.declinedEmailBoards??[],r=[...new Set([...n,e])],o=Ye({declinedEmailBoards:r});return c(o)?a(o.message):(ut({declinedEmailBoards:[...new Set([...ne().declinedEmailBoards??[],e])]}),d("Declined",null))},vb=async()=>{let e=q().commandMeta.inputString.trim();if(e==="none"){let E=bb();return c(E)?E:d("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}=ne();if(!t)return a("Set a username first with :config username");let o=pe();if(c(o))return a("Board is not loaded");let s=Ee(process.cwd());if(c(s))return a(s.message);let i=wt(s.value),l=await hb({repoRoot:s.value,stateBranch:c(i)?void 0:i.value,names:[n,r],links:o.value.emailLinks});if(c(l))return l;let m=yb(l.value);if(Yu(m.map(E=>E.email)),m.length===0){if(!Ju()){let E=bb();if(c(E))return E}return d("No unclaimed addresses in this history.",null)}if(!e)return I({mode:y.IDENTITY}),d("Opened identity",null);let p=e.split(/[,\s]+/).filter(Boolean),f=[],g=[];for(let E of p){let N=m.find(S=>S.email===nt(E));if(!N){g.push(E);continue}f.includes(N)||f.push(N)}if(g.length>0)return a(`Not on the list: ${g.join(", ")}. Pick one of ${m.map(E=>E.email).join(", ")}.`);let v=ve({repoRoot:s.value});if(c(v))return v;let w=f.map(E=>({id:tI(),action:"link.contributor.email",payload:{contributor:t,email:E.email},userId:t})),x=Y(w,v.value);return c(x)?a(x.message):d(`Claimed ${f.map(E=>E.email).join(", ")}. Every commit by ${f.length===1?"that address":"those addresses"} is now yours.`,null)};import{ulid as nI}from"ulid";var xb=()=>{let e=q().commandMeta.inputString.trim(),{userId:t}=ne();if(!t)return a("Set a username first with :config username");let n=pe();if(c(n))return a("Board is not loaded");let r=cr(n.value.emailLinks,t);if(r.length===0)return a("You have not claimed any addresses.");if(!e)return a(`Which one? ${r.join(", ")}.`);let o=r.find(u=>u===nt(e));if(!o)return a(`You have not claimed ${e}. Yours: ${r.join(", ")}.`);let s=Ee(process.cwd());if(c(s))return s;let i=ve({repoRoot:s.value});if(c(i))return i;let l=Y([{id:nI(),action:"unlink.contributor.email",payload:{contributor:t,email:o},userId:t}],i.value);return c(l)?a(l.message):d(`Unclaimed ${o}`,null)};var Rb=()=>{let e=q().commandMeta.inputString.trim();if(!["debug","error","info"].includes(e))return a("Invalid response");let n=Ye({logLevel:e});return c(n)?n:(ut({logLevel:e}),d(`Auto sync set to "${e}"`,null))};var Eb=e=>{let t=e.inputString.trim();switch(e.modifier){case ee.USERNAME:{if(process.env[Ji])return a(`Cannot change the configured user while ${Ji} names this process`);let n=Ft();if(c(n))return n;let{userId:r,preferredEditor:o,userName:s}=n.value,i=t||s,l=r||rI();if(!i||!l)return a("Unable to resolve user name or id");let u=Ye({userName:i,userId:l,preferredEditor:o??""});return c(u)?u:(ut({userName:i,userId:l}),d(`Username set to "${i}"`,null))}case ee.EDITOR:{if(!t)return a("No editor provided");let n=Ye({preferredEditor:t});return c(n)?n:(ut({preferredEditor:t}),d(`Editor configuration set to "${t}"`,null))}case ee.VIEW:{if(t!=="wide"&&t!=="dense")return a("Invalid view mode");let n=Ye({viewMode:t});return c(n)?n:(ut({viewMode:t}),d(`View set to "${t}"`,null))}case ee.EMAILS:return vb();case ee.EMAILS_UNCLAIM:return xb();case ee.AUTOSYNC:return pb();case ee.LOG_LEVEL:return Rb();case ee.SYNC_DEBOUNCE_MS:return ub();case ee.ATTACHMENT_MAX_KB:return km();case ee.REPO_CLONE_MAX_MB:return mb();case ee.REPO_CONNECT:return ng();case ee.REPO_DISCONNECT:return rg();default:return a("Unknown config command")}};var sd=()=>{let e=em(),t=h().mode;if(!(t!==y.COMMAND_LINE&&t!==y.DEFAULT)){if(!e){I({mode:y.DEFAULT});return}I({mode:y.COMMAND_LINE}),X(e)}};var Sb=[{systemOnly:!0,intent:H.Move,description:"Internal move-state command",mode:y.COMMAND_LINE,action:Ey},{intent:H.Delete,description:"Delete the currently selected node",mode:y.COMMAND_LINE,action:Wy,onSuccess:()=>I({mode:y.DEFAULT})},{intent:H.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:y.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=q().commandMeta,n=/(!=|=)/,[r]=e.split(n);if(!r||!(i=>ke(b.FILTER).map(l=>l.split(n)[0]).includes(i))(r))return a("Invalid filter modifier");let s={target:r,operator:"=",value:t.trim()};return ue(i=>({...i,filters:e==="clear"?[]:[...i.filters,s],mode:y.DEFAULT})),d("Filter updated",null)}},{intent:H.ViewHelp,description:"Open the help screen",mode:y.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=h();return Cn({pendingNavTarget:{contextNode:e,breadCrumb:r,selectedIndex:t,selectedNode:n}}),I({mode:y.HELP}),d("Viewing help",null)}},{intent:H.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:y.COMMAND_LINE,action:zy,onSuccess:()=>I({mode:y.DEFAULT})},{intent:H.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:y.COMMAND_LINE,action:Ky,onSuccess:()=>I({mode:y.DEFAULT})},{intent:H.Init,description:"Initialize Epiq in the current git repository",mode:y.COMMAND_LINE,action:hy,onSuccess:sd},{intent:H.OpenProject,description:"Open a recently used epiq project, by number or path",mode:y.COMMAND_LINE,action:Py,onSuccess:()=>I({mode:y.DEFAULT})},{intent:H.NewItem,description:"Create a new board, swimlane, or issue",mode:y.COMMAND_LINE,action:Cy,onSuccess:()=>I({mode:y.DEFAULT})},{intent:H.Rename,description:"Rename the currently selected node",mode:y.COMMAND_LINE,action:qy,onSuccess:()=>I({mode:y.DEFAULT})},{intent:H.UntagTicket,description:"Remove a tag from the selected issue",mode:y.COMMAND_LINE,action:Yy,onSuccess:()=>I({mode:y.DEFAULT})},{intent:H.TagTicket,description:"Add or create a tag on the selected issue",mode:y.COMMAND_LINE,action:Xy,onSuccess:()=>I({mode:y.DEFAULT})},{intent:H.GoalTicket,description:"Put the selected issue in a goal, or name a new one",mode:y.COMMAND_LINE,action:Qy,onSuccess:()=>I({mode:y.DEFAULT})},{intent:H.UngoalTicket,description:"Take the selected issue out of its goal",mode:y.COMMAND_LINE,action:eb,onSuccess:()=>I({mode:y.DEFAULT})},{intent:H.RuleLane,description:"Give the selected swimlane a rule: done marks its tickets done",mode:y.COMMAND_LINE,action:nb,onSuccess:()=>I({mode:y.DEFAULT})},{intent:H.UnruleLane,description:"Take a rule off the selected swimlane",mode:y.COMMAND_LINE,action:rb,onSuccess:()=>I({mode:y.DEFAULT})},{intent:H.AssignUserToTicket,description:"Assign a user to the selected issue",mode:y.COMMAND_LINE,action:sb,onSuccess:()=>I({mode:y.DEFAULT})},{intent:H.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:y.COMMAND_LINE,action:ib,onSuccess:()=>I({mode:y.DEFAULT})},{intent:H.Comment,description:"Add a comment to the selected issue",mode:y.COMMAND_LINE,action:async(e,t)=>cb(t),onSuccess:()=>I({mode:y.DEFAULT})},{intent:H.Sync,description:"Pull, commit, and push Epiq state",mode:y.COMMAND_LINE,action:Hy},{intent:H.Peek,description:"View board state at another point in time",mode:y.COMMAND_LINE,action:$y},{intent:H.Replay,description:"Replay board history forward from a point in time",mode:y.COMMAND_LINE,action:By},{intent:H.Export,description:"Export the current board layout to markdown",mode:y.COMMAND_LINE,action:async()=>{let e=await uy();return c(e)?e:(I({mode:y.DEFAULT}),d("Export successful",!0))}},{intent:H.Exit,description:"Exit the application",mode:y.COMMAND_LINE,action:async()=>(V.exit(),d("Exit successful",!0))},{intent:H.Edit,description:"Edit title or description",mode:y.COMMAND_LINE,action:async(e,t)=>py(t),onSuccess:()=>I({mode:y.DEFAULT})},{intent:H.Yank,description:"Yank (copy) ref, title, description, tags, or assignees to the clipboard",mode:y.COMMAND_LINE,action:async(e,t)=>jy(t),onSuccess:()=>I({mode:y.DEFAULT})},{intent:H.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:y.COMMAND_LINE,action:(e,t)=>Eb(t),onSuccess:sd}];var oI=e=>{let t=e.value;return t&&typeof t=="object"&&typeof t.followUp=="string"?t.followUp:null},sI=new Set(["peek","replay","filter","view-help","yank"]),Rt=async({isForceExecutedBySystem:e=!1}={})=>{let{value:t,commandMeta:{command:n,validity:r,modifier:o,inputString:s}}=q();if(!n)return a("No command to confirm");if(!e&&r===gn.Invalid)return a("Invalid command");let i=xh(n);Sg();let{readOnly:l}=h();if(l&&!sI.has(i))return Uo({status:sr.Fail,message:"Command not available in readonly state",value:null});let u=Sb.filter(g=>e||g.systemOnly!==!0).find(g=>g.intent===i);if(!u)return Uo({status:sr.Fail,message:"Command not found",value:null});let m;try{m=await u.action(u,{command:n,inputString:s,modifier:o})}catch(g){return Uo({status:sr.Fail,message:g instanceof Error?g.message:"Command failed",value:null})}if(c(m))return Uo(m);let p=!e;if(Cg({addToHistory:p,line:t}),p){let g=Ay({commands:q().commandHistory});c(g)&&logger.info(g.message)}let f=oI(m);return f!==null?(X(f),m):(u.onSuccess?.(),ne().autoSync&&vh(),m)};var Ki=[{intent:C.Exit,mode:y.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(I({mode:y.COMMAND_LINE}),X("move cancel"),Rt({isForceExecutedBySystem:!0}))},{intent:C.InitMove,mode:y.DEFAULT,description:"[m] move",action:()=>(I({mode:y.COMMAND_LINE}),X("move start"),Rt({isForceExecutedBySystem:!0}))},{intent:C.ConfirmMove,mode:y.MOVE,description:"[m] confirm move",action:()=>(I({mode:y.COMMAND_LINE}),X("move confirm"),Rt({isForceExecutedBySystem:!0}))}],qi=[{intent:C.MovePreviousItem,mode:y.MOVE,action:()=>Lt()?(I({mode:y.COMMAND_LINE}),X("move previous"),Rt({isForceExecutedBySystem:!0})):a("No pending move")},{intent:C.MoveNextItem,mode:y.MOVE,description:"[arrows/hjkl] move (shift x5)",action:()=>Lt()?(I({mode:y.COMMAND_LINE}),X("move next"),Rt({isForceExecutedBySystem:!0})):a("No pending move")},{intent:C.MovePreviousItemJump,mode:y.MOVE,action:()=>Lt()?(I({mode:y.COMMAND_LINE}),X("move jump-previous"),Rt({isForceExecutedBySystem:!0})):a("No pending move")},{intent:C.MoveNextItemJump,mode:y.MOVE,action:()=>Lt()?(I({mode:y.COMMAND_LINE}),X("move jump-next"),Rt({isForceExecutedBySystem:!0})):a("No pending move")}],Cb=[{intent:C.MoveToNextContainer,mode:y.MOVE,action:()=>Lt()?(I({mode:y.COMMAND_LINE}),X("move to-next"),Rt({isForceExecutedBySystem:!0})):a("No pending move")},{intent:C.MoveToPreviousContainer,mode:y.MOVE,action:()=>Lt()?(I({mode:y.COMMAND_LINE}),X("move to-previous"),Rt({isForceExecutedBySystem:!0})):a("No pending move")}];var Nb={[re.WORKSPACE]:[...Ki,...qi],[re.BOARD]:[...Ki,...qi],[re.SWIMLANE]:[...Ki,...qi,...Cb],[re.TICKET]:[],[re.FIELD]:[],[re.FIELD_LIST]:[],[re.TEXT]:[],[re.COMMENT]:[]};import aI from"node:fs";import cI from"node:path";import{spawn as iI}from"node:child_process";function wb(e){let t=process.platform,o=iI(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 Ib=e=>{let t=Ee(process.cwd());if(c(t))return a("Unable to resolve project root");let n=ve({repoRoot:t.value});if(c(n))return a(n.message);let r=ec(e.hash,e.ext),o=cI.join(no(n.value),r);return aI.existsSync(o)?(wb(o),d(`Opened ${e.name}`,null)):a("Attachment file not found \u2014 run :sync to fetch it")};var Ab=()=>{X("");let{pendingNavTarget:e}=jr();I({mode:y.DEFAULT}),e&&V.navigate(e),Cn({pendingNavTarget:void 0})},Tb=[{intent:C.ExitCommandLine,mode:y.HELP,action:()=>(Ab(),d("Exiting help",null))},{intent:C.Exit,mode:y.HELP,action:()=>(Ab(),d("Closed help",null))},{intent:C.NavPreviousItem,mode:y.HELP,description:"[arrows/hjkl] navigate (shift x5)",action:()=>(V.navigateToPreviousItem(),d("Navigating to previous help item",null))},{intent:C.NavNextItem,mode:y.HELP,action:()=>(V.navigateToNextItem(),d("Navigating to next help item",null))},{intent:C.NavPreviousItemJump,mode:y.HELP,action:()=>(V.jumpToPreviousItem(),d("Jumping to previous help item",null))},{intent:C.NavNextItemJump,mode:y.HELP,action:()=>(V.jumpToNextItem(),d("Jumping to next help item",null))},{intent:C.NavToPreviousContainer,mode:y.HELP,action:()=>(V.navigateToPreviousContainer(),d("Navigating to previous help container",null))},{intent:C.NavToNextContainer,mode:y.HELP,action:()=>(V.navigateToNextContainer(),d("Navigating to next help container",null))}];var Mb=()=>{X(""),I({mode:y.DEFAULT})},kb=[{intent:C.Confirm,mode:y.IDENTITY,description:"[enter] claim the first",action:()=>{let[e]=fr();return e?(I({mode:y.COMMAND_LINE}),X(`config emails ${e}`),d("Proposed claim",null)):d("Nothing left to claim",null)}},{intent:C.ExitCommandLine,mode:y.IDENTITY,action:()=>(Mb(),d("Closed identity",null))},{intent:C.Exit,mode:y.IDENTITY,description:"[esc] close",action:()=>(Mb(),d("Closed identity",null))}];var lI=e=>{I({mode:y.COMMAND_LINE});let{pendingNavTarget:t}=jr();t&&V.navigate(t),Cn({pendingNavTarget:void 0}),X(`${e} `)},Lb=()=>{X("");let{pendingNavTarget:e}=jr();e&&V.navigate(e),Cn({pendingNavTarget:void 0}),I({mode:y.DEFAULT})},Pb=[{intent:C.InitCommandPalette,mode:y.DEFAULT,description:"[?] command palette",action:()=>{X("");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=h();return Cn({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}}),I({mode:y.PALETTE}),d("Opening command palette",null)}},{intent:C.Confirm,mode:y.PALETTE,action:()=>{let{selectedNode:e}=h();if(!e||!Fd(e))return a("Command only applicable on text nodes");if(e.props.disabled)return a("Command is not available in this context");let t=e.title;return t?(lI(t),d("Selected command",t)):d("No command selected",null)}},{intent:C.ExitCommandLine,mode:y.PALETTE,action:()=>(Lb(),d("Exiting palette",null))},{intent:C.Exit,mode:y.PALETTE,action:()=>(Lb(),d("Closed command palette",null))},{intent:C.NavPreviousItem,mode:y.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(V.navigateToPreviousItem(),d("Navigating to previous item",null))},{intent:C.NavNextItem,mode:y.PALETTE,action:()=>(V.navigateToNextItem(),d("Navigating to next item",null))},{intent:C.NavToPreviousContainer,mode:y.PALETTE,action:()=>(V.navigateToPreviousContainer(),d("Navigating to previous container",null))},{intent:C.NavToNextContainer,mode:y.PALETTE,action:()=>(V.navigateToNextContainer(),d("Navigating to next container",null))}];var Ob=()=>{let e=En();if(!e)return d("Nothing to comment on here",null);let t=Fi();if(!t||t.sha!==e)return a("The diff is still loading");let{selectedIndex:n}=h(),r=Math.max(0,n),o=ll(t.rows,jl(e)??r,r);return o.ok?(I({mode:y.COMMAND_LINE}),X(`${b.COMMENT} ${Gf(o.value.start,o.value.end)} `),d("Commenting on a diff line",null)):a(o.reason)},Db=[{intent:C.InitCommandLine,mode:y.DEFAULT,description:"[:] write command",action:()=>(I({mode:y.COMMAND_LINE}),X(""),d("Entering command line mode",null))},...Tb,...kb,...Pb,{intent:C.AddItem,mode:y.DEFAULT,description:"[n] new...",action:()=>(I({mode:y.COMMAND_LINE}),X(`${b.NEW} `),d("Adding new item",null))},{intent:C.Delete,mode:y.DEFAULT,description:"[d] delete",action:()=>(I({mode:y.COMMAND_LINE}),X(`${b.DELETE} `),d("Deleting item",null))},{intent:C.Confirm,mode:y.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=h();if(!be(e?.id??"")?.length){let r=e?R.getAttachment(e.id):void 0;if(r)return Ib(r);if(En())return Ob();if(e?.title===ge.DESCRIPTION)return I({mode:y.COMMAND_LINE}),X(`${b.EDIT} description `),d("Propose command",!0);if(e?.title===ge.ASSIGNEES)return I({mode:y.COMMAND_LINE}),X(`${b.ASSIGN} `),d("Propose command",!0);if(e?.title===ge.TAGS)return I({mode:y.COMMAND_LINE}),X(`${b.TAG} `),d("Propose command",!0);if(t.title===ge.DESCRIPTION&&e?.context==="TEXT")return I({mode:y.COMMAND_LINE}),X(`${b.EDIT} description `),d("Propose command",!0)}return V.enterChildNode(),d("Entering context",null)}},{intent:C.OpenInEditor,mode:y.DEFAULT,action:()=>{let{selectedNode:e,contextNode:t}=h(),n=t.parentNodeId,o=!!n&&t.id===he(n,"diff")?e?.id:En()??void 0;return o?hl({sha:o}):d("Nothing here opens in an editor",null)}},{intent:C.MarkDiffLine,mode:y.DEFAULT,action:()=>{let e=En();if(!e)return d("Nothing to mark here",null);let{selectedIndex:t}=h(),n=jl(e);return er(n===t?null:{sha:e,row:Math.max(0,t)}),d("Marked diff line",null)}},{intent:C.CommentOnDiffLine,mode:y.DEFAULT,action:()=>En()?Ob():d("Nothing to comment on here",null)},{intent:C.Yank,mode:y.DEFAULT,description:"[y] yank",action:()=>{let{selectedNode:e}=h(),t=e?.title===ge.DESCRIPTION?Me.DESCRIPTION:e?.title===ge.TAGS?Me.TAGS:e?.title===ge.ASSIGNEES?Me.ASSIGNEES:Me.REF,r=ke(b.YANK).includes(t)?t:Me.REF;return I({mode:y.COMMAND_LINE}),X(`${b.YANK} ${r}`),d("Propose command",!0)}},{intent:C.EditTitle,mode:y.DEFAULT,description:"[r] rename title",action:()=>(I({mode:y.COMMAND_LINE}),X(`${b.EDIT} title ${h().selectedNode?.title}`),d("Exiting context",null))},{intent:C.EditDescription,mode:y.DEFAULT,description:"[e] edit desc",action:()=>(I({mode:y.COMMAND_LINE}),X(`${b.EDIT} description `),d("Exiting context",null))},{intent:C.Exit,mode:y.DEFAULT,description:"[q] exit context",action:()=>(V.enterParentNode(),d("Exiting context",null))},{intent:C.NavPreviousItem,mode:y.DEFAULT,description:"[arrows/hjkl] navigate (shift x5)",action:()=>(V.navigateToPreviousItem(),d("Navigating to previous item",null))},{intent:C.NavNextItem,mode:y.DEFAULT,action:()=>(V.navigateToNextItem(),d("Navigating to next item",null))},{intent:C.NavPreviousItemJump,mode:y.DEFAULT,action:()=>(V.jumpToPreviousItem(),d("Jumping to previous item",null))},{intent:C.NavNextItemJump,mode:y.DEFAULT,action:()=>(V.jumpToNextItem(),d("Jumping to next item",null))},{intent:C.NavToPreviousContainer,mode:y.DEFAULT,action:()=>(V.navigateToPreviousContainer(),d("Navigating to previous container",null))},{intent:C.NavToNextContainer,mode:y.DEFAULT,action:()=>(V.navigateToNextContainer(),d("Navigating to next container",null))}];var dI=500,uI=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),Fb=e=>{let t=uI(e);t&&pi(n=>(n+t).slice(0,dI))};var mI=[y.COMMAND_LINE,y.PALETTE],pI=e=>e==="edit title "?h().selectedNode?.title??"":"",fI=e=>[{intent:C.MoveCursorLeft,mode:e,action:()=>(El(-1),d("Moving cursor left",null))},{intent:C.MoveCursorRight,mode:e,action:()=>(El(1),d("Moving cursor right",null))},{intent:C.MoveCursorLeftOfWord,mode:e,action:()=>(Sl("left"),d("Moving cursor left of word",null))},{intent:C.MoveCursorRightOfWord,mode:e,action:()=>(Sl("right"),d("Moving cursor right of word",null))},{intent:C.AutoCompleteCommand,mode:e,action:()=>(pi((t,{remainder:n})=>{let r=n?t+n:t;return r+pI(r)}),d("Auto-completing command",null))},{intent:C.CaptureInput,mode:e,action:(t,{sequence:n})=>(Fb(n??""),d("Capturing input",null))},{intent:C.EraseInput,mode:e,action:()=>(Rg(),d("Erasing input",null))},{intent:C.EraseInputWord,mode:e,action:()=>(Eg(),d("Erasing input word",null))}],_b=[{intent:C.Confirm,mode:y.COMMAND_LINE,action:()=>(Rt(),d("Executing command",null))},{intent:C.ViewHelp,mode:y.DEFAULT,action:()=>(I({mode:y.HELP}),d("Viewing help",null))},...mI.flatMap(fI),{intent:C.ExitCommandLine,mode:y.COMMAND_LINE,action:()=>(wg(),I({mode:y.DEFAULT}),d("Exiting command line",null))},{intent:C.GetLastCommandFromHistory,mode:y.COMMAND_LINE,action:()=>(Ig(),d("Getting last command from history",null))},{intent:C.GetNextCommandFromHistory,mode:y.COMMAND_LINE,action:()=>(Ag(),d("Getting next command from history",null))}];var gI=e=>{let t=/^\[(.+?)\]\s*(.+)$/.exec(e);return t?{keys:t[1]??"",label:t[2]??""}:null},$b=({keys:e})=>e.length===1?0:1,Bb=(e,t)=>{let n=new Set;for(let r of e)r.mode!==t||!r.description||n.add(r.description);return[...n].map(gI).filter(r=>r!==null).sort((r,o)=>$b(r)-$b(o))};function Ub(e,t,n){let r=t[e];if(!r)return a("buildBreadCrumb(): current node not found");let o=[],s=new Set,i=r;for(;i&&!s.has(i.id)&&(o.push(i),s.add(i.id),!(i.id===n||!i.parentNodeId));)i=t[i.parentNodeId];let l=o[o.length-1];return!l||l.id!==n?a("buildBreadCrumb(): node is not connected to root"):(o.reverse(),d("Breadcrumb built",o))}var jb=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 et,id,ad=new Set,cd=()=>{for(let e of ad)e()},yI=e=>(ad.add(e),()=>ad.delete(e));function ld(e){let{contextNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:s}=e;if(!t)return a("derive(): contextNodeId is missing");if(!r)return a("derive(): rootNode is missing");if(!o[r])return a("derive(): unable to find root node");let l=o[t];if(!l)return a("Unable to derive state, contextNode not found");let u=Ub(t,o,r);if(c(u))return logger.error(u.message),u;let m=u.value,{context:p}=l,f=[...Db,...Nb[p]??[],..._b],g=Bb(f,n),v=jb(f),w=bI(o,s),x=w[t]?.[e.selectedIndex]??null;return d("Derived successfully",{...e,contextNode:l,breadCrumb:m,availableHints:g,availableActions:f,actionIndex:v,selectedNode:x,renderedChildrenIndex:w})}var h=()=>{if(!et)throw new Error("State not initialized. Call initWorkspaceState() first.");return et},pe=()=>et?d("Retrieved state",et):a("State not initialized. Call initWorkspaceState() first.");Vu(e=>et?cr(et.emailLinks,e):[]);function Eo(e){id=e;let t=Ee(process.cwd()),n=!1;if(!c(t)){let s=He(t.value);if(c(s))return a(s.message);n=!0}let r={readOnly:!1,filters:[],tags:{},goals:{},contributors:{},emailLinks:{},repos:Qi(),mode:y.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,contextNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""},eventLog:[],unappliedEvents:[],replay:null,timeMode:"live",hasProjectDefinition:n,hasInitializingEvents:!1,comments:{},attachments:{}},o=ld(r);return c(o)?o:(et=o.value,cd(),d("State initialized",null))}var rr=!1,ss=null;function ue(e){let t=h(),n=e(t);if(rr)return n.nodes!==t.nodes&&(wn=null),ss=n,et={...t,...n},d("State updated",null);let r=ld(n);return c(r)?a(r.message??"Unable to update state"):(et=r.value,cd(),d("State updated",null))}function Ks(e){if(rr)return d("Joined batch",e());rr=!0,ss=null,wn=new Set;let t=()=>{let n=ss;if(rr=!1,ss=null,n===null)return null;let r=ld(n);return c(r)?a(r.message??"Unable to update state"):(et=r.value,cd(),d("State updated",null))};try{let n=e(),r=t();return r&&c(r)?a(r.message):d("State updated",n)}finally{rr&&t()}}var Ug=()=>rr,I=e=>ue(t=>({...t,...e}));function or(e,t,n){if(!rr)return ue(i=>({...i,[e]:{...i[e]??{},[t]:n}}));let r=h(),o=r[e]??{};if(e==="nodes"){let i=o[t],l=n;i?.parentNodeId&&wn?.add(i.parentNodeId),l.parentNodeId&&wn?.add(l.parentNodeId)}o[t]=n;let s={...r,[e]:o};return ss=s,et={...r,...s},d("State updated",null)}var Pe=()=>hI(yI,h,h),wn=null,Hb=null,bI=(e,t)=>{let n=et?.renderedChildrenIndex,r=n!==void 0&&wn!==null&&e===Hb&&t.length===0&&et?.filters.length===0,o;if(r){o={...n};let s=Fg(e,wn);for(let i of wn){let l=s[i];l?o[i]=l:delete o[i]}}else o=Dg(e,t);return Hb=e,wn=new Set,o},le=e=>h()?.renderedChildrenIndex[e]??[],Nn=()=>id?Eo(id):a("Cannot reset state: no initial workspace found"),gt=()=>et!==void 0;var Qe=(e,t)=>{let{nodes:n}=h(),r=n[e];if(!r)return a("Node not found");if(r.context===t)return d("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 d("Resolved ancestor node",s);o.add(s.id),s=s.parentNodeId?n[s.parentNodeId]:void 0}return a(`No ancestor found for context: ${t}`)},vI=(e,t)=>{let{nodes:n}=h(),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},Et=(e,t)=>e?e.readonly?a({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node",delete:"Cannot delete readonly node"}[t]):null:a("Node not found"),R={linkUserId({contributorId:e,userId:t}){let n=this.getContributor(e);if(!n)return a("Contributor not found");if(n.userId&&n.userId!==t)return a("Contributor is already linked to another user");let r={...n,userId:t},o=ue(s=>({...s,contributors:{...s.contributors,[e]:r}}));return c(o)?a("Unable to link contributor to user"):d("Linked contributor to user",r)},deleteNode(e){R.deleteNodes([e])},deleteNodes(e){e.length!==0&&ue(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 a("Unable to create comment, missing issue");if(!j(t))return a("Can only comment on issues");let n=or("comments",e.id,{...e,deleted:!1});return c(n)?a("Unable to create comment"):d("Created comment",{...e,deleted:!1})},editComment(e,t){let n=this.getComment(e);if(!n)return a("Unable to edit comment, missing comment");let r=this.getNode(n.issue);if(!r)return a("Unable to edit comment, missing issue");if(!j(r))return a("Can only edit issue comments");let o={...n,md:t,deleted:!1},s=or("comments",e,o);return c(s)?a("Unable to edit comment"):d("Edited comment",o)},deleteComment(e){let t=this.getComment(e);if(!t)return a("Unable to delete comment, missing comment");let n={...t,deleted:!0},r=or("comments",e,n);return c(r)?a("Unable to delete comment"):d("Deleted comment",n)},getComment(e){return h().comments?.[e]},getCommentsByIssue(e){return Object.values(h().comments??{}).filter(t=>t.issue===e&&!t.deleted)},getCommentsGroupedByIssue(){let e=new Map;for(let t of Object.values(h().comments??{})){if(t.deleted)continue;let n=e.get(t.issue);n?n.push(t):e.set(t.issue,[t])}return e},createAttachment(e){let t=this.getNode(e.issue);if(!t)return a("Unable to create attachment, missing issue");if(!j(t))return a("Can only attach to issues");let n=ue(r=>({...r,attachments:{...r.attachments??{},[e.id]:{...e,deleted:!1}}}));return c(n)?a("Unable to create attachment"):d("Created attachment",{...e,deleted:!1})},deleteAttachment(e){let t=this.getAttachment(e);if(!t)return a("Unable to delete attachment, missing attachment");let n={...t,deleted:!0},r=ue(o=>({...o,attachments:{...o.attachments??{},[e]:n}}));return c(r)?a("Unable to delete attachment"):d("Deleted attachment",n)},getAttachment(e){return h().attachments?.[e]},getAttachmentsByIssue(e){return Object.values(h().attachments??{}).filter(t=>t.issue===e&&!t.deleted)},getAttachmentsGroupedByIssue(){let e=new Map;for(let t of Object.values(h().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}=h(),r=n[e];if(!r)return a("Edit target node not found");let o=Et(r,"edit");if(o)return o;let s={...r,props:{...r.props,description:t}};return this.updateNode(s),d("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return a("Rename target node not found");let r=Et(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),d("Renamed node",o)},getExistingTags(){let{tags:e}=h();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=h();return["me",...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return be(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:r}=h(),o=this.getNode(e),s=this.getNode(t);if(!o)return a("Node not found");if(!s)return a("Target parent not found");if(r===e)return a("Cannot move root node");if(e===t)return a("Cannot move node into itself");let i=Et(o,"move");if(i)return i;if(vI(t,e))return a("Cannot move node into its own descendant");let l={...o,parentNodeId:t,rank:n};return this.updateNode(l),d("Moved node successfully",l)},tombstoneNode(e){let{nodes:t,contextNodeId:n,rootNodeId:r}=h(),o=this.getNode(e);if(!o)return a("Node not found");if(r===e)return a("Cannot delete root node");let s=Et(o,"delete");if(s)return s;let i=new Set,l=m=>{let p=t[m];if(!(!p||i.has(m))){i.add(m);for(let f of be(p.id))l(f.id)}};l(e);let u={...structuredClone(t)};for(let m of i){if(!u[m])return a("Unable to locate node to delete");u[m]={...u[m],isDeleted:!0}}return n?(I({nodes:u}),d("Successfully tomb stoned",o)):a("Unable to delete undefined")},tombstoneContributor(e){let t=this.getContributor(e);if(!t)return a("Contributor not found");let n={...t,name:Pd,tombstoned:!0},r=ue(o=>({...o,contributors:{...o.contributors,[e]:n}}));return c(r)?a("Unable to remove contributor"):d("Tombstoned contributor",n)},renameContributor(e,t){let n=this.getContributor(e);if(!n)return a("Contributor not found");if(n.tombstoned)return a("Cannot rename a removed contributor");let r={...n,name:t},o=ue(s=>({...s,contributors:{...s.contributors,[e]:r}}));return c(o)?a("Unable to rename contributor"):d("Renamed contributor",r)},restoreContributor(e,t){let n=this.getContributor(e);if(!n)return a("Contributor not found");let r={...n,name:t,tombstoned:!1},o=ue(s=>({...s,contributors:{...s.contributors,[e]:r}}));return c(o)?a("Unable to restore contributor"):d("Restored contributor",r)},linkContributorEmail({email:e,contributor:t,authorId:n}){if(!this.getContributor(t))return a("Unable to link email, missing contributor");let r={email:nt(e),contributor:t,authorId:n},o=ma(r.email,t),s=h().emailLinks[o];if(s&&!s.tombstoned)return d("Email already linked",s);let i=ue(l=>({...l,emailLinks:{...l.emailLinks,[o]:r}}));return c(i)?a("Unable to link email"):d("Linked email to contributor",r)},unlinkContributorEmail(e,t,n){let r=ma(e,t),o=h().emailLinks[r];if(!o)return a("Unable to unlink, no such link");if(o.tombstoned)return d("Email already unlinked",o);if(!Dd(n,o))return a("Only the author of a link or the contributor it names may remove it");let s={...o,tombstoned:!0},i=ue(l=>({...l,emailLinks:{...l.emailLinks,[r]:s}}));return c(i)?a("Unable to unlink email"):d("Unlinked email from contributor",s)},getEmailLinks(){return h().emailLinks},createContributor(e){let t=ue(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return c(t)?a("Unable to create contributor"):d("Created contributor",e)},assign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return a("Unable to assign contributor, missing contributor");if(!r)return a("Unable to assign contributor, missing target");let o=Et(r,"edit");if(o)return o;if(!j(r))return a("Target is not an issue");let s=r.props.assignees??[];if(s.includes(t))return a("Contributor already assigned");let i={...r,props:{...r.props,assignees:[...s,t]}};return this.updateNode(i),d("Assigned contributor",{assignee:t})},unassign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return a("Unable to unassign, missing contributor");if(!r)return a("Unable to unassign, missing target");let o=Et(r,"edit");if(o)return o;if(!j(r))return a("Target is not an issue");let s=r.props.assignees??[];if(!s.includes(t))return d("Issue is not assigned to that contributor",{assignee:t});let i={...r,props:{...r.props,assignees:s.filter(l=>l!==t)}};return this.updateNode(i),d("Assignee removed",{assignee:t})},tag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return a("Unable to add tag, missing tag");if(!r)return a("Unable to add tag, missing target");let o=Et(r,"edit");if(o)return o;if(!j(r))return a("Target is not an issue");let s=r.props.tags??[];if(s.includes(t))return a("Tag already assigned");let i={...r,props:{...r.props,tags:[...s,t]}};return this.updateNode(i),d("Tag added",{tag:t})},untag(e,t){let n=this.getTagRecord(t),r=this.getNode(e);if(!n)return a("Unable to remove tag, missing tag");if(!r)return a("Unable to remove tag, missing target");let o=Et(r,"edit");if(o)return o;if(!j(r))return a("Target is not an issue");let s=r.props.tags??[];if(!s.includes(t))return d("Issue is not tagged with that tag",{tag:t});let i={...r,props:{...r.props,tags:s.filter(l=>l!==t)}};return this.updateNode(i),d("Tag removed",{tag:t})},addLaneRule(e,t){let n=this.getNode(e);if(!n)return a("Unable to add rule, missing lane");let r=Et(n,"edit");if(r)return r;if(!rt(n))return a("Target is not a swimlane");let o=n.props.rules??[];return o.includes(t)?a("Lane already has that rule"):(this.updateNode({...n,props:{...n.props,rules:[...o,t]}}),d("Added lane rule",{rule:t}))},removeLaneRule(e,t){let n=this.getNode(e);if(!n)return a("Unable to remove rule, missing lane");let r=Et(n,"edit");if(r)return r;if(!rt(n))return a("Target is not a swimlane");let o=n.props.rules??[];if(!o.includes(t))return d("Lane lacks that rule",{rule:t});let{rules:s,...i}=n.props,l=o.filter(u=>u!==t);return this.updateNode({...n,props:l.length>0?{...i,rules:l}:i}),d("Removed lane rule",{rule:t})},addGoal(e,t){let n=this.getNode(e);if(!n)return a("Unable to add goal, missing target");let r=Et(n,"edit");if(r)return r;if(!j(n))return a("Target is not an issue");if(!this.getGoal(t))return a("Goal not found");let o=n.props.goals??[];return o.includes(t)?a("Already in that goal"):(this.updateNode({...n,props:{...n.props,goals:[...o,t]}}),d("Added to goal",{goal:t}))},removeGoal(e,t){let n=this.getNode(e);if(!n)return a("Unable to remove goal, missing target");let r=Et(n,"edit");if(r)return r;if(!j(n))return a("Target is not an issue");let o=n.props.goals??[];if(!o.includes(t))return d("Not in that goal",{goal:t});let{goals:s,...i}=n.props,l=o.filter(u=>u!==t);return this.updateNode({...n,props:l.length>0?{...i,goals:l}:i}),d("Removed from goal",{goal:t})},createGoal(e){if(h().goals[e.id])return a("Goal already exists");let t=ue(n=>({...n,goals:{...n.goals,[e.id]:e}}));return c(t)?a("Could not create goal"):d("Goal created",e)},renameGoal(e,t){let n=this.getGoal(e);if(!n)return a("Goal not found");let r={...n,name:t},o=ue(s=>({...s,goals:{...s.goals,[e]:r}}));return c(o)?a("Unable to rename goal"):d("Renamed goal",r)},setGoalDescription(e,t){let n=this.getGoal(e);if(!n)return a("Goal not found");let{description:r,...o}=n,s=t?{...o,description:t}:o,i=ue(l=>({...l,goals:{...l.goals,[e]:s}}));return c(i)?a("Unable to describe goal"):d("Described goal",{md:t})},tombstoneGoal(e){let t=h().goals[e];if(!t)return a("Goal not found");let n={...t,tombstoned:!0},r=ue(o=>({...o,goals:{...o.goals,[e]:n}}));return c(r)?a("Unable to remove goal"):d("Tombstoned goal",n)},getGoal(e){let t=h().goals[e];return t?.tombstoned?void 0:t},tombstoneTag(e){let t=this.getTagRecord(e);if(!t)return a("Tag not found");let n={...t,tombstoned:!0},r=ue(o=>({...o,tags:{...o.tags,[e]:n}}));return c(r)?a("Unable to delete tag"):d("Tombstoned tag",n)},restoreTag(e,t){let n=this.getTagRecord(e);if(!n)return a("Tag not found");let r={...n,name:t,tombstoned:!1},o=ue(s=>({...s,tags:{...s.tags,[e]:r}}));return c(o)?a("Unable to restore tag"):d("Restored tag",r)},createTag(e){let t=ue(n=>({...n,tags:{...n.tags,[e.id]:e}}));return c(t)?a("Could not create tag"):d("Tag created",e)},createNode(e){let t=or("nodes",e.id,e);return c(t)?a("Unable to create node"):d("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return a("Failed to locate node");let n={...t,readonly:!0},r=or("nodes",e,n);return c(r)?a(r.message):d("Locked node",n)},updateNode(e){let t=or("nodes",e.id,e);return c(t)?t:d("Updated node",e)},getContributor(e){return h().contributors[e]},getTag(e){let t=h().tags[e];return t?.tombstoned?void 0:t},getTagRecord(e){return h().tags[e]},getTags(){return Object.values(h().tags).filter(e=>!e.tombstoned)},findTagByName(e){return this.getTags().find(t=>t.name===e)},getNode(e){return h().nodes[e]},getSiblings(e){return be(e)}};var xI=(e,t)=>e+" ".repeat(Math.max(0,t-Gb(e))),RI=(e,t)=>" ".repeat(Math.max(0,t-Gb(e)))+e,Wb=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","add.issue.goal":"Added to goal","add.swimlane.rule":"Added lane rule","remove.swimlane.rule":"Removed lane rule","remove.issue.goal":"Removed from goal","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.goal":"Created goal","rename.goal":"Renamed goal","edit.goal.description":"Described goal","tombstone.goal":"Removed goal","create.contributor":"Added contributor","rename.contributor":"Renamed contributor","link.contributor.user":"Linked contributor","link.contributor.email":"Claimed","unlink.contributor.email":"Unclaimed","connect.repo":"Connected repo","edit.repo":"Edited repo","disconnect.repo":"Disconnected repo","tombstone.contributor":"Removed contributor","restore.contributor":"Restored contributor","rebalance.children":"Rebalanced order"})[e]??(e.endsWith("e")?`${e}d`:`${e}ed`),EI=(e,t)=>t?e<t?"up":e>t?"down":null:null,SI=(e,t)=>{let n=R.getNode(e.payload.parent),r=n?In.dim.bgBlack(` ${n.title} `):"unknown",o=t.at(-1);if(o&&"parent"in o&&"rank"in o&&o.parent===e.payload.parent){let s=EI(e.payload.rank,o.rank);if(s)return`Moved ${s} in ${r}`}return`Moved issue to ${r}`},zb=e=>`${Math.max(1,Math.round(e/1024))} KB`,Vb=e=>R.getAttachment(e)?.name??"",Yi=e=>h().goals[e]?.name??"",CI=e=>{switch(e.action){case"add.issue.tag":{let t=h().tags[e.payload.tag];return t?In.bgHex(Ue(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=h().tags[e.payload.tag];return t?In.bgHex(Ue(t.name))(` ${t.name} `):"unknown tag"}case"tombstone.tag":{let t=h().tags[e.payload.id];return t?`"${t.name}"`:""}case"add.issue.goal":case"remove.issue.goal":return Yi(e.payload.goal);case"add.swimlane.rule":case"remove.swimlane.rule":return`"${e.payload.rule}"`;case"edit.goal.description":case"tombstone.goal":return`"${Yi(e.payload.id)}"`;case"add.issue.assignee":{let t=h().contributors[e.payload.assignee];return t?In.hex(Ue(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=h().contributors[e.payload.assignee];return t?In.hex(Ue(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.goal":case"rename.goal":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"connect.repo":case"edit.repo":case"disconnect.repo":return ra(e);case"add.issue.attachment":return`"${e.payload.name}" ${In.dim(`(${zb(e.payload.bytes)})`)}`;case"delete.issue.attachment":{let t=Vb(e.payload.id);return t?`"${t}"`:""}default:return""}},NI=e=>{let t=vn(kn(e));return In.gray(RI(t,8))},wI=12,II=e=>xI(`${e}`,wI),AI=e=>{let t=pe();return c(t)?e:da(e,t.value.contributors[e]?.name)},TI=e=>{switch(e.action){case"add.issue.tag":case"remove.issue.tag":{let t=h().tags[e.payload.tag];return t?t.name:""}case"add.issue.assignee":case"remove.issue.assignee":{let t=h().contributors[e.payload.assignee];return t?t.name:""}case"add.issue.goal":case"remove.issue.goal":return Yi(e.payload.goal);case"add.swimlane.rule":case"remove.swimlane.rule":return`"${e.payload.rule}"`;case"edit.goal.description":case"tombstone.goal":return`"${Yi(e.payload.id)}"`;case"tombstone.tag":{let t=h().tags[e.payload.id];return t?`"${t.name}"`:""}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"restore.tag":case"create.goal":case"rename.goal":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"connect.repo":case"edit.repo":case"disconnect.repo":return ra(e);case"move.node":{let t=R.getNode(e.payload.parent);return t?`to ${t.title}`:""}case"add.issue.attachment":return`"${e.payload.name}" (${zb(e.payload.bytes)})`;case"delete.issue.attachment":{let t=Vb(e.payload.id);return t?`"${t}"`:""}default:return""}},_y=e=>[Wb(e.action),TI(e)].filter(Boolean).join(" "),Kb=(e,t)=>{let n=NI(e.id),r=II(AI(e.userId)),o=In.dim("\u203A"),s=e.action==="move.node"?SI(e,t):[Wb(e.action),CI(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${s}`};var MI=e=>he(e,"comments"),kI=e=>he(e,"description"),LI=e=>he(e,"assignees"),PI=e=>he(e,"tags"),OI=e=>he(e,"history"),DI=e=>he(e,"diff"),FI=e=>he(e,"attachments"),is=({id:e,name:t,parentNodeId:n,rank:r,value:o,readonly:s=!1,childRenderAxis:i="horizontal"})=>{let l=R.getNode(e);if(!l){let p=R.createNode({...Ae.field({id:e,name:t,parentNodeId:n,rank:r,props:{value:o},isVirtual:!0}),readonly:s,childRenderAxis:i});return c(p)?p:d("Virtual field created",void 0)}if(!Fe(l))return a(`Existing virtual node ${e} is not a field`);if(!(l.title!==t||l.parentNodeId!==n||l.rank!==r||l.props.value!==o||l.readonly!==s||l.childRenderAxis!==i))return d("Virtual field unchanged",void 0);let m=R.updateNode({...l,title:t,parentNodeId:n,rank:r,props:{...l.props,value:o},readonly:s,childRenderAxis:i});return c(m)?m:d("Virtual field updated",void 0)},qb=({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!1,childRenderAxis:s="horizontal"})=>{let i=R.getNode(e);if(!i){let m=R.createNode({...Ae.fieldList({id:e,name:t,parentNodeId:n,rank:r,isVirtual:!0}),readonly:o,childRenderAxis:s});return c(m)?m:d("Virtual field list created",void 0)}if(!zr(i))return a(`Existing virtual node ${e} is not a field list`);if(!(i.title!==t||i.parentNodeId!==n||i.rank!==r||i.readonly!==o||i.childRenderAxis!==s))return d("Virtual field list unchanged",void 0);let u=R.updateNode({...i,title:t,parentNodeId:n,rank:r,readonly:o,childRenderAxis:s});return c(u)?u:d("Virtual field list updated",void 0)},Xi=null,_I=()=>{if(Xi)return d("Virtual field ranks",Xi);let e=lt(Mt/4n),t=lt(Mt/2n),n=lt(Mt*3n/4n),r=lt(Mt*7n/8n),o=lt(Mt*15n/16n),s=lt(Mt*13n/16n),i=lt(Mt*27n/32n);return c(e)?e:c(t)?t:c(n)?n:c(r)?r:c(o)?o:c(s)?s:c(i)?i:(Xi={description:e.value,assignees:t.value,tags:n.value,comments:r.value,attachments:o.value,log:s.value,diff:i.value},d("Virtual field ranks",Xi))},Rc=e=>{let t=_I();if(c(t))return t;let n=t.value,r=is({id:kI(e.id),name:ge.DESCRIPTION,parentNodeId:e.id,rank:n.description,value:e.props.description??"",childRenderAxis:"vertical"});if(c(r))return r;let o=qb({id:LI(e.id),name:ge.ASSIGNEES,parentNodeId:e.id,rank:n.assignees,readonly:!0});if(c(o))return o;let s=qb({id:PI(e.id),name:ge.TAGS,parentNodeId:e.id,rank:n.tags,readonly:!0});if(c(s))return s;let i=is({id:MI(e.id),name:ge.COMMENTS,parentNodeId:e.id,rank:n.comments,value:"",readonly:!1,childRenderAxis:"vertical"});if(c(i))return i;let l=is({id:FI(e.id),name:ge.ATTACHMENTS,parentNodeId:e.id,rank:n.attachments,value:"",readonly:!0,childRenderAxis:"vertical"});if(c(l))return l;let u=is({id:OI(e.id),name:ge.HISTORY,parentNodeId:e.id,rank:n.log,value:$I(e),readonly:!0,childRenderAxis:"vertical"});if(c(u))return u;let m=is({id:DI(e.id),name:ge.DIFF,parentNodeId:e.id,rank:n.diff,value:"",readonly:!0,childRenderAxis:"vertical"});return c(m)?m:d("Ticket virtual nodes materialized",void 0)},$I=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=>Kb(r,n.get(r.action)??[])).join(`
116
+ `)},Yb=!0,CJ=e=>{Yb=e},Ec=()=>Yb,NJ=()=>{let{nodes:e}=h();for(let t of Object.values(e)){if(!j(t))continue;let n=Rc(t);if(c(n))return n}return d("Virtual nodes materialized",void 0)};export{gs as a,K as b,wt as c,_ as d,Se as e,hu as f,ve as g,It as h,to as i,Yv as j,Ee as k,Ft as l,Ye as m,Nm as n,ne as o,$T as p,ut as q,A as r,Ue as s,Md as t,eA as u,kd as v,tA as w,ev as x,yd as y,An as z,nn as A,lv as B,ra as C,oa as D,kn as E,cs as F,Cd as G,ls as H,da as I,ua as J,Pd as K,tt as L,nt as M,ar as N,ma as O,cA as P,cr as Q,lA as R,Dd as S,j as T,Fd as U,rt as V,Vr as W,y as X,Ln as Y,Pn as Z,dt as _,hA as $,ju as aa,Cs as ba,zu as ca,Yu as da,co as ea,on as fa,sn as ga,b as ha,mt as ia,lo as ja,Dn as ka,tm as la,ax as ma,As as na,om as oa,Ha as pa,Ms as qa,Wa as ra,an as sa,am as ta,ux as ua,fx as va,ja as wa,wM as xa,gx as ya,lm as za,IM as Aa,hx as Ba,dm as Ca,um as Da,ke as Ea,Hx as Fa,Bn as Ga,ec as Ha,yk as Ia,bk as Ja,At as Ka,Tt as La,Om as Ma,$s as Na,Wn as Oa,zn as Pa,Q as Qa,Er as Ra,it as Sa,bc as Ta,Ae as Ua,un as Va,Co as Wa,s0 as Xa,bp as Ya,qs as Za,vp as _a,xp as $a,Y as ab,Sc as bb,Ys as cb,at as db,V0 as eb,Vn as fb,kc as gb,mE as hb,Fc as ib,pE as jb,jc as kb,Vc as lb,ii as mb,qc as nb,HE as ob,If as pb,Qc as qb,VE as rb,JE as sb,eS as tb,iS as ub,hl as vb,og as wb,sg as xb,ig as yb,gn as zb,se as Ab,Tr as Bb,nC as Cb,x_ as Db,C as Eb,A_ as Fb,be as Gb,hi as Hb,yi as Ib,V as Jb,Wo as Kb,A$ as Lb,Xg as Mb,Ri as Nb,zo as Ob,NC as Pb,Xn as Qb,Jg as Rb,Tl as Sb,kr as Tb,gh as Ub,Ml as Vb,vh as Wb,xh as Xb,yt as Yb,bt as Zb,Pr as _b,Ti as $b,hj as ac,ly as bc,jr as cc,mG as dc,gy as ec,Sy as fc,Iz as gc,My as hc,ky as ic,Az as jc,Vy as kc,ob as lc,AK as mc,lb as nc,db as oc,Vi as pc,hb as qc,yb as rc,Sb as sc,gI as tc,h as uc,pe as vc,I as wc,Pe as xc,le as yc,Nn as zc,gt as Ac,Qe as Bc,vI as Cc,R as Dc,Wb as Ec,_y as Fc,is as Gc,qb as Hc,Rc as Ic,CJ as Jc,Ec as Kc,NJ as Lc};