epiq 1.17.0 → 1.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Index-RF3FTG55.js +17 -0
- package/dist/{args-D7OXPSAH.js → args-2F7WNQYO.js} +1 -1
- package/dist/chunk-5WUPZIRV.js +120 -0
- package/dist/chunk-6R2YRUOL.js +2 -0
- package/dist/{chunk-ITVJCUOL.js → chunk-J3S3W27J.js} +1 -1
- package/dist/gui/main.js +118 -117
- package/dist/index.js +1 -1
- package/dist/mcp.js +1 -1
- package/dist/{server-JQTYRNQ7.js → server-NKAY4NNC.js} +1 -1
- package/dist/{virtual-nodes-XI6JN2RD.js → virtual-nodes-DSAMVKWE.js} +1 -1
- package/package.json +1 -1
- package/dist/Index-3QU43YBE.js +0 -17
- package/dist/chunk-2KWSZBVJ.js +0 -2
- package/dist/chunk-7KCKIQRO.js +0 -116
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import{a as na,c as Nd,d as wd,f as Id}from"./chunk-WUCQWBQE.js";import{a as ir,b as a,c as d,d as c,e as St}from"./chunk-5RIQL7P4.js";import{createHash as mv}from"node:crypto";var av=new Set(["https:","http:","ssh:","git:","file:"]),cv=/^[A-Za-z0-9][\w.-]*@[A-Za-z0-9][\w.-]*:[^:]+$/,lv=/^[\x21-\x7e]+$/,dv=2048,Ad="Use https://, ssh://, git:// or user@host:path.",Td=()=>globalThis.process?.env?.EPIQ_ALLOW_LOCAL_REPOS==="1",Vr=(e,t=Td())=>{if(e.length>dv)return"is too long";if(!lv.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(cv.test(e))return null;let n;try{n=new URL(e)}catch{return"is not a remote URL"}return/%/.test(uv(e))?"percent-encodes its host":av.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"},uv=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)},nn=(e,t=Td())=>Vr(e,t)===null;var oa=()=>({entries:{},seq:0}),sa="default",ia="board",An=20,pv=/^\d{4}-\d{2}-\d{2}$/,fv=/^[a-z0-9][a-z0-9._-]{0,23}$/,Md=/-[0-9a-f]{12}$/,Tn=e=>e==="board"||e==="all"||gv(e),gv=e=>{if(!pv.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=>fv.test(e)&&!Md.test(e),hv=/^([^@/]+@)([^:/]+)(:.*)$/,yv=/^([a-z][a-z0-9+.-]*:\/\/)([^/]*)(.*)$/i,bv=e=>{let t=hv.exec(e);if(t)return`${t[1]}${t[2].toLowerCase()}${t[3]}`;let n=yv.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]}`},kd=e=>bv(e.trim().replace(/\/+$/,"").replace(/\.git$/i,"")),Pt=e=>(kd(e).toLowerCase().split(/[/:]/).filter(Boolean).pop()??"").replace(/[^a-z0-9._-]/g,"-").slice(0,24).replace(/^[.-]+/,"")||"repo",rn=e=>`${Pt(e)}-${mv("sha1").update(kd(e)).digest("hex").slice(0,12)}`,Kr=e=>e.replace(Md,""),Ld=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},ra=(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},aa=(e,t)=>{let n=t.payload&&typeof t.payload=="object"?t.payload:{},r=Ld(n);if(t.action==="connect.repo"){let l=typeof n.url=="string"?n.url.trim():"";if(l==="")return a("no URL");let u=rn(l),m=Object.hasOwn(e.entries,u)?e.entries[u]:void 0,p=m?.live===!0?ra(m,r):ra({id:u,url:l,branches:sa,since:ia,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=ra(s,r);return e.entries[o]=i,d("Edited repo",i)},vv=e=>e==="connect.repo"||e==="edit.repo"||e==="disconnect.repo",Pd=e=>{let t=oa();for(let n of e)vv(n.action)&&aa(t,{action:n.action,payload:n.payload});return t},Od=e=>{let t=Object.values(e.entries),n=t.filter(s=>s.live&&nn(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)}},ca=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"?Kr(t.repo):"";if(e.action!=="edit.repo")return r;let o=Ld(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 Qb from"string-width";import{decodeTime as Dd}from"ulid";var us=1440*60*1e3,la=(e,t=Date.now())=>e>t+us?t:e,kn=e=>la(Dd(e)),ms=e=>{let t=Date.now()+us,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})},Fd=e=>{try{return d("Decoded date",new Date(kn(e)))}catch(t){return a("Decoding failed + "+t.message)}},ps=e=>{if(!e?.id)return null;try{return Dd(e.id)}catch{return null}};import ar 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},fs={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 ua={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},ma=(e,t,n)=>Math.max(t,Math.min(n,e)),da=(e,t,n)=>e+(t-e)*n,pa=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},$d=e=>e.toLowerCase().trim(),Bd=(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)]},gs=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,_d=e=>{let t=e.replace("#","");return[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]},Ud=(e,t,n)=>{let r=ma(n,0,1);return[Math.round(da(e[0],t[0],r)),Math.round(da(e[1],t[1],r)),Math.round(da(e[2],t[2],r))]};var xv=(e,t,n)=>Ud(e,t,n),fa=e=>{let t=pa(e)%360,n=Bd(t,ua.stringColor.saturation,ua.stringColor.lightness);return gs(n)},Ue=(e,t=fs)=>{let n=$d(e??"");return n&&t[n]?t[n]:fa(n)},jd=e=>gs(Bd(pa($d(e))%360,28,58));var Hd=e=>{let t=ua.gradient.stops,n=ma(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 xv(t[s],t[s+1],i)},vA=(e,t)=>{if(e.length===0)return"#000000";if(e.length===1)return e[0];let n=e.length-1,r=ma(t,0,1)*n,o=Math.min(Math.floor(r),n-1);return gs(Ud(_d(e[o]),_d(e[o+1]),r-o))},Gd=e=>gs(Hd(e)),hs=e=>pa(e.toLowerCase().trim())/4294967295,Wd=e=>{let t=hs(e);return Hd(t)},Rv=e=>{let[t,n,r]=Wd(e);return{normal:o=>ar.bgRgb(t,n,r).black(o),cursor:o=>ar.bgRgb(t,n,r).white.bold(o)}},xA=e=>{let[t,n,r]=Wd(e);return{fg:o=>ar.rgb(t,n,r)(o),fgCursor:o=>ar.rgb(t,n,r).inverse(o),bg:o=>ar.bgRgb(t,n,r).black(o),bgCursor:o=>ar.bgRgb(t,n,r).white.bold(o)}},ys=e=>Rv(e).normal(` ${e} `);var Ev="Unknown",ga=(e,t)=>t?.length?t:e?.length?e:Ev,ha=(e,t)=>{let n=ga(e,t);return{id:e?.length?e:n,name:n,color:Ue(n)}};var zd="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")},Vd=["png","jpg","gif","webp"];var nt=e=>e.trim().toLowerCase(),cr=e=>{let t=nt(e);return t.length>0&&t.length<=254&&/^[^\s@]+@[^\s@]+$/.test(t)},ya=(e,t)=>`${nt(e)} ${t}`,ba=e=>!e.tombstoned,IA=(e,t)=>{let n=nt(t),r=new Set;for(let o of Object.values(e))ba(o)&&o.email===n&&r.add(o.contributor);return[...r]},lr=(e,t)=>{let n=new Set;for(let r of Object.values(e))ba(r)&&r.contributor===t&&n.add(r.email);return[...n]},AA=e=>{let t=new Map;for(let r of Object.values(e)){if(!ba(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 Kd=(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 va(e){return e.context===re.WORKSPACE}function U(e){return e.context===re.TICKET}function qd(e){return e.context===re.TEXT}function Fe(e){return e.context===re.FIELD}function qr(e){return e.context===re.FIELD_LIST}var rt=e=>e.context===re.SWIMLANE,Yr=e=>e.context===re.BOARD,Xr=e=>e.context===re.COMMENT;import{useSyncExternalStore as DI}from"react";var y={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette",IDENTITY:"identity"};var Yd=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",Xd=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",Jd=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",Zd=(e,t)=>{if(Xd(e,e.sequence))return C.MoveCursorLeftOfWord;if(Jd(e,e.sequence))return C.MoveCursorRightOfWord;if(Yd(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}},Qd=(e,t)=>{if(Xd(e,e.sequence))return C.MoveCursorLeftOfWord;if(Jd(e,e.sequence))return C.MoveCursorRightOfWord;if(Yd(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 eu from"string-width";function bs(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)+"...",Sv=/\u001B\[[0-9;]*m/,xa="\x1B[0m",Cv=e=>[...new Intl.Segmenter(void 0,{granularity:"grapheme"}).segment(e)].map(({segment:t})=>t),Pn=(e,t)=>{if(t<=0)return"";if(eu(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(Sv.test(l)){o+=l,i=l!==xa&&l!=="\x1B[m";continue}for(let u of Cv(l)){let m=eu(u);if(s+m>r)return`${o}...${i?xa:""}`;o+=u,s+=m}}return`${o}...${i?xa:""}`},dt=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim(),DA=e=>e.charAt(0).toUpperCase()+e.slice(1);var tu=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},nu=(e,t)=>t?e.get(t)??[]:[];var ru=new WeakMap,Nv=e=>{let t=ru.get(e);return t||(t=tu(e),ru.set(e,t)),t};var ou=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return nu(Nv(e),r).filter(s=>bs(r,s.toLowerCase())>=n)};var wv={hint:"",hints:[],overlap:0,remainder:""},iu=({inputToMatch:e,lastWord:t,isLastWordCompleted:n,inputString:r},o,s=[])=>{if(n||e===""){let[l]=s;return s.length===1&&l&&!r.trim()?su("",[l]):wv}let i=ou({wordList:o,inputToMatch:e,overlapThreshold:1});return su(t,i)},su=(e,t)=>{let n=t[0]??"",r=bs(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 dr=e=>{let t=typeof e=="number"?e:Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<3e3||t>864e5?null:t},vs=e=>e==null||!Number.isFinite(e)?1e4:Math.min(864e5,Math.max(1,e));import co from"node:fs";import lo from"node:path";import{z as fr}from"zod";import ao from"node:fs";import{ulid as ix}from"ulid";import{z as ws}from"zod";import ro from"node:fs";import Dt from"node:path";import on from"node:fs";import Ke from"node:path";import Iv from"node:os";import Av from"node:path";var Ct=".epiq-global",ze=()=>process.env.EPIQ_GLOBAL_DIR??Av.join(Iv.homedir(),Ct);var Ra=(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 wa from"path";import Tv from"util";var au=500,Ia=4*1024*1024,Ea=16*1024,Mv=50,Sa=0,cu=()=>process.env.EPIQ_MCP==="true",kv=()=>{let e=process.cwd(),t=xs(e);return c(t)?cu()?wa.join(ze(),"epiq-mcp.log"):void 0:wa.join(t.value,je,"log","epiq.log")},Lv=(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 Pv(e){if(!Nt.existsSync(e))return;let t=Nt.statSync(e).size,n=Lv(e,Ia).split(`
|
|
4
|
+
`);if(n[n.length-1]===""&&n.pop(),t<=Ia&&n.length<=au)return;let r=n.slice(-au).join(`
|
|
5
|
+
`)+`
|
|
6
|
+
`;Nt.writeFileSync(e,r,"utf8")}var Ov=e=>{if(e.length<=Ea)return e;let t=e.length-Ea;return`${e.slice(0,Ea)} \u2026 [${t} more chars]`};function Ca(e,t,n=!1){let r=kv();if(!r)return;let o=Ov(Tv.format(...t)),s=new Date,l=`[${n?s.toISOString().slice(11,19):s.toISOString()}] ${e} ${o}
|
|
7
|
+
`;try{Nt.mkdirSync(wa.dirname(r),{recursive:!0}),Nt.appendFileSync(r,l,"utf8"),Sa++,(Sa>=Mv||Nt.statSync(r).size>Ia)&&(Sa=0,Pv(r))}catch{}}var Na=()=>cu()?process.env.EPIQ_MCP_LOG_LEVEL??"error":process.env.EPIQ_LOG_LEVEL??"debug",K={info(...e){let t=Na();(t==="info"||t==="debug")&&Ca("[Info]",e,!1)},debug(...e){Na()==="debug"&&Ca("[Debug]",e,!0)},error(...e){let t=Na();if(t==="error"||t==="info"||t==="debug"){let r=e.some(o=>o instanceof Error)?void 0:new Error().stack;Ca("[Error]",[...e,r].filter(Boolean),!1)}}};globalThis.logger=K;import{spawn as mu}from"node:child_process";import Ve from"node:fs";import we from"node:path";var pe={stage:({cwd:e,pathspec:t,ignoreRemoval:n=!1})=>F({args:["add",...n?["--ignore-removal"]:[],...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1,pathspec:r})=>F({args:["commit","--no-verify",...n?["--allow-empty"]:[],"-m",t,...r?.length?["--",...r]:[]],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>F({args:["fetch",t,`+refs/heads/${n}:refs/remotes/${t}/${n}`],cwd:e}),rebaseOnto:({cwd:e,ref:t})=>F({args:["-c","rebase.autoStash=true","rebase",t],cwd:e}),checkout:({cwd:e,branch:t})=>F({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 F({args:o,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>F({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>F({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>F({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>F({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 pu="Output past",Es=e=>e.includes(pu),fu="Git command timed out",Ss=e=>e.includes(fu),Ta=1e4,Dv=12e4,Ma=256*1024*1024,gu=64*1024,Fv=8*1024*1024,_v=new Set(["fetch","push","pull","clone","ls-remote","rebase","checkout","worktree"]),$v=e=>{let t=yu(e);return t&&_v.has(t)?Dv:Ta},Bv=()=>{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"},hu=Bv(),Uv=["GIT_DIR","GIT_WORK_TREE","GIT_INDEX_FILE","GIT_OBJECT_DIRECTORY","GIT_ALTERNATE_OBJECT_DIRECTORIES","GIT_COMMON_DIR","GIT_NAMESPACE"],jv=e=>Object.fromEntries(Object.entries(e).filter(([t])=>!Uv.includes(t))),ka={...jv(process.env),GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo",GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND??"ssh -o BatchMode=yes -o ConnectTimeout=10"},Hv=["-c","diff.noprefix=false","-c","diff.mnemonicPrefix=false","-c","diff.srcPrefix=a/","-c","diff.dstPrefix=b/","-c","log.showSignature=false"],Gv=new Set(["log","show","diff"]),yu=e=>e.find((t,n)=>!t.startsWith("-")&&e[n-1]!=="-c"),Wv=e=>Gv.has(yu(e)??"")?Hv:[],bu=()=>["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]),zv=/^[\w-]+[\\/][a-z0-9._-]+-[0-9a-f]{12}\.git(\.\d+(-\d+)?(\.[0-9a-f-]{36})?\.pending)?$/,lu=e=>{try{return Ve.realpathSync(e)}catch{return we.resolve(e)}},La=e=>{let t=we.join(ze(),"repos");return[[we.resolve(t),we.resolve(e)],[lu(t),lu(e)]].some(([n,r])=>zv.test(we.relative(n,r)))},Vv=e=>La(e)?["--git-dir=.",...bu()]:[],vu={...Object.fromEntries(Object.entries(ka).filter(([e])=>e!=="GIT_ALLOW_PROTOCOL")),LC_ALL:"C",LANGUAGE:"",GIT_PROTOCOL_FROM_USER:"0"},Rs=new Set,du=!1,xu=process.platform!=="win32",Ru=(e,t)=>{try{if(xu&&e.pid){process.kill(-e.pid,t);return}}catch{}e.kill(t)},Aa=(e="SIGTERM")=>{for(let t of Rs)Ru(t,e)},Kv=["SIGTERM","SIGINT","SIGHUP"],Eu=!1,Su=()=>Eu,qv=2e3,Cu=()=>{if(du)return;du=!0,process.once("exit",()=>Aa());let e=new Map;for(let t of Kv)e.set(t,()=>{Eu=!0;let n=()=>{for(let[s,i]of e)process.off(s,i);process.kill(process.pid,t)};Aa();let r=Date.now()+qv,o=()=>{if(Rs.size===0)return n();if(Date.now()>=r)return Aa("SIGKILL"),n();setTimeout(o,20)};o()});for(let[t,n]of e)process.once(t,n)},Nu=e=>{Rs.add(e),e.once("close",()=>Rs.delete(e))},wu=({args:e,cwd:t,allowFail:n,timeoutMs:r,maxOutput:o=Ma,forClone:s=!1,keepPartial:i=!1,abort:l,input:u})=>new Promise(m=>{let p=La(t),f=p||s,g=[...Wv(e),...p?["--git-dir=."]:[],...f?bu():[],...e];if(!Ve.existsSync(t)){let B=`Git cwd does not exist: ${t}`;if(n){m({stdout:"",stderr:B,exitCode:1});return}m(a(B));return}f&&Cu();let v=mu(hu,g,{cwd:t,stdio:["pipe","pipe","pipe"],env:f?vu:ka,detached:f&&xu});f&&Nu(v),v.stdin.on("error",()=>{}),v.stdin.end(u??"");let S=B=>f?Ru(v,B):v.kill(B),x=!1,E="",w="",N=B=>{x||(x=!0,clearTimeout(P),m(B))},k=r??$v(g),L=!1,_=()=>[`git ${g.join(" ")}`,`cwd=${t}`,`${fu} after ${k}ms`].join(`
|
|
8
|
+
`),M=()=>N(n?{stdout:E,stderr:_(),exitCode:124}:a(_())),P=setTimeout(()=>{L=!0,S("SIGTERM"),setTimeout(()=>S("SIGKILL"),3e3).unref(),setTimeout(M,6e3).unref()},k),$=null,ge=()=>{let B=[`git ${g.join(" ")}`,$].join(`
|
|
9
|
+
`);N(n?{stdout:E,stderr:B,exitCode:1}:a(B))},G=()=>{$=String(l?.reason??"stopped"),S("SIGTERM"),setTimeout(()=>S("SIGKILL"),3e3).unref(),setTimeout(ge,6e3).unref()};l?.aborted?G():l?.addEventListener("abort",G,{once:!0}),v.stdout.setEncoding("utf8"),v.stderr.setEncoding("utf8"),v.stdout.on("data",B=>{if(E+=B,E.length>o){if(S("SIGTERM"),i&&!n){let tn=E.slice(0,o);N(d("Git output cut",{stdout:tn.slice(0,tn.lastIndexOf(`
|
|
10
|
+
`)+1),stderr:w,exitCode:0,truncated:!0}));return}let Re=`git ${g.join(" ")}
|
|
11
|
+
${pu} ${o} characters; stopped`;N(n?{stdout:"",stderr:Re,exitCode:1}:a(Re))}}),v.stderr.on("data",B=>{w.length<gu&&(w+=B)}),v.on("error",B=>{if(n){N({stdout:E,stderr:B.message,exitCode:1});return}N(a([`git ${g.join(" ")}`,`cwd=${t}`,B.message].join(`
|
|
12
|
+
`)))}),v.on("close",B=>{if(l?.removeEventListener("abort",G),L)return M();if($!==null)return ge();let Re=B??1;if(n){N({stdout:E,stderr:w,exitCode:Re});return}if(Re!==0){N(a([`git ${g.join(" ")}`,w.trim()||E.trim()||"Git command failed"].filter(Boolean).join(`
|
|
13
|
+
`)));return}N(d("Git command succeeded",{stdout:E,stderr:w,exitCode:Re}))})}),F=({args:e,cwd:t,timeoutMs:n,maxOutput:r,forClone:o,keepPartial:s,abort:i,input:l})=>wu({args:e,cwd:t,allowFail:!1,timeoutMs:n,maxOutput:r,forClone:o,keepPartial:s,abort:i,input:l}),Se=({args:e,cwd:t})=>wu({args:e,cwd:t,allowFail:!0}),Iu=(e,t)=>new Promise(n=>{if(e.length===0){n(d("No blobs to read",new Map));return}let r=La(t);r&&Cu();let o=mu(hu,[...Vv(t),"cat-file","--batch"],{cwd:t,stdio:["pipe","pipe","pipe"],env:r?vu:ka});r&&Nu(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 ${Ta}ms`))},Ta),p=0;o.stdout.on("data",f=>{if(p+=f.length,p>Ma){o.kill("SIGTERM"),u(a(`git cat-file --batch: past ${Ma} bytes; stopped`));return}s.push(f)}),o.stderr.setEncoding("utf8"),o.stderr.on("data",f=>{i.length<gu&&(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,S=0;for(let x of e){let E=g.indexOf(10,S);if(E===-1){u(a(`git cat-file --batch output ended before a header for ${x}`));return}let w=g.toString("utf8",S,E);S=E+1;let N=/^[0-9a-f]{4,64} \S+ (\d+)$/.exec(w);if(!N||!N[1]){u(a(`Unexpected git cat-file --batch header: "${w}"`));return}let k=Number(N[1]);k<=Fv&&v.set(x,g.toString("utf8",S,S+k)),S+=k+1}u(d("Read blobs",v))}),o.stdin.write(e.join(`
|
|
15
|
+
`)+`
|
|
16
|
+
`),o.stdin.end()}),mr=async({cwd:e,message:t,pathspec:n})=>{let r=await pe.commit({cwd:e,message:t,pathspec:n});if(c(r))return a(`Failed to create commit
|
|
17
|
+
${r.message}`);let o=await F({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())},Jr=async e=>{let t=await F({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))},Pa=async e=>{let t=await Jr(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)},Au=async e=>{let t=await Pa(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)},Zr=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)},Cs=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}`)},ur=e=>{try{return Ve.realpathSync.native(e)}catch{return we.resolve(e)}},Tu=async({repoRoot:e,worktreeRoot:t})=>{let n=await F({args:["worktree","list","--porcelain"],cwd:e});if(c(n))return a(n.message);let r=ur(t),o=n.value.stdout.split(`
|
|
19
|
+
`).filter(s=>s.startsWith("worktree ")).map(s=>s.slice(9)).map(ur).includes(r);return d("Checked worktree registration",o)},Oa=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)},Ns=async e=>{let t=await F({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return c(t)?a(t.message):d("Resolved current branch",t.value.stdout.trim())},Mu=async e=>{let t=await F({args:["rev-parse","--short","HEAD"],cwd:e});return c(t)?a(t.message):d("Resolved short HEAD sha",t.value.stdout.trim())},ku=e=>e.includes("fetch first")||e.includes("non-fast-forward"),Lu=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},Yv=3,Xv=120,Jv=e=>new Promise(t=>setTimeout(t,e)),Zv=async(e,t)=>{let n=await pe.rebaseOnto({cwd:e,ref:t});for(let r=1;r<Yv;r+=1){if(!c(n)||await Lu(e))return n;await Jv(Xv),n=await pe.rebaseOnto({cwd:e,ref:t})}return n},Pu=async(e,{preserve:t=[]}={})=>{let n=await Jr(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)},Ou=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)},Da=async e=>{if(!await Lu(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)},uu=async e=>{let t=await Se({args:["rev-parse","HEAD"],cwd:e});return t.exitCode===0?t.stdout.trim():null},Qr=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),Qv=e=>e.includes("couldn't find remote ref")||e.includes("Could not find remote branch"),eo=async({cwd:e,branch:t})=>{let n=await Da(e);if(c(n))return a(n.message);let r=await uu(e),o=await pe.fetch({cwd:e,remote:ot,branch:t});if(c(o))return Qv(o.message)?d("Remote branch missing, skipped pull",!1):a(`Failed to fetch ${t}
|
|
21
|
+
${o.message}`);let s=await Zv(e,`${ot}/${t}`);if(c(s))return a(`Failed during rebase
|
|
22
|
+
${s.message}`);let i=await uu(e),l=r!==null&&i!==null&&r!==i;return d(l?"Pulled with rebase":"Already up to date",l)},Du=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")},Fu=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)},_u=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 $u=async e=>{let t=await Ns(e);return c(t)?a(t.message):d("Checked detached HEAD state",t.value==="HEAD")};var ju="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Hu=e=>Ke.join(je,Wt,e),Gu=()=>Ke.join(je,$a),Wu=ze,On=()=>Ke.join(Wu(),"worktrees"),ve=({repoRoot:e})=>{let t=Ot(e);return c(t)?a(t.message):d("Resolved state branch root",Ke.join(On(),t.value))},ex=e=>Ke.join(e,je),Bu=e=>Ke.join(ex(e),Wt);var to=e=>{try{return on.mkdirSync(e,{recursive:!0}),d("Ensured directory",void 0)}catch(t){return a(t instanceof Error?t.message:String(t))}},no=()=>{let e=Wu(),t=On(),n=!on.existsSync(e)||!on.existsSync(t),r=to(e);if(c(r))return a(`Ensure epiq home failed.
|
|
23
|
+
`+r.message);let o=to(t);return c(o)?a(`Ensure worktrees dir failed.
|
|
24
|
+
`+o.message):d("Ensured epiq storage",n)},zu=e=>{on.existsSync(e)&&(K.debug("[sync] remove path",e),on.rmSync(e,{recursive:!0,force:!0}))};var tx=`*.jsonl merge=union
|
|
25
|
+
`,nx=`*~pending*.jsonl
|
|
26
|
+
`,Fa=()=>Ke.join(je,Wt,".gitattributes"),_a=()=>Ke.join(je,Wt,".gitignore"),Uu=(e,t)=>{try{on.readFileSync(e,"utf8")!==t&&on.writeFileSync(e,t)}catch{on.writeFileSync(e,t)}},Vu=(e,t)=>{for(let n of[Bu(e),Bu(t)]){let r=to(n);if(c(r))return a(r.message)}return Uu(Ke.join(t,Fa()),tx),Uu(Ke.join(t,_a()),nx),d("Ensured state branch",void 0)},Ku=async e=>{let t=await F({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 F({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(c(o))return a(`Failed to clean storage branch
|
|
29
|
+
${o.message}`);let s=await mr({cwd:e,message:"[epiq:repair-storage-branch]",pathspec:r});return c(s)?a(s.message):d("Cleaned storage branch",!0)},It=Ra(async(e=process.cwd())=>{let t=await F({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)),MT=Ra(async e=>{let t=await F({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 _T=process.env.IS_LOCAL==="true",je=".epiq",Wt="events",$a="media",rx="project.json",oo=e=>Dt.join(e,je),pr=e=>Dt.join(oo(e),rx),qe=e=>Dt.join(oo(e),Wt),so=e=>Dt.join(oo(e),$a),qu=e=>Dt.join(e,je),ox=e=>{let t=Dt.join(e,je);return ro.existsSync(t)&&ro.statSync(t).isDirectory()},io=e=>{let t=pr(e);return ro.existsSync(t)&&ro.statSync(t).isFile()},xs=e=>{let t=Dt.resolve(e);for(;;){if(ox(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}},sx="No .epiq/project.json found in any parent",Ee=e=>{let t=Dt.resolve(e);for(;;){if(io(t))return d("Resolved closest epiq project root",t);let n=Dt.dirname(t);if(n===t)return a(sx);t=n}},Yu=e=>{let t=qe(e);try{return ro.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 Ba="__epiq_state__",ax=ws.object({projectId:ws.string().min(1),stateBranch:ws.string().min(1),createdAt:ws.iso.datetime()}),Is=()=>({projectId:ix(),stateBranch:Ba,createdAt:new Date().toISOString()}),He=e=>{let t=pr(e);if(!ao.existsSync(t))return a("Missing .epiq/project.json");try{let n=ao.readFileSync(t,"utf8"),r=JSON.parse(n),o=ax.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)},Ua=({repoRoot:e,fileContents:t})=>{let n=oo(e),r=pr(e);try{if(ao.mkdirSync(n,{recursive:!0}),ao.existsSync(r)){let o=He(e);return c(o)?a(o.message):d("Project already initialized",null)}return ao.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 As="recent-projects.json",cx=20,lx=fr.object({projectId:fr.string().min(1),root:fr.string().min(1),lastOpenedAt:fr.number().finite()}),dx=fr.object({projects:fr.array(lx)}),Ju=()=>lo.join(ze(),As),Zu=e=>lo.basename(e)||e,Xu=e=>{let t=lo.resolve(e);try{return co.realpathSync(t)}catch{return t}},Qu=(e,t)=>t.lastOpenedAt-e.lastOpenedAt,em=e=>{if(!io(e.root))return!1;let t=Ot(e.root);return!c(t)&&t.value===e.projectId},tm=()=>{let e=Ju();if(!co.existsSync(e))return d("No recent projects recorded",[]);let t;try{t=JSON.parse(co.readFileSync(e,"utf8"))}catch(r){return a(`Invalid ${As}: ${r instanceof Error?r.message:String(r)}`)}let n=dx.safeParse(t);return n.success?d("Read recent projects",n.data.projects):a(`Invalid ${As} shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},ux=e=>{let t=Ju();try{co.mkdirSync(lo.dirname(t),{recursive:!0}),co.writeFileSync(t,JSON.stringify({projects:e},null,2)+`
|
|
31
|
+
`,"utf8")}catch(n){return a(`Unable to write ${As}: ${n instanceof Error?n.message:String(n)}`)}return d("Recorded recent project",e)},Ts=({exclude:e}={})=>{let t=tm();if(c(t))return t;let n=e===void 0?null:Xu(e);return d("Listed recent projects",t.value.filter(r=>n===null||Xu(r.root)!==n).filter(em).sort(Qu))},nm=({root:e,now:t=Date.now()})=>{let n=lo.resolve(e),r=Ot(n);if(c(r))return a(r.message);let o=r.value,s=tm(),i=c(s)?[]:s.value,l=[{projectId:o,root:n,lastOpenedAt:t},...i.filter(u=>u.projectId!==o&&u.root!==n)].filter(em).sort(Qu).slice(0,cx);return ux(l)};import{useSyncExternalStore as mx}from"react";var uo={logLevel:"info",autoSyncIntervalMs:null,attachmentMaxKb:null,autoSync:null,preferredEditor:null,userName:null,userId:null,gitEmail:null,gitName:null,declinedEmailBoards:[],viewMode:null},ja=new Set,px=()=>{for(let e of ja)e()},ne=()=>uo,rM=()=>mx(e=>(ja.add(e),()=>{ja.delete(e)}),()=>uo),ut=e=>(uo={...uo,...e},px(),uo);var Ha=null,rm=e=>{Ha=e},om=e=>Ha?Ha(e):[];var sm=[],im=e=>{sm=e},gr=()=>sm;var mo=()=>{let e=ne(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim(),r=e.autoSync===!0||e.autoSync===!1,o=am(),s=o.length>0?null:Ga(),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}},Ga=()=>{let e=Ee(process.cwd());if(c(e))return null;let t=Ot(e.value);return c(t)?null:t.value||null},am=()=>{let{userId:e}=ne();return e?om(e):[]},cm=()=>am().length>0;var Wa=()=>{let e=Ee(process.cwd());if(c(e))return!1;let t=He(e.value);return St(t)},lm=e=>e===!0?"on":e===!1?"off":null,dm=e=>e==="on"?!0:e==="off"?!1:null,um=()=>{let e=mo();if(!e.isSetUserName)return"config username ";if(!e.isSetPreferredEditor)return"config editor ";if(!e.isSetAutoSync)return"config autoSync ";if(!Wa())return"init";if(!e.isSetEmails){let{gitEmail:t}=ne(),n=gr()[0]??t;return n&&cr(n)?`config emails ${n}`:"config emails "}return null};var fx=e=>e.props.tags??[],gx=e=>e.props.assignees??[],sn=e=>fx(e).map(t=>R.getTag(t)).filter(t=>!!t),an=e=>gx(e).map(t=>R.getContributor(t)).filter(t=>!!t),Ms=()=>{let{breadCrumb:e,selectedNode:t}=h(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!U(n)?a("Invalid untag target"):d("Retrieved tags from ticket in breadcrumb",sn(n))},ks=()=>{let{breadCrumb:e,selectedNode:t}=h(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!U(n)?a("Invalid unassign target"):d("Retrieved assignees from ticket in breadcrumb",an(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 hx=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[mt,hr]=hx;var po=["done"],za=e=>po.includes(e);var Ls=e=>po.filter(t=>!Dn(e).includes(t)),Dn=e=>(e.props?.rules??[]).filter(za),mm=(e,t,n)=>za(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}"`),yx=e=>e.title.trim().toLowerCase()==="done",Ps=e=>{let t=me();if(c(t))return!1;let n=t.value.nodes[e];return!!(n&&rt(n)&&(Dn(n).includes("done")||yx(n)))};var pm=new WeakMap,bx=e=>{let t=R.getNode(e);if(!t)return[];let n=pm.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 pm.set(t,o),o},fm=new WeakMap,vx=e=>{let t=fm.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 fm.set(e,r),r},gm=e=>{let t=new Set;for(let n of vx(e))for(let r of bx(n))t.add(r);return[...t]};var Os=()=>{let e=me();return c(e)?null:e.value},ym=()=>Os()?.nodes??{},xx=()=>Os()?.goals??{},Ka=e=>Os()?R.getGoal(e):void 0,qa=()=>Object.values(xx()).filter(e=>!e.tombstoned).sort((e,t)=>e.id.localeCompare(t.id)),Ds=e=>dt(e).trim(),Ya=e=>{let t=Ds(e);if(!t)return;let n=Ka(t);if(n)return n;let r=t.toLowerCase();return qa().find(o=>o.name.toLowerCase()===r)},cn=e=>{for(let t of e.props?.goals??[]){let n=Ka(t);if(n)return n}},bm=(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}}]:[]]},Rx=e=>jd(e.id),yr=e=>e.parentNodeId===mt,Ex=e=>(e.parentNodeId?ym()[e.parentNodeId]:void 0)?.parentNodeId??void 0,Sx=e=>{if(yr(e))return gm(e);let t=Ex(e);return t?[t]:[]},hm=new WeakMap,Fs=()=>{let e=Os();if(!e)return{members:new Map,onBoard:new Map,closed:new Set};let t=hm.get(e);if(t)return t;let n=new Map,r=new Map;for(let i of Object.values(ym())){if(!U(i)||i.isDeleted)continue;let l=cn(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 Sx(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(yr)&&o.add(i);let s={members:n,onBoard:r,closed:o};return hm.set(e,s),s},Cx=e=>Fs().members.get(e)??[],Va=e=>Fs().closed.has(e),vm=(e,t)=>Nx(e,t).length>0&&(t===hr||!Va(e)),zM=e=>[...Fs().onBoard.get(e)?.keys()??[]].filter(t=>vm(e,t)),Nx=(e,t)=>Fs().onBoard.get(e)?.get(t)??[],xm=e=>qa().filter(t=>vm(t.id,e)),VM=e=>{let t=Cx(e);return{done:t.filter(wx).length,total:t.length}},wx=e=>yr(e)||Ps(e.parentNodeId??""),Rm=()=>qa().sort((e,t)=>Number(Va(e.id))-Number(Va(t.id))),Em=(e,t)=>{let n=Ds(e);if(!n)return"A goal needs a name";if(/^[0-9A-HJKMNP-TV-Z]{26}$/i.test(n)&&!Ka(n))return`No goal has the id ${n}`;let r=Ya(e);return r&&r.id!==t?`There is already a goal called "${r.name}"`:null},_s=(e,t)=>{let n=cn(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:Rx(n)}};var Ix=/^(\d+)(h|d|w|mo|y)$/,Ax=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,Tx=({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},Mx=(e,t=new Date)=>{let n=e.match(Ix);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}},kx=e=>{let t=e.match(Ax);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 Tx({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 Mx(t)??kx(t)};var Sm=/^(\d+)(s|m)?$/,$s=e=>{let t=e.trim().toLowerCase().match(Sm);if(!t)return null;let n=Number(t[1]);return!Number.isInteger(n)||n<=0?null:t[2]==="m"?n*6e4:n*1e3},Bs=(e,t)=>{let n=(t??"").trim().split(/\s+/).filter(Boolean),r=n.length>0&&Sm.test(n.at(-1))?n.pop():"";return{dateInput:e||n.join(" "),durationInput:r}},Cm=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Lx=[{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}],Xa=(e=Lx)=>{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 Px=["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"},Ox=[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],Dx=(e=h().selectedNode?.context)=>{switch(e){case"TICKET":case"BOARD":case"SWIMLANE":return[pt.TITLE,pt.DESCRIPTION];case"COMMENT":return[pt.COMMENT];default:return[]}},Za=[String(3e3),"5000","15000","30000","60000"],Qa=["250","500","1000"],ec=["512","2048","8192"],Im=["10s","20s","30s","45s"],_n=[b.EXIT,b.SYNC,b.HELP,b.EXPORT,b.CONFIG,b.YANK],Us=[b.NEW,b.EDIT,b.DELETE,b.MOVE],Ja=[b.TAG,b.UNTAG,b.GOAL,b.UNGOAL,b.ASSIGN,b.UNASSIGN,b.CLOSE_ISSUE,b.RE_OPEN_ISSUE,b.EDIT,b.COMMENT],Nm=[b.RULE,b.UNRULE],wm=[b.FILTER,b.PEEK,b.REPLAY],Fx={WORKSPACE:[..._n,...Us],BOARD:[...wm,..._n,...Us,...Nm],SWIMLANE:[...wm,..._n,...Us,...Nm],TICKET:[..._n,...Us,...Ja],FIELD:[..._n,...Ja],FIELD_LIST:[..._n,...Ja],TEXT:[..._n],COMMENT:[b.EDIT,b.DELETE,b.YANK]},_x=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],fo=({breadCrumb:e,selectedNode:t})=>[...e,t].find(n=>n!=null&&U(n)),zt=()=>{let{breadCrumb:e=[],selectedNode:t}=h();return[t,...[...e].reverse()].find(n=>n!=null&&rt(n))},js=()=>{let{breadCrumb:e=[],selectedNode:t}=h(),n=[...e,t].find(o=>o?.context==="BOARD"),r=n?xm(n.id):[];return[...r,...Rm().filter(o=>!r.includes(o))].map(o=>o.name)},$x=({selectedNode:e,breadCrumb:t})=>{let n=Dx(e?.context);return fo({breadCrumb:t,selectedNode:e})?n.includes(pt.DESCRIPTION)?n:[...n,pt.DESCRIPTION]:n},Bx=({selectedNode:e,breadCrumb:t})=>{let n=fo({breadCrumb:t,selectedNode:e});return n?[Me.REF,Me.TITLE,...n.props?.description?.trim()?[Me.DESCRIPTION]:[],...sn(n).length>0?[Me.TAGS]:[],...an(n).length>0?[Me.ASSIGNEES]:[]]:e?[Me.REF,Me.TITLE]:[]},tc=()=>{let e=Ts({exclude:process.cwd()});return c(e)?[]:[...e.value.map((t,n)=>String(n+1)),...e.value.map(t=>t.root)]},Ux=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:r}=mo();if(!r)return[b.HELP,b.CONFIG];if(!Wa())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&&Px.includes(o),i=[...new Set([...n,e].map(u=>u?.context).flatMap(u=>u?Fx[u]:[]))],l=fo({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&&sn(l).length>0);if(u===b.UNGOAL)return!!(l&&cn(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&&an(l).length>0):u===b.RE_OPEN_ISSUE?!!(l&&yr(l)):u===b.CLOSE_ISSUE?!!(l&&!yr(l)):!0})},ke=(e,{contextNode:t,selectedNode:n,readOnly:r,breadCrumb:o}=h())=>{let s=t.context??"WORKSPACE";return{[b.NONE]:Ux({breadCrumb:o,readOnly:r,selectedNode:n}),[b.EXIT]:["confirm"],[b.EXPORT]:[],[b.SYNC]:[],[b.INIT]:[],[b.OPEN]:e===b.OPEN?tc():[],[b.HELP]:[],[b.PEEK]:[...Xa(),"now","prev","next"],[b.REPLAY]:[...Xa()],[b.EDIT]:$x({selectedNode:n,breadCrumb:o}),[b.YANK]:Bx({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(fs),...R.getExistingTags()])],[b.UNTAG]:[...Ms()?.value?.map(({name:l})=>l)??[]],[b.GOAL]:js(),[b.RULE]:(()=>{let l=zt();return l?Ls(l):[]})(),[b.UNRULE]:(()=>{let l=zt();return l?Dn(l):[]})(),[b.UNASSIGN]:[...ks()?.value?.map(({name:l})=>l)??[]],[b.ASSIGN]:R.getExistingAssignees(),[b.NEW]:_x(s),[b.CONFIG]:[...Ox]}[e]??[]};import Eg from"chalk";var Am=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import rR from"zod";import qx from"node:path";import{z as ft}from"zod";import{accessSync as jx,copyFileSync as Hx,existsSync as Hs,mkdirSync as Tm,readdirSync as Mm,readFileSync as Gx,renameSync as Wx,rmSync as zx,statSync as km,unlinkSync as Vx,writeFileSync as Kx}from"node:fs";import br from"node:path";var nc=e=>typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string",Oe={writeToFile:(e,t)=>{try{let n=br.dirname(e);Hs(n)||Tm(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);Kx(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return Gx(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 Hs(e)&&km(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await jx(e),!0}catch{return!1}},mkDir:e=>Tm(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=br.parse(t);for(;;){let r=br.join(t,e);try{if(Hs(r)&&km(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=br.dirname(t)}return null},readFirstJSON(e){try{if(!Oe.dirExists(e))return null;let t=Mm(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=br.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)?Mm(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{Vx(e)}catch(t){(!nc(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{zx(e,{recursive:!0,force:!0})}catch(t){(!nc(t)||t.code!=="ENOENT")&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(br.dirname(t)),!n?.overwrite&&Hs(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{Wx(e,t)}catch(r){if(nc(r)&&r.code==="EXDEV"){Hx(e,t),this.rmFile(e);return}throw r}}};var Yx={logLevel:"info",userId:"",userName:"",preferredEditor:"",autoSync:!1},Pm=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(),Xx="config.json",Om=ze,rc=()=>qx.join(Om(),Xx),oc=()=>{try{return Oe.mkDir(Om()),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=Pm.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=oc();if(c(e))return a(e.message);let t=rc(),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)},Dm=e=>{let t=oc();if(c(t))return a(t.message);let n=Pm.safeParse(e);if(!n.success)return a(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=rc();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 Dm(n)},Fm=()=>{let e=rc(),t=oc();if(c(t))return a(`Unable to create ~/${Ct}`);if(!(Oe.readFile(e)!==null)){let x=Dm(Yx);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=Id({userId:i,userName:s});if(c(v))return a(v.message);let S=v.value??{userId:i,userName:s};return!S.userName||!S.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:S.userName,userId:S.userId,autoSync:u??!1,autoSyncIntervalMs:m??1e4,attachmentMaxKb:p??null,viewMode:g??"dense"}))};import Qx from"node:crypto";import go from"node:fs";import Bm from"node:path";var _m="/media/",$m=e=>`${_m}${e}`,Zx=(e,t)=>`})`;var Bn=500,eR=/^[a-f0-9]{64}\.(png|jpg|gif|webp)$/,sc=(e,t)=>`${e}.${t}`,tR=e=>eR.test(e),Um=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: ${Vd.join(", ")}`),jm=e=>Qx.createHash("sha256").update(e).digest("hex"),nR=(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=Um(e);return c(n)?n:d("Validated attachment data",{hash:jm(e),ext:n.value,bytes:e.length})},Fk=(e,t,n=Bn)=>{let r=nR(t,n);if(c(r))return r;let o=so(e),s=Bm.join(o,sc(r.value.hash,r.value.ext));try{go.existsSync(s)||(go.mkdirSync(o,{recursive:!0}),go.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)},_k=(e,t,n=Bn)=>{if(!tR(t))return a("Invalid attachment file name");let r=Bm.join(so(e),t);if(!go.existsSync(r))return a("Attachment blob not found");let o;try{o=go.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(jm(o)!==s)return a("Attachment blob does not match its content hash");let l=Um(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 ho=50,yo=5e3,Hm=()=>{let e=q().commandMeta.inputString,t=rR.coerce.number().int().min(ho).max(yo).safeParse(e);if(!t.success)return a(`Attachment size cap must be ${ho}-${yo} 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 Gm from"node:fs";import oR from"node:path";var ic=2048,vr=1,xr=1048576,ac=e=>Number.isInteger(e)&&e>=vr&&e<=xr,Rr=()=>{let e=Ft(),t=c(e)?void 0:e.value.repoCloneMaxMb;return t!==void 0&&ac(t)?t:ic},ln=e=>{let t=0,n=r=>{let o;try{o=Gm.readdirSync(r,{withFileTypes:!0})}catch{return}for(let s of o){let i=oR.join(r,s.name);if(s.isDirectory()){n(i);continue}try{t+=Gm.lstatSync(i).size}catch{}}};return n(e),t},bo=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 WR}from"node:crypto";import Pp from"node:path";import zR from"node:fs";import{ulid as VR}from"ulid";import cc from"node:fs";import sR from"node:path";var vo=e=>e?.code==="ENOENT",lc=3,dc=e=>cc.readdirSync(e).filter(t=>t.endsWith(".jsonl")).sort(),Tt=e=>{let t=qe(e);for(let n=1;;n++){if(!cc.existsSync(t))return"none";let r=[],o=!1;for(let s of dc(t))try{let{size:i,mtimeMs:l}=cc.statSync(sR.join(t,s));r.push(`${s}:${i}:${l}`)}catch(i){if(!vo(i))throw i;if(n<lc){o=!0;break}}if(!o)return r.join("|")}},Wm=e=>new Map(e.split("|").filter(Boolean).map(t=>{let n=t.indexOf(":");return[t.slice(0,n),t.slice(n+1)]})),uc=(e,t,n,r)=>{let o=Wm(t),s=Tt(e),i=Wm(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,zm=e=>Vt&&Vt.root===e?Vt.signature:null,Gs=(e,t)=>{Vt={root:e,signature:t}},Vm=(e,t,n)=>{if(!Vt||Vt.root!==e)return;let r=uc(e,Vt.signature,t,n);Vt=r===null?null:{root:e,signature:r}},Km=()=>{Vt=null};import{z as jn}from"zod";var qm=1,Ym=jn.tuple([jn.string().min(1),jn.string().min(1).nullable()]),iR=jn.looseObject({v:jn.literal(qm),id:Ym}),lL=jn.looseObject({v:jn.number().int().positive(),id:Ym}),aR=e=>Object.prototype.hasOwnProperty.call(e,"__proto__"),cR=e=>{let t={};for(let n of Object.keys(e))n!=="__proto__"&&(t[n]=e[n]);return t},Xm=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",aR(e)?cR(e):e)};var lR=[1];var dR=new Set(lR),mc=e=>dR.has(e),Jm=e=>{let t=iR.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(", ")}`)},pc=(e,t)=>{let n={[e.action]:e.payload,v:qm,id:t};return Jm(n)};import Eo from"node:fs";import Ys from"node:path";import{decodeTime as bR}from"ulid";import{z as hc}from"zod";import Ie from"node:fs";import Hn from"node:path";import{ulid as uR}from"ulid";var zs="~pending",fc=/~pending(-[0-9a-z]+)*$/i,Qm=/-f(\d+)$/,ep=e=>{let t=e.indexOf(".");return t===-1?`${e}${zs}`:e.slice(0,t)+zs+e.slice(t)},Vs=e=>{let t=e.indexOf(".");return t===-1?[e,""]:[e.slice(0,t),e.slice(t)]},mR=e=>{let[t,n]=Vs(e);return fc.test(t)?t.replace(fc,"")+n:null},gc=e=>e.replace(fc,""),Gn=e=>e.endsWith(".jsonl")&&mR(e)!==null,xo=e=>gc(Vs(e)[0]),tp=e=>{let[t]=Vs(e),n=Qm.exec(t);return n&&Gn(e)?Number(n[1]):null},pR=e=>ep(e).replace(zs,`${zs}-${uR().toLowerCase()}`),fR=(e,t)=>{let[n,r]=Vs(e);return`${n.replace(Qm,"")}-f${t}${r}`},np=(e,t)=>Hn.join(qe(e),ep(t)),gR=(e,t)=>Math.max(0,Ie.statSync(e).size-(tp(t)??0)),rp=e=>{let t=qe(e);try{return Ie.existsSync(t)?Ie.readdirSync(t).filter(Gn).some(n=>gR(Hn.join(t,n),n)>0):!1}catch{return!0}},hR=3,op=(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>=hR)return}},yR=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)}},Ws=10,Zm=(e,t,n=!1)=>{let r=n?t.length:t.lastIndexOf(Ws)+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(yR(e)?"":`
|
|
33
|
+
`),o,Buffer.from(o[o.length-1]===Ws?"":`
|
|
34
|
+
`)]));let s=0;for(let i of o)i===Ws&&s++;return o[o.length-1]!==Ws&&s++,{bytes:r,lines:s}},Ks=(e,t)=>{let n=qe(e);if(!Ie.existsSync(n))return d("No events directory",0);try{let r=xo(t),o=Ie.readdirSync(n).filter(l=>Gn(l)&&xo(l)===r),s=Hn.join(n,t),i=0;for(let l of o){let u=tp(l);if(u!==null){let g=Hn.join(n,l),v=Ie.readFileSync(g).subarray(u);i+=Zm(s,v,!0).lines,Ie.rmSync(g,{force:!0});continue}let m=/~pending-/i.test(l)?l:pR(t),p=Hn.join(n,m);m!==l&&Ie.renameSync(Hn.join(n,l),p);let f=Zm(s,Ie.readFileSync(p));i+=f.lines,Ie.renameSync(p,Hn.join(n,fR(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 Xs="unknown",vR=hc.object({userId:hc.string().min(1).default(Xs),userName:hc.string().min(1).default(Xs)}),cp=new Set(["id","v","userId","userName"]),qs=e=>{let t=Object.entries(e).filter(([o])=>!cp.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},xR=/^[0-9a-hjkmnp-tv-z]{26}$/i,RR=e=>xR.test(e)?e.toUpperCase():e,lp=e=>{let t=Ys.basename(e,".jsonl"),n=t.indexOf("."),r=gc(n===-1?t:t.slice(0,n)),o=n===-1?void 0:t.slice(n+1),s=vR.safeParse({userId:RR(r),userName:o});return s.success?d("Parsed event file actor",s.data):a(`Invalid event file name ${Ys.basename(e)}: ${s.error.issues.map(i=>i.path.join(".")||i.message).join(", ")}`)},ER=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])},SR=(e,t)=>t in e,dn=new Map,CR=3e5,NR=512,Ro=0,yc=e=>e.entries.length+e.quarantined.length,wR=(e,t,n,r)=>{let o=dn.get(e);o&&(Ro-=yc(o));let s={stamp:t,entries:n,quarantined:r};dn.delete(e),dn.set(e,s),Ro+=yc(s);for(let[i,l]of dn){if(Ro<=CR&&dn.size<=NR)break;i!==e&&(dn.delete(i),Ro-=yc(l))}},IR=()=>{dn.clear(),Ro=0},AR=2n,sp=1000000n,TR=e=>{try{let{size:t,mtimeNs:n}=Eo.statSync(e,{bigint:!0});return{value:`${t}:${n}`,settled:BigInt(Date.now())*sp-n>AR*sp}}catch{return null}},dp=(e,t)=>{let n=lp(e);if(c(n))return a(n.message);let r=TR(e),o=r?dn.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=Eo.readFileSync(e,"utf8")}catch(p){if(vo(p))return d("Event file missing",null);throw p}let i=[],l=Ys.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 S=Xm(v);if(c(S)){m(p+1,S.message);continue}i.push({...S.value,userId:n.value.userId,userName:n.value.userName})}if(t)for(let p of u)t.push(p);return r?.settled&&wR(e,r.value,i,u),d("Parsed persisted events file",[...i])},ip=(e,t)=>e<t?-1:e>t?1:0,bc=(e,t)=>{let n=ip(e.id[0],t.id[0]);return n!==0?n:ip(JSON.stringify(e),JSON.stringify(t))},ap=(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(bc);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 S=r.get(v)??[];for(let x=S.length-1;x>=0;x--)f.push(S[x])}},l=(r.get(null)??[]).filter(p=>{let f=Object.keys(p).filter(g=>!cp.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(bc);for(let p of u)i(p);let m=e.filter(p=>!s.has(p.id[0])).sort(bc);for(let p of m)i(p);return o},vc=e=>ms(e.map(t=>{try{return bR(t.id[0])}catch{return null}})),up=(e,t)=>{let n=new Set,r=[],o=[],s=vc(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}},mp=e=>{let t=new Set(e.actions),n=w=>t.has(w),r=w=>{let{userId:N,userName:k,...L}=w,_=ER(L);if(c(_))return a(_.message);let M=_.value,P=w.id?.[0];return P?SR(L,M)?d("Decoded persisted event",{id:P,action:M,payload:L[M],userId:N}):a(`Persisted event is missing payload for action: ${M}`):a("Persisted event is missing id")},o=(w,N)=>{let k=[],L=new Map,_=new Map;for(let M of w){if(!mc(M.v)){_.set(M.v,(_.get(M.v)??0)+1),N?.push({eventId:M.id[0],reason:"unsupported-schema-version",detail:`v${M.v}`,targetNodeId:qs(M)});continue}let P=r(M);if(c(P)){N?.push({eventId:M.id[0],reason:"invalid-payload",detail:P.message,targetNodeId:qs(M)});continue}let $=P.value.action;if(!n($)){L.set($,(L.get($)??0)+1),N?.push({eventId:M.id[0],reason:"unknown-action",detail:$,targetNodeId:qs(M)});continue}let ge=e.readPayload($,P.value.payload);if(c(ge)){N?.push({eventId:M.id[0],reason:"invalid-payload",detail:ge.message,targetNodeId:qs(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(_.size>0){let M=[..._.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(w,N){let k=qe(w),L=Tt(w);if(!Eo.existsSync(k))return d("No events found",[]);let _=[],M=[];for(let $=1;;$++){_=[],M=[];let ge=!1;for(let G of dc(k)){let B=dp(Ys.join(k,G),M);if(c(B))return a(B.message);if(B.value===null){if($<lc){ge=!0;break}continue}for(let Re of B.value)_.push(Re)}if(!ge)break}if(N)for(let $ of M)N.push($);let P=ap(_,e.genesis);return s={root:w,signature:L,edge:P.at(-1)?.id?.[0]??null},d("All events loaded",P)}function l(w){let N=[],k=i(w,N);if(c(k))return a(k.message);let L=o(k.value,N);return c(L)?a(L.message):d("Loaded merged events",{events:L.value,unreadable:N})}function u(w){let N=i(w);return c(N)?a(N.message):d("Loaded event actors",N.value.map(({userId:k,userName:L})=>({userId:k,userName:L})))}function m(w){let N=new Map,k=qe(w),L;try{if(!Eo.existsSync(k))return N;L=Eo.readdirSync(k)}catch{return N}let _=new Set;for(let P of L){if(!P.endsWith(".jsonl"))continue;let $=lp(P);if(c($))continue;let{userId:ge,userName:G}=$.value;if(!ge||!G||G===Xs)continue;let B=N.get(ge);B!==void 0&&B!==G&&_.add(ge),N.set(ge,G)}if(_.size===0)return N;let M=u(w);if(c(M))return N;for(let{userId:P,userName:$}of M.value)_.has(P)&&(!$||$===Xs||N.set(P,$));return N}function p(w){let N=l(w);return c(N)?a(N.message):d("Loaded merged events",N.value.events)}function f(w,N){let k=i(w);if(c(k))return a(k.message);let{appliedEvents:L,unappliedEvents:_}=up(k.value,N),M=o(L);if(c(M))return a(M.message);let P=o(_);return c(P)?a(P.message):d("Loaded merged events before time",{appliedEvents:M.value,unappliedEvents:P.value})}function g(w=process.cwd()){let N=Tt(w);if(s&&s.root===w&&s.signature===N)return d("Loaded edge reference, unchanged",s.edge);let k=i(w);return c(k)?a(k.message):d("Loaded edge reference",k.value.at(-1)?.id?.[0]??null)}function v(w,N,k,L){if(!s||s.root!==w)return;let _=uc(w,s.signature,N,L);s=_===null?null:{root:w,signature:_,edge:k}}function S(){s=null,IR()}let x=w=>ap(w,e.genesis);function E(w){let N=i(w);if(c(N))return a(N.message);let k=vc(N.value);return d("Loaded effective event times",new Map(N.value.map((L,_)=>[L.id[0],k[_]??null])))}return{fromPersistedEvent:r,decodeReconstructedEvents:o,loadMergedEventsWithUnreadable:l,loadEventActors:u,loadActorNames:m,loadMergedEvents:p,loadMergedEventsBefore:f,getEdgeRef:g,advanceEdgeRef:v,clearEdgeCache:S,getSortedEvents:x,loadEffectiveEventTimes:E}};var Js=(e,t)=>a(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),O=(e,t)=>({...Js(e,t),convergence:!0}),Er=e=>c(e)&&e.convergence===!0,Wn=e=>{let t=e.filter(c);return{fatal:t.filter(n=>!Er(n)),skipped:t.filter(Er)}},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("; ")}`)},MR=e=>e.userId?.length?null:Js("Invalid user ID format",e),pp=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=MR(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 hp from"node:fs";import xc from"node:path";import{decodeTime as kR,monotonicFactory as LR}from"ulid";var fp=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/\.jsonl/g,"-jsonl").replace(/^-+|-+$/g,"")||"unknown";var Q=({userId:e})=>({userId:e}),gp=e=>({action:e.action,payload:e.payload});var PR=0xffffffffffff,OR=us,DR=e=>{let t=Date.now(),n;try{n=kR(e)}catch{return t}return n>=PR?t:n>t+OR?(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)},Sr=({userId:e})=>`${fp(e)}.jsonl`,yp=(e,t)=>{let n;try{if(!hp.existsSync(e))return[t];n=hp.readdirSync(e)}catch{return[t]}let r=xo(t);return[...n.filter(s=>!s.endsWith(".jsonl")||s===t||Gn(s)?!1:xo(s)===r).sort(),t]},bp=(e,{userId:t})=>{let n=Sr({userId:t});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(n))return a(`Invalid event log file name: ${n}`);let o=xc.join(qe(e),n);return d("Successfully resolved event log path",o)},vp=e=>{let t=LR();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(DR(i)):t();return d("Minted event id",[l,i])}function r({event:o,rootDir:s,edge:i,id:l}){try{let u=Yu(s);if(c(u))return u;let m=bp(s,{userId:o.userId});if(c(m))return m;let p=np(s,xc.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,S=pc(gp(o),[g,v]);if(c(S))return a(S.message);let x=`${JSON.stringify(S.value)}
|
|
36
|
+
`;op(p,x),i&&(i.current=g);let E=xc.basename(p);return e.advanceEdgeRef(s,E,g,Buffer.byteLength(x)),Vm(s,E,Buffer.byteLength(x)),d("Event persisted",{path:p,entry:S.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 xp=(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!==ir.Success)return p;let f=n.persist({event:m,rootDir:i,edge:l,id:u.value});return c(f)?(Km(),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 Rp=e=>{let t=pp(e),n=mp(e),r=vp(n),o=xp(e,t,r);return{...t,...n,...r,...o}};import{z as W}from"zod";var H=W.string().min(1),st=W.string(),un=W.string(),So=W.looseObject({id:H}),Ep=W.string().min(1).max(64),Rc=W.looseObject({id:H,name:st,parent:H,rank:un}),FR={"init.workspace":W.looseObject({id:H,name:st,rank:un}),"add.workspace":W.looseObject({id:H,name:st,rank:un}),"add.board":Rc,"add.swimlane":Rc,"add.issue":Rc,"add.field":W.looseObject({id:H,name:st,parent:H,rank:un}),"edit.title":W.looseObject({id:H,name:st}),"delete.node":So,"lock.node":So,"move.node":W.looseObject({id:H,parent:H,rank:un}),"edit.description":W.looseObject({id:H,md:W.string()}),"add.swimlane.rule":W.looseObject({id:H,rule:Ep}),"remove.swimlane.rule":W.looseObject({id:H,rule:Ep}),"close.issue":W.looseObject({id:H,parent:H,rank:un}),"reopen.issue":W.looseObject({id:H,parent:H,rank:un}),"create.tag":W.looseObject({id:H,name:st}),"tombstone.tag":So,"restore.tag":W.looseObject({id:H,name:st}),"create.goal":W.looseObject({id:H,name:st}),"rename.goal":W.looseObject({id:H,name:st}),"edit.goal.description":W.looseObject({id:H,md:W.string()}),"tombstone.goal":So,"create.contributor":W.looseObject({id:H,name:st}),"rename.contributor":W.looseObject({id:H,name:st}),"tombstone.contributor":So,"restore.contributor":W.looseObject({id:H,name:st}),"link.contributor.user":W.looseObject({contributor:H}),"link.contributor.email":W.looseObject({contributor:H,email:H}),"unlink.contributor.email":W.looseObject({contributor:H,email:H}),"connect.repo":W.looseObject({url:W.string()}),"edit.repo":W.looseObject({repo:H}),"disconnect.repo":W.looseObject({repo:H}),"add.issue.assignee":W.looseObject({id:H,assignee:H}),"remove.issue.assignee":W.looseObject({id:H,assignee:H}),"add.issue.tag":W.looseObject({id:H,tag:H}),"remove.issue.tag":W.looseObject({id:H,tag:H}),"add.issue.goal":W.looseObject({id:H,goal:H}),"remove.issue.goal":W.looseObject({id:H,goal:H}),"add.issue.comment":W.looseObject({id:H,issue:H,md:W.string()}),"edit.issue.comment":W.looseObject({id:H,issue:H,md:W.string()}),"delete.issue.comment":W.looseObject({id:H,issue:H}),"add.issue.attachment":W.looseObject({id:H,issue:H,hash:W.string().min(1),ext:W.string().min(1),name:st,bytes:W.number()}),"delete.issue.attachment":W.looseObject({id:H,issue:H}),"rebalance.children":W.looseObject({parent:H,ranks:W.record(W.string(),un)})},Sp=(e,t)=>{let r=FR[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 _R}from"ulid";var Cp=(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:_R(),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 Ec=["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 AP=new Set(Ec);var fe={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History",DIFF:"Diff",COMMENTS:"Comments",ATTACHMENTS:"Attachments"};var it=e=>e.slice(-7).toUpperCase(),Sc=(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 Co=(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,Cc=e=>{let t=h().repos,n=aa(t,e);if(c(n))return{skip:O(n.message,e)};let r=de(o=>({...o,repos:t}));return c(r)?{skip:O("Unable to update repos",e)}:{message:n.message,entry:n.value}},Np={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=Ae.workspace(t,n,r),s=No(o);if(c(s))return Js(s.message,e);let i=R.createNode(o);return c(i)?O(i.message??"Failed to initialize workspace",e):va(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=Co(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):va(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=Co(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):Yr(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=Co(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=Co(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):U(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=Co(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(fe.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(!U(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(!U(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(!cr(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=Cc(e);return"skip"in t?t.skip:d(t.message,{action:e.action,result:t.entry})},"edit.repo":e=>{let t=Cc(e);return"skip"in t?t.skip:d(t.message,{action:e.action,result:t.entry})},"disconnect.repo":e=>{let t=Cc(e);return"skip"in t?t.skip:d(t.message,{action:e.action,result:t.entry})}};var wp=e=>{let t=R.getNode(e);if(!t||!U(t)||t.isDeleted)return null;let n=wc(t);return c(n)?n:null},Ip=e=>{if(!Ic())return null;for(let t of e){let n=wp(t);if(n)return n;let r=h().nodes[t]?.parentNodeId;if(!r)continue;let o=wp(r);if(o)return o}return null},$R=(e,t)=>{let n=R.getNode(e);n&&R.updateNode({...n,log:[...n.log??[],t]})},BR=e=>{let t=[e],n=h().nodes[e]?.parentNodeId;return n&&t.push(n),t},Nc=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 BR(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[]}},UR=e=>{de(t=>({...t,eventLog:[...t.eventLog,e]}))},Kt=null,jR=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&&de(t=>({...t,eventLog:[...t.eventLog,...e.appLog]})),Ip([...e.virtualNodeIds])},Ap={isInitialized:()=>gt(),batch:e=>Zs(e),afterApply(e,{batched:t,bypassLogging:n}){let r=[...new Set(Nc(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(Ic()){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=>$R(o,e)),UR(e)),Ip(r)},flush(){if(!Kt)return null;let e=Kt;return Kt=null,jR(e)}};var te=()=>{let{userName:e,userId:t}=ne();return e?t?Nd(t)?wd(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 HR={genesis:"init.workspace",actions:Ec,readPayload:Sp,apply:Np,replay:Ap,write:{readOnlyReason:()=>{let e=h();return e.readOnly?e.readOnlyReason??"Cannot change the board while time travelling":null},beforeWrite:Cp}},GR=Rp(HR),{materialize:wo,materializeAll:mn,fromPersistedEvent:E0,decodeReconstructedEvents:S0,loadMergedEventsWithUnreadable:Io,loadEventActors:C0,loadActorNames:Tp,loadMergedEvents:Qs,loadMergedEventsBefore:Mp,getEdgeRef:N0,advanceEdgeRef:w0,clearEdgeCache:I0,getSortedEvents:A0,loadEffectiveEventTimes:kp,mintEventId:T0,persist:Lp,materializeAndPersist:M0,materializeAndPersistAll:Y}=GR;var Ac="Unchanged",ei="Renamed ",KR={live:[],overLimit:[],disconnected:[]},Ao=null,qR=(e,t)=>{if(!gt())return null;let n=h();return n.timeMode==="live"&&n.replay===null&&zm(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",KR);if(Ao&&Ao.root===n&&Ao.signature===r)return d("Read connected repos",Ao.repos);let o=qR(n,r);if(!o){let i=Qs(n);if(c(i))return a(i.message);o=Pd(i.value)}let s=Od(o);return Ao={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)}`)}},ti=e=>{let t=at(e);return c(t)?a(t.message):d("Read other repos",t.value.live)},Op=(e,t)=>{let n=ti(e);return!c(n)&&n.value.some(r=>r.id===t)},Tc=e=>{let t=e.url.trim(),n=Vr(t);if(n)return a(`That URL ${n}. ${Ad}`);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=rn(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??sa,since:e.since??ia,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?ei:"Updated "}${p.label}`})},To=e=>{let t=ve({repoRoot:e.repoRoot});if(c(t))return a(t.message);let n=Y([{id:VR(),userId:e.actorId,...e.event}],t.value);return c(n)?a(n.message):d("Wrote repo event",null)},Mc=e=>{let t=at(e);return new Map(c(t)?[]:[...t.value.live,...t.value.overLimit].map(n=>[n.id,n.label]))},kc=e=>e.map(t=>e.filter(n=>n.label===t.label).length===1?t.label:t.id),ni=(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||nn(n)&&s.id===rn(n));return o?d("Found",o):a(`No repo "${n}" is connected`)},Lc=(e,t)=>{let n=at(e);return c(n)?a(n.message):ni([...n.value.live,...n.value.overLimit],t)},Pc=e=>Pp.join(ze(),"repos",/^[\w-]+$/.test(e)?e:WR("sha1").update(e).digest("hex")),Dp=/^[a-z0-9._-]+-[0-9a-f]{12}\.git$/,_t=(e,t)=>Pp.join(Pc(e),`${t}.git`),Cr=e=>`${e}.json`,ri=/^(?!-)[A-Za-z0-9._/-]{1,100}$/,Fp=e=>{try{let t=JSON.parse(zR.readFileSync(Cr(e),"utf8"));return typeof t.stateBranch=="string"&&ri.test(t.stateBranch)?t.stateBranch:null}catch{return null}},pn=(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 YR=(e,t)=>{let n=(e.trim().split(/\s+/)[0]??"").toUpperCase();return n&&t.has(n)?n:null},_p=(e,t)=>{let n=YR(e.subject,t),r=(e.refs??[]).map(o=>o.toUpperCase());return[...new Set([...n?[n]:[],...r])].filter(o=>t.has(o))};import{randomUUID as Bo}from"node:crypto";import D from"node:fs";import J from"node:path";import{execFileSync as XR}from"node:child_process";import{randomUUID as Up}from"node:crypto";import Xe from"node:fs";import Mo from"node:os";import jp from"node:path";var ii="epiq-sync.lock",JR=600*1e3,Hp=Date.now()-process.uptime()*1e3,Gp=()=>Math.round(Hp),Wp=5e3,ZR=5e3,zp=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=$p.get(e);if(t&&Date.now()-t.at<QR)return t.value;let n=XR("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 $p.set(e,{at:Date.now(),value:o}),o}catch{return null}},Vp=(e,t)=>{let n=zp(e);return n!==null&&n>t+Wp},QR=5e3,$p=new Map,eE=e=>{let t=Date.now()-Mo.uptime()*1e3;if(e.startedAt<t)return!1;if(Date.now()-e.startedAt<ZR||e.processStartedAt===void 0)return!0;let n=zp(e.pid);return n===null||Math.abs(n-e.processStartedAt)<=Wp},oi=new Map,tE=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}},nE=e=>{try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}},Kp=(e,t=JR,n=!1)=>e?e.hostname!==Mo.hostname()?Date.now()-e.startedAt>t?"stale":null:!nE(e.pid)||n&&!eE(e)?"dead":Date.now()-e.startedAt>t?"stale":null:"stale",rE=e=>{let t=jp.join(e,ii);return Xe.existsSync(t)?Kp(Nr(t))===null:!1},si=new Map,oE=e=>{let t=si.get(e);if(t)return t;let n=Jr(e).then(r=>c(r)?null:r.value,()=>null);return si.set(e,n),n.then(r=>{r===null&&si.get(e)===n&&si.delete(e)}),n},uO=async e=>{let t=await oE(e);return t!==null&&rE(t)},qp=e=>`${e.operation} (pid ${e.pid} on ${e.hostname}, started ${new Date(e.startedAt).toISOString()})`,Nr=e=>{try{return tE(Xe.readFileSync(e,"utf8"))}catch{return null}},sE=(e,t)=>{let n={pid:process.pid,hostname:Mo.hostname(),startedAt:Date.now(),operation:t,token:Up(),processStartedAt:Hp},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{}}},iE=async({worktreeRoot:e,operation:t})=>{let n=await Jr(e);return c(n)?a(n.message):d("Tried the sync lock",ko({lockPath:jp.join(n.value,ii),operation:t}))},ko=({lockPath:e,operation:t,staleAfterMs:n,checkProcess:r=!1})=>{let o=null,s=()=>{try{let u=Nr(e);u&&Bp(u,o)&&Xe.rmSync(e)}catch{}finally{oi.get(e)===o?.token&&oi.delete(e)}},i=u=>(o=sE(e,t),o?(oi.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=Nr(e);if(p===null&&(!Xe.existsSync(e)||(p=Nr(e),p!==null)||!Xe.existsSync(e)))continue;let g=p!==null&&p.pid===process.pid&&p.hostname===Mo.hostname()&&oi.get(e)!==p.token?"dead":Kp(p,n,r);if(g===null)return{acquired:!1,heldBy:p};K.info(`Breaking an abandoned sync lock: ${p?qp(p):"unreadable lock file"}`);let v=`${e}.${process.pid}.${Up()}.broken.lock`;try{Xe.renameSync(e,v)}catch{continue}if(!Bp(Nr(v),p)){try{Xe.linkSync(v,e)}catch{}Xe.rmSync(v,{force:!0});continue}Xe.rmSync(v,{force:!0});let S=i(g);if(S)return S}return{acquired:!1,heldBy:Nr(e)??{pid:-1,hostname:Mo.hostname(),startedAt:Date.now(),operation:"unknown"}}},Bp=(e,t)=>e===null||t===null?e===t:e.pid===t.pid&&e.hostname===t.hostname&&e.startedAt===t.startedAt&&e.token===t.token,Lo=async({worktreeRoot:e,operation:t,fn:n})=>{let r=await iE({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 ${qp(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 uE}from"node:crypto";import mE from"node:fs";var aE="EPIQ_CACHE_MS",Po=e=>{let t=process.env[aE];if(t===void 0||t.trim()==="")return e;let n=Number(t);return Number.isFinite(n)&&n>=0?n:e};import Yp from"node:fs";import cE from"node:path";var Xp=new Set,Oc=new Map,Dc=(e,t)=>{t?Oc.set(e,t):Oc.delete(e)},Jp=e=>Oc.get(e)??null,lE=e=>{try{return new Set(Yp.readFileSync(cE.join(e,"shallow"),"utf8").split(`
|
|
37
|
+
`).map(t=>t.trim()).filter(Boolean))}catch{return Xp}},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:Xp},s=ti(n);if(c(s))return d("Listed sources",[o]);let i=s.value.flatMap(l=>{let u=_t(r.value.projectId,l.id);if(!Yp.existsSync(u))return[];let m=pn(l.since,r.value.createdAt),p=new Set([r.value.stateBranch,Ba,Fp(u)].filter(f=>f!==null));return[{repo:l.id,cwd:u,revisions:[...[...p].map(f=>`--exclude=${f}`),"--branches"],exclude:lE(u),...m?{notBefore:Date.parse(`${m}T00:00:00Z`)}:{}}]});return d("Listed sources",[o,...i])},Fc=e=>t=>e.find(n=>(n.repo??"")===(t??""))?.cwd,dE=async(e,t)=>!c(await F({cwd:e,args:["cat-file","-e",`${t}^{commit}`]})),Oo=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 dE(r.cwd,e.sha))return d("Resolved repo",r.cwd);return d("Resolved repo",n[0].cwd)};var ai="",pE="",Bc=5e3,fE=12e4,gE=32*1024*1024,ci=new Map,Uc=e=>{try{return mE.statSync(`${e}.json`).mtimeMs}catch{return null}},jc=()=>{let e=uE(8).toString("hex");return{field:`${ai}${e}`,record:`${pE}${e}`,body:`${ai}B${e}`,end:`${ai}E${e}`}},hE=/^[ \t]*Epiq-Ref:[ \t]*(.*)$/gim,yE=new RegExp(`^[0-9A-HJKMNP-TV-Z]{${7}}$`,"i"),Hc=e=>[...new Set([...e.matchAll(hE)].flatMap(t=>t[1].split(/[\s,]+/)).filter(t=>yE.test(t)).map(t=>t.toUpperCase()))],bE=/^[0-9a-f]{40}([0-9a-f]{24})?$/,Kn=new Map,vE=500,$c=new Map;var fn=()=>{ci.clear(),Kn.clear(),$c.clear()},Zp=(e,t,n)=>(t===void 0||e>=Math.floor(t/1e3)*1e3)&&(n===void 0||e<=n),_c=e=>dt(e).replace(/[\u0080-\u009f\u202a-\u202e\u2066-\u2069]/g,""),Gc=(e,t,n,{stats:r=!0}={})=>["log",...e.revisions,...n,...r?["--shortstat"]:[],`--format=${t.record}%H${t.field}%at${e.notBefore?`${t.field}%ct`:""}${t.field}%an${t.field}%ae${t.field}%s${t.body}%b${t.end}`],Do=e=>e.repo?{timeoutMs:fE,maxOutput:gE}:{},Qp=(e,t,n)=>!!t&&(!e.repo||bE.test(t))&&!e.exclude.has(t)&&!(e.notBefore&&Number(n)*1e3<e.notBefore),Wc=(e,t,n)=>e.split(n.record).filter(r=>r.trim().length>0).map(r=>{let o=r.indexOf(n.end),[s="",...i]=r.split(`
|
|
38
|
+
`),l=o===-1?s:r.slice(0,o),u=o===-1?i:r.slice(o+n.end.length).split(`
|
|
39
|
+
`),m=l.indexOf(n.body),p=m===-1?l:l.slice(0,m),f=m===-1?[]:Hc(l.slice(m+n.body.length)),g=p.split(n.field),[v,S]=g,x=t.notBefore?g[2]:void 0,[E,w,...N]=g.slice(t.notBefore?3:2);if(!S||!Qp(t,v,x))return null;let k=u.join(" "),L=Number(/(\d+) insertion/.exec(k)?.[1]??0),_=Number(/(\d+) deletion/.exec(k)?.[1]??0);return{sha:v,...t.repo?{repo:t.repo}:{},time:Number(S)*1e3,author:_c(E)||"unknown",authorEmail:_c(w),subject:_c(N.join(n.field)),...f.length>0?{refs:f}:{},linesChanged:L+_,insertions:L,deletions:_}}).filter(r=>r!==null),ef=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?ci.get(r):void 0,s=e.repo?Uc(e.cwd):null;if(o&&(e.repo?o.version===s:Date.now()-o.fetchedAt<Po(Bc)))return o.result;let i=jc(),l=await F({cwd:e.cwd,...Do(e),args:Gc(e,i,[...t.start!==void 0?[`--since=@${Math.floor(t.start/1e3)}`]:[],...t.end!==void 0?[`--until=@${Math.floor(t.end/1e3)}`]:[]])});if(c(l))return e.repo&&n&&!Ss(l.message)&&ci.set(r,{fetchedAt:Date.now(),version:s,result:a(l.message)}),a(l.message);let u=Wc(l.value.stdout,e,i).filter(m=>Zp(m.time,t.start,t.end));return n&&ci.set(r,{fetchedAt:Date.now(),version:s,result:d("Computed commit timeline",u)}),d("Computed commit timeline",u)},xE=async(e,t)=>{let n=jc(),r=await F({cwd:e.cwd,...Do(e),args:Gc(e,n,["--regexp-ignore-case","--fixed-strings",...t.map(o=>`--grep=${o}`)])});return c(r)?a(r.message):d("Read commits naming the refs",Wc(r.value.stdout,e,n))},RE=async e=>{let t=ai,n=await F({cwd:e.cwd,...Do(e),args:["log",...e.revisions,`--format=%H${e.notBefore?`${t}%ct`:""}`]});return c(n)?a(n.message):d("Read the commit order",n.value.stdout.split(`
|
|
40
|
+
`).map(r=>r.split(t)).filter(([r,o])=>Qp(e,r,o)).map(([r])=>r))},EE=16,SE=async e=>{let t=await ef(e,{});if(c(t))return a(t.message);let n=new Map;return t.value.forEach((r,o)=>n.set(r.sha,t.value[o+1]?.sha)),d("Read every commit",{candidates:t.value,precedingOf:n})},wr=e=>Buffer.from(e).toString(),CE=async(e,t)=>{if(t.length>EE)return SE(e);let n=e.repo?[e.cwd,e.revisions.join(" "),e.notBefore??"",e.exclude.size,[...t].sort().join(",")].join("\0"):null,r=e.repo?Uc(e.cwd):null,o=n?Kn.get(n):void 0;if(o&&o.version===r)return o.result;let i=await(async()=>{let l=await xE(e,t);if(c(l))return a(l.message);let u=await RE(e);if(c(u))return a(u.message);let m=new Map(u.value.map((f,g)=>[f,g])),p=new Map;for(let f of l.value){let g=m.get(f.sha),v=g===void 0?void 0:u.value[g+1];p.set(f.sha,v&&wr(v))}return d("Read commits naming the refs",{candidates:l.value,precedingOf:p})})();return n&&!(c(i)&&Ss(i.message))&&(Kn.delete(n),Kn.set(n,{version:r,result:i}),Kn.size>vE&&Kn.delete(Kn.keys().next().value)),i},zc=async(e,t)=>{let n=await Vn(e);if(c(n))return a(n.message);let r=[];for(let o of n.value){let s=await t(o),{repo:i}=o;if(c(s)){if(!i)return a(s.message);K.info(`[repos] could not read a clone: ${s.message}`),Dc(i,Es(s.message)?"its history is too long to read; narrow its window":"its history could not be read");continue}i&&Dc(i,null),r.push(s.value)}return d("Read every source",r)},NE=(e,t)=>zc(e,n=>ef(n,t)),Ir=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})},Vc=e=>{let t=e.filter(n=>n.length>0);return t.length<=1?t[0]??[]:t.flat().sort((n,r)=>r.time-n.time)},wE=new RegExp(`^[0-9A-Z]{${7}}$`),IE=e=>{let t=e.indexOf(" ");if(t===-1)return null;let n=e.slice(0,t).toUpperCase();return wE.test(n)?n:null},AE=e=>IE(e.subject)!==null||(e.refs?.length??0)>0,TE=e=>({...e,sha:wr(e.sha),author:wr(e.author),authorEmail:wr(e.authorEmail),subject:wr(e.subject),...e.refs?{refs:e.refs.map(wr)}:{}}),ME=async e=>{let t=[e.cwd,e.revisions.join(" "),e.notBefore??"",e.exclude.size].join("\0"),n=$c.get(t),r=e.repo?Uc(e.cwd):null;if(n&&(e.repo?n.version===r:Date.now()-n.fetchedAt<Po(Bc)))return n.result;let s=await(async()=>{let i=jc(),l=await F({cwd:e.cwd,...Do(e),args:Gc(e,i,[],{stats:!1})});if(c(l))return a(l.message);let u=Wc(l.value.stdout,e,i).filter(AE).map(TE);if(u.length===0)return d("No commit names a ticket",[]);let m=i.record,p=await F({cwd:e.cwd,...Do(e),args:["log","--no-walk=unsorted","--stdin","--shortstat",`--format=${m}%H`],input:`${u.map(g=>g.sha).join(`
|
|
41
|
+
`)}
|
|
42
|
+
`});if(c(p))return a(p.message);let f=new Map;for(let g of p.value.stdout.split(m)){let[v="",...S]=g.split(`
|
|
43
|
+
`),x=S.join(" ");f.set(v.trim(),{insertions:Number(/(\d+) insertion/.exec(x)?.[1]??0),deletions:Number(/(\d+) deletion/.exec(x)?.[1]??0)})}return d("Read the commits that name a ticket",u.map(g=>{let{insertions:v=0,deletions:S=0}=f.get(g.sha)??{};return{...g,insertions:v,deletions:S,linesChanged:v+S}}))})();return c(s)&&Ss(s.message)||$c.set(t,{fetchedAt:Date.now(),version:r,result:s}),s},OO=async e=>{let t=await zc(e,ME);return c(t)?a(t.message):d("Computed the commits that name a ticket",Vc(Ir(t.value)))},kE=async(e={})=>{let t=await NE(e.repoRoot,{start:e.start,end:e.end});return c(t)?a(t.message):d("Computed commit timeline",Vc(Ir(t.value)))},tf=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 zc(e.repoRoot,s=>CE(s,e.refs));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(({candidates:s,precedingOf:i})=>{let l=new Map;for(let m of s){let p=o(m);p.length>0&&l.set(m.sha,p)}let u=[];for(let m of s){let p=l.get(m.sha);if(!p||!Zp(m.time,void 0,e.end))continue;let f=i.get(m.sha),g=f?l.get(f)??[]:[];u.push({...m,tickets:p,precedingSha:g.some(v=>p.includes(v))?f:null})}return u}))},Kc=async e=>{let t=e.ref.trim();if(!t)return a("ref must not be empty");let n=await tf({...e,refs:[t]});return c(n)?a(n.message):d(n.message,n.value.map(r=>r.map(({tickets:o,...s})=>s)))},qc=async e=>{let t=await Kc(e);return c(t)?a(t.message):d("Matched commits by ref",Vc(Ir(t.value)))},LE=async e=>{let t=await tf(e);return c(t)?a(t.message):d("Matched commits by refs",Ir(t.value).flat().sort((n,r)=>r.time-n.time||(n.repo??"").localeCompare(r.repo??"")||n.sha.localeCompare(r.sha)))};var li=1800*1e3,Bt=e=>`${e}.removed`,nf=e=>{try{D.writeFileSync(Bt(e),"",{flag:"wx"})}catch(t){if(t.code!=="EEXIST")throw t;if(di(Bt(e)))throw new Error("The removal mark is a link, which epiq will not use")}},Zc=()=>`${process.pid}-${Gp()}`,Jc=e=>{try{let t=JSON.parse(D.readFileSync(Cr(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"&&ri.test(t.stateBranch)?t.stateBranch:null}}catch{return null}},df=(e,t)=>{try{let n=`${Cr(e)}.${Zc()}.${Bo()}.tmp`;D.writeFileSync(n,JSON.stringify(t)+`
|
|
44
|
+
`,{flag:"wx"}),D.renameSync(n,Cr(e))}catch(n){K.info(`[repos] could not record fetch status: ${String(n)}`)}},Qc=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=Jc(i),u=D.existsSync(i);return{...o,cloned:u,overLimit:s,bytes:u?l?.bytes??null:null,fetchedAt:l?.fetchedAt??null,error:l?.error??Jp(o.id)}};return d("Listed repos",[...n.value.live.map(o=>r(o,!1)),...n.value.overLimit.map(o=>r(o,!0))])},Ce=e=>F({...e,forClone:!0}),PE=(e,t)=>Ce({cwd:e,args:t,timeoutMs:li}),OE=1e3,_o=async(e,t,n,{undo:r}={})=>{let o=Rr(),s=o*1024*1024,i=new AbortController,l=setInterval(()=>{ln(n)>s&&i.abort(bo(o))},OE),u;try{u=await Ce({cwd:e,args:t,timeoutMs:li,abort:i.signal})}finally{clearInterval(l)}return i.signal.aborted||!c(u)&&ln(n)>s?(mf(n),r&&(_E(n,r),Sf(n)),a(bo(o))):u},Fo=e=>{try{return D.readFileSync(e)}catch{return null}},el=e=>{try{return D.readdirSync(e)}catch{return[]}},DE=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:Fo(J.join(e,"packed-refs")),head:Fo(J.join(e,"HEAD")),config:Fo(J.join(e,"config")),shallow:Fo(J.join(e,"shallow")),packs:new Set(el(J.join(e,"objects","pack")))}},uf="epiq-restore-",rf=(e,t,n)=>{let r=J.join(e,`${uf}${Bo()}.tmp`);D.writeFileSync(r,n,{flag:"wx"}),D.mkdirSync(J.dirname(J.join(e,t)),{recursive:!0}),D.renameSync(r,J.join(e,t))},FE=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},_E=(e,t)=>{for(let[r,o]of t.refs)rf(e,r,o);for(let r of FE(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?rf(e,r,o):D.rmSync(J.join(e,r),{force:!0});let n=J.join(e,"objects","pack");for(let r of el(n))t.packs.has(r)||D.rmSync(J.join(n,r));qn.delete(e)},mf=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,uf]])try{for(let o of D.readdirSync(n))o.startsWith(r)&&D.rmSync(J.join(n,o),{recursive:!0,force:!0})}catch{}},$E=/could not read from remote repository|the remote end hung up unexpectedly|early EOF|fetch-pack: invalid index-pack output/i,pf=e=>{let t=e.split(`
|
|
45
|
+
`).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=>!$E.test(s))[0]??n[n.length-1]??t[t.length-1]??e).replace(/^(fatal|error):\s*/i,"").slice(0,300)},BE=64*1024,ff=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())<=BE))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"&&ri.test(o)?o:null}catch{return null}},tl=async e=>{let t=await Ce({cwd:e,args:["symbolic-ref","--short","HEAD"]});return c(t)?null:t.value.stdout.trim()||null},UE=async(e,t)=>{if(t==="all")return d("All branches","+refs/heads/*:refs/heads/*");let n=await tl(e);return n?d("Default branch",`+refs/heads/${n}:refs/heads/${n}`):a("Could not tell which branch is the default")},jE=async e=>{let t=await tl(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(`
|
|
46
|
+
`).filter(Boolean))r!==`refs/heads/${t}`&&await Ce({cwd:e,args:["update-ref","-d",r]})},gf=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()!==""},hf=e=>Math.floor(Date.parse(`${e}T00:00:00Z`)/1e3),yf=e=>`--shallow-since=@${hf(e)}`,bf=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(`
|
|
47
|
+
`).filter(Boolean).some(r=>Number(r)>=hf(t))},vf=async(e,t)=>{if(!await gf(e))return d("Empty",null);let n=await _o(e,["fetch","--no-tags","--deepen=1","origin"],e,{undo:t});return c(n)?a(n.message):d("Deepened",null)},xf=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 _o(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 UE(e,t.branches);return c(m)?a(m.message):(await Ce({cwd:e,args:["config","remote.origin.fetch",m.value]}),l?vf(e):d("Cloned",null))},s=await o(n?[yf(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 bf(e,n)&&(s=i)}return c(s)?(D.rmSync(e,{recursive:!0,force:!0}),a(s.message)):d("Built clone",null)},of=async(e,t,n,{replace:r=!1}={})=>{let o=`${e}.${Zc()}.pending`,s=await xf(o,t,n);if(c(s))return s;if(r&&D.existsSync(e)){let i=`${e}.${Bo()}.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)):di(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))},HE=async(e,t)=>!/[*:]/.test(t)&&!c(await Ce({cwd:e,args:["check-ref-format",`refs/heads/${t}`]})),Rf=async e=>{let t=await PE(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 HE(e,n)?n:null},Ef=async(e,t)=>{let n=t??await Rf(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)},Sf=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)}`)}},Cf=e=>D.existsSync(J.join(e,"shallow")),GE=20,WE=async e=>{if(el(J.join(e,"objects","pack")).filter(r=>r.endsWith(".pack")).length<=GE)return;let n=await Ce({cwd:e,args:["repack","--geometric=2","-d","-q"],timeoutMs:li});c(n)&&K.info(`[repos] repack: ${n.message}`)},zE=async e=>{let t=await Ce({cwd:e,args:["config","--get","remote.origin.fetch"]});return c(t)?null:t.value.stdout.trim()||null},VE=e=>`+refs/heads/${e}:refs/heads/${e}`,KE=async(e,t)=>{let n=await zE(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 tl(e),o=await Rf(e)??r;return o?r===o&&n===VE(o)?d("Tracking",null):Ef(e,o):a("Could not tell which branch is the default")},sf=async(e,t,n,r)=>{let o=Rr();if(ln(e)>o*1024*1024)return a(bo(o));let s=DE(e),i=await KE(e,t.branches);if(c(i))return a(i.message);let l=n===null?Cf(e)?["--unshallow"]:[]:r?.since&&n<r.since?[yf(n)]:[],u=["fetch","--prune","--no-tags",...l,"origin"],m=await _o(e,u,e,{undo:s});if(c(m)&&t.branches==="default"&&/couldn't find remote ref/i.test(m.message)){let g=await Ef(e);if(c(g))return a(g.message);m=await _o(e,u,e,{undo:s})}let p=n!==null&&l.length>0,f=c(m)&&p;if(f){let g=m;if(m=await _o(e,["fetch","--prune","--no-tags","origin"],e,{undo:s}),!c(m)&&await bf(e,n))return a(g.message)}if(c(m))return a(m.message);if(p&&!f){let g=await vf(e,s);if(c(g))return a(g.message)}return t.branches==="default"&&await jE(e),await WE(e),d("Fetched",null)},Yc=async e=>{if(!D.existsSync(e))return"";let t=await Ce({cwd:e,args:["for-each-ref","--format=%(objectname) %(refname)"]}),n=Cf(e)?D.readFileSync(J.join(e,"shallow"),"utf8"):"";return`${c(t)?"":t.value.stdout}
|
|
48
|
+
${n}`},qn=new Map,af=(e,t)=>{let n=qn.get(e);return qn.set(e,t),n!==void 0&&n!==t},qE=async(e,t)=>{let n=await Ce({cwd:e,args:["config","--get","remote.origin.url"]});return c(n)?"unknown":rn(n.value.stdout.trim())===t.id?"this":"other"},Nf=e=>{let t=J.join(e,".gitignore");try{if(D.lstatSync(t,{throwIfNoEntry:!1}))return;D.writeFileSync(t,`*
|
|
49
|
+
`,{flag:"wx"})}catch(n){K.info(`[repos] could not write ${t}: ${ct(n)}`)}},di=e=>{try{return D.lstatSync(e).isSymbolicLink()}catch{return!1}},ct=e=>e instanceof Error?e.message:String(e),nl=".lock",rl=li*4,wf=async(e,t,n)=>{let r=Date.now()+n;for(;;){let o=ko({lockPath:`${e}${nl}`,operation:t,staleAfterMs:rl,checkProcess:!0});if(o.acquired||Date.now()>=r)return o;await new Promise(s=>setTimeout(s,250))}},$o=e=>{let t=`${e}.${Bo()}.deleting`;try{D.renameSync(e,t)}catch(n){if(n.code!=="ENOENT")throw n}D.rmSync(t,{recursive:!0,force:!0}),D.rmSync(Cr(e),{force:!0}),D.rmSync(Bt(e),{force:!0}),qn.delete(e)},If=5e3,YE=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=Fo(J.join(e,"shallow"));return n&&!/^(?:[0-9a-f]{40}(?:[0-9a-f]{24})?\n)*$/.test(n.toString("utf8"))?!1:await gf(e)?!c(await Ce({cwd:e,args:["rev-list","--max-count=1","--branches"]})):!0},cf=[0,6e4,10*6e4,60*6e4],Af=e=>{if(!e?.restartTriedAt||Date.now()<e.restartTriedAt)return!0;let t=cf[Math.min(e.restarts,cf.length-1)];return Date.now()-e.restartTriedAt>=t},XE=360*60*1e3,JE=e=>{let t=e?.restartTriedAt??e?.restartedAt;return Af(e)&&(!t||Date.now()<t||Date.now()-t>=XE)},ZE=6e4,QE=async(e,t,n)=>{let r=Rr();return ln(e)>r*1024*1024?"past the cap":n.endsWith(bo(r))?null:await Tf(e,t)?"remote answers":null},Tf=async(e,t)=>!c(await Ce({cwd:J.dirname(e),args:["ls-remote","--",t.url,"HEAD"],timeoutMs:ZE})),eS=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=pn(r.since,n);try{D.mkdirSync(J.dirname(i),{recursive:!0}),Nf(J.dirname(i))}catch(p){return s(!1,ct(p))}let u=Jc(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)&&af(i,await Yc(i));return u.error?s(!1,u.error,p):s(!0,"Fetched recently",p)}if(di(i))return s(!1,"The clone path is a link, which epiq will not use");let m=await wf(i,`fetch ${r.label}`,o===0?If:0);if(!m.acquired)return{...s(!0,"Being fetched by another process"),skipped:!0};try{let p=D.existsSync(Bt(i));p&&$o(i);let f=D.existsSync(i);f&&await qE(i,r)==="other"&&($o(i),f=!1);let g=f?Jc(i):null;if(f&&!qn.has(i)&&qn.set(i,await Yc(i)),f&&(Sf(i),mf(i)),!f&&p&&!Op(e,r.id))return s(!0,"Removed before it was cloned");let S=f&&!await YE(i)&&Af(g),x=S&&await Tf(i,r),E=f?S?a(x?"Its clone will not open":"Its clone will not open, and its remote does not answer"):await sf(i,r,l,g):await of(i,r,l);if(f&&!x&&c(E)&&JE(g)){let L=await QE(i,r,E.message);L==="remote answers"&&(E=await sf(i,r,l,g)),x=L!==null&&c(E)}x&&(K.info(`[repos] ${r.label}: starting its clone over`),E=await of(i,r,l,{replace:!0}),qn.delete(i));let w=x&&!(c(E)&&Su()),N=c(E)?pf(E.message):"Fetched",k=c(E)?g?.stateBranch??null:await ff(i);return df(i,{fetchedAt:c(E)?g?.fetchedAt??null:Date.now(),attemptedAt:Date.now(),error:c(E)?N: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:w?Date.now():g?.restartTriedAt??null,restarts:w?(g?.restarts??0)+1:c(E)?g?.restarts??0:0,bytes:c(E)?g?.bytes??null:ln(i)}),c(E)?(K.info(`[repos] ${r.label}: ${E.message}`),s(!1,N)):s(!0,N,af(i,await Yc(i))||!f||x)}catch(p){return K.info(`[repos] ${r.label}: ${ct(p)}`),s(!1,ct(p))}finally{try{D.existsSync(Bt(i))&&$o(i)}catch(p){K.info(`[repos] ${r.label}: could not delete the clone: ${ct(p)}`)}m.release(),Mf(i)}},Mf=e=>{if(!D.existsSync(Bt(e)))return;let t=ko({lockPath:`${e}${nl}`,operation:"remove",staleAfterMs:rl,checkProcess:!0});if(t.acquired)try{D.existsSync(Bt(e))&&$o(e)}catch(n){K.info(`[repos] could not delete a clone: ${ct(n)}`)}finally{t.release()}},tS=e=>{let t=Pc(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&&!rS(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)}`)}}},kf=async(e,t)=>{let n=qt(e);if(c(n))return a(n.message);let r=_t(n.value.projectId,t.id),o=`${r}.${Zc()}.${Bo()}.pending`;try{D.mkdirSync(J.dirname(r),{recursive:!0}),Nf(J.dirname(r));let s=await xf(o,t,pn(t.since,n.value.createdAt));return c(s)?a(pf(s.message)):d("Staged",{stagePath:o,bytes:ln(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)}`)}},Lf=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 wf(i,`connect ${t.label}`,If);if(!l.acquired)return $t(n);try{if(D.rmSync(Bt(i),{force:!0}),D.existsSync(i)||di(i))return $t(n);D.renameSync(n,i),df(i,{fetchedAt:Date.now(),attemptedAt:Date.now(),error:null,branches:t.branches,since:pn(t.since,s),stateBranch:await ff(i),restartedAt:null,restartTriedAt:null,restarts:0,bytes:ln(i)}),fn()}catch(u){K.info(`[repos] could not place ${t.label}: ${ct(u)}`),$t(n)}finally{l.release()}},ol=e=>{let t=Lc(e.repoRoot,e.repo);if(c(t))return t;let n=To({repoRoot:e.repoRoot,actorId:e.actorId,event:{action:"disconnect.repo",payload:{repo:t.value.id}}});if(c(n))return a(n.message);let r=sl({repoRoot:e.repoRoot,repoId:t.value.id});fn();let o=qt(e.repoRoot);!c(r)&&!c(o)&&Pf(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)},sl=e=>{let t=qt(e.repoRoot);if(c(t))return a(t.message);if(!Dp.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=ko({lockPath:`${n}${nl}`,operation:"remove",staleAfterMs:rl,checkProcess:!0});try{return r.acquired?($o(n),nf(n),d("Removed clone",null)):(nf(n),Mf(n),d("Removed once its fetch ends",null))}catch(o){return a(`Could not remove the clone: ${String(o)}`)}finally{r.acquired&&r.release()}},Pf=(e,t)=>{let n=_t(e,t);D.existsSync(n)||D.rmSync(Bt(n),{force:!0})},nS=(e,t,n)=>{for(let r of n){if(!D.existsSync(_t(t,r)))continue;let o=sl({repoRoot:e,repoId:r});if(c(o)){K.info(`[repos] could not clear ${r}: ${o.message}`);continue}fn(),Pf(t,r)}},rS=(e,t)=>oS(e)&&(t===null||!Vp(e,t)),oS=e=>{try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}},lf=4,ui=e=>{let t=e.minIntervalMs??0,n=Xc.get(e.repoRoot);if(n)return n.minIntervalMs<=t?n.result:n.result.then(()=>ui(e));let r=sS(e.repoRoot,t).catch(o=>a(ct(o))).finally(()=>{Xc.delete(e.repoRoot)});return Xc.set(e.repoRoot,{result:r,minIntervalMs:t}),r},Xc=new Map,sS=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{tS(o)}catch(u){K.info(`[repos] sweep failed: ${String(u)}`)}if(nS(e,o,r.value.disconnected),i.length===0)return d("No other repos",[]);let l=[];for(let u=0;u<i.length;u+=lf)l.push(...await Promise.all(i.slice(u,u+lf).map(m=>eS(e,o,s,m,t))));return l.some(u=>u.changed)&&fn(),d("Fetched other repos",l)},il=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 cl=900*1e3,Ar=new Map,Of=0,ll=new Map,Df=e=>{let t=(ll.get(e)??0)+1;return ll.set(e,t),t},iS=(e,t)=>JSON.stringify([e,t.id,t.branches,t.since]),dl=e=>{let t=Ar.get(e);t&&(clearTimeout(t.timer),Ar.delete(e),$t(t.stagePath))},aS=e=>{Df(e),dl(e)},Ff=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}},al=async(e,t)=>{let n=await F({cwd:e,args:t,forClone:!0,keepPartial:!0});return c(n)?null:n.value.stdout},cS=async(e,t,n)=>{let r=(await al(e,["symbolic-ref","--short","HEAD"]))?.trim().replace(/^refs\/heads\//,""),o=await al(e,["log","-1","--format=%s%x00%an%x00%cI","HEAD"]),[s,i,l]=(o??"").trim().split("\0"),m=(await al(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:Hc(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=>_p(p,n).length>0).length}},lS=()=>{if(!gt())return{knownRefs:new Set,contributors:0};let e=h();return{knownRefs:new Set(Object.values(e.nodes).filter(t=>U(t)).map(t=>it(t.id))),contributors:Object.values(e.contributors).filter(t=>!t.tombstoned).length}},_f=e=>{let t=Qc(e);return c(t)?0:t.value.reduce((n,r)=>n+(r.bytes??0),0)},ul=async e=>{let t=Tc(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(Ac,{kind:"unchanged",repo:n.repo});if(n.kind==="edit"){let x=To({repoRoot:e.repoRoot,actorId:e.actorId,event:{action:"edit.repo",payload:n.event}});return c(x)?a(x.message):(n.message.startsWith(ei)||fn(),d(n.message,{kind:"updated",repo:n.repo}))}let r=iS(e.repoRoot,n.repo),o=Ar.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),Ar.delete(n.repo.id);let x=To({repoRoot:e.repoRoot,actorId:e.actorId,event:{action:"connect.repo",payload:n.event}});if(c(x))return $t(o.stagePath),a(x.message);await Lf(e.repoRoot,n.repo,o.stagePath);let E=at(e.repoRoot),w=!c(E)&&E.value.overLimit.some(N=>N.id===n.repo.id);return d(w?`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[...Ar.keys()])dl(x);let s=Df(n.repo.id),i=++Of,l=()=>ll.get(n.repo.id)!==s||Of!==i,u=qt(e.repoRoot);if(c(u))return a(u.message);let m=await kf(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=lS(),f=await cS(m.value.stagePath,pn(n.repo.since,u.value.createdAt),p.knownRefs),g=at(e.repoRoot),v={repo:n.repo,host:Ff(n.repo.url),...f,bytes:m.value.bytes,contributors:p.contributors,claimedBytes:_f(e.repoRoot),overLimit:!c(g)&&g.value.live.length>=An,expiresAt:Date.now()+cl};if(l())return $t(m.value.stagePath),a("Cancelled");let S=setTimeout(()=>dl(n.repo.id),cl);return S.unref(),Ar.set(n.repo.id,{stagePath:m.value.stagePath,key:r,preview:v,timer:S}),d("Preview: nothing is connected until you confirm",{kind:"preview",preview:v})};import dS from"node:path";var uS=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):dS.basename(e),url:n,path:e}};import{randomBytes as mS}from"node:crypto";import pS from"node:fs";import fS from"node:path";var jf=e=>e.replace(/\r\n?/g,`
|
|
50
|
+
`).replace(/[\x00-\x08\x0B-\x1F\x7F\u0080-\u009f\u202a-\u202e\u2066-\u2069]/g,"").trim(),gS=async(e,t)=>{let n=await F({cwd:e,args:["log","-1","--no-show-signature","--format=%b",t,"--"]});return c(n)?"":jf(n.value.stdout)},hS=async(e,t)=>{if(c(t)||t.value.length===0)return t;let n=await Vn(e);if(c(n))return t;let r=mS(8).toString("hex"),o=`${r}`,s=`${r}`,i=new Map,l=async(m,p)=>{let f=await F({cwd:m,args:["cat-file","--batch-check=%(objectname) %(objecttype)"],input:`${p.join(`
|
|
51
|
+
`)}
|
|
52
|
+
`});return c(f)?[]:f.value.stdout.split(`
|
|
53
|
+
`).filter(g=>g.endsWith(" commit")).map(g=>g.slice(0,g.indexOf(" ")))},u=async(m,p)=>{let f=await F({cwd:m,args:["log","--no-walk=unsorted","--no-show-signature","--stdin",`--format=${o}%H${s}%b`,"--"],input:`${p.join(`
|
|
54
|
+
`)}
|
|
55
|
+
`});if(!c(f))for(let g of f.value.stdout.split(o)){let v=g.indexOf(s);if(v===-1)continue;let S=jf(g.slice(v+s.length));S&&i.set(g.slice(0,v).trim(),S)}};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}))},yS=8*1024*1024,fl=async e=>{if(!Un(e.sha))return a("Invalid commit sha");let t=await Oo(e);if(c(t))return a(t.message);let n=await F({cwd:t.value,maxOutput:yS,args:["show","--no-ext-diff","--no-color","--patch","--find-renames","--format=",e.sha]});return c(n)?a(Es(n.message)?"This commit is too large to show here; open it in your editor":n.message):d("Read commit patch",n.value.stdout)},bS=200,$f=e=>/^0+$/.test(e),mi=/^:\d{6} \d{6} ([0-9a-f]{40}) ([0-9a-f]{40}) [A-Z]\d*\t(.+)$/,Bf=/^(\d+|-)\t(\d+|-)\t(.+)$/,ml=async(e,t,n,r)=>{let o=await F({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(Gf);let s=o.value.stdout.split(`
|
|
56
|
+
`).filter(m=>m!==""),i=s.filter(m=>!mi.test(m)&&!Bf.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=Bf.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=>mi.test(m)).map(m=>{let p=mi.exec(m),f=p?.[1]??"",g=p?.[2]??"",v=p?.[3]??"";return{path:v,beforeBlob:$f(f)?null:f,afterBlob:$f(g)?null:g,...l.get(v)??{insertions:0,deletions:0,isBinary:!1}}});return d("Listed changed files with blob hashes",u)},Hf=async(e,t)=>{if(t.length>bS)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 Iu(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}}))},vS=async e=>{if(!Un(e.sha))return a("Invalid commit sha");let t=await Oo(e);if(c(t))return a(t.message);let n=t.value,r=gS(n,e.sha),o=await ml(n,`${e.sha}~1`,e.sha);if(c(o)&&o.message===Gf){let u=await Wf(n,e.sha);if(c(u))return a(u.message);u.value===pl&&(o=await ml(n,pl,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 Hf(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}:{}})},xS=/^[0-9a-f]{40}$/,RS=async(e,t,n)=>{let r=await F({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(`
|
|
57
|
+
`)){if(xS.test(i)){s=new Set,o.set(i,s);continue}let l=mi.exec(i);l&&s&&s.add(l[3]??"")}return d("Listed changed paths per commit",o)},Uf=e=>{let t=new Set;for(let n of e)for(let r of n)t.add(r);return t},ES=async(e,t,n)=>{if(t===n)return!0;let r=await F({cwd:e,args:["merge-base","--is-ancestor",t,n]});return!c(r)},pl="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Gf="Could not read this commit's diff",SS="Its parent is outside the fetched history. Widen since to see this diff.",CS=async(e,t)=>{let n=await F({cwd:e,args:["rev-parse","--git-path","shallow"]});if(c(n))return!1;try{return pS.readFileSync(fS.resolve(e,n.value.stdout.trim()),"utf8").split(`
|
|
58
|
+
`).some(r=>r!==""&&r.startsWith(t))}catch{return!1}},Wf=async(e,t)=>{let n=await F({cwd:e,args:["rev-parse","--verify","--quiet",`${t}^1`]});return c(n)?await CS(e,t)?a(SS):d("A root commit",pl):d("Parent",`${t}~1`)},NS=async e=>{let t=At(e.repoRoot);if(c(t))return a(t.message);let n=t.value,r=await Kc({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=Fc(s.value),l=new Map;for(let g of Ir(r.value))g.length>0&&l.set(g[0].repo??"",g);let u=[],m=0;for(let[g,v]of l){let S=i(g);if(!S){m+=1;continue}let x=await wS(S,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(w=>E?{...w,repo:E}:w),overlappingPaths:x.value.overlappingPaths.map(w=>E?`${E}:${w}`:w)}})}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")},wS=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 ES(e,P,o)){s=P;break}}let i=await Wf(e,s);if(c(i))return a(i.message);let l=i.value,u=await RS(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)),S=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 w=(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:S,overlappingPaths:P}),N,k=[];if(!S||x){let M=Uf(g.map($=>m.get($)??new Set)),P=Uf([...m.entries()].filter(([$])=>!f.has($)).map(([,$])=>$));if(M.size===0)return w([],[]);N=[...M],k=[...M].filter($=>P.has($)).sort()}let L=await ml(e,l,o,N);if(c(L))return a(L.message);let _=await Hf(e,L.value);return c(_)?a(_.message):w(_.value,k)};var Vf=/<!--\s*epiq-diff-comment:(.+?)-->\n?/,gl=e=>e.replace(Vf,""),IS=e=>`<!-- epiq-diff-comment:${JSON.stringify(e).replaceAll(">","\\u003e")} -->`,zf=e=>e==="additions"||e==="deletions",Uo=e=>{let t=Vf.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"||!zf(r.side)||!zf(r.endSide)||r.sha!==void 0&&typeof r.sha!="string"||r.issueRef!==void 0&&typeof r.issueRef!="string"?null:r};var Kf=/```\n([\s\S]*?)\n?```\s*$/,qf=e=>Kf.exec(e)?.[1]??null,AS=/`[^`\n]+`[^\n]*\n?$/,Yf=e=>gl(e).replace(Kf,"").replace(AS,"").trim(),Xf=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})`},hl=e=>`${e.issueRef?`${e.issueRef} \xB7 `:""}${e.filePath} ${Xf(e)}`;var TS=e=>{let t=e.split(`
|
|
59
|
+
`),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(`
|
|
60
|
+
`):e},Jf=({snippet:e,...t})=>{let n=t.note.trim();return[...n?[n,""]:[],IS({...t,note:n}),`\`${t.filePath}\` ${Xf(t)}`,"```",TS(e),"```"].join(`
|
|
61
|
+
`)};var MS=/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@(.*)$/,pi=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+=`
|
|
62
|
+
`;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}},Zf=e=>{let t=pi(e.trim());return t==="/dev/null"?null:t.replace(/^[ab]\//,"")},bl=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(`
|
|
63
|
+
`)){if(i.startsWith("diff --git ")){n=s();let p=i.slice(11),f=p.lastIndexOf(" b/");f!==-1&&(n.path=pi(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=Zf(i.slice(4));p&&(l.oldPath=p);continue}if(u&&i.startsWith("+++ ")){let p=Zf(i.slice(4));p&&(l.path=p);continue}if(u&&i.startsWith("rename from ")){l.oldPath=pi(i.slice(12));continue}if(u&&i.startsWith("rename to ")){l.path=pi(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=MS.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!=="")},yl=e=>e.oldPath&&e.oldPath!==e.path?e.oldPath:null;var vl=e=>e.flatMap(t=>[{kind:"file",text:`${yl(t)?`${yl(t)} \u2192 `:""}${t.path}`,file:t},...t.lines]),fi=e=>{let t="",n=-1;return e.map(r=>(r.kind==="file"&&(t=r.file.path),r.kind==="hunk"&&n++,{file:t,hunk:n}))},xl=(e,t,n)=>{let r=t.map(i=>Uo(i.md)).filter(i=>i!==null&&i.sha===n&&i.side==="additions");if(r.length===0)return new Set;let o=fi(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},Qf=(e,t)=>e===t?`line:${e}`:`lines:${e}-${t}`,kS=/^lines?:(\d+)(?:-(\d+))?(?:\s+|$)/,eg=e=>{let t=kS.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)}},tg=(e,t)=>fi(e)[t]?.file??null,ng=(e,t,n,r)=>{let o=fi(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`}:Rl(e,i,l)},Rl=(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=fi(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(`
|
|
64
|
+
`)}}};import{existsSync as wl}from"node:fs";import{chmod as Il}from"node:fs/promises";import hi from"node:path";import{spawn as LS,spawnSync as PS}from"node:child_process";import OS from"node:os";import rg from"node:path";import{ulid as DS}from"ulid";function El(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 FS(e){let t=e.trim();return t==="$EDITOR"?process.env.EDITOR:t==="$VISUAL"?process.env.VISUAL:t}function gi(){let{preferredEditor:e}=ne(),t=[e?FS(e):void 0,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function Sl(e){let[t=""]=El(e);return/(^|\/)code(-insiders)?$/.test(t)}function og(e,t){let[n="",...r]=El(e);return{command:n,args:[...r,...t]}}function sg(e,t){return og(e,Sl(e)?["--wait",t]:[t])}function _S(e,t,n,r="new"){return og(e,[r==="new"?"--new-window":"--reuse-window","--diff",t,n])}function Cl(e){let t=rg.join(OS.tmpdir(),"epiq");Oe.mkDir(t);let n=rg.join(t,DS());Oe.writeToFile(n,e??"");let r=gi();for(let o of r){let{command:s,args:i}=sg(o,n);if(!s)continue;let l=PS(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 $S=new Set(["vim","vi","nvim","nano","pico","ed"]);function BS(e){let[t=""]=El(e),n=t.split("/").pop()??t;return $S.has(n)}var US=600;function ig({command:e,args:t},n){return new Promise(r=>{if(!e){r(a(`"${n}" is not a usable editor command`));return}let o=LS(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))},US)})}function jS(e,t){return BS(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}`)):ig(sg(e,t),e)}function Nl(e,t,n,r="new"){return ig(_S(e,t,n,r),e)}async function ag(e){let t=gi();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 jS(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 HS,existsSync as GS,lstatSync as WS,mkdirSync as zS}from"node:fs";import VS from"node:os";import KS from"node:path";var jo=(...e)=>{let t=KS.join(VS.tmpdir(),"epiq",...e);try{return GS(t)&&WS(t).isSymbolicLink()?a(`Refusing to write through a symlink at ${t}`):(zS(t,{recursive:!0,mode:448}),HS(t,448),d("Prepared private temp dir",t))}catch(n){return a(`Unable to prepare ${t}: ${n instanceof Error?n.message:String(n)}`)}};var qS=async(e,t)=>{let n=await F({cwd:e,args:["show","--no-ext-diff",t]});if(c(n))return a(n.message);let r=jo("commit-diffs");if(c(r))return a(r.message);let o=hi.join(r.value,`${t}.diff`);return wl(o)||(Oe.writeToFile(o,n.value.stdout),await Il(o,292)),ag(o)},YS=12,XS=800,cg=async(e,t,n)=>{let r=await F({cwd:e,args:["show",`${t}:${n}`]});return c(r)?"":r.value.stdout},JS=async(e,t)=>{let n=await F({cwd:e,args:["diff","--name-only",`${t}~1`,t]});if(c(n))return a(n.message);let r=n.value.stdout.split(`
|
|
65
|
+
`).map(o=>o.trim()).filter(Boolean);return r.length===0?a("No changed files found for this commit"):d("Listed changed files",r)},ZS=async(e,t,n)=>{let r=await JS(e,t);if(c(r))return a(r.message);let o=r.value;if(o.length>YS)return a(`Commit touches ${o.length} files \u2014 too many for a side-by-side view`);let s=jo("commit-diffs",t);if(c(s))return a(s.message);let i=s.value,l=await Promise.all(o.map(async(g,v)=>{let[S,x]=await Promise.all([cg(e,`${t}~1`,g),cg(e,t,g)]),E=hi.basename(g),w=hi.join(i,String(v),"before",E),N=hi.join(i,String(v),"after",E);return wl(w)||(Oe.writeToFile(w,S),await Il(w,292)),wl(N)||(Oe.writeToFile(N,x),await Il(N,292)),{beforePath:w,afterPath:N}})),[u,...m]=l;if(!u)return a("No changed files found for this commit");let p=await Nl(n,u.beforePath,u.afterPath,"new");if(c(p)||m.length===0)return p;await new Promise(g=>setTimeout(g,XS));let f=await Promise.all(m.map(({beforePath:g,afterPath:v})=>Nl(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},Al=async e=>{if(!Un(e.sha))return a("Invalid commit sha");let t=await Oo(e);if(c(t))return a(t.message);let n=t.value,r=gi()[0];if(r&&Sl(r)){let o=await ZS(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 qS(n,e.sha)};var lg=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 Tl=["branches=default","branches=all","since=board","since=all","since=YYYY-MM-DD","label=<name>","confirm"],Ml=e=>{let[t="",...n]=e.trim().split(/\s+/).filter(Boolean);if(!t)return a("a remote URL to read commits from");if(!nn(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(`${Tl.join(", ")}; not "${s}"`)}return d("Parsed",r)},dg=()=>{let e=At();if(c(e))return[];let t=at(e.value);return c(t)?[]:[...t.value.live,...t.value.overLimit]},QS=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}`,lg(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 ")},Tr=null,eC=e=>`${e.trim()} confirm`,ug=e=>Tr&&Tr.line===e.trim()?Tr.summary:null,mg=async()=>{let e=q().commandMeta.inputString,t=Ml(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 ul({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=eC(e);return Tr={line:s,summary:QS(o.value.preview)},d(Tr.summary,{followUp:`config repoConnect ${s}`})}return t.value.confirm&&(Tr=null),d(o.value.kind==="connected"?`${o.message} \u2014 it syncs with the board; :sync fetches it`:o.message,null)},pg=()=>{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=ol({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 fg=e=>e==="board"||e==="goal"?4e3:2e3,gg=e=>e.trim()?e:"";var hg=(e,t,n)=>t.length>n?`${e} cannot exceed ${n} characters (got ${t.length})`:null;import{createHash as tC}from"node:crypto";var nC="0123456789ABCDEFGHJKMNPQRSTVWXYZ",rC=e=>{let t=tC("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+=nC[Number(n>>s&31n)]}return r},yg=new Map,he=(e,t)=>{let n=`${e}:virtual:${t}`,r=yg.get(n);if(r!==void 0)return r;let o=rC(n);return yg.set(n,o),o};import bg from"chalk";var ie=e=>bg.dim(e),ue=e=>bg.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)=>hs(f)-hs(g)).slice(0,r).map(f=>ys(f)).join(" ");return p?`${ie(e)}${p}${ie(n)}`:""};var gn={None:"none",Invalid:"invalid",Valid:"valid"};var oC=["BOARD","TICKET","SWIMLANE"],vg=()=>{let e=h().selectedNode;if(!e?.context)return z({message:ie("Missing target context")});if(oC.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",sC=()=>{let{userId:e}=ne(),t=me();return!e||c(t)?[]:lr(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,xg=(e,t)=>{let n=tt(h().breadCrumb,"BOARD");if(c(n))return z({message:ue("Command is not applicable in this context")});let r=Fd(n.value.id);return c(r)?z({message:ue(`Unable to ${t}: board id is not a valid ULID`)}):Cm({date:e,horizonDate:r.value})?null:z({message:ue(`nothing to ${t} before ${r.value.toISOString().slice(0,16).replace("T"," ")}`)})},Mr=e=>` ${Eg.hex("#000").bgHex(Ue(e))(` ${e} `)} `,kl=({modifier:e})=>{let t="confirm";return e===t?Z(se):z({message:hn(e)?ie("if you are certain, enter ")+ys(t):"",completionWordList:[t]})},iC=({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]}),Rg=e=>({modifier:t,inputString:n})=>{let r=e();return r.includes(t)?hn(n)?Z(se):z({message:ue("Takes one rule"),completionWordList:[]}):z({message:hn(t)?ie("rule:")+r.map(Mr).join("")+ie(""):ue(`Rules: ${po.join(", ")}`),completionWordList:[...r]})},Yn=({hint:e,onOk:t})=>({modifier:n,inputString:r})=>hn(n)&&hn(r)?z({message:e,completionWordList:[]}):Z(t??se),aC=({modifier:e,inputString:t})=>{let n=tc();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})},cC=({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=[...Am];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||ue("Enter a user name. Saved in ")+Eg.bgBlack("~/.epiq-global/config.json"),completionWordList:o})}case ee.EMAILS:{let r=ne().gitEmail,o=gr(),s=o.length>0||!r?o:[r],i=[...s,"none"],l=t.trim(),u=(S,x)=>z({message:xe({prefix:S,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=S=>S==="none"||s.includes(S.toLowerCase()),g=S=>i.some(x=>x.startsWith(S.toLowerCase())),v=m.filter(S=>!f(S)&&!g(S));return v.length>0?z({message:ue(`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=sC(),o=t.trim();return r.length===0?z({message:ue("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=lm(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<ho||o>yo){let s=xe({prefix:" examples: ",wordList:Qa,minLengthForHints:0,inputString:t});return z({message:ue(`provide a size cap in KB (${ho}-${yo}). current: ${r??Bn} KB.`)+s,completionWordList:Qa})}return Z(se)}case ee.REPO_CLONE_MAX_MB:{let r=t.trim();if(!/^\d+$/.test(r)||!ac(Number(r))){let o=xe({prefix:" examples: ",wordList:ec,minLengthForHints:0,inputString:t});return z({message:ue(`provide a connected repo's clone cap in MB (${vr}-${xr}). current: ${Rr()} MB.`)+o,completionWordList:ec})}return Z(se)}case ee.REPO_CONNECT:{let r=Ml(t);if(c(r))return z({message:ue(r.message),completionWordList:[]});let o=r.value.confirm?ug(t):null;return r.value.confirm&&!o?z({message:ue("preview it first: run the line without confirm"),completionWordList:[]}):Z(`${o??ie(Tl.join(" "))} ${se}`,[],!1)}case ee.REPO_DISCONNECT:{let r=dg(),o=kc(r),s=t.trim();return o.length===0?z({message:ue("no other repos are connected"),completionWordList:[]}):s&&!c(ni(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=dr(t);if(!t.trim()||o===null){let s=xe({prefix:" examples: ",wordList:Za,minLengthForHints:0,inputString:t});return z({message:ue(`provide a duration between ${3e3}ms and ${864e5}ms. current duration: ${r}ms.`)+s,completionWordList:Za})}return Z(se)}default:return z({message:ue("Unknown config option"),completionWordList:n})}},lC=({modifier:e,inputString:t})=>{let n=ke(b.EDIT);if(!n.length)return z({message:ue("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||ue("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:ue("Unknown edit option"),completionWordList:n})}},dC=({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:ue("Nothing selected to copy from")})},uC={[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=xg(o,"peek");return s||Z(se)},[b.REPLAY]:e=>{let{dateInput:t,durationInput:n}=Bs(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=xg(o,"replay");return s||(n&&$s(n)===null?z({message:ue("duration must be positive (e.g. 30s, 2m, or a number of seconds)")}):Z("<ENTER> to replay board history",n?Im:[]))},[b.EXIT]:()=>Z(se+ie(" and exit the application")),[b.INIT]:()=>Z(se),[b.OPEN]:aC,[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"?js():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=>iC({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]:lC,[b.COMMENT]:e=>{let t=Yn({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(ue("max input exceeded")):t},[b.CONFIG]:cC,[b.YANK]:dC,[b.DELETE]:e=>{let t=vg();return t.validity==="invalid"?t:kl(e)},[b.GOAL]:e=>{let t=js().slice(0,10).map(Mr);return Yn({hint:t.length?ie("goal:")+t.join("")+ie(""):ie("name a new goal ...")})(e)},[b.UNGOAL]:e=>e.modifier||e.inputString.trim()?z({message:ue("Takes no argument"),completionWordList:[]}):Z(se),[b.RULE]:Rg(()=>{let e=zt();return e?Ls(e):[]}),[b.UNRULE]:Rg(()=>{let e=zt();return e?Dn(e):[]}),[b.CLOSE_ISSUE]:e=>kl(e),[b.RE_OPEN_ISSUE]:e=>kl(e),[b.MOVE]:e=>{let t=vg();return t.validity==="invalid"?t:Yn({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(Mr).join("");return Yn({hint:n.length?ie("create tag or reuse:")+n+ie(""):ie("create tag ...")})(e)},[b.UNTAG]:e=>{let t=Ms();if(c(t))return z({message:ue("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(Mr).slice(0,10);return n.length?Yn({hint:ie(" ... ")+n.join("")})(e):z({message:ue("Issue has no tags"),completionWordList:[]})},[b.ASSIGN]:e=>{let t=R.getExistingAssignees().map(Mr).slice(0,10);return Yn({hint:ie("assignees... ")+t.join("")})(e)},[b.UNASSIGN]:e=>{let t=ks();if(c(t))return z({message:ue("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(Mr).slice(0,10);return n.length?Yn({hint:ie("remove assignee... ")+n.join("")})(e):z({message:ue("Issue has no assignees"),completionWordList:[]})},[b.SYNC]:()=>Z(se)},Sg=Object.fromEntries(Object.entries(uC).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var yi=["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 mC=3,pC=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"]),fC=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},gC=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=mC&&!pC.has(t)&&!/^\d+$/.test(t)),hC=e=>{let t=new Map;for(let s of fC(e))for(let i of gC(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=yi.filter(s=>!r.has(s));return[...n,...o]},Cg=yi,Ng=-1,wg=()=>{let e=me();if(c(e))return yi;let t=e.value,n=t.eventLog.length;return n!==Ng&&(Cg=hC(t),Ng=n),Cg};var Ig=e=>Object.values(b).includes(e),Ag=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:s}=e,{message:i,validity:l,completionWordList:u}=Sg[n].validate(n,r,s),m=n!==b.PEEK&&n!==b.REPLAY,p=o==="command"||o==="modifier"?ke(n):m?wg():[],{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?iu(e,v,u):{hint:"",hints:[],remainder:"",overlap:0}}};var Tg=e=>{let t=e.trimStart(),n=bC(t),r=n[0]??"",o=n[1]??"",s=/\s$/.test(e),i=vC(e),l=Ig(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,S=yC(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:S}},yC=(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},bC=e=>e.trim()?e.trim().split(/\s+/):[],vC=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as xC}from"react";var kr=e=>e===Ll||e===":",Ll=" ",Go=40,Lr={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:gn.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},Pl=new Set,Mg=()=>{for(let e of Pl)e()},RC=e=>(Pl.add(e),()=>Pl.delete(e)),ht=e=>{let n=e(Lr),r=Tg(n.value),o=n.cursorPosition===n.value.length;Lr={...n,commandMeta:Ag(r,o)},Mg()},Wo=({message:e,status:t})=>{let n=structuredClone(Lr);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,Lr=n,Mg(),d(e,null)},Ol=e=>{ht(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},Dl=e=>{ht(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&kr(n[o-1]);)o--;for(;o>0&&!kr(n[o-1]);)o--}else{for(;o<n.length&&!kr(n[o]);)o++;for(;o<n.length&&kr(n[o]);)o++}return{...t,cursorPosition:o}})},kg=()=>{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}})},Lg=()=>{ht(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&kr(t[r-1]);)r--;for(;r>0&&!kr(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},bi=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}})},Pg=()=>{ht(e=>({...e,commandIsPending:!0}))},X=e=>{ht(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},Og=({addToHistory:e=!0,line:t})=>{ht(n=>{let r=t??n.value;return{...n,commandHistory:e&&r.trim()?[r,...n.commandHistory].slice(0,Go):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}})},Dg=e=>{ht(t=>({...t,commandHistory:e.slice(0,Go),commandHistoryIndex:-1}))},Fg=()=>{ht(e=>e.commandHistoryIndex===-1?e:{...e,commandHistoryIndex:-1})},_g=()=>{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}})},$g=()=>{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=()=>Lr,U_=()=>xC(RC,q,q),vi=()=>{let[e,...t]=Lr.value.split(Ll);return t.join(Ll).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"},EC=e=>e.shift===!0,SC={[C.NavPreviousItem]:C.NavPreviousItemJump,[C.NavNextItem]:C.NavNextItemJump,[C.MovePreviousItem]:C.MovePreviousItemJump,[C.MoveNextItem]:C.MoveNextItemJump};function CC(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;default:return null}}function NC(e){switch(e.name){case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function wC(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 q_(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 Zd(e,n.value);if(t===y.PALETTE)return Qd(e,n.value);let r=CC(e)||NC(e);if(r)return IC(r,t,EC(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 IC(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=wC(h().contextNode.childRenderAxis,e,r);return!o||!n?o:SC[o]??o}import{ulid as MC}from"ulid";var zo=24n,AC=zo*4n,Mt=(1n<<AC)-1n,TC=/^[0-9a-f]+$/;function Bg(e){return!e||!TC.test(e)?a(`Invalid hex rank: ${e}`):d("Converted rank to bigint",BigInt("0x"+e))}function lt(e,t=zo){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,zo);let n=e?Bg(e):d("Resolved lower bound",0n);if(c(n))return n;let r=t?Bg(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,zo)}function Ug(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,zo);if(c(s))return s;n.push(s.value)}return d("Resolved evenly spaced ranks",n)}var Fl=(e,t)=>{let n=be(e),r=Ug(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:MC(),action:"rebalance.children",payload:{parent:e,ranks:o},...Q(t)})};var yn=e=>e.trim().toLocaleLowerCase(),_l=(e,t)=>yn(e).includes(yn(t));var kC=e=>{let{tags:t}=h();return(e.props.tags??[]).map(n=>t[n]).filter(n=>n!==void 0&&!n.tombstoned).map(n=>n.name)},LC=e=>{let{contributors:t}=h();return(e.props.assignees??[]).map(n=>{let r=t[n];return r?r.name:void 0}).filter(n=>!!n)},jg=null,Hg=new Map,PC=()=>{let e=h().eventLog??[];if(e===jg)return Hg;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 jg=e,Hg=t,t},OC=e=>{let{contributors:t}=h(),n=PC().get(e.id);return n?[...n].map(r=>t[r]?.name).filter(r=>!!r):[]},Gg=(e,t)=>{let n=yn(t.value);if(!n)return!0;switch(t.target){case"title":return _l(e.title??"",n);case"description":return _l(e.props.description??"",n);case"tag":return kC(e).map(yn).some(o=>o.includes(n));case"goal":{let r=cn(e);return r?yn(r.name).includes(n):!1}case"assignee":return LC(e).map(yn).some(o=>o.includes(n));case"actor":return OC(e).map(yn).some(o=>o.includes(n));case"ref":return Sc(e.id,t.value);default:return!0}};var $l=(e,t)=>e.rank<t.rank?-1:e.rank>t.rank?1:0,DC=(e,t)=>!!e&&!e.isDeleted&&e.parentNodeId===t,Wg=(e,t)=>Object.values(e).filter(n=>DC(n,t)).sort($l),zg=(e,t)=>{let n={};for(let r of Object.values(e)){if(U(r)&&t.length>0&&!t.every(s=>Gg(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($l);return n},Vg=(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($l);return n};var Kg=e=>xi(be(e),{at:"end"}),xi=(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=qg(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=qg(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(!Xg()&&t.filters.length===0){let n=t.renderedChildrenIndex[e];if(n)return n}return Wg(t.nodes,e)},qg=(e,t)=>e.findIndex(n=>n.id===t),Yg=(e,t,n={at:"end"})=>xi(be(t).filter(r=>r.id!==e),n),Ri=(e,t,n,r,o)=>{let s=Yg(t,e,n);if(c(s))return s;if(!s.value.needsRebalance)return d("Resolved rank",s.value.rank);let i=Fl(e,r);if(c(i))return i;let l=Y([i.value],o);if(c(l))return l;let u=Yg(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)},Ei=(e,t,n)=>{let r=Kg(e);if(c(r))return r;if(!r.value.needsRebalance)return d("Resolved rank",r.value.rank);let o=Fl(e,t);if(c(o))return o;let s=Y([o.value],n);if(c(s))return s;let i=Kg(e);return c(i)?i:i.value.needsRebalance?a("Rank rebalance failed to create space"):d("Resolved rank after rebalance",i.value.rank)};var Vo=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:()=>Zg(Vo),jumpToPreviousItem:()=>Zg(-Vo),navigateToNextContainer:()=>Qg(1),navigateToPreviousContainer:()=>Qg(-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})},Zg=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})},Qg=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 th=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),nh=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=h();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},FC=e=>{let t=h().nodes[e];return!!t&&!t.isDeleted&&Fe(t)&&t.childRenderAxis==="vertical"},Si=(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:th(t,o.length)}),!0},rh=e=>{let{nodes:t}=h(),n=t[e];if(!n||n.isDeleted)return!1;let r=n.parentNodeId;if(!r)return Si(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):rh(o.id)},eh=e=>{let{nodes:t}=h(),n=e,r=new Set;for(;n&&!r.has(n);){if(r.add(n),rh(n))return!0;n=t[n]?.parentNodeId}return!1},_C=e=>{if(!e)return!1;let t=h().nodes[e];return!!t&&!t.isDeleted},oh=e=>{let{nodes:t,rootNodeId:n}=h();if(FC(e.contextNodeId)&&Si(e.contextNodeId,e.selectedIndex))return d("Restored navigation inside text container",null);if(_C(e.selectedNodeId)&&e.selectedNodeId&&eh(e.selectedNodeId))return d("Restored navigation to selected node or ancestor",null);if(Si(e.contextNodeId,e.selectedIndex))return d("Restored navigation to previous container",null);if(e.parentNodeId&&Si(e.parentNodeId,e.selectedIndex))return d("Restored navigation to previous parent",null);if(eh(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:th(e.selectedIndex,o.length)}),d("Restored navigation to root",null)};import{monotonicFactory as $C,ulid as Ut}from"ulid";var Ko=$C();function BC(){let e=me();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 UC(){let e=BC();return c(e)?e:V.navigate(e.value)}function sh({userId:e,userName:t}){let n=Ko(),r=Ko(),o=Ko(),s=Ko(),i=Ko(),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:hr,name:"Closed",parent:n,rank:m.value}},{id:Ut(),userId:e,action:"add.swimlane",payload:{id:mt,name:"Closed",parent:hr,rank:v.value}},{id:Ut(),userId:e,action:"lock.node",payload:{id:hr}},{id:Ut(),userId:e,action:"lock.node",payload:{id:mt}}])}var jC=()=>{let e=me();if(c(e))return!1;let{timeMode:t}=e.value;return t==="peek"||t==="replay"},HC=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 qo(e,t=[]){if(jC())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=No(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=mn(e),{fatal:r,skipped:o}=Wn(n);return r.length>0?a(`Materializing failed:
|
|
66
|
+
${r.map(s=>s.message).join(`
|
|
67
|
+
`)}`):(zn(o),UC(),I({hasProjectDefinition:!0}),HC(t),d("State booted successfully",null))}import{WebSocket as GC}from"ws";var Ci=new Set,q$=e=>{Ci.add(e),e.on("close",()=>{Ci.delete(e)}),e.on("error",()=>{Ci.delete(e)})},ih=e=>{let t=JSON.stringify(e);for(let n of Ci)n.readyState===GC.OPEN&&n.send(t)};var Ni=e=>{gt()&&(I({syncStatus:e}),ih({type:"sync-status",payload:e}))},wi=(e="Syncing...")=>{Ni({status:"syncing",msg:e})},Yo=(e="Synced")=>{Ni({status:"synced",msg:e})},WC=e=>{Ni({status:"failed",msg:e})},Ii=e=>{Ni({status:"offline",msg:e})},Te=e=>(WC(e),a(e));var Jn=(e,t)=>(logger.error(`[boot:${e}] ${t}`),a(`[boot:${e}] ${t}`)),ah=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 Ch from"node:fs";import Xt from"node:fs";import Jt from"node:path";import Ai from"node:fs";import ch from"node:path";var _e=".epiq/project.json",lh=e=>ch.join(e,_e),zC=e=>{if(!Ai.existsSync(lh(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)},Bl=(e,t)=>{try{let n=lh(e);return Ai.mkdirSync(ch.dirname(n),{recursive:!0}),Ai.writeFileSync(n,JSON.stringify(t,null,2)+`
|
|
68
|
+
`,"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")}},VC=({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(`
|
|
69
|
+
`);var dh=({repoRoot:e,stateBranchRoot:t,stateBranch:n})=>{if(!Ai.existsSync(pr(e)))return d("No project file to compare","no-checkout-file");let r=He(e);if(c(r))return a(r.message);let o=zC(t);if(c(o))return a(o.message);if(o.value===null){let s=Bl(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(VC({checkout:r.value,branch:o.value,stateBranch:n})):d("The checkout and the state branch agree","matched")};import jt from"node:fs";import Xo from"node:path";var Pr=e=>e.split(`
|
|
70
|
+
`).filter(t=>t.trim().length>0),uh=e=>{let t=Xo.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=>Pr(jt.readFileSync(Xo.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)}`)}},mh=e=>Xo.join(e,je,Wt),ph=e=>{let t=mh(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,Pr(jt.readFileSync(Xo.join(t,r),"utf8")))}catch(o){if(!vo(o))throw o}}catch{return n}return n},KC=e=>{try{let t=JSON.parse(e);return typeof t=="object"&&t!==null}catch{return!1}},fh=(e,t)=>{if(t.size===0)return[];let n=mh(e),r=[];for(let[o,s]of t){if(s.length===0)continue;let i=Xo.join(n,o);try{let l=jt.existsSync(i)?jt.readFileSync(i,"utf8"):null,u=new Set(l===null?[]:Pr(l)),m=s.filter(f=>!u.has(f)).filter(KC);if(m.length===0)continue;jt.mkdirSync(n,{recursive:!0});let p=l!==null&&l.length>0&&!l.endsWith(`
|
|
71
|
+
`);jt.appendFileSync(i,`${p?`
|
|
72
|
+
`:""}${m.join(`
|
|
73
|
+
`)}
|
|
74
|
+
`,"utf8"),r.push(`${o} (${m.length})`)}catch{continue}}return r},qC=(e,t)=>{let n=new Set(Pr(t));return Pr(e).filter(r=>!n.has(r))},YC=(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(`
|
|
75
|
+
`),gh=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=qC(r.stdout,n);return o.length>0?a(YC(t,o,Pr(r.stdout).length)):d("Event log only grew",void 0)};var XC="[epiq:init-repo]",yh=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(`
|
|
76
|
+
`));K.info("Creating initial commit");let r=await F({args:["hash-object","-w","-t","tree","/dev/null"],cwd:e});if(c(r))return a(r.message);let o=await F({args:["commit-tree",r.value.stdout.trim(),"-m",XC],cwd:e});if(c(o))return a(o.message);let s=await F({args:["update-ref","HEAD",o.value.stdout.trim()],cwd:e});return c(s)?a(s.message):d("Created initial commit",!0)},hh=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",JC=async e=>{let t=await Ns(e);if(c(t))return a(t.message);let n=await Mu(e);return c(n)?a(n.message):d("Built sync commit message",`[sync|branch:${hh(t.value)}:sha:${hh(n.value)}]`)},Ul=async({repoRoot:e,stateBranchName:t})=>{K.info(`Creating ${t}`);let n=await F({args:["commit-tree",ju,"-m","[epiq:init-state-branch]"],cwd:e});if(c(n))return a(`Failed to create state branch commit
|
|
77
|
+
${n.message}`);let r=n.value.stdout.trim(),o=await F({args:["update-ref",`refs/heads/${t}`,r],cwd:e});return c(o)?a(`Failed to create ${t}
|
|
78
|
+
${o.message}`):d("Created state branch",!0)},jl=async({repoRoot:e,stateBranchName:t})=>{let n=await Cs({repoRoot:e,branch:t});if(c(n))return a(`Ensure local state branch failed
|
|
79
|
+
`+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
|
|
80
|
+
`+r.message);let o=r.value,s=o?await Zr({repoRoot:e,branch:t}):d("No remote, no remote state branch",!1);if(c(s))return a(`Ensure local state branch failed
|
|
81
|
+
`+s.message);let i=s.value;if(o&&i){let l=await pe.fetch({cwd:e,remote:ot,branch:t});if(c(l))return a(`Failed to fetch ${t} from remote
|
|
82
|
+
${l.message}`)}if(i){let l=await F({args:["branch","--track",t,`${ot}/${t}`],cwd:e});return c(l)?a(`Failed to create local ${t} from remote
|
|
83
|
+
${l.message}`):d("Created local state branch from remote",!0)}return Ul({repoRoot:e,stateBranchName:t})},ZC=async({repoRoot:e,branch:t})=>{let n=await F({args:["worktree","list","--porcelain"],cwd:e});if(c(n))return a(n.message);let r=n.value.stdout.split(`
|
|
84
|
+
`),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)},QC=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=to(Jt.dirname(t));if(c(r))return a(`Failed to create state branch worktree
|
|
85
|
+
`+r.message);if(Xt.existsSync(t)&&!Xt.existsSync(Jt.join(t,".git"))){let s=uh(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(`
|
|
86
|
+
`));K.info("Removing broken state branch worktree path"),zu(t)}K.info("Creating state branch worktree");let o=await pe.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return c(o)?a(`Failed to create state branch worktree
|
|
87
|
+
${o.message}`):d("Created state branch worktree",!0)},Or=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await tN({repoRoot:e,stateBranchRoot:t,stateBranchName:n});if(c(r))return r;let o=dh({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)},eN=(e,t)=>{let n=ur(On());return Jt.dirname(e)===n&&Jt.dirname(t)===n},tN=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await ZC({repoRoot:e,branch:n});if(c(r))return a(r.message);let o=ur(t),s=r.value?ur(r.value):null;if(s&&s===o&&Xt.existsSync(s))return d("State branch already checked out in expected worktree",!1);if(s&&s!==o&&eN(s,o))return a([`The state branch ${n} is checked out under project ${Jt.basename(s)}, but this checkout names project ${Jt.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(`
|
|
88
|
+
`));if(s&&s!==o){let u=await Fu(s);if(c(u))return a(u.message);if(u.value||rp(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(`
|
|
89
|
+
`));K.info("Moving state branch worktree to expected location");let m=await pe.worktreeRemove({cwd:e,worktreeRoot:s});if(c(m))return a(`Failed to remove existing state branch worktree
|
|
90
|
+
${m.message}`)}if(s&&!Xt.existsSync(s)){K.info("Pruning stale state branch worktree");let u=await pe.worktreePrune({cwd:e});if(c(u))return a(`Failed to prune stale worktrees
|
|
91
|
+
${u.message}`)}let i=await Tu({repoRoot:e,worktreeRoot:t});if(c(i))return a(i.message);let l=Xt.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 pe.worktreePrune({cwd:e});if(c(u))return a(`Failed to prune stale worktrees
|
|
92
|
+
${u.message}`)}return QC({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},nN=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await Ns(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 pe.checkout({cwd:e,branch:t});return c(o)?a(`Failed to checkout ${t}
|
|
93
|
+
${o.message}`):d("Checked out state branch",!0)},rN=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Oa(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 Zr({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 pe.fetch({cwd:t,remote:ot,branch:s});if(c(l))return a(`Failed to fetch ${s}
|
|
94
|
+
${l.message}`);let u=await pe.setUpstream({cwd:t,branch:s,upstream:`${ot}/${s}`});return c(u)?a(`Failed to set state branch upstream
|
|
95
|
+
${u.message}`):d("Configured state branch upstream",!0)},Ti=async({stateBranchRoot:e,eventFileName:t})=>{let n=Hu(t),r=Jt.join(e,n);if(!Xt.existsSync(r))return d("No event file to stage",null);let o=await gh({stateBranchRoot:e,relativePath:n,workingContent:Xt.readFileSync(r,"utf8")});if(c(o))return a(o.message);let s=await pe.stage({cwd:e,pathspec:[n]});return c(s)?a(`Failed to stage state branch event file
|
|
96
|
+
${s.message}`):d("Staged state branch event file",n)},bh=async({stateBranchRoot:e})=>{let t=Gu(),n=Jt.join(e,t);if(!Xt.existsSync(n))return d("No media directory to stage",null);let r=await pe.stage({cwd:e,pathspec:[t],ignoreRemoval:!0});return c(r)?a(`Failed to stage state branch media files
|
|
97
|
+
${r.message}`):d("Staged state branch media files",t)},vh=async({stateBranchRoot:e})=>{let t=[Fa(),_a(),_e].filter(r=>Xt.existsSync(Jt.join(e,r)));if(t.length===0)return d("No event log config to stage",[]);let n=await pe.stage({cwd:e,pathspec:t});return c(n)?a(`Failed to stage event log config
|
|
98
|
+
${n.message}`):d("Staged event log config",t)},xh=async({repoRoot:e,stateBranchRoot:t,pathspec:n})=>{let r=await JC(e);return c(r)?a(`Create state branch sync commit failed
|
|
99
|
+
`+r.message):mr({cwd:t,message:r.value,pathspec:n})},Jo=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Oa(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 pe.push({cwd:t}):await pe.push({cwd:t,remote:ot,branch:o,setUpstream:!0});if(c(s))return a(`Failed during state branch push
|
|
100
|
+
${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)},Rh=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=wt(e);if(c(o))return o;let s=o.value,i=[no(),await jl({repoRoot:e,stateBranchName:s}),await Or({repoRoot:e,stateBranchRoot:t,stateBranchName:s}),await nN({stateBranchRoot:t,stateBranchName:s}),await Ku(t),n?await rN({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 oN=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"&&Ch.existsSync(i)){let p=await Pu(i,{preserve:[ii]});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 Ou(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 Da(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 Rh({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 Pa(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",Vu(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}))},sN=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 yp(qe(t),n)){let p=ce("stageStateBranchOwnEventFile",await Ti({stateBranchRoot:t,eventFileName:m}));if(c(p))return a(p.message);r.push(p.value)}let o=ce("stageStateBranchMediaFiles",await bh({stateBranchRoot:t}));if(c(o))return a(o.message);let s=ce("stageStateBranchEventConfig",await vh({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 _u(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 xh({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}))},iN=5*6e4,Eh=new Map,aN={offline:"Offline","no remote":"No remote","not published":"Not published"},Zo=(e,t="offline")=>{let n=e.createdCommit?`Committed locally, ${t}`:aN[t];return Ii(n),d(n,{...e,pulled:!1,pushed:!1,offline:!0})},Sh=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");wi();let r=ce("ensureSyncReady",await oN({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 $u(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 S=ce("flushPendingLogs",Ks(s,t));c(S)&&logger.error(`[sync] ${S.message}`);let x=ce("commitOwnEventFileToStateBranch",await sN({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 Zo({repoRoot:o,stateBranchRoot:s,createdCommit:u,commitSha:m,bootstrapped:i},"no remote");let w=ce("pullBranchRebaseIfPresent",await eo({cwd:s,branch:v}));if(c(w))return Qr(w.message)?Zo({repoRoot:o,stateBranchRoot:s,createdCommit:u,commitSha:m,bootstrapped:i}):Te(w.message);p=w.value;let N=ce("getPublishState",await Du({branch:v,cwd:s}));if(c(N))return Te(N.message);let k=N.value,L=k==="unpublished"&&!u&&!i,_=Eh.get(s);if(L&&_!==void 0&&Date.now()-_<iN)return Zo({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 Jo({stateBranchRoot:s,repoRoot:o}));if(c(M)&&ku(M.message)){let P=ce("pullBranchRebaseIfPresent(retry)",await eo({cwd:s,branch:v}));if(c(P))return Te(P.message);p=p||P.value,M=ce("pushStateBranch(retry)",await Jo({stateBranchRoot:s,repoRoot:o}))}if(c(M))return Qr(M.message)?Zo({repoRoot:o,stateBranchRoot:s,createdCommit:u,commitSha:m,bootstrapped:i}):L?(logger.error(`[sync] state branch not published: ${M.message}`),Eh.set(s,Date.now()),Zo({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 F({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 Yo(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})},Mi=async(e,t)=>{let n=ph(e);try{return await t()}finally{let r=fh(e,n);r.length>0&&logger.error(`[sync] restored event log lines git dropped from the worktree: ${r.join(", ")}`)}},Nh=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(!Ch.existsSync(o))return Sh(e,"clean");let s=await Lo({worktreeRoot:o,operation:"sync",fn:i=>Mi(o,()=>Sh(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 Dr=null,ki=async({reposMinIntervalMs:e=0}={})=>(logger.debug("[sync] syncAndReloadState enter",{hasPromise:!!Dr,currentStatus:h().syncStatus?.status,currentMessage:h().syncStatus?.msg}),Dr?(logger.debug("[sync] syncAndReloadState joining existing promise"),Dr):(logger.debug("[sync] syncAndReloadState creating promise"),Dr=cN(e).finally(()=>{logger.debug("[sync] syncAndReloadState clearing promise",{statusBeforeClear:h().syncStatus?.status,statusMessageBeforeClear:h().syncStatus?.msg}),Dr=null}),Dr)),cN=async e=>{let t;try{t=await lN(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=me();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},lN=async e=>{logger.debug("[sync] syncAndReloadStateUnsafe:start",{mode:h().mode,syncStatus:h().syncStatus});let t=wh();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=Sr(n.value);logger.debug("[sync] resolved own event file name",{ownEventFileName:r}),logger.debug("[sync] syncEpiqWithRemote:start");let o=ce("syncEpiqWithRemote",await Nh({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=Hl(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}),dN(l,e),d("Synced",!0))},dN=async(e,t)=>{let n=await ui({repoRoot:e,minIntervalMs:t}),r=c(n)?null:il(n.value),o=h().syncStatus;r&&o?.status==="synced"&&I({syncStatus:{msg:`Synced \xB7 ${r}`,status:"synced"}})},Hl=e=>{logger.debug("[sync] loading merged events after sync",{stateBranchRoot:e});let t=Tt(e),n=ce("loadMergedEvents",Io(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=wh();if(r)return logger.debug("[sync] syncAndReloadStateUnsafe:blocked by late mode check",{mode:h().mode,message:r.message,syncStatus:h().syncStatus}),r;let o=nh(),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=me(),u=!c(l)&&l.value.timeMode==="live",m=ce("bootStateFromEventLog",qo(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&&Gs(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",oh(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)},wh=()=>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 Ih=0,Gl,Wl=!1,Qo=!1,zl=()=>{if(Wl)return!0;let e=me();return c(e)?!1:e.value.syncStatus.status==="syncing"},uN=()=>{let e=vs(ne().autoSyncIntervalMs),t=Date.now()-Ih;return Math.max(0,e-t)},Ah=()=>{Gl||(Gl=setTimeout(async()=>{if(Gl=void 0,!!gt()){if(zl()){Qo=!0;return}Qo=!1,await mN()}},uN()))},mN=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(zl())return Qo=!0,a("Sync already in progress");Wl=!0,Ih=Date.now(),I({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await ki({reposMinIntervalMs:6e4})}finally{Wl=!1,Qo&&Ah()}},Th=()=>{gt()&&(Qo=!0,!zl()&&Ah())};var Mh=e=>{let{context:t}=h().contextNode;if(!t)return j.None;switch(e){case b.EXIT:return j.Exit;case b.EXPORT:return j.Export;case b.INIT:return j.Init;case b.OPEN:return j.OpenProject;case b.DELETE:return j.Delete;case b.EDIT:return j.Edit;case b.COMMENT:return j.Comment;case b.HELP:return j.ViewHelp;case b.RE_OPEN_ISSUE:return j.ReopenIssue;case b.CLOSE_ISSUE:return j.CloseIssue;case b.TAG:return j.TagTicket;case b.UNTAG:return j.UntagTicket;case b.GOAL:return j.GoalTicket;case b.UNGOAL:return j.UngoalTicket;case b.RULE:return j.RuleLane;case b.UNRULE:return j.UnruleLane;case b.ASSIGN:return j.AssignUserToTicket;case b.UNASSIGN:return j.UnassignUserFromTicket;case b.NEW:return j.NewItem;case b.FILTER:return j.Filter;case b.MOVE:return j.Move;case b.PEEK:return j.Peek;case b.REPLAY:return j.Replay;case b.CONFIG:return j.Config;case b.YANK:return j.Yank;case b.SYNC:return j.Sync;default:return j.None}},j={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 xy from"node:fs";import Ew from"node:path";import Sw from"react";import{Box as xw}from"ink";import Gi from"react";import Uh from"chalk";import{Box as ql,Text as MN}from"ink";import Ht from"react";import{Text as kh}from"ink";import Lh,{useEffect as Ph,useState as pN}from"react";var Oh={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "],identity:["\u276F "]},yt=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=Pe(),r=Oh[n]??Oh.default,[o,s]=pN(0);if(Ph(()=>{s(0)},[r]),Ph(()=>{if(!e)return;let l=setInterval(()=>{s(u=>(u+1)%r.length)},500);return()=>clearInterval(l)},[e,r]),!e)return Lh.createElement(kh,null,t);let i=r[o]??r[0]??t;return Lh.createElement(kh,{color:A.accent,dimColor:o===1},i)};import{Box as Vl,Text as fN}from"ink";import Li from"react";var gN=(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?gN(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),S=e.slice(f,g),x=e.length>v,E=i,w=x?Math.max(1,Math.floor(v/e.length*E)):E,N=Math.max(0,E-w),k=Math.max(1,e.length-v),L=x?Math.floor(f/k*N):0;return Li.createElement(Vl,{flexDirection:"row",height:i,width:"100%"},Li.createElement(Vl,{flexDirection:"column",flexGrow:1,height:i},S),Li.createElement(Vl,{flexDirection:"column",width:1,height:E},Array.from({length:E}).map((_,M)=>Li.createElement(fN,{key:M,color:x&&M>=L&&M<L+w?A.accent:A.secondary},x?"\u2502":" "))))};import{Box as Zn,Text as Qn}from"ink";import $e from"react";var Dh,Kl,hN=()=>{let{eventLog:e=[]}=h();if(Kl&&Dh===e)return Kl;let t=new Set;for(let n of e)n?.userId&&t.add(n.userId);return Dh=e,Kl=t,t},Pi=e=>hN().has(e);import{Text as yN}from"ink";import bN from"react";var Fr=({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 bN.createElement(yN,{underline:t,color:Ue(o)},"@"+s,Pi(e)?"":"\u2197")};import{Text as vN}from"ink";import xN from"react";var Oi=({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 xN.createElement(vN,{underline:t,backgroundColor:Ue(r.name),color:A.secondary}," "+o+" ")};import{useEffect as RN,useState as EN}from"react";var SN=80,Fh=1400,Di=new Set,es=null,CN=e=>(Di.add(e),es||(es=setInterval(()=>{for(let t of Di)t()},SN)),()=>{Di.delete(e),Di.size===0&&es&&(clearInterval(es),es=null)}),NN=()=>{let e=Date.now()%Fh/Fh;return e<.5?e*2:(1-e)*2},_r=e=>{let[,t]=EN(0);return RN(()=>{if(e)return CN(()=>t(n=>n+1))},[e]),Gd(NN())};var wN=(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)]},_h=3,IN=2,AN=(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}},$h=({width:e,ticket:t,isSelected:n,isFlashing:r=!1})=>{let o=_r(r),s=e-4,i=s-7-1,[l,u]=wN(dt(t.title),i,s),m=u?null:Ln(dt(t.props.description),s)||null,p=sn(t),f=an(t).map(k=>({...k,name:k.name})),g=Math.max(1,s-_h),v=R.getCommentsByIssue(t.id),S=v.length?String(v.length).length+2+1:0,x=_s(t,Math.max(1,Math.floor(s/2))),E=x?x.text.length+1:0,{shown:w,hidden:N}=AN([...p.map(k=>({id:k.id,isTag:!0,width:Math.min(k.name.length,g)+_h})),...f.map(k=>({id:k.id,isTag:!1,width:Math.min(k.name.length,g)+IN+(Pi(k.id)?0:1)}))],s-S-E);return $e.createElement(Zn,{borderStyle:"round",height:5,flexDirection:"column",overflow:"hidden",borderDimColor:!n,borderColor:r?o:n?A.accent:A.secondary,justifyContent:"space-between"},$e.createElement(Zn,{paddingLeft:1,paddingRight:1,flexDirection:"column"},$e.createElement(Zn,{justifyContent:"space-between"},$e.createElement(Qn,{color:A.primary},l),$e.createElement(Qn,{color:A.secondary2,dimColor:!0},it(t.id))),u&&$e.createElement(Qn,{color:A.primary},u),m&&$e.createElement(Qn,{color:A.secondary2,dimColor:!0},m)),$e.createElement(Zn,{flexDirection:"row",paddingLeft:1,paddingRight:1,justifyContent:"space-between"},$e.createElement(Zn,{flexDirection:"row"},x&&$e.createElement(Zn,{paddingRight:1},$e.createElement(Qn,{color:x.color},x.text)),w.map(k=>$e.createElement(Zn,{paddingRight:1,key:k.id},k.isTag?$e.createElement(Oi,{id:k.id,maxWidth:g}):$e.createElement(Fr,{id:k.id,maxWidth:g}))),N>0&&$e.createElement(Qn,{color:A.secondary2,dimColor:!0},"+",N)),v.length>0&&$e.createElement(Qn,{color:A.accent},"[",v.length,"]")))};import{Box as bn,Text as $r}from"ink";import We from"react";var TN=(e,t)=>e.length>t?e.slice(0,Math.max(0,t-1))+"\u2026":e,Bh=({index:e,labelWidth:t,width:n,ticket:r,isSelected:o,isFlashing:s=!1,mode:i})=>{let l=_r(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=_s(r,0),g=f?1+p:0,v=u.length*(1+p)+g,S=m.length*(2+p),x=u.map(P=>We.createElement(bn,{key:P.id,paddingRight:p},We.createElement($r,{color:Ue(P.name)},"\u25A0"))),E=m.map(P=>We.createElement(bn,{key:P.id,paddingRight:p},We.createElement($r,{color:fa(P.name)},"@"+P.name.at(0)))),w=s?l:o?A.accent:i===y.MOVE?A.secondary:A.primary,N=R.getCommentsByIssue(r.id),k=N.length?String(N.length).length+2+p:0,L=N.length?We.createElement(bn,{paddingRight:p},We.createElement($r,{color:A.accent},"[",N.length,"]")):null,_=v+S+k,M=Math.max(1,n-t-_-(_>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($r,{color:"gray",dimColor:!0},String(e+1).padStart(t-1)+" ")),We.createElement($r,{wrap:"truncate",color:w},TN(r.title,M))),We.createElement(bn,null,f&&We.createElement(bn,{paddingRight:p},We.createElement($r,{color:f.color},"\u25C6")),x,E,L))};var kN=({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=_r(g),S=Ps(e.id),x=`${e.title} ${Uh.hex(A.secondary2).dim("("+p.length+")")}${S?Uh.hex(A.secondary2)(" \u2713"):""}`,E=3,w=o?1:5,N=s&&i===-1,k=n-3-(o?1:0)-(N?2:0),L=Math.max(2,String(p.length).length+1),_=r-E-1,M=Ht.createElement(ql,{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(MN,{bold:!0,color:g?v:t?A.accent:A.primary},x," ",e.readonly?"\u{1F512}":"")),P=($,ge)=>{let G=s&&i===ge;if(!U($))return null;let B=f?.has($.id)??!1;return o?Ht.createElement(Bh,{key:$.id,index:ge,labelWidth:L,width:k,ticket:$,isSelected:G,isFlashing:B,mode:l}):Ht.createElement($h,{key:$.id,width:k,ticket:$,isSelected:G,isFlashing:B})};return Ht.createElement(ql,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?A.accent:A.secondary,paddingRight:0,paddingLeft:o?1:0,height:r},M,Ht.createElement(ql,null,p.length>0&&Ht.createElement(bt,{selectedIndex:i,height:_,itemHeight:w},p.map(P)),N&&Ht.createElement(yt,{isSelected:!0})))},jh=Ht.memo(kN);import{Box as Hr,Text as fw}from"ink";import Ze,{useMemo as Gr}from"react";var Hh=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},Gh=(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 Wh=e=>e.action==="add.issue.comment";import{Box as Br,Text as Zt}from"ink";import Be,{useEffect as LN,useMemo as PN,useRef as ON}from"react";import{decodeTime as zh}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"},Fi=e=>String(e).padStart(2,"0"),Fj=e=>`${e.getFullYear()}-${Fi(e.getMonth()+1)}-${Fi(e.getDate())} ${Fi(e.getHours())}:${Fi(e.getMinutes())}`;var DN=e=>he(e,"attachments"),FN=e=>R.getAttachmentsByIssue(e.id).sort((t,n)=>zh(t.id)-zh(n.id)),Vh=e=>{for(let t of e)R.deleteNode(t.id)},_N=(e,t,n)=>Ae.field({id:e.id,name:e.name,parentNodeId:n,rank:String(t).padStart(6,"0"),isVirtual:!0}),$N=(e,t)=>{let n=R.getNode(DN(e.id));if(!n||!Fe(n))return[];let r=t.map((o,s)=>_N(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},BN=e=>`${Math.max(1,Math.round(e/1024))} KB`;function Kh({ticket:e,width:t,height:n}){let r=PN(()=>FN(e),[e]),o=ON([]);LN(()=>(Vh(o.current),o.current=$N(e,r),()=>{Vh(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(Br,{flexDirection:"column",width:t,height:n,padding:1},Be.createElement(Zt,{color:A.primary},"No attachments yet."),Be.createElement(Br,{paddingTop:1},Be.createElement(Zt,{color:A.primary},"Attach images from the browser GUI"),Be.createElement(Zt,{color:A.accent}," epiq gui "),Be.createElement(Zt,{color:A.primary},"by dropping or pasting them."))):Be.createElement(Br,{flexDirection:"column",width:t,height:n},Be.createElement(Br,{paddingLeft:4,borderLeft:!1,borderRight:!1,borderBottom:!1,borderTop:!0,borderColor:A.secondary,borderStyle:"single",paddingBottom:1},Be.createElement(Zt,{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(Br,{key:m.id,flexDirection:"row",paddingX:1,paddingBottom:1},Be.createElement(Zt,{color:A.accent},f?"\u276F ":" "),Be.createElement(Br,{paddingLeft:1},Be.createElement(Zt,{color:A.secondary2},`#${p+1} `),Be.createElement(Zt,{color:f?A.accent:A.primary},g),Be.createElement(Zt,{color:A.secondary2}," "+BN(m.bytes)+" "+vn(kn(m.id)))))})))}import{Box as xn,Text as Rn}from"ink";import Le,{useEffect as zN,useMemo as ey,useRef as VN}from"react";import{decodeTime as ty}from"ulid";var UN=(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},ts=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)},jN=/!\[([^\]]*)\]\([^)]*\)/g,HN=e=>e.replace(jN,(t,n)=>n.trim()?`[image: ${n.trim()}]`:"[image]"),GN=e=>e.map(t=>t.code?`\`${t.text}\``:t.text).join(""),WN=4,_i=e=>e.replace(/\r$/,"").replaceAll(" "," ".repeat(WN)),Yl=e=>{let t=!1;return e.map(_i).map(n=>{if(/^\s*```/.test(n))return t=!t,{kind:"fence"};if(t)return{kind:"code",text:n};let r=Uo(n);if(r)return{kind:"caption",text:hl(r)};let o=HN(n);if(o.trim()==="")return{kind:"blank"};let s=/^#{1,6}\s+(.*)$/.exec(o);return s?{kind:"heading",spans:ts(s[1]??"")}:{kind:"text",spans:ts(o)}})},Yh=(e,t)=>e.length<=t?[e]:e.match(new RegExp(`.{1,${t}}`,"g"))??[""],qh=(e,t)=>{let n=[];for(let r of Yl(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 Yh(r.text,t))n.push({kind:"code",text:o});continue}if(r.kind==="caption"){n.push(r);continue}for(let o of UN(GN(r.spans),t))n.push({kind:r.kind,spans:ts(o)})}for(;n.length>0&&n[n.length-1]?.kind==="blank";)n.pop();return n},Xh=(e,t)=>{let n=Uo(e),r=n?qf(e):null;if(!n||r===null)return qh(gl(e).split(`
|
|
101
|
+
`),t);let o=Yf(e),s=r.split(`
|
|
102
|
+
`).map(_i),i=n.side===n.endSide?n.start:void 0,l=i===void 0?0:String(i+s.length-1).length+3;return[...o?[...qh(o.split(`
|
|
103
|
+
`),t),{kind:"blank"}]:[],{kind:"caption",text:hl(n)},...s.flatMap((u,m)=>Yh(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 er}from"ink";import vt from"react";var Zh=({spans:e,bold:t,wrap:n})=>vt.createElement(er,{color:A.primary,bold:t,wrap:n},e.map((r,o)=>r.code?vt.createElement(er,{key:o,color:A.yellow},r.text):vt.createElement(er,{key:o},r.text))),Xl=({line:e,width:t,gutter:n=0,wrap:r})=>{switch(e.kind){case"blank":return vt.createElement(er,null," ");case"fence":return vt.createElement(er,{color:A.secondary2},"```");case"caption":return vt.createElement(er,{color:A.accent,wrap:r},e.text);case"heading":return vt.createElement(Zh,{spans:e.spans,bold:!0,wrap:r});case"text":return vt.createElement(Zh,{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(er,{backgroundColor:A.secondary,color:A.primary,wrap:r},o,e.text.padEnd(Math.max(0,t-o.length)))}}},Qh=({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(Xl,{line:o,width:t,gutter:r}))))};var KN=4,qN=e=>he(e,"comments"),YN=e=>R.getCommentsByIssue(e.id).sort((t,n)=>ty(t.id)-ty(n.id)).map(t=>({id:t.id,issue:t.issue,authorId:t.authorId,md:t.md})),ny=e=>{for(let t of e)R.deleteNode(t.id)},XN=(e,t)=>{let n=R.getNode(qN(e.id));if(!n||!Fe(n))return[];let r=t.map((o,s)=>Gh(o,s,n.id)).map(R.createNode).filter(St).map(({value:o})=>o).filter(Xr);return t.length>0&&h().selectedIndex<0&&V.navigate({contextNode:n,selectedIndex:0}),r};function ry({ticket:e,width:t,height:n}){let r=ey(()=>YN(e),[e]),o=VN([]);zN(()=>(ny(o.current),o.current=XN(e,r),()=>{ny(o.current),o.current=[]}),[e,r]);let{selectedIndex:s}=Pe(),l=Math.max(1,n-4),u=Math.max(20,t-8),m=ey(()=>r.map(f=>{let g=Xh(f.md,u);return g.length>0?g:[{kind:"blank"}]}),[r,u]),p=m.map(f=>f.length+KN);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(Fr,{id:f.authorId}),Le.createElement(Rn,{color:A.secondary2}," "+vn(kn(f.id))))),Le.createElement(xn,{paddingLeft:3,paddingBottom:1},Le.createElement(Qh,{lines:m[g]??[],width:u})))})))}import{Box as Sn,Text as Je}from"ink";import ye,{useEffect as my,useRef as ow,useState as sw}from"react";import{Box as kt,Text as Qt}from"ink";import Ne,{useEffect as ed,useMemo as ay,useRef as QN,useState as ew}from"react";var $i=(e,t,n)=>{let r=[],o=Zs(()=>{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},Ur=e=>{R.deleteNodes(e.map(t=>t.id))};import{useSyncExternalStore as JN}from"react";var Ui=null,Bi=null,Jl=new Set,oy=()=>{for(let e of Jl)e()},Zl=e=>{Ui=e,oy()},ji=()=>Ui,sy={mark:null},tr=e=>{Bi=e,sy={mark:e},oy()};var Ql=e=>Bi&&Bi.sha===e?Bi.row:null,iy=()=>JN(e=>(Jl.add(e),()=>{Jl.delete(e)}),()=>sy),En=()=>{let{contextNode:e}=h();return Ui&&Ui.sha===e.id?e.id:null};import tw from"string-width";var td=(e,t)=>`${e}::patch::${t}`,cy=e=>_i(e).replace(/[\x00-\x1f\x7f-\x9f]/g,"\uFFFD"),nw=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}},ly=(e,t)=>{let n=tw(e);return n>=t?e:e+"\xA0".repeat(t-n)},rw=e=>e==="added"?"+":e==="removed"?"-":" ",dy=e=>e.kind==="file"||e.kind==="hunk"||e.kind==="note"||e.newLine===void 0?"":String(e.newLine);function uy({ticket:e,sha:t,repo:n,subject:r,width:o,height:s}){let[i,l]=ew({state:"loading"});ed(()=>{let L=!0;return l({state:"loading"}),fl({sha:t,repo:n}).then(_=>{L&&l(c(_)?{state:"failed",message:_.message}:{state:"loaded",rows:vl(bl(_.value))})}),()=>{L=!1}},[t,n]);let u=i.state==="loaded"?i.rows:null,m=u!==null&&u.length>4e3,p=QN([]);ed(()=>(Ur(p.current),p.current=u&&!m?$i(t,u.length,L=>td(t,L)):[],()=>{Ur(p.current),p.current=[]}),[t,u,m]),ed(()=>(Zl(u?{sha:t,rows:u}:null),tr(null),()=>{Zl(null),tr(null)}),[t,u]);let{selectedIndex:f}=Pe(),{mark:g}=iy(),v=ay(()=>u?xl(u,R.getCommentsByIssue(e.id),t):new Set,[u,t,e]),S=g&&g.sha===t?g.row:null,x=L=>S!==null&&L>=Math.min(S,f)&&L<=Math.max(S,f),E=ay(()=>u?Math.max(5,u.reduce((L,_)=>Math.max(L,dy(_).length),0)+2):5,[u]),w=Math.max(1,s-4),N=Math.max(8,o-E-6);if(i.state!=="loaded")return Ne.createElement(kt,{flexDirection:"column",width:o,height:s,padding:1},Ne.createElement(Qt,{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(Qt,{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(Qt,{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(Qt,{color:A.primary},`${i.rows.length.toLocaleString()} lines of diff.`),Ne.createElement(Qt,{color:A.secondary2},"Press o to open it in your editor."))):Ne.createElement(kt,{flexDirection:"column",width:o,height:s},k(S===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:w,selectedIndex:f,itemHeight:1},i.rows.map((L,_)=>{let M=_===f,P=nw(L.kind);if(L.kind==="file")return Ne.createElement(kt,{key:td(t,_),paddingX:1},Ne.createElement(Qt,{backgroundColor:A.secondary,color:M?A.accent:P,bold:!0,wrap:"truncate-end"},ly(` ${Pn(cy(L.text),N)}`,N+E+1)));let $=x(_),ge=`${rw(L.kind)}${Pn(cy(L.text),N)}`;return Ne.createElement(kt,{key:td(t,_),paddingX:1},Ne.createElement(kt,{flexShrink:0},Ne.createElement(Qt,{color:M||$?A.accent:A.secondary2,dimColor:!M&&!$,wrap:"truncate-end"},`${M?"\u276F":"\xA0"}${$?"\u258C":"\xA0"}${dy(L).padStart(E-2,"\xA0")}`)),Ne.createElement(kt,{flexShrink:0},Ne.createElement(Qt,{color:A.yellow,wrap:"truncate-end"},v.has(_)?"\u2502":"\xA0")),Ne.createElement(Qt,{color:M?A.accent:P,backgroundColor:M||$?A.secondary:void 0,wrap:"truncate-end"},M||$?ly(ge,N+1):ge))})))}var iw=e=>he(e,"diff"),py=e=>{for(let t of e)R.deleteNode(t.id)},aw=(e,t,n)=>Ae.field({id:e.sha,name:e.subject,parentNodeId:n,rank:String(t).padStart(6,"0"),childRenderAxis:"vertical",isVirtual:!0}),cw=(e,t)=>{let n=R.getNode(iw(e.id));if(!n||!Fe(n))return[];let r=t.map((o,s)=>aw(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},lw=e=>`+${e.insertions} -${e.deletions}`;function fy({ticket:e,width:t,height:n}){let[r,o]=sw({state:"loading"}),s=it(e.id);my(()=>{let x=!0;return o({state:"loading"}),qc({ref:s}).then(E=>{if(!x)return;let w=At();o(c(E)?{state:"failed",message:E.message}:{state:"loaded",commits:E.value,labels:c(w)?new Map:Mc(w.value)})}),()=>{x=!1}},[s]);let i=ow([]),l=r.state==="loaded"?r.commits:null,u=r.state==="loaded"?r.labels:null;my(()=>(py(i.current),i.current=l?cw(e,l):[],()=>{py(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),S=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(uy,{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 w=E===m,N=x.subject.length>S?x.subject.slice(0,S-1)+"\u2026":x.subject;return ye.createElement(Sn,{key:x.sha,flexDirection:"row",paddingX:1,paddingBottom:1},ye.createElement(Je,{color:A.accent},w?"\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)??Kr(x.repo)}] `),ye.createElement(Je,{color:w?A.accent:A.primary},N),ye.createElement(Je,{color:A.secondary2},` ${lw(x)} ${vn(x.time)}`)))})))}import{Box as Hi,Text as dw}from"ink";import en from"react";var gy=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:r}=Pe(),{title:o}=t,s=t.parentNodeId?R.getNode(t.parentNodeId):void 0,i=s&&U(s)?o===fe.ASSIGNEES?s.props.assignees??[]:o===fe.TAGS?(s.props.tags??[]).filter(l=>R.getTag(l)):[]:[];return en.createElement(Hi,{alignItems:"center",paddingTop:1},en.createElement(Hi,{minWidth:12},en.createElement(yt,{isSelected:n}),en.createElement(dw,{color:n?A.accent:A.secondary2},o,":")),en.createElement(Hi,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((l,u)=>{let m=r.id===t.id&&u===e;return en.createElement(Hi,{key:`${o}-${l}`,paddingRight:2,minHeight:1},en.createElement(yt,{isSelected:m}),o===fe.ASSIGNEES?en.createElement(Fr,{isSelected:m,id:l}):o===fe.TAGS?en.createElement(Oi,{isSelected:m,id:l}):null)})))};import{Box as jr,Text as od}from"ink";import xt,{useEffect as uw,useMemo as sd,useRef as mw}from"react";var nd=e=>Math.max(5,String(Math.max(e,1)).length+3),hy=(e,t)=>Math.max(0,e-6-nd(t));var rd=(e,t=0,n=0)=>Math.max(1,e-5-2*t-(n>0?1+n:0));var pw="\u2029",yy=(e,t)=>`${e}::inline-line::${t}`,id=({id:e,label:t,text:n,rows:r,selected:o,maxWidth:s})=>{let{selectedIndex:i,contextNode:l}=Pe(),u=sd(()=>typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[],[n]),m=sd(()=>u.join("\0"),[u]),p=mw([]);uw(()=>(Ur(p.current),p.current=$i(e,u.length,x=>yy(e,x)),()=>{Ur(p.current),p.current=[]}),[e,m]);let f=nd(u.length),g=hy(s,u.length),S=sd(()=>Yl(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(w=>w.code?`\`${w.text}\``:w.text).join("");return{...x,spans:ts(Pn(E,g))}}return x}),[u,g]).map((x,E)=>{let w=l.id===e&&i===E;return xt.createElement(jr,{key:yy(e,E)},xt.createElement(jr,{flexShrink:0},xt.createElement(od,{color:w?A.primary:A.secondary2,dimColor:!w},`${E+1} `.padStart(f,"\xA0"))),x.kind==="blank"?xt.createElement(od,{backgroundColor:w?"gray":void 0},pw):xt.createElement(jr,null,xt.createElement(Xl,{line:x,width:x.kind==="code"?g:0,wrap:"truncate-end"})))});return xt.createElement(jr,{flexDirection:"column",paddingTop:1},xt.createElement(jr,null,xt.createElement(yt,{isSelected:o}),xt.createElement(od,{color:o?A.accent:A.secondary2},t)),xt.createElement(jr,{flexDirection:"row",borderStyle:"round",borderColor:A.secondary,paddingLeft:1,marginLeft:1,overflowY:"hidden"},xt.createElement(bt,{scrollByOne:!0,height:r,selectedIndex:i,itemHeight:1},S)))};var gw=e=>he(e,"description"),hw=e=>he(e,"comments"),yw=e=>he(e,"history"),bw=e=>he(e,"diff"),vw=e=>he(e,"attachments"),by=({ticket:e,height:t})=>{let n=Gr(()=>Hh(e),[e]),{selectedIndex:r,contextNode:o}=Pe(),s=process.stdout.columns||120,i=Gr(()=>gw(e.id),[e.id]),l=Gr(()=>hw(e.id),[e.id]),u=Gr(()=>yw(e.id),[e.id]),m=Gr(()=>bw(e.id),[e.id]),p=Gr(()=>vw(e.id),[e.id]),f=R.getAttachmentsByIssue(e.id).length,g=o.id===e.id,v=o.id===l||o.parentNodeId===l,S=o.id===u||o.parentNodeId===u,x=o.id===p||o.parentNodeId===p,E=o.id===m||o.parentNodeId===m,w=le(e.id);if(v){let B=t-3;return Ze.createElement(Hr,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Ze.createElement(ry,{ticket:e,width:s,height:B}))}if(x){let B=t-3;return Ze.createElement(Hr,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Ze.createElement(Kh,{ticket:e,width:s,height:B}))}if(E){let B=t-3;return Ze.createElement(Hr,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},Ze.createElement(fy,{ticket:e,width:s,height:B}))}if(S){let G=R.getNode(u),B=G&&Fe(G)?G.props.value??"":"",Re=rd(t);return Ze.createElement(Hr,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},G?Ze.createElement(id,{id:G.id,label:"Event log",text:B,selected:!1,maxWidth:s,rows:Re}):null)}let N=[u,m,l,p],k=G=>N.includes(G),L=w.reduce((G,B)=>qr(B)?G+1:G,0),_=w.reduce((G,B)=>k(B.id)?G+1:G,0),M=w.findIndex(G=>k(G.id)),P=rd(t,L,_),$=(G,B,Re,tn)=>Ze.createElement(Hr,{key:G.id,paddingTop:B===M?1:0},Ze.createElement(yt,{isSelected:Re}),Ze.createElement(fw,{backgroundColor:A.secondary,color:Re?A.accent:A.primary},tn)),ge=(G,B,Re)=>G.id===i?Ze.createElement(id,{key:G.id,id:i,label:"Description (press e to edit)",text:e.props.description??"",selected:B,maxWidth:s,rows:P}):qr(G)?Ze.createElement(gy,{key:G.id,parent:G,selected:B,selectedIndex:r}):G.id===l?$(G,Re,B,` Comments (${n}) \u203A\u203A `):G.id===p?$(G,Re,B,` Attachments (${f}) \u203A\u203A `):G.id===u?$(G,Re,B," History \u203A\u203A "):G.id===m?$(G,Re,B," Diff \u203A\u203A "):null;return Ze.createElement(Hr,{width:s,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},w.map((G,B)=>ge(G,g&&r===B,B)))};var Rw=({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)),S=Math.min(v,g),x=s==="dense";return Gi.createElement(xw,{flexDirection:"row",height:i},p&&e.map((E,w)=>{let N=t.id===E.id,k=N?n:-1,L=t.context===re.BOARD&&n===w;return Gi.createElement(jh,{key:E.id,height:i,width:S,swimlane:E,isSelected:L,isDense:x,isFocused:N,listSelectedIndex:k,mode:o})}),m&&f&&Gi.createElement(by,{height:i,ticket:f}))},vy=Gi.memo(Rw);import{render as Cw}from"ink";import{Writable as Nw}from"node:stream";var ns=e=>String(e).padStart(2,"0"),ww=e=>{let t=e.getUTCFullYear(),n=ns(e.getUTCMonth()+1),r=ns(e.getUTCDate()),o=ns(e.getUTCHours()),s=ns(e.getUTCMinutes()),i=ns(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${s}-${i}`},Iw=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",Aw=async(e,{width:t,height:n})=>{let r="",o=new Nw({write(i,l,u){let m=Tw(i.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),u()}});o.columns=t,o.rows=n,o.isTTY=!0;let s=Cw(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(i=>setTimeout(i,0)),s.unmount(),r},Tw=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),Ry=async()=>{let{viewMode:e}=ne(),{contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:s}=h(),i=r.find(w=>w.context==="BOARD");if(!i)return a("No board found to export");let l=120,u=40,m=await Aw(Sw.createElement(vy,{height:u,width:l,swimlanes:(s[i.id]??[]).filter(w=>w!==void 0&&rt(w)),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=xs(process.cwd());if(c(p))return a("Unable to export, epiq root not found");let f=new Date,g=ww(f),v=`board_${Iw(i.title)}_${g}.md`,S=qu(p.value);xy.mkdirSync(S,{recursive:!0});let x=Ew.join(S,v),E=`# Board - ${i.title}
|
|
104
|
+
Date: ${f.toISOString()}
|
|
105
|
+
|
|
106
|
+
\`\`\`text
|
|
107
|
+
${m}
|
|
108
|
+
\`\`\`
|
|
109
|
+
`;return xy.writeFileSync(x,E,"utf8"),d("Exported board layout",x)};import{useSyncExternalStore as TG}from"react";var Wi,Mw=new Set,Ey=()=>{for(let e of Mw)e()};var Wr=()=>{if(!Wi)throw new Error("Ui state not initialized. Call initUiState() first.");return Wi};var LG=(e={})=>(Wi=e,Ey(),d("UX state initialized",null)),kw=e=>{let t=Wr();return Wi=e(t),Ey(),d("UX state updated",null)},Cn=e=>kw(t=>({...t,...e}));import{ulid as zi}from"ulid";var Sy=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&&U(l))?Pw():Ow()}if(r&&Xr(r))return Lw(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:zi(),action:"edit.title",payload:{id:s.id,name:i},...Q(o.value)}],l.value)}return a("Unknown edit command")},Lw=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||!Xr(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||!U(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:zi(),action:"edit.issue.comment",payload:{id:u.id,issue:i.id,md:m},...Q(t.value)}],f)},Pw=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(!U(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===fe.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=Cl(u);if(c(m))return a("Failed to edit field");let p=m.value;return p===u?d("No changes made",null):Y([{id:zi(),action:"edit.description",payload:{id:i.id,md:p},...Q(e.value)}],n)},Ow=async()=>{let e=te();if(c(e))return a("Unable to resolve user ID");let{selectedNode:t}=h();if(!t||!(Yr(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=Cl(n);if(c(r))return a("Failed to edit field");let o=gg(r.value);if(o===n)return d("No changes made",null);let s=Yr(t)?"board":"swimlane",i=hg(s==="board"?"Board description":"Swimlane description",o,fg(s));if(i)return a(i);let l=await ae();return c(l)?l:Y([{id:zi(),action:"edit.description",payload:{id:t.id,md:o},...Q(e.value)}],l.value)};import Fw from"node:fs";import cd from"node:path";import ad from"node:fs";import Dw from"node:path";var Cy=async e=>{let t=Dw.join(e,".gitignore"),n=ad.existsSync(t)?ad.readFileSync(t,"utf8"):"",r=[".epiq/events/",".epiq/log/"],o=n.split(`
|
|
110
|
+
`).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(`
|
|
111
|
+
`);return n=n.trimEnd()+`
|
|
112
|
+
|
|
113
|
+
${l}
|
|
114
|
+
`,ad.writeFileSync(t,n,"utf8"),K.info(`Added ${s.join(", ")} to .gitignore (epiq local state)`),d("Local epiq paths ignored",!0)};var _w=async e=>{let t=await F({cwd:e,args:["status","--porcelain"]});return c(t)?t:d("Checked git diff",t.value.stdout.split(`
|
|
115
|
+
`).filter(n=>n.trim().length>0).map(n=>n.slice(3)))},oe=(e,t)=>a(`[${e}] ${t}`),Ny=async({cwd:e,user:t})=>{let n=Is(),r=await It(e);if(c(r))return oe(1,r.message);let o=r.value,s=await Au(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 _w(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(io(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 yh(o);if(c(m))return oe(6,m.message);let p=n.stateBranch,f=await Cs({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 $w({repoRoot:o,stateBranch:p});if(c(g))return oe(6,g.message);if(g.value)return Bw({repoRoot:o,stateBranch:p});let v=await Ul({repoRoot:o,stateBranchName:p});if(c(v))return oe(6,v.message);let S=no();if(c(S))return oe(7,S.message);let x=cd.join(On(),n.projectId),E=await Or({repoRoot:o,stateBranchRoot:x,stateBranchName:p});if(c(E))return oe(8,E.message);let w=cd.join(x,".epiq");Fw.mkdirSync(w,{recursive:!0});let N=sh({userId:l,userName:u});if(c(N))return oe(9,N.message);for(let iv of N.value){let Cd=Lp({event:iv,rootDir:x});if(c(Cd))return oe(9,Cd.message)}let k=Sr({userId:l}),L=Ks(x,k);if(c(L))return oe(9,L.message);let _=Bl(x,n);if(c(_))return oe(9,_.message);let M=await Ti({stateBranchRoot:x,eventFileName:k});if(c(M))return oe(10,M.message);let P=await pe.stage({cwd:x,pathspec:[_e]});if(c(P))return oe(10,P.message);let $=await mr({cwd:x,message:"[epiq:init]"});if(c($))return oe(10,$.message);let ge=await Cy(o);if(c(ge))return oe(11,ge.message);let G=Ua({repoRoot:o,fileContents:n});if(c(G))return oe(12,G.message);let B=await pe.stage({cwd:o,pathspec:[".epiq/project.json",".gitignore"]});if(c(B))return oe(13,B.message);let Re=await pe.commit({cwd:o,message:"[epiq:init-project]",pathspec:[".epiq/project.json",".gitignore"]});if(c(Re))return oe(13,Re.message);let tn=[],Ed=await F({cwd:o,args:["push","-u","origin","HEAD"]});c(Ed)&&tn.push(`[init:14] ${Ed.message}`);let Sd=await Jo({repoRoot:o,stateBranchRoot:x});return c(Sd)&&tn.push(`[init:15] ${Sd.message}`),d("Project initialized",{repoRoot:o,projectId:n.projectId,stateBranch:p,stateBranchRoot:x,defaultEvents:N.value,warnings:tn})},$w=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 Zr({repoRoot:e,branch:t});return c(r)?a(`Could not ask origin whether ${t} exists: ${r.message}`):r},Bw=async({repoRoot:e,stateBranch:t})=>{let n=await F({cwd:e,args:["fetch","origin",t]});if(c(n))return oe(6,n.message);let r=await F({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(`
|
|
116
|
+
`));let o;try{o=JSON.parse(r.value.stdout)}catch(S){return oe(6,`The identity on origin/${t} is not readable: ${S instanceof Error?S.message:String(S)}`)}let s=Ua({repoRoot:e,fileContents:o});if(c(s))return oe(12,s.message);let i=await pe.stage({cwd:e,pathspec:[_e]});if(c(i))return oe(13,i.message);let l=await pe.commit({cwd:e,message:"[epiq:adopt-project]",pathspec:[_e]});if(c(l))return oe(13,l.message);let u=no();if(c(u))return oe(7,u.message);let m=cd.join(On(),o.projectId),p=await jl({repoRoot:e,stateBranchName:t});if(c(p))return oe(8,p.message);let f=await Or({repoRoot:e,stateBranchRoot:m,stateBranchName:t});if(c(f))return oe(8,f.message);let g=[],v=await F({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 rs=(e,t)=>a(`[${e}] ${t}`),wy=async()=>{X("");let e=mo();if(!e.isSetupDone||!e.userName)return rs(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let t=ne(),n=t.userName,r=t.userId;if(!r||!n)return rs(5,"Missing Epiq user id");let o=await Ny({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=mn(o.value.defaultEvents).filter(c);if(l.length>0)return rs(16,l.map(g=>g.message).join(`
|
|
117
|
+
`));let u=me();if(c(u))return rs(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)):rs(16,"Unable to resolve initialized root node")};import{ulid as jw}from"ulid";import{ulid as Uw}from"ulid";var Iy=null,Lt=()=>structuredClone(Iy),os=e=>{Iy=e},Ay=()=>{let{contextNode:e,selectedIndex:t}=h(),r=be(e.id)[t];return r?d("Resolved selected child",r):a("Target node not found")},ld=({id:e,parentId:t,position:n={at:"end"}})=>{let r=be(t).filter(o=>o.id!==e);return xi(r,n)},Ty=({id:e,parentId:t,position:n={at:"end"}})=>{let r=te();if(c(r))return a("Unable to resolve user ID");let o=ld({parentId:t,id:e,position:n});return c(o)?o:d("Created pending move state",{id:Uw(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value.rank}})},My=e=>{os(e);let t=wo(e,!0);return c(t)?t:d("Node moved successfully",t.value)};function dd(e){let t=Ay();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=Ty({id:t.value.id,parentId:l.id,position:{at:"end"}});return c(u)?u:My(u.value)}function ss(e,t=1){let n=Ay();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=Ty({id:n.value.id,parentId:r.id,position:{at:e===1?"after":"before",sibling:l.id}});return c(u)?u:My(u.value)}var ky=()=>{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))},zr=(e,t="Moved preview")=>{if(c(e))return Lt()&&I({mode:y.MOVE}),e;let n=ky();return c(n)?n:(I({mode:y.MOVE}),d(t,null))},Ly=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=ld({parentId:o.parentNodeId,id:o.id,position:m});return c(p)?p:(os({id:jw(),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 zr(ss(1));if(t==="previous")return zr(ss(-1));if(t==="jump-next")return zr(ss(1,Vo));if(t==="jump-previous")return zr(ss(-1,Vo));if(t==="to-next")return zr(dd(1));if(t==="to-previous")return zr(dd(-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=ky();return c(u)?u:(os(null),I({mode:y.DEFAULT}),d("Moved item",null))}return t==="cancel"?(os(null),I({mode:y.DEFAULT}),d("Cancelling move",null)):a("Invalid move modifier")};import{ulid as Vi}from"ulid";import{monotonicFactory as Hw,ulid as Gw}from"ulid";var Ww=Hw(),Py=({name:e,parent:t,rank:n,user:{userId:r}})=>{let o=Ww();return d("Created issue events",[{id:Gw(),userId:r,action:"add.issue",payload:{id:o,parent:t,name:e,rank:n}}])};var Oy=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=Ei(p.id,n.value,o);return c(f)?f:u({id:Vi(),action:"add.board",payload:{id:Vi(),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=Ei(m.value.id,n.value,o);return c(p)?p:u({id:Vi(),action:"add.swimlane",payload:{id:Vi(),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 N=tt(s,"SWIMLANE");return c(N)?null:N.value})();if(!p)return a("Unable to add issue in this context");let f=Ei(p.id,n.value,o);if(c(f))return f;let g=Py({name:t.inputString,parent:p.id,rank:f.value,user:n.value});if(c(g))return g;let v=g.value,S=Y([...v],o);if(c(S))return S;if(!S.value[0])return a("Issue creation failed");let w=v.find(N=>N.action==="add.issue")?.payload.id;return w?(V.navigate({contextNode:p,selectedIndex:R.getSiblings(p.id).findIndex(({id:N})=>N===w)}),d("Issue created",null)):a("Unable to determine ticket id")}return d("Success",null)};import eI from"node:os";import Hy from"node:path";import is from"node:fs";import zw from"node:path";import{z as nr}from"zod";var as="command-history.json",Vw=20,Kw=nr.object({projectId:nr.string().min(1),commands:nr.array(nr.string()),lastUsedAt:nr.number().finite()}),qw=nr.object({projects:nr.array(Kw)}),Dy=()=>{let e=jo();return c(e)?e:d("Resolved command history path",zw.join(e.value,as))},Yw=()=>{try{let e=Ee(process.cwd());return c(e)?null:e.value}catch{return null}},Fy=e=>{if(!is.existsSync(e))return d("No command history recorded",{state:"read",projects:[]});let t;try{t=is.readFileSync(e,"utf8")}catch(o){return a(`Unable to read ${as}: ${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 ${as}: ${o instanceof Error?o.message:String(o)}`})}let r=qw.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 ${as} shape: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`})},_y=({root:e})=>{let t=Ot(e);if(c(t))return a(t.message);let n=Dy();if(c(n))return n;let r=Fy(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,Go)??[])},$y=({commands:e,root:t=Yw(),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=Dy();if(c(o))return o;let s=o.value,i=Fy(s);if(c(i))return i;let l=i.value,u=l.state==="read"?l.projects:[],m=[{projectId:r.value,commands:e.slice(0,Go),lastUsedAt:n},...u.filter(f=>f.projectId!==r.value)].sort((f,g)=>g.lastUsedAt-f.lastUsedAt).slice(0,Vw),p=`${s}.${process.pid}.tmp`;try{is.writeFileSync(p,JSON.stringify({projects:m},null,2)+`
|
|
118
|
+
`,"utf8"),is.renameSync(p,s)}catch(f){try{is.rmSync(p,{force:!0})}catch{}return a(`Unable to write ${as}: ${f instanceof Error?f.message:String(f)}`)}return d("Stored command history",null)};var Xw=e=>e.some(t=>t.action==="init.workspace"),By=async(e,t)=>{let n=wt(e);return c(n)?a(n.message):eo({cwd:t,branch:n.value})},Jw=e=>{let t=Ee(process.cwd());if(c(t))return!1;let n=ve({repoRoot:t.value});return!c(n)&&n.value===e},ud=!1,Kz=()=>ud,Uy=async e=>{ud=!0;try{return await Zw(e)}finally{ud=!1}},Zw=async e=>{let t=ve({repoRoot:e});if(c(t))return Jn(3,t.message);let n=t.value,r=await Or({repoRoot:e,stateBranchRoot:n,stateBranchName:Is().stateBranch});if(c(r))return Jn(3,r.message);let o=Tt(n),s=Io(n);if(c(s))return Jn(3,s.message);if(!Xw(s.value.events)){let f=await Lo({worktreeRoot:n,operation:"boot pull",fn:()=>Mi(n,()=>By(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=Io(n),c(s))return Jn(3,s.message)}let{events:i,unreadable:l}=s.value,u=qo(i,l);if(c(u))return Jn(4,u.message);Gs(n,o),I({hasProjectDefinition:!0,hasInitializingEvents:!!i.length});let m=nm({root:e});c(m)&&logger.info(m.message);let p=_y({root:e});return c(p)&&logger.info(p.message),Dg(c(p)?[]:p.value),d("Loaded project",void 0)},Qw=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 Lo({worktreeRoot:n,operation:"boot pull",fn:()=>Mi(n,()=>(wi("Pulling"),By(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 Qr(s.message)?(Ii("Offline"),d("Offline",void 0)):Te(s.message);if(!s.value)return Yo("Already synced"),d("Already synced",void 0);if(!Jw(n))return d("Project changed during the pull",void 0);let i=Hl(n);return c(i)?i:(Yo("Pulled"),d("Pulled and reloaded",void 0))},jy=e=>{Qw(e).then(t=>{c(t)&&logger.info(3,t.message)}).catch(t=>{logger.error(`[boot] pull failed: ${ah(t)}`)})},qz=()=>{let e=qo([]);return c(e)?Jn(4,e.message):(I({hasProjectDefinition:!1,hasInitializingEvents:!1}),d("Booted without a project",void 0))};var tI=e=>e==="~"||e.startsWith("~/")?Hy.join(eI.homedir(),e.slice(1)):e,nI=(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(Hy.resolve(tI(n)));return c(r)?a(`No epiq project at ${n}`):d("Resolved project path",r.value)},Gy=async()=>{let e=vi();if(X(""),h().hasProjectDefinition)return a("Already in a project; run epiq from another directory");let t=Ts({exclude:process.cwd()}),n=c(t)?[]:t.value,r=nI(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 Uy(o);return c(i)?(process.chdir(s),a(i.message)):(jy(o),d(`Opened ${Zu(o)}`,null))};var Ki=({boardId:e,targetTime:t,stateBranchRoot:n,selectedIndex:r})=>{let o=h(),s=Mp(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=mn(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 Wy=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 rI=20,oI=16,sI=150,qi=null,Yi=null;var rr=()=>{qi!==null&&(clearInterval(qi),qi=null),Yi!==null&&(clearTimeout(Yi),Yi=null)},zy=()=>{rr(),I({mode:y.DEFAULT,readOnly:!1,readOnlyReason:void 0,timeMode:"live",unappliedEvents:[],replay:null,selectedIndex:0})},Vy=({events:e,startTime:t,durationMs:n})=>{rr();let r=e.length,o=ms(e.map(f=>ps(f))).map(f=>f??t),s=o[r-1]??Date.now(),i=Wy(o),l=Math.max(1,Math.round(n*rI/1e3)),u=Math.max(Math.round(n/l),oI),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:[]}}),qi=setInterval(()=>{m++;let f=m/l,g=[],v,S;for(;p<r&&i[p]<=f;){let E=e[p],w=wo(E);if(c(w)){if(Er(w)){p++;continue}zy();return}g.push(...Nc(E)),v=E,S=o[p],p++}if(p>=r||m>=l){for(;p<r;p++){let w=wo(e[p]);if(c(w)&&!Er(w))break}let E=h().replay;I({unappliedEvents:[],replay:E&&{...E,progress:1,appliedCount:r}}),rr(),Yi=setTimeout(zy,sI);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?S??x?.currentTime??t:x?.currentTime??t,currentLabel:v?Ky(v):x?.currentLabel??"",flashNodeIds:v?[...new Set(g)]:x?.flashNodeIds??[]}})},u)};var qy=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(rr(),r==="now"){let l=Qs(n.value);if(c(l))return a(l.message);let u=Nn();if(c(u))return u;let m=mn(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=kp(n.value);if(c(l))return l;let u=r==="prev"?h().eventLog.at(-1):h().unappliedEvents.at(0),m=u===void 0?null:ps(u),p=(u===void 0?null:l.value.get(u.id)??null)??(m===null?null:la(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=Ki({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 Yy=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}=Bs(r,o);if(rr(),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?$s(i):15e3;if(u===null)return a("Invalid replay duration (try e.g. 30s or 2m)");let m=l.getTime(),p=h(),f=Ki({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)):(Vy({events:g,startTime:m,durationMs:u}),d("Replaying board history",!0))};import{spawn as aI}from"node:child_process";var cI=()=>{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"]}}},Xy=async e=>new Promise(t=>{let{command:n,args:r}=cI();try{let o=aI(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 cs=async(e,t)=>{if(!e.trim())return a(`Nothing to copy: ${t} is empty`);let n=await Xy(e);return c(n)?n:d(`Copied ${t} to clipboard`,null)},Jy=async e=>{let{breadCrumb:t,selectedNode:n}=h(),r=fo({breadCrumb:t,selectedNode:n}),o=r??n;if(!o)return a("Nothing selected to copy from");switch(e.modifier){case Me.REF:return cs(it(o.id),"ref");case Me.TITLE:return cs(o.title,"title");case Me.DESCRIPTION:return r?cs(r.props?.description??"","description"):a("No issue in scope");case Me.TAGS:{if(!r)return a("No issue in scope");let s=sn(r).map(({name:i})=>i);return cs(s.join(", "),"tags")}case Me.ASSIGNEES:{if(!r)return a("No issue in scope");let s=an(r).map(({name:i})=>i);return cs(s.join(", "),"assignees")}default:return a("Yank one of: ref, title, description, tags, assignees")}};var Zy=async()=>{X(""),I({mode:y.DEFAULT});let e=me();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 ki();return c(t)?(I({syncStatus:{msg:t.message,status:"failed"}}),t):(I({mode:y.DEFAULT}),t)};import{ulid as Qy}from"ulid";var eb=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=U(t)?t.id:t.parentNodeId;if(!i)return a("Unable to resolve comment issue");let l=h().nodes[i];if(!l||!U(l))return a("Unable to resolve comment issue");let u=l.log?.filter(Wh).find(m=>m.payload.id===s);return u?u.payload.author!==e.value.userId?a("You can only delete your own comments"):Y([{id:Qy(),action:"delete.issue.comment",payload:{id:s,issue:i},...Q(e.value)}],o.value):a("Unable to resolve comment")}return Y([{id:Qy(),action:"delete.node",payload:{id:r.id},...Q(e.value)}],o.value)};import{ulid as lI}from"ulid";var tb=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(!U(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=Ri(o.id,r.id,{at:"end"},e.value,i);if(c(l))return l;let u=Y([{id:lI(),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 dI}from"ulid";var nb=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 rb=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(!U(s))return a("Target node is not issue");let l=nb(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=Ri(u.id,s.id,{at:"end"},e.value,p);if(c(f))return f;let g=Y([{id:dI(),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 uI}from"ulid";var ob=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=vi();if(!o)return a("Provide a title");let s=await ae();return c(s)?s:Y([{id:uI(),action:"edit.title",payload:{id:r.id,name:o},...Q(e.value)}],s.value)};import{ulid as mI}from"ulid";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 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(!U(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:mI(),action:"remove.issue.tag",payload:{id:l.id,tag:o.id},...Q(e.value)}],m.value)};import{ulid as md}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 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(!U(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??md();return(i.props.tags??[]).includes(m)?a("Already tagged with that tag"):Y([...u?[]:[{id:md(),action:"create.tag",payload:{id:m,name:r},...Q(e.value)}],{id:md(),action:"add.issue.tag",payload:{id:i.id,tag:m},...Q(e.value)}],l.value)};import{ulid as ab}from"ulid";var cb=()=>{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 U(n)?d("Found issue",n):a("Target node is not issue")},pd=async e=>{let t=await ae();return c(t)?t:Y(e,t.value)},fd=(e,t,n)=>bm(t,n).map(r=>({id:ab(),...r,...Q(e)})),lb=async()=>{let{modifier:e,inputString:t}=q().commandMeta,n=Ds(e||t);if(!n)return a("Name the goal");let r=cb();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=Ya(n);if(l){let p=fd(i,o,l.id);return p.length===0?a("Already in that goal"):pd(p)}let u=Em(n);if(u)return a(u);let m=ab();return pd([{id:m,action:"create.goal",payload:{id:m,name:n},...Q(i)},...fd(i,o,m)])},db=async()=>{let e=cb();if(c(e))return e;let t=e.value;if(!cn(t))return a("Not in a goal");let n=te();return c(n)?a("Unable to resolve user ID"):pd(fd(n.value,t))};import{ulid as pI}from"ulid";var ub=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=mm(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:pI(),...s.value,...Q(i.value)}],l.value);return c(u)?u:d("Saved",null)},mb=()=>ub(!0),pb=()=>ub(!1);import{ulid as gd}from"ulid";var fb=({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)}))},qK=({authorName:e,authorEmail:t,owners:n,registry:r})=>{let o=nt(t),s=n.get(o),i=s?r[s]:void 0;return s?{...ha(s,i?.name),resolved:!0}:{...ha(o||e,e),resolved:!1}};var Xi=e=>{let{eventLog:t=[],contributors:n}=h();return fb({events:t,registry:n,logFileNames:Tp(e)})};var gb=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(!U(p))return a("Target node is not issue");let f=await ae();if(c(f))return f;let g=Xi(f.value),v=!o&&s.toLowerCase()==="me",S,x;if(v)S=e.value.userId,x=g.find(N=>N.id===S)?.name??e.value.userName;else{let N=g.filter(L=>L.name===s);if(N.length>1)return a(`"${s}" matches ${N.length} contributors (${N.map(L=>L.id).join(", ")}). Assign from the GUI to choose by id.`);let k=N[0];if(!k&&!o)return a(`No contributor named "${s}". Use "!${s}" to add them as an external assignee.`);S=k?.id??gd(),x=k?.name??s}if((p.props.assignees??[]).includes(S))return a("Assignee already assigned");let w=!!h().contributors[S];return Y([...w?[]:[{id:gd(),action:"create.contributor",payload:{id:S,name:x},...Q(e.value)}],{id:gd(),action:"add.issue.assignee",payload:{id:p.id,assignee:S},...Q(e.value)}],f.value)};import{ulid as fI}from"ulid";var hb=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(!U(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):Xi(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:fI(),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 yb}from"ulid";var gI=e=>{let t=e.trim(),n=En(),r=n?eg(t):null;if(!n||!r)return{ok:!0,md:t,anchored:!1};let o=ji();if(!o||o.sha!==n)return{ok:!1,reason:"No diff is open"};let s=tg(o.rows,Math.max(0,h().selectedIndex));if(!s)return{ok:!1,reason:"That line is not in a file"};let i=ng(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}},bb=async e=>{let t=gI(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(!U(p))return a("Target node is not issue");let f=await ae();if(c(f))return f;let g=await Y([{id:yb(),action:"add.issue.comment",payload:{id:yb(),issue:p.id,author:o.value.userId,md:n},...Q(o.value)}],f.value);return r&&!c(g)&&tr(null),g};import{ulid as EI}from"ulid";var vb=e=>e.userName?.trim()?e.preferredEditor?.trim()?null:"no editor configured":"no username configured",hI=e=>{let t=Fm();return c(t)?vb({userName:e.userName,preferredEditor:e.preferredEditor})??t.message:vb(t.value)},xb=()=>{let e=Ft();return c(e)?a(e.message):d("Read auto sync settings",{enabled:e.value.autoSync===!0,intervalMs:vs(e.value.autoSyncDebounceMs),blockedReason:hI(e.value)})},Ji=e=>{let t=e.intervalMs===void 0?void 0:dr(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=xb();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=xb();return c(o)?d("Changed auto sync settings",{...n.value,...e.enabled===void 0?{}:{enabled:e.enabled},...t==null?{}:{intervalMs:t}}):o};var Rb=()=>{let e=q().commandMeta.inputString,t=dr(e);if(t===null)return a(`Auto sync duration must be a whole number of milliseconds between ${3e3} and ${864e5}`);let n=Ji({intervalMs:t});return c(n)?n:d(`Auto sync interval set to ${t}ms`,null)};import yI from"zod";var Eb=()=>{let e=yI.coerce.number().int().min(vr).max(xr).safeParse(q().commandMeta.inputString);if(!e.success)return a(`A connected repo's clone cap must be ${vr}-${xr} MB (default ${ic})`);let t=Ye({repoCloneMaxMb:e.data});return c(t)?t:d(`Connected repo clone cap set to ${e.data} MB`,null)};var Sb=()=>{let e=q().commandMeta.inputString.trim();if(e!=="on"&&e!=="off")return a("Invalid response");let t=dm(e),n=Ji({enabled:t===!0});return c(n)?n:d(`Auto sync set to "${e}"`,null)};import{ulid as xI}from"ulid";var hd=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>=2),Cb="",Nb=new Map,bI=15e3;var vI=async(e,t)=>{let n=`${e} ${t??""}`,r=Nb.get(n);if(r&&Date.now()-r.at<Po(bI))return d("Cached author scan",r.authors);let o=await Se({cwd:e,args:["log","--branches",...t?["--not",t]:[],`--format=%an${Cb}%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(`
|
|
119
|
+
`)){let l=i.lastIndexOf(Cb);if(l===-1)continue;let u=i.slice(0,l),m=nt(i.slice(l+1));if(!cr(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 Nb.set(n,{at:Date.now(),authors:s}),d("Scanned repository authors",s)},wb=async({repoRoot:e,stateBranch:t,names:n,links:r})=>{let o=await vI(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=>hd(u??"")));return d("Found candidates",[...s.entries()].map(([u,m])=>({email:u,names:[...m.names],commits:m.commits,looksLikeYours:[...m.names].some(p=>hd(p).some(f=>l.has(f)))||hd(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)))},Ib=e=>e.filter(t=>t.claimedBy.length===0);var Ab=()=>{let e=Ga();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))},Tb=async()=>{let e=q().commandMeta.inputString.trim();if(e==="none"){let E=Ab();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=me();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 wb({repoRoot:s.value,stateBranch:c(i)?void 0:i.value,names:[n,r],links:o.value.emailLinks});if(c(l))return l;let m=Ib(l.value);if(im(m.map(E=>E.email)),m.length===0){if(!cm()){let E=Ab();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 w=m.find(N=>N.email===nt(E));if(!w){g.push(E);continue}f.includes(w)||f.push(w)}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 S=f.map(E=>({id:xI(),action:"link.contributor.email",payload:{contributor:t,email:E.email},userId:t})),x=Y(S,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 RI}from"ulid";var Mb=()=>{let e=q().commandMeta.inputString.trim(),{userId:t}=ne();if(!t)return a("Set a username first with :config username");let n=me();if(c(n))return a("Board is not loaded");let r=lr(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:RI(),action:"unlink.contributor.email",payload:{contributor:t,email:o},userId:t}],i.value);return c(l)?a(l.message):d(`Unclaimed ${o}`,null)};var kb=()=>{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 Lb=e=>{let t=e.inputString.trim();switch(e.modifier){case ee.USERNAME:{if(process.env[na])return a(`Cannot change the configured user while ${na} 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||EI();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 Tb();case ee.EMAILS_UNCLAIM:return Mb();case ee.AUTOSYNC:return Sb();case ee.LOG_LEVEL:return kb();case ee.SYNC_DEBOUNCE_MS:return Rb();case ee.ATTACHMENT_MAX_KB:return Hm();case ee.REPO_CLONE_MAX_MB:return Eb();case ee.REPO_CONNECT:return mg();case ee.REPO_DISCONNECT:return pg();default:return a("Unknown config command")}};var yd=()=>{let e=um(),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 Pb=[{systemOnly:!0,intent:j.Move,description:"Internal move-state command",mode:y.COMMAND_LINE,action:Ly},{intent:j.Delete,description:"Delete the currently selected node",mode:y.COMMAND_LINE,action:eb,onSuccess:()=>I({mode:y.DEFAULT})},{intent:j.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 de(i=>({...i,filters:e==="clear"?[]:[...i.filters,s],mode:y.DEFAULT})),d("Filter updated",null)}},{intent:j.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:j.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:y.COMMAND_LINE,action:tb,onSuccess:()=>I({mode:y.DEFAULT})},{intent:j.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:y.COMMAND_LINE,action:rb,onSuccess:()=>I({mode:y.DEFAULT})},{intent:j.Init,description:"Initialize Epiq in the current git repository",mode:y.COMMAND_LINE,action:wy,onSuccess:yd},{intent:j.OpenProject,description:"Open a recently used epiq project, by number or path",mode:y.COMMAND_LINE,action:Gy,onSuccess:()=>I({mode:y.DEFAULT})},{intent:j.NewItem,description:"Create a new board, swimlane, or issue",mode:y.COMMAND_LINE,action:Oy,onSuccess:()=>I({mode:y.DEFAULT})},{intent:j.Rename,description:"Rename the currently selected node",mode:y.COMMAND_LINE,action:ob,onSuccess:()=>I({mode:y.DEFAULT})},{intent:j.UntagTicket,description:"Remove a tag from the selected issue",mode:y.COMMAND_LINE,action:sb,onSuccess:()=>I({mode:y.DEFAULT})},{intent:j.TagTicket,description:"Add or create a tag on the selected issue",mode:y.COMMAND_LINE,action:ib,onSuccess:()=>I({mode:y.DEFAULT})},{intent:j.GoalTicket,description:"Put the selected issue in a goal, or name a new one",mode:y.COMMAND_LINE,action:lb,onSuccess:()=>I({mode:y.DEFAULT})},{intent:j.UngoalTicket,description:"Take the selected issue out of its goal",mode:y.COMMAND_LINE,action:db,onSuccess:()=>I({mode:y.DEFAULT})},{intent:j.RuleLane,description:"Give the selected swimlane a rule: done marks its tickets done",mode:y.COMMAND_LINE,action:mb,onSuccess:()=>I({mode:y.DEFAULT})},{intent:j.UnruleLane,description:"Take a rule off the selected swimlane",mode:y.COMMAND_LINE,action:pb,onSuccess:()=>I({mode:y.DEFAULT})},{intent:j.AssignUserToTicket,description:"Assign a user to the selected issue",mode:y.COMMAND_LINE,action:gb,onSuccess:()=>I({mode:y.DEFAULT})},{intent:j.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:y.COMMAND_LINE,action:hb,onSuccess:()=>I({mode:y.DEFAULT})},{intent:j.Comment,description:"Add a comment to the selected issue",mode:y.COMMAND_LINE,action:async(e,t)=>bb(t),onSuccess:()=>I({mode:y.DEFAULT})},{intent:j.Sync,description:"Pull, commit, and push Epiq state",mode:y.COMMAND_LINE,action:Zy},{intent:j.Peek,description:"View board state at another point in time",mode:y.COMMAND_LINE,action:qy},{intent:j.Replay,description:"Replay board history forward from a point in time",mode:y.COMMAND_LINE,action:Yy},{intent:j.Export,description:"Export the current board layout to markdown",mode:y.COMMAND_LINE,action:async()=>{let e=await Ry();return c(e)?e:(I({mode:y.DEFAULT}),d("Export successful",!0))}},{intent:j.Exit,description:"Exit the application",mode:y.COMMAND_LINE,action:async()=>(V.exit(),d("Exit successful",!0))},{intent:j.Edit,description:"Edit title or description",mode:y.COMMAND_LINE,action:async(e,t)=>Sy(t),onSuccess:()=>I({mode:y.DEFAULT})},{intent:j.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:j.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:y.COMMAND_LINE,action:(e,t)=>Lb(t),onSuccess:yd}];var SI=e=>{let t=e.value;return t&&typeof t=="object"&&typeof t.followUp=="string"?t.followUp:null},CI=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=Mh(n);Pg();let{readOnly:l}=h();if(l&&!CI.has(i))return Wo({status:ir.Fail,message:"Command not available in readonly state",value:null});let u=Pb.filter(g=>e||g.systemOnly!==!0).find(g=>g.intent===i);if(!u)return Wo({status:ir.Fail,message:"Command not found",value:null});let m;try{m=await u.action(u,{command:n,inputString:s,modifier:o})}catch(g){return Wo({status:ir.Fail,message:g instanceof Error?g.message:"Command failed",value:null})}if(c(m))return Wo(m);let p=!e;if(Og({addToHistory:p,line:t}),p){let g=$y({commands:q().commandHistory});c(g)&&logger.info(g.message)}let f=SI(m);return f!==null?(X(f),m):(u.onSuccess?.(),ne().autoSync&&Th(),m)};var Zi=[{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")}],Ob=[{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 Db={[re.WORKSPACE]:[...Zi,...Qi],[re.BOARD]:[...Zi,...Qi],[re.SWIMLANE]:[...Zi,...Qi,...Ob],[re.TICKET]:[],[re.FIELD]:[],[re.FIELD_LIST]:[],[re.TEXT]:[],[re.COMMENT]:[]};import wI from"node:fs";import II from"node:path";import{spawn as NI}from"node:child_process";function Fb(e){let t=process.platform,o=NI(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 _b=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=sc(e.hash,e.ext),o=II.join(so(n.value),r);return wI.existsSync(o)?(Fb(o),d(`Opened ${e.name}`,null)):a("Attachment file not found \u2014 run :sync to fetch it")};var $b=()=>{X("");let{pendingNavTarget:e}=Wr();I({mode:y.DEFAULT}),e&&V.navigate(e),Cn({pendingNavTarget:void 0})},Bb=[{intent:C.ExitCommandLine,mode:y.HELP,action:()=>($b(),d("Exiting help",null))},{intent:C.Exit,mode:y.HELP,action:()=>($b(),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 Ub=()=>{X(""),I({mode:y.DEFAULT})},jb=[{intent:C.Confirm,mode:y.IDENTITY,description:"[enter] claim the first",action:()=>{let[e]=gr();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:()=>(Ub(),d("Closed identity",null))},{intent:C.Exit,mode:y.IDENTITY,description:"[esc] close",action:()=>(Ub(),d("Closed identity",null))}];var AI=e=>{I({mode:y.COMMAND_LINE});let{pendingNavTarget:t}=Wr();t&&V.navigate(t),Cn({pendingNavTarget:void 0}),X(`${e} `)},Hb=()=>{X("");let{pendingNavTarget:e}=Wr();e&&V.navigate(e),Cn({pendingNavTarget:void 0}),I({mode:y.DEFAULT})},Gb=[{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||!qd(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?(AI(t),d("Selected command",t)):d("No command selected",null)}},{intent:C.ExitCommandLine,mode:y.PALETTE,action:()=>(Hb(),d("Exiting palette",null))},{intent:C.Exit,mode:y.PALETTE,action:()=>(Hb(),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 Wb=()=>{let e=En();if(!e)return d("Nothing to comment on here",null);let t=ji();if(!t||t.sha!==e)return a("The diff is still loading");let{selectedIndex:n}=h(),r=Math.max(0,n),o=Rl(t.rows,Ql(e)??r,r);return o.ok?(I({mode:y.COMMAND_LINE}),X(`${b.COMMENT} ${Qf(o.value.start,o.value.end)} `),d("Commenting on a diff line",null)):a(o.reason)},zb=[{intent:C.InitCommandLine,mode:y.DEFAULT,description:"[:] write command",action:()=>(I({mode:y.COMMAND_LINE}),X(""),d("Entering command line mode",null))},...Bb,...jb,...Gb,{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 _b(r);if(En())return Wb();if(e?.title===fe.DESCRIPTION)return I({mode:y.COMMAND_LINE}),X(`${b.EDIT} description `),d("Propose command",!0);if(e?.title===fe.ASSIGNEES)return I({mode:y.COMMAND_LINE}),X(`${b.ASSIGN} `),d("Propose command",!0);if(e?.title===fe.TAGS)return I({mode:y.COMMAND_LINE}),X(`${b.TAG} `),d("Propose command",!0);if(t.title===fe.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?Al({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=Ql(e);return tr(n===t?null:{sha:e,row:Math.max(0,t)}),d("Marked diff line",null)}},{intent:C.CommentOnDiffLine,mode:y.DEFAULT,action:()=>En()?Wb():d("Nothing to comment on here",null)},{intent:C.Yank,mode:y.DEFAULT,description:"[y] yank",action:()=>{let{selectedNode:e}=h(),t=e?.title===fe.DESCRIPTION?Me.DESCRIPTION:e?.title===fe.TAGS?Me.TAGS:e?.title===fe.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 TI=500,MI=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),Vb=e=>{let t=MI(e);t&&bi(n=>(n+t).slice(0,TI))};var kI=[y.COMMAND_LINE,y.PALETTE],LI=e=>e==="edit title "?h().selectedNode?.title??"":"",PI=e=>[{intent:C.MoveCursorLeft,mode:e,action:()=>(Ol(-1),d("Moving cursor left",null))},{intent:C.MoveCursorRight,mode:e,action:()=>(Ol(1),d("Moving cursor right",null))},{intent:C.MoveCursorLeftOfWord,mode:e,action:()=>(Dl("left"),d("Moving cursor left of word",null))},{intent:C.MoveCursorRightOfWord,mode:e,action:()=>(Dl("right"),d("Moving cursor right of word",null))},{intent:C.AutoCompleteCommand,mode:e,action:()=>(bi((t,{remainder:n})=>{let r=n?t+n:t;return r+LI(r)}),d("Auto-completing command",null))},{intent:C.CaptureInput,mode:e,action:(t,{sequence:n})=>(Vb(n??""),d("Capturing input",null))},{intent:C.EraseInput,mode:e,action:()=>(kg(),d("Erasing input",null))},{intent:C.EraseInputWord,mode:e,action:()=>(Lg(),d("Erasing input word",null))}],Kb=[{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))},...kI.flatMap(PI),{intent:C.ExitCommandLine,mode:y.COMMAND_LINE,action:()=>(Fg(),I({mode:y.DEFAULT}),d("Exiting command line",null))},{intent:C.GetLastCommandFromHistory,mode:y.COMMAND_LINE,action:()=>(_g(),d("Getting last command from history",null))},{intent:C.GetNextCommandFromHistory,mode:y.COMMAND_LINE,action:()=>($g(),d("Getting next command from history",null))}];var OI=e=>{let t=/^\[(.+?)\]\s*(.+)$/.exec(e);return t?{keys:t[1]??"",label:t[2]??""}:null},qb=({keys:e})=>e.length===1?0:1,Yb=(e,t)=>{let n=new Set;for(let r of e)r.mode!==t||!r.description||n.add(r.description);return[...n].map(OI).filter(r=>r!==null).sort((r,o)=>qb(r)-qb(o))};function Xb(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,bd,vd=new Set,xd=()=>{for(let e of vd)e()},FI=e=>(vd.add(e),()=>vd.delete(e));function Rd(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=Xb(t,o,r);if(c(u))return logger.error(u.message),u;let m=u.value,{context:p}=l,f=[...zb,...Db[p]??[],...Kb],g=Yb(f,n),v=Jb(f),S=_I(o,s),x=S[t]?.[e.selectedIndex]??null;return d("Derived successfully",{...e,contextNode:l,breadCrumb:m,availableHints:g,availableActions:f,actionIndex:v,selectedNode:x,renderedChildrenIndex:S})}var h=()=>{if(!et)throw new Error("State not initialized. Call initWorkspaceState() first.");return et},me=()=>et?d("Retrieved state",et):a("State not initialized. Call initWorkspaceState() first.");rm(e=>et?lr(et.emailLinks,e):[]);function No(e){bd=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:oa(),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=Rd(r);return c(o)?o:(et=o.value,xd(),d("State initialized",null))}var or=!1,ls=null;function de(e){let t=h(),n=e(t);if(or)return n.nodes!==t.nodes&&(wn=null),ls=n,et={...t,...n},d("State updated",null);let r=Rd(n);return c(r)?a(r.message??"Unable to update state"):(et=r.value,xd(),d("State updated",null))}function Zs(e){if(or)return d("Joined batch",e());or=!0,ls=null,wn=new Set;let t=()=>{let n=ls;if(or=!1,ls=null,n===null)return null;let r=Rd(n);return c(r)?a(r.message??"Unable to update state"):(et=r.value,xd(),d("State updated",null))};try{let n=e(),r=t();return r&&c(r)?a(r.message):d("State updated",n)}finally{or&&t()}}var Xg=()=>or,I=e=>de(t=>({...t,...e}));function sr(e,t,n){if(!or)return de(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 ls=s,et={...r,...s},d("State updated",null)}var Pe=()=>DI(FI,h,h),wn=null,Zb=null,_I=(e,t)=>{let n=et?.renderedChildrenIndex,r=n!==void 0&&wn!==null&&e===Zb&&t.length===0&&et?.filters.length===0,o;if(r){o={...n};let s=Vg(e,wn);for(let i of wn){let l=s[i];l?o[i]=l:delete o[i]}}else o=zg(e,t);return Zb=e,wn=new Set,o},le=e=>h()?.renderedChildrenIndex[e]??[],Nn=()=>bd?No(bd):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}`)},$I=(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=de(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&&de(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(!U(t))return a("Can only comment on issues");let n=sr("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(!U(r))return a("Can only edit issue comments");let o={...n,md:t,deleted:!1},s=sr("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=sr("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(!U(t))return a("Can only attach to issues");let n=de(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=de(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($I(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:zd,tombstoned:!0},r=de(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=de(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=de(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=ya(r.email,t),s=h().emailLinks[o];if(s&&!s.tombstoned)return d("Email already linked",s);let i=de(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=ya(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(!Kd(n,o))return a("Only the author of a link or the contributor it names may remove it");let s={...o,tombstoned:!0},i=de(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=de(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(!U(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(!U(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(!U(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(!U(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(!U(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(!U(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=de(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=de(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=de(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=de(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=de(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=de(s=>({...s,tags:{...s.tags,[e]:r}}));return c(o)?a("Unable to restore tag"):d("Restored tag",r)},createTag(e){let t=de(n=>({...n,tags:{...n.tags,[e.id]:e}}));return c(t)?a("Could not create tag"):d("Tag created",e)},createNode(e){let t=sr("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=sr("nodes",e,n);return c(r)?a(r.message):d("Locked node",n)},updateNode(e){let t=sr("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 BI=(e,t)=>e+" ".repeat(Math.max(0,t-Qb(e))),UI=(e,t)=>" ".repeat(Math.max(0,t-Qb(e)))+e,ev=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`),jI=(e,t)=>t?e<t?"up":e>t?"down":null:null,HI=(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=jI(e.payload.rank,o.rank);if(s)return`Moved ${s} in ${r}`}return`Moved issue to ${r}`},tv=e=>`${Math.max(1,Math.round(e/1024))} KB`,nv=e=>R.getAttachment(e)?.name??"",ea=e=>h().goals[e]?.name??"",GI=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 ea(e.payload.goal);case"add.swimlane.rule":case"remove.swimlane.rule":return`"${e.payload.rule}"`;case"edit.goal.description":case"tombstone.goal":return`"${ea(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 ca(e);case"add.issue.attachment":return`"${e.payload.name}" ${In.dim(`(${tv(e.payload.bytes)})`)}`;case"delete.issue.attachment":{let t=nv(e.payload.id);return t?`"${t}"`:""}default:return""}},WI=e=>{let t=vn(kn(e));return In.gray(UI(t,8))},zI=12,VI=e=>BI(`${e}`,zI),KI=e=>{let t=me();return c(t)?e:ga(e,t.value.contributors[e]?.name)},qI=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 ea(e.payload.goal);case"add.swimlane.rule":case"remove.swimlane.rule":return`"${e.payload.rule}"`;case"edit.goal.description":case"tombstone.goal":return`"${ea(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 ca(e);case"move.node":{let t=R.getNode(e.payload.parent);return t?`to ${t.title}`:""}case"add.issue.attachment":return`"${e.payload.name}" (${tv(e.payload.bytes)})`;case"delete.issue.attachment":{let t=nv(e.payload.id);return t?`"${t}"`:""}default:return""}},Ky=e=>[ev(e.action),qI(e)].filter(Boolean).join(" "),rv=(e,t)=>{let n=WI(e.id),r=VI(KI(e.userId)),o=In.dim("\u203A"),s=e.action==="move.node"?HI(e,t):[ev(e.action),GI(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${s}`};var YI=e=>he(e,"comments"),XI=e=>he(e,"description"),JI=e=>he(e,"assignees"),ZI=e=>he(e,"tags"),QI=e=>he(e,"history"),eA=e=>he(e,"diff"),tA=e=>he(e,"attachments"),ds=({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)},ov=({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(!qr(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)},ta=null,nA=()=>{if(ta)return d("Virtual field ranks",ta);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:(ta={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",ta))},wc=e=>{let t=nA();if(c(t))return t;let n=t.value,r=ds({id:XI(e.id),name:fe.DESCRIPTION,parentNodeId:e.id,rank:n.description,value:e.props.description??"",childRenderAxis:"vertical"});if(c(r))return r;let o=ov({id:JI(e.id),name:fe.ASSIGNEES,parentNodeId:e.id,rank:n.assignees,readonly:!0});if(c(o))return o;let s=ov({id:ZI(e.id),name:fe.TAGS,parentNodeId:e.id,rank:n.tags,readonly:!0});if(c(s))return s;let i=ds({id:YI(e.id),name:fe.COMMENTS,parentNodeId:e.id,rank:n.comments,value:"",readonly:!1,childRenderAxis:"vertical"});if(c(i))return i;let l=ds({id:tA(e.id),name:fe.ATTACHMENTS,parentNodeId:e.id,rank:n.attachments,value:"",readonly:!0,childRenderAxis:"vertical"});if(c(l))return l;let u=ds({id:QI(e.id),name:fe.HISTORY,parentNodeId:e.id,rank:n.log,value:rA(e),readonly:!0,childRenderAxis:"vertical"});if(c(u))return u;let m=ds({id:eA(e.id),name:fe.DIFF,parentNodeId:e.id,rank:n.diff,value:"",readonly:!0,childRenderAxis:"vertical"});return c(m)?m:d("Ticket virtual nodes materialized",void 0)},rA=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=>rv(r,n.get(r.action)??[])).join(`
|
|
120
|
+
`)},sv=!0,WJ=e=>{sv=e},Ic=()=>sv,zJ=()=>{let{nodes:e}=h();for(let t of Object.values(e)){if(!U(t))continue;let n=wc(t);if(c(n))return n}return d("Virtual nodes materialized",void 0)};export{vs as a,K as b,wt as c,F as d,Se as e,Iu as f,ve as g,It as h,oo as i,sx as j,Ee as k,Ft as l,Ye as m,Fm as n,ne as o,rM as p,ut as q,A as r,Ue as s,Hd as t,vA as u,Gd as v,xA as w,dv as x,Td as y,An as z,rn as A,vv as B,ca as C,la as D,kn as E,ms as F,Fd as G,ps as H,ga as I,ha as J,zd as K,tt as L,nt as M,cr as N,ya as O,IA as P,lr as Q,AA as R,Kd as S,U as T,qd as U,rt as V,Yr as W,y as X,Ln as Y,Pn as Z,dt as _,DA as $,Zu as aa,Ts as ba,nm as ca,im as da,mo as ea,sn as fa,an as ga,b as ha,mt as ia,po as ja,Dn as ka,mm as la,yx as ma,Ps as na,gm as oa,Ka as pa,Ds as qa,Ya as ra,cn as sa,bm as ta,Rx as ua,Cx as va,Va as wa,zM as xa,Nx as ya,xm as za,VM as Aa,wx as Ba,Rm as Ca,Em as Da,ke as Ea,Zx as Fa,Bn as Ga,sc as Ha,Fk as Ia,_k as Ja,At as Ka,Tt as La,zm as Ma,Gs as Na,Wn as Oa,zn as Pa,Q as Qa,Sr as Ra,it as Sa,Sc as Ta,Ae as Ua,mn as Va,Io as Wa,C0 as Xa,Tp as Ya,Qs as Za,Mp as _a,kp as $a,Y as ab,Ac as bb,ei as cb,at as db,uO as eb,Vn as fb,Fc as gb,IE as hb,OO as ib,kE as jb,qc as kb,LE as lb,Qc as mb,ol as nb,ui as ob,il as pb,aS as qb,_f as rb,ul as sb,uS as tb,hS as ub,vS as vb,NS as wb,Al as xb,fg as yb,gg as zb,hg as Ab,gn as Bb,se as Cb,Lr as Db,RC as Eb,U_ as Fb,C as Gb,q_ as Hb,be as Ib,Ri as Jb,Ei as Kb,V as Lb,qo as Mb,q$ as Nb,ih as Ob,wi as Pb,Yo as Qb,WC as Rb,Jn as Sb,ah as Tb,jl as Ub,Or as Vb,Nh as Wb,Hl as Xb,Th as Yb,Mh as Zb,yt as _b,bt as $b,Fr as ac,Oi as bc,Fj as cc,vy as dc,Wr as ec,LG as fc,Ny as gc,Py as hc,Kz as ic,Uy as jc,jy as kc,qz as lc,nb as mc,fb as nc,qK as oc,vb as pc,xb as qc,Ji as rc,wb as sc,Ib as tc,Pb as uc,OI as vc,h as wc,me as xc,I as yc,Pe as zc,le as Ac,Nn as Bc,gt as Cc,Qe as Dc,$I as Ec,R as Fc,ev as Gc,Ky as Hc,ds as Ic,ov as Jc,wc as Kc,WJ as Lc,Ic as Mc,zJ as Nc};
|