epiq 0.3.7 → 0.3.9

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/mcp.js CHANGED
@@ -1,40 +1,58 @@
1
1
  #!/usr/bin/env node
2
- import{McpServer as ws}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as Ts}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as A}from"zod";var m={INIT:"init",HELP:"help",NEW:"new",TAG:"tag",UNTAG:"untag",MOVE:"move",PEEK:"peek",FILTER:"filter",ASSIGN:"assign",UNASSIGN:"unassign",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:""},re={None:"none",Invalid:"invalid",Valid:"valid"},ee={None:"none",Success:"success",Fail:"fail"},i=e=>({result:ee.Fail,message:e,data:null}),c=(e,t)=>({result:ee.Success,message:e,data:t}),fn=()=>({result:ee.None,message:"No result",data:null}),a=e=>e.result==="fail";import{ulid as so}from"ulid";import{monotonicFactory as yo,ulid as Xe}from"ulid";var Qe=yo(),Ze=({name:e,parent:t,user:{userId:n,userName:r}})=>{let o=Qe(),s=Qe(),d=Qe(),l=Qe();return[{id:Xe(),userId:n,userName:r,action:"add.issue",payload:{id:o,parent:t,name:e}},{id:Xe(),userId:n,userName:r,action:"add.field",payload:{id:s,parent:o,name:"Description",val:""}},{id:Xe(),userId:n,userName:r,action:"add.field",payload:{id:d,parent:o,name:"Assignees"}},{id:Xe(),userId:n,userName:r,action:"add.field",payload:{id:l,parent:o,name:"Tags"}}]};import Pe from"chalk";import{monotonicFactory as bs,ulid as de}from"ulid";import{useSyncExternalStore as vm}from"react";var P={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function z(e){return e.context==="TICKET"}var p={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line"};function et(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var tt=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var vn=e=>{let t=new Map;for(let n of e)for(let r=1;r<=n.length;r++){let o=n.slice(0,r),s=t.get(o);s?s.push(n):t.set(o,[n])}return t},yn=(e,t)=>t?e.get(t)??[]:[];var En=new WeakMap,Eo=e=>{let t=En.get(e);return t||(t=vn(e),En.set(e,t)),t};var Nn=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return yn(Eo(e),r).filter(s=>et(r,s)>=n)};var In=({inputToMatch:e,lastWord:t},n)=>{if(t.endsWith(" "))return{hint:"",hints:[],overlap:0,remainder:""};let r=Nn({wordList:n,inputToMatch:e,overlapThreshold:1});return No(t,r)},No=(e,t)=>{let n=t[0]??"",r=et(e.toLowerCase(),n.toLowerCase()),[o,s]=n.split(":"),d=r<(o??"").length,l=!!s,f=(l&&d?o:n)+(l&&d?":":" "),N=f.slice(r);return{hint:f,hints:t,overlap:r,remainder:N}};var xn=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];var xe=24n,Io=xe*4n,nt=(1n<<Io)-1n,xo=/^[0-9a-f]+$/;function bn(e){if(!e||!xo.test(e))throw new Error(`Invalid hex rank: ${e}`);return BigInt("0x"+e)}function rt(e,t=xe){if(e<0n)throw new Error("Negative rank not allowed");return e.toString(16).padStart(Number(t),"0")}function ke(e,t){if(!e&&!t)return rt(nt/2n,xe);let n=e?bn(e):0n,r=t?bn(t):nt;if(r<=n)return rt(nt/2n,xe);let o=(n+r)/2n;return o===n||o===r?"":rt(o,xe)}function Q(){return rt(nt/2n,xe)}var te={workspace:(e,t)=>({id:e,title:t,rank:Q(),isDeleted:!1,props:{},context:P.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,r=!1)=>({id:e,title:t,rank:Q(),isDeleted:!1,props:{},context:P.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:r,log:[]}),swimlane:(e,t,n)=>({id:e,title:t,rank:Q(),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:Q(),isDeleted:!1,props:r,context:P.FIELD,childRenderAxis:o,parentNodeId:n,readonly:!1,log:[]}),ticket:(e,t,n)=>({id:e,title:t,rank:Q(),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:Q(),isDeleted:!1,props:r,context:P.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:o,log:[]})};var H=e=>Object.values(y().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),Cn=(e,t)=>e.findIndex(n=>n.id===t),Ut=(e,t={at:"end"})=>{if(e.length===0)return c("Resolved rank",Q());switch(t.at){case"start":{let n=e[0];return n?c("Resolved rank",ke(void 0,n.rank)):i("Unable to resolve first sibling")}case"end":{let n=e[e.length-1];return n?c("Resolved rank",ke(n.rank,void 0)):i("Unable to resolve last sibling")}case"before":{let n=Cn(e,t.sibling);if(n<0)return i("Sibling not found");let r=n>0?e[n-1]:void 0,o=e[n];return o?c("Resolved rank",ke(r?.rank,o.rank)):i("Sibling not found")}case"after":{let n=Cn(e,t.sibling);if(n<0)return i("Sibling not found");let r=e[n],o=n<e.length-1?e[n+1]:void 0;return r?c("Resolved rank",ke(r.rank,o?.rank)):i("Sibling not found")}}};var be=(e,t)=>{let{nodes:n}=y(),r=n[e];if(!r)return i("Node not found");if(r.context===t)return c("Resolved ancestor node",r);let o=r.parentNodeId?n[r.parentNodeId]:void 0;for(;o;){if(o.context===t)return c("Resolved ancestor node",o);o=o.parentNodeId?n[o.parentNodeId]:void 0}return i(`No ancestor found for context: ${t}`)},bo=(e,t)=>{let{nodes:n}=y(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},_t=(e,t)=>e?e.readonly?i({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node"}[t]):null:i("Node not found"),E={deleteNode(e){q(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},editValue(e,t){let{nodes:n}=y(),r=n[e];if(!r)return i("Edit target node not found");let o=_t(r,"edit");if(o)return o;let s={...r,props:{...r.props,value:t}};return E.updateNode(s),c("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return i("Rename target node not found");let r=_t(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),c("Renamed node",o)},getExistingTags(){let{tags:e}=y();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=y();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return H(e).find(n=>n.title===t)},moveNode({id:e,parentId:t,position:n={at:"end"}}){let{rootNodeId:r}=y(),o=this.getNode(e),s=this.getNode(t);if(!o)return i("Node not found");if(!s)return i("Target parent not found");if(r===e)return i("Cannot move root node");if(e===t)return i("Cannot move node into itself");let d=_t(o,"move");if(d)return d;if(bo(t,e))return i("Cannot move node into its own descendant");let l=H(t).filter(f=>f.id!==e),u=Ut(l,n);if(a(u))return u;let v={...o,parentNodeId:t,rank:u.data};return this.updateNode(v),c("Moved node successfully",v)},tombstoneNode(e){let{nodes:t,currentNodeId:n,rootNodeId:r}=y(),o=this.getNode(e);if(!o)return i("Node not found");if(r===e)return i("Cannot delete root node");let s=new Set,d=u=>{let v=t[u];if(!(!v||s.has(u))){s.add(u);for(let f of H(v.id))d(f.id)}};d(e);let l={...structuredClone(t)};for(let u of s){if(!l[u])return i("Unable to locate node to delete");l[u]={...l[u],isDeleted:!0}}return n?(I({nodes:l}),c("Successfully tomb stoned",o)):i("Unable to delete undefined")},createContributor(e){let t=q(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return a(t)?i("Unable to create contributor"):c("Created contributor",e)},assign(e,t,n){let r=E.getContributor(t),o=E.getNode(e);if(!o||!r)return i("Unable assign contributor to issue");let s=this.getFieldByTitle(o.id,"Assignees");if(!s)return i("Unable to locate assignees field");if(H(s.id).some(u=>u.props?.value===t))return i("Contributor already assigned");let l=this.createNodeAtPosition(te.field(n,r.name,s.id,{value:t}));return a(l)?l:c("Assigned contributor",l.data)},createTag(e){let t=q(n=>({...n,tags:{...n.tags,[e.id]:e}}));return a(t)?i("Could not create tag"):c("Tag created",e)},tag(e,t,n){let r=E.getTag(t),o=E.getNode(e);if(!r)return i("Unable to add tag, missing tag");if(!o)return i("Unable to add tag, missing target");let s=this.getFieldByTitle(o.id,"Tags");if(!s)return i("Unable to locate tags field");if(H(s.id).some(u=>u.props?.value===t))return i("Tag already assigned");let l=this.createNodeAtPosition(te.field(n,r.name,s.id,{value:t}));return a(l)?l:c("Tag added",l.data)},untag(e,t){let n=E.getTag(t),r=E.getNode(e);if(!n)return i("Unable to remove tag, missing tag");if(!r)return i("Unable to remove tag, missing target");let o=this.getFieldByTitle(r.id,"Tags");if(!o)return i("Unable to locate tags field");let s=H(o.id).find(l=>l.props?.value===t);if(!s)return c("Issue is not tagged with that tag",null);let d={...s,isDeleted:!0};return this.updateNode(d),c("Tag removed",d)},unassign(e,t){let n=E.getContributor(t),r=E.getNode(e);if(!n)return i("Unable to unassign, missing contributor");if(!r)return i("Unable to unassign, missing target");let o=this.getFieldByTitle(r.id,"Assignees");if(!o)return i("Unable to locate assignees field");let s=H(o.id).find(l=>l.props?.value===t);if(!s)return c("Issue is not assigned to that contributor",null);let d={...s,isDeleted:!0};return this.updateNode(d),c("Assignee removed",d)},createNodeAtPosition(e,t={at:"end"}){if(!e.parentNodeId){let s={...e,rank:Q()};return this.createNode(s),c("Created node",s)}let n=H(e.parentNodeId),r=Ut(n,t);if(a(r))return r;let o={...e,rank:r.data};return this.createNode(o),c("Created node",o)},createNode(e){let t=q(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return a(t)?i("Unable to create node"):c("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return i("Failed to locate node");let n={...t,readonly:!0},r=q(o=>({...o,nodes:{...o.nodes,[e]:n}}));return a(r)?i(r.message):c("Locked node",n)},updateNode(e){let t=q(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return a(t)?t:c("Updated node",e)},getContributor(e){return y().contributors[e]},getTag(e){return y().tags[e]},getNode(e){return y().nodes[e]},getSiblings:e=>Object.values(y().nodes).filter(t=>!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank))};var ot={autoSync:!1,preferredEditor:null,userName:null,userId:null},oe=()=>ot,it=e=>(ot={...ot,...e},ot);var hn=()=>{let e=oe(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim();return{isSetup:n&&t,hasPreferredEditor:n,hasUserName:t,userName:e.userName,preferredEditor:e.preferredEditor}},Rn=()=>!Oe();var B={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"},Sn={accent:B.cyan,accent2:B.magenta,primary:B.white,secondary:B.grayDark,secondary2:B.grayLight,gray:B.gray,green:B.green,yellow:B.yellow,red:B.red};var g={red:B.red,yellow:B.yellow,green:B.green,blue:B.blue,magenta:B.magenta,cyan:B.cyan},st={urgent:g.red,critical:g.red,important:g.red,blocker:g.red,asap:g.red,immediate:g.red,fail:g.red,failure:g.red,broken:g.red,bug:g.red,error:g.red,incident:g.red,outage:g.red,production:g.red,crash:g.red,security:g.red,warning:g.yellow,warn:g.yellow,risky:g.yellow,risk:g.yellow,attention:g.yellow,pending:g.yellow,review:g.yellow,"needs-review":g.yellow,qa:g.yellow,testing:g.yellow,test:g.yellow,validate:g.yellow,verification:g.yellow,staging:g.yellow,check:g.yellow,"follow-up":g.yellow,followup:g.yellow,waiting:g.yellow,blocked:g.yellow,hold:g.yellow,done:g.green,complete:g.green,completed:g.green,success:g.green,ok:g.green,stable:g.green,resolved:g.green,fixed:g.green,closed:g.green,merged:g.green,released:g.green,deployed:g.green,approved:g.green,verified:g.green,working:g.green,healthy:g.green,pass:g.green,passing:g.green,info:g.blue,information:g.blue,note:g.blue,docs:g.blue,documentation:g.blue,doc:g.blue,guide:g.blue,help:g.blue,explanation:g.blue,detail:g.blue,details:g.blue,context:g.blue,design:g.blue,discussion:g.blue,proposal:g.blue,idea:g.blue,feature:g.magenta,enhancement:g.magenta,improvement:g.magenta,refactor:g.magenta,refactoring:g.magenta,cleanup:g.magenta,optimize:g.magenta,optimization:g.magenta,perf:g.magenta,performance:g.magenta,upgrade:g.magenta,migration:g.magenta,modernize:g.magenta,debt:g.magenta,todo:g.cyan,next:g.cyan,planned:g.cyan,plan:g.cyan,future:g.cyan,backlog:g.cyan,investigate:g.cyan,explore:g.cyan,prototype:g.cyan};var An=(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):[]},Co=e=>An(e,"Tags").map(t=>E.getTag(t)).filter(t=>!!t),at=()=>{let{breadCrumb:e,selectedNode:t}=y(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!z(n)?i("Invalid untag target"):c("Retrieved tags from ticket in breadcrumb",Co(n)??[])},dt=()=>{let{breadCrumb:e,selectedNode:t}=y(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!z(n)?i("Invalid untag target"):c("Retrieved tags from ticket in breadcrumb",ho(n)??[])},ho=e=>An(e,"Assignees").map(t=>E.getContributor(t)).filter(t=>!!t);var wn=(e,t)=>{let r=R(e.id).find(o=>o.title===t);return r&&typeof r.props?.value=="string"?tt(r.props.value):""};var Ro=/^(\d+)(h|d|w|mo|y)$/,So=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,Ao=({year:e,month:t,day:n,hour:r=0,minute:o=0})=>{let s=new Date(e,t-1,n,r,o);return s.getFullYear()===e&&s.getMonth()===t-1&&s.getDate()===n&&s.getHours()===r&&s.getMinutes()===o},wo=(e,t=new Date)=>{let n=e.match(Ro);if(!n)return null;let[,r,o]=n,s=Number(r);if(!Number.isInteger(s)||s<=0)return null;let d=new Date(t);switch(o){case"h":return d.setHours(d.getHours()-s),d;case"d":return d.setDate(d.getDate()-s),d;case"w":return d.setDate(d.getDate()-s*7),d;case"mo":return d.setMonth(d.getMonth()-s),d;case"y":return d.setFullYear(d.getFullYear()-s),d;default:return null}},To=e=>{let t=e.match(So);if(!t)return null;let[,n,r,o,s,d]=t,l=Number(n),u=Number(r),v=Number(o),f=s?Number(s):0,N=d?Number(d):0;return Ao({year:l,month:u,day:v,hour:f,minute:N})?new Date(l,u-1,v,f,N):null},ct=e=>{let t=e.trim().toLowerCase();return wo(t)??To(t)},Tn=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Mo=[{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}],Mn=(e=Mo)=>{let t=[];for(let{unit:n,from:r,to:o}of e)for(let s=r;s<=o;s++)t.push(`${s}${n}`);return t};var Lo=["BOARD","TICKET","SWIMLANE"],_=e=>{let{currentNode:t,readOnly:n,selectedNode:r}=y(),o=hn().isSetup,s=t.context,d=r?.context,l=[m.SYNC,m.HELP,m.SET_VIEW,m.SET_EDITOR,m.SET_USERNAME],u=[m.NEW,m.RENAME,m.DELETE],v=[m.TAG,m.UNTAG,m.ASSIGN,m.UNASSIGN,m.CLOSE_ISSUE,m.RE_OPEN_ISSUE,m.SET_DESCRIPTION],f=[m.FILTER,m.PEEK],N={WORKSPACE:[...l,...u],BOARD:[...f,...l,...u],SWIMLANE:[...f,...l,...u],TICKET:[...l,...u,...v],FIELD:[...l,...v],FIELD_LIST:[...l,...v],TEXT:[...l]},C=d&&Lo.includes(d),S=[...N[s||"WORKSPACE"]].filter(j=>[m.RENAME,m.DELETE,m.MOVE].includes(j)?C:!0),M={[m.PEEK]:[...Mn(),"now","prev","next"],[m.SYNC]:[],[m.INIT]:[],[m.SET_USERNAME]:[],[m.SET_DESCRIPTION]:["confirm"],[m.DELETE]:["confirm"],[m.RE_OPEN_ISSUE]:["confirm"],[m.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[m.CLOSE_ISSUE]:["confirm"],[m.FILTER]:["tag","assignee","description","title","clear"],[m.SET_VIEW]:["dense","wide"],[m.SET_EDITOR]:[...xn,"vim"],[m.TAG]:[...new Set([...Object.keys(st),...E.getExistingTags()])],[m.UNTAG]:[...at()?.data?.map(({name:j})=>j)??[]],[m.UNASSIGN]:[...dt()?.data?.map(({name:j})=>j)??[]],[m.ASSIGN]:E.getExistingAssignees(),[m.HELP]:[],[m.RENAME]:[],[m.NEW]:s==="TICKET"||s==="FIELD"||s==="FIELD_LIST"?["issue","swimlane","board"]:s==="SWIMLANE"?["issue","swimlane","board"]:s==="BOARD"?["issue","swimlane","board"]:["board"],[m.NONE]:S};return o?Rn()?n&&(M={[m.NONE]:[m.HELP,m.PEEK],[m.HELP]:M[m.HELP],[m.PEEK]:M[m.PEEK]}):M={[m.NONE]:[m.HELP,m.INIT],[m.HELP]:M[m.HELP],[m.INIT]:M[m.INIT]}:M={[m.NONE]:[m.HELP,m.SET_EDITOR,m.SET_USERNAME],[m.HELP]:M[m.HELP],[m.SET_EDITOR]:M[m.SET_EDITOR],[m.SET_USERNAME]:M[m.SET_USERNAME]},M[e]??[]};import Ce from"chalk";import{decodeTime as Ln}from"ulid";var Pn=e=>{try{return c("Decoded date",new Date(Ln(e)))}catch(t){return i("Decoding failed + "+t.message)}},Bt=e=>{if(!e?.id)return null;try{return Ln(e.id)}catch{return null}};var ye=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?c("Found node",n):i("Unable to find node in breadcrumb")};import Dn from"chalk";var $t={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Po=(e,t,n)=>Math.max(t,Math.min(n,e)),Wt=(e,t,n)=>e+(t-e)*n,Fn=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Do=(e,t,n)=>{let r=t/100,o=n/100,s=(1-Math.abs(2*o-1))*r,d=e/60,l=s*(1-Math.abs(d%2-1)),u=0,v=0,f=0;d>=0&&d<1?(u=s,v=l):d>=1&&d<2?(u=l,v=s):d>=2&&d<3?(v=s,f=l):d>=3&&d<4?(v=l,f=s):d>=4&&d<5?(u=l,f=s):(u=s,f=l);let N=o-s/2;return[Math.round((u+N)*255),Math.round((v+N)*255),Math.round((f+N)*255)]},Fo=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,ko=(e,t,n)=>[Math.round(Wt(e[0],t[0],n)),Math.round(Wt(e[1],t[1],n)),Math.round(Wt(e[2],t[2],n))],Oo=e=>{let n=Fn(e)%360,r=Do(n,$t.stringColor.saturation,$t.stringColor.lightness);return Fo(r)},Uo=e=>{let t=$t.gradient.stops,n=Po(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let r=t.length-1,o=n*r,s=Math.min(Math.floor(o),r-1),d=o-s;return ko(t[s],t[s+1],d)},lt=e=>Fn(e.toLowerCase().trim())/4294967295,_o=e=>{let t=lt(e);return Uo(t)},Bo=e=>{let[t,n,r]=_o(e);return{normal:o=>Dn.bgRgb(t,n,r).black(o),cursor:o=>Dn.bgRgb(t,n,r).white.bold(o)}};var Ht=e=>Bo(e).normal(` ${e} `),Ue=(e,t=st)=>{let r=(o=>o.toLowerCase().trim())(e);return r&&t[r]?t[r]:Oo(r)};var Wo=["BOARD","TICKET","SWIMLANE"],Kt=()=>{let e=y().selectedNode;return e?.context?Wo.includes(e?.context)?k():D({message:"Command not available in this context"}):D({message:"Missing target context"})},G="<ENTER> to confirm",k=(e="",t=[])=>({message:e,validity:re.Valid,completionWordList:t}),D=({message:e,completionWordList:t=[]})=>({validity:re.Invalid,message:e,completionWordList:t}),Be=e=>e.length===0,me=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:s=1})=>{let u=[...t.filter(Boolean).filter(f=>f.startsWith(o.trim()))].sort((f,N)=>lt(f)-lt(N)).slice(0,r).map(Ht),v=u.length>s?u.join(" "):"";return v?`${e}${v}${n}`:""},Vt=({modifier:e})=>{let t="confirm";return e===t?k(G):D({message:Be(e)?`if you are certain, enter ${Ht(t)}`:"",completionWordList:[t]})},$o=({list:e,hint:t})=>({modifier:n})=>e.includes(n)?k(G):D({message:Be(n)?t:""}),Ho=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?D({message:n}):k():D({message:Be(r)?t:""}),_e=({hint:e})=>({modifier:t,inputString:n})=>Be(t)&&Be(n)?D({message:e,completionWordList:[]}):k(G),Ko={[m.PEEK]:e=>{let t=e.modifier;if(t==="now")return k(G);let n={message:"historical state from: '1h', '2d', '23h', '1mo', '2y', 'previous', 'next' or full date as YYYY-MM-DD"};if(t==="prev"||t==="next")return k(G);let r=ct(t);if(!t||!r)return D(n);let o=ye(y().breadCrumb,"BOARD");if(a(o))return D({message:"Command is not applicable in this context"});let s=Pn(o.data.id);return a(s)?D({message:"Unable to peek: board id is not a valid ULID"}):Tn({date:r,horizonDate:s.data})?k(G):D({message:Ce.red(`nothing to peek before ${s.data.toISOString().slice(0,16).replace("T"," ")}`)})},[m.INIT]:()=>k(G),[m.FILTER]:e=>{if(e.modifier==="clear")return k();let t=d=>_(m.FILTER).includes(d);if(!e.modifier||!t(e.modifier??""))return D({message:me({wordList:_(m.FILTER),inputString:e.inputString}),completionWordList:_(m.FILTER)});let r=Object.values(y().tags).map(d=>d.name),o=Object.values(y().contributors).map(d=>d.name),s=e.modifier==="tag"?r:e.modifier==="assignee"?o:[];return e.inputString?s.length&&!s.includes(e.inputString.trim()??"")?D({message:me({prefix:`existing ${e.modifier}s... `,wordList:s,noOfHints:10,inputString:e.inputString}),completionWordList:s}):k():D({message:me({prefix:"one of... ",wordList:s,noOfHints:10,inputString:e.inputString}),completionWordList:s})},[m.NONE]:e=>{let t=_(m.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():D({message:me({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0})})},[m.NEW]:e=>Ho({list:_(m.NEW),hint:me({wordList:_(m.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[m.SET_DESCRIPTION]:()=>k(G),[m.HELP]:()=>k(G),[m.RENAME]:()=>{let e=Kt();return e.validity==="invalid"?e:k(G)},[m.DELETE]:e=>{let t=Kt();return t.validity==="invalid"?t:Vt(e)},[m.CLOSE_ISSUE]:e=>Vt(e),[m.RE_OPEN_ISSUE]:e=>Vt(e),[m.MOVE]:e=>{let t=Kt();return t.validity==="invalid"?t:_e({hint:me({prefix:"hey hacker! These commands are blocked for you... ",wordList:_(m.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[m.TAG]:e=>{let t=E.getExistingTags().map(n=>` ${Ce.bgHex(Ue(n))(" "+n+" ")} `).slice(0,10);return _e({hint:"tag name like... "+t.join("")})(e)},[m.UNTAG]:e=>{let t=at();if(a(t))return D({message:"Invalid untag target",completionWordList:[]});let n=t.data.map(({name:r})=>r).map(r=>` ${Ce.bgHex(Ue(r))(" "+r+" ")} `).slice(0,10);return n.length?_e({hint:" ... "+n.join("")})(e):D({message:"Issue has not tags",completionWordList:[]})},[m.ASSIGN]:e=>{let t=E.getExistingAssignees().map(n=>` ${Ce.bgHex(Ue(n))(" "+n+" ")} `).slice(0,10);return _e({hint:"assign to... "+t.join("")})(e)},[m.UNASSIGN]:e=>{let t=dt();if(a(t))return D({message:"Invalid unassign target",completionWordList:[]});let n=t.data.map(({name:r})=>r).map(r=>` ${Ce.bgHex(Ue(r))(" "+r+" ")} `).slice(0,10);return n.length?_e({hint:"remove assignee... "+n.join("")})(e):D({message:"Issue has no assignees",completionWordList:[]})},[m.SET_EDITOR]:e=>{logger.debug(`Validating command: ${e.command} ${e.modifier} ${e.inputString}`);let t=_(m.SET_EDITOR);return e.modifier?k(G):D({message:me({wordList:t,inputString:e.inputString})})},[m.SET_USERNAME]:e=>e.inputString?k():D({message:`Enter a username. Saved in ${Ce.bgBlack("~/.epiq/")}`}),[m.SET_VIEW]:e=>$o({list:_(m.SET_VIEW),hint:me({wordList:_(m.SET_VIEW),noOfHints:3,inputString:e.inputString})})(e),[m.SYNC]:()=>k(G)},kn=Object.fromEntries(Object.entries(Ko).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var On=["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 b={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",UntagTicket:"ticket-untag",AssignUserToTicket:"ticket-assign-user",UnassignUserFromTicket:"ticket-unassign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Sync:"sync"};var Un=e=>Object.values(m).includes(e),_n=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:s}=e,{message:d,validity:l,completionWordList:u}=kn[n].validate(n,r,s),v=o==="command"?Object.values(m):n&&e.target==="modifier"?_(n):On;return{validity:l,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:d??"",autoCompletion:t?In(e,[...u,...v]):{hint:"",hints:[],remainder:"",overlap:0}}};var Bn=e=>{let t=e.trimStart(),n=jo(t),r=(n[0]??"").trimStart().trimEnd(),o=(n[1]??"").trimStart().trimEnd(),s=zo(e),d=Un(r)?r:null,l=d!==null,u=r!=="",v=e.endsWith(" "),f=d?_(d)??[]:[],N=d&&f.includes(o)?o:"",C="word";n.length<=1?C="command":n.length===2&&(C="modifier");let S=Vo(t,d,N);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:s,hasCommand:u,command:d,isCommandKeyword:l,isLastWordCompleted:v,modifier:N,target:C,inputToMatch:s,inputString:S}},Vo=(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},jo=e=>e?e.split(/\s+/):[],zo=e=>e.trimEnd().split(/\s+/).at(-1)??"";var Wn=" ",he={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:re.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},qo=new Set,$n=()=>{for(let e of qo)e()};var ie=e=>{let n=e(he),r=Bn(n.value),o=n.cursorPosition===n.value.length;he={...n,commandMeta:_n(r,o)},$n()},We=({message:e,result:t})=>{let n=structuredClone(he);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,he=n,$n(),c(e,null)},jt=e=>{ie(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},zt=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}})},Hn=()=>{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}})},Kn=()=>{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}})},O=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),s=e(r,t.commandMeta.autoCompletion),d=s+o,l=Math.max(0,Math.min(s.length,d.length));return{...t,value:d,cursorPosition:l,commandIsPending:!1}})},Vn=()=>{ie(e=>({...e,commandIsPending:!0}))},jn=({addToHistory:e=!0})=>{ie(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),Go()},zn=()=>{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}})},qn=()=>{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}})},Go=()=>O(()=>""),J=()=>he,ut=()=>{let[e,...t]=he.value.split(Wn);return t.join(Wn).trim()};var h={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"};var Gn=e=>{let{context:t}=y()?.currentNode;if(!t)return b.None;switch(e){case m.INIT:return b.Init;case m.DELETE:return b.Delete;case m.SET_DESCRIPTION:return b.Edit;case m.HELP:return b.ViewHelp;case m.RE_OPEN_ISSUE:return b.ReopenIssue;case m.CLOSE_ISSUE:return b.CloseIssue;case m.TAG:return b.TagTicket;case m.UNTAG:return b.UntagTicket;case m.ASSIGN:return b.AssignUserToTicket;case m.UNASSIGN:return b.UnassignUserFromTicket;case m.RENAME:return b.Rename;case m.NEW:return b.NewItem;case m.FILTER:return b.Filter;case m.MOVE:return b.Move;case m.PEEK:return b.Peek;case m.SET_USERNAME:return b.SetUserName;case m.SET_EDITOR:return b.SetEditor;case m.SET_VIEW:return b.SetView;case m.SYNC:return b.Sync;default:return b.None}};import{ulid as F}from"ulid";import{spawnSync as ni}from"node:child_process";import ri from"node:os";import Qn from"node:path";import{ulid as oi}from"ulid";import{accessSync as Jo,copyFileSync as Yo,existsSync as mt,mkdirSync as Jn,readdirSync as Yn,readFileSync as Xo,renameSync as Qo,rmSync as Zo,statSync as Xn,unlinkSync as ei,writeFileSync as ti}from"node:fs";import Re from"node:path";var Y={writeToFile:(e,t)=>{try{let n=Re.dirname(e);mt(n)||Jn(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);ti(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return Xo(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=Y.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 mt(e)&&Xn(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Jo(e),!0}catch{return!1}},mkDir:e=>Jn(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=Re.parse(t);for(;;){let r=Re.join(t,e);try{if(mt(r)&&Xn(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=Re.dirname(t)}return null},readFirstJSON(e){try{if(!Y.dirExists(e))return null;let t=Yn(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=Re.join(e,t);return Y.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return Y.dirExists(e)?Yn(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{ei(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Zo(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(Re.dirname(t)),!n?.overwrite&&mt(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{Qo(e,t)}catch(r){if(r?.code==="EXDEV"){Yo(e,t),this.rmFile(e);return}throw r}}};function ii(){let{preferredEditor:e}=oe(),t=[e,process.env.VISUAL,process.env.EDITOR,"vim","nano"].filter(n=>!!n?.trim());return[...new Set(t)]}function si(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function Zn(e){let t=Qn.join(ri.tmpdir(),"epiq");Y.mkDir(t);let n=Qn.join(t,oi());Y.writeToFile(n,e??"");let r=ii();for(let o of r){let s=si(o,n),d=ni(s,{stdio:"inherit",shell:!0});if(!d.error&&d.status===0){let l=Y.readFile(n);if(l==null)return i("Unable to read edited file");let u=l.replace(/\r?\n$/,"");return c("Successfully edited",u)}}return i("Unable to open editor")}import yt from"node:fs";import Et from"node:path";import{z as Gt}from"zod";var pt=process.env.IS_LOCAL==="true",se=()=>".epiq";import gt from"node:fs";import ai from"node:os";import pe from"node:path";import{decodeTime as di,monotonicFactory as ci}from"ulid";import{z as $e}from"zod";var er=e=>({action:e.action,payload:e.payload});var li=pe.resolve(ai.homedir(),".epiq"),nr=1,tr=ci(),ui="events",mi=$e.tuple([$e.string().min(1),$e.string().min(1).nullable()]),pi=$e.looseObject({v:$e.literal(nr),id:mi}),qt=e=>{let t=pi.safeParse(e);return t.success?c("Parsed persisted event",t.data):i(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},ft=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",W=()=>{let{userName:e,userId:t}=oe();return e?t?e.trim()?c("Successfully resolved actor ID",{userId:ft(t),userName:ft(e)}):i("Unable to resolve actor ID from settings or OS user info"):i("User ID not configured"):i("User name not configured")},gi=e=>pe.resolve(e)===li,fi=e=>{let t=pe.join(e,se());return!gi(t)&&gt.existsSync(t)&&gt.statSync(t).isDirectory()},ae=e=>{let t=pe.resolve(e);for(;;){if(fi(t))return t;let n=pe.dirname(t);if(n===t)return pe.resolve(e);t=n}},rr=e=>pe.join(ae(e),se(),ui),He=({userId:e,userName:t})=>`${ft(e)}.${ft(t)}.jsonl`,vi=(e,{userId:t,userName:n})=>{let r=He({userId:t,userName:n});return/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r)?c("Successfully resolved event log path",pe.join(rr(e),r)):i(`Invalid event log file name: ${r}`)},yi=(e,t)=>{let n={[e.action]:e.payload,v:nr,id:t};return qt(n)};function vt({event:e,rootDir:t=process.cwd()}){try{let n=ae(t),r=rr(n),o=vi(n,{userId:e.userId,userName:e.userName});if(a(o))return o;gt.mkdirSync(r,{recursive:!0});let s=or(n);if(a(s))return i(s.message);let d=s.data?tr(Math.max(Date.now(),di(s.data)+1)):tr(),l=yi(er(e),[d,s.data]);return a(l)?i(l.message):(gt.appendFileSync(o.data,`${JSON.stringify(l.data)}
3
- `,"utf8"),c("Event persisted",{path:o.data,entry:l.data}))}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return i(`Failed to persist event: ${r}`)}}import{decodeTime as Ei}from"ulid";var Ni=se(),Ii="events",xi=Gt.object({userId:Gt.string().min(1).default("unknown"),userName:Gt.string().min(1).default("unknown")}),bi=(e=process.cwd())=>Et.join(ae(e),Ni,Ii),Ci=e=>{let[t,n]=Et.basename(e,".jsonl").split("."),r=xi.safeParse({userId:t,userName:n});return r.success?c("Parsed event file actor",r.data):i(`Invalid event file name ${Et.basename(e)}: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},hi=e=>{let t=Object.keys(e).filter(n=>n!=="id"&&n!=="v");return t.length!==1?i(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?i("Invalid persisted event: action key is missing or invalid"):c("Resolved persisted action",t[0])},Ri=(e,t)=>t in e,Si=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),Ai=e=>{let{userId:t,userName:n,...r}=e,o=hi(r);if(a(o))return i(o.message);let s=o.data,d=e.id?.[0];return d?Ri(r,s)?c("Decoded persisted event",Si({id:d,action:s,payload:r[s],userId:t,userName:n})):i(`Persisted event is missing payload for action: ${s}`):i("Persisted event is missing id")},Nt=e=>{if(!yt.existsSync(e))return c("Event file missing",[]);let t=Ci(e);if(a(t))return i(t.message);let n=yt.readFileSync(e,"utf8"),r=[];for(let o of n.split(`
4
- `)){let s=o.trim();if(!s)continue;let d;try{d=JSON.parse(s)}catch{return i(`Failed to parse event JSON from ${e}: ${s}`)}let l=qt(d);if(a(l))return i(`${l.message} in ${e}: ${s}`);r.push({...l.data,userId:t.data.userId,userName:t.data.userName})}return c("Parsed persisted events file",r)};function ir(e=process.cwd()){let t=bi(e);if(!yt.existsSync(t))return i("No events found");let n=yt.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>Et.join(t,o)),r=[];for(let o of n){let s=Nt(o);if(a(s))return i(s.message);r.push(...s.data)}return c("All events loaded",wi(r))}function Ke(e=process.cwd()){let t=ir(e);if(a(t))return i(t.message);let n=[];for(let r of t.data){let o=Ai(r);if(a(o))return i(`Failed to decode event ${r.id?.[0]??"<unknown>"}: ${o.message}`);n.push(o.data)}return c("Loaded merged events",n)}function or(e=process.cwd()){let t=ir(e);return a(t)?i(t.message):c("Loaded edge reference",t.data.at(-1)?.id?.[0]??null)}var wi=e=>{let t=new Map(e.map(l=>[l.id[0],l])),n=new Map;for(let l of e){let u=l.id[1],v=n.get(u)??[];v.push(l),n.set(u,v)}for(let l of n.values())l.sort((u,v)=>{let[f]=u.id,[N]=v.id;return f.localeCompare(N)});let r=[],o=new Set,s=l=>{let u=n.get(l)??[];for(let v of u){let[f]=v.id;o.has(f)||(o.add(f),r.push(v),s(f))}};s(null);let d=[...e].filter(l=>{let[u]=l.id;return!o.has(u)}).sort((l,u)=>{let[v,f]=l.id,[N,C]=u.id,S=f===null||t.has(f),M=C===null||t.has(C);if(S&&!M)return-1;if(!S&&M)return 1;let j=(f??"").localeCompare(C??"");return j!==0?j:v.localeCompare(N)});return[...r,...d]},sr=(e,t)=>{let n=e.findIndex(r=>{try{return Ei(r.id)>t}catch{return!0}});return n===-1?{appliedEvents:e,unappliedEvents:[]}:{appliedEvents:e.slice(0,n),unappliedEvents:e.slice(n)}};var ar=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 Ti=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[Z,It]=Ti;var w=(e,t)=>i(`${t.split(".").join(" ")+" failed, "+e.toLowerCase()}`),Mi={"init.workspace":({action:e,payload:t})=>{let{id:n,name:r}=t,o=te.workspace(n,r);Jt(o);let s=E.createNodeAtPosition(o);return a(s)?w(s.message??"Failed to initialize workspace",e):c("Workspace initialized",{action:e,result:s.data})},"add.workspace":({action:e,payload:t})=>{let{id:n,name:r}=t,o=te.workspace(n,r),s=E.createNodeAtPosition(o);return a(s)?w(s.message??"Failed to add workspace",e):c("Added workspace",{action:e,result:s.data})},"add.board":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,s=E.createNodeAtPosition(te.board(n,r,o));return a(s)?w(s.message??"Unable to create board",e):c("Added board",{action:e,result:s.data})},"add.swimlane":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,s=E.createNodeAtPosition(te.swimlane(n,r,o));return a(s)?w(s.message??"Unable to create swimlane",e):c("Added swimlane",{action:e,result:s.data})},"add.issue":({action:e,payload:t})=>{let{id:n,name:r,parent:o}=t,s=E.createNodeAtPosition(te.ticket(n,r,o));return a(s)?w(s.message??"Unable to create issue",e):c("Added issue",{action:e,result:s.data})},"add.field":({action:e,payload:t})=>{let{id:n,name:r,parent:o,val:s}=t,d=E.createNodeAtPosition(te.field(n,r,o,{value:s},r.includes("Description")?"vertical":"horizontal"));return a(d)?w(d.message??`Unable to create field: ${r}`,e):c("Added field",{action:e,result:d.data})},"edit.title":({action:e,payload:t})=>{let{id:n,name:r}=t;if(!E.getNode(n))return w("Unable to locate node",e);let s=E.renameNode(n,r);return a(s)?w(s.message??"Unable to edit title",e):c("Edited title",{action:e,result:s.data})},"delete.node":({action:e,payload:t})=>{let{id:n}=t,r=E.tombstoneNode(n);return a(r)?w(r.message??"Unable to delete node",e):c("Deleted node",{action:e,result:r.data})},"create.tag":({action:e,payload:t})=>{let{id:n,name:r}=t,o=E.createTag({id:n,name:r});return a(o)?w(o.message??"Unable to create tag",e):c("Tag added",{action:e,result:o.data})},"create.contributor":({action:e,payload:t})=>{let{id:n,name:r}=t,o=E.createContributor({id:n,name:r});return a(o)?w(o.message??"Unable to create contributor",e):c("Contributor created",{action:e,result:o.data})},"tag.issue":({action:e,payload:t})=>{let{id:n,target:r,tagId:o}=t,s=E.tag(r,o,n);return a(s)?w(s.message??"Unable to tag issue",e):c("Issue tagged",{action:e,result:s.data})},"untag.issue":({action:e,payload:t})=>{let{target:n,tagId:r}=t,o=E.untag(n,r);return a(o)?w(o.message??"Unable to untag ",e):c("Issue untagged",{action:e,result:o.data})},"assign.issue":({action:e,payload:t})=>{let{id:n,contributor:r,target:o}=t,s=E.assign(o,r,n);return a(s)?w(s.message??"Unable to assign issue",e):c("Assigned successfully",{action:e,result:s.data})},"unassign.issue":({action:e,payload:t})=>{let{target:n,contributor:r}=t,o=E.unassign(n,r);return a(o)?w(o.message??"Unable to unassign issue",e):c("Issue unassigned",{action:e,result:o.data})},"move.node":({action:e,payload:t})=>{let{id:n,parent:r,pos:o}=t,s=E.moveNode({id:n,parentId:r,position:o});return a(s)?w(s.message??"Failed to move node",e):c("Moved node",{action:e,result:s.data})},"edit.description":({action:e,payload:t})=>{let{id:n,md:r}=t,o=E.editValue(n,r);return a(o)?w(o.message??"Unable to edit description",e):c("Set node value",{action:e,result:o.data})},"close.issue":({action:e,payload:t})=>{let{id:n}=t,r=E.getNode(n);if(!r)return w("Unable to locate issue",e);if(!z(r))return w("Can only close issues",e);let o=E.getNode(Z);if(!o)return w("Unable to locate target swimlane",e);if(o.id===r.parentNodeId)return w("Cannot close closed issue",e);let d=E.moveNode({id:n,parentId:o.id});return a(d)?w(d.message??"Unable to close issue",e):c("Issue closed",{action:e,result:d.data})},"reopen.issue":({action:e,payload:t})=>{let{id:n}=t,r=E.getNode(n);if(!r)return w("Unable to locate issue",e);if(!z(r))return w("Can only reopen issues",e);let o=E.getNode(Z);if(!o)return w("Unable to locate closed swimlane",e);if(!(r.parentNodeId===o.id))return w("Issue is not closed",e);let d=ar(r);if(!d)return w("Unable to resolve previous parent from issue history",e);if(d===o.id)return w("Previous parent resolves to closed swimlane",e);if(!E.getNode(d))return w("Previous parent no longer exists",e);let u=E.moveNode({id:n,parentId:d});return a(u)?w(u.message??"Unable to reopen issue",e):c("Issue reopened",{action:e,result:u.data})},"lock.node":({action:e,payload:t})=>{let{id:n}=t,r=E.lockNode(n);return a(r)?w(r.message??"Unable to lock node",e):c("Node locked",{action:e,result:r.data})}},Li=(e,t)=>{let n=E.getNode(e);n&&E.updateNode({...n,log:[...n.log??[],t]})},Pi=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=y().nodes[e.payload.id]?.parentNodeId;return n&&t.push(n),t;case"tag.issue":case"untag.issue":case"assign.issue":case"unassign.issue":return[e.payload.id,e.payload.target];case"create.tag":case"create.contributor":default:return[]}};function Se(e,t=!1){let n=Mi[e.action](e);if(a(n))return n;t||([...new Set(Pi(e))].forEach(d=>Li(d,e)),q(d=>({...d,eventLog:[...d.eventLog,e]})));let r=e.userId,o=e.userName;return!r?.length||!o?.length?w("Invalid user ID format",e.action):(E.createContributor({name:o,id:r}),n)}var Ee=e=>e.map(t=>Se(t));function $(e){let t=Se(e);if(t.result!==ee.Success)return t;let n=vt({event:e});return a(n)?n:t}function Ae(e){return e.map(t=>$(t))}import qe from"node:fs";import{spawn as ki}from"node:child_process";import Xt from"node:fs";import we from"node:path";var Ve=(e,t)=>{let n=new Map,r=t??((...s)=>JSON.stringify(s)),o=((...s)=>{let d=r(...s);if(!n.has(d)){let l=e(...s).then(u=>(a(u)&&n.delete(d),u));n.set(d,l)}return n.get(d)});return o.clear=()=>n.clear(),o};import je from"fs";import cr from"path";import Di from"util";var dr=1e3,lr=(e=process.cwd())=>cr.join(ae(e),se(),"log","epiq.log");function Fi(e=process.cwd()){if(!pt)return;let t=lr(e);if(!je.existsSync(t))return;let r=je.readFileSync(t,"utf8").split(`
5
- `);if(r[r.length-1]===""&&r.pop(),r.length<=dr)return;let o=r.slice(-dr).join(`
2
+ import{McpServer as As}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as ws}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as R}from"zod";var oe={None:"none",Success:"success",Fail:"fail"},i=e=>({status:oe.Fail,message:e,value:null}),d=(e,t)=>({status:oe.Success,message:e,value:t}),a=e=>e.status==="fail";import{ulid as yo}from"ulid";import{monotonicFactory as wo,ulid as Xe}from"ulid";var Ze=wo(),Qe=({name:e,parent:t,user:{userId:n,userName:r}})=>{let o=Ze(),s=Ze(),l=Ze(),c=Ze();return[{id:Xe(),userId:n,userName:r,action:"add.issue",payload:{id:o,parent:t,name:e}},{id:Xe(),userId:n,userName:r,action:"add.field",payload:{id:s,parent:o,name:"Description",val:""}},{id:Xe(),userId:n,userName:r,action:"add.field",payload:{id:l,parent:o,name:"Assignees"}},{id:Xe(),userId:n,userName:r,action:"add.field",payload:{id:c,parent:o,name:"Tags"}}]};import Pe from"chalk";import{monotonicFactory as xs,ulid as de}from"ulid";import{useSyncExternalStore as Qm}from"react";var M={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function V(e){return e.context==="TICKET"}var p={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line"};function et(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var tt=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var fn=e=>{let t=new Map;for(let n of e)for(let r=1;r<=n.length;r++){let o=n.slice(0,r),s=t.get(o);s?s.push(n):t.set(o,[n])}return t},vn=(e,t)=>t?e.get(t)??[]:[];var Nn=new WeakMap,To=e=>{let t=Nn.get(e);return t||(t=fn(e),Nn.set(e,t)),t};var yn=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return vn(To(e),r).filter(s=>et(r,s)>=n)};var En=({inputToMatch:e,lastWord:t},n)=>{if(t.endsWith(" "))return{hint:"",hints:[],overlap:0,remainder:""};let r=yn({wordList:n,inputToMatch:e,overlapThreshold:1});return Mo(t,r)},Mo=(e,t)=>{let n=t[0]??"",r=et(e.toLowerCase(),n.toLowerCase()),[o,s]=n.split(":"),l=r<(o??"").length,c=!!s,f=(c&&l?o:n)+(c&&l?":":" "),E=f.slice(r);return{hint:f,hints:t,overlap:r,remainder:E}};var In=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];var xe=24n,Po=xe*4n,nt=(1n<<Po)-1n,Lo=/^[0-9a-f]+$/;function xn(e){if(!e||!Lo.test(e))throw new Error(`Invalid hex rank: ${e}`);return BigInt("0x"+e)}function rt(e,t=xe){if(e<0n)throw new Error("Negative rank not allowed");return e.toString(16).padStart(Number(t),"0")}function Le(e,t){if(!e&&!t)return rt(nt/2n,xe);let n=e?xn(e):0n,r=t?xn(t):nt;if(r<=n)return rt(nt/2n,xe);let o=(n+r)/2n;return o===n||o===r?"":rt(o,xe)}function ee(){return rt(nt/2n,xe)}var ne={workspace:(e,t)=>({id:e,title:t,rank:ee(),isDeleted:!1,props:{},context:M.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,r=!1)=>({id:e,title:t,rank:ee(),isDeleted:!1,props:{},context:M.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:r,log:[]}),swimlane:(e,t,n)=>({id:e,title:t,rank:ee(),isDeleted:!1,props:{},context:M.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:(e,t,n,r={},o="horizontal")=>({id:e,title:t,rank:ee(),isDeleted:!1,props:r,context:M.FIELD,childRenderAxis:o,parentNodeId:n,readonly:!1,log:[]}),ticket:(e,t,n)=>({id:e,title:t,rank:ee(),isDeleted:!1,props:{},context:M.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:ee(),isDeleted:!1,props:r,context:M.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:o,log:[]})};var K=e=>Object.values(N().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),hn=(e,t)=>e.findIndex(n=>n.id===t),Pt=(e,t={at:"end"})=>{if(e.length===0)return d("Resolved rank",ee());switch(t.at){case"start":{let n=e[0];return n?d("Resolved rank",Le(void 0,n.rank)):i("Unable to resolve first sibling")}case"end":{let n=e[e.length-1];return n?d("Resolved rank",Le(n.rank,void 0)):i("Unable to resolve last sibling")}case"before":{let n=hn(e,t.sibling);if(n<0)return i("Sibling not found");let r=n>0?e[n-1]:void 0,o=e[n];return o?d("Resolved rank",Le(r?.rank,o.rank)):i("Sibling not found")}case"after":{let n=hn(e,t.sibling);if(n<0)return i("Sibling not found");let r=e[n],o=n<e.length-1?e[n+1]:void 0;return r?d("Resolved rank",Le(r.rank,o?.rank)):i("Sibling not found")}}};var he=(e,t)=>{let{nodes:n}=N(),r=n[e];if(!r)return i("Node not found");if(r.context===t)return d("Resolved ancestor node",r);let o=r.parentNodeId?n[r.parentNodeId]:void 0;for(;o;){if(o.context===t)return d("Resolved ancestor node",o);o=o.parentNodeId?n[o.parentNodeId]:void 0}return i(`No ancestor found for context: ${t}`)},Do=(e,t)=>{let{nodes:n}=N(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},Lt=(e,t)=>e?e.readonly?i({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node"}[t]):null:i("Node not found"),y={deleteNode(e){j(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},editValue(e,t){let{nodes:n}=N(),r=n[e];if(!r)return i("Edit target node not found");let o=Lt(r,"edit");if(o)return o;let s={...r,props:{...r.props,value:t}};return y.updateNode(s),d("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return i("Rename target node not found");let r=Lt(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),d("Renamed node",o)},getExistingTags(){let{tags:e}=N();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=N();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return K(e).find(n=>n.title===t)},moveNode({id:e,parentId:t,position:n={at:"end"}}){let{rootNodeId:r}=N(),o=this.getNode(e),s=this.getNode(t);if(!o)return i("Node not found");if(!s)return i("Target parent not found");if(r===e)return i("Cannot move root node");if(e===t)return i("Cannot move node into itself");let l=Lt(o,"move");if(l)return l;if(Do(t,e))return i("Cannot move node into its own descendant");let c=K(t).filter(f=>f.id!==e),u=Pt(c,n);if(a(u))return u;let g={...o,parentNodeId:t,rank:u.value};return this.updateNode(g),d("Moved node successfully",g)},tombstoneNode(e){let{nodes:t,currentNodeId:n,rootNodeId:r}=N(),o=this.getNode(e);if(!o)return i("Node not found");if(r===e)return i("Cannot delete root node");let s=new Set,l=u=>{let g=t[u];if(!(!g||s.has(u))){s.add(u);for(let f of K(g.id))l(f.id)}};l(e);let c={...structuredClone(t)};for(let u of s){if(!c[u])return i("Unable to locate node to delete");c[u]={...c[u],isDeleted:!0}}return n?(I({nodes:c}),d("Successfully tomb stoned",o)):i("Unable to delete undefined")},createContributor(e){let t=j(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return a(t)?i("Unable to create contributor"):d("Created contributor",e)},assign(e,t,n){let r=y.getContributor(t),o=y.getNode(e);if(!o||!r)return i("Unable assign contributor to issue");let s=this.getFieldByTitle(o.id,"Assignees");if(!s)return i("Unable to locate assignees field");if(K(s.id).some(u=>u.props?.value===t))return i("Contributor already assigned");let c=this.createNodeAtPosition(ne.field(n,r.name,s.id,{value:t}));return a(c)?c:d("Assigned contributor",c.value)},createTag(e){let t=j(n=>({...n,tags:{...n.tags,[e.id]:e}}));return a(t)?i("Could not create tag"):d("Tag created",e)},tag(e,t,n){let r=y.getTag(t),o=y.getNode(e);if(!r)return i("Unable to add tag, missing tag");if(!o)return i("Unable to add tag, missing target");let s=this.getFieldByTitle(o.id,"Tags");if(!s)return i("Unable to locate tags field");if(K(s.id).some(u=>u.props?.value===t))return i("Tag already assigned");let c=this.createNodeAtPosition(ne.field(n,r.name,s.id,{value:t}));return a(c)?c:d("Tag added",c.value)},untag(e,t){let n=y.getTag(t),r=y.getNode(e);if(!n)return i("Unable to remove tag, missing tag");if(!r)return i("Unable to remove tag, missing target");let o=this.getFieldByTitle(r.id,"Tags");if(!o)return i("Unable to locate tags field");let s=K(o.id).find(c=>c.props?.value===t);if(!s)return d("Issue is not tagged with that tag",null);let l={...s,isDeleted:!0};return this.updateNode(l),d("Tag removed",l)},unassign(e,t){let n=y.getContributor(t),r=y.getNode(e);if(!n)return i("Unable to unassign, missing contributor");if(!r)return i("Unable to unassign, missing target");let o=this.getFieldByTitle(r.id,"Assignees");if(!o)return i("Unable to locate assignees field");let s=K(o.id).find(c=>c.props?.value===t);if(!s)return d("Issue is not assigned to that contributor",null);let l={...s,isDeleted:!0};return this.updateNode(l),d("Assignee removed",l)},createNodeAtPosition(e,t={at:"end"}){if(!e.parentNodeId){let s={...e,rank:ee()};return this.createNode(s),d("Created node",s)}let n=K(e.parentNodeId),r=Pt(n,t);if(a(r))return r;let o={...e,rank:r.value};return this.createNode(o),d("Created node",o)},createNode(e){let t=j(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return a(t)?i("Unable to create node"):d("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return i("Failed to locate node");let n={...t,readonly:!0},r=j(o=>({...o,nodes:{...o.nodes,[e]:n}}));return a(r)?i(r.message):d("Locked node",n)},updateNode(e){let t=j(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return a(t)?t:d("Updated node",e)},getContributor(e){return N().contributors[e]},getTag(e){return N().tags[e]},getNode(e){return N().nodes[e]},getSiblings:e=>Object.values(N().nodes).filter(t=>!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank))};var ot={autoSync:!1,preferredEditor:null,userName:null,userId:null},ie=()=>ot,it=e=>(ot={...ot,...e},ot);var Cn=()=>{let e=ie(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim();return{isSetup:n&&t,hasPreferredEditor:n,hasUserName:t,userName:e.userName,preferredEditor:e.preferredEditor}},bn=()=>!De();var B={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"},Sn={accent:B.cyan,accent2:B.magenta,primary:B.white,secondary:B.grayDark,secondary2:B.grayLight,gray:B.gray,green:B.green,yellow:B.yellow,red:B.red};var v={red:B.red,yellow:B.yellow,green:B.green,blue:B.blue,magenta:B.magenta,cyan:B.cyan},st={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 Rn=(e,t)=>{let r=h(e.id).find(o=>o.title===t);return r?h(r.id).map(o=>typeof o.props?.value=="string"?o.props.value:"").filter(o=>!!o):[]},Fo=e=>Rn(e,"Tags").map(t=>y.getTag(t)).filter(t=>!!t),at=()=>{let{breadCrumb:e,selectedNode:t}=N(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!V(n)?i("Invalid untag target"):d("Retrieved tags from ticket in breadcrumb",Fo(n)??[])},dt=()=>{let{breadCrumb:e,selectedNode:t}=N(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!V(n)?i("Invalid untag target"):d("Retrieved tags from ticket in breadcrumb",ko(n)??[])},ko=e=>Rn(e,"Assignees").map(t=>y.getContributor(t)).filter(t=>!!t);var An=(e,t)=>{let r=h(e.id).find(o=>o.title===t);return r&&typeof r.props?.value=="string"?tt(r.props.value):""};var m={INIT:"init",HELP:"help",NEW:"new",TAG:"tag",UNTAG:"untag",MOVE:"move",PEEK:"peek",FILTER:"filter",ASSIGN:"assign",UNASSIGN:"unassign",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:""};var Oo=/^(\d+)(h|d|w|mo|y)$/,Uo=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,_o=({year:e,month:t,day:n,hour:r=0,minute:o=0})=>{let s=new Date(e,t-1,n,r,o);return s.getFullYear()===e&&s.getMonth()===t-1&&s.getDate()===n&&s.getHours()===r&&s.getMinutes()===o},Bo=(e,t=new Date)=>{let n=e.match(Oo);if(!n)return null;let[,r,o]=n,s=Number(r);if(!Number.isInteger(s)||s<=0)return null;let l=new Date(t);switch(o){case"h":return l.setHours(l.getHours()-s),l;case"d":return l.setDate(l.getDate()-s),l;case"w":return l.setDate(l.getDate()-s*7),l;case"mo":return l.setMonth(l.getMonth()-s),l;case"y":return l.setFullYear(l.getFullYear()-s),l;default:return null}},Wo=e=>{let t=e.match(Uo);if(!t)return null;let[,n,r,o,s,l]=t,c=Number(n),u=Number(r),g=Number(o),f=s?Number(s):0,E=l?Number(l):0;return _o({year:c,month:u,day:g,hour:f,minute:E})?new Date(c,u-1,g,f,E):null},lt=e=>{let t=e.trim().toLowerCase();return Bo(t)??Wo(t)},wn=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,$o=[{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}],Tn=(e=$o)=>{let t=[];for(let{unit:n,from:r,to:o}of e)for(let s=r;s<=o;s++)t.push(`${s}${n}`);return t};var Ho=["BOARD","TICKET","SWIMLANE"],U=e=>{let{currentNode:t,readOnly:n,selectedNode:r}=N(),o=Cn().isSetup,s=t.context,l=r?.context,c=[m.SYNC,m.HELP,m.SET_VIEW,m.SET_EDITOR,m.SET_USERNAME],u=[m.NEW,m.RENAME,m.DELETE],g=[m.TAG,m.UNTAG,m.ASSIGN,m.UNASSIGN,m.CLOSE_ISSUE,m.RE_OPEN_ISSUE,m.SET_DESCRIPTION],f=[m.FILTER,m.PEEK],E={WORKSPACE:[...c,...u],BOARD:[...f,...c,...u],SWIMLANE:[...f,...c,...u],TICKET:[...c,...u,...g],FIELD:[...c,...g],FIELD_LIST:[...c,...g],TEXT:[...c]},C=l&&Ho.includes(l),b=[...E[s||"WORKSPACE"]].filter(H=>[m.RENAME,m.DELETE,m.MOVE].includes(H)?C:!0),w={[m.PEEK]:[...Tn(),"now","prev","next"],[m.SYNC]:[],[m.INIT]:[],[m.SET_USERNAME]:[],[m.SET_DESCRIPTION]:["confirm"],[m.DELETE]:["confirm"],[m.RE_OPEN_ISSUE]:["confirm"],[m.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[m.CLOSE_ISSUE]:["confirm"],[m.FILTER]:["tag","assignee","description","title","clear"],[m.SET_VIEW]:["dense","wide"],[m.SET_EDITOR]:[...In],[m.TAG]:[...new Set([...Object.keys(st),...y.getExistingTags()])],[m.UNTAG]:[...at()?.value?.map(({name:H})=>H)??[]],[m.UNASSIGN]:[...dt()?.value?.map(({name:H})=>H)??[]],[m.ASSIGN]:y.getExistingAssignees(),[m.HELP]:[],[m.RENAME]:[],[m.NEW]:s==="TICKET"||s==="FIELD"||s==="FIELD_LIST"?["issue","swimlane","board"]:s==="SWIMLANE"?["issue","swimlane","board"]:s==="BOARD"?["issue","swimlane","board"]:["board"],[m.NONE]:b};return o?bn()?n&&(w={[m.NONE]:[m.HELP,m.PEEK],[m.HELP]:w[m.HELP],[m.PEEK]:w[m.PEEK]}):w={[m.NONE]:[m.HELP,m.INIT],[m.HELP]:w[m.HELP],[m.INIT]:w[m.INIT]}:w={[m.NONE]:[m.HELP,m.SET_EDITOR,m.SET_USERNAME],[m.HELP]:w[m.HELP],[m.SET_EDITOR]:w[m.SET_EDITOR],[m.SET_USERNAME]:w[m.SET_USERNAME]},w[e]??[]};import Ce from"chalk";import{decodeTime as Mn}from"ulid";var Pn=e=>{try{return d("Decoded date",new Date(Mn(e)))}catch(t){return i("Decoding failed + "+t.message)}},Dt=e=>{if(!e?.id)return null;try{return Mn(e.id)}catch{return null}};var Ne=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?d("Found node",n):i("Unable to find node in breadcrumb")};import Ln from"chalk";var kt={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Ko=(e,t,n)=>Math.max(t,Math.min(n,e)),Ft=(e,t,n)=>e+(t-e)*n,Dn=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Vo=(e,t,n)=>{let r=t/100,o=n/100,s=(1-Math.abs(2*o-1))*r,l=e/60,c=s*(1-Math.abs(l%2-1)),u=0,g=0,f=0;l>=0&&l<1?(u=s,g=c):l>=1&&l<2?(u=c,g=s):l>=2&&l<3?(g=s,f=c):l>=3&&l<4?(g=c,f=s):l>=4&&l<5?(u=c,f=s):(u=s,f=c);let E=o-s/2;return[Math.round((u+E)*255),Math.round((g+E)*255),Math.round((f+E)*255)]},jo=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,zo=(e,t,n)=>[Math.round(Ft(e[0],t[0],n)),Math.round(Ft(e[1],t[1],n)),Math.round(Ft(e[2],t[2],n))],Go=e=>{let n=Dn(e)%360,r=Vo(n,kt.stringColor.saturation,kt.stringColor.lightness);return jo(r)},qo=e=>{let t=kt.gradient.stops,n=Ko(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let r=t.length-1,o=n*r,s=Math.min(Math.floor(o),r-1),l=o-s;return zo(t[s],t[s+1],l)},ct=e=>Dn(e.toLowerCase().trim())/4294967295,Jo=e=>{let t=ct(e);return qo(t)},Yo=e=>{let[t,n,r]=Jo(e);return{normal:o=>Ln.bgRgb(t,n,r).black(o),cursor:o=>Ln.bgRgb(t,n,r).white.bold(o)}};var Ot=e=>Yo(e).normal(` ${e} `),Fe=(e,t=st)=>{let r=(o=>o.toLowerCase().trim())(e);return r&&t[r]?t[r]:Go(r)};var se={None:"none",Invalid:"invalid",Valid:"valid"};var Xo=["BOARD","TICKET","SWIMLANE"],Ut=()=>{let e=N().selectedNode;return e?.context?Xo.includes(e?.context)?O():D({message:"Command not available in this context"}):D({message:"Missing target context"})},z="<ENTER> to confirm",O=(e="",t=[])=>({message:e,validity:se.Valid,completionWordList:t}),D=({message:e,completionWordList:t=[]})=>({validity:se.Invalid,message:e,completionWordList:t}),Oe=e=>e.length===0,me=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:s=1})=>{let u=[...t.filter(Boolean).filter(f=>f.startsWith(o.trim()))].sort((f,E)=>ct(f)-ct(E)).slice(0,r).map(Ot),g=u.length>s?u.join(" "):"";return g?`${e}${g}${n}`:""},_t=({modifier:e})=>{let t="confirm";return e===t?O(z):D({message:Oe(e)?`if you are certain, enter ${Ot(t)}`:"",completionWordList:[t]})},Zo=({list:e,hint:t})=>({modifier:n})=>e.includes(n)?O(z):D({message:Oe(n)?t:""}),Qo=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?D({message:n}):O():D({message:Oe(r)?t:""}),ke=({hint:e})=>({modifier:t,inputString:n})=>Oe(t)&&Oe(n)?D({message:e,completionWordList:[]}):O(z),ei={[m.PEEK]:e=>{let t=e.modifier;if(t==="now")return O(z);let n={message:"historical state from: '1h', '2d', '23h', '1mo', '2y', 'previous', 'next' or full date as YYYY-MM-DD"};if(t==="prev"||t==="next")return O(z);let r=lt(t);if(!t||!r)return D(n);let o=Ne(N().breadCrumb,"BOARD");if(a(o))return D({message:"Command is not applicable in this context"});let s=Pn(o.value.id);return a(s)?D({message:"Unable to peek: board id is not a valid ULID"}):wn({date:r,horizonDate:s.value})?O(z):D({message:Ce.red(`nothing to peek before ${s.value.toISOString().slice(0,16).replace("T"," ")}`)})},[m.INIT]:()=>O(z),[m.FILTER]:e=>{if(e.modifier==="clear")return O();let t=l=>U(m.FILTER).includes(l);if(!e.modifier||!t(e.modifier??""))return D({message:me({wordList:U(m.FILTER),inputString:e.inputString}),completionWordList:U(m.FILTER)});let r=Object.values(N().tags).map(l=>l.name),o=Object.values(N().contributors).map(l=>l.name),s=e.modifier==="tag"?r:e.modifier==="assignee"?o:[];return e.inputString?s.length&&!s.includes(e.inputString.trim()??"")?D({message:me({prefix:`existing ${e.modifier}s... `,wordList:s,noOfHints:10,inputString:e.inputString}),completionWordList:s}):O():D({message:me({prefix:"one of... ",wordList:s,noOfHints:10,inputString:e.inputString}),completionWordList:s})},[m.NONE]:e=>{let t=U(m.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?O():D({message:me({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0})})},[m.NEW]:e=>Qo({list:U(m.NEW),hint:me({wordList:U(m.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[m.SET_DESCRIPTION]:()=>O(z),[m.HELP]:()=>O(z),[m.RENAME]:()=>{let e=Ut();return e.validity==="invalid"?e:O(z)},[m.DELETE]:e=>{let t=Ut();return t.validity==="invalid"?t:_t(e)},[m.CLOSE_ISSUE]:e=>_t(e),[m.RE_OPEN_ISSUE]:e=>_t(e),[m.MOVE]:e=>{let t=Ut();return t.validity==="invalid"?t:ke({hint:me({prefix:"hey hacker! These commands are blocked for you... ",wordList:U(m.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[m.TAG]:e=>{let t=y.getExistingTags().map(n=>` ${Ce.bgHex(Fe(n))(" "+n+" ")} `).slice(0,10);return ke({hint:"tag name like... "+t.join("")})(e)},[m.UNTAG]:e=>{let t=at();if(a(t))return D({message:"Invalid untag target",completionWordList:[]});let n=t.value.map(({name:r})=>r).map(r=>` ${Ce.bgHex(Fe(r))(" "+r+" ")} `).slice(0,10);return n.length?ke({hint:" ... "+n.join("")})(e):D({message:"Issue has not tags",completionWordList:[]})},[m.ASSIGN]:e=>{let t=y.getExistingAssignees().map(n=>` ${Ce.bgHex(Fe(n))(" "+n+" ")} `).slice(0,10);return ke({hint:"assign to... "+t.join("")})(e)},[m.UNASSIGN]:e=>{let t=dt();if(a(t))return D({message:"Invalid unassign target",completionWordList:[]});let n=t.value.map(({name:r})=>r).map(r=>` ${Ce.bgHex(Fe(r))(" "+r+" ")} `).slice(0,10);return n.length?ke({hint:"remove assignee... "+n.join("")})(e):D({message:"Issue has no assignees",completionWordList:[]})},[m.SET_EDITOR]:e=>{logger.debug(`Validating command: ${e.command} ${e.modifier} ${e.inputString}`);let t=U(m.SET_EDITOR);return e.modifier?O(z):D({message:me({wordList:t,inputString:e.inputString})})},[m.SET_USERNAME]:e=>e.inputString?O():D({message:`Enter a username. Saved in ${Ce.bgBlack("~/.epiq-global/")}`}),[m.SET_VIEW]:e=>Zo({list:U(m.SET_VIEW),hint:me({wordList:U(m.SET_VIEW),noOfHints:3,inputString:e.inputString})})(e),[m.SYNC]:()=>O(z)},Fn=Object.fromEntries(Object.entries(ei).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var kn=["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 x={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",UntagTicket:"ticket-untag",AssignUserToTicket:"ticket-assign-user",UnassignUserFromTicket:"ticket-unassign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Sync:"sync"};var On=e=>Object.values(m).includes(e),Un=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:s}=e,{message:l,validity:c,completionWordList:u}=Fn[n].validate(n,r,s),g=o==="command"?Object.values(m):n&&e.target==="modifier"?U(n):kn;return{validity:c,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:l??"",autoCompletion:t?En(e,[...u,...g]):{hint:"",hints:[],remainder:"",overlap:0}}};var _n=e=>{let t=e.trimStart(),n=ni(t),r=(n[0]??"").trimStart().trimEnd(),o=(n[1]??"").trimStart().trimEnd(),s=ri(e),l=On(r)?r:null,c=l!==null,u=r!=="",g=e.endsWith(" "),f=l?U(l)??[]:[],E=l&&f.includes(o)?o:"",C="word";n.length<=1?C="command":n.length===2&&(C="modifier");let b=ti(t,l,E);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:s,hasCommand:u,command:l,isCommandKeyword:c,isLastWordCompleted:g,modifier:E,target:C,inputToMatch:s,inputString:b}},ti=(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},ni=e=>e?e.split(/\s+/):[],ri=e=>e.trimEnd().split(/\s+/).at(-1)??"";var Bn=" ",be={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:se.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},oi=new Set,Wn=()=>{for(let e of oi)e()};var ae=e=>{let n=e(be),r=_n(n.value),o=n.cursorPosition===n.value.length;be={...n,commandMeta:Un(r,o)},Wn()},Ue=({message:e,status:t})=>{let n=structuredClone(be);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,be=n,Wn(),d(e,null)},Bt=e=>{ae(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},Wt=e=>{ae(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}})},$n=()=>{ae(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}})},Hn=()=>{ae(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}})},k=e=>{ae(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),r=t.value.slice(0,n),o=t.value.slice(n),s=e(r,t.commandMeta.autoCompletion),l=s+o,c=Math.max(0,Math.min(s.length,l.length));return{...t,value:l,cursorPosition:c,commandIsPending:!1}})},Kn=()=>{ae(e=>({...e,commandIsPending:!0}))},Vn=({addToHistory:e=!0})=>{ae(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),ii()},jn=()=>{ae(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}})},zn=()=>{ae(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},ii=()=>k(()=>""),G=()=>be,ut=()=>{let[e,...t]=be.value.split(Bn);return t.join(Bn).trim()};var S={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"};var Gn=e=>{let{context:t}=N()?.currentNode;if(!t)return x.None;switch(e){case m.INIT:return x.Init;case m.DELETE:return x.Delete;case m.SET_DESCRIPTION:return x.Edit;case m.HELP:return x.ViewHelp;case m.RE_OPEN_ISSUE:return x.ReopenIssue;case m.CLOSE_ISSUE:return x.CloseIssue;case m.TAG:return x.TagTicket;case m.UNTAG:return x.UntagTicket;case m.ASSIGN:return x.AssignUserToTicket;case m.UNASSIGN:return x.UnassignUserFromTicket;case m.RENAME:return x.Rename;case m.NEW:return x.NewItem;case m.FILTER:return x.Filter;case m.MOVE:return x.Move;case m.PEEK:return x.Peek;case m.SET_USERNAME:return x.SetUserName;case m.SET_EDITOR:return x.SetEditor;case m.SET_VIEW:return x.SetView;case m.SYNC:return x.Sync;default:return x.None}};import{ulid as F}from"ulid";import{spawnSync as pi}from"node:child_process";import gi from"node:os";import Xn from"node:path";import{ulid as fi}from"ulid";import{accessSync as si,copyFileSync as ai,existsSync as mt,mkdirSync as qn,readdirSync as Jn,readFileSync as di,renameSync as li,rmSync as ci,statSync as Yn,unlinkSync as ui,writeFileSync as mi}from"node:fs";import Se from"node:path";var q={writeToFile:(e,t)=>{try{let n=Se.dirname(e);mt(n)||qn(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);mi(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return di(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=q.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 mt(e)&&Yn(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await si(e),!0}catch{return!1}},mkDir:e=>qn(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=Se.parse(t);for(;;){let r=Se.join(t,e);try{if(mt(r)&&Yn(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=Se.dirname(t)}return null},readFirstJSON(e){try{if(!q.dirExists(e))return null;let t=Jn(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=Se.join(e,t);return q.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return q.dirExists(e)?Jn(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{ui(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{ci(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(Se.dirname(t)),!n?.overwrite&&mt(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{li(e,t)}catch(r){if(r?.code==="EXDEV"){ai(e,t),this.rmFile(e);return}throw r}}};function vi(){let{preferredEditor:e}=ie(),t=[e,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function Ni(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function Zn(e){let t=Xn.join(gi.tmpdir(),"epiq");q.mkDir(t);let n=Xn.join(t,fi());q.writeToFile(n,e??"");let r=vi();for(let o of r){let s=Ni(o,n),l=pi(s,{stdio:"inherit",shell:!0});if(!l.error&&l.status===0){let c=q.readFile(n);if(c==null)return i("Unable to read edited file");let u=c.replace(/\r?\n$/,"");return d("Successfully edited",u)}}return i("Unable to open editor")}import vt from"node:fs";import jt from"node:path";import{decodeTime as wi}from"ulid";import{z as Vt}from"zod";import Ii from"node:fs";import xi from"node:path";import{decodeTime as hi,monotonicFactory as Ci}from"ulid";import{z as We}from"zod";import $t from"node:fs";import _e from"node:path";var Ht=process.env.IS_LOCAL==="true",pe=".epiq",Y=".epiq-global",pt="events",yi=e=>_e.join(e,pe),Be=e=>_e.join(yi(e),pt),Ei=e=>{let t=_e.join(e,pe);return $t.existsSync(t)&&$t.statSync(t).isDirectory()},re=e=>{let t=_e.resolve(e);for(;;){if(Ei(t))return d("Resolved closest .epiq root",t);let n=_e.dirname(t);if(n===t)return i("No .epiq directory found in any parent");t=n}},Qn=e=>{let t=Be(e);try{return $t.mkdirSync(t,{recursive:!0}),d("Resolved events dir",t)}catch(n){return i(n instanceof Error?`Failed to ensure events dir: ${n.message}`:"Failed to ensure events dir")}};var er=e=>({action:e.action,payload:e.payload});var nr=1,tr=Ci(),bi=We.tuple([We.string().min(1),We.string().min(1).nullable()]),Si=We.looseObject({v:We.literal(nr),id:bi}),Kt=e=>{let t=Si.safeParse(e);return t.success?d("Parsed persisted event",t.data):i(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},gt=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",W=()=>{let{userName:e,userId:t}=ie();return e?t?e.trim()?d("Successfully resolved actor ID",{userId:gt(t),userName:gt(e)}):i("Unable to resolve actor ID from settings or OS user info"):i("User ID not configured"):i("User name not configured")},$e=({userId:e,userName:t})=>`${gt(e)}.${gt(t)}.jsonl`,Ri=(e,{userId:t,userName:n})=>{let r=$e({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r))return i(`Invalid event log file name: ${r}`);let s=xi.join(Be(e),r);return d("Successfully resolved event log path",s)},Ai=(e,t)=>{let n={[e.action]:e.payload,v:nr,id:t};return Kt(n)};function ft({event:e,rootDir:t=process.cwd()}){try{let n=re(t);if(a(n))return n;let r=Qn(n.value);if(a(r))return r;let o=Ri(n.value,{userId:e.userId,userName:e.userName});if(a(o))return o;let s=rr(n.value);if(a(s))return i(s.message);let l=s.value?tr(Math.max(Date.now(),hi(s.value)+1)):tr(),c=Ai(er(e),[l,s.value]);return a(c)?i(c.message):(Ii.appendFileSync(o.value,`${JSON.stringify(c.value)}
3
+ `,"utf8"),d("Event persisted",{path:o.value,entry:c.value}))}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return i(`Failed to persist event: ${r}`)}}var Ti=Vt.object({userId:Vt.string().min(1).default("unknown"),userName:Vt.string().min(1).default("unknown")}),Mi=e=>{let[t,n]=jt.basename(e,".jsonl").split("."),r=Ti.safeParse({userId:t,userName:n});return r.success?d("Parsed event file actor",r.data):i(`Invalid event file name ${jt.basename(e)}: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},Pi=e=>{let t=Object.keys(e).filter(n=>n!=="id"&&n!=="v");return t.length!==1?i(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?i("Invalid persisted event: action key is missing or invalid"):d("Resolved persisted action",t[0])},Li=(e,t)=>t in e,Di=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),Fi=e=>{let{userId:t,userName:n,...r}=e,o=Pi(r);if(a(o))return i(o.message);let s=o.value,l=e.id?.[0];return l?Li(r,s)?d("Decoded persisted event",Di({id:l,action:s,payload:r[s],userId:t,userName:n})):i(`Persisted event is missing payload for action: ${s}`):i("Persisted event is missing id")},Nt=e=>{if(!vt.existsSync(e))return d("Event file missing",[]);let t=Mi(e);if(a(t))return i(t.message);let n=vt.readFileSync(e,"utf8"),r=[];for(let o of n.split(`
4
+ `)){let s=o.trim();if(!s)continue;let l;try{l=JSON.parse(s)}catch{return i(`Failed to parse event JSON from ${e}: ${s}`)}let c=Kt(l);if(a(c))return i(`${c.message} in ${e}: ${s}`);r.push({...c.value,userId:t.value.userId,userName:t.value.userName})}return d("Parsed persisted events file",r)};function or(e){let t=Be(e);if(!vt.existsSync(t))return i("No events found");let n=vt.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>jt.join(t,o)),r=[];for(let o of n){let s=Nt(o);if(a(s))return i(s.message);r.push(...s.value)}return d("All events loaded",ki(r))}function He(e){let t=or(e);if(a(t))return i(t.message);let n=[];for(let r of t.value){let o=Fi(r);if(a(o))return i(`Failed to decode event ${r.id?.[0]??"<unknown>"}: ${o.message}`);n.push(o.value)}return d("Loaded merged events",n)}function rr(e=process.cwd()){let t=or(e);return a(t)?i(t.message):d("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var ki=e=>{if(e.length===0)return[];let t=new Map;for(let u of e){let g=u.id[1]??null;t.has(g)||t.set(g,[]),t.get(g).push(u)}for(let u of t.values())u.sort((g,f)=>g.id[0].localeCompare(f.id[0]));let n=[],r=new Set,o=t.get(null)??[];c(o);let s=!0;for(;s;){s=!1;for(let u=0;u<n.length;u++){let g=n[u].id[0],f=(t.get(g)??[]).filter(E=>!r.has(E.id[0]));if(f.length!==0){n.splice(u+1,0,...f);for(let E of f)r.add(E.id[0]);s=!0,u+=f.length}}}let l=e.filter(u=>!r.has(u.id[0])).sort((u,g)=>u.id[0].localeCompare(g.id[0]));return n.push(...l),n;function c(u){for(let g of u)r.has(g.id[0])||(n.push(g),r.add(g.id[0]))}},ir=(e,t)=>{let n=e.findIndex(r=>{try{return wi(r.id)>t}catch{return!0}});return n===-1?{appliedEvents:e,unappliedEvents:[]}:{appliedEvents:e.slice(0,n),unappliedEvents:e.slice(n)}};var sr=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 Oi=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[te,yt]=Oi;var A=(e,t)=>i(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),Ui={"init.workspace":e=>{let{id:t,name:n}=e.payload,r=ne.workspace(t,n);zt(r);let o=y.createNodeAtPosition(r);return a(o)?A(o.message??"Failed to initialize workspace",e):d("Workspace initialized",{action:e.action,result:o.value})},"add.workspace":e=>{let{id:t,name:n}=e.payload,r=ne.workspace(t,n),o=y.createNodeAtPosition(r);return a(o)?A(o.message??"Failed to add workspace",e):d("Added workspace",{action:e.action,result:o.value})},"add.board":e=>{let{id:t,name:n,parent:r}=e.payload,o=y.createNodeAtPosition(ne.board(t,n,r));return a(o)?A(o.message??"Unable to create board",e):d("Added board",{action:e.action,result:o.value})},"add.swimlane":e=>{let{id:t,name:n,parent:r}=e.payload,o=y.createNodeAtPosition(ne.swimlane(t,n,r));return a(o)?A(o.message??"Unable to create swimlane",e):d("Added swimlane",{action:e.action,result:o.value})},"add.issue":e=>{let{id:t,name:n,parent:r}=e.payload,o=y.createNodeAtPosition(ne.ticket(t,n,r));return a(o)?A(o.message??"Unable to create issue",e):d("Added issue",{action:e.action,result:o.value})},"add.field":e=>{let{id:t,name:n,parent:r,val:o}=e.payload,s=y.createNodeAtPosition(ne.field(t,n,r,{value:o},n.includes("Description")?"vertical":"horizontal"));return a(s)?A(s.message??`Unable to create field: ${n}`,e):d("Added field",{action:e.action,result:s.value})},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!y.getNode(t))return A(`Unable to locate node with id ${t}`,e);let o=y.renameNode(t,n);return a(o)?A(o.message??"Unable to edit title",e):d("Edited title",{action:e.action,result:o.value})},"delete.node":e=>{let{id:t}=e.payload,n=y.tombstoneNode(t);return a(n)?A(n.message??"Unable to delete node",e):d("Deleted node",{action:e.action,result:n.value})},"create.tag":e=>{let{id:t,name:n}=e.payload,r=y.createTag({id:t,name:n});return a(r)?A(r.message??"Unable to create tag",e):d("Tag added",{action:e.action,result:r.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,r=y.createContributor({id:t,name:n});return a(r)?A(r.message??"Unable to create contributor",e):d("Contributor created",{action:e.action,result:r.value})},"tag.issue":e=>{let{id:t,target:n,tagId:r}=e.payload,o=y.tag(n,r,t);return a(o)?A(o.message??"Unable to tag issue",e):d("Issue tagged",{action:e.action,result:o.value})},"untag.issue":e=>{let{target:t,tagId:n}=e.payload,r=y.untag(t,n);return a(r)?A(r.message??"Unable to untag ",e):d("Issue untagged",{action:e.action,result:r.value})},"assign.issue":e=>{let{id:t,contributor:n,target:r}=e.payload,o=y.assign(r,n,t);return a(o)?A(o.message??"Unable to assign issue",e):d("Assigned successfully",{action:e.action,result:o.value})},"unassign.issue":e=>{let{target:t,contributor:n}=e.payload,r=y.unassign(t,n);return a(r)?A(r.message??"Unable to unassign issue",e):d("Issue unassigned",{action:e.action,result:r.value})},"move.node":e=>{let{id:t,parent:n,pos:r}=e.payload,o=y.moveNode({id:t,parentId:n,position:r});return a(o)?A(o.message??"Failed to move node",e):d("Moved node",{action:e.action,result:o.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,r=y.editValue(t,n);return a(r)?A(r.message??"Unable to edit description",e):d("Set node value",{action:e.action,result:r.value})},"close.issue":e=>{let{id:t}=e.payload,n=y.getNode(t);if(!n)return A("Unable to locate issue",e);if(!V(n))return A("Can only close issues",e);let r=y.getNode(te);if(!r)return A("Unable to locate target swimlane",e);if(r.id===n.parentNodeId)return A("Cannot close closed issue",e);let s=y.moveNode({id:t,parentId:r.id});return a(s)?A(s.message??"Unable to close issue",e):d("Issue closed",{action:e.action,result:s.value})},"reopen.issue":e=>{let{id:t}=e.payload,n=y.getNode(t);if(!n)return A("Unable to locate issue",e);if(!V(n))return A("Can only reopen issues",e);let r=y.getNode(te);if(!r)return A("Unable to locate closed swimlane",e);if(!(n.parentNodeId===r.id))return A("Issue is not closed",e);let s=sr(n);if(!s)return A("Unable to resolve previous parent from issue history",e);if(s===r.id)return A("Previous parent resolves to closed swimlane",e);if(!y.getNode(s))return A("Previous parent no longer exists",e);let c=y.moveNode({id:t,parentId:s});return a(c)?A(c.message??"Unable to reopen issue",e):d("Issue reopened",{action:e.action,result:c.value})},"lock.node":e=>{let{id:t}=e.payload,n=y.lockNode(t);return a(n)?A(n.message??"Unable to lock node",e):d("Node locked",{action:e.action,result:n.value})}},_i=(e,t)=>{let n=y.getNode(e);n&&y.updateNode({...n,log:[...n.log??[],t]})},Bi=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=N().nodes[e.payload.id]?.parentNodeId;return n&&t.push(n),t;case"tag.issue":case"untag.issue":case"assign.issue":case"unassign.issue":return[e.payload.id,e.payload.target];case"create.tag":case"create.contributor":default:return[]}};function Re(e,t=!1){let n=Ui[e.action](e);if(a(n))return n;t||([...new Set(Bi(e))].forEach(l=>_i(l,e)),j(l=>({...l,eventLog:[...l.eventLog,e]})));let r=e.userId,o=e.userName;return!r?.length||!o?.length?A("Invalid user ID format",e):(y.createContributor({name:o,id:r}),n)}var ye=e=>e.map(t=>Re(t));function $(e){let t=Re(e);if(t.status!==oe.Success)return t;let n=ft({event:e});return a(n)?n:t}function Ae(e){return e.map(t=>$(t))}import is from"node:fs";import{createHash as Vi}from"node:crypto";import Ve from"node:fs";import ji from"node:os";import Z from"node:path";var Gt=(e,t)=>{let n=new Map,r=t??((...s)=>JSON.stringify(s)),o=((...s)=>{let l=r(...s);if(!n.has(l)){let c=e(...s).then(u=>(a(u)&&n.delete(l),u));n.set(l,c)}return n.get(l)});return o.clear=()=>n.clear(),o};import Ke from"fs";import dr from"path";import Wi from"util";var ar=1e3,lr=()=>{let e=process.cwd(),t=re(e);if(!a(t))return dr.join(t.value,pe,"log","epiq.log")};function $i(){if(!Ht)return;let e=lr();if(e===void 0||!Ke.existsSync(e))return;let n=Ke.readFileSync(e,"utf8").split(`
5
+ `);if(n[n.length-1]===""&&n.pop(),n.length<=ar)return;let r=n.slice(-ar).join(`
6
6
  `)+`
7
- `;je.writeFileSync(t,o,"utf8")}function Yt(e,t,n=!1,r=process.cwd()){if(!pt)return;let o=lr(r),s=Di.format(...t),d=new Date,u=`[${n?d.toISOString().slice(11,19):d.toISOString()}] ${e} ${s}
8
- `;je.mkdirSync(cr.dirname(o),{recursive:!0}),je.appendFileSync(o,u,"utf8"),Fi(r)}var x={info(...e){Yt("[Info]",e,!1)},debug(...e){Yt("->",e,!0)},error(...e){Yt("[Error]",[...e,new Error().stack],!1)}};globalThis.logger=x;var ur=15e3,Oi={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo"},pr=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!Xt.existsSync(t)){let f=`Git cwd does not exist: ${t}`;if(n){r({stdout:"",stderr:f,exitCode:1});return}r(i(f));return}let o=ki("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:Oi}),s=!1,d="",l="",u=f=>{s||(s=!0,clearTimeout(v),r(f))},v=setTimeout(()=>{o.kill("SIGTERM");let f=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${ur}ms`].join(`
9
- `);u(n?{stdout:d,stderr:f,exitCode:124}:i(f))},ur);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",f=>{d+=f}),o.stderr.on("data",f=>{l+=f}),o.on("error",f=>{if(n){u({stdout:d,stderr:f.message,exitCode:1});return}u(i([`git ${e.join(" ")}`,`cwd=${t}`,f.message].join(`
10
- `)))}),o.on("close",f=>{let N=f??1;if(n){u({stdout:d,stderr:l,exitCode:N});return}if(N!==0){u(i([`git ${e.join(" ")}`,l.trim()||d.trim()||"Git command failed"].filter(Boolean).join(`
11
- `)));return}u(c("Git command succeeded",{stdout:d,stderr:l,exitCode:N}))})}),T=({args:e,cwd:t})=>pr({args:e,cwd:t,allowFail:!1}),Ne=({args:e,cwd:t})=>pr({args:e,cwd:t,allowFail:!0}),gr=Ve(async(e=process.cwd())=>{let t=await T({args:["rev-parse","--show-toplevel"],cwd:e});return a(t)?i("Not inside a Git repository"):c("Resolved repo root",t.data.stdout.trim())},e=>we.resolve(e)),Ui=Ve(async e=>{let t=await T({args:["rev-parse","--git-dir"],cwd:e});if(a(t))return i(t.message);let n=t.data.stdout.trim(),r=we.isAbsolute(n)?n:we.join(e,n);return c("Resolved git dir",r)},e=>we.resolve(e)),Qt=async({cwd:e,message:t})=>{let n=await T({args:["commit","-m",t],cwd:e});if(a(n))return i(`Failed to create commit
7
+ `;Ke.writeFileSync(e,r,"utf8")}function qt(e,t,n=!1){if(!Ht)return;let r=lr();if(!r)return;let o=Wi.format(...t),s=new Date,c=`[${n?s.toISOString().slice(11,19):s.toISOString()}] ${e} ${o}
8
+ `;Ke.mkdirSync(dr.dirname(r),{recursive:!0}),Ke.appendFileSync(r,c,"utf8"),$i()}var J={info(...e){qt("[Info]",e,!1)},debug(...e){qt("->",e,!0)},error(...e){qt("[Error]",[...e,new Error().stack],!1)}};globalThis.logger=J;import{spawn as Hi}from"node:child_process";import Jt from"node:fs";import mr from"node:path";var P="epiq/events",X="origin";var _={stage:({cwd:e,pathspec:t})=>T({args:["add",t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1})=>T({args:["commit",...n?["--allow-empty"]:[],"-m",t],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>T({args:["fetch",t,n],cwd:e}),pullRebase:({cwd:e,remote:t,branch:n})=>T({args:["pull","--rebase",t,n],cwd:e}),checkout:({cwd:e,branch:t})=>T({args:["checkout",t],cwd:e}),push:({cwd:e,remote:t,branch:n,setUpstream:r=!1})=>{let o=t&&n?["push",...r?["-u"]:[],t,n]:["push"];return T({args:o,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>T({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>T({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>T({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>T({args:["worktree","prune"],cwd:e})};var cr=15e3,Ki={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo"},pr=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!Jt.existsSync(t)){let f=`Git cwd does not exist: ${t}`;if(n){r({stdout:"",stderr:f,exitCode:1});return}r(i(f));return}let o=Hi("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:Ki}),s=!1,l="",c="",u=f=>{s||(s=!0,clearTimeout(g),r(f))},g=setTimeout(()=>{o.kill("SIGTERM");let f=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${cr}ms`].join(`
9
+ `);u(n?{stdout:l,stderr:f,exitCode:124}:i(f))},cr);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",f=>{l+=f}),o.stderr.on("data",f=>{c+=f}),o.on("error",f=>{if(n){u({stdout:l,stderr:f.message,exitCode:1});return}u(i([`git ${e.join(" ")}`,`cwd=${t}`,f.message].join(`
10
+ `)))}),o.on("close",f=>{let E=f??1;if(n){u({stdout:l,stderr:c,exitCode:E});return}if(E!==0){u(i([`git ${e.join(" ")}`,c.trim()||l.trim()||"Git command failed"].filter(Boolean).join(`
11
+ `)));return}u(d("Git command succeeded",{stdout:l,stderr:c,exitCode:E}))})}),T=({args:e,cwd:t})=>pr({args:e,cwd:t,allowFail:!1}),we=({args:e,cwd:t})=>pr({args:e,cwd:t,allowFail:!0}),Et=async({cwd:e,message:t})=>{let n=await _.commit({cwd:e,message:t});if(a(n))return i(`Failed to create commit
12
12
  ${n.message}`);let r=await T({args:["rev-parse","HEAD"],cwd:e});return a(r)?i(`Commit created, but failed to read HEAD SHA
