epiq 0.5.2 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/index.js +43 -43
  2. package/dist/mcp.js +44 -44
  3. package/package.json +1 -1
package/dist/mcp.js CHANGED
@@ -1,59 +1,59 @@
1
1
  #!/usr/bin/env node
2
- import{McpServer as Rc}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as Ac}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as F}from"zod";var Me={None:"none",Success:"success",Fail:"fail"},s=e=>({status:Me.Fail,message:e,value:null}),c=(e,t)=>({status:Me.Success,message:e,value:t}),a=e=>e.status==="fail",ct=e=>e.status==="success";import{ulid as hs}from"ulid";import Ic from"node:fs";import{useSyncExternalStore as yc}from"react";var P={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 Lr(e){return e.context==="FIELD"}var kt=e=>e.context==="SWIMLANE",Or=e=>e.context==="BOARD";var g={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line"};function Ft(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var Dt=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",Xe=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var Ur=e=>{let t=new Map;for(let n of e)for(let r=1;r<=n.length;r++){let o=n.slice(0,r),i=t.get(o);i?i.push(n):t.set(o,[n])}return t},Br=(e,t)=>t?e.get(t)??[]:[];var _r=new WeakMap,ks=e=>{let t=_r.get(e);return t||(t=Ur(e),_r.set(e,t)),t};var $r=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return Br(ks(e),r).filter(i=>Ft(r,i)>=n)};var Fs={hint:"",hints:[],overlap:0,remainder:""},Wr=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return Fs;let o=$r({wordList:r,inputToMatch:e,overlapThreshold:1});return Ds(t,o)},Ds=(e,t)=>{let n=t[0]??"",r=Ft(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}};import qs from"node:fs";import Vs from"node:path";import{decodeTime as zs,monotonicFactory as Gs}from"ulid";import{z as pt}from"zod";var Lt={autoSyncIntervalMs:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},_=()=>Lt,ge=e=>(Lt={...Lt,...e},Lt);import lt from"node:fs";import he from"node:path";var Pn=process.env.IS_LOCAL==="true",Ie=".epiq",de=".epiq-global",Ot="events",Ls="project.json",jr=e=>he.join(e,Ie),Ut=e=>he.join(e,Ie),Bt=e=>he.join(Ut(e),Ls),ut=e=>he.join(Ut(e),Ot),Os=e=>{let t=he.join(e,Ie);return lt.existsSync(t)&&lt.statSync(t).isDirectory()},kn=e=>{let t=Bt(e);return lt.existsSync(t)&&lt.statSync(t).isFile()},fe=e=>{let t=he.resolve(e);for(;;){if(Os(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}},Pe=e=>{let t=he.resolve(e);for(;;){if(kn(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}},Hr=e=>{let t=ut(e);try{return lt.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")}};import _t from"node:fs";import Dn from"node:path";import{decodeTime as Us}from"ulid";import{z as Fn}from"zod";var Bs=Fn.object({userId:Fn.string().min(1).default("unknown"),userName:Fn.string().min(1).default("unknown")}),_s=e=>{let[t,n]=Dn.basename(e,".jsonl").split("."),r=Bs.safeParse({userId:t,userName:n});return r.success?c("Parsed event file actor",r.data):s(`Invalid event file name ${Dn.basename(e)}: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},$s=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])},Ws=(e,t)=>t in e,js=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),Hs=e=>{let{userId:t,userName:n,...r}=e,o=$s(r);if(a(o))return s(o.message);let i=o.value,d=e.id?.[0];return d?Ws(r,i)?c("Decoded persisted event",js({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")},$t=e=>{if(!_t.existsSync(e))return c("Event file missing",[]);let t=_s(e);if(a(t))return s(t.message);let n=_t.readFileSync(e,"utf8"),r=[];for(let o of n.split(`
3
- `)){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=Ln(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 Kr(e){let t=ut(e);if(!_t.existsSync(t))return c("No events found",[]);let n=_t.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>Dn.join(t,o)),r=[];for(let o of n){let i=$t(o);if(a(i))return s(i.message);r.push(...i.value)}return c("All events loaded",Ks(r))}function mt(e){let t=Kr(e);if(a(t))return s(t.message);let n=[];for(let r of t.value){let o=Hs(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 qr(e=process.cwd()){let t=Kr(e);return a(t)?s(t.message):c("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var Ks=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},Vr=(e,t)=>{let n=e.findIndex(r=>{try{return Us(r.id)>t}catch{return!0}});return n===-1?{appliedEvents:e,unappliedEvents:[]}:{appliedEvents:e.slice(0,n),unappliedEvents:e.slice(n)}};var zr=e=>({action:e.action,payload:e.payload});var Yr=1,Gr=Gs(),Ys=pt.tuple([pt.string().min(1),pt.string().min(1).nullable()]),Xs=pt.looseObject({v:pt.literal(Yr),id:Ys}),Ln=e=>{let t=Xs.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(", ")}`)},Wt=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",q=()=>{let{userName:e,userId:t}=_();return e?t?e.trim()?c("Successfully resolved actor ID",{userId:Wt(t),userName:Wt(e)}):s("Unable to resolve actor ID from settings or OS user info"):s("User ID not configured"):s("User name not configured")},Ee=({userId:e,userName:t})=>`${Wt(e)}.${Wt(t)}.jsonl`,Js=(e,{userId:t,userName:n})=>{let r=Ee({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r))return s(`Invalid event log file name: ${r}`);let i=Vs.join(ut(e),r);return c("Successfully resolved event log path",i)},Zs=(e,t)=>{let n={[e.action]:e.payload,v:Yr,id:t};return Ln(n)};function jt({event:e,rootDir:t=process.cwd()}){try{let n=fe(t);if(a(n))return n;let r=Hr(n.value);if(a(r))return r;let o=Js(n.value,{userId:e.userId,userName:e.userName});if(a(o))return o;let i=qr(n.value);if(a(i))return s(i.message);let d=i.value?Gr(Math.max(Date.now(),zs(i.value)+1)):Gr(),l=Zs(zr(e),[d,i.value]);return a(l)?s(l.message):(qs.appendFileSync(o.value,`${JSON.stringify(l.value)}
4
- `,"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}`)}}var Je=3e3,Xr=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<Je?null:t},Jr=0,On,Un=!1,gt=!1,Bn=()=>Un||f().syncStatus.status==="syncing",Qs=()=>{let e=_().autoSyncIntervalMs??15e3,t=Date.now()-Jr;return Math.max(0,e-t)},Zr=()=>{On||(On=setTimeout(async()=>{if(On=void 0,Bn()){gt=!0;return}gt=!1,await ea()},Qs()))},ea=async()=>{if(Bn())return gt=!0,s("Sync already in progress");let e=q();if(a(e)||!e.value)return s("Unable to resolve event log path");Un=!0,Jr=Date.now();try{let t=Ee(e.value);return await Ze({ownEventFileName:t})}finally{Un=!1,gt&&Zr()}},Qr=()=>{gt=!0,!Bn()&&Zr()};import ft from"node:fs";import{ulid as ta}from"ulid";import{z as Ht}from"zod";var na="_epiq/_evt",ra=Ht.object({projectId:Ht.string().min(1),stateBranch:Ht.string().min(1),createdAt:Ht.iso.datetime()}),eo=()=>({projectId:ta(),stateBranch:na,createdAt:new Date().toISOString()}),ke=e=>{let t=Bt(e);if(!ft.existsSync(t))return s("Missing .epiq/project.json");try{let n=ft.readFileSync(t,"utf8"),r=JSON.parse(n),o=ra.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")}},to=e=>{let t=ke(e);return a(t)?s(t.message):c("Read projectId",t.value.projectId)},no=({repoRoot:e,fileContents:t})=>{let n=Ut(e),r=Bt(e);try{if(ft.mkdirSync(n,{recursive:!0}),ft.existsSync(r)){let o=ke(e);return a(o)?s(o.message):c("Project already initialized",null)}return ft.writeFileSync(r,JSON.stringify(t,null,2)+`
5
- `,"utf8"),c("Created project.json",null)}catch(o){return s(o instanceof Error?`Failed to initialize project: ${o.message}`:"Failed to initialize project")}};var Kt=()=>{let e=_(),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}},ro=()=>{let e=Pe(process.cwd());if(a(e))return s("Unable to determine if repository is initialized");let t=ke(e.value);return ct(t)},oo=e=>e===!0?"yes":e===!1?"no":null,io=e=>e==="yes"?!0:e==="no"?!1:null;var J={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:P.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:P.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:P.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:P.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:P.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:P.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:i,log:[],isVirtual:d})};import{ulid as sa}from"ulid";var $e=24n,oa=$e*4n,We=(1n<<oa)-1n,ia=/^[0-9a-f]+$/;function so(e){return!e||!ia.test(e)?s(`Invalid hex rank: ${e}`):c("Converted rank to bigint",BigInt("0x"+e))}function Ce(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 Ce(We/2n,$e);let n=e?so(e):c("Resolved lower bound",0n);if(a(n))return n;let r=t?so(t):c("Resolved upper bound",We);if(a(r))return r;let o=n.value,i=r.value;if(i<=o)return Ce(We/2n,$e);let d=(o+i)/2n;return d===o||d===i?s("No rank space available between neighbors"):Ce(d,$e)}function ao(){return Ce(We/2n,$e)}function co(e){if(e<=0)return c("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=We*BigInt(r+1)/(t+1n),i=Ce(o,$e);if(a(i))return i;n.push(i.value)}return c("Resolved evenly spaced ranks",n)}var _n=(e,t)=>{let n=$(e),r=co(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:sa(),action:"rebalance.children",payload:{parent:e,ranks:o},...t})};var G={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History"};var aa=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[te,qt]=aa;var k=(e,t)=>s(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),da={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=J.workspace(t,n,r),i=xt(o);if(a(i))return k(i.message,e);let d=N.createNode(o);return a(d)?k(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)?k(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)?k(i.message??"Unable to create board",e):Or(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)?k(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)?k(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)?k(d.message??`Unable to create field: ${n}`,e):Lr(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 k(`Unable to locate node with id ${t}`,e);let o=N.renameNode(t,n);return a(o)?k(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)?k(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)?k(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)?k(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)?k(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)?k(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)?k(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)?k(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)?k(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)?k(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 k("Unable to locate issue",e);if(!ne(o))return k("Can only close issues",e);let i=N.getNode(te);if(!i)return k("Unable to locate target swimlane",e);if(n!==i.id)return k("Close target must be closed swimlane",e);let d=N.moveNodeToRank({id:t,parentId:n,rank:r});return a(d)?k(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 k("Unable to locate issue",e);if(!ne(o))return k("Can only reopen issues",e);let i=N.getNode(te);if(!i)return k("Unable to locate closed swimlane",e);if(n===i.id)return k("Cannot reopen issue into closed swimlane",e);if(!N.getNode(n))return k("Reopen parent no longer exists",e);let l=N.moveNodeToRank({id:t,parentId:n,rank:r});return a(l)?k(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)?k(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 k(`Unable to locate node ${r}`,e);if(i.parentNodeId!==t)return k(`Node ${r} is not child of ${t}`,e);let d=N.updateNode({...i,rank:o});if(a(d))return k(d.message??"Unable to rebalance child",e)}return c("Rebalanced children",{action:e.action,result:{parent:t}})}},ca=(e,t)=>{let n=N.getNode(e);n&&N.updateNode({...n,log:[...n.log??[],t]})},la=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 vt(e,t=!1){let n=da[e.action](e);if(a(n))return n;t||([...new Set(la(e))].forEach(d=>ca(d,e)),ce(d=>({...d,eventLog:[...d.eventLog,e]})));let r=e.userId,o=e.userName;return!r?.length||!o?.length?k("Invalid user ID format",e):(N.createContributor({name:o,id:r}),n)}var yt=e=>e.map(t=>vt(t));function W(e){let t=vt(e);if(t.status!==Me.Success)return t;let n=jt({event:e});return a(n)?n:t}function Fe(e){return e.map(t=>W(t))}var lo=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=uo(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=uo(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)),uo=(e,t)=>e.findIndex(n=>n.id===t),mo=(e,t,n={at:"end"})=>$n($(t).filter(r=>r.id!==e),n),ye=(e,t,n,r)=>{let o=mo(t,e,n);if(a(o))return o;if(!o.value.needsRebalance)return c("Resolved rank",o.value.rank);let i=_n(e,r);if(a(i))return i;let d=W(i.value);if(a(d))return d;let l=mo(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)},De=(e,t)=>{let n=lo(e);if(a(n))return n;if(!n.value.needsRebalance)return c("Resolved rank",n.value.rank);let r=_n(e,t);if(a(r))return r;let o=W(r.value);if(a(o))return o;let i=lo(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}`)},ua=(e,t)=>{let{nodes:n}=f(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},Wn=(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=Wn(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=Wn(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=Wn(o,"move");if(d)return d;if(ua(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 po=(e,t)=>{let r=b(e.id).find(o=>o.title===t);return r?b(r.id).map(o=>typeof o.props?.value=="string"?o.props.value:"").filter(o=>!!o):[]},jn=e=>po(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",jn(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=>po(e,"Assignees").map(t=>N.getContributor(t)).filter(t=>!!t);var go=(e,t)=>{let r=b(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 ma=/^(\d+)(h|d|w|mo|y)$/,pa=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,ga=({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},fa=(e,t=new Date)=>{let n=e.match(ma);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}},va=e=>{let t=e.match(pa);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 ga({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 fa(t)??va(t)},fo=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,ya=[{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}],vo=(e=ya)=>{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 xa=["BOARD","TICKET","SWIMLANE"],Y={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs"},Le={TITLE:"title",DESCRIPTION:"description"},Na=[Y.EDITOR,Y.VIEW,Y.USERNAME,Y.AUTOSYNC,Y.SYNC_DEBOUNCE_MS],ha=[Le.TITLE,Le.DESCRIPTION],qn=[String(Je),"5000","15000","30000","60000"],je=[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],yo=[v.FILTER,v.PEEK],Ia={WORKSPACE:[...je,...Yt],BOARD:[...yo,...je,...Yt],SWIMLANE:[...yo,...je,...Yt],TICKET:[...je,...Yt,...Kn],FIELD:[...je,...Kn],FIELD_LIST:[...je,...Kn],TEXT:[...je]},Ea=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],Ca=()=>{let{selectedNode:e,readOnly:t,breadCrumb:n}=f(),{isSetupDone:r}=Kt();if(!r)return[v.HELP,v.CONFIG];if(!ro())return[v.HELP,v.INIT];if(t)return[v.HELP,v.PEEK,v.EXPORT,v.CONFIG];let o=e?.context,i=o&&xa.includes(o);return[...new Set([...n,e].map(l=>l?.context).flatMap(l=>l?Ia[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]:Ca(),[v.EXIT]:["confirm"],[v.EXPORT]:[],[v.SYNC]:[],[v.INIT]:[],[v.HELP]:[],[v.PEEK]:[...vo(),"now","prev","next"],[v.EDIT]:[...ha],[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]:Ea(n),[v.CONFIG]:[...Na]}[e]??[]};import tt from"chalk";var xo=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import{decodeTime as No}from"ulid";var ho=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 Io=e=>{try{return c("Decoded date",new Date(No(e)))}catch(t){return s("Decoding failed + "+t.message)}},Vn=e=>{if(!e?.id)return null;try{return No(e.id)}catch{return null}};var Oe=(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 Eo from"chalk";var Gn={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)),zn=(e,t,n)=>e+(t-e)*n,Co=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Sa=(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)]},Ra=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,Aa=(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))],Nt=e=>{let n=Co(e)%360,r=Sa(n,Gn.stringColor.saturation,Gn.stringColor.lightness);return Ra(r)},wa=e=>{let t=Gn.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 Aa(t[i],t[i+1],d)},Xt=e=>Co(e.toLowerCase().trim())/4294967295,Ta=e=>{let t=Xt(e);return wa(t)},Ma=e=>{let[t,n,r]=Ta(e);return{normal:o=>Eo.bgRgb(t,n,r).black(o),cursor:o=>Eo.bgRgb(t,n,r).white.bold(o)}};var Yn=e=>Ma(e).normal(` ${e} `),re=(e,t=et)=>{let r=(o=>o.toLowerCase().trim())(e);return r&&t[r]?t[r]:Nt(r)};var He={None:"none",Invalid:"invalid",Valid:"valid"};var Pa=["BOARD","TICKET","SWIMLANE"],Jn=()=>{let e=f().selectedNode;return e?.context?Pa.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]})},ka=({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]}),ht=({hint:e})=>({modifier:t,inputString:n})=>Jt(t)&&Jt(n)?O({message:e,completionWordList:[]}):B(X),Fa=({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=[...xo];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=_().autoSync;if(!r.includes(t.trim())){let i=oo(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=_().autoSyncIntervalMs,o=Xr(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})}},Da=({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 Le.TITLE:return B(X);case Le.DESCRIPTION:return B("<ENTER> to edit in "+_().preferredEditor);default:return O({message:"Unknown edit option",completionWordList:t})}},La={[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=Oe(f().breadCrumb,"BOARD");if(a(o))return O({message:"Command is not applicable in this context"});let i=Io(o.value.id);return a(i)?O({message:"Unable to peek: board id is not a valid ULID"}):fo({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=>ka({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]:Da,[v.CONFIG]:Fa,[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:ht({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 ht({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?ht({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 ht({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?ht({hint:"remove assignee... "+n.join("")})(e):O({message:"Issue has no assignees",completionWordList:[]})},[v.SYNC]:()=>B(X)},bo=Object.fromEntries(Object.entries(La).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var So=["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 Ro=e=>Object.values(v).includes(e),Ao=(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):So;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 wo=e=>{let t=e.trimStart(),n=Ua(t),r=n[0]??"",o=n[1]??"",i=/\s$/.test(e),d=Ba(e),l=Ro(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=Oa(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}},Oa=(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},Ua=e=>e.trim()?e.trim().split(/\s+/):[],Ba=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}}},_a=new Set,To=()=>{for(let e of _a)e()};var be=e=>{let n=e(rt),r=wo(n.value),o=n.cursorPosition===n.value.length;rt={...n,commandMeta:Ao(r,o)},To()},It=({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,To(),c(e,null)},Qn=e=>{be(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},er=e=>{be(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}})},Mo=()=>{be(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=()=>{be(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=>{be(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}})},ko=()=>{be(e=>({...e,commandIsPending:!0}))},Fo=({addToHistory:e=!0})=>{be(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),$a()},Do=()=>{be(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}})},Lo=()=>{be(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},$a=()=>U(()=>""),ee=()=>rt,Oo=()=>{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 Uo=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 V}from"ulid";import ei from"node:fs";import gd from"node:path";import fd from"react";import{Box as md}from"ink";import sn from"react";import{Box as rr,Text as Za}from"ink";import Ne from"react";import{Text as Bo}from"ink";import _o,{useEffect as $o,useState as Wa}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]=Wa(0);if($o(()=>{i(0)},[r]),$o(()=>{if(!e)return;let l=setInterval(()=>{i(u=>(u+1)%r.length)},500);return()=>clearInterval(l)},[e,r]),!e)return _o.createElement(Bo,null,t);let d=r[o]??r[0]??t;return _o.createElement(Bo,{color:M.accent,dimColor:o===1},d)};import{Box as tr,Text as ja}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,S=C?Math.max(1,Math.floor(l/e.length*R)):R,E=Math.max(0,R-S),A=Math.max(1,e.length-l),K=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((Te,ie)=>Zt.createElement(ja,{key:ie,color:C&&ie>=K&&ie<K+S?M.accent:M.secondary},C?"\u2502":" "))))};import{Box as nn,Text as Ya}from"ink";import Ke from"react";import{Text as Ha}from"ink";import Ka from"react";var qa=e=>e.toLowerCase().trim(),Va=(e,t=et)=>{let n=qa(e);return t[n]?t[n]:Nt(n)},en=({id:e,isSelected:t})=>{let n=N.getContributor(e);if(n)return Ka.createElement(Ha,{underline:t,color:Va(n.name)},"@"+n.name)};import{Text as za}from"ink";import Ga from"react";var tn=({id:e,isSelected:t})=>{let n=N.getTag(e);if(n)return Ga.createElement(za,{underline:t,backgroundColor:re(n.name),color:M.primary}," "+n.name+" ")};var jo=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=Dt(Xe(t.title),r),i=jn(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(Ya,{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 Xa from"chalk";import{Box as Et,Text as nr}from"ink";import Se from"react";var Ja=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,Ho=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let i=b(t.id),d=S=>{let E=i.find(A=>A.title===S);return E?b(E.id).map(A=>typeof A.props?.value=="string"?A.props.value:"").filter(A=>!!A):[]},l=d("Tags").map(S=>N.getTag(S)).filter(S=>!!S),u=d("Assignees").map(S=>N.getContributor(S)).filter(S=>!!S),m=1,p=l.length*(1+m),x=u.length*(2+m),h=l.map(S=>Se.createElement(Et,{key:S.id,paddingRight:m},Se.createElement(nr,{color:re(S.name)},"\u25A0"))),C=u.map(S=>Se.createElement(Et,{key:S.id,paddingRight:m},Se.createElement(nr,{color:Nt(S.name)},"@"+S.name.at(0)))),R=n?M.accent:o===g.MOVE?M.secondary:M.primary;return Se.createElement(Et,{borderBottom:!0,justifyContent:"space-between"},Se.createElement(Et,null,Se.createElement(le,{isSelected:n,placeholder:Xa.dim.gray(r+1+" ")}),Se.createElement(nr,{wrap:"truncate",color:R},Ja(t.title,e-p-x-14))),Se.createElement(Et,null,h,C))};var Qa=({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(Za,{bold:!0,color:t?M.accent:M.primary},p," ",e.readonly?"\u{1F512}":"")),S=(E,A)=>{let K=i&&d===A;return o?Ne.createElement(Ho,{key:E.id,index:A,width:n,ticket:E,isSelected:K,mode:l}):Ne.createElement(jo,{key:E.id,width:n,ticket:E,isSelected:K})};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(S)),Ne.createElement(le,{isSelected:i&&d===-1})))},Ko=Ne.memo(Qa);import{Box as sr,Text as ld}from"ink";import Ue,{useEffect as ar,useMemo as Xo}from"react";import qe from"chalk";import qo from"string-width";import{decodeTime as ed}from"ulid";var td=(e,t)=>e+" ".repeat(Math.max(0,t-qo(e))),nd=(e,t)=>" ".repeat(Math.max(0,t-qo(e)))+e,rd=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)})(),od=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""}},id=e=>{let t=ho(ed(e));return qe.gray(nd(t,8))},sd=12,ad=e=>td(`${e}`,sd),Vo=e=>{let t=id(e.id),n=ad(e.userName),r=rd(e.action),o=od(e),i=qe.dim("\u203A"),d=[r,o].filter(Boolean).join(" ");return`${n} ${t} ${i} ${d}`};var D={exit(){process.exit(0)},enterChildNode(){let e=f(),t=e.currentNode,n=Math.max(0,e.selectedIndex),r=b(t.id)[n];!r||t.context==="FIELD"||D.navigate({currentNode:r,selectedIndex:b(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=b(n.id),o=r.findIndex(({id:d})=>d===e.id),i=r.length===0?-1:o>=0?o:0;D.navigate({currentNode:n,selectedIndex:i})},navigateToNextItem:()=>zo(1),navigateToPreviousItem:()=>zo(-1),navigateToNextContainer:()=>Go(1),navigateToPreviousContainer:()=>Go(-1),navigate:({currentNode:e=f().currentNode,selectedIndex:t})=>{I({currentNodeId:e.id,selectedIndex:t})}},zo=e=>{let t=f(),n=b(t.currentNode.id).length;if(n===0)return;let o=(Math.max(0,t.selectedIndex)+e+n)%n;D.navigate({selectedIndex:o})},Go=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=b(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=b(l.id),m=Math.max(0,u.length-1),p=Math.min(Math.max(0,r),m),x=u.length?p:-1;D.navigate({currentNode:l,selectedIndex:x})};import{Box as rn,Text as dd}from"ink";import Re from"react";var Yo=({selectedIndex:e,parent:t,selected:n})=>{let{currentNode:r}=xe(),{title:o}=t,i=b(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 Re.createElement(rn,{alignItems:"center",paddingTop:1},Re.createElement(rn,{minWidth:12},Re.createElement(le,{isSelected:n}),Re.createElement(dd,{color:n?M.accent:M.secondary2},o,":")),Re.createElement(rn,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((d,l)=>{let u=r.id===t.id&&l===e;return Re.createElement(rn,{key:`${o}-${d}`,paddingRight:2,minHeight:1},Re.createElement(le,{isSelected:u}),o==="Assignees"?Re.createElement(en,{isSelected:u,id:d}):o==="Tags"?Re.createElement(tn,{isSelected:u,id:d}):null)})))};import{Box as on,Text as or}from"ink";import Ae,{useEffect as cd}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/):[];cd(()=>{let h=[];return m.forEach((C,R)=>{let S=Ce(BigInt(R+1));if(!ct(S))return;let E=J.text({id:`${e}-${R}`,name:`Line ${R+1}`,parentNodeId:e,rank:S.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 Ae.createElement(on,{key:`${e}-${C}`},Ae.createElement(or,{color:R?M.primary:M.secondary2,dimColor:!R},`${C+1} `.padStart(5,"\xA0")),Ae.createElement(or,{backgroundColor:R?"gray":""},u(h.length?Dt(h,i-10):p)))});return Ae.createElement(on,{flexDirection:"column",paddingTop:1},Ae.createElement(on,null,Ae.createElement(le,{isSelected:o}),Ae.createElement(or,{color:o?M.accent:M.secondary2},t)),Ae.createElement(on,{flexDirection:"row",borderStyle:"round",borderColor:M.secondary,paddingLeft:1,paddingRight:1,marginLeft:1},Ae.createElement(Qt,{scrollByOne:!0,children:x,height:r-2,selectedIndex:d,itemHeight:1})))};var ud=e=>`${e}::log`,Jo=e=>e==="Assignees"||e==="Tags",Zo=({ticket:e,height:t})=>{let{selectedIndex:n,currentNode:r}=xe(),o=process.stdout.columns||120,i=Xo(()=>ud(e.id),[e.id]),d=Xo(()=>[...e.log].reverse().map(Vo).join(`
6
- `),[e.log]);ar(()=>{if(N.getNode(i))return;let A=Ce(We);if(a(A))return;let K={...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(K),()=>{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||D.navigate({selectedIndex:0}))},[u,n]);let m=b(e.id);if(u){let E=N.getNode(i),K=t-3;return Ue.createElement(sr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},E?Ue.createElement(ir,{id:E.id,label:"Event log",text:E.props.value??"",selected:!1,maxWidth:o,height:K}):null)}let p=m.reduce((E,A)=>Jo(A.title)||A.id===i?E+1:E,0),x=2,h=p*1,R=t-3-h-x,S=(E,A)=>Jo(E.title)?Ue.createElement(Yo,{key:E.id,parent:E,selected:A,selectedIndex:n}):E.id===i?Ue.createElement(sr,{key:E.id,paddingTop:1},Ue.createElement(le,{isSelected:A}),Ue.createElement(ld,{backgroundColor:M.secondary,color:A?M.accent:M.primary}," History \u203A\u203A ")):E.title===G.DESCRIPTION?Ue.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 Ue.createElement(sr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},m.map((E,A)=>S(E,l&&n===A)))};var pd=({swimlanes:e,currentNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:i,height:d,width:l})=>{let u=t.context,m=u===P.TICKET||u===P.FIELD_LIST||u===P.FIELD,p=u===P.BOARD||u===P.SWIMLANE,x=u===P.TICKET?t:r.find(E=>E.context===P.TICKET),h=Math.floor(l/3),C=Math.floor(l/Math.max(e.length,1)),R=Math.min(C,h),S=i==="dense";return sn.createElement(md,{flexDirection:"row",height:d},p&&e.map((E,A)=>{let K=t.id===E.id,Te=K?n:-1,ie=t.context===P.BOARD&&n===A;return sn.createElement(Ko,{key:E.id,height:d,width:R,swimlane:E,isSelected:ie,isDense:S,isFocused:K,listSelectedIndex:Te,mode:o})}),m&&x&&sn.createElement(Zo,{height:d,ticket:x}))},Qo=sn.memo(pd);import{render as vd}from"ink";import{Writable as yd}from"node:stream";var Ct=e=>String(e).padStart(2,"0"),xd=e=>{let t=e.getUTCFullYear(),n=Ct(e.getUTCMonth()+1),r=Ct(e.getUTCDate()),o=Ct(e.getUTCHours()),i=Ct(e.getUTCMinutes()),d=Ct(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${i}-${d}`},Nd=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",hd=async(e,{width:t,height:n})=>{let r="",o=new yd({write(d,l,u){let m=Id(d.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),u()}});o.columns=t,o.rows=n,o.isTTY=!0;let i=vd(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(d=>setTimeout(d,0)),i.unmount(),r},Id=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),ti=async()=>{let{viewMode:e}=_(),{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 hd(fd.createElement(Qo,{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=xd(x),C=`board_${Nd(d.title)}_${h}.md`,R=jr(p.value);ei.mkdirSync(R,{recursive:!0});let S=gd.join(R,C),E=`# Board - ${d.title}
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
7
  Date: ${x.toISOString()}
8
8
 
9
9
  \`\`\`text
10
10
  ${m}
11
11
  \`\`\`
12
- `;return ei.writeFileSync(S,E,"utf8"),c("Exported board layout",S)};var ri=()=>{let{currentNode:e,selectedIndex:t}=f(),n=b(e.id)[t];return{currentNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:n?.parentNodeId??null,selectedIndex:t}},ni=(e,t)=>Math.max(0,Math.min(e,Math.max(0,t-1))),oi=e=>{let{nodes:t}=f(),n=t[e.currentNodeId];if(n&&!n.isDeleted&&e.selectedNodeId){let i=b(n.id).findIndex(d=>d.id===e.selectedNodeId);if(i>=0)return D.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=b(i.id).findIndex(l=>l.id===o.id);if(d>=0)return D.navigate({currentNode:i,selectedIndex:d}),c("Restored navigation to moved node",null)}}}if(n&&!n.isDeleted){let o=b(n.id);return D.navigate({currentNode:n,selectedIndex:ni(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=b(o.id);return D.navigate({currentNode:o,selectedIndex:ni(e.selectedIndex,i.length)}),c("Restored navigation to parent",null)}}let r=t[f().rootNodeId];return!r||r.isDeleted?s("Unable to restore navigation"):(D.navigate({currentNode:r,selectedIndex:0}),c("Restored navigation to root",null))};import Td from"node:os";import di from"node:path";import{z as Ve}from"zod";import{accessSync as Ed,copyFileSync as Cd,existsSync as an,mkdirSync as ii,readdirSync as si,readFileSync as bd,renameSync as Sd,rmSync as Rd,statSync as ai,unlinkSync as Ad,writeFileSync as wd}from"node:fs";import ot from"node:path";var ae={writeToFile:(e,t)=>{try{let n=ot.dirname(e);an(n)||ii(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);wd(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return bd(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)&&ai(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Ed(e),!0}catch{return!1}},mkDir:e=>ii(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)&&ai(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=si(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)?si(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{Ad(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Rd(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{Sd(e,t)}catch(r){if(r?.code==="EXDEV"){Cd(e,t),this.rmFile(e);return}throw r}}};var Md={userId:"",userName:"",preferredEditor:"",autoSync:!1},ci=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()}),Pd="config.json",li=()=>di.join(Td.homedir(),de),dr=()=>di.join(li(),Pd),cr=()=>{try{return ae.mkDir(li()),c(`Ensured ~/${de} exists`,null)}catch{return s(`Unable to create ~/${de}`)}},kd=e=>{let t;try{t=JSON.parse(e)}catch{return s(`Invalid ~/${de}/config.json JSON`)}let n=ci.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(", ")}`)},ui=()=>{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}):kd(n)},mi=e=>{let t=cr();if(a(t))return s(t.message);let n=ci.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=ui();if(a(t))return s("Failed to read existing config");let n={...t.value,...e};return mi(n)},pi=()=>{let e=dr(),t=cr();if(a(t))return s(`Unable to create ~/${de}`);if(!(ae.readFile(e)!==null)){let m=mi(Md);if(a(m))throw new Error(`Unable to create ~/${de}/config.json`)}let r=ui();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 Fd,ulid as dn}from"ulid";var cn=Fd(),ln=({name:e,parent:t,rank:n,user:{userId:r,userName:o}})=>{let i=cn(),d=cn(),l=cn(),u=cn(),m=ao();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}}])};import{monotonicFactory as Dd,ulid as we}from"ulid";var bt=Dd();function Ld(){let e=Object.values(f().nodes).find(r=>r.context==="WORKSPACE");if(!e)throw new Error("No workspace found in event log");let[t]=b(e.id),[n]=t?b(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 Od(){let e=Ld();D.navigate(e)}function gi({userId:e,userName:t}){let n=bt(),r=bt(),o=bt(),i=bt(),d=bt(),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:we(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:l.value}},{id:we(),userId:e,userName:t,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:u.value}},{id:we(),userId:e,userName:t,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:p.value}},{id:we(),userId:e,userName:t,action:"add.swimlane",payload:{id:i,name:"In progress",parent:r,rank:x.value}},{id:we(),userId:e,userName:t,action:"add.swimlane",payload:{id:d,name:"Done",parent:r,rank:h.value}},{id:we(),userId:e,userName:t,action:"add.board",payload:{id:qt,name:"Closed",parent:n,rank:m.value}},{id:we(),userId:e,userName:t,action:"add.swimlane",payload:{id:te,name:"Closed",parent:qt,rank:C.value}},{id:we(),userId:e,userName:t,action:"lock.node",payload:{id:qt}},{id:we(),userId:e,userName:t,action:"lock.node",payload:{id:te}}])}function un({hasProject:e,eventLog:t}){if(!e){let o=J.workspace("temporary-uninitialized-workspace","Workspace","a0"),i=xt(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=yt(t).filter(a);return r.length>0?s(`Materializing failed:
14
- ${r.map(o=>o.message).join(`
15
- `)}`):(Od(),I({hasProject:!0}),c("State booted successfully",null))}var fi=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 xi}from"ulid";import{spawnSync as Ud}from"node:child_process";import Bd from"node:os";import vi from"node:path";import{ulid as _d}from"ulid";function $d(){let{preferredEditor:e}=_(),t=[e,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function Wd(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function yi(e){let t=vi.join(Bd.tmpdir(),"epiq");ae.mkDir(t);let n=vi.join(t,_d());ae.writeToFile(n,e??"");let r=$d();for(let o of r){let i=Wd(o,n),d=Ud(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 Ni=()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let{breadCrumb:t,selectedNode:n}=f(),r=Oe([...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=b(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=yi(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?W({id:xi(),action:"edit.description",payload:{id:i.id,md:u},...e.value}):i.title==="Title"?W({id:xi(),action:"edit.title",payload:{id:i.id,name:u},...e.value}):s(`Editing not supported for "${i.title}"`)};import ic from"node:fs";import zi from"node:path";import ur from"node:fs";import Kd from"node:path";import St from"fs";import Ii from"path";import jd from"util";var hi=1e3,Ei=()=>{let e=process.cwd(),t=fe(e);if(!a(t))return Ii.join(t.value,Ie,"log","epiq.log")};function Hd(){if(!Pn)return;let e=Ei();if(e===void 0||!St.existsSync(e))return;let n=St.readFileSync(e,"utf8").split(`
16
- `);if(n[n.length-1]===""&&n.pop(),n.length<=hi)return;let r=n.slice(-hi).join(`
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(`
17
15
  `)+`
18
- `;St.writeFileSync(e,r,"utf8")}function lr(e,t,n=!1){if(!Pn)return;let r=Ei();if(!r)return;let o=jd.format(...t),i=new Date,l=`[${n?i.toISOString().slice(11,19):i.toISOString()}] ${e} ${o}
19
- `;St.mkdirSync(Ii.dirname(r),{recursive:!0}),St.appendFileSync(r,l,"utf8"),Hd()}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 Ci=async e=>{let t=Kd.join(e,".gitignore"),n=ur.existsSync(t)?ur.readFileSync(t,"utf8"):"",r=[".epiq/events/",".epiq/log/"],o=n.split(`
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(`
20
18
  `).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(`
21
19
  `);return n=n.trimEnd()+`
22
20
 
23
21
  ${l}
24
- `,ur.writeFileSync(t,n,"utf8"),oe.info(`Added ${i.join(", ")} to .gitignore (epiq local state)`),c("Local epiq paths ignored",!0)};import{spawn as zd}from"node:child_process";import gr from"node:fs";import Li from"node:path";import Rt from"node:fs";import qd 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 bi="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Si=e=>ve.join(Ie,Ot,e),Ri=()=>ve.join(qd.homedir(),de),mn=()=>ve.join(Ri(),"worktrees"),Ai=({repoRoot:e})=>{let t=to(e);return a(t)?s(t.message):c("Resolved state branch root",ve.join(mn(),t.value))},Vd=e=>ve.join(e,Ie),Ge=e=>ve.join(Vd(e),Ot),pr=({root:e,fileName:t})=>ve.join(Ge(e),t),At=e=>{try{return Rt.mkdirSync(e,{recursive:!0}),c("Ensured directory",void 0)}catch(t){return s(t instanceof Error?t.message:String(t))}},pn=()=>{let e=At(Ri());if(a(e))return s(`Ensure epiq home failed.
25
- `+e.message);let t=At(mn());return a(t)?s(`Ensure worktrees dir failed.
26
- `+t.message):c("Ensured epiq storage",!0)},wi=e=>{Rt.existsSync(e)&&(oe.debug("[sync] remove path",e),Rt.rmSync(e,{recursive:!0,force:!0}))},Ti=e=>{let t=Ge(e);if(!Rt.existsSync(t))return c("Events dir missing",[]);let n=Rt.readdirSync(t,{withFileTypes:!0}).filter(r=>r.isFile()).map(r=>r.name).filter(r=>r.endsWith(".jsonl")).sort();return c("Listed event files",n)},Mi=(e,t)=>{for(let n of[Ge(e),Ge(t)]){let r=At(n);if(a(r))return s(r.message)}return c("Ensured state branch",void 0)},Pi=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
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
27
25
  `+t.message);let r=t.value.stdout.trim().split(`
28
- `).filter(Boolean).filter(d=>d!==Ie);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
29
- ${o.message}`);let i=await it({cwd:e,message:"[epiq:repair-storage-branch]"});return a(i)?s(i.message):c("Cleaned storage branch",!0)},gn=mr(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=>ve.resolve(e)),ki=mr(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=ve.isAbsolute(n)?n:ve.join(e,n);return c("Resolved git dir",r)},e=>ve.resolve(e));var st=e=>{let t=Pe(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 Fi=15e3,Gd={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo"},Oi=({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=zd("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:Gd}),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 ${Fi}ms`].join(`
30
- `);u(n?{stdout:d,stderr:p,exitCode:124}:s(p))},Fi);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(`
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(`
31
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(`
32
- `)));return}u(c("Git command succeeded",{stdout:d,stderr:l,exitCode:x}))})}),L=({args:e,cwd:t})=>Oi({args:e,cwd:t,allowFail:!1}),at=({args:e,cwd:t})=>Oi({args:e,cwd:t,allowFail:!0}),it=async({cwd:e,message:t})=>{let n=await H.commit({cwd:e,message:t});if(a(n))return s(`Failed to create commit
33
- ${n.message}`);let r=await L({args:["rev-parse","HEAD"],cwd:e});return a(r)?s(`Commit created, but failed to read HEAD SHA
34
- ${r.message}`):c("Created commit and resolved SHA",r.value.stdout.trim())},wt=async e=>{let t=await ki(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(Li.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)},fn=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)},vn=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}`)},Di=e=>{try{return gr.realpathSync.native(e)}catch{return Li.resolve(e)}},Ui=async({repoRoot:e,worktreeRoot:t})=>{let n=await L({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return s(n.message);let r=Di(t),o=n.value.stdout.split(`
35
- `).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(Di).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)},yn=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())},Bi=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())},_i=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 fn({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 H.fetch({cwd:e,remote:ue,branch:t});if(a(r))return s(`Failed to fetch ${t}
36
- ${r.message}`);let o=await H.pullRebase({cwd:e,remote:ue,branch:t});return a(o)?s(`Failed during pull --rebase
37
- ${o.message}`):c("Pulled with rebase",!0)},$i=async e=>{let t=await L({args:["status","--porcelain"],cwd:e});return a(t)?s(t.message):c("Checked state branch changes",t.value.stdout.trim().length>0)},Wi=async e=>{let t=await yn(e);return a(t)?s(t.message):c("Checked detached HEAD state",t.value==="HEAD")};var H={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})};import dt from"node:fs";import Tt from"node:path";var Hi=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 H.commit({cwd:e,message:"Initial commit",allowEmpty:!0});return a(n)?s(n.message):c("Created initial commit",!0)},ji=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",Yd=async e=>{let t=await yn(e);if(a(t))return s(t.message);let n=await Bi(e);if(a(n))return s(n.message);let r=`[epiq:sync:${ji(t.value)}:${ji(n.value)}]`;return c("Built sync commit message",r)},xn=async({repoRoot:e,stateBranchName:t})=>{oe.info(`Creating ${t}`);let n=await L({args:["commit-tree",bi,"-m","[epiq:init-state-branch]"],cwd:e});if(a(n))return s(`Failed to create state branch commit
38
- ${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}
39
- ${o.message}`):c("Created state branch",!0)},Xd=async({repoRoot:e,stateBranchName:t})=>{let n=await vn({repoRoot:e,branch:t});if(a(n))return s(`Ensure local state branch failed
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
40
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
41
- `+r.message);if(!r.value)return xn({repoRoot:e,stateBranchName:t});let o=await fn({repoRoot:e,branch:t});if(a(o))return s(`Ensure local state branch failed
42
- `+o.message);if(!o.value)return xn({repoRoot:e,stateBranchName:t});let i=await H.fetch({cwd:e,remote:ue,branch:t});if(a(i))return s(`Failed to fetch ${t} from remote
43
- ${i.message}`);let d=await L({args:["branch","--track",t,`${ue}/${t}`],cwd:e});return a(d)?s(`Failed to create local ${t} from remote
44
- ${d.message}`):c("Created local state branch from remote",!0)},Jd=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(`
45
- `),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)},Zd=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=At(Tt.dirname(t));if(a(r))return s(`Failed to create state branch worktree
46
- `+r.message);dt.existsSync(t)&&!dt.existsSync(Tt.join(t,".git"))&&(oe.info("Removing broken state branch worktree path"),wi(t)),oe.info("Creating state branch worktree");let o=await H.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return a(o)?s(`Failed to create state branch worktree
47
- ${o.message}`):c("Created state branch worktree",!0)},xr=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await Jd({repoRoot:e,branch:n});if(a(r))return s(r.message);let o=Tt.resolve(t),i=r.value?Tt.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 H.worktreeRemove({cwd:e,worktreeRoot:i});if(a(u))return s(`Failed to remove existing state branch worktree
48
- ${u.message}`)}if(i&&!dt.existsSync(i)){oe.info("Pruning stale state branch worktree");let u=await H.worktreePrune({cwd:e});if(a(u))return s(`Failed to prune stale worktrees
49
- ${u.message}`)}let d=await Ui({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 H.worktreePrune({cwd:e});if(a(u))return s(`Failed to prune stale worktrees
50
- ${u.message}`)}return Zd({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},Qd=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await yn(e);if(a(n))return s(n.message);if(n.value===t)return c("State branch already checked out",!1);let r=await H.checkout({cwd:e,branch:t});return a(r)?s(`Failed to checkout ${t}
51
- ${r.message}`):c("Checked out state branch",!0)},ec=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 fn({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 H.fetch({cwd:t,remote:ue,branch:i});if(a(l))return s(`Failed to fetch ${i}
52
- ${l.message}`);let u=await H.setUpstream({cwd:t,branch:i,upstream:`${ue}/${i}`});return a(u)?s(`Failed to set state branch upstream
53
- ${u.message}`):c("Configured state branch upstream",!0)},Nn=async({stateBranchRoot:e,eventFileName:t})=>{let n=Si(t),r=Tt.join(e,n);if(!dt.existsSync(r))return c("No event file to stage",void 0);let o=await H.stage({cwd:e,pathspec:[n]});return a(o)?s(`Failed to stage state branch event file
54
- ${o.message}`):c("Staged state branch event file",void 0)},Ki=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Yd(e);return a(n)?s(`Create state branch sync commit failed
55
- `+n.message):it({cwd:t,message:n.value})},Mt=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 H.push({cwd:t}):await H.push({cwd:t,remote:ue,branch:o,setUpstream:!0});return a(i)?s(`Failed during state branch push
56
- ${i.message}`):c("Pushed state branch",!0)},qi=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=st(e);if(a(o))return o;let i=o.value,d=[pn(),await Xd({repoRoot:e,stateBranchName:i}),await xr({repoRoot:e,stateBranchRoot:t,stateBranchName:i}),await Qd({stateBranchRoot:t,stateBranchName:i}),await Pi(t),n?await ec({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 hn from"node:fs";import hr from"node:path";import{decodeTime as tc}from"ulid";var Nr=e=>{let[t,n]=e.id;return`${t}:${n??""}`},Vi=e=>{let[t]=e.id;return tc(t)},nc=e=>{let{userId:t,userName:n,...r}=e;return r},rc=e=>e.length===0?"":e.map(t=>JSON.stringify(nc(t))).join(`
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(`
57
55
  `)+`
58
- `,oc=(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=Vi(r)-Vi(o);return i!==0?i:Nr(r).localeCompare(Nr(o))})},Ir=({sourceFile:e,targetFile:t})=>{let n=$t(e);if(a(n))return s(n.message);let r=$t(t);if(a(r))return s(r.message);let o=oc(r.value,n.value),i=rc(o);return(hn.existsSync(t)?hn.readFileSync(t,"utf8"):"")===i?c("Event file already merged",!1):(hn.mkdirSync(hr.dirname(t),{recursive:!0}),hn.writeFileSync(t,i,"utf8"),c("Merged event file",!0))},In=({repoRoot:e,stateBranchRoot:t})=>{let n=Ti(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)};var sc=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)},j=(e,t)=>s(`[${e}] ${t}`),Gi=async()=>{let e=eo(),t=await gn(process.cwd());if(a(t))return j(1,t.message);let n=t.value,r=await wt(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 sc(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(kn(n))return j(4,"Epiq project already initialized");let i=Kt();if(!i.isSetupDone||!i.userName)return j(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let d=_(),l=d.userName,u=d.userId;if(!u||!l)return j(5,"Missing Epiq user id");let m=e.stateBranch,p=await vn({repoRoot:n,branch:m});if(a(p))return j(6,p.message);let x=await xn({repoRoot:n,stateBranchName:e.stateBranch});if(a(x))return j(6,x.message);let h=pn();if(a(h))return j(7,h.message);let C=zi.join(mn(),e.projectId),R=await xr({repoRoot:n,stateBranchRoot:C,stateBranchName:e.stateBranch});if(a(R))return j(8,R.message);let S=zi.join(C,".epiq");ic.mkdirSync(S,{recursive:!0});let E=gi({userId:u,userName:l});if(a(E))return j(9,E.message);for(let Tn of E.value){let Dr=jt({event:Tn,rootDir:C});if(a(Dr))return j(9,Dr.message)}let A=await Nn({stateBranchRoot:C,eventFileName:Ee({userId:u,userName:l})});if(a(A))return j(10,A.message);let K=await it({cwd:C,message:"[epiq:init]"});if(a(K))return j(10,K.message);let Te=await Ci(n);if(a(Te))return j(12,Te.message);let ie=no({repoRoot:n,fileContents:e});if(a(ie))return j(13,ie.message);let wr=await H.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(a(wr))return j(14,wr.message);let Tr=await H.commit({cwd:n,message:"[epiq:init-project]"});if(a(Tr))return j(14,Tr.message);let Mr=In({repoRoot:n,stateBranchRoot:C});if(a(Mr))return j(15,Mr.message);let wn="Project initialized!",Pr=await Mt({repoRoot:n,stateBranchRoot:C});a(Pr)&&(wn+=` Warn: [init:16] ${Pr.message}`);let kr=await H.push({cwd:n});a(kr)&&(wn+=` Warn: [init:17] ${kr.message}`);let Fr=Fe(E.value).filter(a);if(Fr.length>0)return j(18,Fr.map(Tn=>Tn.message).join(`
59
- `));let{rootNodeId:Ms,nodes:Ps}=f();return D.navigate({currentNode:Ps[Ms],selectedIndex:0}),I({hasProject:!0,mode:g.DEFAULT}),c(wn,null)};import{ulid as dc}from"ulid";import{ulid as ac}from"ulid";var Yi=null,Be=()=>structuredClone(Yi),Pt=e=>Yi=e,Xi=()=>{let{currentNode:e,selectedIndex:t}=f(),r=b(e.id)[t];return r?c("Resolved selected child",r):s("Target node not found")};var Ji=({id:e,parentId:t,position:n={at:"end"}})=>{let r=q();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:ac(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value}})},Zi=e=>{Pt(e);let t=vt(e,!0);return a(t)?t:c("Node moved successfully",t.value)};function Er(e){let t=Xi();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=Ji({id:t.value.id,parentId:l.id,position:{at:"end"}});return a(u)?u:Zi(u.value)}function Cr(e){let t=Xi();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=Ji({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:i.id}});return a(d)?d:Zi(d.value)}var Qi=()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let{modifier:t}=ee().commandMeta,n=()=>{let l=Be();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=b(p).findIndex(C=>C.id===u);return h===-1?s("Moved node not found among rendered children"):(D.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=b(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;Pt({id:dc(),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=Be();if(!l)return s("No pending move to confirm");let u=W(l);if(a(u))return u;let m=n();return a(m)?s(m.message):(Pt(null),c("Moved item",null))}return t==="cancel"?(Pt(null),I({mode:g.DEFAULT}),c("Cancelling move",null)):s("Invalid move modifier")};import cc from"zod";var es=()=>{let e=ee().commandMeta.inputString,t=cc.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 ts=()=>{let e=ee().commandMeta.inputString.trim();if(e!=="yes"&&e!=="no")return s("Invalid response");let t=io(e),n=ze({autoSync:t});return a(n)?n:(ge({autoSync:t}),I({mode:g.DEFAULT}),c(`Auto sync set to "${e}"`,null))};var ns=e=>Object.values(f().tags).find(t=>t.name===e),rs=e=>Object.values(f().contributors).find(t=>t.name===e),os=[{systemOnly:!0,intent:w.Move,mode:g.COMMAND_LINE,action:Qi},{intent:w.Delete,mode:g.COMMAND_LINE,action:()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=f(),r=b(t.id)[n];return r?W({id:V(),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=q();if(a(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=f(),r=b(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=W({id:V(),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=q();if(a(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=f(),r=b(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=fi(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=W({id:V(),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:Gi},{intent:w.NewItem,mode:g.COMMAND_LINE,action:(e,t)=>{let n=q();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=W(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?(D.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=De(u.id,n.value);return a(m)?m:d({id:V(),action:"add.board",payload:{id:V(),name:t.inputString,parent:u.id,rank:m.value},...n.value})}if(t.modifier==="swimlane"){let l=Oe(r,"BOARD");if(a(l))return s("Unable to add swimlane in this context");let u=De(l.value.id,n.value);return a(u)?u:d({id:V(),action:"add.swimlane",payload:{id:V(),name:t.inputString,parent:l.value.id,rank:u.value},...n.value})}if(t.modifier==="issue"){let l=b(o.id)[i],u=o.context==="SWIMLANE"?o:o.context==="BOARD"&&l?.context==="SWIMLANE"?l:(()=>{let E=Oe(r,"SWIMLANE");return a(E)?null:E.value})();if(!u)return s("Unable to add issue in this context");let m=De(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=Fe(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 S=x.find(E=>E.action==="add.issue")?.payload.id;return S?(D.navigate({currentNode:u,selectedIndex:N.getSiblings(u.id).findIndex(({id:E})=>E===S)}),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=q();if(a(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=f(),r=b(t.id)[n];if(!r)return s("Missing node");if(r.readonly)return s("Cannot rename readonly node");let o=Oo();return o?W({id:V(),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=q();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=ns(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=b(u.id).find(p=>p.props?.value===o.id);return m?W({id:V(),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=q();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=b(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=ns(r),p;if(m)p=m.id;else{let R=V(),S=W({id:V(),action:"create.tag",payload:{id:R,name:r},userId:e.value.userId,userName:e.value.userName});if(a(S))return S;p=S.value.result.id}let x=N.getFieldByTitle(u.id,"Tags");if(!x)return s("Unable to locate tags field");if(b(x.id).some(R=>R.props?.value===p))return s("Already tagged with that tag");let C=De(x.id,e.value);return a(C)?C:W({id:V(),action:"tag.issue",payload:{id:V(),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=q();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=b(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=rs(r),p;if(m)p=m.id;else{let R=V(),S=W({id:V(),action:"create.contributor",payload:{id:R,name:r},userId:e.value.userId,userName:e.value.userName});if(a(S))return S;p=S.value.result.id}let x=N.getFieldByTitle(u.id,"Assignees");if(!x)return s("Unable to locate assignees field");if(b(x.id).some(R=>R.props?.value===p))return s("Assignee already assigned");let C=De(x.id,e.value);return a(C)?C:W({id:V(),action:"assign.issue",payload:{id:V(),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=q();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=rs(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=b(u.id).find(p=>p.props?.value===o.id);return m?W({id:V(),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:async()=>{if(f().syncStatus.status==="syncing")return s("Sync already in progress");let e=ri();U(()=>""),I({syncStatus:{msg:"Syncing",status:"syncing"}});let{userId:t,userName:n}=_();if(!t)return s("Unable to resolve userId");if(!n)return s("Unable to resolve userName");let r=q();if(a(r)||!r.value)return s("Unable to resolve event log path");let o=Ee(r.value),i=await Ze({ownEventFileName:o});if(a(i))return I({syncStatus:{msg:i.message,status:"outOfSync"}}),s(`Unable to sync state. ${i.message}`);let d=Pe(process.cwd());if(a(d))return d;let l=mt(d.value);if(a(l))return s(`Unable to load events. ${l.message}`);let u=un({eventLog:l.value,hasProject:!0});if(a(u))return s(`Unable to boot synced state. ${u.message}`);I({hasProject:!0,syncStatus:{msg:"Synced",status:"synced"},mode:g.DEFAULT});let m=oi(e);return a(m)?m:c("Synced",!0)}},{intent:w.Peek,mode:g.COMMAND_LINE,action:async()=>{let e=Oe(f().breadCrumb,"BOARD");if(a(e))return e;let t=fe(process.cwd());if(a(t))throw new Error(t.message);let n=mt(t.value);if(a(n))return s(n.message);let r=n.value,{modifier:o}=ee().commandMeta,i;if(o==="now"){let h=br();if(a(h))return h;let C=yt(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}=Vr(r,i),m=br();if(a(m))return m;let p=yt(l);if(p.some(a))return s(p.map(h=>h.message).join(", "));let x=f().nodes[d];return x?(D.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 ti();return a(e)?e:(I({mode:g.DEFAULT}),c("Export successful",!0))}},{intent:w.Exit,mode:g.COMMAND_LINE,action:async()=>(D.exit(),c("Exit successful",!0))},{intent:w.Edit,mode:g.COMMAND_LINE,action:(e,t)=>{if(t.modifier===Le.DESCRIPTION)return Ni();if(t.modifier===Le.TITLE){let n=q();if(a(n))return s("Unable to resolve user ID");let{currentNode:r,selectedIndex:o}=f(),i=b(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?W({id:V(),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}=_(),d=n||i,l=r??V();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 ts();case Y.SYNC_DEBOUNCE_MS:return es();default:return s("Unknown config command")}}}];var lc=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=Uo(t);ko();let{readOnly:d}=f();if(d&&!lc.has(i))return It({status:Me.Fail,message:"Command not available in readonly state",value:null});let l=os.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===i);if(!l)return It({status:Me.Fail,message:"Command not found",value:null});let u;try{u=await l.action(l,{command:t,inputString:o,modifier:r})}catch(m){return It({status:Me.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return a(u)?It(u):(Fo({addToHistory:!e}),l.onSuccess?.(),_().autoSync&&Qr(),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:()=>Be()?(I({mode:g.COMMAND_LINE}),U(()=>"move previous"),me({isForceExecutedBySystem:!0})):s("No pending move")},{intent:T.MoveNextItem,mode:g.MOVE,action:()=>Be()?(I({mode:g.COMMAND_LINE}),U(()=>"move next"),me({isForceExecutedBySystem:!0})):s("No pending move")}],is=[{intent:T.MoveToNextContainer,mode:g.MOVE,action:()=>Be()?(I({mode:g.COMMAND_LINE}),U(()=>"move to-next"),me({isForceExecutedBySystem:!0})):s("No pending move")},{intent:T.MoveToPreviousContainer,mode:g.MOVE,action:()=>Be()?(I({mode:g.COMMAND_LINE}),U(()=>"move to-previous"),me({isForceExecutedBySystem:!0})):s("No pending move")}];var ss={[P.WORKSPACE]:[...En,...Cn],[P.BOARD]:[...En,...Cn],[P.SWIMLANE]:[...En,...Cn,...is],[P.TICKET]:[],[P.FIELD]:[],[P.FIELD_LIST]:[],[P.TEXT]:[]};var as=[{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 D.enterChildNode(),c("Entering context",null)}},{intent:T.Exit,mode:g.DEFAULT,description:"[q] exit context",action:()=>(D.enterParentNode(),c("Exiting context",null))},{intent:T.NavPreviousItem,mode:g.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(D.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:T.NavNextItem,mode:g.DEFAULT,action:()=>(D.navigateToNextItem(),c("Navigating to next item",null))},{intent:T.NavToPreviousContainer,mode:g.DEFAULT,action:()=>(D.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:T.NavToNextContainer,mode:g.DEFAULT,action:()=>(D.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 uc=500,mc=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),ds=e=>{let t=mc(e);t&&U(n=>(n+t).slice(0,uc))};var cs=[{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})=>(ds(t??""),c("Capturing input",null))},{intent:T.EraseInput,mode:g.COMMAND_LINE,action:()=>(Mo(),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:()=>(Do(),c("Getting last command from history",null))},{intent:T.GetNextCommandFromHistory,mode:g.COMMAND_LINE,action:()=>(Lo(),c("Getting next command from history",null))}];import pc from"chalk";var bn=": for command line",ls="q to exit",us=`${pc.hex(M.accent)("m")} to confirm`,Sr={[P.WORKSPACE]:[bn],[P.BOARD]:[bn],[P.BOARD+g.COMMAND_LINE]:[bn],[P.SWIMLANE]:[bn],[P.TICKET+g.HELP]:[ls],[P.SWIMLANE+g.HELP]:[ls],[P.TICKET]:[],[P.FIELD]:[],[P.SWIMLANE+g.MOVE]:[us],[P.TICKET+g.MOVE]:[us]};var Sn=e=>e.trim().toLocaleLowerCase(),gc=(e,t)=>{let n=N.getFieldByTitle(e,t);if(!n)return"";let r=n.props?.value;return typeof r=="string"?r:""},fc=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):[]},vc=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):[]},ms=(e,t)=>{let n=t.value;if(!n)return!0;switch(t.target){case"title":return Sn(e.title??"").includes(n);case"description":return Sn(gc(e.id,G.DESCRIPTION)).includes(n);case"tag":return fc(e.id).map(Sn).some(l=>l.includes(n));case"assignee":return vc(e.id).map(Sn).some(l=>l.includes(n));default:return!0}};function ps(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 gs=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,fs=()=>{for(let e of Ar)e()},xc=e=>(Ar.add(e),()=>Ar.delete(e));function vs(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=ps(t,o,r);if(a(u))return logger.error(u.message),u;let m=u.value,{context:p}=l,x=Sr[p+n]??Sr[p]??[],h=[...as,...ss[p]??[],...cs],C=gs(h),R=Nc(o,i),S=R[t]?.[e.selectedIndex]??null;return c("Derived successfully",{...e,currentNode:l,breadCrumb:m,availableHints:x,availableActions:h,actionIndex:C,selectedNode:S,renderedChildrenIndex:R})}var f=()=>(Rn||logger.error("State not initialized. Call initWorkspaceState() first.",new Error().stack),Rn);function xt(e){Rr=e;let t=Pe(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=vs(r);return a(o)?o:(Rn=o.value,fs(),c("State initialized",null))}function ce(e){let t=f(),n=e(t),r=vs(n);return a(r)?s(r.message??"Unable to update state"):(Rn=r.value,fs(),c("State updated",null))}var I=e=>ce(t=>({...t,...e}));var xe=()=>yc(xc,f,f),Nc=(e,t)=>{let n={};for(let r of Object.values(e))ne(r)&&t.length>0&&!t.every(o=>ms(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},b=e=>f()?.renderedChildrenIndex[e]??[],br=()=>Rr?xt(Rr):s("Cannot reset state: no initial workspace found");var ys=(e="Syncing...")=>{I({syncStatus:{status:"syncing",msg:e}})},xs=(e="Synced")=>{I({syncStatus:{status:"synced",msg:e}})},hc=e=>{I({syncStatus:{status:"outOfSync",msg:e}})},pe=e=>(hc(e),s(e));var Ec=({repoRoot:e,stateBranchRoot:t,ownEventFileName:n})=>{let r=pr({root:e,fileName:n}),o=pr({root:t,fileName:n});return Ic.existsSync(r)?Ir({sourceFile:r,targetFile:o}):c("Local own event file missing, nothing to merge",!1)},Cc=async({cwd:e,ensureUpstream:t})=>{let n=await gn(e);if(a(n))return s(n.message);let r=n.value,o=Ai({repoRoot:r});if(a(o))return s(o.message);let i=o.value,d=await wt(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 Hi(r);if(a(l))return s(l.message);let u=await qi({repoRoot:r,stateBranchRoot:i,ensureUpstream:t});if(a(u))return s(u.message);let m=await wt(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=Mi(r,i);return a(p)?s(p.message):c("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:i,bootstrapped:u.value})},Ns=async({repoRoot:e,stateBranchRoot:t,ownEventFileName:n})=>{let r=Ec({repoRoot:e,stateBranchRoot:t,ownEventFileName:n});if(a(r))return s(r.message);let o=await $i(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 Nn({stateBranchRoot:t,eventFileName:n});if(a(i))return s(i.message);let d=await Ki({repoRoot:e,stateBranchRoot:t});return a(d)?s(d.message):c("Merged, staged, and committed own event file",{createdCommit:!0,commitSha:d.value})},Ze=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");ys("Syncing");let n=await Cc({cwd:e,ensureUpstream:!0});if(a(n))return pe(n.message);let{repoRoot:r,stateBranchRoot:o,bootstrapped:i}=n.value,d=await Wi(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 S=In({repoRoot:r,stateBranchRoot:o});if(a(S))return pe(S.message);x=S.value;let E=await Ns({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 Mt({stateBranchRoot:o,repoRoot:r}),K=A;if(a(A)&&_i(A.message)){let Te=await yr({cwd:o,branch:C});if(a(Te))return pe(Te.message);let ie=await Ns({repoRoot:r,stateBranchRoot:o,ownEventFileName:t});if(a(ie))return pe(ie.message);ie.value.createdCommit&&(l=!0,u=ie.value.commitSha),K=await Mt({stateBranchRoot:o,repoRoot:r})}if(a(K))return pe(K.message);p=K.value,logger.debug("[sync] pushed to state branch",p)}else logger.debug("[sync] no commit created, skipped push");if(l){let A=await L({args:["rev-parse","HEAD"],cwd:o});if(a(A))return pe(A.message);u=A.value.stdout.trim()}return xs(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})};var Ye=e=>{let t=fe(e??process.cwd());if(a(t))return t;let n=mt(t.value);if(a(n))return s(n.message);let r=un({eventLog:n.value,hasProject:!0});return a(r)?s(r.message):c("Booted Epiq state",{root:t.value})},An=()=>{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")},Is=(e,t)=>{let r=b(e.id).find(o=>o.title===t);return r?b(r.id).map(o=>typeof o.props?.value=="string"?o.props.value:"").filter(o=>!!o):[]},bc=e=>Is(e,"Tags").map(t=>N.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name})),Sc=e=>Is(e,"Assignees").map(t=>N.getContributor(t)).filter(Boolean).map(t=>({id:t.id,name:t.name})),Es=(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)},Cs=(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)},bs=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:go(r,"Description"),parentId:r.parentNodeId,isClosed:r.parentNodeId===te,readonly:!!r.readonly,tags:bc(r),assignees:Sc(r)}));return c("Listed issues",n)},Ss=e=>{let t=Ye(e.repoRoot);if(a(t))return t;let n=An();if(a(n))return n;let r=De(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=Fe(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")},Rs=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:hs(),...n.value,action:"close.issue",payload:{id:e.issueId,parent:te,rank:r.value}},d=Fe([o]).find(a);return d?s(d.message):c("Closed issue",{id:e.issueId})},As=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:hs(),...n.value,action:"move.node",payload:{id:e.issueId,parent:e.parentId,rank:r.value}},d=Fe([o]).find(a);return d?s(d.message):c("Moved issue",{id:e.issueId,parentId:e.parentId})},ws=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 Ze({cwd:t.value,ownEventFileName:Ee(n.value)});return a(r)?r:c("Synced",r.value)},Ts=(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 _e=e=>({isError:a(e),content:[{type:"text",text:JSON.stringify(e,null,2)}]}),wc=()=>{let e=new Rc({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=>_e(await Ts(t))),e.registerTool("epiq_issue_list",{description:"List Epiq issues",inputSchema:F.object({repoRoot:F.string().optional(),includeClosed:F.boolean().optional()})},async t=>_e(await bs(t))),e.registerTool("epiq_board_list",{description:"List Epiq boards",inputSchema:F.object({repoRoot:F.string().optional()})},async t=>_e(await Es(t))),e.registerTool("epiq_swimlane_list",{description:"List Epiq swimlanes",inputSchema:F.object({repoRoot:F.string().optional(),boardId:F.string().optional()})},async t=>_e(await Cs(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=>_e(await Ss(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=>_e(await Rs(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=>_e(await As(t))),e.registerTool("epiq_sync",{description:"Sync Epiq state with the configured Git remote",inputSchema:F.object({repoRoot:F.string().optional()})},async t=>_e(await ws(t))),e},Tc=async()=>{let e=wc(),t=new Ac;await e.connect(t)};await Tc();export{wc as createMcpServer,_e as resultJson,Tc as startMcpServer};
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};