epiq 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -1,46 +1,46 @@
1
1
  #!/usr/bin/env node
2
- import{render as Pc}from"ink";import Dc from"meow";import ds from"react";import hc from"chalk";import{Box as fe,Text as He}from"ink";import O from"react";import dt from"chalk";import{monotonicFactory as xd,ulid as Se}from"ulid";import{useSyncExternalStore as gd}from"react";var P={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function $e(e){return e.context==="TICKET"}var Ur=e=>e.context==="SWIMLANE";var g={INIT:"init",HELP:"help",NEW:"new",TAG:"tag",MOVE:"move",PEEK:"peek",FILTER:"filter",ASSIGN:"assign",DELETE:"delete",RENAME:"rename",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",SET_DESCRIPTION:"edit",SET_EDITOR:"set:editor",SET_VIEW:"set:view",SET_USERNAME:"set:username",SYNC:"sync",NONE:""},Ne={None:"none",Invalid:"invalid",Valid:"valid"},ye={None:"none",Success:"success",Fail:"fail"},s=e=>({result:ye.Fail,message:e,data:null}),m=(e,t)=>({result:ye.Success,message:e,data:t}),Wr=()=>({result:ye.None,message:"No result",data:null}),c=e=>e.result==="fail",Fe=e=>e.result==="success";var f={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line"};function Pt(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var Dt=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",Pn=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var Hr=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},_r=(e,t)=>t?e.get(t)??[]:[];var $r=new WeakMap,ps=e=>{let t=$r.get(e);return t||(t=Hr(e),$r.set(e,t)),t};var Kr=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return _r(ps(e),r).filter(i=>Pt(r,i)>=n)};var Vr=({inputToMatch:e,lastWord:t},n)=>{if(t.endsWith(" "))return{hint:"",hints:[],overlap:0,remainder:""};let r=Kr({wordList:n,inputToMatch:e,overlapThreshold:1});return gs(t,r)},gs=(e,t)=>{let n=t[0]??"",r=Pt(e.toLowerCase(),n.toLowerCase()),o=n?n+" ":"",i=o.slice(r);return{hint:o,hints:t,overlap:r,remainder:i}};var jr=["vi","vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];var Je=24n,fs=Je*4n,Ft=(1n<<fs)-1n,ys=/^[0-9a-f]+$/;function zr(e){if(!e||!ys.test(e))throw new Error(`Invalid hex rank: ${e}`);return BigInt("0x"+e)}function kt(e,t=Je){if(e<0n)throw new Error("Negative rank not allowed");return e.toString(16).padStart(Number(t),"0")}function pt(e,t){if(!e&&!t)return kt(Ft/2n,Je);let n=e?zr(e):0n,r=t?zr(t):Ft;if(r<=n)return kt(Ft/2n,Je);let o=(n+r)/2n;return o===n||o===r?"":kt(o,Je)}function ue(){return kt(Ft/2n,Je)}var ee={workspace:(e,t)=>({id:e,title:t,rank:ue(),isDeleted:!1,props:{},context:P.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,r=!1)=>({id:e,title:t,rank:ue(),isDeleted:!1,props:{},context:P.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:r,log:[]}),swimlane:(e,t,n)=>({id:e,title:t,rank:ue(),isDeleted:!1,props:{},context:P.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:(e,t,n,r={},o="horizontal")=>({id:e,title:t,rank:ue(),isDeleted:!1,props:r,context:P.FIELD,childRenderAxis:o,parentNodeId:n,readonly:!1,log:[]}),ticket:(e,t,n)=>({id:e,title:t,rank:ue(),isDeleted:!1,props:{},context:P.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,props:r={},readonly:o=!0})=>({id:e,title:t,rank:ue(),isDeleted:!1,props:r,context:P.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:o,log:[]})};var _=e=>Object.values(h().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),Gr=(e,t)=>e.findIndex(n=>n.id===t),Dn=(e,t={at:"end"})=>{if(e.length===0)return m("Resolved rank",ue());switch(t.at){case"start":{let n=e[0];return n?m("Resolved rank",pt(void 0,n.rank)):s("Unable to resolve first sibling")}case"end":{let n=e[e.length-1];return n?m("Resolved rank",pt(n.rank,void 0)):s("Unable to resolve last sibling")}case"before":{let n=Gr(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?m("Resolved rank",pt(r?.rank,o.rank)):s("Sibling not found")}case"after":{let n=Gr(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?m("Resolved rank",pt(r.rank,o?.rank)):s("Sibling not found")}}};var Xe=(e,t)=>{let{nodes:n}=h(),r=n[e];if(!r)return s("Node not found");if(r.context===t)return m("Resolved ancestor node",r);let o=r.parentNodeId?n[r.parentNodeId]:void 0;for(;o;){if(o.context===t)return m("Resolved ancestor node",o);o=o.parentNodeId?n[o.parentNodeId]:void 0}return s(`No ancestor found for context: ${t}`)},kn=(e,t)=>{let{nodes:n}=h(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},Fn=(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"),N={deleteNode(e){ae(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},editValue(e,t){let{nodes:n}=h(),r=n[e];if(!r)return s("Edit target node not found");let o=Fn(r,"edit");if(o)return o;let i={...r,props:{...r.props,value:t}};return N.updateNode(i),m("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return s("Rename target node not found");let r=Fn(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),m("Renamed node",o)},getExistingTags(){let{tags:e}=h();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=h();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return _(e).find(n=>n.title===t)},moveNode({id:e,parentId:t,position:n={at:"end"}}){let{rootNodeId:r}=h(),o=this.getNode(e),i=this.getNode(t);if(!o)return s("Node not found");if(!i)return s("Target parent not found");if(r===e)return s("Cannot move root node");if(e===t)return s("Cannot move node into itself");let a=Fn(o,"move");if(a)return a;if(kn(t,e))return s("Cannot move node into its own descendant");let d=_(t).filter(p=>p.id!==e),l=Dn(d,n);if(c(l))return l;let u={...o,parentNodeId:t,rank:l.data};return this.updateNode(u),m("Moved node successfully",u)},tombstoneNode(e){let{nodes:t,currentNodeId:n,rootNodeId:r}=h(),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=l=>{let u=t[l];if(!(!u||i.has(l))){i.add(l);for(let p of _(u.id))a(p.id)}};a(e);let d={...structuredClone(t)};for(let l of i){if(!d[l])return s("Unable to locate node to delete");d[l]={...d[l],isDeleted:!0}}return n?(w({nodes:d}),m("Successfully tomb stoned",o)):s("Unable to delete undefined")},createContributor(e){let t=ae(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return c(t)?s("Unable to create contributor"):m("Created contributor",e)},assign(e,t,n){let r=N.getContributor(t),o=N.getNode(e);if(!o||!r)return s("Unable assign contributor to issue");let i=this.getFieldByTitle(o.id,"Assignees");if(!i)return s("Unable to locate assignees field");if(_(i.id).some(l=>l.props?.value===t))return s("Contributor already assigned");let d=this.createNodeAtPosition(ee.field(n,r.name,i.id,{value:t}));return c(d)?d:m("Assigned contributor",d.data)},createTag(e){let t=ae(n=>({...n,tags:{...n.tags,[e.id]:e}}));return c(t)?s("Could not create tag"):m("Tag created",e)},tag(e,t,n){let r=N.getTag(t),o=N.getNode(e);if(!r)return s("Unable to add tag, missing tag");if(!o)return s("Unable to add tag, missing target");let i=this.getFieldByTitle(o.id,"Tags");if(!i)return s("Unable to locate tags field");if(_(i.id).some(l=>l.props?.value===t))return s("Tag already assigned");let d=this.createNodeAtPosition(ee.field(n,r.name,i.id,{value:t}));return c(d)?d:m("Tag added",d.data)},createNodeAtPosition(e,t={at:"end"}){if(!e.parentNodeId){let i={...e,rank:ue()};return this.createNode(i),m("Created node",i)}let n=_(e.parentNodeId),r=Dn(n,t);if(c(r))return r;let o={...e,rank:r.data};return this.createNode(o),m("Created node",o)},createNode(e){let t=ae(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return c(t)?s("Unable to create node"):m("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return s("Failed to locate node");let n={...t,readonly:!0},r=ae(o=>({...o,nodes:{...o.nodes,[e]:n}}));return c(r)?s(r.message):m("Locked node",n)},updateNode(e){let t=ae(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return c(t)?t:m("Updated node",e)},getContributor(e){return h().contributors[e]},getTag(e){return h().tags[e]},getNode(e){return h().nodes[e]},getSiblings:e=>Object.values(h().nodes).filter(t=>!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank))};var Ot={preferredEditor:null,userName:null,userId:null},pe=()=>Ot,gt=e=>(Ot={...Ot,...e},Ot);var Bt=()=>{let e=pe(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim();return{isSetup:n&&t,hasPreferredEditor:n,hasUserName:t,userName:e.userName,preferredEditor:e.preferredEditor}},qr=()=>!Ke();var q={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"},E={accent:q.cyan,accent2:q.magenta,primary:q.white,secondary:q.grayDark,secondary2:q.grayLight,gray:q.gray,green:q.green,yellow:q.yellow,red:q.red};var v={red:q.red,yellow:q.yellow,green:q.green,blue:q.blue,magenta:q.magenta,cyan:q.cyan},Qe={urgent:v.red,critical:v.red,important:v.red,blocker:v.red,asap:v.red,immediate:v.red,fail:v.red,failure:v.red,broken:v.red,bug:v.red,error:v.red,incident:v.red,outage:v.red,production:v.red,crash:v.red,security:v.red,warning:v.yellow,warn:v.yellow,risky:v.yellow,risk:v.yellow,attention:v.yellow,pending:v.yellow,review:v.yellow,"needs-review":v.yellow,qa:v.yellow,testing:v.yellow,test:v.yellow,validate:v.yellow,verification:v.yellow,staging:v.yellow,check:v.yellow,"follow-up":v.yellow,followup:v.yellow,waiting:v.yellow,blocked:v.yellow,hold:v.yellow,done:v.green,complete:v.green,completed:v.green,success:v.green,ok:v.green,stable:v.green,resolved:v.green,fixed:v.green,closed:v.green,merged:v.green,released:v.green,deployed:v.green,approved:v.green,verified:v.green,working:v.green,healthy:v.green,pass:v.green,passing:v.green,info:v.blue,information:v.blue,note:v.blue,docs:v.blue,documentation:v.blue,doc:v.blue,guide:v.blue,help:v.blue,explanation:v.blue,detail:v.blue,details:v.blue,context:v.blue,design:v.blue,discussion:v.blue,proposal:v.blue,idea:v.blue,feature:v.magenta,enhancement:v.magenta,improvement:v.magenta,refactor:v.magenta,refactoring:v.magenta,cleanup:v.magenta,optimize:v.magenta,optimization:v.magenta,perf:v.magenta,performance:v.magenta,upgrade:v.magenta,migration:v.magenta,modernize:v.magenta,debt:v.magenta,todo:v.cyan,next:v.cyan,planned:v.cyan,plan:v.cyan,future:v.cyan,backlog:v.cyan,investigate:v.cyan,explore:v.cyan,prototype:v.cyan};var xs=/^(\d+)(h|d|w|mo|y)$/,vs=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,hs=({year:e,month:t,day:n,hour:r=0,minute:o=0})=>{let i=new Date(e,t-1,n,r,o);return i.getFullYear()===e&&i.getMonth()===t-1&&i.getDate()===n&&i.getHours()===r&&i.getMinutes()===o},Es=(e,t=new Date)=>{let n=e.match(xs);if(!n)return null;let[,r,o]=n,i=Number(r);if(!Number.isInteger(i)||i<=0)return null;let a=new Date(t);switch(o){case"h":return a.setHours(a.getHours()-i),a;case"d":return a.setDate(a.getDate()-i),a;case"w":return a.setDate(a.getDate()-i*7),a;case"mo":return a.setMonth(a.getMonth()-i),a;case"y":return a.setFullYear(a.getFullYear()-i),a;default:return null}},Cs=e=>{let t=e.match(vs);if(!t)return null;let[,n,r,o,i,a]=t,d=Number(n),l=Number(r),u=Number(o),p=i?Number(i):0,y=a?Number(a):0;return hs({year:d,month:l,day:u,hour:p,minute:y})?new Date(d,l-1,u,p,y):null},Ut=e=>{let t=e.trim().toLowerCase();return Es(t)??Cs(t)},Yr=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Ns=[{unit:"h",from:1,to:24},{unit:"d",from:1,to:7},{unit:"w",from:1,to:52},{unit:"mo",from:1,to:12},{unit:"y",from:1,to:5}],Jr=(e=Ns)=>{let t=[];for(let{unit:n,from:r,to:o}of e)for(let i=r;i<=o;i++)t.push(`${i}${n}`);return t};var bs=["BOARD","TICKET","SWIMLANE"],z=e=>{let{currentNode:t,readOnly:n,selectedNode:r}=h(),o=Bt().isSetup,i=t.context,a=r?.context,d=[g.SYNC,g.HELP,g.SET_VIEW,g.SET_EDITOR,g.SET_USERNAME],l=[g.NEW,g.RENAME,g.DELETE],u=[g.TAG,g.ASSIGN,g.CLOSE_ISSUE,g.RE_OPEN_ISSUE,g.SET_DESCRIPTION],p=[g.FILTER,g.PEEK],y={WORKSPACE:[...d,...l],BOARD:[...p,...d,...l],SWIMLANE:[...p,...d,...l],TICKET:[...d,...l,...u],FIELD:[...d,...u],FIELD_LIST:[...d,...u],TEXT:[...d]},C=a&&bs.includes(a),b=[...y[i||"WORKSPACE"]].filter(A=>[g.RENAME,g.DELETE,g.MOVE].includes(A)?C:!0),I={[g.PEEK]:[...Jr(),"now","prev","next"],[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]:[...jr,"vim"],[g.TAG]:[...new Set([...Object.keys(Qe),...N.getExistingTags()])],[g.ASSIGN]:N.getExistingAssignees(),[g.HELP]:[],[g.RENAME]:[],[g.NEW]:i==="TICKET"||i==="FIELD"||i==="FIELD_LIST"?["issue","swimlane","board"]:i==="SWIMLANE"?["issue","swimlane","board"]:i==="BOARD"?["issue","swimlane","board"]:["board"],[g.NONE]:b};return o?qr()?n&&(I={[g.NONE]:[g.HELP,g.PEEK],[g.HELP]:I[g.HELP],[g.PEEK]:I[g.PEEK]}):I={[g.NONE]:[g.HELP,g.INIT],[g.HELP]:I[g.HELP],[g.INIT]:I[g.INIT]}:I={[g.NONE]:[g.HELP,g.SET_EDITOR,g.SET_USERNAME],[g.HELP]:I[g.HELP],[g.SET_EDITOR]:I[g.SET_EDITOR],[g.SET_USERNAME]:I[g.SET_USERNAME]},I[e]??[]};import _t from"chalk";import{decodeTime as Xr}from"ulid";var Qr=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"},Zr=e=>{let t=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())} ${t(e.getHours())}:${t(e.getMinutes())}`},Wt=e=>{try{return m("Decoded date",new Date(Xr(e)))}catch(t){return s("Decoding failed + "+t.message)}},On=e=>{if(!e?.id)return null;try{return Xr(e.id)}catch{return null}};var be=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?m("Found node",n):s("Unable to find node in breadcrumb")};import Ze from"chalk";var Un={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Is=(e,t,n)=>Math.max(t,Math.min(n,e)),Bn=(e,t,n)=>e+(t-e)*n,eo=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Ss=(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)),l=0,u=0,p=0;a>=0&&a<1?(l=i,u=d):a>=1&&a<2?(l=d,u=i):a>=2&&a<3?(u=i,p=d):a>=3&&a<4?(u=d,p=i):a>=4&&a<5?(l=d,p=i):(l=i,p=d);let y=o-i/2;return[Math.round((l+y)*255),Math.round((u+y)*255),Math.round((p+y)*255)]},As=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,Ts=(e,t,n)=>[Math.round(Bn(e[0],t[0],n)),Math.round(Bn(e[1],t[1],n)),Math.round(Bn(e[2],t[2],n))],ft=e=>{let n=eo(e)%360,r=Ss(n,Un.stringColor.saturation,Un.stringColor.lightness);return As(r)},ws=e=>{let t=Un.gradient.stops,n=Is(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 Ts(t[i],t[i+1],a)},Ht=e=>eo(e.toLowerCase().trim())/4294967295,to=e=>{let t=Ht(e);return ws(t)},Ms=e=>{let[t,n,r]=to(e);return{normal:o=>Ze.bgRgb(t,n,r).black(o),cursor:o=>Ze.bgRgb(t,n,r).white.bold(o)}},Wn=e=>{let[t,n,r]=to(e);return{fg:o=>Ze.rgb(t,n,r)(o),fgCursor:o=>Ze.rgb(t,n,r).inverse(o),bg:o=>Ze.bgRgb(t,n,r).black(o),bgCursor:o=>Ze.bgRgb(t,n,r).white.bold(o)}},Hn=e=>Ms(e).normal(` ${e} `),me=(e,t=Qe)=>{let r=(o=>o.toLowerCase().trim())(e);return r&&t[r]?t[r]:ft(r)};var Rs=["BOARD","TICKET","SWIMLANE"],_n=()=>{let e=h().selectedNode;return e?.context?Rs.includes(e?.context)?V():j({message:"Command not available in this context",completionWordList:[]}):j({message:"Missing target context",completionWordList:[]})},de="<ENTER> to confirm",V=(e="",t=[])=>({message:e,validity:Ne.Valid,completionWordList:t}),j=({message:e,completionWordList:t})=>({validity:Ne.Invalid,message:e,completionWordList:t}),yt=e=>e.length===0,ke=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:i=1})=>{let l=[...t.filter(Boolean).filter(p=>p.startsWith(o.trim()))].sort((p,y)=>Ht(p)-Ht(y)).slice(0,r).map(Hn),u=l.length>i?l.join(" "):"";return u?`${e}${u}${n}`:""},$n=({modifier:e})=>{let t="confirm";return e===t?V(de):j({message:yt(e)?`if you are certain, enter ${Hn(t)}`:"",completionWordList:[t]})},Ls=({list:e,hint:t})=>({modifier:n})=>e.includes(n)?V(de):j({message:yt(n)?t:"",completionWordList:[]}),Ps=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?j({message:n,completionWordList:[]}):V():j({message:yt(r)?t:"",completionWordList:[]}),Kn=({hint:e})=>({modifier:t,inputString:n})=>yt(t)&&yt(n)?j({message:e,completionWordList:[]}):V(de),Ds={[g.PEEK]:e=>{let t=e.modifier;if(t==="now")return V(de);let n={message:"historical state from: '1h', '2d', '23h', '1mo', '2y', 'previous', 'next' or full date as YYYY-MM-DD",completionWordList:[]};if(t==="prev"||t==="next")return V(de);let r=Ut(t);if(!t||!r)return j(n);let o=be(h().breadCrumb,"BOARD");if(c(o))return j({message:"Command is not applicable in this context",completionWordList:[]});let i=Wt(o.data.id);return c(i)?j({message:"Unable to peek: board id is not a valid ULID",completionWordList:[]}):Yr({date:r,horizonDate:i.data})?V(de):j({message:_t.red(`nothing to peek before ${i.data.toISOString().slice(0,16).replace("T"," ")}`),completionWordList:[]})},[g.INIT]:()=>V(de),[g.FILTER]:e=>{if(e.modifier==="clear")return V();let t=a=>z(g.FILTER).includes(a);if(!e.modifier||!t(e.modifier??""))return j({message:ke({wordList:z(g.FILTER),inputString:e.inputString}),completionWordList:z(g.FILTER)});let r=Object.values(h().tags).map(a=>a.name),o=Object.values(h().contributors).map(a=>a.name),i=e.modifier==="tag"?r:e.modifier==="assignee"?o:[];return e.inputString?i.length&&!i.includes(e.inputString.trim()??"")?j({message:ke({prefix:`existing ${e.modifier}s... `,wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i}):V():j({message:ke({prefix:"one of... ",wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i})},[g.NONE]:e=>e.command?V():j({message:ke({prefix:"commands... ",wordList:z(g.NONE),inputString:e.inputString,minLengthForHints:0}),completionWordList:[]}),[g.NEW]:e=>Ps({list:z(g.NEW),hint:ke({wordList:z(g.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[g.SET_DESCRIPTION]:()=>V(de),[g.HELP]:()=>V(de),[g.RENAME]:()=>{let e=_n();return e.validity==="invalid"?e:V(de)},[g.DELETE]:e=>{let t=_n();return t.validity==="invalid"?t:$n(e)},[g.CLOSE_ISSUE]:e=>$n(e),[g.RE_OPEN_ISSUE]:e=>$n(e),[g.MOVE]:e=>{let t=_n();return t.validity==="invalid"?t:Kn({hint:ke({prefix:"hey hacker! These commands are blocked for you... ",wordList:z(g.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[g.TAG]:e=>{let t=N.getExistingTags().map(n=>` ${_t.bgHex(me(n))(" "+n+" ")} `).slice(0,10);return Kn({hint:"tag name like... "+t.join("")})(e)},[g.ASSIGN]:e=>{let t=N.getExistingAssignees().map(n=>` ${_t.bgHex(me(n))(" "+n+" ")} `).slice(0,10);return Kn({hint:"assign to... "+t.join("")})(e)},[g.SET_EDITOR]:e=>{logger.debug(`Validating command: ${e.command} ${e.modifier} ${e.inputString}`);let t=z(g.SET_EDITOR);return e.modifier?V(de):j({message:ke({wordList:t,inputString:e.inputString}),completionWordList:[]})},[g.SET_USERNAME]:e=>e.inputString?V():j({message:`Enter a username. Saved in ${_t.bgBlack("~/.epiq/")}`,completionWordList:[]}),[g.SET_VIEW]:e=>Ls({list:z(g.SET_VIEW),hint:ke({wordList:z(g.SET_VIEW),noOfHints:3,inputString:e.inputString})})(e),[g.SYNC]:()=>V(de)},no=Object.fromEntries(Object.entries(Ds).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var ro=["frontend","backend","infrastructure","architecture","integration","configuration","implementation","application","deployment","environment","framework","platform","service","component","module","gateway","pipeline","containerization","orchestrator","exception","incident","defect","regression","degradation","malfunction","instability","intermittent","reproducibility","reproduction","investigation","triage","workaround","mitigation","remediation","optimization","stabilization","refinement","failure","outage","blocking","criticality","severity","escalation","diagnostics","analysis","resolution","corruption","inconsistency","validation","verification","authorization","authentication","confidentiality","availability","accessibility","reliability","compliance","governance","encryption","decryption","integrity","auditing","traceability","accountability","protection","privileges","permissions","dependency","orchestration","provisioning","synchronization","compatibility","incompatibility","interoperability","observability","instrumentation","telemetry","loadbalancing","discovery","registration","scheduling","coordination","distribution","isolation","virtualization","serialization","deserialization","initialization","instantiation","propagation","aggregation","consolidation","normalization","standardization","transformation","reconciliation","correlation","processing","indexing","partitioning","enrichment","validation","filtering","streaming","batching","concurrency","parallelism","contention","deadlock","throttling","ratelimiting","backpressure","fragmentation","saturation","exhaustion","partitioning","replication","redundancy","failover","deprecation","obsolescence","starvation","overload","underutilization","latency","throughput","refactoring","modularization","encapsulation","abstraction","extensibility","configurability","maintainability","recoverability","sustainability","readability","testability","debuggability","reusability","simplicity","consistency","performance","functionality","requirement","recommendation","improvement","enhancement","clarification","documentation","description","acceptance","criteria","estimation","prioritization","dependency","deliverable","milestone","iteration"];var L={Init:"init",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",Peek:"peek",SetView:"set-view",SetEditor:"set-editor",SetUserName:"set-user-name",NewItem:"add-new-item",TagTicket:"ticket-tag",AssignUserToTicket:"ticket-assign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Sync:"sync"};var oo=e=>Object.values(g).includes(e),io=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:i}=e,{message:a,validity:d,completionWordList:l}=no[n].validate(n,r,i),u=o==="command"?Object.values(g):n&&e.target==="modifier"?z(n):ro;return{validity:d,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:a??"",autoCompletion:t?Vr(e,[...l,...u]):{hint:"",hints:[],remainder:"",overlap:0}}};var so=e=>{let t=e.trimStart(),n=ks(t),r=(n[0]??"").trimStart().trimEnd(),o=(n[1]??"").trimStart().trimEnd(),i=Os(e),a=oo(r)?r:null,d=a!==null,l=r!=="",u=e.endsWith(" "),p=a?z(a)??[]:[],y=a&&p.includes(o)?o:"",C="word";n.length<=1?C="command":n.length===2&&(C="modifier");let b=Fs(t,a,y);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:i,hasCommand:l,command:a,isCommandKeyword:d,isLastWordCompleted:u,modifier:y,target:C,inputToMatch:i,inputString:b}},Fs=(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},ks=e=>e?e.split(/\s+/):[],Os=e=>e.trimEnd().split(/\s+/).at(-1)??"";var ao=" ",Y={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:Ne.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},Vn=new Set,co=()=>{for(let e of Vn)e()},lo=e=>(Vn.add(e),()=>Vn.delete(e)),Ie=e=>{let n=e(Y),r=so(n.value),o=n.cursorPosition===n.value.length;Y={...n,commandMeta:io(r,o)},co()},xt=({message:e,result:t})=>{let n=structuredClone(Y);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,Y=n,co(),m(e,null)},jn=e=>{Ie(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},zn=e=>{Ie(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&n[o-1]===" ";)o--;for(;o>0&&n[o-1]!==" ";)o--}else{for(;o<n.length&&n[o]!==" ";)o++;for(;o<n.length&&n[o]===" ";)o++}return{...t,cursorPosition:o}})},mo=()=>{Ie(e=>{let t=e.value.slice(e.cursorPosition),n=Math.max(0,e.cursorPosition-1);return{...e,value:e.value.slice(0,n)+t,cursorPosition:n,commandIsPending:!1}})},uo=()=>{Ie(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&t[r-1]===" ";)r--;for(;r>0&&t[r-1]!==" ";)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},$=e=>{Ie(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),r=t.value.slice(0,n),o=t.value.slice(n),i=e(r,t.commandMeta.autoCompletion),a=i+o,d=Math.max(0,Math.min(i.length,a.length));return{...t,value:a,cursorPosition:d,commandIsPending:!1}})},po=()=>{Ie(e=>({...e,commandIsPending:!0}))},go=({addToHistory:e=!0})=>{Ie(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),Bs()},fo=()=>{Ie(e=>{let t=Math.min(e.commandHistoryIndex+1,e.commandHistory.length-1),n=e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},yo=()=>{Ie(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},Bs=()=>$(()=>""),ge=()=>Y,$t=()=>{let[e,...t]=Y.value.split(ao);return t.join(ao).trim()};var Us=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",Ws=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",Hs=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",xo=(e,t)=>{if(Ws(e,e.sequence))return x.MoveCursorLeftOfWord;if(Hs(e,e.sequence))return x.MoveCursorRightOfWord;if(Us(e,e.sequence))return x.EraseInputWord;switch(e.name){case"tab":return x.AutoCompleteCommand;case"up":return x.GetLastCommandFromHistory;case"down":return x.GetNextCommandFromHistory;case"left":return x.MoveCursorLeft;case"right":return x.MoveCursorRight;case"return":return x.Confirm;case"backspace":return t?x.EraseInput:x.ExitCommandLine;case"escape":return x.ExitCommandLine;default:return x.CaptureInput}};var x={Sync:"sync",NavPreviousItem:"navPreviousItem",NavNextItem:"navNextItem",NavToPreviousContainer:"navToPreviousContainer",NavToNextContainer:"navToNextContainer",MovePreviousItem:"movePreviousItem",MoveNextItem:"moveNextItem",MoveToPreviousContainer:"moveToPreviousContainer",MoveToNextContainer:"moveToNextContainer",Confirm:"confirm",Exit:"exit",ViewHelp:"viewHelp",HideHelp:"hideHelp",InitMove:"initMove",ConfirmMove:"confirmMove",Delete:"Delete",InitCommandLine:"initCommandLine",ExitCommandLine:"exitCommandLine",CaptureInput:"captureInput",EraseInput:"eraseInput",AddItem:"addItem",GetLastCommandFromHistory:"getLastCommandFromHistory",GetNextCommandFromHistory:"getNextCommandFromHistory",AutoCompleteCommand:"autoCompleteCommand",MoveCursorLeft:"MoveCursorLeft",MoveCursorRight:"MoveCursorRight",MoveCursorLeftOfWord:"MoveCursorLeftOfWord",MoveCursorRightOfWord:"MoveCursorRightOfWord",EraseInputWord:"EraseInputWord",None:"None",Edit:"edit",SetViewDense:"SetViewDense",SetViewWide:"SetViewWide"};function _s(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 $s(e,t,n){let r=h().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 vo(e,t){let n=ge();if(e.sequence===":"&&n.value==="")return x.InitCommandLine;if(t===f.MOVE)switch(e.name){case"m":case"return":return x.ConfirmMove}if(t===f.COMMAND_LINE)return xo(e,n.value);let r=_s(e);if(r){let o=t===f.MOVE?{prevItem:x.MovePreviousItem,nextItem:x.MoveNextItem,prevContainer:x.MoveToPreviousContainer,nextContainer:x.MoveToNextContainer}:{prevItem:x.NavPreviousItem,nextItem:x.NavNextItem,prevContainer:x.NavToPreviousContainer,nextContainer:x.NavToNextContainer};return $s(h().currentNode.childRenderAxis,r,o)}if(e.ctrl&&e.name==="c")return x.Exit;switch(e.name){case"e":return x.Edit;case"n":return x.AddItem;case"m":return x.InitMove;case"d":return x.Delete;case"return":return x.Confirm;case"space":return x.Confirm;case"v":return h().viewMode==="wide"?x.SetViewDense:x.SetViewWide;case"q":case"escape":return x.Exit;case"s":return x.Sync;default:return null}}var ho=e=>{let{context:t}=h()?.currentNode;if(!t)return L.None;switch(e){case g.INIT:return L.Init;case g.DELETE:return L.Delete;case g.SET_DESCRIPTION:return L.Edit;case g.HELP:return L.ViewHelp;case g.RE_OPEN_ISSUE:return L.ReopenIssue;case g.CLOSE_ISSUE:return L.CloseIssue;case g.TAG:return L.TagTicket;case g.ASSIGN:return L.AssignUserToTicket;case g.RENAME:return L.Rename;case g.NEW:return L.NewItem;case g.FILTER:return L.Filter;case g.MOVE:return L.Move;case g.PEEK:return L.Peek;case g.SET_USERNAME:return L.SetUserName;case g.SET_EDITOR:return L.SetEditor;case g.SET_VIEW:return L.SetView;case g.SYNC:return L.Sync;default:return L.None}};import{ulid as K}from"ulid";import{spawnSync as Js}from"node:child_process";import Xs from"node:os";import bo from"node:path";import{ulid as Qs}from"ulid";import{accessSync as Ks,copyFileSync as Vs,existsSync as Kt,mkdirSync as Eo,readdirSync as Co,readFileSync as js,renameSync as zs,rmSync as Gs,statSync as No,unlinkSync as qs,writeFileSync as Ys}from"node:fs";import et from"node:path";var ce={writeToFile:(e,t)=>{try{let n=et.dirname(e);Kt(n)||Eo(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);Ys(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return js(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=ce.readFile(e);return t===null?null:JSON.parse(t)}catch(t){return logger.error(`Failed to read JSON at ${e}:`,t),null}},dirExists:e=>{try{return Kt(e)&&No(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Ks(e),!0}catch{return!1}},mkDir:e=>Eo(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=et.parse(t);for(;;){let r=et.join(t,e);try{if(Kt(r)&&No(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=et.dirname(t)}return null},readFirstJSON(e){try{if(!ce.dirExists(e))return null;let t=Co(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=et.join(e,t);return ce.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return ce.dirExists(e)?Co(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{qs(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Gs(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(et.dirname(t)),!n?.overwrite&&Kt(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{zs(e,t)}catch(r){if(r?.code==="EXDEV"){Vs(e,t),this.rmFile(e);return}throw r}}};function Zs(){let{preferredEditor:e}=pe(),t=[e,process.env.VISUAL,process.env.EDITOR,"vim","vi","nano"].filter(n=>!!n?.trim());return[...new Set(t)]}function ea(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function Io(e){let t=bo.join(Xs.tmpdir(),"epiq");ce.mkDir(t);let n=bo.join(t,Qs());ce.writeToFile(n,e??"");let r=Zs();for(let o of r){let i=ea(o,n),a=Js(i,{stdio:"inherit",shell:!0});if(!a.error&&a.status===0){let d=ce.readFile(n);if(d==null)return s("Unable to read edited file");let l=d.replace(/\r?\n$/,"");return m("Successfully edited",l)}}return s("Unable to open editor")}import{monotonicFactory as ta,ulid as Vt}from"ulid";var jt=ta(),So=({name:e,parent:t,user:{userId:n,userName:r}})=>{let o=jt(),i=jt(),a=jt(),d=jt();return[{id:Vt(),userId:n,userName:r,action:"add.issue",payload:{id:o,parent:t,name:e}},{id:Vt(),userId:n,userName:r,action:"add.field",payload:{id:i,parent:o,name:"Description",val:""}},{id:Vt(),userId:n,userName:r,action:"add.field",payload:{id:a,parent:o,name:"Assignees"}},{id:Vt(),userId:n,userName:r,action:"add.field",payload:{id:d,parent:o,name:"Tags"}}]};import Jt from"node:fs";import Xt from"node:path";import{z as Yn}from"zod";var zt=process.env.IS_LOCAL==="true",xe=()=>".epiq";import Gt from"node:fs";import Ve from"node:path";import{decodeTime as na,monotonicFactory as ra}from"ulid";import{z as vt}from"zod";var Ao=e=>({action:e.action,payload:e.payload});var wo=1,To=ra(),oa="events",ia=vt.tuple([vt.string().min(1),vt.string().min(1).nullable()]),sa=vt.looseObject({v:vt.literal(wo),id:ia}),Gn=e=>{let t=sa.safeParse(e);return t.success?m("Parsed persisted event",t.data):s(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},qt=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",te=()=>{let{userName:e,userId:t}=pe();return e?t?e.trim()?m("Successfully resolved actor ID",{userId:qt(t),userName:qt(e)}):s("Unable to resolve actor ID from settings or OS user info"):s("User ID not configured"):s("User name not configured")},aa=e=>Gt.existsSync(Ve.join(e,xe()))&&Gt.statSync(Ve.join(e,xe())).isDirectory(),tt=(e=process.cwd())=>{let t=Ve.resolve(e);for(;;){if(aa(t))return t;let n=Ve.dirname(t);if(n===t)return Ve.resolve(e);t=n}},Mo=(e=process.cwd())=>Ve.join(tt(e),xe(),oa),qn=({userId:e,userName:t})=>`${qt(e)}.${qt(t)}.jsonl`,da=(e=process.cwd(),{userId:t,userName:n})=>{let r=qn({userId:t,userName:n});return/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r)?m("Successfully resolved event log path",Ve.join(Mo(e),r)):s(`Invalid event log file name: ${r}`)},ca=(e,t)=>{let n={[e.action]:e.payload,v:wo,id:t};return Gn(n)};function Yt({event:e,rootDir:t=process.cwd()}){try{let n=tt(t),r=Mo(n),o=da(n,{userId:e.userId,userName:e.userName});if(c(o))return o;Gt.mkdirSync(r,{recursive:!0});let i=Ro(n);if(c(i))return s(i.message);let a;if(i.data){let l=na(i.data),u=Math.max(Date.now(),l+1);a=To(u)}else a=To();let d=ca(Ao(e),[a,i.data]);return c(d)?s(d.message):(Gt.appendFileSync(o.data,`${JSON.stringify(d.data)}
3
- `,"utf8"),m("Event persisted",{path:o.data,entry:d.data}))}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return s(`Failed to persist event: ${r}`)}}import{decodeTime as la}from"ulid";var ma=xe(),ua="events",pa=Yn.object({userId:Yn.string().min(1).default("unknown"),userName:Yn.string().min(1).default("unknown")}),ga=(e=process.cwd())=>Xt.join(tt(e),ma,ua),fa=e=>{let[t,n]=Xt.basename(e,".jsonl").split("."),r=pa.safeParse({userId:t,userName:n});return r.success?m("Parsed event file actor",r.data):s(`Invalid event file name ${Xt.basename(e)}: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},ya=e=>{let t=Object.keys(e).filter(n=>n!=="id"&&n!=="v");return t.length!==1?s(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?s("Invalid persisted event: action key is missing or invalid"):m("Resolved persisted action",t[0])},xa=(e,t)=>t in e,va=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),ha=e=>{let{userId:t,userName:n,...r}=e,o=ya(r);if(c(o))return s(o.message);let i=o.data,a=e.id?.[0];return a?xa(r,i)?m("Decoded persisted event",va({id:a,action:i,payload:r[i],userId:t,userName:n})):s(`Persisted event is missing payload for action: ${i}`):s("Persisted event is missing id")},Qt=e=>{if(!Jt.existsSync(e))return m("Event file missing",[]);let t=fa(e);if(c(t))return s(t.message);let n=Jt.readFileSync(e,"utf8"),r=[];for(let o of n.split(`
4
- `)){let i=o.trim();if(!i)continue;let a;try{a=JSON.parse(i)}catch{return s(`Failed to parse event JSON from ${e}: ${i}`)}let d=Gn(a);if(c(d))return s(`${d.message} in ${e}: ${i}`);r.push({...d.data,userId:t.data.userId,userName:t.data.userName})}return m("Parsed persisted events file",r)};function Lo(e=process.cwd()){let t=ga(e);if(!Jt.existsSync(t))return s("No events found");let n=Jt.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>Xt.join(t,o)),r=[];for(let o of n){let i=Qt(o);if(c(i))return s(i.message);r.push(...i.data)}return m("All events loaded",Ea(r))}function ht(e=process.cwd()){let t=Lo(e);if(c(t))return s(t.message);let n=[];for(let r of t.data){let o=ha(r);if(c(o))return s(`Failed to decode event ${r.id?.[0]??"<unknown>"}: ${o.message}`);n.push(o.data)}return m("Loaded merged events",n)}function Ro(e=process.cwd()){let t=Lo(e);return c(t)?s(t.message):m("Loaded edge reference",t.data.at(-1)?.id?.[0]??null)}var Ea=e=>{let t=new Map(e.map(d=>[d.id[0],d])),n=new Map;for(let d of e){let l=d.id[1],u=n.get(l)??[];u.push(d),n.set(l,u)}for(let d of n.values())d.sort((l,u)=>{let[p]=l.id,[y]=u.id;return p.localeCompare(y)});let r=[],o=new Set,i=d=>{let l=n.get(d)??[];for(let u of l){let[p]=u.id;o.has(p)||(o.add(p),r.push(u),i(p))}};i(null);let a=[...e].filter(d=>{let[l]=d.id;return!o.has(l)}).sort((d,l)=>{let[u,p]=d.id,[y,C]=l.id,b=p===null||t.has(p),I=C===null||t.has(C);if(b&&!I)return-1;if(!b&&I)return 1;let A=(p??"").localeCompare(C??"");return A!==0?A:u.localeCompare(y)});return[...r,...a]},Po=(e,t)=>{let n=e.findIndex(r=>{try{return la(r.id)>t}catch{return!0}});return n===-1?{appliedEvents:e,unappliedEvents:[]}:{appliedEvents:e.slice(0,n),unappliedEvents:e.slice(n)}};var Do=e=>{let t=e.log??[];for(let n=t.length-1;n>=0;n--){let r=t[n];if(r&&r.action==="close.issue"&&r.payload.id===e.id)return r.payload.parent}return null};var Ca=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[nt,Zt]=Ca;var D=(e,t)=>s(`${t.split(".").join(" ")+" failed, "+e.toLowerCase()}`),Na={"init.workspace":({action:e,payload:t})=>{let{id:n,name:r}=t,o=ee.workspace(n,r);Jn(o);let i=N.createNodeAtPosition(o);return c(i)?D(i.message??"Failed to initialize workspace",e):m("Workspace initialized",{action:e,result:i.data})},"add.workspace":({action:e,payload:t})=>{let{id:n,name:r}=t,o=ee.workspace(n,r),i=N.createNodeAtPosition(o);return c(i)?D(i.message??"Failed to add workspace",e):m("Added workspace",{action:e,result:i.data})},"add.board":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,i=N.createNodeAtPosition(ee.board(n,r,o));return c(i)?D(i.message??"Unable to create board",e):m("Added board",{action:e,result:i.data})},"add.swimlane":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,i=N.createNodeAtPosition(ee.swimlane(n,r,o));return c(i)?D(i.message??"Unable to create swimlane",e):m("Added swimlane",{action:e,result:i.data})},"add.issue":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,i=N.createNodeAtPosition(ee.ticket(n,r,o));return c(i)?D(i.message??"Unable to create issue",e):m("Added issue",{action:e,result:i.data})},"add.field":({action:e,payload:t})=>{let{id:n,name:r,parent:o,val:i}=t,a=N.createNodeAtPosition(ee.field(n,r,o,{value:i},r.includes("Description")?"vertical":"horizontal"));return c(a)?D(a.message??`Unable to create field: ${r}`,e):m("Added field",{action:e,result:a.data})},"edit.title":({action:e,payload:t})=>{let{id:n,name:r}=t;if(!N.getNode(n))return D("Unable to locate node",e);let i=N.renameNode(n,r);return c(i)?D(i.message??"Unable to edit title",e):m("Edited title",{action:e,result:i.data})},"delete.node":({action:e,payload:t})=>{let{id:n}=t,r=N.tombstoneNode(n);return c(r)?D(r.message??"Unable to delete node",e):m("Deleted node",{action:e,result:r.data})},"create.tag":({action:e,payload:t})=>{let{id:n,name:r}=t,o=N.createTag({id:n,name:r});return c(o)?D(o.message??"Unable to create tag",e):m("Tag added",{action:e,result:o.data})},"create.contributor":({action:e,payload:t})=>{let{id:n,name:r}=t,o=N.createContributor({id:n,name:r});return c(o)?D(o.message??"Unable to create contributor",e):m("Contributor created",{action:e,result:o.data})},"tag.issue":({action:e,payload:t})=>{let{id:n,target:r,tagId:o}=t,i=N.tag(r,o,n);return c(i)?D(i.message??"Unable to tag issue",e):m("Issue tagged",{action:e,result:i.data})},"assign.issue":({action:e,payload:t})=>{let{id:n,contributor:r,target:o}=t,i=N.assign(o,r,n);return c(i)?D(i.message??"Unable to assign issue",e):m("Assigned successfully",{action:e,result:i.data})},"move.node":({action:e,payload:t})=>{let{id:n,parent:r,pos:o}=t,i=N.moveNode({id:n,parentId:r,position:o});return c(i)?D(i.message??"Failed to move node",e):m("Moved node",{action:e,result:i.data})},"edit.description":({action:e,payload:t})=>{let{id:n,md:r}=t,o=N.editValue(n,r);return c(o)?D(o.message??"Unable to edit description",e):m("Set node value",{action:e,result:o.data})},"close.issue":({action:e,payload:t})=>{let{id:n}=t,r=N.getNode(n);if(!r)return D("Unable to locate issue",e);if(!$e(r))return D("Can only close issues",e);let o=N.getNode(nt);if(!o)return D("Unable to locate target swimlane",e);if(o.id===r.parentNodeId)return D("Cannot close closed issue",e);let a=N.moveNode({id:n,parentId:o.id});return c(a)?D(a.message??"Unable to close issue",e):m("Issue closed",{action:e,result:a.data})},"reopen.issue":({action:e,payload:t})=>{let{id:n}=t,r=N.getNode(n);if(!r)return D("Unable to locate issue",e);if(!$e(r))return D("Can only reopen issues",e);let o=N.getNode(nt);if(!o)return D("Unable to locate closed swimlane",e);if(!(r.parentNodeId===o.id))return D("Issue is not closed",e);let a=Do(r);if(!a)return D("Unable to resolve previous parent from issue history",e);if(a===o.id)return D("Previous parent resolves to closed swimlane",e);if(!N.getNode(a))return D("Previous parent no longer exists",e);let l=N.moveNode({id:n,parentId:a});return c(l)?D(l.message??"Unable to reopen issue",e):m("Issue reopened",{action:e,result:l.data})},"lock.node":({action:e,payload:t})=>{let{id:n}=t,r=N.lockNode(n);return c(r)?D(r.message??"Unable to lock node",e):m("Node locked",{action:e,result:r.data})}},ba=(e,t)=>{let n=N.getNode(e);n&&N.updateNode({...n,log:[...n.log??[],t]})},Ia=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=h().nodes[e.payload.id]?.parentNodeId;return n&&t.push(n),t;case"tag.issue":case"assign.issue":return[e.payload.id,e.payload.target];case"create.tag":case"create.contributor":default:return[]}};function rt(e,t=!1){let n=Na[e.action](e);if(c(n))return n;t||([...new Set(Ia(e))].forEach(a=>ba(a,e)),ae(a=>({...a,eventLog:[...a.eventLog,e]})));let r=e.userId,o=e.userName;return!r?.length||!o?.length?D("Invalid user ID format",e.action):(N.createContributor({name:o,id:r}),n)}var je=e=>e.map(t=>rt(t));function ne(e){let t=rt(e);if(t.result!==ye.Success)return t;let n=Yt({event:e});return c(n)?n:t}function Fo(e){return e.map(t=>ne(t))}import It from"node:fs";import{spawn as Ta}from"node:child_process";import Qn from"node:fs";import ot from"node:path";var Et=(e,t)=>{let n=new Map,r=t??((...i)=>JSON.stringify(i)),o=((...i)=>{let a=r(...i);if(!n.has(a)){let d=e(...i).then(l=>(c(l)&&n.delete(a),l));n.set(a,d)}return n.get(a)});return o.clear=()=>n.clear(),o};import Ct from"fs";import Oo from"path";import Sa from"util";var ko=1e3,Bo=(e=process.cwd())=>Oo.join(tt(e),xe(),"log","epiq.log");function Aa(e=process.cwd()){if(!zt)return;let t=Bo(e);if(!Ct.existsSync(t))return;let r=Ct.readFileSync(t,"utf8").split(`
2
+ import{render as Pc}from"ink";import Dc from"meow";import ds from"react";import hc from"chalk";import{Box as fe,Text as He}from"ink";import O from"react";import ct from"chalk";import{monotonicFactory as xd,ulid as Se}from"ulid";import{useSyncExternalStore as gd}from"react";var P={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function $e(e){return e.context==="TICKET"}var Ur=e=>e.context==="SWIMLANE";var g={INIT:"init",HELP:"help",NEW:"new",TAG:"tag",MOVE:"move",PEEK:"peek",FILTER:"filter",ASSIGN:"assign",DELETE:"delete",RENAME:"rename",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",SET_DESCRIPTION:"edit",SET_EDITOR:"config:editor",SET_VIEW:"config:view",SET_USERNAME:"config:username",SYNC:"sync",NONE:""},Ne={None:"none",Invalid:"invalid",Valid:"valid"},ye={None:"none",Success:"success",Fail:"fail"},s=e=>({result:ye.Fail,message:e,data:null}),m=(e,t)=>({result:ye.Success,message:e,data:t}),Wr=()=>({result:ye.None,message:"No result",data:null}),c=e=>e.result==="fail",Fe=e=>e.result==="success";var f={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line"};function Dt(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var Ft=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",Dn=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var Hr=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},_r=(e,t)=>t?e.get(t)??[]:[];var $r=new WeakMap,ps=e=>{let t=$r.get(e);return t||(t=Hr(e),$r.set(e,t)),t};var Kr=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return _r(ps(e),r).filter(i=>Dt(r,i)>=n)};var Vr=({inputToMatch:e,lastWord:t},n)=>{if(t.endsWith(" "))return{hint:"",hints:[],overlap:0,remainder:""};let r=Kr({wordList:n,inputToMatch:e,overlapThreshold:1});return gs(t,r)},gs=(e,t)=>{let n=t[0]??"",r=Dt(e.toLowerCase(),n.toLowerCase()),[o,i]=n.split(":"),a=r<(o??"").length,d=!!i,p=(d&&a?o:n)+(d&&a?":":" "),y=p.slice(r);return{hint:p,hints:t,overlap:r,remainder:y}};var jr=["vi","vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];var Je=24n,fs=Je*4n,kt=(1n<<fs)-1n,ys=/^[0-9a-f]+$/;function zr(e){if(!e||!ys.test(e))throw new Error(`Invalid hex rank: ${e}`);return BigInt("0x"+e)}function Ot(e,t=Je){if(e<0n)throw new Error("Negative rank not allowed");return e.toString(16).padStart(Number(t),"0")}function gt(e,t){if(!e&&!t)return Ot(kt/2n,Je);let n=e?zr(e):0n,r=t?zr(t):kt;if(r<=n)return Ot(kt/2n,Je);let o=(n+r)/2n;return o===n||o===r?"":Ot(o,Je)}function pe(){return Ot(kt/2n,Je)}var ee={workspace:(e,t)=>({id:e,title:t,rank:pe(),isDeleted:!1,props:{},context:P.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,r=!1)=>({id:e,title:t,rank:pe(),isDeleted:!1,props:{},context:P.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:r,log:[]}),swimlane:(e,t,n)=>({id:e,title:t,rank:pe(),isDeleted:!1,props:{},context:P.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:(e,t,n,r={},o="horizontal")=>({id:e,title:t,rank:pe(),isDeleted:!1,props:r,context:P.FIELD,childRenderAxis:o,parentNodeId:n,readonly:!1,log:[]}),ticket:(e,t,n)=>({id:e,title:t,rank:pe(),isDeleted:!1,props:{},context:P.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,props:r={},readonly:o=!0})=>({id:e,title:t,rank:pe(),isDeleted:!1,props:r,context:P.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:o,log:[]})};var _=e=>Object.values(h().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),Gr=(e,t)=>e.findIndex(n=>n.id===t),Fn=(e,t={at:"end"})=>{if(e.length===0)return m("Resolved rank",pe());switch(t.at){case"start":{let n=e[0];return n?m("Resolved rank",gt(void 0,n.rank)):s("Unable to resolve first sibling")}case"end":{let n=e[e.length-1];return n?m("Resolved rank",gt(n.rank,void 0)):s("Unable to resolve last sibling")}case"before":{let n=Gr(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?m("Resolved rank",gt(r?.rank,o.rank)):s("Sibling not found")}case"after":{let n=Gr(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?m("Resolved rank",gt(r.rank,o?.rank)):s("Sibling not found")}}};var Xe=(e,t)=>{let{nodes:n}=h(),r=n[e];if(!r)return s("Node not found");if(r.context===t)return m("Resolved ancestor node",r);let o=r.parentNodeId?n[r.parentNodeId]:void 0;for(;o;){if(o.context===t)return m("Resolved ancestor node",o);o=o.parentNodeId?n[o.parentNodeId]:void 0}return s(`No ancestor found for context: ${t}`)},On=(e,t)=>{let{nodes:n}=h(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},kn=(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"),N={deleteNode(e){ae(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},editValue(e,t){let{nodes:n}=h(),r=n[e];if(!r)return s("Edit target node not found");let o=kn(r,"edit");if(o)return o;let i={...r,props:{...r.props,value:t}};return N.updateNode(i),m("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return s("Rename target node not found");let r=kn(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),m("Renamed node",o)},getExistingTags(){let{tags:e}=h();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=h();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return _(e).find(n=>n.title===t)},moveNode({id:e,parentId:t,position:n={at:"end"}}){let{rootNodeId:r}=h(),o=this.getNode(e),i=this.getNode(t);if(!o)return s("Node not found");if(!i)return s("Target parent not found");if(r===e)return s("Cannot move root node");if(e===t)return s("Cannot move node into itself");let a=kn(o,"move");if(a)return a;if(On(t,e))return s("Cannot move node into its own descendant");let d=_(t).filter(p=>p.id!==e),l=Fn(d,n);if(c(l))return l;let u={...o,parentNodeId:t,rank:l.data};return this.updateNode(u),m("Moved node successfully",u)},tombstoneNode(e){let{nodes:t,currentNodeId:n,rootNodeId:r}=h(),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=l=>{let u=t[l];if(!(!u||i.has(l))){i.add(l);for(let p of _(u.id))a(p.id)}};a(e);let d={...structuredClone(t)};for(let l of i){if(!d[l])return s("Unable to locate node to delete");d[l]={...d[l],isDeleted:!0}}return n?(w({nodes:d}),m("Successfully tomb stoned",o)):s("Unable to delete undefined")},createContributor(e){let t=ae(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return c(t)?s("Unable to create contributor"):m("Created contributor",e)},assign(e,t,n){let r=N.getContributor(t),o=N.getNode(e);if(!o||!r)return s("Unable assign contributor to issue");let i=this.getFieldByTitle(o.id,"Assignees");if(!i)return s("Unable to locate assignees field");if(_(i.id).some(l=>l.props?.value===t))return s("Contributor already assigned");let d=this.createNodeAtPosition(ee.field(n,r.name,i.id,{value:t}));return c(d)?d:m("Assigned contributor",d.data)},createTag(e){let t=ae(n=>({...n,tags:{...n.tags,[e.id]:e}}));return c(t)?s("Could not create tag"):m("Tag created",e)},tag(e,t,n){let r=N.getTag(t),o=N.getNode(e);if(!r)return s("Unable to add tag, missing tag");if(!o)return s("Unable to add tag, missing target");let i=this.getFieldByTitle(o.id,"Tags");if(!i)return s("Unable to locate tags field");if(_(i.id).some(l=>l.props?.value===t))return s("Tag already assigned");let d=this.createNodeAtPosition(ee.field(n,r.name,i.id,{value:t}));return c(d)?d:m("Tag added",d.data)},createNodeAtPosition(e,t={at:"end"}){if(!e.parentNodeId){let i={...e,rank:pe()};return this.createNode(i),m("Created node",i)}let n=_(e.parentNodeId),r=Fn(n,t);if(c(r))return r;let o={...e,rank:r.data};return this.createNode(o),m("Created node",o)},createNode(e){let t=ae(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return c(t)?s("Unable to create node"):m("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return s("Failed to locate node");let n={...t,readonly:!0},r=ae(o=>({...o,nodes:{...o.nodes,[e]:n}}));return c(r)?s(r.message):m("Locked node",n)},updateNode(e){let t=ae(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return c(t)?t:m("Updated node",e)},getContributor(e){return h().contributors[e]},getTag(e){return h().tags[e]},getNode(e){return h().nodes[e]},getSiblings:e=>Object.values(h().nodes).filter(t=>!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank))};var Bt={autoSync:!1,preferredEditor:null,userName:null,userId:null},ge=()=>Bt,Qe=e=>(Bt={...Bt,...e},Bt);var Ut=()=>{let e=ge(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim();return{isSetup:n&&t,hasPreferredEditor:n,hasUserName:t,userName:e.userName,preferredEditor:e.preferredEditor}},qr=()=>!Ke();var q={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"},E={accent:q.cyan,accent2:q.magenta,primary:q.white,secondary:q.grayDark,secondary2:q.grayLight,gray:q.gray,green:q.green,yellow:q.yellow,red:q.red};var v={red:q.red,yellow:q.yellow,green:q.green,blue:q.blue,magenta:q.magenta,cyan:q.cyan},Ze={urgent:v.red,critical:v.red,important:v.red,blocker:v.red,asap:v.red,immediate:v.red,fail:v.red,failure:v.red,broken:v.red,bug:v.red,error:v.red,incident:v.red,outage:v.red,production:v.red,crash:v.red,security:v.red,warning:v.yellow,warn:v.yellow,risky:v.yellow,risk:v.yellow,attention:v.yellow,pending:v.yellow,review:v.yellow,"needs-review":v.yellow,qa:v.yellow,testing:v.yellow,test:v.yellow,validate:v.yellow,verification:v.yellow,staging:v.yellow,check:v.yellow,"follow-up":v.yellow,followup:v.yellow,waiting:v.yellow,blocked:v.yellow,hold:v.yellow,done:v.green,complete:v.green,completed:v.green,success:v.green,ok:v.green,stable:v.green,resolved:v.green,fixed:v.green,closed:v.green,merged:v.green,released:v.green,deployed:v.green,approved:v.green,verified:v.green,working:v.green,healthy:v.green,pass:v.green,passing:v.green,info:v.blue,information:v.blue,note:v.blue,docs:v.blue,documentation:v.blue,doc:v.blue,guide:v.blue,help:v.blue,explanation:v.blue,detail:v.blue,details:v.blue,context:v.blue,design:v.blue,discussion:v.blue,proposal:v.blue,idea:v.blue,feature:v.magenta,enhancement:v.magenta,improvement:v.magenta,refactor:v.magenta,refactoring:v.magenta,cleanup:v.magenta,optimize:v.magenta,optimization:v.magenta,perf:v.magenta,performance:v.magenta,upgrade:v.magenta,migration:v.magenta,modernize:v.magenta,debt:v.magenta,todo:v.cyan,next:v.cyan,planned:v.cyan,plan:v.cyan,future:v.cyan,backlog:v.cyan,investigate:v.cyan,explore:v.cyan,prototype:v.cyan};var xs=/^(\d+)(h|d|w|mo|y)$/,vs=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,hs=({year:e,month:t,day:n,hour:r=0,minute:o=0})=>{let i=new Date(e,t-1,n,r,o);return i.getFullYear()===e&&i.getMonth()===t-1&&i.getDate()===n&&i.getHours()===r&&i.getMinutes()===o},Es=(e,t=new Date)=>{let n=e.match(xs);if(!n)return null;let[,r,o]=n,i=Number(r);if(!Number.isInteger(i)||i<=0)return null;let a=new Date(t);switch(o){case"h":return a.setHours(a.getHours()-i),a;case"d":return a.setDate(a.getDate()-i),a;case"w":return a.setDate(a.getDate()-i*7),a;case"mo":return a.setMonth(a.getMonth()-i),a;case"y":return a.setFullYear(a.getFullYear()-i),a;default:return null}},Cs=e=>{let t=e.match(vs);if(!t)return null;let[,n,r,o,i,a]=t,d=Number(n),l=Number(r),u=Number(o),p=i?Number(i):0,y=a?Number(a):0;return hs({year:d,month:l,day:u,hour:p,minute:y})?new Date(d,l-1,u,p,y):null},Wt=e=>{let t=e.trim().toLowerCase();return Es(t)??Cs(t)},Yr=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Ns=[{unit:"h",from:1,to:24},{unit:"d",from:1,to:7},{unit:"w",from:1,to:52},{unit:"mo",from:1,to:12},{unit:"y",from:1,to:5}],Jr=(e=Ns)=>{let t=[];for(let{unit:n,from:r,to:o}of e)for(let i=r;i<=o;i++)t.push(`${i}${n}`);return t};var bs=["BOARD","TICKET","SWIMLANE"],z=e=>{let{currentNode:t,readOnly:n,selectedNode:r}=h(),o=Ut().isSetup,i=t.context,a=r?.context,d=[g.SYNC,g.HELP,g.SET_VIEW,g.SET_EDITOR,g.SET_USERNAME],l=[g.NEW,g.RENAME,g.DELETE],u=[g.TAG,g.ASSIGN,g.CLOSE_ISSUE,g.RE_OPEN_ISSUE,g.SET_DESCRIPTION],p=[g.FILTER,g.PEEK],y={WORKSPACE:[...d,...l],BOARD:[...p,...d,...l],SWIMLANE:[...p,...d,...l],TICKET:[...d,...l,...u],FIELD:[...d,...u],FIELD_LIST:[...d,...u],TEXT:[...d]},C=a&&bs.includes(a),b=[...y[i||"WORKSPACE"]].filter(A=>[g.RENAME,g.DELETE,g.MOVE].includes(A)?C:!0),I={[g.PEEK]:[...Jr(),"now","prev","next"],[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]:[...jr,"vim"],[g.TAG]:[...new Set([...Object.keys(Ze),...N.getExistingTags()])],[g.ASSIGN]:N.getExistingAssignees(),[g.HELP]:[],[g.RENAME]:[],[g.NEW]:i==="TICKET"||i==="FIELD"||i==="FIELD_LIST"?["issue","swimlane","board"]:i==="SWIMLANE"?["issue","swimlane","board"]:i==="BOARD"?["issue","swimlane","board"]:["board"],[g.NONE]:b};return o?qr()?n&&(I={[g.NONE]:[g.HELP,g.PEEK],[g.HELP]:I[g.HELP],[g.PEEK]:I[g.PEEK]}):I={[g.NONE]:[g.HELP,g.INIT],[g.HELP]:I[g.HELP],[g.INIT]:I[g.INIT]}:I={[g.NONE]:[g.HELP,g.SET_EDITOR,g.SET_USERNAME],[g.HELP]:I[g.HELP],[g.SET_EDITOR]:I[g.SET_EDITOR],[g.SET_USERNAME]:I[g.SET_USERNAME]},I[e]??[]};import $t from"chalk";import{decodeTime as Xr}from"ulid";var Qr=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"},Zr=e=>{let t=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())} ${t(e.getHours())}:${t(e.getMinutes())}`},Ht=e=>{try{return m("Decoded date",new Date(Xr(e)))}catch(t){return s("Decoding failed + "+t.message)}},Bn=e=>{if(!e?.id)return null;try{return Xr(e.id)}catch{return null}};var be=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?m("Found node",n):s("Unable to find node in breadcrumb")};import et from"chalk";var Wn={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Is=(e,t,n)=>Math.max(t,Math.min(n,e)),Un=(e,t,n)=>e+(t-e)*n,eo=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Ss=(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)),l=0,u=0,p=0;a>=0&&a<1?(l=i,u=d):a>=1&&a<2?(l=d,u=i):a>=2&&a<3?(u=i,p=d):a>=3&&a<4?(u=d,p=i):a>=4&&a<5?(l=d,p=i):(l=i,p=d);let y=o-i/2;return[Math.round((l+y)*255),Math.round((u+y)*255),Math.round((p+y)*255)]},As=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,Ts=(e,t,n)=>[Math.round(Un(e[0],t[0],n)),Math.round(Un(e[1],t[1],n)),Math.round(Un(e[2],t[2],n))],ft=e=>{let n=eo(e)%360,r=Ss(n,Wn.stringColor.saturation,Wn.stringColor.lightness);return As(r)},ws=e=>{let t=Wn.gradient.stops,n=Is(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 Ts(t[i],t[i+1],a)},_t=e=>eo(e.toLowerCase().trim())/4294967295,to=e=>{let t=_t(e);return ws(t)},Ms=e=>{let[t,n,r]=to(e);return{normal:o=>et.bgRgb(t,n,r).black(o),cursor:o=>et.bgRgb(t,n,r).white.bold(o)}},Hn=e=>{let[t,n,r]=to(e);return{fg:o=>et.rgb(t,n,r)(o),fgCursor:o=>et.rgb(t,n,r).inverse(o),bg:o=>et.bgRgb(t,n,r).black(o),bgCursor:o=>et.bgRgb(t,n,r).white.bold(o)}},_n=e=>Ms(e).normal(` ${e} `),le=(e,t=Ze)=>{let r=(o=>o.toLowerCase().trim())(e);return r&&t[r]?t[r]:ft(r)};var Rs=["BOARD","TICKET","SWIMLANE"],$n=()=>{let e=h().selectedNode;return e?.context?Rs.includes(e?.context)?K():j({message:"Command not available in this context",completionWordList:[]}):j({message:"Missing target context",completionWordList:[]})},de="<ENTER> to confirm",K=(e="",t=[])=>({message:e,validity:Ne.Valid,completionWordList:t}),j=({message:e,completionWordList:t})=>({validity:Ne.Invalid,message:e,completionWordList:t}),yt=e=>e.length===0,ke=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:i=1})=>{let l=[...t.filter(Boolean).filter(p=>p.startsWith(o.trim()))].sort((p,y)=>_t(p)-_t(y)).slice(0,r).map(_n),u=l.length>i?l.join(" "):"";return u?`${e}${u}${n}`:""},Kn=({modifier:e})=>{let t="confirm";return e===t?K(de):j({message:yt(e)?`if you are certain, enter ${_n(t)}`:"",completionWordList:[t]})},Ls=({list:e,hint:t})=>({modifier:n})=>e.includes(n)?K(de):j({message:yt(n)?t:"",completionWordList:[]}),Ps=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?j({message:n,completionWordList:[]}):K():j({message:yt(r)?t:"",completionWordList:[]}),Vn=({hint:e})=>({modifier:t,inputString:n})=>yt(t)&&yt(n)?j({message:e,completionWordList:[]}):K(de),Ds={[g.PEEK]:e=>{let t=e.modifier;if(t==="now")return K(de);let n={message:"historical state from: '1h', '2d', '23h', '1mo', '2y', 'previous', 'next' or full date as YYYY-MM-DD",completionWordList:[]};if(t==="prev"||t==="next")return K(de);let r=Wt(t);if(!t||!r)return j(n);let o=be(h().breadCrumb,"BOARD");if(c(o))return j({message:"Command is not applicable in this context",completionWordList:[]});let i=Ht(o.data.id);return c(i)?j({message:"Unable to peek: board id is not a valid ULID",completionWordList:[]}):Yr({date:r,horizonDate:i.data})?K(de):j({message:$t.red(`nothing to peek before ${i.data.toISOString().slice(0,16).replace("T"," ")}`),completionWordList:[]})},[g.INIT]:()=>K(de),[g.FILTER]:e=>{if(e.modifier==="clear")return K();let t=a=>z(g.FILTER).includes(a);if(!e.modifier||!t(e.modifier??""))return j({message:ke({wordList:z(g.FILTER),inputString:e.inputString}),completionWordList:z(g.FILTER)});let r=Object.values(h().tags).map(a=>a.name),o=Object.values(h().contributors).map(a=>a.name),i=e.modifier==="tag"?r:e.modifier==="assignee"?o:[];return e.inputString?i.length&&!i.includes(e.inputString.trim()??"")?j({message:ke({prefix:`existing ${e.modifier}s... `,wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i}):K():j({message:ke({prefix:"one of... ",wordList:i,noOfHints:10,inputString:e.inputString}),completionWordList:i})},[g.NONE]:e=>{let t=z(g.NONE),n=/^[A-Za-z_]+:/g,r=e.inputString.match(n);return r&&r.length?t=[...t.filter(o=>o.trim().match(n))]:t=[...new Set(t.flatMap(o=>o.match(n)?.join("").replace(":","")??o))],e.command?K():j({message:ke({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:[]})},[g.NEW]:e=>Ps({list:z(g.NEW),hint:ke({wordList:z(g.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[g.SET_DESCRIPTION]:()=>K(de),[g.HELP]:()=>K(de),[g.RENAME]:()=>{let e=$n();return e.validity==="invalid"?e:K(de)},[g.DELETE]:e=>{let t=$n();return t.validity==="invalid"?t:Kn(e)},[g.CLOSE_ISSUE]:e=>Kn(e),[g.RE_OPEN_ISSUE]:e=>Kn(e),[g.MOVE]:e=>{let t=$n();return t.validity==="invalid"?t:Vn({hint:ke({prefix:"hey hacker! These commands are blocked for you... ",wordList:z(g.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[g.TAG]:e=>{let t=N.getExistingTags().map(n=>` ${$t.bgHex(le(n))(" "+n+" ")} `).slice(0,10);return Vn({hint:"tag name like... "+t.join("")})(e)},[g.ASSIGN]:e=>{let t=N.getExistingAssignees().map(n=>` ${$t.bgHex(le(n))(" "+n+" ")} `).slice(0,10);return Vn({hint:"assign to... "+t.join("")})(e)},[g.SET_EDITOR]:e=>{logger.debug(`Validating command: ${e.command} ${e.modifier} ${e.inputString}`);let t=z(g.SET_EDITOR);return e.modifier?K(de):j({message:ke({wordList:t,inputString:e.inputString}),completionWordList:[]})},[g.SET_USERNAME]:e=>e.inputString?K():j({message:`Enter a username. Saved in ${$t.bgBlack("~/.epiq/")}`,completionWordList:[]}),[g.SET_VIEW]:e=>Ls({list:z(g.SET_VIEW),hint:ke({wordList:z(g.SET_VIEW),noOfHints:3,inputString:e.inputString})})(e),[g.SYNC]:()=>K(de)},no=Object.fromEntries(Object.entries(Ds).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var ro=["frontend","backend","infrastructure","architecture","integration","configuration","implementation","application","deployment","environment","framework","platform","service","component","module","gateway","pipeline","containerization","orchestrator","exception","incident","defect","regression","degradation","malfunction","instability","intermittent","reproducibility","reproduction","investigation","triage","workaround","mitigation","remediation","optimization","stabilization","refinement","failure","outage","blocking","criticality","severity","escalation","diagnostics","analysis","resolution","corruption","inconsistency","validation","verification","authorization","authentication","confidentiality","availability","accessibility","reliability","compliance","governance","encryption","decryption","integrity","auditing","traceability","accountability","protection","privileges","permissions","dependency","orchestration","provisioning","synchronization","compatibility","incompatibility","interoperability","observability","instrumentation","telemetry","loadbalancing","discovery","registration","scheduling","coordination","distribution","isolation","virtualization","serialization","deserialization","initialization","instantiation","propagation","aggregation","consolidation","normalization","standardization","transformation","reconciliation","correlation","processing","indexing","partitioning","enrichment","validation","filtering","streaming","batching","concurrency","parallelism","contention","deadlock","throttling","ratelimiting","backpressure","fragmentation","saturation","exhaustion","partitioning","replication","redundancy","failover","deprecation","obsolescence","starvation","overload","underutilization","latency","throughput","refactoring","modularization","encapsulation","abstraction","extensibility","configurability","maintainability","recoverability","sustainability","readability","testability","debuggability","reusability","simplicity","consistency","performance","functionality","requirement","recommendation","improvement","enhancement","clarification","documentation","description","acceptance","criteria","estimation","prioritization","dependency","deliverable","milestone","iteration"];var L={Init:"init",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",Peek:"peek",SetView:"set-view",SetEditor:"set-editor",SetUserName:"set-user-name",SetAutoSync:"set-auto-sync",NewItem:"add-new-item",TagTicket:"ticket-tag",AssignUserToTicket:"ticket-assign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Sync:"sync"};var oo=e=>Object.values(g).includes(e),io=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:i}=e,{message:a,validity:d,completionWordList:l}=no[n].validate(n,r,i),u=o==="command"?Object.values(g):n&&e.target==="modifier"?z(n):ro;return{validity:d,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:a??"",autoCompletion:t?Vr(e,[...l,...u]):{hint:"",hints:[],remainder:"",overlap:0}}};var so=e=>{let t=e.trimStart(),n=ks(t),r=(n[0]??"").trimStart().trimEnd(),o=(n[1]??"").trimStart().trimEnd(),i=Os(e),a=oo(r)?r:null,d=a!==null,l=r!=="",u=e.endsWith(" "),p=a?z(a)??[]:[],y=a&&p.includes(o)?o:"",C="word";n.length<=1?C="command":n.length===2&&(C="modifier");let b=Fs(t,a,y);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:i,hasCommand:l,command:a,isCommandKeyword:d,isLastWordCompleted:u,modifier:y,target:C,inputToMatch:i,inputString:b}},Fs=(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},ks=e=>e?e.split(/\s+/):[],Os=e=>e.trimEnd().split(/\s+/).at(-1)??"";var ao=" ",Y={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:Ne.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},jn=new Set,co=()=>{for(let e of jn)e()},lo=e=>(jn.add(e),()=>jn.delete(e)),Ie=e=>{let n=e(Y),r=so(n.value),o=n.cursorPosition===n.value.length;Y={...n,commandMeta:io(r,o)},co()},xt=({message:e,result:t})=>{let n=structuredClone(Y);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,Y=n,co(),m(e,null)},zn=e=>{Ie(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},Gn=e=>{Ie(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&n[o-1]===" ";)o--;for(;o>0&&n[o-1]!==" ";)o--}else{for(;o<n.length&&n[o]!==" ";)o++;for(;o<n.length&&n[o]===" ";)o++}return{...t,cursorPosition:o}})},mo=()=>{Ie(e=>{let t=e.value.slice(e.cursorPosition),n=Math.max(0,e.cursorPosition-1);return{...e,value:e.value.slice(0,n)+t,cursorPosition:n,commandIsPending:!1}})},uo=()=>{Ie(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&t[r-1]===" ";)r--;for(;r>0&&t[r-1]!==" ";)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},V=e=>{Ie(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),r=t.value.slice(0,n),o=t.value.slice(n),i=e(r,t.commandMeta.autoCompletion),a=i+o,d=Math.max(0,Math.min(i.length,a.length));return{...t,value:a,cursorPosition:d,commandIsPending:!1}})},po=()=>{Ie(e=>({...e,commandIsPending:!0}))},go=({addToHistory:e=!0})=>{Ie(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),Bs()},fo=()=>{Ie(e=>{let t=Math.min(e.commandHistoryIndex+1,e.commandHistory.length-1),n=e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},yo=()=>{Ie(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},Bs=()=>V(()=>""),me=()=>Y,Kt=()=>{let[e,...t]=Y.value.split(ao);return t.join(ao).trim()};var Us=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",Ws=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",Hs=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",xo=(e,t)=>{if(Ws(e,e.sequence))return x.MoveCursorLeftOfWord;if(Hs(e,e.sequence))return x.MoveCursorRightOfWord;if(Us(e,e.sequence))return x.EraseInputWord;switch(e.name){case"tab":return x.AutoCompleteCommand;case"up":return x.GetLastCommandFromHistory;case"down":return x.GetNextCommandFromHistory;case"left":return x.MoveCursorLeft;case"right":return x.MoveCursorRight;case"return":return x.Confirm;case"backspace":return t?x.EraseInput:x.ExitCommandLine;case"escape":return x.ExitCommandLine;default:return x.CaptureInput}};var x={Sync:"sync",NavPreviousItem:"navPreviousItem",NavNextItem:"navNextItem",NavToPreviousContainer:"navToPreviousContainer",NavToNextContainer:"navToNextContainer",MovePreviousItem:"movePreviousItem",MoveNextItem:"moveNextItem",MoveToPreviousContainer:"moveToPreviousContainer",MoveToNextContainer:"moveToNextContainer",Confirm:"confirm",Exit:"exit",ViewHelp:"viewHelp",HideHelp:"hideHelp",InitMove:"initMove",ConfirmMove:"confirmMove",Delete:"Delete",InitCommandLine:"initCommandLine",ExitCommandLine:"exitCommandLine",CaptureInput:"captureInput",EraseInput:"eraseInput",AddItem:"addItem",GetLastCommandFromHistory:"getLastCommandFromHistory",GetNextCommandFromHistory:"getNextCommandFromHistory",AutoCompleteCommand:"autoCompleteCommand",MoveCursorLeft:"MoveCursorLeft",MoveCursorRight:"MoveCursorRight",MoveCursorLeftOfWord:"MoveCursorLeftOfWord",MoveCursorRightOfWord:"MoveCursorRightOfWord",EraseInputWord:"EraseInputWord",None:"None",Edit:"edit",SetViewDense:"SetViewDense",SetViewWide:"SetViewWide"};function _s(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 $s(e,t,n){let r=h().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 vo(e,t){let n=me();if(e.sequence===":"&&n.value==="")return x.InitCommandLine;if(t===f.MOVE)switch(e.name){case"m":case"return":return x.ConfirmMove}if(t===f.COMMAND_LINE)return xo(e,n.value);let r=_s(e);if(r){let o=t===f.MOVE?{prevItem:x.MovePreviousItem,nextItem:x.MoveNextItem,prevContainer:x.MoveToPreviousContainer,nextContainer:x.MoveToNextContainer}:{prevItem:x.NavPreviousItem,nextItem:x.NavNextItem,prevContainer:x.NavToPreviousContainer,nextContainer:x.NavToNextContainer};return $s(h().currentNode.childRenderAxis,r,o)}if(e.ctrl&&e.name==="c")return x.Exit;switch(e.name){case"e":return x.Edit;case"n":return x.AddItem;case"m":return x.InitMove;case"d":return x.Delete;case"return":return x.Confirm;case"space":return x.Confirm;case"v":return h().viewMode==="wide"?x.SetViewDense:x.SetViewWide;case"q":case"escape":return x.Exit;case"s":return x.Sync;default:return null}}var ho=e=>{let{context:t}=h()?.currentNode;if(!t)return L.None;switch(e){case g.INIT:return L.Init;case g.DELETE:return L.Delete;case g.SET_DESCRIPTION:return L.Edit;case g.HELP:return L.ViewHelp;case g.RE_OPEN_ISSUE:return L.ReopenIssue;case g.CLOSE_ISSUE:return L.CloseIssue;case g.TAG:return L.TagTicket;case g.ASSIGN:return L.AssignUserToTicket;case g.RENAME:return L.Rename;case g.NEW:return L.NewItem;case g.FILTER:return L.Filter;case g.MOVE:return L.Move;case g.PEEK:return L.Peek;case g.SET_USERNAME:return L.SetUserName;case g.SET_EDITOR:return L.SetEditor;case g.SET_VIEW:return L.SetView;case g.SYNC:return L.Sync;default:return L.None}};import{ulid as $}from"ulid";import{spawnSync as Js}from"node:child_process";import Xs from"node:os";import bo from"node:path";import{ulid as Qs}from"ulid";import{accessSync as Ks,copyFileSync as Vs,existsSync as Vt,mkdirSync as Eo,readdirSync as Co,readFileSync as js,renameSync as zs,rmSync as Gs,statSync as No,unlinkSync as qs,writeFileSync as Ys}from"node:fs";import tt from"node:path";var ce={writeToFile:(e,t)=>{try{let n=tt.dirname(e);Vt(n)||Eo(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);Ys(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return js(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=ce.readFile(e);return t===null?null:JSON.parse(t)}catch(t){return logger.error(`Failed to read JSON at ${e}:`,t),null}},dirExists:e=>{try{return Vt(e)&&No(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Ks(e),!0}catch{return!1}},mkDir:e=>Eo(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=tt.parse(t);for(;;){let r=tt.join(t,e);try{if(Vt(r)&&No(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=tt.dirname(t)}return null},readFirstJSON(e){try{if(!ce.dirExists(e))return null;let t=Co(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=tt.join(e,t);return ce.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return ce.dirExists(e)?Co(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{qs(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Gs(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(tt.dirname(t)),!n?.overwrite&&Vt(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{zs(e,t)}catch(r){if(r?.code==="EXDEV"){Vs(e,t),this.rmFile(e);return}throw r}}};function Zs(){let{preferredEditor:e}=ge(),t=[e,process.env.VISUAL,process.env.EDITOR,"vim","vi","nano"].filter(n=>!!n?.trim());return[...new Set(t)]}function ea(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function Io(e){let t=bo.join(Xs.tmpdir(),"epiq");ce.mkDir(t);let n=bo.join(t,Qs());ce.writeToFile(n,e??"");let r=Zs();for(let o of r){let i=ea(o,n),a=Js(i,{stdio:"inherit",shell:!0});if(!a.error&&a.status===0){let d=ce.readFile(n);if(d==null)return s("Unable to read edited file");let l=d.replace(/\r?\n$/,"");return m("Successfully edited",l)}}return s("Unable to open editor")}import{monotonicFactory as ta,ulid as jt}from"ulid";var zt=ta(),So=({name:e,parent:t,user:{userId:n,userName:r}})=>{let o=zt(),i=zt(),a=zt(),d=zt();return[{id:jt(),userId:n,userName:r,action:"add.issue",payload:{id:o,parent:t,name:e}},{id:jt(),userId:n,userName:r,action:"add.field",payload:{id:i,parent:o,name:"Description",val:""}},{id:jt(),userId:n,userName:r,action:"add.field",payload:{id:a,parent:o,name:"Assignees"}},{id:jt(),userId:n,userName:r,action:"add.field",payload:{id:d,parent:o,name:"Tags"}}]};import Xt from"node:fs";import Qt from"node:path";import{z as Jn}from"zod";var Gt=process.env.IS_LOCAL==="true",xe=()=>".epiq";import qt from"node:fs";import Ve from"node:path";import{decodeTime as na,monotonicFactory as ra}from"ulid";import{z as vt}from"zod";var Ao=e=>({action:e.action,payload:e.payload});var wo=1,To=ra(),oa="events",ia=vt.tuple([vt.string().min(1),vt.string().min(1).nullable()]),sa=vt.looseObject({v:vt.literal(wo),id:ia}),qn=e=>{let t=sa.safeParse(e);return t.success?m("Parsed persisted event",t.data):s(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},Yt=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",te=()=>{let{userName:e,userId:t}=ge();return e?t?e.trim()?m("Successfully resolved actor ID",{userId:Yt(t),userName:Yt(e)}):s("Unable to resolve actor ID from settings or OS user info"):s("User ID not configured"):s("User name not configured")},aa=e=>qt.existsSync(Ve.join(e,xe()))&&qt.statSync(Ve.join(e,xe())).isDirectory(),nt=(e=process.cwd())=>{let t=Ve.resolve(e);for(;;){if(aa(t))return t;let n=Ve.dirname(t);if(n===t)return Ve.resolve(e);t=n}},Mo=(e=process.cwd())=>Ve.join(nt(e),xe(),oa),Yn=({userId:e,userName:t})=>`${Yt(e)}.${Yt(t)}.jsonl`,da=(e=process.cwd(),{userId:t,userName:n})=>{let r=Yn({userId:t,userName:n});return/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r)?m("Successfully resolved event log path",Ve.join(Mo(e),r)):s(`Invalid event log file name: ${r}`)},ca=(e,t)=>{let n={[e.action]:e.payload,v:wo,id:t};return qn(n)};function Jt({event:e,rootDir:t=process.cwd()}){try{let n=nt(t),r=Mo(n),o=da(n,{userId:e.userId,userName:e.userName});if(c(o))return o;qt.mkdirSync(r,{recursive:!0});let i=Ro(n);if(c(i))return s(i.message);let a;if(i.data){let l=na(i.data),u=Math.max(Date.now(),l+1);a=To(u)}else a=To();let d=ca(Ao(e),[a,i.data]);return c(d)?s(d.message):(qt.appendFileSync(o.data,`${JSON.stringify(d.data)}
3
+ `,"utf8"),m("Event persisted",{path:o.data,entry:d.data}))}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return s(`Failed to persist event: ${r}`)}}import{decodeTime as la}from"ulid";var ma=xe(),ua="events",pa=Jn.object({userId:Jn.string().min(1).default("unknown"),userName:Jn.string().min(1).default("unknown")}),ga=(e=process.cwd())=>Qt.join(nt(e),ma,ua),fa=e=>{let[t,n]=Qt.basename(e,".jsonl").split("."),r=pa.safeParse({userId:t,userName:n});return r.success?m("Parsed event file actor",r.data):s(`Invalid event file name ${Qt.basename(e)}: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},ya=e=>{let t=Object.keys(e).filter(n=>n!=="id"&&n!=="v");return t.length!==1?s(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?s("Invalid persisted event: action key is missing or invalid"):m("Resolved persisted action",t[0])},xa=(e,t)=>t in e,va=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),ha=e=>{let{userId:t,userName:n,...r}=e,o=ya(r);if(c(o))return s(o.message);let i=o.data,a=e.id?.[0];return a?xa(r,i)?m("Decoded persisted event",va({id:a,action:i,payload:r[i],userId:t,userName:n})):s(`Persisted event is missing payload for action: ${i}`):s("Persisted event is missing id")},Zt=e=>{if(!Xt.existsSync(e))return m("Event file missing",[]);let t=fa(e);if(c(t))return s(t.message);let n=Xt.readFileSync(e,"utf8"),r=[];for(let o of n.split(`
4
+ `)){let i=o.trim();if(!i)continue;let a;try{a=JSON.parse(i)}catch{return s(`Failed to parse event JSON from ${e}: ${i}`)}let d=qn(a);if(c(d))return s(`${d.message} in ${e}: ${i}`);r.push({...d.data,userId:t.data.userId,userName:t.data.userName})}return m("Parsed persisted events file",r)};function Lo(e=process.cwd()){let t=ga(e);if(!Xt.existsSync(t))return s("No events found");let n=Xt.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>Qt.join(t,o)),r=[];for(let o of n){let i=Zt(o);if(c(i))return s(i.message);r.push(...i.data)}return m("All events loaded",Ea(r))}function ht(e=process.cwd()){let t=Lo(e);if(c(t))return s(t.message);let n=[];for(let r of t.data){let o=ha(r);if(c(o))return s(`Failed to decode event ${r.id?.[0]??"<unknown>"}: ${o.message}`);n.push(o.data)}return m("Loaded merged events",n)}function Ro(e=process.cwd()){let t=Lo(e);return c(t)?s(t.message):m("Loaded edge reference",t.data.at(-1)?.id?.[0]??null)}var Ea=e=>{let t=new Map(e.map(d=>[d.id[0],d])),n=new Map;for(let d of e){let l=d.id[1],u=n.get(l)??[];u.push(d),n.set(l,u)}for(let d of n.values())d.sort((l,u)=>{let[p]=l.id,[y]=u.id;return p.localeCompare(y)});let r=[],o=new Set,i=d=>{let l=n.get(d)??[];for(let u of l){let[p]=u.id;o.has(p)||(o.add(p),r.push(u),i(p))}};i(null);let a=[...e].filter(d=>{let[l]=d.id;return!o.has(l)}).sort((d,l)=>{let[u,p]=d.id,[y,C]=l.id,b=p===null||t.has(p),I=C===null||t.has(C);if(b&&!I)return-1;if(!b&&I)return 1;let A=(p??"").localeCompare(C??"");return A!==0?A:u.localeCompare(y)});return[...r,...a]},Po=(e,t)=>{let n=e.findIndex(r=>{try{return la(r.id)>t}catch{return!0}});return n===-1?{appliedEvents:e,unappliedEvents:[]}:{appliedEvents:e.slice(0,n),unappliedEvents:e.slice(n)}};var Do=e=>{let t=e.log??[];for(let n=t.length-1;n>=0;n--){let r=t[n];if(r&&r.action==="close.issue"&&r.payload.id===e.id)return r.payload.parent}return null};var Ca=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[rt,en]=Ca;var D=(e,t)=>s(`${t.split(".").join(" ")+" failed, "+e.toLowerCase()}`),Na={"init.workspace":({action:e,payload:t})=>{let{id:n,name:r}=t,o=ee.workspace(n,r);Xn(o);let i=N.createNodeAtPosition(o);return c(i)?D(i.message??"Failed to initialize workspace",e):m("Workspace initialized",{action:e,result:i.data})},"add.workspace":({action:e,payload:t})=>{let{id:n,name:r}=t,o=ee.workspace(n,r),i=N.createNodeAtPosition(o);return c(i)?D(i.message??"Failed to add workspace",e):m("Added workspace",{action:e,result:i.data})},"add.board":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,i=N.createNodeAtPosition(ee.board(n,r,o));return c(i)?D(i.message??"Unable to create board",e):m("Added board",{action:e,result:i.data})},"add.swimlane":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,i=N.createNodeAtPosition(ee.swimlane(n,r,o));return c(i)?D(i.message??"Unable to create swimlane",e):m("Added swimlane",{action:e,result:i.data})},"add.issue":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,i=N.createNodeAtPosition(ee.ticket(n,r,o));return c(i)?D(i.message??"Unable to create issue",e):m("Added issue",{action:e,result:i.data})},"add.field":({action:e,payload:t})=>{let{id:n,name:r,parent:o,val:i}=t,a=N.createNodeAtPosition(ee.field(n,r,o,{value:i},r.includes("Description")?"vertical":"horizontal"));return c(a)?D(a.message??`Unable to create field: ${r}`,e):m("Added field",{action:e,result:a.data})},"edit.title":({action:e,payload:t})=>{let{id:n,name:r}=t;if(!N.getNode(n))return D("Unable to locate node",e);let i=N.renameNode(n,r);return c(i)?D(i.message??"Unable to edit title",e):m("Edited title",{action:e,result:i.data})},"delete.node":({action:e,payload:t})=>{let{id:n}=t,r=N.tombstoneNode(n);return c(r)?D(r.message??"Unable to delete node",e):m("Deleted node",{action:e,result:r.data})},"create.tag":({action:e,payload:t})=>{let{id:n,name:r}=t,o=N.createTag({id:n,name:r});return c(o)?D(o.message??"Unable to create tag",e):m("Tag added",{action:e,result:o.data})},"create.contributor":({action:e,payload:t})=>{let{id:n,name:r}=t,o=N.createContributor({id:n,name:r});return c(o)?D(o.message??"Unable to create contributor",e):m("Contributor created",{action:e,result:o.data})},"tag.issue":({action:e,payload:t})=>{let{id:n,target:r,tagId:o}=t,i=N.tag(r,o,n);return c(i)?D(i.message??"Unable to tag issue",e):m("Issue tagged",{action:e,result:i.data})},"assign.issue":({action:e,payload:t})=>{let{id:n,contributor:r,target:o}=t,i=N.assign(o,r,n);return c(i)?D(i.message??"Unable to assign issue",e):m("Assigned successfully",{action:e,result:i.data})},"move.node":({action:e,payload:t})=>{let{id:n,parent:r,pos:o}=t,i=N.moveNode({id:n,parentId:r,position:o});return c(i)?D(i.message??"Failed to move node",e):m("Moved node",{action:e,result:i.data})},"edit.description":({action:e,payload:t})=>{let{id:n,md:r}=t,o=N.editValue(n,r);return c(o)?D(o.message??"Unable to edit description",e):m("Set node value",{action:e,result:o.data})},"close.issue":({action:e,payload:t})=>{let{id:n}=t,r=N.getNode(n);if(!r)return D("Unable to locate issue",e);if(!$e(r))return D("Can only close issues",e);let o=N.getNode(rt);if(!o)return D("Unable to locate target swimlane",e);if(o.id===r.parentNodeId)return D("Cannot close closed issue",e);let a=N.moveNode({id:n,parentId:o.id});return c(a)?D(a.message??"Unable to close issue",e):m("Issue closed",{action:e,result:a.data})},"reopen.issue":({action:e,payload:t})=>{let{id:n}=t,r=N.getNode(n);if(!r)return D("Unable to locate issue",e);if(!$e(r))return D("Can only reopen issues",e);let o=N.getNode(rt);if(!o)return D("Unable to locate closed swimlane",e);if(!(r.parentNodeId===o.id))return D("Issue is not closed",e);let a=Do(r);if(!a)return D("Unable to resolve previous parent from issue history",e);if(a===o.id)return D("Previous parent resolves to closed swimlane",e);if(!N.getNode(a))return D("Previous parent no longer exists",e);let l=N.moveNode({id:n,parentId:a});return c(l)?D(l.message??"Unable to reopen issue",e):m("Issue reopened",{action:e,result:l.data})},"lock.node":({action:e,payload:t})=>{let{id:n}=t,r=N.lockNode(n);return c(r)?D(r.message??"Unable to lock node",e):m("Node locked",{action:e,result:r.data})}},ba=(e,t)=>{let n=N.getNode(e);n&&N.updateNode({...n,log:[...n.log??[],t]})},Ia=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=h().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 ot(e,t=!1){let n=Na[e.action](e);if(c(n))return n;t||([...new Set(Ia(e))].forEach(a=>ba(a,e)),ae(a=>({...a,eventLog:[...a.eventLog,e]})));let r=e.userId,o=e.userName;return!r?.length||!o?.length?D("Invalid user ID format",e.action):(N.createContributor({name:o,id:r}),n)}var je=e=>e.map(t=>ot(t));function ne(e){let t=ot(e);if(t.result!==ye.Success)return t;let n=Jt({event:e});return c(n)?n:t}function Fo(e){return e.map(t=>ne(t))}import It from"node:fs";import{spawn as Ta}from"node:child_process";import Zn from"node:fs";import it from"node:path";var Et=(e,t)=>{let n=new Map,r=t??((...i)=>JSON.stringify(i)),o=((...i)=>{let a=r(...i);if(!n.has(a)){let d=e(...i).then(l=>(c(l)&&n.delete(a),l));n.set(a,d)}return n.get(a)});return o.clear=()=>n.clear(),o};import Ct from"fs";import Oo from"path";import Sa from"util";var ko=1e3,Bo=(e=process.cwd())=>Oo.join(nt(e),xe(),"log","epiq.log");function Aa(e=process.cwd()){if(!Gt)return;let t=Bo(e);if(!Ct.existsSync(t))return;let r=Ct.readFileSync(t,"utf8").split(`
5
5
  `);if(r[r.length-1]===""&&r.pop(),r.length<=ko)return;let o=r.slice(-ko).join(`
6
6
  `)+`
7
- `;Ct.writeFileSync(t,o,"utf8")}function Xn(e,t,n=!1,r=process.cwd()){if(!zt)return;let o=Bo(r),i=Sa.format(...t),a=new Date,l=`[${n?a.toISOString().slice(11,19):a.toISOString()}] ${e} ${i}
8
- `;Ct.mkdirSync(Oo.dirname(o),{recursive:!0}),Ct.appendFileSync(o,l,"utf8"),Aa(r)}var T={info(...e){Xn("[Info]",e,!1)},debug(...e){Xn("->",e,!0)},error(...e){Xn("[Error]",[...e,new Error().stack],!1)}};globalThis.logger=T;var Uo=15e3,wa={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo"},Ho=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!Qn.existsSync(t)){let p=`Git cwd does not exist: ${t}`;if(n){r({stdout:"",stderr:p,exitCode:1});return}r(s(p));return}let o=Ta("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:wa}),i=!1,a="",d="",l=p=>{i||(i=!0,clearTimeout(u),r(p))},u=setTimeout(()=>{o.kill("SIGTERM");let p=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${Uo}ms`].join(`
7
+ `;Ct.writeFileSync(t,o,"utf8")}function Qn(e,t,n=!1,r=process.cwd()){if(!Gt)return;let o=Bo(r),i=Sa.format(...t),a=new Date,l=`[${n?a.toISOString().slice(11,19):a.toISOString()}] ${e} ${i}
8
+ `;Ct.mkdirSync(Oo.dirname(o),{recursive:!0}),Ct.appendFileSync(o,l,"utf8"),Aa(r)}var T={info(...e){Qn("[Info]",e,!1)},debug(...e){Qn("->",e,!0)},error(...e){Qn("[Error]",[...e,new Error().stack],!1)}};globalThis.logger=T;var Uo=15e3,wa={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo"},Ho=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!Zn.existsSync(t)){let p=`Git cwd does not exist: ${t}`;if(n){r({stdout:"",stderr:p,exitCode:1});return}r(s(p));return}let o=Ta("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:wa}),i=!1,a="",d="",l=p=>{i||(i=!0,clearTimeout(u),r(p))},u=setTimeout(()=>{o.kill("SIGTERM");let p=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${Uo}ms`].join(`
9
9
  `);l(n?{stdout:a,stderr:p,exitCode:124}:s(p))},Uo);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",p=>{a+=p}),o.stderr.on("data",p=>{d+=p}),o.on("error",p=>{if(n){l({stdout:a,stderr:p.message,exitCode:1});return}l(s([`git ${e.join(" ")}`,`cwd=${t}`,p.message].join(`
10
10
  `)))}),o.on("close",p=>{let y=p??1;if(n){l({stdout:a,stderr:d,exitCode:y});return}if(y!==0){l(s([`git ${e.join(" ")}`,d.trim()||a.trim()||"Git command failed"].filter(Boolean).join(`
11
- `)));return}l(m("Git command succeeded",{stdout:a,stderr:d,exitCode:y}))})}),F=({args:e,cwd:t})=>Ho({args:e,cwd:t,allowFail:!1}),ze=({args:e,cwd:t})=>Ho({args:e,cwd:t,allowFail:!0}),Zn=Et(async(e=process.cwd())=>{let t=await F({args:["rev-parse","--show-toplevel"],cwd:e});return c(t)?s("Not inside a Git repository"):m("Resolved repo root",t.data.stdout.trim())},e=>ot.resolve(e)),Ma=Et(async e=>{let t=await F({args:["rev-parse","--git-dir"],cwd:e});if(c(t))return s(t.message);let n=t.data.stdout.trim(),r=ot.isAbsolute(n)?n:ot.join(e,n);return m("Resolved git dir",r)},e=>ot.resolve(e)),er=async({cwd:e,message:t})=>{let n=await F({args:["commit","-m",t],cwd:e});if(c(n))return s(`Failed to create commit
11
+ `)));return}l(m("Git command succeeded",{stdout:a,stderr:d,exitCode:y}))})}),F=({args:e,cwd:t})=>Ho({args:e,cwd:t,allowFail:!1}),ze=({args:e,cwd:t})=>Ho({args:e,cwd:t,allowFail:!0}),er=Et(async(e=process.cwd())=>{let t=await F({args:["rev-parse","--show-toplevel"],cwd:e});return c(t)?s("Not inside a Git repository"):m("Resolved repo root",t.data.stdout.trim())},e=>it.resolve(e)),Ma=Et(async e=>{let t=await F({args:["rev-parse","--git-dir"],cwd:e});if(c(t))return s(t.message);let n=t.data.stdout.trim(),r=it.isAbsolute(n)?n:it.join(e,n);return m("Resolved git dir",r)},e=>it.resolve(e)),tr=async({cwd:e,message:t})=>{let n=await F({args:["commit","-m",t],cwd:e});if(c(n))return s(`Failed to create commit
12
12
  ${n.message}`);let r=await F({args:["rev-parse","HEAD"],cwd:e});return c(r)?s(`Commit created, but failed to read HEAD SHA
13
- ${r.message}`):m("Created commit and resolved SHA",r.data.stdout.trim())},Nt=async e=>{let t=await Ma(e);if(c(t))return s(t.message);let n=t.data,o=["MERGE_HEAD","CHERRY_PICK_HEAD","REVERT_HEAD","REBASE_HEAD","rebase-merge","rebase-apply"].filter(i=>Qn.existsSync(ot.join(n,i)));return m("Checked for in-progress Git operation",o.length>0)},en=async({repoRoot:e,remote:t})=>{let n=await ze({args:["remote","get-url",t],cwd:e});return m("Checked remote",n.exitCode===0)},tn=async({repoRoot:e,remote:t,branch:n})=>{let r=await ze({args:["ls-remote","--heads",t,n],cwd:e});return r.exitCode!==0?s(r.stderr.trim()||`Unable to inspect remote branch ${t}/${n}`):m("Checked remote branch",r.stdout.trim().length>0)},_o=async({repoRoot:e,branch:t})=>{let n=await ze({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?m("Local branch exists",!0):n.exitCode===1?m("Local branch missing",!1):s(n.stderr.trim()||`Unable to inspect branch ${t}`)},Wo=e=>{try{return Qn.realpathSync.native(e)}catch{return ot.resolve(e)}},$o=async({repoRoot:e,worktreeRoot:t})=>{let n=await F({args:["worktree","list","--porcelain"],cwd:e});if(c(n))return s(n.message);let r=Wo(t),o=n.data.stdout.split(`
14
- `).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(Wo).includes(r);return m("Checked worktree registration",o)},tr=async e=>{let t=await ze({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return m("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},nn=async e=>{let t=await F({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return c(t)?s(t.message):m("Resolved current branch",t.data.stdout.trim())},Ko=async e=>{let t=await F({args:["rev-parse","--short","HEAD"],cwd:e});return c(t)?s(t.message):m("Resolved short HEAD sha",t.data.stdout.trim())},Vo=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),rn=async({cwd:e,remote:t,branch:n})=>{let r=await tn({repoRoot:e,remote:t,branch:n});if(c(r))return s(r.message);if(!r.data)return m("Remote branch missing, skipped pull",!1);T.debug("[git] fetch start",{cwd:e,remote:t,branch:n});let o=await F({args:["fetch",t,n],cwd:e});if(T.debug("[git] fetch done",o),c(o))return s(`Failed to fetch ${n}
13
+ ${r.message}`):m("Created commit and resolved SHA",r.data.stdout.trim())},Nt=async e=>{let t=await Ma(e);if(c(t))return s(t.message);let n=t.data,o=["MERGE_HEAD","CHERRY_PICK_HEAD","REVERT_HEAD","REBASE_HEAD","rebase-merge","rebase-apply"].filter(i=>Zn.existsSync(it.join(n,i)));return m("Checked for in-progress Git operation",o.length>0)},tn=async({repoRoot:e,remote:t})=>{let n=await ze({args:["remote","get-url",t],cwd:e});return m("Checked remote",n.exitCode===0)},nn=async({repoRoot:e,remote:t,branch:n})=>{let r=await ze({args:["ls-remote","--heads",t,n],cwd:e});return r.exitCode!==0?s(r.stderr.trim()||`Unable to inspect remote branch ${t}/${n}`):m("Checked remote branch",r.stdout.trim().length>0)},_o=async({repoRoot:e,branch:t})=>{let n=await ze({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?m("Local branch exists",!0):n.exitCode===1?m("Local branch missing",!1):s(n.stderr.trim()||`Unable to inspect branch ${t}`)},Wo=e=>{try{return Zn.realpathSync.native(e)}catch{return it.resolve(e)}},$o=async({repoRoot:e,worktreeRoot:t})=>{let n=await F({args:["worktree","list","--porcelain"],cwd:e});if(c(n))return s(n.message);let r=Wo(t),o=n.data.stdout.split(`
14
+ `).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(Wo).includes(r);return m("Checked worktree registration",o)},nr=async e=>{let t=await ze({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return m("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},rn=async e=>{let t=await F({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return c(t)?s(t.message):m("Resolved current branch",t.data.stdout.trim())},Ko=async e=>{let t=await F({args:["rev-parse","--short","HEAD"],cwd:e});return c(t)?s(t.message):m("Resolved short HEAD sha",t.data.stdout.trim())},Vo=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),on=async({cwd:e,remote:t,branch:n})=>{let r=await nn({repoRoot:e,remote:t,branch:n});if(c(r))return s(r.message);if(!r.data)return m("Remote branch missing, skipped pull",!1);T.debug("[git] fetch start",{cwd:e,remote:t,branch:n});let o=await F({args:["fetch",t,n],cwd:e});if(T.debug("[git] fetch done",o),c(o))return s(`Failed to fetch ${n}
15
15
  ${o.message}`);T.debug("[git] pull start",{cwd:e,remote:t,branch:n});let i=await F({args:["pull","--rebase",t,n],cwd:e});return T.debug("[git] pull done",i),c(i)?s(`Failed during pull --rebase
16
- ${i.message}`):m("Pulled with rebase",!0)},jo=async e=>{let t=await F({args:["status","--porcelain"],cwd:e});return c(t)?s(t.message):m("Checked remote worktree changes",t.data.stdout.trim().length>0)},zo=async e=>{let t=await nn(e);return c(t)?s(t.message):m("Checked detached HEAD state",t.data==="HEAD")};import{createHash as ka}from"node:crypto";import ve from"node:fs";import Oa from"node:os";import X from"node:path";import on from"node:fs";import Ra from"node:path";import{decodeTime as La}from"ulid";var nr=e=>{let[t,n]=e.id;return`${t}:${n??""}`},Go=e=>{let[t]=e.id;return La(t)},Pa=e=>{let{userId:t,userName:n,...r}=e;return r},Da=e=>e.length===0?"":e.map(t=>JSON.stringify(Pa(t))).join(`
16
+ ${i.message}`):m("Pulled with rebase",!0)},jo=async e=>{let t=await F({args:["status","--porcelain"],cwd:e});return c(t)?s(t.message):m("Checked remote worktree changes",t.data.stdout.trim().length>0)},zo=async e=>{let t=await rn(e);return c(t)?s(t.message):m("Checked detached HEAD state",t.data==="HEAD")};import{createHash as ka}from"node:crypto";import ve from"node:fs";import Oa from"node:os";import X from"node:path";import sn from"node:fs";import Ra from"node:path";import{decodeTime as La}from"ulid";var rr=e=>{let[t,n]=e.id;return`${t}:${n??""}`},Go=e=>{let[t]=e.id;return La(t)},Pa=e=>{let{userId:t,userName:n,...r}=e;return r},Da=e=>e.length===0?"":e.map(t=>JSON.stringify(Pa(t))).join(`
17
17
  `)+`
18
- `,Fa=(e,t)=>{let n=new Map;for(let r of[...t,...e])n.set(nr(r),r);return[...n.values()].sort((r,o)=>{let i=Go(r)-Go(o);return i!==0?i:nr(r).localeCompare(nr(o))})},sn=({sourceFile:e,targetFile:t})=>{let n=Qt(e);if(c(n))return s(n.message);let r=Qt(t);if(c(r))return s(r.message);let o=Fa(r.data,n.data),i=Da(o);return(on.existsSync(t)?on.readFileSync(t,"utf8"):"")===i?m("Event file already merged",!1):(on.mkdirSync(Ra.dirname(t),{recursive:!0}),on.writeFileSync(t,i,"utf8"),m("Merged event file",!0))};var k="epiq/events",J="origin",rr=xe(),Yo="events",Ba="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Ua=e=>X.join(rr,Yo,e),Wa=e=>ka("sha1").update(X.resolve(e)).digest("hex").slice(0,12),Jo=()=>X.join(Oa.homedir(),".epiq"),Xo=()=>X.join(Jo(),"worktrees"),or=e=>X.join(Xo(),Wa(e)),Ha=e=>X.join(e,rr),it=e=>X.join(Ha(e),Yo),bt=({root:e,fileName:t})=>X.join(it(e),t),an=e=>(T.debug("[sync] ensure dir",e),ve.mkdirSync(e,{recursive:!0}),m("Ensured directory",void 0)),_a=()=>{T.debug("[sync] ensure epiq storage");let e=an(Jo());if(c(e))return s(e.message);let t=an(Xo());return c(t)?s(t.message):m("Ensured epiq storage",void 0)},$a=e=>{ve.existsSync(e)&&(T.debug("[sync] remove path",e),ve.rmSync(e,{recursive:!0,force:!0}))},Ka=e=>{let t=it(e);if(!ve.existsSync(t))return T.debug("[sync] events dir missing",t),m("Events dir missing",[]);let n=ve.readdirSync(t,{withFileTypes:!0}).filter(r=>r.isFile()).map(r=>r.name).filter(r=>r.endsWith(".jsonl")).sort();return T.debug("[sync] listed event files",{eventsDir:t,count:n.length}),m("Listed event files",n)},Va=async e=>{T.debug("[sync] inspect local HEAD",e);let t=await ze({args:["rev-parse","--verify","HEAD"],cwd:e});return t.exitCode===0?m("Repo has HEAD",!0):t.exitCode===1?m("Repo has no HEAD",!1):s(t.stderr.trim()||"Unable to inspect HEAD")},ja=Et(async e=>{T.debug("[sync] inspect remote history",{repoRoot:e,remote:J});let t=await en({repoRoot:e,remote:J});if(c(t))return s(t.message);if(!t.data)return m("No remote configured",!1);let n=await ze({args:["ls-remote","--heads",J],cwd:e});if(n.exitCode!==0)return s(n.stderr.trim()||"Unable to inspect remote heads");let r=n.stdout.trim().length>0;return T.debug("[sync] remote history",r),m("Checked remote history",r)},e=>X.resolve(e)),ir=async e=>{T.debug("[sync] ensure initial commit");let t=await Va(e);if(c(t))return s(t.message);if(t.data)return T.debug("[sync] local HEAD exists"),m("Repo already initialized",!1);let n=await ja(e);if(c(n))return s(n.message);if(n.data)return T.debug("[sync] skip local init commit due to remote history"),m("Skipped local init commit because remote history exists",!1);T.debug("[sync] create empty init commit");let r=await F({args:["commit","--allow-empty","-m","[epiq:init]"],cwd:e});return c(r)?s(`Failed to create initial commit
19
- ${r.message}`):m("Created initial commit",!0)},sr=({repoRoot:e,worktreeRoot:t})=>{let n=Ka(t);if(c(n))return s(n.message);let r=it(t),o=it(e),i=!1;for(let a of n.data){let d=X.join(r,a),l=X.join(o,a);T.debug("[sync] hydrate event file",{from:d,to:l});let u=sn({sourceFile:d,targetFile:l});if(c(u))return s(u.message);i=i||u.data}return T.debug("[sync] hydrate changed",i),m("Hydrated event files from remote worktree",i)},qo=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",za=async e=>{let t=await nn(e);if(c(t))return s(t.message);let n=await Ko(e);if(c(n))return s(n.message);let r=`[epiq:sync:${qo(t.data)}:${qo(n.data)}]`;return T.debug("[sync] commit message",r),m("Built sync commit message",r)},Ga=async e=>{T.debug("[sync] create empty storage branch",k);let t=await F({args:["commit-tree",Ba,"-m","[epiq:init-storage-branch]"],cwd:e});if(c(t))return s(`Failed to create storage branch commit
18
+ `,Fa=(e,t)=>{let n=new Map;for(let r of[...t,...e])n.set(rr(r),r);return[...n.values()].sort((r,o)=>{let i=Go(r)-Go(o);return i!==0?i:rr(r).localeCompare(rr(o))})},an=({sourceFile:e,targetFile:t})=>{let n=Zt(e);if(c(n))return s(n.message);let r=Zt(t);if(c(r))return s(r.message);let o=Fa(r.data,n.data),i=Da(o);return(sn.existsSync(t)?sn.readFileSync(t,"utf8"):"")===i?m("Event file already merged",!1):(sn.mkdirSync(Ra.dirname(t),{recursive:!0}),sn.writeFileSync(t,i,"utf8"),m("Merged event file",!0))};var k="epiq/events",J="origin",or=xe(),Yo="events",Ba="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Ua=e=>X.join(or,Yo,e),Wa=e=>ka("sha1").update(X.resolve(e)).digest("hex").slice(0,12),Jo=()=>X.join(Oa.homedir(),".epiq"),Xo=()=>X.join(Jo(),"worktrees"),ir=e=>X.join(Xo(),Wa(e)),Ha=e=>X.join(e,or),st=e=>X.join(Ha(e),Yo),bt=({root:e,fileName:t})=>X.join(st(e),t),dn=e=>(T.debug("[sync] ensure dir",e),ve.mkdirSync(e,{recursive:!0}),m("Ensured directory",void 0)),_a=()=>{T.debug("[sync] ensure epiq storage");let e=dn(Jo());if(c(e))return s(e.message);let t=dn(Xo());return c(t)?s(t.message):m("Ensured epiq storage",void 0)},$a=e=>{ve.existsSync(e)&&(T.debug("[sync] remove path",e),ve.rmSync(e,{recursive:!0,force:!0}))},Ka=e=>{let t=st(e);if(!ve.existsSync(t))return T.debug("[sync] events dir missing",t),m("Events dir missing",[]);let n=ve.readdirSync(t,{withFileTypes:!0}).filter(r=>r.isFile()).map(r=>r.name).filter(r=>r.endsWith(".jsonl")).sort();return T.debug("[sync] listed event files",{eventsDir:t,count:n.length}),m("Listed event files",n)},Va=async e=>{T.debug("[sync] inspect local HEAD",e);let t=await ze({args:["rev-parse","--verify","HEAD"],cwd:e});return t.exitCode===0?m("Repo has HEAD",!0):t.exitCode===1?m("Repo has no HEAD",!1):s(t.stderr.trim()||"Unable to inspect HEAD")},ja=Et(async e=>{T.debug("[sync] inspect remote history",{repoRoot:e,remote:J});let t=await tn({repoRoot:e,remote:J});if(c(t))return s(t.message);if(!t.data)return m("No remote configured",!1);let n=await ze({args:["ls-remote","--heads",J],cwd:e});if(n.exitCode!==0)return s(n.stderr.trim()||"Unable to inspect remote heads");let r=n.stdout.trim().length>0;return T.debug("[sync] remote history",r),m("Checked remote history",r)},e=>X.resolve(e)),sr=async e=>{T.debug("[sync] ensure initial commit");let t=await Va(e);if(c(t))return s(t.message);if(t.data)return T.debug("[sync] local HEAD exists"),m("Repo already initialized",!1);let n=await ja(e);if(c(n))return s(n.message);if(n.data)return T.debug("[sync] skip local init commit due to remote history"),m("Skipped local init commit because remote history exists",!1);T.debug("[sync] create empty init commit");let r=await F({args:["commit","--allow-empty","-m","[epiq:init]"],cwd:e});return c(r)?s(`Failed to create initial commit
19
+ ${r.message}`):m("Created initial commit",!0)},ar=({repoRoot:e,worktreeRoot:t})=>{let n=Ka(t);if(c(n))return s(n.message);let r=st(t),o=st(e),i=!1;for(let a of n.data){let d=X.join(r,a),l=X.join(o,a);T.debug("[sync] hydrate event file",{from:d,to:l});let u=an({sourceFile:d,targetFile:l});if(c(u))return s(u.message);i=i||u.data}return T.debug("[sync] hydrate changed",i),m("Hydrated event files from remote worktree",i)},qo=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",za=async e=>{let t=await rn(e);if(c(t))return s(t.message);let n=await Ko(e);if(c(n))return s(n.message);let r=`[epiq:sync:${qo(t.data)}:${qo(n.data)}]`;return T.debug("[sync] commit message",r),m("Built sync commit message",r)},Ga=async e=>{T.debug("[sync] create empty storage branch",k);let t=await F({args:["commit-tree",Ba,"-m","[epiq:init-storage-branch]"],cwd:e});if(c(t))return s(`Failed to create storage branch commit
20
20
  ${t.message}`);let n=t.data.stdout.trim(),r=await F({args:["update-ref",`refs/heads/${k}`,n],cwd:e});return c(r)?s(`Failed to create ${k}
21
- ${r.message}`):m("Created empty storage branch",!0)},qa=async({repoRoot:e})=>{T.debug("[sync] ensure local remote branch",k);let t=await _o({repoRoot:e,branch:k});if(c(t))return s(t.message);if(t.data)return T.debug("[sync] local remote branch exists"),m("Local remote branch already exists",!1);let n=await en({repoRoot:e,remote:J});if(c(n))return s(n.message);if(n.data){let r=await tn({repoRoot:e,remote:J,branch:k});if(c(r))return s(r.message);if(r.data){T.debug("[sync] fetch remote branch before local track");let o=await F({args:["fetch",J,k],cwd:e});if(c(o))return s(`Failed to fetch ${k} from remote
21
+ ${r.message}`):m("Created empty storage branch",!0)},qa=async({repoRoot:e})=>{T.debug("[sync] ensure local remote branch",k);let t=await _o({repoRoot:e,branch:k});if(c(t))return s(t.message);if(t.data)return T.debug("[sync] local remote branch exists"),m("Local remote branch already exists",!1);let n=await tn({repoRoot:e,remote:J});if(c(n))return s(n.message);if(n.data){let r=await nn({repoRoot:e,remote:J,branch:k});if(c(r))return s(r.message);if(r.data){T.debug("[sync] fetch remote branch before local track");let o=await F({args:["fetch",J,k],cwd:e});if(c(o))return s(`Failed to fetch ${k} from remote
22
22
  ${o.message}`);T.debug("[sync] create local tracking branch",k);let i=await F({args:["branch","--track",k,`${J}/${k}`],cwd:e});return c(i)?s(`Failed to create local ${k} from remote
23
23
  ${i.message}`):m("Created local remote branch from remote",!0)}}return Ga(e)},Ya=async({repoRoot:e,branch:t})=>{let n=await F({args:["worktree","list","--porcelain"],cwd:e});if(c(n))return s(n.message);let r=n.data.stdout.split(`
24
- `),o=null;for(let i of r){if(i.startsWith("worktree ")){o=i.slice(9);continue}if(i===`branch refs/heads/${t}`&&o)return m("Found worktree for branch",o)}return m("No worktree found for branch",null)},Ja=async({repoRoot:e,worktreeRoot:t})=>{T.debug("[sync] create remote worktree",t);let n=an(X.dirname(t));if(c(n))return s(n.message);ve.existsSync(t)&&!ve.existsSync(X.join(t,".git"))&&(T.debug("[sync] remove broken remote worktree path",t),$a(t));let r=await F({args:["worktree","add",t,k],cwd:e});return c(r)?s(`Failed to create remote worktree
24
+ `),o=null;for(let i of r){if(i.startsWith("worktree ")){o=i.slice(9);continue}if(i===`branch refs/heads/${t}`&&o)return m("Found worktree for branch",o)}return m("No worktree found for branch",null)},Ja=async({repoRoot:e,worktreeRoot:t})=>{T.debug("[sync] create remote worktree",t);let n=dn(X.dirname(t));if(c(n))return s(n.message);ve.existsSync(t)&&!ve.existsSync(X.join(t,".git"))&&(T.debug("[sync] remove broken remote worktree path",t),$a(t));let r=await F({args:["worktree","add",t,k],cwd:e});return c(r)?s(`Failed to create remote worktree
25
25
  ${r.message}`):m("Created remote worktree",!0)},Xa=async({repoRoot:e,worktreeRoot:t})=>{T.debug("[sync] ensure remote worktree",t);let n=await Ya({repoRoot:e,branch:k});if(c(n))return s(n.message);let r=n.data,o=X.resolve(t),i=r?X.resolve(r):null;if(i&&i===o&&ve.existsSync(i))return T.debug("[sync] reuse existing remote branch worktree",{expected:o,actual:i}),m("Remote branch already checked out in expected worktree",!1);if(i&&i!==o){T.debug("[sync] remove old remote branch worktree",{expected:o,actual:i});let l=await F({args:["worktree","remove","--force",i],cwd:e});if(c(l))return s(`Failed to remove existing remote worktree
26
26
  ${l.message}`)}if(i&&!ve.existsSync(i)){T.debug("[sync] prune stale branch worktree registration",{existingBranchWorktree:i});let l=await F({args:["worktree","prune"],cwd:e});if(c(l))return s(`Failed to prune stale worktrees
27
27
  ${l.message}`)}let a=await $o({repoRoot:e,worktreeRoot:t});if(c(a))return s(a.message);let d=ve.existsSync(t);if(a.data&&d)return T.debug("[sync] remote worktree exists"),m("Remote worktree already exists",!1);if(a.data&&!d){T.debug("[sync] prune stale remote worktree registration");let l=await F({args:["worktree","prune"],cwd:e});if(c(l))return s(`Failed to prune stale worktrees
28
- ${l.message}`)}return Ja({repoRoot:e,worktreeRoot:t})},Qa=async e=>{let t=await nn(e);if(c(t))return s(t.message);if(t.data===k)return T.debug("[sync] remote branch already checked out"),m("Remote branch already checked out",!1);T.debug("[sync] checkout remote branch",k);let n=await F({args:["checkout",k],cwd:e});return c(n)?s(`Failed to checkout ${k}
28
+ ${l.message}`)}return Ja({repoRoot:e,worktreeRoot:t})},Qa=async e=>{let t=await rn(e);if(c(t))return s(t.message);if(t.data===k)return T.debug("[sync] remote branch already checked out"),m("Remote branch already checked out",!1);T.debug("[sync] checkout remote branch",k);let n=await F({args:["checkout",k],cwd:e});return c(n)?s(`Failed to checkout ${k}
29
29
  ${n.message}`):m("Checked out remote branch",!0)},Za=async e=>{let t=await F({args:["ls-tree","--name-only","HEAD"],cwd:e});if(c(t))return s(t.message);let r=t.data.stdout.trim().split(`
30
- `).filter(Boolean).filter(a=>a!==rr);if(r.length===0)return m("Remote branch is storage-only",!1);T.debug("[sync] remove app files from storage branch",r);let o=await F({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(c(o))return s(`Failed to clean storage branch
31
- ${o.message}`);let i=await er({cwd:e,message:"[epiq:repair-storage-branch]"});return c(i)?s(i.message):m("Cleaned storage branch",!0)},ed=async e=>{T.debug("[sync] ensure remote upstream",k);let t=await tr(e);if(c(t))return s(t.message);if(t.data)return T.debug("[sync] remote upstream already configured"),m("Remote upstream already configured",!1);let n=await en({repoRoot:e,remote:J});if(c(n))return s(n.message);if(!n.data)return T.debug("[sync] no remote configured for upstream"),m("No remote available for upstream",!1);let r=await tn({repoRoot:e,remote:J,branch:k});if(c(r))return s(r.message);if(!r.data)return T.debug("[sync] remote branch missing; upstream will be configured on first push"),m("Deferred upstream until first push",!1);T.debug("[sync] fetch remote branch before upstream set");let o=await F({args:["fetch",J,k],cwd:e});if(c(o))return s(`Failed to fetch ${k}
30
+ `).filter(Boolean).filter(a=>a!==or);if(r.length===0)return m("Remote branch is storage-only",!1);T.debug("[sync] remove app files from storage branch",r);let o=await F({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(c(o))return s(`Failed to clean storage branch
31
+ ${o.message}`);let i=await tr({cwd:e,message:"[epiq:repair-storage-branch]"});return c(i)?s(i.message):m("Cleaned storage branch",!0)},ed=async e=>{T.debug("[sync] ensure remote upstream",k);let t=await nr(e);if(c(t))return s(t.message);if(t.data)return T.debug("[sync] remote upstream already configured"),m("Remote upstream already configured",!1);let n=await tn({repoRoot:e,remote:J});if(c(n))return s(n.message);if(!n.data)return T.debug("[sync] no remote configured for upstream"),m("No remote available for upstream",!1);let r=await nn({repoRoot:e,remote:J,branch:k});if(c(r))return s(r.message);if(!r.data)return T.debug("[sync] remote branch missing; upstream will be configured on first push"),m("Deferred upstream until first push",!1);T.debug("[sync] fetch remote branch before upstream set");let o=await F({args:["fetch",J,k],cwd:e});if(c(o))return s(`Failed to fetch ${k}
32
32
  ${o.message}`);T.debug("[sync] set upstream to remote branch");let i=await F({args:["branch","--set-upstream-to",`${J}/${k}`,k],cwd:e});return c(i)?s(`Failed to set remote upstream
33
33
  ${i.message}`):m("Configured remote upstream",!0)},Qo=async({worktreeRoot:e,ownEventFileName:t})=>{T.debug("[sync] stage own event file in remote worktree",t);let n=await F({args:["add",Ua(t)],cwd:e});return c(n)?s(`Failed to stage remote own event file
34
- ${n.message}`):m("Staged remote own event file",void 0)},Zo=async({repoRoot:e,worktreeRoot:t})=>{let n=await za(e);return c(n)?s(n.message):(T.debug("[sync] create remote sync commit"),er({cwd:t,message:n.data}))},ar=async e=>{T.debug("[sync] push remote worktree");let t=await tr(e);if(c(t))return s(t.message);let n=await F({args:t.data?["push"]:["push","-u",J,k],cwd:e});return T.debug("[sync] push result",n),c(n)?s(`Failed during remote push
35
- ${n.message}`):m("Pushed remote",!0)},dr=async({repoRoot:e,worktreeRoot:t,ensureUpstream:n})=>{T.debug("[sync] bootstrap remote storage",{repoRoot:e,worktreeRoot:t,ensureUpstream:n});let r=!1,o=[_a(),await qa({repoRoot:e}),await Xa({repoRoot:e,worktreeRoot:t}),await Qa(t),await Za(t),n?await ed(t):m("Skipped remote upstream bootstrap",!1)];for(let i of o){if(c(i))return s(i.message);r=r||!!i.data}return T.debug("[sync] bootstrap changed",r),m(n?"Bootstrapped remote storage":"Bootstrapped remote storage (readonly)",r)},cr=(e,t)=>{for(let n of[it(e),it(t)]){let r=an(n);if(c(r))return s(r.message)}return m("Ensured remote layout",void 0)};var ni=async(e=process.cwd())=>{logger.debug("[sync] start readonly sync",{cwd:e});let t=await Zn(e);if(c(t))return s(t.message);let n=t.data,r=or(n);logger.debug("[sync] resolved readonly roots",{repoRoot:n,worktreeRoot:r});let o=await Nt(n);if(c(o))return s(o.message);if(o.data)return s("Cannot sync while a git operation is in progress in the current repo");let i=await ir(n);if(c(i))return s(i.message);logger.debug("[sync] readonly ensure initial commit changed",i.data);let a=await dr({repoRoot:n,worktreeRoot:r,ensureUpstream:!1});if(c(a))return s(a.message);let d=await Nt(r);if(c(d))return s(d.message);if(d.data)return s("Cannot sync while a git operation is in progress in the remote worktree");let l=cr(n,r);if(c(l))return s(l.message);logger.debug("[sync] readonly pull remote branch");let u=await rn({cwd:r,remote:J,branch:k});if(c(u))return s(u.message);logger.debug("[sync] readonly pulled remote",u.data);let p=sr({repoRoot:n,worktreeRoot:r});return c(p)?s(p.message):(logger.debug("[sync] readonly hydrated from remote",p.data),m("Synced from remote",{repoRoot:n,worktreeRoot:r}))},td=({repoRoot:e,worktreeRoot:t,ownEventFileName:n})=>{let r=bt({root:e,fileName:n}),o=bt({root:t,fileName:n});return It.existsSync(r)?(logger.debug("[sync] merge own event file to remote",{ownEventFileName:n,localFile:r,remoteFile:o}),sn({sourceFile:r,targetFile:o})):(logger.debug("[sync] local own event file missing",r),m("Local own event file missing, nothing to merge",!1))},ei=async({repoRoot:e,worktreeRoot:t,ownEventFileName:n})=>{let r=td({repoRoot:e,worktreeRoot:t,ownEventFileName:n});if(c(r))return s(r.message);let o=await jo(t);if(c(o))return s(o.message);if(!r.data&&!o.data)return m("Own event file already up to date in remote worktree",{createdCommit:!1});let i=await Qo({worktreeRoot:t,ownEventFileName:n});if(c(i))return s(i.message);let a=await Zo({repoRoot:e,worktreeRoot:t});return c(a)?s(a.message):m("Merged, staged, and committed own event file",{createdCommit:!0,commitSha:a.data})},ti=({repoRoot:e,worktreeRoot:t,ownEventFileName:n})=>{let r=bt({root:e,fileName:n}),o=bt({root:t,fileName:n});logger.debug("[sync] own event file sizes",{local:It.existsSync(r)?It.statSync(r).size:0,remote:It.existsSync(o)?It.statSync(o).size:0})},ri=async({cwd:e=process.cwd(),ownEventFileName:t})=>{logger.debug("[sync] start write sync",{cwd:e,ownEventFileName:t});let n=await Zn(e);if(c(n))return s(n.message);let r=n.data,o=or(r);logger.debug("[sync] resolved roots",{repoRoot:r,worktreeRoot:o});let i=await zo(r);if(c(i))return s(i.message);if(i.data)return s("Cannot run :sync while the repository is in detached HEAD state");if(t.includes("/")||t.includes("\\"))return s("Own event file must be a file name, not a path");if(!t.endsWith(".jsonl"))return s("Own event file must end with .jsonl");let a=await Nt(r);if(c(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 ir(r);if(c(d))return s(d.message);logger.debug("[sync] ensure initial commit changed",d.data);let l=await dr({repoRoot:r,worktreeRoot:o,ensureUpstream:!0});if(c(l))return s(l.message);let u=await Nt(o);if(c(u))return s(u.message);if(u.data)return s("Cannot run :sync while a merge, rebase, cherry-pick, or revert is in progress in the remote worktree");let p=cr(r,o);if(c(p))return s(p.message);let y=!1,C,b=!1,I=!1,A=!1;logger.debug("[sync] pull remote branch before local copy");let S=await rn({cwd:o,remote:J,branch:k});if(c(S))return s(S.message);b=S.data,logger.debug("[sync] pulled remote",b);let M=sr({repoRoot:r,worktreeRoot:o});if(c(M))return s(M.message);A=M.data,logger.debug("[sync] hydrated from remote",A);let B=await ei({repoRoot:r,worktreeRoot:o,ownEventFileName:t});if(c(B))return s(B.message);if(y=B.data.createdCommit,C=B.data.commitSha,ti({repoRoot:r,worktreeRoot:o,ownEventFileName:t}),logger.debug("[sync] sync own file result",B.data),y||l.data){let G=await ar(o),oe=G;if(c(G)&&Vo(G.message)){let Lt=await rn({cwd:o,remote:J,branch:k});if(c(Lt))return s(Lt.message);let De=await ei({repoRoot:r,worktreeRoot:o,ownEventFileName:t});if(c(De))return s(De.message);De.data.createdCommit&&(y=!0,C=De.data.commitSha),ti({repoRoot:r,worktreeRoot:o,ownEventFileName:t}),logger.debug("[sync] retry sync own file result",De.data),oe=await ar(o)}if(c(oe))return s(oe.message);I=oe.data,logger.debug("[sync] pushed remote",I)}else logger.debug("[sync] no commit created, skipped push");if(y){let G=await F({args:["rev-parse","HEAD"],cwd:o});if(c(G))return s(G.message);C=G.data.stdout.trim()}return m("Synced event logs with remote",{repoRoot:r,worktreeRoot:o,createdCommit:y,commitSha:C,pulled:b,pushed:I,hydrated:A,bootstrapped:l.data})};import{ulid as oi}from"ulid";var st=null,Oe=()=>structuredClone(st),at=e=>st=e,ii=()=>{let{currentNode:e,selectedIndex:t}=h(),r=R(e.id)[t];return r?m("Resolved selected child",r):s("Target node not found")};function lr(e){let t=ii();if(c(t))return t;let{currentNode:n,nodes:r}=h();if(!n.parentNodeId)return s("Missing parent node id");let o=r[n.parentNodeId];if(!o)return s("Missing parent node");let i=_(o.id),a=i.findIndex(({id:C})=>C===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 l=te();if(c(l))return s("Unable to resolve user ID");let{userId:u,userName:p}=l.data;if(at({id:oi(),userId:u,userName:p,action:"move.node",payload:{id:t.data.id,parent:d.id,pos:{at:"end"}}}),!st)return s("Could not materialize move state");let y=rt(st,!0);return c(y)?y:m("Node moved successfully",y.data)}function mr(e){let t=ii();if(c(t))return t;let{currentNode:n,selectedIndex:r}=h(),i=_(n.id)[r+e];if(!i)return s("Missing sibling node");let a=te();if(c(a))return s("Unable to resolve user ID");let{userId:d,userName:l}=a.data;if(at({id:oi(),userId:d,userName:l,action:"move.node",payload:{id:t.data.id,parent:n.id,pos:{at:e===1?"after":"before",sibling:i.id}}}),!st)return s("Could not materialize move state");let u=rt(st,!0);return c(u)?u:m("Node moved successfully",u.data)}import nd from"node:os";import si from"node:path";import{z as dn}from"zod";var rd={userId:"",userName:"",preferredEditor:""},ai=dn.object({preferredEditor:dn.string().optional(),userName:dn.string().optional(),userId:dn.string().optional()}).strict(),od=".epiq",id="config.json",di=()=>si.join(nd.homedir(),od),ur=()=>si.join(di(),id),pr=()=>{try{return ce.mkDir(di()),m("Ensured ~/.epiq exists",null)}catch{return s("Unable to create ~/.epiq")}},sd=e=>{let t;try{t=JSON.parse(e)}catch{return s("Invalid ~/.epiq/config.json JSON")}let n=ai.safeParse(t??{});return n.success?m("Parsed config",n.data):s(`Invalid ~/.epiq/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},ci=()=>{let e=pr();if(c(e))return s(e.message);let t=ur(),n=ce.readFile(t);return n==null||n.trim()===""?m("No config found, using empty config",{}):sd(n)},li=e=>{let t=pr();if(c(t))return s(t.message);let n=ai.safeParse(e);if(!n.success)return s(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=ur();try{return ce.writeToFile(r,JSON.stringify(n.data,null,2)+`
36
- `),m("Config written",null)}catch{return s("Unable to write ~/.epiq/config.json")}},gr=e=>{let t=ci();if(c(t))return s("Failed to read existing config");let n={...t.data,...e};return li(n)},mi=()=>{let e=ur(),t=pr();if(c(t))return s("Unable to create ~/.epiq");if(!(ce.readFile(e)!==null)){let d=li(rd);if(c(d))throw new Error("Unable to create ~/.epiq/config.json")}let r=ci();if(c(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:i,userId:a}=r.data;return!i||!a?s("User name or ID not configured in ~/.epiq/config.json"):m("successfully loaded settings",{preferredEditor:o??"",userName:i,userId:a})};var ad=e=>Object.values(h().tags).find(t=>t.name===e),dd=e=>Object.values(h().contributors).find(t=>t.name===e),ui=[{systemOnly:!0,intent:L.Move,mode:f.COMMAND_LINE,action:()=>{let e=te();if(c(e))return s("Unable to resolve user ID");let{modifier:t}=ge().commandMeta,n=()=>{let d=Oe();if(!d)return s("No pending move state");let l=d.payload.id;if(!h().nodes[l])return s("Moved node not found");let p=d.payload.parent,y=h().nodes[p];if(!y)return s("Move parent not found");let C=R(p).findIndex(b=>b.id===l);return C===-1?s("Moved node not found among rendered children"):(U.navigate({currentNode:y,selectedIndex:C}),m("Synchronized navigation to moved node",null))},r=d=>{if(c(d))return s(d.message);let l=n();return c(l)?s(l.message):m("Updated move preview",null)},{currentNode:o,selectedIndex:i}=h(),a=R(o.id)[i];if(!a)return w({mode:f.DEFAULT}),s("No move target");if(t==="start"){if(a.readonly)return s("Target node is read-only");if(i===-1)return s("No item selected");if(!a.parentNodeId)return s("Target has no parent");let d=R(a.parentNodeId),l=d.findIndex(({id:b})=>b===a.id);if(l===-1)return s("Target not found among siblings");let u=d[l-1],p=d[l+1],y=p!=null?{at:"before",sibling:p.id}:u!=null?{at:"after",sibling:u.id}:{at:"start"};at({id:K(),action:"move.node",payload:{id:a.id,parent:a.parentNodeId,pos:y},...e.data}),w({mode:f.MOVE});let C=n();return c(C)?s(C.message):m("Move initialized",null)}if(t==="next")return w({mode:f.MOVE}),r(mr(1));if(t==="previous")return w({mode:f.MOVE}),r(mr(-1));if(t==="to-next")return w({mode:f.MOVE}),r(lr(1));if(t==="to-previous")return w({mode:f.MOVE}),r(lr(-1));if(t==="confirm"){w({mode:f.DEFAULT});let d=Oe();if(!d)return s("No pending move to confirm");let l=ne(d);if(c(l))return l;let u=n();return c(u)?s(u.message):(at(null),m("Moved item",null))}return t==="cancel"?(at(null),w({mode:f.DEFAULT}),m("Cancelling move",null)):s("Invalid move modifier")}},{intent:L.Delete,mode:f.COMMAND_LINE,action:()=>{let e=te();if(c(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=h(),r=R(t.id)[n];return r?ne({id:K(),action:"delete.node",payload:{id:r.id},...e.data}):s("Unable to resolve child to delete")},onSuccess:()=>w({mode:f.DEFAULT})},{intent:L.Edit,mode:f.COMMAND_LINE,action:()=>{let e=te();if(c(e))return s("Unable to resolve user ID");let t=be(h().breadCrumb,"TICKET");if(c(t))return s("Edit target must be an issue");let n=t.data;if(n.readonly)return s("Cannot edit readonly field");let{currentNode:r,selectedIndex:o}=h();if(!R(n.id)[o])return s("No selected field");let a=R(r.id)[o];if(!a)return s("No selected field");if(a.readonly)return s("Cannot edit readonly field");let d=a.props.value;if(typeof d!="string")return s("Selected field is not editable text");let l=Io(d);if(c(l))return s("Failed to edit field");let u=l.data;return u===d?m("No changes made",null):a.title==="Description"?ne({id:K(),action:"edit.description",payload:{id:a.id,md:u},...e.data}):a.title==="Title"?ne({id:K(),action:"edit.title",payload:{id:a.id,name:u},...e.data}):s(`Editing not supported for "${a.title}"`)},onSuccess:()=>w({mode:f.DEFAULT})},{intent:L.Filter,mode:f.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=ge().commandMeta,n=/(!=|=)/,[r,o]=e.split(n);if(!r||!(d=>z(g.FILTER).map(l=>l.split(n)[0]).includes(d))(r))return s("Invalid filter modifier");let a={target:r,operator:"=",value:t.trim()};return ae(d=>({...d,filters:e==="clear"?[]:[...d.filters,a],mode:f.DEFAULT})),m("Viewing help",null)}},{intent:L.ViewHelp,mode:f.COMMAND_LINE,action:()=>(w({mode:f.HELP}),m("Viewing help",null))},{intent:L.CloseIssue,mode:f.COMMAND_LINE,action:()=>{let e=te();if(c(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=h(),r=R(t.id)[n];if(!r)return s("Unable to close issue, no target found");if(!r.parentNodeId)return s("No target parent found");if(!$e(r))return s("Cannot close in this context");let o=ne({id:K(),action:"close.issue",payload:{id:r.id,parent:r.parentNodeId},...e.data});return c(o)?o:m("Viewing help",null)}},{intent:L.ReopenIssue,mode:f.COMMAND_LINE,action:()=>{let e=te();if(c(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=h(),r=R(t.id)[n];if(!r)return s("Unable to reopen issue, no target found");let o=r.context==="TICKET"?m("Resolved ticket",r):Xe(r.id,"TICKET");if(c(o))return s("Cannot reopen in this context");let i=o.data,a=ne({id:K(),action:"reopen.issue",payload:{id:i.id},...e.data});return c(a)?a:m("Issue reopened",null)},onSuccess:()=>w({mode:f.DEFAULT})},{intent:L.SetUserName,mode:f.COMMAND_LINE,action:()=>{let{userId:e,preferredEditor:t,userName:n}=pe(),r=$t()?.trim();if(!r)return s("No username provided");let o=r??n,i=e??K();if(!o||!i)return s("Unable to resolve user name or id");let a=gr({userName:o,userId:i,preferredEditor:t??""});return c(a)?a:(gt({userName:o,userId:i}),w({mode:f.DEFAULT}),m(`Username set to "${r}"`,null))}},{intent:L.Init,mode:f.COMMAND_LINE,action:()=>{let e=yr();if(c(e))return e;let{rootNodeId:t,nodes:n}=h();return U.navigate({currentNode:n[t],selectedIndex:0}),m("Project initialized",null)}},{intent:L.SetEditor,mode:f.COMMAND_LINE,action:()=>{let e=$t()?.trim();if(!e)return s("No editor provided");let t=gr({preferredEditor:e});return c(t)?t:(gt({preferredEditor:e}),w({mode:f.DEFAULT}),m(`Editor configuration set to "${e}"`,null))}},{intent:L.NewItem,mode:f.COMMAND_LINE,action:(e,t)=>{let n=te();if(c(n))return s("Unable to resolve user ID");if(!t.inputString)return s(`provide a name for your ${t.modifier}`);let{breadCrumb:r,currentNode:o,selectedIndex:i}=h(),a=d=>{let l=ne(d);if(c(l))return l;let u=N.getNode(l.data.result.id);if(!u)return s("Created node not found");if(!u.parentNodeId)return l;let p=N.getNode(u.parentNodeId);return p?(U.navigate({currentNode:p,selectedIndex:N.getSiblings(u.parentNodeId).findIndex(({id:y})=>y===u.id)}),l):s("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:d}=h(),l=N.getNode(d);return l?a({id:K(),action:"add.board",payload:{id:K(),name:t.inputString,parent:l.id},...n.data}):s("Workspace not found")}if(t.modifier==="swimlane"){let d=be(r,"BOARD");return c(d)?s("Unable to add swimlane in this context"):a({id:K(),action:"add.swimlane",payload:{id:K(),name:t.inputString,parent:d.data.id},...n.data})}if(t.modifier==="issue"){let d=R(o.id)[i],l=o.context==="SWIMLANE"?o:o.context==="BOARD"&&d?.context==="SWIMLANE"?d:(()=>{let b=be(r,"SWIMLANE");return c(b)?null:b.data})();if(!l)return s("Unable to add issue in this context");let u=So({name:t.inputString,parent:l.id,user:n.data}),p=Fo(u);if(p.some(b=>c(b)))return s("Issue create failed: "+p.filter(c).map(b=>b.message).filter(Boolean).join(", "));let y=p[0];if(!y||c(y))return s("Issue creation failed");let C=u[0]?.payload.id;return C?(U.navigate({currentNode:l,selectedIndex:N.getSiblings(l.id).findIndex(({id:b})=>b===C)}),m("Issue created",null)):s("Unable to determine ticket id")}return Wr()},onSuccess:()=>w({mode:f.DEFAULT})},{intent:L.SetView,mode:f.COMMAND_LINE,action:()=>{let{commandMeta:e}=ge();return e.validity===Ne.Invalid?s("Invalid command "+ye):(ae(t=>({...t,viewMode:e.modifier==="wide"?"wide":e.modifier==="dense"?"dense":t.viewMode})),m("View set",null))},onSuccess:()=>w({mode:f.DEFAULT})},{intent:L.Rename,mode:f.COMMAND_LINE,action:()=>{let e=te();if(c(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=h(),r=R(t.id)[n];if(!r)return s("Missing node");if(r.readonly)return s("Cannot rename readonly node");let o=$t();return o?ne({id:K(),action:"edit.title",payload:{id:r.id,name:o},...e.data}):s("Provide a new name")},onSuccess:()=>w({mode:f.DEFAULT})},{intent:L.TagTicket,mode:f.COMMAND_LINE,action:()=>{let e=te();if(c(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=ge().commandMeta,r=(t||n).trim();if(!r)return s("Provide a tag");let{selectedIndex:o,currentNode:i}=h(),a=R(i.id)[o];if(!a)return s("Invalid tag target");let d=Xe(a.id,"TICKET");if(c(d))return s("Unable to tag issue in this context");let l=d.data,u=ad(r),p;if(u)p=u.id;else{let b=K(),I=ne({id:K(),action:"create.tag",payload:{id:b,name:r},userId:e.data.userId,userName:e.data.userName});if(c(I))return I;p=I.data.result.id}let y=N.getFieldByTitle(l.id,"Tags");return y?R(y.id).some(b=>b.props?.value===p)?s("Already tagged with that tag"):ne({id:K(),action:"tag.issue",payload:{id:K(),target:l.id,tagId:p},...e.data}):s("Unable to locate tags field")},onSuccess:()=>w({mode:f.DEFAULT})},{intent:L.AssignUserToTicket,mode:f.COMMAND_LINE,action:()=>{let e=te();if(c(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=ge().commandMeta,r=(t||n).trim();if(!r)return s("Provide an assignee");let{selectedIndex:o,currentNode:i}=h(),a=R(i.id)[o];if(!a)return s("Invalid assign target");let d=Xe(a.id,"TICKET");if(c(d))return s("Unable to assign issue in this context");let l=d.data,u=dd(r),p;if(u)p=u.id;else{let b=K(),I=ne({id:K(),action:"create.contributor",payload:{id:b,name:r},userId:e.data.userId,userName:e.data.userName});if(c(I))return I;p=I.data.result.id}let y=N.getFieldByTitle(l.id,"Assignees");return y?R(y.id).some(b=>b.props?.value===p)?s("Assignee already assigned"):ne({id:K(),action:"assign.issue",payload:{id:K(),target:l.id,contributor:p},...e.data}):s("Unable to locate assignees field")},onSuccess:()=>w({mode:f.DEFAULT})},{intent:L.Sync,mode:f.COMMAND_LINE,action:async()=>{$(()=>""),w({syncStatus:{msg:"Syncing",status:"syncing"}});let{userId:e,userName:t}=pe();if(!e)return s("Unable to resolve userId");if(!t)return s("Unable to resolve userName");let n=Ke()?yr():m("No pending default events",null);if(c(n))return s(`Unable to persist default events. ${n.message}`);let r=te();if(c(r)||!r.data)return s("Unable to resolve event log path");let o=qn(r.data);logger.debug("[sync-command] pending defaults",Ke());let i=await ri({ownEventFileName:o});if(c(i))return w({syncStatus:{msg:i.message,status:"outOfSync"}}),s(`Unable to sync state. ${i.message}`);w({syncStatus:{msg:"Synced",status:"synced"},mode:f.DEFAULT});let a=ht();return c(a)?s("Unable to load events"):(je(a.data),m("Synced",!0))}},{intent:L.Peek,mode:f.COMMAND_LINE,action:async()=>{let e=be(h().breadCrumb,"BOARD");if(c(e))return e;let t=ht();if(c(t))return s(t.message);let n=t.data,{modifier:r}=ge().commandMeta,o;if(r==="now"){let y=fr();if(c(y))return y;let C=je(n);return C.some(c)?s(C.map(b=>b.message).join(", ")):(w({mode:f.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),m("Peeking now",!0))}if(r==="prev"){let y=h().eventLog.at(-2),C=On(y);if(C===null)return s("No previous event to peek");o=C}else if(r==="next"){let y=h().unappliedEvents.at(0),C=On(y);if(C===null)return s("No next event to peek");o=C}else{let y=Ut(r);if(!y)return s("Invalid peek date");o=y.getTime()}let i=e.data.id,{appliedEvents:a,unappliedEvents:d}=Po(n,o),l=fr();if(c(l))return l;let u=je(a);if(u.some(c))return s(u.map(y=>y.message).join(", "));let p=h().nodes[i];return p?(U.navigate({currentNode:p,selectedIndex:0}),w({mode:f.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:d}),m("Peeking ",!0)):s("Board did not exist at peek date")}}];var cd=new Set(["peek","filter","view-help"]),le=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=ge();if(!t)return s("No command to confirm");if(!e&&n===Ne.Invalid)return s("Invalid command");let i=ho(t);if(po(),h().readOnly&&!cd.has(i))return xt({result:ye.Fail,message:"Command not available in readonly state",data:null});let a=ui.filter(l=>e||l.systemOnly!==!0).find(l=>l.intent===i);if(!a)return xt({result:ye.Fail,message:"Command not found",data:null});let d=await a.action(a,{command:t,inputString:o,modifier:r});return c(d)?xt(d):(go({addToHistory:!e}),a.onSuccess?.(),xt(d))};var cn=[{intent:x.Exit,mode:f.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(w({mode:f.COMMAND_LINE}),$(()=>"move cancel"),le({isForceExecutedBySystem:!0}))},{intent:x.InitMove,mode:f.DEFAULT,description:"[m] move init/confirm",action:()=>(w({mode:f.COMMAND_LINE}),$(()=>"move start"),le({isForceExecutedBySystem:!0}))},{intent:x.ConfirmMove,mode:f.MOVE,action:()=>(w({mode:f.COMMAND_LINE}),$(()=>"move confirm"),le({isForceExecutedBySystem:!0}))}],ln=[{intent:x.MovePreviousItem,mode:f.MOVE,action:()=>Oe()?(w({mode:f.COMMAND_LINE}),$(()=>"move previous"),le({isForceExecutedBySystem:!0})):s("No pending move")},{intent:x.MoveNextItem,mode:f.MOVE,action:()=>Oe()?(w({mode:f.COMMAND_LINE}),$(()=>"move next"),le({isForceExecutedBySystem:!0})):s("No pending move")}],pi=[{intent:x.MoveToNextContainer,mode:f.MOVE,action:()=>Oe()?(w({mode:f.COMMAND_LINE}),$(()=>"move to-next"),le({isForceExecutedBySystem:!0})):s("No pending move")},{intent:x.MoveToPreviousContainer,mode:f.MOVE,action:()=>Oe()?(w({mode:f.COMMAND_LINE}),$(()=>"move to-previous"),le({isForceExecutedBySystem:!0})):s("No pending move")}];var gi={[P.WORKSPACE]:[...cn,...ln],[P.BOARD]:[...cn,...ln],[P.SWIMLANE]:[...cn,...ln,...pi],[P.TICKET]:[],[P.FIELD]:[],[P.FIELD_LIST]:[],[P.TEXT]:[]};var fi=[{intent:x.AddItem,mode:f.DEFAULT,description:"[n] new...",action:()=>(w({mode:f.COMMAND_LINE}),$(()=>`${g.NEW} `),m("Adding new item",null))},{intent:x.Delete,mode:f.DEFAULT,description:"[d] delete",action:()=>(w({mode:f.COMMAND_LINE}),$(()=>`${g.DELETE} `),m("Deleting item",null))},{intent:x.InitCommandLine,mode:f.DEFAULT,description:"[:] focus command line",action:()=>(w({mode:f.COMMAND_LINE}),$(()=>""),m("Entering command line mode",null))},{intent:x.Confirm,mode:f.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>(U.enterChildNode(),m("Entering context",null))},{intent:x.Exit,mode:f.DEFAULT,description:"[q] exit context",action:()=>(U.enterParentNode(),m("Exiting context",null))},{intent:x.NavPreviousItem,mode:f.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(U.navigateToPreviousItem(),m("Navigating to previous item",null))},{intent:x.NavNextItem,mode:f.DEFAULT,action:()=>(U.navigateToNextItem(),m("Navigating to next item",null))},{intent:x.NavToPreviousContainer,mode:f.DEFAULT,action:()=>(U.navigateToPreviousContainer(),m("Navigating to previous container",null))},{intent:x.NavToNextContainer,mode:f.DEFAULT,action:()=>(U.navigateToNextContainer(),m("Navigating to next container",null))},{intent:x.Edit,mode:f.DEFAULT,action:()=>(w({mode:f.COMMAND_LINE}),$(()=>"edit"),le(),m("Fired command",!0))},{intent:x.SetViewDense,mode:f.DEFAULT,description:"[v] view change (wide/dense)",action:()=>(w({viewMode:"dense"}),m("View set",null))},{intent:x.SetViewWide,mode:f.DEFAULT,action:()=>(w({viewMode:"wide"}),m("View set",null))},{intent:x.Sync,mode:f.DEFAULT,description:"[s] sync epiq with remote state branch",action:()=>(w({mode:f.COMMAND_LINE}),$(()=>"sync"),le({isForceExecutedBySystem:!0}),m("Synced",!0))}];var yi=[{intent:x.ViewHelp,mode:f.DEFAULT,action:()=>(w({mode:f.HELP}),m("Viewing help",null))},{intent:x.Exit,mode:f.HELP,action:()=>(w({mode:f.DEFAULT}),m("Exiting help",null))},{intent:x.Confirm,mode:f.COMMAND_LINE,action:()=>(le(),m("Executing command",null))},{intent:x.MoveCursorLeft,mode:f.COMMAND_LINE,action:()=>(jn(-1),m("Moving cursor left",null))},{intent:x.MoveCursorRight,mode:f.COMMAND_LINE,action:()=>(jn(1),m("Moving cursor right",null))},{intent:x.MoveCursorLeftOfWord,mode:f.COMMAND_LINE,action:()=>(zn("left"),m("Moving cursor left of word",null))},{intent:x.MoveCursorRightOfWord,mode:f.COMMAND_LINE,action:()=>(zn("right"),m("Moving cursor right of word",null))},{intent:x.ExitCommandLine,mode:f.COMMAND_LINE,action:()=>(w({mode:f.DEFAULT}),m("Exiting command line",null))},{intent:x.AutoCompleteCommand,mode:f.COMMAND_LINE,action:()=>($((e,{remainder:t})=>t?e+t:e),m("Auto-completing command",null))},{intent:x.CaptureInput,mode:f.COMMAND_LINE,action:(e,{sequence:t})=>($(n=>n+t),m("Capturing input",null))},{intent:x.EraseInput,mode:f.COMMAND_LINE,action:()=>(mo(),m("Erasing input",null))},{intent:x.EraseInputWord,mode:f.COMMAND_LINE,action:()=>(uo(),m("Erasing input word",null))},{intent:x.GetLastCommandFromHistory,mode:f.COMMAND_LINE,action:()=>(fo(),m("Getting last command from history",null))},{intent:x.GetNextCommandFromHistory,mode:f.COMMAND_LINE,action:()=>(yo(),m("Getting next command from history",null))}];import ld from"chalk";var mn=": for command line",xi="q to exit",vi=`${ld.hex(E.accent)("m")} to confirm`,xr={[P.WORKSPACE]:[mn],[P.BOARD]:[mn],[P.BOARD+f.COMMAND_LINE]:[mn],[P.SWIMLANE]:[mn],[P.TICKET+f.HELP]:[xi],[P.SWIMLANE+f.HELP]:[xi],[P.TICKET]:[],[P.FIELD]:[],[P.SWIMLANE+f.MOVE]:[vi],[P.TICKET+f.MOVE]:[vi]};var un=e=>e.trim().toLocaleLowerCase(),md=(e,t)=>{let n=N.getFieldByTitle(e,t);if(!n)return"";let r=n.props?.value;return typeof r=="string"?r:""},ud=e=>{let{tags:t}=h(),n=N.getFieldByTitle(e,"Tags");return n?_(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},pd=e=>{let{contributors:t}=h(),n=N.getFieldByTitle(e,"Assignees");return n?_(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},hi=(e,t)=>{let n=t.value;if(!n)return!0;switch(t.target){case"title":return un(e.title??"").includes(n);case"description":return un(md(e.id,"Description")).includes(n);case"tag":return ud(e.id).map(un).some(d=>d.includes(n));case"assignee":return pd(e.id).map(un).some(d=>d.includes(n));default:return!0}};function Ei(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(),m("Breadcrumb built",o))}var Ci=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 pn,vr,hr=new Set,Ni=()=>{for(let e of hr)e()},fd=e=>(hr.add(e),()=>hr.delete(e));function bi(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 l=Ei(t,o,r);if(c(l))return logger.error(l.message),l;let u=l.data,{context:p}=d,y=xr[p+n]??xr[p]??[],C=[...fi,...gi[p]??[],...yi],b=Ci(C),I=yd(o,i),A=I[t]?.[e.selectedIndex]??null;return m("Derived successfully",{...e,currentNode:d,breadCrumb:u,availableHints:y,availableActions:C,actionIndex:b,selectedNode:A,renderedChildrenIndex:I})}var h=()=>(pn||logger.error("State not initialized. Call initWorkspaceState() first.",new Error().stack),pn);function Jn(e){vr=e;let t={readOnly:!1,filters:[],tags:{},contributors:{},viewMode:"dense",mode:f.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,currentNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""},eventLog:[],unappliedEvents:[],timeMode:"live"},n=bi(t);return c(n)?n:(pn=n.data,Ni(),m("State initialized",null))}function ae(e){let t=h(),n=e(t),r=bi(n);return c(r)?s(r.message??"Unable to update state"):(pn=r.data,Ni(),m("State updated",null))}var w=e=>ae(t=>({...t,...e}));var W=()=>gd(fd,h,h),yd=(e,t)=>{let n={};for(let r of Object.values(e))$e(r)&&t.length>0&&!t.every(o=>hi(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},R=e=>h()?.renderedChildrenIndex[e]??[],fr=()=>vr?Jn(vr):s("Cannot reset state: no initial workspace found");var U={exit(){process.exit(0)},enterChildNode(){let e=h(),t=e.currentNode,n=Math.max(0,e.selectedIndex),r=R(t.id)[n];!r||t.context==="FIELD"||U.navigate({currentNode:r,selectedIndex:R(r.id).length?0:-1})},enterParentNode(){let{currentNode:e,nodes:t}=h();if(!e.parentNodeId){logger.info("Missing parent node id");return}let n=t[e.parentNodeId];if(!n){logger.error("Parent not found");return}let r=R(n.id),o=r.findIndex(({id:a})=>a===e.id),i=r.length===0?-1:o>=0?o:0;U.navigate({currentNode:n,selectedIndex:i})},navigateToNextItem:()=>Ii(1),navigateToPreviousItem:()=>Ii(-1),navigateToNextContainer:()=>Si(1),navigateToPreviousContainer:()=>Si(-1),navigate:({currentNode:e=h().currentNode,selectedIndex:t})=>{w({currentNodeId:e.id,selectedIndex:t})}},Ii=e=>{let t=h(),n=R(t.currentNode.id).length;if(n===0)return;let o=(Math.max(0,t.selectedIndex)+e+n)%n;U.navigate({selectedIndex:o})},Si=e=>{let{currentNode:t,nodes:n,selectedIndex:r}=h();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!t||!o)return;let i=R(o.id),a=i.findIndex(C=>C.id===t.id);if(a<0)return;let d=i.at(a+e)??i.at(0);if(!d)return;let l=R(d.id),u=Math.max(0,l.length-1),p=Math.min(Math.max(0,r),u),y=l.length?p:-1;U.navigate({currentNode:d,selectedIndex:y})};var Ae="system",Te="ACTOR",St=xd(),we=null;function vd(){let e=Object.values(h().nodes).find(r=>r.context==="WORKSPACE");if(!e)throw new Error("No workspace found in event log");let[t]=R(e.id),[n]=t?R(t.id):[];if(logger.debug("Boot navigation target:",{workspace:e?.id,firstBoard:t?.id,firstSwimlane:n?.id}),n){let r=h().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:h().nodes[h().rootNodeId],selectedIndex:0}}function hd(){let e=vd();U.navigate(e)}function Ed(){let e=St(),t=St(),n=St(),r=St(),o=St();return[{id:Se(),userId:Ae,userName:Te,action:"init.workspace",payload:{id:e,name:"Workspace"}},{id:Se(),userId:Ae,userName:Te,action:"add.board",payload:{id:t,name:"Default",parent:e}},{id:Se(),userId:Ae,userName:Te,action:"add.swimlane",payload:{id:n,name:"Todo",parent:t}},{id:Se(),userId:Ae,userName:Te,action:"add.swimlane",payload:{id:r,name:"Review",parent:t}},{id:Se(),userId:Ae,userName:Te,action:"add.swimlane",payload:{id:o,name:"Done",parent:t}},{id:Se(),userId:Ae,userName:Te,action:"add.board",payload:{id:Zt,name:"Closed",parent:e}},{id:Se(),userId:Ae,userName:Te,action:"add.swimlane",payload:{id:nt,name:"Closed",parent:Zt}},{id:Se(),userId:Ae,userName:Te,action:"lock.node",payload:{id:Zt}},{id:Se(),userId:Ae,userName:Te,action:"lock.node",payload:{id:nt}}]}function Ke(){return we!==null}function yr(){if(!we||we.length===0)return we=null,m("No pending default events to persist",null);let e=we.map(t=>Yt({event:t})).filter(c);return e.length>0?s([dt.bold.red("Persisting default events failed"),"",...e.map((t,n)=>`${dt.dim.gray(`${n+1}.`)} ${dt.dim(t.message)}`),`
34
+ ${n.message}`):m("Staged remote own event file",void 0)},Zo=async({repoRoot:e,worktreeRoot:t})=>{let n=await za(e);return c(n)?s(n.message):(T.debug("[sync] create remote sync commit"),tr({cwd:t,message:n.data}))},dr=async e=>{T.debug("[sync] push remote worktree");let t=await nr(e);if(c(t))return s(t.message);let n=await F({args:t.data?["push"]:["push","-u",J,k],cwd:e});return T.debug("[sync] push result",n),c(n)?s(`Failed during remote push
35
+ ${n.message}`):m("Pushed remote",!0)},cr=async({repoRoot:e,worktreeRoot:t,ensureUpstream:n})=>{T.debug("[sync] bootstrap remote storage",{repoRoot:e,worktreeRoot:t,ensureUpstream:n});let r=!1,o=[_a(),await qa({repoRoot:e}),await Xa({repoRoot:e,worktreeRoot:t}),await Qa(t),await Za(t),n?await ed(t):m("Skipped remote upstream bootstrap",!1)];for(let i of o){if(c(i))return s(i.message);r=r||!!i.data}return T.debug("[sync] bootstrap changed",r),m(n?"Bootstrapped remote storage":"Bootstrapped remote storage (readonly)",r)},lr=(e,t)=>{for(let n of[st(e),st(t)]){let r=dn(n);if(c(r))return s(r.message)}return m("Ensured remote layout",void 0)};var ni=async(e=process.cwd())=>{logger.debug("[sync] start readonly sync",{cwd:e});let t=await er(e);if(c(t))return s(t.message);let n=t.data,r=ir(n);logger.debug("[sync] resolved readonly roots",{repoRoot:n,worktreeRoot:r});let o=await Nt(n);if(c(o))return s(o.message);if(o.data)return s("Cannot sync while a git operation is in progress in the current repo");let i=await sr(n);if(c(i))return s(i.message);logger.debug("[sync] readonly ensure initial commit changed",i.data);let a=await cr({repoRoot:n,worktreeRoot:r,ensureUpstream:!1});if(c(a))return s(a.message);let d=await Nt(r);if(c(d))return s(d.message);if(d.data)return s("Cannot sync while a git operation is in progress in the remote worktree");let l=lr(n,r);if(c(l))return s(l.message);logger.debug("[sync] readonly pull remote branch");let u=await on({cwd:r,remote:J,branch:k});if(c(u))return s(u.message);logger.debug("[sync] readonly pulled remote",u.data);let p=ar({repoRoot:n,worktreeRoot:r});return c(p)?s(p.message):(logger.debug("[sync] readonly hydrated from remote",p.data),m("Synced from remote",{repoRoot:n,worktreeRoot:r}))},td=({repoRoot:e,worktreeRoot:t,ownEventFileName:n})=>{let r=bt({root:e,fileName:n}),o=bt({root:t,fileName:n});return It.existsSync(r)?(logger.debug("[sync] merge own event file to remote",{ownEventFileName:n,localFile:r,remoteFile:o}),an({sourceFile:r,targetFile:o})):(logger.debug("[sync] local own event file missing",r),m("Local own event file missing, nothing to merge",!1))},ei=async({repoRoot:e,worktreeRoot:t,ownEventFileName:n})=>{let r=td({repoRoot:e,worktreeRoot:t,ownEventFileName:n});if(c(r))return s(r.message);let o=await jo(t);if(c(o))return s(o.message);if(!r.data&&!o.data)return m("Own event file already up to date in remote worktree",{createdCommit:!1});let i=await Qo({worktreeRoot:t,ownEventFileName:n});if(c(i))return s(i.message);let a=await Zo({repoRoot:e,worktreeRoot:t});return c(a)?s(a.message):m("Merged, staged, and committed own event file",{createdCommit:!0,commitSha:a.data})},ti=({repoRoot:e,worktreeRoot:t,ownEventFileName:n})=>{let r=bt({root:e,fileName:n}),o=bt({root:t,fileName:n});logger.debug("[sync] own event file sizes",{local:It.existsSync(r)?It.statSync(r).size:0,remote:It.existsSync(o)?It.statSync(o).size:0})},ri=async({cwd:e=process.cwd(),ownEventFileName:t})=>{logger.debug("[sync] start write sync",{cwd:e,ownEventFileName:t});let n=await er(e);if(c(n))return s(n.message);let r=n.data,o=ir(r);logger.debug("[sync] resolved roots",{repoRoot:r,worktreeRoot:o});let i=await zo(r);if(c(i))return s(i.message);if(i.data)return s("Cannot run :sync while the repository is in detached HEAD state");if(t.includes("/")||t.includes("\\"))return s("Own event file must be a file name, not a path");if(!t.endsWith(".jsonl"))return s("Own event file must end with .jsonl");let a=await Nt(r);if(c(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 sr(r);if(c(d))return s(d.message);logger.debug("[sync] ensure initial commit changed",d.data);let l=await cr({repoRoot:r,worktreeRoot:o,ensureUpstream:!0});if(c(l))return s(l.message);let u=await Nt(o);if(c(u))return s(u.message);if(u.data)return s("Cannot run :sync while a merge, rebase, cherry-pick, or revert is in progress in the remote worktree");let p=lr(r,o);if(c(p))return s(p.message);let y=!1,C,b=!1,I=!1,A=!1;logger.debug("[sync] pull remote branch before local copy");let S=await on({cwd:o,remote:J,branch:k});if(c(S))return s(S.message);b=S.data,logger.debug("[sync] pulled remote",b);let M=ar({repoRoot:r,worktreeRoot:o});if(c(M))return s(M.message);A=M.data,logger.debug("[sync] hydrated from remote",A);let B=await ei({repoRoot:r,worktreeRoot:o,ownEventFileName:t});if(c(B))return s(B.message);if(y=B.data.createdCommit,C=B.data.commitSha,ti({repoRoot:r,worktreeRoot:o,ownEventFileName:t}),logger.debug("[sync] sync own file result",B.data),y||l.data){let G=await dr(o),oe=G;if(c(G)&&Vo(G.message)){let Pt=await on({cwd:o,remote:J,branch:k});if(c(Pt))return s(Pt.message);let De=await ei({repoRoot:r,worktreeRoot:o,ownEventFileName:t});if(c(De))return s(De.message);De.data.createdCommit&&(y=!0,C=De.data.commitSha),ti({repoRoot:r,worktreeRoot:o,ownEventFileName:t}),logger.debug("[sync] retry sync own file result",De.data),oe=await dr(o)}if(c(oe))return s(oe.message);I=oe.data,logger.debug("[sync] pushed remote",I)}else logger.debug("[sync] no commit created, skipped push");if(y){let G=await F({args:["rev-parse","HEAD"],cwd:o});if(c(G))return s(G.message);C=G.data.stdout.trim()}return m("Synced event logs with remote",{repoRoot:r,worktreeRoot:o,createdCommit:y,commitSha:C,pulled:b,pushed:I,hydrated:A,bootstrapped:l.data})};import{ulid as oi}from"ulid";var at=null,Oe=()=>structuredClone(at),dt=e=>at=e,ii=()=>{let{currentNode:e,selectedIndex:t}=h(),r=R(e.id)[t];return r?m("Resolved selected child",r):s("Target node not found")};function mr(e){let t=ii();if(c(t))return t;let{currentNode:n,nodes:r}=h();if(!n.parentNodeId)return s("Missing parent node id");let o=r[n.parentNodeId];if(!o)return s("Missing parent node");let i=_(o.id),a=i.findIndex(({id:C})=>C===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 l=te();if(c(l))return s("Unable to resolve user ID");let{userId:u,userName:p}=l.data;if(dt({id:oi(),userId:u,userName:p,action:"move.node",payload:{id:t.data.id,parent:d.id,pos:{at:"end"}}}),!at)return s("Could not materialize move state");let y=ot(at,!0);return c(y)?y:m("Node moved successfully",y.data)}function ur(e){let t=ii();if(c(t))return t;let{currentNode:n,selectedIndex:r}=h(),i=_(n.id)[r+e];if(!i)return s("Missing sibling node");let a=te();if(c(a))return s("Unable to resolve user ID");let{userId:d,userName:l}=a.data;if(dt({id:oi(),userId:d,userName:l,action:"move.node",payload:{id:t.data.id,parent:n.id,pos:{at:e===1?"after":"before",sibling:i.id}}}),!at)return s("Could not materialize move state");let u=ot(at,!0);return c(u)?u:m("Node moved successfully",u.data)}import nd from"node:os";import si from"node:path";import{z as St}from"zod";var rd={userId:"",userName:"",preferredEditor:"",autoSync:!1},ai=St.object({preferredEditor:St.string().optional(),userName:St.string().optional(),userId:St.string().optional(),autoSync:St.boolean().optional()}).strict(),od=".epiq",id="config.json",di=()=>si.join(nd.homedir(),od),pr=()=>si.join(di(),id),gr=()=>{try{return ce.mkDir(di()),m("Ensured ~/.epiq exists",null)}catch{return s("Unable to create ~/.epiq")}},sd=e=>{let t;try{t=JSON.parse(e)}catch{return s("Invalid ~/.epiq/config.json JSON")}let n=ai.safeParse(t??{});return n.success?m("Parsed config",n.data):s(`Invalid ~/.epiq/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},ci=()=>{let e=gr();if(c(e))return s(e.message);let t=pr(),n=ce.readFile(t);return n==null||n.trim()===""?m("No config found, using empty config",{autoSync:!1,preferredEditor:"",userId:"",userName:""}):sd(n)},li=e=>{let t=gr();if(c(t))return s(t.message);let n=ai.safeParse(e);if(!n.success)return s(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=pr();try{return ce.writeToFile(r,JSON.stringify(n.data,null,2)+`
36
+ `),m("Config written",null)}catch{return s("Unable to write ~/.epiq/config.json")}},cn=e=>{let t=ci();if(c(t))return s("Failed to read existing config");let n={...t.data,...e};return li(n)},mi=()=>{let e=pr(),t=gr();if(c(t))return s("Unable to create ~/.epiq");if(!(ce.readFile(e)!==null)){let l=li(rd);if(c(l))throw new Error("Unable to create ~/.epiq/config.json")}let r=ci();if(c(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:i,userId:a,autoSync:d}=r.data;return!i||!a?s("User name or ID not configured in ~/.epiq/config.json"):m("successfully loaded settings",{preferredEditor:o??"",userName:i,userId:a,autoSync:d??!1})};var ad=e=>Object.values(h().tags).find(t=>t.name===e),dd=e=>Object.values(h().contributors).find(t=>t.name===e),ui=[{systemOnly:!0,intent:L.Move,mode:f.COMMAND_LINE,action:()=>{let e=te();if(c(e))return s("Unable to resolve user ID");let{modifier:t}=me().commandMeta,n=()=>{let d=Oe();if(!d)return s("No pending move state");let l=d.payload.id;if(!h().nodes[l])return s("Moved node not found");let p=d.payload.parent,y=h().nodes[p];if(!y)return s("Move parent not found");let C=R(p).findIndex(b=>b.id===l);return C===-1?s("Moved node not found among rendered children"):(U.navigate({currentNode:y,selectedIndex:C}),m("Synchronized navigation to moved node",null))},r=d=>{if(c(d))return s(d.message);let l=n();return c(l)?s(l.message):m("Updated move preview",null)},{currentNode:o,selectedIndex:i}=h(),a=R(o.id)[i];if(!a)return w({mode:f.DEFAULT}),s("No move target");if(t==="start"){if(a.readonly)return s("Target node is read-only");if(i===-1)return s("No item selected");if(!a.parentNodeId)return s("Target has no parent");let d=R(a.parentNodeId),l=d.findIndex(({id:b})=>b===a.id);if(l===-1)return s("Target not found among siblings");let u=d[l-1],p=d[l+1],y=p!=null?{at:"before",sibling:p.id}:u!=null?{at:"after",sibling:u.id}:{at:"start"};dt({id:$(),action:"move.node",payload:{id:a.id,parent:a.parentNodeId,pos:y},...e.data}),w({mode:f.MOVE});let C=n();return c(C)?s(C.message):m("Move initialized",null)}if(t==="next")return w({mode:f.MOVE}),r(ur(1));if(t==="previous")return w({mode:f.MOVE}),r(ur(-1));if(t==="to-next")return w({mode:f.MOVE}),r(mr(1));if(t==="to-previous")return w({mode:f.MOVE}),r(mr(-1));if(t==="confirm"){w({mode:f.DEFAULT});let d=Oe();if(!d)return s("No pending move to confirm");let l=ne(d);if(c(l))return l;let u=n();return c(u)?s(u.message):(dt(null),m("Moved item",null))}return t==="cancel"?(dt(null),w({mode:f.DEFAULT}),m("Cancelling move",null)):s("Invalid move modifier")}},{intent:L.Delete,mode:f.COMMAND_LINE,action:()=>{let e=te();if(c(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=h(),r=R(t.id)[n];return r?ne({id:$(),action:"delete.node",payload:{id:r.id},...e.data}):s("Unable to resolve child to delete")},onSuccess:()=>w({mode:f.DEFAULT})},{intent:L.Edit,mode:f.COMMAND_LINE,action:()=>{let e=te();if(c(e))return s("Unable to resolve user ID");let t=be(h().breadCrumb,"TICKET");if(c(t))return s("Edit target must be an issue");let n=t.data;if(n.readonly)return s("Cannot edit readonly field");let{currentNode:r,selectedIndex:o}=h();if(!R(n.id)[o])return s("No selected field");let a=R(r.id)[o];if(!a)return s("No selected field");if(a.readonly)return s("Cannot edit readonly field");let d=a.props.value;if(typeof d!="string")return s("Selected field is not editable text");let l=Io(d);if(c(l))return s("Failed to edit field");let u=l.data;return u===d?m("No changes made",null):a.title==="Description"?ne({id:$(),action:"edit.description",payload:{id:a.id,md:u},...e.data}):a.title==="Title"?ne({id:$(),action:"edit.title",payload:{id:a.id,name:u},...e.data}):s(`Editing not supported for "${a.title}"`)},onSuccess:()=>w({mode:f.DEFAULT})},{intent:L.Filter,mode:f.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=me().commandMeta,n=/(!=|=)/,[r,o]=e.split(n);if(!r||!(d=>z(g.FILTER).map(l=>l.split(n)[0]).includes(d))(r))return s("Invalid filter modifier");let a={target:r,operator:"=",value:t.trim()};return ae(d=>({...d,filters:e==="clear"?[]:[...d.filters,a],mode:f.DEFAULT})),m("Viewing help",null)}},{intent:L.ViewHelp,mode:f.COMMAND_LINE,action:()=>(w({mode:f.HELP}),m("Viewing help",null))},{intent:L.CloseIssue,mode:f.COMMAND_LINE,action:()=>{let e=te();if(c(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=h(),r=R(t.id)[n];if(!r)return s("Unable to close issue, no target found");if(!r.parentNodeId)return s("No target parent found");if(!$e(r))return s("Cannot close in this context");let o=ne({id:$(),action:"close.issue",payload:{id:r.id,parent:r.parentNodeId},...e.data});return c(o)?o:m("Viewing help",null)}},{intent:L.ReopenIssue,mode:f.COMMAND_LINE,action:()=>{let e=te();if(c(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=h(),r=R(t.id)[n];if(!r)return s("Unable to reopen issue, no target found");let o=r.context==="TICKET"?m("Resolved ticket",r):Xe(r.id,"TICKET");if(c(o))return s("Cannot reopen in this context");let i=o.data,a=ne({id:$(),action:"reopen.issue",payload:{id:i.id},...e.data});return c(a)?a:m("Issue reopened",null)},onSuccess:()=>w({mode:f.DEFAULT})},{intent:L.SetUserName,mode:f.COMMAND_LINE,action:()=>{let{userId:e,preferredEditor:t,userName:n}=ge(),r=Kt()?.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=cn({userName:o,userId:i,preferredEditor:t??""});return c(a)?a:(Qe({userName:o,userId:i}),w({mode:f.DEFAULT}),m(`Username set to "${r}"`,null))}},{intent:L.Init,mode:f.COMMAND_LINE,action:()=>{let e=yr();if(c(e))return e;let{rootNodeId:t,nodes:n}=h();return U.navigate({currentNode:n[t],selectedIndex:0}),m("Project initialized",null)}},{intent:L.SetEditor,mode:f.COMMAND_LINE,action:()=>{let e=Kt()?.trim();if(!e)return s("No editor provided");let t=cn({preferredEditor:e});return c(t)?t:(Qe({preferredEditor:e}),w({mode:f.DEFAULT}),m(`Editor configuration set to "${e}"`,null))}},{intent:L.SetAutoSync,mode:f.COMMAND_LINE,action:()=>{let e=me().commandMeta.modifier;if(e!=="true"&&e!=="false")return s("Invalid response");let t=e.toLowerCase()==="true",n=cn({autoSync:t});return c(n)?n:(Qe({autoSync:t}),w({mode:f.DEFAULT}),m(`Auto synchronization set to "${t}"`,null))}},{intent:L.NewItem,mode:f.COMMAND_LINE,action:(e,t)=>{let n=te();if(c(n))return s("Unable to resolve user ID");if(!t.inputString)return s(`provide a name for your ${t.modifier}`);let{breadCrumb:r,currentNode:o,selectedIndex:i}=h(),a=d=>{let l=ne(d);if(c(l))return l;let u=N.getNode(l.data.result.id);if(!u)return s("Created node not found");if(!u.parentNodeId)return l;let p=N.getNode(u.parentNodeId);return p?(U.navigate({currentNode:p,selectedIndex:N.getSiblings(u.parentNodeId).findIndex(({id:y})=>y===u.id)}),l):s("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:d}=h(),l=N.getNode(d);return l?a({id:$(),action:"add.board",payload:{id:$(),name:t.inputString,parent:l.id},...n.data}):s("Workspace not found")}if(t.modifier==="swimlane"){let d=be(r,"BOARD");return c(d)?s("Unable to add swimlane in this context"):a({id:$(),action:"add.swimlane",payload:{id:$(),name:t.inputString,parent:d.data.id},...n.data})}if(t.modifier==="issue"){let d=R(o.id)[i],l=o.context==="SWIMLANE"?o:o.context==="BOARD"&&d?.context==="SWIMLANE"?d:(()=>{let b=be(r,"SWIMLANE");return c(b)?null:b.data})();if(!l)return s("Unable to add issue in this context");let u=So({name:t.inputString,parent:l.id,user:n.data}),p=Fo(u);if(p.some(b=>c(b)))return s("Issue create failed: "+p.filter(c).map(b=>b.message).filter(Boolean).join(", "));let y=p[0];if(!y||c(y))return s("Issue creation failed");let C=u[0]?.payload.id;return C?(U.navigate({currentNode:l,selectedIndex:N.getSiblings(l.id).findIndex(({id:b})=>b===C)}),m("Issue created",null)):s("Unable to determine ticket id")}return Wr()},onSuccess:()=>w({mode:f.DEFAULT})},{intent:L.SetView,mode:f.COMMAND_LINE,action:()=>{let{commandMeta:e}=me();return e.validity===Ne.Invalid?s("Invalid command "+ye):(ae(t=>({...t,viewMode:e.modifier==="wide"?"wide":e.modifier==="dense"?"dense":t.viewMode})),m("View set",null))},onSuccess:()=>w({mode:f.DEFAULT})},{intent:L.Rename,mode:f.COMMAND_LINE,action:()=>{let e=te();if(c(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=h(),r=R(t.id)[n];if(!r)return s("Missing node");if(r.readonly)return s("Cannot rename readonly node");let o=Kt();return o?ne({id:$(),action:"edit.title",payload:{id:r.id,name:o},...e.data}):s("Provide a new name")},onSuccess:()=>w({mode:f.DEFAULT})},{intent:L.TagTicket,mode:f.COMMAND_LINE,action:()=>{let e=te();if(c(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=me().commandMeta,r=(t||n).trim();if(!r)return s("Provide a tag");let{selectedIndex:o,currentNode:i}=h(),a=R(i.id)[o];if(!a)return s("Invalid tag target");let d=Xe(a.id,"TICKET");if(c(d))return s("Unable to tag issue in this context");let l=d.data,u=ad(r),p;if(u)p=u.id;else{let b=$(),I=ne({id:$(),action:"create.tag",payload:{id:b,name:r},userId:e.data.userId,userName:e.data.userName});if(c(I))return I;p=I.data.result.id}let y=N.getFieldByTitle(l.id,"Tags");return y?R(y.id).some(b=>b.props?.value===p)?s("Already tagged with that tag"):ne({id:$(),action:"tag.issue",payload:{id:$(),target:l.id,tagId:p},...e.data}):s("Unable to locate tags field")},onSuccess:()=>w({mode:f.DEFAULT})},{intent:L.AssignUserToTicket,mode:f.COMMAND_LINE,action:()=>{let e=te();if(c(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=me().commandMeta,r=(t||n).trim();if(!r)return s("Provide an assignee");let{selectedIndex:o,currentNode:i}=h(),a=R(i.id)[o];if(!a)return s("Invalid assign target");let d=Xe(a.id,"TICKET");if(c(d))return s("Unable to assign issue in this context");let l=d.data,u=dd(r),p;if(u)p=u.id;else{let b=$(),I=ne({id:$(),action:"create.contributor",payload:{id:b,name:r},userId:e.data.userId,userName:e.data.userName});if(c(I))return I;p=I.data.result.id}let y=N.getFieldByTitle(l.id,"Assignees");return y?R(y.id).some(b=>b.props?.value===p)?s("Assignee already assigned"):ne({id:$(),action:"assign.issue",payload:{id:$(),target:l.id,contributor:p},...e.data}):s("Unable to locate assignees field")},onSuccess:()=>w({mode:f.DEFAULT})},{intent:L.Sync,mode:f.COMMAND_LINE,action:async()=>{V(()=>""),w({syncStatus:{msg:"Syncing",status:"syncing"}});let{userId:e,userName:t}=ge();if(!e)return s("Unable to resolve userId");if(!t)return s("Unable to resolve userName");let n=Ke()?yr():m("No pending default events",null);if(c(n))return s(`Unable to persist default events. ${n.message}`);let r=te();if(c(r)||!r.data)return s("Unable to resolve event log path");let o=Yn(r.data);logger.debug("[sync-command] pending defaults",Ke());let i=await ri({ownEventFileName:o});if(c(i))return w({syncStatus:{msg:i.message,status:"outOfSync"}}),s(`Unable to sync state. ${i.message}`);w({syncStatus:{msg:"Synced",status:"synced"},mode:f.DEFAULT});let a=ht();return c(a)?s("Unable to load events"):(je(a.data),m("Synced",!0))}},{intent:L.Peek,mode:f.COMMAND_LINE,action:async()=>{let e=be(h().breadCrumb,"BOARD");if(c(e))return e;let t=ht();if(c(t))return s(t.message);let n=t.data,{modifier:r}=me().commandMeta,o;if(r==="now"){let y=fr();if(c(y))return y;let C=je(n);return C.some(c)?s(C.map(b=>b.message).join(", ")):(w({mode:f.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),m("Peeking now",!0))}if(r==="prev"){let y=h().eventLog.at(-2),C=Bn(y);if(C===null)return s("No previous event to peek");o=C}else if(r==="next"){let y=h().unappliedEvents.at(0),C=Bn(y);if(C===null)return s("No next event to peek");o=C}else{let y=Wt(r);if(!y)return s("Invalid peek date");o=y.getTime()}let i=e.data.id,{appliedEvents:a,unappliedEvents:d}=Po(n,o),l=fr();if(c(l))return l;let u=je(a);if(u.some(c))return s(u.map(y=>y.message).join(", "));let p=h().nodes[i];return p?(U.navigate({currentNode:p,selectedIndex:0}),w({mode:f.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:d}),m("Peeking ",!0)):s("Board did not exist at peek date")}}];var cd=new Set(["peek","filter","view-help"]),ue=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===Ne.Invalid)return s("Invalid command");let i=ho(t);if(po(),h().readOnly&&!cd.has(i))return xt({result:ye.Fail,message:"Command not available in readonly state",data:null});let a=ui.filter(l=>e||l.systemOnly!==!0).find(l=>l.intent===i);if(!a)return xt({result:ye.Fail,message:"Command not found",data:null});let d=await a.action(a,{command:t,inputString:o,modifier:r});return c(d)?xt(d):(go({addToHistory:!e}),a.onSuccess?.(),xt(d))};var ln=[{intent:x.Exit,mode:f.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(w({mode:f.COMMAND_LINE}),V(()=>"move cancel"),ue({isForceExecutedBySystem:!0}))},{intent:x.InitMove,mode:f.DEFAULT,description:"[m] move init/confirm",action:()=>(w({mode:f.COMMAND_LINE}),V(()=>"move start"),ue({isForceExecutedBySystem:!0}))},{intent:x.ConfirmMove,mode:f.MOVE,action:()=>(w({mode:f.COMMAND_LINE}),V(()=>"move confirm"),ue({isForceExecutedBySystem:!0}))}],mn=[{intent:x.MovePreviousItem,mode:f.MOVE,action:()=>Oe()?(w({mode:f.COMMAND_LINE}),V(()=>"move previous"),ue({isForceExecutedBySystem:!0})):s("No pending move")},{intent:x.MoveNextItem,mode:f.MOVE,action:()=>Oe()?(w({mode:f.COMMAND_LINE}),V(()=>"move next"),ue({isForceExecutedBySystem:!0})):s("No pending move")}],pi=[{intent:x.MoveToNextContainer,mode:f.MOVE,action:()=>Oe()?(w({mode:f.COMMAND_LINE}),V(()=>"move to-next"),ue({isForceExecutedBySystem:!0})):s("No pending move")},{intent:x.MoveToPreviousContainer,mode:f.MOVE,action:()=>Oe()?(w({mode:f.COMMAND_LINE}),V(()=>"move to-previous"),ue({isForceExecutedBySystem:!0})):s("No pending move")}];var gi={[P.WORKSPACE]:[...ln,...mn],[P.BOARD]:[...ln,...mn],[P.SWIMLANE]:[...ln,...mn,...pi],[P.TICKET]:[],[P.FIELD]:[],[P.FIELD_LIST]:[],[P.TEXT]:[]};var fi=[{intent:x.AddItem,mode:f.DEFAULT,description:"[n] new...",action:()=>(w({mode:f.COMMAND_LINE}),V(()=>`${g.NEW} `),m("Adding new item",null))},{intent:x.Delete,mode:f.DEFAULT,description:"[d] delete",action:()=>(w({mode:f.COMMAND_LINE}),V(()=>`${g.DELETE} `),m("Deleting item",null))},{intent:x.InitCommandLine,mode:f.DEFAULT,description:"[:] focus command line",action:()=>(w({mode:f.COMMAND_LINE}),V(()=>""),m("Entering command line mode",null))},{intent:x.Confirm,mode:f.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>(U.enterChildNode(),m("Entering context",null))},{intent:x.Exit,mode:f.DEFAULT,description:"[q] exit context",action:()=>(U.enterParentNode(),m("Exiting context",null))},{intent:x.NavPreviousItem,mode:f.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(U.navigateToPreviousItem(),m("Navigating to previous item",null))},{intent:x.NavNextItem,mode:f.DEFAULT,action:()=>(U.navigateToNextItem(),m("Navigating to next item",null))},{intent:x.NavToPreviousContainer,mode:f.DEFAULT,action:()=>(U.navigateToPreviousContainer(),m("Navigating to previous container",null))},{intent:x.NavToNextContainer,mode:f.DEFAULT,action:()=>(U.navigateToNextContainer(),m("Navigating to next container",null))},{intent:x.Edit,mode:f.DEFAULT,action:()=>(w({mode:f.COMMAND_LINE}),V(()=>"edit"),ue(),m("Fired command",!0))},{intent:x.SetViewDense,mode:f.DEFAULT,description:"[v] view change (wide/dense)",action:()=>(w({viewMode:"dense"}),m("View set",null))},{intent:x.SetViewWide,mode:f.DEFAULT,action:()=>(w({viewMode:"wide"}),m("View set",null))}];var yi=[{intent:x.ViewHelp,mode:f.DEFAULT,action:()=>(w({mode:f.HELP}),m("Viewing help",null))},{intent:x.Exit,mode:f.HELP,action:()=>(w({mode:f.DEFAULT}),m("Exiting help",null))},{intent:x.Confirm,mode:f.COMMAND_LINE,action:()=>(ue(),m("Executing command",null))},{intent:x.MoveCursorLeft,mode:f.COMMAND_LINE,action:()=>(zn(-1),m("Moving cursor left",null))},{intent:x.MoveCursorRight,mode:f.COMMAND_LINE,action:()=>(zn(1),m("Moving cursor right",null))},{intent:x.MoveCursorLeftOfWord,mode:f.COMMAND_LINE,action:()=>(Gn("left"),m("Moving cursor left of word",null))},{intent:x.MoveCursorRightOfWord,mode:f.COMMAND_LINE,action:()=>(Gn("right"),m("Moving cursor right of word",null))},{intent:x.ExitCommandLine,mode:f.COMMAND_LINE,action:()=>(w({mode:f.DEFAULT}),m("Exiting command line",null))},{intent:x.AutoCompleteCommand,mode:f.COMMAND_LINE,action:()=>(V((e,{remainder:t})=>t?e+t:e),m("Auto-completing command",null))},{intent:x.CaptureInput,mode:f.COMMAND_LINE,action:(e,{sequence:t})=>(V(n=>n+t),m("Capturing input",null))},{intent:x.EraseInput,mode:f.COMMAND_LINE,action:()=>(mo(),m("Erasing input",null))},{intent:x.EraseInputWord,mode:f.COMMAND_LINE,action:()=>(uo(),m("Erasing input word",null))},{intent:x.GetLastCommandFromHistory,mode:f.COMMAND_LINE,action:()=>(fo(),m("Getting last command from history",null))},{intent:x.GetNextCommandFromHistory,mode:f.COMMAND_LINE,action:()=>(yo(),m("Getting next command from history",null))}];import ld from"chalk";var un=": for command line",xi="q to exit",vi=`${ld.hex(E.accent)("m")} to confirm`,xr={[P.WORKSPACE]:[un],[P.BOARD]:[un],[P.BOARD+f.COMMAND_LINE]:[un],[P.SWIMLANE]:[un],[P.TICKET+f.HELP]:[xi],[P.SWIMLANE+f.HELP]:[xi],[P.TICKET]:[],[P.FIELD]:[],[P.SWIMLANE+f.MOVE]:[vi],[P.TICKET+f.MOVE]:[vi]};var pn=e=>e.trim().toLocaleLowerCase(),md=(e,t)=>{let n=N.getFieldByTitle(e,t);if(!n)return"";let r=n.props?.value;return typeof r=="string"?r:""},ud=e=>{let{tags:t}=h(),n=N.getFieldByTitle(e,"Tags");return n?_(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},pd=e=>{let{contributors:t}=h(),n=N.getFieldByTitle(e,"Assignees");return n?_(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},hi=(e,t)=>{let n=t.value;if(!n)return!0;switch(t.target){case"title":return pn(e.title??"").includes(n);case"description":return pn(md(e.id,"Description")).includes(n);case"tag":return ud(e.id).map(pn).some(d=>d.includes(n));case"assignee":return pd(e.id).map(pn).some(d=>d.includes(n));default:return!0}};function Ei(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(),m("Breadcrumb built",o))}var Ci=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 gn,vr,hr=new Set,Ni=()=>{for(let e of hr)e()},fd=e=>(hr.add(e),()=>hr.delete(e));function bi(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 l=Ei(t,o,r);if(c(l))return logger.error(l.message),l;let u=l.data,{context:p}=d,y=xr[p+n]??xr[p]??[],C=[...fi,...gi[p]??[],...yi],b=Ci(C),I=yd(o,i),A=I[t]?.[e.selectedIndex]??null;return m("Derived successfully",{...e,currentNode:d,breadCrumb:u,availableHints:y,availableActions:C,actionIndex:b,selectedNode:A,renderedChildrenIndex:I})}var h=()=>(gn||logger.error("State not initialized. Call initWorkspaceState() first.",new Error().stack),gn);function Xn(e){vr=e;let t={readOnly:!1,filters:[],tags:{},contributors:{},viewMode:"dense",mode:f.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,currentNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""},eventLog:[],unappliedEvents:[],timeMode:"live"},n=bi(t);return c(n)?n:(gn=n.data,Ni(),m("State initialized",null))}function ae(e){let t=h(),n=e(t),r=bi(n);return c(r)?s(r.message??"Unable to update state"):(gn=r.data,Ni(),m("State updated",null))}var w=e=>ae(t=>({...t,...e}));var W=()=>gd(fd,h,h),yd=(e,t)=>{let n={};for(let r of Object.values(e))$e(r)&&t.length>0&&!t.every(o=>hi(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},R=e=>h()?.renderedChildrenIndex[e]??[],fr=()=>vr?Xn(vr):s("Cannot reset state: no initial workspace found");var U={exit(){process.exit(0)},enterChildNode(){let e=h(),t=e.currentNode,n=Math.max(0,e.selectedIndex),r=R(t.id)[n];!r||t.context==="FIELD"||U.navigate({currentNode:r,selectedIndex:R(r.id).length?0:-1})},enterParentNode(){let{currentNode:e,nodes:t}=h();if(!e.parentNodeId){logger.info("Missing parent node id");return}let n=t[e.parentNodeId];if(!n){logger.error("Parent not found");return}let r=R(n.id),o=r.findIndex(({id:a})=>a===e.id),i=r.length===0?-1:o>=0?o:0;U.navigate({currentNode:n,selectedIndex:i})},navigateToNextItem:()=>Ii(1),navigateToPreviousItem:()=>Ii(-1),navigateToNextContainer:()=>Si(1),navigateToPreviousContainer:()=>Si(-1),navigate:({currentNode:e=h().currentNode,selectedIndex:t})=>{w({currentNodeId:e.id,selectedIndex:t})}},Ii=e=>{let t=h(),n=R(t.currentNode.id).length;if(n===0)return;let o=(Math.max(0,t.selectedIndex)+e+n)%n;U.navigate({selectedIndex:o})},Si=e=>{let{currentNode:t,nodes:n,selectedIndex:r}=h();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!t||!o)return;let i=R(o.id),a=i.findIndex(C=>C.id===t.id);if(a<0)return;let d=i.at(a+e)??i.at(0);if(!d)return;let l=R(d.id),u=Math.max(0,l.length-1),p=Math.min(Math.max(0,r),u),y=l.length?p:-1;U.navigate({currentNode:d,selectedIndex:y})};var Ae="system",Te="ACTOR",At=xd(),we=null;function vd(){let e=Object.values(h().nodes).find(r=>r.context==="WORKSPACE");if(!e)throw new Error("No workspace found in event log");let[t]=R(e.id),[n]=t?R(t.id):[];if(logger.debug("Boot navigation target:",{workspace:e?.id,firstBoard:t?.id,firstSwimlane:n?.id}),n){let r=h().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:h().nodes[h().rootNodeId],selectedIndex:0}}function hd(){let e=vd();U.navigate(e)}function Ed(){let e=At(),t=At(),n=At(),r=At(),o=At();return[{id:Se(),userId:Ae,userName:Te,action:"init.workspace",payload:{id:e,name:"Workspace"}},{id:Se(),userId:Ae,userName:Te,action:"add.board",payload:{id:t,name:"Default",parent:e}},{id:Se(),userId:Ae,userName:Te,action:"add.swimlane",payload:{id:n,name:"Todo",parent:t}},{id:Se(),userId:Ae,userName:Te,action:"add.swimlane",payload:{id:r,name:"In progress",parent:t}},{id:Se(),userId:Ae,userName:Te,action:"add.swimlane",payload:{id:o,name:"Done",parent:t}},{id:Se(),userId:Ae,userName:Te,action:"add.board",payload:{id:en,name:"Closed",parent:e}},{id:Se(),userId:Ae,userName:Te,action:"add.swimlane",payload:{id:rt,name:"Closed",parent:en}},{id:Se(),userId:Ae,userName:Te,action:"lock.node",payload:{id:en}},{id:Se(),userId:Ae,userName:Te,action:"lock.node",payload:{id:rt}}]}function Ke(){return we!==null}function yr(){if(!we||we.length===0)return we=null,m("No pending default events to persist",null);let e=we.map(t=>Jt({event:t})).filter(c);return e.length>0?s([ct.bold.red("Persisting default events failed"),"",...e.map((t,n)=>`${ct.dim.gray(`${n+1}.`)} ${ct.dim(t.message)}`),`
37
37
  `].join(`
38
- `)):(we=null,m("Persisted pending default events",null))}function Ai(e){let t;e.some(r=>r.action==="init.workspace")?(we=null,t=je(e)):(we=Ed(),t=je([...we]));let n=t.filter(c);return n.length>0?s([dt.bold.red("Materializing failed"),"",...n.map((r,o)=>`${dt.dim.gray(`${o+1}.`)} ${dt.dim(r.message)}`),`
38
+ `)):(we=null,m("Persisted pending default events",null))}function Ai(e){let t;e.some(r=>r.action==="init.workspace")?(we=null,t=je(e)):(we=Ed(),t=je([...we]));let n=t.filter(c);return n.length>0?s([ct.bold.red("Materializing failed"),"",...n.map((r,o)=>`${ct.dim.gray(`${o+1}.`)} ${ct.dim(r.message)}`),`
39
39
  `].join(`
40
- `)):(hd(),m("State booted successfully",null))}import{Box as Ud}from"ink";import Nr from"react";import Tt from"chalk";import{Box as Er,Text as Ti}from"ink";import At,{useEffect as Cd,useMemo as Nd,useState as bd}from"react";var wi=Tt.gray,Id=Tt.inverse,Sd=Tt.inverse.gray,Ad={hint:"",hints:[],overlap:0,remainder:""},Ri=({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}},Td=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=me(t);return{bg:r=>Tt.bgHex(n).black(r),bgCursor:r=>Tt.bgHex(n).inverse.black(r)}}return Wn(t)},wd=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=Ri({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}},Mi=()=>({value:Y.value,cursorPosition:Y.cursorPosition,commandIsPending:Y.commandIsPending,autoCompletion:Y.commandMeta.autoCompletion??Ad,infoMessage:Y.commandMeta.infoMessage,validationStatus:Y.commandMeta.validity,command:Y.commandMeta.command,inputString:Y.commandMeta.inputString,modifier:Y.commandMeta.modifier}),Md=(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,Li=({width:e})=>{let[t,n]=bd(Mi());Cd(()=>{let y=()=>{let b=Mi();n(I=>Md(I,b)?I:b)},C=lo(y);return y(),()=>{C()}},[]);let{value:r,cursorPosition:o,infoMessage:i,commandIsPending:a,autoCompletion:d,command:l,modifier:u}=t,p=Nd(()=>{let y=Math.max(0,Math.min(o,r.length)),C=Ri({value:r,command:l}),b=wd({value:r,command:l,modifier:u}),I=l?Wn(l):null,A=Td({command:l,modifier:u}),S=(ie,se)=>{let Rn=C&&se>=C.start&&se<C.end,Ln=b&&se>=b.start&&se<b.end;return Rn&&I?I.fg(ie):Ln&&A?A.bg(ie):ie},M=(ie,se)=>{let Rn=C&&se>=C.start&&se<C.end,Ln=b&&se>=b.start&&se<b.end;return Rn&&I?I.fgCursor(ie):Ln&&A?A.bgCursor(ie):Id(ie)},B=r.slice(0,y),G=r[y]??" ",oe=y<r.length?r.slice(y+1):"",Lt=Array.from(B).map((ie,se)=>S(ie,se)).join(""),De=M(G,y),Br=Array.from(oe).map((ie,se)=>S(ie,y+1+se)).join("");if(d.hint){let ie=d.hint[d.overlap]??G;De=Sd(ie),Br=wi(d.remainder.slice(1)+oe)}return wi(":")+Lt+De+Br},[r,o,d,l,u]);return At.createElement(Er,{flexDirection:"column",justifyContent:"flex-start"},At.createElement(Er,{flexDirection:"column",paddingX:1,borderColor:E.secondary,borderStyle:"round",width:e},At.createElement(Er,null,At.createElement(Ti,null,p),i&&At.createElement(Ti,{wrap:"truncate",color:a?E.red:E.secondary2},` ${i} `))))};import Pi from"chalk";import{Box as Rd,Text as Cr}from"ink";import gn,{useEffect as Ld,useState as Pd}from"react";var Dd=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],Di=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)}},Fd=({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)}`},kd=(e,t,n)=>{let r=Di(e),o=Di(t);return Fd({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},Od=(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 kd(i,a,o)},Bd=(e,t)=>e.length===t?e:e.length>t?e.slice(0,t):e.padEnd(t," "),Fi=({width:e,availableHints:t})=>{let{syncStatus:{status:n,msg:r}}=W(),[o,i]=Pd(0);Ld(()=>{if(n!=="syncing"){i(0);return}let S=setInterval(()=>{i(M=>M+1)},50);return()=>clearInterval(S)},[n]);let a=[],d=0;for(let S of t){let B=(a.length>0?" | ":"").length+S.length;if(d+B>e-4)break;a.push(S),d+=B}let l=n!="synced"?r??a.join(" | "):a.join(" | "),u=Math.max(0,e-2),p=n==="syncing"?Od(Dd,(Math.sin(o*.12)+1)/2):E.secondary,y=Pi.hex(p??"fff"),C=Pi.hex(E.secondary2),b=y(`\u256D${"\u2500".repeat(u)}\u256E`),I=y(`\u2570${"\u2500".repeat(u)}\u256F`),A=`${y("\u2502")}${C(Bd(` ${l} `,u))}${y("\u2502")}`;return gn.createElement(Rd,{flexDirection:"column",width:e},gn.createElement(Cr,null,b),gn.createElement(Cr,null,A),gn.createElement(Cr,null,I))};var fn=({width:e,mode:t,availableHints:n})=>{let r=W(),o=[],i=0;for(let a of n){let l=(o.length>0?" | ":"").length+a.length;if(i+l>e+2)break;o.push(a),i+=l}return Nr.createElement(Ud,null,t===f.COMMAND_LINE&&r.syncStatus.status!=="syncing"?Nr.createElement(Li,{width:e}):Nr.createElement(Fi,{width:e,mode:t,availableHints:n}))};import{Box as ct,Text as ki}from"ink";import Be from"react";var Oi=({width:e})=>{let t=[...h().availableActions].map(n=>n.description).filter(n=>n!==void 0).map(n=>{let[r,o]=n.split("]"),i=r?.replace("[",""),a=o?.trim();return[i,a]}).filter(n=>n[0]!==void 0&&n[1]!==void 0).sort(([n],[r])=>n.length===1&&r.length!==1?-1:n.length!==1&&r.length===1?1:n.localeCompare(r,void 0,{sensitivity:"base"}));return t.unshift(["Key(s)","Action"]),Be.createElement(ct,{flexDirection:"column",marginTop:3,borderColor:E.secondary,borderStyle:"round",width:e,minHeight:19},Be.createElement(ct,{flexDirection:"column",width:e},h().mode===f.HELP?t.map(([n,r],o)=>Be.createElement(ct,{paddingLeft:1,key:o,flexDirection:"row"},Be.createElement(ct,{key:o,flexDirection:"row",paddingBottom:o?0:1},Be.createElement(ct,{width:20,justifyContent:"flex-end"},Be.createElement(ki,{color:o?E.accent:E.secondary},n)),Be.createElement(ct,{flexGrow:1,width:40,paddingLeft:2},Be.createElement(ki,{color:o?E.primary:E.secondary},r))))):null))};import Hi from"chalk";import{Box as xn,Text as Ge}from"ink";import Q from"react";import{Box as br,Text as jd}from"ink";import ut from"react";import{Text as Wd}from"ink";import Hd from"react";var _d=e=>e.toLowerCase().trim(),$d=(e,t=Qe)=>{let n=_d(e);return t[n]?t[n]:ft(n)},lt=({id:e,isSelected:t})=>{let n=N.getContributor(e);if(n)return Hd.createElement(Wd,{underline:t,color:$d(n.name)},"@"+n.name)};import{Text as Kd}from"ink";import Vd from"react";var mt=({id:e,isSelected:t})=>{let n=N.getTag(e);if(n)return Vd.createElement(Kd,{underline:t,backgroundColor:me(n.name),color:E.primary}," "+n.name+" ")};var zd=(e,t)=>e.length<=t?e:t<=1?"\u2026":e.slice(0,t-1)+"\u2026",Bi=({width:e})=>{let{breadCrumb:t,currentNode:n,selectedIndex:r,viewMode:o}=h(),i=_(n.id)[r],a=Xe(i?.id??n.id,"TICKET"),d=Fe(a)?a.data:void 0,l=d?.id?_(d.id):[],u=A=>{let S=l.find(M=>M.title===A);return S?_(S.id).map(M=>typeof M.props?.value=="string"?M.props.value:"").filter(M=>!!M):[]},p=u("Tags"),y=u("Assignees"),C=d?.parentNodeId?!kn(n.id,d?.parentNodeId)&&o==="dense":!1,b=t.map((A,S)=>{let M=S===t.length-1,B=_(A.id),G=M?B?.[r]?.title:void 0;return`${S?" / ":""}${A.title??""}${G?` \u25B8 ${G}`:""}`}).join(""),I=zd(b,e);return ut.createElement(br,null,ut.createElement(jd,{color:E.secondary2},I),C?p.map(A=>ut.createElement(br,{key:A,paddingLeft:2},ut.createElement(mt,{id:A}))):null,C?y.map(A=>ut.createElement(br,{key:A,paddingLeft:2},ut.createElement(lt,{id:A}))):null)};import{Box as Gd,Text as Ui}from"ink";import yn from"react";var qd=({filters:e})=>yn.createElement(Gd,{columnGap:1},yn.createElement(Ui,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>yn.createElement(Ui,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),Wi=yn.memo(qd);function vn({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,eventLog:r,unappliedEvents:o}=W(),{userName:i,preferredEditor:a}=pe(),d=40,l=process.stdout.columns-d-8,u=r.at(-1)?.id,p=Wt(u??""),y=Fe(p)?Zr(p.data):"INVALID DATE";return Q.createElement(xn,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},t?Q.createElement(Ge,null," "):Q.createElement(xn,{paddingLeft:1},e.length>0?Q.createElement(Wi,{filters:e}):Q.createElement(Bi,{width:l})),n==="live"?Q.createElement(xn,{columnGap:1,paddingRight:2,"max-width":d,overflow:"hidden",justifyContent:"flex-end"},Q.createElement(_i,{icon:"@",value:i}),Q.createElement(_i,{icon:"\u276F",value:a})):"",n==="peek"?Q.createElement(xn,{paddingLeft:1},Q.createElement(Ge,{backgroundColor:E.yellow}," Readonly "),Q.createElement(Ge,{color:E.yellow}," "+o.length+" edits ago at "),Q.createElement(Ge,{backgroundColor:E.yellow,color:E.accent}," "+y+" "),Q.createElement(Ge,{color:E.yellow},". Resume with "),Q.createElement(Ge,{backgroundColor:E.yellow}," :peek now ")):"")}function _i({icon:e,value:t}){return Q.createElement(Ge,null,Hi.dim(e)+Hi.hex(E.accent)(` ${t??"-"} `))}import{Box as yc,Text as xc}from"ink";import Mt from"react";import{Box as hn,Text as Ir}from"ink";import Ue from"react";import{Text as $i}from"ink";import Ki,{useEffect as Vi,useState as Yd}from"react";var ji={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"command-line":["\u276F "]},re=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=W(),r=ji[n]??ji.default,[o,i]=Yd(0);if(Vi(()=>{i(0)},[r]),Vi(()=>{if(!e)return;let d=setInterval(()=>{i(l=>(l+1)%r.length)},500);return()=>clearInterval(d)},[e,r]),!e)return Ki.createElement($i,null,t);let a=r[o]??r[0]??t;return Ki.createElement($i,{color:E.accent,dimColor:o===1},a)};function Sr(){let e=W(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,i=process.stdout.columns||120,a=t?.id?R(t?.id):[];return Ue.createElement(hn,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:E.secondary,width:i},Ue.createElement(hn,{padding:1,paddingTop:0,paddingBottom:0},Ue.createElement(Ir,null,"Select a board:")),Ue.createElement(hn,{padding:1,flexDirection:"column"},a.map((d,l)=>{let u=e.currentNode.context==="WORKSPACE"&&e.selectedIndex===l,y=R(d.id).flatMap(({id:C})=>_(C)).length;return Ue.createElement(hn,{key:d.id??l},Ue.createElement(Ir,{color:u?E.accent:E.secondary},Ue.createElement(re,{isSelected:u})),Ue.createElement(Ir,{color:u?E.accent:E.secondary},d.title," (",y," issues)",d.readonly?" \u{1F512}":""))})))}import{Box as gc}from"ink";import Sn from"react";import{Box as wr,Text as ec}from"ink";import he from"react";import{Box as Ar,Text as Jd}from"ink";import En from"react";var Cn=({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)),l=Math.max(0,Math.min(n,e.length-1)),u=Math.max(0,e.length-d),p=o?Math.min(u,Math.max(0,l-d+1)):Math.min(u,Math.floor(l/d)*d),y=p+d,C=e.slice(p,y),b=e.length>d,I=i,A=b?Math.max(1,Math.floor(d/e.length*I)):I,S=Math.max(0,I-A),M=Math.max(1,e.length-d),B=b?Math.floor(p/M*S):0;return En.createElement(Ar,{flexDirection:"row",height:i,width:"100%"},En.createElement(Ar,{flexDirection:"column",flexGrow:1,height:i},C),En.createElement(Ar,{flexDirection:"column",width:1,height:I},Array.from({length:I}).map((G,oe)=>En.createElement(Jd,{key:oe,color:b&&oe>=B&&oe<B+A?E.accent:E.secondary},b?"\u2502":" "))))};import{Box as Nn,Text as Xd}from"ink";import qe from"react";var zi=(e,t)=>{let r=R(e.id).find(o=>o.title===t);return r?R(r.id).map(o=>typeof o.props?.value=="string"?o.props.value:"").filter(o=>!!o):[]},Gi=e=>zi(e,"Tags").map(t=>N.getTag(t)).filter(t=>!!t),qi=e=>zi(e,"Assignees").map(t=>N.getContributor(t)).filter(t=>!!t);var Yi=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=Dt(Pn(t.title),r),i=Gi(t),a=qi(t);return qe.createElement(Nn,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?E.accent:E.secondary,justifyContent:"space-between"},qe.createElement(Nn,{borderBottom:!0},qe.createElement(Nn,{paddingLeft:1,flexDirection:"column"},qe.createElement(Xd,{color:E.primary},o))),qe.createElement(Nn,{flexDirection:"row",paddingLeft:1},i.map(d=>qe.createElement(mt,{key:d.id,id:d.id})),a.map(d=>qe.createElement(lt,{key:d.id,id:d.id}))))};import Qd from"chalk";import{Box as wt,Text as Tr}from"ink";import Me from"react";var Zd=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,Ji=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let i=R(t.id),a=A=>{let S=i.find(M=>M.title===A);return S?R(S.id).map(M=>typeof M.props?.value=="string"?M.props.value:"").filter(M=>!!M):[]},d=a("Tags").map(A=>N.getTag(A)).filter(A=>!!A),l=a("Assignees").map(A=>N.getContributor(A)).filter(A=>!!A),u=1,p=d.length*(1+u),y=l.length*(2+u),C=d.map(A=>Me.createElement(wt,{key:A.id,paddingRight:u},Me.createElement(Tr,{color:me(A.name)},"\u25A0"))),b=l.map(A=>Me.createElement(wt,{key:A.id,paddingRight:u},Me.createElement(Tr,{color:ft(A.name)},"@"+A.name.at(0)))),I=n?E.accent:o===f.MOVE?E.secondary:E.primary;return Me.createElement(wt,{borderBottom:!0,justifyContent:"space-between"},Me.createElement(wt,null,Me.createElement(re,{isSelected:n,placeholder:Qd.dim.gray(r+1+" ")}),Me.createElement(Tr,{wrap:"truncate",color:I},Zd(t.title,e-p-y-14))),Me.createElement(wt,null,C,b))};var tc=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:i,listSelectedIndex:a,mode:d})=>{let{renderedChildrenIndex:l}=W(),u=l[e.id]??[],p=`${e.title} (${u.length})`,y=3,C=o?1:4,b=r-y-(o?2:1),I=he.createElement(wr,{borderStyle:"round",borderColor:E.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},he.createElement(re,{isSelected:t}),he.createElement(ec,{bold:!0,color:t?E.accent:E.primary},p," ",e.readonly?"\u{1F512}":"")),A=(S,M)=>{let B=i&&a===M;return o?he.createElement(Ji,{key:S.id,index:M,width:n,ticket:S,isSelected:B,mode:d}):he.createElement(Yi,{key:S.id,width:n,ticket:S,isSelected:B})};return he.createElement(wr,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?E.accent:E.secondary,paddingRight:1,paddingLeft:1,height:r},I,he.createElement(wr,{padding:o?1:0},u.length>0&&he.createElement(Cn,{selectedIndex:a,height:b,itemHeight:C},u.map(A)),he.createElement(re,{isSelected:i&&a===-1})))},Xi=he.memo(tc);import{Box as Lr,Text as uc}from"ink";import We,{useEffect as Pr,useMemo as ts}from"react";import Re from"chalk";import Qi from"string-width";import{decodeTime as nc}from"ulid";var rc=(e,t)=>e+" ".repeat(Math.max(0,t-Qi(e))),oc=(e,t)=>" ".repeat(Math.max(0,t-Qi(e)))+e,ic=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)})(),sc=e=>{switch(e.action){case"move.node":{let t=N.getNode(e.payload.parent),n=t?Re.dim.bgBlack(` ${t.title} `):"unknown",r=e.payload.pos;if(!r)return`to ${n}`;switch(r.at){case"start":return`to ${n} ${Re.dim("(to top of list)")}`;case"end":return`to ${n} ${Re.dim("(to bottom of list)")}`;case"before":return`to ${n} ${Re.dim("(up in list)")}`;case"after":return`to ${n} ${Re.dim("(down in list)")}`}}case"tag.issue":{let t=h().tags[e.payload.tagId];return t?Re.bgHex(me(t.name))(` ${t.name} `):"unknown tag"}case"assign.issue":{let t=h().contributors[e.payload.contributor];return t?Re.hex(me(t.name))(` ${t.name} `):"unknown user"}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"create.contributor":case"edit.title":return`"${"name"in e.payload?e.payload.name:""}"`;default:return""}},ac=e=>{let t=Qr(nc(e));return Re.gray(oc(t,8))},dc=12,cc=e=>rc(`${e}`,dc),Zi=e=>{let t=ac(e.id),n=cc(e.userName),r=ic(e.action),o=sc(e),i=Re.dim("\u203A"),a=[r,o].filter(Boolean).join(" ");return`${n} ${t} ${i} ${a}`};import{Box as bn,Text as lc}from"ink";import Le from"react";var es=({selectedIndex:e,parent:t,selected:n})=>{let{currentNode:r}=W(),{title:o}=t,i=R(t.id).map(a=>{let d=typeof a.props?.value=="string"?a.props.value:"";if(o==="Assignees")return N.getContributor(d)?.id;if(o==="Tags")return N.getTag(d)?.id}).filter(a=>!!a);return Le.createElement(bn,{alignItems:"center",paddingTop:1},Le.createElement(bn,{minWidth:12},Le.createElement(re,{isSelected:n}),Le.createElement(lc,{color:n?E.accent:E.secondary2},o,":")),Le.createElement(bn,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((a,d)=>{let l=r.id===t.id&&d===e;return Le.createElement(bn,{key:`${o}-${a}`,paddingRight:2,minHeight:1},Le.createElement(re,{isSelected:l}),o==="Assignees"?Le.createElement(lt,{isSelected:l,id:a}):o==="Tags"?Le.createElement(mt,{isSelected:l,id:a}):null)})))};import{Box as In,Text as Mr}from"ink";import Pe,{useEffect as mc}from"react";var Rr=({id:e,label:t,text:n,height:r,selected:o,maxWidth:i})=>{let{selectedIndex:a,currentNode:d}=W(),l=C=>String(C).replace(/\r?\n/g,""),u=typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[];mc(()=>{let C=[];return u.forEach((b,I)=>{let A=ee.text({id:`${I}`,name:`Line ${I+1}`,parentNodeId:e,props:{value:b},readonly:!0}),S=N.createNodeAtPosition(A);Fe(S)&&C.push(S.data.id)}),()=>C.forEach(N.deleteNode)},[e,n]);let p="\u2029",y=u.map((C,b)=>{let I=d.id===e&&a===b;return Pe.createElement(In,{key:`${e}-${b}`},Pe.createElement(Mr,{color:I?E.primary:E.secondary2,dimColor:!I},`${b+1} `.padStart(5,"\xA0")),Pe.createElement(Mr,{backgroundColor:I?"gray":""},l(C.length?Dt(C,i-10):p)))});return Pe.createElement(In,{flexDirection:"column",paddingTop:1},Pe.createElement(In,null,Pe.createElement(re,{isSelected:o}),Pe.createElement(Mr,{color:o?E.accent:E.secondary2},t)),Pe.createElement(In,{flexDirection:"row",borderStyle:"round",borderColor:E.secondary,paddingLeft:1,paddingRight:1,marginLeft:1},Pe.createElement(Cn,{scrollByOne:!0,children:y,height:r-2,selectedIndex:a,itemHeight:1})))};var pc=e=>`${e}::log`,ns=e=>e==="Assignees"||e==="Tags",rs=({ticket:e,height:t})=>{let{selectedIndex:n,currentNode:r}=W(),o=process.stdout.columns||120,i=ts(()=>pc(e.id),[e.id]),a=ts(()=>[...e.log].reverse().map(Zi).join(`
41
- `),[e.log]);Pr(()=>{if(N.getNode(i))return;let M={...ee.field(i,"Log",e.id,{value:a}),readonly:!0,childRenderAxis:"vertical"};return N.createNodeAtPosition(M),()=>{N.deleteNode(i)}},[i,e.id,a]),Pr(()=>{let S=N.getNode(i);S&&S.props.value!==a&&N.updateNode({...S,props:{...S.props,value:a},childRenderAxis:"vertical",readonly:!0})},[i,a]);let d=r.id===e.id,l=r.id===i||r.parentNodeId===i;Pr(()=>{l&&(n>=0||U.navigate({selectedIndex:0}))},[l,n]);let u=R(e.id);if(l){let S=N.getNode(i),B=t-3;return We.createElement(Lr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},S?We.createElement(Rr,{id:S.id,label:"Event log",text:S.props.value??"",selected:!1,maxWidth:o,height:B}):null)}let p=u.reduce((S,M)=>ns(M.title)||M.id===i?S+1:S,0),y=2,C=p*1,I=t-3-C-y,A=(S,M)=>ns(S.title)?We.createElement(es,{key:S.id,parent:S,selected:M,selectedIndex:n}):S.id===i?We.createElement(Lr,{key:S.id,paddingTop:1},We.createElement(re,{isSelected:M}),We.createElement(uc,{backgroundColor:E.secondary,color:M?E.accent:E.primary}," History \u203A\u203A ")):S.title==="Description"?We.createElement(Rr,{label:"Description (press e to edit)",key:S.id,id:S.id,text:S.props.value??"",selected:M,maxWidth:o,height:I}):null;return We.createElement(Lr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},u.map((S,M)=>A(S,d&&n===M)))};var fc=({swimlanes:e,currentNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:i,height:a,width:d})=>{let l=t.context,u=l===P.TICKET||l===P.FIELD_LIST||l===P.FIELD,p=l===P.BOARD||l===P.SWIMLANE,y=l===P.TICKET?t:r.find(S=>S.context===P.TICKET),C=Math.floor(d/3),b=Math.floor(d/Math.max(e.length,1)),I=Math.min(b,C),A=i==="dense";return Sn.createElement(gc,{flexDirection:"row",height:a},p&&e.map((S,M)=>{let B=t.id===S.id,G=B?n:-1,oe=t.context===P.BOARD&&n===M;return Sn.createElement(Xi,{key:S.id,height:a,width:I,swimlane:S,isSelected:oe,isDense:A,isFocused:B,listSelectedIndex:G,mode:o})}),u&&y&&Sn.createElement(rs,{height:a,ticket:y}))},os=Sn.memo(fc);var vc=({currentNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:i,width:a})=>{let{renderedChildrenIndex:d}=W(),l=n.find(({context:C})=>C==="BOARD"),y=i-1-3;return Mt.createElement(yc,{flexDirection:"row"},e.context==="WORKSPACE"?Mt.createElement(Sr,null):l?Mt.createElement(os,{height:y,width:a,swimlanes:(d[l.id]??[]).filter(C=>C!==void 0&&Ur(C)),currentNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):Mt.createElement(xc,null))},is=Mt.memo(vc);import{Box as Rt,Text as Ee}from"ink";import H from"react";var An=({isDone:e,command:t,value:n})=>H.createElement(Rt,null,H.createElement(Ee,{color:E.accent,dimColor:e},e?" \u2714 ":" "),H.createElement(Ee,{dimColor:e},"Type "),H.createElement(Ee,{backgroundColor:E.secondary,dimColor:e}," "+t+" "),n&&H.createElement(H.Fragment,null,H.createElement(Ee,{dimColor:e}," "),H.createElement(Ee,{color:E.secondary,dimColor:e},"<"+n+">")));function Dr({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 H.createElement(Rt,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:E.secondary,rowGap:1},H.createElement(Ee,{color:E.accent,bold:!0},"Welcome! \u{1F539}"),H.createElement(Ee,null,"Lets get you started - its a breeze."),H.createElement(Ee,{color:E.secondary2},"And remember, you can always get help with"," ",H.createElement(Ee,{color:E.accent},":help"),"."),!a&&H.createElement(Ee,{color:E.secondary2},d===":set:username"?"First, choose your username.":"Nice. One more step."),H.createElement(Rt,{flexDirection:"column"},n&&H.createElement(Rt,{marginBottom:1},H.createElement(An,{isDone:!0,command:":set:username",value:o})),!n&&H.createElement(An,{isDone:!1,command:":set:username"}),n&&!r&&H.createElement(An,{isDone:!1,command:":set:editor"}),a&&H.createElement(Rt,null,H.createElement(An,{isDone:!0,command:":set:editor",value:i}))))}var Ec=({width:e,height:t})=>O.createElement(fe,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:E.secondary,rowGap:1},O.createElement(He,{color:E.accent,bold:!0},"Initialize project"),O.createElement(He,null,`This folder is not an ${hc.hex(E.accent)("epiq")} project yet.`),O.createElement(He,{color:E.primary},"To start tracking issues here, we need to initialize a new"," ",O.createElement(He,{color:E.primary,backgroundColor:E.secondary}," .epiq/ ")," ","directory in this repository."),O.createElement(fe,{marginTop:1,flexDirection:"column"},O.createElement(fe,null,O.createElement(He,{color:E.accent}," "),O.createElement(He,{color:E.primary},"Type "),O.createElement(He,{backgroundColor:E.secondary}," :init "))),O.createElement(fe,{marginTop:1},O.createElement(He,{color:E.secondary2},"(This will create the local epiq project files)")));function Fr({width:e,height:t}){let n=W(),r=n.filters;if(n.mode===f.HELP)return O.createElement(fe,{flexDirection:"column"},O.createElement(Oi,{width:e}));let{isSetup:o,hasPreferredEditor:i,hasUserName:a,userName:d,preferredEditor:l}=Bt(),u=!o,p=o&&Ke();if(u)return O.createElement(fe,{flexDirection:"column"},O.createElement(fe,{flexDirection:"column"},O.createElement(vn,{hideBreadCrumb:!0,filters:r}),O.createElement(Dr,{height:t,width:e,hasUserName:a,hasPreferredEditor:i,userName:d??"",preferredEditor:l??""})),O.createElement(fn,{width:e,mode:n.mode,availableHints:n.availableHints}));if(p)return O.createElement(fe,{flexDirection:"column"},O.createElement(fe,{flexDirection:"column"},O.createElement(vn,{hideBreadCrumb:!0,filters:r}),O.createElement(Ec,{height:t,width:e})),O.createElement(fn,{width:e,mode:n.mode,availableHints:n.availableHints}));let y=be(h().breadCrumb??[],"BOARD");if(Fe(y)){let C=y.data.id,b=R(C).length,I=3,A=Math.floor(e/I),S=Math.floor(e/Math.max(b,1));e=Math.min(S,A)*Math.max(b,I)}return O.createElement(fe,{flexDirection:"column"},O.createElement(fe,{flexDirection:"column"},O.createElement(vn,{filters:r}),O.createElement(is,{width:e,height:t,currentNode:n.currentNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:n.viewMode,mode:n.mode})),O.createElement(fn,{width:e,mode:n.mode,availableHints:n.availableHints}))}import{Box as Ye,Text as _e}from"ink";import Z,{useEffect as Cc,useMemo as Nc,useState as bc}from"react";var Ic=["\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 Sc(e,t,n){return Math.min(n,Math.max(t,e))}function Ac(e,t){return Z.createElement(_e,null,Z.createElement(_e,{color:t%2===0?"cyan":"blue",bold:!0},e.slice(0,14)),Z.createElement(_e,{color:t%2===0?"cyan":"blue",bold:!0},e.slice(14)))}function Tc(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 kr({durationMs:e=3e3,slogan:t="Never leave the command line"}){let n=Math.max(1,e),[r,o]=bc(0);Cc(()=>{let l=Date.now(),u=setInterval(()=>{let p=Date.now()-l;if(p>=n){o(n),clearInterval(u);return}o(p)},33);return()=>clearInterval(u)},[n]);let i=Sc(r/n,0,1),a=Nc(()=>Tc(i,28),[i]),d=`${Math.round(i*100)}%`;return Z.createElement(Ye,{flexDirection:"column",alignItems:"center",justifyContent:"center",paddingX:4,paddingY:1},Z.createElement(Ye,{flexDirection:"column",minWidth:42},Z.createElement(Ye,{flexDirection:"column",marginBottom:1},Ic.map((l,u)=>Z.createElement(Ye,{key:u,justifyContent:"center"},Ac(l,u)))),Z.createElement(Ye,{justifyContent:"center",marginBottom:1},Z.createElement(_e,{color:"gray"},t)),Z.createElement(Ye,{justifyContent:"center",marginBottom:1},Z.createElement(_e,{color:"cyan"},a.slice(0,10)),Z.createElement(_e,{color:"blue"},a.slice(10,18)),Z.createElement(_e,{color:"magenta"},a.slice(18))),Z.createElement(Ye,{justifyContent:"center",marginBottom:1},Z.createElement(_e,{color:"gray"},d))))}import wc from"readline";var Tn,wn,Ce,Mc=new Set([x.MoveCursorLeft,x.EraseInputWord,x.MoveCursorLeftOfWord,x.MoveCursorRight,x.MoveCursorRightOfWord,x.NavToPreviousContainer,x.NavToNextContainer,x.NavPreviousItem,x.NavNextItem,x.SetViewDense,x.SetViewWide,x.Confirm,x.Exit,x.InitCommandLine,x.ExitCommandLine,x.CaptureInput,x.EraseInput,x.EraseInputWord,x.HideHelp,x.ViewHelp,x.SetViewDense,x.SetViewWide,x.GetLastCommandFromHistory,x.GetNextCommandFromHistory,x.AutoCompleteCommand]),ss=async e=>{if(e.ctrl&&e.name==="c")return U.exit();let{actionIndex:t,mode:n,readOnly:r}=h(),o=vo(e,n);if(!o||r&&!Mc.has(o))return;let i=t[n]?.[o];if(i?.action)try{await i.action(i,e)}catch(a){logger.error(a)}},Rc=()=>async function(t,n){n.name!=="escape"&&(Ce&&(clearTimeout(Ce),Ce=void 0),await ss(n))},Lc=()=>async function(t){if(t.length===1&&t[0]===27){Ce&&clearTimeout(Ce),Ce=setTimeout(()=>{ss({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),Ce=void 0},25);return}Ce&&(clearTimeout(Ce),Ce=void 0)};function as(){Tn&&process.stdin.removeListener("keypress",Tn),wn&&process.stdin.removeListener("data",wn),Tn=Rc(),wn=Lc(),wc.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",wn),process.stdin.on("keypress",Tn)}import Or from"chalk";Dc(`${Or.bold("Epiq CLI")}
40
+ `)):(hd(),m("State booted successfully",null))}import{Box as Ud}from"ink";import Nr from"react";import wt from"chalk";import{Box as Er,Text as Ti}from"ink";import Tt,{useEffect as Cd,useMemo as Nd,useState as bd}from"react";var wi=wt.gray,Id=wt.inverse,Sd=wt.inverse.gray,Ad={hint:"",hints:[],overlap:0,remainder:""},Ri=({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}},Td=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=le(t);return{bg:r=>wt.bgHex(n).black(r),bgCursor:r=>wt.bgHex(n).inverse.black(r)}}return Hn(t)},wd=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=Ri({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}},Mi=()=>({value:Y.value,cursorPosition:Y.cursorPosition,commandIsPending:Y.commandIsPending,autoCompletion:Y.commandMeta.autoCompletion??Ad,infoMessage:Y.commandMeta.infoMessage,validationStatus:Y.commandMeta.validity,command:Y.commandMeta.command,inputString:Y.commandMeta.inputString,modifier:Y.commandMeta.modifier}),Md=(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,Li=({width:e})=>{let[t,n]=bd(Mi());Cd(()=>{let y=()=>{let b=Mi();n(I=>Md(I,b)?I:b)},C=lo(y);return y(),()=>{C()}},[]);let{value:r,cursorPosition:o,infoMessage:i,commandIsPending:a,autoCompletion:d,command:l,modifier:u}=t,p=Nd(()=>{let y=Math.max(0,Math.min(o,r.length)),C=Ri({value:r,command:l}),b=wd({value:r,command:l,modifier:u}),I=l?Hn(l):null,A=Td({command:l,modifier:u}),S=(ie,se)=>{let Ln=C&&se>=C.start&&se<C.end,Pn=b&&se>=b.start&&se<b.end;return Ln&&I?I.fg(ie):Pn&&A?A.bg(ie):ie},M=(ie,se)=>{let Ln=C&&se>=C.start&&se<C.end,Pn=b&&se>=b.start&&se<b.end;return Ln&&I?I.fgCursor(ie):Pn&&A?A.bgCursor(ie):Id(ie)},B=r.slice(0,y),G=r[y]??" ",oe=y<r.length?r.slice(y+1):"",Pt=Array.from(B).map((ie,se)=>S(ie,se)).join(""),De=M(G,y),Br=Array.from(oe).map((ie,se)=>S(ie,y+1+se)).join("");if(d.hint){let ie=d.hint[d.overlap]??G;De=Sd(ie),Br=wi(d.remainder.slice(1)+oe)}return wi(":")+Pt+De+Br},[r,o,d,l,u]);return Tt.createElement(Er,{flexDirection:"column",justifyContent:"flex-start"},Tt.createElement(Er,{flexDirection:"column",paddingX:1,borderColor:E.secondary,borderStyle:"round",width:e},Tt.createElement(Er,null,Tt.createElement(Ti,null,p),i&&Tt.createElement(Ti,{wrap:"truncate",color:a?E.red:E.secondary2},` ${i} `))))};import Pi from"chalk";import{Box as Rd,Text as Cr}from"ink";import fn,{useEffect as Ld,useState as Pd}from"react";var Dd=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],Di=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)}},Fd=({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)}`},kd=(e,t,n)=>{let r=Di(e),o=Di(t);return Fd({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},Od=(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 kd(i,a,o)},Bd=(e,t)=>e.length===t?e:e.length>t?e.slice(0,t):e.padEnd(t," "),Fi=({width:e,availableHints:t})=>{let{syncStatus:{status:n,msg:r}}=W(),[o,i]=Pd(0);Ld(()=>{if(n!=="syncing"){i(0);return}let S=setInterval(()=>{i(M=>M+1)},50);return()=>clearInterval(S)},[n]);let a=[],d=0;for(let S of t){let B=(a.length>0?" | ":"").length+S.length;if(d+B>e-4)break;a.push(S),d+=B}let l=n!="synced"?r??a.join(" | "):a.join(" | "),u=Math.max(0,e-2),p=n==="syncing"?Od(Dd,(Math.sin(o*.12)+1)/2):E.secondary,y=Pi.hex(p??"fff"),C=Pi.hex(E.secondary2),b=y(`\u256D${"\u2500".repeat(u)}\u256E`),I=y(`\u2570${"\u2500".repeat(u)}\u256F`),A=`${y("\u2502")}${C(Bd(` ${l} `,u))}${y("\u2502")}`;return fn.createElement(Rd,{flexDirection:"column",width:e},fn.createElement(Cr,null,b),fn.createElement(Cr,null,A),fn.createElement(Cr,null,I))};var yn=({width:e,mode:t,availableHints:n})=>{let r=W(),o=[],i=0;for(let a of n){let l=(o.length>0?" | ":"").length+a.length;if(i+l>e+2)break;o.push(a),i+=l}return Nr.createElement(Ud,null,t===f.COMMAND_LINE&&r.syncStatus.status!=="syncing"?Nr.createElement(Li,{width:e}):Nr.createElement(Fi,{width:e,mode:t,availableHints:n}))};import{Box as lt,Text as ki}from"ink";import Be from"react";var Oi=({width:e})=>{let t=[...h().availableActions].map(n=>n.description).filter(n=>n!==void 0).map(n=>{let[r,o]=n.split("]"),i=r?.replace("[",""),a=o?.trim();return[i,a]}).filter(n=>n[0]!==void 0&&n[1]!==void 0).sort(([n],[r])=>n.length===1&&r.length!==1?-1:n.length!==1&&r.length===1?1:n.localeCompare(r,void 0,{sensitivity:"base"}));return t.unshift(["Key(s)","Action"]),Be.createElement(lt,{flexDirection:"column",marginTop:3,borderColor:E.secondary,borderStyle:"round",width:e,minHeight:19},Be.createElement(lt,{flexDirection:"column",width:e},h().mode===f.HELP?t.map(([n,r],o)=>Be.createElement(lt,{paddingLeft:1,key:o,flexDirection:"row"},Be.createElement(lt,{key:o,flexDirection:"row",paddingBottom:o?0:1},Be.createElement(lt,{width:20,justifyContent:"flex-end"},Be.createElement(ki,{color:o?E.accent:E.secondary},n)),Be.createElement(lt,{flexGrow:1,width:40,paddingLeft:2},Be.createElement(ki,{color:o?E.primary:E.secondary},r))))):null))};import Hi from"chalk";import{Box as vn,Text as Ge}from"ink";import Q from"react";import{Box as br,Text as jd}from"ink";import pt from"react";import{Text as Wd}from"ink";import Hd from"react";var _d=e=>e.toLowerCase().trim(),$d=(e,t=Ze)=>{let n=_d(e);return t[n]?t[n]:ft(n)},mt=({id:e,isSelected:t})=>{let n=N.getContributor(e);if(n)return Hd.createElement(Wd,{underline:t,color:$d(n.name)},"@"+n.name)};import{Text as Kd}from"ink";import Vd from"react";var ut=({id:e,isSelected:t})=>{let n=N.getTag(e);if(n)return Vd.createElement(Kd,{underline:t,backgroundColor:le(n.name),color:E.primary}," "+n.name+" ")};var zd=(e,t)=>e.length<=t?e:t<=1?"\u2026":e.slice(0,t-1)+"\u2026",Bi=({width:e})=>{let{breadCrumb:t,currentNode:n,selectedIndex:r,viewMode:o}=h(),i=_(n.id)[r],a=Xe(i?.id??n.id,"TICKET"),d=Fe(a)?a.data:void 0,l=d?.id?_(d.id):[],u=A=>{let S=l.find(M=>M.title===A);return S?_(S.id).map(M=>typeof M.props?.value=="string"?M.props.value:"").filter(M=>!!M):[]},p=u("Tags"),y=u("Assignees"),C=d?.parentNodeId?!On(n.id,d?.parentNodeId)&&o==="dense":!1,b=t.map((A,S)=>{let M=S===t.length-1,B=_(A.id),G=M?B?.[r]?.title:void 0;return`${S?" / ":""}${A.title??""}${G?` \u25B8 ${G}`:""}`}).join(""),I=zd(b,e);return pt.createElement(br,null,pt.createElement(jd,{color:E.secondary2},I),C?p.map(A=>pt.createElement(br,{key:A,paddingLeft:2},pt.createElement(ut,{id:A}))):null,C?y.map(A=>pt.createElement(br,{key:A,paddingLeft:2},pt.createElement(mt,{id:A}))):null)};import{Box as Gd,Text as Ui}from"ink";import xn from"react";var qd=({filters:e})=>xn.createElement(Gd,{columnGap:1},xn.createElement(Ui,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>xn.createElement(Ui,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),Wi=xn.memo(qd);function hn({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,eventLog:r,unappliedEvents:o}=W(),{userName:i,preferredEditor:a}=ge(),d=40,l=process.stdout.columns-d-8,u=r.at(-1)?.id,p=Ht(u??""),y=Fe(p)?Zr(p.data):"INVALID DATE";return Q.createElement(vn,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},t?Q.createElement(Ge,null," "):Q.createElement(vn,{paddingLeft:1},e.length>0?Q.createElement(Wi,{filters:e}):Q.createElement(Bi,{width:l})),n==="live"?Q.createElement(vn,{columnGap:1,paddingRight:2,"max-width":d,overflow:"hidden",justifyContent:"flex-end"},Q.createElement(_i,{icon:"@",value:i}),Q.createElement(_i,{icon:"\u276F",value:a})):"",n==="peek"?Q.createElement(vn,{paddingLeft:1},Q.createElement(Ge,{backgroundColor:E.yellow}," Readonly "),Q.createElement(Ge,{color:E.yellow}," "+o.length+" edits ago at "),Q.createElement(Ge,{backgroundColor:E.yellow,color:E.accent}," "+y+" "),Q.createElement(Ge,{color:E.yellow},". Resume with "),Q.createElement(Ge,{backgroundColor:E.yellow}," :peek now ")):"")}function _i({icon:e,value:t}){return Q.createElement(Ge,null,Hi.dim(e)+Hi.hex(E.accent)(` ${t??"-"} `))}import{Box as yc,Text as xc}from"ink";import Rt from"react";import{Box as En,Text as Ir}from"ink";import Ue from"react";import{Text as $i}from"ink";import Ki,{useEffect as Vi,useState as Yd}from"react";var ji={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"command-line":["\u276F "]},re=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=W(),r=ji[n]??ji.default,[o,i]=Yd(0);if(Vi(()=>{i(0)},[r]),Vi(()=>{if(!e)return;let d=setInterval(()=>{i(l=>(l+1)%r.length)},500);return()=>clearInterval(d)},[e,r]),!e)return Ki.createElement($i,null,t);let a=r[o]??r[0]??t;return Ki.createElement($i,{color:E.accent,dimColor:o===1},a)};function Sr(){let e=W(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,i=process.stdout.columns||120,a=t?.id?R(t?.id):[];return Ue.createElement(En,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:E.secondary,width:i},Ue.createElement(En,{padding:1,paddingTop:0,paddingBottom:0},Ue.createElement(Ir,null,"Select a board:")),Ue.createElement(En,{padding:1,flexDirection:"column"},a.map((d,l)=>{let u=e.currentNode.context==="WORKSPACE"&&e.selectedIndex===l,y=R(d.id).flatMap(({id:C})=>_(C)).length;return Ue.createElement(En,{key:d.id??l},Ue.createElement(Ir,{color:u?E.accent:E.secondary},Ue.createElement(re,{isSelected:u})),Ue.createElement(Ir,{color:u?E.accent:E.secondary},d.title," (",y," issues)",d.readonly?" \u{1F512}":""))})))}import{Box as gc}from"ink";import An from"react";import{Box as wr,Text as ec}from"ink";import he from"react";import{Box as Ar,Text as Jd}from"ink";import Cn from"react";var Nn=({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)),l=Math.max(0,Math.min(n,e.length-1)),u=Math.max(0,e.length-d),p=o?Math.min(u,Math.max(0,l-d+1)):Math.min(u,Math.floor(l/d)*d),y=p+d,C=e.slice(p,y),b=e.length>d,I=i,A=b?Math.max(1,Math.floor(d/e.length*I)):I,S=Math.max(0,I-A),M=Math.max(1,e.length-d),B=b?Math.floor(p/M*S):0;return Cn.createElement(Ar,{flexDirection:"row",height:i,width:"100%"},Cn.createElement(Ar,{flexDirection:"column",flexGrow:1,height:i},C),Cn.createElement(Ar,{flexDirection:"column",width:1,height:I},Array.from({length:I}).map((G,oe)=>Cn.createElement(Jd,{key:oe,color:b&&oe>=B&&oe<B+A?E.accent:E.secondary},b?"\u2502":" "))))};import{Box as bn,Text as Xd}from"ink";import qe from"react";var zi=(e,t)=>{let r=R(e.id).find(o=>o.title===t);return r?R(r.id).map(o=>typeof o.props?.value=="string"?o.props.value:"").filter(o=>!!o):[]},Gi=e=>zi(e,"Tags").map(t=>N.getTag(t)).filter(t=>!!t),qi=e=>zi(e,"Assignees").map(t=>N.getContributor(t)).filter(t=>!!t);var Yi=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=Ft(Dn(t.title),r),i=Gi(t),a=qi(t);return qe.createElement(bn,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?E.accent:E.secondary,justifyContent:"space-between"},qe.createElement(bn,{borderBottom:!0},qe.createElement(bn,{paddingLeft:1,flexDirection:"column"},qe.createElement(Xd,{color:E.primary},o))),qe.createElement(bn,{flexDirection:"row",paddingLeft:1},i.map(d=>qe.createElement(ut,{key:d.id,id:d.id})),a.map(d=>qe.createElement(mt,{key:d.id,id:d.id}))))};import Qd from"chalk";import{Box as Mt,Text as Tr}from"ink";import Me from"react";var Zd=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,Ji=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let i=R(t.id),a=A=>{let S=i.find(M=>M.title===A);return S?R(S.id).map(M=>typeof M.props?.value=="string"?M.props.value:"").filter(M=>!!M):[]},d=a("Tags").map(A=>N.getTag(A)).filter(A=>!!A),l=a("Assignees").map(A=>N.getContributor(A)).filter(A=>!!A),u=1,p=d.length*(1+u),y=l.length*(2+u),C=d.map(A=>Me.createElement(Mt,{key:A.id,paddingRight:u},Me.createElement(Tr,{color:le(A.name)},"\u25A0"))),b=l.map(A=>Me.createElement(Mt,{key:A.id,paddingRight:u},Me.createElement(Tr,{color:ft(A.name)},"@"+A.name.at(0)))),I=n?E.accent:o===f.MOVE?E.secondary:E.primary;return Me.createElement(Mt,{borderBottom:!0,justifyContent:"space-between"},Me.createElement(Mt,null,Me.createElement(re,{isSelected:n,placeholder:Qd.dim.gray(r+1+" ")}),Me.createElement(Tr,{wrap:"truncate",color:I},Zd(t.title,e-p-y-14))),Me.createElement(Mt,null,C,b))};var tc=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:i,listSelectedIndex:a,mode:d})=>{let{renderedChildrenIndex:l}=W(),u=l[e.id]??[],p=`${e.title} (${u.length})`,y=3,C=o?1:4,b=r-y-(o?2:1),I=he.createElement(wr,{borderStyle:"round",borderColor:E.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},he.createElement(re,{isSelected:t}),he.createElement(ec,{bold:!0,color:t?E.accent:E.primary},p," ",e.readonly?"\u{1F512}":"")),A=(S,M)=>{let B=i&&a===M;return o?he.createElement(Ji,{key:S.id,index:M,width:n,ticket:S,isSelected:B,mode:d}):he.createElement(Yi,{key:S.id,width:n,ticket:S,isSelected:B})};return he.createElement(wr,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?E.accent:E.secondary,paddingRight:1,paddingLeft:1,height:r},I,he.createElement(wr,{padding:o?1:0},u.length>0&&he.createElement(Nn,{selectedIndex:a,height:b,itemHeight:C},u.map(A)),he.createElement(re,{isSelected:i&&a===-1})))},Xi=he.memo(tc);import{Box as Lr,Text as uc}from"ink";import We,{useEffect as Pr,useMemo as ts}from"react";import Re from"chalk";import Qi from"string-width";import{decodeTime as nc}from"ulid";var rc=(e,t)=>e+" ".repeat(Math.max(0,t-Qi(e))),oc=(e,t)=>" ".repeat(Math.max(0,t-Qi(e)))+e,ic=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)})(),sc=e=>{switch(e.action){case"move.node":{let t=N.getNode(e.payload.parent),n=t?Re.dim.bgBlack(` ${t.title} `):"unknown",r=e.payload.pos;if(!r)return`to ${n}`;switch(r.at){case"start":return`to ${n} ${Re.dim("(to top of list)")}`;case"end":return`to ${n} ${Re.dim("(to bottom of list)")}`;case"before":return`to ${n} ${Re.dim("(up in list)")}`;case"after":return`to ${n} ${Re.dim("(down in list)")}`}}case"tag.issue":{let t=h().tags[e.payload.tagId];return t?Re.bgHex(le(t.name))(` ${t.name} `):"unknown tag"}case"assign.issue":{let t=h().contributors[e.payload.contributor];return t?Re.hex(le(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""}},ac=e=>{let t=Qr(nc(e));return Re.gray(oc(t,8))},dc=12,cc=e=>rc(`${e}`,dc),Zi=e=>{let t=ac(e.id),n=cc(e.userName),r=ic(e.action),o=sc(e),i=Re.dim("\u203A"),a=[r,o].filter(Boolean).join(" ");return`${n} ${t} ${i} ${a}`};import{Box as In,Text as lc}from"ink";import Le from"react";var es=({selectedIndex:e,parent:t,selected:n})=>{let{currentNode:r}=W(),{title:o}=t,i=R(t.id).map(a=>{let d=typeof a.props?.value=="string"?a.props.value:"";if(o==="Assignees")return N.getContributor(d)?.id;if(o==="Tags")return N.getTag(d)?.id}).filter(a=>!!a);return Le.createElement(In,{alignItems:"center",paddingTop:1},Le.createElement(In,{minWidth:12},Le.createElement(re,{isSelected:n}),Le.createElement(lc,{color:n?E.accent:E.secondary2},o,":")),Le.createElement(In,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((a,d)=>{let l=r.id===t.id&&d===e;return Le.createElement(In,{key:`${o}-${a}`,paddingRight:2,minHeight:1},Le.createElement(re,{isSelected:l}),o==="Assignees"?Le.createElement(mt,{isSelected:l,id:a}):o==="Tags"?Le.createElement(ut,{isSelected:l,id:a}):null)})))};import{Box as Sn,Text as Mr}from"ink";import Pe,{useEffect as mc}from"react";var Rr=({id:e,label:t,text:n,height:r,selected:o,maxWidth:i})=>{let{selectedIndex:a,currentNode:d}=W(),l=C=>String(C).replace(/\r?\n/g,""),u=typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[];mc(()=>{let C=[];return u.forEach((b,I)=>{let A=ee.text({id:`${I}`,name:`Line ${I+1}`,parentNodeId:e,props:{value:b},readonly:!0}),S=N.createNodeAtPosition(A);Fe(S)&&C.push(S.data.id)}),()=>C.forEach(N.deleteNode)},[e,n]);let p="\u2029",y=u.map((C,b)=>{let I=d.id===e&&a===b;return Pe.createElement(Sn,{key:`${e}-${b}`},Pe.createElement(Mr,{color:I?E.primary:E.secondary2,dimColor:!I},`${b+1} `.padStart(5,"\xA0")),Pe.createElement(Mr,{backgroundColor:I?"gray":""},l(C.length?Ft(C,i-10):p)))});return Pe.createElement(Sn,{flexDirection:"column",paddingTop:1},Pe.createElement(Sn,null,Pe.createElement(re,{isSelected:o}),Pe.createElement(Mr,{color:o?E.accent:E.secondary2},t)),Pe.createElement(Sn,{flexDirection:"row",borderStyle:"round",borderColor:E.secondary,paddingLeft:1,paddingRight:1,marginLeft:1},Pe.createElement(Nn,{scrollByOne:!0,children:y,height:r-2,selectedIndex:a,itemHeight:1})))};var pc=e=>`${e}::log`,ns=e=>e==="Assignees"||e==="Tags",rs=({ticket:e,height:t})=>{let{selectedIndex:n,currentNode:r}=W(),o=process.stdout.columns||120,i=ts(()=>pc(e.id),[e.id]),a=ts(()=>[...e.log].reverse().map(Zi).join(`
41
+ `),[e.log]);Pr(()=>{if(N.getNode(i))return;let M={...ee.field(i,"Log",e.id,{value:a}),readonly:!0,childRenderAxis:"vertical"};return N.createNodeAtPosition(M),()=>{N.deleteNode(i)}},[i,e.id,a]),Pr(()=>{let S=N.getNode(i);S&&S.props.value!==a&&N.updateNode({...S,props:{...S.props,value:a},childRenderAxis:"vertical",readonly:!0})},[i,a]);let d=r.id===e.id,l=r.id===i||r.parentNodeId===i;Pr(()=>{l&&(n>=0||U.navigate({selectedIndex:0}))},[l,n]);let u=R(e.id);if(l){let S=N.getNode(i),B=t-3;return We.createElement(Lr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},S?We.createElement(Rr,{id:S.id,label:"Event log",text:S.props.value??"",selected:!1,maxWidth:o,height:B}):null)}let p=u.reduce((S,M)=>ns(M.title)||M.id===i?S+1:S,0),y=2,C=p*1,I=t-3-C-y,A=(S,M)=>ns(S.title)?We.createElement(es,{key:S.id,parent:S,selected:M,selectedIndex:n}):S.id===i?We.createElement(Lr,{key:S.id,paddingTop:1},We.createElement(re,{isSelected:M}),We.createElement(uc,{backgroundColor:E.secondary,color:M?E.accent:E.primary}," History \u203A\u203A ")):S.title==="Description"?We.createElement(Rr,{label:"Description (press e to edit)",key:S.id,id:S.id,text:S.props.value??"",selected:M,maxWidth:o,height:I}):null;return We.createElement(Lr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},u.map((S,M)=>A(S,d&&n===M)))};var fc=({swimlanes:e,currentNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:i,height:a,width:d})=>{let l=t.context,u=l===P.TICKET||l===P.FIELD_LIST||l===P.FIELD,p=l===P.BOARD||l===P.SWIMLANE,y=l===P.TICKET?t:r.find(S=>S.context===P.TICKET),C=Math.floor(d/3),b=Math.floor(d/Math.max(e.length,1)),I=Math.min(b,C),A=i==="dense";return An.createElement(gc,{flexDirection:"row",height:a},p&&e.map((S,M)=>{let B=t.id===S.id,G=B?n:-1,oe=t.context===P.BOARD&&n===M;return An.createElement(Xi,{key:S.id,height:a,width:I,swimlane:S,isSelected:oe,isDense:A,isFocused:B,listSelectedIndex:G,mode:o})}),u&&y&&An.createElement(rs,{height:a,ticket:y}))},os=An.memo(fc);var vc=({currentNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:i,width:a})=>{let{renderedChildrenIndex:d}=W(),l=n.find(({context:C})=>C==="BOARD"),y=i-1-3;return Rt.createElement(yc,{flexDirection:"row"},e.context==="WORKSPACE"?Rt.createElement(Sr,null):l?Rt.createElement(os,{height:y,width:a,swimlanes:(d[l.id]??[]).filter(C=>C!==void 0&&Ur(C)),currentNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):Rt.createElement(xc,null))},is=Rt.memo(vc);import{Box as Lt,Text as Ee}from"ink";import H from"react";var Tn=({isDone:e,command:t,value:n})=>H.createElement(Lt,null,H.createElement(Ee,{color:E.accent,dimColor:e},e?" \u2714 ":" "),H.createElement(Ee,{dimColor:e},"Type "),H.createElement(Ee,{backgroundColor:E.secondary,dimColor:e}," "+t+" "),n&&H.createElement(H.Fragment,null,H.createElement(Ee,{dimColor:e}," "),H.createElement(Ee,{color:E.secondary,dimColor:e},"<"+n+">")));function Dr({width:e,height:t,hasUserName:n,hasPreferredEditor:r,userName:o,preferredEditor:i}){let a=n&&r,d=n?r?null:":config:editor":":config:username";return H.createElement(Lt,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:E.secondary,rowGap:1},H.createElement(Ee,{color:E.accent,bold:!0},"Welcome! \u{1F539}"),H.createElement(Ee,null,"Lets get you started - its a breeze."),H.createElement(Ee,{color:E.secondary2},"And remember, you can always get help with"," ",H.createElement(Ee,{color:E.accent},":help"),"."),!a&&H.createElement(Ee,{color:E.secondary2},d===":config:username"?"First, choose your username.":"Nice. One more step."),H.createElement(Lt,{flexDirection:"column"},n&&H.createElement(Lt,{marginBottom:1},H.createElement(Tn,{isDone:!0,command:":config:username",value:o})),!n&&H.createElement(Tn,{isDone:!1,command:":config:username"}),n&&!r&&H.createElement(Tn,{isDone:!1,command:":config:editor"}),a&&H.createElement(Lt,null,H.createElement(Tn,{isDone:!0,command:":config:editor",value:i}))))}var Ec=({width:e,height:t})=>O.createElement(fe,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:E.secondary,rowGap:1},O.createElement(He,{color:E.accent,bold:!0},"Initialize project"),O.createElement(He,null,`This folder is not an ${hc.hex(E.accent)("epiq")} project yet.`),O.createElement(He,{color:E.primary},"To start tracking issues here, we need to initialize a new"," ",O.createElement(He,{color:E.primary,backgroundColor:E.secondary}," .epiq/ ")," ","directory in this repository."),O.createElement(fe,{marginTop:1,flexDirection:"column"},O.createElement(fe,null,O.createElement(He,{color:E.accent}," "),O.createElement(He,{color:E.primary},"Type "),O.createElement(He,{backgroundColor:E.secondary}," :init "))),O.createElement(fe,{marginTop:1},O.createElement(He,{color:E.secondary2},"(This will create the local epiq project files)")));function Fr({width:e,height:t}){let n=W(),r=n.filters;if(n.mode===f.HELP)return O.createElement(fe,{flexDirection:"column"},O.createElement(Oi,{width:e}));let{isSetup:o,hasPreferredEditor:i,hasUserName:a,userName:d,preferredEditor:l}=Ut(),u=!o,p=o&&Ke();if(u)return O.createElement(fe,{flexDirection:"column"},O.createElement(fe,{flexDirection:"column"},O.createElement(hn,{hideBreadCrumb:!0,filters:r}),O.createElement(Dr,{height:t,width:e,hasUserName:a,hasPreferredEditor:i,userName:d??"",preferredEditor:l??""})),O.createElement(yn,{width:e,mode:n.mode,availableHints:n.availableHints}));if(p)return O.createElement(fe,{flexDirection:"column"},O.createElement(fe,{flexDirection:"column"},O.createElement(hn,{hideBreadCrumb:!0,filters:r}),O.createElement(Ec,{height:t,width:e})),O.createElement(yn,{width:e,mode:n.mode,availableHints:n.availableHints}));let y=be(h().breadCrumb??[],"BOARD");if(Fe(y)){let C=y.data.id,b=R(C).length,I=3,A=Math.floor(e/I),S=Math.floor(e/Math.max(b,1));e=Math.min(S,A)*Math.max(b,I)}return O.createElement(fe,{flexDirection:"column"},O.createElement(fe,{flexDirection:"column"},O.createElement(hn,{filters:r}),O.createElement(is,{width:e,height:t,currentNode:n.currentNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:n.viewMode,mode:n.mode})),O.createElement(yn,{width:e,mode:n.mode,availableHints:n.availableHints}))}import{Box as Ye,Text as _e}from"ink";import Z,{useEffect as Cc,useMemo as Nc,useState as bc}from"react";var Ic=["\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 Sc(e,t,n){return Math.min(n,Math.max(t,e))}function Ac(e,t){return Z.createElement(_e,null,Z.createElement(_e,{color:t%2===0?"cyan":"blue",bold:!0},e.slice(0,14)),Z.createElement(_e,{color:t%2===0?"cyan":"blue",bold:!0},e.slice(14)))}function Tc(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 kr({durationMs:e=3e3,slogan:t="Never leave the command line"}){let n=Math.max(1,e),[r,o]=bc(0);Cc(()=>{let l=Date.now(),u=setInterval(()=>{let p=Date.now()-l;if(p>=n){o(n),clearInterval(u);return}o(p)},33);return()=>clearInterval(u)},[n]);let i=Sc(r/n,0,1),a=Nc(()=>Tc(i,28),[i]),d=`${Math.round(i*100)}%`;return Z.createElement(Ye,{flexDirection:"column",alignItems:"center",justifyContent:"center",paddingX:4,paddingY:1},Z.createElement(Ye,{flexDirection:"column",minWidth:42},Z.createElement(Ye,{flexDirection:"column",marginBottom:1},Ic.map((l,u)=>Z.createElement(Ye,{key:u,justifyContent:"center"},Ac(l,u)))),Z.createElement(Ye,{justifyContent:"center",marginBottom:1},Z.createElement(_e,{color:"gray"},t)),Z.createElement(Ye,{justifyContent:"center",marginBottom:1},Z.createElement(_e,{color:"cyan"},a.slice(0,10)),Z.createElement(_e,{color:"blue"},a.slice(10,18)),Z.createElement(_e,{color:"magenta"},a.slice(18))),Z.createElement(Ye,{justifyContent:"center",marginBottom:1},Z.createElement(_e,{color:"gray"},d))))}import wc from"readline";var wn,Mn,Ce,Mc=new Set([x.MoveCursorLeft,x.EraseInputWord,x.MoveCursorLeftOfWord,x.MoveCursorRight,x.MoveCursorRightOfWord,x.NavToPreviousContainer,x.NavToNextContainer,x.NavPreviousItem,x.NavNextItem,x.SetViewDense,x.SetViewWide,x.Confirm,x.Exit,x.InitCommandLine,x.ExitCommandLine,x.CaptureInput,x.EraseInput,x.EraseInputWord,x.HideHelp,x.ViewHelp,x.SetViewDense,x.SetViewWide,x.GetLastCommandFromHistory,x.GetNextCommandFromHistory,x.AutoCompleteCommand]),ss=async e=>{if(e.ctrl&&e.name==="c")return U.exit();let{actionIndex:t,mode:n,readOnly:r}=h(),o=vo(e,n);if(!o||r&&!Mc.has(o))return;let i=t[n]?.[o];if(i?.action)try{await i.action(i,e)}catch(a){logger.error(a)}},Rc=()=>async function(t,n){n.name!=="escape"&&(Ce&&(clearTimeout(Ce),Ce=void 0),await ss(n))},Lc=()=>async function(t){if(t.length===1&&t[0]===27){Ce&&clearTimeout(Ce),Ce=setTimeout(()=>{ss({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),Ce=void 0},25);return}Ce&&(clearTimeout(Ce),Ce=void 0)};function as(){wn&&process.stdin.removeListener("keypress",wn),Mn&&process.stdin.removeListener("data",Mn),wn=Rc(),Mn=Lc(),wc.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",Mn),process.stdin.on("keypress",wn)}import Or from"chalk";Dc(`${Or.bold("Epiq CLI")}
42
42
 
43
43
  ${Or.dim("Boot in directory:")}
44
44
  ${Or.cyan("$ epiq")}
45
45
 
46
- `,{importMeta:import.meta,flags:{init:{type:"string"}}});var Fc=2e3,kc=600,cs=process.stdout.columns||120,ls=process.stdout.rows||20,Mn=null,Oc=e=>new Promise(t=>setTimeout(t,e)),ms=e=>{if(!Mn){Mn=Pc(e);return}Mn.rerender(e)},us=()=>{ms(ds.createElement(Fr,{width:cs,height:ls}))},Bc=e=>{ms(ds.createElement(kr,{durationMs:e}))},Uc=()=>{let e=ht();if(c(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},Wc=e=>{let t=Ai(e);if(c(t))throw new Error(`Failed to boot state: ${t.message}`)};async function Hc(){let e=mi();c(e)||gt(e.data),await ni();let t=Uc(),r=t.length===0?Fc:kc;r>0&&Bc(r);let o=Date.now();Wc(t);let i=Date.now()-o,a=Math.max(0,r-i);a>0&&await Oc(a),us(),as()}process.stdout.on("resize",()=>{cs=process.stdout.columns||120,ls=process.stdout.rows||20,Mn&&us()});(async()=>(console.clear(),await Hc()))();
46
+ `,{importMeta:import.meta,flags:{init:{type:"string"}}});var Fc=2e3,kc=600,cs=process.stdout.columns||120,ls=process.stdout.rows||20,Rn=null,Oc=e=>new Promise(t=>setTimeout(t,e)),ms=e=>{if(!Rn){Rn=Pc(e);return}Rn.rerender(e)},us=()=>{ms(ds.createElement(Fr,{width:cs,height:ls}))},Bc=e=>{ms(ds.createElement(kr,{durationMs:e}))},Uc=()=>{let e=ht();if(c(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},Wc=e=>{let t=Ai(e);if(c(t))throw new Error(`Failed to boot state: ${t.message}`)};async function Hc(){let e=mi();c(e)||Qe(e.data),await ni();let t=Uc(),r=t.length===0?Fc:kc;r>0&&Bc(r);let o=Date.now();Wc(t);let i=Date.now()-o,a=Math.max(0,r-i);a>0&&await Oc(a),us(),as()}process.stdout.on("resize",()=>{cs=process.stdout.columns||120,ls=process.stdout.rows||20,Rn&&us()});(async()=>(console.clear(),await Hc()))();