epiq 0.2.28 → 0.2.30

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.
Files changed (3) hide show
  1. package/dist/cli.js +39 -34
  2. package/package.json +17 -1
  3. package/readme.md +15 -14
package/dist/cli.js CHANGED
@@ -1,41 +1,46 @@
1
1
  #!/usr/bin/env node
2
- import{render as Yd}from"ink";import Qd from"meow";import Ki from"react";import Wd from"chalk";import{Box as me,Text as We}from"ink";import D from"react";import it from"chalk";import{monotonicFactory as Oa,ulid as Ne}from"ulid";import{useSyncExternalStore as Fa}from"react";var L={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function $e(e){return e.context==="TICKET"}var Sn=e=>e.context==="SWIMLANE";var f={INIT:"init",HELP:"help",NEW:"new",TAG:"tag",FILTER:"filter",MOVE:"move",ASSIGN:"assign",DELETE:"delete",RENAME:"rename",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",SET_DESCRIPTION:"edit",SET_EDITOR:"set:editor",SET_VIEW:"set:view",SET_USERNAME:"set:username",SYNC:"sync",NONE:""},xe={None:"none",Invalid:"invalid",Valid:"valid"},ve={None:"none",Success:"success",Fail:"fail"},s=e=>({result:ve.Fail,message:e,data:null}),c=(e,t)=>({result:ve.Success,message:e,data:t}),An=()=>({result:ve.None,message:"No result",data:null}),d=e=>e.result==="fail",ze=e=>e.result==="success";var p={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line"};function St(e,t){let r=Math.min(e.length,t.length),n=0;for(;n<r&&e[n]===t[n];)n++;return n}var At=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",wn=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var Tn=e=>{let t=new Map;for(let r of e)for(let n=1;n<=r.length;n++){let o=r.slice(0,n),i=t.get(o);i?i.push(r):t.set(o,[r])}return t},Mn=(e,t)=>t?e.get(t)??[]:[];var Rn=new WeakMap,Gi=e=>{let t=Rn.get(e);return t||(t=Tn(e),Rn.set(e,t)),t};var Ln=({wordList:e,inputToMatch:t,overlapThreshold:r=1})=>{let n=t.toLowerCase();return Mn(Gi(e),n).filter(i=>St(n,i)>=r)};var Pn=({inputToMatch:e,lastWord:t},r)=>{if(t.endsWith(" "))return{hint:"",hints:[],overlap:0,remainder:""};let n=Ln({wordList:r,inputToMatch:e,overlapThreshold:1});return Ji(t,n)},Ji=(e,t)=>{let r=t[0]??"",n=St(e.toLowerCase(),r.toLowerCase()),o=r?r+" ":"",i=o.slice(n);return{hint:o,hints:t,overlap:n,remainder:i}};var Dn=["vi","vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];var qe=24n,Xi=qe*4n,wt=(1n<<Xi)-1n,Yi=/^[0-9a-f]+$/;function Fn(e){if(!e||!Yi.test(e))throw new Error(`Invalid hex rank: ${e}`);return BigInt("0x"+e)}function Tt(e,t=qe){if(e<0n)throw new Error("Negative rank not allowed");return e.toString(16).padStart(Number(t),"0")}function lt(e,t){if(!e&&!t)return Tt(wt/2n,qe);let r=e?Fn(e):0n,n=t?Fn(t):wt;if(n<=r)return Tt(wt/2n,qe);let o=(r+n)/2n;return o===r||o===n?"":Tt(o,qe)}function ae(){return Tt(wt/2n,qe)}var J={workspace:(e,t)=>({id:e,title:t,rank:ae(),isDeleted:!1,props:{},context:L.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,r,n=!1)=>({id:e,title:t,rank:ae(),isDeleted:!1,props:{},context:L.BOARD,childRenderAxis:"horizontal",parentNodeId:r,readonly:n,log:[]}),swimlane:(e,t,r)=>({id:e,title:t,rank:ae(),isDeleted:!1,props:{},context:L.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:r,readonly:!1,log:[]}),field:(e,t,r,n={},o="horizontal")=>({id:e,title:t,rank:ae(),isDeleted:!1,props:n,context:L.FIELD,childRenderAxis:o,parentNodeId:r,readonly:!1,log:[]}),ticket:(e,t,r)=>({id:e,title:t,rank:ae(),isDeleted:!1,props:{},context:L.TICKET,childRenderAxis:"vertical",parentNodeId:r,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:r,props:n={},readonly:o=!0})=>({id:e,title:t,rank:ae(),isDeleted:!1,props:n,context:L.TEXT,childRenderAxis:"vertical",parentNodeId:r,readonly:o,log:[]})};var W=e=>Object.values(C().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,r)=>t.rank.localeCompare(r.rank)),kn=(e,t)=>e.findIndex(r=>r.id===t),br=(e,t={at:"end"})=>{if(e.length===0)return c("Resolved rank",ae());switch(t.at){case"start":{let r=e[0];return r?c("Resolved rank",lt(void 0,r.rank)):s("Unable to resolve first sibling")}case"end":{let r=e[e.length-1];return r?c("Resolved rank",lt(r.rank,void 0)):s("Unable to resolve last sibling")}case"before":{let r=kn(e,t.sibling);if(r<0)return s("Sibling not found");let n=r>0?e[r-1]:void 0,o=e[r];return o?c("Resolved rank",lt(n?.rank,o.rank)):s("Sibling not found")}case"after":{let r=kn(e,t.sibling);if(r<0)return s("Sibling not found");let n=e[r],o=r<e.length-1?e[r+1]:void 0;return n?c("Resolved rank",lt(n.rank,o?.rank)):s("Sibling not found")}}};var Ge=(e,t)=>{let{nodes:r}=C(),n=r[e];if(!n)return s("Node not found");if(n.context===t)return c("Resolved ancestor node",n);let o=n.parentNodeId?r[n.parentNodeId]:void 0;for(;o;){if(o.context===t)return c("Resolved ancestor node",o);o=o.parentNodeId?r[o.parentNodeId]:void 0}return s(`No ancestor found for context: ${t}`)},Sr=(e,t)=>{let{nodes:r}=C(),n=r[e];for(;n?.parentNodeId;){if(n.parentNodeId===t)return!0;n=r[n.parentNodeId]}return!1},Ir=(e,t)=>e?e.readonly?s({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node"}[t]):null:s("Node not found"),E={deleteNode(e){de(t=>{let r={...t.nodes};return delete r[e],{...t,nodes:r}})},editValue(e,t){let{nodes:r}=C(),n=r[e];if(!n)return s("Edit target node not found");let o=Ir(n,"edit");if(o)return o;let i={...n,props:{...n.props,value:t}};return E.updateNode(i),c("Issue description updated",{md:t})},renameNode(e,t){let r=this.getNode(e);if(!r)return s("Rename target node not found");let n=Ir(r,"rename");if(n)return n;let o={...r,title:t};return this.updateNode(o),c("Renamed node",o)},getExistingTags(){let{tags:e}=C();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=C();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return W(e).find(r=>r.title===t)},moveNode({id:e,parentId:t,position:r={at:"end"}}){let{rootNodeId:n}=C(),o=this.getNode(e),i=this.getNode(t);if(!o)return s("Node not found");if(!i)return s("Target parent not found");if(n===e)return s("Cannot move root node");if(e===t)return s("Cannot move node into itself");let a=Ir(o,"move");if(a)return a;if(Sr(t,e))return s("Cannot move node into its own descendant");let l=W(t).filter(g=>g.id!==e),m=br(l,r);if(d(m))return m;let u={...o,parentNodeId:t,rank:m.data};return this.updateNode(u),c("Moved node successfully",u)},tombstoneNode(e){let{nodes:t,currentNodeId:r,rootNodeId:n}=C(),o=this.getNode(e);if(!o)return s("Node not found");if(n===e)return s("Cannot delete root node");let i=new Set,a=m=>{let u=t[m];if(!(!u||i.has(m))){i.add(m);for(let g of W(u.id))a(g.id)}};a(e);let l={...structuredClone(t)};for(let m of i){if(!l[m])return s("Unable to locate node to delete");l[m]={...l[m],isDeleted:!0}}return r?(A({nodes:l}),c("Successfully tomb stoned",o)):s("Unable to delete undefined")},createContributor(e){let t=de(r=>({...r,contributors:{...r.contributors,[e.id]:e}}));return d(t)?s("Unable to create contributor"):c("Created contributor",e)},assign(e,t,r){let n=E.getContributor(t),o=E.getNode(e);if(!o||!n)return s("Unable assign contributor to issue");let i=this.getFieldByTitle(o.id,"Assignees");if(!i)return s("Unable to locate assignees field");if(W(i.id).some(m=>m.props?.value===t))return s("Contributor already assigned");let l=this.createNodeAtPosition(J.field(r,n.name,i.id,{value:t}));return d(l)?l:c("Assigned contributor",l.data)},createTag(e){let t=de(r=>({...r,tags:{...r.tags,[e.id]:e}}));return d(t)?s("Could not create tag"):c("Tag created",e)},tag(e,t,r){let n=E.getTag(t),o=E.getNode(e);if(!n)return s("Unable to add tag, missing tag");if(!o)return s("Unable to add tag, missing target");let i=this.getFieldByTitle(o.id,"Tags");if(!i)return s("Unable to locate tags field");if(W(i.id).some(m=>m.props?.value===t))return s("Tag already assigned");let l=this.createNodeAtPosition(J.field(r,n.name,i.id,{value:t}));return d(l)?l:c("Tag added",l.data)},createNodeAtPosition(e,t={at:"end"}){if(!e.parentNodeId){let i={...e,rank:ae()};return this.createNode(i),c("Created node",i)}let r=W(e.parentNodeId),n=br(r,t);if(d(n))return n;let o={...e,rank:n.data};return this.createNode(o),c("Created node",o)},createNode(e){let t=de(r=>({...r,nodes:{...r.nodes,[e.id]:e}}));return d(t)?s("Unable to create node"):c("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return s("Failed to locate node");let r={...t,readonly:!0},n=de(o=>({...o,nodes:{...o.nodes,[e]:r}}));return d(n)?s(n.message):c("Locked node",r)},updateNode(e){let t=de(r=>({...r,nodes:{...r.nodes,[e.id]:e}}));return d(t)?t:c("Updated node",e)},getContributor(e){return C().contributors[e]},getTag(e){return C().tags[e]},getNode(e){return C().nodes[e]},getSiblings:e=>Object.values(C().nodes).filter(t=>!t.isDeleted&&t.parentNodeId===e).sort((t,r)=>t.rank.localeCompare(r.rank))};var Mt={preferredEditor:null,userName:null,userId:null},ce=()=>Mt,mt=e=>(Mt={...Mt,...e},Mt);var Rt=()=>{let e=ce(),t=!!e.userName?.trim(),r=!!e.preferredEditor?.trim();return{isSetup:r&&t,hasPreferredEditor:r,hasUserName:t,userName:e.userName,preferredEditor:e.preferredEditor}},Bn=()=>!Lt();var V={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#2a2f45",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},h={accent:V.cyan,accent2:V.magenta,primary:V.white,secondary:V.grayDark,secondary2:V.grayLight,gray:V.gray,green:V.green,yellow:V.yellow,red:V.red};var x={red:V.red,yellow:V.yellow,green:V.green,blue:V.blue,magenta:V.magenta,cyan:V.cyan},Je={urgent:x.red,critical:x.red,important:x.red,blocker:x.red,asap:x.red,immediate:x.red,fail:x.red,failure:x.red,broken:x.red,bug:x.red,error:x.red,incident:x.red,outage:x.red,production:x.red,crash:x.red,security:x.red,warning:x.yellow,warn:x.yellow,risky:x.yellow,risk:x.yellow,attention:x.yellow,pending:x.yellow,review:x.yellow,"needs-review":x.yellow,qa:x.yellow,testing:x.yellow,test:x.yellow,validate:x.yellow,verification:x.yellow,staging:x.yellow,check:x.yellow,"follow-up":x.yellow,followup:x.yellow,waiting:x.yellow,blocked:x.yellow,hold:x.yellow,done:x.green,complete:x.green,completed:x.green,success:x.green,ok:x.green,stable:x.green,resolved:x.green,fixed:x.green,closed:x.green,merged:x.green,released:x.green,deployed:x.green,approved:x.green,verified:x.green,working:x.green,healthy:x.green,pass:x.green,passing:x.green,info:x.blue,information:x.blue,note:x.blue,docs:x.blue,documentation:x.blue,doc:x.blue,guide:x.blue,help:x.blue,explanation:x.blue,detail:x.blue,details:x.blue,context:x.blue,design:x.blue,discussion:x.blue,proposal:x.blue,idea:x.blue,feature:x.magenta,enhancement:x.magenta,improvement:x.magenta,refactor:x.magenta,refactoring:x.magenta,cleanup:x.magenta,optimize:x.magenta,optimization:x.magenta,perf:x.magenta,performance:x.magenta,upgrade:x.magenta,migration:x.magenta,modernize:x.magenta,debt:x.magenta,todo:x.cyan,next:x.cyan,planned:x.cyan,plan:x.cyan,future:x.cyan,backlog:x.cyan,investigate:x.cyan,explore:x.cyan,prototype:x.cyan};var K=e=>{let{currentNode:t}=C(),r=Rt().isSetup,n=t.context,o=[f.SYNC,f.HELP,f.SET_VIEW,f.SET_EDITOR,f.SET_USERNAME],i=[f.NEW,f.RENAME,f.DELETE],a=[f.TAG,f.ASSIGN,f.CLOSE_ISSUE,f.RE_OPEN_ISSUE,f.SET_DESCRIPTION],m=[...{WORKSPACE:[...o,...i],BOARD:[f.FILTER,...o,...i],SWIMLANE:[f.FILTER,...o,...i],TICKET:[...o,...i,...a],FIELD:[...o,...a],FIELD_LIST:[...o,...a],TEXT:[...o]}[n||"WORKSPACE"]],u={[f.SYNC]:[],[f.INIT]:[],[f.SET_USERNAME]:[],[f.SET_DESCRIPTION]:["confirm"],[f.DELETE]:["confirm"],[f.RE_OPEN_ISSUE]:["confirm"],[f.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[f.CLOSE_ISSUE]:["confirm"],[f.FILTER]:["tag","assignee","description","title","clear"],[f.SET_VIEW]:["dense","wide"],[f.SET_EDITOR]:[...Dn,"vim"],[f.TAG]:[...new Set([...Object.keys(Je),...E.getExistingTags()])],[f.ASSIGN]:E.getExistingAssignees(),[f.HELP]:[],[f.RENAME]:[],[f.NEW]:n==="TICKET"||n==="FIELD"||n==="FIELD_LIST"?["issue","swimlane","board"]:n==="SWIMLANE"?["issue","swimlane","board"]:n==="BOARD"?["issue","swimlane","board"]:["board"],[f.NONE]:m};return r?Bn()||(u={[f.NONE]:[f.HELP,f.INIT],[f.HELP]:u[f.HELP],[f.INIT]:u[f.INIT]}):u={[f.NONE]:[f.HELP,f.SET_EDITOR,f.SET_USERNAME],[f.SYNC]:u[f.SYNC],[f.HELP]:u[f.HELP],[f.SET_EDITOR]:u[f.SET_EDITOR],[f.SET_USERNAME]:u[f.SET_USERNAME]},u[e]??[]};import Rr from"chalk";import Xe from"chalk";var wr={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Qi=(e,t,r)=>Math.max(t,Math.min(r,e)),Ar=(e,t,r)=>e+(t-e)*r,On=e=>{let t=0;for(let r=0;r<e.length;r++)t=t*31+e.charCodeAt(r)>>>0;return t},Zi=(e,t,r)=>{let n=t/100,o=r/100,i=(1-Math.abs(2*o-1))*n,a=e/60,l=i*(1-Math.abs(a%2-1)),m=0,u=0,g=0;a>=0&&a<1?(m=i,u=l):a>=1&&a<2?(m=l,u=i):a>=2&&a<3?(u=i,g=l):a>=3&&a<4?(u=l,g=i):a>=4&&a<5?(m=l,g=i):(m=i,g=l);let y=o-i/2;return[Math.round((m+y)*255),Math.round((u+y)*255),Math.round((g+y)*255)]},es=([e,t,r])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${r.toString(16).padStart(2,"0")}`,ts=(e,t,r)=>[Math.round(Ar(e[0],t[0],r)),Math.round(Ar(e[1],t[1],r)),Math.round(Ar(e[2],t[2],r))],ut=e=>{let r=On(e)%360,n=Zi(r,wr.stringColor.saturation,wr.stringColor.lightness);return es(n)},rs=e=>{let t=wr.gradient.stops,r=Qi(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let n=t.length-1,o=r*n,i=Math.min(Math.floor(o),n-1),a=o-i;return ts(t[i],t[i+1],a)},Pt=e=>On(e.toLowerCase().trim())/4294967295,Un=e=>{let t=Pt(e);return rs(t)},ns=e=>{let[t,r,n]=Un(e);return{normal:o=>Xe.bgRgb(t,r,n).black(o),cursor:o=>Xe.bgRgb(t,r,n).white.bold(o)}},Tr=e=>{let[t,r,n]=Un(e);return{fg:o=>Xe.rgb(t,r,n)(o),fgCursor:o=>Xe.rgb(t,r,n).inverse(o),bg:o=>Xe.bgRgb(t,r,n).black(o),bgCursor:o=>Xe.bgRgb(t,r,n).white.bold(o)}},Mr=e=>ns(e).normal(` ${e} `),ie=(e,t=Je)=>{let n=(o=>o.toLowerCase().trim())(e);return n&&t[n]?t[n]:ut(n)};var he="<ENTER> to confirm",X=(e="",t=[])=>({message:e,validity:xe.Valid,completionWordList:t}),le=({message:e,completionWordList:t})=>({validity:xe.Invalid,message:e,completionWordList:t}),pt=e=>e.length===0,Le=({prefix:e="",wordList:t,postfix:r="",noOfHints:n=2,inputString:o,minLengthForHints:i=1})=>{let m=[...t.filter(Boolean).filter(g=>g.startsWith(o.trim()))].sort((g,y)=>Pt(g)-Pt(y)).slice(0,n).map(Mr),u=m.length>i?m.join(" "):"";return u?`${e}${u}${r}`:""},Lr=({modifier:e})=>{let t="confirm";return e===t?X(he):le({message:pt(e)?`if you are certain, enter ${Mr(t)}`:"",completionWordList:[t]})},os=({list:e,hint:t})=>({modifier:r})=>e.includes(r)?X(he):le({message:pt(r)?t:"",completionWordList:[]}),is=({list:e,hint:t,onValue:r})=>({modifier:n,inputString:o})=>e.includes(n)?o.trim().length<1?le({message:r,completionWordList:[]}):X():le({message:pt(n)?t:"",completionWordList:[]}),Pr=({hint:e})=>({modifier:t,inputString:r})=>pt(t)&&pt(r)?le({message:e,completionWordList:[]}):X(he),ss={[f.INIT]:()=>X(he),[f.FILTER]:e=>{if(e.modifier==="clear")return X();let t=a=>K(f.FILTER).includes(a);if(!e.modifier||!t(e.modifier??""))return le({message:Le({wordList:K(f.FILTER),noOfHints:100,inputString:e.inputString}),completionWordList:K(f.FILTER)});let n=Object.values(C().tags).map(a=>a.name),o=Object.values(C().contributors).map(a=>a.name),i=e.modifier==="tag"?n:e.modifier==="assignee"?o:[];return e.inputString?i.length&&!i.includes(e.inputString.trim()??"")?le({message:Le({prefix:`existing ${e.modifier}s... `,wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i}):X():le({message:Le({prefix:"one of... ",wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i})},[f.NONE]:e=>e.command?X():le({message:Le({prefix:"commands... ",wordList:K(f.NONE),noOfHints:100,inputString:e.inputString,minLengthForHints:0}),completionWordList:[]}),[f.NEW]:e=>is({list:K(f.NEW),hint:Le({wordList:K(f.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[f.SET_DESCRIPTION]:()=>X(he),[f.HELP]:()=>X(he),[f.RENAME]:()=>X(he),[f.DELETE]:e=>Lr(e),[f.CLOSE_ISSUE]:e=>Lr(e),[f.RE_OPEN_ISSUE]:e=>Lr(e),[f.MOVE]:e=>Pr({hint:Le({prefix:"hey hacker! These commands are blocked for you... ",wordList:K(f.MOVE),noOfHints:10,inputString:e.inputString})})(e),[f.TAG]:e=>{let t=E.getExistingTags().map(r=>` ${Rr.bgHex(ie(r))(" "+r+" ")} `).slice(0,10);return Pr({hint:"tag name like... "+t.join("")})(e)},[f.ASSIGN]:e=>{let t=E.getExistingAssignees().map(r=>` ${Rr.bgHex(ie(r))(" "+r+" ")} `).slice(0,10);return Pr({hint:"assign to... "+t.join("")})(e)},[f.SET_EDITOR]:e=>{logger.debug(`Validating command: ${e.command} ${e.modifier} ${e.inputString}`);let t=K(f.SET_EDITOR);return e.modifier?X(he):le({message:Le({wordList:t,noOfHints:100,inputString:e.inputString}),completionWordList:[]})},[f.SET_USERNAME]:e=>e.inputString?X():le({message:`Enter a username. Saved in ${Rr.bgBlack("~/.epiq/")}`,completionWordList:[]}),[f.SET_VIEW]:e=>os({list:K(f.SET_VIEW),hint:Le({wordList:K(f.SET_VIEW),noOfHints:3,inputString:e.inputString})})(e),[f.SYNC]:()=>X(he)},Wn=Object.fromEntries(Object.entries(ss).map(([e,t])=>[e,{validate:(r,n,o)=>t({modifier:n,command:r,inputString:o})}]));var Hn=["frontend","backend","infrastructure","architecture","integration","configuration","implementation","application","deployment","environment","framework","platform","service","component","module","gateway","pipeline","containerization","orchestrator","exception","incident","defect","regression","degradation","malfunction","instability","intermittent","reproducibility","reproduction","investigation","triage","workaround","mitigation","remediation","optimization","stabilization","refinement","failure","outage","blocking","criticality","severity","escalation","diagnostics","analysis","resolution","corruption","inconsistency","validation","verification","authorization","authentication","confidentiality","availability","accessibility","reliability","compliance","governance","encryption","decryption","integrity","auditing","traceability","accountability","protection","privileges","permissions","dependency","orchestration","provisioning","synchronization","compatibility","incompatibility","interoperability","observability","instrumentation","telemetry","loadbalancing","discovery","registration","scheduling","coordination","distribution","isolation","virtualization","serialization","deserialization","initialization","instantiation","propagation","aggregation","consolidation","normalization","standardization","transformation","reconciliation","correlation","processing","indexing","partitioning","enrichment","validation","filtering","streaming","batching","concurrency","parallelism","contention","deadlock","throttling","ratelimiting","backpressure","fragmentation","saturation","exhaustion","partitioning","replication","redundancy","failover","deprecation","obsolescence","starvation","overload","underutilization","latency","throughput","refactoring","modularization","encapsulation","abstraction","extensibility","configurability","maintainability","recoverability","sustainability","readability","testability","debuggability","reusability","simplicity","consistency","performance","functionality","requirement","recommendation","improvement","enhancement","clarification","documentation","description","acceptance","criteria","estimation","prioritization","dependency","deliverable","milestone","iteration"];var R={Init:"init",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",SetView:"set-view",SetEditor:"set-editor",SetUserName:"set-user-name",NewItem:"add-new-item",TagTicket:"ticket-tag",AssignUserToTicket:"ticket-assign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Sync:"sync"};var $n=e=>Object.values(f).includes(e),_n=(e,t)=>{let r=e.command??"",{modifier:n,target:o,inputString:i}=e,{message:a,validity:l,completionWordList:m}=Wn[r].validate(r,n,i),u=o==="command"?Object.values(f):r&&e.target==="modifier"?K(r):Hn;return{validity:l,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:a??"",autoCompletion:t?Pn(e,[...m,...u]):{hint:"",hints:[],remainder:"",overlap:0}}};var Kn=e=>{let t=e.trimStart(),r=ds(t),n=(r[0]??"").trimStart().trimEnd(),o=(r[1]??"").trimStart().trimEnd(),i=cs(e),a=$n(n)?n:null,l=a!==null,m=n!=="",u=e.endsWith(" "),g=a?K(a)??[]:[],y=a&&g.includes(o)?o:"",v="word";r.length<=1?v="command":r.length===2&&(v="modifier");let I=as(t,a,y);return{raw:e,trimmedStart:t,words:r,firstWord:n,lastWord:i,hasCommand:m,command:a,isCommandKeyword:l,isLastWordCompleted:u,modifier:y,target:v,inputToMatch:i,inputString:I}},as=(e,t,r)=>{let n=e;return t&&n.startsWith(t)&&(n=n.slice(t.length)),n=n.replace(/^\s+/,""),r&&n.startsWith(r)&&(n=n.slice(r.length),n=n.replace(/^\s+/,"")),n},ds=e=>e?e.split(/\s+/):[],cs=e=>e.trimEnd().split(/\s+/).at(-1)??"";var Vn=" ",j={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:xe.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},Dr=new Set,jn=()=>{for(let e of Dr)e()},zn=e=>(Dr.add(e),()=>Dr.delete(e)),Ce=e=>{let r=e(j),n=Kn(r.value),o=r.cursorPosition===r.value.length;j={...r,commandMeta:_n(n,o)},jn()},Dt=({message:e,result:t})=>{let r=structuredClone(j);return r.commandMeta={...r.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},r.commandIsPending=!0,j=r,jn(),c(e,null)},Fr=e=>{Ce(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},kr=e=>{Ce(t=>{let{value:r,cursorPosition:n}=t,o=n;if(e==="left"){for(;o>0&&r[o-1]===" ";)o--;for(;o>0&&r[o-1]!==" ";)o--}else{for(;o<r.length&&r[o]!==" ";)o++;for(;o<r.length&&r[o]===" ";)o++}return{...t,cursorPosition:o}})},qn=()=>{Ce(e=>{let t=e.value.slice(e.cursorPosition),r=Math.max(0,e.cursorPosition-1);return{...e,value:e.value.slice(0,r)+t,cursorPosition:r,commandIsPending:!1}})},Gn=()=>{Ce(e=>{let{value:t,cursorPosition:r}=e,n=r;for(;n>0&&t[n-1]===" ";)n--;for(;n>0&&t[n-1]!==" ";)n--;let o=t.slice(r);return{...e,value:t.slice(0,n)+o,cursorPosition:n,commandIsPending:!1}})},H=e=>{Ce(t=>{let r=Math.max(0,Math.min(t.cursorPosition,t.value.length)),n=t.value.slice(0,r),o=t.value.slice(r),i=e(n,t.commandMeta.autoCompletion),a=i+o,l=Math.max(0,Math.min(i.length,a.length));return{...t,value:a,cursorPosition:l,commandIsPending:!1}})},Jn=()=>{Ce(e=>({...e,commandIsPending:!0}))},Xn=({addToHistory:e=!0})=>{Ce(r=>({...r,commandHistory:e?[r.value,...r.commandHistory].slice(0,40):r.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),ls()},Yn=()=>{Ce(e=>{let t=Math.min(e.commandHistoryIndex+1,e.commandHistory.length-1),r=e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:r,cursorPosition:r.length}})},Qn=()=>{Ce(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),r=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:r,cursorPosition:r.length}})},ls=()=>H(()=>""),ue=()=>j,Ft=()=>{let[e,...t]=j.value.split(Vn);return t.join(Vn).trim()};var ms=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",us=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",ps=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",Zn=(e,t)=>{if(us(e,e.sequence))return"MoveCursorLeftOfWord";if(ps(e,e.sequence))return"MoveCursorRightOfWord";if(ms(e,e.sequence))return"EraseInputWord";switch(e.name){case"tab":return"autoCompleteCommand";case"up":return"getLastCommandFromHistory";case"down":return"getNextCommandFromHistory";case"left":return"MoveCursorLeft";case"right":return"MoveCursorRight";case"return":return"confirm";case"backspace":return t?"eraseInput":"exitCommandLine";case"escape":return"exitCommandLine";default:return"captureInput"}};function gs(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function fs(e,t,r){let n=C().currentNode.childNavigationAcrossParents;switch(t){case"up":return e==="vertical"?r.prevItem:n?r.prevContainer:null;case"down":return e==="vertical"?r.nextItem:n?r.nextContainer:null;case"left":return e==="horizontal"?r.prevItem:n?r.prevContainer:null;case"right":return e==="horizontal"?r.nextItem:n?r.nextContainer:null}}function eo(e,t){let r=ue();if(e.sequence===":"&&r.value==="")return"initCommandLine";if(t===p.MOVE)switch(e.name){case"m":case"return":return"confirmMove"}if(t===p.COMMAND_LINE)return Zn(e,r.value);let n=gs(e);if(n){let o=t===p.MOVE?{prevItem:"movePreviousItem",nextItem:"moveNextItem",prevContainer:"moveToPreviousContainer",nextContainer:"moveToNextContainer"}:{prevItem:"navPreviousItem",nextItem:"navNextItem",prevContainer:"navToPreviousContainer",nextContainer:"navToNextContainer"};return fs(C().currentNode.childRenderAxis,n,o)}if(e.ctrl&&e.name==="c")return"exit";switch(e.name){case"e":return"edit";case"n":return"addItem";case"m":return"initMove";case"d":return"Delete";case"return":return"confirm";case"space":return"confirm";case"v":return C().viewMode==="wide"?"SetViewDense":"SetViewWide";case"q":case"escape":return"exit";case"s":return"sync";default:return null}}var to=e=>{let{context:t}=C()?.currentNode;if(!t)return R.None;switch(e){case f.INIT:return R.Init;case f.DELETE:return R.Delete;case f.SET_DESCRIPTION:return R.Edit;case f.HELP:return R.ViewHelp;case f.RE_OPEN_ISSUE:return R.ReopenIssue;case f.CLOSE_ISSUE:return R.CloseIssue;case f.TAG:return R.TagTicket;case f.ASSIGN:return R.AssignUserToTicket;case f.RENAME:return R.Rename;case f.NEW:return R.NewItem;case f.FILTER:return R.Filter;case f.MOVE:return R.Move;case f.SET_USERNAME:return R.SetUserName;case f.SET_EDITOR:return R.SetEditor;case f.SET_VIEW:return R.SetView;case f.SYNC:return R.Sync;default:return R.None}};import{ulid as $}from"ulid";import{spawnSync as bs}from"node:child_process";import Is from"node:os";import io from"node:path";import{ulid as Ss}from"ulid";import{accessSync as ys,copyFileSync as xs,existsSync as kt,mkdirSync as ro,readdirSync as no,readFileSync as vs,renameSync as hs,rmSync as Cs,statSync as oo,unlinkSync as Ns,writeFileSync as Es}from"node:fs";import Ye from"node:path";var re={writeToFile:(e,t)=>{try{let r=Ye.dirname(e);kt(r)||ro(r,{recursive:!0});let n=typeof t=="string"?t:JSON.stringify(t,null,2);Es(e,n,"utf-8")}catch(r){logger.error(`Failed to write file at ${e}:`,r)}},readFile:e=>{try{return vs(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=re.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 kt(e)&&oo(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await ys(e),!0}catch{return!1}},mkDir:e=>ro(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:r}=Ye.parse(t);for(;;){let n=Ye.join(t,e);try{if(kt(n)&&oo(n).isDirectory())return n}catch{logger.error(`Unable to locate folder ${e}`)}if(t===r)break;t=Ye.dirname(t)}return null},readFirstJSON(e){try{if(!re.dirExists(e))return null;let t=no(e).filter(n=>n.endsWith(".json")).sort()[0];if(!t)return null;let r=Ye.join(e,t);return re.readFileJSON(r)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return re.dirExists(e)?no(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{Ns(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Cs(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,r){if(this.mkDir(Ye.dirname(t)),!r?.overwrite&&kt(t))throw new Error(`moveFile: destination exists: ${t}`);r?.overwrite&&this.rmFile(t);try{hs(e,t)}catch(n){if(n?.code==="EXDEV"){xs(e,t),this.rmFile(e);return}throw n}}};function As(){let{preferredEditor:e}=ce(),t=[e,process.env.VISUAL,process.env.EDITOR,"vim","vi","nano"].filter(r=>!!r?.trim());return[...new Set(t)]}function ws(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function so(e){let t=io.join(Is.tmpdir(),"epiq");re.mkDir(t);let r=io.join(t,Ss());re.writeToFile(r,e??"");let n=As();for(let o of n){let i=ws(o,r),a=bs(i,{stdio:"inherit",shell:!0});if(!a.error&&a.status===0){let l=re.readFile(r);if(l==null)return s("Unable to read edited file");let m=l.replace(/\r?\n$/,"");return c("Successfully edited",m)}}return s("Unable to open editor")}import{monotonicFactory as Ts,ulid as Bt}from"ulid";var Ot=Ts(),ao=({name:e,parent:t,userId:r,userName:n})=>{let o=Ot(),i=Ot(),a=Ot(),l=Ot();return[{id:Bt(),userId:r,userName:n,action:"add.issue",payload:{id:o,parent:t,name:e}},{id:Bt(),userId:r,userName:n,action:"add.field",payload:{id:i,parent:o,name:"Description",val:""}},{id:Bt(),userId:r,userName:n,action:"add.field",payload:{id:a,parent:o,name:"Assignees"}},{id:Bt(),userId:r,userName:n,action:"add.field",payload:{id:l,parent:o,name:"Tags"}}]};var co=e=>{let t=e.log??[];for(let r=t.length-1;r>=0;r--){let n=t[r];if(n&&n.action==="close.issue"&&n.payload.id===e.id)return n.payload.parent}return null};var Ms=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[Qe,Ut]=Ms;var P=(e,t)=>s(`${t.split(".").join(" ")+" failed, "+e.toLowerCase()}`),Rs={"init.workspace":({action:e,payload:t})=>{let{id:r,name:n}=t,o=J.workspace(r,n);lo(o);let i=E.createNodeAtPosition(o);return d(i)?P(i.message??"Failed to initialize workspace",e):c("Workspace initialized",{action:e,result:i.data})},"add.workspace":({action:e,payload:t})=>{let{id:r,name:n}=t,o=J.workspace(r,n),i=E.createNodeAtPosition(o);return d(i)?P(i.message??"Failed to add workspace",e):c("Added workspace",{action:e,result:i.data})},"add.board":({action:e,payload:t})=>{let{id:r,name:n,parent:o}=t,i=E.createNodeAtPosition(J.board(r,n,o));return d(i)?P(i.message??"Unable to create board",e):c("Added board",{action:e,result:i.data})},"add.swimlane":({action:e,payload:t})=>{let{id:r,name:n,parent:o}=t,i=E.createNodeAtPosition(J.swimlane(r,n,o));return d(i)?P(i.message??"Unable to create swimlane",e):c("Added swimlane",{action:e,result:i.data})},"add.issue":({action:e,payload:t})=>{let{id:r,name:n,parent:o}=t,i=E.createNodeAtPosition(J.ticket(r,n,o));return d(i)?P(i.message??"Unable to create issue",e):c("Added issue",{action:e,result:i.data})},"add.field":({action:e,payload:t})=>{let{id:r,name:n,parent:o,val:i}=t,a=E.createNodeAtPosition(J.field(r,n,o,{value:i},n.includes("Description")?"vertical":"horizontal"));return d(a)?P(a.message??`Unable to create field: ${n}`,e):c("Added field",{action:e,result:a.data})},"edit.title":({action:e,payload:t})=>{let{id:r,name:n}=t;if(!E.getNode(r))return P("Unable to locate node",e);let i=E.renameNode(r,n);return d(i)?P(i.message??"Unable to edit title",e):c("Edited title",{action:e,result:i.data})},"delete.node":({action:e,payload:t})=>{let{id:r}=t,n=E.tombstoneNode(r);return d(n)?P(n.message??"Unable to delete node",e):c("Deleted node",{action:e,result:n.data})},"create.tag":({action:e,payload:t})=>{let{id:r,name:n}=t,o=E.createTag({id:r,name:n});return d(o)?P(o.message??"Unable to create tag",e):c("Tag added",{action:e,result:o.data})},"create.contributor":({action:e,payload:t})=>{let{id:r,name:n}=t,o=E.createContributor({id:r,name:n});return d(o)?P(o.message??"Unable to create contributor",e):c("Contributor created",{action:e,result:o.data})},"tag.issue":({action:e,payload:t})=>{let{id:r,target:n,tagId:o}=t,i=E.tag(n,o,r);return d(i)?P(i.message??"Unable to tag issue",e):c("Issue tagged",{action:e,result:i.data})},"assign.issue":({action:e,payload:t})=>{let{id:r,contributor:n,target:o}=t,i=E.assign(o,n,r);return d(i)?P(i.message??"Unable to assign issue",e):c("Assigned successfully",{action:e,result:i.data})},"move.node":({action:e,payload:t})=>{let{id:r,parent:n,pos:o}=t,i=E.moveNode({id:r,parentId:n,position:o});return d(i)?P(i.message??"Failed to move node",e):c("Moved node",{action:e,result:i.data})},"edit.description":({action:e,payload:t})=>{let{id:r,md:n}=t,o=E.editValue(r,n);return d(o)?P(o.message??"Unable to edit description",e):c("Set node value",{action:e,result:o.data})},"close.issue":({action:e,payload:t})=>{let{id:r}=t,n=E.getNode(r);if(!n)return P("Unable to locate issue",e);if(!$e(n))return P("Can only close issues",e);let o=E.getNode(Qe);if(!o)return P("Unable to locate target swimlane",e);if(o.id===n.parentNodeId)return P("Cannot close closed issue",e);let a=E.moveNode({id:r,parentId:o.id});return d(a)?P(a.message??"Unable to close issue",e):c("Issue closed",{action:e,result:a.data})},"reopen.issue":({action:e,payload:t})=>{let{id:r}=t,n=E.getNode(r);if(!n)return P("Unable to locate issue",e);if(!$e(n))return P("Can only reopen issues",e);let o=E.getNode(Qe);if(!o)return P("Unable to locate closed swimlane",e);if(!(n.parentNodeId===o.id))return P("Issue is not closed",e);let a=co(n);if(!a)return P("Unable to resolve previous parent from issue history",e);if(a===o.id)return P("Previous parent resolves to closed swimlane",e);if(!E.getNode(a))return P("Previous parent no longer exists",e);let m=E.moveNode({id:r,parentId:a});return d(m)?P(m.message??"Unable to reopen issue",e):c("Issue reopened",{action:e,result:m.data})},"lock.node":({action:e,payload:t})=>{let{id:r}=t,n=E.lockNode(r);return d(n)?P(n.message??"Unable to lock node",e):c("Node locked",{action:e,result:n.data})}},Ls=(e,t)=>{let r=E.getNode(e);r&&E.updateNode({...r,log:[...r.log??[],t]})},Ps=e=>{switch(e.action){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"delete.node":case"move.node":case"close.issue":case"reopen.issue":return[e.payload.id];case"edit.description":let t=[e.payload.id],r=C().nodes[e.payload.id]?.parentNodeId;return r&&t.push(r),t;case"tag.issue":case"assign.issue":return[e.payload.id,e.payload.target];case"create.tag":case"create.contributor":default:return[]}};function Ze(e,t=!1){let r=Rs[e.action],n=r(e);if(d(n))return n;if(!t){let a=[...new Set(Ps(e))];for(let l of a)Ls(l,e)}let o=e.userId,i=e.userName;return!o?.length||!i?.length?P("Invalid user ID format",e.action):(E.createContributor({name:i,id:o}),n)}var gt=e=>e.map(t=>Ze(t));import Vt from"node:fs";import _e from"node:path";import{decodeTime as Ks,monotonicFactory as Vs}from"ulid";import{z as ft}from"zod";var Wt=process.env.IS_EPIQ_TESTING==="true",pe=()=>".epiq";import Ht from"node:fs";import $t from"node:path";import{z as Or}from"zod";var Ds=pe(),Fs="events",ks=Or.object({userId:Or.string().min(1).default("unknown"),userName:Or.string().min(1).default("unknown")}),Bs=(e=process.cwd())=>$t.join(et(e),Ds,Fs),Os=e=>{let[t,r]=$t.basename(e,".jsonl").split("."),n=ks.safeParse({userId:t,userName:r});return n.success?c("Parsed event file actor",n.data):s(`Invalid event file name ${$t.basename(e)}: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},Us=e=>{let t=Object.keys(e).filter(r=>r!=="id"&&r!=="v");return t.length!==1?s(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?s("Invalid persisted event: action key is missing or invalid"):c("Resolved persisted action",t[0])},Ws=(e,t)=>t in e,Hs=({id:e,action:t,payload:r,userId:n,userName:o})=>({id:e,action:t,payload:r,userId:n,userName:o}),$s=e=>{let{userId:t,userName:r,...n}=e,o=Us(n);if(d(o))return s(o.message);let i=o.data,a=e.id?.[0];return a?Ws(n,i)?c("Decoded persisted event",Hs({id:a,action:i,payload:n[i],userId:t,userName:r})):s(`Persisted event is missing payload for action: ${i}`):s("Persisted event is missing id")},_t=e=>{if(!Ht.existsSync(e))return c("Event file missing",[]);let t=Os(e);if(d(t))return s(t.message);let r=Ht.readFileSync(e,"utf8"),n=[];for(let o of r.split(`
3
- `)){let i=o.trim();if(!i)continue;let a;try{a=JSON.parse(i)}catch{return s(`Failed to parse event JSON from ${e}: ${i}`)}let l=Ur(a);if(d(l))return s(`${l.message} in ${e}: ${i}`);n.push({...l.data,userId:t.data.userId,userName:t.data.userName})}return c("Parsed persisted events file",n)};function mo(e=process.cwd()){let t=Bs(e);if(!Ht.existsSync(t))return s("No events found");let r=Ht.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>$t.join(t,o)),n=[];for(let o of r){let i=_t(o);if(d(i))return s(i.message);n.push(...i.data)}return c("All events loaded",_s(n))}function Kt(e=process.cwd()){let t=mo(e);if(d(t))return s(t.message);let r=[];for(let n of t.data){let o=$s(n);if(d(o))return s(`Failed to decode event ${n.id?.[0]??"<unknown>"}: ${o.message}`);r.push(o.data)}return c("Loaded merged events",r)}function uo(e=process.cwd()){let t=mo(e);return d(t)?s(t.message):c("Loaded edge reference",t.data.at(-1)?.id?.[0]??null)}var _s=e=>{let t=new Map(e.map(l=>[l.id[0],l])),r=new Map;for(let l of e){let m=l.id[1],u=r.get(m)??[];u.push(l),r.set(m,u)}for(let l of r.values())l.sort((m,u)=>{let[g]=m.id,[y]=u.id;return g.localeCompare(y)});let n=[],o=new Set,i=l=>{let m=r.get(l)??[];for(let u of m){let[g]=u.id;o.has(g)||(o.add(g),n.push(u),i(g))}};i(null);let a=[...e].filter(l=>{let[m]=l.id;return!o.has(m)}).sort((l,m)=>{let[u,g]=l.id,[y,v]=m.id,I=g===null||t.has(g),S=v===null||t.has(v);if(I&&!S)return-1;if(!I&&S)return 1;let N=(g??"").localeCompare(v??"");return N!==0?N:u.localeCompare(y)});return[...n,...a]};var po=e=>({action:e.action,payload:e.payload});var yo=1,go=Vs(),js="events",zs=ft.tuple([ft.string().min(1),ft.string().min(1).nullable()]),qs=ft.looseObject({v:ft.literal(yo),id:zs}),Ur=e=>{let t=qs.safeParse(e);return t.success?c("Parsed persisted event",t.data):s(`Invalid persisted event: ${t.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},fo=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",Y=()=>{let{userName:e,userId:t}=ce();return e?t?e.trim()?c("Successfully resolved actor ID",{userId:fo(t),userName:fo(e)}):s("Unable to resolve actor ID from settings or OS user info"):s("User ID not configured"):s("User name not configured")},Gs=e=>Vt.existsSync(_e.join(e,pe()))&&Vt.statSync(_e.join(e,pe())).isDirectory(),et=(e=process.cwd())=>{let t=_e.resolve(e);for(;;){if(Gs(t))return t;let r=_e.dirname(t);if(r===t)return _e.resolve(e);t=r}},xo=(e=process.cwd())=>_e.join(et(e),pe(),js),Wr=()=>{let e=Y();return d(e)||!e.data?s("Unable to resolve event log path"):c("Succeeded",`${e.data.userId}.${e.data.userName}.jsonl`)},Js=(e=process.cwd())=>{let t=Wr();if(d(t))return s("Unable to resolve file name");let r=t.data;return/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r)?c("Successfully resolved event log path",_e.join(xo(e),r)):s(`Invalid event log file name: ${r}`)},Xs=(e,t)=>{let r={[e.action]:e.payload,v:yo,id:t};return Ur(r)};function vo(e,t=process.cwd()){try{let r=et(t),n=xo(r),o=Js(r);if(d(o))return o;Vt.mkdirSync(n,{recursive:!0});let i=uo(r);if(d(i))return s(i.message);let a;if(i.data){let m=Ks(i.data),u=Math.max(Date.now(),m+1);a=go(u)}else a=go();let l=Xs(po(e),[a,i.data]);return d(l)?s(l.message):(Vt.appendFileSync(o.data,`${JSON.stringify(l.data)}
4
- `,"utf8"),c("Event persisted",{path:o.data,entry:l.data}))}catch(r){let n=r instanceof Error?r.message:"Unknown persist error";return s(`Failed to persist event: ${n}`)}}function Q(e){let t=Ze(e);if(t.result!==ve.Success)return t;let r=vo(e);return d(r)?r:t}function jt(e){return e.map(t=>Q(t))}import{ulid as ho}from"ulid";var tt=null,Pe=()=>structuredClone(tt),rt=e=>tt=e,Co=()=>{let{currentNode:e,selectedIndex:t}=C(),n=T(e.id)[t];return n?c("Resolved selected child",n):s("Target node not found")};function Hr(e){let t=Co();if(d(t))return t;let{currentNode:r,nodes:n}=C();if(!r.parentNodeId)return s("Missing parent node id");let o=n[r.parentNodeId];if(!o)return s("Missing parent node");let i=W(o.id),a=i.findIndex(({id:v})=>v===r.id);if(a<0)return s("Current node not found among siblings");let l=i[a+e];if(!l)return s("Missing sibling node");let m=Y();if(d(m))return s("Unable to resolve user ID");let{userId:u,userName:g}=m.data;if(rt({id:ho(),userId:u,userName:g,action:"move.node",payload:{id:t.data.id,parent:l.id,pos:{at:"end"}}}),!tt)return s("Could not materialize move state");let y=Ze(tt,!0);return d(y)?y:c("Node moved successfully",y.data)}function $r(e){let t=Co();if(d(t))return t;let{currentNode:r,selectedIndex:n}=C(),i=W(r.id)[n+e];if(!i)return s("Missing sibling node");let a=Y();if(d(a))return s("Unable to resolve user ID");let{userId:l,userName:m}=a.data;if(rt({id:ho(),userId:l,userName:m,action:"move.node",payload:{id:t.data.id,parent:r.id,pos:{at:e===1?"after":"before",sibling:i.id}}}),!tt)return s("Could not materialize move state");let u=Ze(tt,!0);return d(u)?u:c("Node moved successfully",u.data)}import Ys from"node:os";import No from"node:path";import{z as zt}from"zod";var Qs={userId:"",userName:"",preferredEditor:""},Eo=zt.object({preferredEditor:zt.string().optional(),userName:zt.string().optional(),userId:zt.string().optional()}).strict(),Zs=".epiq",ea="config.json",bo=()=>No.join(Ys.homedir(),Zs),_r=()=>No.join(bo(),ea),Kr=()=>{try{return re.mkDir(bo()),c("Ensured ~/.epiq exists",null)}catch{return s("Unable to create ~/.epiq")}},ta=e=>{let t;try{t=JSON.parse(e)}catch{return s("Invalid ~/.epiq/config.json JSON")}let r=Eo.safeParse(t??{});return r.success?c("Parsed config",r.data):s(`Invalid ~/.epiq/config.json shape: ${r.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},Io=()=>{let e=Kr();if(d(e))return s(e.message);let t=_r(),r=re.readFile(t);return r==null||r.trim()===""?c("No config found, using empty config",{}):ta(r)},So=e=>{let t=Kr();if(d(t))return s(t.message);let r=Eo.safeParse(e);if(!r.success)return s(`Invalid config: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let n=_r();try{return re.writeToFile(n,JSON.stringify(r.data,null,2)+`
5
- `),c("Config written",null)}catch{return s("Unable to write ~/.epiq/config.json")}},Vr=e=>{let t=Io();if(d(t))return s("Failed to read existing config");let r={...t.data,...e};return So(r)},Ao=()=>{let e=_r(),t=Kr();if(d(t))throw new Error("Unable to create ~/.epiq");if(!(re.readFile(e)!==null)){let l=So(Qs);if(d(l))throw new Error("Unable to create ~/.epiq/config.json")}let n=Io();if(d(n))throw new Error(n.message||"Unable to load settings");let{preferredEditor:o,userName:i,userId:a}=n.data;return!i||!a?s("User name or ID not configured in ~/.epiq/config.json"):mt({preferredEditor:o,userName:i,userId:a})};var nt=(e,t)=>{let r=e.find(n=>n.context===t);return r!==void 0?c("Found node",r):s("Unable to find node in breadcrumb")};import Aa from"fs";import{spawn as To}from"node:child_process";import qt from"node:fs";import De from"node:path";var yt=(e,t)=>{let r=new Map,n=t??((...i)=>JSON.stringify(i)),o=((...i)=>{let a=n(...i);if(!r.has(a)){let l=e(...i).then(m=>(d(m)&&r.delete(a),m));r.set(a,l)}return r.get(a)});return o.clear=()=>r.clear(),o};var k=({args:e,cwd:t})=>new Promise(r=>{if(!qt.existsSync(t))return r(s(`Git cwd does not exist: ${t}`));let n=To("git",e,{cwd:t,stdio:["ignore","pipe","pipe"]}),o="",i="";n.stdout.setEncoding("utf8"),n.stderr.setEncoding("utf8"),n.stdout.on("data",a=>{o+=a}),n.stderr.on("data",a=>{i+=a}),n.on("error",a=>{r(s([`git ${e.join(" ")}`,`cwd=${t}`,a.message].join(`
6
- `)))}),n.on("close",a=>{let l=a??1;if(l!==0){r(s([`git ${e.join(" ")}`,i.trim()||o.trim()||"Git command failed"].filter(Boolean).join(`
7
- `)));return}r(c("Git command succeeded",{stdout:o,stderr:i,exitCode:l}))})}),Ke=({args:e,cwd:t})=>new Promise(r=>{if(!qt.existsSync(t))return r({stdout:"",stderr:`Git cwd does not exist: ${t}`,exitCode:1});let n=To("git",e,{cwd:t,stdio:["ignore","pipe","pipe"]}),o="",i="";n.stdout.setEncoding("utf8"),n.stderr.setEncoding("utf8"),n.stdout.on("data",a=>{o+=a}),n.stderr.on("data",a=>{i+=a}),n.on("error",a=>{r({stdout:o,stderr:a.message,exitCode:1})}),n.on("close",a=>{r({stdout:o,stderr:i,exitCode:a??1})})}),jr=yt(async(e=process.cwd())=>{let t=await k({args:["rev-parse","--show-toplevel"],cwd:e});return d(t)?s("Not inside a Git repository"):t.data?c("Resolved repo root",t.data.stdout.trim()):s("Git command returned no repo root")},e=>De.resolve(e)),ra=yt(async e=>{let t=await k({args:["rev-parse","--git-dir"],cwd:e});if(d(t))return s(t.message);if(!t.data)return s("Git command returned no git dir");let r=t.data.stdout.trim(),n=De.isAbsolute(r)?r:De.join(e,r);return c("Resolved git dir",n)},e=>De.resolve(e)),Mo=async({cwd:e,message:t})=>{let r=await k({args:["commit","-m",t],cwd:e});if(d(r))return s(`Failed to create commit
8
- ${r.message}`);let n=await k({args:["rev-parse","HEAD"],cwd:e});return d(n)?s(`Commit created, but failed to read HEAD SHA
9
- ${n.message}`):c("Created commit and resolved SHA",n.data.stdout.trim())},xt=async e=>{let t=await ra(e);if(d(t))return s(t.message);if(!t.data)return s("Git dir result missing data");let r=t.data,o=["MERGE_HEAD","CHERRY_PICK_HEAD","REVERT_HEAD","REBASE_HEAD",De.join("rebase-merge"),De.join("rebase-apply")].filter(i=>qt.existsSync(De.join(r,i)));return c("Checked for in-progress Git operation",o.length>0)},Gt=async({repoRoot:e,remote:t})=>{let r=await Ke({args:["remote","get-url",t],cwd:e});return c("Checked remote",r.exitCode===0)},Jt=async({repoRoot:e,remote:t,branch:r})=>{let n=await Ke({args:["ls-remote","--heads",t,r],cwd:e});return n.exitCode!==0?s(n.stderr.trim()||`Unable to inspect remote branch ${t}/${r}`):c("Checked remote branch",n.stdout.trim().length>0)},Ro=async({repoRoot:e,branch:t})=>{let r=await Ke({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return r.exitCode===0?c("Local branch exists",!0):r.exitCode===1?c("Local branch missing",!1):s(r.stderr.trim()||`Unable to inspect branch ${t}`)},wo=e=>{try{return qt.realpathSync.native(e)}catch{return De.resolve(e)}},zr=async({repoRoot:e,worktreeRoot:t})=>{let r=await k({args:["worktree","list","--porcelain"],cwd:e});if(d(r))return s(r.message);if(!r.data)return s("Git command returned no worktree data");let n=wo(t),o=r.data.stdout.split(`
10
- `).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(wo).includes(n);return c("Checked worktree registration",o)},qr=async e=>{let t=await Ke({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return c("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},Xt=async e=>{let t=await k({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return d(t)?s(t.message):t.data?c("Resolved current branch",t.data.stdout.trim()):s("Git command returned no branch name")},Lo=async e=>{let t=await k({args:["rev-parse","--short","HEAD"],cwd:e});return d(t)?s(t.message):t.data?c("Resolved short HEAD sha",t.data.stdout.trim()):s("Git command returned no short sha")},Po=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),Yt=async({cwd:e,remote:t,branch:r})=>{let n=await qr(e);if(d(n))return s(n.message);if(!n.data)return c("No upstream configured, skipped pull",!1);let o=await Jt({repoRoot:e,remote:t,branch:r});if(d(o))return s(o.message);if(!o.data)return c("Remote branch missing, skipped pull",!1);let i=await k({args:["fetch",t,r],cwd:e});if(d(i))return s(`Failed to fetch ${r}
11
- ${i.message}`);if(!i.data)return s("Git command returned no fetch result data");let a=await k({args:["pull","--rebase"],cwd:e});return d(a)?s(`Failed during pull --rebase
12
- ${a.message}`):a.data?c("Pulled with rebase",!0):s("Git command returned no pull result data")},Do=async e=>{let t=await Xt(e);return d(t)?s(t.message):c("Checked detached HEAD state",t.data==="HEAD")};import{createHash as la}from"node:crypto";import Fe from"node:fs";import ma from"node:os";import se from"node:path";import vt from"fs";import ko from"path";import na from"util";var Fo=1e3,Bo=(e=process.cwd())=>ko.join(et(e),pe(),"log","epiq.log");function oa(e=process.cwd()){if(!Wt)return;let t=Bo(e);if(!vt.existsSync(t))return;let n=vt.readFileSync(t,"utf8").split(`
13
- `);if(n[n.length-1]===""&&n.pop(),n.length<=Fo)return;let o=n.slice(-Fo).join(`
2
+ import{render as Sc}from"ink";import wc from"meow";import rs from"react";import uc from"chalk";import{Box as fe,Text as He}from"ink";import O from"react";import dt from"chalk";import{monotonicFactory as ld,ulid as Se}from"ulid";import{useSyncExternalStore as ad}from"react";var P={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function $e(e){return e.context==="TICKET"}var kr=e=>e.context==="SWIMLANE";var f={INIT:"init",HELP:"help",NEW:"new",TAG:"tag",MOVE:"move",PEEK:"peek",FILTER:"filter",ASSIGN:"assign",DELETE:"delete",RENAME:"rename",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",SET_DESCRIPTION:"edit",SET_EDITOR:"set:editor",SET_VIEW:"set:view",SET_USERNAME:"set:username",SYNC:"sync",NONE:""},Ne={None:"none",Invalid:"invalid",Valid:"valid"},ye={None:"none",Success:"success",Fail:"fail"},s=e=>({result:ye.Fail,message:e,data:null}),l=(e,t)=>({result:ye.Success,message:e,data:t}),Or=()=>({result:ye.None,message:"No result",data:null}),d=e=>e.result==="fail",De=e=>e.result==="success";var y={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line"};function Pt(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var Dt=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",Br=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var Ur=e=>{let t=new Map;for(let n of e)for(let r=1;r<=n.length;r++){let o=n.slice(0,r),i=t.get(o);i?i.push(n):t.set(o,[n])}return t},Wr=(e,t)=>t?e.get(t)??[]:[];var Hr=new WeakMap,ds=e=>{let t=Hr.get(e);return t||(t=Ur(e),Hr.set(e,t)),t};var _r=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return Wr(ds(e),r).filter(i=>Pt(r,i)>=n)};var $r=({inputToMatch:e,lastWord:t},n)=>{if(t.endsWith(" "))return{hint:"",hints:[],overlap:0,remainder:""};let r=_r({wordList:n,inputToMatch:e,overlapThreshold:1});return cs(t,r)},cs=(e,t)=>{let n=t[0]??"",r=Pt(e.toLowerCase(),n.toLowerCase()),o=n?n+" ":"",i=o.slice(r);return{hint:o,hints:t,overlap:r,remainder:i}};var Kr=["vi","vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];var Je=24n,ls=Je*4n,Ft=(1n<<ls)-1n,ms=/^[0-9a-f]+$/;function Vr(e){if(!e||!ms.test(e))throw new Error(`Invalid hex rank: ${e}`);return BigInt("0x"+e)}function kt(e,t=Je){if(e<0n)throw new Error("Negative rank not allowed");return e.toString(16).padStart(Number(t),"0")}function pt(e,t){if(!e&&!t)return kt(Ft/2n,Je);let n=e?Vr(e):0n,r=t?Vr(t):Ft;if(r<=n)return kt(Ft/2n,Je);let o=(n+r)/2n;return o===n||o===r?"":kt(o,Je)}function ue(){return kt(Ft/2n,Je)}var ee={workspace:(e,t)=>({id:e,title:t,rank:ue(),isDeleted:!1,props:{},context:P.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,r=!1)=>({id:e,title:t,rank:ue(),isDeleted:!1,props:{},context:P.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:r,log:[]}),swimlane:(e,t,n)=>({id:e,title:t,rank:ue(),isDeleted:!1,props:{},context:P.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:(e,t,n,r={},o="horizontal")=>({id:e,title:t,rank:ue(),isDeleted:!1,props:r,context:P.FIELD,childRenderAxis:o,parentNodeId:n,readonly:!1,log:[]}),ticket:(e,t,n)=>({id:e,title:t,rank:ue(),isDeleted:!1,props:{},context:P.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,props:r={},readonly:o=!0})=>({id:e,title:t,rank:ue(),isDeleted:!1,props:r,context:P.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:o,log:[]})};var _=e=>Object.values(E().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),jr=(e,t)=>e.findIndex(n=>n.id===t),Ln=(e,t={at:"end"})=>{if(e.length===0)return l("Resolved rank",ue());switch(t.at){case"start":{let n=e[0];return n?l("Resolved rank",pt(void 0,n.rank)):s("Unable to resolve first sibling")}case"end":{let n=e[e.length-1];return n?l("Resolved rank",pt(n.rank,void 0)):s("Unable to resolve last sibling")}case"before":{let n=jr(e,t.sibling);if(n<0)return s("Sibling not found");let r=n>0?e[n-1]:void 0,o=e[n];return o?l("Resolved rank",pt(r?.rank,o.rank)):s("Sibling not found")}case"after":{let n=jr(e,t.sibling);if(n<0)return s("Sibling not found");let r=e[n],o=n<e.length-1?e[n+1]:void 0;return r?l("Resolved rank",pt(r.rank,o?.rank)):s("Sibling not found")}}};var Xe=(e,t)=>{let{nodes:n}=E(),r=n[e];if(!r)return s("Node not found");if(r.context===t)return l("Resolved ancestor node",r);let o=r.parentNodeId?n[r.parentNodeId]:void 0;for(;o;){if(o.context===t)return l("Resolved ancestor node",o);o=o.parentNodeId?n[o.parentNodeId]:void 0}return s(`No ancestor found for context: ${t}`)},Dn=(e,t)=>{let{nodes:n}=E(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},Pn=(e,t)=>e?e.readonly?s({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node"}[t]):null:s("Node not found"),b={deleteNode(e){ae(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},editValue(e,t){let{nodes:n}=E(),r=n[e];if(!r)return s("Edit target node not found");let o=Pn(r,"edit");if(o)return o;let i={...r,props:{...r.props,value:t}};return b.updateNode(i),l("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return s("Rename target node not found");let r=Pn(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),l("Renamed node",o)},getExistingTags(){let{tags:e}=E();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=E();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return _(e).find(n=>n.title===t)},moveNode({id:e,parentId:t,position:n={at:"end"}}){let{rootNodeId:r}=E(),o=this.getNode(e),i=this.getNode(t);if(!o)return s("Node not found");if(!i)return s("Target parent not found");if(r===e)return s("Cannot move root node");if(e===t)return s("Cannot move node into itself");let a=Pn(o,"move");if(a)return a;if(Dn(t,e))return s("Cannot move node into its own descendant");let m=_(t).filter(p=>p.id!==e),c=Ln(m,n);if(d(c))return c;let u={...o,parentNodeId:t,rank:c.data};return this.updateNode(u),l("Moved node successfully",u)},tombstoneNode(e){let{nodes:t,currentNodeId:n,rootNodeId:r}=E(),o=this.getNode(e);if(!o)return s("Node not found");if(r===e)return s("Cannot delete root node");let i=new Set,a=c=>{let u=t[c];if(!(!u||i.has(c))){i.add(c);for(let p of _(u.id))a(p.id)}};a(e);let m={...structuredClone(t)};for(let c of i){if(!m[c])return s("Unable to locate node to delete");m[c]={...m[c],isDeleted:!0}}return n?(T({nodes:m}),l("Successfully tomb stoned",o)):s("Unable to delete undefined")},createContributor(e){let t=ae(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return d(t)?s("Unable to create contributor"):l("Created contributor",e)},assign(e,t,n){let r=b.getContributor(t),o=b.getNode(e);if(!o||!r)return s("Unable assign contributor to issue");let i=this.getFieldByTitle(o.id,"Assignees");if(!i)return s("Unable to locate assignees field");if(_(i.id).some(c=>c.props?.value===t))return s("Contributor already assigned");let m=this.createNodeAtPosition(ee.field(n,r.name,i.id,{value:t}));return d(m)?m:l("Assigned contributor",m.data)},createTag(e){let t=ae(n=>({...n,tags:{...n.tags,[e.id]:e}}));return d(t)?s("Could not create tag"):l("Tag created",e)},tag(e,t,n){let r=b.getTag(t),o=b.getNode(e);if(!r)return s("Unable to add tag, missing tag");if(!o)return s("Unable to add tag, missing target");let i=this.getFieldByTitle(o.id,"Tags");if(!i)return s("Unable to locate tags field");if(_(i.id).some(c=>c.props?.value===t))return s("Tag already assigned");let m=this.createNodeAtPosition(ee.field(n,r.name,i.id,{value:t}));return d(m)?m:l("Tag added",m.data)},createNodeAtPosition(e,t={at:"end"}){if(!e.parentNodeId){let i={...e,rank:ue()};return this.createNode(i),l("Created node",i)}let n=_(e.parentNodeId),r=Ln(n,t);if(d(r))return r;let o={...e,rank:r.data};return this.createNode(o),l("Created node",o)},createNode(e){let t=ae(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(t)?s("Unable to create node"):l("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return s("Failed to locate node");let n={...t,readonly:!0},r=ae(o=>({...o,nodes:{...o.nodes,[e]:n}}));return d(r)?s(r.message):l("Locked node",n)},updateNode(e){let t=ae(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(t)?t:l("Updated node",e)},getContributor(e){return E().contributors[e]},getTag(e){return E().tags[e]},getNode(e){return E().nodes[e]},getSiblings:e=>Object.values(E().nodes).filter(t=>!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank))};var Ot={preferredEditor:null,userName:null,userId:null},pe=()=>Ot,gt=e=>(Ot={...Ot,...e},Ot);var Bt=()=>{let e=pe(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim();return{isSetup:n&&t,hasPreferredEditor:n,hasUserName:t,userName:e.userName,preferredEditor:e.preferredEditor}},zr=()=>!Ke();var G={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#2a2f45",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},C={accent:G.cyan,accent2:G.magenta,primary:G.white,secondary:G.grayDark,secondary2:G.grayLight,gray:G.gray,green:G.green,yellow:G.yellow,red:G.red};var h={red:G.red,yellow:G.yellow,green:G.green,blue:G.blue,magenta:G.magenta,cyan:G.cyan},Qe={urgent:h.red,critical:h.red,important:h.red,blocker:h.red,asap:h.red,immediate:h.red,fail:h.red,failure:h.red,broken:h.red,bug:h.red,error:h.red,incident:h.red,outage:h.red,production:h.red,crash:h.red,security:h.red,warning:h.yellow,warn:h.yellow,risky:h.yellow,risk:h.yellow,attention:h.yellow,pending:h.yellow,review:h.yellow,"needs-review":h.yellow,qa:h.yellow,testing:h.yellow,test:h.yellow,validate:h.yellow,verification:h.yellow,staging:h.yellow,check:h.yellow,"follow-up":h.yellow,followup:h.yellow,waiting:h.yellow,blocked:h.yellow,hold:h.yellow,done:h.green,complete:h.green,completed:h.green,success:h.green,ok:h.green,stable:h.green,resolved:h.green,fixed:h.green,closed:h.green,merged:h.green,released:h.green,deployed:h.green,approved:h.green,verified:h.green,working:h.green,healthy:h.green,pass:h.green,passing:h.green,info:h.blue,information:h.blue,note:h.blue,docs:h.blue,documentation:h.blue,doc:h.blue,guide:h.blue,help:h.blue,explanation:h.blue,detail:h.blue,details:h.blue,context:h.blue,design:h.blue,discussion:h.blue,proposal:h.blue,idea:h.blue,feature:h.magenta,enhancement:h.magenta,improvement:h.magenta,refactor:h.magenta,refactoring:h.magenta,cleanup:h.magenta,optimize:h.magenta,optimization:h.magenta,perf:h.magenta,performance:h.magenta,upgrade:h.magenta,migration:h.magenta,modernize:h.magenta,debt:h.magenta,todo:h.cyan,next:h.cyan,planned:h.cyan,plan:h.cyan,future:h.cyan,backlog:h.cyan,investigate:h.cyan,explore:h.cyan,prototype:h.cyan};var us=/^(\d+)(h|d|w|mo|y)$/,ps=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,gs=({year:e,month:t,day:n,hour:r=0,minute:o=0})=>{let i=new Date(e,t-1,n,r,o);return i.getFullYear()===e&&i.getMonth()===t-1&&i.getDate()===n&&i.getHours()===r&&i.getMinutes()===o},fs=(e,t=new Date)=>{let n=e.match(us);if(!n)return null;let[,r,o]=n,i=Number(r);if(!Number.isInteger(i)||i<=0)return null;let a=new Date(t);switch(o){case"h":return a.setHours(a.getHours()-i),a;case"d":return a.setDate(a.getDate()-i),a;case"w":return a.setDate(a.getDate()-i*7),a;case"mo":return a.setMonth(a.getMonth()-i),a;case"y":return a.setFullYear(a.getFullYear()-i),a;default:return null}},ys=e=>{let t=e.match(ps);if(!t)return null;let[,n,r,o,i,a]=t,m=Number(n),c=Number(r),u=Number(o),p=i?Number(i):0,g=a?Number(a):0;return gs({year:m,month:c,day:u,hour:p,minute:g})?new Date(m,c-1,u,p,g):null},Ut=e=>{let t=e.trim().toLowerCase();return fs(t)??ys(t)},Gr=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,xs=[{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}],qr=(e=xs)=>{let t=[];for(let{unit:n,from:r,to:o}of e)for(let i=r;i<=o;i++)t.push(`${i}${n}`);return t};var j=e=>{let{currentNode:t,readOnly:n,eventLog:r}=E(),o=Bt().isSetup,i=t.context,a=[f.SYNC,f.HELP,f.SET_VIEW,f.SET_EDITOR,f.SET_USERNAME],m=[f.NEW,f.RENAME,f.DELETE],c=[f.TAG,f.ASSIGN,f.CLOSE_ISSUE,f.RE_OPEN_ISSUE,f.SET_DESCRIPTION],u=[f.FILTER,f.PEEK],g=[...{WORKSPACE:[...a,...m],BOARD:[...u,...a,...m],SWIMLANE:[...u,...a,...m],TICKET:[...a,...m,...c],FIELD:[...a,...c],FIELD_LIST:[...a,...c],TEXT:[...a]}[i||"WORKSPACE"]],x={[f.PEEK]:[...qr(),"now","prev","next"],[f.SYNC]:[],[f.INIT]:[],[f.SET_USERNAME]:[],[f.SET_DESCRIPTION]:["confirm"],[f.DELETE]:["confirm"],[f.RE_OPEN_ISSUE]:["confirm"],[f.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[f.CLOSE_ISSUE]:["confirm"],[f.FILTER]:["tag","assignee","description","title","clear"],[f.SET_VIEW]:["dense","wide"],[f.SET_EDITOR]:[...Kr,"vim"],[f.TAG]:[...new Set([...Object.keys(Qe),...b.getExistingTags()])],[f.ASSIGN]:b.getExistingAssignees(),[f.HELP]:[],[f.RENAME]:[],[f.NEW]:i==="TICKET"||i==="FIELD"||i==="FIELD_LIST"?["issue","swimlane","board"]:i==="SWIMLANE"?["issue","swimlane","board"]:i==="BOARD"?["issue","swimlane","board"]:["board"],[f.NONE]:g};return o?zr()?n&&(x={[f.NONE]:[f.HELP,f.PEEK],[f.HELP]:x[f.HELP],[f.PEEK]:x[f.PEEK]}):x={[f.NONE]:[f.HELP,f.INIT],[f.HELP]:x[f.HELP],[f.INIT]:x[f.INIT]}:x={[f.NONE]:[f.HELP,f.SET_EDITOR,f.SET_USERNAME],[f.HELP]:x[f.HELP],[f.SET_EDITOR]:x[f.SET_EDITOR],[f.SET_USERNAME]:x[f.SET_USERNAME]},x[e]??[]};import _t from"chalk";import{decodeTime as Yr}from"ulid";var Jr=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 i=Math.floor(t/o);if(i>=1)return`${i}${r} ago`}return"just now"},Xr=e=>{let t=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())} ${t(e.getHours())}:${t(e.getMinutes())}`},Wt=e=>{try{return l("Decoded date",new Date(Yr(e)))}catch(t){return s("Decoding failed + "+t.message)}},Fn=e=>{if(!e?.id)return null;try{return Yr(e.id)}catch{return null}};var be=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?l("Found node",n):s("Unable to find node in breadcrumb")};import Ze from"chalk";var On={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},vs=(e,t,n)=>Math.max(t,Math.min(n,e)),kn=(e,t,n)=>e+(t-e)*n,Qr=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},hs=(e,t,n)=>{let r=t/100,o=n/100,i=(1-Math.abs(2*o-1))*r,a=e/60,m=i*(1-Math.abs(a%2-1)),c=0,u=0,p=0;a>=0&&a<1?(c=i,u=m):a>=1&&a<2?(c=m,u=i):a>=2&&a<3?(u=i,p=m):a>=3&&a<4?(u=m,p=i):a>=4&&a<5?(c=m,p=i):(c=i,p=m);let g=o-i/2;return[Math.round((c+g)*255),Math.round((u+g)*255),Math.round((p+g)*255)]},Es=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,Cs=(e,t,n)=>[Math.round(kn(e[0],t[0],n)),Math.round(kn(e[1],t[1],n)),Math.round(kn(e[2],t[2],n))],ft=e=>{let n=Qr(e)%360,r=hs(n,On.stringColor.saturation,On.stringColor.lightness);return Es(r)},Ns=e=>{let t=On.gradient.stops,n=vs(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,i=Math.min(Math.floor(o),r-1),a=o-i;return Cs(t[i],t[i+1],a)},Ht=e=>Qr(e.toLowerCase().trim())/4294967295,Zr=e=>{let t=Ht(e);return Ns(t)},bs=e=>{let[t,n,r]=Zr(e);return{normal:o=>Ze.bgRgb(t,n,r).black(o),cursor:o=>Ze.bgRgb(t,n,r).white.bold(o)}},Bn=e=>{let[t,n,r]=Zr(e);return{fg:o=>Ze.rgb(t,n,r)(o),fgCursor:o=>Ze.rgb(t,n,r).inverse(o),bg:o=>Ze.bgRgb(t,n,r).black(o),bgCursor:o=>Ze.bgRgb(t,n,r).white.bold(o)}},Un=e=>bs(e).normal(` ${e} `),me=(e,t=Qe)=>{let r=(o=>o.toLowerCase().trim())(e);return r&&t[r]?t[r]:ft(r)};var de="<ENTER> to confirm",V=(e="",t=[])=>({message:e,validity:Ne.Valid,completionWordList:t}),q=({message:e,completionWordList:t})=>({validity:Ne.Invalid,message:e,completionWordList:t}),yt=e=>e.length===0,Fe=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:i=1})=>{let c=[...t.filter(Boolean).filter(p=>p.startsWith(o.trim()))].sort((p,g)=>Ht(p)-Ht(g)).slice(0,r).map(Un),u=c.length>i?c.join(" "):"";return u?`${e}${u}${n}`:""},Wn=({modifier:e})=>{let t="confirm";return e===t?V(de):q({message:yt(e)?`if you are certain, enter ${Un(t)}`:"",completionWordList:[t]})},Is=({list:e,hint:t})=>({modifier:n})=>e.includes(n)?V(de):q({message:yt(n)?t:"",completionWordList:[]}),Ss=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?q({message:n,completionWordList:[]}):V():q({message:yt(r)?t:"",completionWordList:[]}),Hn=({hint:e})=>({modifier:t,inputString:n})=>yt(t)&&yt(n)?q({message:e,completionWordList:[]}):V(de),ws={[f.PEEK]:e=>{let t=e.modifier;if(t==="now")return V(de);let n={message:"historical state from: '1h', '2d', '23h', '1mo', '2y', 'previous', 'next' or full date as YYYY-MM-DD",completionWordList:[]};if(t==="prev"||t==="next")return V(de);let r=Ut(t);if(!t||!r)return q(n);let o=be(E().breadCrumb,"BOARD");if(d(o))return q({message:"Command is not applicable in this context",completionWordList:[]});let i=Wt(o.data.id);return d(i)?q({message:"Unable to peek: board id is not a valid ULID",completionWordList:[]}):Gr({date:r,horizonDate:i.data})?V(de):q({message:_t.red(`nothing to peek before ${i.data.toISOString().slice(0,16).replace("T"," ")}`),completionWordList:[]})},[f.INIT]:()=>V(de),[f.FILTER]:e=>{if(e.modifier==="clear")return V();let t=a=>j(f.FILTER).includes(a);if(!e.modifier||!t(e.modifier??""))return q({message:Fe({wordList:j(f.FILTER),inputString:e.inputString}),completionWordList:j(f.FILTER)});let r=Object.values(E().tags).map(a=>a.name),o=Object.values(E().contributors).map(a=>a.name),i=e.modifier==="tag"?r:e.modifier==="assignee"?o:[];return e.inputString?i.length&&!i.includes(e.inputString.trim()??"")?q({message:Fe({prefix:`existing ${e.modifier}s... `,wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i}):V():q({message:Fe({prefix:"one of... ",wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i})},[f.NONE]:e=>e.command?V():q({message:Fe({prefix:"commands... ",wordList:j(f.NONE),inputString:e.inputString,minLengthForHints:0}),completionWordList:[]}),[f.NEW]:e=>Ss({list:j(f.NEW),hint:Fe({wordList:j(f.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[f.SET_DESCRIPTION]:()=>V(de),[f.HELP]:()=>V(de),[f.RENAME]:()=>V(de),[f.DELETE]:e=>Wn(e),[f.CLOSE_ISSUE]:e=>Wn(e),[f.RE_OPEN_ISSUE]:e=>Wn(e),[f.MOVE]:e=>Hn({hint:Fe({prefix:"hey hacker! These commands are blocked for you... ",wordList:j(f.MOVE),noOfHints:10,inputString:e.inputString})})(e),[f.TAG]:e=>{let t=b.getExistingTags().map(n=>` ${_t.bgHex(me(n))(" "+n+" ")} `).slice(0,10);return Hn({hint:"tag name like... "+t.join("")})(e)},[f.ASSIGN]:e=>{let t=b.getExistingAssignees().map(n=>` ${_t.bgHex(me(n))(" "+n+" ")} `).slice(0,10);return Hn({hint:"assign to... "+t.join("")})(e)},[f.SET_EDITOR]:e=>{logger.debug(`Validating command: ${e.command} ${e.modifier} ${e.inputString}`);let t=j(f.SET_EDITOR);return e.modifier?V(de):q({message:Fe({wordList:t,inputString:e.inputString}),completionWordList:[]})},[f.SET_USERNAME]:e=>e.inputString?V():q({message:`Enter a username. Saved in ${_t.bgBlack("~/.epiq/")}`,completionWordList:[]}),[f.SET_VIEW]:e=>Is({list:j(f.SET_VIEW),hint:Fe({wordList:j(f.SET_VIEW),noOfHints:3,inputString:e.inputString})})(e),[f.SYNC]:()=>V(de)},eo=Object.fromEntries(Object.entries(ws).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var to=["frontend","backend","infrastructure","architecture","integration","configuration","implementation","application","deployment","environment","framework","platform","service","component","module","gateway","pipeline","containerization","orchestrator","exception","incident","defect","regression","degradation","malfunction","instability","intermittent","reproducibility","reproduction","investigation","triage","workaround","mitigation","remediation","optimization","stabilization","refinement","failure","outage","blocking","criticality","severity","escalation","diagnostics","analysis","resolution","corruption","inconsistency","validation","verification","authorization","authentication","confidentiality","availability","accessibility","reliability","compliance","governance","encryption","decryption","integrity","auditing","traceability","accountability","protection","privileges","permissions","dependency","orchestration","provisioning","synchronization","compatibility","incompatibility","interoperability","observability","instrumentation","telemetry","loadbalancing","discovery","registration","scheduling","coordination","distribution","isolation","virtualization","serialization","deserialization","initialization","instantiation","propagation","aggregation","consolidation","normalization","standardization","transformation","reconciliation","correlation","processing","indexing","partitioning","enrichment","validation","filtering","streaming","batching","concurrency","parallelism","contention","deadlock","throttling","ratelimiting","backpressure","fragmentation","saturation","exhaustion","partitioning","replication","redundancy","failover","deprecation","obsolescence","starvation","overload","underutilization","latency","throughput","refactoring","modularization","encapsulation","abstraction","extensibility","configurability","maintainability","recoverability","sustainability","readability","testability","debuggability","reusability","simplicity","consistency","performance","functionality","requirement","recommendation","improvement","enhancement","clarification","documentation","description","acceptance","criteria","estimation","prioritization","dependency","deliverable","milestone","iteration"];var L={Init:"init",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",Peek:"peek",SetView:"set-view",SetEditor:"set-editor",SetUserName:"set-user-name",NewItem:"add-new-item",TagTicket:"ticket-tag",AssignUserToTicket:"ticket-assign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Sync:"sync"};var no=e=>Object.values(f).includes(e),ro=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:i}=e,{message:a,validity:m,completionWordList:c}=eo[n].validate(n,r,i),u=o==="command"?Object.values(f):n&&e.target==="modifier"?j(n):to;return{validity:m,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:a??"",autoCompletion:t?$r(e,[...c,...u]):{hint:"",hints:[],remainder:"",overlap:0}}};var oo=e=>{let t=e.trimStart(),n=Ts(t),r=(n[0]??"").trimStart().trimEnd(),o=(n[1]??"").trimStart().trimEnd(),i=Ms(e),a=no(r)?r:null,m=a!==null,c=r!=="",u=e.endsWith(" "),p=a?j(a)??[]:[],g=a&&p.includes(o)?o:"",x="word";n.length<=1?x="command":n.length===2&&(x="modifier");let S=As(t,a,g);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:i,hasCommand:c,command:a,isCommandKeyword:m,isLastWordCompleted:u,modifier:g,target:x,inputToMatch:i,inputString:S}},As=(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},Ts=e=>e?e.split(/\s+/):[],Ms=e=>e.trimEnd().split(/\s+/).at(-1)??"";var io=" ",Y={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:Ne.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},_n=new Set,so=()=>{for(let e of _n)e()},ao=e=>(_n.add(e),()=>_n.delete(e)),Ie=e=>{let n=e(Y),r=oo(n.value),o=n.cursorPosition===n.value.length;Y={...n,commandMeta:ro(r,o)},so()},xt=({message:e,result:t})=>{let n=structuredClone(Y);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,Y=n,so(),l(e,null)},$n=e=>{Ie(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},Kn=e=>{Ie(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&n[o-1]===" ";)o--;for(;o>0&&n[o-1]!==" ";)o--}else{for(;o<n.length&&n[o]!==" ";)o++;for(;o<n.length&&n[o]===" ";)o++}return{...t,cursorPosition:o}})},co=()=>{Ie(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}})},lo=()=>{Ie(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&t[r-1]===" ";)r--;for(;r>0&&t[r-1]!==" ";)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},$=e=>{Ie(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),r=t.value.slice(0,n),o=t.value.slice(n),i=e(r,t.commandMeta.autoCompletion),a=i+o,m=Math.max(0,Math.min(i.length,a.length));return{...t,value:a,cursorPosition:m,commandIsPending:!1}})},mo=()=>{Ie(e=>({...e,commandIsPending:!0}))},uo=({addToHistory:e=!0})=>{Ie(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),Rs()},po=()=>{Ie(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}})},go=()=>{Ie(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},Rs=()=>$(()=>""),ge=()=>Y,$t=()=>{let[e,...t]=Y.value.split(io);return t.join(io).trim()};var Ls=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",Ps=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",Ds=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",fo=(e,t)=>{if(Ps(e,e.sequence))return v.MoveCursorLeftOfWord;if(Ds(e,e.sequence))return v.MoveCursorRightOfWord;if(Ls(e,e.sequence))return v.EraseInputWord;switch(e.name){case"tab":return v.AutoCompleteCommand;case"up":return v.GetLastCommandFromHistory;case"down":return v.GetNextCommandFromHistory;case"left":return v.MoveCursorLeft;case"right":return v.MoveCursorRight;case"return":return v.Confirm;case"backspace":return t?v.EraseInput:v.ExitCommandLine;case"escape":return v.ExitCommandLine;default:return v.CaptureInput}};var v={Sync:"sync",NavPreviousItem:"navPreviousItem",NavNextItem:"navNextItem",NavToPreviousContainer:"navToPreviousContainer",NavToNextContainer:"navToNextContainer",MovePreviousItem:"movePreviousItem",MoveNextItem:"moveNextItem",MoveToPreviousContainer:"moveToPreviousContainer",MoveToNextContainer:"moveToNextContainer",Confirm:"confirm",Exit:"exit",ViewHelp:"viewHelp",HideHelp:"hideHelp",InitMove:"initMove",ConfirmMove:"confirmMove",Delete:"Delete",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",SetViewDense:"SetViewDense",SetViewWide:"SetViewWide"};function Fs(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function ks(e,t,n){let r=E().currentNode.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 yo(e,t){let n=ge();if(e.sequence===":"&&n.value==="")return v.InitCommandLine;if(t===y.MOVE)switch(e.name){case"m":case"return":return v.ConfirmMove}if(t===y.COMMAND_LINE)return fo(e,n.value);let r=Fs(e);if(r){let o=t===y.MOVE?{prevItem:v.MovePreviousItem,nextItem:v.MoveNextItem,prevContainer:v.MoveToPreviousContainer,nextContainer:v.MoveToNextContainer}:{prevItem:v.NavPreviousItem,nextItem:v.NavNextItem,prevContainer:v.NavToPreviousContainer,nextContainer:v.NavToNextContainer};return ks(E().currentNode.childRenderAxis,r,o)}if(e.ctrl&&e.name==="c")return v.Exit;switch(e.name){case"e":return v.Edit;case"n":return v.AddItem;case"m":return v.InitMove;case"d":return v.Delete;case"return":return v.Confirm;case"space":return v.Confirm;case"v":return E().viewMode==="wide"?v.SetViewDense:v.SetViewWide;case"q":case"escape":return v.Exit;case"s":return v.Sync;default:return null}}var xo=e=>{let{context:t}=E()?.currentNode;if(!t)return L.None;switch(e){case f.INIT:return L.Init;case f.DELETE:return L.Delete;case f.SET_DESCRIPTION:return L.Edit;case f.HELP:return L.ViewHelp;case f.RE_OPEN_ISSUE:return L.ReopenIssue;case f.CLOSE_ISSUE:return L.CloseIssue;case f.TAG:return L.TagTicket;case f.ASSIGN:return L.AssignUserToTicket;case f.RENAME:return L.Rename;case f.NEW:return L.NewItem;case f.FILTER:return L.Filter;case f.MOVE:return L.Move;case f.PEEK:return L.Peek;case f.SET_USERNAME:return L.SetUserName;case f.SET_EDITOR:return L.SetEditor;case f.SET_VIEW:return L.SetView;case f.SYNC:return L.Sync;default:return L.None}};import{ulid as K}from"ulid";import{spawnSync as Ks}from"node:child_process";import Vs from"node:os";import Co from"node:path";import{ulid as js}from"ulid";import{accessSync as Os,copyFileSync as Bs,existsSync as Kt,mkdirSync as vo,readdirSync as ho,readFileSync as Us,renameSync as Ws,rmSync as Hs,statSync as Eo,unlinkSync as _s,writeFileSync as $s}from"node:fs";import et from"node:path";var ce={writeToFile:(e,t)=>{try{let n=et.dirname(e);Kt(n)||vo(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);$s(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return Us(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=ce.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 Kt(e)&&Eo(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Os(e),!0}catch{return!1}},mkDir:e=>vo(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=et.parse(t);for(;;){let r=et.join(t,e);try{if(Kt(r)&&Eo(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=et.dirname(t)}return null},readFirstJSON(e){try{if(!ce.dirExists(e))return null;let t=ho(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=et.join(e,t);return ce.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return ce.dirExists(e)?ho(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{_s(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Hs(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(et.dirname(t)),!n?.overwrite&&Kt(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{Ws(e,t)}catch(r){if(r?.code==="EXDEV"){Bs(e,t),this.rmFile(e);return}throw r}}};function zs(){let{preferredEditor:e}=pe(),t=[e,process.env.VISUAL,process.env.EDITOR,"vim","vi","nano"].filter(n=>!!n?.trim());return[...new Set(t)]}function Gs(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function No(e){let t=Co.join(Vs.tmpdir(),"epiq");ce.mkDir(t);let n=Co.join(t,js());ce.writeToFile(n,e??"");let r=zs();for(let o of r){let i=Gs(o,n),a=Ks(i,{stdio:"inherit",shell:!0});if(!a.error&&a.status===0){let m=ce.readFile(n);if(m==null)return s("Unable to read edited file");let c=m.replace(/\r?\n$/,"");return l("Successfully edited",c)}}return s("Unable to open editor")}import{monotonicFactory as qs,ulid as Vt}from"ulid";var jt=qs(),bo=({name:e,parent:t,userId:n,userName:r})=>{let o=jt(),i=jt(),a=jt(),m=jt();return[{id:Vt(),userId:n,userName:r,action:"add.issue",payload:{id:o,parent:t,name:e}},{id:Vt(),userId:n,userName:r,action:"add.field",payload:{id:i,parent:o,name:"Description",val:""}},{id:Vt(),userId:n,userName:r,action:"add.field",payload:{id:a,parent:o,name:"Assignees"}},{id:Vt(),userId:n,userName:r,action:"add.field",payload:{id:m,parent:o,name:"Tags"}}]};import qt from"node:fs";import Yt from"node:path";import{z as zn}from"zod";var zt=process.env.IS_LOCAL==="true",xe=()=>".epiq";import Gt from"node:fs";import Ve from"node:path";import{decodeTime as Ys,monotonicFactory as Js}from"ulid";import{z as vt}from"zod";var Io=e=>({action:e.action,payload:e.payload});var Ao=1,So=Js(),Xs="events",Qs=vt.tuple([vt.string().min(1),vt.string().min(1).nullable()]),Zs=vt.looseObject({v:vt.literal(Ao),id:Qs}),Vn=e=>{let t=Zs.safeParse(e);return t.success?l("Parsed persisted event",t.data):s(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},wo=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",te=()=>{let{userName:e,userId:t}=pe();return e?t?e.trim()?l("Successfully resolved actor ID",{userId:wo(t),userName:wo(e)}):s("Unable to resolve actor ID from settings or OS user info"):s("User ID not configured"):s("User name not configured")},ea=e=>Gt.existsSync(Ve.join(e,xe()))&&Gt.statSync(Ve.join(e,xe())).isDirectory(),tt=(e=process.cwd())=>{let t=Ve.resolve(e);for(;;){if(ea(t))return t;let n=Ve.dirname(t);if(n===t)return Ve.resolve(e);t=n}},To=(e=process.cwd())=>Ve.join(tt(e),xe(),Xs),jn=()=>{let e=te();return d(e)||!e.data?s("Unable to resolve event log path"):l("Succeeded",`${e.data.userId}.${e.data.userName}.jsonl`)},ta=(e=process.cwd())=>{let t=jn();if(d(t))return s("Unable to resolve file name");let n=t.data;return/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(n)?l("Successfully resolved event log path",Ve.join(To(e),n)):s(`Invalid event log file name: ${n}`)},na=(e,t)=>{let n={[e.action]:e.payload,v:Ao,id:t};return Vn(n)};function Mo(e,t=process.cwd()){try{let n=tt(t),r=To(n),o=ta(n);if(d(o))return o;Gt.mkdirSync(r,{recursive:!0});let i=Ro(n);if(d(i))return s(i.message);let a;if(i.data){let c=Ys(i.data),u=Math.max(Date.now(),c+1);a=So(u)}else a=So();let m=na(Io(e),[a,i.data]);return d(m)?s(m.message):(Gt.appendFileSync(o.data,`${JSON.stringify(m.data)}
3
+ `,"utf8"),l("Event persisted",{path:o.data,entry:m.data}))}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return s(`Failed to persist event: ${r}`)}}import{decodeTime as ra}from"ulid";var oa=xe(),ia="events",sa=zn.object({userId:zn.string().min(1).default("unknown"),userName:zn.string().min(1).default("unknown")}),aa=(e=process.cwd())=>Yt.join(tt(e),oa,ia),da=e=>{let[t,n]=Yt.basename(e,".jsonl").split("."),r=sa.safeParse({userId:t,userName:n});return r.success?l("Parsed event file actor",r.data):s(`Invalid event file name ${Yt.basename(e)}: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},ca=e=>{let t=Object.keys(e).filter(n=>n!=="id"&&n!=="v");return t.length!==1?s(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?s("Invalid persisted event: action key is missing or invalid"):l("Resolved persisted action",t[0])},la=(e,t)=>t in e,ma=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),ua=e=>{let{userId:t,userName:n,...r}=e,o=ca(r);if(d(o))return s(o.message);let i=o.data,a=e.id?.[0];return a?la(r,i)?l("Decoded persisted event",ma({id:a,action:i,payload:r[i],userId:t,userName:n})):s(`Persisted event is missing payload for action: ${i}`):s("Persisted event is missing id")},Jt=e=>{if(!qt.existsSync(e))return l("Event file missing",[]);let t=da(e);if(d(t))return s(t.message);let n=qt.readFileSync(e,"utf8"),r=[];for(let o of n.split(`
4
+ `)){let i=o.trim();if(!i)continue;let a;try{a=JSON.parse(i)}catch{return s(`Failed to parse event JSON from ${e}: ${i}`)}let m=Vn(a);if(d(m))return s(`${m.message} in ${e}: ${i}`);r.push({...m.data,userId:t.data.userId,userName:t.data.userName})}return l("Parsed persisted events file",r)};function Lo(e=process.cwd()){let t=aa(e);if(!qt.existsSync(t))return s("No events found");let n=qt.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>Yt.join(t,o)),r=[];for(let o of n){let i=Jt(o);if(d(i))return s(i.message);r.push(...i.data)}return l("All events loaded",pa(r))}function ht(e=process.cwd()){let t=Lo(e);if(d(t))return s(t.message);let n=[];for(let r of t.data){let o=ua(r);if(d(o))return s(`Failed to decode event ${r.id?.[0]??"<unknown>"}: ${o.message}`);n.push(o.data)}return l("Loaded merged events",n)}function Ro(e=process.cwd()){let t=Lo(e);return d(t)?s(t.message):l("Loaded edge reference",t.data.at(-1)?.id?.[0]??null)}var pa=e=>{let t=new Map(e.map(m=>[m.id[0],m])),n=new Map;for(let m of e){let c=m.id[1],u=n.get(c)??[];u.push(m),n.set(c,u)}for(let m of n.values())m.sort((c,u)=>{let[p]=c.id,[g]=u.id;return p.localeCompare(g)});let r=[],o=new Set,i=m=>{let c=n.get(m)??[];for(let u of c){let[p]=u.id;o.has(p)||(o.add(p),r.push(u),i(p))}};i(null);let a=[...e].filter(m=>{let[c]=m.id;return!o.has(c)}).sort((m,c)=>{let[u,p]=m.id,[g,x]=c.id,S=p===null||t.has(p),w=x===null||t.has(x);if(S&&!w)return-1;if(!S&&w)return 1;let N=(p??"").localeCompare(x??"");return N!==0?N:u.localeCompare(g)});return[...r,...a]},Po=(e,t)=>{let n=e.findIndex(r=>{try{return ra(r.id)>t}catch{return!0}});return n===-1?{appliedEvents:e,unappliedEvents:[]}:{appliedEvents:e.slice(0,n),unappliedEvents:e.slice(n)}};var Do=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)return r.payload.parent}return null};var ga=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[nt,Xt]=ga;var D=(e,t)=>s(`${t.split(".").join(" ")+" failed, "+e.toLowerCase()}`),fa={"init.workspace":({action:e,payload:t})=>{let{id:n,name:r}=t,o=ee.workspace(n,r);Gn(o);let i=b.createNodeAtPosition(o);return d(i)?D(i.message??"Failed to initialize workspace",e):l("Workspace initialized",{action:e,result:i.data})},"add.workspace":({action:e,payload:t})=>{let{id:n,name:r}=t,o=ee.workspace(n,r),i=b.createNodeAtPosition(o);return d(i)?D(i.message??"Failed to add workspace",e):l("Added workspace",{action:e,result:i.data})},"add.board":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,i=b.createNodeAtPosition(ee.board(n,r,o));return d(i)?D(i.message??"Unable to create board",e):l("Added board",{action:e,result:i.data})},"add.swimlane":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,i=b.createNodeAtPosition(ee.swimlane(n,r,o));return d(i)?D(i.message??"Unable to create swimlane",e):l("Added swimlane",{action:e,result:i.data})},"add.issue":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,i=b.createNodeAtPosition(ee.ticket(n,r,o));return d(i)?D(i.message??"Unable to create issue",e):l("Added issue",{action:e,result:i.data})},"add.field":({action:e,payload:t})=>{let{id:n,name:r,parent:o,val:i}=t,a=b.createNodeAtPosition(ee.field(n,r,o,{value:i},r.includes("Description")?"vertical":"horizontal"));return d(a)?D(a.message??`Unable to create field: ${r}`,e):l("Added field",{action:e,result:a.data})},"edit.title":({action:e,payload:t})=>{let{id:n,name:r}=t;if(!b.getNode(n))return D("Unable to locate node",e);let i=b.renameNode(n,r);return d(i)?D(i.message??"Unable to edit title",e):l("Edited title",{action:e,result:i.data})},"delete.node":({action:e,payload:t})=>{let{id:n}=t,r=b.tombstoneNode(n);return d(r)?D(r.message??"Unable to delete node",e):l("Deleted node",{action:e,result:r.data})},"create.tag":({action:e,payload:t})=>{let{id:n,name:r}=t,o=b.createTag({id:n,name:r});return d(o)?D(o.message??"Unable to create tag",e):l("Tag added",{action:e,result:o.data})},"create.contributor":({action:e,payload:t})=>{let{id:n,name:r}=t,o=b.createContributor({id:n,name:r});return d(o)?D(o.message??"Unable to create contributor",e):l("Contributor created",{action:e,result:o.data})},"tag.issue":({action:e,payload:t})=>{let{id:n,target:r,tagId:o}=t,i=b.tag(r,o,n);return d(i)?D(i.message??"Unable to tag issue",e):l("Issue tagged",{action:e,result:i.data})},"assign.issue":({action:e,payload:t})=>{let{id:n,contributor:r,target:o}=t,i=b.assign(o,r,n);return d(i)?D(i.message??"Unable to assign issue",e):l("Assigned successfully",{action:e,result:i.data})},"move.node":({action:e,payload:t})=>{let{id:n,parent:r,pos:o}=t,i=b.moveNode({id:n,parentId:r,position:o});return d(i)?D(i.message??"Failed to move node",e):l("Moved node",{action:e,result:i.data})},"edit.description":({action:e,payload:t})=>{let{id:n,md:r}=t,o=b.editValue(n,r);return d(o)?D(o.message??"Unable to edit description",e):l("Set node value",{action:e,result:o.data})},"close.issue":({action:e,payload:t})=>{let{id:n}=t,r=b.getNode(n);if(!r)return D("Unable to locate issue",e);if(!$e(r))return D("Can only close issues",e);let o=b.getNode(nt);if(!o)return D("Unable to locate target swimlane",e);if(o.id===r.parentNodeId)return D("Cannot close closed issue",e);let a=b.moveNode({id:n,parentId:o.id});return d(a)?D(a.message??"Unable to close issue",e):l("Issue closed",{action:e,result:a.data})},"reopen.issue":({action:e,payload:t})=>{let{id:n}=t,r=b.getNode(n);if(!r)return D("Unable to locate issue",e);if(!$e(r))return D("Can only reopen issues",e);let o=b.getNode(nt);if(!o)return D("Unable to locate closed swimlane",e);if(!(r.parentNodeId===o.id))return D("Issue is not closed",e);let a=Do(r);if(!a)return D("Unable to resolve previous parent from issue history",e);if(a===o.id)return D("Previous parent resolves to closed swimlane",e);if(!b.getNode(a))return D("Previous parent no longer exists",e);let c=b.moveNode({id:n,parentId:a});return d(c)?D(c.message??"Unable to reopen issue",e):l("Issue reopened",{action:e,result:c.data})},"lock.node":({action:e,payload:t})=>{let{id:n}=t,r=b.lockNode(n);return d(r)?D(r.message??"Unable to lock node",e):l("Node locked",{action:e,result:r.data})}},ya=(e,t)=>{let n=b.getNode(e);n&&b.updateNode({...n,log:[...n.log??[],t]})},xa=e=>{switch(e.action){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"delete.node":case"move.node":case"close.issue":case"reopen.issue":return[e.payload.id];case"edit.description":let t=[e.payload.id],n=E().nodes[e.payload.id]?.parentNodeId;return n&&t.push(n),t;case"tag.issue":case"assign.issue":return[e.payload.id,e.payload.target];case"create.tag":case"create.contributor":default:return[]}};function rt(e,t=!1){let n=fa[e.action](e);if(d(n))return n;t||([...new Set(xa(e))].forEach(a=>ya(a,e)),ae(a=>({...a,eventLog:[...a.eventLog,e]})));let r=e.userId,o=e.userName;return!r?.length||!o?.length?D("Invalid user ID format",e.action):(b.createContributor({name:o,id:r}),n)}var je=e=>e.map(t=>rt(t));function ne(e){let t=rt(e);if(t.result!==ye.Success)return t;let n=Mo(e);return d(n)?n:t}function Qt(e){return e.map(t=>ne(t))}import It from"node:fs";import{spawn as Ea}from"node:child_process";import Yn from"node:fs";import ot from"node:path";var Et=(e,t)=>{let n=new Map,r=t??((...i)=>JSON.stringify(i)),o=((...i)=>{let a=r(...i);if(!n.has(a)){let m=e(...i).then(c=>(d(c)&&n.delete(a),c));n.set(a,m)}return n.get(a)});return o.clear=()=>n.clear(),o};import Ct from"fs";import ko from"path";import va from"util";var Fo=1e3,Oo=(e=process.cwd())=>ko.join(tt(e),xe(),"log","epiq.log");function ha(e=process.cwd()){if(!zt)return;let t=Oo(e);if(!Ct.existsSync(t))return;let r=Ct.readFileSync(t,"utf8").split(`
5
+ `);if(r[r.length-1]===""&&r.pop(),r.length<=Fo)return;let o=r.slice(-Fo).join(`
14
6
  `)+`
15
- `;vt.writeFileSync(t,o,"utf8")}function Gr(e,t,r=!1,n=process.cwd()){if(!Wt)return;let o=Bo(n),i=na.format(...t),a=new Date,m=`[${r?a.toISOString().slice(11,19):a.toISOString()}] ${e} ${i}
16
- `;vt.mkdirSync(ko.dirname(o),{recursive:!0}),vt.appendFileSync(o,m,"utf8"),oa(n)}var M={info(...e){Gr("[Info]",e,!1)},debug(...e){Gr("->",e,!0)},error(...e){Gr("[Error]",[...e,new Error().stack],!1)}};globalThis.logger=M;import Qt from"fs";import ia from"path";import{decodeTime as sa}from"ulid";var Jr=e=>{let[t,r]=e.id;return`${t}:${r??""}`},Oo=e=>{let[t]=e.id;return sa(t)},aa=e=>{let{userId:t,userName:r,...n}=e;return n},da=e=>e.map(t=>JSON.stringify(aa(t))).join(`
7
+ `;Ct.writeFileSync(t,o,"utf8")}function qn(e,t,n=!1,r=process.cwd()){if(!zt)return;let o=Oo(r),i=va.format(...t),a=new Date,c=`[${n?a.toISOString().slice(11,19):a.toISOString()}] ${e} ${i}
8
+ `;Ct.mkdirSync(ko.dirname(o),{recursive:!0}),Ct.appendFileSync(o,c,"utf8"),ha(r)}var A={info(...e){qn("[Info]",e,!1)},debug(...e){qn("->",e,!0)},error(...e){qn("[Error]",[...e,new Error().stack],!1)}};globalThis.logger=A;var Bo=15e3,Ca={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo"},Wo=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!Yn.existsSync(t)){let p=`Git cwd does not exist: ${t}`;if(n){r({stdout:"",stderr:p,exitCode:1});return}r(s(p));return}let o=Ea("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:Ca}),i=!1,a="",m="",c=p=>{i||(i=!0,clearTimeout(u),r(p))},u=setTimeout(()=>{o.kill("SIGTERM");let p=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${Bo}ms`].join(`
9
+ `);c(n?{stdout:a,stderr:p,exitCode:124}:s(p))},Bo);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",p=>{a+=p}),o.stderr.on("data",p=>{m+=p}),o.on("error",p=>{if(n){c({stdout:a,stderr:p.message,exitCode:1});return}c(s([`git ${e.join(" ")}`,`cwd=${t}`,p.message].join(`
10
+ `)))}),o.on("close",p=>{let g=p??1;if(n){c({stdout:a,stderr:m,exitCode:g});return}if(g!==0){c(s([`git ${e.join(" ")}`,m.trim()||a.trim()||"Git command failed"].filter(Boolean).join(`
11
+ `)));return}c(l("Git command succeeded",{stdout:a,stderr:m,exitCode:g}))})}),F=({args:e,cwd:t})=>Wo({args:e,cwd:t,allowFail:!1}),ze=({args:e,cwd:t})=>Wo({args:e,cwd:t,allowFail:!0}),Jn=Et(async(e=process.cwd())=>{let t=await F({args:["rev-parse","--show-toplevel"],cwd:e});return d(t)?s("Not inside a Git repository"):l("Resolved repo root",t.data.stdout.trim())},e=>ot.resolve(e)),Na=Et(async e=>{let t=await F({args:["rev-parse","--git-dir"],cwd:e});if(d(t))return s(t.message);let n=t.data.stdout.trim(),r=ot.isAbsolute(n)?n:ot.join(e,n);return l("Resolved git dir",r)},e=>ot.resolve(e)),Xn=async({cwd:e,message:t})=>{let n=await F({args:["commit","-m",t],cwd:e});if(d(n))return s(`Failed to create commit
12
+ ${n.message}`);let r=await F({args:["rev-parse","HEAD"],cwd:e});return d(r)?s(`Commit created, but failed to read HEAD SHA
13
+ ${r.message}`):l("Created commit and resolved SHA",r.data.stdout.trim())},Nt=async e=>{let t=await Na(e);if(d(t))return s(t.message);let n=t.data,o=["MERGE_HEAD","CHERRY_PICK_HEAD","REVERT_HEAD","REBASE_HEAD","rebase-merge","rebase-apply"].filter(i=>Yn.existsSync(ot.join(n,i)));return l("Checked for in-progress Git operation",o.length>0)},Zt=async({repoRoot:e,remote:t})=>{let n=await ze({args:["remote","get-url",t],cwd:e});return l("Checked remote",n.exitCode===0)},en=async({repoRoot:e,remote:t,branch:n})=>{let r=await ze({args:["ls-remote","--heads",t,n],cwd:e});return r.exitCode!==0?s(r.stderr.trim()||`Unable to inspect remote branch ${t}/${n}`):l("Checked remote branch",r.stdout.trim().length>0)},Ho=async({repoRoot:e,branch:t})=>{let n=await ze({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?l("Local branch exists",!0):n.exitCode===1?l("Local branch missing",!1):s(n.stderr.trim()||`Unable to inspect branch ${t}`)},Uo=e=>{try{return Yn.realpathSync.native(e)}catch{return ot.resolve(e)}},_o=async({repoRoot:e,worktreeRoot:t})=>{let n=await F({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return s(n.message);let r=Uo(t),o=n.data.stdout.split(`
14
+ `).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(Uo).includes(r);return l("Checked worktree registration",o)},Qn=async e=>{let t=await ze({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return l("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},tn=async e=>{let t=await F({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return d(t)?s(t.message):l("Resolved current branch",t.data.stdout.trim())},$o=async e=>{let t=await F({args:["rev-parse","--short","HEAD"],cwd:e});return d(t)?s(t.message):l("Resolved short HEAD sha",t.data.stdout.trim())},Ko=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),nn=async({cwd:e,remote:t,branch:n})=>{let r=await en({repoRoot:e,remote:t,branch:n});if(d(r))return s(r.message);if(!r.data)return l("Remote branch missing, skipped pull",!1);A.debug("[git] fetch start",{cwd:e,remote:t,branch:n});let o=await F({args:["fetch",t,n],cwd:e});if(A.debug("[git] fetch done",o),d(o))return s(`Failed to fetch ${n}
15
+ ${o.message}`);A.debug("[git] pull start",{cwd:e,remote:t,branch:n});let i=await F({args:["pull","--rebase",t,n],cwd:e});return A.debug("[git] pull done",i),d(i)?s(`Failed during pull --rebase
16
+ ${i.message}`):l("Pulled with rebase",!0)},Vo=async e=>{let t=await F({args:["status","--porcelain"],cwd:e});return d(t)?s(t.message):l("Checked remote worktree changes",t.data.stdout.trim().length>0)},jo=async e=>{let t=await tn(e);return d(t)?s(t.message):l("Checked detached HEAD state",t.data==="HEAD")};import{createHash as Ta}from"node:crypto";import ve from"node:fs";import Ma from"node:os";import X from"node:path";import rn from"node:fs";import ba from"node:path";import{decodeTime as Ia}from"ulid";var Zn=e=>{let[t,n]=e.id;return`${t}:${n??""}`},zo=e=>{let[t]=e.id;return Ia(t)},Sa=e=>{let{userId:t,userName:n,...r}=e;return r},wa=e=>e.length===0?"":e.map(t=>JSON.stringify(Sa(t))).join(`
17
17
  `)+`
18
- `,ca=(e,t)=>{let r=new Map;for(let n of[...t,...e])r.set(Jr(n),n);return[...r.values()].sort((n,o)=>{let i=Oo(n)-Oo(o);return i!==0?i:Jr(n).localeCompare(Jr(o))})},Zt=({sourceFile:e,targetFile:t})=>{let r=_t(e);if(d(r))return s(r.message);let n=_t(t);if(d(n))return s(n.message);let o=ca(n.data,r.data),i=da(o);return Qt.existsSync(t)&&Qt.readFileSync(t,"utf8")===i?c("Event file already merged",!1):(Qt.mkdirSync(ia.dirname(t),{recursive:!0}),Qt.writeFileSync(t,i,"utf8"),c("Merged event file",!0))};var F="epiq/events",z="origin",Wo=pe(),Ho="events",ua=e=>se.join(Wo,Ho,e),pa=e=>la("sha1").update(e).digest("hex").slice(0,12),$o=()=>se.join(ma.homedir(),".epiq"),_o=()=>se.join($o(),"worktrees"),Xr=e=>se.join(_o(),pa(e)),ga=e=>se.join(e,Wo),ot=e=>se.join(ga(e),Ho),Yr=({root:e,fileName:t})=>se.join(ot(e),t),er=e=>(M.debug("[sync] ensure dir",e),Fe.mkdirSync(e,{recursive:!0}),c("Ensured directory",void 0)),fa=()=>{M.debug("[sync] ensure epiq storage");let e=er($o());if(d(e))return s(e.message);let t=er(_o());return d(t)?s(t.message):c("Ensured epiq storage",void 0)},ya=e=>{Fe.existsSync(e)&&(M.debug("[sync] remove path",e),Fe.rmSync(e,{recursive:!0,force:!0}))},xa=e=>{let t=ot(e);if(!Fe.existsSync(t))return M.debug("[sync] events dir missing",t),c("Events dir missing",[]);let r=Fe.readdirSync(t,{withFileTypes:!0}).filter(n=>n.isFile()).map(n=>n.name).filter(n=>n.endsWith(".jsonl")).sort();return M.debug("[sync] listed event files",{eventsDir:t,count:r.length}),c("Listed event files",r)},va=async e=>{M.debug("[sync] inspect local HEAD",e);let t=await Ke({args:["rev-parse","--verify","HEAD"],cwd:e});return t.exitCode===0?c("Repo has HEAD",!0):t.exitCode===1?c("Repo has no HEAD",!1):s(t.stderr.trim()||"Unable to inspect HEAD")},ha=yt(async e=>{M.debug("[sync] inspect remote history",{repoRoot:e,remote:z});let t=await Gt({repoRoot:e,remote:z});if(d(t))return s(t.message);if(!t.data)return c("No remote configured",!1);let r=await Ke({args:["ls-remote","--heads",z],cwd:e});if(r.exitCode!==0)return s(r.stderr.trim()||"Unable to inspect remote heads");let n=r.stdout.trim().length>0;return M.debug("[sync] remote history",n),c("Checked remote history",n)},e=>se.resolve(e)),Qr=async e=>{M.debug("[sync] ensure initial commit");let t=await va(e);if(d(t))return s(t.message);if(t.data)return M.debug("[sync] local HEAD exists"),c("Repo already initialized",!1);let r=await ha(e);if(d(r))return s(r.message);if(r.data)return M.debug("[sync] skip local init commit due to remote history"),c("Skipped local init commit because remote history exists",!1);M.debug("[sync] create empty init commit");let n=await k({args:["commit","--allow-empty","-m","[epiq:init]"],cwd:e});return d(n)?s(`Failed to create initial commit
19
- ${n.message}`):c("Created initial commit",!0)},Zr=({repoRoot:e,worktreeRoot:t})=>{let r=xa(t);if(d(r))return s(r.message);let n=ot(t),o=ot(e),i=!1;for(let a of r.data){let l=se.join(n,a),m=se.join(o,a),u=Zt({sourceFile:l,targetFile:m});if(d(u))return s(u.message);i=i||u.data}return M.debug("[sync] hydrate changed",i),c("Hydrated event files from remote worktree",i)},Uo=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",Ca=async e=>{let t=await Xt(e);if(d(t))return s(t.message);let r=await Lo(e);if(d(r))return s(r.message);let n=`[epiq:sync:${Uo(t.data)}:${Uo(r.data)}]`;return M.debug("[sync] commit message",n),c("Built sync commit message",n)},Na=async({repoRoot:e})=>{M.debug("[sync] ensure local remote branch",F);let t=await Ro({repoRoot:e,branch:F});if(d(t))return s(t.message);if(t.data)return M.debug("[sync] local remote branch exists"),c("Local remote branch already exists",!1);let r=await Gt({repoRoot:e,remote:z});if(d(r))return s(r.message);if(r.data){let o=await Jt({repoRoot:e,remote:z,branch:F});if(d(o))return s(o.message);if(o.data){M.debug("[sync] fetch remote branch before local track");let i=await k({args:["fetch",z,F],cwd:e});if(d(i))return s(`Failed to fetch ${F} from remote
20
- ${i.message}`);M.debug("[sync] create local tracking branch",F);let a=await k({args:["branch","--track",F,`${z}/${F}`],cwd:e});return d(a)?s(`Failed to create local ${F} from remote
21
- ${a.message}`):c("Created local remote branch from remote",!0)}}M.debug("[sync] create local remote branch from HEAD",F);let n=await k({args:["branch",F,"HEAD"],cwd:e});return d(n)?s(`Failed to create local ${F}
22
- ${n.message}`):c("Created local remote branch",!0)},Ea=async({repoRoot:e,worktreeRoot:t})=>{M.debug("[sync] create remote worktree",t);let r=er(se.dirname(t));if(d(r))return s(r.message);Fe.existsSync(t)&&!Fe.existsSync(se.join(t,".git"))&&(M.debug("[sync] remove broken remote worktree path",t),ya(t));let n=await k({args:["worktree","add",t,F],cwd:e});return d(n)?s(`Failed to create remote worktree
23
- ${n.message}`):c("Created remote worktree",!0)},ba=async({repoRoot:e,worktreeRoot:t})=>{M.debug("[sync] ensure remote worktree",t);let r=await zr({repoRoot:e,worktreeRoot:t});if(d(r))return s(r.message);let n=Fe.existsSync(t);if(r.data&&n)return M.debug("[sync] remote worktree exists"),c("Remote worktree already exists",!1);if(r.data&&!n){M.debug("[sync] prune stale remote worktree registration");let o=await k({args:["worktree","prune"],cwd:e});if(d(o))return s(`Failed to prune stale worktrees
24
- ${o.message}`);let i=await zr({repoRoot:e,worktreeRoot:t});if(d(i))return s(i.message);if(i.data){M.debug("[sync] remove stale remote worktree registration");let a=await k({args:["worktree","remove","--force",t],cwd:e});if(d(a))return s(`Failed to remove stale worktree registration
25
- ${a.message}`)}}return Ea({repoRoot:e,worktreeRoot:t})},Ia=async e=>{let t=await Xt(e);if(d(t))return s(t.message);if(t.data===F)return M.debug("[sync] remote branch already checked out"),c("Remote branch already checked out",!1);M.debug("[sync] checkout remote branch",F);let r=await k({args:["checkout",F],cwd:e});return d(r)?s(`Failed to checkout ${F}
26
- ${r.message}`):c("Checked out remote branch",!0)},Sa=async e=>{M.debug("[sync] ensure remote upstream",F);let t=await qr(e);if(d(t))return s(t.message);if(t.data)return M.debug("[sync] remote upstream already configured"),c("Remote upstream already configured",!1);let r=await Gt({repoRoot:e,remote:z});if(d(r))return s(r.message);if(!r.data)return M.debug("[sync] no remote configured for upstream"),c("No remote available for upstream",!1);let n=await Jt({repoRoot:e,remote:z,branch:F});if(d(n))return s(n.message);if(n.data){M.debug("[sync] fetch remote branch before upstream set");let i=await k({args:["fetch",z,F],cwd:e});if(d(i))return s(`Failed to fetch ${F}
27
- ${i.message}`);M.debug("[sync] set upstream to remote branch");let a=await k({args:["branch","--set-upstream-to",`${z}/${F}`,F],cwd:e});return d(a)?s(`Failed to set remote upstream
28
- ${a.message}`):c("Configured remote upstream",!0)}M.debug("[sync] publish remote branch and set upstream");let o=await k({args:["push","-u",z,F],cwd:e});return d(o)?s(`Failed to publish remote branch
29
- ${o.message}`):c("Published remote branch and configured upstream",!0)},Ko=async({worktreeRoot:e,ownEventFileName:t})=>{M.debug("[sync] stage own event file in remote worktree",t);let r=await k({args:["add",ua(t)],cwd:e});return d(r)?s(`Failed to stage remote own event file
30
- ${r.message}`):c("Staged remote own event file",void 0)},Vo=async({repoRoot:e,worktreeRoot:t})=>{let r=await Ca(e);return d(r)?s(r.message):(M.debug("[sync] create remote sync commit"),Mo({cwd:t,message:r.data}))},en=async e=>{M.debug("[sync] push remote worktree");let t=await k({args:["push"],cwd:e});return d(t)?s(`Failed during remote push
31
- ${t.message}`):c("Pushed remote",!0)},tn=async({repoRoot:e,worktreeRoot:t,ensureUpstream:r})=>{M.debug("[sync] bootstrap remote storage",{repoRoot:e,worktreeRoot:t,ensureUpstream:r});let n=!1;for(let o of[fa(),await Na({repoRoot:e}),await ba({repoRoot:e,worktreeRoot:t}),await Ia(t),r?await Sa(t):c("Skipped remote upstream bootstrap",!1)]){if(d(o))return s(o.message);n=n||!!o.data}return M.debug("[sync] bootstrap changed",n),c(r?"Bootstrapped remote storage":"Bootstrapped remote storage (readonly)",n)},rn=(e,t)=>{for(let r of[ot(e),ot(t)]){let n=er(r);if(d(n))return s(n.message)}return c("Ensured remote layout",void 0)};var zo=async(e=process.cwd())=>{logger.debug("[sync] start readonly sync",{cwd:e});let t=await jr(e);if(d(t))return s(t.message);let r=t.data,n=Xr(r);logger.debug("[sync] resolved readonly roots",{repoRoot:r,worktreeRoot:n});let o=await xt(r);if(d(o))return s(o.message);if(o.data)return s("Cannot sync while a git operation is in progress in the current repo");let i=await Qr(r);if(d(i))return s(i.message);logger.debug("[sync] readonly ensure initial commit changed",i.data);let a=await tn({repoRoot:r,worktreeRoot:n,ensureUpstream:!1});if(d(a))return s(a.message);let l=await xt(n);if(d(l))return s(l.message);if(l.data)return s("Cannot sync while a git operation is in progress in the remote worktree");let m=rn(r,n);if(d(m))return s(m.message);logger.debug("[sync] readonly pull remote branch");let u=await Yt({cwd:n,remote:z,branch:F});if(d(u))return s(u.message);logger.debug("[sync] readonly pulled remote",u.data);let g=Zr({repoRoot:r,worktreeRoot:n});return d(g)?s(g.message):(logger.debug("[sync] readonly hydrated from remote",g.data),c("Synced from remote",{repoRoot:r,worktreeRoot:n}))},wa=({repoRoot:e,worktreeRoot:t,ownEventFileName:r})=>{let n=Yr({root:e,fileName:r}),o=Yr({root:t,fileName:r});return Aa.existsSync(n)?(logger.debug("[sync] merge own event file to remote",r),Zt({sourceFile:n,targetFile:o})):(logger.debug("[sync] local own event file missing",n),c("Local own event file missing, nothing to merge",!1))},jo=async({repoRoot:e,worktreeRoot:t,ownEventFileName:r})=>{let n=wa({repoRoot:e,worktreeRoot:t,ownEventFileName:r});if(d(n))return s(n.message);if(!n.data)return c("Own event file already up to date in remote worktree",{createdCommit:!1});let o=await Ko({worktreeRoot:t,ownEventFileName:r});if(d(o))return s(o.message);let i=await Vo({repoRoot:e,worktreeRoot:t});return d(i)?s(i.message):c("Merged, staged, and committed own event file",{createdCommit:!0,commitSha:i.data})},qo=async({cwd:e=process.cwd(),ownEventFileName:t})=>{logger.debug("[sync] start write sync",{cwd:e,ownEventFileName:t});let r=await jr(e);if(d(r))return s(r.message);let n=r.data,o=Xr(n);logger.debug("[sync] resolved roots",{repoRoot:n,worktreeRoot:o});let i=await Do(n);if(d(i))return s(i.message);if(i.data)return s("Cannot run :sync while the repository is in detached HEAD state");if(t.includes("/")||t.includes("\\"))return s("Own event file must be a file name, not a path");if(!t.endsWith(".jsonl"))return s("Own event file must end with .jsonl");let a=await xt(n);if(d(a))return s(a.message);if(a.data)return s("Cannot run :sync while a merge, rebase, cherry-pick, or revert is in progress in the current repo");let l=await Qr(n);if(d(l))return s(l.message);logger.debug("[sync] ensure initial commit changed",l.data);let m=await tn({repoRoot:n,worktreeRoot:o,ensureUpstream:!0});if(d(m))return s(m.message);let u=await xt(o);if(d(u))return s(u.message);if(u.data)return s("Cannot run :sync while a merge, rebase, cherry-pick, or revert is in progress in the remote worktree");let g=rn(n,o);if(d(g))return s(g.message);let y=!1,v,I=!1,S=!1,N=!1;logger.debug("[sync] pull remote branch before local copy");let b=await Yt({cwd:o,remote:z,branch:F});if(d(b))return s(b.message);I=b.data,logger.debug("[sync] pulled remote",I);let w=Zr({repoRoot:n,worktreeRoot:o});if(d(w))return s(w.message);N=w.data,logger.debug("[sync] hydrated from remote",N);let B=await jo({repoRoot:n,worktreeRoot:o,ownEventFileName:t});if(d(B))return s(B.message);y=B.data.createdCommit,v=B.data.commitSha,logger.debug("[sync] sync own file result",B.data);let oe=await en(o),q=oe;if(d(oe)&&Po(oe.message)){let Me=await Yt({cwd:o,remote:z,branch:F});if(d(Me))return s(Me.message);let Re=await jo({repoRoot:n,worktreeRoot:o,ownEventFileName:t});if(d(Re))return s(Re.message);if(Re.data.createdCommit&&(y=!0,v=Re.data.commitSha),logger.debug("[sync] retry sync own file result",Re.data),q=await en(o),d(q))return s(q.message)}if(d(q))return s(q.message);if(S=q.data,logger.debug("[sync] pushed remote",S),y){let Me=await k({args:["rev-parse","HEAD"],cwd:o});if(d(Me))return s(Me.message);v=Me.data.stdout.trim()}return c("Synced event logs with remote",{repoRoot:n,worktreeRoot:o,createdCommit:y,commitSha:v,pulled:I,pushed:S,hydrated:N,bootstrapped:m.data})};var Ta=e=>Object.values(C().tags).find(t=>t.name===e),Ma=e=>Object.values(C().contributors).find(t=>t.name===e),Go=[{systemOnly:!0,intent:R.Move,mode:p.COMMAND_LINE,action:()=>{let e=Y();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:r}=e.data,{modifier:n}=ue().commandMeta,o=()=>{let u=Pe();if(!u)return s("No pending move state");let g=u.payload.id;if(!C().nodes[g])return s("Moved node not found");let v=u.payload.parent,I=C().nodes[v];if(!I)return s("Move parent not found");let S=T(v).findIndex(N=>N.id===g);return S===-1?s("Moved node not found among rendered children"):(O.navigate({currentNode:I,selectedIndex:S}),c("Synchronized navigation to moved node",null))},i=u=>{if(d(u))return s(u.message);let g=o();return d(g)?s(g.message):c("Updated move preview",null)},{currentNode:a,selectedIndex:l}=C(),m=T(a.id)[l];if(!m)return A({mode:p.DEFAULT}),s("No move target");if(n==="start"){if(m.readonly)return s("Target node is read-only");if(l===-1)return s("No item selected");if(!m.parentNodeId)return s("Target has no parent");let u=T(m.parentNodeId),g=u.findIndex(({id:N})=>N===m.id);if(g===-1)return s("Target not found among siblings");let y=u[g-1],v=u[g+1],I=v!=null?{at:"before",sibling:v.id}:y!=null?{at:"after",sibling:y.id}:{at:"start"};rt({id:$(),userId:t,userName:r,action:"move.node",payload:{id:m.id,parent:m.parentNodeId,pos:I}}),A({mode:p.MOVE});let S=o();return d(S)?s(S.message):c("Move initialized",null)}if(n==="next")return A({mode:p.MOVE}),i($r(1));if(n==="previous")return A({mode:p.MOVE}),i($r(-1));if(n==="to-next")return A({mode:p.MOVE}),i(Hr(1));if(n==="to-previous")return A({mode:p.MOVE}),i(Hr(-1));if(n==="confirm"){A({mode:p.DEFAULT});let u=Pe();if(!u)return s("No pending move to confirm");let g=Q(u);if(d(g))return g;let y=o();return d(y)?s(y.message):(rt(null),c("Moved item",null))}return n==="cancel"?(rt(null),A({mode:p.DEFAULT}),c("Cancelling move",null)):s("Invalid move modifier")}},{intent:R.Delete,mode:p.COMMAND_LINE,action:()=>{let e=Y();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:r}=e.data,{currentNode:n,selectedIndex:o}=C(),i=T(n.id)[o];return i?Q({id:$(),userId:t,userName:r,action:"delete.node",payload:{id:i.id}}):s("Unable to resolve child to delete")},onSuccess:()=>A({mode:p.DEFAULT})},{intent:R.Edit,mode:p.COMMAND_LINE,action:()=>{let e=Y();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:r}=e.data,n=nt(C().breadCrumb,"TICKET");if(d(n))return s("Edit target must be an issue");let o=n.data;if(o.readonly)return s("Cannot edit readonly field");let{currentNode:i,selectedIndex:a}=C();if(!T(o.id)[a])return s("No selected field");let m=T(i.id)[a];if(!m)return s("No selected field");if(m.readonly)return s("Cannot edit readonly field");let u=m.props.value;if(typeof u!="string")return s("Selected field is not editable text");let g=so(u);if(d(g))return s("Failed to edit field");let y=g.data;return y===u?c("No changes made",null):m.title==="Description"?Q({id:$(),userId:t,userName:r,action:"edit.description",payload:{id:m.id,md:y}}):m.title==="Title"?Q({id:$(),userId:t,userName:r,action:"edit.title",payload:{id:m.id,name:y}}):s(`Editing not supported for "${m.title}"`)},onSuccess:()=>A({mode:p.DEFAULT})},{intent:R.Filter,mode:p.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=ue().commandMeta,r=/(!=|=)/,[n,o]=e.split(r);if(!n||!(l=>K(f.FILTER).map(m=>m.split(r)[0]).includes(l))(n))return s("Invalid filter modifier");let a={target:n,operator:"=",value:t.trim()};return de(l=>({...l,filters:e==="clear"?[]:[...l.filters,a],mode:p.DEFAULT})),c("Viewing help",null)}},{intent:R.ViewHelp,mode:p.COMMAND_LINE,action:()=>(A({mode:p.HELP}),c("Viewing help",null))},{intent:R.CloseIssue,mode:p.COMMAND_LINE,action:()=>{let e=Y();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:r}=e.data,{currentNode:n,selectedIndex:o}=C(),i=T(n.id)[o];if(!i)return s("Unable to close issue, no target found");if(!i.parentNodeId)return s("No target parent found");if(!$e(i))return s("Cannot close in this context");let a=Q({id:$(),userId:t,userName:r,action:"close.issue",payload:{id:i.id,parent:i.parentNodeId}});return d(a)?a:c("Viewing help",null)}},{intent:R.ReopenIssue,mode:p.COMMAND_LINE,action:()=>{let e=Y();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:r}=e.data,{currentNode:n,selectedIndex:o}=C(),i=T(n.id)[o];if(!i)return s("Unable to reopen issue, no target found");let a=i.context==="TICKET"?c("Resolved ticket",i):Ge(i.id,"TICKET");if(d(a))return s("Cannot reopen in this context");let l=a.data,m=Q({id:$(),userId:t,userName:r,action:"reopen.issue",payload:{id:l.id}});return d(m)?m:c("Issue reopened",null)},onSuccess:()=>A({mode:p.DEFAULT})},{intent:R.SetUserName,mode:p.COMMAND_LINE,action:()=>{let{userId:e,preferredEditor:t,userName:r}=ce(),n=Ft()?.trim();if(!n)return s("No username provided");let o=n??r,i=e??$();if(!o||!i)return s("Unable to resolve user name or id");let a=Vr({userName:o,userId:i,preferredEditor:t??""});return d(a)?a:(mt({userName:o,userId:i}),A({mode:p.DEFAULT}),c(`Username set to "${n}"`,null))}},{intent:R.Init,mode:p.COMMAND_LINE,action:()=>{let e=Jo();if(d(e))return e;let{rootNodeId:t,nodes:r}=C();return O.navigate({currentNode:r[t],selectedIndex:0}),c("Project initialized",null)}},{intent:R.SetEditor,mode:p.COMMAND_LINE,action:()=>{let e=Ft()?.trim();if(!e)return s("No editor provided");let t=Vr({preferredEditor:e});return d(t)?t:(mt({preferredEditor:e}),A({mode:p.DEFAULT}),c(`Editor configuration set to "${e}"`,null))}},{intent:R.NewItem,mode:p.COMMAND_LINE,action:(e,t)=>{let r=Y();if(d(r))return s("Unable to resolve user ID");let{userId:n,userName:o}=r.data;if(!t.inputString)return s(`provide a name for your ${t.modifier}`);let{breadCrumb:i,currentNode:a,selectedIndex:l}=C(),m=u=>{let g=Q(u);if(d(g))return g;let y=E.getNode(g.data.result.id);if(!y)return s("Created node not found");if(!y.parentNodeId)return g;let v=E.getNode(y.parentNodeId);return v?(O.navigate({currentNode:v,selectedIndex:E.getSiblings(y.parentNodeId).findIndex(({id:I})=>I===y.id)}),g):s("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:u}=C(),g=E.getNode(u);return g?m({id:$(),userId:n,userName:o,action:"add.board",payload:{id:$(),name:t.inputString,parent:g.id}}):s("Workspace not found")}if(t.modifier==="swimlane"){let u=nt(i,"BOARD");return d(u)?s("Unable to add swimlane in this context"):m({id:$(),userId:n,userName:o,action:"add.swimlane",payload:{id:$(),name:t.inputString,parent:u.data.id}})}if(t.modifier==="issue"){let u=T(a.id)[l],g=a.context==="SWIMLANE"?a:a.context==="BOARD"&&u?.context==="SWIMLANE"?u:(()=>{let N=nt(i,"SWIMLANE");return d(N)?null:N.data})();if(!g)return s("Unable to add issue in this context");let y=ao({userId:n,userName:o,name:t.inputString,parent:g.id}),v=jt(y);if(v.some(N=>d(N)))return s("Issue create failed: "+v.filter(d).map(N=>N.message).filter(Boolean).join(", "));let I=v[0];if(!I||d(I))return s("Issue creation failed");let S=y[0]?.payload.id;return S?(O.navigate({currentNode:g,selectedIndex:E.getSiblings(g.id).findIndex(({id:N})=>N===S)}),c("Issue created",null)):s("Unable to determine ticket id")}return An()},onSuccess:()=>A({mode:p.DEFAULT})},{intent:R.SetView,mode:p.COMMAND_LINE,action:()=>{let{commandMeta:e}=ue();return e.validity===xe.Invalid?s("Invalid command "+ve):(de(t=>({...t,viewMode:e.modifier==="wide"?"wide":e.modifier==="dense"?"dense":t.viewMode})),c("View set",null))},onSuccess:()=>A({mode:p.DEFAULT})},{intent:R.Rename,mode:p.COMMAND_LINE,action:()=>{let e=Y();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:r}=e.data,{currentNode:n,selectedIndex:o}=C(),i=T(n.id)[o];if(!i)return s("Missing node");if(i.readonly)return s("Cannot rename readonly node");let a=Ft();return a?Q({id:$(),userId:t,userName:r,action:"edit.title",payload:{id:i.id,name:a}}):s("Provide a new name")},onSuccess:()=>A({mode:p.DEFAULT})},{intent:R.TagTicket,mode:p.COMMAND_LINE,action:()=>{let e=Y();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:r}=e.data,{modifier:n,inputString:o}=ue().commandMeta,i=(n||o).trim();if(!i)return s("Provide a tag");let{selectedIndex:a,currentNode:l}=C(),m=T(l.id)[a];if(!m)return s("Invalid tag target");let u=Ge(m.id,"TICKET");if(d(u))return s("Unable to tag issue in this context");let g=u.data,y=Ta(i),v;if(y)v=y.id;else{let N=$(),b=Q({id:$(),userId:t,userName:r,action:"create.tag",payload:{id:N,name:i}});if(d(b))return b;v=b.data.result.id}let I=E.getFieldByTitle(g.id,"Tags");return I?T(I.id).some(N=>N.props?.value===v)?s("Already tagged with that tag"):Q({id:$(),userId:t,userName:r,action:"tag.issue",payload:{id:$(),target:g.id,tagId:v}}):s("Unable to locate tags field")},onSuccess:()=>A({mode:p.DEFAULT})},{intent:R.AssignUserToTicket,mode:p.COMMAND_LINE,action:()=>{let e=Y();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:r}=e.data,{modifier:n,inputString:o}=ue().commandMeta,i=(n||o).trim();if(!i)return s("Provide an assignee");let{selectedIndex:a,currentNode:l}=C(),m=T(l.id)[a];if(!m)return s("Invalid assign target");let u=Ge(m.id,"TICKET");if(d(u))return s("Unable to assign issue in this context");let g=u.data,y=Ma(i),v;if(y)v=y.id;else{let N=$(),b=Q({id:$(),userId:t,userName:r,action:"create.contributor",payload:{id:N,name:i}});if(d(b))return b;v=b.data.result.id}let I=E.getFieldByTitle(g.id,"Assignees");return I?T(I.id).some(N=>N.props?.value===v)?s("Assignee already assigned"):Q({id:$(),userId:t,userName:r,action:"assign.issue",payload:{id:$(),target:g.id,contributor:v}}):s("Unable to locate assignees field")},onSuccess:()=>A({mode:p.DEFAULT})},{intent:R.Sync,mode:p.COMMAND_LINE,action:async()=>{H(()=>""),A({syncStatus:{msg:"Syncing",status:"syncing"}});let{userId:e,userName:t}=ce();if(!e)return s("Unable to resolve userId");if(!t)return s("Unable to resolve userName");let r=Wr();if(d(r))return s("Unable to resolve log file name");let n=await qo({ownEventFileName:r.data});if(d(n))return A({syncStatus:{msg:n.message,status:"outOfSync"}}),s(`Unable to sync state. ${n.message}`);A({syncStatus:{msg:"Synced",status:"synced"},mode:p.DEFAULT});let o=Kt();return d(o)?s("Unable to load events"):(gt(o.data),c("Synced",!0))}}];var ne=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:r,modifier:n,inputString:o}}=ue();if(!t)return s("No command to confirm");if(!e&&r===xe.Invalid)return s("Invalid command");let i=to(t);Jn();let a=Go.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===i);if(!a)return Dt({result:ve.Fail,message:"Command not found",data:null});let l=await a.action(a,{command:t,inputString:o,modifier:n});return d(l)?Dt(l):(Xn({addToHistory:!e}),a.onSuccess?.(),Dt(l))};var tr=[{intent:"exit",mode:p.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(A({mode:p.COMMAND_LINE}),H(()=>"move cancel"),ne({isForceExecutedBySystem:!0}))},{intent:"initMove",mode:p.DEFAULT,description:"[m] move init/confirm",action:()=>(A({mode:p.COMMAND_LINE}),H(()=>"move start"),ne({isForceExecutedBySystem:!0}))},{intent:"confirmMove",mode:p.MOVE,action:()=>(A({mode:p.COMMAND_LINE}),H(()=>"move confirm"),ne({isForceExecutedBySystem:!0}))}],rr=[{intent:"movePreviousItem",mode:p.MOVE,action:()=>Pe()?(A({mode:p.COMMAND_LINE}),H(()=>"move previous"),ne({isForceExecutedBySystem:!0})):s("No pending move")},{intent:"moveNextItem",mode:p.MOVE,action:()=>Pe()?(A({mode:p.COMMAND_LINE}),H(()=>"move next"),ne({isForceExecutedBySystem:!0})):s("No pending move")}],Xo=[{intent:"moveToNextContainer",mode:p.MOVE,action:()=>Pe()?(A({mode:p.COMMAND_LINE}),H(()=>"move to-next"),ne({isForceExecutedBySystem:!0})):s("No pending move")},{intent:"moveToPreviousContainer",mode:p.MOVE,action:()=>Pe()?(A({mode:p.COMMAND_LINE}),H(()=>"move to-previous"),ne({isForceExecutedBySystem:!0})):s("No pending move")}];var Yo={[L.WORKSPACE]:[...tr,...rr],[L.BOARD]:[...tr,...rr],[L.SWIMLANE]:[...tr,...rr,...Xo],[L.TICKET]:[],[L.FIELD]:[],[L.FIELD_LIST]:[],[L.TEXT]:[]};var Qo=[{intent:"addItem",mode:p.DEFAULT,description:"[n] new...",action:()=>(A({mode:p.COMMAND_LINE}),H(()=>`${f.NEW} `),c("Adding new item",null))},{intent:"Delete",mode:p.DEFAULT,description:"[d] delete",action:()=>(A({mode:p.COMMAND_LINE}),H(()=>`${f.DELETE} `),c("Deleting item",null))},{intent:"initCommandLine",mode:p.DEFAULT,description:"[:] focus command line",action:()=>(A({mode:p.COMMAND_LINE}),H(()=>""),c("Entering command line mode",null))},{intent:"confirm",mode:p.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>(O.enterChildNode(),c("Entering context",null))},{intent:"exit",mode:p.DEFAULT,description:"[q] exit context",action:()=>(logger.debug("Executing exit action"),O.enterParentNode(),c("Exiting context",null))},{intent:"navPreviousItem",mode:p.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(O.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:"navNextItem",mode:p.DEFAULT,action:()=>(O.navigateToNextItem(),c("Navigating to next item",null))},{intent:"navToPreviousContainer",mode:p.DEFAULT,action:()=>(O.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:"navToNextContainer",mode:p.DEFAULT,action:()=>(O.navigateToNextContainer(),c("Navigating to next container",null))},{intent:"edit",mode:p.DEFAULT,action:()=>(A({mode:p.COMMAND_LINE}),H(()=>"edit"),ne(),c("Fired command",!0))},{intent:"SetViewDense",mode:p.DEFAULT,description:"[v] view change (wide/dense)",action:()=>(A({viewMode:"dense"}),c("View set",null))},{intent:"SetViewWide",mode:p.DEFAULT,action:()=>(A({viewMode:"wide"}),c("View set",null))},{intent:"sync",mode:p.DEFAULT,description:"[s] sync epiq with remote state branch",action:()=>(A({mode:p.COMMAND_LINE}),H(()=>"sync"),ne({isForceExecutedBySystem:!0}),c("Synced",!0))}];var Zo=[{intent:"viewHelp",mode:p.DEFAULT,action:()=>(A({mode:p.HELP}),c("Viewing help",null))},{intent:"exit",mode:p.HELP,action:()=>(A({mode:p.DEFAULT}),c("Exiting help",null))},{intent:"confirm",mode:p.COMMAND_LINE,action:()=>(ne(),c("Executing command",null))},{intent:"MoveCursorLeft",mode:p.COMMAND_LINE,action:()=>(Fr(-1),c("Moving cursor left",null))},{intent:"MoveCursorRight",mode:p.COMMAND_LINE,action:()=>(Fr(1),c("Moving cursor right",null))},{intent:"MoveCursorLeftOfWord",mode:p.COMMAND_LINE,action:()=>(kr("left"),c("Moving cursor left of word",null))},{intent:"MoveCursorRightOfWord",mode:p.COMMAND_LINE,action:()=>(kr("right"),c("Moving cursor right of word",null))},{intent:"exitCommandLine",mode:p.COMMAND_LINE,action:()=>(A({mode:p.DEFAULT}),c("Exiting command line",null))},{intent:"autoCompleteCommand",mode:p.COMMAND_LINE,action:()=>(H((e,{remainder:t})=>t?e+t:e),c("Auto-completing command",null))},{intent:"captureInput",mode:p.COMMAND_LINE,action:(e,{sequence:t})=>(H(r=>r+t),c("Capturing input",null))},{intent:"eraseInput",mode:p.COMMAND_LINE,action:()=>(qn(),c("Erasing input",null))},{intent:"EraseInputWord",mode:p.COMMAND_LINE,action:()=>(Gn(),c("Erasing input word",null))},{intent:"getLastCommandFromHistory",mode:p.COMMAND_LINE,action:()=>(Yn(),c("Getting last command from history",null))},{intent:"getNextCommandFromHistory",mode:p.COMMAND_LINE,action:()=>(Qn(),c("Getting next command from history",null))}];import Ra from"chalk";var nr=": for command line",ei="q to exit",ti=`${Ra.hex(h.accent)("m")} to confirm`,nn={[L.WORKSPACE]:[nr],[L.BOARD]:[nr],[L.BOARD+p.COMMAND_LINE]:[nr],[L.SWIMLANE]:[nr],[L.TICKET+p.HELP]:[ei],[L.SWIMLANE+p.HELP]:[ei],[L.TICKET]:[],[L.FIELD]:[],[L.SWIMLANE+p.MOVE]:[ti],[L.TICKET+p.MOVE]:[ti]};var or=e=>e.trim().toLocaleLowerCase(),La=(e,t)=>{let r=E.getFieldByTitle(e,t);if(!r)return"";let n=r.props?.value;return typeof n=="string"?n:""},Pa=e=>{let{tags:t}=C(),r=E.getFieldByTitle(e,"Tags");return r?W(r.id).map(n=>{let o=n.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(n=>!!n):[]},Da=e=>{let{contributors:t}=C(),r=E.getFieldByTitle(e,"Assignees");return r?W(r.id).map(n=>{let o=n.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(n=>!!n):[]},ri=(e,t)=>{let r=t.value;if(!r)return!0;switch(t.target){case"title":return or(e.title??"").includes(r);case"description":return or(La(e.id,"Description")).includes(r);case"tag":return Pa(e.id).map(or).some(l=>l.includes(r));case"assignee":return Da(e.id).map(or).some(l=>l.includes(r));default:return!0}};function ni(e,t,r){let n=t[e];if(!n)return s("buildBreadCrumb(): current node not found");let o=[],i=n;for(;i&&(o.push(i),!(i.id===r||!i.parentNodeId));)i=t[i.parentNodeId];let a=o[o.length-1];return!a||a.id!==r?s("buildBreadCrumb(): node is not connected to root"):(o.reverse(),c("Breadcrumb built",o))}var oi=e=>{let t={};for(let r of e)r.intent&&(t[r.mode]||(t[r.mode]={}),t[r.mode][r.intent]=r);return t};var ir,on=new Set,ii=()=>{for(let e of on)e()},ka=e=>(on.add(e),()=>on.delete(e));function si(e){let{currentNodeId:t,mode:r,rootNodeId:n,nodes:o,filters:i}=e;if(!t)return s("derive(): currentNodeId is missing");if(!n)return s("derive(): rootNode is missing");if(!o[n])return s("derive(): unable to find root node");let l=o[t];if(!l)return logger.error("Unable to derive state, currentNode not found"),s("Unable to derive state, currentNode not found");let m=ni(t,o,n);if(d(m))return logger.error(m.message),m;let u=m.data,{context:g}=l,y=nn[g+r]??nn[g]??[],v=[...Qo,...Yo[g]??[],...Zo],I=oi(v),S=Ba(o,i),N=S[t]?.[e.selectedIndex]??null;return c("Derived successfully",{...e,currentNode:l,breadCrumb:u,availableHints:y,availableActions:v,actionIndex:I,selectedNode:N,renderedChildrenIndex:S})}var C=()=>(ir||logger.error("State not initialized. Call initWorkspaceState() first.",new Error().stack),ir);function lo(e){let t={filters:[],tags:{},contributors:{},viewMode:"dense",mode:p.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,currentNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""}},r=si(t);return d(r)?r:(ir=r.data,ii(),c("State initialized",null))}function de(e){let t=C(),r=e(t),n=si(r);return d(n)?s(n.message??"Unable to update state"):(ir=n.data,ii(),c("State updated",null))}var A=e=>de(t=>({...t,...e}));var _=()=>Fa(ka,C,C),Ba=(e,t)=>{let r={};for(let n of Object.values(e))$e(n)&&t.length>0&&!t.every(o=>ri(n,o))||!n.parentNodeId||n.isDeleted||((!n.parentNodeId||!r[n.parentNodeId])&&(r[n.parentNodeId]=[]),r[n.parentNodeId].push(n));for(let n of Object.keys(r))r[n].sort((o,i)=>{let a=e[o.id],l=e[i.id];return!a||!l?0:a.rank.localeCompare(l.rank)});return r},T=e=>C().renderedChildrenIndex[e]??[];var O={exit(){process.exit(0)},enterChildNode(){let e=C(),t=e.currentNode,r=Math.max(0,e.selectedIndex),n=T(t.id)[r];!n||t.context==="FIELD"||O.navigate({currentNode:n,selectedIndex:T(n.id).length?0:-1})},enterParentNode(){let{currentNode:e,nodes:t}=C();if(!e.parentNodeId){logger.info("Missing parent node id");return}let r=t[e.parentNodeId];if(!r){logger.error("Parent not found");return}let n=T(r.id),o=n.findIndex(({id:a})=>a===e.id),i=n.length===0?-1:o>=0?o:0;O.navigate({currentNode:r,selectedIndex:i})},navigateToNextItem:()=>ai(1),navigateToPreviousItem:()=>ai(-1),navigateToNextContainer:()=>di(1),navigateToPreviousContainer:()=>di(-1),navigate:({currentNode:e=C().currentNode,selectedIndex:t})=>{A({currentNodeId:e.id,selectedIndex:t})}},ai=e=>{let t=C(),r=T(t.currentNode.id).length;if(r===0)return;let o=(Math.max(0,t.selectedIndex)+e+r)%r;O.navigate({selectedIndex:o})},di=e=>{let{currentNode:t,nodes:r,selectedIndex:n}=C();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=r[t.parentNodeId];if(!t||!o)return;let i=T(o.id),a=i.findIndex(v=>v.id===t.id);if(a<0)return;let l=i.at(a+e)??i.at(0);if(!l)return;let m=T(l.id),u=Math.max(0,m.length-1),g=Math.min(Math.max(0,n),u),y=m.length?g:-1;O.navigate({currentNode:l,selectedIndex:y})};var Ee="system",be="ACTOR",ht=Oa(),ke=null;function Ua(){let e=Object.values(C().nodes).find(n=>n.context==="WORKSPACE");if(!e)throw new Error("No workspace found in event log");let[t]=T(e.id),[r]=t?T(t.id):[];if(logger.debug("Boot navigation target:",{workspace:e?.id,firstBoard:t?.id,firstSwimlane:r?.id}),r){let n=C().renderedChildrenIndex?.[r.id]??[];return{currentNode:r,selectedIndex:n.length>0?0:-1}}else return t?{currentNode:t,selectedIndex:0}:e?{currentNode:e,selectedIndex:0}:{currentNode:C().nodes[C().rootNodeId],selectedIndex:0}}function Wa(){let e=Ua();O.navigate(e)}function Ha(){let e=ht(),t=ht(),r=ht(),n=ht(),o=ht();return[{id:Ne(),userId:Ee,userName:be,action:"init.workspace",payload:{id:e,name:"Workspace"}},{id:Ne(),userId:Ee,userName:be,action:"add.board",payload:{id:t,name:"Default",parent:e}},{id:Ne(),userId:Ee,userName:be,action:"add.swimlane",payload:{id:r,name:"Todo",parent:t}},{id:Ne(),userId:Ee,userName:be,action:"add.swimlane",payload:{id:n,name:"Review",parent:t}},{id:Ne(),userId:Ee,userName:be,action:"add.swimlane",payload:{id:o,name:"Done",parent:t}},{id:Ne(),userId:Ee,userName:be,action:"add.board",payload:{id:Ut,name:"Closed",parent:e}},{id:Ne(),userId:Ee,userName:be,action:"add.swimlane",payload:{id:Qe,name:"Closed",parent:Ut}},{id:Ne(),userId:Ee,userName:be,action:"lock.node",payload:{id:Ut}},{id:Ne(),userId:Ee,userName:be,action:"lock.node",payload:{id:Qe}}]}function Lt(){return ke!==null}function Jo(){if(!ke||ke.length===0)return c("No pending default events to persist",null);let t=jt(ke).filter(d);return t.length>0?s([it.bold.red("Materializing failed"),"",...t.map((r,n)=>`${it.dim.gray(`${n+1}.`)} ${it.dim(r.message)}`),`
18
+ `,Aa=(e,t)=>{let n=new Map;for(let r of[...t,...e])n.set(Zn(r),r);return[...n.values()].sort((r,o)=>{let i=zo(r)-zo(o);return i!==0?i:Zn(r).localeCompare(Zn(o))})},on=({sourceFile:e,targetFile:t})=>{let n=Jt(e);if(d(n))return s(n.message);let r=Jt(t);if(d(r))return s(r.message);let o=Aa(r.data,n.data),i=wa(o);return(rn.existsSync(t)?rn.readFileSync(t,"utf8"):"")===i?l("Event file already merged",!1):(rn.mkdirSync(ba.dirname(t),{recursive:!0}),rn.writeFileSync(t,i,"utf8"),l("Merged event file",!0))};var k="epiq/events",J="origin",er=xe(),qo="events",Ra="4b825dc642cb6eb9a060e54bf8d69288fbee4904",La=e=>X.join(er,qo,e),Pa=e=>Ta("sha1").update(X.resolve(e)).digest("hex").slice(0,12),Yo=()=>X.join(Ma.homedir(),".epiq"),Jo=()=>X.join(Yo(),"worktrees"),tr=e=>X.join(Jo(),Pa(e)),Da=e=>X.join(e,er),it=e=>X.join(Da(e),qo),bt=({root:e,fileName:t})=>X.join(it(e),t),sn=e=>(A.debug("[sync] ensure dir",e),ve.mkdirSync(e,{recursive:!0}),l("Ensured directory",void 0)),Fa=()=>{A.debug("[sync] ensure epiq storage");let e=sn(Yo());if(d(e))return s(e.message);let t=sn(Jo());return d(t)?s(t.message):l("Ensured epiq storage",void 0)},ka=e=>{ve.existsSync(e)&&(A.debug("[sync] remove path",e),ve.rmSync(e,{recursive:!0,force:!0}))},Oa=e=>{let t=it(e);if(!ve.existsSync(t))return A.debug("[sync] events dir missing",t),l("Events dir missing",[]);let n=ve.readdirSync(t,{withFileTypes:!0}).filter(r=>r.isFile()).map(r=>r.name).filter(r=>r.endsWith(".jsonl")).sort();return A.debug("[sync] listed event files",{eventsDir:t,count:n.length}),l("Listed event files",n)},Ba=async e=>{A.debug("[sync] inspect local HEAD",e);let t=await ze({args:["rev-parse","--verify","HEAD"],cwd:e});return t.exitCode===0?l("Repo has HEAD",!0):t.exitCode===1?l("Repo has no HEAD",!1):s(t.stderr.trim()||"Unable to inspect HEAD")},Ua=Et(async e=>{A.debug("[sync] inspect remote history",{repoRoot:e,remote:J});let t=await Zt({repoRoot:e,remote:J});if(d(t))return s(t.message);if(!t.data)return l("No remote configured",!1);let n=await ze({args:["ls-remote","--heads",J],cwd:e});if(n.exitCode!==0)return s(n.stderr.trim()||"Unable to inspect remote heads");let r=n.stdout.trim().length>0;return A.debug("[sync] remote history",r),l("Checked remote history",r)},e=>X.resolve(e)),nr=async e=>{A.debug("[sync] ensure initial commit");let t=await Ba(e);if(d(t))return s(t.message);if(t.data)return A.debug("[sync] local HEAD exists"),l("Repo already initialized",!1);let n=await Ua(e);if(d(n))return s(n.message);if(n.data)return A.debug("[sync] skip local init commit due to remote history"),l("Skipped local init commit because remote history exists",!1);A.debug("[sync] create empty init commit");let r=await F({args:["commit","--allow-empty","-m","[epiq:init]"],cwd:e});return d(r)?s(`Failed to create initial commit
19
+ ${r.message}`):l("Created initial commit",!0)},rr=({repoRoot:e,worktreeRoot:t})=>{let n=Oa(t);if(d(n))return s(n.message);let r=it(t),o=it(e),i=!1;for(let a of n.data){let m=X.join(r,a),c=X.join(o,a);A.debug("[sync] hydrate event file",{from:m,to:c});let u=on({sourceFile:m,targetFile:c});if(d(u))return s(u.message);i=i||u.data}return A.debug("[sync] hydrate changed",i),l("Hydrated event files from remote worktree",i)},Go=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",Wa=async e=>{let t=await tn(e);if(d(t))return s(t.message);let n=await $o(e);if(d(n))return s(n.message);let r=`[epiq:sync:${Go(t.data)}:${Go(n.data)}]`;return A.debug("[sync] commit message",r),l("Built sync commit message",r)},Ha=async e=>{A.debug("[sync] create empty storage branch",k);let t=await F({args:["commit-tree",Ra,"-m","[epiq:init-storage-branch]"],cwd:e});if(d(t))return s(`Failed to create storage branch commit
20
+ ${t.message}`);let n=t.data.stdout.trim(),r=await F({args:["update-ref",`refs/heads/${k}`,n],cwd:e});return d(r)?s(`Failed to create ${k}
21
+ ${r.message}`):l("Created empty storage branch",!0)},_a=async({repoRoot:e})=>{A.debug("[sync] ensure local remote branch",k);let t=await Ho({repoRoot:e,branch:k});if(d(t))return s(t.message);if(t.data)return A.debug("[sync] local remote branch exists"),l("Local remote branch already exists",!1);let n=await Zt({repoRoot:e,remote:J});if(d(n))return s(n.message);if(n.data){let r=await en({repoRoot:e,remote:J,branch:k});if(d(r))return s(r.message);if(r.data){A.debug("[sync] fetch remote branch before local track");let o=await F({args:["fetch",J,k],cwd:e});if(d(o))return s(`Failed to fetch ${k} from remote
22
+ ${o.message}`);A.debug("[sync] create local tracking branch",k);let i=await F({args:["branch","--track",k,`${J}/${k}`],cwd:e});return d(i)?s(`Failed to create local ${k} from remote
23
+ ${i.message}`):l("Created local remote branch from remote",!0)}}return Ha(e)},$a=async({repoRoot:e,branch:t})=>{let n=await F({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return s(n.message);let r=n.data.stdout.split(`
24
+ `),o=null;for(let i of r){if(i.startsWith("worktree ")){o=i.slice(9);continue}if(i===`branch refs/heads/${t}`&&o)return l("Found worktree for branch",o)}return l("No worktree found for branch",null)},Ka=async({repoRoot:e,worktreeRoot:t})=>{A.debug("[sync] create remote worktree",t);let n=sn(X.dirname(t));if(d(n))return s(n.message);ve.existsSync(t)&&!ve.existsSync(X.join(t,".git"))&&(A.debug("[sync] remove broken remote worktree path",t),ka(t));let r=await F({args:["worktree","add",t,k],cwd:e});return d(r)?s(`Failed to create remote worktree
25
+ ${r.message}`):l("Created remote worktree",!0)},Va=async({repoRoot:e,worktreeRoot:t})=>{A.debug("[sync] ensure remote worktree",t);let n=await $a({repoRoot:e,branch:k});if(d(n))return s(n.message);let r=n.data,o=X.resolve(t),i=r?X.resolve(r):null;if(i&&i===o&&ve.existsSync(i))return A.debug("[sync] reuse existing remote branch worktree",{expected:o,actual:i}),l("Remote branch already checked out in expected worktree",!1);if(i&&i!==o){A.debug("[sync] remove old remote branch worktree",{expected:o,actual:i});let c=await F({args:["worktree","remove","--force",i],cwd:e});if(d(c))return s(`Failed to remove existing remote worktree
26
+ ${c.message}`)}if(i&&!ve.existsSync(i)){A.debug("[sync] prune stale branch worktree registration",{existingBranchWorktree:i});let c=await F({args:["worktree","prune"],cwd:e});if(d(c))return s(`Failed to prune stale worktrees
27
+ ${c.message}`)}let a=await _o({repoRoot:e,worktreeRoot:t});if(d(a))return s(a.message);let m=ve.existsSync(t);if(a.data&&m)return A.debug("[sync] remote worktree exists"),l("Remote worktree already exists",!1);if(a.data&&!m){A.debug("[sync] prune stale remote worktree registration");let c=await F({args:["worktree","prune"],cwd:e});if(d(c))return s(`Failed to prune stale worktrees
28
+ ${c.message}`)}return Ka({repoRoot:e,worktreeRoot:t})},ja=async e=>{let t=await tn(e);if(d(t))return s(t.message);if(t.data===k)return A.debug("[sync] remote branch already checked out"),l("Remote branch already checked out",!1);A.debug("[sync] checkout remote branch",k);let n=await F({args:["checkout",k],cwd:e});return d(n)?s(`Failed to checkout ${k}
29
+ ${n.message}`):l("Checked out remote branch",!0)},za=async e=>{let t=await F({args:["ls-tree","--name-only","HEAD"],cwd:e});if(d(t))return s(t.message);let r=t.data.stdout.trim().split(`
30
+ `).filter(Boolean).filter(a=>a!==er);if(r.length===0)return l("Remote branch is storage-only",!1);A.debug("[sync] remove app files from storage branch",r);let o=await F({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(d(o))return s(`Failed to clean storage branch
31
+ ${o.message}`);let i=await Xn({cwd:e,message:"[epiq:repair-storage-branch]"});return d(i)?s(i.message):l("Cleaned storage branch",!0)},Ga=async e=>{A.debug("[sync] ensure remote upstream",k);let t=await Qn(e);if(d(t))return s(t.message);if(t.data)return A.debug("[sync] remote upstream already configured"),l("Remote upstream already configured",!1);let n=await Zt({repoRoot:e,remote:J});if(d(n))return s(n.message);if(!n.data)return A.debug("[sync] no remote configured for upstream"),l("No remote available for upstream",!1);let r=await en({repoRoot:e,remote:J,branch:k});if(d(r))return s(r.message);if(!r.data)return A.debug("[sync] remote branch missing; upstream will be configured on first push"),l("Deferred upstream until first push",!1);A.debug("[sync] fetch remote branch before upstream set");let o=await F({args:["fetch",J,k],cwd:e});if(d(o))return s(`Failed to fetch ${k}
32
+ ${o.message}`);A.debug("[sync] set upstream to remote branch");let i=await F({args:["branch","--set-upstream-to",`${J}/${k}`,k],cwd:e});return d(i)?s(`Failed to set remote upstream
33
+ ${i.message}`):l("Configured remote upstream",!0)},Xo=async({worktreeRoot:e,ownEventFileName:t})=>{A.debug("[sync] stage own event file in remote worktree",t);let n=await F({args:["add",La(t)],cwd:e});return d(n)?s(`Failed to stage remote own event file
34
+ ${n.message}`):l("Staged remote own event file",void 0)},Qo=async({repoRoot:e,worktreeRoot:t})=>{let n=await Wa(e);return d(n)?s(n.message):(A.debug("[sync] create remote sync commit"),Xn({cwd:t,message:n.data}))},or=async e=>{A.debug("[sync] push remote worktree");let t=await Qn(e);if(d(t))return s(t.message);let n=await F({args:t.data?["push"]:["push","-u",J,k],cwd:e});return A.debug("[sync] push result",n),d(n)?s(`Failed during remote push
35
+ ${n.message}`):l("Pushed remote",!0)},ir=async({repoRoot:e,worktreeRoot:t,ensureUpstream:n})=>{A.debug("[sync] bootstrap remote storage",{repoRoot:e,worktreeRoot:t,ensureUpstream:n});let r=!1,o=[Fa(),await _a({repoRoot:e}),await Va({repoRoot:e,worktreeRoot:t}),await ja(t),await za(t),n?await Ga(t):l("Skipped remote upstream bootstrap",!1)];for(let i of o){if(d(i))return s(i.message);r=r||!!i.data}return A.debug("[sync] bootstrap changed",r),l(n?"Bootstrapped remote storage":"Bootstrapped remote storage (readonly)",r)},sr=(e,t)=>{for(let n of[it(e),it(t)]){let r=sn(n);if(d(r))return s(r.message)}return l("Ensured remote layout",void 0)};var ti=async(e=process.cwd())=>{logger.debug("[sync] start readonly sync",{cwd:e});let t=await Jn(e);if(d(t))return s(t.message);let n=t.data,r=tr(n);logger.debug("[sync] resolved readonly roots",{repoRoot:n,worktreeRoot:r});let o=await Nt(n);if(d(o))return s(o.message);if(o.data)return s("Cannot sync while a git operation is in progress in the current repo");let i=await nr(n);if(d(i))return s(i.message);logger.debug("[sync] readonly ensure initial commit changed",i.data);let a=await ir({repoRoot:n,worktreeRoot:r,ensureUpstream:!1});if(d(a))return s(a.message);let m=await Nt(r);if(d(m))return s(m.message);if(m.data)return s("Cannot sync while a git operation is in progress in the remote worktree");let c=sr(n,r);if(d(c))return s(c.message);logger.debug("[sync] readonly pull remote branch");let u=await nn({cwd:r,remote:J,branch:k});if(d(u))return s(u.message);logger.debug("[sync] readonly pulled remote",u.data);let p=rr({repoRoot:n,worktreeRoot:r});return d(p)?s(p.message):(logger.debug("[sync] readonly hydrated from remote",p.data),l("Synced from remote",{repoRoot:n,worktreeRoot:r}))},qa=({repoRoot:e,worktreeRoot:t,ownEventFileName:n})=>{let r=bt({root:e,fileName:n}),o=bt({root:t,fileName:n});return It.existsSync(r)?(logger.debug("[sync] merge own event file to remote",{ownEventFileName:n,localFile:r,remoteFile:o}),on({sourceFile:r,targetFile:o})):(logger.debug("[sync] local own event file missing",r),l("Local own event file missing, nothing to merge",!1))},Zo=async({repoRoot:e,worktreeRoot:t,ownEventFileName:n})=>{let r=qa({repoRoot:e,worktreeRoot:t,ownEventFileName:n});if(d(r))return s(r.message);let o=await Vo(t);if(d(o))return s(o.message);if(!r.data&&!o.data)return l("Own event file already up to date in remote worktree",{createdCommit:!1});let i=await Xo({worktreeRoot:t,ownEventFileName:n});if(d(i))return s(i.message);let a=await Qo({repoRoot:e,worktreeRoot:t});return d(a)?s(a.message):l("Merged, staged, and committed own event file",{createdCommit:!0,commitSha:a.data})},ei=({repoRoot:e,worktreeRoot:t,ownEventFileName:n})=>{let r=bt({root:e,fileName:n}),o=bt({root:t,fileName:n});logger.debug("[sync] own event file sizes",{local:It.existsSync(r)?It.statSync(r).size:0,remote:It.existsSync(o)?It.statSync(o).size:0})},ni=async({cwd:e=process.cwd(),ownEventFileName:t})=>{logger.debug("[sync] start write sync",{cwd:e,ownEventFileName:t});let n=await Jn(e);if(d(n))return s(n.message);let r=n.data,o=tr(r);logger.debug("[sync] resolved roots",{repoRoot:r,worktreeRoot:o});let i=await jo(r);if(d(i))return s(i.message);if(i.data)return s("Cannot run :sync while the repository is in detached HEAD state");if(t.includes("/")||t.includes("\\"))return s("Own event file must be a file name, not a path");if(!t.endsWith(".jsonl"))return s("Own event file must end with .jsonl");let a=await Nt(r);if(d(a))return s(a.message);if(a.data)return s("Cannot run :sync while a merge, rebase, cherry-pick, or revert is in progress in the current repo");let m=await nr(r);if(d(m))return s(m.message);logger.debug("[sync] ensure initial commit changed",m.data);let c=await ir({repoRoot:r,worktreeRoot:o,ensureUpstream:!0});if(d(c))return s(c.message);let u=await Nt(o);if(d(u))return s(u.message);if(u.data)return s("Cannot run :sync while a merge, rebase, cherry-pick, or revert is in progress in the remote worktree");let p=sr(r,o);if(d(p))return s(p.message);let g=!1,x,S=!1,w=!1,N=!1;logger.debug("[sync] pull remote branch before local copy");let I=await nn({cwd:o,remote:J,branch:k});if(d(I))return s(I.message);S=I.data,logger.debug("[sync] pulled remote",S);let M=rr({repoRoot:r,worktreeRoot:o});if(d(M))return s(M.message);N=M.data,logger.debug("[sync] hydrated from remote",N);let B=await Zo({repoRoot:r,worktreeRoot:o,ownEventFileName:t});if(d(B))return s(B.message);if(g=B.data.createdCommit,x=B.data.commitSha,ei({repoRoot:r,worktreeRoot:o,ownEventFileName:t}),logger.debug("[sync] sync own file result",B.data),g||c.data){let z=await or(o),oe=z;if(d(z)&&Ko(z.message)){let Lt=await nn({cwd:o,remote:J,branch:k});if(d(Lt))return s(Lt.message);let Pe=await Zo({repoRoot:r,worktreeRoot:o,ownEventFileName:t});if(d(Pe))return s(Pe.message);Pe.data.createdCommit&&(g=!0,x=Pe.data.commitSha),ei({repoRoot:r,worktreeRoot:o,ownEventFileName:t}),logger.debug("[sync] retry sync own file result",Pe.data),oe=await or(o)}if(d(oe))return s(oe.message);w=oe.data,logger.debug("[sync] pushed remote",w)}else logger.debug("[sync] no commit created, skipped push");if(g){let z=await F({args:["rev-parse","HEAD"],cwd:o});if(d(z))return s(z.message);x=z.data.stdout.trim()}return l("Synced event logs with remote",{repoRoot:r,worktreeRoot:o,createdCommit:g,commitSha:x,pulled:S,pushed:w,hydrated:N,bootstrapped:c.data})};import{ulid as ri}from"ulid";var st=null,ke=()=>structuredClone(st),at=e=>st=e,oi=()=>{let{currentNode:e,selectedIndex:t}=E(),r=R(e.id)[t];return r?l("Resolved selected child",r):s("Target node not found")};function ar(e){let t=oi();if(d(t))return t;let{currentNode:n,nodes:r}=E();if(!n.parentNodeId)return s("Missing parent node id");let o=r[n.parentNodeId];if(!o)return s("Missing parent node");let i=_(o.id),a=i.findIndex(({id:x})=>x===n.id);if(a<0)return s("Current node not found among siblings");let m=i[a+e];if(!m)return s("Missing sibling node");let c=te();if(d(c))return s("Unable to resolve user ID");let{userId:u,userName:p}=c.data;if(at({id:ri(),userId:u,userName:p,action:"move.node",payload:{id:t.data.id,parent:m.id,pos:{at:"end"}}}),!st)return s("Could not materialize move state");let g=rt(st,!0);return d(g)?g:l("Node moved successfully",g.data)}function dr(e){let t=oi();if(d(t))return t;let{currentNode:n,selectedIndex:r}=E(),i=_(n.id)[r+e];if(!i)return s("Missing sibling node");let a=te();if(d(a))return s("Unable to resolve user ID");let{userId:m,userName:c}=a.data;if(at({id:ri(),userId:m,userName:c,action:"move.node",payload:{id:t.data.id,parent:n.id,pos:{at:e===1?"after":"before",sibling:i.id}}}),!st)return s("Could not materialize move state");let u=rt(st,!0);return d(u)?u:l("Node moved successfully",u.data)}import Ya from"node:os";import ii from"node:path";import{z as an}from"zod";var Ja={userId:"",userName:"",preferredEditor:""},si=an.object({preferredEditor:an.string().optional(),userName:an.string().optional(),userId:an.string().optional()}).strict(),Xa=".epiq",Qa="config.json",ai=()=>ii.join(Ya.homedir(),Xa),cr=()=>ii.join(ai(),Qa),lr=()=>{try{return ce.mkDir(ai()),l("Ensured ~/.epiq exists",null)}catch{return s("Unable to create ~/.epiq")}},Za=e=>{let t;try{t=JSON.parse(e)}catch{return s("Invalid ~/.epiq/config.json JSON")}let n=si.safeParse(t??{});return n.success?l("Parsed config",n.data):s(`Invalid ~/.epiq/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},di=()=>{let e=lr();if(d(e))return s(e.message);let t=cr(),n=ce.readFile(t);return n==null||n.trim()===""?l("No config found, using empty config",{}):Za(n)},ci=e=>{let t=lr();if(d(t))return s(t.message);let n=si.safeParse(e);if(!n.success)return s(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=cr();try{return ce.writeToFile(r,JSON.stringify(n.data,null,2)+`
36
+ `),l("Config written",null)}catch{return s("Unable to write ~/.epiq/config.json")}},mr=e=>{let t=di();if(d(t))return s("Failed to read existing config");let n={...t.data,...e};return ci(n)},li=()=>{let e=cr(),t=lr();if(d(t))throw new Error("Unable to create ~/.epiq");if(!(ce.readFile(e)!==null)){let m=ci(Ja);if(d(m))throw new Error("Unable to create ~/.epiq/config.json")}let r=di();if(d(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:i,userId:a}=r.data;return!i||!a?s("User name or ID not configured in ~/.epiq/config.json"):gt({preferredEditor:o,userName:i,userId:a})};var ed=e=>Object.values(E().tags).find(t=>t.name===e),td=e=>Object.values(E().contributors).find(t=>t.name===e),mi=[{systemOnly:!0,intent:L.Move,mode:y.COMMAND_LINE,action:()=>{let e=te();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:n}=e.data,{modifier:r}=ge().commandMeta,o=()=>{let u=ke();if(!u)return s("No pending move state");let p=u.payload.id;if(!E().nodes[p])return s("Moved node not found");let x=u.payload.parent,S=E().nodes[x];if(!S)return s("Move parent not found");let w=R(x).findIndex(N=>N.id===p);return w===-1?s("Moved node not found among rendered children"):(U.navigate({currentNode:S,selectedIndex:w}),l("Synchronized navigation to moved node",null))},i=u=>{if(d(u))return s(u.message);let p=o();return d(p)?s(p.message):l("Updated move preview",null)},{currentNode:a,selectedIndex:m}=E(),c=R(a.id)[m];if(!c)return T({mode:y.DEFAULT}),s("No move target");if(r==="start"){if(c.readonly)return s("Target node is read-only");if(m===-1)return s("No item selected");if(!c.parentNodeId)return s("Target has no parent");let u=R(c.parentNodeId),p=u.findIndex(({id:N})=>N===c.id);if(p===-1)return s("Target not found among siblings");let g=u[p-1],x=u[p+1],S=x!=null?{at:"before",sibling:x.id}:g!=null?{at:"after",sibling:g.id}:{at:"start"};at({id:K(),userId:t,userName:n,action:"move.node",payload:{id:c.id,parent:c.parentNodeId,pos:S}}),T({mode:y.MOVE});let w=o();return d(w)?s(w.message):l("Move initialized",null)}if(r==="next")return T({mode:y.MOVE}),i(dr(1));if(r==="previous")return T({mode:y.MOVE}),i(dr(-1));if(r==="to-next")return T({mode:y.MOVE}),i(ar(1));if(r==="to-previous")return T({mode:y.MOVE}),i(ar(-1));if(r==="confirm"){T({mode:y.DEFAULT});let u=ke();if(!u)return s("No pending move to confirm");let p=ne(u);if(d(p))return p;let g=o();return d(g)?s(g.message):(at(null),l("Moved item",null))}return r==="cancel"?(at(null),T({mode:y.DEFAULT}),l("Cancelling move",null)):s("Invalid move modifier")}},{intent:L.Delete,mode:y.COMMAND_LINE,action:()=>{let e=te();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:n}=e.data,{currentNode:r,selectedIndex:o}=E(),i=R(r.id)[o];return i?ne({id:K(),userId:t,userName:n,action:"delete.node",payload:{id:i.id}}):s("Unable to resolve child to delete")},onSuccess:()=>T({mode:y.DEFAULT})},{intent:L.Edit,mode:y.COMMAND_LINE,action:()=>{let e=te();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:n}=e.data,r=be(E().breadCrumb,"TICKET");if(d(r))return s("Edit target must be an issue");let o=r.data;if(o.readonly)return s("Cannot edit readonly field");let{currentNode:i,selectedIndex:a}=E();if(!R(o.id)[a])return s("No selected field");let c=R(i.id)[a];if(!c)return s("No selected field");if(c.readonly)return s("Cannot edit readonly field");let u=c.props.value;if(typeof u!="string")return s("Selected field is not editable text");let p=No(u);if(d(p))return s("Failed to edit field");let g=p.data;return g===u?l("No changes made",null):c.title==="Description"?ne({id:K(),userId:t,userName:n,action:"edit.description",payload:{id:c.id,md:g}}):c.title==="Title"?ne({id:K(),userId:t,userName:n,action:"edit.title",payload:{id:c.id,name:g}}):s(`Editing not supported for "${c.title}"`)},onSuccess:()=>T({mode:y.DEFAULT})},{intent:L.Filter,mode:y.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=ge().commandMeta,n=/(!=|=)/,[r,o]=e.split(n);if(!r||!(m=>j(f.FILTER).map(c=>c.split(n)[0]).includes(m))(r))return s("Invalid filter modifier");let a={target:r,operator:"=",value:t.trim()};return ae(m=>({...m,filters:e==="clear"?[]:[...m.filters,a],mode:y.DEFAULT})),l("Viewing help",null)}},{intent:L.ViewHelp,mode:y.COMMAND_LINE,action:()=>(T({mode:y.HELP}),l("Viewing help",null))},{intent:L.CloseIssue,mode:y.COMMAND_LINE,action:()=>{let e=te();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:n}=e.data,{currentNode:r,selectedIndex:o}=E(),i=R(r.id)[o];if(!i)return s("Unable to close issue, no target found");if(!i.parentNodeId)return s("No target parent found");if(!$e(i))return s("Cannot close in this context");let a=ne({id:K(),userId:t,userName:n,action:"close.issue",payload:{id:i.id,parent:i.parentNodeId}});return d(a)?a:l("Viewing help",null)}},{intent:L.ReopenIssue,mode:y.COMMAND_LINE,action:()=>{let e=te();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:n}=e.data,{currentNode:r,selectedIndex:o}=E(),i=R(r.id)[o];if(!i)return s("Unable to reopen issue, no target found");let a=i.context==="TICKET"?l("Resolved ticket",i):Xe(i.id,"TICKET");if(d(a))return s("Cannot reopen in this context");let m=a.data,c=ne({id:K(),userId:t,userName:n,action:"reopen.issue",payload:{id:m.id}});return d(c)?c:l("Issue reopened",null)},onSuccess:()=>T({mode:y.DEFAULT})},{intent:L.SetUserName,mode:y.COMMAND_LINE,action:()=>{let{userId:e,preferredEditor:t,userName:n}=pe(),r=$t()?.trim();if(!r)return s("No username provided");let o=r??n,i=e??K();if(!o||!i)return s("Unable to resolve user name or id");let a=mr({userName:o,userId:i,preferredEditor:t??""});return d(a)?a:(gt({userName:o,userId:i}),T({mode:y.DEFAULT}),l(`Username set to "${r}"`,null))}},{intent:L.Init,mode:y.COMMAND_LINE,action:()=>{let e=pr();if(d(e))return e;let{rootNodeId:t,nodes:n}=E();return U.navigate({currentNode:n[t],selectedIndex:0}),l("Project initialized",null)}},{intent:L.SetEditor,mode:y.COMMAND_LINE,action:()=>{let e=$t()?.trim();if(!e)return s("No editor provided");let t=mr({preferredEditor:e});return d(t)?t:(gt({preferredEditor:e}),T({mode:y.DEFAULT}),l(`Editor configuration set to "${e}"`,null))}},{intent:L.NewItem,mode:y.COMMAND_LINE,action:(e,t)=>{let n=te();if(d(n))return s("Unable to resolve user ID");let{userId:r,userName:o}=n.data;if(!t.inputString)return s(`provide a name for your ${t.modifier}`);let{breadCrumb:i,currentNode:a,selectedIndex:m}=E(),c=u=>{let p=ne(u);if(d(p))return p;let g=b.getNode(p.data.result.id);if(!g)return s("Created node not found");if(!g.parentNodeId)return p;let x=b.getNode(g.parentNodeId);return x?(U.navigate({currentNode:x,selectedIndex:b.getSiblings(g.parentNodeId).findIndex(({id:S})=>S===g.id)}),p):s("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:u}=E(),p=b.getNode(u);return p?c({id:K(),userId:r,userName:o,action:"add.board",payload:{id:K(),name:t.inputString,parent:p.id}}):s("Workspace not found")}if(t.modifier==="swimlane"){let u=be(i,"BOARD");return d(u)?s("Unable to add swimlane in this context"):c({id:K(),userId:r,userName:o,action:"add.swimlane",payload:{id:K(),name:t.inputString,parent:u.data.id}})}if(t.modifier==="issue"){let u=R(a.id)[m],p=a.context==="SWIMLANE"?a:a.context==="BOARD"&&u?.context==="SWIMLANE"?u:(()=>{let N=be(i,"SWIMLANE");return d(N)?null:N.data})();if(!p)return s("Unable to add issue in this context");let g=bo({userId:r,userName:o,name:t.inputString,parent:p.id}),x=Qt(g);if(x.some(N=>d(N)))return s("Issue create failed: "+x.filter(d).map(N=>N.message).filter(Boolean).join(", "));let S=x[0];if(!S||d(S))return s("Issue creation failed");let w=g[0]?.payload.id;return w?(U.navigate({currentNode:p,selectedIndex:b.getSiblings(p.id).findIndex(({id:N})=>N===w)}),l("Issue created",null)):s("Unable to determine ticket id")}return Or()},onSuccess:()=>T({mode:y.DEFAULT})},{intent:L.SetView,mode:y.COMMAND_LINE,action:()=>{let{commandMeta:e}=ge();return e.validity===Ne.Invalid?s("Invalid command "+ye):(ae(t=>({...t,viewMode:e.modifier==="wide"?"wide":e.modifier==="dense"?"dense":t.viewMode})),l("View set",null))},onSuccess:()=>T({mode:y.DEFAULT})},{intent:L.Rename,mode:y.COMMAND_LINE,action:()=>{let e=te();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:n}=e.data,{currentNode:r,selectedIndex:o}=E(),i=R(r.id)[o];if(!i)return s("Missing node");if(i.readonly)return s("Cannot rename readonly node");let a=$t();return a?ne({id:K(),userId:t,userName:n,action:"edit.title",payload:{id:i.id,name:a}}):s("Provide a new name")},onSuccess:()=>T({mode:y.DEFAULT})},{intent:L.TagTicket,mode:y.COMMAND_LINE,action:()=>{let e=te();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:n}=e.data,{modifier:r,inputString:o}=ge().commandMeta,i=(r||o).trim();if(!i)return s("Provide a tag");let{selectedIndex:a,currentNode:m}=E(),c=R(m.id)[a];if(!c)return s("Invalid tag target");let u=Xe(c.id,"TICKET");if(d(u))return s("Unable to tag issue in this context");let p=u.data,g=ed(i),x;if(g)x=g.id;else{let N=K(),I=ne({id:K(),userId:t,userName:n,action:"create.tag",payload:{id:N,name:i}});if(d(I))return I;x=I.data.result.id}let S=b.getFieldByTitle(p.id,"Tags");return S?R(S.id).some(N=>N.props?.value===x)?s("Already tagged with that tag"):ne({id:K(),userId:t,userName:n,action:"tag.issue",payload:{id:K(),target:p.id,tagId:x}}):s("Unable to locate tags field")},onSuccess:()=>T({mode:y.DEFAULT})},{intent:L.AssignUserToTicket,mode:y.COMMAND_LINE,action:()=>{let e=te();if(d(e))return s("Unable to resolve user ID");let{userId:t,userName:n}=e.data,{modifier:r,inputString:o}=ge().commandMeta,i=(r||o).trim();if(!i)return s("Provide an assignee");let{selectedIndex:a,currentNode:m}=E(),c=R(m.id)[a];if(!c)return s("Invalid assign target");let u=Xe(c.id,"TICKET");if(d(u))return s("Unable to assign issue in this context");let p=u.data,g=td(i),x;if(g)x=g.id;else{let N=K(),I=ne({id:K(),userId:t,userName:n,action:"create.contributor",payload:{id:N,name:i}});if(d(I))return I;x=I.data.result.id}let S=b.getFieldByTitle(p.id,"Assignees");return S?R(S.id).some(N=>N.props?.value===x)?s("Assignee already assigned"):ne({id:K(),userId:t,userName:n,action:"assign.issue",payload:{id:K(),target:p.id,contributor:x}}):s("Unable to locate assignees field")},onSuccess:()=>T({mode:y.DEFAULT})},{intent:L.Sync,mode:y.COMMAND_LINE,action:async()=>{$(()=>""),T({syncStatus:{msg:"Syncing",status:"syncing"}});let{userId:e,userName:t}=pe();if(!e)return s("Unable to resolve userId");if(!t)return s("Unable to resolve userName");let n=Ke()?pr():l("No pending default events",null);if(d(n))return s(`Unable to persist default events. ${n.message}`);let r=jn();if(d(r))return s("Unable to resolve log file name");logger.debug("[sync-command] pending defaults",Ke());let o=await ni({ownEventFileName:r.data});if(d(o))return T({syncStatus:{msg:o.message,status:"outOfSync"}}),s(`Unable to sync state. ${o.message}`);T({syncStatus:{msg:"Synced",status:"synced"},mode:y.DEFAULT});let i=ht();return d(i)?s("Unable to load events"):(je(i.data),l("Synced",!0))}},{intent:L.Peek,mode:y.COMMAND_LINE,action:async()=>{let e=be(E().breadCrumb,"BOARD");if(d(e))return e;let t=ht();if(d(t))return s(t.message);let n=t.data,{modifier:r}=ge().commandMeta,o;if(r==="now"){let g=ur();if(d(g))return g;let x=je(n);return x.some(d)?s(x.map(S=>S.message).join(", ")):(T({mode:y.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),l("Peeking now",!0))}if(r==="prev"){let g=E().eventLog.at(-2),x=Fn(g);if(x===null)return s("No previous event to peek");o=x}else if(r==="next"){let g=E().unappliedEvents.at(0),x=Fn(g);if(x===null)return s("No next event to peek");o=x}else{let g=Ut(r);if(!g)return s("Invalid peek date");o=g.getTime()}let i=e.data.id,{appliedEvents:a,unappliedEvents:m}=Po(n,o),c=ur();if(d(c))return c;let u=je(a);if(u.some(d))return s(u.map(g=>g.message).join(", "));let p=E().nodes[i];return p?(U.navigate({currentNode:p,selectedIndex:0}),T({mode:y.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:m}),l("Peeking ",!0)):s("Board did not exist at peek date")}}];var nd=new Set(["peek","filter","view-help"]),le=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=ge();if(!t)return s("No command to confirm");if(!e&&n===Ne.Invalid)return s("Invalid command");let i=xo(t);if(mo(),E().readOnly&&!nd.has(i))return xt({result:ye.Fail,message:"Command not available in readonly state",data:null});let a=mi.filter(c=>e||c.systemOnly!==!0).find(c=>c.intent===i);if(!a)return xt({result:ye.Fail,message:"Command not found",data:null});let m=await a.action(a,{command:t,inputString:o,modifier:r});return d(m)?xt(m):(uo({addToHistory:!e}),a.onSuccess?.(),xt(m))};var dn=[{intent:v.Exit,mode:y.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(T({mode:y.COMMAND_LINE}),$(()=>"move cancel"),le({isForceExecutedBySystem:!0}))},{intent:v.InitMove,mode:y.DEFAULT,description:"[m] move init/confirm",action:()=>(T({mode:y.COMMAND_LINE}),$(()=>"move start"),le({isForceExecutedBySystem:!0}))},{intent:v.ConfirmMove,mode:y.MOVE,action:()=>(T({mode:y.COMMAND_LINE}),$(()=>"move confirm"),le({isForceExecutedBySystem:!0}))}],cn=[{intent:v.MovePreviousItem,mode:y.MOVE,action:()=>ke()?(T({mode:y.COMMAND_LINE}),$(()=>"move previous"),le({isForceExecutedBySystem:!0})):s("No pending move")},{intent:v.MoveNextItem,mode:y.MOVE,action:()=>ke()?(T({mode:y.COMMAND_LINE}),$(()=>"move next"),le({isForceExecutedBySystem:!0})):s("No pending move")}],ui=[{intent:v.MoveToNextContainer,mode:y.MOVE,action:()=>ke()?(T({mode:y.COMMAND_LINE}),$(()=>"move to-next"),le({isForceExecutedBySystem:!0})):s("No pending move")},{intent:v.MoveToPreviousContainer,mode:y.MOVE,action:()=>ke()?(T({mode:y.COMMAND_LINE}),$(()=>"move to-previous"),le({isForceExecutedBySystem:!0})):s("No pending move")}];var pi={[P.WORKSPACE]:[...dn,...cn],[P.BOARD]:[...dn,...cn],[P.SWIMLANE]:[...dn,...cn,...ui],[P.TICKET]:[],[P.FIELD]:[],[P.FIELD_LIST]:[],[P.TEXT]:[]};var gi=[{intent:v.AddItem,mode:y.DEFAULT,description:"[n] new...",action:()=>(T({mode:y.COMMAND_LINE}),$(()=>`${f.NEW} `),l("Adding new item",null))},{intent:v.Delete,mode:y.DEFAULT,description:"[d] delete",action:()=>(T({mode:y.COMMAND_LINE}),$(()=>`${f.DELETE} `),l("Deleting item",null))},{intent:v.InitCommandLine,mode:y.DEFAULT,description:"[:] focus command line",action:()=>(T({mode:y.COMMAND_LINE}),$(()=>""),l("Entering command line mode",null))},{intent:v.Confirm,mode:y.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>(U.enterChildNode(),l("Entering context",null))},{intent:v.Exit,mode:y.DEFAULT,description:"[q] exit context",action:()=>(U.enterParentNode(),l("Exiting context",null))},{intent:v.NavPreviousItem,mode:y.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(U.navigateToPreviousItem(),l("Navigating to previous item",null))},{intent:v.NavNextItem,mode:y.DEFAULT,action:()=>(U.navigateToNextItem(),l("Navigating to next item",null))},{intent:v.NavToPreviousContainer,mode:y.DEFAULT,action:()=>(U.navigateToPreviousContainer(),l("Navigating to previous container",null))},{intent:v.NavToNextContainer,mode:y.DEFAULT,action:()=>(U.navigateToNextContainer(),l("Navigating to next container",null))},{intent:v.Edit,mode:y.DEFAULT,action:()=>(T({mode:y.COMMAND_LINE}),$(()=>"edit"),le(),l("Fired command",!0))},{intent:v.SetViewDense,mode:y.DEFAULT,description:"[v] view change (wide/dense)",action:()=>(T({viewMode:"dense"}),l("View set",null))},{intent:v.SetViewWide,mode:y.DEFAULT,action:()=>(T({viewMode:"wide"}),l("View set",null))},{intent:v.Sync,mode:y.DEFAULT,description:"[s] sync epiq with remote state branch",action:()=>(T({mode:y.COMMAND_LINE}),$(()=>"sync"),le({isForceExecutedBySystem:!0}),l("Synced",!0))}];var fi=[{intent:v.ViewHelp,mode:y.DEFAULT,action:()=>(T({mode:y.HELP}),l("Viewing help",null))},{intent:v.Exit,mode:y.HELP,action:()=>(T({mode:y.DEFAULT}),l("Exiting help",null))},{intent:v.Confirm,mode:y.COMMAND_LINE,action:()=>(le(),l("Executing command",null))},{intent:v.MoveCursorLeft,mode:y.COMMAND_LINE,action:()=>($n(-1),l("Moving cursor left",null))},{intent:v.MoveCursorRight,mode:y.COMMAND_LINE,action:()=>($n(1),l("Moving cursor right",null))},{intent:v.MoveCursorLeftOfWord,mode:y.COMMAND_LINE,action:()=>(Kn("left"),l("Moving cursor left of word",null))},{intent:v.MoveCursorRightOfWord,mode:y.COMMAND_LINE,action:()=>(Kn("right"),l("Moving cursor right of word",null))},{intent:v.ExitCommandLine,mode:y.COMMAND_LINE,action:()=>(T({mode:y.DEFAULT}),l("Exiting command line",null))},{intent:v.AutoCompleteCommand,mode:y.COMMAND_LINE,action:()=>($((e,{remainder:t})=>t?e+t:e),l("Auto-completing command",null))},{intent:v.CaptureInput,mode:y.COMMAND_LINE,action:(e,{sequence:t})=>($(n=>n+t),l("Capturing input",null))},{intent:v.EraseInput,mode:y.COMMAND_LINE,action:()=>(co(),l("Erasing input",null))},{intent:v.EraseInputWord,mode:y.COMMAND_LINE,action:()=>(lo(),l("Erasing input word",null))},{intent:v.GetLastCommandFromHistory,mode:y.COMMAND_LINE,action:()=>(po(),l("Getting last command from history",null))},{intent:v.GetNextCommandFromHistory,mode:y.COMMAND_LINE,action:()=>(go(),l("Getting next command from history",null))}];import rd from"chalk";var ln=": for command line",yi="q to exit",xi=`${rd.hex(C.accent)("m")} to confirm`,gr={[P.WORKSPACE]:[ln],[P.BOARD]:[ln],[P.BOARD+y.COMMAND_LINE]:[ln],[P.SWIMLANE]:[ln],[P.TICKET+y.HELP]:[yi],[P.SWIMLANE+y.HELP]:[yi],[P.TICKET]:[],[P.FIELD]:[],[P.SWIMLANE+y.MOVE]:[xi],[P.TICKET+y.MOVE]:[xi]};var mn=e=>e.trim().toLocaleLowerCase(),od=(e,t)=>{let n=b.getFieldByTitle(e,t);if(!n)return"";let r=n.props?.value;return typeof r=="string"?r:""},id=e=>{let{tags:t}=E(),n=b.getFieldByTitle(e,"Tags");return n?_(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},sd=e=>{let{contributors:t}=E(),n=b.getFieldByTitle(e,"Assignees");return n?_(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},vi=(e,t)=>{let n=t.value;if(!n)return!0;switch(t.target){case"title":return mn(e.title??"").includes(n);case"description":return mn(od(e.id,"Description")).includes(n);case"tag":return id(e.id).map(mn).some(m=>m.includes(n));case"assignee":return sd(e.id).map(mn).some(m=>m.includes(n));default:return!0}};function hi(e,t,n){let r=t[e];if(!r)return s("buildBreadCrumb(): current node not found");let o=[],i=r;for(;i&&(o.push(i),!(i.id===n||!i.parentNodeId));)i=t[i.parentNodeId];let a=o[o.length-1];return!a||a.id!==n?s("buildBreadCrumb(): node is not connected to root"):(o.reverse(),l("Breadcrumb built",o))}var Ei=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 un,fr,yr=new Set,Ci=()=>{for(let e of yr)e()},dd=e=>(yr.add(e),()=>yr.delete(e));function Ni(e){let{currentNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:i}=e;if(!t)return s("derive(): currentNodeId is missing");if(!r)return s("derive(): rootNode is missing");if(!o[r])return s("derive(): unable to find root node");let m=o[t];if(!m)return logger.error("Unable to derive state, currentNode not found"),s("Unable to derive state, currentNode not found");let c=hi(t,o,r);if(d(c))return logger.error(c.message),c;let u=c.data,{context:p}=m,g=gr[p+n]??gr[p]??[],x=[...gi,...pi[p]??[],...fi],S=Ei(x),w=cd(o,i),N=w[t]?.[e.selectedIndex]??null;return l("Derived successfully",{...e,currentNode:m,breadCrumb:u,availableHints:g,availableActions:x,actionIndex:S,selectedNode:N,renderedChildrenIndex:w})}var E=()=>(un||logger.error("State not initialized. Call initWorkspaceState() first.",new Error().stack),un);function Gn(e){fr=e;let t={readOnly:!1,filters:[],tags:{},contributors:{},viewMode:"dense",mode:y.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,currentNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""},eventLog:[],unappliedEvents:[],timeMode:"live"},n=Ni(t);return d(n)?n:(un=n.data,Ci(),l("State initialized",null))}function ae(e){let t=E(),n=e(t),r=Ni(n);return d(r)?s(r.message??"Unable to update state"):(un=r.data,Ci(),l("State updated",null))}var T=e=>ae(t=>({...t,...e}));var W=()=>ad(dd,E,E),cd=(e,t)=>{let n={};for(let r of Object.values(e))$e(r)&&t.length>0&&!t.every(o=>vi(r,o))||!r.parentNodeId||r.isDeleted||((!r.parentNodeId||!n[r.parentNodeId])&&(n[r.parentNodeId]=[]),n[r.parentNodeId].push(r));for(let r of Object.keys(n))n[r].sort((o,i)=>{let a=e[o.id],m=e[i.id];return!a||!m?0:a.rank.localeCompare(m.rank)});return n},R=e=>E()?.renderedChildrenIndex[e]??[],ur=()=>fr?Gn(fr):s("Cannot reset state: no initial workspace found");var U={exit(){process.exit(0)},enterChildNode(){let e=E(),t=e.currentNode,n=Math.max(0,e.selectedIndex),r=R(t.id)[n];!r||t.context==="FIELD"||U.navigate({currentNode:r,selectedIndex:R(r.id).length?0:-1})},enterParentNode(){let{currentNode:e,nodes:t}=E();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=R(n.id),o=r.findIndex(({id:a})=>a===e.id),i=r.length===0?-1:o>=0?o:0;U.navigate({currentNode:n,selectedIndex:i})},navigateToNextItem:()=>bi(1),navigateToPreviousItem:()=>bi(-1),navigateToNextContainer:()=>Ii(1),navigateToPreviousContainer:()=>Ii(-1),navigate:({currentNode:e=E().currentNode,selectedIndex:t})=>{T({currentNodeId:e.id,selectedIndex:t})}},bi=e=>{let t=E(),n=R(t.currentNode.id).length;if(n===0)return;let o=(Math.max(0,t.selectedIndex)+e+n)%n;U.navigate({selectedIndex:o})},Ii=e=>{let{currentNode:t,nodes:n,selectedIndex:r}=E();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!t||!o)return;let i=R(o.id),a=i.findIndex(x=>x.id===t.id);if(a<0)return;let m=i.at(a+e)??i.at(0);if(!m)return;let c=R(m.id),u=Math.max(0,c.length-1),p=Math.min(Math.max(0,r),u),g=c.length?p:-1;U.navigate({currentNode:m,selectedIndex:g})};var we="system",Ae="ACTOR",St=ld(),Oe=null;function md(){let e=Object.values(E().nodes).find(r=>r.context==="WORKSPACE");if(!e)throw new Error("No workspace found in event log");let[t]=R(e.id),[n]=t?R(t.id):[];if(logger.debug("Boot navigation target:",{workspace:e?.id,firstBoard:t?.id,firstSwimlane:n?.id}),n){let r=E().renderedChildrenIndex?.[n.id]??[];return{currentNode:n,selectedIndex:r.length>0?0:-1}}else return t?{currentNode:t,selectedIndex:0}:e?{currentNode:e,selectedIndex:0}:{currentNode:E().nodes[E().rootNodeId],selectedIndex:0}}function ud(){let e=md();U.navigate(e)}function pd(){let e=St(),t=St(),n=St(),r=St(),o=St();return[{id:Se(),userId:we,userName:Ae,action:"init.workspace",payload:{id:e,name:"Workspace"}},{id:Se(),userId:we,userName:Ae,action:"add.board",payload:{id:t,name:"Default",parent:e}},{id:Se(),userId:we,userName:Ae,action:"add.swimlane",payload:{id:n,name:"Todo",parent:t}},{id:Se(),userId:we,userName:Ae,action:"add.swimlane",payload:{id:r,name:"Review",parent:t}},{id:Se(),userId:we,userName:Ae,action:"add.swimlane",payload:{id:o,name:"Done",parent:t}},{id:Se(),userId:we,userName:Ae,action:"add.board",payload:{id:Xt,name:"Closed",parent:e}},{id:Se(),userId:we,userName:Ae,action:"add.swimlane",payload:{id:nt,name:"Closed",parent:Xt}},{id:Se(),userId:we,userName:Ae,action:"lock.node",payload:{id:Xt}},{id:Se(),userId:we,userName:Ae,action:"lock.node",payload:{id:nt}}]}function Ke(){return Oe!==null}function pr(){if(!Oe||Oe.length===0)return l("No pending default events to persist",null);let t=Qt(Oe).filter(d);return t.length>0?s([dt.bold.red("Materializing failed"),"",...t.map((n,r)=>`${dt.dim.gray(`${r+1}.`)} ${dt.dim(n.message)}`),`
32
37
  `].join(`
33
- `)):(ke=null,c("Persisted pending default events",null))}function ci(e){let t;e.some(n=>n.action==="init.workspace")?(ke=null,t=gt(e)):(ke=Ha(),t=gt([...ke]));let r=t.filter(d);return r.length>0?s([it.bold.red("Materializing failed"),"",...r.map((n,o)=>`${it.dim.gray(`${o+1}.`)} ${it.dim(n.message)}`),`
38
+ `)):(Oe=null,l("Persisted pending default events",null))}function Si(e){let t;e.some(r=>r.action==="init.workspace")?(Oe=null,t=je(e)):(Oe=pd(),t=je([...Oe]));let n=t.filter(d);return n.length>0?s([dt.bold.red("Materializing failed"),"",...n.map((r,o)=>`${dt.dim.gray(`${o+1}.`)} ${dt.dim(r.message)}`),`
34
39
  `].join(`
35
- `)):(Wa(),c("State booted successfully",null))}import{Box as od}from"ink";import dn from"react";import Nt from"chalk";import{Box as sn,Text as li}from"ink";import Ct,{useEffect as $a,useMemo as _a,useState as Ka}from"react";var mi=Nt.gray,Va=Nt.inverse,ja=Nt.inverse.gray,za={hint:"",hints:[],overlap:0,remainder:""},pi=({value:e,command:t})=>{if(!t)return null;let r=e.trimStart(),o=e.length-r.length;return e.slice(o,o+t.length)!==t?null:{start:o,end:o+t.length}},qa=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let r=ie(t);return{bg:n=>Nt.bgHex(r).black(n),bgCursor:n=>Nt.bgHex(r).inverse.black(n)}}return Tr(t)},Ga=({value:e,command:t,modifier:r})=>{if(!t||!r)return null;let n=pi({value:e,command:t});if(!n)return null;let i=e.slice(n.end).match(/^\s*/)?.[0].length??0,a=n.end+i;return e.slice(a,a+r.length)!==r?null:{start:a,end:a+r.length}},ui=()=>({value:j.value,cursorPosition:j.cursorPosition,commandIsPending:j.commandIsPending,autoCompletion:j.commandMeta.autoCompletion??za,infoMessage:j.commandMeta.infoMessage,validationStatus:j.commandMeta.validity,command:j.commandMeta.command,inputString:j.commandMeta.inputString,modifier:j.commandMeta.modifier}),Ja=(e,t)=>e.value===t.value&&e.cursorPosition===t.cursorPosition&&e.commandIsPending===t.commandIsPending&&e.infoMessage===t.infoMessage&&e.autoCompletion.hint===t.autoCompletion.hint&&e.autoCompletion.overlap===t.autoCompletion.overlap&&e.autoCompletion.remainder===t.autoCompletion.remainder&&e.validationStatus===t.validationStatus&&e.command===t.command&&e.modifier===t.modifier&&e.inputString===t.inputString,gi=({width:e})=>{let[t,r]=Ka(ui());$a(()=>{let y=()=>{let I=ui();r(S=>Ja(S,I)?S:I)},v=zn(y);return y(),()=>{v()}},[]);let{value:n,cursorPosition:o,infoMessage:i,commandIsPending:a,autoCompletion:l,command:m,modifier:u}=t,g=_a(()=>{let y=Math.max(0,Math.min(o,n.length)),v=pi({value:n,command:m}),I=Ga({value:n,command:m,modifier:u}),S=m?Tr(m):null,N=qa({command:m,modifier:u}),b=(ee,te)=>{let Nr=v&&te>=v.start&&te<v.end,Er=I&&te>=I.start&&te<I.end;return Nr&&S?S.fg(ee):Er&&N?N.bg(ee):ee},w=(ee,te)=>{let Nr=v&&te>=v.start&&te<v.end,Er=I&&te>=I.start&&te<I.end;return Nr&&S?S.fgCursor(ee):Er&&N?N.bgCursor(ee):Va(ee)},B=n.slice(0,y),oe=n[y]??" ",q=y<n.length?n.slice(y+1):"",Me=Array.from(B).map((ee,te)=>b(ee,te)).join(""),Re=w(oe,y),In=Array.from(q).map((ee,te)=>b(ee,y+1+te)).join("");if(l.hint){let ee=l.hint[l.overlap]??oe;Re=ja(ee),In=mi(l.remainder.slice(1)+q)}return mi(":")+Me+Re+In},[n,o,l,m,u]);return Ct.createElement(sn,{flexDirection:"column",justifyContent:"flex-start"},Ct.createElement(sn,{flexDirection:"column",paddingX:1,borderColor:h.secondary,borderStyle:"round",width:e},Ct.createElement(sn,null,Ct.createElement(li,null,g),i&&Ct.createElement(li,{wrap:"truncate",color:a?h.red:h.secondary2},` ${i} `))))};import fi from"chalk";import{Box as Xa,Text as an}from"ink";import sr,{useEffect as Ya,useState as Qa}from"react";var Za=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],yi=e=>{let t=e.replace("#","");return{r:parseInt(t.slice(0,2),16),g:parseInt(t.slice(2,4),16),b:parseInt(t.slice(4,6),16)}},ed=({r:e,g:t,b:r})=>{let n=o=>Math.round(Math.max(0,Math.min(255,o))).toString(16).padStart(2,"0");return`#${n(e)}${n(t)}${n(r)}`},td=(e,t,r)=>{let n=yi(e),o=yi(t);return ed({r:n.r+(o.r-n.r)*r,g:n.g+(o.g-n.g)*r,b:n.b+(o.b-n.b)*r})},rd=(e,t)=>{if(e.length===1)return e[0];let r=t*(e.length-1),n=Math.floor(r),o=r-n,i=e[n],a=e[Math.min(n+1,e.length-1)];return td(i,a,o)},nd=(e,t)=>e.length===t?e:e.length>t?e.slice(0,t):e.padEnd(t," "),xi=({width:e,availableHints:t})=>{let{syncStatus:{status:r,msg:n}}=_(),[o,i]=Qa(0);Ya(()=>{if(r!=="syncing"){i(0);return}let b=setInterval(()=>{i(w=>w+1)},50);return()=>clearInterval(b)},[r]);let a=[],l=0;for(let b of t){let B=(a.length>0?" | ":"").length+b.length;if(l+B>e-4)break;a.push(b),l+=B}let m=r!="synced"?n??a.join(" | "):a.join(" | "),u=Math.max(0,e-2),g=r==="syncing"?rd(Za,(Math.sin(o*.12)+1)/2):h.secondary,y=fi.hex(g??"fff"),v=fi.hex(h.secondary2),I=y(`\u256D${"\u2500".repeat(u)}\u256E`),S=y(`\u2570${"\u2500".repeat(u)}\u256F`),N=`${y("\u2502")}${v(nd(` ${m} `,u))}${y("\u2502")}`;return sr.createElement(Xa,{flexDirection:"column",width:e},sr.createElement(an,null,I),sr.createElement(an,null,N),sr.createElement(an,null,S))};var ar=({width:e,mode:t,availableHints:r})=>{let n=_(),o=[],i=0;for(let a of r){let m=(o.length>0?" | ":"").length+a.length;if(i+m>e+2)break;o.push(a),i+=m}return dn.createElement(od,null,t===p.COMMAND_LINE&&n.syncStatus.status!=="syncing"?dn.createElement(gi,{width:e}):dn.createElement(xi,{width:e,mode:t,availableHints:r}))};import{Box as st,Text as vi}from"ink";import Be from"react";var hi=({width:e})=>{let t=[...C().availableActions].map(r=>r.description).filter(r=>r!==void 0).map(r=>{let[n,o]=r.split("]"),i=n?.replace("[",""),a=o?.trim();return[i,a]}).filter(r=>r[0]!==void 0&&r[1]!==void 0).sort(([r],[n])=>r.length===1&&n.length!==1?-1:r.length!==1&&n.length===1?1:r.localeCompare(n,void 0,{sensitivity:"base"}));return t.unshift(["Key(s)","Action"]),Be.createElement(st,{flexDirection:"column",marginTop:3,borderColor:h.secondary,borderStyle:"round",width:e,minHeight:19},Be.createElement(st,{flexDirection:"column",width:e},C().mode===p.HELP?t.map(([r,n],o)=>Be.createElement(st,{paddingLeft:1,key:o,flexDirection:"row"},Be.createElement(st,{key:o,flexDirection:"row",paddingBottom:o?0:1},Be.createElement(st,{width:20,justifyContent:"flex-end"},Be.createElement(vi,{color:o?h.accent:h.secondary},r)),Be.createElement(st,{flexGrow:1,width:40,paddingLeft:2},Be.createElement(vi,{color:o?h.primary:h.secondary},n))))):null))};import bi from"chalk";import{Box as ln,Text as Si}from"ink";import Ie from"react";import{Box as cn,Text as md}from"ink";import ct from"react";import{Text as id}from"ink";import sd from"react";var ad=e=>e.toLowerCase().trim(),dd=(e,t=Je)=>{let r=ad(e);return t[r]?t[r]:ut(r)},at=({id:e,isSelected:t})=>{let r=E.getContributor(e);if(r)return sd.createElement(id,{underline:t,color:dd(r.name)},"@"+r.name)};import{Text as cd}from"ink";import ld from"react";var dt=({id:e,isSelected:t})=>{let r=E.getTag(e);if(r)return ld.createElement(cd,{underline:t,backgroundColor:ie(r.name),color:h.primary}," "+r.name+" ")};var ud=(e,t)=>e.length<=t?e:t<=1?"\u2026":e.slice(0,t-1)+"\u2026",Ci=({width:e})=>{let{breadCrumb:t,currentNode:r,selectedIndex:n,viewMode:o}=C(),i=W(r.id)[n],a=Ge(i?.id??r.id,"TICKET"),l=ze(a)?a.data:void 0,m=l?.id?W(l.id):[],u=N=>{let b=m.find(w=>w.title===N);return b?W(b.id).map(w=>typeof w.props?.value=="string"?w.props.value:"").filter(w=>!!w):[]},g=u("Tags"),y=u("Assignees"),v=l?.parentNodeId?!Sr(r.id,l?.parentNodeId)&&o==="dense":!1,I=t.map((N,b)=>{let w=b===t.length-1,B=W(N.id),oe=w?B?.[n]?.title:void 0;return`${b?" / ":""}${N.title??""}${oe?` \u25B8 ${oe}`:""}`}).join(""),S=ud(I,e);return ct.createElement(cn,null,ct.createElement(md,{color:h.secondary2},S),v?g.map(N=>ct.createElement(cn,{key:N,paddingLeft:2},ct.createElement(dt,{id:N}))):null,v?y.map(N=>ct.createElement(cn,{key:N,paddingLeft:2},ct.createElement(at,{id:N}))):null)};import{Box as pd,Text as Ni}from"ink";import dr from"react";var gd=({filters:e})=>dr.createElement(pd,{columnGap:1},dr.createElement(Ni,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:r,operator:n})=>dr.createElement(Ni,{backgroundColor:"black",color:"white"},` ${r}${n}"${t}" `))),Ei=dr.memo(gd);function cr({filters:e,hideBreadCrumb:t=!1}){let{userName:r,preferredEditor:n}=ce(),o=40,i=process.stdout.columns-o-8;return Ie.createElement(ln,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},t?Ie.createElement(Si,null," "):Ie.createElement(ln,{paddingLeft:1},e.length>0?Ie.createElement(Ei,{filters:e}):Ie.createElement(Ci,{width:i})),Ie.createElement(ln,{columnGap:1,paddingRight:2,"max-width":o,overflow:"hidden",justifyContent:"flex-end"},Ie.createElement(Ii,{icon:"@",value:r}),Ie.createElement(Ii,{icon:"\u276F",value:n})))}function Ii({icon:e,value:t}){return Ie.createElement(Si,null,bi.dim(e)+bi.hex(h.accent)(` ${t??"-"} `))}import{Box as Bd,Text as Od}from"ink";import bt from"react";import{Box as lr,Text as mn}from"ink";import Oe from"react";import{Text as Ai}from"ink";import wi,{useEffect as Ti,useState as fd}from"react";var Mi={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"command-line":["\u276F "]},Z=({isSelected:e,placeholder:t=" "})=>{let{mode:r}=_(),n=Mi[r]??Mi.default,[o,i]=fd(0);if(Ti(()=>{i(0)},[n]),Ti(()=>{if(!e)return;let l=setInterval(()=>{i(m=>(m+1)%n.length)},500);return()=>clearInterval(l)},[e,n]),!e)return wi.createElement(Ai,null,t);let a=n[o]??n[0]??t;return wi.createElement(Ai,{color:h.accent,dimColor:o===1},a)};function un(){let e=_(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,i=process.stdout.columns||120,a=t?.id?T(t?.id):[];return Oe.createElement(lr,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:h.secondary,width:i},Oe.createElement(lr,{padding:1,paddingTop:0,paddingBottom:0},Oe.createElement(mn,null,"Select a board:")),Oe.createElement(lr,{padding:1,flexDirection:"column"},a.map((l,m)=>{let u=e.currentNode.context==="WORKSPACE"&&e.selectedIndex===m,y=T(l.id).flatMap(({id:v})=>W(v)).length;return Oe.createElement(lr,{key:l.id??m},Oe.createElement(mn,{color:u?h.accent:h.secondary},Oe.createElement(Z,{isSelected:u})),Oe.createElement(mn,{color:u?h.accent:h.secondary},l.title," (",y," issues)",l.readonly?" \u{1F512}":""))})))}import{Box as Fd}from"ink";import yr from"react";import{Box as fn,Text as Cd}from"ink";import ge from"react";import{Box as pn,Text as yd}from"ink";import mr from"react";var ur=({children:e=[],height:t,selectedIndex:r,itemHeight:n=1,scrollByOne:o=!1})=>{if(e.length===0)return null;let i=Math.max(1,Math.floor(t)),a=Math.max(1,Math.ceil(n)),l=Math.max(1,Math.floor(i/a)),m=Math.max(0,Math.min(r,e.length-1)),u=Math.max(0,e.length-l),g=o?Math.min(u,Math.max(0,m-l+1)):Math.min(u,Math.floor(m/l)*l),y=g+l,v=e.slice(g,y),I=e.length>l,S=i,N=I?Math.max(1,Math.floor(l/e.length*S)):S,b=Math.max(0,S-N),w=Math.max(1,e.length-l),B=I?Math.floor(g/w*b):0;return mr.createElement(pn,{flexDirection:"row",height:i,width:"100%"},mr.createElement(pn,{flexDirection:"column",flexGrow:1,height:i},v),mr.createElement(pn,{flexDirection:"column",width:1,height:S},Array.from({length:S}).map((oe,q)=>mr.createElement(yd,{key:q,color:I&&q>=B&&q<B+N?h.accent:h.secondary},I?"\u2502":" "))))};import{Box as pr,Text as xd}from"ink";import Ve from"react";var Ri=({width:e,ticket:t,isSelected:r})=>{let n=e-14,o=At(wn(t.title),n),i=T(t.id),a=u=>{let g=i.find(y=>y.title===u);return g?T(g.id).map(y=>typeof y.props?.value=="string"?y.props.value:"").filter(y=>!!y):[]},l=a("Tags").map(u=>E.getTag(u)).filter(u=>!!u),m=a("Assignees").map(u=>E.getContributor(u)).filter(u=>!!u);return Ve.createElement(pr,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:r?h.accent:h.secondary,justifyContent:"space-between"},Ve.createElement(pr,{borderBottom:!0},Ve.createElement(pr,{paddingLeft:1,flexDirection:"column"},Ve.createElement(xd,{color:h.primary},o))),Ve.createElement(pr,{flexDirection:"row",paddingLeft:1},l.map(u=>Ve.createElement(dt,{key:u.id,id:u.id})),m.map(u=>Ve.createElement(at,{key:u.id,id:u.id}))))};import vd from"chalk";import{Box as Et,Text as gn}from"ink";import Se from"react";var hd=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,Li=({width:e,ticket:t,isSelected:r,index:n,mode:o})=>{let i=T(t.id),a=N=>{let b=i.find(w=>w.title===N);return b?T(b.id).map(w=>typeof w.props?.value=="string"?w.props.value:"").filter(w=>!!w):[]},l=a("Tags").map(N=>E.getTag(N)).filter(N=>!!N),m=a("Assignees").map(N=>E.getContributor(N)).filter(N=>!!N),u=1,g=l.length*(1+u),y=m.length*(2+u),v=l.map(N=>Se.createElement(Et,{key:N.id,paddingRight:u},Se.createElement(gn,{color:ie(N.name)},"\u25A0"))),I=m.map(N=>Se.createElement(Et,{key:N.id,paddingRight:u},Se.createElement(gn,{color:ut(N.name)},"@"+N.name.at(0)))),S=r?h.accent:o===p.MOVE?h.secondary:h.primary;return Se.createElement(Et,{borderBottom:!0,justifyContent:"space-between"},Se.createElement(Et,null,Se.createElement(Z,{isSelected:r,placeholder:vd.dim.gray(n+1+" ")}),Se.createElement(gn,{wrap:"truncate",color:S},hd(t.title,e-g-y-14))),Se.createElement(Et,null,v,I))};var Nd=({swimlane:e,isSelected:t,width:r,height:n,isDense:o,isFocused:i,listSelectedIndex:a,mode:l})=>{let{renderedChildrenIndex:m}=_(),u=m[e.id]??[],g=`${e.title} (${u.length})`,y=3,v=o?1:4,I=n-y-(o?2:1),S=ge.createElement(fn,{borderStyle:"round",borderColor:h.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},ge.createElement(Z,{isSelected:t}),ge.createElement(Cd,{bold:!0,color:t?h.accent:h.primary},g," ",e.readonly?"\u{1F512}":"")),N=(b,w)=>{let B=i&&a===w;return o?ge.createElement(Li,{key:b.id,index:w,width:r,ticket:b,isSelected:B,mode:l}):ge.createElement(Ri,{key:b.id,width:r,ticket:b,isSelected:B})};return ge.createElement(fn,{flexDirection:"column",width:r,borderStyle:"round",borderColor:t?h.accent:h.secondary,paddingRight:1,paddingLeft:1,height:n},S,ge.createElement(fn,{padding:o?1:0},u.length>0&&ge.createElement(ur,{selectedIndex:a,height:I,itemHeight:v},u.map(N)),ge.createElement(Z,{isSelected:i&&a===-1})))},Pi=ge.memo(Nd);import{Box as vn,Text as Pd}from"ink";import Ue,{useEffect as hn,useMemo as Oi}from"react";import Ae from"chalk";import Fi from"string-width";import{decodeTime as Ed}from"ulid";var Di=e=>{let t=Date.now()-e,r=[{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:n,ms:o}of r){let i=Math.floor(t/o);if(i>=1)return`${i}${n} ago`}return"just now"};var bd=(e,t)=>e+" ".repeat(Math.max(0,t-Fi(e))),Id=(e,t)=>" ".repeat(Math.max(0,t-Fi(e)))+e,Sd=e=>(()=>{let r={"add.issue":"Created with title","assign.issue":"Assigned to","close.issue":"Closed","delete.node":"Deleted","edit.title":"Changed title to","edit.description":"Changed description","reopen.issue":"Reopened","tag.issue":"Tagged with","lock.node":"Locked node","move.node":"Moved issue"};return(o=>r[o]??(o.endsWith("e")?`${o}d`:`${o}ed`))(e)})(),Ad=e=>{switch(e.action){case"move.node":{let t=E.getNode(e.payload.parent),r=t?Ae.dim.bgBlack(` ${t.title} `):"unknown",n=e.payload.pos;if(!n)return`to ${r}`;switch(n.at){case"start":return`to ${r} ${Ae.dim("(to top of list)")}`;case"end":return`to ${r} ${Ae.dim("(to bottom of list)")}`;case"before":return`to ${r} ${Ae.dim("(up in list)")}`;case"after":return`to ${r} ${Ae.dim("(down in list)")}`}}case"tag.issue":{let t=C().tags[e.payload.tagId];return t?Ae.bgHex(ie(t.name))(` ${t.name} `):"unknown tag"}case"assign.issue":{let t=C().contributors[e.payload.contributor];return t?Ae.hex(ie(t.name))(` ${t.name} `):"unknown user"}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"create.contributor":case"edit.title":return`"${"name"in e.payload?e.payload.name:""}"`;default:return""}},wd=e=>{let t=Di(Ed(e));return Ae.gray(Id(t,8))},Td=12,Md=e=>bd(`${e}`,Td),ki=e=>{let t=wd(e.id),r=Md(e.userName),n=Sd(e.action),o=Ad(e),i=Ae.dim("\u203A"),a=[n,o].filter(Boolean).join(" ");return`${r} ${t} ${i} ${a}`};import{Box as gr,Text as Rd}from"ink";import we from"react";var Bi=({selectedIndex:e,parent:t,selected:r})=>{let{currentNode:n}=_(),{title:o}=t,i=T(t.id).map(a=>{let l=typeof a.props?.value=="string"?a.props.value:"";if(o==="Assignees")return E.getContributor(l)?.id;if(o==="Tags")return E.getTag(l)?.id}).filter(a=>!!a);return we.createElement(gr,{alignItems:"center",paddingTop:1},we.createElement(gr,{minWidth:12},we.createElement(Z,{isSelected:r}),we.createElement(Rd,{color:r?h.accent:h.secondary2},o,":")),we.createElement(gr,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((a,l)=>{let m=n.id===t.id&&l===e;return we.createElement(gr,{key:`${o}-${a}`,paddingRight:2,minHeight:1},we.createElement(Z,{isSelected:m}),o==="Assignees"?we.createElement(at,{isSelected:m,id:a}):o==="Tags"?we.createElement(dt,{isSelected:m,id:a}):null)})))};import{Box as fr,Text as yn}from"ink";import Te,{useEffect as Ld}from"react";var xn=({id:e,label:t,text:r,height:n,selected:o,maxWidth:i})=>{let{selectedIndex:a,currentNode:l}=_(),m=v=>String(v).replace(/\r?\n/g,""),u=typeof r=="string"?r.split(/\r?\n|\u2028|\u2029/):[];Ld(()=>{let v=[];return u.forEach((I,S)=>{let N=J.text({id:`${S}`,name:`Line ${S+1}`,parentNodeId:e,props:{value:I},readonly:!0}),b=E.createNodeAtPosition(N);ze(b)&&v.push(b.data.id)}),()=>v.forEach(E.deleteNode)},[e,r]);let g="\u2029",y=u.map((v,I)=>{let S=l.id===e&&a===I;return Te.createElement(fr,{key:`${e}-${I}`},Te.createElement(yn,{color:S?h.primary:h.secondary2,dimColor:!S},`${I+1} `.padStart(5,"\xA0")),Te.createElement(yn,{backgroundColor:S?"gray":""},m(v.length?At(v,i-10):g)))});return Te.createElement(fr,{flexDirection:"column",paddingTop:1},Te.createElement(fr,null,Te.createElement(Z,{isSelected:o}),Te.createElement(yn,{color:o?h.accent:h.secondary2},t)),Te.createElement(fr,{flexDirection:"row",borderStyle:"round",borderColor:h.secondary,paddingLeft:1,paddingRight:1,marginLeft:1},Te.createElement(ur,{scrollByOne:!0,children:y,height:n-2,selectedIndex:a,itemHeight:1})))};var Dd=e=>`${e}::log`,Ui=({ticket:e,height:t})=>{let{selectedIndex:r,currentNode:n}=_(),o=process.stdout.columns||120,i=Oi(()=>Dd(e.id),[e.id]),a=Oi(()=>[...e.log].reverse().map(ki).join(`
36
- `),[e.log]);hn(()=>{if(E.getNode(i))return;let w={...J.field(i,"Log",e.id,{value:a}),readonly:!0,childRenderAxis:"vertical"};return E.createNodeAtPosition(w),()=>{E.deleteNode(i)}},[i,e.id]),hn(()=>{let b=E.getNode(i);b&&b.props.value!==a&&E.updateNode({...b,props:{...b.props,value:a},childRenderAxis:"vertical",readonly:!0})},[i,a]);let l=n.id===e.id,m=n.id===i||n.parentNodeId===i;hn(()=>{m&&(r>=0||O.navigate({selectedIndex:0}))},[m,r]);let u=T(e.id);if(m){let b=E.getNode(i),B=t-3;return Ue.createElement(vn,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},b?Ue.createElement(xn,{id:b.id,label:"Event log",text:b.props.value??"",selected:!1,maxWidth:o,height:B}):null)}let g=u.reduce((b,w)=>w.title==="Assignees"||w.title==="Tags"||w.id===i?++b:b,0),y=2,v=g*1,S=t-3-v-y,N=(b,w)=>b.title==="Assignees"||b.title==="Tags"?Ue.createElement(Bi,{key:b.id,parent:b,selected:w,selectedIndex:r}):b.id===i?Ue.createElement(vn,{key:b.id,paddingTop:1},Ue.createElement(Z,{isSelected:w}),Ue.createElement(Pd,{backgroundColor:h.secondary,color:w?h.accent:h.primary}," History \u203A\u203A ")):Ue.createElement(xn,{label:"Description (press e to edit)",key:b.id,id:b.id,text:b.props.value??"",selected:w,maxWidth:o,height:S});return Ue.createElement(vn,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},u.map((b,w)=>N(b,l&&r===w)))};var kd=({swimlanes:e,currentNode:t,selectedIndex:r,breadCrumb:n,mode:o,viewMode:i,height:a,width:l})=>{let m=t.context,u=m===L.TICKET||m===L.FIELD_LIST||m===L.FIELD,g=m===L.BOARD||m===L.SWIMLANE,y=m===L.TICKET?t:n.find(b=>b.context===L.TICKET),v=Math.floor(l/3),I=Math.floor(l/Math.max(e.length,1)),S=Math.min(I,v),N=i==="dense";return yr.createElement(Fd,{flexDirection:"row",height:a},g&&e.map((b,w)=>{let B=t.id===b.id,oe=B?r:-1,q=t.context===L.BOARD&&r===w;return yr.createElement(Pi,{key:b.id,height:a,width:S,swimlane:b,isSelected:q,isDense:N,isFocused:B,listSelectedIndex:oe,mode:o})}),u&&y&&yr.createElement(Ui,{height:a,ticket:y}))},Wi=yr.memo(kd);var Ud=({currentNode:e,selectedIndex:t,breadCrumb:r,mode:n,viewMode:o,height:i,width:a})=>{let{renderedChildrenIndex:l}=_(),m=r.find(({context:v})=>v==="BOARD"),y=i-1-3;return bt.createElement(Bd,{flexDirection:"row"},e.context==="WORKSPACE"?bt.createElement(un,null):m?bt.createElement(Wi,{height:y,width:a,swimlanes:(l[m.id]??[]).filter(v=>v!==void 0&&Sn(v)),currentNode:e,selectedIndex:t,breadCrumb:r,viewMode:o,mode:n}):bt.createElement(Od,null))},Hi=bt.memo(Ud);import{Box as It,Text as fe}from"ink";import U from"react";var xr=({isDone:e,command:t,value:r})=>U.createElement(It,null,U.createElement(fe,{color:h.accent,dimColor:e},e?" \u2714 ":" "),U.createElement(fe,{dimColor:e},"Type "),U.createElement(fe,{backgroundColor:h.secondary,dimColor:e}," "+t+" "),r&&U.createElement(U.Fragment,null,U.createElement(fe,{dimColor:e}," "),U.createElement(fe,{color:h.secondary,dimColor:e},"<"+r+">")));function Cn({width:e,height:t,hasUserName:r,hasPreferredEditor:n,userName:o,preferredEditor:i}){let a=r&&n,l=r?n?null:":set:editor":":set:username";return U.createElement(It,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:h.secondary,rowGap:1},U.createElement(fe,{color:h.accent,bold:!0},"Welcome! \u{1F539}"),U.createElement(fe,null,"Lets get you started - its a breeze."),U.createElement(fe,{color:h.secondary2},"And remember, you can always get help with"," ",U.createElement(fe,{color:h.accent},":help"),"."),!a&&U.createElement(fe,{color:h.secondary2},l===":set:username"?"First, choose your username.":"Nice. One more step."),U.createElement(It,{flexDirection:"column"},r&&U.createElement(It,{marginBottom:1},U.createElement(xr,{isDone:!0,command:":set:username",value:o})),!r&&U.createElement(xr,{isDone:!1,command:":set:username"}),r&&!n&&U.createElement(xr,{isDone:!1,command:":set:editor"}),a&&U.createElement(It,null,U.createElement(xr,{isDone:!0,command:":set:editor",value:i}))))}var Hd=({width:e,height:t})=>D.createElement(me,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:h.secondary,rowGap:1},D.createElement(We,{color:h.accent,bold:!0},"Initialize project"),D.createElement(We,null,`This folder is not an ${Wd.hex(h.accent)("epiq")} project yet.`),D.createElement(We,{color:h.primary},"To start tracking issues here, we need to initialize a new"," ",D.createElement(We,{color:h.primary,backgroundColor:h.secondary}," .epiq/ ")," ","directory in this repository."),D.createElement(me,{marginTop:1,flexDirection:"column"},D.createElement(me,null,D.createElement(We,{color:h.accent}," "),D.createElement(We,{color:h.primary},"Type "),D.createElement(We,{backgroundColor:h.secondary}," :init "))),D.createElement(me,{marginTop:1},D.createElement(We,{color:h.secondary2},"(This will create the local epiq project files)")));function Nn({width:e,height:t}){let r=_(),n=r.filters;if(r.mode===p.HELP)return D.createElement(me,{flexDirection:"column"},D.createElement(hi,{width:e}));let{isSetup:o,hasPreferredEditor:i,hasUserName:a,userName:l,preferredEditor:m}=Rt(),u=!o,g=o&&Lt();if(u)return D.createElement(me,{flexDirection:"column"},D.createElement(me,{flexDirection:"column"},D.createElement(cr,{hideBreadCrumb:!0,filters:n}),D.createElement(Cn,{height:t,width:e,hasUserName:a,hasPreferredEditor:i,userName:l??"",preferredEditor:m??""})),D.createElement(ar,{width:e,mode:r.mode,availableHints:r.availableHints}));if(g)return D.createElement(me,{flexDirection:"column"},D.createElement(me,{flexDirection:"column"},D.createElement(cr,{hideBreadCrumb:!0,filters:n}),D.createElement(Hd,{height:t,width:e})),D.createElement(ar,{width:e,mode:r.mode,availableHints:r.availableHints}));let y=nt(C().breadCrumb??[],"BOARD");if(ze(y)){let v=y.data.id,I=T(v).length,S=3,N=Math.floor(e/S),b=Math.floor(e/Math.max(I,1));e=Math.min(b,N)*Math.max(I,S)}return D.createElement(me,{flexDirection:"column"},D.createElement(me,{flexDirection:"column"},D.createElement(cr,{filters:n}),D.createElement(Hi,{width:e,height:t,currentNode:r.currentNode,selectedIndex:r.selectedIndex,breadCrumb:r.breadCrumb,viewMode:r.viewMode,mode:r.mode})),D.createElement(ar,{width:e,mode:r.mode,availableHints:r.availableHints}))}import{Box as je,Text as He}from"ink";import G,{useEffect as $d,useMemo as _d,useState as Kd}from"react";var Vd=["\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ","\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557","\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551","\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2551\u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551","\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D","\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2580\u2580\u255D "];function jd(e,t,r){return Math.min(r,Math.max(t,e))}function zd(e,t){return G.createElement(He,null,G.createElement(He,{color:t%2===0?"cyan":"blue",bold:!0},e.slice(0,14)),G.createElement(He,{color:t%2===0?"cyan":"blue",bold:!0},e.slice(14)))}function qd(e,t=28){if(e>=1)return"\u2588".repeat(t);let r=Math.floor(e*(t-1));return Array.from({length:t},(n,o)=>{let i=Math.abs(o-r);return i===0?"\u2588":i===1?"\u2593":i===2?"\u2592":i===3?"\u2591":o<r?"\u2500":"\xB7"}).join("")}function En({durationMs:e=3e3,slogan:t="Never leave the command line"}){let r=Math.max(1,e),[n,o]=Kd(0);$d(()=>{let m=Date.now(),u=setInterval(()=>{let g=Date.now()-m;if(g>=r){o(r),clearInterval(u);return}o(g)},33);return()=>clearInterval(u)},[r]);let i=jd(n/r,0,1),a=_d(()=>qd(i,28),[i]),l=`${Math.round(i*100)}%`;return G.createElement(je,{flexDirection:"column",alignItems:"center",justifyContent:"center",paddingX:4,paddingY:1},G.createElement(je,{flexDirection:"column",minWidth:42},G.createElement(je,{flexDirection:"column",marginBottom:1},Vd.map((m,u)=>G.createElement(je,{key:u,justifyContent:"center"},zd(m,u)))),G.createElement(je,{justifyContent:"center",marginBottom:1},G.createElement(He,{color:"gray"},t)),G.createElement(je,{justifyContent:"center",marginBottom:1},G.createElement(He,{color:"cyan"},a.slice(0,10)),G.createElement(He,{color:"blue"},a.slice(10,18)),G.createElement(He,{color:"magenta"},a.slice(18))),G.createElement(je,{justifyContent:"center",marginBottom:1},G.createElement(He,{color:"gray"},l))))}import Gd from"readline";var vr,hr,ye,$i=async e=>{if(e.ctrl&&e.name==="c")return O.exit();let{actionIndex:t,mode:r}=C(),n=eo(e,r);if(!n)return;let o=t[r]?.[n];if(o?.action)try{await o.action(o,e)}catch(i){logger.error(i)}},Jd=()=>async function(t,r){r.name!=="escape"&&(ye&&(clearTimeout(ye),ye=void 0),await $i(r))},Xd=()=>async function(t){if(t.length===1&&t[0]===27){ye&&clearTimeout(ye),ye=setTimeout(()=>{$i({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),ye=void 0},25);return}ye&&(clearTimeout(ye),ye=void 0)};function _i(){vr&&process.stdin.removeListener("keypress",vr),hr&&process.stdin.removeListener("data",hr),vr=Jd(),hr=Xd(),Gd.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",hr),process.stdin.on("keypress",vr)}import bn from"chalk";Qd(`${bn.bold("Epiq CLI")}
40
+ `)):(ud(),l("State booted successfully",null))}import{Box as Ld}from"ink";import hr from"react";import At from"chalk";import{Box as xr,Text as wi}from"ink";import wt,{useEffect as gd,useMemo as fd,useState as yd}from"react";var Ai=At.gray,xd=At.inverse,vd=At.inverse.gray,hd={hint:"",hints:[],overlap:0,remainder:""},Mi=({value:e,command:t})=>{if(!t)return null;let n=e.trimStart(),o=e.length-n.length;return e.slice(o,o+t.length)!==t?null:{start:o,end:o+t.length}},Ed=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=me(t);return{bg:r=>At.bgHex(n).black(r),bgCursor:r=>At.bgHex(n).inverse.black(r)}}return Bn(t)},Cd=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=Mi({value:e,command:t});if(!r)return null;let i=e.slice(r.end).match(/^\s*/)?.[0].length??0,a=r.end+i;return e.slice(a,a+n.length)!==n?null:{start:a,end:a+n.length}},Ti=()=>({value:Y.value,cursorPosition:Y.cursorPosition,commandIsPending:Y.commandIsPending,autoCompletion:Y.commandMeta.autoCompletion??hd,infoMessage:Y.commandMeta.infoMessage,validationStatus:Y.commandMeta.validity,command:Y.commandMeta.command,inputString:Y.commandMeta.inputString,modifier:Y.commandMeta.modifier}),Nd=(e,t)=>e.value===t.value&&e.cursorPosition===t.cursorPosition&&e.commandIsPending===t.commandIsPending&&e.infoMessage===t.infoMessage&&e.autoCompletion.hint===t.autoCompletion.hint&&e.autoCompletion.overlap===t.autoCompletion.overlap&&e.autoCompletion.remainder===t.autoCompletion.remainder&&e.validationStatus===t.validationStatus&&e.command===t.command&&e.modifier===t.modifier&&e.inputString===t.inputString,Ri=({width:e})=>{let[t,n]=yd(Ti());gd(()=>{let g=()=>{let S=Ti();n(w=>Nd(w,S)?w:S)},x=ao(g);return g(),()=>{x()}},[]);let{value:r,cursorPosition:o,infoMessage:i,commandIsPending:a,autoCompletion:m,command:c,modifier:u}=t,p=fd(()=>{let g=Math.max(0,Math.min(o,r.length)),x=Mi({value:r,command:c}),S=Cd({value:r,command:c,modifier:u}),w=c?Bn(c):null,N=Ed({command:c,modifier:u}),I=(ie,se)=>{let Mn=x&&se>=x.start&&se<x.end,Rn=S&&se>=S.start&&se<S.end;return Mn&&w?w.fg(ie):Rn&&N?N.bg(ie):ie},M=(ie,se)=>{let Mn=x&&se>=x.start&&se<x.end,Rn=S&&se>=S.start&&se<S.end;return Mn&&w?w.fgCursor(ie):Rn&&N?N.bgCursor(ie):xd(ie)},B=r.slice(0,g),z=r[g]??" ",oe=g<r.length?r.slice(g+1):"",Lt=Array.from(B).map((ie,se)=>I(ie,se)).join(""),Pe=M(z,g),Fr=Array.from(oe).map((ie,se)=>I(ie,g+1+se)).join("");if(m.hint){let ie=m.hint[m.overlap]??z;Pe=vd(ie),Fr=Ai(m.remainder.slice(1)+oe)}return Ai(":")+Lt+Pe+Fr},[r,o,m,c,u]);return wt.createElement(xr,{flexDirection:"column",justifyContent:"flex-start"},wt.createElement(xr,{flexDirection:"column",paddingX:1,borderColor:C.secondary,borderStyle:"round",width:e},wt.createElement(xr,null,wt.createElement(wi,null,p),i&&wt.createElement(wi,{wrap:"truncate",color:a?C.red:C.secondary2},` ${i} `))))};import Li from"chalk";import{Box as bd,Text as vr}from"ink";import pn,{useEffect as Id,useState as Sd}from"react";var wd=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],Pi=e=>{let t=e.replace("#","");return{r:parseInt(t.slice(0,2),16),g:parseInt(t.slice(2,4),16),b:parseInt(t.slice(4,6),16)}},Ad=({r:e,g:t,b:n})=>{let r=o=>Math.round(Math.max(0,Math.min(255,o))).toString(16).padStart(2,"0");return`#${r(e)}${r(t)}${r(n)}`},Td=(e,t,n)=>{let r=Pi(e),o=Pi(t);return Ad({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},Md=(e,t)=>{if(e.length===1)return e[0];let n=t*(e.length-1),r=Math.floor(n),o=n-r,i=e[r],a=e[Math.min(r+1,e.length-1)];return Td(i,a,o)},Rd=(e,t)=>e.length===t?e:e.length>t?e.slice(0,t):e.padEnd(t," "),Di=({width:e,availableHints:t})=>{let{syncStatus:{status:n,msg:r}}=W(),[o,i]=Sd(0);Id(()=>{if(n!=="syncing"){i(0);return}let I=setInterval(()=>{i(M=>M+1)},50);return()=>clearInterval(I)},[n]);let a=[],m=0;for(let I of t){let B=(a.length>0?" | ":"").length+I.length;if(m+B>e-4)break;a.push(I),m+=B}let c=n!="synced"?r??a.join(" | "):a.join(" | "),u=Math.max(0,e-2),p=n==="syncing"?Md(wd,(Math.sin(o*.12)+1)/2):C.secondary,g=Li.hex(p??"fff"),x=Li.hex(C.secondary2),S=g(`\u256D${"\u2500".repeat(u)}\u256E`),w=g(`\u2570${"\u2500".repeat(u)}\u256F`),N=`${g("\u2502")}${x(Rd(` ${c} `,u))}${g("\u2502")}`;return pn.createElement(bd,{flexDirection:"column",width:e},pn.createElement(vr,null,S),pn.createElement(vr,null,N),pn.createElement(vr,null,w))};var gn=({width:e,mode:t,availableHints:n})=>{let r=W(),o=[],i=0;for(let a of n){let c=(o.length>0?" | ":"").length+a.length;if(i+c>e+2)break;o.push(a),i+=c}return hr.createElement(Ld,null,t===y.COMMAND_LINE&&r.syncStatus.status!=="syncing"?hr.createElement(Ri,{width:e}):hr.createElement(Di,{width:e,mode:t,availableHints:n}))};import{Box as ct,Text as Fi}from"ink";import Be from"react";var ki=({width:e})=>{let t=[...E().availableActions].map(n=>n.description).filter(n=>n!==void 0).map(n=>{let[r,o]=n.split("]"),i=r?.replace("[",""),a=o?.trim();return[i,a]}).filter(n=>n[0]!==void 0&&n[1]!==void 0).sort(([n],[r])=>n.length===1&&r.length!==1?-1:n.length!==1&&r.length===1?1:n.localeCompare(r,void 0,{sensitivity:"base"}));return t.unshift(["Key(s)","Action"]),Be.createElement(ct,{flexDirection:"column",marginTop:3,borderColor:C.secondary,borderStyle:"round",width:e,minHeight:19},Be.createElement(ct,{flexDirection:"column",width:e},E().mode===y.HELP?t.map(([n,r],o)=>Be.createElement(ct,{paddingLeft:1,key:o,flexDirection:"row"},Be.createElement(ct,{key:o,flexDirection:"row",paddingBottom:o?0:1},Be.createElement(ct,{width:20,justifyContent:"flex-end"},Be.createElement(Fi,{color:o?C.accent:C.secondary},n)),Be.createElement(ct,{flexGrow:1,width:40,paddingLeft:2},Be.createElement(Fi,{color:o?C.primary:C.secondary},r))))):null))};import Wi from"chalk";import{Box as yn,Text as Ge}from"ink";import Q from"react";import{Box as Er,Text as Ud}from"ink";import ut from"react";import{Text as Pd}from"ink";import Dd from"react";var Fd=e=>e.toLowerCase().trim(),kd=(e,t=Qe)=>{let n=Fd(e);return t[n]?t[n]:ft(n)},lt=({id:e,isSelected:t})=>{let n=b.getContributor(e);if(n)return Dd.createElement(Pd,{underline:t,color:kd(n.name)},"@"+n.name)};import{Text as Od}from"ink";import Bd from"react";var mt=({id:e,isSelected:t})=>{let n=b.getTag(e);if(n)return Bd.createElement(Od,{underline:t,backgroundColor:me(n.name),color:C.primary}," "+n.name+" ")};var Wd=(e,t)=>e.length<=t?e:t<=1?"\u2026":e.slice(0,t-1)+"\u2026",Oi=({width:e})=>{let{breadCrumb:t,currentNode:n,selectedIndex:r,viewMode:o}=E(),i=_(n.id)[r],a=Xe(i?.id??n.id,"TICKET"),m=De(a)?a.data:void 0,c=m?.id?_(m.id):[],u=N=>{let I=c.find(M=>M.title===N);return I?_(I.id).map(M=>typeof M.props?.value=="string"?M.props.value:"").filter(M=>!!M):[]},p=u("Tags"),g=u("Assignees"),x=m?.parentNodeId?!Dn(n.id,m?.parentNodeId)&&o==="dense":!1,S=t.map((N,I)=>{let M=I===t.length-1,B=_(N.id),z=M?B?.[r]?.title:void 0;return`${I?" / ":""}${N.title??""}${z?` \u25B8 ${z}`:""}`}).join(""),w=Wd(S,e);return ut.createElement(Er,null,ut.createElement(Ud,{color:C.secondary2},w),x?p.map(N=>ut.createElement(Er,{key:N,paddingLeft:2},ut.createElement(mt,{id:N}))):null,x?g.map(N=>ut.createElement(Er,{key:N,paddingLeft:2},ut.createElement(lt,{id:N}))):null)};import{Box as Hd,Text as Bi}from"ink";import fn from"react";var _d=({filters:e})=>fn.createElement(Hd,{columnGap:1},fn.createElement(Bi,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>fn.createElement(Bi,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),Ui=fn.memo(_d);function xn({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,eventLog:r,unappliedEvents:o}=W(),{userName:i,preferredEditor:a}=pe(),m=40,c=process.stdout.columns-m-8,u=r.at(-1)?.id,p=Wt(u??""),g=De(p)?Xr(p.data):"INVALID DATE";return Q.createElement(yn,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},t?Q.createElement(Ge,null," "):Q.createElement(yn,{paddingLeft:1},e.length>0?Q.createElement(Ui,{filters:e}):Q.createElement(Oi,{width:c})),n==="live"?Q.createElement(yn,{columnGap:1,paddingRight:2,"max-width":m,overflow:"hidden",justifyContent:"flex-end"},Q.createElement(Hi,{icon:"@",value:i}),Q.createElement(Hi,{icon:"\u276F",value:a})):"",n==="peek"?Q.createElement(yn,{paddingLeft:1},Q.createElement(Ge,{backgroundColor:C.yellow}," Readonly "),Q.createElement(Ge,{color:C.yellow}," "+o.length+" edits ago at "),Q.createElement(Ge,{backgroundColor:C.yellow,color:C.accent}," "+g+" "),Q.createElement(Ge,{color:C.yellow},". Resume with "),Q.createElement(Ge,{backgroundColor:C.yellow}," :peek now ")):"")}function Hi({icon:e,value:t}){return Q.createElement(Ge,null,Wi.dim(e)+Wi.hex(C.accent)(` ${t??"-"} `))}import{Box as cc,Text as lc}from"ink";import Mt from"react";import{Box as vn,Text as Cr}from"ink";import Ue from"react";import{Text as _i}from"ink";import $i,{useEffect as Ki,useState as $d}from"react";var Vi={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"command-line":["\u276F "]},re=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=W(),r=Vi[n]??Vi.default,[o,i]=$d(0);if(Ki(()=>{i(0)},[r]),Ki(()=>{if(!e)return;let m=setInterval(()=>{i(c=>(c+1)%r.length)},500);return()=>clearInterval(m)},[e,r]),!e)return $i.createElement(_i,null,t);let a=r[o]??r[0]??t;return $i.createElement(_i,{color:C.accent,dimColor:o===1},a)};function Nr(){let e=W(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,i=process.stdout.columns||120,a=t?.id?R(t?.id):[];return Ue.createElement(vn,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:C.secondary,width:i},Ue.createElement(vn,{padding:1,paddingTop:0,paddingBottom:0},Ue.createElement(Cr,null,"Select a board:")),Ue.createElement(vn,{padding:1,flexDirection:"column"},a.map((m,c)=>{let u=e.currentNode.context==="WORKSPACE"&&e.selectedIndex===c,g=R(m.id).flatMap(({id:x})=>_(x)).length;return Ue.createElement(vn,{key:m.id??c},Ue.createElement(Cr,{color:u?C.accent:C.secondary},Ue.createElement(re,{isSelected:u})),Ue.createElement(Cr,{color:u?C.accent:C.secondary},m.title," (",g," issues)",m.readonly?" \u{1F512}":""))})))}import{Box as ac}from"ink";import In from"react";import{Box as Sr,Text as Gd}from"ink";import he from"react";import{Box as br,Text as Kd}from"ink";import hn from"react";var En=({children:e=[],height:t,selectedIndex:n,itemHeight:r=1,scrollByOne:o=!1})=>{if(e.length===0)return null;let i=Math.max(1,Math.floor(t)),a=Math.max(1,Math.ceil(r)),m=Math.max(1,Math.floor(i/a)),c=Math.max(0,Math.min(n,e.length-1)),u=Math.max(0,e.length-m),p=o?Math.min(u,Math.max(0,c-m+1)):Math.min(u,Math.floor(c/m)*m),g=p+m,x=e.slice(p,g),S=e.length>m,w=i,N=S?Math.max(1,Math.floor(m/e.length*w)):w,I=Math.max(0,w-N),M=Math.max(1,e.length-m),B=S?Math.floor(p/M*I):0;return hn.createElement(br,{flexDirection:"row",height:i,width:"100%"},hn.createElement(br,{flexDirection:"column",flexGrow:1,height:i},x),hn.createElement(br,{flexDirection:"column",width:1,height:w},Array.from({length:w}).map((z,oe)=>hn.createElement(Kd,{key:oe,color:S&&oe>=B&&oe<B+N?C.accent:C.secondary},S?"\u2502":" "))))};import{Box as Cn,Text as Vd}from"ink";import qe from"react";var ji=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=Dt(Br(t.title),r),i=R(t.id),a=u=>{let p=i.find(g=>g.title===u);return p?R(p.id).map(g=>typeof g.props?.value=="string"?g.props.value:"").filter(g=>!!g):[]},m=a("Tags").map(u=>b.getTag(u)).filter(u=>!!u),c=a("Assignees").map(u=>b.getContributor(u)).filter(u=>!!u);return qe.createElement(Cn,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?C.accent:C.secondary,justifyContent:"space-between"},qe.createElement(Cn,{borderBottom:!0},qe.createElement(Cn,{paddingLeft:1,flexDirection:"column"},qe.createElement(Vd,{color:C.primary},o))),qe.createElement(Cn,{flexDirection:"row",paddingLeft:1},m.map(u=>qe.createElement(mt,{key:u.id,id:u.id})),c.map(u=>qe.createElement(lt,{key:u.id,id:u.id}))))};import jd from"chalk";import{Box as Tt,Text as Ir}from"ink";import Te from"react";var zd=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,zi=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let i=R(t.id),a=N=>{let I=i.find(M=>M.title===N);return I?R(I.id).map(M=>typeof M.props?.value=="string"?M.props.value:"").filter(M=>!!M):[]},m=a("Tags").map(N=>b.getTag(N)).filter(N=>!!N),c=a("Assignees").map(N=>b.getContributor(N)).filter(N=>!!N),u=1,p=m.length*(1+u),g=c.length*(2+u),x=m.map(N=>Te.createElement(Tt,{key:N.id,paddingRight:u},Te.createElement(Ir,{color:me(N.name)},"\u25A0"))),S=c.map(N=>Te.createElement(Tt,{key:N.id,paddingRight:u},Te.createElement(Ir,{color:ft(N.name)},"@"+N.name.at(0)))),w=n?C.accent:o===y.MOVE?C.secondary:C.primary;return Te.createElement(Tt,{borderBottom:!0,justifyContent:"space-between"},Te.createElement(Tt,null,Te.createElement(re,{isSelected:n,placeholder:jd.dim.gray(r+1+" ")}),Te.createElement(Ir,{wrap:"truncate",color:w},zd(t.title,e-p-g-14))),Te.createElement(Tt,null,x,S))};var qd=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:i,listSelectedIndex:a,mode:m})=>{let{renderedChildrenIndex:c}=W(),u=c[e.id]??[],p=`${e.title} (${u.length})`,g=3,x=o?1:4,S=r-g-(o?2:1),w=he.createElement(Sr,{borderStyle:"round",borderColor:C.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},he.createElement(re,{isSelected:t}),he.createElement(Gd,{bold:!0,color:t?C.accent:C.primary},p," ",e.readonly?"\u{1F512}":"")),N=(I,M)=>{let B=i&&a===M;return o?he.createElement(zi,{key:I.id,index:M,width:n,ticket:I,isSelected:B,mode:m}):he.createElement(ji,{key:I.id,width:n,ticket:I,isSelected:B})};return he.createElement(Sr,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?C.accent:C.secondary,paddingRight:1,paddingLeft:1,height:r},w,he.createElement(Sr,{padding:o?1:0},u.length>0&&he.createElement(En,{selectedIndex:a,height:S,itemHeight:x},u.map(N)),he.createElement(re,{isSelected:i&&a===-1})))},Gi=he.memo(qd);import{Box as Tr,Text as ic}from"ink";import We,{useEffect as Mr,useMemo as Xi}from"react";import Me from"chalk";import qi from"string-width";import{decodeTime as Yd}from"ulid";var Jd=(e,t)=>e+" ".repeat(Math.max(0,t-qi(e))),Xd=(e,t)=>" ".repeat(Math.max(0,t-qi(e)))+e,Qd=e=>(()=>{let n={"add.issue":"Created with title","assign.issue":"Assigned to","close.issue":"Closed","delete.node":"Deleted","edit.title":"Changed title to","edit.description":"Changed description","reopen.issue":"Reopened","tag.issue":"Tagged with","lock.node":"Locked node","move.node":"Moved issue"};return(o=>n[o]??(o.endsWith("e")?`${o}d`:`${o}ed`))(e)})(),Zd=e=>{switch(e.action){case"move.node":{let t=b.getNode(e.payload.parent),n=t?Me.dim.bgBlack(` ${t.title} `):"unknown",r=e.payload.pos;if(!r)return`to ${n}`;switch(r.at){case"start":return`to ${n} ${Me.dim("(to top of list)")}`;case"end":return`to ${n} ${Me.dim("(to bottom of list)")}`;case"before":return`to ${n} ${Me.dim("(up in list)")}`;case"after":return`to ${n} ${Me.dim("(down in list)")}`}}case"tag.issue":{let t=E().tags[e.payload.tagId];return t?Me.bgHex(me(t.name))(` ${t.name} `):"unknown tag"}case"assign.issue":{let t=E().contributors[e.payload.contributor];return t?Me.hex(me(t.name))(` ${t.name} `):"unknown user"}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"create.contributor":case"edit.title":return`"${"name"in e.payload?e.payload.name:""}"`;default:return""}},ec=e=>{let t=Jr(Yd(e));return Me.gray(Xd(t,8))},tc=12,nc=e=>Jd(`${e}`,tc),Yi=e=>{let t=ec(e.id),n=nc(e.userName),r=Qd(e.action),o=Zd(e),i=Me.dim("\u203A"),a=[r,o].filter(Boolean).join(" ");return`${n} ${t} ${i} ${a}`};import{Box as Nn,Text as rc}from"ink";import Re from"react";var Ji=({selectedIndex:e,parent:t,selected:n})=>{let{currentNode:r}=W(),{title:o}=t,i=R(t.id).map(a=>{let m=typeof a.props?.value=="string"?a.props.value:"";if(o==="Assignees")return b.getContributor(m)?.id;if(o==="Tags")return b.getTag(m)?.id}).filter(a=>!!a);return Re.createElement(Nn,{alignItems:"center",paddingTop:1},Re.createElement(Nn,{minWidth:12},Re.createElement(re,{isSelected:n}),Re.createElement(rc,{color:n?C.accent:C.secondary2},o,":")),Re.createElement(Nn,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((a,m)=>{let c=r.id===t.id&&m===e;return Re.createElement(Nn,{key:`${o}-${a}`,paddingRight:2,minHeight:1},Re.createElement(re,{isSelected:c}),o==="Assignees"?Re.createElement(lt,{isSelected:c,id:a}):o==="Tags"?Re.createElement(mt,{isSelected:c,id:a}):null)})))};import{Box as bn,Text as wr}from"ink";import Le,{useEffect as oc}from"react";var Ar=({id:e,label:t,text:n,height:r,selected:o,maxWidth:i})=>{let{selectedIndex:a,currentNode:m}=W(),c=x=>String(x).replace(/\r?\n/g,""),u=typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[];oc(()=>{let x=[];return u.forEach((S,w)=>{let N=ee.text({id:`${w}`,name:`Line ${w+1}`,parentNodeId:e,props:{value:S},readonly:!0}),I=b.createNodeAtPosition(N);De(I)&&x.push(I.data.id)}),()=>x.forEach(b.deleteNode)},[e,n]);let p="\u2029",g=u.map((x,S)=>{let w=m.id===e&&a===S;return Le.createElement(bn,{key:`${e}-${S}`},Le.createElement(wr,{color:w?C.primary:C.secondary2,dimColor:!w},`${S+1} `.padStart(5,"\xA0")),Le.createElement(wr,{backgroundColor:w?"gray":""},c(x.length?Dt(x,i-10):p)))});return Le.createElement(bn,{flexDirection:"column",paddingTop:1},Le.createElement(bn,null,Le.createElement(re,{isSelected:o}),Le.createElement(wr,{color:o?C.accent:C.secondary2},t)),Le.createElement(bn,{flexDirection:"row",borderStyle:"round",borderColor:C.secondary,paddingLeft:1,paddingRight:1,marginLeft:1},Le.createElement(En,{scrollByOne:!0,children:g,height:r-2,selectedIndex:a,itemHeight:1})))};var sc=e=>`${e}::log`,Qi=({ticket:e,height:t})=>{let{selectedIndex:n,currentNode:r}=W(),o=process.stdout.columns||120,i=Xi(()=>sc(e.id),[e.id]),a=Xi(()=>[...e.log].reverse().map(Yi).join(`
41
+ `),[e.log]);Mr(()=>{if(b.getNode(i))return;let M={...ee.field(i,"Log",e.id,{value:a}),readonly:!0,childRenderAxis:"vertical"};return b.createNodeAtPosition(M),()=>{b.deleteNode(i)}},[i,e.id]),Mr(()=>{let I=b.getNode(i);I&&I.props.value!==a&&b.updateNode({...I,props:{...I.props,value:a},childRenderAxis:"vertical",readonly:!0})},[i,a]);let m=r.id===e.id,c=r.id===i||r.parentNodeId===i;Mr(()=>{c&&(n>=0||U.navigate({selectedIndex:0}))},[c,n]);let u=R(e.id);if(c){let I=b.getNode(i),B=t-3;return We.createElement(Tr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},I?We.createElement(Ar,{id:I.id,label:"Event log",text:I.props.value??"",selected:!1,maxWidth:o,height:B}):null)}let p=u.reduce((I,M)=>M.title==="Assignees"||M.title==="Tags"||M.id===i?++I:I,0),g=2,x=p*1,w=t-3-x-g,N=(I,M)=>I.title==="Assignees"||I.title==="Tags"?We.createElement(Ji,{key:I.id,parent:I,selected:M,selectedIndex:n}):I.id===i?We.createElement(Tr,{key:I.id,paddingTop:1},We.createElement(re,{isSelected:M}),We.createElement(ic,{backgroundColor:C.secondary,color:M?C.accent:C.primary}," History \u203A\u203A ")):We.createElement(Ar,{label:"Description (press e to edit)",key:I.id,id:I.id,text:I.props.value??"",selected:M,maxWidth:o,height:w});return We.createElement(Tr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},u.map((I,M)=>N(I,m&&n===M)))};var dc=({swimlanes:e,currentNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:i,height:a,width:m})=>{let c=t.context,u=c===P.TICKET||c===P.FIELD_LIST||c===P.FIELD,p=c===P.BOARD||c===P.SWIMLANE,g=c===P.TICKET?t:r.find(I=>I.context===P.TICKET),x=Math.floor(m/3),S=Math.floor(m/Math.max(e.length,1)),w=Math.min(S,x),N=i==="dense";return In.createElement(ac,{flexDirection:"row",height:a},p&&e.map((I,M)=>{let B=t.id===I.id,z=B?n:-1,oe=t.context===P.BOARD&&n===M;return In.createElement(Gi,{key:I.id,height:a,width:w,swimlane:I,isSelected:oe,isDense:N,isFocused:B,listSelectedIndex:z,mode:o})}),u&&g&&In.createElement(Qi,{height:a,ticket:g}))},Zi=In.memo(dc);var mc=({currentNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:i,width:a})=>{let{renderedChildrenIndex:m}=W(),c=n.find(({context:x})=>x==="BOARD"),g=i-1-3;return Mt.createElement(cc,{flexDirection:"row"},e.context==="WORKSPACE"?Mt.createElement(Nr,null):c?Mt.createElement(Zi,{height:g,width:a,swimlanes:(m[c.id]??[]).filter(x=>x!==void 0&&kr(x)),currentNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):Mt.createElement(lc,null))},es=Mt.memo(mc);import{Box as Rt,Text as Ee}from"ink";import H from"react";var Sn=({isDone:e,command:t,value:n})=>H.createElement(Rt,null,H.createElement(Ee,{color:C.accent,dimColor:e},e?" \u2714 ":" "),H.createElement(Ee,{dimColor:e},"Type "),H.createElement(Ee,{backgroundColor:C.secondary,dimColor:e}," "+t+" "),n&&H.createElement(H.Fragment,null,H.createElement(Ee,{dimColor:e}," "),H.createElement(Ee,{color:C.secondary,dimColor:e},"<"+n+">")));function Rr({width:e,height:t,hasUserName:n,hasPreferredEditor:r,userName:o,preferredEditor:i}){let a=n&&r,m=n?r?null:":set:editor":":set:username";return H.createElement(Rt,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:C.secondary,rowGap:1},H.createElement(Ee,{color:C.accent,bold:!0},"Welcome! \u{1F539}"),H.createElement(Ee,null,"Lets get you started - its a breeze."),H.createElement(Ee,{color:C.secondary2},"And remember, you can always get help with"," ",H.createElement(Ee,{color:C.accent},":help"),"."),!a&&H.createElement(Ee,{color:C.secondary2},m===":set:username"?"First, choose your username.":"Nice. One more step."),H.createElement(Rt,{flexDirection:"column"},n&&H.createElement(Rt,{marginBottom:1},H.createElement(Sn,{isDone:!0,command:":set:username",value:o})),!n&&H.createElement(Sn,{isDone:!1,command:":set:username"}),n&&!r&&H.createElement(Sn,{isDone:!1,command:":set:editor"}),a&&H.createElement(Rt,null,H.createElement(Sn,{isDone:!0,command:":set:editor",value:i}))))}var pc=({width:e,height:t})=>O.createElement(fe,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:C.secondary,rowGap:1},O.createElement(He,{color:C.accent,bold:!0},"Initialize project"),O.createElement(He,null,`This folder is not an ${uc.hex(C.accent)("epiq")} project yet.`),O.createElement(He,{color:C.primary},"To start tracking issues here, we need to initialize a new"," ",O.createElement(He,{color:C.primary,backgroundColor:C.secondary}," .epiq/ ")," ","directory in this repository."),O.createElement(fe,{marginTop:1,flexDirection:"column"},O.createElement(fe,null,O.createElement(He,{color:C.accent}," "),O.createElement(He,{color:C.primary},"Type "),O.createElement(He,{backgroundColor:C.secondary}," :init "))),O.createElement(fe,{marginTop:1},O.createElement(He,{color:C.secondary2},"(This will create the local epiq project files)")));function Lr({width:e,height:t}){let n=W(),r=n.filters;if(n.mode===y.HELP)return O.createElement(fe,{flexDirection:"column"},O.createElement(ki,{width:e}));let{isSetup:o,hasPreferredEditor:i,hasUserName:a,userName:m,preferredEditor:c}=Bt(),u=!o,p=o&&Ke();if(u)return O.createElement(fe,{flexDirection:"column"},O.createElement(fe,{flexDirection:"column"},O.createElement(xn,{hideBreadCrumb:!0,filters:r}),O.createElement(Rr,{height:t,width:e,hasUserName:a,hasPreferredEditor:i,userName:m??"",preferredEditor:c??""})),O.createElement(gn,{width:e,mode:n.mode,availableHints:n.availableHints}));if(p)return O.createElement(fe,{flexDirection:"column"},O.createElement(fe,{flexDirection:"column"},O.createElement(xn,{hideBreadCrumb:!0,filters:r}),O.createElement(pc,{height:t,width:e})),O.createElement(gn,{width:e,mode:n.mode,availableHints:n.availableHints}));let g=be(E().breadCrumb??[],"BOARD");if(De(g)){let x=g.data.id,S=R(x).length,w=3,N=Math.floor(e/w),I=Math.floor(e/Math.max(S,1));e=Math.min(I,N)*Math.max(S,w)}return O.createElement(fe,{flexDirection:"column"},O.createElement(fe,{flexDirection:"column"},O.createElement(xn,{filters:r}),O.createElement(es,{width:e,height:t,currentNode:n.currentNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:n.viewMode,mode:n.mode})),O.createElement(gn,{width:e,mode:n.mode,availableHints:n.availableHints}))}import{Box as Ye,Text as _e}from"ink";import Z,{useEffect as gc,useMemo as fc,useState as yc}from"react";var xc=["\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ","\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557","\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551","\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2551\u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551","\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D","\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2580\u2580\u255D "];function vc(e,t,n){return Math.min(n,Math.max(t,e))}function hc(e,t){return Z.createElement(_e,null,Z.createElement(_e,{color:t%2===0?"cyan":"blue",bold:!0},e.slice(0,14)),Z.createElement(_e,{color:t%2===0?"cyan":"blue",bold:!0},e.slice(14)))}function Ec(e,t=28){if(e>=1)return"\u2588".repeat(t);let n=Math.floor(e*(t-1));return Array.from({length:t},(r,o)=>{let i=Math.abs(o-n);return i===0?"\u2588":i===1?"\u2593":i===2?"\u2592":i===3?"\u2591":o<n?"\u2500":"\xB7"}).join("")}function Pr({durationMs:e=3e3,slogan:t="Never leave the command line"}){let n=Math.max(1,e),[r,o]=yc(0);gc(()=>{let c=Date.now(),u=setInterval(()=>{let p=Date.now()-c;if(p>=n){o(n),clearInterval(u);return}o(p)},33);return()=>clearInterval(u)},[n]);let i=vc(r/n,0,1),a=fc(()=>Ec(i,28),[i]),m=`${Math.round(i*100)}%`;return Z.createElement(Ye,{flexDirection:"column",alignItems:"center",justifyContent:"center",paddingX:4,paddingY:1},Z.createElement(Ye,{flexDirection:"column",minWidth:42},Z.createElement(Ye,{flexDirection:"column",marginBottom:1},xc.map((c,u)=>Z.createElement(Ye,{key:u,justifyContent:"center"},hc(c,u)))),Z.createElement(Ye,{justifyContent:"center",marginBottom:1},Z.createElement(_e,{color:"gray"},t)),Z.createElement(Ye,{justifyContent:"center",marginBottom:1},Z.createElement(_e,{color:"cyan"},a.slice(0,10)),Z.createElement(_e,{color:"blue"},a.slice(10,18)),Z.createElement(_e,{color:"magenta"},a.slice(18))),Z.createElement(Ye,{justifyContent:"center",marginBottom:1},Z.createElement(_e,{color:"gray"},m))))}import Cc from"readline";var wn,An,Ce,Nc=new Set([v.MoveCursorLeft,v.EraseInputWord,v.MoveCursorLeftOfWord,v.MoveCursorRight,v.MoveCursorRightOfWord,v.NavToPreviousContainer,v.NavToNextContainer,v.NavPreviousItem,v.NavNextItem,v.SetViewDense,v.SetViewWide,v.Confirm,v.Exit,v.InitCommandLine,v.ExitCommandLine,v.CaptureInput,v.EraseInput,v.EraseInputWord,v.HideHelp,v.ViewHelp,v.SetViewDense,v.SetViewWide,v.GetLastCommandFromHistory,v.GetNextCommandFromHistory,v.AutoCompleteCommand]),ts=async e=>{if(e.ctrl&&e.name==="c")return U.exit();let{actionIndex:t,mode:n,readOnly:r}=E(),o=yo(e,n);if(!o||r&&!Nc.has(o))return;let i=t[n]?.[o];if(i?.action)try{await i.action(i,e)}catch(a){logger.error(a)}},bc=()=>async function(t,n){n.name!=="escape"&&(Ce&&(clearTimeout(Ce),Ce=void 0),await ts(n))},Ic=()=>async function(t){if(t.length===1&&t[0]===27){Ce&&clearTimeout(Ce),Ce=setTimeout(()=>{ts({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),Ce=void 0},25);return}Ce&&(clearTimeout(Ce),Ce=void 0)};function ns(){wn&&process.stdin.removeListener("keypress",wn),An&&process.stdin.removeListener("data",An),wn=bc(),An=Ic(),Cc.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",An),process.stdin.on("keypress",wn)}import Dr from"chalk";wc(`${Dr.bold("Epiq CLI")}
37
42
 
38
- ${bn.dim("Boot in directory:")}
39
- ${bn.cyan("$ epiq")}
43
+ ${Dr.dim("Boot in directory:")}
44
+ ${Dr.cyan("$ epiq")}
40
45
 
41
- `,{importMeta:import.meta,flags:{init:{type:"string"}}});var Zd=2e3,ec=600,Vi=process.stdout.columns||120,ji=process.stdout.rows||20,Cr=null,tc=e=>new Promise(t=>setTimeout(t,e)),zi=e=>{if(!Cr){Cr=Yd(e);return}Cr.rerender(e)},qi=()=>{zi(Ki.createElement(Nn,{width:Vi,height:ji}))},rc=e=>{zi(Ki.createElement(En,{durationMs:e}))},nc=()=>{let e=Kt();if(d(e)){if(e.message.includes("No events found"))return logger.info("No events found, starting with empty state"),[];throw new Error(e.message)}return e.data},oc=e=>{let t=ci(e);if(d(t))throw new Error(`Failed to boot state: ${t.message}`)};async function ic(){Ao(),await zo();let e=nc(),r=e.length===0?Zd:ec;r>0&&rc(r);let n=Date.now();oc(e);let o=Date.now()-n,i=Math.max(0,r-o);i>0&&await tc(i),qi(),_i()}process.stdout.on("resize",()=>{Vi=process.stdout.columns||120,ji=process.stdout.rows||20,Cr&&qi()});(async()=>(console.clear(),await ic()))();
46
+ `,{importMeta:import.meta,flags:{init:{type:"string"}}});var Ac=2e3,Tc=600,os=process.stdout.columns||120,is=process.stdout.rows||20,Tn=null,Mc=e=>new Promise(t=>setTimeout(t,e)),ss=e=>{if(!Tn){Tn=Sc(e);return}Tn.rerender(e)},as=()=>{ss(rs.createElement(Lr,{width:os,height:is}))},Rc=e=>{ss(rs.createElement(Pr,{durationMs:e}))},Lc=()=>{let e=ht();if(d(e)){if(e.message.includes("No events found"))return logger.info("No events found, starting with empty state"),[];throw new Error(e.message)}return e.data},Pc=e=>{let t=Si(e);if(d(t))throw new Error(`Failed to boot state: ${t.message}`)};async function Dc(){li(),await ti();let e=Lc(),n=e.length===0?Ac:Tc;n>0&&Rc(n);let r=Date.now();Pc(e);let o=Date.now()-r,i=Math.max(0,n-o);i>0&&await Mc(i),as(),ns()}process.stdout.on("resize",()=>{os=process.stdout.columns||120,is=process.stdout.rows||20,Tn&&as()});(async()=>(console.clear(),await Dc()))();
package/package.json CHANGED
@@ -1,9 +1,25 @@
1
1
  {
2
2
  "name": "epiq",
3
- "version": "0.2.28",
3
+ "version": "0.2.30",
4
4
  "license": "UNLICENSED",
5
5
  "type": "module",
6
6
  "description": "EPIQ - CLI based issue tracker",
7
+ "keywords": [
8
+ "issue-tracker",
9
+ "task-manager",
10
+ "productivity",
11
+ "project-management",
12
+ "kanban",
13
+ "terminal",
14
+ "git",
15
+ "tui",
16
+ "commandline",
17
+ "offline-first",
18
+ "git-based",
19
+ "local-first",
20
+ "developer-tools",
21
+ "vim-inspired"
22
+ ],
7
23
  "bin": {
8
24
  "epiq": "dist/cli.js"
9
25
  },
package/readme.md CHANGED
@@ -1,9 +1,10 @@
1
- > ⓘ First stable release scheduled for end of April
1
+ > ⓘ First stable release scheduled for end of April 2026
2
2
 
3
3
  # Epiq
4
4
 
5
- **CLI-native issue tracker** — powered by Git.
6
- Manage all your projects directly via the command line, edit in your favorite editor.
5
+ Issue tracking is a part of the development lifecycle, but it often becomes a painful context switching exercise with poor ergonomics. `Epiq` provides issue tracking as a portable, integrated part of the development environment, with access to all the powerful tooling developers are used to. Epiq is a **CLI-native issue tracker** — powered by Git in which you can manage all your projects directly via the command line in a visual kanban board and edit content in your favorite, personalized editor.
6
+
7
+ With great attention to user ergonomics, epiq intends to make project management painless and friction free again, and has developer satisfaction as its primary target.
7
8
 
8
9
  ```
9
10
  '███████╗██████╗ ██╗ ██████╗ '
@@ -24,10 +25,10 @@ Epiq renders your issue board directly in the terminal using ASCII and stores it
24
25
  ## Features
25
26
 
26
27
  - Issue tracking — track work in tickets with name, description, tags, assignees, history log, etc.
28
+ - Ergonomics — fast keyboard-driven ux, command line with history, syntax highlighting etc.
29
+ - Time travel - inspect your app 1 week or 1 year ago
27
30
  - Filtering — query issues by description, tags, assignees, etc.
28
- - Ergonomics — fast keyboard-driven navigation
29
31
  - Autocompletion — minimize typing, stay in flow
30
- - Command system — built with ergonomics and automation in mind
31
32
  - Multi-user — real-time synchronization of board
32
33
  - Traceable event log — state is a full history of every change ever made
33
34
 
@@ -38,7 +39,7 @@ Most issue trackers live outside your workflow. Epiq brings issue tracking into
38
39
  These design choices result in a system that is:
39
40
 
40
41
  - **Zero setup** — no account registration required
41
- - **Repo-native** — your issues live where your code lives
42
+ - **Repo-native** — your issues can live where your code lives
42
43
  - **Offline-friendly** — works anywhere, with eventual consistency as a promise
43
44
  - **Speed** — local first, and eventual consistency makes epiq edits instant
44
45
  - **Portable** — run on your local machine, on a remote Linux server or your grandma’s connected toaster
@@ -129,22 +130,22 @@ Clear all filters with `:filter clear`
129
130
 
130
131
  - You can reopen a task by visiting the `Closed` board, selecting an issue and typing command `:reopen`. This will restore the issue to its last previous location.
131
132
 
133
+ ### Reuse command
134
+
135
+ - Pro tip: just like in any terminal - if you need to do repeating tasks over and over again, you can just put yourself in the command mode, and then press arrow up, in order to access the last executed command. This helps a lot when you create tasks with similar names, or add the same tag to many tickets and so on.
136
+
132
137
  ---
133
138
 
134
139
  ## How epiq is synchronized
135
140
 
136
- Epiq uses Git in the background to synchronize state between clients. You do not need to do any manual git commands to make it work. Running `:sync` pulls and pushes changes between your local state and the remote.
141
+ Epiq uses Git in the background to synchronize state between clients. No manual git commands are required to make it work. Running `:sync` pulls and pushes changes between your local state and the remote state.
137
142
 
138
143
  - Your issue data is stored in a dedicated branch managed automatically by epiq
139
- - A local `.epiq/` folder is created in your project as a cache
140
-
141
- The `.epiq/` folder:
144
+ - A local `.epiq/` folder is created in your project as a local cache
142
145
 
143
- - Is non-authoritative and used for caching and local tracking
144
- - Can be committed if you want your board state versioned alongside your code
145
- - Is optional — epiq works whether you commit it or not
146
+ The `.epiq/` folder is non-authoritative and used for caching and local tracking. It can optionally be committed if you want your board state versioned alongside your code.
146
147
 
147
- > The system is designed to avoid merge conflicts.
148
+ > The system is designed to assure robustness and uses a number of techniques and design patterns to avoid merge conflicts.
148
149
 
149
150
  ---
150
151