epiq 0.5.3 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/dist/index.js +57 -53
  2. package/dist/mcp.js +52 -49
  3. package/package.json +10 -11
  4. package/readme.md +44 -65
package/dist/mcp.js CHANGED
@@ -1,59 +1,62 @@
1
1
  #!/usr/bin/env node
2
- import{McpServer as wc}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as Tc}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as F}from"zod";var Te={None:"none",Success:"success",Fail:"fail"},s=e=>({status:Te.Fail,message:e,value:null}),c=(e,t)=>({status:Te.Success,message:e,value:t}),a=e=>e.status==="fail",ct=e=>e.status==="success";import{ulid as Es}from"ulid";import Cc from"node:fs";import{useSyncExternalStore as Nc}from"react";var k={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function Mn(e){return e.context==="WORKSPACE"}function ne(e){return e.context==="TICKET"}function Or(e){return e.context==="FIELD"}var kt=e=>e.context==="SWIMLANE",Ur=e=>e.context==="BOARD";var g={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line"};function Pt(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var Ft=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",Xe=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var Br=e=>{let t=new Map;for(let n of e)for(let r=1;r<=n.length;r++){let o=n.slice(0,r),i=t.get(o);i?i.push(n):t.set(o,[n])}return t},_r=(e,t)=>t?e.get(t)??[]:[];var $r=new WeakMap,Ds=e=>{let t=$r.get(e);return t||(t=Br(e),$r.set(e,t)),t};var jr=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return _r(Ds(e),r).filter(i=>Pt(r,i)>=n)};var Ls={hint:"",hints:[],overlap:0,remainder:""},Wr=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return Ls;let o=jr({wordList:r,inputToMatch:e,overlapThreshold:1});return Os(t,o)},Os=(e,t)=>{let n=t[0]??"",r=Pt(e.toLowerCase(),n.toLowerCase()),[o,i]=n.split(":"),d=r<(o??"").length,l=!!i,p=(l&&d?o:n)+(l&&d?":":" "),x=p.slice(r);return{hint:p,hints:t,overlap:r,remainder:x}};var Dt={autoSyncIntervalMs:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},W=()=>Dt,ge=e=>(Dt={...Dt,...e},Dt);var Je=3e3,Hr=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<Je?null:t},Kr=0,kn,Pn=!1,lt=!1,Fn=()=>Pn||f().syncStatus.status==="syncing",Us=()=>{let e=W().autoSyncIntervalMs??15e3,t=Date.now()-Kr;return Math.max(0,e-t)},qr=()=>{kn||(kn=setTimeout(async()=>{if(kn=void 0,Fn()){lt=!0;return}lt=!1,await Bs()},Us()))},Bs=async()=>{if(Fn())return lt=!0,s("Sync already in progress");Pn=!0,Kr=Date.now(),I({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await Lt()}finally{Pn=!1,lt&&qr()}},Vr=()=>{lt=!0,!Fn()&&qr()};import pt from"node:fs";import{ulid as js}from"ulid";import{z as _t}from"zod";import ut from"node:fs";import he from"node:path";var Dn=process.env.IS_LOCAL==="true",Ie=".epiq",de=".epiq-global",Ot="events",_s="project.json",zr=e=>he.join(e,Ie),Ut=e=>he.join(e,Ie),Bt=e=>he.join(Ut(e),_s),mt=e=>he.join(Ut(e),Ot),$s=e=>{let t=he.join(e,Ie);return ut.existsSync(t)&&ut.statSync(t).isDirectory()},Ln=e=>{let t=Bt(e);return ut.existsSync(t)&&ut.statSync(t).isFile()},fe=e=>{let t=he.resolve(e);for(;;){if($s(t))return c("Resolved closest .epiq root",t);let n=he.dirname(t);if(n===t)return s("No .epiq directory found in any parent");t=n}},Me=e=>{let t=he.resolve(e);for(;;){if(Ln(t))return c("Resolved closest epiq project root",t);let n=he.dirname(t);if(n===t)return s("No .epiq/project.json found in any parent");t=n}},Gr=e=>{let t=mt(e);try{return ut.mkdirSync(t,{recursive:!0}),c("Resolved events dir",t)}catch(n){return s(n instanceof Error?`Failed to ensure events dir: ${n.message}`:"Failed to ensure events dir")}};var Ws="_epiq/_evt",Hs=_t.object({projectId:_t.string().min(1),stateBranch:_t.string().min(1),createdAt:_t.iso.datetime()}),Yr=()=>({projectId:js(),stateBranch:Ws,createdAt:new Date().toISOString()}),ke=e=>{let t=Bt(e);if(!pt.existsSync(t))return s("Missing .epiq/project.json");try{let n=pt.readFileSync(t,"utf8"),r=JSON.parse(n),o=Hs.safeParse(r);return o.success?c("Read project.json",o.data):s(`Invalid .epiq/project.json: ${o.error.issues.map(i=>`${i.path.join(".")}: ${i.message}`).join(", ")}`)}catch(n){return s(n instanceof Error?`Failed to read .epiq/project.json: ${n.message}`:"Failed to read .epiq/project.json")}},Xr=e=>{let t=ke(e);return a(t)?s(t.message):c("Read projectId",t.value.projectId)},Jr=({repoRoot:e,fileContents:t})=>{let n=Ut(e),r=Bt(e);try{if(pt.mkdirSync(n,{recursive:!0}),pt.existsSync(r)){let o=ke(e);return a(o)?s(o.message):c("Project already initialized",null)}return pt.writeFileSync(r,JSON.stringify(t,null,2)+`
3
- `,"utf8"),c("Created project.json",null)}catch(o){return s(o instanceof Error?`Failed to initialize project: ${o.message}`:"Failed to initialize project")}};var $t=()=>{let e=W(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim(),r=e.autoSync===!0||e.autoSync===!1;return{isSetupDone:n&&t&&r,isSetPreferredEditor:n,isSetUserName:t,userName:e.userName,preferredEditor:e.preferredEditor,autoSync:e.autoSync===void 0?null:e.autoSync,isSetAutoSync:r}},Zr=()=>{let e=Me(process.cwd());if(a(e))return s("Unable to determine if repository is initialized");let t=ke(e.value);return ct(t)},Qr=e=>e===!0?"yes":e===!1?"no":null,eo=e=>e==="yes"?!0:e==="no"?!1:null;var J={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:k.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,r,o=!1)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:k.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:k.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:({id:e,name:t,parentNodeId:n,rank:r,props:o={},childRenderAxis:i="horizontal",isVirtual:d=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:k.FIELD,childRenderAxis:i,parentNodeId:n,readonly:!1,log:[],isVirtual:d}),ticket:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:k.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,rank:r,props:o={},readonly:i=!0,isVirtual:d=!0})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:k.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:i,log:[],isVirtual:d})};import{ulid as Vs}from"ulid";var _e=24n,Ks=_e*4n,$e=(1n<<Ks)-1n,qs=/^[0-9a-f]+$/;function to(e){return!e||!qs.test(e)?s(`Invalid hex rank: ${e}`):c("Converted rank to bigint",BigInt("0x"+e))}function Ee(e,t=_e){if(e<0n)return s("Negative rank not allowed");let n=e.toString(16);return c("Converted bigint to hex rank",n.padStart(Number(t),"0"))}function z(e,t){if(!e&&!t)return Ee($e/2n,_e);let n=e?to(e):c("Resolved lower bound",0n);if(a(n))return n;let r=t?to(t):c("Resolved upper bound",$e);if(a(r))return r;let o=n.value,i=r.value;if(i<=o)return Ee($e/2n,_e);let d=(o+i)/2n;return d===o||d===i?s("No rank space available between neighbors"):Ee(d,_e)}function no(){return Ee($e/2n,_e)}function ro(e){if(e<=0)return c("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=$e*BigInt(r+1)/(t+1n),i=Ee(o,_e);if(a(i))return i;n.push(i.value)}return c("Resolved evenly spaced ranks",n)}var On=(e,t)=>{let n=_(e),r=ro(n.length);if(a(r))return r;let o={};for(let i=0;i<n.length;i++){let d=n[i],l=r.value[i];if(!d||!l)return s("Unable to assign rebalance rank");o[d.id]=l}return c("Created rebalance event",{id:Vs(),action:"rebalance.children",payload:{parent:e,ranks:o},...t})};var G={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History"};var zs=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[te,jt]=zs;var P=(e,t)=>s(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),Gs={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=J.workspace(t,n,r),i=vt(o);if(a(i))return P(i.message,e);let d=N.createNode(o);return a(d)?P(d.message??"Failed to initialize workspace",e):Mn(d.value)?c("Workspace initialized",{action:e.action,result:d.value}):s("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=J.workspace(t,n,r),i=N.createNode(o);return a(i)?P(i.message??"Failed to add workspace",e):Mn(i.value)?c("Added workspace",{action:e.action,result:i.value}):s("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,i=N.createNode(J.board(t,n,r,o));return a(i)?P(i.message??"Unable to create board",e):Ur(i.value)?c("Added board",{action:e.action,result:i.value}):s("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,i=N.createNode(J.swimlane(t,n,r,o));return a(i)?P(i.message??"Unable to create swimlane",e):kt(i.value)?c("Added swimlane",{action:e.action,result:i.value}):s("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,i=N.createNode(J.ticket(t,n,r,o));return a(i)?P(i.message??"Unable to create issue",e):ne(i.value)?c("Added issue",{action:e.action,result:i.value}):s("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:r,val:o,rank:i}=e.payload,d=N.createNode(J.field({id:t,name:n,parentNodeId:r,rank:i,props:{value:o},childRenderAxis:n.includes(G.DESCRIPTION)?"vertical":"horizontal"}));return a(d)?P(d.message??`Unable to create field: ${n}`,e):Or(d.value)?c("Added field",{action:e.action,result:d.value}):s("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!N.getNode(t))return P(`Unable to locate node with id ${t}`,e);let o=N.renameNode(t,n);return a(o)?P(o.message??"Unable to edit title",e):c("Edited title",{action:e.action,result:o.value})},"delete.node":e=>{let{id:t}=e.payload,n=N.tombstoneNode(t);return a(n)?P(n.message??"Unable to delete node",e):c("Deleted node",{action:e.action,result:n.value})},"create.tag":e=>{let{id:t,name:n}=e.payload,r=N.createTag({id:t,name:n});return a(r)?P(r.message??"Unable to create tag",e):c("Tag added",{action:e.action,result:r.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,r=N.createContributor({id:t,name:n});return a(r)?P(r.message??"Unable to create contributor",e):c("Contributor created",{action:e.action,result:r.value})},"tag.issue":e=>{let{id:t,target:n,tagId:r,rank:o}=e.payload,i=N.tag(n,r,t,o);return a(i)?P(i.message??"Unable to tag issue",e):c("Issue tagged",{action:e.action,result:i.value})},"untag.issue":e=>{let{target:t,tagId:n}=e.payload,r=N.untag(t,n);return a(r)?P(r.message??"Unable to untag ",e):c("Issue untagged",{action:e.action,result:r.value})},"assign.issue":e=>{let{id:t,contributor:n,target:r,rank:o}=e.payload,i=N.assign(r,n,t,o);return a(i)?P(i.message??"Unable to assign issue",e):c("Assigned successfully",{action:e.action,result:i.value})},"unassign.issue":e=>{let{target:t,contributor:n}=e.payload,r=N.unassign(t,n);return a(r)?P(r.message??"Unable to unassign issue",e):c("Issue unassigned",{action:e.action,result:r.value})},"move.node":e=>{let{id:t,parent:n,rank:r}=e.payload,o=N.moveNodeToRank({id:t,parentId:n,rank:r});return a(o)?P(o.message??"Failed to move node",e):c("Moved node",{action:e.action,result:o.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,r=N.editValue(t,n);return a(r)?P(r.message??"Unable to edit description",e):c("Set node value",{action:e.action,result:r.value})},"close.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=N.getNode(t);if(!o)return P("Unable to locate issue",e);if(!ne(o))return P("Can only close issues",e);let i=N.getNode(te);if(!i)return P("Unable to locate target swimlane",e);if(n!==i.id)return P("Close target must be closed swimlane",e);let d=N.moveNodeToRank({id:t,parentId:n,rank:r});return a(d)?P(d.message??"Unable to close issue",e):c("Issue closed",{action:e.action,result:{id:t}})},"reopen.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=N.getNode(t);if(!o)return P("Unable to locate issue",e);if(!ne(o))return P("Can only reopen issues",e);let i=N.getNode(te);if(!i)return P("Unable to locate closed swimlane",e);if(n===i.id)return P("Cannot reopen issue into closed swimlane",e);if(!N.getNode(n))return P("Reopen parent no longer exists",e);let l=N.moveNodeToRank({id:t,parentId:n,rank:r});return a(l)?P(l.message??"Unable to reopen issue",e):c("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=N.lockNode(t);return a(n)?P(n.message??"Unable to lock node",e):c("Node locked",{action:e.action,result:n.value})},"rebalance.children":e=>{let{parent:t,ranks:n}=e.payload;for(let[r,o]of Object.entries(n)){let i=N.getNode(r);if(!i)return P(`Unable to locate node ${r}`,e);if(i.parentNodeId!==t)return P(`Node ${r} is not child of ${t}`,e);let d=N.updateNode({...i,rank:o});if(a(d))return P(d.message??"Unable to rebalance child",e)}return c("Rebalanced children",{action:e.action,result:{parent:t}})}},Ys=(e,t)=>{let n=N.getNode(e);n&&N.updateNode({...n,log:[...n.log??[],t]})},Xs=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=f().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 gt(e,t=!1){let n=Gs[e.action](e);if(a(n))return n;t||([...new Set(Xs(e))].forEach(d=>Ys(d,e)),ce(d=>({...d,eventLog:[...d.eventLog,e]})));let r=e.userId,o=e.userName;return!r?.length||!o?.length?P("Invalid user ID format",e):(N.createContributor({name:o,id:r}),n)}var ft=e=>e.map(t=>gt(t));import ia from"node:fs";import sa from"node:path";import{decodeTime as aa,monotonicFactory as da}from"ulid";import{z as yt}from"zod";import Wt from"node:fs";import Bn from"node:path";import{decodeTime as Js}from"ulid";import{z as Un}from"zod";var Zs=Un.object({userId:Un.string().min(1).default("unknown"),userName:Un.string().min(1).default("unknown")}),Qs=e=>{let[t,n]=Bn.basename(e,".jsonl").split("."),r=Zs.safeParse({userId:t,userName:n});return r.success?c("Parsed event file actor",r.data):s(`Invalid event file name ${Bn.basename(e)}: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},ea=e=>{let t=Object.keys(e).filter(n=>n!=="id"&&n!=="v");return t.length!==1?s(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?s("Invalid persisted event: action key is missing or invalid"):c("Resolved persisted action",t[0])},ta=(e,t)=>t in e,na=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),ra=e=>{let{userId:t,userName:n,...r}=e,o=ea(r);if(a(o))return s(o.message);let i=o.value,d=e.id?.[0];return d?ta(r,i)?c("Decoded persisted event",na({id:d,action:i,payload:r[i],userId:t,userName:n})):s(`Persisted event is missing payload for action: ${i}`):s("Persisted event is missing id")},Ht=e=>{if(!Wt.existsSync(e))return c("Event file missing",[]);let t=Qs(e);if(a(t))return s(t.message);let n=Wt.readFileSync(e,"utf8"),r=[];for(let o of n.split(`
4
- `)){let i=o.trim();if(!i)continue;let d;try{d=JSON.parse(i)}catch{return s(`Failed to parse event JSON from ${e}: ${i}`)}let l=_n(d);if(a(l))return s(`${l.message} in ${e}: ${i}`);r.push({...l.value,userId:t.value.userId,userName:t.value.userName})}return c("Parsed persisted events file",r)};function oo(e){let t=mt(e);if(!Wt.existsSync(t))return c("No events found",[]);let n=Wt.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>Bn.join(t,o)),r=[];for(let o of n){let i=Ht(o);if(a(i))return s(i.message);r.push(...i.value)}return c("All events loaded",oa(r))}function Ze(e){let t=oo(e);if(a(t))return s(t.message);let n=[];for(let r of t.value){let o=ra(r);if(a(o))return s(`Failed to decode event ${r.id?.[0]??"<unknown>"}: ${o.message}`);n.push(o.value)}return c("Loaded merged events",n)}function io(e=process.cwd()){let t=oo(e);return a(t)?s(t.message):c("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var oa=e=>{let t=new Map,n=new Map;for(let m of e){let p=m.id[0],x=m.id[1]??null;t.set(p,m);let h=n.get(x)??[];h.push(m),n.set(x,h)}for(let m of n.values())m.sort((p,x)=>p.id[0].localeCompare(x.id[0]));let r=[],o=new Set,i=m=>{let p=m.id[0];if(o.has(p))return;r.push(m),o.add(p);let x=n.get(p)??[];for(let h of x)i(h)},d=n.get(null)??[];for(let m of d)i(m);let l=e.filter(m=>{let p=m.id[0],x=m.id[1]??null;return!o.has(p)&&x!==null&&!t.has(x)}).sort((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of l)i(m);let u=e.filter(m=>!o.has(m.id[0])).sort((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of u)i(m);return r},so=(e,t)=>{let n=e.findIndex(r=>{try{return Js(r.id)>t}catch{return!0}});return n===-1?{appliedEvents:e,unappliedEvents:[]}:{appliedEvents:e.slice(0,n),unappliedEvents:e.slice(n)}};var ao=e=>({action:e.action,payload:e.payload});var lo=1,co=da(),ca=yt.tuple([yt.string().min(1),yt.string().min(1).nullable()]),la=yt.looseObject({v:yt.literal(lo),id:ca}),_n=e=>{let t=la.safeParse(e);return t.success?c("Parsed persisted event",t.data):s(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},Kt=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",V=()=>{let{userName:e,userId:t}=W();return e?t?e.trim()?c("Successfully resolved actor ID",{userId:Kt(t),userName:Kt(e)}):s("Unable to resolve actor ID from settings or OS user info"):s("User ID not configured"):s("User name not configured")},je=({userId:e,userName:t})=>`${Kt(e)}.${Kt(t)}.jsonl`,ua=(e,{userId:t,userName:n})=>{let r=je({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r))return s(`Invalid event log file name: ${r}`);let i=sa.join(mt(e),r);return c("Successfully resolved event log path",i)},ma=(e,t)=>{let n={[e.action]:e.payload,v:lo,id:t};return _n(n)};function qt({event:e,rootDir:t=process.cwd()}){try{let n=fe(t);if(a(n))return n;let r=Gr(n.value);if(a(r))return r;let o=ua(n.value,{userId:e.userId,userName:e.userName});if(a(o))return o;let i=io(n.value);if(a(i))return s(i.message);let d=i.value?co(Math.max(Date.now(),aa(i.value)+1)):co(),l=ma(ao(e),[d,i.value]);return a(l)?s(l.message):(ia.appendFileSync(o.value,`${JSON.stringify(l.value)}
5
- `,"utf8"),c("Event persisted",{path:o.value,entry:l.value}))}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return s(`Failed to persist event: ${r}`)}}function $(e){let t=gt(e);if(t.status!==Te.Success)return t;let n=qt({event:e});return a(n)?n:t}function Pe(e){return e.map(t=>$(t))}var uo=e=>$n(_(e),{at:"end"}),$n=(e,t={at:"end"})=>{let n=r=>a(r)?c("Rank space exhausted",{rank:"",needsRebalance:!0}):c("Resolved rank",{rank:r.value,needsRebalance:!1});if(e.length===0)return n(z(void 0,void 0));switch(t.at){case"start":{let r=e[0];return r?n(z(void 0,r.rank)):s("Unable to resolve first sibling")}case"end":{let r=e[e.length-1];return r?n(z(r.rank,void 0)):s("Unable to resolve last sibling")}case"before":{let r=mo(e,t.sibling);if(r<0)return s("Sibling not found");let o=r>0?e[r-1]:void 0,i=e[r];return i?n(z(o?.rank,i.rank)):s("Sibling not found")}case"after":{let r=mo(e,t.sibling);if(r<0)return s("Sibling not found");let o=e[r],i=r<e.length-1?e[r+1]:void 0;return o?n(z(o.rank,i?.rank)):s("Sibling not found")}}},_=e=>Object.values(f().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),mo=(e,t)=>e.findIndex(n=>n.id===t),po=(e,t,n={at:"end"})=>$n(_(t).filter(r=>r.id!==e),n),ye=(e,t,n,r)=>{let o=po(t,e,n);if(a(o))return o;if(!o.value.needsRebalance)return c("Resolved rank",o.value.rank);let i=On(e,r);if(a(i))return i;let d=$(i.value);if(a(d))return d;let l=po(t,e,n);return a(l)?l:l.value.needsRebalance?s("Rank rebalance failed to create space"):c("Resolved rank after rebalance",l.value.rank)},Fe=(e,t)=>{let n=uo(e);if(a(n))return n;if(!n.value.needsRebalance)return c("Resolved rank",n.value.rank);let r=On(e,t);if(a(r))return r;let o=$(r.value);if(a(o))return o;let i=uo(e);return a(i)?i:i.value.needsRebalance?s("Rank rebalance failed to create space"):c("Resolved rank after rebalance",i.value.rank)};var Qe=(e,t)=>{let{nodes:n}=f(),r=n[e];if(!r)return s("Node not found");if(r.context===t)return c("Resolved ancestor node",r);let o=r.parentNodeId?n[r.parentNodeId]:void 0;for(;o;){if(o.context===t)return c("Resolved ancestor node",o);o=o.parentNodeId?n[o.parentNodeId]:void 0}return s(`No ancestor found for context: ${t}`)},pa=(e,t)=>{let{nodes:n}=f(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},jn=(e,t)=>e?e.readonly?s({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node"}[t]):null:s("Node not found"),N={deleteNode(e){ce(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},editValue(e,t){let{nodes:n}=f(),r=n[e];if(!r)return s("Edit target node not found");let o=jn(r,"edit");if(o)return o;let i={...r,props:{...r.props,value:t}};return this.updateNode(i),c("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return s("Rename target node not found");let r=jn(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),c("Renamed node",o)},getExistingTags(){let{tags:e}=f();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=f();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return _(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:r}=f(),o=this.getNode(e),i=this.getNode(t);if(!o)return s("Node not found");if(!i)return s("Target parent not found");if(r===e)return s("Cannot move root node");if(e===t)return s("Cannot move node into itself");let d=jn(o,"move");if(d)return d;if(pa(t,e))return s("Cannot move node into its own descendant");let l={...o,parentNodeId:t,rank:n};return this.updateNode(l),c("Moved node successfully",l)},tombstoneNode(e){let{nodes:t,currentNodeId:n,rootNodeId:r}=f(),o=this.getNode(e);if(!o)return s("Node not found");if(r===e)return s("Cannot delete root node");let i=new Set,d=u=>{let m=t[u];if(!(!m||i.has(u))){i.add(u);for(let p of _(m.id))d(p.id)}};d(e);let l={...structuredClone(t)};for(let u of i){if(!l[u])return s("Unable to locate node to delete");l[u]={...l[u],isDeleted:!0}}return n?(I({nodes:l}),c("Successfully tomb stoned",o)):s("Unable to delete undefined")},createContributor(e){let t=ce(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return a(t)?s("Unable to create contributor"):c("Created contributor",e)},assign(e,t,n,r){let o=this.getContributor(t),i=this.getNode(e);if(!i||!o)return s("Unable assign contributor to issue");let d=this.getFieldByTitle(i.id,"Assignees");if(!d)return s("Unable to locate assignees field");if(_(d.id).some(p=>p.props?.value===t))return s("Contributor already assigned");let u=J.field({id:n,name:o.name,parentNodeId:d.id,rank:r,props:{value:t}}),m=this.createNode(u);return a(m)?m:c("Assigned contributor",u)},createTag(e){let t=ce(n=>({...n,tags:{...n.tags,[e.id]:e}}));return a(t)?s("Could not create tag"):c("Tag created",e)},tag(e,t,n,r){let o=this.getTag(t),i=this.getNode(e);if(!o)return s("Unable to add tag, missing tag");if(!i)return s("Unable to add tag, missing target");let d=this.getFieldByTitle(i.id,"Tags");if(!d)return s("Unable to locate tags field");if(_(d.id).some(p=>p.props?.value===t))return s("Tag already assigned");let u=J.field({id:n,name:o.name,parentNodeId:d.id,rank:r,props:{value:t}}),m=this.createNode(u);return a(m)?m:c("Tag added",u)},untag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return s("Unable to remove tag, missing tag");if(!r)return s("Unable to remove tag, missing target");let o=this.getFieldByTitle(r.id,"Tags");if(!o)return s("Unable to locate tags field");let i=_(o.id).find(l=>l.props?.value===t);if(!i)return c("Issue is not tagged with that tag",null);let d={...i,isDeleted:!0};return this.updateNode(d),c("Tag removed",d)},unassign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return s("Unable to unassign, missing contributor");if(!r)return s("Unable to unassign, missing target");let o=this.getFieldByTitle(r.id,"Assignees");if(!o)return s("Unable to locate assignees field");let i=_(o.id).find(l=>l.props?.value===t);if(!i)return c("Issue is not assigned to that contributor",null);let d={...i,isDeleted:!0};return this.updateNode(d),c("Assignee removed",d)},createNode(e){let t=ce(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return a(t)?s("Unable to create node"):c("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return s("Failed to locate node");let n={...t,readonly:!0},r=ce(o=>({...o,nodes:{...o.nodes,[e]:n}}));return a(r)?s(r.message):c("Locked node",n)},updateNode(e){let t=ce(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return a(t)?t:c("Updated node",e)},getContributor(e){return f().contributors[e]},getTag(e){return f().tags[e]},getNode(e){return f().nodes[e]},getSiblings(e){return _(e)}};var Z={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#2a2f45",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},M={accent:Z.cyan,accent2:Z.magenta,primary:Z.white,secondary:Z.grayDark,secondary2:Z.grayLight,gray:Z.gray,green:Z.green,yellow:Z.yellow,red:Z.red};var y={red:Z.red,yellow:Z.yellow,green:Z.green,blue:Z.blue,magenta:Z.magenta,cyan:Z.cyan},et={urgent:y.red,critical:y.red,important:y.red,blocker:y.red,asap:y.red,immediate:y.red,fail:y.red,failure:y.red,broken:y.red,bug:y.red,error:y.red,incident:y.red,outage:y.red,production:y.red,crash:y.red,security:y.red,warning:y.yellow,warn:y.yellow,risky:y.yellow,risk:y.yellow,attention:y.yellow,pending:y.yellow,review:y.yellow,"needs-review":y.yellow,qa:y.yellow,testing:y.yellow,test:y.yellow,validate:y.yellow,verification:y.yellow,staging:y.yellow,check:y.yellow,"follow-up":y.yellow,followup:y.yellow,waiting:y.yellow,blocked:y.yellow,hold:y.yellow,done:y.green,complete:y.green,completed:y.green,success:y.green,ok:y.green,stable:y.green,resolved:y.green,fixed:y.green,closed:y.green,merged:y.green,released:y.green,deployed:y.green,approved:y.green,verified:y.green,working:y.green,healthy:y.green,pass:y.green,passing:y.green,info:y.blue,information:y.blue,note:y.blue,docs:y.blue,documentation:y.blue,doc:y.blue,guide:y.blue,help:y.blue,explanation:y.blue,detail:y.blue,details:y.blue,context:y.blue,design:y.blue,discussion:y.blue,proposal:y.blue,idea:y.blue,feature:y.magenta,enhancement:y.magenta,improvement:y.magenta,refactor:y.magenta,refactoring:y.magenta,cleanup:y.magenta,optimize:y.magenta,optimization:y.magenta,perf:y.magenta,performance:y.magenta,upgrade:y.magenta,migration:y.magenta,modernize:y.magenta,debt:y.magenta,todo:y.cyan,next:y.cyan,planned:y.cyan,plan:y.cyan,future:y.cyan,backlog:y.cyan,investigate:y.cyan,explore:y.cyan,prototype:y.cyan};var go=(e,t)=>{let r=S(e.id).find(o=>o.title===t);return r?S(r.id).map(o=>typeof o.props?.value=="string"?o.props.value:"").filter(o=>!!o):[]},Wn=e=>go(e,"Tags").map(t=>N.getTag(t)).filter(t=>!!t),Vt=()=>{let{breadCrumb:e,selectedNode:t}=f(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!ne(n)?s("Invalid untag target"):c("Retrieved tags from ticket in breadcrumb",Wn(n)??[])},zt=()=>{let{breadCrumb:e,selectedNode:t}=f(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!ne(n)?s("Invalid untag target"):c("Retrieved tags from ticket in breadcrumb",Hn(n)??[])},Hn=e=>go(e,"Assignees").map(t=>N.getContributor(t)).filter(t=>!!t);var fo=(e,t)=>{let r=S(e.id).find(o=>o.title===t);return r&&typeof r.props?.value=="string"?Xe(r.props.value):""};var v={EXIT:"exit",INIT:"init",HELP:"help",NEW:"new",TAG:"tag",UNTAG:"untag",MOVE:"move",PEEK:"peek",FILTER:"filter",ASSIGN:"assign",UNASSIGN:"unassign",DELETE:"delete",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",CONFIG:"config",EDIT:"edit",SYNC:"sync",EXPORT:"export",NONE:""};var ga=/^(\d+)(h|d|w|mo|y)$/,fa=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,va=({year:e,month:t,day:n,hour:r=0,minute:o=0})=>{let i=new Date(e,t-1,n,r,o);return i.getFullYear()===e&&i.getMonth()===t-1&&i.getDate()===n&&i.getHours()===r&&i.getMinutes()===o},ya=(e,t=new Date)=>{let n=e.match(ga);if(!n)return null;let[,r,o]=n,i=Number(r);if(!Number.isInteger(i)||i<=0)return null;let d=new Date(t);switch(o){case"h":return d.setHours(d.getHours()-i),d;case"d":return d.setDate(d.getDate()-i),d;case"w":return d.setDate(d.getDate()-i*7),d;case"mo":return d.setMonth(d.getMonth()-i),d;case"y":return d.setFullYear(d.getFullYear()-i),d;default:return null}},xa=e=>{let t=e.match(fa);if(!t)return null;let[,n,r,o,i,d]=t,l=Number(n),u=Number(r),m=Number(o),p=i?Number(i):0,x=d?Number(d):0;return va({year:l,month:u,day:m,hour:p,minute:x})?new Date(l,u-1,m,p,x):null},Gt=e=>{let t=e.trim().toLowerCase();return ya(t)??xa(t)},vo=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Na=[{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}],yo=(e=Na)=>{let t=[];for(let{unit:n,from:r,to:o}of e)for(let i=r;i<=o;i++)t.push(`${i}${n}`);return t};var ha=["BOARD","TICKET","SWIMLANE"],Y={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs"},De={TITLE:"title",DESCRIPTION:"description"},Ia=[Y.EDITOR,Y.VIEW,Y.USERNAME,Y.AUTOSYNC,Y.SYNC_DEBOUNCE_MS],Ea=[De.TITLE,De.DESCRIPTION],qn=[String(Je),"5000","15000","30000","60000"],We=[v.SYNC,v.HELP,v.EXPORT,v.CONFIG],Yt=[v.NEW,v.EDIT,v.DELETE,v.MOVE],Kn=[v.TAG,v.UNTAG,v.ASSIGN,v.UNASSIGN,v.CLOSE_ISSUE,v.RE_OPEN_ISSUE,v.EDIT],xo=[v.FILTER,v.PEEK],Ca={WORKSPACE:[...We,...Yt],BOARD:[...xo,...We,...Yt],SWIMLANE:[...xo,...We,...Yt],TICKET:[...We,...Yt,...Kn],FIELD:[...We,...Kn],FIELD_LIST:[...We,...Kn],TEXT:[...We]},Sa=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],ba=()=>{let{selectedNode:e,readOnly:t,breadCrumb:n}=f(),{isSetupDone:r}=$t();if(!r)return[v.HELP,v.CONFIG];if(!Zr())return[v.HELP,v.INIT];if(t)return[v.HELP,v.PEEK,v.EXPORT,v.CONFIG];let o=e?.context,i=o&&ha.includes(o);return[...new Set([...n,e].map(l=>l?.context).flatMap(l=>l?Ca[l]:[]))].filter(l=>l===v.MOVE?!1:l===v.EDIT||l===v.DELETE?i:!0)},Q=e=>{let{currentNode:t}=f(),n=t.context??"WORKSPACE";return{[v.NONE]:ba(),[v.EXIT]:["confirm"],[v.EXPORT]:[],[v.SYNC]:[],[v.INIT]:[],[v.HELP]:[],[v.PEEK]:[...yo(),"now","prev","next"],[v.EDIT]:[...Ea],[v.DELETE]:["confirm"],[v.RE_OPEN_ISSUE]:["confirm"],[v.CLOSE_ISSUE]:["confirm"],[v.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[v.FILTER]:["tag","assignee","description","title","clear"],[v.TAG]:[...new Set([...Object.keys(et),...N.getExistingTags()])],[v.UNTAG]:[...Vt()?.value?.map(({name:o})=>o)??[]],[v.UNASSIGN]:[...zt()?.value?.map(({name:o})=>o)??[]],[v.ASSIGN]:N.getExistingAssignees(),[v.NEW]:Sa(n),[v.CONFIG]:[...Ia]}[e]??[]};import tt from"chalk";var No=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import{decodeTime as ho}from"ulid";var Io=e=>{let t=Date.now()-e,n=[{label:"y",ms:1e3*60*60*24*365},{label:"mo",ms:1e3*60*60*24*30},{label:"w",ms:1e3*60*60*24*7},{label:"d",ms:1e3*60*60*24},{label:"h",ms:1e3*60*60},{label:"m",ms:1e3*60},{label:"s",ms:1e3}];for(let{label:r,ms:o}of n){let i=Math.floor(t/o);if(i>=1)return`${i}${r} ago`}return"just now"};var Eo=e=>{try{return c("Decoded date",new Date(ho(e)))}catch(t){return s("Decoding failed + "+t.message)}},Vn=e=>{if(!e?.id)return null;try{return ho(e.id)}catch{return null}};var Le=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?c("Found node",n):s("Unable to find node in breadcrumb")};import Co from"chalk";var Gn={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Ra=(e,t,n)=>Math.max(t,Math.min(n,e)),zn=(e,t,n)=>e+(t-e)*n,So=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Aa=(e,t,n)=>{let r=t/100,o=n/100,i=(1-Math.abs(2*o-1))*r,d=e/60,l=i*(1-Math.abs(d%2-1)),u=0,m=0,p=0;d>=0&&d<1?(u=i,m=l):d>=1&&d<2?(u=l,m=i):d>=2&&d<3?(m=i,p=l):d>=3&&d<4?(m=l,p=i):d>=4&&d<5?(u=l,p=i):(u=i,p=l);let x=o-i/2;return[Math.round((u+x)*255),Math.round((m+x)*255),Math.round((p+x)*255)]},wa=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,Ta=(e,t,n)=>[Math.round(zn(e[0],t[0],n)),Math.round(zn(e[1],t[1],n)),Math.round(zn(e[2],t[2],n))],xt=e=>{let n=So(e)%360,r=Aa(n,Gn.stringColor.saturation,Gn.stringColor.lightness);return wa(r)},Ma=e=>{let t=Gn.gradient.stops,n=Ra(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let r=t.length-1,o=n*r,i=Math.min(Math.floor(o),r-1),d=o-i;return Ta(t[i],t[i+1],d)},Xt=e=>So(e.toLowerCase().trim())/4294967295,ka=e=>{let t=Xt(e);return Ma(t)},Pa=e=>{let[t,n,r]=ka(e);return{normal:o=>Co.bgRgb(t,n,r).black(o),cursor:o=>Co.bgRgb(t,n,r).white.bold(o)}};var Yn=e=>Pa(e).normal(` ${e} `),re=(e,t=et)=>{let r=(o=>o.toLowerCase().trim())(e);return r&&t[r]?t[r]:xt(r)};var He={None:"none",Invalid:"invalid",Valid:"valid"};var Fa=["BOARD","TICKET","SWIMLANE"],Jn=()=>{let e=f().selectedNode;return e?.context?Fa.includes(e.context)?B():O({message:"Command not available in this context"}):O({message:"Missing target context"})},X="<ENTER> to confirm",B=(e="",t=[])=>({message:e,validity:He.Valid,completionWordList:t}),O=({message:e,completionWordList:t=[]})=>({validity:He.Invalid,message:e,completionWordList:t}),Jt=e=>e.length===0,se=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:i=1})=>{let d=o.trim();if(d.length<i)return"";let p=[...t.filter(Boolean).filter(x=>x.startsWith(d))].sort((x,h)=>Xt(x)-Xt(h)).slice(0,r).map(Yn).join(" ");return p?`${e}${p}${n}`:""},Xn=({modifier:e})=>{let t="confirm";return e===t?B(X):O({message:Jt(e)?`if you are certain, enter ${Yn(t)}`:"",completionWordList:[t]})},Da=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?O({message:n}):B():O({message:Jt(r)?t:"",completionWordList:[...e]}),Nt=({hint:e})=>({modifier:t,inputString:n})=>Jt(t)&&Jt(n)?O({message:e,completionWordList:[]}):B(X),La=({modifier:e,inputString:t})=>{let n=Q(v.CONFIG);if(!n.includes(e))return O({message:se({prefix:"config... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case Y.EDITOR:{let r=[...No];return t.trim()?r.includes(t.trim())?B(X):O({message:se({prefix:"known editors... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):O({message:se({prefix:"editor... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case Y.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?B(X):O({message:se({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case Y.USERNAME:return t.trim()?B(X):O({message:`Enter a username. Saved in ${tt.bgBlack("~/.epiq-global/config.json")}`});case Y.AUTOSYNC:{let r=["yes","no"],o=W().autoSync;if(!r.includes(t.trim())){let i=Qr(o);return O({message:se({prefix:`should auto-sync (recommended)${i!==null?", currently: "+i:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return B(X)}case Y.SYNC_DEBOUNCE_MS:{let r=W().autoSyncIntervalMs,o=Hr(t);if(!t.trim()||o===null||o<Je){let i=se({prefix:" examples: ",wordList:qn,minLengthForHints:0,inputString:t});return O({message:`provide duration above ${Je}ms. current duration: ${r}ms.`+i,completionWordList:qn})}return B(X)}default:return O({message:"Unknown config option",completionWordList:n})}},Oa=({modifier:e})=>{let t=Q(v.EDIT);if(!t.includes(e)){let r=se({prefix:"edit... ",wordList:t,inputString:e,minLengthForHints:0});return O({message:r||"Unknown edit option",completionWordList:t})}let n=Jn();if(n.validity==="invalid")return n;switch(e){case De.TITLE:return B(X);case De.DESCRIPTION:return B("<ENTER> to edit in "+W().preferredEditor);default:return O({message:"Unknown edit option",completionWordList:t})}},Ua={[v.EXPORT]:()=>B(X+", and create export markdown file"),[v.PEEK]:e=>{let t=e.modifier;if(t==="now")return B(X);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 B(X);let r=Gt(t);if(!t||!r)return O(n);let o=Le(f().breadCrumb,"BOARD");if(a(o))return O({message:"Command is not applicable in this context"});let i=Eo(o.value.id);return a(i)?O({message:"Unable to peek: board id is not a valid ULID"}):vo({date:r,horizonDate:i.value})?B(X):O({message:tt.red(`nothing to peek before ${i.value.toISOString().slice(0,16).replace("T"," ")}`)})},[v.EXIT]:()=>B(X+" and exit the application"),[v.INIT]:()=>B(X),[v.FILTER]:e=>{if(e.modifier==="clear")return B();let t=i=>Q(v.FILTER).includes(i);if(!e.modifier||!t(e.modifier))return O({message:se({wordList:Q(v.FILTER),inputString:e.inputString}),completionWordList:Q(v.FILTER)});let n=Object.values(f().tags).map(i=>i.name),r=Object.values(f().contributors).map(i=>i.name),o=e.modifier==="tag"?n:e.modifier==="assignee"?r:[];return e.inputString?o.length&&!o.includes(e.inputString.trim())?O({message:se({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString}),completionWordList:o}):B():O({message:se({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString}),completionWordList:o})},[v.NONE]:e=>{let t=Q(v.NONE);return e.command?B():O({message:se({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[v.NEW]:e=>Da({list:Q(v.NEW),hint:se({wordList:Q(v.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[v.HELP]:()=>B(X),[v.EDIT]:Oa,[v.CONFIG]:La,[v.DELETE]:e=>{let t=Jn();return t.validity==="invalid"?t:Xn(e)},[v.CLOSE_ISSUE]:e=>Xn(e),[v.RE_OPEN_ISSUE]:e=>Xn(e),[v.MOVE]:e=>{let t=Jn();return t.validity==="invalid"?t:Nt({hint:se({prefix:"hey hacker! These commands are blocked for you... ",wordList:Q(v.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[v.TAG]:e=>{let n=N.getExistingTags().map(r=>` ${tt.bgHex(re(r))(" "+r+" ")} `).slice(0,10).join("");return Nt({hint:n.length?"existing tags ... "+n:"create tag ..."})(e)},[v.UNTAG]:e=>{let t=Vt();if(a(t))return O({message:"Invalid untag target",completionWordList:[]});let n=t.value.map(({name:r})=>r).map(r=>` ${tt.bgHex(re(r))(" "+r+" ")} `).slice(0,10);return n.length?Nt({hint:" ... "+n.join("")})(e):O({message:"Issue has no tags",completionWordList:[]})},[v.ASSIGN]:e=>{let t=N.getExistingAssignees().map(n=>` ${tt.bgHex(re(n))(" "+n+" ")} `).slice(0,10);return Nt({hint:"assign to... "+t.join("")})(e)},[v.UNASSIGN]:e=>{let t=zt();if(a(t))return O({message:"Invalid unassign target",completionWordList:[]});let n=t.value.map(({name:r})=>r).map(r=>` ${tt.bgHex(re(r))(" "+r+" ")} `).slice(0,10);return n.length?Nt({hint:"remove assignee... "+n.join("")})(e):O({message:"Issue has no assignees",completionWordList:[]})},[v.SYNC]:()=>B(X)},bo=Object.fromEntries(Object.entries(Ua).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var Ro=["frontend","backend","infrastructure","architecture","integration","configuration","implementation","application","deployment","environment","framework","platform","service","component","module","gateway","pipeline","containerization","orchestrator","exception","incident","defect","regression","degradation","malfunction","instability","intermittent","reproducibility","reproduction","investigation","triage","workaround","mitigation","remediation","optimization","stabilization","refinement","failure","outage","blocking","criticality","severity","escalation","diagnostics","analysis","resolution","corruption","inconsistency","validation","verification","authorization","authentication","confidentiality","availability","accessibility","reliability","compliance","governance","encryption","decryption","integrity","auditing","traceability","accountability","protection","privileges","permissions","dependency","orchestration","provisioning","synchronization","compatibility","incompatibility","interoperability","observability","instrumentation","telemetry","loadbalancing","discovery","registration","scheduling","coordination","distribution","isolation","virtualization","serialization","deserialization","initialization","instantiation","propagation","aggregation","consolidation","normalization","standardization","transformation","reconciliation","correlation","processing","indexing","partitioning","enrichment","validation","filtering","streaming","batching","concurrency","parallelism","contention","deadlock","throttling","ratelimiting","backpressure","fragmentation","saturation","exhaustion","partitioning","replication","redundancy","failover","deprecation","obsolescence","starvation","overload","underutilization","latency","throughput","refactoring","modularization","encapsulation","abstraction","extensibility","configurability","maintainability","recoverability","sustainability","readability","testability","debuggability","reusability","simplicity","consistency","performance","functionality","requirement","recommendation","improvement","enhancement","clarification","documentation","description","acceptance","criteria","estimation","prioritization","dependency","deliverable","milestone","iteration"];var w={Exit:"exit",Init:"init",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",Peek:"peek",Config:"config",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",Export:"export"};var Ao=e=>Object.values(v).includes(e),wo=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:i}=e,{message:d,validity:l,completionWordList:u}=bo[n].validate(n,r,i),m=o==="command"||o==="modifier"?Q(n):Ro;return{validity:l,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:d??"",autoCompletion:t?Wr(e,[...u,...m]):{hint:"",hints:[],remainder:"",overlap:0}}};var To=e=>{let t=e.trimStart(),n=_a(t),r=n[0]??"",o=n[1]??"",i=/\s$/.test(e),d=$a(e),l=Ao(r)?r:null,u=l!==null,m=r!=="",p=l?Q(l)??[]:[],x=l&&p.includes(o)?o:"",h="word";n.length===0||n.length===1&&!i?h="command":(n.length===1&&i||n.length===2&&!i)&&(h="modifier");let C=i?"":d,R=Ba(t,l,x);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:d,hasCommand:m,command:l,isCommandKeyword:u,isLastWordCompleted:i,modifier:x,target:h,inputToMatch:C,inputString:R}},Ba=(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},_a=e=>e.trim()?e.trim().split(/\s+/):[],$a=e=>e.trimEnd().split(/\s+/).at(-1)??"";var nt=e=>e===Zn||e===":",Zn=" ",rt={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:He.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},ja=new Set,Mo=()=>{for(let e of ja)e()};var Ce=e=>{let n=e(rt),r=To(n.value),o=n.cursorPosition===n.value.length;rt={...n,commandMeta:wo(r,o)},Mo()},ht=({message:e,status:t})=>{let n=structuredClone(rt);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,rt=n,Mo(),c(e,null)},Qn=e=>{Ce(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},er=e=>{Ce(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&nt(n[o-1]);)o--;for(;o>0&&!nt(n[o-1]);)o--}else{for(;o<n.length&&!nt(n[o]);)o++;for(;o<n.length&&nt(n[o]);)o++}return{...t,cursorPosition:o}})},ko=()=>{Ce(e=>{let t=e.value.slice(e.cursorPosition),n=Math.max(0,e.cursorPosition-1);return{...e,value:e.value.slice(0,n)+t,cursorPosition:n,commandIsPending:!1}})},Po=()=>{Ce(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&nt(t[r-1]);)r--;for(;r>0&&!nt(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},U=e=>{Ce(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),r=t.value.slice(0,n),o=t.value.slice(n),i=e(r,t.commandMeta.autoCompletion),d=i+o,l=Math.max(0,Math.min(i.length,d.length));return{...t,value:d,cursorPosition:l,commandIsPending:!1}})},Fo=()=>{Ce(e=>({...e,commandIsPending:!0}))},Do=({addToHistory:e=!0})=>{Ce(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),Wa()},Lo=()=>{Ce(e=>{let t=Math.min(e.commandHistoryIndex+1,e.commandHistory.length-1),n=e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},Oo=()=>{Ce(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},Wa=()=>U(()=>""),ee=()=>rt,Uo=()=>{let[e,...t]=rt.value.split(Zn);return t.join(Zn).trim()};var T={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 Bo=e=>{let{context:t}=f()?.currentNode;if(!t)return w.None;switch(e){case v.EXIT:return w.Exit;case v.EXPORT:return w.Export;case v.INIT:return w.Init;case v.DELETE:return w.Delete;case v.EDIT:return w.Edit;case v.HELP:return w.ViewHelp;case v.RE_OPEN_ISSUE:return w.ReopenIssue;case v.CLOSE_ISSUE:return w.CloseIssue;case v.TAG:return w.TagTicket;case v.UNTAG:return w.UntagTicket;case v.ASSIGN:return w.AssignUserToTicket;case v.UNASSIGN:return w.UnassignUserFromTicket;case v.NEW:return w.NewItem;case v.FILTER:return w.Filter;case v.MOVE:return w.Move;case v.PEEK:return w.Peek;case v.CONFIG:return w.Config;case v.SYNC:return w.Sync;default:return w.None}};import{ulid as q}from"ulid";import ti from"node:fs";import vd from"node:path";import yd from"react";import{Box as gd}from"ink";import sn from"react";import{Box as rr,Text as ed}from"ink";import Ne from"react";import{Text as _o}from"ink";import $o,{useEffect as jo,useState as Ha}from"react";var Wo={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"command-line":["\u276F "]},le=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=xe(),r=Wo[n]??Wo.default,[o,i]=Ha(0);if(jo(()=>{i(0)},[r]),jo(()=>{if(!e)return;let l=setInterval(()=>{i(u=>(u+1)%r.length)},500);return()=>clearInterval(l)},[e,r]),!e)return $o.createElement(_o,null,t);let d=r[o]??r[0]??t;return $o.createElement(_o,{color:M.accent,dimColor:o===1},d)};import{Box as tr,Text as Ka}from"ink";import Zt from"react";var Qt=({children:e=[],height:t,selectedIndex:n,itemHeight:r=1,scrollByOne:o=!1})=>{if(e.length===0)return null;let i=Math.max(1,Math.floor(t)),d=Math.max(1,Math.ceil(r)),l=Math.max(1,Math.floor(i/d)),u=Math.max(0,Math.min(n,e.length-1)),m=Math.max(0,e.length-l),p=o?Math.min(m,Math.max(0,u-l+1)):Math.min(m,Math.floor(u/l)*l),x=p+l,h=e.slice(p,x),C=e.length>l,R=i,b=C?Math.max(1,Math.floor(l/e.length*R)):R,E=Math.max(0,R-b),A=Math.max(1,e.length-l),H=C?Math.floor(p/A*E):0;return Zt.createElement(tr,{flexDirection:"row",height:i,width:"100%"},Zt.createElement(tr,{flexDirection:"column",flexGrow:1,height:i},h),Zt.createElement(tr,{flexDirection:"column",width:1,height:R},Array.from({length:R}).map((we,ie)=>Zt.createElement(Ka,{key:ie,color:C&&ie>=H&&ie<H+b?M.accent:M.secondary},C?"\u2502":" "))))};import{Box as nn,Text as Ja}from"ink";import Ke from"react";import{Text as qa}from"ink";import Va from"react";var za=e=>e.toLowerCase().trim(),Ga=(e,t=et)=>{let n=za(e);return t[n]?t[n]:xt(n)},en=({id:e,isSelected:t})=>{let n=N.getContributor(e);if(n)return Va.createElement(qa,{underline:t,color:Ga(n.name)},"@"+n.name)};import{Text as Ya}from"ink";import Xa from"react";var tn=({id:e,isSelected:t})=>{let n=N.getTag(e);if(n)return Xa.createElement(Ya,{underline:t,backgroundColor:re(n.name),color:M.primary}," "+n.name+" ")};var Ho=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=Ft(Xe(t.title),r),i=Wn(t),d=Hn(t);return Ke.createElement(nn,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?M.accent:M.secondary,justifyContent:"space-between"},Ke.createElement(nn,{borderBottom:!0},Ke.createElement(nn,{paddingLeft:1,flexDirection:"column"},Ke.createElement(Ja,{color:M.primary},o))),Ke.createElement(nn,{flexDirection:"row",paddingLeft:1},i.map(l=>Ke.createElement(tn,{key:l.id,id:l.id})),d.map(l=>Ke.createElement(en,{key:l.id,id:l.id}))))};import Za from"chalk";import{Box as It,Text as nr}from"ink";import Se from"react";var Qa=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,Ko=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let i=S(t.id),d=b=>{let E=i.find(A=>A.title===b);return E?S(E.id).map(A=>typeof A.props?.value=="string"?A.props.value:"").filter(A=>!!A):[]},l=d("Tags").map(b=>N.getTag(b)).filter(b=>!!b),u=d("Assignees").map(b=>N.getContributor(b)).filter(b=>!!b),m=1,p=l.length*(1+m),x=u.length*(2+m),h=l.map(b=>Se.createElement(It,{key:b.id,paddingRight:m},Se.createElement(nr,{color:re(b.name)},"\u25A0"))),C=u.map(b=>Se.createElement(It,{key:b.id,paddingRight:m},Se.createElement(nr,{color:xt(b.name)},"@"+b.name.at(0)))),R=n?M.accent:o===g.MOVE?M.secondary:M.primary;return Se.createElement(It,{borderBottom:!0,justifyContent:"space-between"},Se.createElement(It,null,Se.createElement(le,{isSelected:n,placeholder:Za.dim.gray(r+1+" ")}),Se.createElement(nr,{wrap:"truncate",color:R},Qa(t.title,e-p-x-14))),Se.createElement(It,null,h,C))};var td=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:i,listSelectedIndex:d,mode:l})=>{let{renderedChildrenIndex:u}=xe(),m=u[e.id]??[],p=`${e.title} (${m.length})`,x=3,h=o?1:4,C=r-x-(o?2:1),R=Ne.createElement(rr,{borderStyle:"round",borderColor:M.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},Ne.createElement(le,{isSelected:t}),Ne.createElement(ed,{bold:!0,color:t?M.accent:M.primary},p," ",e.readonly?"\u{1F512}":"")),b=(E,A)=>{let H=i&&d===A;return o?Ne.createElement(Ko,{key:E.id,index:A,width:n,ticket:E,isSelected:H,mode:l}):Ne.createElement(Ho,{key:E.id,width:n,ticket:E,isSelected:H})};return Ne.createElement(rr,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?M.accent:M.secondary,paddingRight:1,paddingLeft:1,height:r},R,Ne.createElement(rr,{padding:o?1:0},m.length>0&&Ne.createElement(Qt,{selectedIndex:d,height:C,itemHeight:h},m.map(b)),Ne.createElement(le,{isSelected:i&&d===-1})))},qo=Ne.memo(td);import{Box as sr,Text as md}from"ink";import Oe,{useEffect as ar,useMemo as Jo}from"react";import qe from"chalk";import Vo from"string-width";import{decodeTime as nd}from"ulid";var rd=(e,t)=>e+" ".repeat(Math.max(0,t-Vo(e))),od=(e,t)=>" ".repeat(Math.max(0,t-Vo(e)))+e,id=e=>(()=>{let n={"add.issue":"Created with title","assign.issue":"Assigned to","unassign.issue":"Unassigned from","close.issue":"Closed","delete.node":"Deleted","edit.title":"Changed title to","edit.description":"Changed description","reopen.issue":"Reopened","tag.issue":"Tagged with","untag.issue":"Removed tag","lock.node":"Locked node","move.node":"Moved issue"};return(o=>n[o]??(o.endsWith("e")?`${o}d`:`${o}ed`))(e)})(),sd=e=>{switch(e.action){case"move.node":{let t=N.getNode(e.payload.parent);return`to ${t?qe.dim.bgBlack(` ${t.title} `):"unknown"} with rank ${e.payload.rank}`}case"tag.issue":{let t=f().tags[e.payload.tagId];return t?qe.bgHex(re(t.name))(` ${t.name} `):"unknown tag"}case"untag.issue":{let t=f().tags[e.payload.tagId];return t?qe.bgHex(re(t.name))(` ${t.name} `):"unknown tag"}case"assign.issue":{let t=f().contributors[e.payload.contributor];return t?qe.hex(re(t.name))(` ${t.name} `):"unknown user"}case"unassign.issue":{let t=f().contributors[e.payload.contributor];return t?qe.hex(re(t.name))(` ${t.name} `):"unknown user"}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"create.contributor":case"edit.title":return`"${"name"in e.payload?e.payload.name:""}"`;default:return""}},ad=e=>{let t=Io(nd(e));return qe.gray(od(t,8))},dd=12,cd=e=>rd(`${e}`,dd),zo=e=>{let t=ad(e.id),n=cd(e.userName),r=id(e.action),o=sd(e),i=qe.dim("\u203A"),d=[r,o].filter(Boolean).join(" ");return`${n} ${t} ${i} ${d}`};var L={exit(){process.exit(0)},enterChildNode(){let e=f(),t=e.currentNode,n=Math.max(0,e.selectedIndex),r=S(t.id)[n];!r||t.context==="FIELD"||L.navigate({currentNode:r,selectedIndex:S(r.id).length?0:-1})},enterParentNode(){let{currentNode:e,nodes:t}=f();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=S(n.id),o=r.findIndex(({id:d})=>d===e.id),i=r.length===0?-1:o>=0?o:0;L.navigate({currentNode:n,selectedIndex:i})},navigateToNextItem:()=>Go(1),navigateToPreviousItem:()=>Go(-1),navigateToNextContainer:()=>Yo(1),navigateToPreviousContainer:()=>Yo(-1),navigate:({currentNode:e=f().currentNode,selectedIndex:t})=>{I({currentNodeId:e.id,selectedIndex:t})}},Go=e=>{let t=f(),n=S(t.currentNode.id).length;if(n===0)return;let o=(Math.max(0,t.selectedIndex)+e+n)%n;L.navigate({selectedIndex:o})},Yo=e=>{let{currentNode:t,nodes:n,selectedIndex:r}=f();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!t||!o)return;let i=S(o.id),d=i.findIndex(h=>h.id===t.id);if(d<0)return;let l=i.at(d+e)??i.at(0);if(!l)return;let u=S(l.id),m=Math.max(0,u.length-1),p=Math.min(Math.max(0,r),m),x=u.length?p:-1;L.navigate({currentNode:l,selectedIndex:x})};import{Box as rn,Text as ld}from"ink";import be from"react";var Xo=({selectedIndex:e,parent:t,selected:n})=>{let{currentNode:r}=xe(),{title:o}=t,i=S(t.id).map(d=>{let l=typeof d.props?.value=="string"?d.props.value:"";if(o==="Assignees")return N.getContributor(l)?.id;if(o==="Tags")return N.getTag(l)?.id}).filter(d=>!!d);return be.createElement(rn,{alignItems:"center",paddingTop:1},be.createElement(rn,{minWidth:12},be.createElement(le,{isSelected:n}),be.createElement(ld,{color:n?M.accent:M.secondary2},o,":")),be.createElement(rn,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((d,l)=>{let u=r.id===t.id&&l===e;return be.createElement(rn,{key:`${o}-${d}`,paddingRight:2,minHeight:1},be.createElement(le,{isSelected:u}),o==="Assignees"?be.createElement(en,{isSelected:u,id:d}):o==="Tags"?be.createElement(tn,{isSelected:u,id:d}):null)})))};import{Box as on,Text as or}from"ink";import Re,{useEffect as ud}from"react";var ir=({id:e,label:t,text:n,height:r,selected:o,maxWidth:i})=>{let{selectedIndex:d,currentNode:l}=xe(),u=h=>String(h).replace(/\r?\n/g,""),m=typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[];ud(()=>{let h=[];return m.forEach((C,R)=>{let b=Ee(BigInt(R+1));if(!ct(b))return;let E=J.text({id:`${e}-${R}`,name:`Line ${R+1}`,parentNodeId:e,rank:b.value,props:{value:C},readonly:!0,isVirtual:!0}),A=N.createNode(E);ct(A)&&h.push(A.value.id)}),()=>h.forEach(N.deleteNode)},[e,n]);let p="\u2029",x=m.map((h,C)=>{let R=l.id===e&&d===C;return Re.createElement(on,{key:`${e}-${C}`},Re.createElement(or,{color:R?M.primary:M.secondary2,dimColor:!R},`${C+1} `.padStart(5,"\xA0")),Re.createElement(or,{backgroundColor:R?"gray":""},u(h.length?Ft(h,i-10):p)))});return Re.createElement(on,{flexDirection:"column",paddingTop:1},Re.createElement(on,null,Re.createElement(le,{isSelected:o}),Re.createElement(or,{color:o?M.accent:M.secondary2},t)),Re.createElement(on,{flexDirection:"row",borderStyle:"round",borderColor:M.secondary,paddingLeft:1,paddingRight:1,marginLeft:1},Re.createElement(Qt,{scrollByOne:!0,children:x,height:r-2,selectedIndex:d,itemHeight:1})))};var pd=e=>`${e}::log`,Zo=e=>e==="Assignees"||e==="Tags",Qo=({ticket:e,height:t})=>{let{selectedIndex:n,currentNode:r}=xe(),o=process.stdout.columns||120,i=Jo(()=>pd(e.id),[e.id]),d=Jo(()=>[...e.log].reverse().map(zo).join(`
6
- `),[e.log]);ar(()=>{if(N.getNode(i))return;let A=Ee($e);if(a(A))return;let H={...J.field({id:i,name:G.HISTORY,parentNodeId:e.id,rank:A.value,props:{value:d},isVirtual:!0}),readonly:!0,childRenderAxis:"vertical"};return N.createNode(H),()=>{N.deleteNode(i)}},[i,e.id,d]),ar(()=>{let E=N.getNode(i);E&&E.props.value!==d&&N.updateNode({...E,props:{...E.props,value:d},childRenderAxis:"vertical",readonly:!0})},[i,d]);let l=r.id===e.id,u=r.id===i||r.parentNodeId===i;ar(()=>{u&&(n>=0||L.navigate({selectedIndex:0}))},[u,n]);let m=S(e.id);if(u){let E=N.getNode(i),H=t-3;return Oe.createElement(sr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},E?Oe.createElement(ir,{id:E.id,label:"Event log",text:E.props.value??"",selected:!1,maxWidth:o,height:H}):null)}let p=m.reduce((E,A)=>Zo(A.title)||A.id===i?E+1:E,0),x=2,h=p*1,R=t-3-h-x,b=(E,A)=>Zo(E.title)?Oe.createElement(Xo,{key:E.id,parent:E,selected:A,selectedIndex:n}):E.id===i?Oe.createElement(sr,{key:E.id,paddingTop:1},Oe.createElement(le,{isSelected:A}),Oe.createElement(md,{backgroundColor:M.secondary,color:A?M.accent:M.primary}," History \u203A\u203A ")):E.title===G.DESCRIPTION?Oe.createElement(ir,{label:"Description (press e to edit)",key:E.id,id:E.id,text:E.props.value??"",selected:A,maxWidth:o,height:R}):null;return Oe.createElement(sr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},m.map((E,A)=>b(E,l&&n===A)))};var fd=({swimlanes:e,currentNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:i,height:d,width:l})=>{let u=t.context,m=u===k.TICKET||u===k.FIELD_LIST||u===k.FIELD,p=u===k.BOARD||u===k.SWIMLANE,x=u===k.TICKET?t:r.find(E=>E.context===k.TICKET),h=Math.floor(l/3),C=Math.floor(l/Math.max(e.length,1)),R=Math.min(C,h),b=i==="dense";return sn.createElement(gd,{flexDirection:"row",height:d},p&&e.map((E,A)=>{let H=t.id===E.id,we=H?n:-1,ie=t.context===k.BOARD&&n===A;return sn.createElement(qo,{key:E.id,height:d,width:R,swimlane:E,isSelected:ie,isDense:b,isFocused:H,listSelectedIndex:we,mode:o})}),m&&x&&sn.createElement(Qo,{height:d,ticket:x}))},ei=sn.memo(fd);import{render as xd}from"ink";import{Writable as Nd}from"node:stream";var Et=e=>String(e).padStart(2,"0"),hd=e=>{let t=e.getUTCFullYear(),n=Et(e.getUTCMonth()+1),r=Et(e.getUTCDate()),o=Et(e.getUTCHours()),i=Et(e.getUTCMinutes()),d=Et(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${i}-${d}`},Id=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",Ed=async(e,{width:t,height:n})=>{let r="",o=new Nd({write(d,l,u){let m=Cd(d.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),u()}});o.columns=t,o.rows=n,o.isTTY=!0;let i=xd(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(d=>setTimeout(d,0)),i.unmount(),r},Cd=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),ni=async()=>{let{viewMode:e}=W(),{currentNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:i}=f(),d=r.find(A=>A.context==="BOARD");if(!d)return s("No board found to export");let l=120,u=40,m=await Ed(yd.createElement(ei,{height:u,width:l,swimlanes:(i[d.id]??[]).filter(A=>A!==void 0&&kt(A)),currentNode:t,selectedIndex:n,breadCrumb:r,viewMode:e??"dense",mode:o}),{width:l,height:u});if(!m)return s("Failed to render board export");let p=fe(process.cwd());if(a(p))return s("Unable to export, epiq root not found");let x=new Date,h=hd(x),C=`board_${Id(d.title)}_${h}.md`,R=zr(p.value);ti.mkdirSync(R,{recursive:!0});let b=vd.join(R,C),E=`# Board - ${d.title}
7
- Date: ${x.toISOString()}
2
+ import{McpServer as Rl}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as bl}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as k}from"zod";var Oe={None:"none",Success:"success",Fail:"fail"},s=e=>({status:Oe.Fail,message:e,value:null}),c=(e,t)=>({status:Oe.Success,message:e,value:t}),a=e=>e.status==="fail",Rt=e=>e.status==="success";import{ulid as qs}from"ulid";import ye from"node:fs";import ot from"node:path";var C={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function Vn(e){return e.context===C.WORKSPACE}function F(e){return e.context===C.TICKET}function Zr(e){return e.context===C.TEXT}function Ue(e){return e.context===C.FIELD}function bt(e){return e.context===C.FIELD_LIST}var Yt=e=>e.context===C.SWIMLANE,Qr=e=>e.context===C.BOARD;import{ulid as oa}from"ulid";var at=24n,na=at*4n,Ae=(1n<<na)-1n,ra=/^[0-9a-f]+$/;function eo(e){return!e||!ra.test(e)?s(`Invalid hex rank: ${e}`):c("Converted rank to bigint",BigInt("0x"+e))}function he(e,t=at){if(e<0n)return s("Negative rank not allowed");let n=e.toString(16);return c("Converted bigint to hex rank",n.padStart(Number(t),"0"))}function re(e,t){if(!e&&!t)return he(Ae/2n,at);let n=e?eo(e):c("Resolved lower bound",0n);if(a(n))return n;let r=t?eo(t):c("Resolved upper bound",Ae);if(a(r))return r;let o=n.value,i=r.value;if(i<=o)return he(Ae/2n,at);let d=(o+i)/2n;return d===o||d===i?s("No rank space available between neighbors"):he(d,at)}function to(e){if(e<=0)return c("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=Ae*BigInt(r+1)/(t+1n),i=he(o,at);if(a(i))return i;n.push(i.value)}return c("Resolved evenly spaced ranks",n)}var Gn=(e,t)=>{let n=j(e),r=to(n.length);if(a(r))return r;let o={};for(let i=0;i<n.length;i++){let d=n[i],l=r.value[i];if(!d||!l)return s("Unable to assign rebalance rank");o[d.id]=l}return c("Created rebalance event",{id:oa(),action:"rebalance.children",payload:{parent:e,ranks:o},...t})};import kt from"node:fs";import Te from"node:path";import tr from"node:fs";import fa from"node:os";import Ie from"node:path";import At from"node:fs";import{ulid as ia}from"ulid";import{z as Xt}from"zod";var sa="_epiq/_evt",aa=Xt.object({projectId:Xt.string().min(1),stateBranch:Xt.string().min(1),createdAt:Xt.iso.datetime()}),no=()=>({projectId:ia(),stateBranch:sa,createdAt:new Date().toISOString()}),Be=e=>{let t=Zt(e);if(!At.existsSync(t))return s("Missing .epiq/project.json");try{let n=At.readFileSync(t,"utf8"),r=JSON.parse(n),o=aa.safeParse(r);return o.success?c("Read project.json",o.data):s(`Invalid .epiq/project.json: ${o.error.issues.map(i=>`${i.path.join(".")}: ${i.message}`).join(", ")}`)}catch(n){return s(n instanceof Error?`Failed to read .epiq/project.json: ${n.message}`:"Failed to read .epiq/project.json")}},ro=e=>{let t=Be(e);return a(t)?s(t.message):c("Read projectId",t.value.projectId)},oo=({repoRoot:e,fileContents:t})=>{let n=Jt(e),r=Zt(e);try{if(At.mkdirSync(n,{recursive:!0}),At.existsSync(r)){let o=Be(e);return a(o)?s(o.message):c("Project already initialized",null)}return At.writeFileSync(r,JSON.stringify(t,null,2)+`
3
+ `,"utf8"),c("Created project.json",null)}catch(o){return s(o instanceof Error?`Failed to initialize project: ${o.message}`:"Failed to initialize project")}};var Yn=(e,t)=>{let n=new Map,r=t??((...i)=>JSON.stringify(i)),o=((...i)=>{let d=r(...i);if(!n.has(d)){let l=e(...i).then(u=>(a(u)&&n.delete(d),u));n.set(d,l)}return n.get(d)});return o.clear=()=>n.clear(),o};import wt from"fs";import so from"path";import da from"util";var io=1e3,ca=50,Xn=0,ao=()=>{let e=process.cwd(),t=dt(e);if(!a(t))return so.join(t.value,we,"log","epiq.log")};function la(){let e=ao();if(!e||!wt.existsSync(e))return;let n=wt.readFileSync(e,"utf8").split(`
4
+ `);if(n[n.length-1]===""&&n.pop(),n.length<=io)return;let r=n.slice(-io).join(`
5
+ `)+`
6
+ `;wt.writeFileSync(e,r,"utf8")}function Jn(e,t,n=!1){let r=ao();if(!r)return;let o=da.format(...t),i=new Date,l=`[${n?i.toISOString().slice(11,19):i.toISOString()}] ${e} ${o}
7
+ `;wt.mkdirSync(so.dirname(r),{recursive:!0}),wt.appendFileSync(r,l,"utf8"),Xn++,Xn>=ca&&(Xn=0,la())}var te={info(...e){Jn("[Info]",e,!1)},debug(...e){Jn("[debug]",e,!0)},error(...e){let t=e.find(n=>n instanceof Error)instanceof Error?void 0:new Error().stack;Jn("[Error]",[...e,t].filter(Boolean),!1)}};globalThis.logger=te;import{spawn as ua}from"node:child_process";import Qt from"node:fs";import Tt from"node:path";var q={stage:({cwd:e,pathspec:t})=>L({args:["add",...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1})=>L({args:["commit",...n?["--allow-empty"]:[],"-m",t],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>L({args:["fetch",t,n],cwd:e}),pullRebase:({cwd:e,remote:t,branch:n})=>L({args:["pull","--rebase",t,n],cwd:e}),checkout:({cwd:e,branch:t})=>L({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 L({args:o,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>L({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>L({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>L({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>L({args:["worktree","prune"],cwd:e})};var Ke=e=>{let t=_e(e);if(a(t))return s("Unable to resolve epiq project root");let n=Be(t.value);return a(n)?s("Unable to read project.json"):c("Resolved state branch",n.value.stateBranch)},oe="origin";var co=1e4,ma={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo"},uo=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!Qt.existsSync(t)){let p=`Git cwd does not exist: ${t}`;if(n){r({stdout:"",stderr:p,exitCode:1});return}r(s(p));return}let o=ua("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:ma}),i=!1,d="",l="",u=p=>{i||(i=!0,clearTimeout(m),r(p))},m=setTimeout(()=>{o.kill("SIGTERM");let p=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${co}ms`].join(`
8
+ `);u(n?{stdout:d,stderr:p,exitCode:124}:s(p))},co);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",p=>{d+=p}),o.stderr.on("data",p=>{l+=p}),o.on("error",p=>{if(n){u({stdout:d,stderr:p.message,exitCode:1});return}u(s([`git ${e.join(" ")}`,`cwd=${t}`,p.message].join(`
9
+ `)))}),o.on("close",p=>{let y=p??1;if(n){u({stdout:d,stderr:l,exitCode:y});return}if(y!==0){u(s([`git ${e.join(" ")}`,l.trim()||d.trim()||"Git command failed"].filter(Boolean).join(`
10
+ `)));return}u(c("Git command succeeded",{stdout:d,stderr:l,exitCode:y}))})}),L=({args:e,cwd:t})=>uo({args:e,cwd:t,allowFail:!1}),ue=({args:e,cwd:t})=>uo({args:e,cwd:t,allowFail:!0}),ct=async({cwd:e,message:t})=>{let n=await q.commit({cwd:e,message:t});if(a(n))return s(`Failed to create commit
11
+ ${n.message}`);let r=await L({args:["rev-parse","HEAD"],cwd:e});return a(r)?s(`Commit created, but failed to read HEAD SHA
12
+ ${r.message}`):c("Created commit and resolved SHA",r.value.stdout.trim())},pa=async e=>{let t=await L({cwd:e,args:["rev-parse","--git-dir"]});if(a(t))return s(t.message);let n=t.value.stdout.trim();return c("Resolved git dir",Tt.isAbsolute(n)?n:Tt.resolve(e,n))},ga=async e=>{let t=await pa(e);if(a(t))return s(t.message);let n=t.value,r={MERGE_HEAD:"merge in progress",REBASE_HEAD:"rebase in progress",CHERRY_PICK_HEAD:"cherry-pick in progress",REVERT_HEAD:"revert in progress",BISECT_LOG:"bisect in progress"};for(let[u,m]of Object.entries(r))if(Qt.existsSync(Tt.join(n,u)))return c("Checked for in-progress Git operation",m);let o={"rebase-merge":"rebase in progress","rebase-apply":"rebase in progress"};for(let[u,m]of Object.entries(o))if(Qt.existsSync(Tt.join(n,u)))return c("Checked for in-progress Git operation",m);let i=await L({cwd:e,args:["status","--porcelain=v1","--branch"]});if(a(i))return s(i.message);let d=i.value.stdout.toLowerCase(),l=["rebase in progress","merge in progress","cherry-pick in progress","revert in progress","bisect in progress"].find(u=>d.includes(u));return c("Checked for in-progress Git operation",l??null)},en=async e=>{let t=await ga(e);return a(t)?s(t.message):c("Checked for in-progress Git operation",t.value!==null)},Zn=async({repoRoot:e})=>{let n=(await ue({args:["remote","get-url",oe],cwd:e})).exitCode===0;return c(`Checked remote ${n}`,n)},Mt=async({repoRoot:e,branch:t})=>{let n=await ue({args:["ls-remote","--heads",oe,t],cwd:e});return n.exitCode!==0?s(n.stderr.trim()||`Unable to inspect remote branch ${oe}/${t}`):c("Checked remote branch",n.stdout.trim().length>0)},tn=async({repoRoot:e,branch:t})=>{let n=await ue({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?c("Local branch exists",!0):n.exitCode===1?c("Local branch missing",!1):s(n.stderr.trim()||`Unable to inspect branch ${t}`)},lo=e=>{try{return Qt.realpathSync.native(e)}catch{return Tt.resolve(e)}},mo=async({repoRoot:e,worktreeRoot:t})=>{let n=await L({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return s(n.message);let r=lo(t),o=n.value.stdout.split(`
13
+ `).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(lo).includes(r);return c("Checked worktree registration",o)},Qn=async e=>{let t=await ue({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return c("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},nn=async e=>{let t=await L({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return a(t)?s(t.message):c("Resolved current branch",t.value.stdout.trim())},po=async e=>{let t=await L({args:["rev-parse","--short","HEAD"],cwd:e});return a(t)?s(t.message):c("Resolved short HEAD sha",t.value.stdout.trim())},go=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),fo=async e=>(await ue({cwd:e,args:["rebase","--abort"]})).exitCode===0?c("Aborted stale rebase",!0):c("No rebase to abort",!1),vo=async({cwd:e,branch:t})=>{let n=await Mt({repoRoot:e,branch:t});if(a(n))return s(n.message);if(!n.value)return c("Remote branch missing, skipped reset",!1);let r=await q.fetch({cwd:e,remote:oe,branch:t});if(a(r))return s(`Failed to fetch ${t}
14
+ ${r.message}`);let o=await fo(e);if(a(o))return s(o.message);let i=await L({cwd:e,args:["reset","--hard",`${oe}/${t}`]});return a(i)?s(`Failed to reset ${t} from remote
15
+ ${i.message}`):c("Reset branch from remote",!0)},er=async({cwd:e,branch:t})=>{let n=await Mt({repoRoot:e,branch:t});if(a(n))return s(n.message);if(!n.value)return c("Remote branch missing, skipped pull",!1);let r=await fo(e);if(a(r))return s(r.message);let o=await q.fetch({cwd:e,remote:oe,branch:t});if(a(o))return s(`Failed to fetch ${t}
16
+ ${o.message}`);let i=await q.pullRebase({cwd:e,remote:oe,branch:t});return a(i)?s(`Failed during pull --rebase
17
+ ${i.message}`):c("Pulled with rebase",!0)},yo=async e=>{let t=await ue({args:["diff","--cached","--quiet"],cwd:e});return t.exitCode===0?c("No staged changes",!1):t.exitCode===1?c("Has staged changes",!0):s(t.stderr.trim()||"Unable to inspect staged changes")};var ho=async e=>{let t=await nn(e);return a(t)?s(t.message):c("Checked detached HEAD state",t.value==="HEAD")};var Eo="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Ve=e=>Ie.join(we,an,e),No=()=>Ie.join(fa.homedir(),me),rn=()=>Ie.join(No(),"worktrees"),on=({repoRoot:e})=>{let t=ro(e);return a(t)?s(t.message):c("Resolved state branch root",Ie.join(rn(),t.value))},va=e=>Ie.join(e,we),xo=e=>Ie.join(va(e),an);var Pt=e=>{try{return tr.mkdirSync(e,{recursive:!0}),c("Ensured directory",void 0)}catch(t){return s(t instanceof Error?t.message:String(t))}},sn=()=>{let e=Pt(No());if(a(e))return s(`Ensure epiq home failed.
18
+ `+e.message);let t=Pt(rn());return a(t)?s(`Ensure worktrees dir failed.
19
+ `+t.message):c("Ensured epiq storage",!0)},Io=e=>{tr.existsSync(e)&&(te.debug("[sync] remove path",e),tr.rmSync(e,{recursive:!0,force:!0}))};var So=(e,t)=>{for(let n of[xo(e),xo(t)]){let r=Pt(n);if(a(r))return s(r.message)}return c("Ensured state branch",void 0)},Co=async e=>{let t=await L({args:["ls-tree","--name-only","HEAD"],cwd:e});if(a(t))return s(`ensure state branch is storage only failed
20
+ `+t.message);let r=t.value.stdout.trim().split(`
21
+ `).filter(Boolean).filter(d=>d!==we);if(r.length===0)return c("State branch is storage-only",!1);let o=await L({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(a(o))return s(`Failed to clean storage branch
22
+ ${o.message}`);let i=await ct({cwd:e,message:"[epiq:repair-storage-branch]"});return a(i)?s(i.message):c("Cleaned storage branch",!0)},lt=Yn(async(e=process.cwd())=>{let t=await L({args:["rev-parse","--show-toplevel"],cwd:e});return a(t)?s("Not inside a Git repository"):c("Resolved repo root",t.value.stdout.trim())},e=>Ie.resolve(e)),wu=Yn(async e=>{let t=await L({args:["rev-parse","--git-dir"],cwd:e});if(a(t))return s(t.message);let n=t.value.stdout.trim(),r=Ie.isAbsolute(n)?n:Ie.join(e,n);return c("Resolved git dir",r)},e=>Ie.resolve(e));var Du=process.env.IS_LOCAL==="true",we=".epiq",me=".epiq-global",an="events",ya="project.json",Jt=e=>Te.join(e,we),Zt=e=>Te.join(Jt(e),ya),Lt=e=>Te.join(Jt(e),an),Ro=e=>Te.join(e,we),ha=e=>{let t=Te.join(e,we);return kt.existsSync(t)&&kt.statSync(t).isDirectory()},nr=e=>{let t=Zt(e);return kt.existsSync(t)&&kt.statSync(t).isFile()},dt=e=>{let t=Te.resolve(e);for(;;){if(ha(t))return c("Resolved closest .epiq root",t);let n=Te.dirname(t);if(n===t)return s("No .epiq directory found in any parent");t=n}},_e=e=>{let t=Te.resolve(e);for(;;){if(nr(t))return c("Resolved closest epiq project root",t);let n=Te.dirname(t);if(n===t)return s("No .epiq/project.json found in any parent");t=n}},bo=e=>{let t=Lt(e);try{return kt.mkdirSync(t,{recursive:!0}),c("Resolved events dir",t)}catch(n){return s(n instanceof Error?`Failed to ensure events dir: ${n.message}`:"Failed to ensure events dir")}},xe=async()=>{let e=await lt(process.cwd());if(a(e))return e;let t=on({repoRoot:e.value});return a(t)?t:c("Resolved persist root",t.value)};var G={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History"};import{useSyncExternalStore as Wc}from"react";var g={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line",PALETTE:"palette"};function dn(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var cn=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",ln=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var Ao=e=>{let t=new Map;for(let n of e)for(let r=1;r<=n.length;r++){let o=n.slice(0,r),i=t.get(o);i?i.push(n):t.set(o,[n])}return t},wo=(e,t)=>t?e.get(t)??[]:[];var To=new WeakMap,xa=e=>{let t=To.get(e);return t||(t=Ao(e),To.set(e,t)),t};var Mo=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return wo(xa(e),r).filter(i=>dn(r,i)>=n)};var Ea={hint:"",hints:[],overlap:0,remainder:""},Po=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return Ea;let o=Mo({wordList:r,inputToMatch:e,overlapThreshold:1});return Na(t,o)},Na=(e,t)=>{let n=t[0]??"",r=dn(e.toLowerCase(),n.toLowerCase()),[o,i]=n.split(":"),d=r<(o??"").length,l=!!i,p=(l&&d?o:n)+(l&&d?":":" "),y=p.slice(r);return{hint:p,hints:t,overlap:r,remainder:y}};var un={autoSyncIntervalMs:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},z=()=>un,Ee=e=>(un={...un,...e},un);var ut=3e3,ko=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<ut?null:t},Lo=0,rr,or=!1,Ft=!1,ir=()=>{if(or)return!0;let e=Se();return a(e)?!1:e.value.syncStatus.status==="syncing"},Ia=()=>{let e=z().autoSyncIntervalMs??1e4,t=Date.now()-Lo;return Math.max(0,e-t)},Fo=()=>{rr||(rr=setTimeout(async()=>{if(rr=void 0,!!mt()){if(ir()){Ft=!0;return}Ft=!1,await Sa()}},Ia()))},Sa=async()=>{if(!mt())return s("Cannot auto-sync before state is initialized");if(ir())return Ft=!0,s("Sync already in progress");or=!0,Lo=Date.now(),x({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await $e()}finally{or=!1,Ft&&Fo()}},Do=()=>{mt()&&(Ft=!0,!ir()&&Fo())};var mn=()=>{let e=z(),t=!!e.userName?.trim(),n=!!e.preferredEditor?.trim(),r=e.autoSync===!0||e.autoSync===!1;return{isSetupDone:n&&t&&r,isSetPreferredEditor:n,isSetUserName:t,userName:e.userName,preferredEditor:e.preferredEditor,autoSync:e.autoSync===void 0?null:e.autoSync,isSetAutoSync:r}},Oo=()=>{let e=_e(process.cwd());if(a(e))return!1;let t=Be(e.value);return Rt(t)},Uo=e=>e===!0?"yes":e===!1?"no":null,Bo=e=>e==="yes"?!0:e==="no"?!1:null;var Z={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#2a2f45",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},w={accent:Z.cyan,accent2:Z.magenta,primary:Z.white,secondary:Z.grayDark,secondary2:Z.grayLight,gray:Z.gray,green:Z.green,yellow:Z.yellow,red:Z.red};var h={red:Z.red,yellow:Z.yellow,green:Z.green,blue:Z.blue,magenta:Z.magenta,cyan:Z.cyan},pt={urgent:h.red,critical:h.red,important:h.red,blocker:h.red,asap:h.red,immediate:h.red,fail:h.red,failure:h.red,broken:h.red,bug:h.red,error:h.red,incident:h.red,outage:h.red,production:h.red,crash:h.red,security:h.red,warning:h.yellow,warn:h.yellow,risky:h.yellow,risk:h.yellow,attention:h.yellow,pending:h.yellow,review:h.yellow,"needs-review":h.yellow,qa:h.yellow,testing:h.yellow,test:h.yellow,validate:h.yellow,verification:h.yellow,staging:h.yellow,check:h.yellow,"follow-up":h.yellow,followup:h.yellow,waiting:h.yellow,blocked:h.yellow,hold:h.yellow,done:h.green,complete:h.green,completed:h.green,success:h.green,ok:h.green,stable:h.green,resolved:h.green,fixed:h.green,closed:h.green,merged:h.green,released:h.green,deployed:h.green,approved:h.green,verified:h.green,working:h.green,healthy:h.green,pass:h.green,passing:h.green,info:h.blue,information:h.blue,note:h.blue,docs:h.blue,documentation:h.blue,doc:h.blue,guide:h.blue,help:h.blue,explanation:h.blue,detail:h.blue,details:h.blue,context:h.blue,design:h.blue,discussion:h.blue,proposal:h.blue,idea:h.blue,feature:h.magenta,enhancement:h.magenta,improvement:h.magenta,refactor:h.magenta,refactoring:h.magenta,cleanup:h.magenta,optimize:h.magenta,optimization:h.magenta,perf:h.magenta,performance:h.magenta,upgrade:h.magenta,migration:h.magenta,modernize:h.magenta,debt:h.magenta,todo:h.cyan,next:h.cyan,planned:h.cyan,plan:h.cyan,future:h.cyan,backlog:h.cyan,investigate:h.cyan,explore:h.cyan,prototype:h.cyan};var Ca=e=>e.props.tags??[],Ra=e=>e.props.assignees??[],sr=e=>Ca(e).map(t=>N.getTag(t)).filter(t=>!!t),ar=e=>Ra(e).map(t=>N.getContributor(t)).filter(t=>!!t),pn=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!F(n)?s("Invalid untag target"):c("Retrieved tags from ticket in breadcrumb",sr(n))},gn=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!F(n)?s("Invalid unassign target"):c("Retrieved assignees from ticket in breadcrumb",ar(n))};var f={PALETTE:"?",EXIT:"exit",INIT:"init",HELP:"help",NEW:"new",TAG:"tag",UNTAG:"untag",MOVE:"move",PEEK:"peek",FILTER:"filter",ASSIGN:"assign",UNASSIGN:"unassign",DELETE:"delete",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",CONFIG:"config",EDIT:"edit",SYNC:"sync",EXPORT:"export",NONE:""};var ba=/^(\d+)(h|d|w|mo|y)$/,Aa=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,wa=({year:e,month:t,day:n,hour:r=0,minute:o=0})=>{let i=new Date(e,t-1,n,r,o);return i.getFullYear()===e&&i.getMonth()===t-1&&i.getDate()===n&&i.getHours()===r&&i.getMinutes()===o},Ta=(e,t=new Date)=>{let n=e.match(ba);if(!n)return null;let[,r,o]=n,i=Number(r);if(!Number.isInteger(i)||i<=0)return null;let d=new Date(t);switch(o){case"h":return d.setHours(d.getHours()-i),d;case"d":return d.setDate(d.getDate()-i),d;case"w":return d.setDate(d.getDate()-i*7),d;case"mo":return d.setMonth(d.getMonth()-i),d;case"y":return d.setFullYear(d.getFullYear()-i),d;default:return null}},Ma=e=>{let t=e.match(Aa);if(!t)return null;let[,n,r,o,i,d]=t,l=Number(n),u=Number(r),m=Number(o),p=i?Number(i):0,y=d?Number(d):0;return wa({year:l,month:u,day:m,hour:p,minute:y})?new Date(l,u-1,m,p,y):null},fn=e=>{let t=e.trim().toLowerCase();return Ta(t)??Ma(t)},_o=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Pa=[{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}],$o=(e=Pa)=>{let t=[];for(let{unit:n,from:r,to:o}of e)for(let i=r;i<=o;i++)t.push(`${i}${n}`);return t};var ka=["BOARD","TICKET","SWIMLANE"],X={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs"},We={TITLE:"title",DESCRIPTION:"description"},La=[X.EDITOR,X.VIEW,X.USERNAME,X.AUTOSYNC,X.SYNC_DEBOUNCE_MS],Fa=[We.TITLE,We.DESCRIPTION],cr=[String(ut),"5000","15000","30000","60000"],Ge=[f.SYNC,f.HELP,f.EXPORT,f.CONFIG],vn=[f.NEW,f.EDIT,f.DELETE,f.MOVE],dr=[f.TAG,f.UNTAG,f.ASSIGN,f.UNASSIGN,f.CLOSE_ISSUE,f.RE_OPEN_ISSUE,f.EDIT],Wo=[f.FILTER,f.PEEK],Da={WORKSPACE:[...Ge,...vn],BOARD:[...Wo,...Ge,...vn],SWIMLANE:[...Wo,...Ge,...vn],TICKET:[...Ge,...vn,...dr],FIELD:[...Ge,...dr],FIELD_LIST:[...Ge,...dr],TEXT:[...Ge]},Oa=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],Ua=()=>{let{selectedNode:e,readOnly:t,breadCrumb:n}=v(),{isSetupDone:r}=mn();if(!r)return[f.HELP,f.CONFIG];if(!Oo())return[f.HELP,f.INIT];if(t)return[f.HELP,f.PEEK,f.EXPORT,f.CONFIG];let o=e?.context,i=o&&ka.includes(o);return[...new Set([...n,e].map(l=>l?.context).flatMap(l=>l?Da[l]:[]))].filter(l=>l===f.MOVE?!1:l===f.EDIT||l===f.DELETE?i:!0)},Q=e=>{let{currentNode:t}=v(),n=t.context??"WORKSPACE";return{[f.NONE]:Ua(),[f.EXIT]:["confirm"],[f.EXPORT]:[],[f.SYNC]:[],[f.INIT]:[],[f.HELP]:[],[f.PEEK]:[...$o(),"now","prev","next"],[f.EDIT]:[...Fa],[f.DELETE]:["confirm"],[f.RE_OPEN_ISSUE]:["confirm"],[f.CLOSE_ISSUE]:["confirm"],[f.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[f.FILTER]:["tag","assignee","description","title","clear"],[f.TAG]:[...new Set([...Object.keys(pt),...N.getExistingTags()])],[f.UNTAG]:[...pn()?.value?.map(({name:o})=>o)??[]],[f.UNASSIGN]:[...gn()?.value?.map(({name:o})=>o)??[]],[f.ASSIGN]:N.getExistingAssignees(),[f.NEW]:Oa(n),[f.CONFIG]:[...La]}[e]??[]};import gt from"chalk";var jo=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import{decodeTime as Ho}from"ulid";var qo=e=>{let t=Date.now()-e,n=[{label:"y",ms:1e3*60*60*24*365},{label:"mo",ms:1e3*60*60*24*30},{label:"w",ms:1e3*60*60*24*7},{label:"d",ms:1e3*60*60*24},{label:"h",ms:1e3*60*60},{label:"m",ms:1e3*60},{label:"s",ms:1e3}];for(let{label:r,ms:o}of n){let i=Math.floor(t/o);if(i>=1)return`${i}${r} ago`}return"just now"};var zo=e=>{try{return c("Decoded date",new Date(Ho(e)))}catch(t){return s("Decoding failed + "+t.message)}},lr=e=>{if(!e?.id)return null;try{return Ho(e.id)}catch{return null}};var Me=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?c("Found node",n):s("Unable to find node in breadcrumb")};import Ko from"chalk";var mr={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Ba=(e,t,n)=>Math.max(t,Math.min(n,e)),ur=(e,t,n)=>e+(t-e)*n,Vo=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},_a=(e,t,n)=>{let r=t/100,o=n/100,i=(1-Math.abs(2*o-1))*r,d=e/60,l=i*(1-Math.abs(d%2-1)),u=0,m=0,p=0;d>=0&&d<1?(u=i,m=l):d>=1&&d<2?(u=l,m=i):d>=2&&d<3?(m=i,p=l):d>=3&&d<4?(m=l,p=i):d>=4&&d<5?(u=l,p=i):(u=i,p=l);let y=o-i/2;return[Math.round((u+y)*255),Math.round((m+y)*255),Math.round((p+y)*255)]},$a=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,Wa=(e,t,n)=>[Math.round(ur(e[0],t[0],n)),Math.round(ur(e[1],t[1],n)),Math.round(ur(e[2],t[2],n))],Dt=e=>{let n=Vo(e)%360,r=_a(n,mr.stringColor.saturation,mr.stringColor.lightness);return $a(r)},ja=e=>{let t=mr.gradient.stops,n=Ba(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let r=t.length-1,o=n*r,i=Math.min(Math.floor(o),r-1),d=o-i;return Wa(t[i],t[i+1],d)},yn=e=>Vo(e.toLowerCase().trim())/4294967295,Ha=e=>{let t=yn(e);return ja(t)},qa=e=>{let[t,n,r]=Ha(e);return{normal:o=>Ko.bgRgb(t,n,r).black(o),cursor:o=>Ko.bgRgb(t,n,r).white.bold(o)}};var pr=e=>qa(e).normal(` ${e} `),ie=(e,t=pt)=>{let r=(o=>o.toLowerCase().trim())(e);return r&&t[r]?t[r]:Dt(r)};var Ye={None:"none",Invalid:"invalid",Valid:"valid"};var za=["BOARD","TICKET","SWIMLANE"],fr=()=>{let e=v().selectedNode;return e?.context?za.includes(e.context)?H():D({message:"Command not available in this context"}):D({message:"Missing target context"})},Y="<ENTER> to confirm",H=(e="",t=[])=>({message:e,validity:Ye.Valid,completionWordList:t}),D=({message:e,completionWordList:t=[]})=>({validity:Ye.Invalid,message:e,completionWordList:t}),hn=e=>e.length===0,ce=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:i=1})=>{let d=o.trim();if(d.length<i)return"";let p=[...t.filter(Boolean).filter(y=>y.startsWith(d))].sort((y,E)=>yn(y)-yn(E)).slice(0,r).map(pr).join(" ");return p?`${e}${p}${n}`:""},gr=({modifier:e})=>{let t="confirm";return e===t?H(Y):D({message:hn(e)?`if you are certain, enter ${pr(t)}`:"",completionWordList:[t]})},Ka=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?D({message:n}):H():D({message:hn(r)?t:"",completionWordList:[...e]}),Ot=({hint:e})=>({modifier:t,inputString:n})=>hn(t)&&hn(n)?D({message:e,completionWordList:[]}):H(Y),Va=({modifier:e,inputString:t})=>{let n=Q(f.CONFIG);if(!n.includes(e))return D({message:ce({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case X.EDITOR:{let r=[...jo];return t.trim()?r.includes(t.trim())?H(Y):D({message:ce({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):D({message:ce({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case X.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?H(Y):D({message:ce({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case X.USERNAME:return t.trim()?H(Y):D({message:`Enter a user name. Saved in ${gt.bgBlack("~/.epiq-global/config.json")}`});case X.AUTOSYNC:{let r=["yes","no"],o=z().autoSync;if(!r.includes(t.trim())){let i=Uo(o);return D({message:ce({prefix:`should auto-sync (recommended)${i!==null?", currently: "+i:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return H(Y)}case X.SYNC_DEBOUNCE_MS:{let r=z().autoSyncIntervalMs,o=ko(t);if(!t.trim()||o===null||o<ut){let i=ce({prefix:" examples: ",wordList:cr,minLengthForHints:0,inputString:t});return D({message:`provide duration above ${ut}ms. current duration: ${r}ms.`+i,completionWordList:cr})}return H(Y)}default:return D({message:"Unknown config option",completionWordList:n})}},Ga=({modifier:e})=>{let t=Q(f.EDIT);if(!t.includes(e)){let r=ce({prefix:"edit... ",wordList:t,inputString:e,minLengthForHints:0});return D({message:r||"Unknown edit option",completionWordList:t})}let n=fr();if(n.validity==="invalid")return n;switch(e){case We.TITLE:return H(Y);case We.DESCRIPTION:return H("<ENTER> to edit in "+z().preferredEditor);default:return D({message:"Unknown edit option",completionWordList:t})}},Ya={[f.EXPORT]:()=>H(Y+", and create export markdown file"),[f.PEEK]:e=>{let t=e.modifier;if(t==="now")return H(Y);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 H(Y);let r=fn(t);if(!t||!r)return D(n);let o=Me(v().breadCrumb,"BOARD");if(a(o))return D({message:"Command is not applicable in this context"});let i=zo(o.value.id);return a(i)?D({message:"Unable to peek: board id is not a valid ULID"}):_o({date:r,horizonDate:i.value})?H(Y):D({message:gt.red(`nothing to peek before ${i.value.toISOString().slice(0,16).replace("T"," ")}`)})},[f.EXIT]:()=>H(Y+" and exit the application"),[f.INIT]:()=>H(Y),[f.PALETTE]:()=>H(Y),[f.FILTER]:e=>{if(e.modifier==="clear")return H();let t=i=>Q(f.FILTER).includes(i);if(!e.modifier||!t(e.modifier))return D({message:ce({wordList:Q(f.FILTER),inputString:e.inputString}),completionWordList:Q(f.FILTER)});let n=Object.values(v().tags).map(i=>i.name),r=Object.values(v().contributors).map(i=>i.name),o=e.modifier==="tag"?n:e.modifier==="assignee"?r:[];return e.inputString?o.length&&!o.includes(e.inputString.trim())?D({message:ce({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString}),completionWordList:o}):H():D({message:ce({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString}),completionWordList:o})},[f.NONE]:e=>{let t=Q(f.NONE);return D({message:ce({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[f.NEW]:e=>Ka({list:Q(f.NEW),hint:ce({wordList:Q(f.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[f.HELP]:()=>H(Y),[f.EDIT]:Ga,[f.CONFIG]:Va,[f.DELETE]:e=>{let t=fr();return t.validity==="invalid"?t:gr(e)},[f.CLOSE_ISSUE]:e=>gr(e),[f.RE_OPEN_ISSUE]:e=>gr(e),[f.MOVE]:e=>{let t=fr();return t.validity==="invalid"?t:Ot({hint:ce({prefix:"hey hacker! These commands are blocked for you... ",wordList:Q(f.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[f.TAG]:e=>{let n=N.getExistingTags().map(r=>` ${gt.bgHex(ie(r))(" "+r+" ")} `).slice(0,10).join("");return Ot({hint:n.length?"existing tags ... "+n:"create tag ..."})(e)},[f.UNTAG]:e=>{let t=pn();if(a(t))return D({message:"Invalid untag target",completionWordList:[]});let n=t.value.map(({name:r})=>r).map(r=>` ${gt.bgHex(ie(r))(" "+r+" ")} `).slice(0,10);return n.length?Ot({hint:" ... "+n.join("")})(e):D({message:"Issue has no tags",completionWordList:[]})},[f.ASSIGN]:e=>{let t=N.getExistingAssignees().map(n=>` ${gt.bgHex(ie(n))(" "+n+" ")} `).slice(0,10);return Ot({hint:"assign to... "+t.join("")})(e)},[f.UNASSIGN]:e=>{let t=gn();if(a(t))return D({message:"Invalid unassign target",completionWordList:[]});let n=t.value.map(({name:r})=>r).map(r=>` ${gt.bgHex(ie(r))(" "+r+" ")} `).slice(0,10);return n.length?Ot({hint:"remove assignee... "+n.join("")})(e):D({message:"Issue has no assignees",completionWordList:[]})},[f.SYNC]:()=>H(Y)},Go=Object.fromEntries(Object.entries(Ya).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var Yo=["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 Xo=e=>Object.values(f).includes(e),Jo=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:i}=e,{message:d,validity:l,completionWordList:u}=Go[n].validate(n,r,i),m=o==="command"||o==="modifier"?Q(n):Yo,{mode:p}=v(),y=p===g.COMMAND_LINE?d??"":"",E=[...u,...m];return{validity:l,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:y,autoCompletion:t?Po(e,E):{hint:"",hints:[],remainder:"",overlap:0}}};var Zo=e=>{let t=e.trimStart(),n=Ja(t),r=n[0]??"",o=n[1]??"",i=/\s$/.test(e),d=Za(e),l=Xo(r)?r:null,u=l!==null,m=r!=="",p=l?Q(l)??[]:[],y=l&&p.includes(o)?o:"",E="word";n.length===0||n.length===1&&!i?E="command":(n.length===1&&i||n.length===2&&!i)&&(E="modifier");let I=i?"":d,A=Xa(t,l,y);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:d,hasCommand:m,command:l,isCommandKeyword:u,isLastWordCompleted:i,modifier:y,target:E,inputToMatch:I,inputString:A}},Xa=(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},Ja=e=>e.trim()?e.trim().split(/\s+/):[],Za=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as Rp}from"react";var ft=e=>e===vr||e===":",vr=" ",vt={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:Ye.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},Qa=new Set,Qo=()=>{for(let e of Qa)e()};var Pe=e=>{let n=e(vt),r=Zo(n.value),o=n.cursorPosition===n.value.length;vt={...n,commandMeta:Jo(r,o)},Qo()},Ut=({message:e,status:t})=>{let n=structuredClone(vt);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,vt=n,Qo(),c(e,null)},yr=e=>{Pe(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},hr=e=>{Pe(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&ft(n[o-1]);)o--;for(;o>0&&!ft(n[o-1]);)o--}else{for(;o<n.length&&!ft(n[o]);)o++;for(;o<n.length&&ft(n[o]);)o++}return{...t,cursorPosition:o}})},ei=()=>{Pe(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}})},ti=()=>{Pe(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&ft(t[r-1]);)r--;for(;r>0&&!ft(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},B=e=>{Pe(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),r=t.value.slice(0,n),o=t.value.slice(n),i=e(r,t.commandMeta.autoCompletion),d=i+o,l=Math.max(0,Math.min(i.length,d.length));return{...t,value:d,cursorPosition:l,commandIsPending:!1}})},ni=()=>{Pe(e=>({...e,commandIsPending:!0}))},ri=({addToHistory:e=!0})=>{Pe(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),ed()},oi=()=>{Pe(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}})},ii=()=>{Pe(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},ed=()=>B(()=>""),J=()=>vt;var si=()=>{let[e,...t]=vt.value.split(vr);return t.join(vr).trim()};var R={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",InitCommandPalette:"initCommandPalette",InitCommandLine:"initCommandLine",ExitCommandLine:"exitCommandLine",CaptureInput:"captureInput",EraseInput:"eraseInput",AddItem:"addItem",GetLastCommandFromHistory:"getLastCommandFromHistory",GetNextCommandFromHistory:"getNextCommandFromHistory",AutoCompleteCommand:"autoCompleteCommand",MoveCursorLeft:"MoveCursorLeft",MoveCursorRight:"MoveCursorRight",MoveCursorLeftOfWord:"MoveCursorLeftOfWord",MoveCursorRightOfWord:"MoveCursorRightOfWord",EraseInputWord:"EraseInputWord",None:"None",Edit:"edit",SetViewDense:"SetViewDense",SetViewWide:"SetViewWide"};var ai=e=>{let{context:t}=v().currentNode;if(!t)return b.None;switch(e){case f.EXIT:return b.Exit;case f.EXPORT:return b.Export;case f.INIT:return b.Init;case f.DELETE:return b.Delete;case f.EDIT:return b.Edit;case f.HELP:return b.ViewHelp;case f.RE_OPEN_ISSUE:return b.ReopenIssue;case f.CLOSE_ISSUE:return b.CloseIssue;case f.TAG:return b.TagTicket;case f.UNTAG:return b.UntagTicket;case f.ASSIGN:return b.AssignUserToTicket;case f.UNASSIGN:return b.UnassignUserFromTicket;case f.NEW:return b.NewItem;case f.FILTER:return b.Filter;case f.MOVE:return b.Move;case f.PEEK:return b.Peek;case f.CONFIG:return b.Config;case f.SYNC:return b.Sync;default:return b.None}},b={Exit:"exit",Init:"init",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",Peek:"peek",Config:"config",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",Export:"export"};import{ulid as ae}from"ulid";import xi from"node:fs";import bd from"node:path";import Ad from"react";import{Box as Cd}from"ink";import bn from"react";import{Box as Nr,Text as md}from"ink";import Re from"react";import{Text as di}from"ink";import ci,{useEffect as li,useState as td}from"react";var ui={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"command-line":["\u276F "],palette:["\u276F "]},pe=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=Ce(),r=ui[n]??ui.default,[o,i]=td(0);if(li(()=>{i(0)},[r]),li(()=>{if(!e)return;let l=setInterval(()=>{i(u=>(u+1)%r.length)},500);return()=>clearInterval(l)},[e,r]),!e)return ci.createElement(di,null,t);let d=r[o]??r[0]??t;return ci.createElement(di,{color:w.accent,dimColor:o===1},d)};import{Box as xr,Text as nd}from"ink";import xn from"react";var En=({children:e=[],height:t,selectedIndex:n,itemHeight:r=1,scrollByOne:o=!1})=>{if(e.length===0)return null;let i=Math.max(1,Math.floor(t)),d=Math.max(1,Math.ceil(r)),l=Math.max(1,Math.floor(i/d)),u=Math.max(0,Math.min(n,e.length-1)),m=Math.max(0,e.length-l),p=o?Math.min(m,Math.max(0,u-l+1)):Math.min(m,Math.floor(u/l)*l),y=p+l,E=e.slice(p,y),I=e.length>l,A=i,$=I?Math.max(1,Math.floor(l/e.length*A)):A,S=Math.max(0,A-$),T=Math.max(1,e.length-l),O=I?Math.floor(p/T*S):0;return xn.createElement(xr,{flexDirection:"row",height:i,width:"100%"},xn.createElement(xr,{flexDirection:"column",flexGrow:1,height:i},E),xn.createElement(xr,{flexDirection:"column",width:1,height:A},Array.from({length:A}).map((ee,de)=>xn.createElement(nd,{key:de,color:I&&de>=O&&de<O+$?w.accent:w.secondary},I?"\u2502":" "))))};import{Box as Sn,Text as cd}from"ink";import Xe from"react";import{Text as rd}from"ink";import od from"react";var id=e=>e.toLowerCase().trim(),sd=(e,t=pt)=>{let n=id(e);return t[n]?t[n]:Dt(n)},Nn=({id:e,isSelected:t})=>{let n=N.getContributor(e);if(n)return od.createElement(rd,{underline:t,color:sd(n.name)},"@"+n.name)};import{Text as ad}from"ink";import dd from"react";var In=({id:e,isSelected:t})=>{let n=N.getTag(e);if(n)return dd.createElement(ad,{underline:t,backgroundColor:ie(n.name),color:w.primary}," "+n.name+" ")};var mi=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=cn(ln(t.title),r),i=sr(t),d=ar(t);return Xe.createElement(Sn,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?w.accent:w.secondary,justifyContent:"space-between"},Xe.createElement(Sn,{borderBottom:!0},Xe.createElement(Sn,{paddingLeft:1,flexDirection:"column"},Xe.createElement(cd,{color:w.primary},o))),Xe.createElement(Sn,{flexDirection:"row",paddingLeft:1},i.map(l=>Xe.createElement(In,{key:l.id,id:l.id})),d.map(l=>Xe.createElement(Nn,{key:l.id,id:l.id}))))};import ld from"chalk";import{Box as Bt,Text as Er}from"ink";import ke from"react";var ud=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,pi=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let i=(t.props.tags??[]).map(I=>N.getTag(I)).filter(I=>!!I),d=(t.props.assignees??[]).map(I=>N.getContributor(I)).filter(I=>!!I),l=1,u=i.length*(1+l),m=d.length*(2+l),p=i.map(I=>ke.createElement(Bt,{key:I.id,paddingRight:l},ke.createElement(Er,{color:ie(I.name)},"\u25A0"))),y=d.map(I=>ke.createElement(Bt,{key:I.id,paddingRight:l},ke.createElement(Er,{color:Dt(I.name)},"@"+I.name.at(0)))),E=n?w.accent:o===g.MOVE?w.secondary:w.primary;return ke.createElement(Bt,{borderBottom:!0,justifyContent:"space-between"},ke.createElement(Bt,null,ke.createElement(pe,{isSelected:n,placeholder:ld.dim.gray(r+1+" ")}),ke.createElement(Er,{wrap:"truncate",color:E},ud(t.title,e-u-m-14))),ke.createElement(Bt,null,p,y))};import pd from"chalk";var gd=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:i,listSelectedIndex:d,mode:l})=>{let{renderedChildrenIndex:u}=Ce(),m=u[e.id]??[],p=`${e.title} ${pd.hex(w.secondary2).dim("("+m.length+")")}`,y=3,E=o?1:4,I=r-y-(o?2:1),A=Re.createElement(Nr,{borderStyle:"round",borderColor:w.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},Re.createElement(pe,{isSelected:t}),Re.createElement(md,{bold:!0,color:t?w.accent:w.primary},p," ",e.readonly?"\u{1F512}":"")),$=(S,T)=>{let O=i&&d===T;return o?Re.createElement(pi,{key:S.id,index:T,width:n,ticket:S,isSelected:O,mode:l}):Re.createElement(mi,{key:S.id,width:n,ticket:S,isSelected:O})};return Re.createElement(Nr,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?w.accent:w.secondary,paddingRight:1,paddingLeft:1,height:r},A,Re.createElement(Nr,{padding:o?1:0},m.length>0&&Re.createElement(En,{selectedIndex:d,height:I,itemHeight:E},m.map($)),Re.createElement(pe,{isSelected:i&&d===-1})))},gi=Re.memo(gd);import{Box as Cr,Text as Nd}from"ink";import He,{useMemo as vi}from"react";import{decodeTime as fd,encodeTime as vd}from"ulid";var yd="0123456789ABCDEFGHJKMNPQRSTVWXYZ",hd=e=>{let t=2166136261;for(let o of e)t^=o.charCodeAt(0),t=Math.imul(t,16777619);let n=BigInt(t>>>0),r="";for(let o=0;o<16;o++)n=n*1103515245n+12345n&0xffffffffn,r+=yd[Number(n%32n)];return r},je=(e,t)=>{let n=fd(e);return vd(n,10)+hd(`${e}:${t}`)};import{Box as Cn,Text as xd}from"ink";import Le from"react";var fi=({selectedIndex:e,parent:t,selected:n})=>{let{currentNode:r}=Ce(),{title:o}=t,i=t.parentNodeId?N.getNode(t.parentNodeId):void 0,d=i&&F(i)?o===G.ASSIGNEES?i.props.assignees??[]:o===G.TAGS?i.props.tags??[]:[]:[];return Le.createElement(Cn,{alignItems:"center",paddingTop:1},Le.createElement(Cn,{minWidth:12},Le.createElement(pe,{isSelected:n}),Le.createElement(xd,{color:n?w.accent:w.secondary2},o,":")),Le.createElement(Cn,{flexDirection:"row",marginLeft:1,paddingRight:1},d.map((l,u)=>{let m=r.id===t.id&&u===e;return Le.createElement(Cn,{key:`${o}-${l}`,paddingRight:2,minHeight:1},Le.createElement(pe,{isSelected:m}),o===G.ASSIGNEES?Le.createElement(Nn,{isSelected:m,id:l}):o===G.TAGS?Le.createElement(In,{isSelected:m,id:l}):null)})))};import{Box as Rn,Text as Ir}from"ink";import Fe,{useEffect as Ed}from"react";var se={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:C.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,r,o=!1)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:C.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:C.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:({id:e,name:t,parentNodeId:n,rank:r,props:o={},childRenderAxis:i="horizontal",isVirtual:d=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:C.FIELD,childRenderAxis:i,parentNodeId:n,readonly:!1,log:[],isVirtual:d}),fieldList:({id:e,name:t,parentNodeId:n,rank:r,childRenderAxis:o="horizontal",isVirtual:i=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:C.FIELD_LIST,childRenderAxis:o,parentNodeId:n,readonly:!1,log:[],isVirtual:i}),ticket:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:C.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,rank:r,props:o={},readonly:i=!0,isVirtual:d=!0})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:C.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:i,log:[],isVirtual:d})};var Sr=({id:e,label:t,text:n,height:r,selected:o,maxWidth:i})=>{let{selectedIndex:d,currentNode:l}=Ce(),u=E=>String(E).replace(/\r?\n/g,""),m=typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[];Ed(()=>{let E=[];return m.forEach((I,A)=>{let $=he(BigInt(A+1));if(!Rt($))return;let S=se.text({id:`${e}-${A}`,name:`Line ${A+1}`,parentNodeId:e,rank:$.value,props:{value:I},readonly:!0,isVirtual:!0}),T=N.createNode(S);Rt(T)&&E.push(T.value.id)}),()=>E.forEach(N.deleteNode)},[e,n]);let p="\u2029",y=m.map((E,I)=>{let A=l.id===e&&d===I;return Fe.createElement(Rn,{key:`${e}-${I}`},Fe.createElement(Ir,{color:A?w.primary:w.secondary2,dimColor:!A},`${I+1} `.padStart(5,"\xA0")),Fe.createElement(Ir,{backgroundColor:A?"gray":""},u(E.length?cn(E,i-10):p)))});return Fe.createElement(Rn,{flexDirection:"column",paddingTop:1},Fe.createElement(Rn,null,Fe.createElement(pe,{isSelected:o}),Fe.createElement(Ir,{color:o?w.accent:w.secondary2},t)),Fe.createElement(Rn,{flexDirection:"row",borderStyle:"round",borderColor:w.secondary,paddingLeft:1,marginLeft:1},Fe.createElement(En,{scrollByOne:!0,children:y,height:r-2,selectedIndex:d,itemHeight:1})))};var Id=e=>je(e,"description"),Sd=e=>je(e,"history"),yi=({ticket:e,height:t})=>{let{selectedIndex:n,currentNode:r}=Ce(),o=process.stdout.columns||120,i=vi(()=>Id(e.id),[e.id]),d=vi(()=>Sd(e.id),[e.id]),l=r.id===e.id,u=r.id===d||r.parentNodeId===d,m=_(e.id);if(u){let S=N.getNode(d),T=S&&Ue(S)?S.props.value??"":"",ee=t-3;return He.createElement(Cr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},S?He.createElement(Sr,{id:S.id,label:"Event log",text:T,selected:!1,maxWidth:o,height:ee}):null)}let p=m.reduce((S,T)=>bt(T)||T.id===d?S+1:S,0),y=2,E=3,I=p,A=t-E-I-y,$=(S,T)=>S.id===i?He.createElement(Sr,{key:S.id,id:i,label:"Description (press e to edit)",text:e.props.description??"",selected:T,maxWidth:o,height:A}):bt(S)?He.createElement(fi,{key:S.id,parent:S,selected:T,selectedIndex:n}):S.id===d?He.createElement(Cr,{key:S.id,paddingTop:1},He.createElement(pe,{isSelected:T}),He.createElement(Nd,{backgroundColor:w.secondary,color:T?w.accent:w.primary}," History \u203A\u203A ")):null;return He.createElement(Cr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},m.map((S,T)=>$(S,l&&n===T)))};var Rd=({swimlanes:e,currentNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:i,height:d,width:l})=>{let u=t.context,m=u===C.TICKET||u===C.FIELD_LIST||u===C.FIELD,p=u===C.BOARD||u===C.SWIMLANE,y=u===C.TICKET?t:r.find(S=>S.context===C.TICKET),E=Math.floor(l/3),I=Math.floor(l/Math.max(e.length,1)),A=Math.min(I,E),$=i==="dense";return bn.createElement(Cd,{flexDirection:"row",height:d},p&&e.map((S,T)=>{let O=t.id===S.id,ee=O?n:-1,de=t.context===C.BOARD&&n===T;return bn.createElement(gi,{key:S.id,height:d,width:A,swimlane:S,isSelected:de,isDense:$,isFocused:O,listSelectedIndex:ee,mode:o})}),m&&y&&bn.createElement(yi,{height:d,ticket:y}))},hi=bn.memo(Rd);import{render as wd}from"ink";import{Writable as Td}from"node:stream";var _t=e=>String(e).padStart(2,"0"),Md=e=>{let t=e.getUTCFullYear(),n=_t(e.getUTCMonth()+1),r=_t(e.getUTCDate()),o=_t(e.getUTCHours()),i=_t(e.getUTCMinutes()),d=_t(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${i}-${d}`},Pd=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",kd=async(e,{width:t,height:n})=>{let r="",o=new Td({write(d,l,u){let m=Ld(d.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),u()}});o.columns=t,o.rows=n,o.isTTY=!0;let i=wd(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(d=>setTimeout(d,0)),i.unmount(),r},Ld=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),Ei=async()=>{let{viewMode:e}=z(),{currentNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:i}=v(),d=r.find(T=>T.context==="BOARD");if(!d)return s("No board found to export");let l=120,u=40,m=await kd(Ad.createElement(hi,{height:u,width:l,swimlanes:(i[d.id]??[]).filter(T=>T!==void 0&&Yt(T)),currentNode:t,selectedIndex:n,breadCrumb:r,viewMode:e??"dense",mode:o}),{width:l,height:u});if(!m)return s("Failed to render board export");let p=dt(process.cwd());if(a(p))return s("Unable to export, epiq root not found");let y=new Date,E=Md(y),I=`board_${Pd(d.title)}_${E}.md`,A=Ro(p.value);xi.mkdirSync(A,{recursive:!0});let $=bd.join(A,I),S=`# Board - ${d.title}
23
+ Date: ${y.toISOString()}
8
24
 
9
25
  \`\`\`text
10
26
  ${m}
11
27
  \`\`\`
12
- `;return ti.writeFileSync(b,E,"utf8"),c("Exported board layout",b)};import kd from"node:os";import si from"node:path";import{z as Ve}from"zod";import{accessSync as Sd,copyFileSync as bd,existsSync as an,mkdirSync as ri,readdirSync as oi,readFileSync as Rd,renameSync as Ad,rmSync as wd,statSync as ii,unlinkSync as Td,writeFileSync as Md}from"node:fs";import ot from"node:path";var ae={writeToFile:(e,t)=>{try{let n=ot.dirname(e);an(n)||ri(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);Md(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return Rd(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=ae.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 an(e)&&ii(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Sd(e),!0}catch{return!1}},mkDir:e=>ri(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=ot.parse(t);for(;;){let r=ot.join(t,e);try{if(an(r)&&ii(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=ot.dirname(t)}return null},readFirstJSON(e){try{if(!ae.dirExists(e))return null;let t=oi(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=ot.join(e,t);return ae.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return ae.dirExists(e)?oi(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{Td(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{wd(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(ot.dirname(t)),!n?.overwrite&&an(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{Ad(e,t)}catch(r){if(r?.code==="EXDEV"){bd(e,t),this.rmFile(e);return}throw r}}};var Pd={userId:"",userName:"",preferredEditor:"",autoSync:!1},ai=Ve.object({preferredEditor:Ve.string().optional(),userName:Ve.string().optional(),userId:Ve.string().optional(),autoSync:Ve.boolean().nullable().optional(),autoSyncDebounceMs:Ve.number().optional(),viewMode:Ve.enum(["dense","wide"]).optional()}),Fd="config.json",di=()=>si.join(kd.homedir(),de),dr=()=>si.join(di(),Fd),cr=()=>{try{return ae.mkDir(di()),c(`Ensured ~/${de} exists`,null)}catch{return s(`Unable to create ~/${de}`)}},Dd=e=>{let t;try{t=JSON.parse(e)}catch{return s(`Invalid ~/${de}/config.json JSON`)}let n=ai.safeParse(t??{});return n.success?c("Parsed config",n.data):s(`Invalid ~/${de}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},ci=()=>{let e=cr();if(a(e))return s(e.message);let t=dr(),n=ae.readFile(t);return n==null||n.trim()===""?c("No config found, using empty config",{autoSync:!1,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:15e3}):Dd(n)},li=e=>{let t=cr();if(a(t))return s(t.message);let n=ai.safeParse(e);if(!n.success)return s(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=dr();try{return ae.writeToFile(r,JSON.stringify(n.data,null,2)+`
13
- `),c("Config written",null)}catch{return s(`Unable to write ~/${de}/config.json`)}},ze=e=>{let t=ci();if(a(t))return s("Failed to read existing config");let n={...t.value,...e};return li(n)},ui=()=>{let e=dr(),t=cr();if(a(t))return s(`Unable to create ~/${de}`);if(!(ae.readFile(e)!==null)){let m=li(Pd);if(a(m))throw new Error(`Unable to create ~/${de}/config.json`)}let r=ci();if(a(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:i,userId:d,autoSync:l,autoSyncDebounceMs:u}=r.value;return!i||!d?s(`User name or ID not configured in ~/${de}/config.json`):c("successfully loaded settings",{preferredEditor:o??"",userName:i,userId:d,autoSync:l??!1,autoSyncIntervalMs:u??15e3,viewMode:"dense"})};import{monotonicFactory as Ld,ulid as dn}from"ulid";var cn=Ld(),ln=({name:e,parent:t,rank:n,user:{userId:r,userName:o}})=>{let i=cn(),d=cn(),l=cn(),u=cn(),m=no();if(a(m))return m;let p=z(m.value,void 0);if(a(p))return p;let x=z(p.value,void 0);return a(x)?x:c("Created issue events",[{id:dn(),userId:r,userName:o,action:"add.issue",payload:{id:i,parent:t,name:e,rank:n}},{id:dn(),userId:r,userName:o,action:"add.field",payload:{id:d,parent:i,name:G.DESCRIPTION,val:"",rank:m.value}},{id:dn(),userId:r,userName:o,action:"add.field",payload:{id:l,parent:i,name:"Assignees",rank:p.value}},{id:dn(),userId:r,userName:o,action:"add.field",payload:{id:u,parent:i,name:"Tags",rank:x.value}}])};var mi=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};import{ulid as fi}from"ulid";import{spawnSync as Od}from"node:child_process";import Ud from"node:os";import pi from"node:path";import{ulid as Bd}from"ulid";function _d(){let{preferredEditor:e}=W(),t=[e,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function $d(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function gi(e){let t=pi.join(Ud.tmpdir(),"epiq");ae.mkDir(t);let n=pi.join(t,Bd());ae.writeToFile(n,e??"");let r=_d();for(let o of r){let i=$d(o,n),d=Od(i,{stdio:"inherit",shell:!0});if(!d.error&&d.status===0){let l=ae.readFile(n);if(l==null)return s("Unable to read edited file");let u=l.replace(/\r?\n$/,"");return c("Successfully edited",u)}}return s("Unable to open editor")}var vi=()=>{let e=V();if(a(e))return s("Unable to resolve user ID");let{breadCrumb:t,selectedNode:n}=f(),r=Le([...t,n],"TICKET");if(a(r))return s("Edit target must be an issue");let o=r.value;if(o.readonly)return s("Cannot edit readonly field");let i=S(o.id).find(m=>m.title===G.DESCRIPTION);if(!i)return s("No target found");if(i.readonly)return s("Cannot edit readonly field");let d=i.props.value;if(typeof d!="string")return s("Selected field is not editable text");let l=gi(d);if(a(l))return s("Failed to edit field");let u=l.value;return u===d?c("No changes made",null):i.title===G.DESCRIPTION?$({id:fi(),action:"edit.description",payload:{id:i.id,md:u},...e.value}):i.title==="Title"?$({id:fi(),action:"edit.title",payload:{id:i.id,name:u},...e.value}):s(`Editing not supported for "${i.title}"`)};import ac from"node:fs";import qi from"node:path";import ur from"node:fs";import Hd from"node:path";import Ct from"fs";import xi from"path";import jd from"util";var yi=1e3,Ni=()=>{let e=process.cwd(),t=fe(e);if(!a(t))return xi.join(t.value,Ie,"log","epiq.log")};function Wd(){if(!Dn)return;let e=Ni();if(e===void 0||!Ct.existsSync(e))return;let n=Ct.readFileSync(e,"utf8").split(`
14
- `);if(n[n.length-1]===""&&n.pop(),n.length<=yi)return;let r=n.slice(-yi).join(`
15
- `)+`
16
- `;Ct.writeFileSync(e,r,"utf8")}function lr(e,t,n=!1){if(!Dn)return;let r=Ni();if(!r)return;let o=jd.format(...t),i=new Date,l=`[${n?i.toISOString().slice(11,19):i.toISOString()}] ${e} ${o}
17
- `;Ct.mkdirSync(xi.dirname(r),{recursive:!0}),Ct.appendFileSync(r,l,"utf8"),Wd()}var oe={info(...e){lr("[Info]",e,!1)},debug(...e){lr("->",e,!0)},error(...e){lr("[Error]",[...e,new Error().stack],!1)}};globalThis.logger=oe;var hi=async e=>{let t=Hd.join(e,".gitignore"),n=ur.existsSync(t)?ur.readFileSync(t,"utf8"):"",r=[".epiq/events/",".epiq/log/"],o=n.split(`
28
+ `;return xi.writeFileSync($,S,"utf8"),c("Exported board layout",$)};var U={exit(){process.exit(0)},enterChildNode(){let e=v(),t=e.currentNode,n=Math.max(0,e.selectedIndex),r=j(t.id)[n];!r||t.context==="FIELD"||U.navigate({currentNode:r,selectedIndex:_(r.id).length?0:-1})},enterParentNode(){let{currentNode:e,nodes:t}=v();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=_(n.id),o=r.findIndex(({id:d})=>d===e.id),i=r.length===0?-1:o>=0?o:0;U.navigate({currentNode:n,selectedIndex:i})},navigateToNextItem:()=>Ni(1),navigateToPreviousItem:()=>Ni(-1),navigateToNextContainer:()=>Ii(1),navigateToPreviousContainer:()=>Ii(-1),navigate:({currentNode:e,selectedIndex:t})=>{x({currentNodeId:e.id,selectedIndex:t})}},Ni=e=>{let{selectedIndex:t,currentNode:n}=v(),r=_(n.id).length;if(r===0)return;let i=(Math.max(0,t)+e+r)%r;U.navigate({selectedIndex:i,currentNode:n})},Ii=e=>{let{currentNode:t,nodes:n,selectedIndex:r}=v();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!t||!o)return;let i=_(o.id),d=i.findIndex(E=>E.id===t.id);if(d<0)return;let l=i.at(d+e)??i.at(0);if(!l)return;let u=_(l.id),m=Math.max(0,u.length-1),p=Math.min(Math.max(0,r),m),y=u.length?p:-1;U.navigate({currentNode:l,selectedIndex:y})};import Wd from"node:os";import bi from"node:path";import{z as Je}from"zod";import{accessSync as Fd,copyFileSync as Dd,existsSync as An,mkdirSync as Si,readdirSync as Ci,readFileSync as Od,renameSync as Ud,rmSync as Bd,statSync as Ri,unlinkSync as _d,writeFileSync as $d}from"node:fs";import yt from"node:path";var le={writeToFile:(e,t)=>{try{let n=yt.dirname(e);An(n)||Si(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);$d(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return Od(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=le.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 An(e)&&Ri(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Fd(e),!0}catch{return!1}},mkDir:e=>Si(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=yt.parse(t);for(;;){let r=yt.join(t,e);try{if(An(r)&&Ri(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=yt.dirname(t)}return null},readFirstJSON(e){try{if(!le.dirExists(e))return null;let t=Ci(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=yt.join(e,t);return le.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return le.dirExists(e)?Ci(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{_d(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Bd(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(yt.dirname(t)),!n?.overwrite&&An(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{Ud(e,t)}catch(r){if(r?.code==="EXDEV"){Dd(e,t),this.rmFile(e);return}throw r}}};var jd={userId:"",userName:"",preferredEditor:"",autoSync:!1},Ai=Je.object({preferredEditor:Je.string().optional(),userName:Je.string().optional(),userId:Je.string().optional(),autoSync:Je.boolean().nullable().optional(),autoSyncDebounceMs:Je.number().optional(),viewMode:Je.enum(["dense","wide"]).optional()}),Hd="config.json",wi=()=>bi.join(Wd.homedir(),me),Rr=()=>bi.join(wi(),Hd),br=()=>{try{return le.mkDir(wi()),c(`Ensured ~/${me} exists`,null)}catch{return s(`Unable to create ~/${me}`)}},qd=e=>{let t;try{t=JSON.parse(e)}catch{return s(`Invalid ~/${me}/config.json JSON`)}let n=Ai.safeParse(t??{});return n.success?c("Parsed config",n.data):s(`Invalid ~/${me}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},Ti=()=>{let e=br();if(a(e))return s(e.message);let t=Rr(),n=le.readFile(t);return n==null||n.trim()===""?c("No config found, using empty config",{autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):qd(n)},Mi=e=>{let t=br();if(a(t))return s(t.message);let n=Ai.safeParse(e);if(!n.success)return s(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=Rr();try{return le.writeToFile(r,JSON.stringify(n.data,null,2)+`
29
+ `),c("Config written",null)}catch{return s(`Unable to write ~/${me}/config.json`)}},Ze=e=>{let t=Ti();if(a(t))return s("Failed to read existing config");let n={...t.value,...e};return Mi(n)},Pi=()=>{let e=Rr(),t=br();if(a(t))return s(`Unable to create ~/${me}`);if(!(le.readFile(e)!==null)){let m=Mi(jd);if(a(m))throw new Error(`Unable to create ~/${me}/config.json`)}let r=Ti();if(a(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:i,userId:d,autoSync:l,autoSyncDebounceMs:u}=r.value;return!i||!d?s(`User name or ID not configured in ~/${me}/config.json`):c("successfully loaded settings",{preferredEditor:o??"",userName:i,userId:d,autoSync:l??!1,autoSyncIntervalMs:u??1e4,viewMode:"dense"})};import ec from"node:fs";import tc from"node:path";import{decodeTime as nc,monotonicFactory as rc}from"ulid";import{z as $t}from"zod";import wn from"node:fs";import wr from"node:path";import{decodeTime as zd}from"ulid";import{z as Ar}from"zod";var Kd=Ar.object({userId:Ar.string().min(1).default("unknown"),userName:Ar.string().min(1).default("unknown")}),Vd=e=>{let[t,n]=wr.basename(e,".jsonl").split("."),r=Kd.safeParse({userId:t,userName:n});return r.success?c("Parsed event file actor",r.data):s(`Invalid event file name ${wr.basename(e)}: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},Gd=e=>{let t=Object.keys(e).filter(n=>n!=="id"&&n!=="v");return t.length!==1?s(`Invalid persisted event: expected exactly 1 action key, got ${t.length}`):!t[0]||!(t[0]in e)?s("Invalid persisted event: action key is missing or invalid"):c("Resolved persisted action",t[0])},Yd=(e,t)=>t in e,Xd=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),Jd=e=>{let{userId:t,userName:n,...r}=e,o=Gd(r);if(a(o))return s(o.message);let i=o.value,d=e.id?.[0];return d?Yd(r,i)?c("Decoded persisted event",Xd({id:d,action:i,payload:r[i],userId:t,userName:n})):s(`Persisted event is missing payload for action: ${i}`):s("Persisted event is missing id")},Zd=e=>{if(!wn.existsSync(e))return c("Event file missing",[]);let t=Vd(e);if(a(t))return s(t.message);let n=wn.readFileSync(e,"utf8"),r=[];for(let o of n.split(`
30
+ `)){let i=o.trim();if(!i)continue;let d;try{d=JSON.parse(i)}catch{return s(`Failed to parse event JSON from ${e}: ${i}`)}let l=Tr(d);if(a(l))return s(`${l.message} in ${e}: ${i}`);r.push({...l.value,userId:t.value.userId,userName:t.value.userName})}return c("Parsed persisted events file",r)};function ki(e){let t=Lt(e);if(!wn.existsSync(t))return c("No events found",[]);let n=wn.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>wr.join(t,o)),r=[];for(let o of n){let i=Zd(o);if(a(i))return s(i.message);r.push(...i.value)}return c("All events loaded",Qd(r))}function ht(e){let t=ki(e);if(a(t))return s(t.message);let n=[];for(let r of t.value){let o=Jd(r);if(a(o))return s(`Failed to decode event ${r.id?.[0]??"<unknown>"}: ${o.message}`);n.push(o.value)}return c("Loaded merged events",n)}function Li(e=process.cwd()){let t=ki(e);return a(t)?s(t.message):c("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var Qd=e=>{let t=new Map,n=new Map;for(let m of e){let p=m.id[0],y=m.id[1]??null;t.set(p,m);let E=n.get(y)??[];E.push(m),n.set(y,E)}for(let m of n.values())m.sort((p,y)=>p.id[0].localeCompare(y.id[0]));let r=[],o=new Set,i=m=>{let p=m.id[0];if(o.has(p))return;r.push(m),o.add(p);let y=n.get(p)??[];for(let E of y)i(E)},d=n.get(null)??[];for(let m of d)i(m);let l=e.filter(m=>{let p=m.id[0],y=m.id[1]??null;return!o.has(p)&&y!==null&&!t.has(y)}).sort((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of l)i(m);let u=e.filter(m=>!o.has(m.id[0])).sort((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of u)i(m);return r},Fi=(e,t)=>{let n=e.findIndex(r=>{try{return zd(r.id)>t}catch{return!0}});return n===-1?{appliedEvents:e,unappliedEvents:[]}:{appliedEvents:e.slice(0,n),unappliedEvents:e.slice(n)}};var Di=e=>({action:e.action,payload:e.payload});var Ui=1,Oi=rc(),oc=$t.tuple([$t.string().min(1),$t.string().min(1).nullable()]),ic=$t.looseObject({v:$t.literal(Ui),id:oc}),Tr=e=>{let t=ic.safeParse(e);return t.success?c("Parsed persisted event",t.data):s(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},Tn=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",K=()=>{let{userName:e,userId:t}=z();return e?t?e.trim()?c("Successfully resolved actor ID",{userId:Tn(t),userName:Tn(e)}):s("Unable to resolve actor ID from settings or OS user info"):s("User ID not configured"):s("User name not configured")},Qe=({userId:e,userName:t})=>`${Tn(e)}.${Tn(t)}.jsonl`,sc=(e,{userId:t,userName:n})=>{let r=Qe({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r))return s(`Invalid event log file name: ${r}`);let i=tc.join(Lt(e),r);return c("Successfully resolved event log path",i)},ac=(e,t)=>{let n={[e.action]:e.payload,v:Ui,id:t};return Tr(n)};function Mn({event:e,rootDir:t}){try{let n=bo(t);if(a(n))return n;let r=sc(t,{userId:e.userId,userName:e.userName});if(a(r))return r;let o=Li(t);if(a(o))return s(o.message);let i=o.value?Oi(Math.max(Date.now(),nc(o.value)+1)):Oi(),d=ac(Di(e),[i,o.value]);return a(d)?s(d.message):(ec.appendFileSync(r.value,`${JSON.stringify(d.value)}
31
+ `,"utf8"),c("Event persisted",{path:r.value,entry:d.value}))}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return s(`Failed to persist event: ${r}`)}}var Bi=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 dc=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[ne,Pn]=dc;import{ulid as gc}from"ulid";import{spawnSync as cc}from"node:child_process";import lc from"node:os";import _i from"node:path";import{ulid as uc}from"ulid";function mc(){let{preferredEditor:e}=z(),t=[e,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function pc(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function $i(e){let t=_i.join(lc.tmpdir(),"epiq");le.mkDir(t);let n=_i.join(t,uc());le.writeToFile(n,e??"");let r=mc();for(let o of r){let i=pc(o,n),d=cc(i,{stdio:"inherit",shell:!0});if(!d.error&&d.status===0){let l=le.readFile(n);if(l==null)return s("Unable to read edited file");let u=l.replace(/\r?\n$/,"");return c("Successfully edited",u)}}return s("Unable to open editor")}var Wi=async()=>{let e=K();if(a(e))return s("Unable to resolve user ID");let t=await xe();if(a(t))return t;let n=t.value,{breadCrumb:r,selectedNode:o}=v(),i=Me([...r,o],"TICKET");if(a(i))return s("Edit target must be an issue");let d=i.value;if(!F(d))return s("Edit target must be an issue");if(d.readonly)return s("Cannot edit readonly issue");let l=_(d.id).find(y=>y.title===G.DESCRIPTION);if(!l)return s("No target found");if(l.readonly)return s("Cannot edit readonly field");let u=d.props.description??"";if(typeof u!="string")return s("Selected field is not editable text");let m=$i(u);if(a(m))return s("Failed to edit field");let p=m.value;return p===u?c("No changes made",null):Ne({id:gc(),action:"edit.description",payload:{id:d.id,md:p},...e.value},n)};import Rc from"node:fs";import Gi from"node:path";import Mr from"node:fs";import fc from"node:path";var ji=async e=>{let t=fc.join(e,".gitignore"),n=Mr.existsSync(t)?Mr.readFileSync(t,"utf8"):"",r=[".epiq/events/",".epiq/log/"],o=n.split(`
18
32
  `).map(u=>u.trim()),i=r.filter(u=>!o.some(m=>m===u||m===u.replace(/\/$/,"")||m==="/"+u||m==="/"+u.replace(/\/$/,"")));if(i.length===0)return c("Local epiq paths already ignored",!1);let l=["# [epiq]: local hydrated state is never committed",...i].join(`
19
33
  `);return n=n.trimEnd()+`
20
34
 
21
35
  ${l}
22
- `,ur.writeFileSync(t,n,"utf8"),oe.info(`Added ${i.join(", ")} to .gitignore (epiq local state)`),c("Local epiq paths ignored",!0)};import{spawn as Vd}from"node:child_process";import gr from"node:fs";import Pi from"node:path";import St from"node:fs";import Kd from"node:os";import ve from"node:path";var mr=(e,t)=>{let n=new Map,r=t??((...i)=>JSON.stringify(i)),o=((...i)=>{let d=r(...i);if(!n.has(d)){let l=e(...i).then(u=>(a(u)&&n.delete(d),u));n.set(d,l)}return n.get(d)});return o.clear=()=>n.clear(),o};var Ii="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Ei=e=>ve.join(Ie,Ot,e),Ci=()=>ve.join(Kd.homedir(),de),un=()=>ve.join(Ci(),"worktrees"),Si=({repoRoot:e})=>{let t=Xr(e);return a(t)?s(t.message):c("Resolved state branch root",ve.join(un(),t.value))},qd=e=>ve.join(e,Ie),Ge=e=>ve.join(qd(e),Ot),pr=({root:e,fileName:t})=>ve.join(Ge(e),t),bt=e=>{try{return St.mkdirSync(e,{recursive:!0}),c("Ensured directory",void 0)}catch(t){return s(t instanceof Error?t.message:String(t))}},mn=()=>{let e=bt(Ci());if(a(e))return s(`Ensure epiq home failed.
23
- `+e.message);let t=bt(un());return a(t)?s(`Ensure worktrees dir failed.
24
- `+t.message):c("Ensured epiq storage",!0)},bi=e=>{St.existsSync(e)&&(oe.debug("[sync] remove path",e),St.rmSync(e,{recursive:!0,force:!0}))},Ri=e=>{let t=Ge(e);if(!St.existsSync(t))return c("Events dir missing",[]);let n=St.readdirSync(t,{withFileTypes:!0}).filter(r=>r.isFile()).map(r=>r.name).filter(r=>r.endsWith(".jsonl")).sort();return c("Listed event files",n)},Ai=(e,t)=>{for(let n of[Ge(e),Ge(t)]){let r=bt(n);if(a(r))return s(r.message)}return c("Ensured state branch",void 0)},wi=async e=>{let t=await D({args:["ls-tree","--name-only","HEAD"],cwd:e});if(a(t))return s(`ensure state branch is storage only failed
25
- `+t.message);let r=t.value.stdout.trim().split(`
26
- `).filter(Boolean).filter(d=>d!==Ie);if(r.length===0)return c("State branch is storage-only",!1);let o=await D({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(a(o))return s(`Failed to clean storage branch
27
- ${o.message}`);let i=await it({cwd:e,message:"[epiq:repair-storage-branch]"});return a(i)?s(i.message):c("Cleaned storage branch",!0)},pn=mr(async(e=process.cwd())=>{let t=await D({args:["rev-parse","--show-toplevel"],cwd:e});return a(t)?s("Not inside a Git repository"):c("Resolved repo root",t.value.stdout.trim())},e=>ve.resolve(e)),Ti=mr(async e=>{let t=await D({args:["rev-parse","--git-dir"],cwd:e});if(a(t))return s(t.message);let n=t.value.stdout.trim(),r=ve.isAbsolute(n)?n:ve.join(e,n);return c("Resolved git dir",r)},e=>ve.resolve(e));var st=e=>{let t=Me(e);if(a(t))return s("Unable to resolve epiq project root");let n=ke(t.value);return a(n)?s("Unable to read project.json"):c("Resolved state branch",n.value.stateBranch)},ue="origin";var Mi=15e3,zd={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo"},Fi=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!gr.existsSync(t)){let p=`Git cwd does not exist: ${t}`;if(n){r({stdout:"",stderr:p,exitCode:1});return}r(s(p));return}let o=Vd("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:zd}),i=!1,d="",l="",u=p=>{i||(i=!0,clearTimeout(m),r(p))},m=setTimeout(()=>{o.kill("SIGTERM");let p=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${Mi}ms`].join(`
28
- `);u(n?{stdout:d,stderr:p,exitCode:124}:s(p))},Mi);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",p=>{d+=p}),o.stderr.on("data",p=>{l+=p}),o.on("error",p=>{if(n){u({stdout:d,stderr:p.message,exitCode:1});return}u(s([`git ${e.join(" ")}`,`cwd=${t}`,p.message].join(`
29
- `)))}),o.on("close",p=>{let x=p??1;if(n){u({stdout:d,stderr:l,exitCode:x});return}if(x!==0){u(s([`git ${e.join(" ")}`,l.trim()||d.trim()||"Git command failed"].filter(Boolean).join(`
30
- `)));return}u(c("Git command succeeded",{stdout:d,stderr:l,exitCode:x}))})}),D=({args:e,cwd:t})=>Fi({args:e,cwd:t,allowFail:!1}),at=({args:e,cwd:t})=>Fi({args:e,cwd:t,allowFail:!0}),it=async({cwd:e,message:t})=>{let n=await K.commit({cwd:e,message:t});if(a(n))return s(`Failed to create commit
31
- ${n.message}`);let r=await D({args:["rev-parse","HEAD"],cwd:e});return a(r)?s(`Commit created, but failed to read HEAD SHA
32
- ${r.message}`):c("Created commit and resolved SHA",r.value.stdout.trim())},Rt=async e=>{let t=await Ti(e);if(a(t))return s(t.message);let n=t.value,o=["MERGE_HEAD","CHERRY_PICK_HEAD","REVERT_HEAD","REBASE_HEAD","rebase-merge","rebase-apply"].filter(i=>gr.existsSync(Pi.join(n,i)));return c("Checked for in-progress Git operation",o.length>0)},fr=async({repoRoot:e})=>{let n=(await at({args:["remote","get-url",ue],cwd:e})).exitCode===0;return c(`Checked remote ${n}`,n)},gn=async({repoRoot:e,branch:t})=>{let n=await at({args:["ls-remote","--heads",ue,t],cwd:e});return n.exitCode!==0?s(n.stderr.trim()||`Unable to inspect remote branch ${ue}/${t}`):c("Checked remote branch",n.stdout.trim().length>0)},fn=async({repoRoot:e,branch:t})=>{let n=await at({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?c("Local branch exists",!0):n.exitCode===1?c("Local branch missing",!1):s(n.stderr.trim()||`Unable to inspect branch ${t}`)},ki=e=>{try{return gr.realpathSync.native(e)}catch{return Pi.resolve(e)}},Di=async({repoRoot:e,worktreeRoot:t})=>{let n=await D({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return s(n.message);let r=ki(t),o=n.value.stdout.split(`
33
- `).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(ki).includes(r);return c("Checked worktree registration",o)},vr=async e=>{let t=await at({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return c("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},vn=async e=>{let t=await D({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return a(t)?s(t.message):c("Resolved current branch",t.value.stdout.trim())},Li=async e=>{let t=await D({args:["rev-parse","--short","HEAD"],cwd:e});return a(t)?s(t.message):c("Resolved short HEAD sha",t.value.stdout.trim())},Oi=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),yr=async({cwd:e,branch:t})=>{let n=await gn({repoRoot:e,branch:t});if(a(n))return s(n.message);if(!n.value)return c("Remote branch missing, skipped pull",!1);let r=await K.fetch({cwd:e,remote:ue,branch:t});if(a(r))return s(`Failed to fetch ${t}
34
- ${r.message}`);let o=await K.pullRebase({cwd:e,remote:ue,branch:t});return a(o)?s(`Failed during pull --rebase
35
- ${o.message}`):c("Pulled with rebase",!0)},Ui=async e=>{let t=await D({args:["status","--porcelain"],cwd:e});return a(t)?s(t.message):c("Checked state branch changes",t.value.stdout.trim().length>0)},Bi=async e=>{let t=await vn(e);return a(t)?s(t.message):c("Checked detached HEAD state",t.value==="HEAD")};var K={stage:({cwd:e,pathspec:t})=>D({args:["add",...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1})=>D({args:["commit",...n?["--allow-empty"]:[],"-m",t],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>D({args:["fetch",t,n],cwd:e}),pullRebase:({cwd:e,remote:t,branch:n})=>D({args:["pull","--rebase",t,n],cwd:e}),checkout:({cwd:e,branch:t})=>D({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 D({args:o,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>D({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>D({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>D({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>D({args:["worktree","prune"],cwd:e})};import dt from"node:fs";import At from"node:path";var $i=async e=>{if((await at({args:["rev-parse","--verify","HEAD"],cwd:e})).exitCode===0)return c("Initial commit already exists",!1);oe.info("Creating initial commit");let n=await K.commit({cwd:e,message:"Initial commit",allowEmpty:!0});return a(n)?s(n.message):c("Created initial commit",!0)},_i=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",Gd=async e=>{let t=await vn(e);if(a(t))return s(t.message);let n=await Li(e);if(a(n))return s(n.message);let r=`[epiq:sync:${_i(t.value)}:${_i(n.value)}]`;return c("Built sync commit message",r)},yn=async({repoRoot:e,stateBranchName:t})=>{oe.info(`Creating ${t}`);let n=await D({args:["commit-tree",Ii,"-m","[epiq:init-state-branch]"],cwd:e});if(a(n))return s(`Failed to create state branch commit
36
- ${n.message}`);let r=n.value.stdout.trim(),o=await D({args:["update-ref",`refs/heads/${t}`,r],cwd:e});return a(o)?s(`Failed to create ${t}
37
- ${o.message}`):c("Created state branch",!0)},Yd=async({repoRoot:e,stateBranchName:t})=>{let n=await fn({repoRoot:e,branch:t});if(a(n))return s(`Ensure local state branch failed
38
- `+n.message);if(n.value)return c("Local state branch already exists",!1);let r=await fr({repoRoot:e});if(a(r))return s(`Ensure local state branch failed
39
- `+r.message);if(!r.value)return yn({repoRoot:e,stateBranchName:t});let o=await gn({repoRoot:e,branch:t});if(a(o))return s(`Ensure local state branch failed
40
- `+o.message);if(!o.value)return yn({repoRoot:e,stateBranchName:t});let i=await K.fetch({cwd:e,remote:ue,branch:t});if(a(i))return s(`Failed to fetch ${t} from remote
41
- ${i.message}`);let d=await D({args:["branch","--track",t,`${ue}/${t}`],cwd:e});return a(d)?s(`Failed to create local ${t} from remote
42
- ${d.message}`):c("Created local state branch from remote",!0)},Xd=async({repoRoot:e,branch:t})=>{let n=await D({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return s(n.message);let r=n.value.stdout.split(`
43
- `),o=null;for(let i of r){if(i.startsWith("worktree ")){o=i.slice(9);continue}if(i===`branch refs/heads/${t}`&&o)return c("Found worktree for branch",o)}return c("No worktree found for branch",null)},Jd=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=bt(At.dirname(t));if(a(r))return s(`Failed to create state branch worktree
44
- `+r.message);dt.existsSync(t)&&!dt.existsSync(At.join(t,".git"))&&(oe.info("Removing broken state branch worktree path"),bi(t)),oe.info("Creating state branch worktree");let o=await K.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return a(o)?s(`Failed to create state branch worktree
45
- ${o.message}`):c("Created state branch worktree",!0)},xr=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await Xd({repoRoot:e,branch:n});if(a(r))return s(r.message);let o=At.resolve(t),i=r.value?At.resolve(r.value):null;if(i&&i===o&&dt.existsSync(i))return c("State branch already checked out in expected worktree",!1);if(i&&i!==o){oe.info("Moving state branch worktree to expected location");let u=await K.worktreeRemove({cwd:e,worktreeRoot:i});if(a(u))return s(`Failed to remove existing state branch worktree
46
- ${u.message}`)}if(i&&!dt.existsSync(i)){oe.info("Pruning stale state branch worktree");let u=await K.worktreePrune({cwd:e});if(a(u))return s(`Failed to prune stale worktrees
47
- ${u.message}`)}let d=await Di({repoRoot:e,worktreeRoot:t});if(a(d))return s(d.message);let l=dt.existsSync(t);if(d.value&&l)return c("State branch worktree already exists",!1);if(d.value&&!l){oe.info("Pruning missing registered state branch worktree");let u=await K.worktreePrune({cwd:e});if(a(u))return s(`Failed to prune stale worktrees
48
- ${u.message}`)}return Jd({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},Zd=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await vn(e);if(a(n))return s(n.message);if(n.value===t)return c("State branch already checked out",!1);let r=await K.checkout({cwd:e,branch:t});return a(r)?s(`Failed to checkout ${t}
49
- ${r.message}`):c("Checked out state branch",!0)},Qd=async({repoRoot:e,stateBranchRoot:t})=>{let n=await vr(t);if(a(n))return s(n.message);if(n.value)return c("State branch upstream already configured",!1);let r=await fr({repoRoot:t});if(a(r))return s(r.message);if(!r.value)return c("No remote available for state branch upstream",!1);let o=st(e);if(a(o))return o;let i=o.value,d=await gn({repoRoot:t,branch:i});if(a(d))return s(d.message);if(!d.value)return c("Remote state branch missing; upstream will be configured on first push",!1);oe.info(`Configuring ${i} upstream`);let l=await K.fetch({cwd:t,remote:ue,branch:i});if(a(l))return s(`Failed to fetch ${i}
50
- ${l.message}`);let u=await K.setUpstream({cwd:t,branch:i,upstream:`${ue}/${i}`});return a(u)?s(`Failed to set state branch upstream
51
- ${u.message}`):c("Configured state branch upstream",!0)},xn=async({stateBranchRoot:e,eventFileName:t})=>{let n=Ei(t),r=At.join(e,n);if(!dt.existsSync(r))return c("No event file to stage",void 0);let o=await K.stage({cwd:e,pathspec:[n]});return a(o)?s(`Failed to stage state branch event file
52
- ${o.message}`):c("Staged state branch event file",void 0)},ji=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Gd(e);return a(n)?s(`Create state branch sync commit failed
53
- `+n.message):it({cwd:t,message:n.value})},wt=async({repoRoot:e,stateBranchRoot:t})=>{let n=await vr(t);if(a(n))return s(n.message);let r=st(e);if(a(r))return r;let o=r.value,i=n.value?await K.push({cwd:t}):await K.push({cwd:t,remote:ue,branch:o,setUpstream:!0});return a(i)?s(`Failed during state branch push
54
- ${i.message}`):c("Pushed state branch",!0)},Wi=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=st(e);if(a(o))return o;let i=o.value,d=[mn(),await Yd({repoRoot:e,stateBranchName:i}),await xr({repoRoot:e,stateBranchRoot:t,stateBranchName:i}),await Zd({stateBranchRoot:t,stateBranchName:i}),await wi(t),n?await Qd({stateBranchRoot:t,repoRoot:e}):c("Skipped state branch upstream bootstrap",!1)];for(let l of d){if(a(l))return s(l.message);r=r||!!l.value}return c(n?"Bootstrapped state storage":"Bootstrapped state storage (readonly)",r)};import Nn from"node:fs";import hr from"node:path";import{decodeTime as ec}from"ulid";var Nr=e=>{let[t,n]=e.id;return`${t}:${n??""}`},Hi=e=>{let[t]=e.id;return ec(t)},tc=e=>{let{userId:t,userName:n,...r}=e;return r},nc=e=>e.length===0?"":e.map(t=>JSON.stringify(tc(t))).join(`
36
+ `,Mr.writeFileSync(t,n,"utf8"),te.info(`Added ${i.join(", ")} to .gitignore (epiq local state)`),c("Local epiq paths ignored",!0)};import xt from"node:fs";import Wt from"node:path";var qi=async e=>{if((await ue({args:["rev-parse","--verify","HEAD"],cwd:e})).exitCode===0)return c("Initial commit already exists",!1);te.info("Creating initial commit");let n=await q.commit({cwd:e,message:"Initial commit",allowEmpty:!0});return a(n)?s(n.message):c("Created initial commit",!0)},Hi=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",vc=async e=>{let t=await nn(e);if(a(t))return s(t.message);let n=await po(e);return a(n)?s(n.message):c("Built sync commit message",`[epiq:sync:${Hi(t.value)}:${Hi(n.value)}]`)},Pr=async({repoRoot:e,stateBranchName:t})=>{te.info(`Creating ${t}`);let n=await L({args:["commit-tree",Eo,"-m","[epiq:init-state-branch]"],cwd:e});if(a(n))return s(`Failed to create state branch commit
37
+ ${n.message}`);let r=n.value.stdout.trim(),o=await L({args:["update-ref",`refs/heads/${t}`,r],cwd:e});return a(o)?s(`Failed to create ${t}
38
+ ${o.message}`):c("Created state branch",!0)},yc=async({repoRoot:e,stateBranchName:t})=>{let n=await Zn({repoRoot:e});if(a(n))return s(`Ensure local state branch failed
39
+ `+n.message);let r=n.value,o=r?await Mt({repoRoot:e,branch:t}):c("No remote, no remote state branch",!1);if(a(o))return s(`Ensure local state branch failed
40
+ `+o.message);let i=o.value;if(r&&i){let l=await q.fetch({cwd:e,remote:oe,branch:t});if(a(l))return s(`Failed to fetch ${t} from remote
41
+ ${l.message}`)}let d=await tn({repoRoot:e,branch:t});if(a(d))return s(`Ensure local state branch failed
42
+ `+d.message);if(d.value)return c("Local state branch already exists",!1);if(i){let l=await L({args:["branch","--track",t,`${oe}/${t}`],cwd:e});return a(l)?s(`Failed to create local ${t} from remote
43
+ ${l.message}`):c("Created local state branch from remote",!0)}return Pr({repoRoot:e,stateBranchName:t})},hc=async({repoRoot:e,branch:t})=>{let n=await L({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return s(n.message);let r=n.value.stdout.split(`
44
+ `),o=null;for(let i of r){if(i.startsWith("worktree ")){o=i.slice(9);continue}if(i===`branch refs/heads/${t}`&&o)return c("Found worktree for branch",o)}return c("No worktree found for branch",null)},xc=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=Pt(Wt.dirname(t));if(a(r))return s(`Failed to create state branch worktree
45
+ `+r.message);xt.existsSync(t)&&!xt.existsSync(Wt.join(t,".git"))&&(te.info("Removing broken state branch worktree path"),Io(t)),te.info("Creating state branch worktree");let o=await q.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return a(o)?s(`Failed to create state branch worktree
46
+ ${o.message}`):c("Created state branch worktree",!0)},kr=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await hc({repoRoot:e,branch:n});if(a(r))return s(r.message);let o=Wt.resolve(t),i=r.value?Wt.resolve(r.value):null;if(i&&i===o&&xt.existsSync(i))return c("State branch already checked out in expected worktree",!1);if(i&&i!==o){te.info("Moving state branch worktree to expected location");let u=await q.worktreeRemove({cwd:e,worktreeRoot:i});if(a(u))return s(`Failed to remove existing state branch worktree
47
+ ${u.message}`)}if(i&&!xt.existsSync(i)){te.info("Pruning stale state branch worktree");let u=await q.worktreePrune({cwd:e});if(a(u))return s(`Failed to prune stale worktrees
48
+ ${u.message}`)}let d=await mo({repoRoot:e,worktreeRoot:t});if(a(d))return s(d.message);let l=xt.existsSync(t);if(d.value&&l)return c("State branch worktree already exists",!1);if(d.value&&!l){te.info("Pruning missing registered state branch worktree");let u=await q.worktreePrune({cwd:e});if(a(u))return s(`Failed to prune stale worktrees
49
+ ${u.message}`)}return xc({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},Ec=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await nn(e);if(a(n))return s(n.message);if(n.value===t)return c("State branch already checked out",!1);(await ue({cwd:e,args:["rebase","--abort"]})).exitCode===0&&te.info("Aborted stale state branch rebase");let o=await q.checkout({cwd:e,branch:t});return a(o)?s(`Failed to checkout ${t}
50
+ ${o.message}`):c("Checked out state branch",!0)},Nc=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Qn(t);if(a(n))return s(n.message);if(n.value)return c("State branch upstream already configured",!1);let r=await Zn({repoRoot:t});if(a(r))return s(r.message);if(!r.value)return c("No remote available for state branch upstream",!1);let o=Ke(e);if(a(o))return o;let i=o.value,d=await Mt({repoRoot:t,branch:i});if(a(d))return s(d.message);if(!d.value)return c("Remote state branch missing; upstream will be configured on first push",!1);te.info(`Configuring ${i} upstream`);let l=await q.fetch({cwd:t,remote:oe,branch:i});if(a(l))return s(`Failed to fetch ${i}
51
+ ${l.message}`);let u=await q.setUpstream({cwd:t,branch:i,upstream:`${oe}/${i}`});return a(u)?s(`Failed to set state branch upstream
52
+ ${u.message}`):c("Configured state branch upstream",!0)},kn=async({stateBranchRoot:e,eventFileName:t})=>{let n=Ve(t),r=Wt.join(e,n);if(!xt.existsSync(r))return c("No event file to stage",void 0);let o=await q.stage({cwd:e,pathspec:[n]});return a(o)?s(`Failed to stage state branch event file
53
+ ${o.message}`):c("Staged state branch event file",void 0)},zi=async({repoRoot:e,stateBranchRoot:t})=>{let n=await vc(e);return a(n)?s(`Create state branch sync commit failed
54
+ `+n.message):ct({cwd:t,message:n.value})},jt=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Qn(t);if(a(n))return s(n.message);let r=Ke(e);if(a(r))return r;let o=r.value,i=n.value?await q.push({cwd:t}):await q.push({cwd:t,remote:oe,branch:o,setUpstream:!0});return a(i)?s(`Failed during state branch push
55
+ ${i.message}`):c("Pushed state branch",!0)},Ki=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=Ke(e);if(a(o))return o;let i=o.value,d=[sn(),await yc({repoRoot:e,stateBranchName:i}),await kr({repoRoot:e,stateBranchRoot:t,stateBranchName:i}),await Ec({stateBranchRoot:t,stateBranchName:i}),await Co(t),n?await Nc({stateBranchRoot:t,repoRoot:e}):c("Skipped state branch upstream bootstrap",!1)];for(let l of d){if(a(l))return s(l.message);r=r||!!l.value}return c(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",r)};import{monotonicFactory as Ic,ulid as De}from"ulid";var Ht=Ic();function Sc(){let e=Se();if(a(e))return s("Unable to boot. State not initialized");let t=e.value,n=Object.values(t.nodes).find(i=>i.context==="WORKSPACE");if(!n)throw new Error("No workspace found in event log");let[r]=_(n.id),[o]=r?_(r.id):[];if(o){let i=t.renderedChildrenIndex?.[o.id]??[];return c("Resolved boot nav target",{currentNode:o,selectedIndex:i.length>0?0:-1})}else return r?c("Resolved boot nav target",{currentNode:r,selectedIndex:0}):n?c("Resolved boot nav target",{currentNode:n,selectedIndex:0}):c("Resolved boot nav target",{currentNode:t.nodes[t.rootNodeId],selectedIndex:0})}function Cc(){let e=Sc();return a(e)?e:U.navigate(e.value)}function Vi({userId:e,userName:t}){let n=Ht(),r=Ht(),o=Ht(),i=Ht(),d=Ht(),l=re(void 0,void 0);if(a(l))return l;let u=re(void 0,void 0);if(a(u))return u;let m=re(u.value,void 0);if(a(m))return m;let p=re(void 0,void 0);if(a(p))return p;let y=re(p.value,void 0);if(a(y))return y;let E=re(y.value,void 0);if(a(E))return E;let I=re(void 0,void 0);return a(I)?I:c("Created default events",[{id:De(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:l.value}},{id:De(),userId:e,userName:t,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:u.value}},{id:De(),userId:e,userName:t,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:p.value}},{id:De(),userId:e,userName:t,action:"add.swimlane",payload:{id:i,name:"In progress",parent:r,rank:y.value}},{id:De(),userId:e,userName:t,action:"add.swimlane",payload:{id:d,name:"Done",parent:r,rank:E.value}},{id:De(),userId:e,userName:t,action:"add.board",payload:{id:Pn,name:"Closed",parent:n,rank:m.value}},{id:De(),userId:e,userName:t,action:"add.swimlane",payload:{id:ne,name:"Closed",parent:Pn,rank:I.value}},{id:De(),userId:e,userName:t,action:"lock.node",payload:{id:Pn}},{id:De(),userId:e,userName:t,action:"lock.node",payload:{id:ne}}])}function Ln(e){if(!e.length){let r=se.workspace("temporary-uninitialized-workspace","Workspace","a0"),o=qt(r);return a(o)?o:(x({hasProjectDefinition:!1,mode:g.DEFAULT}),c("Booted uninitialized workspace placeholder",null))}if(!e.some(r=>r.action==="init.workspace"))return s("Initialized Epiq project has no workspace init event");let n=et(e).filter(a);return n.length>0?s(`Materializing failed:
56
+ ${n.map(r=>r.message).join(`
57
+ `)}`):(Cc(),x({hasProjectDefinition:!0}),c("State booted successfully",null))}var bc=async e=>{let t=await L({cwd:e,args:["status","--porcelain"]});return a(t)?t:c("Checked git diff",t.value.stdout.trim().length>0)},W=(e,t)=>s(`[${e}] ${t}`),Yi=async()=>{let e=no(),t=await lt(process.cwd());if(a(t))return W(1,t.message);let n=t.value,r=await en(n);if(a(r))return W(2,r.message);if(r.value)return W(2,"Cannot initialize Epiq while a git operation is in progress");let o=await bc(n);if(a(o))return W(2.5,o.message);if(o.value)return W(3,"Cannot initialize Epiq with uncommitted changes. Commit or stash your changes first.");if(nr(n))return W(4,"Epiq project already initialized");let i=mn();if(!i.isSetupDone||!i.userName)return W(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let d=z(),l=d.userName,u=d.userId;if(!u||!l)return W(5,"Missing Epiq user id");let m=e.stateBranch,p=await tn({repoRoot:n,branch:m});if(a(p))return W(6,p.message);if(p.value)return W(6,`State branch already exists: ${m}`);let y=await Pr({repoRoot:n,stateBranchName:m});if(a(y))return W(6,y.message);let E=sn();if(a(E))return W(7,E.message);let I=Gi.join(rn(),e.projectId),A=await kr({repoRoot:n,stateBranchRoot:I,stateBranchName:m});if(a(A))return W(8,A.message);let $=Gi.join(I,".epiq");Rc.mkdirSync($,{recursive:!0});let S=Vi({userId:u,userName:l});if(a(S))return W(9,S.message);for(let Kn of S.value){let Jr=Mn({event:Kn,rootDir:I});if(a(Jr))return W(9,Jr.message)}let T=await kn({stateBranchRoot:I,eventFileName:Qe({userId:u,userName:l})});if(a(T))return W(10,T.message);let O=await ct({cwd:I,message:"[epiq:init]"});if(a(O))return W(10,O.message);let ee=await ji(n);if(a(ee))return W(11,ee.message);let de=oo({repoRoot:n,fileContents:e});if(a(de))return W(12,de.message);let st=await q.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(a(st))return W(13,st.message);let Ct=await q.commit({cwd:n,message:"[epiq:init-project]"});if(a(Ct))return W(13,Ct.message);let be="Project initialized!",Vr=await L({cwd:n,args:["push","-u","origin","HEAD"]});a(Vr)&&(be+=` Warn: [init:14] ${Vr.message}`);let Gr=await jt({repoRoot:n,stateBranchRoot:I});a(Gr)&&(be+=` Warn: [init:15] ${Gr.message}`);let Yr=et(S.value).filter(a);if(Yr.length>0)return W(16,Yr.map(Kn=>Kn.message).join(`
58
+ `));let zn=Se();if(a(zn))return W(16,zn.message);let{rootNodeId:ea,nodes:ta}=zn.value,Xr=ta[ea];return Xr?(U.navigate({currentNode:Xr,selectedIndex:0}),x({hasProjectDefinition:!0,mode:g.DEFAULT}),c(be,null)):W(16,"Unable to resolve initialized root node")};import{ulid as wc}from"ulid";import{ulid as Ac}from"ulid";var Xi=null,qe=()=>structuredClone(Xi),zt=e=>{Xi=e},Ji=()=>{let{currentNode:e,selectedIndex:t}=v(),r=j(e.id)[t];return r?c("Resolved selected child",r):s("Target node not found")},Lr=({id:e,parentId:t,position:n={at:"end"}})=>{let r=j(t).filter(o=>o.id!==e);return Fn(r,n)},Zi=({id:e,parentId:t,position:n={at:"end"}})=>{let r=K();if(a(r))return s("Unable to resolve user ID");let o=Lr({parentId:t,id:e,position:n});return a(o)?o:c("Created pending move state",{id:Ac(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value.rank}})},Qi=e=>{zt(e);let t=Kt(e,!0);return a(t)?t:c("Node moved successfully",t.value)};function Fr(e){let t=Ji();if(a(t))return t;let{currentNode:n,nodes:r}=v();if(!n.parentNodeId)return s("Missing parent node id");let o=r[n.parentNodeId];if(!o)return s("Missing parent node");let i=j(o.id),d=i.findIndex(({id:m})=>m===n.id);if(d<0)return s("Current node not found among siblings");let l=i[d+e];if(!l)return s("Missing sibling node");let u=Zi({id:t.value.id,parentId:l.id,position:{at:"end"}});return a(u)?u:Qi(u.value)}function Dr(e){let t=Ji();if(a(t))return t;let{currentNode:n,selectedIndex:r}=v(),i=j(n.id)[r+e];if(!i)return s("Missing sibling node");let d=Zi({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:i.id}});return a(d)?d:Qi(d.value)}var es=()=>{let e=qe();if(!e)return s("No pending move state");let t=e.payload.id,n=e.payload.parent,r=v().nodes[n];if(!r)return s("Move parent not found");let o=j(n).findIndex(i=>i.id===t);return o===-1?s("Moved node not found among rendered children"):(U.navigate({currentNode:r,selectedIndex:o}),c("Synchronized navigation to moved node",null))},Dn=(e,t="Moved preview")=>{if(a(e))return e;let n=es();return a(n)?n:(x({mode:g.MOVE}),c(t,null))},ts=async()=>{let e=K();if(a(e))return s("Unable to resolve user ID");let{modifier:t}=J().commandMeta,{currentNode:n,selectedIndex:r}=v(),o=j(n.id)[r];if(!o)return x({mode:g.DEFAULT}),s("No move target");if(t==="start"){if(o.readonly)return s("Target node is read-only");if(r===-1)return s("No item selected");if(!o.parentNodeId)return s("Target has no parent");let i=j(o.parentNodeId),d=i.findIndex(({id:y})=>y===o.id);if(d===-1)return s("Target not found among siblings");let l=i[d-1],u=i[d+1],m=u!=null?{at:"before",sibling:u.id}:l!=null?{at:"after",sibling:l.id}:{at:"start"},p=Lr({parentId:o.parentNodeId,id:o.id,position:m});return a(p)?p:(zt({id:wc(),action:"move.node",payload:{id:o.id,parent:o.parentNodeId,rank:p.value.rank},...e.value}),x({mode:g.MOVE}),c("Move initialized",null))}if(t==="next")return Dn(Dr(1));if(t==="previous")return Dn(Dr(-1));if(t==="to-next")return Dn(Fr(1));if(t==="to-previous")return Dn(Fr(-1));if(t==="confirm"){let i=qe();if(!i)return s("No pending move to confirm");let d=await xe();if(a(d))return d;let l=Ne(i,d.value);if(a(l))return l;let u=es();return a(u)?u:(zt(null),x({mode:g.DEFAULT}),c("Moved item",null))}return t==="cancel"?(zt(null),x({mode:g.DEFAULT}),c("Cancelling move",null)):s("Invalid move modifier")};import{ulid as Un}from"ulid";import{monotonicFactory as Tc,ulid as Mc}from"ulid";var Pc=Tc(),On=({name:e,parent:t,rank:n,user:{userId:r,userName:o}})=>{let i=Pc();return c("Created issue events",[{id:Mc(),userId:r,userName:o,action:"add.issue",payload:{id:i,parent:t,name:e,rank:n}}])};var ns=async(e,t)=>{let n=K();if(a(n))return s("Unable to resolve user ID");let r=await xe();if(a(r))return r;let o=r.value;if(!t.inputString)return s(`provide a name for your ${t.modifier}`);let{breadCrumb:i,currentNode:d,selectedIndex:l}=v(),u=m=>{let p=Ne(m,o);if(a(p))return p;let y=N.getNode(p.value.result.id);if(!y)return s("Created node not found");if(!y.parentNodeId)return p;let E=N.getNode(y.parentNodeId);return E?(U.navigate({currentNode:E,selectedIndex:N.getSiblings(y.parentNodeId).findIndex(({id:I})=>I===y.id)}),p):s("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:m}=v(),p=N.getNode(m);if(!p)return s("Workspace not found");let y=Et(p.id,n.value,o);return a(y)?y:u({id:Un(),action:"add.board",payload:{id:Un(),name:t.inputString,parent:p.id,rank:y.value},...n.value})}if(t.modifier==="swimlane"){let m=Me(i,"BOARD");if(a(m))return s("Unable to add swimlane in this context");let p=Et(m.value.id,n.value,o);return a(p)?p:u({id:Un(),action:"add.swimlane",payload:{id:Un(),name:t.inputString,parent:m.value.id,rank:p.value},...n.value})}if(t.modifier==="issue"){let m=_(d.id)[l],p=d.context==="SWIMLANE"?d:d.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let O=Me(i,"SWIMLANE");return a(O)?null:O.value})();if(!p)return s("Unable to add issue in this context");let y=Et(p.id,n.value,o);if(a(y))return y;let E=On({name:t.inputString,parent:p.id,rank:y.value,user:n.value});if(a(E))return E;let I=E.value,A=Nt(I,o);if(A.some(O=>a(O)))return s("Issue create failed: "+A.filter(a).map(O=>O.message).filter(Boolean).join(", "));let $=A[0];if(!$||a($))return s("Issue creation failed");let T=I.find(O=>O.action==="add.issue")?.payload.id;return T?(U.navigate({currentNode:p,selectedIndex:N.getSiblings(p.id).findIndex(({id:O})=>O===T)}),c("Issue created",null)):s("Unable to determine ticket id")}return c("Success",null)};var rs=async()=>{let e=Me(v().breadCrumb,"BOARD");if(a(e))return e;let t=dt(process.cwd());if(a(t))throw new Error(t.message);let n=ht(t.value);if(a(n))return s(n.message);let r=n.value,{modifier:o}=J().commandMeta,i;if(o==="now"){let E=Or();if(a(E))return E;let I=et(r);return I.some(a)?s(I.map(A=>A.message).join(", ")):(x({mode:g.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),c("Peeking now",!0))}if(o==="prev"){let E=v().eventLog.at(-2),I=lr(E);if(I===null)return s("No previous event to peek");i=I}else if(o==="next"){let E=v().unappliedEvents.at(0),I=lr(E);if(I===null)return s("No next event to peek");i=I}else{let E=fn(o);if(!E)return s("Invalid peek date");i=E.getTime()}let d=e.value.id,{appliedEvents:l,unappliedEvents:u}=Fi(r,i),m=Or();if(a(m))return m;let p=et(l);if(p.some(a))return s(p.map(E=>E.message).join(", "));let y=v().nodes[d];return y?(U.navigate({currentNode:y,selectedIndex:0}),x({mode:g.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:u}),c("Peeking ",!0)):s("Board did not exist at peek date")};import kc from"zod";var os=()=>{let e=J().commandMeta.inputString,t=kc.coerce.number().int().min(3e3).safeParse(e);if(!t.success)return s("Auto sync duration must be a number of at least 3000 ms");let n=Ze({autoSyncDebounceMs:t.data});return a(n)?n:(Ee({autoSyncIntervalMs:t.data}),x({mode:g.DEFAULT}),c(`Auto sync interval set to ${t.data}ms`,null))};var is=()=>{let e=J().commandMeta.inputString.trim();if(e!=="yes"&&e!=="no")return s("Invalid response");let t=Bo(e),n=Ze({autoSync:t});return a(n)?n:(Ee({autoSync:t}),x({mode:g.DEFAULT}),c(`Auto sync set to "${e}"`,null))};var ss=async()=>{B(()=>""),x({mode:g.DEFAULT});let e=Se();if(a(e))return s(e.message);if(e.value.syncStatus.status==="syncing")return s("Sync already in progress");x({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await $e();return a(t)?(x({syncStatus:{msg:t.message,status:"failed"}}),t):(x({mode:g.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};var as=e=>Object.values(v().tags).find(t=>t.name===e),ds=e=>Object.values(v().contributors).find(t=>t.name===e),cs=[{systemOnly:!0,intent:b.Move,description:"Internal move-state command",mode:g.COMMAND_LINE,action:ts},{intent:b.Delete,description:"Delete the currently selected node",mode:g.COMMAND_LINE,action:async()=>{let e=K();if(a(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=v(),r=_(t.id)[n];return r?ge({id:ae(),action:"delete.node",payload:{id:r.id},...e.value}):s("Unable to resolve child to delete")},onSuccess:()=>x({mode:g.DEFAULT})},{intent:b.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:g.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=J().commandMeta,n=/(!=|=)/,[r]=e.split(n);if(!r||!(d=>Q(f.FILTER).map(l=>l.split(n)[0]).includes(d))(r))return s("Invalid filter modifier");let i={target:r,operator:"=",value:t.trim()};return fe(d=>({...d,filters:e==="clear"?[]:[...d.filters,i],mode:g.DEFAULT})),c("Filter updated",null)}},{intent:b.ViewHelp,description:"Open the help screen",mode:g.COMMAND_LINE,action:()=>(x({mode:g.HELP}),c("Viewing help",null))},{intent:b.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:g.COMMAND_LINE,action:async()=>{let e=K();if(a(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=v(),r=_(t.id)[n];if(!r)return s("Unable to close issue, no target found");if(!F(r))return s("Cannot close in this context");let o=v().nodes[ne];if(!o)return s("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return s("Issue is already closed");let i=await xe();if(a(i))return i;let d=i.value,l=St(o.id,r.id,{at:"end"},e.value,d);if(a(l))return l;let u=await ge({id:ae(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:l.value},...e.value});return a(u)?u:c("Issue closed",null)},onSuccess:()=>x({mode:g.DEFAULT})},{intent:b.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:g.COMMAND_LINE,action:async()=>{let e=K();if(a(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=v(),r=_(t.id)[n];if(!r)return s("Unable to reopen issue, no target found");let o=r.context==="TICKET"?c("Resolved ticket",r):It(r.id,"TICKET");if(a(o))return s("Cannot reopen in this context");let i=o.value,d=v().nodes[ne];if(!d)return s("Unable to locate closed swimlane");if(i.parentNodeId!==d.id)return s("Issue is not closed");if(!F(i))return s("Target node is not issue");let l=Bi(i);if(!l)return s("Unable to resolve previous parent from issue history");if(l===d.id)return s("Previous parent resolves to closed swimlane");let u=v().nodes[l];if(!u)return s("Previous parent no longer exists");let m=await xe();if(a(m))return m;let p=m.value,y=St(u.id,i.id,{at:"end"},e.value,p);if(a(y))return y;let E=await ge({id:ae(),action:"reopen.issue",payload:{id:i.id,parent:u.id,rank:y.value},...e.value});return a(E)?E:c("Issue reopened",null)},onSuccess:()=>x({mode:g.DEFAULT})},{intent:b.Init,description:"Initialize Epiq in the current git repository",mode:g.COMMAND_LINE,action:Yi},{intent:b.NewItem,description:"Create a new board, swimlane, or issue",mode:g.COMMAND_LINE,action:ns,onSuccess:()=>x({mode:g.DEFAULT})},{intent:b.Rename,description:"itle] Rename the currently selected node",mode:g.COMMAND_LINE,action:async()=>{let e=K();if(a(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=v(),r=_(t.id)[n];if(!r)return s("Missing node");if(r.readonly)return s("Cannot rename readonly node");let o=si();return o?ge({id:ae(),action:"edit.title",payload:{id:r.id,name:o},...e.value}):s("Provide a new name")},onSuccess:()=>x({mode:g.DEFAULT})},{intent:b.UntagTicket,description:"Remove a tag from the selected issue",mode:g.COMMAND_LINE,action:async()=>{let e=K();if(a(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=J().commandMeta,r=(t||n).trim();if(!r)return s("Provide a tag");let o=as(r);if(!o)return s(`Tag "${r}" does not exist`);let{selectedNode:i}=v();if(!i)return s("Invalid untag target");let d=It(i.id,"TICKET");if(a(d))return s("Unable to untag issue in this context");let l=d.value;return F(l)?(l.props.tags??[]).includes(o.id)?ge({id:ae(),action:"remove.issue.tag",payload:{id:l.id,tag:o.id},...e.value}):s("Issue is not tagged with that tag"):s("Target node is not issue")},onSuccess:()=>x({mode:g.DEFAULT})},{intent:b.TagTicket,description:"Add or create a tag on the selected issue",mode:g.COMMAND_LINE,action:async()=>{let e=K();if(a(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=J().commandMeta,r=(t||n).trim();if(!r)return s("Provide a tag");let{selectedNode:o}=v();if(!o)return s("Invalid tag target");let i=It(o.id,"TICKET");if(a(i))return s("Unable to tag issue in this context");let d=i.value;if(!F(d))return s("Target node is not issue");let l=as(r),u;if(l)u=l.id;else{let p=ae(),y=await ge({id:ae(),action:"create.tag",payload:{id:p,name:r},...e.value});if(a(y))return y;u=y.value.result.id}return(d.props.tags??[]).includes(u)?s("Already tagged with that tag"):ge({id:ae(),action:"add.issue.tag",payload:{id:d.id,tag:u},...e.value})},onSuccess:()=>x({mode:g.DEFAULT})},{intent:b.AssignUserToTicket,description:"Assign a user to the selected issue",mode:g.COMMAND_LINE,action:async()=>{let e=K();if(a(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=J().commandMeta,r=(t||n).trim();if(!r)return s("Provide an assignee");let{selectedIndex:o,currentNode:i}=v(),d=_(i.id)[o];if(!d)return s("Invalid assign target");let l=It(d.id,"TICKET");if(a(l))return s("Unable to assign issue in this context");let u=l.value;if(!F(u))return s("Target node is not issue");let m=ds(r),p;if(m)p=m.id;else{let E=ae(),I=await ge({id:ae(),action:"create.contributor",payload:{id:E,name:r},...e.value});if(a(I))return I;p=I.value.result.id}return(u.props.assignees??[]).includes(p)?s("Assignee already assigned"):ge({id:ae(),action:"add.issue.assignee",payload:{id:u.id,assignee:p},...e.value})},onSuccess:()=>x({mode:g.DEFAULT})},{intent:b.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:g.COMMAND_LINE,action:async()=>{let e=K();if(a(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=J().commandMeta,r=(t||n).trim();if(!r)return s("Provide an assignee to remove");let o=ds(r);if(!o)return s(`Assignee "${r}" does not exist`);let{selectedNode:i}=v();if(!i)return s("Invalid unassign target");let d=It(i.id,"TICKET");if(a(d))return s("Unable to unassign in this context");let l=d.value;return F(l)?(l.props.assignees??[]).includes(o.id)?ge({id:ae(),action:"remove.issue.assignee",payload:{id:l.id,assignee:o.id},...e.value}):s(`Issue is not assigned to "${r}"`):s("Target node is not issue")},onSuccess:()=>x({mode:g.DEFAULT})},{intent:b.Sync,description:"Pull, commit, and push Epiq state",mode:g.COMMAND_LINE,action:ss},{intent:b.Peek,description:"View board state at another point in time",mode:g.COMMAND_LINE,action:rs},{intent:b.Export,description:"Export the current board layout to markdown",mode:g.COMMAND_LINE,action:async()=>{let e=await Ei();return a(e)?e:(x({mode:g.DEFAULT}),c("Export successful",!0))}},{intent:b.Exit,description:"Exit the application",mode:g.COMMAND_LINE,action:async()=>(U.exit(),c("Exit successful",!0))},{intent:b.Edit,description:"Edit title or description",mode:g.COMMAND_LINE,action:async(e,t)=>{if(t.modifier===We.DESCRIPTION)return Wi();if(t.modifier===We.TITLE){let n=K();if(a(n))return s("Unable to resolve user ID");let{currentNode:r,selectedIndex:o}=v(),i=_(r.id)[o];if(!i)return s("Missing node");if(i.readonly)return s("Cannot rename readonly node");let d=t.inputString.trim();return d?ge({id:ae(),action:"edit.title",payload:{id:i.id,name:d},...n.value}):s("Provide a new name")}return s("Unknown edit command")},onSuccess:()=>x({mode:g.DEFAULT})},{intent:b.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:g.COMMAND_LINE,action:(e,t)=>{let n=t.inputString.trim();switch(t.modifier){case X.USERNAME:{let{userId:r,preferredEditor:o,userName:i}=z(),d=n||i,l=r??ae();if(!d||!l)return s("Unable to resolve user name or id");let u=Ze({userName:d,userId:l,preferredEditor:o??""});return a(u)?u:(Ee({userName:d,userId:l}),x({mode:g.DEFAULT}),c(`Username set to "${d}"`,null))}case X.EDITOR:{if(!n)return s("No editor provided");let r=Ze({preferredEditor:n});return a(r)?r:(Ee({preferredEditor:n}),x({mode:g.DEFAULT}),c(`Editor configuration set to "${n}"`,null))}case X.VIEW:return n!=="wide"&&n!=="dense"?s("Invalid view mode"):(Ee({viewMode:n}),c(`View set to "${n}"`,null));case X.AUTOSYNC:return is();case X.SYNC_DEBOUNCE_MS:return os();default:return s("Unknown config command")}}}];var Lc=new Set(["peek","filter","view-help"]),ve=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=J();if(!t)return s("No command to confirm");if(!e&&n===Ye.Invalid)return s("Invalid command");let i=ai(t);ni();let{readOnly:d}=v();if(d&&!Lc.has(i))return Ut({status:Oe.Fail,message:"Command not available in readonly state",value:null});let l=cs.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===i);if(!l)return Ut({status:Oe.Fail,message:"Command not found",value:null});let u;try{u=await l.action(l,{command:t,inputString:o,modifier:r})}catch(m){return Ut({status:Oe.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return a(u)?Ut(u):(ri({addToHistory:!e}),l.onSuccess?.(),z().autoSync&&Do(),u)};var Bn=[{intent:R.Exit,mode:g.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(x({mode:g.COMMAND_LINE}),B(()=>"move cancel"),ve({isForceExecutedBySystem:!0}))},{intent:R.InitMove,mode:g.DEFAULT,description:"[m] move init/confirm",action:()=>(x({mode:g.COMMAND_LINE}),B(()=>"move start"),ve({isForceExecutedBySystem:!0}))},{intent:R.ConfirmMove,mode:g.MOVE,action:()=>(x({mode:g.COMMAND_LINE}),B(()=>"move confirm"),ve({isForceExecutedBySystem:!0}))}],_n=[{intent:R.MovePreviousItem,mode:g.MOVE,action:()=>qe()?(x({mode:g.COMMAND_LINE}),B(()=>"move previous"),ve({isForceExecutedBySystem:!0})):s("No pending move")},{intent:R.MoveNextItem,mode:g.MOVE,action:()=>qe()?(x({mode:g.COMMAND_LINE}),B(()=>"move next"),ve({isForceExecutedBySystem:!0})):s("No pending move")}],ls=[{intent:R.MoveToNextContainer,mode:g.MOVE,action:()=>qe()?(x({mode:g.COMMAND_LINE}),B(()=>"move to-next"),ve({isForceExecutedBySystem:!0})):s("No pending move")},{intent:R.MoveToPreviousContainer,mode:g.MOVE,action:()=>qe()?(x({mode:g.COMMAND_LINE}),B(()=>"move to-previous"),ve({isForceExecutedBySystem:!0})):s("No pending move")}];var us={[C.WORKSPACE]:[...Bn,..._n],[C.BOARD]:[...Bn,..._n],[C.SWIMLANE]:[...Bn,..._n,...ls],[C.TICKET]:[],[C.FIELD]:[],[C.FIELD_LIST]:[],[C.TEXT]:[]};var ms=e=>[{intent:R.NavPreviousItem,mode:e,description:"[arrows/hjkl] navigate",action:()=>(U.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:R.NavNextItem,mode:e,action:()=>(U.navigateToNextItem(),c("Navigating to next item",null))},{intent:R.NavToPreviousContainer,mode:e,action:()=>(U.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:R.NavToNextContainer,mode:e,action:()=>(U.navigateToNextContainer(),c("Navigating to next container",null))}],ps=[{intent:R.AddItem,mode:g.DEFAULT,description:"[n] new...",action:()=>(x({mode:g.COMMAND_LINE}),B(()=>`${f.NEW} `),c("Adding new item",null))},{intent:R.Delete,mode:g.DEFAULT,description:"[d] delete",action:()=>(x({mode:g.COMMAND_LINE}),B(()=>`${f.DELETE} `),c("Deleting item",null))},{intent:R.InitCommandPalette,mode:g.DEFAULT,description:"[?] command palette",action:()=>(x({mode:g.PALETTE}),c("Opening command palette",null))},{intent:R.InitCommandLine,mode:g.DEFAULT,description:"[:] focus command line",action:()=>(x({mode:g.COMMAND_LINE}),B(()=>""),c("Entering command line mode",null))},{intent:R.Confirm,mode:g.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,currentNode:t}=v();if(!j(e?.id??"")?.length){if(e?.title===G.DESCRIPTION)return B(()=>`${f.EDIT} description `),x({mode:g.COMMAND_LINE}),c("Propose command",!0);if(e?.title===G.ASSIGNEES)return B(()=>`${f.ASSIGN} `),x({mode:g.COMMAND_LINE}),c("Propose command",!0);if(e?.title===G.TAGS)return B(()=>`${f.TAG} `),x({mode:g.COMMAND_LINE}),c("Propose command",!0);if(t.title===G.DESCRIPTION&&e?.context==="TEXT")return B(()=>`${f.EDIT} description `),x({mode:g.COMMAND_LINE}),c("Propose command",!0)}return U.enterChildNode(),c("Entering context",null)}},{intent:R.Confirm,mode:g.PALETTE,description:"[<Enter>] select command",action:()=>{let{selectedNode:e}=v();if(!e||!Zr(e))return s("Command only applicable on text nodes");if(e.props.disabled)return s("Command is not available in this context");let t=e?.title;return t?(x({mode:g.COMMAND_LINE}),B(()=>`${t} `),c("Selected command",t)):c("No command selected",null)}},{intent:R.Exit,mode:g.DEFAULT,description:"[q] exit context",action:()=>(U.enterParentNode(),c("Exiting context",null))},{intent:R.Exit,mode:g.PALETTE,description:"[q] close palette",action:()=>(x({mode:g.DEFAULT}),B(()=>""),c("Closed command palette",null))},...ms(g.DEFAULT),...ms(g.PALETTE),{intent:R.Edit,mode:g.DEFAULT,action:()=>(x({mode:g.COMMAND_LINE}),B(()=>f.EDIT),ve(),c("Fired command",!0))},{intent:R.SetViewDense,mode:g.DEFAULT,description:"[v] view change (wide/dense)",action:()=>(Ee({viewMode:"dense"}),c("View set",null))},{intent:R.SetViewWide,mode:g.DEFAULT,action:()=>(Ee({viewMode:"wide"}),c("View set",null))}];var Fc=500,Dc=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),gs=e=>{let t=Dc(e);t&&B(n=>(n+t).slice(0,Fc))};var Oc=[g.COMMAND_LINE,g.PALETTE],Uc=e=>[{intent:R.MoveCursorLeft,mode:e,action:()=>(yr(-1),c("Moving cursor left",null))},{intent:R.MoveCursorRight,mode:e,action:()=>(yr(1),c("Moving cursor right",null))},{intent:R.MoveCursorLeftOfWord,mode:e,action:()=>(hr("left"),c("Moving cursor left of word",null))},{intent:R.MoveCursorRightOfWord,mode:e,action:()=>(hr("right"),c("Moving cursor right of word",null))},{intent:R.AutoCompleteCommand,mode:e,action:()=>(B((t,{remainder:n})=>n?t+n:t),c("Auto-completing command",null))},{intent:R.CaptureInput,mode:e,action:(t,{sequence:n})=>(gs(n??""),c("Capturing input",null))},{intent:R.EraseInput,mode:e,action:()=>(ei(),c("Erasing input",null))},{intent:R.EraseInputWord,mode:e,action:()=>(ti(),c("Erasing input word",null))}],fs=[{intent:R.Confirm,mode:g.COMMAND_LINE,action:()=>(ve(),c("Executing command",null))},{intent:R.ViewHelp,mode:g.DEFAULT,action:()=>(x({mode:g.HELP}),c("Viewing help",null))},{intent:R.Exit,mode:g.HELP,action:()=>(x({mode:g.DEFAULT}),c("Exiting help",null))},...Oc.flatMap(Uc),{intent:R.ExitCommandLine,mode:g.COMMAND_LINE,action:()=>(x({mode:g.DEFAULT}),c("Exiting command line",null))},{intent:R.ExitCommandLine,mode:g.PALETTE,action:()=>(x({mode:g.DEFAULT}),c("Exiting palette",null))},{intent:R.GetLastCommandFromHistory,mode:g.COMMAND_LINE,action:()=>(oi(),c("Getting last command from history",null))},{intent:R.GetNextCommandFromHistory,mode:g.COMMAND_LINE,action:()=>(ii(),c("Getting next command from history",null))}];import Bc from"chalk";var $n=": for command line",vs="q to exit",ys=`${Bc.hex(w.accent)("m")} to confirm`,Ur={[C.WORKSPACE]:[$n],[C.BOARD]:[$n],[C.BOARD+g.COMMAND_LINE]:[$n],[C.SWIMLANE]:[$n],[C.TICKET+g.HELP]:[vs],[C.SWIMLANE+g.HELP]:[vs],[C.TICKET]:[],[C.FIELD]:[],[C.SWIMLANE+g.MOVE]:[ys],[C.TICKET+g.MOVE]:[ys]};var Vt=e=>e.trim().toLocaleLowerCase(),_c=e=>{let{tags:t}=v();return(e.props.tags??[]).map(n=>t[n]?.name).filter(n=>!!n)},$c=e=>{let{contributors:t}=v();return(e.props.assignees??[]).map(n=>t[n]?.name).filter(n=>!!n)},hs=(e,t)=>{let n=Vt(t.value);if(!n)return!0;switch(t.target){case"title":return Vt(e.title??"").includes(n);case"description":return Vt(e.props.description??"").includes(n);case"tag":return _c(e).map(Vt).some(o=>o.includes(n));case"assignee":return $c(e).map(Vt).some(o=>o.includes(n));default:return!0}};function xs(e,t,n){let r=t[e];if(!r)return s("buildBreadCrumb(): current node not found");let o=[],i=r;for(;i&&(o.push(i),!(i.id===n||!i.parentNodeId));)i=t[i.parentNodeId];let d=o[o.length-1];return!d||d.id!==n?s("buildBreadCrumb(): node is not connected to root"):(o.reverse(),c("Breadcrumb built",o))}var Es=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,Br,_r=new Set,Ns=()=>{for(let e of _r)e()},jc=e=>(_r.add(e),()=>_r.delete(e));function Is(e){let{currentNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:i}=e;if(!t)return s("derive(): currentNodeId is missing");if(!r)return s("derive(): rootNode is missing");if(!o[r])return s("derive(): unable to find root node");let l=o[t];if(!l)return s("Unable to derive state, currentNode not found");let u=xs(t,o,r);if(a(u))return logger.error(u.message),u;let m=u.value,{context:p}=l,y=Ur[p+n]??Ur[p]??[],E=[...ps,...us[p]??[],...fs],I=Es(E),A=Hc(o,i),$=A[t]?.[e.selectedIndex]??null;return c("Derived successfully",{...e,currentNode:l,breadCrumb:m,availableHints:y,availableActions:E,actionIndex:I,selectedNode:$,renderedChildrenIndex:A})}var v=()=>{if(!tt)throw new Error("State not initialized. Call initWorkspaceState() first.");return tt},Se=()=>tt?c("Retrieved state",tt):s("State not initialized. Call initWorkspaceState() first.");function qt(e){Br=e;let t=_e(process.cwd()),n=!1;if(!a(t)){let i=Be(t.value);if(a(i))return s(i.message);n=!0}let r={readOnly:!1,filters:[],tags:{},contributors:{},mode:g.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,currentNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""},eventLog:[],unappliedEvents:[],timeMode:"live",hasProjectDefinition:n,hasInitializingEvents:!1},o=Is(r);return a(o)?o:(tt=o.value,Ns(),c("State initialized",null))}function fe(e){let t=v(),n=e(t),r=Is(n);return a(r)?s(r.message??"Unable to update state"):(tt=r.value,Ns(),c("State updated",null))}var x=e=>fe(t=>({...t,...e}));var Ce=()=>Wc(jc,v,v),Hc=(e,t)=>{let n={};for(let r of Object.values(e))F(r)&&t.length>0&&!t.every(o=>hs(r,o))||!r.parentNodeId||r.isDeleted||((!r.parentNodeId||!n[r.parentNodeId])&&(n[r.parentNodeId]=[]),n[r.parentNodeId].push(r));for(let r of Object.keys(n))n[r].sort((o,i)=>{let d=e[o.id],l=e[i.id];return!d||!l?0:d.rank.localeCompare(l.rank)});return n},_=e=>v()?.renderedChildrenIndex[e]??[],Or=()=>Br?qt(Br):s("Cannot reset state: no initial workspace found"),mt=()=>tt!==void 0;var It=(e,t)=>{let{nodes:n}=v(),r=n[e];if(!r)return s("Node not found");if(r.context===t)return c("Resolved ancestor node",r);let o=r.parentNodeId?n[r.parentNodeId]:void 0;for(;o;){if(o.context===t)return c("Resolved ancestor node",o);o=o.parentNodeId?n[o.parentNodeId]:void 0}return s(`No ancestor found for context: ${t}`)},qc=(e,t)=>{let{nodes:n}=v(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},nt=(e,t)=>e?e.readonly?s({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node"}[t]):null:s("Node not found"),N={deleteNode(e){fe(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},editValue(e,t){let{nodes:n}=v(),r=n[e];if(!r)return s("Edit target node not found");let o=nt(r,"edit");if(o)return o;let i={...r,props:{...r.props,description:t}};return this.updateNode(i),c("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return s("Rename target node not found");let r=nt(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),c("Renamed node",o)},getExistingTags(){let{tags:e}=v();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=v();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return j(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:r}=v(),o=this.getNode(e),i=this.getNode(t);if(!o)return s("Node not found");if(!i)return s("Target parent not found");if(r===e)return s("Cannot move root node");if(e===t)return s("Cannot move node into itself");let d=nt(o,"move");if(d)return d;if(qc(t,e))return s("Cannot move node into its own descendant");let l={...o,parentNodeId:t,rank:n};return this.updateNode(l),c("Moved node successfully",l)},tombstoneNode(e){let{nodes:t,currentNodeId:n,rootNodeId:r}=v(),o=this.getNode(e);if(!o)return s("Node not found");if(r===e)return s("Cannot delete root node");let i=new Set,d=u=>{let m=t[u];if(!(!m||i.has(u))){i.add(u);for(let p of j(m.id))d(p.id)}};d(e);let l={...structuredClone(t)};for(let u of i){if(!l[u])return s("Unable to locate node to delete");l[u]={...l[u],isDeleted:!0}}return n?(x({nodes:l}),c("Successfully tomb stoned",o)):s("Unable to delete undefined")},createContributor(e){let t=fe(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return a(t)?s("Unable to create contributor"):c("Created contributor",e)},assign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return s("Unable to assign contributor, missing contributor");if(!r)return s("Unable to assign contributor, missing target");let o=nt(r,"edit");if(o)return o;if(!F(r))return s("Target is not an issue");let i=r.props.assignees??[];if(i.includes(t))return s("Contributor already assigned");let d={...r,props:{...r.props,assignees:[...i,t]}};return this.updateNode(d),c("Assigned contributor",{assignee:t})},unassign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return s("Unable to unassign, missing contributor");if(!r)return s("Unable to unassign, missing target");let o=nt(r,"edit");if(o)return o;if(!F(r))return s("Target is not an issue");let i=r.props.assignees??[];if(!i.includes(t))return c("Issue is not assigned to that contributor",{assignee:t});let d={...r,props:{...r.props,assignees:i.filter(l=>l!==t)}};return this.updateNode(d),c("Assignee removed",{assignee:t})},tag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return s("Unable to add tag, missing tag");if(!r)return s("Unable to add tag, missing target");let o=nt(r,"edit");if(o)return o;if(!F(r))return s("Target is not an issue");let i=r.props.tags??[];if(i.includes(t))return s("Tag already assigned");let d={...r,props:{...r.props,tags:[...i,t]}};return this.updateNode(d),c("Tag added",{tag:t})},untag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return s("Unable to remove tag, missing tag");if(!r)return s("Unable to remove tag, missing target");let o=nt(r,"edit");if(o)return o;if(!F(r))return s("Target is not an issue");let i=r.props.tags??[];if(!i.includes(t))return c("Issue is not tagged with that tag",{tag:t});let d={...r,props:{...r.props,tags:i.filter(l=>l!==t)}};return this.updateNode(d),c("Tag removed",{tag:t})},createTag(e){let t=fe(n=>({...n,tags:{...n.tags,[e.id]:e}}));return a(t)?s("Could not create tag"):c("Tag created",e)},createNode(e){let t=fe(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return a(t)?s("Unable to create node"):c("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return s("Failed to locate node");let n={...t,readonly:!0},r=fe(o=>({...o,nodes:{...o.nodes,[e]:n}}));return a(r)?s(r.message):c("Locked node",n)},updateNode(e){let t=fe(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return a(t)?t:c("Updated node",e)},getContributor(e){return v().contributors[e]},getTag(e){return v().tags[e]},getNode(e){return v().nodes[e]},getSiblings(e){return j(e)}};import rt from"chalk";import Ss from"string-width";import{decodeTime as zc}from"ulid";var Kc=(e,t)=>e+" ".repeat(Math.max(0,t-Ss(e))),Vc=(e,t)=>" ".repeat(Math.max(0,t-Ss(e)))+e,Gc=e=>({"add.issue":"Created with title","add.issue.assignee":"Assigned to","remove.issue.assignee":"Unassigned from","close.issue":"Closed","delete.node":"Deleted","edit.title":"Changed title to","edit.description":"Changed description","reopen.issue":"Reopened","add.issue.tag":"Tagged with","remove.issue.tag":"Removed tag","lock.node":"Locked node","move.node":"Moved issue"})[e]??(e.endsWith("e")?`${e}d`:`${e}ed`),Yc=(e,t)=>t?e<t?"up":e>t?"down":null:null,Xc=(e,t)=>{let n=N.getNode(e.payload.parent),r=n?rt.dim.bgBlack(` ${n.title} `):"unknown",o=t.at(-1);if(o&&"parent"in o&&"rank"in o&&o.parent===e.payload.parent){let i=Yc(e.payload.rank,o.rank);if(i)return`Moved ${i} in ${r}`}return`Moved issue to ${r}`},Jc=e=>{switch(e.action){case"add.issue.tag":{let t=v().tags[e.payload.tag];return t?rt.bgHex(ie(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=v().tags[e.payload.tag];return t?rt.bgHex(ie(t.name))(` ${t.name} `):"unknown tag"}case"add.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?rt.hex(ie(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?rt.hex(ie(t.name))(` ${t.name} `):"unknown user"}case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"create.tag":case"create.contributor":case"edit.title":return`"${"name"in e.payload?e.payload.name:""}"`;default:return""}},Zc=e=>{let t=qo(zc(e));return rt.gray(Vc(t,8))},Qc=12,el=e=>Kc(`${e}`,Qc),Cs=(e,t)=>{let n=Zc(e.id),r=el(e.userName),o=rt.dim("\u203A"),i=e.action==="move.node"?Xc(e,t):[Gc(e.action),Jc(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${i}`};var tl=e=>je(e,"description"),nl=e=>je(e,"assignees"),rl=e=>je(e,"tags"),ol=e=>je(e,"history"),Rs=({id:e,name:t,parentNodeId:n,rank:r,value:o,readonly:i=!1,childRenderAxis:d="horizontal"})=>{let l=N.getNode(e);if(!l){N.createNode({...se.field({id:e,name:t,parentNodeId:n,rank:r,props:{value:o},isVirtual:!0}),readonly:i,childRenderAxis:d});return}!Ue(l)||!(l.title!==t||l.parentNodeId!==n||l.rank!==r||l.props.value!==o||l.readonly!==i||l.childRenderAxis!==d)||N.updateNode({...l,title:t,parentNodeId:n,rank:r,props:{...l.props,value:o},readonly:i,childRenderAxis:d})},bs=({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!1,childRenderAxis:i="horizontal"})=>{let d=N.getNode(e);if(!d){N.createNode({...se.fieldList({id:e,name:t,parentNodeId:n,rank:r,isVirtual:!0}),readonly:o,childRenderAxis:i});return}!bt(d)||!(d.title!==t||d.parentNodeId!==n||d.rank!==r||d.readonly!==o||d.childRenderAxis!==i)||N.updateNode({...d,title:t,parentNodeId:n,rank:r,readonly:o,childRenderAxis:i})},As=e=>{let t=he(Ae/4n),n=he(Ae/2n),r=he(Ae*3n/4n),o=he(Ae);a(t)||a(n)||a(r)||a(o)||(Rs({id:tl(e.id),name:G.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"}),bs({id:nl(e.id),name:G.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0}),bs({id:rl(e.id),name:G.TAGS,parentNodeId:e.id,rank:r.value,readonly:!0}),Rs({id:ol(e.id),name:G.HISTORY,parentNodeId:e.id,rank:o.value,value:il(e),readonly:!0,childRenderAxis:"vertical"}))},il=e=>{let t=[...e.log].reverse(),n=new Map;for(let r of t){let o=n.get(r.action)??[];o.push(r.payload),n.set(r.action,o)}return t.map(r=>Cs(r,n.get(r.action)??[])).join(`
59
+ `)};var M=(e,t)=>s(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),ws=e=>{let t=N.getNode(e);!t||!F(t)||t.isDeleted||As(t)},sl=e=>{for(let t of e){ws(t);let n=v().nodes[t]?.parentNodeId;n&&ws(n)}},al=(e,t)=>{let n=N.getNode(e);n&&N.updateNode({...n,log:[...n.log??[],t]})},dl=e=>{let t=[e],n=v().nodes[e]?.parentNodeId;return n&&t.push(n),t},cl=e=>{switch(e.action){case"delete.node":case"edit.description":return dl(e.payload.id);case"init.workspace":case"add.workspace":case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"edit.title":case"lock.node":case"move.node":case"close.issue":case"reopen.issue":case"add.issue.tag":case"remove.issue.tag":case"add.issue.assignee":case"remove.issue.assignee":return[e.payload.id];case"rebalance.children":return Object.keys(e.payload.ranks);case"create.tag":case"create.contributor":default:return[]}},ll=e=>{fe(t=>({...t,eventLog:[...t.eventLog,e]}))},ul=e=>{let t=e.userId,n=e.userName;if(!t?.length||!n?.length)return M("Invalid user ID format",e);let r=N.createContributor({id:t,name:n});return a(r)?M(r.message,e):null},ml=(e,t)=>{let n=ul(e);if(n)return n;let r=[...new Set(cl(e))];return t||(r.forEach(o=>al(o,e)),ll(e)),sl(r),null},pl={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=se.workspace(t,n,r),i=qt(o);if(a(i))return M(i.message,e);let d=N.createNode(o);return a(d)?M(d.message??"Failed to initialize workspace",e):Vn(d.value)?c("Workspace initialized",{action:e.action,result:d.value}):s("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=N.createNode(se.workspace(t,n,r));return a(o)?M(o.message??"Failed to add workspace",e):Vn(o.value)?c("Added workspace",{action:e.action,result:o.value}):s("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,i=N.createNode(se.board(t,n,r,o));return a(i)?M(i.message??"Unable to create board",e):Qr(i.value)?c("Added board",{action:e.action,result:i.value}):s("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,i=N.createNode(se.swimlane(t,n,r,o));return a(i)?M(i.message??"Unable to create swimlane",e):Yt(i.value)?c("Added swimlane",{action:e.action,result:i.value}):s("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,i=N.createNode(se.ticket(t,n,r,o));return a(i)?M(i.message??"Unable to create issue",e):F(i.value)?c("Added issue",{action:e.action,result:i.value}):s("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:r,val:o,rank:i}=e.payload,d=N.createNode(se.field({id:t,name:n,parentNodeId:r,rank:i,props:{value:o},childRenderAxis:n.includes(G.DESCRIPTION)?"vertical":"horizontal"}));return a(d)?M(d.message??`Unable to create field: ${n}`,e):Ue(d.value)?c("Added field",{action:e.action,result:d.value}):s("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!N.getNode(t))return M(`Unable to locate node with id ${t}`,e);let o=N.renameNode(t,n);return a(o)?M(o.message??"Unable to edit title",e):c("Edited title",{action:e.action,result:o.value})},"delete.node":e=>{let{id:t}=e.payload,n=N.tombstoneNode(t);return a(n)?M(n.message??"Unable to delete node",e):c("Deleted node",{action:e.action,result:n.value})},"create.tag":e=>{let{id:t,name:n}=e.payload,r=N.createTag({id:t,name:n});return a(r)?M(r.message??"Unable to create tag",e):c("Tag added",{action:e.action,result:r.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,r=N.createContributor({id:t,name:n});return a(r)?M(r.message??"Unable to create contributor",e):c("Contributor created",{action:e.action,result:r.value})},"add.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=N.tag(t,n);return a(r)?M(r.message??"Unable to tag issue",e):c("Issue tagged",{action:e.action,result:{tag:n}})},"remove.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=N.untag(t,n);return a(r)?M(r.message??"Unable to untag issue",e):c("Issue untagged",{action:e.action,result:{tag:n}})},"add.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,r=N.assign(t,n);return a(r)?M(r.message??"Unable to assign issue",e):c("Assigned successfully",{action:e.action,result:{assignee:n}})},"remove.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,r=N.unassign(t,n);return a(r)?M(r.message??"Unable to unassign issue",e):c("Issue unassigned",{action:e.action,result:{assignee:n}})},"move.node":e=>{let{id:t,parent:n,rank:r}=e.payload,o=N.moveNodeToRank({id:t,parentId:n,rank:r});return a(o)?M(o.message??"Failed to move node",e):c("Moved node",{action:e.action,result:o.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,r=N.editValue(t,n);return a(r)?M(r.message??"Unable to edit description",e):c("Set node value",{action:e.action,result:r.value})},"close.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=N.getNode(t);if(!o)return M("Unable to locate issue",e);if(!F(o))return M("Can only close issues",e);let i=N.getNode(ne);if(!i)return M("Unable to locate target swimlane",e);if(n!==i.id)return M("Close target must be closed swimlane",e);let d=N.moveNodeToRank({id:t,parentId:n,rank:r});return a(d)?M(d.message??"Unable to close issue",e):c("Issue closed",{action:e.action,result:{id:t}})},"reopen.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=N.getNode(t);if(!o)return M("Unable to locate issue",e);if(!F(o))return M("Can only reopen issues",e);let i=N.getNode(ne);if(!i)return M("Unable to locate closed swimlane",e);if(n===i.id)return M("Cannot reopen issue into closed swimlane",e);if(!N.getNode(n))return M("Reopen parent no longer exists",e);let l=N.moveNodeToRank({id:t,parentId:n,rank:r});return a(l)?M(l.message??"Unable to reopen issue",e):c("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=N.lockNode(t);return a(n)?M(n.message??"Unable to lock node",e):c("Node locked",{action:e.action,result:n.value})},"rebalance.children":e=>{let{parent:t,ranks:n}=e.payload;for(let[r,o]of Object.entries(n)){let i=N.getNode(r);if(!i)return M(`Unable to locate node ${r}`,e);if(i.parentNodeId!==t)return M(`Node ${r} is not child of ${t}`,e);let d=N.updateNode({...i,rank:o});if(a(d))return M(d.message??"Unable to rebalance child",e)}return c("Rebalanced children",{action:e.action,result:{parent:t}})}};function Kt(e,t=!1){let n=pl[e.action](e);if(a(n))return n;let r=ml(e,t);return r||n}var et=e=>e.map(t=>Kt(t));function Ne(e,t){let n=Kt(e);if(n.status!==Oe.Success)return n;let r=Mn({event:e,rootDir:t});return a(r)?r:n}function Nt(e,t){return e.map(n=>Ne(n,t))}var ge=async e=>{let t=await xe();return a(t)?t:Ne(e,t.value)};var Ts=e=>Fn(j(e),{at:"end"}),Fn=(e,t={at:"end"})=>{let n=r=>a(r)?c("Rank space exhausted",{rank:"",needsRebalance:!0}):c("Resolved rank",{rank:r.value,needsRebalance:!1});if(e.length===0)return n(re(void 0,void 0));switch(t.at){case"start":{let r=e[0];return r?n(re(void 0,r.rank)):s("Unable to resolve first sibling")}case"end":{let r=e[e.length-1];return r?n(re(r.rank,void 0)):s("Unable to resolve last sibling")}case"before":{let r=Ms(e,t.sibling);if(r<0)return s("Sibling not found");let o=r>0?e[r-1]:void 0,i=e[r];return i?n(re(o?.rank,i.rank)):s("Sibling not found")}case"after":{let r=Ms(e,t.sibling);if(r<0)return s("Sibling not found");let o=e[r],i=r<e.length-1?e[r+1]:void 0;return o?n(re(o.rank,i?.rank)):s("Sibling not found")}}},j=e=>Object.values(v().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),Ms=(e,t)=>e.findIndex(n=>n.id===t),Ps=(e,t,n={at:"end"})=>Fn(j(t).filter(r=>r.id!==e),n),St=(e,t,n,r,o)=>{let i=Ps(t,e,n);if(a(i))return i;if(!i.value.needsRebalance)return c("Resolved rank",i.value.rank);let d=Gn(e,r);if(a(d))return d;let l=Ne(d.value,o);if(a(l))return l;let u=Ps(t,e,n);return a(u)?u:u.value.needsRebalance?s("Rank rebalance failed to create space"):c("Resolved rank after rebalance",u.value.rank)},Et=(e,t,n)=>{let r=Ts(e);if(a(r))return r;if(!r.value.needsRebalance)return c("Resolved rank",r.value.rank);let o=Gn(e,t);if(a(o))return o;let i=Ne(o.value,n);if(a(i))return i;let d=Ts(e);return a(d)?d:d.value.needsRebalance?s("Rank rebalance failed to create space"):c("Resolved rank after rebalance",d.value.rank)};var Ls=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),Fs=()=>{let{currentNode:e,selectedIndex:t,selectedNode:n}=v();return{currentNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},gl=e=>{let t=v().nodes[e];return!!t&&!t.isDeleted&&Ue(t)&&t.childRenderAxis==="vertical"},Wn=(e,t)=>{let{nodes:n}=v(),r=n[e];if(!r||r.isDeleted)return!1;let o=_(r.id);return U.navigate({currentNode:r,selectedIndex:Ls(t,o.length)}),!0},Ds=e=>{let{nodes:t}=v(),n=t[e];if(!n||n.isDeleted)return!1;let r=n.parentNodeId;if(!r)return Wn(n.id,0);let o=t[r];if(!o||o.isDeleted)return!1;let d=j(o.id).findIndex(l=>l.id===n.id);return d>=0?(U.navigate({currentNode:o,selectedIndex:d}),!0):Ds(o.id)},ks=e=>{let{nodes:t}=v(),n=e,r=new Set;for(;n&&!r.has(n);){if(r.add(n),Ds(n))return!0;n=t[n]?.parentNodeId}return!1},fl=e=>{if(!e)return!1;let t=v().nodes[e];return!!t&&!t.isDeleted},Os=e=>{let{nodes:t,rootNodeId:n}=v();if(gl(e.currentNodeId)&&Wn(e.currentNodeId,e.selectedIndex))return c("Restored navigation inside text container",null);if(fl(e.selectedNodeId)&&e.selectedNodeId&&ks(e.selectedNodeId))return c("Restored navigation to selected node or ancestor",null);if(Wn(e.currentNodeId,e.selectedIndex))return c("Restored navigation to previous container",null);if(e.parentNodeId&&Wn(e.parentNodeId,e.selectedIndex))return c("Restored navigation to previous parent",null);if(ks(e.currentNodeId))return c("Restored navigation to previous container or ancestor",null);let r=t[n];if(!r||r.isDeleted)return s("Unable to restore navigation");let o=_(r.id);return U.navigate({currentNode:r,selectedIndex:Ls(e.selectedIndex,o.length)}),c("Restored navigation to root",null)};var $r=({status:e,msg:t})=>{mt()&&x({syncStatus:{status:e,msg:t}})},Wr=(e="Syncing...")=>{$r({status:"syncing",msg:e})},jr=(e="Synced")=>{$r({status:"synced",msg:e})},vl=e=>{$r({status:"failed",msg:e})},V=e=>(vl(e),s(e));var P=(e,t)=>(a(t)&&logger.info(`[${e}]:failed`,t.message),t);import{decodeTime as yl}from"ulid";var Gt=e=>{let t=[];for(let n of e.split(`
60
+ `)){let r=n.trim();if(r)try{t.push(JSON.parse(r))}catch{return s("Failed to parse persisted events")}}return c("Parsed persisted events",t)},Hr=e=>{let[t,n]=e.id;return`${t}:${n??""}`},Us=e=>{try{return yl(e.id[0])}catch{return 0}},qr=(e,t)=>{let n=new Map;for(let r of[...e,...t])n.set(Hr(r),r);return[...n.values()].sort((r,o)=>{let i=Us(r)-Us(o);return i!==0?i:Hr(r).localeCompare(Hr(o))})},zr=e=>e.length===0?"":e.map(t=>JSON.stringify(t)).join(`
55
61
  `)+`
56
- `,rc=(e,t)=>{let n=new Map;for(let r of[...t,...e])n.set(Nr(r),r);return[...n.values()].sort((r,o)=>{let i=Hi(r)-Hi(o);return i!==0?i:Nr(r).localeCompare(Nr(o))})},Ir=({sourceFile:e,targetFile:t})=>{let n=Ht(e);if(a(n))return s(n.message);let r=Ht(t);if(a(r))return s(r.message);let o=rc(r.value,n.value),i=nc(o);return(Nn.existsSync(t)?Nn.readFileSync(t,"utf8"):"")===i?c("Event file already merged",!1):(Nn.mkdirSync(hr.dirname(t),{recursive:!0}),Nn.writeFileSync(t,i,"utf8"),c("Merged event file",!0))},hn=({repoRoot:e,stateBranchRoot:t})=>{let n=Ri(t);if(a(n))return s(n.message);let r=Ge(t),o=Ge(e),i=!1;for(let d of n.value){let l=hr.join(r,d),u=hr.join(o,d),m=Ir({sourceFile:l,targetFile:u});if(a(m))return s(m.message);i=i||m.value}return c("Hydrated event files from state branch",i)};import{monotonicFactory as oc,ulid as Ae}from"ulid";var Tt=oc();function ic(){let e=Object.values(f().nodes).find(r=>r.context==="WORKSPACE");if(!e)throw new Error("No workspace found in event log");let[t]=S(e.id),[n]=t?S(t.id):[];if(logger.debug("Boot navigation target:",{workspace:e?.id,firstBoard:t?.id,firstSwimlane:n?.id}),n){let r=f().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:f().nodes[f().rootNodeId],selectedIndex:0}}function sc(){let e=ic();L.navigate(e)}function Ki({userId:e,userName:t}){let n=Tt(),r=Tt(),o=Tt(),i=Tt(),d=Tt(),l=z(void 0,void 0);if(a(l))return l;let u=z(void 0,void 0);if(a(u))return u;let m=z(u.value,void 0);if(a(m))return m;let p=z(void 0,void 0);if(a(p))return p;let x=z(p.value,void 0);if(a(x))return x;let h=z(x.value,void 0);if(a(h))return h;let C=z(void 0,void 0);return a(C)?C:c("Created default events",[{id:Ae(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:l.value}},{id:Ae(),userId:e,userName:t,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:u.value}},{id:Ae(),userId:e,userName:t,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:p.value}},{id:Ae(),userId:e,userName:t,action:"add.swimlane",payload:{id:i,name:"In progress",parent:r,rank:x.value}},{id:Ae(),userId:e,userName:t,action:"add.swimlane",payload:{id:d,name:"Done",parent:r,rank:h.value}},{id:Ae(),userId:e,userName:t,action:"add.board",payload:{id:jt,name:"Closed",parent:n,rank:m.value}},{id:Ae(),userId:e,userName:t,action:"add.swimlane",payload:{id:te,name:"Closed",parent:jt,rank:C.value}},{id:Ae(),userId:e,userName:t,action:"lock.node",payload:{id:jt}},{id:Ae(),userId:e,userName:t,action:"lock.node",payload:{id:te}}])}function In({hasProject:e,eventLog:t}){if(!e){let o=J.workspace("temporary-uninitialized-workspace","Workspace","a0"),i=vt(o);return a(i)?i:(I({hasProject:!1,mode:g.DEFAULT}),c("Booted uninitialized workspace placeholder",null))}if(!t.some(o=>o.action==="init.workspace"))return s("Initialized Epiq project has no workspace init event");let r=ft(t).filter(a);return r.length>0?s(`Materializing failed:
57
- ${r.map(o=>o.message).join(`
58
- `)}`):(sc(),I({hasProject:!0}),c("State booted successfully",null))}var dc=async e=>{let t=await D({cwd:e,args:["status","--porcelain"]});return a(t)?t:c("Checked git diff",t.value.stdout.trim().length>0)},j=(e,t)=>s(`[${e}] ${t}`),Vi=async()=>{let e=Yr(),t=await pn(process.cwd());if(a(t))return j(1,t.message);let n=t.value,r=await Rt(n);if(a(r))return j(2,r.message);if(r.value)return j(2,"Cannot initialize Epiq while a git operation is in progress");let o=await dc(n);if(a(o))return j(2.5,o.message);if(o.value)return j(3,"Cannot initialize Epiq with uncommitted changes. Commit or stash your changes first.");if(Ln(n))return j(4,"Epiq project already initialized");let i=$t();if(!i.isSetupDone||!i.userName)return j(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let d=W(),l=d.userName,u=d.userId;if(!u||!l)return j(5,"Missing Epiq user id");let m=e.stateBranch,p=await fn({repoRoot:n,branch:m});if(a(p))return j(6,p.message);let x=await yn({repoRoot:n,stateBranchName:e.stateBranch});if(a(x))return j(6,x.message);let h=mn();if(a(h))return j(7,h.message);let C=qi.join(un(),e.projectId),R=await xr({repoRoot:n,stateBranchRoot:C,stateBranchName:e.stateBranch});if(a(R))return j(8,R.message);let b=qi.join(C,".epiq");ac.mkdirSync(b,{recursive:!0});let E=Ki({userId:u,userName:l});if(a(E))return j(9,E.message);for(let Tn of E.value){let Lr=qt({event:Tn,rootDir:C});if(a(Lr))return j(9,Lr.message)}let A=await xn({stateBranchRoot:C,eventFileName:je({userId:u,userName:l})});if(a(A))return j(10,A.message);let H=await it({cwd:C,message:"[epiq:init]"});if(a(H))return j(10,H.message);let we=await hi(n);if(a(we))return j(12,we.message);let ie=Jr({repoRoot:n,fileContents:e});if(a(ie))return j(13,ie.message);let Tr=await K.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(a(Tr))return j(14,Tr.message);let Mr=await K.commit({cwd:n,message:"[epiq:init-project]"});if(a(Mr))return j(14,Mr.message);let kr=hn({repoRoot:n,stateBranchRoot:C});if(a(kr))return j(15,kr.message);let wn="Project initialized!",Pr=await D({cwd:n,args:["push","-u","origin","HEAD"]});a(Pr)&&(wn+=` Warn: [init:16] ${Pr.message}`);let Fr=await wt({repoRoot:n,stateBranchRoot:C});a(Fr)&&(wn+=` Warn: [init:17] ${Fr.message}`);let Dr=Pe(E.value).filter(a);if(Dr.length>0)return j(18,Dr.map(Tn=>Tn.message).join(`
59
- `));let{rootNodeId:Ps,nodes:Fs}=f();return L.navigate({currentNode:Fs[Ps],selectedIndex:0}),I({hasProject:!0,mode:g.DEFAULT}),c(wn,null)};import{ulid as lc}from"ulid";import{ulid as cc}from"ulid";var zi=null,Ue=()=>structuredClone(zi),Mt=e=>zi=e,Gi=()=>{let{currentNode:e,selectedIndex:t}=f(),r=S(e.id)[t];return r?c("Resolved selected child",r):s("Target node not found")};var Yi=({id:e,parentId:t,position:n={at:"end"}})=>{let r=V();if(a(r))return s("Unable to resolve user ID");let o=ye(t,e,n,r.value);return a(o)?o:c("Created pending move state",{id:cc(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value}})},Xi=e=>{Mt(e);let t=gt(e,!0);return a(t)?t:c("Node moved successfully",t.value)};function Er(e){let t=Gi();if(a(t))return t;let{currentNode:n,nodes:r}=f();if(!n.parentNodeId)return s("Missing parent node id");let o=r[n.parentNodeId];if(!o)return s("Missing parent node");let i=_(o.id),d=i.findIndex(({id:m})=>m===n.id);if(d<0)return s("Current node not found among siblings");let l=i[d+e];if(!l)return s("Missing sibling node");let u=Yi({id:t.value.id,parentId:l.id,position:{at:"end"}});return a(u)?u:Xi(u.value)}function Cr(e){let t=Gi();if(a(t))return t;let{currentNode:n,selectedIndex:r}=f(),i=_(n.id)[r+e];if(!i)return s("Missing sibling node");let d=Yi({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:i.id}});return a(d)?d:Xi(d.value)}var Ji=()=>{let e=V();if(a(e))return s("Unable to resolve user ID");let{modifier:t}=ee().commandMeta,n=()=>{let l=Ue();if(!l)return s("No pending move state");let u=l.payload.id;if(!f().nodes[u])return s("Moved node not found");let p=l.payload.parent,x=f().nodes[p];if(!x)return s("Move parent not found");let h=S(p).findIndex(C=>C.id===u);return h===-1?s("Moved node not found among rendered children"):(L.navigate({currentNode:x,selectedIndex:h}),c("Synchronized navigation to moved node",null))},r=l=>{if(a(l))return s(l.message);let u=n();return a(u)?s(u.message):c("Updated move preview",null)},{currentNode:o,selectedIndex:i}=f(),d=S(o.id)[i];if(!d)return I({mode:g.DEFAULT}),s("No move target");if(t==="start"){if(d.readonly)return s("Target node is read-only");if(i===-1)return s("No item selected");if(!d.parentNodeId)return s("Target has no parent");let l=_(d.parentNodeId),u=l.findIndex(({id:R})=>R===d.id);if(u===-1)return s("Target not found among siblings");let m=l[u-1],p=l[u+1],x=p!=null?{at:"before",sibling:p.id}:m!=null?{at:"after",sibling:m.id}:{at:"start"},h=ye(d.parentNodeId,d.id,x,e.value);if(a(h))return h;Mt({id:lc(),action:"move.node",payload:{id:d.id,parent:d.parentNodeId,rank:h.value},...e.value}),I({mode:g.MOVE});let C=n();return a(C)?s(C.message):c("Move initialized",null)}if(t==="next")return I({mode:g.MOVE}),r(Cr(1));if(t==="previous")return I({mode:g.MOVE}),r(Cr(-1));if(t==="to-next")return I({mode:g.MOVE}),r(Er(1));if(t==="to-previous")return I({mode:g.MOVE}),r(Er(-1));if(t==="confirm"){I({mode:g.DEFAULT});let l=Ue();if(!l)return s("No pending move to confirm");let u=$(l);if(a(u))return u;let m=n();return a(m)?s(m.message):(Mt(null),c("Moved item",null))}return t==="cancel"?(Mt(null),I({mode:g.DEFAULT}),c("Cancelling move",null)):s("Invalid move modifier")};import uc from"zod";var Zi=()=>{let e=ee().commandMeta.inputString,t=uc.coerce.number().int().min(3e3).safeParse(e);if(!t.success)return s("Auto sync duration must be a number of at least 3000 ms");let n=ze({autoSyncDebounceMs:t.data});return a(n)?n:(ge({autoSyncIntervalMs:t.data}),I({mode:g.DEFAULT}),c(`Auto sync interval set to ${t.data}ms`,null))};var Qi=()=>{let e=ee().commandMeta.inputString.trim();if(e!=="yes"&&e!=="no")return s("Invalid response");let t=eo(e),n=ze({autoSync:t});return a(n)?n:(ge({autoSync:t}),I({mode:g.DEFAULT}),c(`Auto sync set to "${e}"`,null))};var es=async()=>{if(f().syncStatus.status==="syncing")return s("Sync already in progress");U(()=>""),I({syncStatus:{msg:"Syncing",status:"syncing"}});let e=await Lt();return a(e)?(I({syncStatus:{msg:e.message,status:"outOfSync"}}),e):(I({mode:g.DEFAULT}),e)};var ts=e=>Object.values(f().tags).find(t=>t.name===e),ns=e=>Object.values(f().contributors).find(t=>t.name===e),rs=[{systemOnly:!0,intent:w.Move,mode:g.COMMAND_LINE,action:Ji},{intent:w.Delete,mode:g.COMMAND_LINE,action:()=>{let e=V();if(a(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=f(),r=S(t.id)[n];return r?$({id:q(),action:"delete.node",payload:{id:r.id},...e.value}):s("Unable to resolve child to delete")},onSuccess:()=>I({mode:g.DEFAULT})},{intent:w.Filter,mode:g.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=ee().commandMeta,n=/(!=|=)/,[r,o]=e.split(n);if(!r||!(l=>Q(v.FILTER).map(u=>u.split(n)[0]).includes(l))(r))return s("Invalid filter modifier");let d={target:r,operator:"=",value:t.trim()};return ce(l=>({...l,filters:e==="clear"?[]:[...l.filters,d],mode:g.DEFAULT})),c("Viewing help",null)}},{intent:w.ViewHelp,mode:g.COMMAND_LINE,action:()=>(I({mode:g.HELP}),c("Viewing help",null))},{intent:w.CloseIssue,mode:g.COMMAND_LINE,action:()=>{let e=V();if(a(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=f(),r=S(t.id)[n];if(!r)return s("Unable to close issue, no target found");if(!ne(r))return s("Cannot close in this context");let o=f().nodes[te];if(!o)return s("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return s("Issue is already closed");let i=ye(o.id,r.id,{at:"end"},e.value);if(a(i))return i;let d=$({id:q(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:i.value},...e.value});return a(d)?d:c("Issue closed",null)},onSuccess:()=>I({mode:g.DEFAULT})},{intent:w.ReopenIssue,mode:g.COMMAND_LINE,action:()=>{let e=V();if(a(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=f(),r=S(t.id)[n];if(!r)return s("Unable to reopen issue, no target found");let o=r.context==="TICKET"?c("Resolved ticket",r):Qe(r.id,"TICKET");if(a(o))return s("Cannot reopen in this context");let i=o.value,d=f().nodes[te];if(!d)return s("Unable to locate closed swimlane");if(i.parentNodeId!==d.id)return s("Issue is not closed");if(!ne(i))return s("Target node is not issue");let l=mi(i);if(!l)return s("Unable to resolve previous parent from issue history");if(l===d.id)return s("Previous parent resolves to closed swimlane");let u=f().nodes[l];if(!u)return s("Previous parent no longer exists");let m=ye(u.id,i.id,{at:"end"},e.value);if(a(m))return m;let p=$({id:q(),action:"reopen.issue",payload:{id:i.id,parent:u.id,rank:m.value},...e.value});return a(p)?p:c("Issue reopened",null)},onSuccess:()=>I({mode:g.DEFAULT})},{intent:w.Init,mode:g.COMMAND_LINE,action:Vi},{intent:w.NewItem,mode:g.COMMAND_LINE,action:(e,t)=>{let n=V();if(a(n))return s("Unable to resolve user ID");if(!t.inputString)return s(`provide a name for your ${t.modifier}`);let{breadCrumb:r,currentNode:o,selectedIndex:i}=f(),d=l=>{let u=$(l);if(a(u))return u;let m=N.getNode(u.value.result.id);if(!m)return s("Created node not found");if(!m.parentNodeId)return u;let p=N.getNode(m.parentNodeId);return p?(L.navigate({currentNode:p,selectedIndex:N.getSiblings(m.parentNodeId).findIndex(({id:x})=>x===m.id)}),u):s("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:l}=f(),u=N.getNode(l);if(!u)return s("Workspace not found");let m=Fe(u.id,n.value);return a(m)?m:d({id:q(),action:"add.board",payload:{id:q(),name:t.inputString,parent:u.id,rank:m.value},...n.value})}if(t.modifier==="swimlane"){let l=Le(r,"BOARD");if(a(l))return s("Unable to add swimlane in this context");let u=Fe(l.value.id,n.value);return a(u)?u:d({id:q(),action:"add.swimlane",payload:{id:q(),name:t.inputString,parent:l.value.id,rank:u.value},...n.value})}if(t.modifier==="issue"){let l=S(o.id)[i],u=o.context==="SWIMLANE"?o:o.context==="BOARD"&&l?.context==="SWIMLANE"?l:(()=>{let E=Le(r,"SWIMLANE");return a(E)?null:E.value})();if(!u)return s("Unable to add issue in this context");let m=Fe(u.id,n.value);if(a(m))return m;let p=ln({name:t.inputString,parent:u.id,rank:m.value,user:n.value});if(a(p))return p;let x=p.value,h=Pe(x);if(h.some(E=>a(E)))return s("Issue create failed: "+h.filter(a).map(E=>E.message).filter(Boolean).join(", "));let C=h[0];if(!C||a(C))return s("Issue creation failed");let b=x.find(E=>E.action==="add.issue")?.payload.id;return b?(L.navigate({currentNode:u,selectedIndex:N.getSiblings(u.id).findIndex(({id:E})=>E===b)}),c("Issue created",null)):s("Unable to determine ticket id")}return c("Success",null)},onSuccess:()=>I({mode:g.DEFAULT})},{intent:w.Rename,mode:g.COMMAND_LINE,action:()=>{let e=V();if(a(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=f(),r=S(t.id)[n];if(!r)return s("Missing node");if(r.readonly)return s("Cannot rename readonly node");let o=Uo();return o?$({id:q(),action:"edit.title",payload:{id:r.id,name:o},...e.value}):s("Provide a new name")},onSuccess:()=>I({mode:g.DEFAULT})},{intent:w.UntagTicket,mode:g.COMMAND_LINE,action:()=>{let e=V();if(a(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=ee().commandMeta,r=(t||n).trim();if(!r)return s("Provide a tag");let o=ts(r);if(!o)return s(`Tag "${r}" does not exist`);let{selectedNode:i}=f();if(!i)return s("Invalid untag target");let d=Qe(i.id,"TICKET");if(a(d))return s("Unable to untag issue in this context");let l=d.value,u=N.getFieldByTitle(l.id,"Tags");if(!u)return s("Unable to locate tags field");let m=S(u.id).find(p=>p.props?.value===o.id);return m?$({id:q(),action:"untag.issue",payload:{id:m.id,target:l.id,tagId:o.id},...e.value}):s("Issue is not tagged with that tag")},onSuccess:()=>I({mode:g.DEFAULT})},{intent:w.TagTicket,mode:g.COMMAND_LINE,action:()=>{let e=V();if(a(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=ee().commandMeta,r=(t||n).trim();if(!r)return s("Provide a tag");let{selectedIndex:o,currentNode:i}=f(),d=S(i.id)[o];if(!d)return s("Invalid tag target");let l=Qe(d.id,"TICKET");if(a(l))return s("Unable to tag issue in this context");let u=l.value,m=ts(r),p;if(m)p=m.id;else{let R=q(),b=$({id:q(),action:"create.tag",payload:{id:R,name:r},userId:e.value.userId,userName:e.value.userName});if(a(b))return b;p=b.value.result.id}let x=N.getFieldByTitle(u.id,"Tags");if(!x)return s("Unable to locate tags field");if(S(x.id).some(R=>R.props?.value===p))return s("Already tagged with that tag");let C=Fe(x.id,e.value);return a(C)?C:$({id:q(),action:"tag.issue",payload:{id:q(),target:u.id,tagId:p,rank:C.value},...e.value})},onSuccess:()=>I({mode:g.DEFAULT})},{intent:w.AssignUserToTicket,mode:g.COMMAND_LINE,action:()=>{let e=V();if(a(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=ee().commandMeta,r=(t||n).trim();if(!r)return s("Provide an assignee");let{selectedIndex:o,currentNode:i}=f(),d=S(i.id)[o];if(!d)return s("Invalid assign target");let l=Qe(d.id,"TICKET");if(a(l))return s("Unable to assign issue in this context");let u=l.value,m=ns(r),p;if(m)p=m.id;else{let R=q(),b=$({id:q(),action:"create.contributor",payload:{id:R,name:r},userId:e.value.userId,userName:e.value.userName});if(a(b))return b;p=b.value.result.id}let x=N.getFieldByTitle(u.id,"Assignees");if(!x)return s("Unable to locate assignees field");if(S(x.id).some(R=>R.props?.value===p))return s("Assignee already assigned");let C=Fe(x.id,e.value);return a(C)?C:$({id:q(),action:"assign.issue",payload:{id:q(),target:u.id,contributor:p,rank:C.value},...e.value})},onSuccess:()=>I({mode:g.DEFAULT})},{intent:w.UnassignUserFromTicket,mode:g.COMMAND_LINE,action:()=>{let e=V();if(a(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=ee().commandMeta,r=(t||n).trim();if(!r)return s("Provide an assignee to remove");let o=ns(r);if(!o)return s(`Assignee "${r}" does not exist`);let{selectedNode:i}=f();if(!i)return s("Invalid unassign target");let d=Qe(i.id,"TICKET");if(a(d))return s("Unable to unassign in this context");let l=d.value,u=N.getFieldByTitle(l.id,"Assignees");if(!u)return s("Unable to locate assignees field");let m=S(u.id).find(p=>p.props?.value===o.id);return m?$({id:q(),action:"unassign.issue",payload:{id:m.id,target:l.id,contributor:o.id},...e.value}):s(`Issue is not assigned to "${r}"`)},onSuccess:()=>I({mode:g.DEFAULT})},{intent:w.Sync,mode:g.COMMAND_LINE,action:es},{intent:w.Peek,mode:g.COMMAND_LINE,action:async()=>{let e=Le(f().breadCrumb,"BOARD");if(a(e))return e;let t=fe(process.cwd());if(a(t))throw new Error(t.message);let n=Ze(t.value);if(a(n))return s(n.message);let r=n.value,{modifier:o}=ee().commandMeta,i;if(o==="now"){let h=Sr();if(a(h))return h;let C=ft(r);return C.some(a)?s(C.map(R=>R.message).join(", ")):(I({mode:g.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),c("Peeking now",!0))}if(o==="prev"){let h=f().eventLog.at(-2),C=Vn(h);if(C===null)return s("No previous event to peek");i=C}else if(o==="next"){let h=f().unappliedEvents.at(0),C=Vn(h);if(C===null)return s("No next event to peek");i=C}else{let h=Gt(o);if(!h)return s("Invalid peek date");i=h.getTime()}let d=e.value.id,{appliedEvents:l,unappliedEvents:u}=so(r,i),m=Sr();if(a(m))return m;let p=ft(l);if(p.some(a))return s(p.map(h=>h.message).join(", "));let x=f().nodes[d];return x?(L.navigate({currentNode:x,selectedIndex:0}),I({mode:g.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:u}),c("Peeking ",!0)):s("Board did not exist at peek date")}},{intent:w.Export,mode:g.COMMAND_LINE,action:async()=>{let e=await ni();return a(e)?e:(I({mode:g.DEFAULT}),c("Export successful",!0))}},{intent:w.Exit,mode:g.COMMAND_LINE,action:async()=>(L.exit(),c("Exit successful",!0))},{intent:w.Edit,mode:g.COMMAND_LINE,action:(e,t)=>{if(t.modifier===De.DESCRIPTION)return vi();if(t.modifier===De.TITLE){let n=V();if(a(n))return s("Unable to resolve user ID");let{currentNode:r,selectedIndex:o}=f(),i=S(r.id)[o];if(!i)return s("Missing node");if(i.readonly)return s("Cannot rename readonly node");let d=t.inputString.trim();return d?$({id:q(),action:"edit.title",payload:{id:i.id,name:d},...n.value}):s("Provide a new name")}return s("Unknown edit command")},onSuccess:()=>I({mode:g.DEFAULT})},{intent:w.Config,mode:g.COMMAND_LINE,action:(e,t)=>{let n=t.inputString.trim();switch(t.modifier){case Y.USERNAME:{let{userId:r,preferredEditor:o,userName:i}=W(),d=n||i,l=r??q();if(!d||!l)return s("Unable to resolve user name or id");let u=ze({userName:d,userId:l,preferredEditor:o??""});return a(u)?u:(ge({userName:d,userId:l}),I({mode:g.DEFAULT}),c(`Username set to "${d}"`,null))}case Y.EDITOR:{if(!n)return s("No editor provided");let r=ze({preferredEditor:n});return a(r)?r:(ge({preferredEditor:n}),I({mode:g.DEFAULT}),c(`Editor configuration set to "${n}"`,null))}case Y.VIEW:return n!=="wide"&&n!=="dense"?s("Invalid view mode"):(ge({viewMode:n}),c(`View set to "${n}"`,null));case Y.AUTOSYNC:return Qi();case Y.SYNC_DEBOUNCE_MS:return Zi();default:return s("Unknown config command")}}}];var mc=new Set(["peek","filter","view-help"]),me=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=ee();if(!t)return s("No command to confirm");if(!e&&n===He.Invalid)return s("Invalid command");let i=Bo(t);Fo();let{readOnly:d}=f();if(d&&!mc.has(i))return ht({status:Te.Fail,message:"Command not available in readonly state",value:null});let l=rs.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===i);if(!l)return ht({status:Te.Fail,message:"Command not found",value:null});let u;try{u=await l.action(l,{command:t,inputString:o,modifier:r})}catch(m){return ht({status:Te.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return a(u)?ht(u):(Do({addToHistory:!e}),l.onSuccess?.(),W().autoSync&&Vr(),u)};var En=[{intent:T.Exit,mode:g.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(I({mode:g.COMMAND_LINE}),U(()=>"move cancel"),me({isForceExecutedBySystem:!0}))},{intent:T.InitMove,mode:g.DEFAULT,description:"[m] move init/confirm",action:()=>(I({mode:g.COMMAND_LINE}),U(()=>"move start"),me({isForceExecutedBySystem:!0}))},{intent:T.ConfirmMove,mode:g.MOVE,action:()=>(I({mode:g.COMMAND_LINE}),U(()=>"move confirm"),me({isForceExecutedBySystem:!0}))}],Cn=[{intent:T.MovePreviousItem,mode:g.MOVE,action:()=>Ue()?(I({mode:g.COMMAND_LINE}),U(()=>"move previous"),me({isForceExecutedBySystem:!0})):s("No pending move")},{intent:T.MoveNextItem,mode:g.MOVE,action:()=>Ue()?(I({mode:g.COMMAND_LINE}),U(()=>"move next"),me({isForceExecutedBySystem:!0})):s("No pending move")}],os=[{intent:T.MoveToNextContainer,mode:g.MOVE,action:()=>Ue()?(I({mode:g.COMMAND_LINE}),U(()=>"move to-next"),me({isForceExecutedBySystem:!0})):s("No pending move")},{intent:T.MoveToPreviousContainer,mode:g.MOVE,action:()=>Ue()?(I({mode:g.COMMAND_LINE}),U(()=>"move to-previous"),me({isForceExecutedBySystem:!0})):s("No pending move")}];var is={[k.WORKSPACE]:[...En,...Cn],[k.BOARD]:[...En,...Cn],[k.SWIMLANE]:[...En,...Cn,...os],[k.TICKET]:[],[k.FIELD]:[],[k.FIELD_LIST]:[],[k.TEXT]:[]};var ss=[{intent:T.AddItem,mode:g.DEFAULT,description:"[n] new...",action:()=>(I({mode:g.COMMAND_LINE}),U(()=>`${v.NEW} `),c("Adding new item",null))},{intent:T.Delete,mode:g.DEFAULT,description:"[d] delete",action:()=>(I({mode:g.COMMAND_LINE}),U(()=>`${v.DELETE} `),c("Deleting item",null))},{intent:T.InitCommandLine,mode:g.DEFAULT,description:"[:] focus command line",action:()=>(I({mode:g.COMMAND_LINE}),U(()=>""),c("Entering command line mode",null))},{intent:T.Confirm,mode:g.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,currentNode:t}=f();if(!_(e?.id??"")?.length){if(e?.title===G.DESCRIPTION)return U(()=>v.EDIT+"description "),I({mode:g.COMMAND_LINE}),c("Propose command",!0);if(e?.title===G.ASSIGNEES)return U(()=>v.ASSIGN+" "),I({mode:g.COMMAND_LINE}),c("Propose command",!0);if(e?.title===G.TAGS)return U(()=>v.TAG+" "),I({mode:g.COMMAND_LINE}),c("Propose command",!0);if(t.title===G.DESCRIPTION&&e?.context==="TEXT")return U(()=>v.EDIT+"description "),I({mode:g.COMMAND_LINE}),c("Propose command",!0)}return L.enterChildNode(),c("Entering context",null)}},{intent:T.Exit,mode:g.DEFAULT,description:"[q] exit context",action:()=>(L.enterParentNode(),c("Exiting context",null))},{intent:T.NavPreviousItem,mode:g.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(L.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:T.NavNextItem,mode:g.DEFAULT,action:()=>(L.navigateToNextItem(),c("Navigating to next item",null))},{intent:T.NavToPreviousContainer,mode:g.DEFAULT,action:()=>(L.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:T.NavToNextContainer,mode:g.DEFAULT,action:()=>(L.navigateToNextContainer(),c("Navigating to next container",null))},{intent:T.Edit,mode:g.DEFAULT,action:()=>(I({mode:g.COMMAND_LINE}),U(()=>"edit"),me(),c("Fired command",!0))},{intent:T.SetViewDense,mode:g.DEFAULT,description:"[v] view change (wide/dense)",action:()=>(ge({viewMode:"dense"}),c("View set",null))},{intent:T.SetViewWide,mode:g.DEFAULT,action:()=>(ge({viewMode:"wide"}),c("View set",null))}];var pc=500,gc=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),as=e=>{let t=gc(e);t&&U(n=>(n+t).slice(0,pc))};var ds=[{intent:T.ViewHelp,mode:g.DEFAULT,action:()=>(I({mode:g.HELP}),c("Viewing help",null))},{intent:T.Exit,mode:g.HELP,action:()=>(I({mode:g.DEFAULT}),c("Exiting help",null))},{intent:T.Confirm,mode:g.COMMAND_LINE,action:()=>(me(),c("Executing command",null))},{intent:T.MoveCursorLeft,mode:g.COMMAND_LINE,action:()=>(Qn(-1),c("Moving cursor left",null))},{intent:T.MoveCursorRight,mode:g.COMMAND_LINE,action:()=>(Qn(1),c("Moving cursor right",null))},{intent:T.MoveCursorLeftOfWord,mode:g.COMMAND_LINE,action:()=>(er("left"),c("Moving cursor left of word",null))},{intent:T.MoveCursorRightOfWord,mode:g.COMMAND_LINE,action:()=>(er("right"),c("Moving cursor right of word",null))},{intent:T.ExitCommandLine,mode:g.COMMAND_LINE,action:()=>(I({mode:g.DEFAULT}),c("Exiting command line",null))},{intent:T.AutoCompleteCommand,mode:g.COMMAND_LINE,action:()=>(U((e,{remainder:t})=>t?e+t:e),c("Auto-completing command",null))},{intent:T.CaptureInput,mode:g.COMMAND_LINE,action:(e,{sequence:t})=>(as(t??""),c("Capturing input",null))},{intent:T.EraseInput,mode:g.COMMAND_LINE,action:()=>(ko(),c("Erasing input",null))},{intent:T.EraseInputWord,mode:g.COMMAND_LINE,action:()=>(Po(),c("Erasing input word",null))},{intent:T.GetLastCommandFromHistory,mode:g.COMMAND_LINE,action:()=>(Lo(),c("Getting last command from history",null))},{intent:T.GetNextCommandFromHistory,mode:g.COMMAND_LINE,action:()=>(Oo(),c("Getting next command from history",null))}];import fc from"chalk";var Sn=": for command line",cs="q to exit",ls=`${fc.hex(M.accent)("m")} to confirm`,br={[k.WORKSPACE]:[Sn],[k.BOARD]:[Sn],[k.BOARD+g.COMMAND_LINE]:[Sn],[k.SWIMLANE]:[Sn],[k.TICKET+g.HELP]:[cs],[k.SWIMLANE+g.HELP]:[cs],[k.TICKET]:[],[k.FIELD]:[],[k.SWIMLANE+g.MOVE]:[ls],[k.TICKET+g.MOVE]:[ls]};var bn=e=>e.trim().toLocaleLowerCase(),vc=(e,t)=>{let n=N.getFieldByTitle(e,t);if(!n)return"";let r=n.props?.value;return typeof r=="string"?r:""},yc=e=>{let{tags:t}=f(),n=N.getFieldByTitle(e,"Tags");return n?_(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},xc=e=>{let{contributors:t}=f(),n=N.getFieldByTitle(e,"Assignees");return n?_(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},us=(e,t)=>{let n=t.value;if(!n)return!0;switch(t.target){case"title":return bn(e.title??"").includes(n);case"description":return bn(vc(e.id,G.DESCRIPTION)).includes(n);case"tag":return yc(e.id).map(bn).some(l=>l.includes(n));case"assignee":return xc(e.id).map(bn).some(l=>l.includes(n));default:return!0}};function ms(e,t,n){let r=t[e];if(!r)return s("buildBreadCrumb(): current node not found");let o=[],i=r;for(;i&&(o.push(i),!(i.id===n||!i.parentNodeId));)i=t[i.parentNodeId];let d=o[o.length-1];return!d||d.id!==n?s("buildBreadCrumb(): node is not connected to root"):(o.reverse(),c("Breadcrumb built",o))}var ps=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 Rn,Rr,Ar=new Set,gs=()=>{for(let e of Ar)e()},hc=e=>(Ar.add(e),()=>Ar.delete(e));function fs(e){let{currentNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:i}=e;if(!t)return s("derive(): currentNodeId is missing");if(!r)return s("derive(): rootNode is missing");if(!o[r])return s("derive(): unable to find root node");let l=o[t];if(!l)return s("Unable to derive state, currentNode not found");let u=ms(t,o,r);if(a(u))return logger.error(u.message),u;let m=u.value,{context:p}=l,x=br[p+n]??br[p]??[],h=[...ss,...is[p]??[],...ds],C=ps(h),R=Ic(o,i),b=R[t]?.[e.selectedIndex]??null;return c("Derived successfully",{...e,currentNode:l,breadCrumb:m,availableHints:x,availableActions:h,actionIndex:C,selectedNode:b,renderedChildrenIndex:R})}var f=()=>(Rn||logger.error("State not initialized. Call initWorkspaceState() first.",new Error().stack),Rn);function vt(e){Rr=e;let t=Me(process.cwd()),n=!1;if(!a(t)){let i=ke(t.value);if(a(i))return s(i.message);n=!0}let r={readOnly:!1,filters:[],tags:{},contributors:{},mode:g.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,currentNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""},eventLog:[],unappliedEvents:[],timeMode:"live",hasProject:n},o=fs(r);return a(o)?o:(Rn=o.value,gs(),c("State initialized",null))}function ce(e){let t=f(),n=e(t),r=fs(n);return a(r)?s(r.message??"Unable to update state"):(Rn=r.value,gs(),c("State updated",null))}var I=e=>ce(t=>({...t,...e}));var xe=()=>Nc(hc,f,f),Ic=(e,t)=>{let n={};for(let r of Object.values(e))ne(r)&&t.length>0&&!t.every(o=>us(r,o))||!r.parentNodeId||r.isDeleted||((!r.parentNodeId||!n[r.parentNodeId])&&(n[r.parentNodeId]=[]),n[r.parentNodeId].push(r));for(let r of Object.keys(n))n[r].sort((o,i)=>{let d=e[o.id],l=e[i.id];return!d||!l?0:d.rank.localeCompare(l.rank)});return n},S=e=>f()?.renderedChildrenIndex[e]??[],Sr=()=>Rr?vt(Rr):s("Cannot reset state: no initial workspace found");var ys=()=>{let{currentNode:e,selectedIndex:t}=f(),n=S(e.id)[t];return{currentNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:n?.parentNodeId??null,selectedIndex:t}},vs=(e,t)=>Math.max(0,Math.min(e,Math.max(0,t-1))),xs=e=>{let{nodes:t}=f(),n=t[e.currentNodeId];if(n&&!n.isDeleted&&e.selectedNodeId){let i=S(n.id).findIndex(d=>d.id===e.selectedNodeId);if(i>=0)return L.navigate({currentNode:n,selectedIndex:i}),c("Restored navigation",null)}if(e.selectedNodeId){let o=t[e.selectedNodeId];if(o&&!o.isDeleted&&o.parentNodeId){let i=t[o.parentNodeId];if(i&&!i.isDeleted){let d=S(i.id).findIndex(l=>l.id===o.id);if(d>=0)return L.navigate({currentNode:i,selectedIndex:d}),c("Restored navigation to moved node",null)}}}if(n&&!n.isDeleted){let o=S(n.id);return L.navigate({currentNode:n,selectedIndex:vs(e.selectedIndex,o.length)}),c("Restored navigation to previous container",null)}if(e.parentNodeId){let o=t[e.parentNodeId];if(o&&!o.isDeleted){let i=S(o.id);return L.navigate({currentNode:o,selectedIndex:vs(e.selectedIndex,i.length)}),c("Restored navigation to parent",null)}}let r=t[f().rootNodeId];return!r||r.isDeleted?s("Unable to restore navigation"):(L.navigate({currentNode:r,selectedIndex:0}),c("Restored navigation to root",null))};var Ns=(e="Syncing...")=>{I({syncStatus:{status:"syncing",msg:e}})},hs=(e="Synced")=>{I({syncStatus:{status:"synced",msg:e}})},Ec=e=>{I({syncStatus:{status:"outOfSync",msg:e}})},pe=e=>(Ec(e),s(e));var Sc=({repoRoot:e,stateBranchRoot:t,ownEventFileName:n})=>{let r=pr({root:e,fileName:n}),o=pr({root:t,fileName:n});return Cc.existsSync(r)?Ir({sourceFile:r,targetFile:o}):c("Local own event file missing, nothing to merge",!1)},bc=async({cwd:e,ensureUpstream:t})=>{let n=await pn(e);if(a(n))return s(n.message);let r=n.value,o=Si({repoRoot:r});if(a(o))return s(o.message);let i=o.value,d=await Rt(r);if(a(d))return s(d.message);if(d.value)return s("Cannot sync while a git operation is in progress in the current repo");let l=await $i(r);if(a(l))return s(l.message);let u=await Wi({repoRoot:r,stateBranchRoot:i,ensureUpstream:t});if(a(u))return s(u.message);let m=await Rt(i);if(a(m))return s(m.message);if(m.value)return s("Cannot sync while a git operation is in progress in the state branch");let p=Ai(r,i);return a(p)?s(p.message):c("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:i,bootstrapped:u.value})},Is=async({repoRoot:e,stateBranchRoot:t,ownEventFileName:n})=>{let r=Sc({repoRoot:e,stateBranchRoot:t,ownEventFileName:n});if(a(r))return s(r.message);let o=await Ui(t);if(a(o))return s(o.message);if(!r.value&&!o.value)return c("Own event file already up to date in state branch",{createdCommit:!1});let i=await xn({stateBranchRoot:t,eventFileName:n});if(a(i))return s(i.message);let d=await ji({repoRoot:e,stateBranchRoot:t});return a(d)?s(d.message):c("Merged, staged, and committed own event file",{createdCommit:!0,commitSha:d.value})},wr=async({cwd:e=process.cwd(),ownEventFileName:t})=>{if(t.includes("/")||t.includes("\\"))return s("Own event file must be a file name, not a path");if(!t.endsWith(".jsonl"))return s("Own event file must end with .jsonl");Ns("Syncing");let n=await bc({cwd:e,ensureUpstream:!0});if(a(n))return pe(n.message);let{repoRoot:r,stateBranchRoot:o,bootstrapped:i}=n.value,d=await Bi(r);if(a(d))return pe(d.message);if(d.value)return pe("Cannot run :sync while the repository is in detached HEAD state");let l=!1,u,m=!1,p=!1,x=!1,h=st(r);if(a(h))return pe(h.message);let C=h.value,R=await yr({cwd:o,branch:C});if(a(R))return pe(R.message);m=R.value;let b=hn({repoRoot:r,stateBranchRoot:o});if(a(b))return pe(b.message);x=b.value;let E=await Is({repoRoot:r,stateBranchRoot:o,ownEventFileName:t});if(a(E))return pe(E.message);if(l=E.value.createdCommit,u=E.value.commitSha,l||i){let A=await wt({stateBranchRoot:o,repoRoot:r}),H=A;if(a(A)&&Oi(A.message)){let we=await yr({cwd:o,branch:C});if(a(we))return pe(we.message);let ie=await Is({repoRoot:r,stateBranchRoot:o,ownEventFileName:t});if(a(ie))return pe(ie.message);ie.value.createdCommit&&(l=!0,u=ie.value.commitSha),H=await wt({stateBranchRoot:o,repoRoot:r})}if(a(H))return pe(H.message);p=H.value,logger.debug("[sync] pushed to state branch",p)}else logger.debug("[sync] no commit created, skipped push");if(l){let A=await D({args:["rev-parse","HEAD"],cwd:o});if(a(A))return pe(A.message);u=A.value.stdout.trim()}return hs(p?"Synced and pushed":m||x||l?"Synced local state":"Already synced"),c("Synced event logs with state branch",{repoRoot:r,stateBranchRoot:o,createdCommit:l,commitSha:u,pulled:m,pushed:p,hydrated:x,bootstrapped:i})},Lt=async()=>{let e=ys(),t=V();if(a(t)||!t.value)return s("Unable to resolve event log path");let n=je(t.value),r=await wr({ownEventFileName:n});if(a(r))return s(`Unable to sync state. ${r.message}`);let o=Me(process.cwd());if(a(o))return o;let i=Ze(o.value);if(a(i))return s(`Unable to load events. ${i.message}`);let d=In({eventLog:i.value,hasProject:!0});if(a(d))return s(`Unable to boot synced state. ${d.message}`);I({hasProject:!0,syncStatus:{msg:"Synced",status:"synced"}});let l=xs(e);return a(l)?l:c("Synced",!0)};var Ye=e=>{let t=fe(e??process.cwd());if(a(t))return t;let n=Ze(t.value);if(a(n))return s(n.message);let r=In({eventLog:n.value,hasProject:!0});return a(r)?s(r.message):c("Booted Epiq state",{root:t.value})},An=()=>{let e=ui();return a(e)?s(e.message):e.value.userId?e.value.userName?c("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):s("Unable to retrieve user name"):s("Unable to retrieve user id")},Cs=(e,t)=>{let r=S(e.id).find(o=>o.title===t);return r?S(r.id).map(o=>typeof o.props?.value=="string"?o.props.value:"").filter(o=>!!o):[]},Rc=e=>Cs(e,"Tags").map(t=>N.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name})),Ac=e=>Cs(e,"Assignees").map(t=>N.getContributor(t)).filter(Boolean).map(t=>({id:t.id,name:t.name})),Ss=(e={})=>{let t=Ye(e.repoRoot);if(a(t))return t;let n=Object.values(f().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)},bs=(e={})=>{let t=Ye(e.repoRoot);if(a(t))return t;let n=Object.values(f().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 c("Listed swimlanes",n)},Rs=e=>{let t=Ye(e.repoRoot);if(a(t))return t;let n=Object.values(f().nodes).filter(ne).filter(r=>e.includeClosed||r.parentNodeId!==te).map(r=>({id:r.id,title:Xe(r.title),description:fo(r,"Description"),parentId:r.parentNodeId,isClosed:r.parentNodeId===te,readonly:!!r.readonly,tags:Rc(r),assignees:Ac(r)}));return c("Listed issues",n)},As=e=>{let t=Ye(e.repoRoot);if(a(t))return t;let n=An();if(a(n))return n;let r=Fe(e.parentId,n.value);if(a(r))return r;let o=ln({name:e.title,parent:e.parentId,user:n.value,rank:r.value});if(a(o))return o;let i=o.value,l=Pe(i).find(a);if(l)return s(l.message);let u=i.find(m=>m.action==="add.issue")?.payload.id;return u?c("Created issue",{id:u,title:e.title,parentId:e.parentId}):s("Unable to determine created issue id")},ws=e=>{let t=Ye(e.repoRoot);if(a(t))return t;let n=An();if(a(n))return n;let r=ye(te,e.issueId,{at:"end"},n.value);if(a(r))return r;let o={id:Es(),...n.value,action:"close.issue",payload:{id:e.issueId,parent:te,rank:r.value}},d=Pe([o]).find(a);return d?s(d.message):c("Closed issue",{id:e.issueId})},Ts=e=>{let t=Ye(e.repoRoot);if(a(t))return t;let n=An();if(a(n))return n;let r=ye(e.parentId,e.issueId,e.position??{at:"end"},n.value);if(a(r))return r;let o={id:Es(),...n.value,action:"move.node",payload:{id:e.issueId,parent:e.parentId,rank:r.value}},d=Pe([o]).find(a);return d?s(d.message):c("Moved issue",{id:e.issueId,parentId:e.parentId})},Ms=async(e={})=>{let t=fe(e.repoRoot??process.cwd());if(a(t))return s("Sync failed");let n=An();if(a(n))return n;let r=await wr({cwd:t.value,ownEventFileName:je(n.value)});return a(r)?r:c("Synced",r.value)},ks=(e={})=>{let t=Ye(e.repoRoot);return a(t)?t:c("Retrieved Epiq state",{root:t.value.root,nodes:f().nodes,rootNodeId:f().rootNodeId,currentNode:f().currentNode,selectedIndex:f().selectedIndex,eventLog:f().eventLog})};var Be=e=>({isError:a(e),content:[{type:"text",text:JSON.stringify(e,null,2)}]}),Mc=()=>{let e=new wc({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:F.object({repoRoot:F.string().optional()})},async t=>Be(await ks(t))),e.registerTool("epiq_issue_list",{description:"List Epiq issues",inputSchema:F.object({repoRoot:F.string().optional(),includeClosed:F.boolean().optional()})},async t=>Be(await Rs(t))),e.registerTool("epiq_board_list",{description:"List Epiq boards",inputSchema:F.object({repoRoot:F.string().optional()})},async t=>Be(await Ss(t))),e.registerTool("epiq_swimlane_list",{description:"List Epiq swimlanes",inputSchema:F.object({repoRoot:F.string().optional(),boardId:F.string().optional()})},async t=>Be(await bs(t))),e.registerTool("epiq_issue_create",{description:"Create an Epiq issue",inputSchema:F.object({title:F.string().min(1),parentId:F.string().min(1),repoRoot:F.string().optional()})},async t=>Be(await As(t))),e.registerTool("epiq_issue_close",{description:"Close an Epiq issue",inputSchema:F.object({issueId:F.string().min(1),repoRoot:F.string().optional()})},async t=>Be(await ws(t))),e.registerTool("epiq_issue_move",{description:"Move an Epiq issue to another swimlane",inputSchema:F.object({issueId:F.string().min(1),parentId:F.string().min(1),position:F.discriminatedUnion("at",[F.object({at:F.literal("start")}),F.object({at:F.literal("end")}),F.object({at:F.literal("before"),sibling:F.string().min(1)}),F.object({at:F.literal("after"),sibling:F.string().min(1)})]).optional(),repoRoot:F.string().optional()})},async t=>Be(await Ts(t))),e.registerTool("epiq_sync",{description:"Sync Epiq state with the configured Git remote",inputSchema:F.object({repoRoot:F.string().optional()})},async t=>Be(await Ms(t))),e},kc=async()=>{let e=Mc(),t=new Tc;await e.connect(t)};await kc();export{Mc as createMcpServer,Be as resultJson,kc as startMcpServer};
62
+ `;var jn=e=>ye.existsSync(e)?ye.readFileSync(e,"utf8"):null,Ws=(e,t)=>jn(e)===t?!1:(ye.mkdirSync(ot.dirname(e),{recursive:!0}),ye.writeFileSync(e,t,"utf8"),!0),hl=({stateBranchRoot:e,ownEventFileName:t})=>ot.join(e,Ve(t)),xl=async({stateBranchRoot:e,ownEventFileName:t})=>{let n=Ve(t),r=ot.join(e,n);return(await ue({cwd:e,args:["checkout","--",n]})).exitCode!==0&&ye.existsSync(r)&&ye.rmSync(r,{force:!0}),c("Restored own event file to HEAD",null)},Bs=({ownEventPath:e,ownSnapshot:t})=>{if(t===null)return c("No own snapshot to merge",!1);let n=jn(e)??"",r=Gt(n);if(a(r))return s(r.message);let o=Gt(t);if(a(o))return s(o.message);let i=qr(r.value,o.value),d=Ws(e,zr(i));return c("Merged own snapshot",d)},El=e=>{let t=ot.join(e,".epiq","events"),n=new Map;if(!ye.existsSync(t))return c("No event files to snapshot",n);for(let r of ye.readdirSync(t)){if(!r.endsWith(".jsonl"))continue;let o=ot.join(t,r);ye.statSync(o).isFile()&&n.set(r,ye.readFileSync(o,"utf8"))}return c("Snapshotted event files",n)},Nl=async e=>{if((await ue({cwd:e,args:["checkout","--",Ve("")]})).exitCode!==0){let n=ot.join(e,".epiq","events");ye.existsSync(n)&&ye.rmSync(n,{recursive:!0,force:!0})}return c("Restored event files to HEAD",null)},Il=({stateBranchRoot:e,snapshots:t})=>{let n=!1;for(let[r,o]of t){let i=ot.join(e,Ve(r)),d=jn(i)??"",l=Gt(d);if(a(l))return s(l.message);let u=Gt(o);if(a(u))return s(u.message);let m=qr(l.value,u.value);n=Ws(i,zr(m))||n}return c("Merged event snapshots",n)},js=async(e=process.cwd())=>{logger.info("[sync] syncEpiqFromRemote:start",e),Wr("Syncing from remote");let t=P("ensureSyncReady",await Hs({cwd:e,ensureUpstream:!1}));if(a(t))return V(t.message);let{repoRoot:n,stateBranchRoot:r}=t.value,o=P("getStateBranch",Ke(n));if(a(o))return V(o.message);let i=o.value,d=P("snapshotEventFiles",El(r));if(a(d))return V(d.message);let l=P("restoreEventFilesToHead",await Nl(r));if(a(l))return V(l.message);let u=P("resetBranchHardToRemote",await vo({cwd:r,branch:i}));if(a(u))return V(u.message);let m=P("mergeEventSnapshots",Il({stateBranchRoot:r,snapshots:d.value}));return a(m)?V(m.message):(jr(m.value?"Synced and merged local state":"Synced from remote"),logger.info("[sync] syncEpiqFromRemote:done"),c("Synced state branch from remote",{repoRoot:n,stateBranchRoot:r}))},Hs=async({cwd:e,ensureUpstream:t})=>{logger.info("[sync] ensureSyncReady:start",{cwd:e,ensureUpstream:t});let n=P("getRepoRootDir",await lt(e));if(a(n))return s(n.message);let r=n.value;logger.info("[sync] repo root",r);let o=P("getStateBranchRoot",on({repoRoot:r}));if(a(o))return s(o.message);let i=o.value;logger.info("[sync] state branch root",i);let d=P("ensureInitialCommit",await qi(r));if(a(d))return s(d.message);logger.info("[sync] initial commit result",{created:d.value}),logger.info("[sync] bootstrapping state branch storage",{repoRoot:r,stateBranchRoot:i,ensureUpstream:t});let l=P("bootstrapStateBranchStorage",await Ki({repoRoot:r,stateBranchRoot:i,ensureUpstream:t}));if(a(l))return s(l.message);logger.info("[sync] bootstrap result",{bootstrapped:l.value,stateBranchRoot:i}),logger.info("[sync] checking state branch git operation",{stateBranchRoot:i});let u=P("hasInProgressGitOperation(stateBranchRoot)",await en(i));if(a(u))return s(u.message);if(logger.info("[sync] state branch git operation check result",{inProgress:u.value}),u.value)return logger.info("[sync] state branch git operation in progress"),s("Cannot sync while a git operation is in progress in the state branch");logger.info("[sync] ensuring state branch layout",{repoRoot:r,stateBranchRoot:i});let m=P("ensureStateBranchLayout",So(r,i));return a(m)?s(m.message):(logger.info("[sync] state branch layout ready"),logger.info("[sync] ensureSyncReady:done",{repoRoot:r,stateBranchRoot:i,bootstrapped:l.value}),c("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:i,bootstrapped:l.value}))},_s=async({repoRoot:e,stateBranchRoot:t,ownEventFileName:n})=>{logger.info("[sync] committing own event file from state branch",{ownEventFileName:n,stateBranchRoot:t}),logger.info("[sync] staging own event file",{stateBranchRoot:t,ownEventFileName:n});let r=P("stageStateBranchOwnEventFile",await kn({stateBranchRoot:t,eventFileName:n}));if(a(r))return s(r.message);let o=P("hasStagedChanges(after stage)",await yo(t));if(a(o))return s(o.message);if(logger.info("[sync] state branch change check after stage result",{changed:o.value}),!o.value)return logger.info("[sync] no own event file changes to commit"),c("No own event file changes to commit",{createdCommit:!1});logger.info("[sync] creating sync commit");let i=P("createStateBranchSyncCommit",await zi({repoRoot:e,stateBranchRoot:t}));return a(i)?s(i.message):(logger.info("[sync] created sync commit",i.value),c("Committed own event file",{createdCommit:!0,commitSha:i.value}))},Kr=async({cwd:e=process.cwd(),ownEventFileName:t})=>{if(logger.info("[sync] syncEpiqWithRemote:start",{cwd:e,ownEventFileName:t}),t.includes("/")||t.includes("\\"))return logger.info("[sync] invalid own event file name: contains path separator",{ownEventFileName:t}),s("Own event file must be a file name, not a path");if(!t.endsWith(".jsonl"))return logger.info("[sync] invalid own event file name: missing .jsonl suffix",{ownEventFileName:t}),s("Own event file must end with .jsonl");Wr("Syncing");let n=P("ensureSyncReady",await Hs({cwd:e,ensureUpstream:!0}));if(a(n))return V(n.message);let{repoRoot:r,stateBranchRoot:o,bootstrapped:i}=n.value;logger.info("[sync] sync preconditions ready",{repoRoot:r,stateBranchRoot:o,bootstrapped:i}),logger.info("[sync] checking detached state branch",{stateBranchRoot:o});let d=P("isDetachedHead(stateBranchRoot)",await ho(o));if(a(d))return V(d.message);if(logger.info("[sync] detached state branch check result",{detached:d.value}),d.value)return logger.info("[sync] state branch is detached"),V("Cannot run :sync while the state branch is in detached HEAD state");let l=!1,u,m=!1,p=!1,y=P("getStateBranch",Ke(r));if(a(y))return V(y.message);let E=y.value;logger.info("[sync] resolved state branch",{stateBranch:E,stateBranchRoot:o});let I=hl({stateBranchRoot:o,ownEventFileName:t}),A=jn(I),$=P("restoreOwnEventFileToHead",await xl({stateBranchRoot:o,ownEventFileName:t}));if(a($))return V($.message);let S=P("pullBranchRebaseIfPresent",await er({cwd:o,branch:E}));if(a(S))return V(S.message);m=S.value;let T=P("mergeOwnSnapshot",Bs({ownEventPath:I,ownSnapshot:A}));if(a(T))return V(T.message);let O=P("commitOwnEventFileToStateBranch",await _s({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(a(O))return V(O.message);if(l=O.value.createdCommit,u=O.value.commitSha,logger.info("[sync] sync own result",{createdCommit:l,commitSha:u}),l||i){logger.info("[sync] pushing state branch",{createdCommit:l,bootstrapped:i,stateBranchRoot:o});let ee=P("pushStateBranch(initial)",await jt({stateBranchRoot:o,repoRoot:r})),de=ee;if(a(ee)&&go(ee.message)){logger.info("[sync] non-fast-forward, retrying sync");let st=P("pullBranchRebaseIfPresent(retry)",await er({cwd:o,branch:E}));if(a(st))return V(st.message);logger.info("[sync] pull retry result",st.value);let Ct=P("mergeOwnSnapshot(retry)",Bs({ownEventPath:I,ownSnapshot:A}));if(a(Ct))return V(Ct.message);let be=P("commitOwnEventFileToStateBranch(retry)",await _s({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(a(be))return V(be.message);logger.info("[sync] retry sync result",be.value),be.value.createdCommit&&(l=!0,u=be.value.commitSha),de=P("pushStateBranch(retry)",await jt({stateBranchRoot:o,repoRoot:r}))}if(a(de))return V(de.message);p=de.value,logger.info("[sync] pushed to state branch",p)}else logger.info("[sync] no commit created, skipped push");if(l){logger.info("[sync] resolving final sync commit sha",{stateBranchRoot:o});let ee=P("git rev-parse HEAD",await L({args:["rev-parse","HEAD"],cwd:o}));if(a(ee))return V(ee.message);u=ee.value.stdout.trim(),logger.info("[sync] final sync commit sha",u)}return jr(p?"Synced and pushed":m||l||T.value?"Synced local state":"Already synced"),logger.info("[sync] syncEpiqWithRemote:done",{pulled:m,pushed:p,createdCommit:l,bootstrapped:i,commitSha:u}),c("Synced event logs with state branch",{repoRoot:r,stateBranchRoot:o,createdCommit:l,commitSha:u,pulled:m,pushed:p,bootstrapped:i})},$e=async()=>{let e=$s();if(e)return e;logger.info("[sync] syncAndReloadState:start");let t=P("resolveActorId",K());if(a(t)||!t.value)return logger.info("[sync] unable to resolve actor id"),s("Unable to resolve event log path");let n=Qe(t.value);logger.info("[sync] resolved own event file name",{ownEventFileName:n});let r=P("syncEpiqWithRemote",await Kr({ownEventFileName:n}));if(a(r))return logger.info("[sync] syncAndReloadState:sync failed",r.message),s(`Unable to sync state. ${r.message}`);let{stateBranchRoot:o}=r.value;logger.info("[sync] loading merged events after sync",{stateBranchRoot:o});let i=P("loadMergedEvents",ht(o));if(a(i))return s(`Unable to load events. ${i.message}`);logger.info("[sync] loaded merged events after sync",{count:i.value.length});let d=$s();if(d)return d;let l=Fs(),u=P("bootStateFromEventLog",Ln(i.value));if(a(u))return s(`Unable to boot synced state. ${u.message}`);logger.info("[sync] booted state from synced events"),x({hasProjectDefinition:!0,syncStatus:{msg:"Synced",status:"synced"}});let m=P("restoreNavigationAnchor",Os(l));return a(m)?m:(logger.info("[sync] syncAndReloadState:done"),c("Synced",!0))},$s=()=>v().mode===g.DEFAULT?null:(x({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),s("Will not re-materialize if not in default mode, to not lose edit data"));var zs=e=>{let t=_e(e??process.cwd());return a(t)?s(t.message):c("Resolved Epiq repo root",t.value)},it=async e=>{let t=zs(e);if(a(t))return t;let n=await js(t.value);if(a(n))return s(n.message);let{stateBranchRoot:r}=n.value,o=ht(r);if(a(o))return s(o.message);let i=Ln(o.value);return a(i)?s(i.message):c("Booted Epiq state",{repoRoot:t.value,stateBranchRoot:r})},Hn=()=>{let e=Pi();return a(e)?s(e.message):e.value.userId?e.value.userName?c("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):s("Unable to retrieve user name"):s("Unable to retrieve user id")},qn=()=>{let e=Se();return a(e)?s(e.message):e},Sl=e=>(e.props.tags??[]).map(t=>N.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name})),Cl=e=>(e.props.assignees??[]).map(t=>N.getContributor(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name})),Ks=async(e={})=>{let t=await it(e.repoRoot);if(a(t))return t;let n=qn();if(a(n))return n;let r=Object.values(n.value.nodes).filter(o=>o.context==="BOARD").map(o=>({id:o.id,title:o.title,parentId:o.parentNodeId,readonly:!!o.readonly}));return c("Listed boards",r)},Vs=async(e={})=>{let t=await it(e.repoRoot);if(a(t))return t;let n=qn();if(a(n))return n;let r=Object.values(n.value.nodes).filter(o=>o.context==="SWIMLANE").filter(o=>!e.boardId||o.parentNodeId===e.boardId).map(o=>({id:o.id,title:o.title,boardId:o.parentNodeId,isClosed:o.id===ne,readonly:!!o.readonly}));return c("Listed swimlanes",r)},Gs=async e=>{let t=await it(e.repoRoot);if(a(t))return t;let n=qn();if(a(n))return n;let r=Object.values(n.value.nodes).filter(F).filter(o=>e.includeClosed||o.parentNodeId!==ne).map(o=>({id:o.id,title:ln(o.title),description:o.props.description??"",parentId:o.parentNodeId,isClosed:o.parentNodeId===ne,readonly:!!o.readonly,tags:Sl(o),assignees:Cl(o)}));return c("Listed issues",r)},Ys=async e=>{let t=await it(e.repoRoot);if(a(t))return t;let n=Hn();if(a(n))return n;let r=Et(e.parentId,n.value,t.value.stateBranchRoot);if(a(r))return r;let o=On({name:e.title,parent:e.parentId,user:n.value,rank:r.value});if(a(o))return o;let i=o.value,l=Nt(i,t.value.stateBranchRoot).find(a);if(l)return s(l.message);let u=await $e();if(a(u))return u;let m=i.find(p=>p.action==="add.issue")?.payload.id;return m?c("Created issue",{id:m,title:e.title,parentId:e.parentId}):s("Unable to determine created issue id")},Xs=async e=>{let t=await it(e.repoRoot);if(a(t))return t;let n=Hn();if(a(n))return n;let r=St(ne,e.issueId,{at:"end"},n.value,t.value.stateBranchRoot);if(a(r))return r;let o={id:qs(),...n.value,action:"close.issue",payload:{id:e.issueId,parent:ne,rank:r.value}},d=Nt([o],t.value.stateBranchRoot).find(a);if(d)return s(d.message);let l=await $e();return a(l)?l:c("Closed issue",{id:e.issueId})},Js=async e=>{let t=await it(e.repoRoot);if(a(t))return t;let n=Hn();if(a(n))return n;let r=St(e.parentId,e.issueId,e.position??{at:"end"},n.value,t.value.stateBranchRoot);if(a(r))return r;let o={id:qs(),...n.value,action:"move.node",payload:{id:e.issueId,parent:e.parentId,rank:r.value}},d=Nt([o],t.value.stateBranchRoot).find(a);if(d)return s(d.message);let l=await $e();return a(l)?l:c("Moved issue",{id:e.issueId,parentId:e.parentId})},Zs=async(e={})=>{let t=zs(e.repoRoot);if(a(t))return s("Sync failed");let n=Hn();if(a(n))return n;let r=await Kr({cwd:t.value,ownEventFileName:Qe(n.value)});return a(r)?r:c("Synced",r.value)},Qs=async(e={})=>{let t=await it(e.repoRoot);if(a(t))return t;let n=qn();return a(n)?n:c("Retrieved Epiq state",{root:t.value.repoRoot,stateBranchRoot:t.value.stateBranchRoot,nodes:n.value.nodes,rootNodeId:n.value.rootNodeId,currentNode:n.value.currentNode,selectedIndex:n.value.selectedIndex,eventLog:n.value.eventLog})};var ze=e=>({isError:a(e),content:[{type:"text",text:JSON.stringify(e,null,2)}]}),Al=()=>{let e=new Rl({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:k.object({repoRoot:k.string().optional()})},async t=>ze(await Qs(t))),e.registerTool("epiq_issue_list",{description:"List Epiq issues",inputSchema:k.object({repoRoot:k.string().optional(),includeClosed:k.boolean().optional()})},async t=>ze(await Gs(t))),e.registerTool("epiq_board_list",{description:"List Epiq boards",inputSchema:k.object({repoRoot:k.string().optional()})},async t=>ze(await Ks(t))),e.registerTool("epiq_swimlane_list",{description:"List Epiq swimlanes",inputSchema:k.object({repoRoot:k.string().optional(),boardId:k.string().optional()})},async t=>ze(await Vs(t))),e.registerTool("epiq_issue_create",{description:"Create an Epiq issue",inputSchema:k.object({title:k.string().min(1),parentId:k.string().min(1),repoRoot:k.string().optional()})},async t=>ze(await Ys(t))),e.registerTool("epiq_issue_close",{description:"Close an Epiq issue",inputSchema:k.object({issueId:k.string().min(1),repoRoot:k.string().optional()})},async t=>ze(await Xs(t))),e.registerTool("epiq_issue_move",{description:"Move an Epiq issue to another swimlane",inputSchema:k.object({issueId:k.string().min(1),parentId:k.string().min(1),position:k.discriminatedUnion("at",[k.object({at:k.literal("start")}),k.object({at:k.literal("end")}),k.object({at:k.literal("before"),sibling:k.string().min(1)}),k.object({at:k.literal("after"),sibling:k.string().min(1)})]).optional(),repoRoot:k.string().optional()})},async t=>ze(await Js(t))),e.registerTool("epiq_sync",{description:"Sync Epiq state with the configured Git remote",inputSchema:k.object({repoRoot:k.string().optional()})},async t=>ze(await Zs(t))),e},wl=async()=>{let e=Al(),t=new bl;await e.connect(t)};await wl();export{Al as createMcpServer,ze as resultJson,wl as startMcpServer};