13
- ${r.message}`):c("Created commit and resolved SHA",r.data.stdout.trim())},Zt=async e=>{let t=await Ui(e);if(a(t))return i(t.message);let n=t.data,o=["MERGE_HEAD","CHERRY_PICK_HEAD","REVERT_HEAD","REBASE_HEAD","rebase-merge","rebase-apply"].filter(s=>Xt.existsSync(we.join(n,s)));return c("Checked for in-progress Git operation",o.length>0)},xt=async({repoRoot:e,remote:t})=>{let n=await Ne({args:["remote","get-url",t],cwd:e});return c("Checked remote",n.exitCode===0)},bt=async({repoRoot:e,remote:t,branch:n})=>{let r=await Ne({args:["ls-remote","--heads",t,n],cwd:e});return r.exitCode!==0?i(r.stderr.trim()||`Unable to inspect remote branch ${t}/${n}`):c("Checked remote branch",r.stdout.trim().length>0)},fr=async({repoRoot:e,branch:t})=>{let n=await Ne({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?c("Local branch exists",!0):n.exitCode===1?c("Local branch missing",!1):i(n.stderr.trim()||`Unable to inspect branch ${t}`)},mr=e=>{try{return Xt.realpathSync.native(e)}catch{return we.resolve(e)}},vr=async({repoRoot:e,worktreeRoot:t})=>{let n=await T({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return i(n.message);let r=mr(t),o=n.data.stdout.split(`
14
- `).filter(s=>s.startsWith("worktree ")).map(s=>s.slice(9)).map(mr).includes(r);return c("Checked worktree registration",o)},en=async e=>{let t=await Ne({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return c("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},Ct=async e=>{let t=await T({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return a(t)?i(t.message):c("Resolved current branch",t.data.stdout.trim())},yr=async e=>{let t=await T({args:["rev-parse","--short","HEAD"],cwd:e});return a(t)?i(t.message):c("Resolved short HEAD sha",t.data.stdout.trim())},Er=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),tn=async({cwd:e,remote:t,branch:n})=>{let r=await bt({repoRoot:e,remote:t,branch:n});if(a(r))return i(r.message);if(!r.data)return c("Remote branch missing, skipped pull",!1);x.debug("[git] fetch start",{cwd:e,remote:t,branch:n});let o=await T({args:["fetch",t,n],cwd:e});if(x.debug("[git] fetch done",o),a(o))return i(`Failed to fetch ${n}
15
- ${o.message}`);x.debug("[git] pull start",{cwd:e,remote:t,branch:n});let s=await T({args:["pull","--rebase",t,n],cwd:e});return x.debug("[git] pull done",s),a(s)?i(`Failed during pull --rebase
16
- ${s.message}`):c("Pulled with rebase",!0)},Nr=async e=>{let t=await T({args:["status","--porcelain"],cwd:e});return a(t)?i(t.message):c("Checked remote worktree changes",t.data.stdout.trim().length>0)},Ir=async e=>{let t=await Ct(e);return a(t)?i(t.message):c("Checked detached HEAD state",t.data==="HEAD")};import{createHash as Ki}from"node:crypto";import ne from"node:fs";import Vi from"node:os";import V from"node:path";import ht from"node:fs";import _i from"node:path";import{decodeTime as Bi}from"ulid";var nn=e=>{let[t,n]=e.id;return`${t}:${n??""}`},xr=e=>{let[t]=e.id;return Bi(t)},Wi=e=>{let{userId:t,userName:n,...r}=e;return r},$i=e=>e.length===0?"":e.map(t=>JSON.stringify(Wi(t))).join(`
13
+ ${r.message}`):d("Created commit and resolved SHA",r.value.stdout.trim())},Yt=async e=>{let t=await Ir(e);if(a(t))return i(t.message);let n=t.value,o=["MERGE_HEAD","CHERRY_PICK_HEAD","REVERT_HEAD","REBASE_HEAD","rebase-merge","rebase-apply"].filter(s=>Jt.existsSync(mr.join(n,s)));return d("Checked for in-progress Git operation",o.length>0)},Xt=async({repoRoot:e})=>{let n=(await we({args:["remote","get-url",X],cwd:e})).exitCode===0;return d(`Checked remote ${n}`,n)},It=async({repoRoot:e,branch:t})=>{let n=await we({args:["ls-remote","--heads",X,t],cwd:e});return n.exitCode!==0?i(n.stderr.trim()||`Unable to inspect remote branch ${X}/${t}`):d("Checked remote branch",n.stdout.trim().length>0)},gr=async({repoRoot:e,branch:t})=>{let n=await we({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?d("Local branch exists",!0):n.exitCode===1?d("Local branch missing",!1):i(n.stderr.trim()||`Unable to inspect branch ${t}`)},ur=e=>{try{return Jt.realpathSync.native(e)}catch{return mr.resolve(e)}},fr=async({repoRoot:e,worktreeRoot:t})=>{let n=await T({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return i(n.message);let r=ur(t),o=n.value.stdout.split(`
14
+ `).filter(s=>s.startsWith("worktree ")).map(s=>s.slice(9)).map(ur).includes(r);return d("Checked worktree registration",o)},Zt=async e=>{let t=await we({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return d("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},xt=async e=>{let t=await T({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return a(t)?i(t.message):d("Resolved current branch",t.value.stdout.trim())},vr=async e=>{let t=await T({args:["rev-parse","--short","HEAD"],cwd:e});return a(t)?i(t.message):d("Resolved short HEAD sha",t.value.stdout.trim())},Nr=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),Qt=async({cwd:e,branch:t})=>{let n=await It({repoRoot:e,branch:t});if(a(n))return i(n.message);if(!n.value)return d("Remote branch missing, skipped pull",!1);let r=await _.fetch({cwd:e,remote:X,branch:t});if(a(r))return i(`Failed to fetch ${t}
15
+ ${r.message}`);let o=await _.pullRebase({cwd:e,remote:X,branch:t});return a(o)?i(`Failed during pull --rebase
16
+ ${o.message}`):d("Pulled with rebase",!0)},yr=async e=>{let t=await T({args:["status","--porcelain"],cwd:e});return a(t)?i(t.message):d("Checked state branch changes",t.value.stdout.trim().length>0)},Er=async e=>{let t=await xt(e);return a(t)?i(t.message):d("Checked detached HEAD state",t.value==="HEAD")};var xr="4b825dc642cb6eb9a060e54bf8d69288fbee4904",hr=e=>Z.join(pe,pt,e),zi=e=>Vi("sha1").update(Z.resolve(e)).digest("hex").slice(0,12),Cr=()=>Z.join(ji.homedir(),Y),br=()=>Z.join(Cr(),"worktrees"),Sr=e=>Z.join(br(),zi(e)),Gi=e=>Z.join(e,pe),Ee=e=>Z.join(Gi(e),pt),en=({root:e,fileName:t})=>Z.join(Ee(e),t),je=e=>{try{return Ve.mkdirSync(e,{recursive:!0}),d("Ensured directory",void 0)}catch(t){return i(t instanceof Error?t.message:String(t))}},Rr=()=>{let e=je(Cr());if(a(e))return i(`Ensure epiq home failed.
17
+ `+e.message);let t=je(br());return a(t)?i(`Ensure worktrees dir failed.
18
+ `+t.message):d("Ensured epiq storage",!0)},Ar=e=>{Ve.existsSync(e)&&(J.debug("[sync] remove path",e),Ve.rmSync(e,{recursive:!0,force:!0}))},wr=e=>{let t=Ee(e);if(!Ve.existsSync(t))return d("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 d("Listed event files",n)},Tr=(e,t)=>{for(let n of[Ee(e),Ee(t)]){let r=je(n);if(a(r))return i(r.message)}return d("Ensured state branch",void 0)},Mr=async e=>{let t=await T({args:["ls-tree","--name-only","HEAD"],cwd:e});if(a(t))return i(`ensure state branch is storage only failed
19
+ `+t.message);let r=t.value.stdout.trim().split(`
20
+ `).filter(Boolean).filter(l=>l!==pe);if(r.length===0)return d("State branch is storage-only",!1);let o=await T({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(a(o))return i(`Failed to clean storage branch
21
+ ${o.message}`);let s=await Et({cwd:e,message:"[epiq:repair-storage-branch]"});return a(s)?i(s.message):d("Cleaned storage branch",!0)},Pr=Gt(async(e=process.cwd())=>{let t=await T({args:["rev-parse","--show-toplevel"],cwd:e});return a(t)?i("Not inside a Git repository"):d("Resolved repo root",t.value.stdout.trim())},e=>Z.resolve(e)),Ir=Gt(async e=>{let t=await T({args:["rev-parse","--git-dir"],cwd:e});if(a(t))return i(t.message);let n=t.value.stdout.trim(),r=Z.isAbsolute(n)?n:Z.join(e,n);return d("Resolved git dir",r)},e=>Z.resolve(e));import ge from"node:fs";import ze from"node:path";var Fr=async e=>{let t=ze.join(e,".gitignore"),n=ge.existsSync(t)?ge.readFileSync(t,"utf8"):"",r=".epiq";return n.split(`
22
+ `).some(c=>{let u=c.trim();return u===r||u===r+"/"})?d(`${r} already ignored`,!1):(n=n.trimEnd()+`
23
+
24
+ # [epiq]: hydrated state is never to be committed
25
+ ${r}
26
+ `,ge.writeFileSync(t,n+`
27
+ `,"utf8"),J.info(`Added ${r} to .gitignore (epiq local cache)`),d(`${r} ignored`,!0))},kr=async e=>{if((await we({args:["rev-parse","--verify","HEAD"],cwd:e})).exitCode===0)return d("Initial commit already exists",!1);J.info("Creating initial commit");let n=await _.commit({cwd:e,message:"Initial commit",allowEmpty:!0});return a(n)?i(n.message):d("Created initial commit",!0)},Lr=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",qi=async e=>{let t=await xt(e);if(a(t))return i(t.message);let n=await vr(e);if(a(n))return i(n.message);let r=`[epiq:sync:${Lr(t.value)}:${Lr(n.value)}]`;return d("Built sync commit message",r)},Dr=async e=>{J.info(`Creating ${P}`);let t=await T({args:["commit-tree",xr,"-m","[epiq:init-state-branch]"],cwd:e});if(a(t))return i(`Failed to create state branch commit
28
+ ${t.message}`);let n=t.value.stdout.trim(),r=await T({args:["update-ref",`refs/heads/${P}`,n],cwd:e});return a(r)?i(`Failed to create ${P}
29
+ ${r.message}`):d("Created state branch",!0)},Ji=async({repoRoot:e})=>{let t=await gr({repoRoot:e,branch:P});if(a(t))return i(`Ensure local state branch failed
30
+ `+t.message);if(t.value)return d("Local state branch already exists",!1);let n=await Xt({repoRoot:e});if(a(n))return i(`Ensure local state branch failed
31
+ `+n.message);if(!n.value)return Dr(e);let r=await It({repoRoot:e,branch:P});if(a(r))return i(`Ensure local state branch failed
32
+ `+r.message);if(!r.value)return Dr(e);let o=await _.fetch({cwd:e,remote:X,branch:P});if(a(o))return i(`Failed to fetch ${P} from remote
33
+ ${o.message}`);let s=await T({args:["branch","--track",P,`${X}/${P}`],cwd:e});return a(s)?i(`Failed to create local ${P} from remote
34
+ ${s.message}`):d("Created local state branch from remote",!0)},Yi=async({repoRoot:e,branch:t})=>{let n=await T({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return i(n.message);let r=n.value.stdout.split(`
35
+ `),o=null;for(let s of r){if(s.startsWith("worktree ")){o=s.slice(9);continue}if(s===`branch refs/heads/${t}`&&o)return d("Found worktree for branch",o)}return d("No worktree found for branch",null)},Xi=async({repoRoot:e,stateBranchRoot:t})=>{let n=je(ze.dirname(t));if(a(n))return i(`Failed to create state branch worktree
36
+ `+n.message);ge.existsSync(t)&&!ge.existsSync(ze.join(t,".git"))&&(J.info("Removing broken state branch worktree path"),Ar(t)),J.info("Creating state branch worktree");let r=await _.worktreeAdd({cwd:e,worktreeRoot:t,branch:P});return a(r)?i(`Failed to create state branch worktree
37
+ ${r.message}`):d("Created state branch worktree",!0)},Zi=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Yi({repoRoot:e,branch:P});if(a(n))return i(n.message);let r=ze.resolve(t),o=n.value?ze.resolve(n.value):null;if(o&&o===r&&ge.existsSync(o))return d("State branch already checked out in expected worktree",!1);if(o&&o!==r){J.info("Moving state branch worktree to expected location");let c=await _.worktreeRemove({cwd:e,worktreeRoot:o});if(a(c))return i(`Failed to remove existing state branch worktree
38
+ ${c.message}`)}if(o&&!ge.existsSync(o)){J.info("Pruning stale state branch worktree");let c=await _.worktreePrune({cwd:e});if(a(c))return i(`Failed to prune stale worktrees
39
+ ${c.message}`)}let s=await fr({repoRoot:e,worktreeRoot:t});if(a(s))return i(s.message);let l=ge.existsSync(t);if(s.value&&l)return d("State branch worktree already exists",!1);if(s.value&&!l){J.info("Pruning missing registered state branch worktree");let c=await _.worktreePrune({cwd:e});if(a(c))return i(`Failed to prune stale worktrees
40
+ ${c.message}`)}return Xi({repoRoot:e,stateBranchRoot:t})},Qi=async e=>{let t=await xt(e);if(a(t))return i(t.message);if(t.value===P)return d("State branch already checked out",!1);let n=await _.checkout({cwd:e,branch:P});return a(n)?i(`Failed to checkout ${P}
41
+ ${n.message}`):d("Checked out state branch",!0)},es=async e=>{let t=await Zt(e);if(a(t))return i(t.message);if(t.value)return d("State branch upstream already configured",!1);let n=await Xt({repoRoot:e});if(a(n))return i(n.message);if(!n.value)return d("No remote available for state branch upstream",!1);let r=await It({repoRoot:e,branch:P});if(a(r))return i(r.message);if(!r.value)return d("Remote state branch missing; upstream will be configured on first push",!1);J.info(`Configuring ${P} upstream`);let o=await _.fetch({cwd:e,remote:X,branch:P});if(a(o))return i(`Failed to fetch ${P}
42
+ ${o.message}`);let s=await _.setUpstream({cwd:e,branch:P,upstream:`${X}/${P}`});return a(s)?i(`Failed to set state branch upstream
43
+ ${s.message}`):d("Configured state branch upstream",!0)},Or=async({stateBranchRoot:e,ownEventFileName:t})=>{let n=await _.stage({cwd:e,pathspec:hr(t)});return a(n)?i(`Failed to stage state branch own event file
44
+ ${n.message}`):d("Staged state branch own event file",void 0)},Ur=async({repoRoot:e,stateBranchRoot:t})=>{let n=await qi(e);return a(n)?i(`Create state branch sync commit failed
45
+ `+n.message):Et({cwd:t,message:n.value})},tn=async e=>{let t=await Zt(e);if(a(t))return i(t.message);let n=t.value?await _.push({cwd:e}):await _.push({cwd:e,remote:X,branch:P,setUpstream:!0});return a(n)?i(`Failed during state branch push
46
+ ${n.message}`):d("Pushed state branch",!0)},_r=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=[Rr(),await Ji({repoRoot:e}),await Zi({repoRoot:e,stateBranchRoot:t}),await Qi(t),await Mr(t),n?await es(t):d("Skipped state branch upstream bootstrap",!1)];for(let s of o){if(a(s))return i(s.message);r=r||!!s.value}return d(n?"Bootstrapped state storage":"Bootstrapped state storage (readonly)",r)};import ht from"node:fs";import rn from"node:path";import{decodeTime as ts}from"ulid";var nn=e=>{let[t,n]=e.id;return`${t}:${n??""}`},Br=e=>{let[t]=e.id;return ts(t)},ns=e=>{let{userId:t,userName:n,...r}=e;return r},rs=e=>e.length===0?"":e.map(t=>JSON.stringify(ns(t))).join(`
17
47
  `)+`
