epiq 0.2.12 → 0.2.13

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 (2) hide show
  1. package/dist/cli.js +27 -27
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -1,37 +1,37 @@
1
1
  #!/usr/bin/env node
2
- import{render as Cd}from"ink";import hd from"meow";import di from"react";import od from"chalk";import{Box as ce,Text as Pe}from"ink";import P from"react";import tt from"chalk";import{monotonicFactory as ta,ulid as he}from"ulid";import{useSyncExternalStore as Qs}from"react";var L={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function ke(e){return e.context==="TICKET"}var Qn=e=>e.context==="SWIMLANE";var g={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"},ye={None:"none",Success:"success",Fail:"fail"},s=e=>({result:ye.Fail,message:e,data:null}),c=(e,t)=>({result:ye.Success,message:e,data:t}),Zn=()=>({result:ye.None,message:"No result",data:null}),l=e=>e.result==="fail",Ve=e=>e.result==="success";var p={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line"};function ht(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var Nt=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",er=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var tr=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},nr=(e,t)=>t?e.get(t)??[]:[];var rr=new WeakMap,pi=e=>{let t=rr.get(e);return t||(t=tr(e),rr.set(e,t)),t};var or=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return nr(pi(e),r).filter(i=>ht(r,i)>=n)};var ir=({inputToMatch:e,lastWord:t},n)=>{if(t.endsWith(" "))return{hint:"",hints:[],overlap:0,remainder:""};let r=or({wordList:n,inputToMatch:e,overlapThreshold:1});return gi(t,r)},gi=(e,t)=>{let n=t[0]??"",r=ht(e.toLowerCase(),n.toLowerCase()),o=n?n+" ":"",i=o.slice(r);return{hint:o,hints:t,overlap:r,remainder:i}};var sr=["vi","vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];var Ke=24n,fi=Ke*4n,Et=(1n<<fi)-1n,xi=/^[0-9a-f]+$/;function ar(e){if(!e||!xi.test(e))throw new Error(`Invalid hex rank: ${e}`);return BigInt("0x"+e)}function It(e,t=Ke){if(e<0n)throw new Error("Negative rank not allowed");return e.toString(16).padStart(Number(t),"0")}function at(e,t){if(!e&&!t)return It(Et/2n,Ke);let n=e?ar(e):0n,r=t?ar(t):Et;if(r<=n)return It(Et/2n,Ke);let o=(n+r)/2n;return o===n||o===r?"":It(o,Ke)}function se(){return It(Et/2n,Ke)}var Y={workspace:(e,t)=>({id:e,title:t,rank:se(),isDeleted:!1,props:{},context:L.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,r=!1)=>({id:e,title:t,rank:se(),isDeleted:!1,props:{},context:L.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:r,log:[]}),swimlane:(e,t,n)=>({id:e,title:t,rank:se(),isDeleted:!1,props:{},context:L.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:(e,t,n,r={},o="horizontal")=>({id:e,title:t,rank:se(),isDeleted:!1,props:r,context:L.FIELD,childRenderAxis:o,parentNodeId:n,readonly:!1,log:[]}),ticket:(e,t,n)=>({id:e,title:t,rank:se(),isDeleted:!1,props:{},context:L.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:se(),isDeleted:!1,props:r,context:L.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:o,log:[]})};var O=e=>Object.values(C().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),dr=(e,t)=>e.findIndex(n=>n.id===t),sn=(e,t={at:"end"})=>{if(e.length===0)return c("Resolved rank",se());switch(t.at){case"start":{let n=e[0];return n?c("Resolved rank",at(void 0,n.rank)):s("Unable to resolve first sibling")}case"end":{let n=e[e.length-1];return n?c("Resolved rank",at(n.rank,void 0)):s("Unable to resolve last sibling")}case"before":{let n=dr(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?c("Resolved rank",at(r?.rank,o.rank)):s("Sibling not found")}case"after":{let n=dr(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?c("Resolved rank",at(r.rank,o?.rank)):s("Sibling not found")}}};var je=(e,t)=>{let{nodes:n}=C(),r=n[e];if(!r)return s("Node not found");if(r.context===t)return c("Resolved ancestor node",r);let o=r.parentNodeId?n[r.parentNodeId]:void 0;for(;o;){if(o.context===t)return c("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}=C(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},an=(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"),h={deleteNode(e){re(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},editValue(e,t){let{nodes:n}=C(),r=n[e];if(!r)return s("Edit target node not found");let o=an(r,"edit");if(o)return o;let i={...r,props:{...r.props,value:t}};return h.updateNode(i),c("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return s("Rename target node not found");let r=an(n,"rename");if(r)return r;let o={...n,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 O(e).find(n=>n.title===t)},moveNode({id:e,parentId:t,position:n={at:"end"},navigate:r=!0}){let{rootNodeId:o}=C(),i=this.getNode(e),a=this.getNode(t);if(!i)return s("Node not found");if(!a)return s("Target parent not found");if(o===e)return s("Cannot move root node");if(e===t)return s("Cannot move node into itself");let d=an(i,"move");if(d)return d;if(dn(t,e))return s("Cannot move node into its own descendant");let m=O(t).filter(y=>y.id!==e),u=sn(m,n);if(l(u))return u;let f={...i,parentNodeId:t,rank:u.data};return r?this.updateNodeAndSelectInParent(f):this.updateNode(f),c("Moved node successfully",f)},tombstoneNode(e){let{nodes:t,currentNodeId:n,rootNodeId:r}=C(),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=u=>{let f=t[u];if(!(!f||i.has(u))){i.add(u);for(let y of O(f.id))a(y.id)}};a(e);let d={...structuredClone(t)};for(let u of i){if(!d[u])return s("Unable to locate node to delete");d[u]={...d[u],isDeleted:!0}}if(!n)return s("Unable to delete undefined");let m=i.has(n)?o.parentNodeId??r:n;return A({nodes:d}),F.navigate({currentNode:d[m],selectedIndex:0}),c("Successfully tomb stoned",o)},createContributor(e){let t=re(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return l(t)?s("Unable to create contributor"):c("Created contributor",e)},assign(e,t,n){let r=h.getContributor(t),o=h.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(O(i.id).some(m=>m.props?.value===t))return s("Contributor already assigned");let d=this.createNodeAtPosition(Y.field(n,r.name,i.id,{value:t}));return l(d)?d:c("Assigned contributor",d.data)},createTag(e){let t=re(n=>({...n,tags:{...n.tags,[e.id]:e}}));return l(t)?s("Could not create tag"):c("Tag created",e)},tag(e,t,n){let r=h.getTag(t),o=h.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(O(i.id).some(m=>m.props?.value===t))return s("Tag already assigned");let d=this.createNodeAtPosition(Y.field(n,r.name,i.id,{value:t}));return l(d)?d:c("Tag added",d.data)},createNodeAtPosition(e,t={at:"end"}){if(!e.parentNodeId){let i={...e,rank:se()};return this.createNode(i),c("Created node",i)}let n=O(e.parentNodeId),r=sn(n,t);if(l(r))return r;let o={...e,rank:r.data};return this.createNode(o),c("Created node",o)},createNode(e){let t=re(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return l(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 n={...t,readonly:!0},r=re(o=>({...o,nodes:{...o.nodes,[e]:n}}));return l(r)?s(r.message):c("Locked node",n)},updateNode(e){let t=re(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return l(t)?t:c("Updated node",e)},updateNodeAndSelectInParent(e){let t=re(a=>({...a,nodes:{...a.nodes,[e.id]:e}}));if(l(t))return s(t.message);let n=C(),r=e.parentNodeId?n.nodes[e.parentNodeId]:n.nodes[n.rootNodeId];if(!r)return s("Unable to resolve parent after update");let i=T(r.id).findIndex(({id:a})=>a===e.id);return F.navigate({currentNode:r,selectedIndex:i===-1?0:i}),c("Updated and selected",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,n)=>t.rank.localeCompare(n.rank))};var bt={preferredEditor:null,userName:null,userId:null},ae=()=>bt,dt=e=>(bt={...bt,...e},bt);var St=()=>{let e=ae(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim();return{isSetup:n&&t,hasPreferredEditor:n,hasUserName:t,userName:e.userName,preferredEditor:e.preferredEditor}},cr=()=>!At();var z={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"},v={accent:z.cyan,accent2:z.magenta,primary:z.white,secondary:z.grayDark,secondary2:z.grayLight,gray:z.gray,green:z.green,yellow:z.yellow,red:z.red};var x={red:z.red,yellow:z.yellow,green:z.green,blue:z.blue,magenta:z.magenta,cyan:z.cyan},ze={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 j=e=>{let{currentNode:t}=C(),n=St().isSetup,r=t.context,o=[g.SYNC,g.HELP,g.SET_VIEW,g.SET_EDITOR,g.SET_USERNAME],i=[g.NEW,g.RENAME,g.DELETE],a=[g.TAG,g.ASSIGN,g.CLOSE_ISSUE,g.RE_OPEN_ISSUE,g.SET_DESCRIPTION],m=[...{WORKSPACE:[...o,...i],BOARD:[g.FILTER,...o,...i],SWIMLANE:[g.FILTER,...o,...i],TICKET:[...o,...i,...a],FIELD:[...o,...a],FIELD_LIST:[...o,...a],TEXT:[...o]}[r||"WORKSPACE"]],u={[g.SYNC]:[],[g.INIT]:[],[g.SET_USERNAME]:[],[g.SET_DESCRIPTION]:["confirm"],[g.DELETE]:["confirm"],[g.RE_OPEN_ISSUE]:["confirm"],[g.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[g.CLOSE_ISSUE]:["confirm"],[g.FILTER]:["tag","assignee","description","title","clear"],[g.SET_VIEW]:["dense","wide"],[g.SET_EDITOR]:[...sr,"vim"],[g.TAG]:[...new Set([...Object.keys(ze),...h.getExistingTags()])],[g.ASSIGN]:h.getExistingAssignees(),[g.HELP]:[],[g.RENAME]:[],[g.NEW]:r==="TICKET"||r==="FIELD"||r==="FIELD_LIST"?["issue","swimlane","board"]:r==="SWIMLANE"?["issue","swimlane","board"]:r==="BOARD"?["issue","swimlane","board"]:["board"],[g.NONE]:m};return n?cr()||(u={[g.NONE]:[g.HELP,g.INIT],[g.HELP]:u[g.HELP],[g.INIT]:u[g.INIT]}):u={[g.NONE]:[g.HELP,g.SET_EDITOR,g.SET_USERNAME],[g.SYNC]:u[g.SYNC],[g.HELP]:u[g.HELP],[g.SET_EDITOR]:u[g.SET_EDITOR],[g.SET_USERNAME]:u[g.SET_USERNAME]},u[e]??[]};import pn from"chalk";import qe from"chalk";var ln={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},yi=(e,t,n)=>Math.max(t,Math.min(n,e)),cn=(e,t,n)=>e+(t-e)*n,lr=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},vi=(e,t,n)=>{let r=t/100,o=n/100,i=(1-Math.abs(2*o-1))*r,a=e/60,d=i*(1-Math.abs(a%2-1)),m=0,u=0,f=0;a>=0&&a<1?(m=i,u=d):a>=1&&a<2?(m=d,u=i):a>=2&&a<3?(u=i,f=d):a>=3&&a<4?(u=d,f=i):a>=4&&a<5?(m=d,f=i):(m=i,f=d);let y=o-i/2;return[Math.round((m+y)*255),Math.round((u+y)*255),Math.round((f+y)*255)]},Ci=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,hi=(e,t,n)=>[Math.round(cn(e[0],t[0],n)),Math.round(cn(e[1],t[1],n)),Math.round(cn(e[2],t[2],n))],ct=e=>{let n=lr(e)%360,r=vi(n,ln.stringColor.saturation,ln.stringColor.lightness);return Ci(r)},Ni=e=>{let t=ln.gradient.stops,n=yi(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 hi(t[i],t[i+1],a)},wt=e=>lr(e.toLowerCase().trim())/4294967295,mr=e=>{let t=wt(e);return Ni(t)},Ei=e=>{let[t,n,r]=mr(e);return{normal:o=>qe.bgRgb(t,n,r).black(o),cursor:o=>qe.bgRgb(t,n,r).white.bold(o)}},mn=e=>{let[t,n,r]=mr(e);return{fg:o=>qe.rgb(t,n,r)(o),fgCursor:o=>qe.rgb(t,n,r).inverse(o),bg:o=>qe.bgRgb(t,n,r).black(o),bgCursor:o=>qe.bgRgb(t,n,r).white.bold(o)}},un=e=>Ei(e).normal(` ${e} `),oe=(e,t=ze)=>{let r=(o=>o.toLowerCase().trim())(e);return r&&t[r]?t[r]:ct(r)};var ve="<ENTER> to confirm",J=(e="",t=[])=>({message:e,validity:xe.Valid,completionWordList:t}),de=({message:e,completionWordList:t})=>({validity:xe.Invalid,message:e,completionWordList:t}),lt=e=>e.length===0,we=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=2,inputString:o,minLengthForHints:i=1})=>{let m=[...t.filter(Boolean).filter(f=>f.startsWith(o.trim()))].sort((f,y)=>wt(f)-wt(y)).slice(0,r).map(un),u=m.length>i?m.join(" "):"";return u?`${e}${u}${n}`:""},gn=({modifier:e})=>{let t="confirm";return e===t?J(ve):de({message:lt(e)?`if you are certain, enter ${un(t)}`:"",completionWordList:[t]})},Ii=({list:e,hint:t})=>({modifier:n})=>e.includes(n)?J(ve):de({message:lt(n)?t:"",completionWordList:[]}),bi=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?de({message:n,completionWordList:[]}):J():de({message:lt(r)?t:"",completionWordList:[]}),fn=({hint:e})=>({modifier:t,inputString:n})=>lt(t)&&lt(n)?de({message:e,completionWordList:[]}):J(ve),Si={[g.INIT]:()=>J(ve),[g.FILTER]:e=>{if(e.modifier==="clear")return J();let t=a=>j(g.FILTER).includes(a);if(!e.modifier||!t(e.modifier??""))return de({message:we({wordList:j(g.FILTER),noOfHints:100,inputString:e.inputString}),completionWordList:j(g.FILTER)});let r=Object.values(C().tags).map(a=>a.name),o=Object.values(C().contributors).map(a=>a.name),i=e.modifier==="tag"?r:e.modifier==="assignee"?o:[];return e.inputString?i.length&&!i.includes(e.inputString.trim()??"")?de({message:we({prefix:`existing ${e.modifier}s... `,wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i}):J():de({message:we({prefix:"one of... ",wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i})},[g.NONE]:e=>e.command?J():de({message:we({prefix:"commands... ",wordList:j(g.NONE),noOfHints:100,inputString:e.inputString,minLengthForHints:0}),completionWordList:[]}),[g.NEW]:e=>bi({list:j(g.NEW),hint:we({wordList:j(g.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[g.SET_DESCRIPTION]:()=>J(ve),[g.HELP]:()=>J(ve),[g.RENAME]:()=>J(ve),[g.DELETE]:e=>gn(e),[g.CLOSE_ISSUE]:e=>gn(e),[g.RE_OPEN_ISSUE]:e=>gn(e),[g.MOVE]:e=>fn({hint:we({prefix:"hey hacker! These commands are blocked for you... ",wordList:j(g.MOVE),noOfHints:10,inputString:e.inputString})})(e),[g.TAG]:e=>{let t=h.getExistingTags().map(n=>` ${pn.bgHex(oe(n))(" "+n+" ")} `).slice(0,10);return fn({hint:"tag name like... "+t.join("")})(e)},[g.ASSIGN]:e=>{let t=h.getExistingAssignees().map(n=>` ${pn.bgHex(oe(n))(" "+n+" ")} `).slice(0,10);return fn({hint:"assign to... "+t.join("")})(e)},[g.SET_EDITOR]:e=>{logger.debug(`Validating command: ${e.command} ${e.modifier} ${e.inputString}`);let t=j(g.SET_EDITOR);return e.modifier?J(ve):de({message:we({wordList:t,noOfHints:100,inputString:e.inputString}),completionWordList:[]})},[g.SET_USERNAME]:e=>e.inputString?J():de({message:`Enter a username. Saved in ${pn.bgBlack("~/.epiqrc")}`,completionWordList:[]}),[g.SET_VIEW]:e=>Ii({list:j(g.SET_VIEW),hint:we({wordList:j(g.SET_VIEW),noOfHints:3,inputString:e.inputString})})(e),[g.SYNC]:()=>J(ve)},ur=Object.fromEntries(Object.entries(Si).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var pr=["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 M={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 gr=e=>Object.values(g).includes(e),fr=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:i}=e,{message:a,validity:d,completionWordList:m}=ur[n].validate(n,r,i),u=o==="command"?Object.values(g):n&&e.target==="modifier"?j(n):pr;return{validity:d,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:a??"",autoCompletion:t?ir(e,[...m,...u]):{hint:"",hints:[],remainder:"",overlap:0}}};var xr=e=>{let t=e.trimStart(),n=wi(t),r=(n[0]??"").trimStart().trimEnd(),o=(n[1]??"").trimStart().trimEnd(),i=Ti(e),a=gr(r)?r:null,d=a!==null,m=r!=="",u=e.endsWith(" "),f=a?j(a)??[]:[],y=a&&f.includes(o)?o:"",N="word";n.length<=1?N="command":n.length===2&&(N="modifier");let S=Ai(t,a,y);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:i,hasCommand:m,command:a,isCommandKeyword:d,isLastWordCompleted:u,modifier:y,target:N,inputToMatch:i,inputString:S}},Ai=(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},wi=e=>e?e.split(/\s+/):[],Ti=e=>e.trimEnd().split(/\s+/).at(-1)??"";var yr=" ",q={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:xe.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},xn=new Set,vr=()=>{for(let e of xn)e()},Cr=e=>(xn.add(e),()=>xn.delete(e)),Ce=e=>{let n=e(q),r=xr(n.value),o=n.cursorPosition===n.value.length;q={...n,commandMeta:fr(r,o)},vr()},Tt=({message:e,result:t})=>{let n=structuredClone(q);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,q=n,vr(),c(e,null)},yn=e=>{Ce(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},vn=e=>{Ce(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}})},hr=()=>{Ce(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}})},Nr=()=>{Ce(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}})},U=e=>{Ce(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,d=Math.max(0,Math.min(i.length,a.length));return{...t,value:a,cursorPosition:d,commandIsPending:!1}})},Er=()=>{Ce(e=>({...e,commandIsPending:!0}))},Ir=({addToHistory:e=!0})=>{Ce(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),Mi()},br=()=>{Ce(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}})},Sr=()=>{Ce(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},Mi=()=>U(()=>""),me=()=>q,Mt=()=>{let[e,...t]=q.value.split(yr);return t.join(yr).trim()};var Li=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",Ri=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",Pi=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",Ar=(e,t)=>{if(Ri(e,e.sequence))return"MoveCursorLeftOfWord";if(Pi(e,e.sequence))return"MoveCursorRightOfWord";if(Li(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 Di(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 Fi(e,t,n){let r=C().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 wr(e,t){let n=me();if(e.sequence===":"&&n.value==="")return"initCommandLine";if(t===p.MOVE)switch(e.name){case"m":case"return":return"confirmMove"}if(t===p.COMMAND_LINE)return Ar(e,n.value);let r=Di(e);if(r){let o=t===p.MOVE?{prevItem:"movePreviousItem",nextItem:"moveNextItem",prevContainer:"moveToPreviousContainer",nextContainer:"moveToNextContainer"}:{prevItem:"navPreviousItem",nextItem:"navNextItem",prevContainer:"navToPreviousContainer",nextContainer:"navToNextContainer"};return Fi(C().currentNode.childRenderAxis,r,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 Tr=e=>{let{context:t}=C()?.currentNode;if(!t)return M.None;switch(e){case g.INIT:return M.Init;case g.DELETE:return M.Delete;case g.SET_DESCRIPTION:return M.Edit;case g.HELP:return M.ViewHelp;case g.RE_OPEN_ISSUE:return M.ReopenIssue;case g.CLOSE_ISSUE:return M.CloseIssue;case g.TAG:return M.TagTicket;case g.ASSIGN:return M.AssignUserToTicket;case g.RENAME:return M.Rename;case g.NEW:return M.NewItem;case g.FILTER:return M.Filter;case g.MOVE:return M.Move;case g.SET_USERNAME:return M.SetUserName;case g.SET_EDITOR:return M.SetEditor;case g.SET_VIEW:return M.SetView;case g.SYNC:return M.Sync;default:return M.None}};import{ulid as H}from"ulid";import{spawnSync as $i}from"node:child_process";import Vi from"node:os";import Pr from"node:path";import{ulid as Ki}from"ulid";import{accessSync as Bi,copyFileSync as ki,existsSync as Lt,mkdirSync as Mr,readdirSync as Lr,readFileSync as Oi,renameSync as Ui,rmSync as Wi,statSync as Rr,unlinkSync as Hi,writeFileSync as _i}from"node:fs";import Ge from"node:path";var te={writeToFile:(e,t)=>{try{let n=Ge.dirname(e);Lt(n)||Mr(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);_i(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return Oi(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=te.readFile(e);return t===null?null:JSON.parse(t)}catch(t){return logger.error(`Failed to read JSON at ${e}:`,t),null}},dirExists:e=>{try{return Lt(e)&&Rr(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Bi(e),!0}catch{return!1}},mkDir:e=>Mr(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=Ge.parse(t);for(;;){let r=Ge.join(t,e);try{if(Lt(r)&&Rr(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=Ge.dirname(t)}return null},readFirstJSON(e){try{if(!te.dirExists(e))return null;let t=Lr(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=Ge.join(e,t);return te.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return te.dirExists(e)?Lr(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{Hi(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Wi(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(Ge.dirname(t)),!n?.overwrite&&Lt(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{Ui(e,t)}catch(r){if(r?.code==="EXDEV"){ki(e,t),this.rmFile(e);return}throw r}}};function ji(){let{preferredEditor:e}=ae(),t=[e,process.env.VISUAL,process.env.EDITOR,"vim","vi","nano"].filter(n=>!!n?.trim());return[...new Set(t)]}function zi(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function Dr(e){let t=Pr.join(Vi.tmpdir(),"epiq");te.mkDir(t);let n=Pr.join(t,Ki());te.writeToFile(n,e??"");let r=ji();for(let o of r){let i=zi(o,n),a=$i(i,{stdio:"inherit",shell:!0});if(!a.error&&a.status===0){let d=te.readFile(n);if(d==null)return s("Unable to read edited file");let m=d.replace(/\r?\n$/,"");return c("Successfully edited",m)}}return s("Unable to open editor")}import{monotonicFactory as qi,ulid as Rt}from"ulid";var Pt=qi(),Fr=({name:e,parent:t,userId:n})=>{let r=Pt(),o=Pt(),i=Pt(),a=Pt();return[{id:Rt(),userId:n,action:"add.issue",payload:{id:r,parent:t,name:e}},{id:Rt(),userId:n,action:"add.field",payload:{id:o,parent:r,name:"Description",val:""}},{id:Rt(),userId:n,action:"add.field",payload:{id:i,parent:r,name:"Assignees"}},{id:Rt(),userId:n,action:"add.field",payload:{id:a,parent:r,name:"Tags"}}]};var Br=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 Gi=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[Xe,Dt]=Gi;var R=(e,t)=>s(`${t.split(".").join(" ")+" failed, "+e.toLowerCase()}`),Xi={"init.workspace":({action:e,payload:t})=>{let{id:n,name:r}=t,o=Y.workspace(n,r);kr(o);let i=h.createNodeAtPosition(o);return l(i)?R(i.message??"Failed to initialize workspace",e):c("Workspace initialized",{action:e,result:i.data})},"add.workspace":({action:e,payload:t})=>{let{id:n,name:r}=t,o=Y.workspace(n,r),i=h.createNodeAtPosition(o);return l(i)?R(i.message??"Failed to add workspace",e):c("Added workspace",{action:e,result:i.data})},"add.board":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,i=h.createNodeAtPosition(Y.board(n,r,o));return l(i)?R(i.message??"Unable to create board",e):c("Added board",{action:e,result:i.data})},"add.swimlane":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,i=h.createNodeAtPosition(Y.swimlane(n,r,o));return l(i)?R(i.message??"Unable to create swimlane",e):c("Added swimlane",{action:e,result:i.data})},"add.issue":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,i=h.createNodeAtPosition(Y.ticket(n,r,o));return l(i)?R(i.message??"Unable to create issue",e):c("Added issue",{action:e,result:i.data})},"add.field":({action:e,payload:t})=>{let{id:n,name:r,parent:o,val:i}=t,a=h.createNodeAtPosition(Y.field(n,r,o,{value:i},r.includes("Description")?"vertical":"horizontal"));return l(a)?R(a.message??`Unable to create field: ${r}`,e):c("Added field",{action:e,result:a.data})},"edit.title":({action:e,payload:t})=>{let{id:n,name:r}=t;if(!h.getNode(n))return R("Unable to locate node",e);let i=h.renameNode(n,r);return l(i)?R(i.message??"Unable to edit title",e):c("Edited title",{action:e,result:i.data})},"delete.node":({action:e,payload:t})=>{let{id:n}=t,r=h.tombstoneNode(n);return l(r)?R(r.message??"Unable to delete node",e):c("Deleted node",{action:e,result:r.data})},"create.tag":({action:e,payload:t})=>{let{id:n,name:r}=t,o=h.createTag({id:n,name:r});return l(o)?R(o.message??"Unable to create tag",e):c("Tag added",{action:e,result:o.data})},"create.contributor":({action:e,payload:t})=>{let{id:n,name:r}=t,o=h.createContributor({id:n,name:r});return l(o)?R(o.message??"Unable to create contributor",e):c("Contributor created",{action:e,result:o.data})},"tag.issue":({action:e,payload:t})=>{let{id:n,target:r,tagId:o}=t,i=h.tag(r,o,n);return l(i)?R(i.message??"Unable to tag issue",e):c("Issue tagged",{action:e,result:i.data})},"assign.issue":({action:e,payload:t})=>{let{id:n,contributor:r,target:o}=t,i=h.assign(o,r,n);return l(i)?R(i.message??"Unable to assign issue",e):c("Assigned successfully",{action:e,result:i.data})},"move.node":({action:e,payload:t})=>{let{id:n,parent:r,pos:o}=t,i=h.moveNode({id:n,parentId:r,position:o});return l(i)?R(i.message??"Failed to move node",e):c("Moved node",{action:e,result:i.data})},"edit.description":({action:e,payload:t})=>{let{id:n,md:r}=t,o=h.editValue(n,r);return l(o)?R(o.message??"Unable to edit description",e):c("Set node value",{action:e,result:o.data})},"close.issue":({action:e,payload:t})=>{let{id:n}=t,r=h.getNode(n);if(!r)return R("Unable to locate issue",e);if(!ke(r))return R("Can only close issues",e);let o=h.getNode(Xe);if(!o)return R("Unable to locate target swimlane",e);if(o.id===r.parentNodeId)return R("Cannot close closed issue",e);let a=h.moveNode({id:n,parentId:o.id,navigate:!1});return l(a)?R(a.message??"Unable to close issue",e):c("Issue closed",{action:e,result:a.data})},"reopen.issue":({action:e,payload:t})=>{let{id:n}=t,r=h.getNode(n);if(!r)return R("Unable to locate issue",e);if(!ke(r))return R("Can only reopen issues",e);let o=h.getNode(Xe);if(!o)return R("Unable to locate closed swimlane",e);if(!(r.parentNodeId===o.id))return R("Issue is not closed",e);let a=Br(r);if(!a)return R("Unable to resolve previous parent from issue history",e);if(a===o.id)return R("Previous parent resolves to closed swimlane",e);if(!h.getNode(a))return R("Previous parent no longer exists",e);let m=h.moveNode({id:n,parentId:a,navigate:!1});return l(m)?R(m.message??"Unable to reopen issue",e):c("Issue reopened",{action:e,result:m.data})},"lock.node":({action:e,payload:t})=>{let{id:n}=t,r=h.lockNode(n);return l(r)?R(r.message??"Unable to lock node",e):c("Node locked",{action:e,result:r.data})}},Yi=(e,t)=>{let n=h.getNode(e);n&&h.updateNode({...n,log:[...n.log??[],t]})},Ji=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=C().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 Ye(e,t=!1){let n=Xi[e.action],r=n(e);if(l(r))return r;if(!t){let a=[...new Set(Ji(e))];for(let d of a)Yi(d,e)}let[o,i]=e.userId.split(".");return!o?.length||!i?.length?R("Invalid user ID format",e.action):(h.createContributor({name:i,id:o}),r)}var hn=e=>e.map(t=>Ye(t));import Bt from"node:fs";import Oe from"node:path";import{decodeTime as os,monotonicFactory as is}from"ulid";var Ft=process.env.IS_LOCAL==="true",ue=()=>".epiq";import Nn from"node:fs";import En from"node:path";var Qi=ue(),Zi="events",es=(e=process.cwd())=>En.join(Je(e),Qi,Zi),ts=e=>{let t=Object.keys(e).filter(n=>n!=="id");return t.length!==2?s(`Invalid persisted event: expected exactly 2 keys, 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])},ns=e=>{let{userId:t,...n}=e,r=ts(n);if(l(r))return s(r.message);let o=r.data;if(!o)return s("Action key is undefined");let i=e.id?.[0];if(!i)return s("Persisted event is missing id");let a=n[o];return c("Decoded persisted event",{id:i,action:o,payload:a,userId:t})};function Or(e=process.cwd()){let t=es(e);if(!Nn.existsSync(t))return s("No events found");let n=Nn.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>En.join(t,o)),r=[];for(let o of n){let i=Nn.readFileSync(o,"utf8"),a=En.basename(o,".jsonl")||"unknown";for(let d of i.split(`
3
- `)){let m=d.trim();if(m)try{let u=JSON.parse(m);r.push({...u,userId:a})}catch{return s(`Failed to parse event from line: ${m}`)}}}return c("All events loaded",rs(r))}function Ur(e=process.cwd()){let t=Or(e);if(l(t))return s(t.message);let n=[];for(let r of t.data){let o=ns(r);if(l(o))return s(`Failed to decode event ${r.id?.[0]??"<unknown>"}: ${o.message}`);n.push(o.data)}return c("Loaded merged events",n)}function Wr(e=process.cwd()){let t=Or(e);return l(t)?s(t.message):c("Loaded edge reference",t.data.at(-1)?.id?.[0]??null)}var rs=e=>{let t=new Map(e.map(d=>[d.id[0],d])),n=new Map;for(let d of e){let m=d.id[1],u=n.get(m)??[];u.push(d),n.set(m,u)}for(let d of n.values())d.sort((m,u)=>{let[f]=m.id,[y]=u.id;return f.localeCompare(y)});let r=[],o=new Set,i=d=>{let m=n.get(d)??[];for(let u of m){let[f]=u.id;o.has(f)||(o.add(f),r.push(u),i(f))}};i(null);let a=[...e].filter(d=>{let[m]=d.id;return!o.has(m)}).sort((d,m)=>{let[u,f]=d.id,[y,N]=m.id,S=f===null||t.has(f),b=N===null||t.has(N);if(S&&!b)return-1;if(!S&&b)return 1;let I=(f??"").localeCompare(N??"");return I!==0?I:u.localeCompare(y)});return[...r,...a]};var Hr=e=>({action:e.action,payload:e.payload});var ss=1,_r=is(),as="events",$r=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",Q=()=>{let{userName:e,userId:t}=ae();if(!e)return s("User name not configured");if(!t)return s("User ID not configured");let n=`${$r(t)}.${$r(e)}`;return e.trim()?c("Successfully resolved actor ID",n):s("Unable to resolve actor ID from settings or OS user info")},ds=e=>Bt.existsSync(Oe.join(e,ue()))&&Bt.statSync(Oe.join(e,ue())).isDirectory(),Je=(e=process.cwd())=>{let t=Oe.resolve(e);for(;;){if(ds(t))return t;let n=Oe.dirname(t);if(n===t)return Oe.resolve(e);t=n}},Vr=(e=process.cwd())=>Oe.join(Je(e),ue(),as),In=()=>{let e=Q();return l(e)||!e.data?s("Unable to resolve event log path"):c("Succeeded",`${e.data}.jsonl`)},cs=(e=process.cwd())=>{let t=In();return l(t)?s("Unable to resolve file name"):c("Successfully resolved event log path",Oe.join(Vr(e),`${t.data}.jsonl`))},ls=(e,t)=>({[e.action]:e.payload,v:ss,id:t});function Kr(e,t=process.cwd()){try{let n=Je(t),r=Vr(n),o=cs(n);if(l(o))return o;Bt.mkdirSync(r,{recursive:!0});let i=Wr(n);if(l(i))return s(i.message);let a;if(i.data){let m=os(i.data),u=Math.max(Date.now(),m+1);a=_r(u)}else a=_r();let d=ls(Hr(e),[a,i.data]);return Bt.appendFileSync(o.data,`${JSON.stringify(d)}
4
- `,"utf8"),c("Event persisted",{path:o.data,entry:d})}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return s(`Failed to persist event: ${r}`)}}function Z(e){let t=Ye(e);if(t.result!==ye.Success)return t;let n=Kr(e);return l(n)?n:t}function kt(e){return e.map(t=>Z(t))}import{ulid as jr}from"ulid";var Qe=null,Ue=()=>structuredClone(Qe),Ze=e=>Qe=e,zr=()=>{let{currentNode:e,selectedIndex:t}=C(),r=T(e.id)[t];return r?c("Resolved selected child",r):s("Target node not found")};function bn(e){let t=zr();if(l(t))return t;let{currentNode:n,nodes:r}=C();if(!n.parentNodeId)return s("Missing parent node id");let o=r[n.parentNodeId];if(!o)return s("Missing parent node");let i=O(o.id),a=i.findIndex(({id:y})=>y===n.id);if(a<0)return s("Current node not found among siblings");let d=i[a+e];if(!d)return s("Missing sibling node");let m=Q();if(l(m))return s("Unable to resolve user ID");let u=m.data;if(Ze({id:jr(),userId:u,action:"move.node",payload:{id:t.data.id,parent:d.id,pos:{at:"end"}}}),!Qe)return s("Could not materialize move state");let f=Ye(Qe,!0);return l(f)?f:c("Node moved successfully",f.data)}function Sn(e){let t=zr();if(l(t))return t;let{currentNode:n,selectedIndex:r}=C(),i=O(n.id)[r+e];if(!i)return s("Missing sibling node");let a=Q();if(l(a))return s("Unable to resolve user ID");let d=a.data;if(Ze({id:jr(),userId:d,action:"move.node",payload:{id:t.data.id,parent:n.id,pos:{at:e===1?"after":"before",sibling:i.id}}}),!Qe)return s("Could not materialize move state");let m=Ye(Qe,!0);return l(m)?m:c("Node moved successfully",m.data)}import ms from"node:os";import qr from"node:path";var us={userId:"",userName:"",preferredEditor:""},ps=".epiq",gs="config.json",Gr=()=>qr.join(ms.homedir(),ps),An=()=>qr.join(Gr(),gs),wn=()=>{try{return te.mkDir(Gr()),c("Ensured ~/.epiq exists",null)}catch{return s("Unable to create ~/.epiq")}},fs=e=>{try{let t=JSON.parse(e);return c("Parsed config",t??{})}catch{return s("Invalid ~/.epiq/config.json JSON")}},Xr=()=>{let e=wn();if(l(e))return s(e.message);let t=An(),n=te.readFile(t);return n==null||n.trim()===""?c("No config found, using empty config",{}):fs(n)},Yr=e=>{let t=wn();if(l(t))return s(t.message);let n=An();try{return te.writeToFile(n,JSON.stringify(e,null,2)+`
5
- `),c("Config written",null)}catch{return s("Unable to write ~/.epiq/config.json")}},Tn=e=>{let t=Xr();if(l(t))return s("Failed to read existing config");let n={...t.data,...e};return Yr(n)},Jr=()=>{let e=An(),t=wn();if(l(t))throw new Error("Unable to create ~/.epiq");if(!(te.readFile(e)!==null)){let d=Yr(us);if(l(d))throw new Error("Unable to create ~/.epiq/config.json")}let r=Xr();if(l(r))throw new Error("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"):dt({preferredEditor:o,userName:i,userId:a})};var et=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?c("Found node",n):s("Unable to find node in breadcrumb")};import{spawn as ro}from"node:child_process";import{createHash as xs}from"node:crypto";import D from"node:fs";import ys from"node:os";import $ from"node:path";var Ln=ue(),vs="events",G="epiq-state-2",We="origin",W=({args:e,cwd:t})=>new Promise(n=>{if(!D.existsSync(t))return n(s(`Git cwd does not exist: ${t}`));let r=ro("git",e,{cwd:t,stdio:["ignore","pipe","pipe"]}),o="",i="";r.stdout.setEncoding("utf8"),r.stderr.setEncoding("utf8"),r.stdout.on("data",a=>{o+=a}),r.stderr.on("data",a=>{i+=a}),r.on("error",a=>{n(s([`git ${e.join(" ")}`,`cwd=${t}`,a.message].join(`
2
+ import{render as Ed}from"ink";import Id from"meow";import pi from"react";import ad from"chalk";import{Box as ce,Text as Pe}from"ink";import P from"react";import nt from"chalk";import{monotonicFactory as oa,ulid as he}from"ulid";import{useSyncExternalStore as ta}from"react";var L={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function ke(e){return e.context==="TICKET"}var Jn=e=>e.context==="SWIMLANE";var g={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"},ye={None:"none",Success:"success",Fail:"fail"},s=e=>({result:ye.Fail,message:e,data:null}),c=(e,t)=>({result:ye.Success,message:e,data:t}),Qn=()=>({result:ye.None,message:"No result",data:null}),l=e=>e.result==="fail",Ke=e=>e.result==="success";var p={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line"};function Et(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var It=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",Zn=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var er=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},tr=(e,t)=>t?e.get(t)??[]:[];var nr=new WeakMap,vi=e=>{let t=nr.get(e);return t||(t=er(e),nr.set(e,t)),t};var rr=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return tr(vi(e),r).filter(i=>Et(r,i)>=n)};var or=({inputToMatch:e,lastWord:t},n)=>{if(t.endsWith(" "))return{hint:"",hints:[],overlap:0,remainder:""};let r=rr({wordList:n,inputToMatch:e,overlapThreshold:1});return Ci(t,r)},Ci=(e,t)=>{let n=t[0]??"",r=Et(e.toLowerCase(),n.toLowerCase()),o=n?n+" ":"",i=o.slice(r);return{hint:o,hints:t,overlap:r,remainder:i}};var ir=["vi","vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];var je=24n,hi=je*4n,bt=(1n<<hi)-1n,Ni=/^[0-9a-f]+$/;function sr(e){if(!e||!Ni.test(e))throw new Error(`Invalid hex rank: ${e}`);return BigInt("0x"+e)}function St(e,t=je){if(e<0n)throw new Error("Negative rank not allowed");return e.toString(16).padStart(Number(t),"0")}function ct(e,t){if(!e&&!t)return St(bt/2n,je);let n=e?sr(e):0n,r=t?sr(t):bt;if(r<=n)return St(bt/2n,je);let o=(n+r)/2n;return o===n||o===r?"":St(o,je)}function se(){return St(bt/2n,je)}var Y={workspace:(e,t)=>({id:e,title:t,rank:se(),isDeleted:!1,props:{},context:L.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,r=!1)=>({id:e,title:t,rank:se(),isDeleted:!1,props:{},context:L.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:r,log:[]}),swimlane:(e,t,n)=>({id:e,title:t,rank:se(),isDeleted:!1,props:{},context:L.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:(e,t,n,r={},o="horizontal")=>({id:e,title:t,rank:se(),isDeleted:!1,props:r,context:L.FIELD,childRenderAxis:o,parentNodeId:n,readonly:!1,log:[]}),ticket:(e,t,n)=>({id:e,title:t,rank:se(),isDeleted:!1,props:{},context:L.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:se(),isDeleted:!1,props:r,context:L.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:o,log:[]})};var U=e=>Object.values(C().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),ar=(e,t)=>e.findIndex(n=>n.id===t),sn=(e,t={at:"end"})=>{if(e.length===0)return c("Resolved rank",se());switch(t.at){case"start":{let n=e[0];return n?c("Resolved rank",ct(void 0,n.rank)):s("Unable to resolve first sibling")}case"end":{let n=e[e.length-1];return n?c("Resolved rank",ct(n.rank,void 0)):s("Unable to resolve last sibling")}case"before":{let n=ar(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?c("Resolved rank",ct(r?.rank,o.rank)):s("Sibling not found")}case"after":{let n=ar(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?c("Resolved rank",ct(r.rank,o?.rank)):s("Sibling not found")}}};var ze=(e,t)=>{let{nodes:n}=C(),r=n[e];if(!r)return s("Node not found");if(r.context===t)return c("Resolved ancestor node",r);let o=r.parentNodeId?n[r.parentNodeId]:void 0;for(;o;){if(o.context===t)return c("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}=C(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},an=(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"),h={deleteNode(e){re(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},editValue(e,t){let{nodes:n}=C(),r=n[e];if(!r)return s("Edit target node not found");let o=an(r,"edit");if(o)return o;let i={...r,props:{...r.props,value:t}};return h.updateNode(i),c("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return s("Rename target node not found");let r=an(n,"rename");if(r)return r;let o={...n,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 U(e).find(n=>n.title===t)},moveNode({id:e,parentId:t,position:n={at:"end"},navigate:r=!0}){let{rootNodeId:o}=C(),i=this.getNode(e),a=this.getNode(t);if(!i)return s("Node not found");if(!a)return s("Target parent not found");if(o===e)return s("Cannot move root node");if(e===t)return s("Cannot move node into itself");let d=an(i,"move");if(d)return d;if(dn(t,e))return s("Cannot move node into its own descendant");let m=U(t).filter(y=>y.id!==e),u=sn(m,n);if(l(u))return u;let f={...i,parentNodeId:t,rank:u.data};return r?this.updateNodeAndSelectInParent(f):this.updateNode(f),c("Moved node successfully",f)},tombstoneNode(e){let{nodes:t,currentNodeId:n,rootNodeId:r}=C(),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=u=>{let f=t[u];if(!(!f||i.has(u))){i.add(u);for(let y of U(f.id))a(y.id)}};a(e);let d={...structuredClone(t)};for(let u of i){if(!d[u])return s("Unable to locate node to delete");d[u]={...d[u],isDeleted:!0}}if(!n)return s("Unable to delete undefined");let m=i.has(n)?o.parentNodeId??r:n;return A({nodes:d}),F.navigate({currentNode:d[m],selectedIndex:0}),c("Successfully tomb stoned",o)},createContributor(e){let t=re(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return l(t)?s("Unable to create contributor"):c("Created contributor",e)},assign(e,t,n){let r=h.getContributor(t),o=h.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(U(i.id).some(m=>m.props?.value===t))return s("Contributor already assigned");let d=this.createNodeAtPosition(Y.field(n,r.name,i.id,{value:t}));return l(d)?d:c("Assigned contributor",d.data)},createTag(e){let t=re(n=>({...n,tags:{...n.tags,[e.id]:e}}));return l(t)?s("Could not create tag"):c("Tag created",e)},tag(e,t,n){let r=h.getTag(t),o=h.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(U(i.id).some(m=>m.props?.value===t))return s("Tag already assigned");let d=this.createNodeAtPosition(Y.field(n,r.name,i.id,{value:t}));return l(d)?d:c("Tag added",d.data)},createNodeAtPosition(e,t={at:"end"}){if(!e.parentNodeId){let i={...e,rank:se()};return this.createNode(i),c("Created node",i)}let n=U(e.parentNodeId),r=sn(n,t);if(l(r))return r;let o={...e,rank:r.data};return this.createNode(o),c("Created node",o)},createNode(e){let t=re(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return l(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 n={...t,readonly:!0},r=re(o=>({...o,nodes:{...o.nodes,[e]:n}}));return l(r)?s(r.message):c("Locked node",n)},updateNode(e){let t=re(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return l(t)?t:c("Updated node",e)},updateNodeAndSelectInParent(e){let t=re(a=>({...a,nodes:{...a.nodes,[e.id]:e}}));if(l(t))return s(t.message);let n=C(),r=e.parentNodeId?n.nodes[e.parentNodeId]:n.nodes[n.rootNodeId];if(!r)return s("Unable to resolve parent after update");let i=T(r.id).findIndex(({id:a})=>a===e.id);return F.navigate({currentNode:r,selectedIndex:i===-1?0:i}),c("Updated and selected",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,n)=>t.rank.localeCompare(n.rank))};var At={preferredEditor:null,userName:null,userId:null},ae=()=>At,lt=e=>(At={...At,...e},At);var wt=()=>{let e=ae(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim();return{isSetup:n&&t,hasPreferredEditor:n,hasUserName:t,userName:e.userName,preferredEditor:e.preferredEditor}},dr=()=>!Tt();var z={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"},v={accent:z.cyan,accent2:z.magenta,primary:z.white,secondary:z.grayDark,secondary2:z.grayLight,gray:z.gray,green:z.green,yellow:z.yellow,red:z.red};var x={red:z.red,yellow:z.yellow,green:z.green,blue:z.blue,magenta:z.magenta,cyan:z.cyan},qe={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 j=e=>{let{currentNode:t}=C(),n=wt().isSetup,r=t.context,o=[g.SYNC,g.HELP,g.SET_VIEW,g.SET_EDITOR,g.SET_USERNAME],i=[g.NEW,g.RENAME,g.DELETE],a=[g.TAG,g.ASSIGN,g.CLOSE_ISSUE,g.RE_OPEN_ISSUE,g.SET_DESCRIPTION],m=[...{WORKSPACE:[...o,...i],BOARD:[g.FILTER,...o,...i],SWIMLANE:[g.FILTER,...o,...i],TICKET:[...o,...i,...a],FIELD:[...o,...a],FIELD_LIST:[...o,...a],TEXT:[...o]}[r||"WORKSPACE"]],u={[g.SYNC]:[],[g.INIT]:[],[g.SET_USERNAME]:[],[g.SET_DESCRIPTION]:["confirm"],[g.DELETE]:["confirm"],[g.RE_OPEN_ISSUE]:["confirm"],[g.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[g.CLOSE_ISSUE]:["confirm"],[g.FILTER]:["tag","assignee","description","title","clear"],[g.SET_VIEW]:["dense","wide"],[g.SET_EDITOR]:[...ir,"vim"],[g.TAG]:[...new Set([...Object.keys(qe),...h.getExistingTags()])],[g.ASSIGN]:h.getExistingAssignees(),[g.HELP]:[],[g.RENAME]:[],[g.NEW]:r==="TICKET"||r==="FIELD"||r==="FIELD_LIST"?["issue","swimlane","board"]:r==="SWIMLANE"?["issue","swimlane","board"]:r==="BOARD"?["issue","swimlane","board"]:["board"],[g.NONE]:m};return n?dr()||(u={[g.NONE]:[g.HELP,g.INIT],[g.HELP]:u[g.HELP],[g.INIT]:u[g.INIT]}):u={[g.NONE]:[g.HELP,g.SET_EDITOR,g.SET_USERNAME],[g.SYNC]:u[g.SYNC],[g.HELP]:u[g.HELP],[g.SET_EDITOR]:u[g.SET_EDITOR],[g.SET_USERNAME]:u[g.SET_USERNAME]},u[e]??[]};import pn from"chalk";import Ge from"chalk";var ln={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Ei=(e,t,n)=>Math.max(t,Math.min(n,e)),cn=(e,t,n)=>e+(t-e)*n,cr=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Ii=(e,t,n)=>{let r=t/100,o=n/100,i=(1-Math.abs(2*o-1))*r,a=e/60,d=i*(1-Math.abs(a%2-1)),m=0,u=0,f=0;a>=0&&a<1?(m=i,u=d):a>=1&&a<2?(m=d,u=i):a>=2&&a<3?(u=i,f=d):a>=3&&a<4?(u=d,f=i):a>=4&&a<5?(m=d,f=i):(m=i,f=d);let y=o-i/2;return[Math.round((m+y)*255),Math.round((u+y)*255),Math.round((f+y)*255)]},bi=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,Si=(e,t,n)=>[Math.round(cn(e[0],t[0],n)),Math.round(cn(e[1],t[1],n)),Math.round(cn(e[2],t[2],n))],mt=e=>{let n=cr(e)%360,r=Ii(n,ln.stringColor.saturation,ln.stringColor.lightness);return bi(r)},Ai=e=>{let t=ln.gradient.stops,n=Ei(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 Si(t[i],t[i+1],a)},Mt=e=>cr(e.toLowerCase().trim())/4294967295,lr=e=>{let t=Mt(e);return Ai(t)},wi=e=>{let[t,n,r]=lr(e);return{normal:o=>Ge.bgRgb(t,n,r).black(o),cursor:o=>Ge.bgRgb(t,n,r).white.bold(o)}},mn=e=>{let[t,n,r]=lr(e);return{fg:o=>Ge.rgb(t,n,r)(o),fgCursor:o=>Ge.rgb(t,n,r).inverse(o),bg:o=>Ge.bgRgb(t,n,r).black(o),bgCursor:o=>Ge.bgRgb(t,n,r).white.bold(o)}},un=e=>wi(e).normal(` ${e} `),oe=(e,t=qe)=>{let r=(o=>o.toLowerCase().trim())(e);return r&&t[r]?t[r]:mt(r)};var ve="<ENTER> to confirm",J=(e="",t=[])=>({message:e,validity:xe.Valid,completionWordList:t}),de=({message:e,completionWordList:t})=>({validity:xe.Invalid,message:e,completionWordList:t}),ut=e=>e.length===0,we=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=2,inputString:o,minLengthForHints:i=1})=>{let m=[...t.filter(Boolean).filter(f=>f.startsWith(o.trim()))].sort((f,y)=>Mt(f)-Mt(y)).slice(0,r).map(un),u=m.length>i?m.join(" "):"";return u?`${e}${u}${n}`:""},gn=({modifier:e})=>{let t="confirm";return e===t?J(ve):de({message:ut(e)?`if you are certain, enter ${un(t)}`:"",completionWordList:[t]})},Ti=({list:e,hint:t})=>({modifier:n})=>e.includes(n)?J(ve):de({message:ut(n)?t:"",completionWordList:[]}),Mi=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?de({message:n,completionWordList:[]}):J():de({message:ut(r)?t:"",completionWordList:[]}),fn=({hint:e})=>({modifier:t,inputString:n})=>ut(t)&&ut(n)?de({message:e,completionWordList:[]}):J(ve),Li={[g.INIT]:()=>J(ve),[g.FILTER]:e=>{if(e.modifier==="clear")return J();let t=a=>j(g.FILTER).includes(a);if(!e.modifier||!t(e.modifier??""))return de({message:we({wordList:j(g.FILTER),noOfHints:100,inputString:e.inputString}),completionWordList:j(g.FILTER)});let r=Object.values(C().tags).map(a=>a.name),o=Object.values(C().contributors).map(a=>a.name),i=e.modifier==="tag"?r:e.modifier==="assignee"?o:[];return e.inputString?i.length&&!i.includes(e.inputString.trim()??"")?de({message:we({prefix:`existing ${e.modifier}s... `,wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i}):J():de({message:we({prefix:"one of... ",wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i})},[g.NONE]:e=>e.command?J():de({message:we({prefix:"commands... ",wordList:j(g.NONE),noOfHints:100,inputString:e.inputString,minLengthForHints:0}),completionWordList:[]}),[g.NEW]:e=>Mi({list:j(g.NEW),hint:we({wordList:j(g.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[g.SET_DESCRIPTION]:()=>J(ve),[g.HELP]:()=>J(ve),[g.RENAME]:()=>J(ve),[g.DELETE]:e=>gn(e),[g.CLOSE_ISSUE]:e=>gn(e),[g.RE_OPEN_ISSUE]:e=>gn(e),[g.MOVE]:e=>fn({hint:we({prefix:"hey hacker! These commands are blocked for you... ",wordList:j(g.MOVE),noOfHints:10,inputString:e.inputString})})(e),[g.TAG]:e=>{let t=h.getExistingTags().map(n=>` ${pn.bgHex(oe(n))(" "+n+" ")} `).slice(0,10);return fn({hint:"tag name like... "+t.join("")})(e)},[g.ASSIGN]:e=>{let t=h.getExistingAssignees().map(n=>` ${pn.bgHex(oe(n))(" "+n+" ")} `).slice(0,10);return fn({hint:"assign to... "+t.join("")})(e)},[g.SET_EDITOR]:e=>{logger.debug(`Validating command: ${e.command} ${e.modifier} ${e.inputString}`);let t=j(g.SET_EDITOR);return e.modifier?J(ve):de({message:we({wordList:t,noOfHints:100,inputString:e.inputString}),completionWordList:[]})},[g.SET_USERNAME]:e=>e.inputString?J():de({message:`Enter a username. Saved in ${pn.bgBlack("~/.epiqrc")}`,completionWordList:[]}),[g.SET_VIEW]:e=>Ti({list:j(g.SET_VIEW),hint:we({wordList:j(g.SET_VIEW),noOfHints:3,inputString:e.inputString})})(e),[g.SYNC]:()=>J(ve)},mr=Object.fromEntries(Object.entries(Li).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var ur=["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 M={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 pr=e=>Object.values(g).includes(e),gr=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:i}=e,{message:a,validity:d,completionWordList:m}=mr[n].validate(n,r,i),u=o==="command"?Object.values(g):n&&e.target==="modifier"?j(n):ur;return{validity:d,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:a??"",autoCompletion:t?or(e,[...m,...u]):{hint:"",hints:[],remainder:"",overlap:0}}};var fr=e=>{let t=e.trimStart(),n=Pi(t),r=(n[0]??"").trimStart().trimEnd(),o=(n[1]??"").trimStart().trimEnd(),i=Di(e),a=pr(r)?r:null,d=a!==null,m=r!=="",u=e.endsWith(" "),f=a?j(a)??[]:[],y=a&&f.includes(o)?o:"",N="word";n.length<=1?N="command":n.length===2&&(N="modifier");let S=Ri(t,a,y);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:i,hasCommand:m,command:a,isCommandKeyword:d,isLastWordCompleted:u,modifier:y,target:N,inputToMatch:i,inputString:S}},Ri=(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},Pi=e=>e?e.split(/\s+/):[],Di=e=>e.trimEnd().split(/\s+/).at(-1)??"";var xr=" ",q={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:xe.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},xn=new Set,yr=()=>{for(let e of xn)e()},vr=e=>(xn.add(e),()=>xn.delete(e)),Ce=e=>{let n=e(q),r=fr(n.value),o=n.cursorPosition===n.value.length;q={...n,commandMeta:gr(r,o)},yr()},Lt=({message:e,result:t})=>{let n=structuredClone(q);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,q=n,yr(),c(e,null)},yn=e=>{Ce(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},vn=e=>{Ce(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}})},Cr=()=>{Ce(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}})},hr=()=>{Ce(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}})},W=e=>{Ce(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,d=Math.max(0,Math.min(i.length,a.length));return{...t,value:a,cursorPosition:d,commandIsPending:!1}})},Nr=()=>{Ce(e=>({...e,commandIsPending:!0}))},Er=({addToHistory:e=!0})=>{Ce(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),Fi()},Ir=()=>{Ce(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}})},br=()=>{Ce(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},Fi=()=>W(()=>""),me=()=>q,Rt=()=>{let[e,...t]=q.value.split(xr);return t.join(xr).trim()};var Bi=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",ki=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",Oi=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",Sr=(e,t)=>{if(ki(e,e.sequence))return"MoveCursorLeftOfWord";if(Oi(e,e.sequence))return"MoveCursorRightOfWord";if(Bi(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 Ui(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 Wi(e,t,n){let r=C().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 Ar(e,t){let n=me();if(e.sequence===":"&&n.value==="")return"initCommandLine";if(t===p.MOVE)switch(e.name){case"m":case"return":return"confirmMove"}if(t===p.COMMAND_LINE)return Sr(e,n.value);let r=Ui(e);if(r){let o=t===p.MOVE?{prevItem:"movePreviousItem",nextItem:"moveNextItem",prevContainer:"moveToPreviousContainer",nextContainer:"moveToNextContainer"}:{prevItem:"navPreviousItem",nextItem:"navNextItem",prevContainer:"navToPreviousContainer",nextContainer:"navToNextContainer"};return Wi(C().currentNode.childRenderAxis,r,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 wr=e=>{let{context:t}=C()?.currentNode;if(!t)return M.None;switch(e){case g.INIT:return M.Init;case g.DELETE:return M.Delete;case g.SET_DESCRIPTION:return M.Edit;case g.HELP:return M.ViewHelp;case g.RE_OPEN_ISSUE:return M.ReopenIssue;case g.CLOSE_ISSUE:return M.CloseIssue;case g.TAG:return M.TagTicket;case g.ASSIGN:return M.AssignUserToTicket;case g.RENAME:return M.Rename;case g.NEW:return M.NewItem;case g.FILTER:return M.Filter;case g.MOVE:return M.Move;case g.SET_USERNAME:return M.SetUserName;case g.SET_EDITOR:return M.SetEditor;case g.SET_VIEW:return M.SetView;case g.SYNC:return M.Sync;default:return M.None}};import{ulid as _}from"ulid";import{spawnSync as qi}from"node:child_process";import Gi from"node:os";import Rr from"node:path";import{ulid as Xi}from"ulid";import{accessSync as Hi,copyFileSync as _i,existsSync as Pt,mkdirSync as Tr,readdirSync as Mr,readFileSync as $i,renameSync as Vi,rmSync as Ki,statSync as Lr,unlinkSync as ji,writeFileSync as zi}from"node:fs";import Xe from"node:path";var te={writeToFile:(e,t)=>{try{let n=Xe.dirname(e);Pt(n)||Tr(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);zi(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return $i(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=te.readFile(e);return t===null?null:JSON.parse(t)}catch(t){return logger.error(`Failed to read JSON at ${e}:`,t),null}},dirExists:e=>{try{return Pt(e)&&Lr(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Hi(e),!0}catch{return!1}},mkDir:e=>Tr(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=Xe.parse(t);for(;;){let r=Xe.join(t,e);try{if(Pt(r)&&Lr(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=Xe.dirname(t)}return null},readFirstJSON(e){try{if(!te.dirExists(e))return null;let t=Mr(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=Xe.join(e,t);return te.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return te.dirExists(e)?Mr(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{ji(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Ki(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(Xe.dirname(t)),!n?.overwrite&&Pt(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{Vi(e,t)}catch(r){if(r?.code==="EXDEV"){_i(e,t),this.rmFile(e);return}throw r}}};function Yi(){let{preferredEditor:e}=ae(),t=[e,process.env.VISUAL,process.env.EDITOR,"vim","vi","nano"].filter(n=>!!n?.trim());return[...new Set(t)]}function Ji(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function Pr(e){let t=Rr.join(Gi.tmpdir(),"epiq");te.mkDir(t);let n=Rr.join(t,Xi());te.writeToFile(n,e??"");let r=Yi();for(let o of r){let i=Ji(o,n),a=qi(i,{stdio:"inherit",shell:!0});if(!a.error&&a.status===0){let d=te.readFile(n);if(d==null)return s("Unable to read edited file");let m=d.replace(/\r?\n$/,"");return c("Successfully edited",m)}}return s("Unable to open editor")}import{monotonicFactory as Qi,ulid as Dt}from"ulid";var Ft=Qi(),Dr=({name:e,parent:t,userId:n})=>{let r=Ft(),o=Ft(),i=Ft(),a=Ft();return[{id:Dt(),userId:n,action:"add.issue",payload:{id:r,parent:t,name:e}},{id:Dt(),userId:n,action:"add.field",payload:{id:o,parent:r,name:"Description",val:""}},{id:Dt(),userId:n,action:"add.field",payload:{id:i,parent:r,name:"Assignees"}},{id:Dt(),userId:n,action:"add.field",payload:{id:a,parent:r,name:"Tags"}}]};var Fr=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 Zi=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[Ye,Bt]=Zi;var R=(e,t)=>s(`${t.split(".").join(" ")+" failed, "+e.toLowerCase()}`),es={"init.workspace":({action:e,payload:t})=>{let{id:n,name:r}=t,o=Y.workspace(n,r);Br(o);let i=h.createNodeAtPosition(o);return l(i)?R(i.message??"Failed to initialize workspace",e):c("Workspace initialized",{action:e,result:i.data})},"add.workspace":({action:e,payload:t})=>{let{id:n,name:r}=t,o=Y.workspace(n,r),i=h.createNodeAtPosition(o);return l(i)?R(i.message??"Failed to add workspace",e):c("Added workspace",{action:e,result:i.data})},"add.board":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,i=h.createNodeAtPosition(Y.board(n,r,o));return l(i)?R(i.message??"Unable to create board",e):c("Added board",{action:e,result:i.data})},"add.swimlane":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,i=h.createNodeAtPosition(Y.swimlane(n,r,o));return l(i)?R(i.message??"Unable to create swimlane",e):c("Added swimlane",{action:e,result:i.data})},"add.issue":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,i=h.createNodeAtPosition(Y.ticket(n,r,o));return l(i)?R(i.message??"Unable to create issue",e):c("Added issue",{action:e,result:i.data})},"add.field":({action:e,payload:t})=>{let{id:n,name:r,parent:o,val:i}=t,a=h.createNodeAtPosition(Y.field(n,r,o,{value:i},r.includes("Description")?"vertical":"horizontal"));return l(a)?R(a.message??`Unable to create field: ${r}`,e):c("Added field",{action:e,result:a.data})},"edit.title":({action:e,payload:t})=>{let{id:n,name:r}=t;if(!h.getNode(n))return R("Unable to locate node",e);let i=h.renameNode(n,r);return l(i)?R(i.message??"Unable to edit title",e):c("Edited title",{action:e,result:i.data})},"delete.node":({action:e,payload:t})=>{let{id:n}=t,r=h.tombstoneNode(n);return l(r)?R(r.message??"Unable to delete node",e):c("Deleted node",{action:e,result:r.data})},"create.tag":({action:e,payload:t})=>{let{id:n,name:r}=t,o=h.createTag({id:n,name:r});return l(o)?R(o.message??"Unable to create tag",e):c("Tag added",{action:e,result:o.data})},"create.contributor":({action:e,payload:t})=>{let{id:n,name:r}=t,o=h.createContributor({id:n,name:r});return l(o)?R(o.message??"Unable to create contributor",e):c("Contributor created",{action:e,result:o.data})},"tag.issue":({action:e,payload:t})=>{let{id:n,target:r,tagId:o}=t,i=h.tag(r,o,n);return l(i)?R(i.message??"Unable to tag issue",e):c("Issue tagged",{action:e,result:i.data})},"assign.issue":({action:e,payload:t})=>{let{id:n,contributor:r,target:o}=t,i=h.assign(o,r,n);return l(i)?R(i.message??"Unable to assign issue",e):c("Assigned successfully",{action:e,result:i.data})},"move.node":({action:e,payload:t})=>{let{id:n,parent:r,pos:o}=t,i=h.moveNode({id:n,parentId:r,position:o});return l(i)?R(i.message??"Failed to move node",e):c("Moved node",{action:e,result:i.data})},"edit.description":({action:e,payload:t})=>{let{id:n,md:r}=t,o=h.editValue(n,r);return l(o)?R(o.message??"Unable to edit description",e):c("Set node value",{action:e,result:o.data})},"close.issue":({action:e,payload:t})=>{let{id:n}=t,r=h.getNode(n);if(!r)return R("Unable to locate issue",e);if(!ke(r))return R("Can only close issues",e);let o=h.getNode(Ye);if(!o)return R("Unable to locate target swimlane",e);if(o.id===r.parentNodeId)return R("Cannot close closed issue",e);let a=h.moveNode({id:n,parentId:o.id,navigate:!1});return l(a)?R(a.message??"Unable to close issue",e):c("Issue closed",{action:e,result:a.data})},"reopen.issue":({action:e,payload:t})=>{let{id:n}=t,r=h.getNode(n);if(!r)return R("Unable to locate issue",e);if(!ke(r))return R("Can only reopen issues",e);let o=h.getNode(Ye);if(!o)return R("Unable to locate closed swimlane",e);if(!(r.parentNodeId===o.id))return R("Issue is not closed",e);let a=Fr(r);if(!a)return R("Unable to resolve previous parent from issue history",e);if(a===o.id)return R("Previous parent resolves to closed swimlane",e);if(!h.getNode(a))return R("Previous parent no longer exists",e);let m=h.moveNode({id:n,parentId:a,navigate:!1});return l(m)?R(m.message??"Unable to reopen issue",e):c("Issue reopened",{action:e,result:m.data})},"lock.node":({action:e,payload:t})=>{let{id:n}=t,r=h.lockNode(n);return l(r)?R(r.message??"Unable to lock node",e):c("Node locked",{action:e,result:r.data})}},ts=(e,t)=>{let n=h.getNode(e);n&&h.updateNode({...n,log:[...n.log??[],t]})},ns=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=C().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 Je(e,t=!1){let n=es[e.action],r=n(e);if(l(r))return r;if(!t){let a=[...new Set(ns(e))];for(let d of a)ts(d,e)}let[o,i]=e.userId.split(".");return!o?.length||!i?.length?R("Invalid user ID format",e.action):(h.createContributor({name:i,id:o}),r)}var hn=e=>e.map(t=>Je(t));import Ot from"node:fs";import Oe from"node:path";import{decodeTime as cs,monotonicFactory as ls}from"ulid";var kt=process.env.IS_LOCAL==="true",ue=()=>".epiq";import Nn from"node:fs";import En from"node:path";var rs=ue(),os="events",is=(e=process.cwd())=>En.join(Qe(e),rs,os),ss=e=>{let t=Object.keys(e).filter(n=>n!=="id");return t.length!==2?s(`Invalid persisted event: expected exactly 2 keys, 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])},as=e=>{let{userId:t,...n}=e,r=ss(n);if(l(r))return s(r.message);let o=r.data;if(!o)return s("Action key is undefined");let i=e.id?.[0];if(!i)return s("Persisted event is missing id");let a=n[o];return c("Decoded persisted event",{id:i,action:o,payload:a,userId:t})};function kr(e=process.cwd()){let t=is(e);if(!Nn.existsSync(t))return s("No events found");let n=Nn.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>En.join(t,o)),r=[];for(let o of n){let i=Nn.readFileSync(o,"utf8"),a=En.basename(o,".jsonl")||"unknown";for(let d of i.split(`
3
+ `)){let m=d.trim();if(m)try{let u=JSON.parse(m);r.push({...u,userId:a})}catch{return s(`Failed to parse event from line: ${m}`)}}}return c("All events loaded",ds(r))}function Or(e=process.cwd()){let t=kr(e);if(l(t))return s(t.message);let n=[];for(let r of t.data){let o=as(r);if(l(o))return s(`Failed to decode event ${r.id?.[0]??"<unknown>"}: ${o.message}`);n.push(o.data)}return c("Loaded merged events",n)}function Ur(e=process.cwd()){let t=kr(e);return l(t)?s(t.message):c("Loaded edge reference",t.data.at(-1)?.id?.[0]??null)}var ds=e=>{let t=new Map(e.map(d=>[d.id[0],d])),n=new Map;for(let d of e){let m=d.id[1],u=n.get(m)??[];u.push(d),n.set(m,u)}for(let d of n.values())d.sort((m,u)=>{let[f]=m.id,[y]=u.id;return f.localeCompare(y)});let r=[],o=new Set,i=d=>{let m=n.get(d)??[];for(let u of m){let[f]=u.id;o.has(f)||(o.add(f),r.push(u),i(f))}};i(null);let a=[...e].filter(d=>{let[m]=d.id;return!o.has(m)}).sort((d,m)=>{let[u,f]=d.id,[y,N]=m.id,S=f===null||t.has(f),b=N===null||t.has(N);if(S&&!b)return-1;if(!S&&b)return 1;let I=(f??"").localeCompare(N??"");return I!==0?I:u.localeCompare(y)});return[...r,...a]};var Wr=e=>({action:e.action,payload:e.payload});var ms=1,Hr=ls(),us="events",_r=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",Q=()=>{let{userName:e,userId:t}=ae();if(!e)return s("User name not configured");if(!t)return s("User ID not configured");let n=`${_r(t)}.${_r(e)}`;return e.trim()?c("Successfully resolved actor ID",n):s("Unable to resolve actor ID from settings or OS user info")},ps=e=>Ot.existsSync(Oe.join(e,ue()))&&Ot.statSync(Oe.join(e,ue())).isDirectory(),Qe=(e=process.cwd())=>{let t=Oe.resolve(e);for(;;){if(ps(t))return t;let n=Oe.dirname(t);if(n===t)return Oe.resolve(e);t=n}},$r=(e=process.cwd())=>Oe.join(Qe(e),ue(),us),In=()=>{let e=Q();return l(e)||!e.data?s("Unable to resolve event log path"):c("Succeeded",`${e.data}.jsonl`)},gs=(e=process.cwd())=>{let t=In();return l(t)?s("Unable to resolve file name"):c("Successfully resolved event log path",Oe.join($r(e),`${t.data}.jsonl`))},fs=(e,t)=>({[e.action]:e.payload,v:ms,id:t});function Vr(e,t=process.cwd()){try{let n=Qe(t),r=$r(n),o=gs(n);if(l(o))return o;Ot.mkdirSync(r,{recursive:!0});let i=Ur(n);if(l(i))return s(i.message);let a;if(i.data){let m=cs(i.data),u=Math.max(Date.now(),m+1);a=Hr(u)}else a=Hr();let d=fs(Wr(e),[a,i.data]);return Ot.appendFileSync(o.data,`${JSON.stringify(d)}
4
+ `,"utf8"),c("Event persisted",{path:o.data,entry:d})}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return s(`Failed to persist event: ${r}`)}}function Z(e){let t=Je(e);if(t.result!==ye.Success)return t;let n=Vr(e);return l(n)?n:t}function Ut(e){return e.map(t=>Z(t))}import{ulid as Kr}from"ulid";var Ze=null,Ue=()=>structuredClone(Ze),et=e=>Ze=e,jr=()=>{let{currentNode:e,selectedIndex:t}=C(),r=T(e.id)[t];return r?c("Resolved selected child",r):s("Target node not found")};function bn(e){let t=jr();if(l(t))return t;let{currentNode:n,nodes:r}=C();if(!n.parentNodeId)return s("Missing parent node id");let o=r[n.parentNodeId];if(!o)return s("Missing parent node");let i=U(o.id),a=i.findIndex(({id:y})=>y===n.id);if(a<0)return s("Current node not found among siblings");let d=i[a+e];if(!d)return s("Missing sibling node");let m=Q();if(l(m))return s("Unable to resolve user ID");let u=m.data;if(et({id:Kr(),userId:u,action:"move.node",payload:{id:t.data.id,parent:d.id,pos:{at:"end"}}}),!Ze)return s("Could not materialize move state");let f=Je(Ze,!0);return l(f)?f:c("Node moved successfully",f.data)}function Sn(e){let t=jr();if(l(t))return t;let{currentNode:n,selectedIndex:r}=C(),i=U(n.id)[r+e];if(!i)return s("Missing sibling node");let a=Q();if(l(a))return s("Unable to resolve user ID");let d=a.data;if(et({id:Kr(),userId:d,action:"move.node",payload:{id:t.data.id,parent:n.id,pos:{at:e===1?"after":"before",sibling:i.id}}}),!Ze)return s("Could not materialize move state");let m=Je(Ze,!0);return l(m)?m:c("Node moved successfully",m.data)}import xs from"node:os";import zr from"node:path";var ys={userId:"",userName:"",preferredEditor:""},vs=".epiq",Cs="config.json",qr=()=>zr.join(xs.homedir(),vs),An=()=>zr.join(qr(),Cs),wn=()=>{try{return te.mkDir(qr()),c("Ensured ~/.epiq exists",null)}catch{return s("Unable to create ~/.epiq")}},hs=e=>{try{let t=JSON.parse(e);return c("Parsed config",t??{})}catch{return s("Invalid ~/.epiq/config.json JSON")}},Gr=()=>{let e=wn();if(l(e))return s(e.message);let t=An(),n=te.readFile(t);return n==null||n.trim()===""?c("No config found, using empty config",{}):hs(n)},Xr=e=>{let t=wn();if(l(t))return s(t.message);let n=An();try{return te.writeToFile(n,JSON.stringify(e,null,2)+`
5
+ `),c("Config written",null)}catch{return s("Unable to write ~/.epiq/config.json")}},Tn=e=>{let t=Gr();if(l(t))return s("Failed to read existing config");let n={...t.data,...e};return Xr(n)},Yr=()=>{let e=An(),t=wn();if(l(t))throw new Error("Unable to create ~/.epiq");if(!(te.readFile(e)!==null)){let d=Xr(ys);if(l(d))throw new Error("Unable to create ~/.epiq/config.json")}let r=Gr();if(l(r))throw new Error("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"):lt({preferredEditor:o,userName:i,userId:a})};var tt=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?c("Found node",n):s("Unable to find node in breadcrumb")};import{spawn as io}from"node:child_process";import{createHash as Ns}from"node:crypto";import D from"node:fs";import Es from"node:os";import B from"node:path";var so=ue(),ao="events",G="epiq-state-2",We="origin",Is=()=>B.join(so,ao),co=e=>B.join(Is(),e),H=({args:e,cwd:t})=>new Promise(n=>{if(!D.existsSync(t))return n(s(`Git cwd does not exist: ${t}`));let r=io("git",e,{cwd:t,stdio:["ignore","pipe","pipe"]}),o="",i="";r.stdout.setEncoding("utf8"),r.stderr.setEncoding("utf8"),r.stdout.on("data",a=>{o+=a}),r.stderr.on("data",a=>{i+=a}),r.on("error",a=>{n(s([`git ${e.join(" ")}`,`cwd=${t}`,a.message].join(`
6
6
  `)))}),r.on("close",a=>{let d=a??1;if(d!==0){n(s([`git ${e.join(" ")}`,i.trim()||o.trim()||"Git command failed"].filter(Boolean).join(`
7
- `)));return}n(c("Git command succeeded",{stdout:o,stderr:i,exitCode:d}))})}),He=({args:e,cwd:t})=>new Promise(n=>{if(!D.existsSync(t))return n({stdout:"",stderr:`Git cwd does not exist: ${t}`,exitCode:1});let r=ro("git",e,{cwd:t,stdio:["ignore","pipe","pipe"]}),o="",i="";r.stdout.setEncoding("utf8"),r.stderr.setEncoding("utf8"),r.stdout.on("data",a=>{o+=a}),r.stderr.on("data",a=>{i+=a}),r.on("error",a=>{n({stdout:o,stderr:a.message,exitCode:1})}),r.on("close",a=>{n({stdout:o,stderr:i,exitCode:a??1})})}),Cs=async e=>{if((await He({args:["rev-parse","--verify","HEAD"],cwd:e})).exitCode===0)return c("Repo already initialized",!1);let n=await W({args:["commit","--allow-empty","-m","[epiq:init]"],cwd:e});return l(n)?s(`Failed to create initial commit
8
- ${n.message}`):c("Created initial commit",!0)},Mn=e=>(D.mkdirSync(e,{recursive:!0}),c("Ensured directory",void 0)),hs=e=>{D.existsSync(e)&&D.rmSync(e,{recursive:!0,force:!0})},Ns=async(e=process.cwd())=>{let t=await W({args:["rev-parse","--show-toplevel"],cwd:e});return l(t)?s("Not inside a Git repository"):c("Resolved repo root",t.data.stdout.trim())},Es=async e=>{let t=await W({args:["rev-parse","--git-dir"],cwd:e});if(l(t))return s(t.message);let n=t.data.stdout.trim(),r=$.isAbsolute(n)?n:$.join(e,n);return c("Resolved git dir",r)},Qr=async e=>{let t=await Es(e);if(l(t))return s(t.message);let n=t.data,o=["MERGE_HEAD","CHERRY_PICK_HEAD","REVERT_HEAD","REBASE_HEAD",$.join("rebase-merge"),$.join("rebase-apply")].filter(i=>D.existsSync($.join(n,i)));return c("Checked for in-progress Git operation",o.length>0)},Is=async e=>{let t=await He({args:["diff","--cached","--quiet"],cwd:e});return t.exitCode===0?c("No staged changes",!1):t.exitCode===1?c("Has staged changes",!0):s(t.stderr.trim()||"Unable to inspect staged changes")},bs=e=>xs("sha1").update(e).digest("hex").slice(0,12),oo=()=>$.join(ys.homedir(),".epiq"),io=()=>$.join(oo(),"worktrees"),Ss=e=>{let t=bs(e);return $.join(io(),t)},so=e=>$.join(e,Ln),mt=e=>$.join(so(e),vs),Ot=({root:e,fileName:t})=>$.join(mt(e),t),Zr=e=>{let t=so(e);return D.existsSync(t)?c("Epiq dir already exists",!1):(D.mkdirSync(t,{recursive:!0}),c("Created epiq dir",!0))},eo=e=>{let t=mt(e);return D.existsSync(t)?c("Events dir already exists",!1):(D.mkdirSync(t,{recursive:!0}),c("Created events dir",!0))},As=()=>{let e=Mn(oo());if(l(e))return s(e.message);let t=Mn(io());return l(t)?s(t.message):c("Ensured epiq storage",void 0)},ao=async({repoRoot:e,remote:t})=>{let n=await He({args:["remote","get-url",t],cwd:e});return c("Checked remote",n.exitCode===0)},co=async({repoRoot:e,remote:t,branch:n})=>{let r=await He({args:["ls-remote","--heads",t,n],cwd:e});return r.exitCode!==0?s(r.stderr.trim()||`Unable to inspect remote branch ${t}/${n}`):c("Checked remote branch",r.stdout.trim().length>0)},ws=async({repoRoot:e,branch:t})=>{let n=await He({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?c("Local branch exists",!0):n.exitCode===1?c("Local branch missing",!1):s(n.stderr.trim()||`Unable to inspect branch ${t}`)},Ts=async({repoRoot:e})=>{let t=await ws({repoRoot:e,branch:G});if(l(t))return s(t.message);if(t.data)return c("Local board branch already exists",!1);let n=await ao({repoRoot:e,remote:We});if(l(n))return s(n.message);if(n.data){let o=await co({repoRoot:e,remote:We,branch:G});if(l(o))return s(o.message);if(o.data){let i=await W({args:["branch","--track",G,`${We}/${G}`],cwd:e});return l(i)?s(`Failed to create local ${G} from remote
9
- ${i.message}`):c("Created local board branch from remote",!0)}}let r=await W({args:["branch",G,"HEAD"],cwd:e});return l(r)?s(`Failed to create local ${G}
10
- ${r.message}`):c("Created local board branch",!0)},to=async({repoRoot:e,worktreeRoot:t})=>{let n=await W({args:["worktree","list","--porcelain"],cwd:e});if(l(n))return s(n.message);let r=$.resolve(t),o=n.data.stdout.split(`
11
- `).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(i=>$.resolve(i)).includes(r);return c("Checked worktree registration",o)},Ms=async({repoRoot:e,worktreeRoot:t})=>{let n=Mn($.dirname(t));if(l(n))return s(n.message);D.existsSync(t)&&!D.existsSync($.join(t,".git"))&&hs(t);let r=await W({args:["worktree","add",t,G],cwd:e});return l(r)?s(`Failed to create board worktree
12
- ${r.message}`):c("Created board worktree",!0)},Ls=async({repoRoot:e,worktreeRoot:t})=>{let n=await to({repoRoot:e,worktreeRoot:t});if(l(n))return s(n.message);let r=D.existsSync(t);if(n.data&&r)return c("Board worktree already exists",!1);if(n.data&&!r){let o=await W({args:["worktree","prune"],cwd:e});if(l(o))return s(`Failed to prune stale worktrees
13
- ${o.message}`);let i=await to({repoRoot:e,worktreeRoot:t});if(l(i))return s(i.message);if(i.data){let a=await W({args:["worktree","remove","--force",t],cwd:e});if(l(a))return s(`Failed to remove stale worktree registration
14
- ${a.message}`)}}return Ms({repoRoot:e,worktreeRoot:t})},Rs=async e=>{let t=await W({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});if(l(t))return s(t.message);if(t.data.stdout.trim()===G)return c("Board branch already checked out",!1);let r=await W({args:["checkout",G],cwd:e});return l(r)?s(`Failed to checkout ${G}
15
- ${r.message}`):c("Checked out board branch",!0)},Rn=async e=>{let t=await He({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return c("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},Ps=async e=>{let t=await Rn(e);if(l(t))return s(t.message);if(t.data)return c("Board upstream already configured",!1);let n=await ao({repoRoot:e,remote:We});if(l(n))return s(n.message);if(!n.data)return c("No remote available for upstream",!1);let r=await co({repoRoot:e,remote:We,branch:G});if(l(r))return s(r.message);if(r.data){let i=await W({args:["branch","--set-upstream-to",`${We}/${G}`,G],cwd:e});return l(i)?s(`Failed to set board upstream
16
- ${i.message}`):c("Configured board upstream",!0)}let o=await W({args:["push","-u",We,G],cwd:e});return l(o)?s(`Failed to publish board branch
17
- ${o.message}`):c("Published board branch and configured upstream",!0)},Ds=async e=>{let t=await Rn(e);if(l(t))return s(t.message);if(!t.data)return c("No upstream configured, skipped pull",!1);let n=await W({args:["pull","--rebase"],cwd:e});return l(n)?s(`Failed during board pull --rebase
18
- ${n.message}`):c("Pulled board with rebase",!0)},Fs=e=>{let t=mt(e);if(!D.existsSync(t))return c("Events dir missing",[]);let n=D.readdirSync(t,{withFileTypes:!0}).filter(r=>r.isFile()).map(r=>r.name).filter(r=>r.endsWith(".jsonl")).sort();return c("Listed event files",n)},Bs=e=>e.endsWith(".jsonl")?e.includes("/")||e.includes("\\")?s("Own event file must be a file name, not a path"):e==="."||e===".."||e.trim()===""?s("Own event file name is invalid"):c("Validated own event file name",e):s("Own event file must end with .jsonl"),ks=({repoRoot:e,worktreeRoot:t,ownEventFileName:n})=>{let r=Ot({root:e,fileName:n}),o=Ot({root:t,fileName:n});if(!D.existsSync(r))return c("Local own event file missing, nothing to copy",!1);let i=D.readFileSync(r,"utf8"),a=D.existsSync(o)?D.readFileSync(o,"utf8"):"";return i===a?c("Own event file already matches board worktree",!1):(D.mkdirSync($.dirname(o),{recursive:!0}),D.copyFileSync(r,o),c("Copied own event file into board worktree",!0))},Os=({repoRoot:e,worktreeRoot:t})=>{let n=Fs(t);if(l(n))return s(n.message);let r=mt(t),o=mt(e),i=!1;for(let a of n.data){let d=$.join(r,a),m=$.join(o,a),u=D.existsSync(d)?D.readFileSync(d,"utf8"):"",f=D.existsSync(m)?D.readFileSync(m,"utf8"):"";u!==f&&(D.mkdirSync($.dirname(m),{recursive:!0}),D.copyFileSync(d,m),i=!0)}return c("Hydrated event files from board worktree",i)},Us=async({worktreeRoot:e,ownEventFileName:t})=>{let n=await W({args:["add",Ot({root:Ln,fileName:t})],cwd:e});return l(n)?s(`Failed to stage board own event file
19
- ${n.message}`):c("Staged board own event file",void 0)},Ws=async({worktreeRoot:e,ownEventFileName:t})=>{let n=await He({args:["diff","--cached","--quiet","--",Ot({root:Ln,fileName:t})],cwd:e});return n.exitCode===0?c("No staged board own event file change",!1):n.exitCode===1?c("Has staged board own event file change",!0):s(n.stderr.trim()||"Unable to inspect staged board own event file change")},no=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",Hs=async e=>{let t=await W({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return l(t)?s(t.message):c("Resolved current branch",t.data.stdout.trim())},_s=async e=>{let t=await W({args:["rev-parse","--short","HEAD"],cwd:e});return l(t)?s(t.message):c("Resolved short HEAD sha",t.data.stdout.trim())},$s=async e=>{let t=await Hs(e);if(l(t))return s(t.message);let n=await _s(e);if(l(n))return s(n.message);let r=no(t.data),o=no(n.data);return c("Built sync commit message",`[epiq:sync:${r}:${o}]`)},Vs=async({repoRoot:e,worktreeRoot:t,ownEventFileName:n})=>{let r=await Ws({worktreeRoot:t,ownEventFileName:n});if(l(r))return s(r.message);if(!r.data)return c("No board own event file commit needed",null);let o=await $s(e);if(l(o))return s(o.message);let i=await W({args:["commit","-m",o.data],cwd:t});if(l(i))return s(`Failed to commit board own event file
20
- ${i.message}`);let a=await W({args:["rev-parse","HEAD"],cwd:t});return l(a)?s(a.message):c("Created board sync commit",a.data.stdout.trim())},Ks=async e=>{let t=await Rn(e);if(l(t))return s(t.message);if(!t.data)return c("No upstream configured, skipped push",!1);let n=await W({args:["push"],cwd:e});return l(n)?s(`Failed during board push
21
- ${n.message}`):c("Pushed board",!0)},js=async({repoRoot:e,worktreeRoot:t})=>{let n=!1,r=As();if(l(r))return s(r.message);let o=await Ts({repoRoot:e});if(l(o))return s(o.message);n=n||o.data;let i=await Ls({repoRoot:e,worktreeRoot:t});if(l(i))return s(i.message);n=n||i.data;let a=await Rs(t);if(l(a))return s(a.message);n=n||a.data;let d=await Ps(t);return l(d)?s(d.message):(n=n||d.data,c("Bootstrapped board storage",n))},lo=async({cwd:e=process.cwd(),ownEventFileName:t})=>{let n=Bs(t);if(l(n))return s(n.message);let r=await Ns(e);if(l(r))return s(r.message);let o=r.data,i=Ss(o),a=await Qr(o);if(l(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 d=await Is(o);if(l(d))return s(d.message);if(d.data)return s("Cannot run :sync while staged changes exist. Please commit or unstage them first.");let m=await Cs(o);if(l(m))return s(m.message);let u=await js({repoRoot:o,worktreeRoot:i});if(l(u))return s(u.message);let f=await Qr(i);if(l(f))return s(f.message);if(f.data)return s("Cannot run :sync while a merge, rebase, cherry-pick, or revert is in progress in the board worktree");let y=Zr(o);if(l(y))return s(y.message);let N=Zr(i);if(l(N))return s(N.message);let S=eo(o);if(l(S))return s(S.message);let b=eo(i);if(l(b))return s(b.message);let I=!1,E,w=!1,k=!1,ie=!1,le=u.data,Ct=ks({repoRoot:o,worktreeRoot:i,ownEventFileName:n.data});if(l(Ct))return s(Ct.message);let st=await Us({worktreeRoot:i,ownEventFileName:n.data});if(l(st))return s(st.message);let Fe=await Vs({repoRoot:o,worktreeRoot:i,ownEventFileName:n.data});if(l(Fe))return s(Fe.message);Fe.data&&(I=!0,E=Fe.data);let V=await Ds(i);if(l(V))return s(V.message);w=V.data;let K=await Ks(i);if(l(K))return s([K.message,I&&E?`Local board sync commit exists: ${E}`:""].filter(Boolean).join(`
22
- `));k=K.data;let Be=Os({repoRoot:o,worktreeRoot:i});return l(Be)?s(Be.message):(ie=Be.data,c("Synced board event logs via git",{repoRoot:o,worktreeRoot:i,createdCommit:I,commitSha:E,pulled:w,pushed:k,hydrated:ie,bootstrapped:le}))};var zs=e=>Object.values(C().tags).find(t=>t.name===e),qs=e=>Object.values(C().contributors).find(t=>t.name===e),mo=[{systemOnly:!0,intent:M.Move,mode:p.COMMAND_LINE,action:()=>{let e=Q();if(l(e))return s("Unable to resolve user ID");let t=e.data,{modifier:n}=me().commandMeta,{currentNode:r,selectedIndex:o}=C(),i=T(r.id)[o];if(!i)return A({mode:p.DEFAULT}),s("No move target");if(n==="start"){if(i.readonly)return s("Target node is read-only");if(o===-1)return s("No item selected");if(!i.parentNodeId)return s("Target has no parent");let a=T(i.parentNodeId),d=a.findIndex(({id:y})=>y===i.id);if(d===-1)return s("Target not found among siblings");let m=a[d-1],u=a[d+1],f=u!=null?{at:"before",sibling:u.id}:m!=null?{at:"after",sibling:m.id}:{at:"start"};return Ze({id:H(),userId:t,action:"move.node",payload:{id:i.id,parent:i.parentNodeId,pos:f}}),A({mode:p.MOVE}),c("Move initialized",null)}if(n==="next")return A({mode:p.MOVE}),Sn(1);if(n==="previous")return A({mode:p.MOVE}),Sn(-1);if(n==="to-next")return A({mode:p.MOVE}),bn(1);if(n==="to-previous")return A({mode:p.MOVE}),bn(-1);if(n==="confirm"){A({mode:p.DEFAULT});let a=Ue();if(!a)return s("No pending move to confirm");let d=Z(a);return l(d)?d:(Ze(null),c("Moved item",null))}return n==="cancel"?(Ze(null),A({mode:p.DEFAULT}),c("Cancelling move",null)):s("Invalid move modifier")}},{intent:M.Delete,mode:p.COMMAND_LINE,action:()=>{let e=Q();if(l(e))return s("Unable to resolve user ID");let t=e.data,{currentNode:n,selectedIndex:r}=C(),o=T(n.id)[r];return o?Z({id:H(),userId:t,action:"delete.node",payload:{id:o.id}}):s("Unable to resolve child to delete")},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.Edit,mode:p.COMMAND_LINE,action:()=>{let e=Q();if(l(e))return s("Unable to resolve user ID");let t=e.data,n=et(C().breadCrumb,"TICKET");if(l(n))return s("Edit target must be an issue");let r=n.data;if(r.readonly)return s("Cannot edit readonly field");let{currentNode:o,selectedIndex:i}=C();if(!T(r.id)[i])return s("No selected field");let d=T(o.id)[i];if(!d)return s("No selected field");if(d.readonly)return s("Cannot edit readonly field");let m=d.props.value;if(typeof m!="string")return s("Selected field is not editable text");let u=Dr(m);if(l(u))return s("Failed to edit field");let f=u.data;return f===m?c("No changes made",null):d.title==="Description"?Z({id:H(),userId:t,action:"edit.description",payload:{id:d.id,md:f}}):d.title==="Title"?Z({id:H(),userId:t,action:"edit.title",payload:{id:d.id,name:f}}):s(`Editing not supported for "${d.title}"`)},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.Filter,mode:p.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=me().commandMeta,n=/(!=|=)/,[r,o]=e.split(n);if(!r||!(d=>j(g.FILTER).map(m=>m.split(n)[0]).includes(d))(r))return s("Invalid filter modifier");let a={target:r,operator:"=",value:t.trim()};return re(d=>({...d,filters:e==="clear"?[]:[...d.filters,a],mode:p.DEFAULT})),c("Viewing help",null)}},{intent:M.ViewHelp,mode:p.COMMAND_LINE,action:()=>(A({mode:p.HELP}),c("Viewing help",null))},{intent:M.CloseIssue,mode:p.COMMAND_LINE,action:()=>{let e=Q();if(l(e))return s("Unable to resolve user ID");let t=e.data,{currentNode:n,selectedIndex:r}=C(),o=T(n.id)[r];if(!o)return s("Unable to close issue, no target found");if(!o.parentNodeId)return s("No target parent found");if(!ke(o))return s("Cannot close in this context");let i=Z({id:H(),userId:t,action:"close.issue",payload:{id:o.id,parent:o.parentNodeId}});return l(i)?i:c("Viewing help",null)}},{intent:M.ReopenIssue,mode:p.COMMAND_LINE,action:()=>{let e=Q();if(l(e))return s("Unable to resolve user ID");let t=e.data,{currentNode:n,selectedIndex:r}=C(),o=T(n.id)[r];if(!o)return s("Unable to reopen issue, no target found");let i=o.context==="TICKET"?c("Resolved ticket",o):je(o.id,"TICKET");if(l(i))return s("Cannot reopen in this context");let a=i.data,d=Z({id:H(),userId:t,action:"reopen.issue",payload:{id:a.id}});return l(d)?d:c("Issue reopened",null)},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.SetUserName,mode:p.COMMAND_LINE,action:()=>{let{userId:e,preferredEditor:t,userName:n}=ae(),r=Mt()?.trim();if(!r)return s("No username provided");let o=r??n,i=e??H();if(!o||!i)return s("Unable to resolve user name or id");let a=Tn({userName:o,userId:i,preferredEditor:t??""});return l(a)?a:(dt({userName:o,userId:i}),A({mode:p.DEFAULT}),c(`Username set to "${r}"`,null))}},{intent:M.Init,mode:p.COMMAND_LINE,action:()=>{let e=uo();if(l(e))return e;let{rootNodeId:t,nodes:n}=C();return F.navigate({currentNode:n[t],selectedIndex:0}),c("Project initialized",null)}},{intent:M.SetEditor,mode:p.COMMAND_LINE,action:()=>{let e=Mt()?.trim();if(!e)return s("No editor provided");let t=Tn({preferredEditor:e});return l(t)?t:(dt({preferredEditor:e}),A({mode:p.DEFAULT}),c(`Editor configuration set to "${e}"`,null))}},{intent:M.NewItem,mode:p.COMMAND_LINE,action:(e,t)=>{let n=Q();if(l(n))return s("Unable to resolve user ID");let r=n.data;if(!t.inputString)return s(`provide a name for your ${t.modifier}`);let{breadCrumb:o,currentNode:i,selectedIndex:a}=C(),d=m=>{let u=Z(m);if(l(u))return u;let f=h.getNode(u.data.result.id);if(!f)return s("Created node not found");if(!f.parentNodeId)return u;let y=h.getNode(f.parentNodeId);return y?(F.navigate({currentNode:y,selectedIndex:h.getSiblings(f.parentNodeId).findIndex(({id:N})=>N===f.id)}),u):s("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:m}=C(),u=h.getNode(m);return u?d({id:H(),userId:r,action:"add.board",payload:{id:H(),name:t.inputString,parent:u.id}}):s("Workspace not found")}if(t.modifier==="swimlane"){let m=et(o,"BOARD");return l(m)?s("Unable to add swimlane in this context"):d({id:H(),userId:r,action:"add.swimlane",payload:{id:H(),name:t.inputString,parent:m.data.id}})}if(t.modifier==="issue"){let m=T(i.id)[a],u=i.context==="SWIMLANE"?i:i.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let b=et(o,"SWIMLANE");return l(b)?null:b.data})();if(!u)return s("Unable to add issue in this context");let f=Fr({userId:r,name:t.inputString,parent:u.id}),y=kt(f);if(y.some(b=>l(b)))return s("Issue create failed: "+y.filter(l).map(b=>b.message).filter(Boolean).join(", "));let N=y[0];if(!N||l(N))return s("Issue creation failed");let S=f[0]?.payload.id;return S?(F.navigate({currentNode:u,selectedIndex:h.getSiblings(u.id).findIndex(({id:b})=>b===S)}),c("Issue created",null)):s("Unable to determine ticket id")}return Zn()},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.SetView,mode:p.COMMAND_LINE,action:()=>{let{commandMeta:e}=me();return e.validity===xe.Invalid?s("Invalid command "+ye):(re(t=>({...t,viewMode:e.modifier==="wide"?"wide":e.modifier==="dense"?"dense":t.viewMode})),c("View set",null))},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.Rename,mode:p.COMMAND_LINE,action:()=>{let e=Q();if(l(e))return s("Unable to resolve user ID");let t=e.data,{currentNode:n,selectedIndex:r}=C(),o=T(n.id)[r];if(!o)return s("Missing node");if(o.readonly)return s("Cannot rename readonly node");let i=Mt();return i?Z({id:H(),userId:t,action:"edit.title",payload:{id:o.id,name:i}}):s("Provide a new name")},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.TagTicket,mode:p.COMMAND_LINE,action:()=>{let e=Q();if(l(e))return s("Unable to resolve user ID");let t=e.data,{modifier:n,inputString:r}=me().commandMeta,o=(n||r).trim();if(!o)return s("Provide a tag");let{selectedIndex:i,currentNode:a}=C(),d=T(a.id)[i];if(!d)return s("Invalid tag target");let m=je(d.id,"TICKET");if(l(m))return s("Unable to tag issue in this context");let u=m.data,f=zs(o),y;if(f)y=f.id;else{let b=H(),I=Z({id:H(),userId:t,action:"create.tag",payload:{id:b,name:o}});if(l(I))return I;y=I.data.result.id}let N=h.getFieldByTitle(u.id,"Tags");return N?T(N.id).some(b=>b.props?.value===y)?s("Already tagged with that tag"):Z({id:H(),userId:t,action:"tag.issue",payload:{id:H(),target:u.id,tagId:y}}):s("Unable to locate tags field")},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.AssignUserToTicket,mode:p.COMMAND_LINE,action:()=>{let e=Q();if(l(e))return s("Unable to resolve user ID");let t=e.data,{modifier:n,inputString:r}=me().commandMeta,o=(n||r).trim();if(!o)return s("Provide an assignee");let{selectedIndex:i,currentNode:a}=C(),d=T(a.id)[i];if(!d)return s("Invalid assign target");let m=je(d.id,"TICKET");if(l(m))return s("Unable to assign issue in this context");let u=m.data,f=qs(o),y;if(f)y=f.id;else{let b=H(),I=Z({id:H(),userId:t,action:"create.contributor",payload:{id:b,name:o}});if(l(I))return I;y=I.data.result.id}let N=h.getFieldByTitle(u.id,"Assignees");return N?T(N.id).some(b=>b.props?.value===y)?s("Assignee already assigned"):Z({id:H(),userId:t,action:"assign.issue",payload:{id:H(),target:u.id,contributor:y}}):s("Unable to locate assignees field")},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.Sync,mode:p.COMMAND_LINE,action:async()=>{U(()=>""),A({syncStatus:{msg:"Syncing",status:"syncing"}});let{userId:e,userName:t}=ae();if(!e)return s("Unable to resolve userId");if(!t)return s("Unable to resolve userName");let n=In();if(l(n))return s("Unable to resolve log file name");let r=await lo({ownEventFileName:n.data});return l(r)?(A({syncStatus:{msg:r.message,status:"outOfSync"}}),s(`Unable to sync state. ${r.message}`)):(A({syncStatus:{msg:"Synced",status:"synced"},mode:p.DEFAULT}),c("Synced",!0))}}];var ne=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=me();if(!t)return s("No command to confirm");if(!e&&n===xe.Invalid)return s("Invalid command");let i=Tr(t);Er();let a=mo.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===i);if(!a)return Tt({result:ye.Fail,message:"Command not found",data:null});let d=await a.action(a,{command:t,inputString:o,modifier:r});return l(d)?Tt(d):(Ir({addToHistory:!e}),a.onSuccess?.(),Tt(d))};var Ut=[{intent:"exit",mode:p.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(A({mode:p.COMMAND_LINE}),U(()=>"move cancel"),ne({isForceExecutedBySystem:!0}))},{intent:"initMove",mode:p.DEFAULT,description:"[m] move init/confirm",action:()=>(A({mode:p.COMMAND_LINE}),U(()=>"move start"),ne({isForceExecutedBySystem:!0}))},{intent:"confirmMove",mode:p.MOVE,action:()=>(A({mode:p.COMMAND_LINE}),U(()=>"move confirm"),ne({isForceExecutedBySystem:!0}))}],Wt=[{intent:"movePreviousItem",mode:p.MOVE,action:()=>Ue()?(A({mode:p.COMMAND_LINE}),U(()=>"move previous"),ne({isForceExecutedBySystem:!0})):s("No pending move")},{intent:"moveNextItem",mode:p.MOVE,action:()=>Ue()?(A({mode:p.COMMAND_LINE}),U(()=>"move next"),ne({isForceExecutedBySystem:!0})):s("No pending move")}],po=[{intent:"moveToNextContainer",mode:p.MOVE,action:()=>Ue()?(A({mode:p.COMMAND_LINE}),U(()=>"move to-next"),ne({isForceExecutedBySystem:!0})):s("No pending move")},{intent:"moveToPreviousContainer",mode:p.MOVE,action:()=>Ue()?(A({mode:p.COMMAND_LINE}),U(()=>"move to-previous"),ne({isForceExecutedBySystem:!0})):s("No pending move")}];var go={[L.WORKSPACE]:[...Ut,...Wt],[L.BOARD]:[...Ut,...Wt],[L.SWIMLANE]:[...Ut,...Wt,...po],[L.TICKET]:[],[L.FIELD]:[],[L.FIELD_LIST]:[],[L.TEXT]:[]};var fo=[{intent:"addItem",mode:p.DEFAULT,description:"[n] new...",action:()=>(A({mode:p.COMMAND_LINE}),U(()=>`${g.NEW} `),c("Adding new item",null))},{intent:"Delete",mode:p.DEFAULT,description:"[d] delete",action:()=>(A({mode:p.COMMAND_LINE}),U(()=>`${g.DELETE} `),c("Deleting item",null))},{intent:"initCommandLine",mode:p.DEFAULT,description:"[:] focus command line",action:()=>(A({mode:p.COMMAND_LINE}),U(()=>""),c("Entering command line mode",null))},{intent:"confirm",mode:p.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>(F.enterChildNode(),c("Entering context",null))},{intent:"exit",mode:p.DEFAULT,description:"[q] exit context",action:()=>(logger.debug("Executing exit action"),F.enterParentNode(),c("Exiting context",null))},{intent:"navPreviousItem",mode:p.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(F.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:"navNextItem",mode:p.DEFAULT,action:()=>(F.navigateToNextItem(),c("Navigating to next item",null))},{intent:"navToPreviousContainer",mode:p.DEFAULT,action:()=>(F.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:"navToNextContainer",mode:p.DEFAULT,action:()=>(F.navigateToNextContainer(),c("Navigating to next container",null))},{intent:"edit",mode:p.DEFAULT,action:()=>(A({mode:p.COMMAND_LINE}),U(()=>"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}),U(()=>"sync"),ne({isForceExecutedBySystem:!0}),c("Synced",!0))}];var xo=[{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:()=>(yn(-1),c("Moving cursor left",null))},{intent:"MoveCursorRight",mode:p.COMMAND_LINE,action:()=>(yn(1),c("Moving cursor right",null))},{intent:"MoveCursorLeftOfWord",mode:p.COMMAND_LINE,action:()=>(vn("left"),c("Moving cursor left of word",null))},{intent:"MoveCursorRightOfWord",mode:p.COMMAND_LINE,action:()=>(vn("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:()=>(U((e,{remainder:t})=>t?e+t:e),c("Auto-completing command",null))},{intent:"captureInput",mode:p.COMMAND_LINE,action:(e,{sequence:t})=>(U(n=>n+t),c("Capturing input",null))},{intent:"eraseInput",mode:p.COMMAND_LINE,action:()=>(hr(),c("Erasing input",null))},{intent:"EraseInputWord",mode:p.COMMAND_LINE,action:()=>(Nr(),c("Erasing input word",null))},{intent:"getLastCommandFromHistory",mode:p.COMMAND_LINE,action:()=>(br(),c("Getting last command from history",null))},{intent:"getNextCommandFromHistory",mode:p.COMMAND_LINE,action:()=>(Sr(),c("Getting next command from history",null))}];import Gs from"chalk";var Ht=": for command line",yo="q to exit",vo=`${Gs.hex(v.accent)("m")} to confirm`,Pn={[L.WORKSPACE]:[Ht],[L.BOARD]:[Ht],[L.BOARD+p.COMMAND_LINE]:[Ht],[L.SWIMLANE]:[Ht],[L.TICKET+p.HELP]:[yo],[L.SWIMLANE+p.HELP]:[yo],[L.TICKET]:[],[L.FIELD]:[],[L.SWIMLANE+p.MOVE]:[vo],[L.TICKET+p.MOVE]:[vo]};var _t=e=>e.trim().toLocaleLowerCase(),Xs=(e,t)=>{let n=h.getFieldByTitle(e,t);if(!n)return"";let r=n.props?.value;return typeof r=="string"?r:""},Ys=e=>{let{tags:t}=C(),n=h.getFieldByTitle(e,"Tags");return n?O(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},Js=e=>{let{contributors:t}=C(),n=h.getFieldByTitle(e,"Assignees");return n?O(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},Co=(e,t)=>{let n=t.value;if(!n)return!0;switch(t.target){case"title":return _t(e.title??"").includes(n);case"description":return _t(Xs(e.id,"Description")).includes(n);case"tag":return Ys(e.id).map(_t).some(d=>d.includes(n));case"assignee":return Js(e.id).map(_t).some(d=>d.includes(n));default:return!0}};function ho(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(),c("Breadcrumb built",o))}var No=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 $t,Dn=new Set,Eo=()=>{for(let e of Dn)e()},Zs=e=>(Dn.add(e),()=>Dn.delete(e));function Io(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 d=o[t];if(!d)return logger.error("Unable to derive state, currentNode not found"),s("Unable to derive state, currentNode not found");let m=ho(t,o,r);if(l(m))return logger.error(m.message),m;let u=m.data,{context:f}=d,y=Pn[f+n]??Pn[f]??[],N=[...fo,...go[f]??[],...xo],S=No(N);return c("Derived successfully",{...e,currentNode:d,breadCrumb:u,availableHints:y,availableActions:N,actionIndex:S,renderedChildrenIndex:ea(o,i)})}var C=()=>($t||logger.error("State not initialized. Call initWorkspaceState() first.",new Error().stack),$t);function kr(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:""}},n=Io(t);return l(n)?n:($t=n.data,Eo(),c("State initialized",null))}function re(e){let t=C(),n=e(t),r=Io(n);return l(r)?s(r.message??"Unable to update state"):($t=r.data,Eo(),c("State updated",null))}var A=e=>re(t=>({...t,...e}));var _=()=>Qs(Zs,C,C),ea=(e,t)=>{let n={};for(let r of Object.values(e))ke(r)&&t.length>0&&!t.every(o=>Co(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],d=e[i.id];return!a||!d?0:a.rank.localeCompare(d.rank)});return n},T=e=>C().renderedChildrenIndex[e]??[];var F={exit(){process.exit(0)},enterChildNode(){let e=C(),t=e.currentNode,n=Math.max(0,e.selectedIndex),r=T(t.id)[n];!r||t.context==="FIELD"||F.navigate({currentNode:r,selectedIndex:T(r.id).length?0:-1})},enterParentNode(){let{currentNode:e,nodes:t}=C();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=T(n.id),o=r.findIndex(({id:a})=>a===e.id),i=r.length===0?-1:o>=0?o:0;F.navigate({currentNode:n,selectedIndex:i})},navigateToNextItem:()=>bo(1),navigateToPreviousItem:()=>bo(-1),navigateToNextContainer:()=>So(1),navigateToPreviousContainer:()=>So(-1),navigate:({currentNode:e=C().currentNode,selectedIndex:t})=>{A({currentNodeId:e.id,selectedIndex:t})}},bo=e=>{let t=C(),n=T(t.currentNode.id).length;if(n===0)return;let o=(Math.max(0,t.selectedIndex)+e+n)%n;F.navigate({selectedIndex:o})},So=e=>{let{currentNode:t,nodes:n,selectedIndex:r}=C();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=T(o.id),a=i.findIndex(N=>N.id===t.id);if(a<0)return;let d=i.at(a+e)??i.at(0);if(!d)return;let m=T(d.id),u=Math.max(0,m.length-1),f=Math.min(Math.max(0,r),u),y=m.length?f:-1;F.navigate({currentNode:d,selectedIndex:y})};var Ne="system.actor",ut=ta(),Te=null;function na(){let e=Object.values(C().nodes).find(r=>r.context==="WORKSPACE");if(!e)throw new Error("No workspace found in event log");let[t]=T(e.id),[n]=t?T(t.id):[];if(logger.debug("Boot navigation target:",{workspace:e?.id,firstBoard:t?.id,firstSwimlane:n?.id}),n){let r=C().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:C().nodes[C().rootNodeId],selectedIndex:0}}function ra(){let e=na();F.navigate(e)}function oa(){let e=ut(),t=ut(),n=ut(),r=ut(),o=ut();return[{id:he(),userId:Ne,action:"init.workspace",payload:{id:e,name:"Workspace"}},{id:he(),userId:Ne,action:"add.board",payload:{id:t,name:"Default",parent:e}},{id:he(),userId:Ne,action:"add.swimlane",payload:{id:n,name:"Todo",parent:t}},{id:he(),userId:Ne,action:"add.swimlane",payload:{id:r,name:"Review",parent:t}},{id:he(),userId:Ne,action:"add.swimlane",payload:{id:o,name:"Done",parent:t}},{id:he(),userId:Ne,action:"add.board",payload:{id:Dt,name:"Closed",parent:e}},{id:he(),userId:Ne,action:"add.swimlane",payload:{id:Xe,name:"Closed",parent:Dt}},{id:he(),userId:Ne,action:"lock.node",payload:{id:Dt}},{id:he(),userId:Ne,action:"lock.node",payload:{id:Xe}}]}function At(){return Te!==null}function uo(){if(!Te||Te.length===0)return c("No pending default events to persist",null);let t=kt(Te).filter(l);return t.length>0?s([tt.bold.red("Materializing failed"),"",...t.map((n,r)=>`${tt.dim.gray(`${r+1}.`)} ${tt.dim(n.message)}`),`
7
+ `)));return}n(c("Git command succeeded",{stdout:o,stderr:i,exitCode:d}))})}),He=({args:e,cwd:t})=>new Promise(n=>{if(!D.existsSync(t))return n({stdout:"",stderr:`Git cwd does not exist: ${t}`,exitCode:1});let r=io("git",e,{cwd:t,stdio:["ignore","pipe","pipe"]}),o="",i="";r.stdout.setEncoding("utf8"),r.stderr.setEncoding("utf8"),r.stdout.on("data",a=>{o+=a}),r.stderr.on("data",a=>{i+=a}),r.on("error",a=>{n({stdout:o,stderr:a.message,exitCode:1})}),r.on("close",a=>{n({stdout:o,stderr:i,exitCode:a??1})})}),bs=async e=>{if((await He({args:["rev-parse","--verify","HEAD"],cwd:e})).exitCode===0)return c("Repo already initialized",!1);let n=await H({args:["commit","--allow-empty","-m","[epiq:init]"],cwd:e});return l(n)?s(`Failed to create initial commit
8
+ ${n.message}`):c("Created initial commit",!0)},Mn=e=>(D.mkdirSync(e,{recursive:!0}),c("Ensured directory",void 0)),Ss=e=>{D.existsSync(e)&&D.rmSync(e,{recursive:!0,force:!0})},As=async(e=process.cwd())=>{let t=await H({args:["rev-parse","--show-toplevel"],cwd:e});return l(t)?s("Not inside a Git repository"):c("Resolved repo root",t.data.stdout.trim())},ws=async e=>{let t=await H({args:["rev-parse","--git-dir"],cwd:e});if(l(t))return s(t.message);let n=t.data.stdout.trim(),r=B.isAbsolute(n)?n:B.join(e,n);return c("Resolved git dir",r)},Jr=async e=>{let t=await ws(e);if(l(t))return s(t.message);let n=t.data,o=["MERGE_HEAD","CHERRY_PICK_HEAD","REVERT_HEAD","REBASE_HEAD",B.join("rebase-merge"),B.join("rebase-apply")].filter(i=>D.existsSync(B.join(n,i)));return c("Checked for in-progress Git operation",o.length>0)},Ts=async e=>{let t=await He({args:["diff","--cached","--quiet"],cwd:e});return t.exitCode===0?c("No staged changes",!1):t.exitCode===1?c("Has staged changes",!0):s(t.stderr.trim()||"Unable to inspect staged changes")},Ms=e=>Ns("sha1").update(e).digest("hex").slice(0,12),lo=()=>B.join(Es.homedir(),".epiq"),mo=()=>B.join(lo(),"worktrees"),Ls=e=>{let t=Ms(e);return B.join(mo(),t)},uo=e=>B.join(e,so),pt=e=>B.join(uo(e),ao),Qr=({root:e,fileName:t})=>B.join(pt(e),t),Zr=e=>{let t=uo(e);return D.existsSync(t)?c("Epiq dir already exists",!1):(D.mkdirSync(t,{recursive:!0}),c("Created epiq dir",!0))},eo=e=>{let t=pt(e);return D.existsSync(t)?c("Events dir already exists",!1):(D.mkdirSync(t,{recursive:!0}),c("Created events dir",!0))},Rs=()=>{let e=Mn(lo());if(l(e))return s(e.message);let t=Mn(mo());return l(t)?s(t.message):c("Ensured epiq storage",void 0)},po=async({repoRoot:e,remote:t})=>{let n=await He({args:["remote","get-url",t],cwd:e});return c("Checked remote",n.exitCode===0)},go=async({repoRoot:e,remote:t,branch:n})=>{let r=await He({args:["ls-remote","--heads",t,n],cwd:e});return r.exitCode!==0?s(r.stderr.trim()||`Unable to inspect remote branch ${t}/${n}`):c("Checked remote branch",r.stdout.trim().length>0)},Ps=async({repoRoot:e,branch:t})=>{let n=await He({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?c("Local branch exists",!0):n.exitCode===1?c("Local branch missing",!1):s(n.stderr.trim()||`Unable to inspect branch ${t}`)},Ds=async({repoRoot:e})=>{let t=await Ps({repoRoot:e,branch:G});if(l(t))return s(t.message);if(t.data)return c("Local board branch already exists",!1);let n=await po({repoRoot:e,remote:We});if(l(n))return s(n.message);if(n.data){let o=await go({repoRoot:e,remote:We,branch:G});if(l(o))return s(o.message);if(o.data){let i=await H({args:["branch","--track",G,`${We}/${G}`],cwd:e});return l(i)?s(`Failed to create local ${G} from remote
9
+ ${i.message}`):c("Created local board branch from remote",!0)}}let r=await H({args:["branch",G,"HEAD"],cwd:e});return l(r)?s(`Failed to create local ${G}
10
+ ${r.message}`):c("Created local board branch",!0)},to=async({repoRoot:e,worktreeRoot:t})=>{let n=await H({args:["worktree","list","--porcelain"],cwd:e});if(l(n))return s(n.message);let r=B.resolve(t),o=n.data.stdout.split(`
11
+ `).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(i=>B.resolve(i)).includes(r);return c("Checked worktree registration",o)},Fs=async({repoRoot:e,worktreeRoot:t})=>{let n=Mn(B.dirname(t));if(l(n))return s(n.message);D.existsSync(t)&&!D.existsSync(B.join(t,".git"))&&Ss(t);let r=await H({args:["worktree","add",t,G],cwd:e});return l(r)?s(`Failed to create board worktree
12
+ ${r.message}`):c("Created board worktree",!0)},Bs=async({repoRoot:e,worktreeRoot:t})=>{let n=await to({repoRoot:e,worktreeRoot:t});if(l(n))return s(n.message);let r=D.existsSync(t);if(n.data&&r)return c("Board worktree already exists",!1);if(n.data&&!r){let o=await H({args:["worktree","prune"],cwd:e});if(l(o))return s(`Failed to prune stale worktrees
13
+ ${o.message}`);let i=await to({repoRoot:e,worktreeRoot:t});if(l(i))return s(i.message);if(i.data){let a=await H({args:["worktree","remove","--force",t],cwd:e});if(l(a))return s(`Failed to remove stale worktree registration
14
+ ${a.message}`)}}return Fs({repoRoot:e,worktreeRoot:t})},ks=async e=>{let t=await H({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});if(l(t))return s(t.message);if(t.data.stdout.trim()===G)return c("Board branch already checked out",!1);let r=await H({args:["checkout",G],cwd:e});return l(r)?s(`Failed to checkout ${G}
15
+ ${r.message}`):c("Checked out board branch",!0)},Ln=async e=>{let t=await He({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return c("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},Os=async e=>{let t=await Ln(e);if(l(t))return s(t.message);if(t.data)return c("Board upstream already configured",!1);let n=await po({repoRoot:e,remote:We});if(l(n))return s(n.message);if(!n.data)return c("No remote available for upstream",!1);let r=await go({repoRoot:e,remote:We,branch:G});if(l(r))return s(r.message);if(r.data){let i=await H({args:["branch","--set-upstream-to",`${We}/${G}`,G],cwd:e});return l(i)?s(`Failed to set board upstream
16
+ ${i.message}`):c("Configured board upstream",!0)}let o=await H({args:["push","-u",We,G],cwd:e});return l(o)?s(`Failed to publish board branch
17
+ ${o.message}`):c("Published board branch and configured upstream",!0)},Us=async e=>{let t=await Ln(e);if(l(t))return s(t.message);if(!t.data)return c("No upstream configured, skipped pull",!1);let n=await H({args:["pull","--rebase"],cwd:e});return l(n)?s(`Failed during board pull --rebase
18
+ ${n.message}`):c("Pulled board with rebase",!0)},Ws=e=>{let t=pt(e);if(!D.existsSync(t))return c("Events dir missing",[]);let n=D.readdirSync(t,{withFileTypes:!0}).filter(r=>r.isFile()).map(r=>r.name).filter(r=>r.endsWith(".jsonl")).sort();return c("Listed event files",n)},Hs=e=>e.endsWith(".jsonl")?e.includes("/")||e.includes("\\")?s("Own event file must be a file name, not a path"):e==="."||e===".."||e.trim()===""?s("Own event file name is invalid"):c("Validated own event file name",e):s("Own event file must end with .jsonl"),_s=({repoRoot:e,worktreeRoot:t,ownEventFileName:n})=>{let r=Qr({root:e,fileName:n}),o=Qr({root:t,fileName:n});if(!D.existsSync(r))return c("Local own event file missing, nothing to copy",!1);let i=D.readFileSync(r,"utf8"),a=D.existsSync(o)?D.readFileSync(o,"utf8"):"";return i===a?c("Own event file already matches board worktree",!1):(D.mkdirSync(B.dirname(o),{recursive:!0}),D.copyFileSync(r,o),c("Copied own event file into board worktree",!0))},$s=({repoRoot:e,worktreeRoot:t})=>{let n=Ws(t);if(l(n))return s(n.message);let r=pt(t),o=pt(e),i=!1;for(let a of n.data){let d=B.join(r,a),m=B.join(o,a),u=D.existsSync(d)?D.readFileSync(d,"utf8"):"",f=D.existsSync(m)?D.readFileSync(m,"utf8"):"";u!==f&&(D.mkdirSync(B.dirname(m),{recursive:!0}),D.copyFileSync(d,m),i=!0)}return c("Hydrated event files from board worktree",i)},no=async({worktreeRoot:e,ownEventFileName:t})=>{let n=await H({args:["add",co(t)],cwd:e});return l(n)?s(`Failed to stage board own event file
19
+ ${n.message}`):c("Staged board own event file",void 0)},Vs=async({worktreeRoot:e,ownEventFileName:t})=>{let n=await He({args:["diff","--cached","--quiet","--",co(t)],cwd:e});return n.exitCode===0?c("No staged board own event file change",!1):n.exitCode===1?c("Has staged board own event file change",!0):s(n.stderr.trim()||"Unable to inspect staged board own event file change")},ro=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",Ks=async e=>{let t=await H({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return l(t)?s(t.message):c("Resolved current branch",t.data.stdout.trim())},js=async e=>{let t=await H({args:["rev-parse","--short","HEAD"],cwd:e});return l(t)?s(t.message):c("Resolved short HEAD sha",t.data.stdout.trim())},zs=async e=>{let t=await Ks(e);if(l(t))return s(t.message);let n=await js(e);if(l(n))return s(n.message);let r=ro(t.data),o=ro(n.data);return c("Built sync commit message",`[epiq:sync:${r}:${o}]`)},oo=async({repoRoot:e,worktreeRoot:t,ownEventFileName:n})=>{let r=await Vs({worktreeRoot:t,ownEventFileName:n});if(l(r))return s(r.message);if(!r.data)return c("No board own event file commit needed",null);let o=await zs(e);if(l(o))return s(o.message);let i=await H({args:["commit","-m",o.data],cwd:t});if(l(i))return s(`Failed to commit board own event file
20
+ ${i.message}`);let a=await H({args:["rev-parse","HEAD"],cwd:t});return l(a)?s(a.message):c("Created board sync commit",a.data.stdout.trim())},qs=async e=>{let t=await Ln(e);if(l(t))return s(t.message);if(!t.data)return c("No upstream configured, skipped push",!1);let n=await H({args:["push"],cwd:e});return l(n)?s(`Failed during board push
21
+ ${n.message}`):c("Pushed board",!0)},Gs=async({repoRoot:e,worktreeRoot:t})=>{let n=!1,r=Rs();if(l(r))return s(r.message);let o=await Ds({repoRoot:e});if(l(o))return s(o.message);n=n||o.data;let i=await Bs({repoRoot:e,worktreeRoot:t});if(l(i))return s(i.message);n=n||i.data;let a=await ks(t);if(l(a))return s(a.message);n=n||a.data;let d=await Os(t);return l(d)?s(d.message):(n=n||d.data,c("Bootstrapped board storage",n))},fo=async({cwd:e=process.cwd(),ownEventFileName:t})=>{let n=Hs(t);if(l(n))return s(n.message);let r=await As(e);if(l(r))return s(r.message);let o=r.data,i=Ls(o),a=await Jr(o);if(l(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 d=await Ts(o);if(l(d))return s(d.message);if(d.data)return s("Cannot run :sync while staged changes exist. Please commit or unstage them first.");let m=await bs(o);if(l(m))return s(m.message);let u=await Gs({repoRoot:o,worktreeRoot:i});if(l(u))return s(u.message);let f=await Jr(i);if(l(f))return s(f.message);if(f.data)return s("Cannot run :sync while a merge, rebase, cherry-pick, or revert is in progress in the board worktree");let y=Zr(o);if(l(y))return s(y.message);let N=Zr(i);if(l(N))return s(N.message);let S=eo(o);if(l(S))return s(S.message);let b=eo(i);if(l(b))return s(b.message);let I=!1,E,w=!1,O=!1,ie=!1,le=u.data,at=_s({repoRoot:o,worktreeRoot:i,ownEventFileName:n.data});if(l(at))return s(at.message);if(at.data){let Ve=await no({worktreeRoot:i,ownEventFileName:n.data});if(l(Ve))return s(Ve.message);let Nt=await oo({repoRoot:o,worktreeRoot:i,ownEventFileName:n.data});if(l(Nt))return s(Nt.message);Nt.data&&(I=!0,E=Nt.data)}let dt=await no({worktreeRoot:i,ownEventFileName:n.data});if(l(dt))return s(dt.message);let Fe=await oo({repoRoot:o,worktreeRoot:i,ownEventFileName:n.data});if(l(Fe))return s(Fe.message);Fe.data&&(I=!0,E=Fe.data);let V=await Us(i);if(l(V))return s(V.message);w=V.data;let K=await qs(i);if(l(K))return s([K.message,I&&E?`Local board sync commit exists: ${E}`:""].filter(Boolean).join(`
22
+ `));O=K.data;let Be=$s({repoRoot:o,worktreeRoot:i});return l(Be)?s(Be.message):(ie=Be.data,c("Synced board event logs via git",{repoRoot:o,worktreeRoot:i,createdCommit:I,commitSha:E,pulled:w,pushed:O,hydrated:ie,bootstrapped:le}))};var Xs=e=>Object.values(C().tags).find(t=>t.name===e),Ys=e=>Object.values(C().contributors).find(t=>t.name===e),xo=[{systemOnly:!0,intent:M.Move,mode:p.COMMAND_LINE,action:()=>{let e=Q();if(l(e))return s("Unable to resolve user ID");let t=e.data,{modifier:n}=me().commandMeta,{currentNode:r,selectedIndex:o}=C(),i=T(r.id)[o];if(!i)return A({mode:p.DEFAULT}),s("No move target");if(n==="start"){if(i.readonly)return s("Target node is read-only");if(o===-1)return s("No item selected");if(!i.parentNodeId)return s("Target has no parent");let a=T(i.parentNodeId),d=a.findIndex(({id:y})=>y===i.id);if(d===-1)return s("Target not found among siblings");let m=a[d-1],u=a[d+1],f=u!=null?{at:"before",sibling:u.id}:m!=null?{at:"after",sibling:m.id}:{at:"start"};return et({id:_(),userId:t,action:"move.node",payload:{id:i.id,parent:i.parentNodeId,pos:f}}),A({mode:p.MOVE}),c("Move initialized",null)}if(n==="next")return A({mode:p.MOVE}),Sn(1);if(n==="previous")return A({mode:p.MOVE}),Sn(-1);if(n==="to-next")return A({mode:p.MOVE}),bn(1);if(n==="to-previous")return A({mode:p.MOVE}),bn(-1);if(n==="confirm"){A({mode:p.DEFAULT});let a=Ue();if(!a)return s("No pending move to confirm");let d=Z(a);return l(d)?d:(et(null),c("Moved item",null))}return n==="cancel"?(et(null),A({mode:p.DEFAULT}),c("Cancelling move",null)):s("Invalid move modifier")}},{intent:M.Delete,mode:p.COMMAND_LINE,action:()=>{let e=Q();if(l(e))return s("Unable to resolve user ID");let t=e.data,{currentNode:n,selectedIndex:r}=C(),o=T(n.id)[r];return o?Z({id:_(),userId:t,action:"delete.node",payload:{id:o.id}}):s("Unable to resolve child to delete")},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.Edit,mode:p.COMMAND_LINE,action:()=>{let e=Q();if(l(e))return s("Unable to resolve user ID");let t=e.data,n=tt(C().breadCrumb,"TICKET");if(l(n))return s("Edit target must be an issue");let r=n.data;if(r.readonly)return s("Cannot edit readonly field");let{currentNode:o,selectedIndex:i}=C();if(!T(r.id)[i])return s("No selected field");let d=T(o.id)[i];if(!d)return s("No selected field");if(d.readonly)return s("Cannot edit readonly field");let m=d.props.value;if(typeof m!="string")return s("Selected field is not editable text");let u=Pr(m);if(l(u))return s("Failed to edit field");let f=u.data;return f===m?c("No changes made",null):d.title==="Description"?Z({id:_(),userId:t,action:"edit.description",payload:{id:d.id,md:f}}):d.title==="Title"?Z({id:_(),userId:t,action:"edit.title",payload:{id:d.id,name:f}}):s(`Editing not supported for "${d.title}"`)},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.Filter,mode:p.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=me().commandMeta,n=/(!=|=)/,[r,o]=e.split(n);if(!r||!(d=>j(g.FILTER).map(m=>m.split(n)[0]).includes(d))(r))return s("Invalid filter modifier");let a={target:r,operator:"=",value:t.trim()};return re(d=>({...d,filters:e==="clear"?[]:[...d.filters,a],mode:p.DEFAULT})),c("Viewing help",null)}},{intent:M.ViewHelp,mode:p.COMMAND_LINE,action:()=>(A({mode:p.HELP}),c("Viewing help",null))},{intent:M.CloseIssue,mode:p.COMMAND_LINE,action:()=>{let e=Q();if(l(e))return s("Unable to resolve user ID");let t=e.data,{currentNode:n,selectedIndex:r}=C(),o=T(n.id)[r];if(!o)return s("Unable to close issue, no target found");if(!o.parentNodeId)return s("No target parent found");if(!ke(o))return s("Cannot close in this context");let i=Z({id:_(),userId:t,action:"close.issue",payload:{id:o.id,parent:o.parentNodeId}});return l(i)?i:c("Viewing help",null)}},{intent:M.ReopenIssue,mode:p.COMMAND_LINE,action:()=>{let e=Q();if(l(e))return s("Unable to resolve user ID");let t=e.data,{currentNode:n,selectedIndex:r}=C(),o=T(n.id)[r];if(!o)return s("Unable to reopen issue, no target found");let i=o.context==="TICKET"?c("Resolved ticket",o):ze(o.id,"TICKET");if(l(i))return s("Cannot reopen in this context");let a=i.data,d=Z({id:_(),userId:t,action:"reopen.issue",payload:{id:a.id}});return l(d)?d:c("Issue reopened",null)},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.SetUserName,mode:p.COMMAND_LINE,action:()=>{let{userId:e,preferredEditor:t,userName:n}=ae(),r=Rt()?.trim();if(!r)return s("No username provided");let o=r??n,i=e??_();if(!o||!i)return s("Unable to resolve user name or id");let a=Tn({userName:o,userId:i,preferredEditor:t??""});return l(a)?a:(lt({userName:o,userId:i}),A({mode:p.DEFAULT}),c(`Username set to "${r}"`,null))}},{intent:M.Init,mode:p.COMMAND_LINE,action:()=>{let e=yo();if(l(e))return e;let{rootNodeId:t,nodes:n}=C();return F.navigate({currentNode:n[t],selectedIndex:0}),c("Project initialized",null)}},{intent:M.SetEditor,mode:p.COMMAND_LINE,action:()=>{let e=Rt()?.trim();if(!e)return s("No editor provided");let t=Tn({preferredEditor:e});return l(t)?t:(lt({preferredEditor:e}),A({mode:p.DEFAULT}),c(`Editor configuration set to "${e}"`,null))}},{intent:M.NewItem,mode:p.COMMAND_LINE,action:(e,t)=>{let n=Q();if(l(n))return s("Unable to resolve user ID");let r=n.data;if(!t.inputString)return s(`provide a name for your ${t.modifier}`);let{breadCrumb:o,currentNode:i,selectedIndex:a}=C(),d=m=>{let u=Z(m);if(l(u))return u;let f=h.getNode(u.data.result.id);if(!f)return s("Created node not found");if(!f.parentNodeId)return u;let y=h.getNode(f.parentNodeId);return y?(F.navigate({currentNode:y,selectedIndex:h.getSiblings(f.parentNodeId).findIndex(({id:N})=>N===f.id)}),u):s("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:m}=C(),u=h.getNode(m);return u?d({id:_(),userId:r,action:"add.board",payload:{id:_(),name:t.inputString,parent:u.id}}):s("Workspace not found")}if(t.modifier==="swimlane"){let m=tt(o,"BOARD");return l(m)?s("Unable to add swimlane in this context"):d({id:_(),userId:r,action:"add.swimlane",payload:{id:_(),name:t.inputString,parent:m.data.id}})}if(t.modifier==="issue"){let m=T(i.id)[a],u=i.context==="SWIMLANE"?i:i.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let b=tt(o,"SWIMLANE");return l(b)?null:b.data})();if(!u)return s("Unable to add issue in this context");let f=Dr({userId:r,name:t.inputString,parent:u.id}),y=Ut(f);if(y.some(b=>l(b)))return s("Issue create failed: "+y.filter(l).map(b=>b.message).filter(Boolean).join(", "));let N=y[0];if(!N||l(N))return s("Issue creation failed");let S=f[0]?.payload.id;return S?(F.navigate({currentNode:u,selectedIndex:h.getSiblings(u.id).findIndex(({id:b})=>b===S)}),c("Issue created",null)):s("Unable to determine ticket id")}return Qn()},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.SetView,mode:p.COMMAND_LINE,action:()=>{let{commandMeta:e}=me();return e.validity===xe.Invalid?s("Invalid command "+ye):(re(t=>({...t,viewMode:e.modifier==="wide"?"wide":e.modifier==="dense"?"dense":t.viewMode})),c("View set",null))},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.Rename,mode:p.COMMAND_LINE,action:()=>{let e=Q();if(l(e))return s("Unable to resolve user ID");let t=e.data,{currentNode:n,selectedIndex:r}=C(),o=T(n.id)[r];if(!o)return s("Missing node");if(o.readonly)return s("Cannot rename readonly node");let i=Rt();return i?Z({id:_(),userId:t,action:"edit.title",payload:{id:o.id,name:i}}):s("Provide a new name")},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.TagTicket,mode:p.COMMAND_LINE,action:()=>{let e=Q();if(l(e))return s("Unable to resolve user ID");let t=e.data,{modifier:n,inputString:r}=me().commandMeta,o=(n||r).trim();if(!o)return s("Provide a tag");let{selectedIndex:i,currentNode:a}=C(),d=T(a.id)[i];if(!d)return s("Invalid tag target");let m=ze(d.id,"TICKET");if(l(m))return s("Unable to tag issue in this context");let u=m.data,f=Xs(o),y;if(f)y=f.id;else{let b=_(),I=Z({id:_(),userId:t,action:"create.tag",payload:{id:b,name:o}});if(l(I))return I;y=I.data.result.id}let N=h.getFieldByTitle(u.id,"Tags");return N?T(N.id).some(b=>b.props?.value===y)?s("Already tagged with that tag"):Z({id:_(),userId:t,action:"tag.issue",payload:{id:_(),target:u.id,tagId:y}}):s("Unable to locate tags field")},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.AssignUserToTicket,mode:p.COMMAND_LINE,action:()=>{let e=Q();if(l(e))return s("Unable to resolve user ID");let t=e.data,{modifier:n,inputString:r}=me().commandMeta,o=(n||r).trim();if(!o)return s("Provide an assignee");let{selectedIndex:i,currentNode:a}=C(),d=T(a.id)[i];if(!d)return s("Invalid assign target");let m=ze(d.id,"TICKET");if(l(m))return s("Unable to assign issue in this context");let u=m.data,f=Ys(o),y;if(f)y=f.id;else{let b=_(),I=Z({id:_(),userId:t,action:"create.contributor",payload:{id:b,name:o}});if(l(I))return I;y=I.data.result.id}let N=h.getFieldByTitle(u.id,"Assignees");return N?T(N.id).some(b=>b.props?.value===y)?s("Assignee already assigned"):Z({id:_(),userId:t,action:"assign.issue",payload:{id:_(),target:u.id,contributor:y}}):s("Unable to locate assignees field")},onSuccess:()=>A({mode:p.DEFAULT})},{intent:M.Sync,mode:p.COMMAND_LINE,action:async()=>{W(()=>""),A({syncStatus:{msg:"Syncing",status:"syncing"}});let{userId:e,userName:t}=ae();if(!e)return s("Unable to resolve userId");if(!t)return s("Unable to resolve userName");let n=In();if(l(n))return s("Unable to resolve log file name");let r=await fo({ownEventFileName:n.data});return l(r)?(A({syncStatus:{msg:r.message,status:"outOfSync"}}),s(`Unable to sync state. ${r.message}`)):(A({syncStatus:{msg:"Synced",status:"synced"},mode:p.DEFAULT}),c("Synced",!0))}}];var ne=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=me();if(!t)return s("No command to confirm");if(!e&&n===xe.Invalid)return s("Invalid command");let i=wr(t);Nr();let a=xo.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===i);if(!a)return Lt({result:ye.Fail,message:"Command not found",data:null});let d=await a.action(a,{command:t,inputString:o,modifier:r});return l(d)?Lt(d):(Er({addToHistory:!e}),a.onSuccess?.(),Lt(d))};var Wt=[{intent:"exit",mode:p.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(A({mode:p.COMMAND_LINE}),W(()=>"move cancel"),ne({isForceExecutedBySystem:!0}))},{intent:"initMove",mode:p.DEFAULT,description:"[m] move init/confirm",action:()=>(A({mode:p.COMMAND_LINE}),W(()=>"move start"),ne({isForceExecutedBySystem:!0}))},{intent:"confirmMove",mode:p.MOVE,action:()=>(A({mode:p.COMMAND_LINE}),W(()=>"move confirm"),ne({isForceExecutedBySystem:!0}))}],Ht=[{intent:"movePreviousItem",mode:p.MOVE,action:()=>Ue()?(A({mode:p.COMMAND_LINE}),W(()=>"move previous"),ne({isForceExecutedBySystem:!0})):s("No pending move")},{intent:"moveNextItem",mode:p.MOVE,action:()=>Ue()?(A({mode:p.COMMAND_LINE}),W(()=>"move next"),ne({isForceExecutedBySystem:!0})):s("No pending move")}],vo=[{intent:"moveToNextContainer",mode:p.MOVE,action:()=>Ue()?(A({mode:p.COMMAND_LINE}),W(()=>"move to-next"),ne({isForceExecutedBySystem:!0})):s("No pending move")},{intent:"moveToPreviousContainer",mode:p.MOVE,action:()=>Ue()?(A({mode:p.COMMAND_LINE}),W(()=>"move to-previous"),ne({isForceExecutedBySystem:!0})):s("No pending move")}];var Co={[L.WORKSPACE]:[...Wt,...Ht],[L.BOARD]:[...Wt,...Ht],[L.SWIMLANE]:[...Wt,...Ht,...vo],[L.TICKET]:[],[L.FIELD]:[],[L.FIELD_LIST]:[],[L.TEXT]:[]};var ho=[{intent:"addItem",mode:p.DEFAULT,description:"[n] new...",action:()=>(A({mode:p.COMMAND_LINE}),W(()=>`${g.NEW} `),c("Adding new item",null))},{intent:"Delete",mode:p.DEFAULT,description:"[d] delete",action:()=>(A({mode:p.COMMAND_LINE}),W(()=>`${g.DELETE} `),c("Deleting item",null))},{intent:"initCommandLine",mode:p.DEFAULT,description:"[:] focus command line",action:()=>(A({mode:p.COMMAND_LINE}),W(()=>""),c("Entering command line mode",null))},{intent:"confirm",mode:p.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>(F.enterChildNode(),c("Entering context",null))},{intent:"exit",mode:p.DEFAULT,description:"[q] exit context",action:()=>(logger.debug("Executing exit action"),F.enterParentNode(),c("Exiting context",null))},{intent:"navPreviousItem",mode:p.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(F.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:"navNextItem",mode:p.DEFAULT,action:()=>(F.navigateToNextItem(),c("Navigating to next item",null))},{intent:"navToPreviousContainer",mode:p.DEFAULT,action:()=>(F.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:"navToNextContainer",mode:p.DEFAULT,action:()=>(F.navigateToNextContainer(),c("Navigating to next container",null))},{intent:"edit",mode:p.DEFAULT,action:()=>(A({mode:p.COMMAND_LINE}),W(()=>"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}),W(()=>"sync"),ne({isForceExecutedBySystem:!0}),c("Synced",!0))}];var No=[{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:()=>(yn(-1),c("Moving cursor left",null))},{intent:"MoveCursorRight",mode:p.COMMAND_LINE,action:()=>(yn(1),c("Moving cursor right",null))},{intent:"MoveCursorLeftOfWord",mode:p.COMMAND_LINE,action:()=>(vn("left"),c("Moving cursor left of word",null))},{intent:"MoveCursorRightOfWord",mode:p.COMMAND_LINE,action:()=>(vn("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:()=>(W((e,{remainder:t})=>t?e+t:e),c("Auto-completing command",null))},{intent:"captureInput",mode:p.COMMAND_LINE,action:(e,{sequence:t})=>(W(n=>n+t),c("Capturing input",null))},{intent:"eraseInput",mode:p.COMMAND_LINE,action:()=>(Cr(),c("Erasing input",null))},{intent:"EraseInputWord",mode:p.COMMAND_LINE,action:()=>(hr(),c("Erasing input word",null))},{intent:"getLastCommandFromHistory",mode:p.COMMAND_LINE,action:()=>(Ir(),c("Getting last command from history",null))},{intent:"getNextCommandFromHistory",mode:p.COMMAND_LINE,action:()=>(br(),c("Getting next command from history",null))}];import Js from"chalk";var _t=": for command line",Eo="q to exit",Io=`${Js.hex(v.accent)("m")} to confirm`,Rn={[L.WORKSPACE]:[_t],[L.BOARD]:[_t],[L.BOARD+p.COMMAND_LINE]:[_t],[L.SWIMLANE]:[_t],[L.TICKET+p.HELP]:[Eo],[L.SWIMLANE+p.HELP]:[Eo],[L.TICKET]:[],[L.FIELD]:[],[L.SWIMLANE+p.MOVE]:[Io],[L.TICKET+p.MOVE]:[Io]};var $t=e=>e.trim().toLocaleLowerCase(),Qs=(e,t)=>{let n=h.getFieldByTitle(e,t);if(!n)return"";let r=n.props?.value;return typeof r=="string"?r:""},Zs=e=>{let{tags:t}=C(),n=h.getFieldByTitle(e,"Tags");return n?U(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},ea=e=>{let{contributors:t}=C(),n=h.getFieldByTitle(e,"Assignees");return n?U(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},bo=(e,t)=>{let n=t.value;if(!n)return!0;switch(t.target){case"title":return $t(e.title??"").includes(n);case"description":return $t(Qs(e.id,"Description")).includes(n);case"tag":return Zs(e.id).map($t).some(d=>d.includes(n));case"assignee":return ea(e.id).map($t).some(d=>d.includes(n));default:return!0}};function So(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(),c("Breadcrumb built",o))}var Ao=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 Vt,Pn=new Set,wo=()=>{for(let e of Pn)e()},na=e=>(Pn.add(e),()=>Pn.delete(e));function To(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 d=o[t];if(!d)return logger.error("Unable to derive state, currentNode not found"),s("Unable to derive state, currentNode not found");let m=So(t,o,r);if(l(m))return logger.error(m.message),m;let u=m.data,{context:f}=d,y=Rn[f+n]??Rn[f]??[],N=[...ho,...Co[f]??[],...No],S=Ao(N);return c("Derived successfully",{...e,currentNode:d,breadCrumb:u,availableHints:y,availableActions:N,actionIndex:S,renderedChildrenIndex:ra(o,i)})}var C=()=>(Vt||logger.error("State not initialized. Call initWorkspaceState() first.",new Error().stack),Vt);function Br(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:""}},n=To(t);return l(n)?n:(Vt=n.data,wo(),c("State initialized",null))}function re(e){let t=C(),n=e(t),r=To(n);return l(r)?s(r.message??"Unable to update state"):(Vt=r.data,wo(),c("State updated",null))}var A=e=>re(t=>({...t,...e}));var $=()=>ta(na,C,C),ra=(e,t)=>{let n={};for(let r of Object.values(e))ke(r)&&t.length>0&&!t.every(o=>bo(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],d=e[i.id];return!a||!d?0:a.rank.localeCompare(d.rank)});return n},T=e=>C().renderedChildrenIndex[e]??[];var F={exit(){process.exit(0)},enterChildNode(){let e=C(),t=e.currentNode,n=Math.max(0,e.selectedIndex),r=T(t.id)[n];!r||t.context==="FIELD"||F.navigate({currentNode:r,selectedIndex:T(r.id).length?0:-1})},enterParentNode(){let{currentNode:e,nodes:t}=C();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=T(n.id),o=r.findIndex(({id:a})=>a===e.id),i=r.length===0?-1:o>=0?o:0;F.navigate({currentNode:n,selectedIndex:i})},navigateToNextItem:()=>Mo(1),navigateToPreviousItem:()=>Mo(-1),navigateToNextContainer:()=>Lo(1),navigateToPreviousContainer:()=>Lo(-1),navigate:({currentNode:e=C().currentNode,selectedIndex:t})=>{A({currentNodeId:e.id,selectedIndex:t})}},Mo=e=>{let t=C(),n=T(t.currentNode.id).length;if(n===0)return;let o=(Math.max(0,t.selectedIndex)+e+n)%n;F.navigate({selectedIndex:o})},Lo=e=>{let{currentNode:t,nodes:n,selectedIndex:r}=C();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=T(o.id),a=i.findIndex(N=>N.id===t.id);if(a<0)return;let d=i.at(a+e)??i.at(0);if(!d)return;let m=T(d.id),u=Math.max(0,m.length-1),f=Math.min(Math.max(0,r),u),y=m.length?f:-1;F.navigate({currentNode:d,selectedIndex:y})};var Ne="system.actor",gt=oa(),Te=null;function ia(){let e=Object.values(C().nodes).find(r=>r.context==="WORKSPACE");if(!e)throw new Error("No workspace found in event log");let[t]=T(e.id),[n]=t?T(t.id):[];if(logger.debug("Boot navigation target:",{workspace:e?.id,firstBoard:t?.id,firstSwimlane:n?.id}),n){let r=C().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:C().nodes[C().rootNodeId],selectedIndex:0}}function sa(){let e=ia();F.navigate(e)}function aa(){let e=gt(),t=gt(),n=gt(),r=gt(),o=gt();return[{id:he(),userId:Ne,action:"init.workspace",payload:{id:e,name:"Workspace"}},{id:he(),userId:Ne,action:"add.board",payload:{id:t,name:"Default",parent:e}},{id:he(),userId:Ne,action:"add.swimlane",payload:{id:n,name:"Todo",parent:t}},{id:he(),userId:Ne,action:"add.swimlane",payload:{id:r,name:"Review",parent:t}},{id:he(),userId:Ne,action:"add.swimlane",payload:{id:o,name:"Done",parent:t}},{id:he(),userId:Ne,action:"add.board",payload:{id:Bt,name:"Closed",parent:e}},{id:he(),userId:Ne,action:"add.swimlane",payload:{id:Ye,name:"Closed",parent:Bt}},{id:he(),userId:Ne,action:"lock.node",payload:{id:Bt}},{id:he(),userId:Ne,action:"lock.node",payload:{id:Ye}}]}function Tt(){return Te!==null}function yo(){if(!Te||Te.length===0)return c("No pending default events to persist",null);let t=Ut(Te).filter(l);return t.length>0?s([nt.bold.red("Materializing failed"),"",...t.map((n,r)=>`${nt.dim.gray(`${r+1}.`)} ${nt.dim(n.message)}`),`
23
23
  `].join(`
24
- `)):(Te=null,c("Persisted pending default events",null))}function Ao(e){let t;e.length===0?(Te=oa(),t=hn([...Te])):(Te=null,t=hn(e));let n=t.filter(l);return n.length>0?s([tt.bold.red("Materializing failed"),"",...n.map((r,o)=>`${tt.dim.gray(`${o+1}.`)} ${tt.dim(r.message)}`),`
24
+ `)):(Te=null,c("Persisted pending default events",null))}function Ro(e){let t;e.length===0?(Te=aa(),t=hn([...Te])):(Te=null,t=hn(e));let n=t.filter(l);return n.length>0?s([nt.bold.red("Materializing failed"),"",...n.map((r,o)=>`${nt.dim.gray(`${o+1}.`)} ${nt.dim(r.message)}`),`
25
25
  `].join(`
26
- `)):(ra(),c("State booted successfully",null))}import{Box as Ea}from"ink";import kn from"react";import gt from"chalk";import{Box as Fn,Text as wo}from"ink";import pt,{useEffect as ia,useMemo as sa,useState as aa}from"react";var To=gt.gray,da=gt.inverse,ca=gt.inverse.gray,la={hint:"",hints:[],overlap:0,remainder:""},Lo=({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}},ma=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=oe(t);return{bg:r=>gt.bgHex(n).black(r),bgCursor:r=>gt.bgHex(n).inverse.black(r)}}return mn(t)},ua=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=Lo({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}},Mo=()=>({value:q.value,cursorPosition:q.cursorPosition,commandIsPending:q.commandIsPending,autoCompletion:q.commandMeta.autoCompletion??la,infoMessage:q.commandMeta.infoMessage,validationStatus:q.commandMeta.validity,command:q.commandMeta.command,inputString:q.commandMeta.inputString,modifier:q.commandMeta.modifier}),pa=(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,Ro=({width:e})=>{let[t,n]=aa(Mo());ia(()=>{let y=()=>{let S=Mo();n(b=>pa(b,S)?b:S)},N=Cr(y);return y(),()=>{N()}},[]);let{value:r,cursorPosition:o,infoMessage:i,commandIsPending:a,autoCompletion:d,command:m,modifier:u}=t,f=sa(()=>{let y=Math.max(0,Math.min(o,r.length)),N=Lo({value:r,command:m}),S=ua({value:r,command:m,modifier:u}),b=m?mn(m):null,I=ma({command:m,modifier:u}),E=(V,K)=>{let Be=N&&K>=N.start&&K<N.end,on=S&&K>=S.start&&K<S.end;return Be&&b?b.fg(V):on&&I?I.bg(V):V},w=(V,K)=>{let Be=N&&K>=N.start&&K<N.end,on=S&&K>=S.start&&K<S.end;return Be&&b?b.fgCursor(V):on&&I?I.bgCursor(V):da(V)},k=r.slice(0,y),ie=r[y]??" ",le=y<r.length?r.slice(y+1):"",Ct=Array.from(k).map((V,K)=>E(V,K)).join(""),st=w(ie,y),Fe=Array.from(le).map((V,K)=>E(V,y+1+K)).join("");if(d.hint){let V=d.hint[d.overlap]??ie;st=ca(V),Fe=To(d.remainder.slice(1)+le)}return To(":")+Ct+st+Fe},[r,o,d,m,u]);return pt.createElement(Fn,{flexDirection:"column",justifyContent:"flex-start"},pt.createElement(Fn,{flexDirection:"column",paddingX:1,borderColor:v.secondary,borderStyle:"round",width:e},pt.createElement(Fn,null,pt.createElement(wo,null,f),i&&pt.createElement(wo,{wrap:"truncate",color:a?v.red:v.secondary2},` ${i} `))))};import Po from"chalk";import{Box as ga,Text as Bn}from"ink";import Vt,{useEffect as fa,useState as xa}from"react";var ya=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],Do=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)}},va=({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)}`},Ca=(e,t,n)=>{let r=Do(e),o=Do(t);return va({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},ha=(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 Ca(i,a,o)},Na=(e,t)=>e.length===t?e:e.length>t?e.slice(0,t):e.padEnd(t," "),Fo=({width:e,availableHints:t})=>{let{syncStatus:{status:n,msg:r}}=_(),[o,i]=xa(0);fa(()=>{if(n!=="syncing"){i(0);return}let E=setInterval(()=>{i(w=>w+1)},50);return()=>clearInterval(E)},[n]);let a=[],d=0;for(let E of t){let k=(a.length>0?" | ":"").length+E.length;if(d+k>e-4)break;a.push(E),d+=k}let m=n!="synced"?r??a.join(" | "):a.join(" | "),u=Math.max(0,e-2),f=n==="syncing"?ha(ya,(Math.sin(o*.12)+1)/2):v.secondary,y=Po.hex(f??"fff"),N=Po.hex(v.secondary2),S=y(`\u256D${"\u2500".repeat(u)}\u256E`),b=y(`\u2570${"\u2500".repeat(u)}\u256F`),I=`${y("\u2502")}${N(Na(` ${m} `,u))}${y("\u2502")}`;return Vt.createElement(ga,{flexDirection:"column",width:e},Vt.createElement(Bn,null,S),Vt.createElement(Bn,null,I),Vt.createElement(Bn,null,b))};var Kt=({width:e,mode:t,availableHints:n})=>{let r=_(),o=[],i=0;for(let a of n){let m=(o.length>0?" | ":"").length+a.length;if(i+m>e+2)break;o.push(a),i+=m}return kn.createElement(Ea,null,t===p.COMMAND_LINE&&r.syncStatus.status!=="syncing"?kn.createElement(Ro,{width:e}):kn.createElement(Fo,{width:e,mode:t,availableHints:n}))};import{Box as nt,Text as Bo}from"ink";import Me from"react";var ko=({width:e})=>{let t=[...C().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"]),Me.createElement(nt,{flexDirection:"column",marginTop:3,borderColor:v.secondary,borderStyle:"round",width:e,minHeight:19},Me.createElement(nt,{flexDirection:"column",width:e},C().mode===p.HELP?t.map(([n,r],o)=>Me.createElement(nt,{paddingLeft:1,key:o,flexDirection:"row"},Me.createElement(nt,{key:o,flexDirection:"row",paddingBottom:o?0:1},Me.createElement(nt,{width:20,justifyContent:"flex-end"},Me.createElement(Bo,{color:o?v.accent:v.secondary},n)),Me.createElement(nt,{flexGrow:1,width:40,paddingLeft:2},Me.createElement(Bo,{color:o?v.primary:v.secondary},r))))):null))};import Ho from"chalk";import{Box as Un,Text as $o}from"ink";import Ee from"react";import{Box as On,Text as Ma}from"ink";import it from"react";import{Text as Ia}from"ink";import ba from"react";var Sa=e=>e.toLowerCase().trim(),Aa=(e,t=ze)=>{let n=Sa(e);return t[n]?t[n]:ct(n)},rt=({id:e,isSelected:t})=>{let n=h.getContributor(e);if(n)return ba.createElement(Ia,{underline:t,color:Aa(n.name)},"@"+n.name)};import{Text as wa}from"ink";import Ta from"react";var ot=({id:e,isSelected:t})=>{let n=h.getTag(e);if(n)return Ta.createElement(wa,{underline:t,backgroundColor:oe(n.name),color:v.primary}," "+n.name+" ")};var La=(e,t)=>e.length<=t?e:t<=1?"\u2026":e.slice(0,t-1)+"\u2026",Oo=({width:e})=>{let{breadCrumb:t,currentNode:n,selectedIndex:r,viewMode:o}=C(),i=O(n.id)[r],a=je(i?.id??n.id,"TICKET"),d=Ve(a)?a.data:void 0,m=d?.id?O(d.id):[],u=I=>{let E=m.find(w=>w.title===I);return E?O(E.id).map(w=>typeof w.props?.value=="string"?w.props.value:"").filter(w=>!!w):[]},f=u("Tags"),y=u("Assignees"),N=d?.parentNodeId?!dn(n.id,d?.parentNodeId)&&o==="dense":!1,S=t.map((I,E)=>{let w=E===t.length-1,k=O(I.id),ie=w?k?.[r]?.title:void 0;return`${E?" / ":""}${I.title??""}${ie?` \u25B8 ${ie}`:""}`}).join(""),b=La(S,e);return it.createElement(On,null,it.createElement(Ma,{color:v.secondary2},b),N?f.map(I=>it.createElement(On,{key:I,paddingLeft:2},it.createElement(ot,{id:I}))):null,N?y.map(I=>it.createElement(On,{key:I,paddingLeft:2},it.createElement(rt,{id:I}))):null)};import{Box as Ra,Text as Uo}from"ink";import jt from"react";var Pa=({filters:e})=>jt.createElement(Ra,{columnGap:1},jt.createElement(Uo,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>jt.createElement(Uo,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),Wo=jt.memo(Pa);function zt({filters:e,hideBreadCrumb:t=!1}){let{userName:n,preferredEditor:r}=ae(),o=40,i=process.stdout.columns-o-8;return Ee.createElement(Un,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},t?Ee.createElement($o,null," "):Ee.createElement(Un,{paddingLeft:1},e.length>0?Ee.createElement(Wo,{filters:e}):Ee.createElement(Oo,{width:i})),Ee.createElement(Un,{columnGap:1,paddingRight:2,"max-width":o,overflow:"hidden",justifyContent:"flex-end"},Ee.createElement(_o,{icon:"@",value:n}),Ee.createElement(_o,{icon:"\u276F",value:r})))}function _o({icon:e,value:t}){return Ee.createElement($o,null,Ho.dim(e)+Ho.hex(v.accent)(` ${t??"-"} `))}import{Box as td,Text as nd}from"ink";import xt from"react";import{Box as qt,Text as Wn}from"ink";import Le from"react";import{Text as Vo}from"ink";import Ko,{useEffect as Da,useState as Fa}from"react";var jo={help:["\u25B8 ","\u25B8 ","\u25B8 "],default:["\u25B8 ","\u25B8 ","\u25B8 "],move:["\u2191 ","\u2192 ","\u2193 ","\u2190 "],"command-line":["\u276F ","\u276F ","\u276F "]},ee=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=_(),r=jo[n]??jo.default,[o,i]=Fa(r.length-1);return Da(()=>{if(!e)return;let a=setInterval(()=>{i(d=>(d+1)%r.length)},800);return()=>clearInterval(a)},[e,r]),e?Ko.createElement(Vo,{color:v.accent,dimColor:o===1},r[o]):Ko.createElement(Vo,null,t)};function Hn(){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 Le.createElement(qt,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:v.secondary,width:i},Le.createElement(qt,{padding:1,paddingTop:0,paddingBottom:0},Le.createElement(Wn,null,"Select a board:")),Le.createElement(qt,{padding:1,flexDirection:"column"},a.map((d,m)=>{let u=e.currentNode.context==="WORKSPACE"&&e.selectedIndex===m,y=T(d.id).flatMap(({id:N})=>O(N)).length;return Le.createElement(qt,{key:d.id??m},Le.createElement(Wn,{color:u?v.accent:v.secondary},Le.createElement(ee,{isSelected:u})),Le.createElement(Wn,{color:u?v.accent:v.secondary},d.title," (",y," issues)",d.readonly?" \u{1F512}":""))})))}import{Box as Za}from"ink";import Zt from"react";import{Box as Vn,Text as Wa}from"ink";import pe from"react";import{Box as _n,Text as Ba}from"ink";import Gt from"react";var Xt=({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)),d=Math.max(1,Math.floor(i/a)),m=Math.max(0,Math.min(n,e.length-1)),u=Math.max(0,e.length-d),f=o?Math.min(u,Math.max(0,m-d+1)):Math.min(u,Math.floor(m/d)*d),y=f+d,N=e.slice(f,y),S=e.length>d,b=i,I=S?Math.max(1,Math.floor(d/e.length*b)):b,E=Math.max(0,b-I),w=Math.max(1,e.length-d),k=S?Math.floor(f/w*E):0;return Gt.createElement(_n,{flexDirection:"row",height:i,width:"100%"},Gt.createElement(_n,{flexDirection:"column",flexGrow:1,height:i},N),Gt.createElement(_n,{flexDirection:"column",width:1,height:b},Array.from({length:b}).map((ie,le)=>Gt.createElement(Ba,{key:le,color:S&&le>=k&&le<k+I?v.accent:v.secondary},S?"\u2502":" "))))};import{Box as Yt,Text as ka}from"ink";import _e from"react";var zo=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=Nt(er(t.title),r),i=T(t.id),a=u=>{let f=i.find(y=>y.title===u);return f?T(f.id).map(y=>typeof y.props?.value=="string"?y.props.value:"").filter(y=>!!y):[]},d=a("Tags").map(u=>h.getTag(u)).filter(u=>!!u),m=a("Assignees").map(u=>h.getContributor(u)).filter(u=>!!u);return _e.createElement(Yt,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?v.accent:v.secondary,justifyContent:"space-between"},_e.createElement(Yt,{borderBottom:!0},_e.createElement(Yt,{paddingLeft:1,flexDirection:"column"},_e.createElement(ka,{color:v.primary},o))),_e.createElement(Yt,{flexDirection:"row",paddingLeft:1},d.map(u=>_e.createElement(ot,{key:u.id,id:u.id})),m.map(u=>_e.createElement(rt,{key:u.id,id:u.id}))))};import Oa from"chalk";import{Box as ft,Text as $n}from"ink";import Ie from"react";var Ua=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,qo=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let i=T(t.id),a=I=>{let E=i.find(w=>w.title===I);return E?T(E.id).map(w=>typeof w.props?.value=="string"?w.props.value:"").filter(w=>!!w):[]},d=a("Tags").map(I=>h.getTag(I)).filter(I=>!!I),m=a("Assignees").map(I=>h.getContributor(I)).filter(I=>!!I),u=1,f=d.length*(1+u),y=m.length*(2+u),N=d.map(I=>Ie.createElement(ft,{key:I.id,paddingRight:u},Ie.createElement($n,{color:oe(I.name)},"\u25A0"))),S=m.map(I=>Ie.createElement(ft,{key:I.id,paddingRight:u},Ie.createElement($n,{color:ct(I.name)},"@"+I.name.at(0)))),b=n?v.accent:o===p.MOVE?v.secondary:v.primary;return Ie.createElement(ft,{borderBottom:!0,justifyContent:"space-between"},Ie.createElement(ft,null,Ie.createElement(ee,{isSelected:n,placeholder:Oa.dim.gray(r+1+" ")}),Ie.createElement($n,{wrap:"truncate",color:b},Ua(t.title,e-f-y-14))),Ie.createElement(ft,null,N,S))};var Ha=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:i,listSelectedIndex:a,mode:d})=>{let{renderedChildrenIndex:m}=_(),u=m[e.id]??[],f=`${e.title} (${u.length})`,y=3,N=o?1:4,S=r-y-(o?2:1),b=pe.createElement(Vn,{borderStyle:"round",borderColor:v.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},pe.createElement(ee,{isSelected:t}),pe.createElement(Wa,{bold:!0,color:t?v.accent:v.primary},f," ",e.readonly?"\u{1F512}":"")),I=(E,w)=>{let k=i&&a===w;return o?pe.createElement(qo,{key:E.id,index:w,width:n,ticket:E,isSelected:k,mode:d}):pe.createElement(zo,{key:E.id,width:n,ticket:E,isSelected:k})};return pe.createElement(Vn,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?v.accent:v.secondary,paddingRight:1,paddingLeft:1,height:r},b,pe.createElement(Vn,{padding:o?1:0},u.length>0&&pe.createElement(Xt,{selectedIndex:a,height:S,itemHeight:N},u.map(I)),pe.createElement(ee,{isSelected:i&&a===-1})))},Go=pe.memo(Ha);import{Box as zn,Text as Ja}from"ink";import Re,{useEffect as qn,useMemo as Zo}from"react";import be from"chalk";import Yo from"string-width";import{decodeTime as _a}from"ulid";var Xo=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"};var $a=(e,t)=>e+" ".repeat(Math.max(0,t-Yo(e))),Va=(e,t)=>" ".repeat(Math.max(0,t-Yo(e)))+e,Ka=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)})(),ja=e=>{switch(e.action){case"move.node":{let t=h.getNode(e.payload.parent),n=t?be.dim.bgBlack(` ${t.title} `):"unknown",r=e.payload.pos;if(!r)return`to ${n}`;switch(r.at){case"start":return`to ${n} ${be.dim("(to top of list)")}`;case"end":return`to ${n} ${be.dim("(to bottom of list)")}`;case"before":return`to ${n} ${be.dim("(up in list)")}`;case"after":return`to ${n} ${be.dim("(down in list)")}`}}case"tag.issue":{let t=C().tags[e.payload.tagId];return t?be.bgHex(oe(t.name))(` ${t.name} `):"unknown tag"}case"assign.issue":{let t=C().contributors[e.payload.contributor];return t?be.hex(oe(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""}},za=e=>{let t=Xo(_a(e));return be.gray(Va(t,8))},qa=12,Ga=e=>{let t=e.split(".")[1]??"unknown";return $a(`${t}`,qa)},Jo=e=>{let t=za(e.id),n=Ga(e.userId),r=Ka(e.action),o=ja(e),i=be.dim("\u203A"),a=[r,o].filter(Boolean).join(" ");return`${n} ${t} ${i} ${a}`};import{Box as Jt,Text as Xa}from"ink";import Se from"react";var Qo=({selectedIndex:e,parent:t,selected:n})=>{let{currentNode:r}=_(),{title:o}=t,i=T(t.id).map(a=>{let d=typeof a.props?.value=="string"?a.props.value:"";if(o==="Assignees")return h.getContributor(d)?.id;if(o==="Tags")return h.getTag(d)?.id}).filter(a=>!!a);return Se.createElement(Jt,{alignItems:"center",paddingTop:1},Se.createElement(Jt,{minWidth:12},Se.createElement(ee,{isSelected:n}),Se.createElement(Xa,{color:n?v.accent:v.secondary2},o,":")),Se.createElement(Jt,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((a,d)=>{let m=r.id===t.id&&d===e;return Se.createElement(Jt,{key:`${o}-${a}`,paddingRight:2,minHeight:1},Se.createElement(ee,{isSelected:m}),o==="Assignees"?Se.createElement(rt,{isSelected:m,id:a}):o==="Tags"?Se.createElement(ot,{isSelected:m,id:a}):null)})))};import{Box as Qt,Text as Kn}from"ink";import Ae,{useEffect as Ya}from"react";var jn=({id:e,label:t,text:n,height:r,selected:o,maxWidth:i})=>{let{selectedIndex:a,currentNode:d}=_(),m=N=>String(N).replace(/\r?\n/g,""),u=typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[];Ya(()=>{let N=[];return u.forEach((S,b)=>{let I=Y.text({id:`${b}`,name:`Line ${b+1}`,parentNodeId:e,props:{value:S},readonly:!0}),E=h.createNodeAtPosition(I);Ve(E)&&N.push(E.data.id)}),()=>N.forEach(h.deleteNode)},[e,n]);let f="\u2029",y=u.map((N,S)=>{let b=d.id===e&&a===S;return Ae.createElement(Qt,{key:`${e}-${S}`},Ae.createElement(Kn,{color:b?v.primary:v.secondary2,dimColor:!b},`${S+1} `.padStart(5,"\xA0")),Ae.createElement(Kn,{backgroundColor:b?"gray":""},m(N.length?Nt(N,i-10):f)))});return Ae.createElement(Qt,{flexDirection:"column",paddingTop:1},Ae.createElement(Qt,null,Ae.createElement(ee,{isSelected:o}),Ae.createElement(Kn,{color:o?v.accent:v.secondary2},t)),Ae.createElement(Qt,{flexDirection:"row",borderStyle:"round",borderColor:v.secondary,paddingLeft:1,paddingRight:1,marginLeft:1},Ae.createElement(Xt,{scrollByOne:!0,children:y,height:r-2,selectedIndex:a,itemHeight:1})))};var Qa=e=>`${e}::log`,ei=({ticket:e,height:t})=>{let{selectedIndex:n,currentNode:r}=_(),o=process.stdout.columns||120,i=Zo(()=>Qa(e.id),[e.id]),a=Zo(()=>[...e.log].reverse().map(Jo).join(`
27
- `),[e.log]);qn(()=>{if(h.getNode(i))return;let w={...Y.field(i,"Log",e.id,{value:a}),readonly:!0,childRenderAxis:"vertical"};return h.createNodeAtPosition(w),()=>{h.deleteNode(i)}},[i,e.id]),qn(()=>{let E=h.getNode(i);E&&E.props.value!==a&&h.updateNode({...E,props:{...E.props,value:a},childRenderAxis:"vertical",readonly:!0})},[i,a]);let d=r.id===e.id,m=r.id===i||r.parentNodeId===i;qn(()=>{m&&(n>=0||F.navigate({selectedIndex:0}))},[m,n]);let u=T(e.id);if(m){let E=h.getNode(i),k=t-3;return Re.createElement(zn,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},E?Re.createElement(jn,{id:E.id,label:"Event log",text:E.props.value??"",selected:!1,maxWidth:o,height:k}):null)}let f=u.reduce((E,w)=>w.title==="Assignees"||w.title==="Tags"||w.id===i?++E:E,0),y=2,N=f*1,b=t-3-N-y,I=(E,w)=>E.title==="Assignees"||E.title==="Tags"?Re.createElement(Qo,{key:E.id,parent:E,selected:w,selectedIndex:n}):E.id===i?Re.createElement(zn,{key:E.id,paddingTop:1},Re.createElement(ee,{isSelected:w}),Re.createElement(Ja,{backgroundColor:v.secondary,color:w?v.accent:v.primary}," History \u203A\u203A ")):Re.createElement(jn,{label:"Description (press e to edit)",key:E.id,id:E.id,text:E.props.value??"",selected:w,maxWidth:o,height:b});return Re.createElement(zn,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},u.map((E,w)=>I(E,d&&n===w)))};var ed=({swimlanes:e,currentNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:i,height:a,width:d})=>{let m=t.context,u=m===L.TICKET||m===L.FIELD_LIST||m===L.FIELD,f=m===L.BOARD||m===L.SWIMLANE,y=m===L.TICKET?t:r.find(E=>E.context===L.TICKET),N=Math.floor(d/3),S=Math.floor(d/Math.max(e.length,1)),b=Math.min(S,N),I=i==="dense";return Zt.createElement(Za,{flexDirection:"row",height:a},f&&e.map((E,w)=>{let k=t.id===E.id,ie=k?n:-1,le=t.context===L.BOARD&&n===w;return Zt.createElement(Go,{key:E.id,height:a,width:b,swimlane:E,isSelected:le,isDense:I,isFocused:k,listSelectedIndex:ie,mode:o})}),u&&y&&Zt.createElement(ei,{height:a,ticket:y}))},ti=Zt.memo(ed);var rd=({currentNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:i,width:a})=>{let{renderedChildrenIndex:d}=_(),m=n.find(({context:N})=>N==="BOARD"),y=i-1-3;return xt.createElement(td,{flexDirection:"row"},e.context==="WORKSPACE"?xt.createElement(Hn,null):m?xt.createElement(ti,{height:y,width:a,swimlanes:(d[m.id]??[]).filter(N=>N!==void 0&&Qn(N)),currentNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):xt.createElement(nd,null))},ni=xt.memo(rd);import{Box as yt,Text as ge}from"ink";import B from"react";var en=({isDone:e,command:t,value:n})=>B.createElement(yt,null,B.createElement(ge,{color:v.accent,dimColor:e},e?" \u2714 ":" "),B.createElement(ge,{dimColor:e},"Type "),B.createElement(ge,{backgroundColor:v.secondary,dimColor:e}," "+t+" "),n&&B.createElement(B.Fragment,null,B.createElement(ge,{dimColor:e}," "),B.createElement(ge,{color:v.secondary,dimColor:e},"<"+n+">")));function Gn({width:e,height:t,hasUserName:n,hasPreferredEditor:r,userName:o,preferredEditor:i}){let a=n&&r,d=n?r?null:":set:editor":":set:username";return B.createElement(yt,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:v.secondary,rowGap:1},B.createElement(ge,{color:v.accent,bold:!0},"Welcome! \u{1F539}"),B.createElement(ge,null,"Lets get you started - its a breeze."),B.createElement(ge,{color:v.secondary2},"And remember, you can always get help with"," ",B.createElement(ge,{color:v.accent},":help"),"."),!a&&B.createElement(ge,{color:v.secondary2},d===":set:username"?"First, choose your username.":"Nice. One more step."),B.createElement(yt,{flexDirection:"column"},n&&B.createElement(yt,{marginBottom:1},B.createElement(en,{isDone:!0,command:":set:username",value:o})),!n&&B.createElement(en,{isDone:!1,command:":set:username"}),n&&!r&&B.createElement(en,{isDone:!1,command:":set:editor"}),a&&B.createElement(yt,null,B.createElement(en,{isDone:!0,command:":set:editor",value:i}))))}var id=({width:e,height:t})=>P.createElement(ce,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:v.secondary,rowGap:1},P.createElement(Pe,{color:v.accent,bold:!0},"Initialize project"),P.createElement(Pe,null,`This folder is not an ${od.hex(v.accent)("epiq")} project yet.`),P.createElement(Pe,{color:v.primary},"To start tracking issues here, we need to initialize a new"," ",P.createElement(Pe,{color:v.primary,backgroundColor:v.secondary}," .epiq/ ")," ","directory in this repository."),P.createElement(ce,{marginTop:1,flexDirection:"column"},P.createElement(ce,null,P.createElement(Pe,{color:v.accent}," "),P.createElement(Pe,{color:v.primary},"Type "),P.createElement(Pe,{backgroundColor:v.secondary}," :init "))),P.createElement(ce,{marginTop:1},P.createElement(Pe,{color:v.secondary2},"(This will create the local epiq project files)")));function Xn({width:e,height:t}){let n=_(),r=n.filters;if(n.mode===p.HELP)return P.createElement(ce,{flexDirection:"column"},P.createElement(ko,{width:e}));let{isSetup:o,hasPreferredEditor:i,hasUserName:a,userName:d,preferredEditor:m}=St(),u=!o,f=o&&At();if(u)return P.createElement(ce,{flexDirection:"column"},P.createElement(ce,{flexDirection:"column"},P.createElement(zt,{hideBreadCrumb:!0,filters:r}),P.createElement(Gn,{height:t,width:e,hasUserName:a,hasPreferredEditor:i,userName:d??"",preferredEditor:m??""})),P.createElement(Kt,{width:e,mode:n.mode,availableHints:n.availableHints}));if(f)return P.createElement(ce,{flexDirection:"column"},P.createElement(ce,{flexDirection:"column"},P.createElement(zt,{hideBreadCrumb:!0,filters:r}),P.createElement(id,{height:t,width:e})),P.createElement(Kt,{width:e,mode:n.mode,availableHints:n.availableHints}));let y=et(C().breadCrumb??[],"BOARD");if(Ve(y)){let N=y.data.id,S=T(N).length,b=3,I=Math.floor(e/b),E=Math.floor(e/Math.max(S,1));e=Math.min(E,I)*Math.max(S,b)}return P.createElement(ce,{flexDirection:"column"},P.createElement(ce,{flexDirection:"column"},P.createElement(zt,{filters:r}),P.createElement(ni,{width:e,height:t,currentNode:n.currentNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:n.viewMode,mode:n.mode})),P.createElement(Kt,{width:e,mode:n.mode,availableHints:n.availableHints}))}import{Box as $e,Text as De}from"ink";import X,{useEffect as sd,useMemo as ad,useState as dd}from"react";var cd=["\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 ld(e,t,n){return Math.min(n,Math.max(t,e))}function md(e,t){return X.createElement(De,null,X.createElement(De,{color:t%2===0?"cyan":"blue",bold:!0},e.slice(0,14)),X.createElement(De,{color:t%2===0?"cyan":"blue",bold:!0},e.slice(14)))}function ud(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 Yn({durationMs:e=3e3,slogan:t="Never leave the command line"}){let n=Math.max(1,e),[r,o]=dd(0);sd(()=>{let m=Date.now(),u=setInterval(()=>{let f=Date.now()-m;if(f>=n){o(n),clearInterval(u);return}o(f)},33);return()=>clearInterval(u)},[n]);let i=ld(r/n,0,1),a=ad(()=>ud(i,28),[i]),d=`${Math.round(i*100)}%`;return X.createElement($e,{flexDirection:"column",alignItems:"center",justifyContent:"center",paddingX:4,paddingY:1},X.createElement($e,{flexDirection:"column",minWidth:42},X.createElement($e,{flexDirection:"column",marginBottom:1},cd.map((m,u)=>X.createElement($e,{key:u,justifyContent:"center"},md(m,u)))),X.createElement($e,{justifyContent:"center",marginBottom:1},X.createElement(De,{color:"gray"},t)),X.createElement($e,{justifyContent:"center",marginBottom:1},X.createElement(De,{color:"cyan"},a.slice(0,10)),X.createElement(De,{color:"blue"},a.slice(10,18)),X.createElement(De,{color:"magenta"},a.slice(18))),X.createElement($e,{justifyContent:"center",marginBottom:1},X.createElement(De,{color:"gray"},d))))}import pd from"readline";var tn,nn,fe,ri=async e=>{if(e.ctrl&&e.name==="c")return F.exit();let{actionIndex:t,mode:n}=C(),r=wr(e,n);if(!r)return;let o=t[n]?.[r];if(o?.action)try{await o.action(o,e)}catch(i){logger.error(i)}},gd=()=>async function(t,n){n.name!=="escape"&&(fe&&(clearTimeout(fe),fe=void 0),await ri(n))},fd=()=>async function(t){if(t.length===1&&t[0]===27){fe&&clearTimeout(fe),fe=setTimeout(()=>{ri({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),fe=void 0},25);return}fe&&(clearTimeout(fe),fe=void 0)};function oi(){tn&&process.stdin.removeListener("keypress",tn),nn&&process.stdin.removeListener("data",nn),tn=gd(),nn=fd(),pd.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",nn),process.stdin.on("keypress",tn)}import vt from"fs";import si from"path";import xd from"util";var ii=1e3,ai=(e=process.cwd())=>si.join(Je(e),ue(),"log","epiq.log");function yd(e=process.cwd()){if(!Ft)return;let t=ai(e);if(!vt.existsSync(t))return;let r=vt.readFileSync(t,"utf8").split(`
28
- `);if(r[r.length-1]===""&&r.pop(),r.length<=ii)return;let o=r.slice(-ii).join(`
26
+ `)):(sa(),c("State booted successfully",null))}import{Box as Sa}from"ink";import Bn from"react";import xt from"chalk";import{Box as Dn,Text as Po}from"ink";import ft,{useEffect as da,useMemo as ca,useState as la}from"react";var Do=xt.gray,ma=xt.inverse,ua=xt.inverse.gray,pa={hint:"",hints:[],overlap:0,remainder:""},Bo=({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}},ga=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=oe(t);return{bg:r=>xt.bgHex(n).black(r),bgCursor:r=>xt.bgHex(n).inverse.black(r)}}return mn(t)},fa=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=Bo({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}},Fo=()=>({value:q.value,cursorPosition:q.cursorPosition,commandIsPending:q.commandIsPending,autoCompletion:q.commandMeta.autoCompletion??pa,infoMessage:q.commandMeta.infoMessage,validationStatus:q.commandMeta.validity,command:q.commandMeta.command,inputString:q.commandMeta.inputString,modifier:q.commandMeta.modifier}),xa=(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,ko=({width:e})=>{let[t,n]=la(Fo());da(()=>{let y=()=>{let S=Fo();n(b=>xa(b,S)?b:S)},N=vr(y);return y(),()=>{N()}},[]);let{value:r,cursorPosition:o,infoMessage:i,commandIsPending:a,autoCompletion:d,command:m,modifier:u}=t,f=ca(()=>{let y=Math.max(0,Math.min(o,r.length)),N=Bo({value:r,command:m}),S=fa({value:r,command:m,modifier:u}),b=m?mn(m):null,I=ga({command:m,modifier:u}),E=(V,K)=>{let Be=N&&K>=N.start&&K<N.end,Ve=S&&K>=S.start&&K<S.end;return Be&&b?b.fg(V):Ve&&I?I.bg(V):V},w=(V,K)=>{let Be=N&&K>=N.start&&K<N.end,Ve=S&&K>=S.start&&K<S.end;return Be&&b?b.fgCursor(V):Ve&&I?I.bgCursor(V):ma(V)},O=r.slice(0,y),ie=r[y]??" ",le=y<r.length?r.slice(y+1):"",at=Array.from(O).map((V,K)=>E(V,K)).join(""),dt=w(ie,y),Fe=Array.from(le).map((V,K)=>E(V,y+1+K)).join("");if(d.hint){let V=d.hint[d.overlap]??ie;dt=ua(V),Fe=Do(d.remainder.slice(1)+le)}return Do(":")+at+dt+Fe},[r,o,d,m,u]);return ft.createElement(Dn,{flexDirection:"column",justifyContent:"flex-start"},ft.createElement(Dn,{flexDirection:"column",paddingX:1,borderColor:v.secondary,borderStyle:"round",width:e},ft.createElement(Dn,null,ft.createElement(Po,null,f),i&&ft.createElement(Po,{wrap:"truncate",color:a?v.red:v.secondary2},` ${i} `))))};import Oo from"chalk";import{Box as ya,Text as Fn}from"ink";import Kt,{useEffect as va,useState as Ca}from"react";var ha=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],Uo=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)}},Na=({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)}`},Ea=(e,t,n)=>{let r=Uo(e),o=Uo(t);return Na({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},Ia=(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 Ea(i,a,o)},ba=(e,t)=>e.length===t?e:e.length>t?e.slice(0,t):e.padEnd(t," "),Wo=({width:e,availableHints:t})=>{let{syncStatus:{status:n,msg:r}}=$(),[o,i]=Ca(0);va(()=>{if(n!=="syncing"){i(0);return}let E=setInterval(()=>{i(w=>w+1)},50);return()=>clearInterval(E)},[n]);let a=[],d=0;for(let E of t){let O=(a.length>0?" | ":"").length+E.length;if(d+O>e-4)break;a.push(E),d+=O}let m=n!="synced"?r??a.join(" | "):a.join(" | "),u=Math.max(0,e-2),f=n==="syncing"?Ia(ha,(Math.sin(o*.12)+1)/2):v.secondary,y=Oo.hex(f??"fff"),N=Oo.hex(v.secondary2),S=y(`\u256D${"\u2500".repeat(u)}\u256E`),b=y(`\u2570${"\u2500".repeat(u)}\u256F`),I=`${y("\u2502")}${N(ba(` ${m} `,u))}${y("\u2502")}`;return Kt.createElement(ya,{flexDirection:"column",width:e},Kt.createElement(Fn,null,S),Kt.createElement(Fn,null,I),Kt.createElement(Fn,null,b))};var jt=({width:e,mode:t,availableHints:n})=>{let r=$(),o=[],i=0;for(let a of n){let m=(o.length>0?" | ":"").length+a.length;if(i+m>e+2)break;o.push(a),i+=m}return Bn.createElement(Sa,null,t===p.COMMAND_LINE&&r.syncStatus.status!=="syncing"?Bn.createElement(ko,{width:e}):Bn.createElement(Wo,{width:e,mode:t,availableHints:n}))};import{Box as rt,Text as Ho}from"ink";import Me from"react";var _o=({width:e})=>{let t=[...C().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"]),Me.createElement(rt,{flexDirection:"column",marginTop:3,borderColor:v.secondary,borderStyle:"round",width:e,minHeight:19},Me.createElement(rt,{flexDirection:"column",width:e},C().mode===p.HELP?t.map(([n,r],o)=>Me.createElement(rt,{paddingLeft:1,key:o,flexDirection:"row"},Me.createElement(rt,{key:o,flexDirection:"row",paddingBottom:o?0:1},Me.createElement(rt,{width:20,justifyContent:"flex-end"},Me.createElement(Ho,{color:o?v.accent:v.secondary},n)),Me.createElement(rt,{flexGrow:1,width:40,paddingLeft:2},Me.createElement(Ho,{color:o?v.primary:v.secondary},r))))):null))};import jo from"chalk";import{Box as On,Text as qo}from"ink";import Ee from"react";import{Box as kn,Text as Pa}from"ink";import st from"react";import{Text as Aa}from"ink";import wa from"react";var Ta=e=>e.toLowerCase().trim(),Ma=(e,t=qe)=>{let n=Ta(e);return t[n]?t[n]:mt(n)},ot=({id:e,isSelected:t})=>{let n=h.getContributor(e);if(n)return wa.createElement(Aa,{underline:t,color:Ma(n.name)},"@"+n.name)};import{Text as La}from"ink";import Ra from"react";var it=({id:e,isSelected:t})=>{let n=h.getTag(e);if(n)return Ra.createElement(La,{underline:t,backgroundColor:oe(n.name),color:v.primary}," "+n.name+" ")};var Da=(e,t)=>e.length<=t?e:t<=1?"\u2026":e.slice(0,t-1)+"\u2026",$o=({width:e})=>{let{breadCrumb:t,currentNode:n,selectedIndex:r,viewMode:o}=C(),i=U(n.id)[r],a=ze(i?.id??n.id,"TICKET"),d=Ke(a)?a.data:void 0,m=d?.id?U(d.id):[],u=I=>{let E=m.find(w=>w.title===I);return E?U(E.id).map(w=>typeof w.props?.value=="string"?w.props.value:"").filter(w=>!!w):[]},f=u("Tags"),y=u("Assignees"),N=d?.parentNodeId?!dn(n.id,d?.parentNodeId)&&o==="dense":!1,S=t.map((I,E)=>{let w=E===t.length-1,O=U(I.id),ie=w?O?.[r]?.title:void 0;return`${E?" / ":""}${I.title??""}${ie?` \u25B8 ${ie}`:""}`}).join(""),b=Da(S,e);return st.createElement(kn,null,st.createElement(Pa,{color:v.secondary2},b),N?f.map(I=>st.createElement(kn,{key:I,paddingLeft:2},st.createElement(it,{id:I}))):null,N?y.map(I=>st.createElement(kn,{key:I,paddingLeft:2},st.createElement(ot,{id:I}))):null)};import{Box as Fa,Text as Vo}from"ink";import zt from"react";var Ba=({filters:e})=>zt.createElement(Fa,{columnGap:1},zt.createElement(Vo,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>zt.createElement(Vo,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),Ko=zt.memo(Ba);function qt({filters:e,hideBreadCrumb:t=!1}){let{userName:n,preferredEditor:r}=ae(),o=40,i=process.stdout.columns-o-8;return Ee.createElement(On,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},t?Ee.createElement(qo,null," "):Ee.createElement(On,{paddingLeft:1},e.length>0?Ee.createElement(Ko,{filters:e}):Ee.createElement($o,{width:i})),Ee.createElement(On,{columnGap:1,paddingRight:2,"max-width":o,overflow:"hidden",justifyContent:"flex-end"},Ee.createElement(zo,{icon:"@",value:n}),Ee.createElement(zo,{icon:"\u276F",value:r})))}function zo({icon:e,value:t}){return Ee.createElement(qo,null,jo.dim(e)+jo.hex(v.accent)(` ${t??"-"} `))}import{Box as od,Text as id}from"ink";import vt from"react";import{Box as Gt,Text as Un}from"ink";import Le from"react";import{Text as Go}from"ink";import Xo,{useEffect as ka,useState as Oa}from"react";var Yo={help:["\u25B8 ","\u25B8 ","\u25B8 "],default:["\u25B8 ","\u25B8 ","\u25B8 "],move:["\u2191 ","\u2192 ","\u2193 ","\u2190 "],"command-line":["\u276F ","\u276F ","\u276F "]},ee=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=$(),r=Yo[n]??Yo.default,[o,i]=Oa(r.length-1);return ka(()=>{if(!e)return;let a=setInterval(()=>{i(d=>(d+1)%r.length)},800);return()=>clearInterval(a)},[e,r]),e?Xo.createElement(Go,{color:v.accent,dimColor:o===1},r[o]):Xo.createElement(Go,null,t)};function Wn(){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 Le.createElement(Gt,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:v.secondary,width:i},Le.createElement(Gt,{padding:1,paddingTop:0,paddingBottom:0},Le.createElement(Un,null,"Select a board:")),Le.createElement(Gt,{padding:1,flexDirection:"column"},a.map((d,m)=>{let u=e.currentNode.context==="WORKSPACE"&&e.selectedIndex===m,y=T(d.id).flatMap(({id:N})=>U(N)).length;return Le.createElement(Gt,{key:d.id??m},Le.createElement(Un,{color:u?v.accent:v.secondary},Le.createElement(ee,{isSelected:u})),Le.createElement(Un,{color:u?v.accent:v.secondary},d.title," (",y," issues)",d.readonly?" \u{1F512}":""))})))}import{Box as nd}from"ink";import en from"react";import{Box as $n,Text as $a}from"ink";import pe from"react";import{Box as Hn,Text as Ua}from"ink";import Xt from"react";var Yt=({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)),d=Math.max(1,Math.floor(i/a)),m=Math.max(0,Math.min(n,e.length-1)),u=Math.max(0,e.length-d),f=o?Math.min(u,Math.max(0,m-d+1)):Math.min(u,Math.floor(m/d)*d),y=f+d,N=e.slice(f,y),S=e.length>d,b=i,I=S?Math.max(1,Math.floor(d/e.length*b)):b,E=Math.max(0,b-I),w=Math.max(1,e.length-d),O=S?Math.floor(f/w*E):0;return Xt.createElement(Hn,{flexDirection:"row",height:i,width:"100%"},Xt.createElement(Hn,{flexDirection:"column",flexGrow:1,height:i},N),Xt.createElement(Hn,{flexDirection:"column",width:1,height:b},Array.from({length:b}).map((ie,le)=>Xt.createElement(Ua,{key:le,color:S&&le>=O&&le<O+I?v.accent:v.secondary},S?"\u2502":" "))))};import{Box as Jt,Text as Wa}from"ink";import _e from"react";var Jo=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=It(Zn(t.title),r),i=T(t.id),a=u=>{let f=i.find(y=>y.title===u);return f?T(f.id).map(y=>typeof y.props?.value=="string"?y.props.value:"").filter(y=>!!y):[]},d=a("Tags").map(u=>h.getTag(u)).filter(u=>!!u),m=a("Assignees").map(u=>h.getContributor(u)).filter(u=>!!u);return _e.createElement(Jt,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?v.accent:v.secondary,justifyContent:"space-between"},_e.createElement(Jt,{borderBottom:!0},_e.createElement(Jt,{paddingLeft:1,flexDirection:"column"},_e.createElement(Wa,{color:v.primary},o))),_e.createElement(Jt,{flexDirection:"row",paddingLeft:1},d.map(u=>_e.createElement(it,{key:u.id,id:u.id})),m.map(u=>_e.createElement(ot,{key:u.id,id:u.id}))))};import Ha from"chalk";import{Box as yt,Text as _n}from"ink";import Ie from"react";var _a=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,Qo=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let i=T(t.id),a=I=>{let E=i.find(w=>w.title===I);return E?T(E.id).map(w=>typeof w.props?.value=="string"?w.props.value:"").filter(w=>!!w):[]},d=a("Tags").map(I=>h.getTag(I)).filter(I=>!!I),m=a("Assignees").map(I=>h.getContributor(I)).filter(I=>!!I),u=1,f=d.length*(1+u),y=m.length*(2+u),N=d.map(I=>Ie.createElement(yt,{key:I.id,paddingRight:u},Ie.createElement(_n,{color:oe(I.name)},"\u25A0"))),S=m.map(I=>Ie.createElement(yt,{key:I.id,paddingRight:u},Ie.createElement(_n,{color:mt(I.name)},"@"+I.name.at(0)))),b=n?v.accent:o===p.MOVE?v.secondary:v.primary;return Ie.createElement(yt,{borderBottom:!0,justifyContent:"space-between"},Ie.createElement(yt,null,Ie.createElement(ee,{isSelected:n,placeholder:Ha.dim.gray(r+1+" ")}),Ie.createElement(_n,{wrap:"truncate",color:b},_a(t.title,e-f-y-14))),Ie.createElement(yt,null,N,S))};var Va=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:i,listSelectedIndex:a,mode:d})=>{let{renderedChildrenIndex:m}=$(),u=m[e.id]??[],f=`${e.title} (${u.length})`,y=3,N=o?1:4,S=r-y-(o?2:1),b=pe.createElement($n,{borderStyle:"round",borderColor:v.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},pe.createElement(ee,{isSelected:t}),pe.createElement($a,{bold:!0,color:t?v.accent:v.primary},f," ",e.readonly?"\u{1F512}":"")),I=(E,w)=>{let O=i&&a===w;return o?pe.createElement(Qo,{key:E.id,index:w,width:n,ticket:E,isSelected:O,mode:d}):pe.createElement(Jo,{key:E.id,width:n,ticket:E,isSelected:O})};return pe.createElement($n,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?v.accent:v.secondary,paddingRight:1,paddingLeft:1,height:r},b,pe.createElement($n,{padding:o?1:0},u.length>0&&pe.createElement(Yt,{selectedIndex:a,height:S,itemHeight:N},u.map(I)),pe.createElement(ee,{isSelected:i&&a===-1})))},Zo=pe.memo(Va);import{Box as jn,Text as ed}from"ink";import Re,{useEffect as zn,useMemo as oi}from"react";import be from"chalk";import ti from"string-width";import{decodeTime as Ka}from"ulid";var ei=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"};var ja=(e,t)=>e+" ".repeat(Math.max(0,t-ti(e))),za=(e,t)=>" ".repeat(Math.max(0,t-ti(e)))+e,qa=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)})(),Ga=e=>{switch(e.action){case"move.node":{let t=h.getNode(e.payload.parent),n=t?be.dim.bgBlack(` ${t.title} `):"unknown",r=e.payload.pos;if(!r)return`to ${n}`;switch(r.at){case"start":return`to ${n} ${be.dim("(to top of list)")}`;case"end":return`to ${n} ${be.dim("(to bottom of list)")}`;case"before":return`to ${n} ${be.dim("(up in list)")}`;case"after":return`to ${n} ${be.dim("(down in list)")}`}}case"tag.issue":{let t=C().tags[e.payload.tagId];return t?be.bgHex(oe(t.name))(` ${t.name} `):"unknown tag"}case"assign.issue":{let t=C().contributors[e.payload.contributor];return t?be.hex(oe(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""}},Xa=e=>{let t=ei(Ka(e));return be.gray(za(t,8))},Ya=12,Ja=e=>{let t=e.split(".")[1]??"unknown";return ja(`${t}`,Ya)},ni=e=>{let t=Xa(e.id),n=Ja(e.userId),r=qa(e.action),o=Ga(e),i=be.dim("\u203A"),a=[r,o].filter(Boolean).join(" ");return`${n} ${t} ${i} ${a}`};import{Box as Qt,Text as Qa}from"ink";import Se from"react";var ri=({selectedIndex:e,parent:t,selected:n})=>{let{currentNode:r}=$(),{title:o}=t,i=T(t.id).map(a=>{let d=typeof a.props?.value=="string"?a.props.value:"";if(o==="Assignees")return h.getContributor(d)?.id;if(o==="Tags")return h.getTag(d)?.id}).filter(a=>!!a);return Se.createElement(Qt,{alignItems:"center",paddingTop:1},Se.createElement(Qt,{minWidth:12},Se.createElement(ee,{isSelected:n}),Se.createElement(Qa,{color:n?v.accent:v.secondary2},o,":")),Se.createElement(Qt,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((a,d)=>{let m=r.id===t.id&&d===e;return Se.createElement(Qt,{key:`${o}-${a}`,paddingRight:2,minHeight:1},Se.createElement(ee,{isSelected:m}),o==="Assignees"?Se.createElement(ot,{isSelected:m,id:a}):o==="Tags"?Se.createElement(it,{isSelected:m,id:a}):null)})))};import{Box as Zt,Text as Vn}from"ink";import Ae,{useEffect as Za}from"react";var Kn=({id:e,label:t,text:n,height:r,selected:o,maxWidth:i})=>{let{selectedIndex:a,currentNode:d}=$(),m=N=>String(N).replace(/\r?\n/g,""),u=typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[];Za(()=>{let N=[];return u.forEach((S,b)=>{let I=Y.text({id:`${b}`,name:`Line ${b+1}`,parentNodeId:e,props:{value:S},readonly:!0}),E=h.createNodeAtPosition(I);Ke(E)&&N.push(E.data.id)}),()=>N.forEach(h.deleteNode)},[e,n]);let f="\u2029",y=u.map((N,S)=>{let b=d.id===e&&a===S;return Ae.createElement(Zt,{key:`${e}-${S}`},Ae.createElement(Vn,{color:b?v.primary:v.secondary2,dimColor:!b},`${S+1} `.padStart(5,"\xA0")),Ae.createElement(Vn,{backgroundColor:b?"gray":""},m(N.length?It(N,i-10):f)))});return Ae.createElement(Zt,{flexDirection:"column",paddingTop:1},Ae.createElement(Zt,null,Ae.createElement(ee,{isSelected:o}),Ae.createElement(Vn,{color:o?v.accent:v.secondary2},t)),Ae.createElement(Zt,{flexDirection:"row",borderStyle:"round",borderColor:v.secondary,paddingLeft:1,paddingRight:1,marginLeft:1},Ae.createElement(Yt,{scrollByOne:!0,children:y,height:r-2,selectedIndex:a,itemHeight:1})))};var td=e=>`${e}::log`,ii=({ticket:e,height:t})=>{let{selectedIndex:n,currentNode:r}=$(),o=process.stdout.columns||120,i=oi(()=>td(e.id),[e.id]),a=oi(()=>[...e.log].reverse().map(ni).join(`
27
+ `),[e.log]);zn(()=>{if(h.getNode(i))return;let w={...Y.field(i,"Log",e.id,{value:a}),readonly:!0,childRenderAxis:"vertical"};return h.createNodeAtPosition(w),()=>{h.deleteNode(i)}},[i,e.id]),zn(()=>{let E=h.getNode(i);E&&E.props.value!==a&&h.updateNode({...E,props:{...E.props,value:a},childRenderAxis:"vertical",readonly:!0})},[i,a]);let d=r.id===e.id,m=r.id===i||r.parentNodeId===i;zn(()=>{m&&(n>=0||F.navigate({selectedIndex:0}))},[m,n]);let u=T(e.id);if(m){let E=h.getNode(i),O=t-3;return Re.createElement(jn,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},E?Re.createElement(Kn,{id:E.id,label:"Event log",text:E.props.value??"",selected:!1,maxWidth:o,height:O}):null)}let f=u.reduce((E,w)=>w.title==="Assignees"||w.title==="Tags"||w.id===i?++E:E,0),y=2,N=f*1,b=t-3-N-y,I=(E,w)=>E.title==="Assignees"||E.title==="Tags"?Re.createElement(ri,{key:E.id,parent:E,selected:w,selectedIndex:n}):E.id===i?Re.createElement(jn,{key:E.id,paddingTop:1},Re.createElement(ee,{isSelected:w}),Re.createElement(ed,{backgroundColor:v.secondary,color:w?v.accent:v.primary}," History \u203A\u203A ")):Re.createElement(Kn,{label:"Description (press e to edit)",key:E.id,id:E.id,text:E.props.value??"",selected:w,maxWidth:o,height:b});return Re.createElement(jn,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},u.map((E,w)=>I(E,d&&n===w)))};var rd=({swimlanes:e,currentNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:i,height:a,width:d})=>{let m=t.context,u=m===L.TICKET||m===L.FIELD_LIST||m===L.FIELD,f=m===L.BOARD||m===L.SWIMLANE,y=m===L.TICKET?t:r.find(E=>E.context===L.TICKET),N=Math.floor(d/3),S=Math.floor(d/Math.max(e.length,1)),b=Math.min(S,N),I=i==="dense";return en.createElement(nd,{flexDirection:"row",height:a},f&&e.map((E,w)=>{let O=t.id===E.id,ie=O?n:-1,le=t.context===L.BOARD&&n===w;return en.createElement(Zo,{key:E.id,height:a,width:b,swimlane:E,isSelected:le,isDense:I,isFocused:O,listSelectedIndex:ie,mode:o})}),u&&y&&en.createElement(ii,{height:a,ticket:y}))},si=en.memo(rd);var sd=({currentNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:i,width:a})=>{let{renderedChildrenIndex:d}=$(),m=n.find(({context:N})=>N==="BOARD"),y=i-1-3;return vt.createElement(od,{flexDirection:"row"},e.context==="WORKSPACE"?vt.createElement(Wn,null):m?vt.createElement(si,{height:y,width:a,swimlanes:(d[m.id]??[]).filter(N=>N!==void 0&&Jn(N)),currentNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):vt.createElement(id,null))},ai=vt.memo(sd);import{Box as Ct,Text as ge}from"ink";import k from"react";var tn=({isDone:e,command:t,value:n})=>k.createElement(Ct,null,k.createElement(ge,{color:v.accent,dimColor:e},e?" \u2714 ":" "),k.createElement(ge,{dimColor:e},"Type "),k.createElement(ge,{backgroundColor:v.secondary,dimColor:e}," "+t+" "),n&&k.createElement(k.Fragment,null,k.createElement(ge,{dimColor:e}," "),k.createElement(ge,{color:v.secondary,dimColor:e},"<"+n+">")));function qn({width:e,height:t,hasUserName:n,hasPreferredEditor:r,userName:o,preferredEditor:i}){let a=n&&r,d=n?r?null:":set:editor":":set:username";return k.createElement(Ct,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:v.secondary,rowGap:1},k.createElement(ge,{color:v.accent,bold:!0},"Welcome! \u{1F539}"),k.createElement(ge,null,"Lets get you started - its a breeze."),k.createElement(ge,{color:v.secondary2},"And remember, you can always get help with"," ",k.createElement(ge,{color:v.accent},":help"),"."),!a&&k.createElement(ge,{color:v.secondary2},d===":set:username"?"First, choose your username.":"Nice. One more step."),k.createElement(Ct,{flexDirection:"column"},n&&k.createElement(Ct,{marginBottom:1},k.createElement(tn,{isDone:!0,command:":set:username",value:o})),!n&&k.createElement(tn,{isDone:!1,command:":set:username"}),n&&!r&&k.createElement(tn,{isDone:!1,command:":set:editor"}),a&&k.createElement(Ct,null,k.createElement(tn,{isDone:!0,command:":set:editor",value:i}))))}var dd=({width:e,height:t})=>P.createElement(ce,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:v.secondary,rowGap:1},P.createElement(Pe,{color:v.accent,bold:!0},"Initialize project"),P.createElement(Pe,null,`This folder is not an ${ad.hex(v.accent)("epiq")} project yet.`),P.createElement(Pe,{color:v.primary},"To start tracking issues here, we need to initialize a new"," ",P.createElement(Pe,{color:v.primary,backgroundColor:v.secondary}," .epiq/ ")," ","directory in this repository."),P.createElement(ce,{marginTop:1,flexDirection:"column"},P.createElement(ce,null,P.createElement(Pe,{color:v.accent}," "),P.createElement(Pe,{color:v.primary},"Type "),P.createElement(Pe,{backgroundColor:v.secondary}," :init "))),P.createElement(ce,{marginTop:1},P.createElement(Pe,{color:v.secondary2},"(This will create the local epiq project files)")));function Gn({width:e,height:t}){let n=$(),r=n.filters;if(n.mode===p.HELP)return P.createElement(ce,{flexDirection:"column"},P.createElement(_o,{width:e}));let{isSetup:o,hasPreferredEditor:i,hasUserName:a,userName:d,preferredEditor:m}=wt(),u=!o,f=o&&Tt();if(u)return P.createElement(ce,{flexDirection:"column"},P.createElement(ce,{flexDirection:"column"},P.createElement(qt,{hideBreadCrumb:!0,filters:r}),P.createElement(qn,{height:t,width:e,hasUserName:a,hasPreferredEditor:i,userName:d??"",preferredEditor:m??""})),P.createElement(jt,{width:e,mode:n.mode,availableHints:n.availableHints}));if(f)return P.createElement(ce,{flexDirection:"column"},P.createElement(ce,{flexDirection:"column"},P.createElement(qt,{hideBreadCrumb:!0,filters:r}),P.createElement(dd,{height:t,width:e})),P.createElement(jt,{width:e,mode:n.mode,availableHints:n.availableHints}));let y=tt(C().breadCrumb??[],"BOARD");if(Ke(y)){let N=y.data.id,S=T(N).length,b=3,I=Math.floor(e/b),E=Math.floor(e/Math.max(S,1));e=Math.min(E,I)*Math.max(S,b)}return P.createElement(ce,{flexDirection:"column"},P.createElement(ce,{flexDirection:"column"},P.createElement(qt,{filters:r}),P.createElement(ai,{width:e,height:t,currentNode:n.currentNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:n.viewMode,mode:n.mode})),P.createElement(jt,{width:e,mode:n.mode,availableHints:n.availableHints}))}import{Box as $e,Text as De}from"ink";import X,{useEffect as cd,useMemo as ld,useState as md}from"react";var ud=["\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 pd(e,t,n){return Math.min(n,Math.max(t,e))}function gd(e,t){return X.createElement(De,null,X.createElement(De,{color:t%2===0?"cyan":"blue",bold:!0},e.slice(0,14)),X.createElement(De,{color:t%2===0?"cyan":"blue",bold:!0},e.slice(14)))}function fd(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 Xn({durationMs:e=3e3,slogan:t="Never leave the command line"}){let n=Math.max(1,e),[r,o]=md(0);cd(()=>{let m=Date.now(),u=setInterval(()=>{let f=Date.now()-m;if(f>=n){o(n),clearInterval(u);return}o(f)},33);return()=>clearInterval(u)},[n]);let i=pd(r/n,0,1),a=ld(()=>fd(i,28),[i]),d=`${Math.round(i*100)}%`;return X.createElement($e,{flexDirection:"column",alignItems:"center",justifyContent:"center",paddingX:4,paddingY:1},X.createElement($e,{flexDirection:"column",minWidth:42},X.createElement($e,{flexDirection:"column",marginBottom:1},ud.map((m,u)=>X.createElement($e,{key:u,justifyContent:"center"},gd(m,u)))),X.createElement($e,{justifyContent:"center",marginBottom:1},X.createElement(De,{color:"gray"},t)),X.createElement($e,{justifyContent:"center",marginBottom:1},X.createElement(De,{color:"cyan"},a.slice(0,10)),X.createElement(De,{color:"blue"},a.slice(10,18)),X.createElement(De,{color:"magenta"},a.slice(18))),X.createElement($e,{justifyContent:"center",marginBottom:1},X.createElement(De,{color:"gray"},d))))}import xd from"readline";var nn,rn,fe,di=async e=>{if(e.ctrl&&e.name==="c")return F.exit();let{actionIndex:t,mode:n}=C(),r=Ar(e,n);if(!r)return;let o=t[n]?.[r];if(o?.action)try{await o.action(o,e)}catch(i){logger.error(i)}},yd=()=>async function(t,n){n.name!=="escape"&&(fe&&(clearTimeout(fe),fe=void 0),await di(n))},vd=()=>async function(t){if(t.length===1&&t[0]===27){fe&&clearTimeout(fe),fe=setTimeout(()=>{di({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),fe=void 0},25);return}fe&&(clearTimeout(fe),fe=void 0)};function ci(){nn&&process.stdin.removeListener("keypress",nn),rn&&process.stdin.removeListener("data",rn),nn=yd(),rn=vd(),xd.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",rn),process.stdin.on("keypress",nn)}import ht from"fs";import mi from"path";import Cd from"util";var li=1e3,ui=(e=process.cwd())=>mi.join(Qe(e),ue(),"log","epiq.log");function hd(e=process.cwd()){if(!kt)return;let t=ui(e);if(!ht.existsSync(t))return;let r=ht.readFileSync(t,"utf8").split(`
28
+ `);if(r[r.length-1]===""&&r.pop(),r.length<=li)return;let o=r.slice(-li).join(`
29
29
  `)+`
30
- `;vt.writeFileSync(t,o,"utf8")}function Jn(e,t,n=!1,r=process.cwd()){if(!Ft)return;let o=ai(r),i=xd.format(...t),a=new Date,m=`[${n?a.toISOString().slice(11,19):a.toISOString()}] ${e} ${i}
31
- `;vt.mkdirSync(si.dirname(o),{recursive:!0}),vt.appendFileSync(o,m,"utf8"),yd(r)}var vd={info(...e){Jn("[Info]",e,!1)},debug(...e){Jn("->",e,!0)},error(...e){Jn("[Error]",[...e,new Error().stack],!1)}};globalThis.logger=vd;hd(`
30
+ `;ht.writeFileSync(t,o,"utf8")}function Yn(e,t,n=!1,r=process.cwd()){if(!kt)return;let o=ui(r),i=Cd.format(...t),a=new Date,m=`[${n?a.toISOString().slice(11,19):a.toISOString()}] ${e} ${i}
31
+ `;ht.mkdirSync(mi.dirname(o),{recursive:!0}),ht.appendFileSync(o,m,"utf8"),hd(r)}var Nd={info(...e){Yn("[Info]",e,!1)},debug(...e){Yn("->",e,!0)},error(...e){Yn("[Error]",[...e,new Error().stack],!1)}};globalThis.logger=Nd;Id(`
32
32
  View board in directory:
33
33
  $ epiq
34
34
 
35
35
  Init project in directory:
36
36
  $ epiq --init "Project Name"
37
- `,{importMeta:import.meta,flags:{init:{type:"string"}}});var Nd=2e3,Ed=600,ci=process.stdout.columns||120,li=process.stdout.rows||20,rn=null,Id=e=>new Promise(t=>setTimeout(t,e)),mi=e=>{if(!rn){rn=Cd(e);return}rn.rerender(e)},ui=()=>{mi(di.createElement(Xn,{width:ci,height:li}))},bd=e=>{mi(di.createElement(Yn,{durationMs:e}))},Sd=()=>{let e=Ur();if(l(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},Ad=e=>{let t=Ao(e);if(l(t))throw new Error(`Failed to boot state: ${t.message}`)};async function wd(){Jr();let e=Sd(),n=e.length===0?Nd:Ed;n>0&&bd(n);let r=Date.now();Ad(e);let o=Date.now()-r,i=Math.max(0,n-o);i>0&&await Id(i),ui(),oi()}process.stdout.on("resize",()=>{ci=process.stdout.columns||120,li=process.stdout.rows||20,rn&&ui()});(async()=>(console.clear(),await wd()))();
37
+ `,{importMeta:import.meta,flags:{init:{type:"string"}}});var bd=2e3,Sd=600,gi=process.stdout.columns||120,fi=process.stdout.rows||20,on=null,Ad=e=>new Promise(t=>setTimeout(t,e)),xi=e=>{if(!on){on=Ed(e);return}on.rerender(e)},yi=()=>{xi(pi.createElement(Gn,{width:gi,height:fi}))},wd=e=>{xi(pi.createElement(Xn,{durationMs:e}))},Td=()=>{let e=Or();if(l(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},Md=e=>{let t=Ro(e);if(l(t))throw new Error(`Failed to boot state: ${t.message}`)};async function Ld(){Yr();let e=Td(),n=e.length===0?bd:Sd;n>0&&wd(n);let r=Date.now();Md(e);let o=Date.now()-r,i=Math.max(0,n-o);i>0&&await Ad(i),yi(),ci()}process.stdout.on("resize",()=>{gi=process.stdout.columns||120,fi=process.stdout.rows||20,on&&yi()});(async()=>(console.clear(),await Ld()))();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "epiq",
3
- "version": "0.2.12",
3
+ "version": "0.2.13",
4
4
  "license": "UNLICENSED",
5
5
  "type": "module",
6
6
  "description": "EPIQ - CLI based issue tracker",