18
- `,Hi=(e,t)=>{let n=new Map;for(let r of[...t,...e])n.set(nn(r),r);return[...n.values()].sort((r,o)=>{let s=xr(r)-xr(o);return s!==0?s:nn(r).localeCompare(nn(o))})},Rt=({sourceFile:e,targetFile:t})=>{let n=Nt(e);if(a(n))return i(n.message);let r=Nt(t);if(a(r))return i(r.message);let o=Hi(r.data,n.data),s=$i(o);return(ht.existsSync(t)?ht.readFileSync(t,"utf8"):"")===s?c("Event file already merged",!1):(ht.mkdirSync(_i.dirname(t),{recursive:!0}),ht.writeFileSync(t,s,"utf8"),c("Merged event file",!0))};var L="epiq/events",K="origin",rn=se(),Cr="events",ji="4b825dc642cb6eb9a060e54bf8d69288fbee4904",zi=e=>V.join(rn,Cr,e),qi=e=>Ki("sha1").update(V.resolve(e)).digest("hex").slice(0,12),hr=()=>V.join(Vi.homedir(),".epiq"),Rr=()=>V.join(hr(),"worktrees"),Sr=e=>V.join(Rr(),qi(e)),Gi=e=>V.join(e,rn),Te=e=>V.join(Gi(e),Cr),ze=({root:e,fileName:t})=>V.join(Te(e),t),St=e=>(x.debug("[sync] ensure dir",e),ne.mkdirSync(e,{recursive:!0}),c("Ensured directory",void 0)),Ji=()=>{x.debug("[sync] ensure epiq storage");let e=St(hr());if(a(e))return i(e.message);let t=St(Rr());return a(t)?i(t.message):c("Ensured epiq storage",void 0)},Yi=e=>{ne.existsSync(e)&&(x.debug("[sync] remove path",e),ne.rmSync(e,{recursive:!0,force:!0}))},Xi=e=>{let t=Te(e);if(!ne.existsSync(t))return x.debug("[sync] events dir missing",t),c("Events dir missing",[]);let n=ne.readdirSync(t,{withFileTypes:!0}).filter(r=>r.isFile()).map(r=>r.name).filter(r=>r.endsWith(".jsonl")).sort();return x.debug("[sync] listed event files",{eventsDir:t,count:n.length}),c("Listed event files",n)},Qi=async e=>{x.debug("[sync] inspect local HEAD",e);let t=await Ne({args:["rev-parse","--verify","HEAD"],cwd:e});return t.exitCode===0?c("Repo has HEAD",!0):t.exitCode===1?c("Repo has no HEAD",!1):i(t.stderr.trim()||"Unable to inspect HEAD")},Zi=Ve(async e=>{x.debug("[sync] inspect remote history",{repoRoot:e,remote:K});let t=await xt({repoRoot:e,remote:K});if(a(t))return i(t.message);if(!t.data)return c("No remote configured",!1);let n=await Ne({args:["ls-remote","--heads",K],cwd:e});if(n.exitCode!==0)return i(n.stderr.trim()||"Unable to inspect remote heads");let r=n.stdout.trim().length>0;return x.debug("[sync] remote history",r),c("Checked remote history",r)},e=>V.resolve(e)),Ar=async e=>{x.debug("[sync] ensure initial commit");let t=await Qi(e);if(a(t))return i(t.message);if(t.data)return x.debug("[sync] local HEAD exists"),c("Repo already initialized",!1);let n=await Zi(e);if(a(n))return i(n.message);if(n.data)return x.debug("[sync] skip local init commit due to remote history"),c("Skipped local init commit because remote history exists",!1);x.debug("[sync] create empty init commit");let r=await T({args:["commit","--allow-empty","-m","[epiq:init]"],cwd:e});return a(r)?i(`Failed to create initial commit
19
- ${r.message}`):c("Created initial commit",!0)},wr=({repoRoot:e,worktreeRoot:t})=>{let n=Xi(t);if(a(n))return i(n.message);let r=Te(t),o=Te(e),s=!1;for(let d of n.data){let l=V.join(r,d),u=V.join(o,d);x.debug("[sync] hydrate event file",{from:l,to:u});let v=Rt({sourceFile:l,targetFile:u});if(a(v))return i(v.message);s=s||v.data}return x.debug("[sync] hydrate changed",s),c("Hydrated event files from remote worktree",s)},br=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",es=async e=>{let t=await Ct(e);if(a(t))return i(t.message);let n=await yr(e);if(a(n))return i(n.message);let r=`[epiq:sync:${br(t.data)}:${br(n.data)}]`;return x.debug("[sync] commit message",r),c("Built sync commit message",r)},ts=async e=>{x.debug("[sync] create empty storage branch",L);let t=await T({args:["commit-tree",ji,"-m","[epiq:init-storage-branch]"],cwd:e});if(a(t))return i(`Failed to create storage branch commit
20
- ${t.message}`);let n=t.data.stdout.trim(),r=await T({args:["update-ref",`refs/heads/${L}`,n],cwd:e});return a(r)?i(`Failed to create ${L}
21
- ${r.message}`):c("Created empty storage branch",!0)},ns=async({repoRoot:e})=>{x.debug("[sync] ensure local remote branch",L);let t=await fr({repoRoot:e,branch:L});if(a(t))return i(t.message);if(t.data)return x.debug("[sync] local remote branch exists"),c("Local remote branch already exists",!1);let n=await xt({repoRoot:e,remote:K});if(a(n))return i(n.message);if(n.data){let r=await bt({repoRoot:e,remote:K,branch:L});if(a(r))return i(r.message);if(r.data){x.debug("[sync] fetch remote branch before local track");let o=await T({args:["fetch",K,L],cwd:e});if(a(o))return i(`Failed to fetch ${L} from remote
22
- ${o.message}`);x.debug("[sync] create local tracking branch",L);let s=await T({args:["branch","--track",L,`${K}/${L}`],cwd:e});return a(s)?i(`Failed to create local ${L} from remote
23
- ${s.message}`):c("Created local remote branch from remote",!0)}}return ts(e)},rs=async({repoRoot:e,branch:t})=>{let n=await T({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return i(n.message);let r=n.data.stdout.split(`
24
- `),o=null;for(let s of r){if(s.startsWith("worktree ")){o=s.slice(9);continue}if(s===`branch refs/heads/${t}`&&o)return c("Found worktree for branch",o)}return c("No worktree found for branch",null)},os=async({repoRoot:e,worktreeRoot:t})=>{x.debug("[sync] create remote worktree",t);let n=St(V.dirname(t));if(a(n))return i(n.message);ne.existsSync(t)&&!ne.existsSync(V.join(t,".git"))&&(x.debug("[sync] remove broken remote worktree path",t),Yi(t));let r=await T({args:["worktree","add",t,L],cwd:e});return a(r)?i(`Failed to create remote worktree
25
- ${r.message}`):c("Created remote worktree",!0)},is=async({repoRoot:e,worktreeRoot:t})=>{x.debug("[sync] ensure remote worktree",t);let n=await rs({repoRoot:e,branch:L});if(a(n))return i(n.message);let r=n.data,o=V.resolve(t),s=r?V.resolve(r):null;if(s&&s===o&&ne.existsSync(s))return x.debug("[sync] reuse existing remote branch worktree",{expected:o,actual:s}),c("Remote branch already checked out in expected worktree",!1);if(s&&s!==o){x.debug("[sync] remove old remote branch worktree",{expected:o,actual:s});let u=await T({args:["worktree","remove","--force",s],cwd:e});if(a(u))return i(`Failed to remove existing remote worktree
26
- ${u.message}`)}if(s&&!ne.existsSync(s)){x.debug("[sync] prune stale branch worktree registration",{existingBranchWorktree:s});let u=await T({args:["worktree","prune"],cwd:e});if(a(u))return i(`Failed to prune stale worktrees
27
- ${u.message}`)}let d=await vr({repoRoot:e,worktreeRoot:t});if(a(d))return i(d.message);let l=ne.existsSync(t);if(d.data&&l)return x.debug("[sync] remote worktree exists"),c("Remote worktree already exists",!1);if(d.data&&!l){x.debug("[sync] prune stale remote worktree registration");let u=await T({args:["worktree","prune"],cwd:e});if(a(u))return i(`Failed to prune stale worktrees
28
- ${u.message}`)}return os({repoRoot:e,worktreeRoot:t})},ss=async e=>{let t=await Ct(e);if(a(t))return i(t.message);if(t.data===L)return x.debug("[sync] remote branch already checked out"),c("Remote branch already checked out",!1);x.debug("[sync] checkout remote branch",L);let n=await T({args:["checkout",L],cwd:e});return a(n)?i(`Failed to checkout ${L}
29
- ${n.message}`):c("Checked out remote branch",!0)},as=async e=>{let t=await T({args:["ls-tree","--name-only","HEAD"],cwd:e});if(a(t))return i(t.message);let r=t.data.stdout.trim().split(`
30
- `).filter(Boolean).filter(d=>d!==rn);if(r.length===0)return c("Remote branch is storage-only",!1);x.debug("[sync] remove app files from storage branch",r);let o=await T({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(a(o))return i(`Failed to clean storage branch
31
- ${o.message}`);let s=await Qt({cwd:e,message:"[epiq:repair-storage-branch]"});return a(s)?i(s.message):c("Cleaned storage branch",!0)},ds=async e=>{x.debug("[sync] ensure remote upstream",L);let t=await en(e);if(a(t))return i(t.message);if(t.data)return x.debug("[sync] remote upstream already configured"),c("Remote upstream already configured",!1);let n=await xt({repoRoot:e,remote:K});if(a(n))return i(n.message);if(!n.data)return x.debug("[sync] no remote configured for upstream"),c("No remote available for upstream",!1);let r=await bt({repoRoot:e,remote:K,branch:L});if(a(r))return i(r.message);if(!r.data)return x.debug("[sync] remote branch missing; upstream will be configured on first push"),c("Deferred upstream until first push",!1);x.debug("[sync] fetch remote branch before upstream set");let o=await T({args:["fetch",K,L],cwd:e});if(a(o))return i(`Failed to fetch ${L}
32
- ${o.message}`);x.debug("[sync] set upstream to remote branch");let s=await T({args:["branch","--set-upstream-to",`${K}/${L}`,L],cwd:e});return a(s)?i(`Failed to set remote upstream
33
- ${s.message}`):c("Configured remote upstream",!0)},Tr=async({worktreeRoot:e,ownEventFileName:t})=>{x.debug("[sync] stage own event file in remote worktree",t);let n=await T({args:["add",zi(t)],cwd:e});return a(n)?i(`Failed to stage remote own event file
34
- ${n.message}`):c("Staged remote own event file",void 0)},Mr=async({repoRoot:e,worktreeRoot:t})=>{let n=await es(e);return a(n)?i(n.message):(x.debug("[sync] create remote sync commit"),Qt({cwd:t,message:n.data}))},on=async e=>{x.debug("[sync] push remote worktree");let t=await en(e);if(a(t))return i(t.message);let n=await T({args:t.data?["push"]:["push","-u",K,L],cwd:e});return x.debug("[sync] push result",n),a(n)?i(`Failed during remote push
35
- ${n.message}`):c("Pushed remote",!0)},Lr=async({repoRoot:e,worktreeRoot:t,ensureUpstream:n})=>{x.debug("[sync] bootstrap remote storage",{repoRoot:e,worktreeRoot:t,ensureUpstream:n});let r=!1,o=[Ji(),await ns({repoRoot:e}),await is({repoRoot:e,worktreeRoot:t}),await ss(t),await as(t),n?await ds(t):c("Skipped remote upstream bootstrap",!1)];for(let s of o){if(a(s))return i(s.message);r=r||!!s.data}return x.debug("[sync] bootstrap changed",r),c(n?"Bootstrapped remote storage":"Bootstrapped remote storage (readonly)",r)},Pr=(e,t)=>{for(let n of[Te(e),Te(t)]){let r=St(n);if(a(r))return i(r.message)}return c("Ensured remote layout",void 0)};var cs=({repoRoot:e,worktreeRoot:t,ownEventFileName:n})=>{let r=ze({root:e,fileName:n}),o=ze({root:t,fileName:n});return qe.existsSync(r)?(logger.debug("[sync] merge own event file to remote",{ownEventFileName:n,localFile:r,remoteFile:o}),Rt({sourceFile:r,targetFile:o})):(logger.debug("[sync] local own event file missing",r),c("Local own event file missing, nothing to merge",!1))},Dr=async({repoRoot:e,worktreeRoot:t,ownEventFileName:n})=>{let r=cs({repoRoot:e,worktreeRoot:t,ownEventFileName:n});if(a(r))return i(r.message);let o=await Nr(t);if(a(o))return i(o.message);if(!r.data&&!o.data)return c("Own event file already up to date in remote worktree",{createdCommit:!1});let s=await Tr({worktreeRoot:t,ownEventFileName:n});if(a(s))return i(s.message);let d=await Mr({repoRoot:e,worktreeRoot:t});return a(d)?i(d.message):c("Merged, staged, and committed own event file",{createdCommit:!0,commitSha:d.data})},Fr=({repoRoot:e,worktreeRoot:t,ownEventFileName:n})=>{let r=ze({root:e,fileName:n}),o=ze({root:t,fileName:n});logger.debug("[sync] own event file sizes",{local:qe.existsSync(r)?qe.statSync(r).size:0,remote:qe.existsSync(o)?qe.statSync(o).size:0})},At=async({cwd:e=process.cwd(),ownEventFileName:t})=>{logger.debug("[sync] start write sync",{cwd:e,ownEventFileName:t});let n=await gr(e);if(a(n))return i(n.message);let r=n.data,o=Sr(r);logger.debug("[sync] resolved roots",{repoRoot:r,worktreeRoot:o});let s=await Ar(r);if(a(s))return i(`Failed to ensure initial commit: ${s.message}`);logger.debug("[sync] ensure initial commit changed",s.data);let d=await Ir(r);if(a(d))return i(d.message);if(d.data)return i("Cannot run :sync while the repository is in detached HEAD state");if(t.includes("/")||t.includes("\\"))return i("Own event file must be a file name, not a path");if(!t.endsWith(".jsonl"))return i("Own event file must end with .jsonl");let l=await Zt(r);if(a(l))return i(l.message);if(l.data)return i("Cannot run :sync while a merge, rebase, cherry-pick, or revert is in progress in the current repo");let u=await Lr({repoRoot:r,worktreeRoot:o,ensureUpstream:!0});if(a(u))return i(u.message);let v=await Zt(o);if(a(v))return i(v.message);if(v.data)return i("Cannot run :sync while a merge, rebase, cherry-pick, or revert is in progress in the remote worktree");let f=Pr(r,o);if(a(f))return i(f.message);let N=!1,C,S=!1,M=!1,j=!1;logger.debug("[sync] pull remote branch before local copy");let kt=await tn({cwd:o,remote:K,branch:L});if(a(kt))return i(kt.message);S=kt.data,logger.debug("[sync] pulled remote",S);let Ot=wr({repoRoot:r,worktreeRoot:o});if(a(Ot))return i(Ot.message);j=Ot.data,logger.debug("[sync] hydrated from remote",j);let De=await Dr({repoRoot:r,worktreeRoot:o,ownEventFileName:t});if(a(De))return i(De.message);if(N=De.data.createdCommit,C=De.data.commitSha,Fr({repoRoot:r,worktreeRoot:o,ownEventFileName:t}),logger.debug("[sync] sync own file result",De.data),N||u.data){let ve=await on(o),Ye=ve;if(a(ve)&&Er(ve.message)){let gn=await tn({cwd:o,remote:K,branch:L});if(a(gn))return i(gn.message);let Fe=await Dr({repoRoot:r,worktreeRoot:o,ownEventFileName:t});if(a(Fe))return i(Fe.message);Fe.data.createdCommit&&(N=!0,C=Fe.data.commitSha),Fr({repoRoot:r,worktreeRoot:o,ownEventFileName:t}),logger.debug("[sync] retry sync own file result",Fe.data),Ye=await on(o)}if(a(Ye))return i(Ye.message);M=Ye.data,logger.debug("[sync] pushed remote",M)}else logger.debug("[sync] no commit created, skipped push");if(N){let ve=await T({args:["rev-parse","HEAD"],cwd:o});if(a(ve))return i(ve.message);C=ve.data.stdout.trim()}return c("Synced event logs with remote",{repoRoot:r,worktreeRoot:o,createdCommit:N,commitSha:C,pulled:S,pushed:M,hydrated:j,bootstrapped:u.data})};import{ulid as kr}from"ulid";var Me=null,ge=()=>structuredClone(Me),Le=e=>Me=e,Or=()=>{let{currentNode:e,selectedIndex:t}=y(),r=R(e.id)[t];return r?c("Resolved selected child",r):i("Target node not found")};function sn(e){let t=Or();if(a(t))return t;let{currentNode:n,nodes:r}=y();if(!n.parentNodeId)return i("Missing parent node id");let o=r[n.parentNodeId];if(!o)return i("Missing parent node");let s=H(o.id),d=s.findIndex(({id:C})=>C===n.id);if(d<0)return i("Current node not found among siblings");let l=s[d+e];if(!l)return i("Missing sibling node");let u=W();if(a(u))return i("Unable to resolve user ID");let{userId:v,userName:f}=u.data;if(Le({id:kr(),userId:v,userName:f,action:"move.node",payload:{id:t.data.id,parent:l.id,pos:{at:"end"}}}),!Me)return i("Could not materialize move state");let N=Se(Me,!0);return a(N)?N:c("Node moved successfully",N.data)}function an(e){let t=Or();if(a(t))return t;let{currentNode:n,selectedIndex:r}=y(),s=H(n.id)[r+e];if(!s)return i("Missing sibling node");let d=W();if(a(d))return i("Unable to resolve user ID");let{userId:l,userName:u}=d.data;if(Le({id:kr(),userId:l,userName:u,action:"move.node",payload:{id:t.data.id,parent:n.id,pos:{at:e===1?"after":"before",sibling:s.id}}}),!Me)return i("Could not materialize move state");let v=Se(Me,!0);return a(v)?v:c("Node moved successfully",v.data)}import ls from"node:os";import Ur from"node:path";import{z as Ge}from"zod";var us={userId:"",userName:"",preferredEditor:"",autoSync:!1},_r=Ge.object({preferredEditor:Ge.string().optional(),userName:Ge.string().optional(),userId:Ge.string().optional(),autoSync:Ge.boolean().optional()}).strict(),ms=".epiq",ps="config.json",Br=()=>Ur.join(ls.homedir(),ms),dn=()=>Ur.join(Br(),ps),cn=()=>{try{return Y.mkDir(Br()),c("Ensured ~/.epiq exists",null)}catch{return i("Unable to create ~/.epiq")}},gs=e=>{let t;try{t=JSON.parse(e)}catch{return i("Invalid ~/.epiq/config.json JSON")}let n=_r.safeParse(t??{});return n.success?c("Parsed config",n.data):i(`Invalid ~/.epiq/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},Wr=()=>{let e=cn();if(a(e))return i(e.message);let t=dn(),n=Y.readFile(t);return n==null||n.trim()===""?c("No config found, using empty config",{autoSync:!1,preferredEditor:"",userId:"",userName:""}):gs(n)},$r=e=>{let t=cn();if(a(t))return i(t.message);let n=_r.safeParse(e);if(!n.success)return i(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=dn();try{return Y.writeToFile(r,JSON.stringify(n.data,null,2)+`
36
- `),c("Config written",null)}catch{return i("Unable to write ~/.epiq/config.json")}},wt=e=>{let t=Wr();if(a(t))return i("Failed to read existing config");let n={...t.data,...e};return $r(n)},Hr=()=>{let e=dn(),t=cn();if(a(t))return i("Unable to create ~/.epiq");if(!(Y.readFile(e)!==null)){let u=$r(us);if(a(u))throw new Error("Unable to create ~/.epiq/config.json")}let r=Wr();if(a(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:s,userId:d,autoSync:l}=r.data;return!s||!d?i("User name or ID not configured in ~/.epiq/config.json"):c("successfully loaded settings",{preferredEditor:o??"",userName:s,userId:d,autoSync:l??!1})};var Kr=e=>Object.values(y().tags).find(t=>t.name===e),Vr=e=>Object.values(y().contributors).find(t=>t.name===e),jr=[{systemOnly:!0,intent:b.Move,mode:p.COMMAND_LINE,action:()=>{let e=W();if(a(e))return i("Unable to resolve user ID");let{modifier:t}=J().commandMeta,n=()=>{let l=ge();if(!l)return i("No pending move state");let u=l.payload.id;if(!y().nodes[u])return i("Moved node not found");let f=l.payload.parent,N=y().nodes[f];if(!N)return i("Move parent not found");let C=R(f).findIndex(S=>S.id===u);return C===-1?i("Moved node not found among rendered children"):(U.navigate({currentNode:N,selectedIndex:C}),c("Synchronized navigation to moved node",null))},r=l=>{if(a(l))return i(l.message);let u=n();return a(u)?i(u.message):c("Updated move preview",null)},{currentNode:o,selectedIndex:s}=y(),d=R(o.id)[s];if(!d)return I({mode:p.DEFAULT}),i("No move target");if(t==="start"){if(d.readonly)return i("Target node is read-only");if(s===-1)return i("No item selected");if(!d.parentNodeId)return i("Target has no parent");let l=R(d.parentNodeId),u=l.findIndex(({id:S})=>S===d.id);if(u===-1)return i("Target not found among siblings");let v=l[u-1],f=l[u+1],N=f!=null?{at:"before",sibling:f.id}:v!=null?{at:"after",sibling:v.id}:{at:"start"};Le({id:F(),action:"move.node",payload:{id:d.id,parent:d.parentNodeId,pos:N},...e.data}),I({mode:p.MOVE});let C=n();return a(C)?i(C.message):c("Move initialized",null)}if(t==="next")return I({mode:p.MOVE}),r(an(1));if(t==="previous")return I({mode:p.MOVE}),r(an(-1));if(t==="to-next")return I({mode:p.MOVE}),r(sn(1));if(t==="to-previous")return I({mode:p.MOVE}),r(sn(-1));if(t==="confirm"){I({mode:p.DEFAULT});let l=ge();if(!l)return i("No pending move to confirm");let u=$(l);if(a(u))return u;let v=n();return a(v)?i(v.message):(Le(null),c("Moved item",null))}return t==="cancel"?(Le(null),I({mode:p.DEFAULT}),c("Cancelling move",null)):i("Invalid move modifier")}},{intent:b.Delete,mode:p.COMMAND_LINE,action:()=>{let e=W();if(a(e))return i("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=y(),r=R(t.id)[n];return r?$({id:F(),action:"delete.node",payload:{id:r.id},...e.data}):i("Unable to resolve child to delete")},onSuccess:()=>I({mode:p.DEFAULT})},{intent:b.Edit,mode:p.COMMAND_LINE,action:()=>{let e=W();if(a(e))return i("Unable to resolve user ID");let t=ye(y().breadCrumb,"TICKET");if(a(t))return i("Edit target must be an issue");let n=t.data;if(n.readonly)return i("Cannot edit readonly field");let{currentNode:r,selectedIndex:o}=y();if(!R(n.id)[o])return i("No selected field");let d=R(r.id)[o];if(!d)return i("No selected field");if(d.readonly)return i("Cannot edit readonly field");let l=d.props.value;if(typeof l!="string")return i("Selected field is not editable text");let u=Zn(l);if(a(u))return i("Failed to edit field");let v=u.data;return v===l?c("No changes made",null):d.title==="Description"?$({id:F(),action:"edit.description",payload:{id:d.id,md:v},...e.data}):d.title==="Title"?$({id:F(),action:"edit.title",payload:{id:d.id,name:v},...e.data}):i(`Editing not supported for "${d.title}"`)},onSuccess:()=>I({mode:p.DEFAULT})},{intent:b.Filter,mode:p.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=J().commandMeta,n=/(!=|=)/,[r,o]=e.split(n);if(!r||!(l=>_(m.FILTER).map(u=>u.split(n)[0]).includes(l))(r))return i("Invalid filter modifier");let d={target:r,operator:"=",value:t.trim()};return q(l=>({...l,filters:e==="clear"?[]:[...l.filters,d],mode:p.DEFAULT})),c("Viewing help",null)}},{intent:b.ViewHelp,mode:p.COMMAND_LINE,action:()=>(I({mode:p.HELP}),c("Viewing help",null))},{intent:b.CloseIssue,mode:p.COMMAND_LINE,action:()=>{let e=W();if(a(e))return i("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=y(),r=R(t.id)[n];if(!r)return i("Unable to close issue, no target found");if(!r.parentNodeId)return i("No target parent found");if(!z(r))return i("Cannot close in this context");let o=$({id:F(),action:"close.issue",payload:{id:r.id,parent:r.parentNodeId},...e.data});return a(o)?o:c("Viewing help",null)}},{intent:b.ReopenIssue,mode:p.COMMAND_LINE,action:()=>{let e=W();if(a(e))return i("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=y(),r=R(t.id)[n];if(!r)return i("Unable to reopen issue, no target found");let o=r.context==="TICKET"?c("Resolved ticket",r):be(r.id,"TICKET");if(a(o))return i("Cannot reopen in this context");let s=o.data,d=$({id:F(),action:"reopen.issue",payload:{id:s.id},...e.data});return a(d)?d:c("Issue reopened",null)},onSuccess:()=>I({mode:p.DEFAULT})},{intent:b.SetUserName,mode:p.COMMAND_LINE,action:()=>{let{userId:e,preferredEditor:t,userName:n}=oe(),r=ut()?.trim();if(!r)return i("No username provided");let o=r??n,s=e??F();if(!o||!s)return i("Unable to resolve user name or id");let d=wt({userName:o,userId:s,preferredEditor:t??""});return a(d)?d:(it({userName:o,userId:s}),I({mode:p.DEFAULT}),c(`Username set to "${r}"`,null))}},{intent:b.Init,mode:p.COMMAND_LINE,action:()=>{let e=un();if(a(e))return e;let{rootNodeId:t,nodes:n}=y();return U.navigate({currentNode:n[t],selectedIndex:0}),I({mode:p.DEFAULT}),c("Project initialized",null)}},{intent:b.SetEditor,mode:p.COMMAND_LINE,action:()=>{let e=ut()?.trim();if(!e)return i("No editor provided");let t=wt({preferredEditor:e});return a(t)?t:(it({preferredEditor:e}),I({mode:p.DEFAULT}),c(`Editor configuration set to "${e}"`,null))}},{intent:b.SetAutoSync,mode:p.COMMAND_LINE,action:()=>{let e=J().commandMeta.modifier;if(e!=="true"&&e!=="false")return i("Invalid response");let t=e.toLowerCase()==="true",n=wt({autoSync:t});return a(n)?n:(it({autoSync:t}),I({mode:p.DEFAULT}),c(`Auto synchronization set to "${t}"`,null))}},{intent:b.NewItem,mode:p.COMMAND_LINE,action:(e,t)=>{let n=W();if(a(n))return i("Unable to resolve user ID");if(!t.inputString)return i(`provide a name for your ${t.modifier}`);let{breadCrumb:r,currentNode:o,selectedIndex:s}=y(),d=l=>{let u=$(l);if(a(u))return u;let v=E.getNode(u.data.result.id);if(!v)return i("Created node not found");if(!v.parentNodeId)return u;let f=E.getNode(v.parentNodeId);return f?(U.navigate({currentNode:f,selectedIndex:E.getSiblings(v.parentNodeId).findIndex(({id:N})=>N===v.id)}),u):i("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:l}=y(),u=E.getNode(l);return u?d({id:F(),action:"add.board",payload:{id:F(),name:t.inputString,parent:u.id},...n.data}):i("Workspace not found")}if(t.modifier==="swimlane"){let l=ye(r,"BOARD");return a(l)?i("Unable to add swimlane in this context"):d({id:F(),action:"add.swimlane",payload:{id:F(),name:t.inputString,parent:l.data.id},...n.data})}if(t.modifier==="issue"){let l=R(o.id)[s],u=o.context==="SWIMLANE"?o:o.context==="BOARD"&&l?.context==="SWIMLANE"?l:(()=>{let S=ye(r,"SWIMLANE");return a(S)?null:S.data})();if(!u)return i("Unable to add issue in this context");let v=Ze({name:t.inputString,parent:u.id,user:n.data}),f=Ae(v);if(f.some(S=>a(S)))return i("Issue create failed: "+f.filter(a).map(S=>S.message).filter(Boolean).join(", "));let N=f[0];if(!N||a(N))return i("Issue creation failed");let C=v[0]?.payload.id;return C?(U.navigate({currentNode:u,selectedIndex:E.getSiblings(u.id).findIndex(({id:S})=>S===C)}),c("Issue created",null)):i("Unable to determine ticket id")}return fn()},onSuccess:()=>I({mode:p.DEFAULT})},{intent:b.SetView,mode:p.COMMAND_LINE,action:()=>{let{commandMeta:e}=J();return e.validity===re.Invalid?i("Invalid command "+ee):(q(t=>({...t,viewMode:e.modifier==="wide"?"wide":e.modifier==="dense"?"dense":t.viewMode})),c("View set",null))},onSuccess:()=>I({mode:p.DEFAULT})},{intent:b.Rename,mode:p.COMMAND_LINE,action:()=>{let e=W();if(a(e))return i("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=y(),r=R(t.id)[n];if(!r)return i("Missing node");if(r.readonly)return i("Cannot rename readonly node");let o=ut();return o?$({id:F(),action:"edit.title",payload:{id:r.id,name:o},...e.data}):i("Provide a new name")},onSuccess:()=>I({mode:p.DEFAULT})},{intent:b.UntagTicket,mode:p.COMMAND_LINE,action:()=>{let e=W();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=J().commandMeta,r=(t||n).trim();if(!r)return i("Provide a tag");let o=Kr(r);if(!o)return i(`Tag "${r}" does not exist`);let{selectedNode:s}=y();if(!s)return i("Invalid untag target");let d=be(s.id,"TICKET");if(a(d))return i("Unable to untag issue in this context");let l=d.data,u=E.getFieldByTitle(l.id,"Tags");if(!u)return i("Unable to locate tags field");let v=R(u.id).find(f=>f.props?.value===o.id);return v?$({id:F(),action:"untag.issue",payload:{id:v.id,target:l.id,tagId:o.id},...e.data}):i("Issue is not tagged with that tag")},onSuccess:()=>I({mode:p.DEFAULT})},{intent:b.TagTicket,mode:p.COMMAND_LINE,action:()=>{let e=W();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=J().commandMeta,r=(t||n).trim();if(!r)return i("Provide a tag");let{selectedIndex:o,currentNode:s}=y(),d=R(s.id)[o];if(!d)return i("Invalid tag target");let l=be(d.id,"TICKET");if(a(l))return i("Unable to tag issue in this context");let u=l.data,v=Kr(r),f;if(v)f=v.id;else{let S=F(),M=$({id:F(),action:"create.tag",payload:{id:S,name:r},userId:e.data.userId,userName:e.data.userName});if(a(M))return M;f=M.data.result.id}let N=E.getFieldByTitle(u.id,"Tags");return N?R(N.id).some(S=>S.props?.value===f)?i("Already tagged with that tag"):$({id:F(),action:"tag.issue",payload:{id:F(),target:u.id,tagId:f},...e.data}):i("Unable to locate tags field")},onSuccess:()=>I({mode:p.DEFAULT})},{intent:b.AssignUserToTicket,mode:p.COMMAND_LINE,action:()=>{let e=W();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=J().commandMeta,r=(t||n).trim();if(!r)return i("Provide an assignee");let{selectedIndex:o,currentNode:s}=y(),d=R(s.id)[o];if(!d)return i("Invalid assign target");let l=be(d.id,"TICKET");if(a(l))return i("Unable to assign issue in this context");let u=l.data,v=Vr(r),f;if(v)f=v.id;else{let S=F(),M=$({id:F(),action:"create.contributor",payload:{id:S,name:r},userId:e.data.userId,userName:e.data.userName});if(a(M))return M;f=M.data.result.id}let N=E.getFieldByTitle(u.id,"Assignees");return N?R(N.id).some(S=>S.props?.value===f)?i("Assignee already assigned"):$({id:F(),action:"assign.issue",payload:{id:F(),target:u.id,contributor:f},...e.data}):i("Unable to locate assignees field")},onSuccess:()=>I({mode:p.DEFAULT})},{intent:b.UnassignUserFromTicket,mode:p.COMMAND_LINE,action:()=>{let e=W();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=J().commandMeta,r=(t||n).trim();if(!r)return i("Provide an assignee to remove");let o=Vr(r);if(!o)return i(`Assignee "${r}" does not exist`);let{selectedNode:s}=y();if(!s)return i("Invalid unassign target");let d=be(s.id,"TICKET");if(a(d))return i("Unable to unassign in this context");let l=d.data,u=E.getFieldByTitle(l.id,"Assignees");if(!u)return i("Unable to locate assignees field");let v=R(u.id).find(f=>f.props?.value===o.id);return v?$({id:F(),action:"unassign.issue",payload:{id:v.id,target:l.id,contributor:o.id},...e.data}):i(`Issue is not assigned to "${r}"`)},onSuccess:()=>I({mode:p.DEFAULT})},{intent:b.Sync,mode:p.COMMAND_LINE,action:async()=>{O(()=>""),I({syncStatus:{msg:"Syncing",status:"syncing"}});let{userId:e,userName:t}=oe();if(!e)return i("Unable to resolve userId");if(!t)return i("Unable to resolve userName");let n=Oe()?un():c("No pending default events",null);if(a(n))return i(`Unable to persist default events. ${n.message}`);let r=W();if(a(r)||!r.data)return i("Unable to resolve event log path");let o=He(r.data);logger.debug("[sync-command] pending defaults",Oe());let s=await At({ownEventFileName:o});if(a(s))return I({syncStatus:{msg:s.message,status:"outOfSync"}}),i(`Unable to sync state. ${s.message}`);I({syncStatus:{msg:"Synced",status:"synced"},mode:p.DEFAULT});let d=Ke();return a(d)?i("Unable to load events"):(Ee(d.data),c("Synced",!0))}},{intent:b.Peek,mode:p.COMMAND_LINE,action:async()=>{let e=ye(y().breadCrumb,"BOARD");if(a(e))return e;let t=Ke();if(a(t))return i(t.message);let n=t.data,{modifier:r}=J().commandMeta,o;if(r==="now"){let N=ln();if(a(N))return N;let C=Ee(n);return C.some(a)?i(C.map(S=>S.message).join(", ")):(I({mode:p.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),c("Peeking now",!0))}if(r==="prev"){let N=y().eventLog.at(-2),C=Bt(N);if(C===null)return i("No previous event to peek");o=C}else if(r==="next"){let N=y().unappliedEvents.at(0),C=Bt(N);if(C===null)return i("No next event to peek");o=C}else{let N=ct(r);if(!N)return i("Invalid peek date");o=N.getTime()}let s=e.data.id,{appliedEvents:d,unappliedEvents:l}=sr(n,o),u=ln();if(a(u))return u;let v=Ee(d);if(v.some(a))return i(v.map(N=>N.message).join(", "));let f=y().nodes[s];return f?(U.navigate({currentNode:f,selectedIndex:0}),I({mode:p.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:l}),c("Peeking ",!0)):i("Board did not exist at peek date")}}];var fs=new Set(["peek","filter","view-help"]),X=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=J();if(!t)return i("No command to confirm");if(!e&&n===re.Invalid)return i("Invalid command");let s=Gn(t);if(Vn(),y().readOnly&&!fs.has(s))return We({result:ee.Fail,message:"Command not available in readonly state",data:null});let d=jr.filter(u=>e||u.systemOnly!==!0).find(u=>u.intent===s);if(!d)return We({result:ee.Fail,message:"Command not found",data:null});let l=await d.action(d,{command:t,inputString:o,modifier:r});return a(l)?We(l):(jn({addToHistory:!e}),d.onSuccess?.(),We(l))};var Tt=[{intent:h.Exit,mode:p.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(I({mode:p.COMMAND_LINE}),O(()=>"move cancel"),X({isForceExecutedBySystem:!0}))},{intent:h.InitMove,mode:p.DEFAULT,description:"[m] move init/confirm",action:()=>(I({mode:p.COMMAND_LINE}),O(()=>"move start"),X({isForceExecutedBySystem:!0}))},{intent:h.ConfirmMove,mode:p.MOVE,action:()=>(I({mode:p.COMMAND_LINE}),O(()=>"move confirm"),X({isForceExecutedBySystem:!0}))}],Mt=[{intent:h.MovePreviousItem,mode:p.MOVE,action:()=>ge()?(I({mode:p.COMMAND_LINE}),O(()=>"move previous"),X({isForceExecutedBySystem:!0})):i("No pending move")},{intent:h.MoveNextItem,mode:p.MOVE,action:()=>ge()?(I({mode:p.COMMAND_LINE}),O(()=>"move next"),X({isForceExecutedBySystem:!0})):i("No pending move")}],zr=[{intent:h.MoveToNextContainer,mode:p.MOVE,action:()=>ge()?(I({mode:p.COMMAND_LINE}),O(()=>"move to-next"),X({isForceExecutedBySystem:!0})):i("No pending move")},{intent:h.MoveToPreviousContainer,mode:p.MOVE,action:()=>ge()?(I({mode:p.COMMAND_LINE}),O(()=>"move to-previous"),X({isForceExecutedBySystem:!0})):i("No pending move")}];var qr={[P.WORKSPACE]:[...Tt,...Mt],[P.BOARD]:[...Tt,...Mt],[P.SWIMLANE]:[...Tt,...Mt,...zr],[P.TICKET]:[],[P.FIELD]:[],[P.FIELD_LIST]:[],[P.TEXT]:[]};var Gr=[{intent:h.AddItem,mode:p.DEFAULT,description:"[n] new...",action:()=>(I({mode:p.COMMAND_LINE}),O(()=>`${m.NEW} `),c("Adding new item",null))},{intent:h.Delete,mode:p.DEFAULT,description:"[d] delete",action:()=>(I({mode:p.COMMAND_LINE}),O(()=>`${m.DELETE} `),c("Deleting item",null))},{intent:h.InitCommandLine,mode:p.DEFAULT,description:"[:] focus command line",action:()=>(I({mode:p.COMMAND_LINE}),O(()=>""),c("Entering command line mode",null))},{intent:h.Confirm,mode:p.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>(U.enterChildNode(),c("Entering context",null))},{intent:h.Exit,mode:p.DEFAULT,description:"[q] exit context",action:()=>(U.enterParentNode(),c("Exiting context",null))},{intent:h.NavPreviousItem,mode:p.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(U.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:h.NavNextItem,mode:p.DEFAULT,action:()=>(U.navigateToNextItem(),c("Navigating to next item",null))},{intent:h.NavToPreviousContainer,mode:p.DEFAULT,action:()=>(U.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:h.NavToNextContainer,mode:p.DEFAULT,action:()=>(U.navigateToNextContainer(),c("Navigating to next container",null))},{intent:h.Edit,mode:p.DEFAULT,action:()=>(I({mode:p.COMMAND_LINE}),O(()=>"edit"),X(),c("Fired command",!0))},{intent:h.SetViewDense,mode:p.DEFAULT,description:"[v] view change (wide/dense)",action:()=>(I({viewMode:"dense"}),c("View set",null))},{intent:h.SetViewWide,mode:p.DEFAULT,action:()=>(I({viewMode:"wide"}),c("View set",null))}];var Jr=[{intent:h.ViewHelp,mode:p.DEFAULT,action:()=>(I({mode:p.HELP}),c("Viewing help",null))},{intent:h.Exit,mode:p.HELP,action:()=>(I({mode:p.DEFAULT}),c("Exiting help",null))},{intent:h.Confirm,mode:p.COMMAND_LINE,action:()=>(X(),c("Executing command",null))},{intent:h.MoveCursorLeft,mode:p.COMMAND_LINE,action:()=>(jt(-1),c("Moving cursor left",null))},{intent:h.MoveCursorRight,mode:p.COMMAND_LINE,action:()=>(jt(1),c("Moving cursor right",null))},{intent:h.MoveCursorLeftOfWord,mode:p.COMMAND_LINE,action:()=>(zt("left"),c("Moving cursor left of word",null))},{intent:h.MoveCursorRightOfWord,mode:p.COMMAND_LINE,action:()=>(zt("right"),c("Moving cursor right of word",null))},{intent:h.ExitCommandLine,mode:p.COMMAND_LINE,action:()=>(I({mode:p.DEFAULT}),c("Exiting command line",null))},{intent:h.AutoCompleteCommand,mode:p.COMMAND_LINE,action:()=>(O((e,{remainder:t})=>t?e+t:e),c("Auto-completing command",null))},{intent:h.CaptureInput,mode:p.COMMAND_LINE,action:(e,{sequence:t})=>(O(n=>n+t),c("Capturing input",null))},{intent:h.EraseInput,mode:p.COMMAND_LINE,action:()=>(Hn(),c("Erasing input",null))},{intent:h.EraseInputWord,mode:p.COMMAND_LINE,action:()=>(Kn(),c("Erasing input word",null))},{intent:h.GetLastCommandFromHistory,mode:p.COMMAND_LINE,action:()=>(zn(),c("Getting last command from history",null))},{intent:h.GetNextCommandFromHistory,mode:p.COMMAND_LINE,action:()=>(qn(),c("Getting next command from history",null))}];import vs from"chalk";var Lt=": for command line",Yr="q to exit",Xr=`${vs.hex(Sn.accent)("m")} to confirm`,mn={[P.WORKSPACE]:[Lt],[P.BOARD]:[Lt],[P.BOARD+p.COMMAND_LINE]:[Lt],[P.SWIMLANE]:[Lt],[P.TICKET+p.HELP]:[Yr],[P.SWIMLANE+p.HELP]:[Yr],[P.TICKET]:[],[P.FIELD]:[],[P.SWIMLANE+p.MOVE]:[Xr],[P.TICKET+p.MOVE]:[Xr]};var Pt=e=>e.trim().toLocaleLowerCase(),ys=(e,t)=>{let n=E.getFieldByTitle(e,t);if(!n)return"";let r=n.props?.value;return typeof r=="string"?r:""},Es=e=>{let{tags:t}=y(),n=E.getFieldByTitle(e,"Tags");return n?H(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},Ns=e=>{let{contributors:t}=y(),n=E.getFieldByTitle(e,"Assignees");return n?H(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},Qr=(e,t)=>{let n=t.value;if(!n)return!0;switch(t.target){case"title":return Pt(e.title??"").includes(n);case"description":return Pt(ys(e.id,"Description")).includes(n);case"tag":return Es(e.id).map(Pt).some(l=>l.includes(n));case"assignee":return Ns(e.id).map(Pt).some(l=>l.includes(n));default:return!0}};function Zr(e,t,n){let r=t[e];if(!r)return i("buildBreadCrumb(): current node not found");let o=[],s=r;for(;s&&(o.push(s),!(s.id===n||!s.parentNodeId));)s=t[s.parentNodeId];let d=o[o.length-1];return!d||d.id!==n?i("buildBreadCrumb(): node is not connected to root"):(o.reverse(),c("Breadcrumb built",o))}var eo=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 Dt,pn,Is=new Set,to=()=>{for(let e of Is)e()};function no(e){let{currentNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:s}=e;if(!t)return i("derive(): currentNodeId is missing");if(!r)return i("derive(): rootNode is missing");if(!o[r])return i("derive(): unable to find root node");let l=o[t];if(!l)return logger.error("Unable to derive state, currentNode not found"),i("Unable to derive state, currentNode not found");let u=Zr(t,o,r);if(a(u))return logger.error(u.message),u;let v=u.data,{context:f}=l,N=mn[f+n]??mn[f]??[],C=[...Gr,...qr[f]??[],...Jr],S=eo(C),M=xs(o,s),j=M[t]?.[e.selectedIndex]??null;return c("Derived successfully",{...e,currentNode:l,breadCrumb:v,availableHints:N,availableActions:C,actionIndex:S,selectedNode:j,renderedChildrenIndex:M})}var y=()=>(Dt||logger.error("State not initialized. Call initWorkspaceState() first.",new Error().stack),Dt);function Jt(e){pn=e;let t={readOnly:!1,filters:[],tags:{},contributors:{},viewMode:"dense",mode:p.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,currentNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""},eventLog:[],unappliedEvents:[],timeMode:"live"},n=no(t);return a(n)?n:(Dt=n.data,to(),c("State initialized",null))}function q(e){let t=y(),n=e(t),r=no(n);return a(r)?i(r.message??"Unable to update state"):(Dt=r.data,to(),c("State updated",null))}var I=e=>q(t=>({...t,...e}));var xs=(e,t)=>{let n={};for(let r of Object.values(e))z(r)&&t.length>0&&!t.every(o=>Qr(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,s)=>{let d=e[o.id],l=e[s.id];return!d||!l?0:d.rank.localeCompare(l.rank)});return n},R=e=>y()?.renderedChildrenIndex[e]??[],ln=()=>pn?Jt(pn):i("Cannot reset state: no initial workspace found");var U={exit(){process.exit(0)},enterChildNode(){let e=y(),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}=y();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:d})=>d===e.id),s=r.length===0?-1:o>=0?o:0;U.navigate({currentNode:n,selectedIndex:s})},navigateToNextItem:()=>ro(1),navigateToPreviousItem:()=>ro(-1),navigateToNextContainer:()=>oo(1),navigateToPreviousContainer:()=>oo(-1),navigate:({currentNode:e=y().currentNode,selectedIndex:t})=>{I({currentNodeId:e.id,selectedIndex:t})}},ro=e=>{let t=y(),n=R(t.currentNode.id).length;if(n===0)return;let o=(Math.max(0,t.selectedIndex)+e+n)%n;U.navigate({selectedIndex:o})},oo=e=>{let{currentNode:t,nodes:n,selectedIndex:r}=y();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!t||!o)return;let s=R(o.id),d=s.findIndex(C=>C.id===t.id);if(d<0)return;let l=s.at(d+e)??s.at(0);if(!l)return;let u=R(l.id),v=Math.max(0,u.length-1),f=Math.min(Math.max(0,r),v),N=u.length?f:-1;U.navigate({currentNode:l,selectedIndex:N})};var ce="system",le="ACTOR",Je=bs(),ue=null;function Cs(){let e=Object.values(y().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=y().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:y().nodes[y().rootNodeId],selectedIndex:0}}function hs(){let e=Cs();U.navigate(e)}function Rs(){let e=Je(),t=Je(),n=Je(),r=Je(),o=Je();return[{id:de(),userId:ce,userName:le,action:"init.workspace",payload:{id:e,name:"Workspace"}},{id:de(),userId:ce,userName:le,action:"add.board",payload:{id:t,name:"Default",parent:e}},{id:de(),userId:ce,userName:le,action:"add.swimlane",payload:{id:n,name:"Todo",parent:t}},{id:de(),userId:ce,userName:le,action:"add.swimlane",payload:{id:r,name:"In progress",parent:t}},{id:de(),userId:ce,userName:le,action:"add.swimlane",payload:{id:o,name:"Done",parent:t}},{id:de(),userId:ce,userName:le,action:"add.board",payload:{id:It,name:"Closed",parent:e}},{id:de(),userId:ce,userName:le,action:"add.swimlane",payload:{id:Z,name:"Closed",parent:It}},{id:de(),userId:ce,userName:le,action:"lock.node",payload:{id:It}},{id:de(),userId:ce,userName:le,action:"lock.node",payload:{id:Z}}]}function Oe(){return ue!==null}function un(){if(!ue||ue.length===0)return ue=null,c("No pending default events to persist",null);let e=ue.map(t=>vt({event:t})).filter(a);return e.length>0?i([Pe.bold.red("Persisting default events failed"),"",...e.map((t,n)=>`${Pe.dim.gray(`${n+1}.`)} ${Pe.dim(t.message)}`),`
48
+ `,os=(e,t)=>{let n=new Map;for(let r of[...t,...e])n.set(nn(r),r);return[...n.values()].sort((r,o)=>{let s=Br(r)-Br(o);return s!==0?s:nn(r).localeCompare(nn(o))})},on=({sourceFile:e,targetFile:t})=>{let n=Nt(e);if(a(n))return i(n.message);let r=Nt(t);if(a(r))return i(r.message);let o=os(r.value,n.value),s=rs(o);return(ht.existsSync(t)?ht.readFileSync(t,"utf8"):"")===s?d("Event file already merged",!1):(ht.mkdirSync(rn.dirname(t),{recursive:!0}),ht.writeFileSync(t,s,"utf8"),d("Merged event file",!0))},Wr=({repoRoot:e,stateBranchRoot:t})=>{let n=wr(t);if(a(n))return i(n.message);let r=Ee(t),o=Ee(e),s=!1;for(let l of n.value){let c=rn.join(r,l),u=rn.join(o,l),g=on({sourceFile:c,targetFile:u});if(a(g))return i(g.message);s=s||g.value}return d("Hydrated event files from state branch",s)};var ss=({repoRoot:e,stateBranchRoot:t,ownEventFileName:n})=>{let r=en({root:e,fileName:n}),o=en({root:t,fileName:n});return is.existsSync(r)?on({sourceFile:r,targetFile:o}):d("Local own event file missing, nothing to merge",!1)},as=async({cwd:e,ensureUpstream:t})=>{let n=await Pr(e);if(a(n))return i(n.message);let r=n.value,o=Sr(r),s=await Fr(r);if(a(s))return i("Sync aborted. Unable to gitignore hydrated events");let l=await Yt(r);if(a(l))return i(l.message);if(l.value)return i("Cannot sync while a git operation is in progress in the current repo");let c=await kr(r);if(a(c))return i(c.message);let u=await _r({repoRoot:r,stateBranchRoot:o,ensureUpstream:t});if(a(u))return i(u.message);let g=await Yt(o);if(a(g))return i(g.message);if(g.value)return i("Cannot sync while a git operation is in progress in the state branch");let f=Tr(r,o);return a(f)?i(f.message):d("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:o,bootstrapped:u.value})},$r=async({repoRoot:e,stateBranchRoot:t,ownEventFileName:n})=>{let r=ss({repoRoot:e,stateBranchRoot:t,ownEventFileName:n});if(a(r))return i(r.message);let o=await yr(t);if(a(o))return i(o.message);if(!r.value&&!o.value)return d("Own event file already up to date in state branch",{createdCommit:!1});let s=await Or({stateBranchRoot:t,ownEventFileName:n});if(a(s))return i(s.message);let l=await Ur({repoRoot:e,stateBranchRoot:t});return a(l)?i(l.message):d("Merged, staged, and committed own event file",{createdCommit:!0,commitSha:l.value})},Ct=async({cwd:e=process.cwd(),ownEventFileName:t})=>{if(t.includes("/")||t.includes("\\"))return i("Own event file must be a file name, not a path");if(!t.endsWith(".jsonl"))return i("Own event file must end with .jsonl");let n=await as({cwd:e,ensureUpstream:!0});if(a(n))return n;let{repoRoot:r,stateBranchRoot:o,bootstrapped:s}=n.value,l=await Er(r);if(a(l))return i(l.message);if(l.value)return i("Cannot run :sync while the repository is in detached HEAD state");let c=!1,u,g=!1,f=!1,E=!1,C=await Qt({cwd:o,branch:P});if(a(C))return i(C.message);g=C.value;let b=Wr({repoRoot:r,stateBranchRoot:o});if(a(b))return i(b.message);E=b.value;let w=await $r({repoRoot:r,stateBranchRoot:o,ownEventFileName:t});if(a(w))return i(w.message);if(c=w.value.createdCommit,u=w.value.commitSha,c||s){let H=await tn(o),Je=H;if(a(H)&&Nr(H.message)){let gn=await Qt({cwd:o,branch:P});if(a(gn))return i(gn.message);let Ye=await $r({repoRoot:r,stateBranchRoot:o,ownEventFileName:t});if(a(Ye))return i(Ye.message);Ye.value.createdCommit&&(c=!0,u=Ye.value.commitSha),Je=await tn(o)}if(a(Je))return i(Je.message);f=Je.value,logger.debug("[sync] pushed to state branch",f)}else logger.debug("[sync] no commit created, skipped push");if(c){let H=await T({args:["rev-parse","HEAD"],cwd:o});if(a(H))return i(H.message);u=H.value.stdout.trim()}return d("Synced event logs with state branch",{repoRoot:r,stateBranchRoot:o,createdCommit:c,commitSha:u,pulled:g,pushed:f,hydrated:E,bootstrapped:s})};import{ulid as Hr}from"ulid";var Te=null,fe=()=>structuredClone(Te),Me=e=>Te=e,Kr=()=>{let{currentNode:e,selectedIndex:t}=N(),r=h(e.id)[t];return r?d("Resolved selected child",r):i("Target node not found")};function sn(e){let t=Kr();if(a(t))return t;let{currentNode:n,nodes:r}=N();if(!n.parentNodeId)return i("Missing parent node id");let o=r[n.parentNodeId];if(!o)return i("Missing parent node");let s=K(o.id),l=s.findIndex(({id:C})=>C===n.id);if(l<0)return i("Current node not found among siblings");let c=s[l+e];if(!c)return i("Missing sibling node");let u=W();if(a(u))return i("Unable to resolve user ID");let{userId:g,userName:f}=u.value;if(Me({id:Hr(),userId:g,userName:f,action:"move.node",payload:{id:t.value.id,parent:c.id,pos:{at:"end"}}}),!Te)return i("Could not materialize move state");let E=Re(Te,!0);return a(E)?E:d("Node moved successfully",E.value)}function an(e){let t=Kr();if(a(t))return t;let{currentNode:n,selectedIndex:r}=N(),s=K(n.id)[r+e];if(!s)return i("Missing sibling node");let l=W();if(a(l))return i("Unable to resolve user ID");let{userId:c,userName:u}=l.value;if(Me({id:Hr(),userId:c,userName:u,action:"move.node",payload:{id:t.value.id,parent:n.id,pos:{at:e===1?"after":"before",sibling:s.id}}}),!Te)return i("Could not materialize move state");let g=Re(Te,!0);return a(g)?g:d("Node moved successfully",g.value)}import ds from"node:os";import Vr from"node:path";import{z as Ge}from"zod";var ls={userId:"",userName:"",preferredEditor:"",autoSync:!1},jr=Ge.object({preferredEditor:Ge.string().optional(),userName:Ge.string().optional(),userId:Ge.string().optional(),autoSync:Ge.boolean().optional()}).strict(),cs="config.json",zr=()=>Vr.join(ds.homedir(),Y),dn=()=>Vr.join(zr(),cs),ln=()=>{try{return q.mkDir(zr()),d(`Ensured ~/${Y} exists`,null)}catch{return i(`Unable to create ~/${Y}`)}},us=e=>{let t;try{t=JSON.parse(e)}catch{return i(`Invalid ~/${Y}/config.json JSON`)}let n=jr.safeParse(t??{});return n.success?d("Parsed config",n.data):i(`Invalid ~/${Y}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},Gr=()=>{let e=ln();if(a(e))return i(e.message);let t=dn(),n=q.readFile(t);return n==null||n.trim()===""?d("No config found, using empty config",{autoSync:!1,preferredEditor:"",userId:"",userName:""}):us(n)},qr=e=>{let t=ln();if(a(t))return i(t.message);let n=jr.safeParse(e);if(!n.success)return i(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=dn();try{return q.writeToFile(r,JSON.stringify(n.data,null,2)+`
49
+ `),d("Config written",null)}catch{return i(`Unable to write ~/${Y}/config.json`)}},bt=e=>{let t=Gr();if(a(t))return i("Failed to read existing config");let n={...t.value,...e};return qr(n)},Jr=()=>{let e=dn(),t=ln();if(a(t))return i(`Unable to create ~/${Y}`);if(!(q.readFile(e)!==null)){let u=qr(ls);if(a(u))throw new Error(`Unable to create ~/${Y}/config.json`)}let r=Gr();if(a(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:s,userId:l,autoSync:c}=r.value;return!s||!l?i(`User name or ID not configured in ~/${Y}/config.json`):d("successfully loaded settings",{preferredEditor:o??"",userName:s,userId:l,autoSync:c??!1})};var Xr=()=>{let{currentNode:e,selectedIndex:t}=N(),n=h(e.id)[t];return{currentNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:n?.parentNodeId??null,selectedIndex:t}},Yr=(e,t)=>Math.max(0,Math.min(e,Math.max(0,t-1))),Zr=e=>{let{nodes:t}=N(),n=t[e.currentNodeId];if(n&&!n.isDeleted&&e.selectedNodeId){let s=h(n.id).findIndex(l=>l.id===e.selectedNodeId);if(s>=0)return L.navigate({currentNode:n,selectedIndex:s}),d("Restored navigation",null)}if(e.selectedNodeId){let o=t[e.selectedNodeId];if(o&&!o.isDeleted&&o.parentNodeId){let s=t[o.parentNodeId];if(s&&!s.isDeleted){let l=h(s.id).findIndex(c=>c.id===o.id);if(l>=0)return L.navigate({currentNode:s,selectedIndex:l}),d("Restored navigation to moved node",null)}}}if(n&&!n.isDeleted){let o=h(n.id);return L.navigate({currentNode:n,selectedIndex:Yr(e.selectedIndex,o.length)}),d("Restored navigation to previous container",null)}if(e.parentNodeId){let o=t[e.parentNodeId];if(o&&!o.isDeleted){let s=h(o.id);return L.navigate({currentNode:o,selectedIndex:Yr(e.selectedIndex,s.length)}),d("Restored navigation to parent",null)}}let r=t[N().rootNodeId];return!r||r.isDeleted?i("Unable to restore navigation"):(L.navigate({currentNode:r,selectedIndex:0}),d("Restored navigation to root",null))};var Qr=e=>Object.values(N().tags).find(t=>t.name===e),eo=e=>Object.values(N().contributors).find(t=>t.name===e),to=[{systemOnly:!0,intent:x.Move,mode:p.COMMAND_LINE,action:()=>{let e=W();if(a(e))return i("Unable to resolve user ID");let{modifier:t}=G().commandMeta,n=()=>{let c=fe();if(!c)return i("No pending move state");let u=c.payload.id;if(!N().nodes[u])return i("Moved node not found");let f=c.payload.parent,E=N().nodes[f];if(!E)return i("Move parent not found");let C=h(f).findIndex(b=>b.id===u);return C===-1?i("Moved node not found among rendered children"):(L.navigate({currentNode:E,selectedIndex:C}),d("Synchronized navigation to moved node",null))},r=c=>{if(a(c))return i(c.message);let u=n();return a(u)?i(u.message):d("Updated move preview",null)},{currentNode:o,selectedIndex:s}=N(),l=h(o.id)[s];if(!l)return I({mode:p.DEFAULT}),i("No move target");if(t==="start"){if(l.readonly)return i("Target node is read-only");if(s===-1)return i("No item selected");if(!l.parentNodeId)return i("Target has no parent");let c=h(l.parentNodeId),u=c.findIndex(({id:b})=>b===l.id);if(u===-1)return i("Target not found among siblings");let g=c[u-1],f=c[u+1],E=f!=null?{at:"before",sibling:f.id}:g!=null?{at:"after",sibling:g.id}:{at:"start"};Me({id:F(),action:"move.node",payload:{id:l.id,parent:l.parentNodeId,pos:E},...e.value}),I({mode:p.MOVE});let C=n();return a(C)?i(C.message):d("Move initialized",null)}if(t==="next")return I({mode:p.MOVE}),r(an(1));if(t==="previous")return I({mode:p.MOVE}),r(an(-1));if(t==="to-next")return I({mode:p.MOVE}),r(sn(1));if(t==="to-previous")return I({mode:p.MOVE}),r(sn(-1));if(t==="confirm"){I({mode:p.DEFAULT});let c=fe();if(!c)return i("No pending move to confirm");let u=$(c);if(a(u))return u;let g=n();return a(g)?i(g.message):(Me(null),d("Moved item",null))}return t==="cancel"?(Me(null),I({mode:p.DEFAULT}),d("Cancelling move",null)):i("Invalid move modifier")}},{intent:x.Delete,mode:p.COMMAND_LINE,action:()=>{let e=W();if(a(e))return i("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=N(),r=h(t.id)[n];return r?$({id:F(),action:"delete.node",payload:{id:r.id},...e.value}):i("Unable to resolve child to delete")},onSuccess:()=>I({mode:p.DEFAULT})},{intent:x.Edit,mode:p.COMMAND_LINE,action:()=>{let e=W();if(a(e))return i("Unable to resolve user ID");let t=Ne(N().breadCrumb,"TICKET");if(a(t))return i("Edit target must be an issue");let n=t.value;if(n.readonly)return i("Cannot edit readonly field");let{currentNode:r,selectedIndex:o}=N();if(!h(n.id)[o])return i("No selected field");let l=h(r.id)[o];if(!l)return i("No selected field");if(l.readonly)return i("Cannot edit readonly field");let c=l.props.value;if(typeof c!="string")return i("Selected field is not editable text");let u=Zn(c);if(a(u))return i("Failed to edit field");let g=u.value;return g===c?d("No changes made",null):l.title==="Description"?$({id:F(),action:"edit.description",payload:{id:l.id,md:g},...e.value}):l.title==="Title"?$({id:F(),action:"edit.title",payload:{id:l.id,name:g},...e.value}):i(`Editing not supported for "${l.title}"`)},onSuccess:()=>I({mode:p.DEFAULT})},{intent:x.Filter,mode:p.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=G().commandMeta,n=/(!=|=)/,[r,o]=e.split(n);if(!r||!(c=>U(m.FILTER).map(u=>u.split(n)[0]).includes(c))(r))return i("Invalid filter modifier");let l={target:r,operator:"=",value:t.trim()};return j(c=>({...c,filters:e==="clear"?[]:[...c.filters,l],mode:p.DEFAULT})),d("Viewing help",null)}},{intent:x.ViewHelp,mode:p.COMMAND_LINE,action:()=>(I({mode:p.HELP}),d("Viewing help",null))},{intent:x.CloseIssue,mode:p.COMMAND_LINE,action:()=>{let e=W();if(a(e))return i("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=N(),r=h(t.id)[n];if(!r)return i("Unable to close issue, no target found");if(!r.parentNodeId)return i("No target parent found");if(!V(r))return i("Cannot close in this context");let o=$({id:F(),action:"close.issue",payload:{id:r.id,parent:r.parentNodeId},...e.value});return a(o)?o:d("Viewing help",null)}},{intent:x.ReopenIssue,mode:p.COMMAND_LINE,action:()=>{let e=W();if(a(e))return i("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=N(),r=h(t.id)[n];if(!r)return i("Unable to reopen issue, no target found");let o=r.context==="TICKET"?d("Resolved ticket",r):he(r.id,"TICKET");if(a(o))return i("Cannot reopen in this context");let s=o.value,l=$({id:F(),action:"reopen.issue",payload:{id:s.id},...e.value});return a(l)?l:d("Issue reopened",null)},onSuccess:()=>I({mode:p.DEFAULT})},{intent:x.SetUserName,mode:p.COMMAND_LINE,action:()=>{let{userId:e,preferredEditor:t,userName:n}=ie(),r=ut()?.trim();if(!r)return i("No username provided");let o=r??n,s=e??F();if(!o||!s)return i("Unable to resolve user name or id");let l=bt({userName:o,userId:s,preferredEditor:t??""});return a(l)?l:(it({userName:o,userId:s}),I({mode:p.DEFAULT}),d(`Username set to "${r}"`,null))}},{intent:x.Init,mode:p.COMMAND_LINE,action:()=>{let e=un();if(a(e))return e;let{rootNodeId:t,nodes:n}=N();return L.navigate({currentNode:n[t],selectedIndex:0}),I({mode:p.DEFAULT}),d("Project initialized",null)}},{intent:x.SetEditor,mode:p.COMMAND_LINE,action:()=>{let e=ut()?.trim();if(!e)return i("No editor provided");let t=bt({preferredEditor:e});return a(t)?t:(it({preferredEditor:e}),I({mode:p.DEFAULT}),d(`Editor configuration set to "${e}"`,null))}},{intent:x.SetAutoSync,mode:p.COMMAND_LINE,action:()=>{let e=G().commandMeta.modifier;if(e!=="true"&&e!=="false")return i("Invalid response");let t=e.toLowerCase()==="true",n=bt({autoSync:t});return a(n)?n:(it({autoSync:t}),I({mode:p.DEFAULT}),d(`Auto synchronization set to "${t}"`,null))}},{intent:x.NewItem,mode:p.COMMAND_LINE,action:(e,t)=>{let n=W();if(a(n))return i("Unable to resolve user ID");if(!t.inputString)return i(`provide a name for your ${t.modifier}`);let{breadCrumb:r,currentNode:o,selectedIndex:s}=N(),l=c=>{let u=$(c);if(a(u))return u;let g=y.getNode(u.value.result.id);if(!g)return i("Created node not found");if(!g.parentNodeId)return u;let f=y.getNode(g.parentNodeId);return f?(L.navigate({currentNode:f,selectedIndex:y.getSiblings(g.parentNodeId).findIndex(({id:E})=>E===g.id)}),u):i("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:c}=N(),u=y.getNode(c);return u?l({id:F(),action:"add.board",payload:{id:F(),name:t.inputString,parent:u.id},...n.value}):i("Workspace not found")}if(t.modifier==="swimlane"){let c=Ne(r,"BOARD");return a(c)?i("Unable to add swimlane in this context"):l({id:F(),action:"add.swimlane",payload:{id:F(),name:t.inputString,parent:c.value.id},...n.value})}if(t.modifier==="issue"){let c=h(o.id)[s],u=o.context==="SWIMLANE"?o:o.context==="BOARD"&&c?.context==="SWIMLANE"?c:(()=>{let b=Ne(r,"SWIMLANE");return a(b)?null:b.value})();if(!u)return i("Unable to add issue in this context");let g=Qe({name:t.inputString,parent:u.id,user:n.value}),f=Ae(g);if(f.some(b=>a(b)))return i("Issue create failed: "+f.filter(a).map(b=>b.message).filter(Boolean).join(", "));let E=f[0];if(!E||a(E))return i("Issue creation failed");let C=g[0]?.payload.id;return C?(L.navigate({currentNode:u,selectedIndex:y.getSiblings(u.id).findIndex(({id:b})=>b===C)}),d("Issue created",null)):i("Unable to determine ticket id")}return d("Success",null)},onSuccess:()=>I({mode:p.DEFAULT})},{intent:x.SetView,mode:p.COMMAND_LINE,action:()=>{let{commandMeta:e}=G();return e.validity===se.Invalid?i("Invalid command "+oe):(j(t=>({...t,viewMode:e.modifier==="wide"?"wide":e.modifier==="dense"?"dense":t.viewMode})),d("View set",null))},onSuccess:()=>I({mode:p.DEFAULT})},{intent:x.Rename,mode:p.COMMAND_LINE,action:()=>{let e=W();if(a(e))return i("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=N(),r=h(t.id)[n];if(!r)return i("Missing node");if(r.readonly)return i("Cannot rename readonly node");let o=ut();return o?$({id:F(),action:"edit.title",payload:{id:r.id,name:o},...e.value}):i("Provide a new name")},onSuccess:()=>I({mode:p.DEFAULT})},{intent:x.UntagTicket,mode:p.COMMAND_LINE,action:()=>{let e=W();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=G().commandMeta,r=(t||n).trim();if(!r)return i("Provide a tag");let o=Qr(r);if(!o)return i(`Tag "${r}" does not exist`);let{selectedNode:s}=N();if(!s)return i("Invalid untag target");let l=he(s.id,"TICKET");if(a(l))return i("Unable to untag issue in this context");let c=l.value,u=y.getFieldByTitle(c.id,"Tags");if(!u)return i("Unable to locate tags field");let g=h(u.id).find(f=>f.props?.value===o.id);return g?$({id:F(),action:"untag.issue",payload:{id:g.id,target:c.id,tagId:o.id},...e.value}):i("Issue is not tagged with that tag")},onSuccess:()=>I({mode:p.DEFAULT})},{intent:x.TagTicket,mode:p.COMMAND_LINE,action:()=>{let e=W();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=G().commandMeta,r=(t||n).trim();if(!r)return i("Provide a tag");let{selectedIndex:o,currentNode:s}=N(),l=h(s.id)[o];if(!l)return i("Invalid tag target");let c=he(l.id,"TICKET");if(a(c))return i("Unable to tag issue in this context");let u=c.value,g=Qr(r),f;if(g)f=g.id;else{let b=F(),w=$({id:F(),action:"create.tag",payload:{id:b,name:r},userId:e.value.userId,userName:e.value.userName});if(a(w))return w;f=w.value.result.id}let E=y.getFieldByTitle(u.id,"Tags");return E?h(E.id).some(b=>b.props?.value===f)?i("Already tagged with that tag"):$({id:F(),action:"tag.issue",payload:{id:F(),target:u.id,tagId:f},...e.value}):i("Unable to locate tags field")},onSuccess:()=>I({mode:p.DEFAULT})},{intent:x.AssignUserToTicket,mode:p.COMMAND_LINE,action:()=>{let e=W();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=G().commandMeta,r=(t||n).trim();if(!r)return i("Provide an assignee");let{selectedIndex:o,currentNode:s}=N(),l=h(s.id)[o];if(!l)return i("Invalid assign target");let c=he(l.id,"TICKET");if(a(c))return i("Unable to assign issue in this context");let u=c.value,g=eo(r),f;if(g)f=g.id;else{let b=F(),w=$({id:F(),action:"create.contributor",payload:{id:b,name:r},userId:e.value.userId,userName:e.value.userName});if(a(w))return w;f=w.value.result.id}let E=y.getFieldByTitle(u.id,"Assignees");return E?h(E.id).some(b=>b.props?.value===f)?i("Assignee already assigned"):$({id:F(),action:"assign.issue",payload:{id:F(),target:u.id,contributor:f},...e.value}):i("Unable to locate assignees field")},onSuccess:()=>I({mode:p.DEFAULT})},{intent:x.UnassignUserFromTicket,mode:p.COMMAND_LINE,action:()=>{let e=W();if(a(e))return i("Unable to resolve user ID");let{modifier:t,inputString:n}=G().commandMeta,r=(t||n).trim();if(!r)return i("Provide an assignee to remove");let o=eo(r);if(!o)return i(`Assignee "${r}" does not exist`);let{selectedNode:s}=N();if(!s)return i("Invalid unassign target");let l=he(s.id,"TICKET");if(a(l))return i("Unable to unassign in this context");let c=l.value,u=y.getFieldByTitle(c.id,"Assignees");if(!u)return i("Unable to locate assignees field");let g=h(u.id).find(f=>f.props?.value===o.id);return g?$({id:F(),action:"unassign.issue",payload:{id:g.id,target:c.id,contributor:o.id},...e.value}):i(`Issue is not assigned to "${r}"`)},onSuccess:()=>I({mode:p.DEFAULT})},{intent:x.Sync,mode:p.COMMAND_LINE,action:async()=>{let e=Xr();k(()=>""),I({syncStatus:{msg:"Syncing",status:"syncing"}});let{userId:t,userName:n}=ie();if(!t)return i("Unable to resolve userId");if(!n)return i("Unable to resolve userName");let r=De()?un():d("No pending default events",null);if(a(r))return i(`Unable to persist default events. ${r.message}`);let o=W();if(a(o)||!o.value)return i("Unable to resolve event log path");let s=$e(o.value);logger.debug("[sync-command] pending defaults",De());let l=await Ct({ownEventFileName:s});if(a(l))return I({syncStatus:{msg:l.message,status:"outOfSync"}}),i(`Unable to sync state. ${l.message}`);I({syncStatus:{msg:"Synced",status:"synced"},mode:p.DEFAULT});let c=re(process.cwd());if(a(c))throw new Error(c.message);let u=He(c.value);if(a(u))return i("Unable to load events");ye(u.value);let g=Zr(e);return a(g)?g:d("Synced",!0)}},{intent:x.Peek,mode:p.COMMAND_LINE,action:async()=>{let e=Ne(N().breadCrumb,"BOARD");if(a(e))return e;let t=re(process.cwd());if(a(t))throw new Error(t.message);let n=He(t.value);if(a(n))return i(n.message);let r=n.value,{modifier:o}=G().commandMeta,s;if(o==="now"){let C=cn();if(a(C))return C;let b=ye(r);return b.some(a)?i(b.map(w=>w.message).join(", ")):(I({mode:p.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),d("Peeking now",!0))}if(o==="prev"){let C=N().eventLog.at(-2),b=Dt(C);if(b===null)return i("No previous event to peek");s=b}else if(o==="next"){let C=N().unappliedEvents.at(0),b=Dt(C);if(b===null)return i("No next event to peek");s=b}else{let C=lt(o);if(!C)return i("Invalid peek date");s=C.getTime()}let l=e.value.id,{appliedEvents:c,unappliedEvents:u}=ir(r,s),g=cn();if(a(g))return g;let f=ye(c);if(f.some(a))return i(f.map(C=>C.message).join(", "));let E=N().nodes[l];return E?(L.navigate({currentNode:E,selectedIndex:0}),I({mode:p.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:u}),d("Peeking ",!0)):i("Board did not exist at peek date")}}];var ms=new Set(["peek","filter","view-help"]),Q=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=G();if(!t)return i("No command to confirm");if(!e&&n===se.Invalid)return i("Invalid command");let s=Gn(t);if(Kn(),N().readOnly&&!ms.has(s))return Ue({status:oe.Fail,message:"Command not available in readonly state",value:null});let l=to.filter(u=>e||u.systemOnly!==!0).find(u=>u.intent===s);if(!l)return Ue({status:oe.Fail,message:"Command not found",value:null});let c=await l.action(l,{command:t,inputString:o,modifier:r});return a(c)?Ue(c):(Vn({addToHistory:!e}),l.onSuccess?.(),Ue(c))};var St=[{intent:S.Exit,mode:p.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(I({mode:p.COMMAND_LINE}),k(()=>"move cancel"),Q({isForceExecutedBySystem:!0}))},{intent:S.InitMove,mode:p.DEFAULT,description:"[m] move init/confirm",action:()=>(I({mode:p.COMMAND_LINE}),k(()=>"move start"),Q({isForceExecutedBySystem:!0}))},{intent:S.ConfirmMove,mode:p.MOVE,action:()=>(I({mode:p.COMMAND_LINE}),k(()=>"move confirm"),Q({isForceExecutedBySystem:!0}))}],Rt=[{intent:S.MovePreviousItem,mode:p.MOVE,action:()=>fe()?(I({mode:p.COMMAND_LINE}),k(()=>"move previous"),Q({isForceExecutedBySystem:!0})):i("No pending move")},{intent:S.MoveNextItem,mode:p.MOVE,action:()=>fe()?(I({mode:p.COMMAND_LINE}),k(()=>"move next"),Q({isForceExecutedBySystem:!0})):i("No pending move")}],no=[{intent:S.MoveToNextContainer,mode:p.MOVE,action:()=>fe()?(I({mode:p.COMMAND_LINE}),k(()=>"move to-next"),Q({isForceExecutedBySystem:!0})):i("No pending move")},{intent:S.MoveToPreviousContainer,mode:p.MOVE,action:()=>fe()?(I({mode:p.COMMAND_LINE}),k(()=>"move to-previous"),Q({isForceExecutedBySystem:!0})):i("No pending move")}];var ro={[M.WORKSPACE]:[...St,...Rt],[M.BOARD]:[...St,...Rt],[M.SWIMLANE]:[...St,...Rt,...no],[M.TICKET]:[],[M.FIELD]:[],[M.FIELD_LIST]:[],[M.TEXT]:[]};var oo=[{intent:S.AddItem,mode:p.DEFAULT,description:"[n] new...",action:()=>(I({mode:p.COMMAND_LINE}),k(()=>`${m.NEW} `),d("Adding new item",null))},{intent:S.Delete,mode:p.DEFAULT,description:"[d] delete",action:()=>(I({mode:p.COMMAND_LINE}),k(()=>`${m.DELETE} `),d("Deleting item",null))},{intent:S.InitCommandLine,mode:p.DEFAULT,description:"[:] focus command line",action:()=>(I({mode:p.COMMAND_LINE}),k(()=>""),d("Entering command line mode",null))},{intent:S.Confirm,mode:p.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>(L.enterChildNode(),d("Entering context",null))},{intent:S.Exit,mode:p.DEFAULT,description:"[q] exit context",action:()=>(L.enterParentNode(),d("Exiting context",null))},{intent:S.NavPreviousItem,mode:p.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(L.navigateToPreviousItem(),d("Navigating to previous item",null))},{intent:S.NavNextItem,mode:p.DEFAULT,action:()=>(L.navigateToNextItem(),d("Navigating to next item",null))},{intent:S.NavToPreviousContainer,mode:p.DEFAULT,action:()=>(L.navigateToPreviousContainer(),d("Navigating to previous container",null))},{intent:S.NavToNextContainer,mode:p.DEFAULT,action:()=>(L.navigateToNextContainer(),d("Navigating to next container",null))},{intent:S.Edit,mode:p.DEFAULT,action:()=>(I({mode:p.COMMAND_LINE}),k(()=>"edit"),Q(),d("Fired command",!0))},{intent:S.SetViewDense,mode:p.DEFAULT,description:"[v] view change (wide/dense)",action:()=>(I({viewMode:"dense"}),d("View set",null))},{intent:S.SetViewWide,mode:p.DEFAULT,action:()=>(I({viewMode:"wide"}),d("View set",null))}];var ps=500,gs=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),io=e=>{let t=gs(e);t&&k(n=>(n+t).slice(0,ps))};var so=[{intent:S.ViewHelp,mode:p.DEFAULT,action:()=>(I({mode:p.HELP}),d("Viewing help",null))},{intent:S.Exit,mode:p.HELP,action:()=>(I({mode:p.DEFAULT}),d("Exiting help",null))},{intent:S.Confirm,mode:p.COMMAND_LINE,action:()=>(Q(),d("Executing command",null))},{intent:S.MoveCursorLeft,mode:p.COMMAND_LINE,action:()=>(Bt(-1),d("Moving cursor left",null))},{intent:S.MoveCursorRight,mode:p.COMMAND_LINE,action:()=>(Bt(1),d("Moving cursor right",null))},{intent:S.MoveCursorLeftOfWord,mode:p.COMMAND_LINE,action:()=>(Wt("left"),d("Moving cursor left of word",null))},{intent:S.MoveCursorRightOfWord,mode:p.COMMAND_LINE,action:()=>(Wt("right"),d("Moving cursor right of word",null))},{intent:S.ExitCommandLine,mode:p.COMMAND_LINE,action:()=>(I({mode:p.DEFAULT}),d("Exiting command line",null))},{intent:S.AutoCompleteCommand,mode:p.COMMAND_LINE,action:()=>(k((e,{remainder:t})=>t?e+t:e),d("Auto-completing command",null))},{intent:S.CaptureInput,mode:p.COMMAND_LINE,action:(e,{sequence:t})=>(io(t??""),d("Capturing input",null))},{intent:S.EraseInput,mode:p.COMMAND_LINE,action:()=>($n(),d("Erasing input",null))},{intent:S.EraseInputWord,mode:p.COMMAND_LINE,action:()=>(Hn(),d("Erasing input word",null))},{intent:S.GetLastCommandFromHistory,mode:p.COMMAND_LINE,action:()=>(jn(),d("Getting last command from history",null))},{intent:S.GetNextCommandFromHistory,mode:p.COMMAND_LINE,action:()=>(zn(),d("Getting next command from history",null))}];import fs from"chalk";var At=": for command line",ao="q to exit",lo=`${fs.hex(Sn.accent)("m")} to confirm`,mn={[M.WORKSPACE]:[At],[M.BOARD]:[At],[M.BOARD+p.COMMAND_LINE]:[At],[M.SWIMLANE]:[At],[M.TICKET+p.HELP]:[ao],[M.SWIMLANE+p.HELP]:[ao],[M.TICKET]:[],[M.FIELD]:[],[M.SWIMLANE+p.MOVE]:[lo],[M.TICKET+p.MOVE]:[lo]};var wt=e=>e.trim().toLocaleLowerCase(),vs=(e,t)=>{let n=y.getFieldByTitle(e,t);if(!n)return"";let r=n.props?.value;return typeof r=="string"?r:""},Ns=e=>{let{tags:t}=N(),n=y.getFieldByTitle(e,"Tags");return n?K(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},ys=e=>{let{contributors:t}=N(),n=y.getFieldByTitle(e,"Assignees");return n?K(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},co=(e,t)=>{let n=t.value;if(!n)return!0;switch(t.target){case"title":return wt(e.title??"").includes(n);case"description":return wt(vs(e.id,"Description")).includes(n);case"tag":return Ns(e.id).map(wt).some(c=>c.includes(n));case"assignee":return ys(e.id).map(wt).some(c=>c.includes(n));default:return!0}};function uo(e,t,n){let r=t[e];if(!r)return i("buildBreadCrumb(): current node not found");let o=[],s=r;for(;s&&(o.push(s),!(s.id===n||!s.parentNodeId));)s=t[s.parentNodeId];let l=o[o.length-1];return!l||l.id!==n?i("buildBreadCrumb(): node is not connected to root"):(o.reverse(),d("Breadcrumb built",o))}var mo=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 Tt,pn,Es=new Set,po=()=>{for(let e of Es)e()};function go(e){let{currentNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:s}=e;if(!t)return i("derive(): currentNodeId is missing");if(!r)return i("derive(): rootNode is missing");if(!o[r])return i("derive(): unable to find root node");let c=o[t];if(!c)return i("Unable to derive state, currentNode not found");let u=uo(t,o,r);if(a(u))return logger.error(u.message),u;let g=u.value,{context:f}=c,E=mn[f+n]??mn[f]??[],C=[...oo,...ro[f]??[],...so],b=mo(C),w=Is(o,s),H=w[t]?.[e.selectedIndex]??null;return d("Derived successfully",{...e,currentNode:c,breadCrumb:g,availableHints:E,availableActions:C,actionIndex:b,selectedNode:H,renderedChildrenIndex:w})}var N=()=>(Tt||logger.error("State not initialized. Call initWorkspaceState() first.",new Error().stack),Tt);function zt(e){pn=e;let t={readOnly:!1,filters:[],tags:{},contributors:{},viewMode:"dense",mode:p.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,currentNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""},eventLog:[],unappliedEvents:[],timeMode:"live"},n=go(t);return a(n)?n:(Tt=n.value,po(),d("State initialized",null))}function j(e){let t=N(),n=e(t),r=go(n);return a(r)?i(r.message??"Unable to update state"):(Tt=r.value,po(),d("State updated",null))}var I=e=>j(t=>({...t,...e}));var Is=(e,t)=>{let n={};for(let r of Object.values(e))V(r)&&t.length>0&&!t.every(o=>co(r,o))||!r.parentNodeId||r.isDeleted||((!r.parentNodeId||!n[r.parentNodeId])&&(n[r.parentNodeId]=[]),n[r.parentNodeId].push(r));for(let r of Object.keys(n))n[r].sort((o,s)=>{let l=e[o.id],c=e[s.id];return!l||!c?0:l.rank.localeCompare(c.rank)});return n},h=e=>N()?.renderedChildrenIndex[e]??[],cn=()=>pn?zt(pn):i("Cannot reset state: no initial workspace found");var L={exit(){process.exit(0)},enterChildNode(){let e=N(),t=e.currentNode,n=Math.max(0,e.selectedIndex),r=h(t.id)[n];!r||t.context==="FIELD"||L.navigate({currentNode:r,selectedIndex:h(r.id).length?0:-1})},enterParentNode(){let{currentNode:e,nodes:t}=N();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=h(n.id),o=r.findIndex(({id:l})=>l===e.id),s=r.length===0?-1:o>=0?o:0;L.navigate({currentNode:n,selectedIndex:s})},navigateToNextItem:()=>fo(1),navigateToPreviousItem:()=>fo(-1),navigateToNextContainer:()=>vo(1),navigateToPreviousContainer:()=>vo(-1),navigate:({currentNode:e=N().currentNode,selectedIndex:t})=>{I({currentNodeId:e.id,selectedIndex:t})}},fo=e=>{let t=N(),n=h(t.currentNode.id).length;if(n===0)return;let o=(Math.max(0,t.selectedIndex)+e+n)%n;L.navigate({selectedIndex:o})},vo=e=>{let{currentNode:t,nodes:n,selectedIndex:r}=N();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!t||!o)return;let s=h(o.id),l=s.findIndex(C=>C.id===t.id);if(l<0)return;let c=s.at(l+e)??s.at(0);if(!c)return;let u=h(c.id),g=Math.max(0,u.length-1),f=Math.min(Math.max(0,r),g),E=u.length?f:-1;L.navigate({currentNode:c,selectedIndex:E})};var le="system",ce="ACTOR",qe=xs(),ue=null;function hs(){let e=Object.values(N().nodes).find(r=>r.context==="WORKSPACE");if(!e)throw new Error("No workspace found in event log");let[t]=h(e.id),[n]=t?h(t.id):[];if(logger.debug("Boot navigation target:",{workspace:e?.id,firstBoard:t?.id,firstSwimlane:n?.id}),n){let r=N().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:N().nodes[N().rootNodeId],selectedIndex:0}}function Cs(){let e=hs();L.navigate(e)}function bs(){let e=qe(),t=qe(),n=qe(),r=qe(),o=qe();return[{id:de(),userId:le,userName:ce,action:"init.workspace",payload:{id:e,name:"Workspace"}},{id:de(),userId:le,userName:ce,action:"add.board",payload:{id:t,name:"Default",parent:e}},{id:de(),userId:le,userName:ce,action:"add.swimlane",payload:{id:n,name:"Todo",parent:t}},{id:de(),userId:le,userName:ce,action:"add.swimlane",payload:{id:r,name:"In progress",parent:t}},{id:de(),userId:le,userName:ce,action:"add.swimlane",payload:{id:o,name:"Done",parent:t}},{id:de(),userId:le,userName:ce,action:"add.board",payload:{id:yt,name:"Closed",parent:e}},{id:de(),userId:le,userName:ce,action:"add.swimlane",payload:{id:te,name:"Closed",parent:yt}},{id:de(),userId:le,userName:ce,action:"lock.node",payload:{id:yt}},{id:de(),userId:le,userName:ce,action:"lock.node",payload:{id:te}}]}function De(){return ue!==null}function un(){if(!ue||ue.length===0)return ue=null,d("No pending default events to persist",null);let e=ue.map(t=>ft({event:t})).filter(a);return e.length>0?i([Pe.bold.red("Persisting default events failed"),"",...e.map((t,n)=>`${Pe.dim.gray(`${n+1}.`)} ${Pe.dim(t.message)}`),`
37
50
  `].join(`
38
- `)):(ue=null,c("Persisted pending default events",null))}function io(e){let t;e.some(r=>r.action==="init.workspace")?(ue=null,t=Ee(e)):(ue=Rs(),t=Ee([...ue]));let n=t.filter(a);return n.length>0?i([Pe.bold.red("Materializing failed"),"",...n.map((r,o)=>`${Pe.dim.gray(`${o+1}.`)} ${Pe.dim(r.message)}`),`
51
+ `)):(ue=null,d("Persisted pending default events",null))}function No(e){let t;e.some(r=>r.action==="init.workspace")?(ue=null,t=ye(e)):(ue=bs(),t=ye([...ue]));let n=t.filter(a);return n.length>0?i([Pe.bold.red("Materializing failed"),"",...n.map((r,o)=>`${Pe.dim.gray(`${o+1}.`)} ${Pe.dim(r.message)}`),`
39
52
  `].join(`
40
- `)):(hs(),c("State booted successfully",null))}var Ie=e=>{let t=ae(e??process.cwd()),n=Ke(t);if(a(n))return i(n.message);let r=io(n.data);return a(r)?i(r.message):c("Booted Epiq state",{root:t})},Ft=()=>{let e=Hr();return a(e)?i(e.message):e.data.userId?e.data.userName?c("Resolved actor",{userId:e.data.userId,userName:e.data.userName}):i("Unable to retrieve user name"):i("Unable to retrieve user id")},ao=(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):[]},Ss=e=>ao(e,"Tags").map(t=>E.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name})),As=e=>ao(e,"Assignees").map(t=>E.getContributor(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name})),co=(e={})=>{let t=Ie(e.repoRoot);if(a(t))return t;let n=Object.values(y().nodes).filter(r=>r.context==="BOARD").map(r=>({id:r.id,title:r.title,parentId:r.parentNodeId,readonly:!!r.readonly}));return c("Listed boards",n)},lo=(e={})=>{let t=Ie(e.repoRoot);if(a(t))return t;let n=Object.values(y().nodes).filter(r=>r.context==="SWIMLANE").filter(r=>!e.boardId||r.parentNodeId===e.boardId).map(r=>({id:r.id,title:r.title,boardId:r.parentNodeId,isClosed:r.id===Z,readonly:!!r.readonly}));return c("Listed swimlanes",n)},uo=e=>{let t=Ie(e.repoRoot);if(a(t))return t;let n=Object.values(y().nodes).filter(z).filter(r=>e.includeClosed||r.parentNodeId!==Z).map(r=>({id:r.id,title:tt(r.title),description:wn(r,"Description"),parentId:r.parentNodeId,isClosed:r.parentNodeId===Z,readonly:!!r.readonly,tags:Ss(r),assignees:As(r)}));return c("Listed issues",n)},mo=e=>{let t=Ie(e.repoRoot);if(a(t))return t;let n=Ft();if(a(n))return n;let r=E.getNode(e.parentId);if(!r)return i(`Unable to locate parent swimlane: ${e.parentId}`);if(r.context!=="SWIMLANE")return i(`Parent must be a swimlane, got: ${r.context}`);let o=Ze({name:e.title,parent:e.parentId,user:n.data}),d=Ae(o).find(a);if(d)return i(d.message);let l=o.find(u=>u.action==="add.issue")?.payload.id;return l?c("Created issue",{id:l,title:e.title,parentId:e.parentId}):i("Unable to determine created issue id")},po=e=>{let t=Ie(e.repoRoot);if(a(t))return t;let n=Ft();if(a(n))return n;let r=E.getNode(e.issueId);if(!r)return i(`Unable to locate issue: ${e.issueId}`);if(!r.parentNodeId)return i(`Unable to locate issue parent for: ${e.issueId}`);if(!z(r))return i("Can only close issues");if(r.parentNodeId===Z)return i("Issue is already closed");let o={id:so(),userId:n.data.userId,userName:n.data.userName,action:"close.issue",payload:{id:e.issueId,parent:r.parentNodeId}},d=Ae([o]).find(a);return d?i(d.message):c("Closed issue",{id:e.issueId,closed:!0})},go=(e={})=>{let t=Ie(e.repoRoot);return a(t)?t:c("Retrieved Epiq state",{root:t.data.root,nodes:y().nodes,rootNodeId:y().rootNodeId,currentNode:y().currentNode,selectedIndex:y().selectedIndex,eventLog:y().eventLog})},fo=e=>{let t=Ie(e.repoRoot);if(a(t))return t;let n=Ft();if(a(n))return n;let r=E.getNode(e.issueId);if(!r)return i(`Unable to locate issue: ${e.issueId}`);if(!z(r))return i("Can only move issues");let o=E.getNode(e.parentId);if(!o)return i(`Unable to locate target swimlane: ${e.parentId}`);if(o.context!=="SWIMLANE")return i(`Target parent must be a swimlane, got: ${o.context}`);if(o.readonly)return i("Cannot move issue to readonly swimlane");let s={id:so(),userId:n.data.userId,userName:n.data.userName,action:"move.node",payload:{id:e.issueId,parent:e.parentId,...e.position==null?{}:{pos:e.position}}},l=Ae([s]).find(a);return l?i(l.message):c("Moved issue",{id:e.issueId,parentId:e.parentId,position:e.position??{at:"end"}})},vo=async(e={})=>{let t=ae(e.repoRoot??process.cwd()),n=Ft();if(a(n))return n;let r=await At({cwd:t,ownEventFileName:He({userId:n.data.userId,userName:n.data.userName})});return a(r)?r:c("Synced Epiq state",r.data)};var fe=e=>({isError:a(e),content:[{type:"text",text:JSON.stringify(e,null,2)}]}),Ms=()=>{let e=new ws({name:"epiq",version:"0.2.30"});return e.registerTool("epiq_state_get",{description:"Get the full current Epiq state, including nodes and event log",inputSchema:A.object({repoRoot:A.string().optional()})},async t=>fe(await go(t))),e.registerTool("epiq_issue_list",{description:"List Epiq issues",inputSchema:A.object({repoRoot:A.string().optional(),includeClosed:A.boolean().optional()})},async t=>fe(await uo(t))),e.registerTool("epiq_board_list",{description:"List Epiq boards",inputSchema:A.object({repoRoot:A.string().optional()})},async t=>fe(await co(t))),e.registerTool("epiq_swimlane_list",{description:"List Epiq swimlanes",inputSchema:A.object({repoRoot:A.string().optional(),boardId:A.string().optional()})},async t=>fe(await lo(t))),e.registerTool("epiq_issue_create",{description:"Create an Epiq issue",inputSchema:A.object({title:A.string().min(1),parentId:A.string().min(1),repoRoot:A.string().optional()})},async t=>fe(await mo(t))),e.registerTool("epiq_issue_close",{description:"Close an Epiq issue",inputSchema:A.object({issueId:A.string().min(1),repoRoot:A.string().optional()})},async t=>fe(await po(t))),e.registerTool("epiq_issue_move",{description:"Move an Epiq issue to another swimlane",inputSchema:A.object({issueId:A.string().min(1),parentId:A.string().min(1),position:A.discriminatedUnion("at",[A.object({at:A.literal("start")}),A.object({at:A.literal("end")}),A.object({at:A.literal("before"),sibling:A.string().min(1)}),A.object({at:A.literal("after"),sibling:A.string().min(1)})]).optional(),repoRoot:A.string().optional()})},async t=>fe(await fo(t))),e.registerTool("epiq_sync",{description:"Sync Epiq state with the configured Git remote",inputSchema:A.object({repoRoot:A.string().optional()})},async t=>fe(await vo(t))),e},Ls=async()=>{let e=Ms(),t=new Ts;await e.connect(t)};await Ls();export{Ms as createMcpServer,fe as resultJson,Ls as startMcpServer};
53
+
54
+ See complete log:
55
+
56
+ `)+e.map(r=>JSON.stringify(r)).join(`
57
+ `)):(Cs(),d("State booted successfully",null))}var Ie=e=>{let t=re(e??process.cwd());if(a(t))return t;let n=He(t.value);if(a(n))return i(n.message);let r=No(n.value);return a(r)?i(r.message):d("Booted Epiq state",{root:t.value})},Mt=()=>{let e=Jr();return a(e)?i(e.message):e.value.userId?e.value.userName?d("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):i("Unable to retrieve user name"):i("Unable to retrieve user id")},Eo=(e,t)=>{let r=h(e.id).find(o=>o.title===t);return r?h(r.id).map(o=>typeof o.props?.value=="string"?o.props.value:"").filter(o=>!!o):[]},Ss=e=>Eo(e,"Tags").map(t=>y.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name})),Rs=e=>Eo(e,"Assignees").map(t=>y.getContributor(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name})),Io=(e={})=>{let t=Ie(e.repoRoot);if(a(t))return t;let n=Object.values(N().nodes).filter(r=>r.context==="BOARD").map(r=>({id:r.id,title:r.title,parentId:r.parentNodeId,readonly:!!r.readonly}));return d("Listed boards",n)},xo=(e={})=>{let t=Ie(e.repoRoot);if(a(t))return t;let n=Object.values(N().nodes).filter(r=>r.context==="SWIMLANE").filter(r=>!e.boardId||r.parentNodeId===e.boardId).map(r=>({id:r.id,title:r.title,boardId:r.parentNodeId,isClosed:r.id===te,readonly:!!r.readonly}));return d("Listed swimlanes",n)},ho=e=>{let t=Ie(e.repoRoot);if(a(t))return t;let n=Object.values(N().nodes).filter(V).filter(r=>e.includeClosed||r.parentNodeId!==te).map(r=>({id:r.id,title:tt(r.title),description:An(r,"Description"),parentId:r.parentNodeId,isClosed:r.parentNodeId===te,readonly:!!r.readonly,tags:Ss(r),assignees:Rs(r)}));return d("Listed issues",n)},Co=e=>{let t=Ie(e.repoRoot);if(a(t))return t;let n=Mt();if(a(n))return n;let r=y.getNode(e.parentId);if(!r)return i(`Unable to locate parent swimlane: ${e.parentId}`);if(r.context!=="SWIMLANE")return i(`Parent must be a swimlane, got: ${r.context}`);let o=Qe({name:e.title,parent:e.parentId,user:n.value}),l=Ae(o).find(a);if(l)return i(l.message);let c=o.find(u=>u.action==="add.issue")?.payload.id;return c?d("Created issue",{id:c,title:e.title,parentId:e.parentId}):i("Unable to determine created issue id")},bo=e=>{let t=Ie(e.repoRoot);if(a(t))return t;let n=Mt();if(a(n))return n;let r=y.getNode(e.issueId);if(!r)return i(`Unable to locate issue: ${e.issueId}`);if(!r.parentNodeId)return i(`Unable to locate issue parent for: ${e.issueId}`);if(!V(r))return i("Can only close issues");if(r.parentNodeId===te)return i("Issue is already closed");let o={id:yo(),userId:n.value.userId,userName:n.value.userName,action:"close.issue",payload:{id:e.issueId,parent:r.parentNodeId}},l=Ae([o]).find(a);return l?i(l.message):d("Closed issue",{id:e.issueId,closed:!0})},So=(e={})=>{let t=Ie(e.repoRoot);return a(t)?t:d("Retrieved Epiq state",{root:t.value.root,nodes:N().nodes,rootNodeId:N().rootNodeId,currentNode:N().currentNode,selectedIndex:N().selectedIndex,eventLog:N().eventLog})},Ro=e=>{let t=Ie(e.repoRoot);if(a(t))return t;let n=Mt();if(a(n))return n;let r=y.getNode(e.issueId);if(!r)return i(`Unable to locate issue: ${e.issueId}`);if(!V(r))return i("Can only move issues");let o=y.getNode(e.parentId);if(!o)return i(`Unable to locate target swimlane: ${e.parentId}`);if(o.context!=="SWIMLANE")return i(`Target parent must be a swimlane, got: ${o.context}`);if(o.readonly)return i("Cannot move issue to readonly swimlane");let s={id:yo(),userId:n.value.userId,userName:n.value.userName,action:"move.node",payload:{id:e.issueId,parent:e.parentId,...e.position==null?{}:{pos:e.position}}},c=Ae([s]).find(a);return c?i(c.message):d("Moved issue",{id:e.issueId,parentId:e.parentId,position:e.position??{at:"end"}})},Ao=async(e={})=>{let t=re(e.repoRoot??process.cwd());if(a(t))return i(`Sync failed
58
+ `+t);let n=Mt();if(a(n))return n;let r=await Ct({cwd:t.value,ownEventFileName:$e({userId:n.value.userId,userName:n.value.userName})});return a(r)?r:d("Synced Epiq state",r.value)};var ve=e=>({isError:a(e),content:[{type:"text",text:JSON.stringify(e,null,2)}]}),Ts=()=>{let e=new As({name:"epiq",version:"0.2.30"});return e.registerTool("epiq_state_get",{description:"Get the full current Epiq state, including nodes and event log",inputSchema:R.object({repoRoot:R.string().optional()})},async t=>ve(await So(t))),e.registerTool("epiq_issue_list",{description:"List Epiq issues",inputSchema:R.object({repoRoot:R.string().optional(),includeClosed:R.boolean().optional()})},async t=>ve(await ho(t))),e.registerTool("epiq_board_list",{description:"List Epiq boards",inputSchema:R.object({repoRoot:R.string().optional()})},async t=>ve(await Io(t))),e.registerTool("epiq_swimlane_list",{description:"List Epiq swimlanes",inputSchema:R.object({repoRoot:R.string().optional(),boardId:R.string().optional()})},async t=>ve(await xo(t))),e.registerTool("epiq_issue_create",{description:"Create an Epiq issue",inputSchema:R.object({title:R.string().min(1),parentId:R.string().min(1),repoRoot:R.string().optional()})},async t=>ve(await Co(t))),e.registerTool("epiq_issue_close",{description:"Close an Epiq issue",inputSchema:R.object({issueId:R.string().min(1),repoRoot:R.string().optional()})},async t=>ve(await bo(t))),e.registerTool("epiq_issue_move",{description:"Move an Epiq issue to another swimlane",inputSchema:R.object({issueId:R.string().min(1),parentId:R.string().min(1),position:R.discriminatedUnion("at",[R.object({at:R.literal("start")}),R.object({at:R.literal("end")}),R.object({at:R.literal("before"),sibling:R.string().min(1)}),R.object({at:R.literal("after"),sibling:R.string().min(1)})]).optional(),repoRoot:R.string().optional()})},async t=>ve(await Ro(t))),e.registerTool("epiq_sync",{description:"Sync Epiq state with the configured Git remote",inputSchema:R.object({repoRoot:R.string().optional()})},async t=>ve(await Ao(t))),e},Ms=async()=>{let e=Ts(),t=new ws;await e.connect(t)};await Ms();export{Ts as createMcpServer,ve as resultJson,Ms as startMcpServer};