epiq 0.5.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/dist/index.js +57 -53
  2. package/dist/mcp.js +51 -48
  3. package/package.json +10 -11
  4. package/readme.md +44 -65
package/dist/index.js CHANGED
@@ -1,64 +1,68 @@
1
1
  #!/usr/bin/env node
2
- import ho from"chalk";import{render as cu}from"ink";import lu from"meow";import uu from"react";import{Box as dt}from"ink";import te from"react";import Tt from"node:fs";import{ulid as Ba}from"ulid";import{z as on}from"zod";var Ue={None:"none",Success:"success",Fail:"fail"},s=e=>({status:Ue.Fail,message:e,value:null}),l=(e,t)=>({status:Ue.Success,message:e,value:t}),d=e=>e.status==="fail",Ee=e=>e.status==="success";import At from"node:fs";import Te from"node:path";var ar=process.env.IS_LOCAL==="true",Me=".epiq",ve=".epiq-global",tn="events",La="project.json",Eo=e=>Te.join(e,Me),nn=e=>Te.join(e,Me),rn=e=>Te.join(nn(e),La),wt=e=>Te.join(nn(e),tn),Oa=e=>{let t=Te.join(e,Me);return At.existsSync(t)&&At.statSync(t).isDirectory()},dr=e=>{let t=rn(e);return At.existsSync(t)&&At.statSync(t).isFile()},$e=e=>{let t=Te.resolve(e);for(;;){if(Oa(t))return l("Resolved closest .epiq root",t);let n=Te.dirname(t);if(n===t)return s("No .epiq directory found in any parent");t=n}},be=e=>{let t=Te.resolve(e);for(;;){if(dr(t))return l("Resolved closest epiq project root",t);let n=Te.dirname(t);if(n===t)return s("No .epiq/project.json found in any parent");t=n}},Io=e=>{let t=wt(e);try{return At.mkdirSync(t,{recursive:!0}),l("Resolved events dir",t)}catch(n){return s(n instanceof Error?`Failed to ensure events dir: ${n.message}`:"Failed to ensure events dir")}};var Ua="_epiq/_evt",$a=on.object({projectId:on.string().min(1),stateBranch:on.string().min(1),createdAt:on.iso.datetime()}),bo=()=>({projectId:Ba(),stateBranch:Ua,createdAt:new Date().toISOString()}),We=e=>{let t=rn(e);if(!Tt.existsSync(t))return s("Missing .epiq/project.json");try{let n=Tt.readFileSync(t,"utf8"),r=JSON.parse(n),o=$a.safeParse(r);return o.success?l("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")}},So=e=>{let t=We(e);return d(t)?s(t.message):l("Read projectId",t.value.projectId)},Ro=({repoRoot:e,fileContents:t})=>{let n=nn(e),r=rn(e);try{if(Tt.mkdirSync(n,{recursive:!0}),Tt.existsSync(r)){let o=We(e);return d(o)?s(o.message):l("Project already initialized",null)}return Tt.writeFileSync(r,JSON.stringify(t,null,2)+`
3
- `,"utf8"),l("Created project.json",null)}catch(o){return s(o instanceof Error?`Failed to initialize project: ${o.message}`:"Failed to initialize project")}};var sn={autoSyncIntervalMs:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},L=()=>sn,pe=e=>(sn={...sn,...e},sn);var _e=()=>{let e=L(),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}},Ao=()=>{let e=be(process.cwd());if(d(e))return s("Unable to determine if repository is initialized");let t=We(e.value);return Ee(t)},wo=e=>e===!0?"yes":e===!1?"no":null,To=e=>e==="yes"?!0:e==="no"?!1:null;var f={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line"};var Se=(e,t)=>{let n=e.find(r=>r.context===t);return n!==void 0?l("Found node",n):s("Unable to find node in breadcrumb")};import{useSyncExternalStore as Sl}from"react";var P={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function cr(e){return e.context==="WORKSPACE"}function ye(e){return e.context==="TICKET"}function Mo(e){return e.context==="FIELD"}var lt=e=>e.context==="SWIMLANE",Po=e=>e.context==="BOARD";function an(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var dn=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",lr=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var ko=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},Do=(e,t)=>t?e.get(t)??[]:[];var Fo=new WeakMap,Wa=e=>{let t=Fo.get(e);return t||(t=ko(e),Fo.set(e,t)),t};var Lo=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return Do(Wa(e),r).filter(i=>an(r,i)>=n)};var _a={hint:"",hints:[],overlap:0,remainder:""},Oo=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return _a;let o=Lo({wordList:r,inputToMatch:e,overlapThreshold:1});return ja(t,o)},ja=(e,t)=>{let n=t[0]??"",r=an(e.toLowerCase(),n.toLowerCase()),[o,i]=n.split(":"),a=r<(o??"").length,c=!!i,p=(c&&a?o:n)+(c&&a?":":" "),g=p.slice(r);return{hint:p,hints:t,overlap:r,remainder:g}};import Ja from"node:fs";import Qa from"node:path";import{decodeTime as Za,monotonicFactory as ed}from"ulid";import{z as Pt}from"zod";import cn from"node:fs";import mr from"node:path";import{decodeTime as Ha}from"ulid";import{z as ur}from"zod";var Ka=ur.object({userId:ur.string().min(1).default("unknown"),userName:ur.string().min(1).default("unknown")}),Va=e=>{let[t,n]=mr.basename(e,".jsonl").split("."),r=Ka.safeParse({userId:t,userName:n});return r.success?l("Parsed event file actor",r.data):s(`Invalid event file name ${mr.basename(e)}: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},Ga=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"):l("Resolved persisted action",t[0])},qa=(e,t)=>t in e,za=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),Ya=e=>{let{userId:t,userName:n,...r}=e,o=Ga(r);if(d(o))return s(o.message);let i=o.value,a=e.id?.[0];return a?qa(r,i)?l("Decoded persisted event",za({id:a,action:i,payload:r[i],userId:t,userName:n})):s(`Persisted event is missing payload for action: ${i}`):s("Persisted event is missing id")},ln=e=>{if(!cn.existsSync(e))return l("Event file missing",[]);let t=Va(e);if(d(t))return s(t.message);let n=cn.readFileSync(e,"utf8"),r=[];for(let o of n.split(`
4
- `)){let i=o.trim();if(!i)continue;let a;try{a=JSON.parse(i)}catch{return s(`Failed to parse event JSON from ${e}: ${i}`)}let c=pr(a);if(d(c))return s(`${c.message} in ${e}: ${i}`);r.push({...c.value,userId:t.value.userId,userName:t.value.userName})}return l("Parsed persisted events file",r)};function Bo(e){let t=wt(e);if(!cn.existsSync(t))return l("No events found",[]);let n=cn.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>mr.join(t,o)),r=[];for(let o of n){let i=ln(o);if(d(i))return s(i.message);r.push(...i.value)}return l("All events loaded",Xa(r))}function Mt(e){let t=Bo(e);if(d(t))return s(t.message);let n=[];for(let r of t.value){let o=Ya(r);if(d(o))return s(`Failed to decode event ${r.id?.[0]??"<unknown>"}: ${o.message}`);n.push(o.value)}return l("Loaded merged events",n)}function Uo(e=process.cwd()){let t=Bo(e);return d(t)?s(t.message):l("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var Xa=e=>{let t=new Map,n=new Map;for(let m of e){let p=m.id[0],g=m.id[1]??null;t.set(p,m);let x=n.get(g)??[];x.push(m),n.set(g,x)}for(let m of n.values())m.sort((p,g)=>p.id[0].localeCompare(g.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 g=n.get(p)??[];for(let x of g)i(x)},a=n.get(null)??[];for(let m of a)i(m);let c=e.filter(m=>{let p=m.id[0],g=m.id[1]??null;return!o.has(p)&&g!==null&&!t.has(g)}).sort((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of c)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},$o=(e,t)=>{let n=e.findIndex(r=>{try{return Ha(r.id)>t}catch{return!0}});return n===-1?{appliedEvents:e,unappliedEvents:[]}:{appliedEvents:e.slice(0,n),unappliedEvents:e.slice(n)}};var Wo=e=>({action:e.action,payload:e.payload});var jo=1,_o=ed(),td=Pt.tuple([Pt.string().min(1),Pt.string().min(1).nullable()]),nd=Pt.looseObject({v:Pt.literal(jo),id:td}),pr=e=>{let t=nd.safeParse(e);return t.success?l("Parsed persisted event",t.data):s(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},un=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",K=()=>{let{userName:e,userId:t}=L();return e?t?e.trim()?l("Successfully resolved actor ID",{userId:un(t),userName:un(e)}):s("Unable to resolve actor ID from settings or OS user info"):s("User ID not configured"):s("User name not configured")},Xe=({userId:e,userName:t})=>`${un(e)}.${un(t)}.jsonl`,rd=(e,{userId:t,userName:n})=>{let r=Xe({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r))return s(`Invalid event log file name: ${r}`);let i=Qa.join(wt(e),r);return l("Successfully resolved event log path",i)},od=(e,t)=>{let n={[e.action]:e.payload,v:jo,id:t};return pr(n)};function mn({event:e,rootDir:t=process.cwd()}){try{let n=$e(t);if(d(n))return n;let r=Io(n.value);if(d(r))return r;let o=rd(n.value,{userId:e.userId,userName:e.userName});if(d(o))return o;let i=Uo(n.value);if(d(i))return s(i.message);let a=i.value?_o(Math.max(Date.now(),Za(i.value)+1)):_o(),c=od(Wo(e),[a,i.value]);return d(c)?s(c.message):(Ja.appendFileSync(o.value,`${JSON.stringify(c.value)}
5
- `,"utf8"),l("Event persisted",{path:o.value,entry:c.value}))}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return s(`Failed to persist event: ${r}`)}}import Ed from"node:fs";var fr=(e="Syncing...")=>{S({syncStatus:{status:"syncing",msg:e}})},gr=(e="Synced")=>{S({syncStatus:{status:"synced",msg:e}})},id=e=>{S({syncStatus:{status:"outOfSync",msg:e}})},oe=e=>(id(e),s(e));var Je=e=>{let t=be(e);if(d(t))return s("Unable to resolve epiq project root");let n=We(t.value);return d(n)?s("Unable to read project.json"):l("Resolved state branch",n.value.stateBranch)},xe="origin";import Ft from"node:fs";import ld from"node:os";import Ie from"node:path";var vr=(e,t)=>{let n=new Map,r=t??((...i)=>JSON.stringify(i)),o=((...i)=>{let a=r(...i);if(!n.has(a)){let c=e(...i).then(u=>(d(u)&&n.delete(a),u));n.set(a,c)}return n.get(a)});return o.clear=()=>n.clear(),o};import kt from"fs";import Ko from"path";import sd from"util";var Ho=1e3,Vo=()=>{let e=process.cwd(),t=$e(e);if(!d(t))return Ko.join(t.value,Me,"log","epiq.log")};function ad(){if(!ar)return;let e=Vo();if(e===void 0||!kt.existsSync(e))return;let n=kt.readFileSync(e,"utf8").split(`
6
- `);if(n[n.length-1]===""&&n.pop(),n.length<=Ho)return;let r=n.slice(-Ho).join(`
2
+ import br from"chalk";import{render as Tm}from"ink";import Mm from"meow";import Pm from"react";import Re from"node:fs";import Et from"node:path";var A={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function Rr(e){return e.context===A.WORKSPACE}function W(e){return e.context===A.TICKET}function Ko(e){return e.context===A.TEXT}function Ge(e){return e.context===A.FIELD}function Kt(e){return e.context===A.FIELD_LIST}var St=e=>e.context===A.SWIMLANE,zo=e=>e.context===A.BOARD;var qe={None:"none",Success:"success",Fail:"fail"},s=e=>({status:qe.Fail,message:e,value:null}),c=(e,t)=>({status:qe.Success,message:e,value:t}),d=e=>e.status==="fail",ce=e=>e.status==="success";import{ulid as hd}from"ulid";var It=24n,yd=It*4n,Oe=(1n<<yd)-1n,xd=/^[0-9a-f]+$/;function Go(e){return!e||!xd.test(e)?s(`Invalid hex rank: ${e}`):c("Converted rank to bigint",BigInt("0x"+e))}function Ae(e,t=It){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 pe(e,t){if(!e&&!t)return Ae(Oe/2n,It);let n=e?Go(e):c("Resolved lower bound",0n);if(d(n))return n;let r=t?Go(t):c("Resolved upper bound",Oe);if(d(r))return r;let o=n.value,i=r.value;if(i<=o)return Ae(Oe/2n,It);let a=(o+i)/2n;return a===o||a===i?s("No rank space available between neighbors"):Ae(a,It)}function qo(e){if(e<=0)return c("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=Oe*BigInt(r+1)/(t+1n),i=Ae(o,It);if(d(i))return i;n.push(i.value)}return c("Resolved evenly spaced ranks",n)}var Ar=(e,t)=>{let n=U(e),r=qo(n.length);if(d(r))return r;let o={};for(let i=0;i<n.length;i++){let a=n[i],l=r.value[i];if(!a||!l)return s("Unable to assign rebalance rank");o[a.id]=l}return c("Created rebalance event",{id:hd(),action:"rebalance.children",payload:{parent:e,ranks:o},...t})};import Jt from"node:fs";import Ue from"node:path";import Dr from"node:fs";import Md from"node:os";import Pe from"node:path";import zt from"node:fs";import{ulid as Cd}from"ulid";import{z as Cn}from"zod";var Ed="_epiq/_evt",Nd=Cn.object({projectId:Cn.string().min(1),stateBranch:Cn.string().min(1),createdAt:Cn.iso.datetime()}),Yo=()=>({projectId:Cd(),stateBranch:Ed,createdAt:new Date().toISOString()}),Ye=e=>{let t=Nn(e);if(!zt.existsSync(t))return s("Missing .epiq/project.json");try{let n=zt.readFileSync(t,"utf8"),r=JSON.parse(n),o=Nd.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")}},Xo=e=>{let t=Ye(e);return d(t)?s(t.message):c("Read projectId",t.value.projectId)},Jo=({repoRoot:e,fileContents:t})=>{let n=En(e),r=Nn(e);try{if(zt.mkdirSync(n,{recursive:!0}),zt.existsSync(r)){let o=Ye(e);return d(o)?s(o.message):c("Project already initialized",null)}return zt.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 wr=(e,t)=>{let n=new Map,r=t??((...i)=>JSON.stringify(i)),o=((...i)=>{let a=r(...i);if(!n.has(a)){let l=e(...i).then(u=>(d(u)&&n.delete(a),u));n.set(a,l)}return n.get(a)});return o.clear=()=>n.clear(),o};import Gt from"fs";import Zo from"path";import bd from"util";var Qo=1e3,Sd=50,Tr=0,ei=()=>{let e=process.cwd(),t=Rt(e);if(!d(t))return Zo.join(t.value,Be,"log","epiq.log")};function Id(){let e=ei();if(!e||!Gt.existsSync(e))return;let n=Gt.readFileSync(e,"utf8").split(`
4
+ `);if(n[n.length-1]===""&&n.pop(),n.length<=Qo)return;let r=n.slice(-Qo).join(`
7
5
  `)+`
8
- `;kt.writeFileSync(e,r,"utf8")}function yr(e,t,n=!1){if(!ar)return;let r=Vo();if(!r)return;let o=sd.format(...t),i=new Date,c=`[${n?i.toISOString().slice(11,19):i.toISOString()}] ${e} ${o}
9
- `;kt.mkdirSync(Ko.dirname(r),{recursive:!0}),kt.appendFileSync(r,c,"utf8"),ad()}var ue={info(...e){yr("[Info]",e,!1)},debug(...e){yr("->",e,!0)},error(...e){yr("[Error]",[...e,new Error().stack],!1)}};globalThis.logger=ue;import{spawn as dd}from"node:child_process";import xr from"node:fs";import zo from"node:path";var H={stage:({cwd:e,pathspec:t})=>F({args:["add",...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1})=>F({args:["commit",...n?["--allow-empty"]:[],"-m",t],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>F({args:["fetch",t,n],cwd:e}),pullRebase:({cwd:e,remote:t,branch:n})=>F({args:["pull","--rebase",t,n],cwd:e}),checkout:({cwd:e,branch:t})=>F({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 F({args:o,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>F({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>F({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>F({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>F({args:["worktree","prune"],cwd:e})};var Go=15e3,cd={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo"},Yo=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!xr.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=dd("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:cd}),i=!1,a="",c="",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 ${Go}ms`].join(`
10
- `);u(n?{stdout:a,stderr:p,exitCode:124}:s(p))},Go);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",p=>{a+=p}),o.stderr.on("data",p=>{c+=p}),o.on("error",p=>{if(n){u({stdout:a,stderr:p.message,exitCode:1});return}u(s([`git ${e.join(" ")}`,`cwd=${t}`,p.message].join(`
11
- `)))}),o.on("close",p=>{let g=p??1;if(n){u({stdout:a,stderr:c,exitCode:g});return}if(g!==0){u(s([`git ${e.join(" ")}`,c.trim()||a.trim()||"Git command failed"].filter(Boolean).join(`
12
- `)));return}u(l("Git command succeeded",{stdout:a,stderr:c,exitCode:g}))})}),F=({args:e,cwd:t})=>Yo({args:e,cwd:t,allowFail:!1}),ut=({args:e,cwd:t})=>Yo({args:e,cwd:t,allowFail:!0}),mt=async({cwd:e,message:t})=>{let n=await H.commit({cwd:e,message:t});if(d(n))return s(`Failed to create commit
13
- ${n.message}`);let r=await F({args:["rev-parse","HEAD"],cwd:e});return d(r)?s(`Commit created, but failed to read HEAD SHA
14
- ${r.message}`):l("Created commit and resolved SHA",r.value.stdout.trim())},Dt=async e=>{let t=await ti(e);if(d(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=>xr.existsSync(zo.join(n,i)));return l("Checked for in-progress Git operation",o.length>0)},hr=async({repoRoot:e})=>{let n=(await ut({args:["remote","get-url",xe],cwd:e})).exitCode===0;return l(`Checked remote ${n}`,n)},pn=async({repoRoot:e,branch:t})=>{let n=await ut({args:["ls-remote","--heads",xe,t],cwd:e});return n.exitCode!==0?s(n.stderr.trim()||`Unable to inspect remote branch ${xe}/${t}`):l("Checked remote branch",n.stdout.trim().length>0)},fn=async({repoRoot:e,branch:t})=>{let n=await ut({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?l("Local branch exists",!0):n.exitCode===1?l("Local branch missing",!1):s(n.stderr.trim()||`Unable to inspect branch ${t}`)},qo=e=>{try{return xr.realpathSync.native(e)}catch{return zo.resolve(e)}},Xo=async({repoRoot:e,worktreeRoot:t})=>{let n=await F({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return s(n.message);let r=qo(t),o=n.value.stdout.split(`
15
- `).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(qo).includes(r);return l("Checked worktree registration",o)},Cr=async e=>{let t=await ut({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return l("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},gn=async e=>{let t=await F({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return d(t)?s(t.message):l("Resolved current branch",t.value.stdout.trim())},Jo=async e=>{let t=await F({args:["rev-parse","--short","HEAD"],cwd:e});return d(t)?s(t.message):l("Resolved short HEAD sha",t.value.stdout.trim())},Qo=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),vn=async({cwd:e,branch:t})=>{let n=await pn({repoRoot:e,branch:t});if(d(n))return s(n.message);if(!n.value)return l("Remote branch missing, skipped pull",!1);let r=await H.fetch({cwd:e,remote:xe,branch:t});if(d(r))return s(`Failed to fetch ${t}
16
- ${r.message}`);let o=await H.pullRebase({cwd:e,remote:xe,branch:t});return d(o)?s(`Failed during pull --rebase
17
- ${o.message}`):l("Pulled with rebase",!0)},Zo=async e=>{let t=await F({args:["status","--porcelain"],cwd:e});return d(t)?s(t.message):l("Checked state branch changes",t.value.stdout.trim().length>0)},ei=async e=>{let t=await gn(e);return d(t)?s(t.message):l("Checked detached HEAD state",t.value==="HEAD")};var ni="4b825dc642cb6eb9a060e54bf8d69288fbee4904",ri=e=>Ie.join(Me,tn,e),oi=()=>Ie.join(ld.homedir(),ve),yn=()=>Ie.join(oi(),"worktrees"),ii=({repoRoot:e})=>{let t=So(e);return d(t)?s(t.message):l("Resolved state branch root",Ie.join(yn(),t.value))},ud=e=>Ie.join(e,Me),Qe=e=>Ie.join(ud(e),tn),Nr=({root:e,fileName:t})=>Ie.join(Qe(e),t),Lt=e=>{try{return Ft.mkdirSync(e,{recursive:!0}),l("Ensured directory",void 0)}catch(t){return s(t instanceof Error?t.message:String(t))}},xn=()=>{let e=Lt(oi());if(d(e))return s(`Ensure epiq home failed.
18
- `+e.message);let t=Lt(yn());return d(t)?s(`Ensure worktrees dir failed.
19
- `+t.message):l("Ensured epiq storage",!0)},si=e=>{Ft.existsSync(e)&&(ue.debug("[sync] remove path",e),Ft.rmSync(e,{recursive:!0,force:!0}))},ai=e=>{let t=Qe(e);if(!Ft.existsSync(t))return l("Events dir missing",[]);let n=Ft.readdirSync(t,{withFileTypes:!0}).filter(r=>r.isFile()).map(r=>r.name).filter(r=>r.endsWith(".jsonl")).sort();return l("Listed event files",n)},di=(e,t)=>{for(let n of[Qe(e),Qe(t)]){let r=Lt(n);if(d(r))return s(r.message)}return l("Ensured state branch",void 0)},ci=async e=>{let t=await F({args:["ls-tree","--name-only","HEAD"],cwd:e});if(d(t))return s(`ensure state branch is storage only failed
6
+ `;Gt.writeFileSync(e,r,"utf8")}function Mr(e,t,n=!1){let r=ei();if(!r)return;let o=bd.format(...t),i=new Date,l=`[${n?i.toISOString().slice(11,19):i.toISOString()}] ${e} ${o}
7
+ `;Gt.mkdirSync(Zo.dirname(r),{recursive:!0}),Gt.appendFileSync(r,l,"utf8"),Tr++,Tr>=Sd&&(Tr=0,Id())}var le={info(...e){Mr("[Info]",e,!1)},debug(...e){Mr("[debug]",e,!0)},error(...e){let t=e.find(n=>n instanceof Error)instanceof Error?void 0:new Error().stack;Mr("[Error]",[...e,t].filter(Boolean),!1)}};globalThis.logger=le;import{spawn as Rd}from"node:child_process";import bn from"node:fs";import qt from"node:path";var V={stage:({cwd:e,pathspec:t})=>L({args:["add",...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1})=>L({args:["commit",...n?["--allow-empty"]:[],"-m",t],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>L({args:["fetch",t,n],cwd:e}),pullRebase:({cwd:e,remote:t,branch:n})=>L({args:["pull","--rebase",t,n],cwd:e}),checkout:({cwd:e,branch:t})=>L({args:["checkout",t],cwd:e}),push:({cwd:e,remote:t,branch:n,setUpstream:r=!1})=>{let o=t&&n?["push",...r?["-u"]:[],t,n]:["push"];return L({args:o,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>L({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>L({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>L({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>L({args:["worktree","prune"],cwd:e})};var lt=e=>{let t=Xe(e);if(d(t))return s("Unable to resolve epiq project root");let n=Ye(t.value);return d(n)?s("Unable to read project.json"):c("Resolved state branch",n.value.stateBranch)},fe="origin";var ti=1e4,Ad={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo"},ri=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!bn.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=Rd("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:Ad}),i=!1,a="",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 ${ti}ms`].join(`
8
+ `);u(n?{stdout:a,stderr:p,exitCode:124}:s(p))},ti);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",p=>{a+=p}),o.stderr.on("data",p=>{l+=p}),o.on("error",p=>{if(n){u({stdout:a,stderr:p.message,exitCode:1});return}u(s([`git ${e.join(" ")}`,`cwd=${t}`,p.message].join(`
9
+ `)))}),o.on("close",p=>{let v=p??1;if(n){u({stdout:a,stderr:l,exitCode:v});return}if(v!==0){u(s([`git ${e.join(" ")}`,l.trim()||a.trim()||"Git command failed"].filter(Boolean).join(`
10
+ `)));return}u(c("Git command succeeded",{stdout:a,stderr:l,exitCode:v}))})}),L=({args:e,cwd:t})=>ri({args:e,cwd:t,allowFail:!1}),Ne=({args:e,cwd:t})=>ri({args:e,cwd:t,allowFail:!0}),At=async({cwd:e,message:t})=>{let n=await V.commit({cwd:e,message:t});if(d(n))return s(`Failed to create commit
11
+ ${n.message}`);let r=await L({args:["rev-parse","HEAD"],cwd:e});return d(r)?s(`Commit created, but failed to read HEAD SHA
12
+ ${r.message}`):c("Created commit and resolved SHA",r.value.stdout.trim())},wd=async e=>{let t=await L({cwd:e,args:["rev-parse","--git-dir"]});if(d(t))return s(t.message);let n=t.value.stdout.trim();return c("Resolved git dir",qt.isAbsolute(n)?n:qt.resolve(e,n))},Td=async e=>{let t=await wd(e);if(d(t))return s(t.message);let n=t.value,r={MERGE_HEAD:"merge in progress",REBASE_HEAD:"rebase in progress",CHERRY_PICK_HEAD:"cherry-pick in progress",REVERT_HEAD:"revert in progress",BISECT_LOG:"bisect in progress"};for(let[u,m]of Object.entries(r))if(bn.existsSync(qt.join(n,u)))return c("Checked for in-progress Git operation",m);let o={"rebase-merge":"rebase in progress","rebase-apply":"rebase in progress"};for(let[u,m]of Object.entries(o))if(bn.existsSync(qt.join(n,u)))return c("Checked for in-progress Git operation",m);let i=await L({cwd:e,args:["status","--porcelain=v1","--branch"]});if(d(i))return s(i.message);let a=i.value.stdout.toLowerCase(),l=["rebase in progress","merge in progress","cherry-pick in progress","revert in progress","bisect in progress"].find(u=>a.includes(u));return c("Checked for in-progress Git operation",l??null)},Sn=async e=>{let t=await Td(e);return d(t)?s(t.message):c("Checked for in-progress Git operation",t.value!==null)},Pr=async({repoRoot:e})=>{let n=(await Ne({args:["remote","get-url",fe],cwd:e})).exitCode===0;return c(`Checked remote ${n}`,n)},Yt=async({repoRoot:e,branch:t})=>{let n=await Ne({args:["ls-remote","--heads",fe,t],cwd:e});return n.exitCode!==0?s(n.stderr.trim()||`Unable to inspect remote branch ${fe}/${t}`):c("Checked remote branch",n.stdout.trim().length>0)},In=async({repoRoot:e,branch:t})=>{let n=await Ne({args:["show-ref","--verify","--quiet",`refs/heads/${t}`],cwd:e});return n.exitCode===0?c("Local branch exists",!0):n.exitCode===1?c("Local branch missing",!1):s(n.stderr.trim()||`Unable to inspect branch ${t}`)},ni=e=>{try{return bn.realpathSync.native(e)}catch{return qt.resolve(e)}},oi=async({repoRoot:e,worktreeRoot:t})=>{let n=await L({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return s(n.message);let r=ni(t),o=n.value.stdout.split(`
13
+ `).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(ni).includes(r);return c("Checked worktree registration",o)},kr=async e=>{let t=await Ne({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return c("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},Rn=async e=>{let t=await L({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return d(t)?s(t.message):c("Resolved current branch",t.value.stdout.trim())},ii=async e=>{let t=await L({args:["rev-parse","--short","HEAD"],cwd:e});return d(t)?s(t.message):c("Resolved short HEAD sha",t.value.stdout.trim())},si=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),ai=async e=>(await Ne({cwd:e,args:["rebase","--abort"]})).exitCode===0?c("Aborted stale rebase",!0):c("No rebase to abort",!1),di=async({cwd:e,branch:t})=>{let n=await Yt({repoRoot:e,branch:t});if(d(n))return s(n.message);if(!n.value)return c("Remote branch missing, skipped reset",!1);let r=await V.fetch({cwd:e,remote:fe,branch:t});if(d(r))return s(`Failed to fetch ${t}
14
+ ${r.message}`);let o=await ai(e);if(d(o))return s(o.message);let i=await L({cwd:e,args:["reset","--hard",`${fe}/${t}`]});return d(i)?s(`Failed to reset ${t} from remote
15
+ ${i.message}`):c("Reset branch from remote",!0)},Lr=async({cwd:e,branch:t})=>{let n=await Yt({repoRoot:e,branch:t});if(d(n))return s(n.message);if(!n.value)return c("Remote branch missing, skipped pull",!1);let r=await ai(e);if(d(r))return s(r.message);let o=await V.fetch({cwd:e,remote:fe,branch:t});if(d(o))return s(`Failed to fetch ${t}
16
+ ${o.message}`);let i=await V.pullRebase({cwd:e,remote:fe,branch:t});return d(i)?s(`Failed during pull --rebase
17
+ ${i.message}`):c("Pulled with rebase",!0)},ci=async e=>{let t=await Ne({args:["diff","--cached","--quiet"],cwd:e});return t.exitCode===0?c("No staged changes",!1):t.exitCode===1?c("Has staged changes",!0):s(t.stderr.trim()||"Unable to inspect staged changes")};var li=async e=>{let t=await Rn(e);return d(t)?s(t.message):c("Checked detached HEAD state",t.value==="HEAD")};var mi="4b825dc642cb6eb9a060e54bf8d69288fbee4904",ut=e=>Pe.join(Be,Mn,e),pi=()=>Pe.join(Md.homedir(),be),An=()=>Pe.join(pi(),"worktrees"),wn=({repoRoot:e})=>{let t=Xo(e);return d(t)?s(t.message):c("Resolved state branch root",Pe.join(An(),t.value))},Pd=e=>Pe.join(e,Be),ui=e=>Pe.join(Pd(e),Mn);var Xt=e=>{try{return Dr.mkdirSync(e,{recursive:!0}),c("Ensured directory",void 0)}catch(t){return s(t instanceof Error?t.message:String(t))}},Tn=()=>{let e=Xt(pi());if(d(e))return s(`Ensure epiq home failed.
18
+ `+e.message);let t=Xt(An());return d(t)?s(`Ensure worktrees dir failed.
19
+ `+t.message):c("Ensured epiq storage",!0)},fi=e=>{Dr.existsSync(e)&&(le.debug("[sync] remove path",e),Dr.rmSync(e,{recursive:!0,force:!0}))};var gi=(e,t)=>{for(let n of[ui(e),ui(t)]){let r=Xt(n);if(d(r))return s(r.message)}return c("Ensured state branch",void 0)},vi=async e=>{let t=await L({args:["ls-tree","--name-only","HEAD"],cwd:e});if(d(t))return s(`ensure state branch is storage only failed
20
20
  `+t.message);let r=t.value.stdout.trim().split(`
21
- `).filter(Boolean).filter(a=>a!==Me);if(r.length===0)return l("State branch is storage-only",!1);let o=await F({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(d(o))return s(`Failed to clean storage branch
22
- ${o.message}`);let i=await mt({cwd:e,message:"[epiq:repair-storage-branch]"});return d(i)?s(i.message):l("Cleaned storage branch",!0)},hn=vr(async(e=process.cwd())=>{let t=await F({args:["rev-parse","--show-toplevel"],cwd:e});return d(t)?s("Not inside a Git repository"):l("Resolved repo root",t.value.stdout.trim())},e=>Ie.resolve(e)),ti=vr(async e=>{let t=await F({args:["rev-parse","--git-dir"],cwd:e});if(d(t))return s(t.message);let n=t.value.stdout.trim(),r=Ie.isAbsolute(n)?n:Ie.join(e,n);return l("Resolved git dir",r)},e=>Ie.resolve(e));import pt from"node:fs";import Ot from"node:path";var ui=async e=>{if((await ut({args:["rev-parse","--verify","HEAD"],cwd:e})).exitCode===0)return l("Initial commit already exists",!1);ue.info("Creating initial commit");let n=await H.commit({cwd:e,message:"Initial commit",allowEmpty:!0});return d(n)?s(n.message):l("Created initial commit",!0)},li=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",md=async e=>{let t=await gn(e);if(d(t))return s(t.message);let n=await Jo(e);if(d(n))return s(n.message);let r=`[epiq:sync:${li(t.value)}:${li(n.value)}]`;return l("Built sync commit message",r)},Cn=async({repoRoot:e,stateBranchName:t})=>{ue.info(`Creating ${t}`);let n=await F({args:["commit-tree",ni,"-m","[epiq:init-state-branch]"],cwd:e});if(d(n))return s(`Failed to create state branch commit
23
- ${n.message}`);let r=n.value.stdout.trim(),o=await F({args:["update-ref",`refs/heads/${t}`,r],cwd:e});return d(o)?s(`Failed to create ${t}
24
- ${o.message}`):l("Created state branch",!0)},pd=async({repoRoot:e,stateBranchName:t})=>{let n=await fn({repoRoot:e,branch:t});if(d(n))return s(`Ensure local state branch failed
25
- `+n.message);if(n.value)return l("Local state branch already exists",!1);let r=await hr({repoRoot:e});if(d(r))return s(`Ensure local state branch failed
26
- `+r.message);if(!r.value)return Cn({repoRoot:e,stateBranchName:t});let o=await pn({repoRoot:e,branch:t});if(d(o))return s(`Ensure local state branch failed
27
- `+o.message);if(!o.value)return Cn({repoRoot:e,stateBranchName:t});let i=await H.fetch({cwd:e,remote:xe,branch:t});if(d(i))return s(`Failed to fetch ${t} from remote
28
- ${i.message}`);let a=await F({args:["branch","--track",t,`${xe}/${t}`],cwd:e});return d(a)?s(`Failed to create local ${t} from remote
29
- ${a.message}`):l("Created local state branch from remote",!0)},fd=async({repoRoot:e,branch:t})=>{let n=await F({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return s(n.message);let r=n.value.stdout.split(`
30
- `),o=null;for(let i of r){if(i.startsWith("worktree ")){o=i.slice(9);continue}if(i===`branch refs/heads/${t}`&&o)return l("Found worktree for branch",o)}return l("No worktree found for branch",null)},gd=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=Lt(Ot.dirname(t));if(d(r))return s(`Failed to create state branch worktree
31
- `+r.message);pt.existsSync(t)&&!pt.existsSync(Ot.join(t,".git"))&&(ue.info("Removing broken state branch worktree path"),si(t)),ue.info("Creating state branch worktree");let o=await H.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return d(o)?s(`Failed to create state branch worktree
32
- ${o.message}`):l("Created state branch worktree",!0)},Er=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await fd({repoRoot:e,branch:n});if(d(r))return s(r.message);let o=Ot.resolve(t),i=r.value?Ot.resolve(r.value):null;if(i&&i===o&&pt.existsSync(i))return l("State branch already checked out in expected worktree",!1);if(i&&i!==o){ue.info("Moving state branch worktree to expected location");let u=await H.worktreeRemove({cwd:e,worktreeRoot:i});if(d(u))return s(`Failed to remove existing state branch worktree
33
- ${u.message}`)}if(i&&!pt.existsSync(i)){ue.info("Pruning stale state branch worktree");let u=await H.worktreePrune({cwd:e});if(d(u))return s(`Failed to prune stale worktrees
34
- ${u.message}`)}let a=await Xo({repoRoot:e,worktreeRoot:t});if(d(a))return s(a.message);let c=pt.existsSync(t);if(a.value&&c)return l("State branch worktree already exists",!1);if(a.value&&!c){ue.info("Pruning missing registered state branch worktree");let u=await H.worktreePrune({cwd:e});if(d(u))return s(`Failed to prune stale worktrees
35
- ${u.message}`)}return gd({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},vd=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await gn(e);if(d(n))return s(n.message);if(n.value===t)return l("State branch already checked out",!1);let r=await H.checkout({cwd:e,branch:t});return d(r)?s(`Failed to checkout ${t}
36
- ${r.message}`):l("Checked out state branch",!0)},yd=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Cr(t);if(d(n))return s(n.message);if(n.value)return l("State branch upstream already configured",!1);let r=await hr({repoRoot:t});if(d(r))return s(r.message);if(!r.value)return l("No remote available for state branch upstream",!1);let o=Je(e);if(d(o))return o;let i=o.value,a=await pn({repoRoot:t,branch:i});if(d(a))return s(a.message);if(!a.value)return l("Remote state branch missing; upstream will be configured on first push",!1);ue.info(`Configuring ${i} upstream`);let c=await H.fetch({cwd:t,remote:xe,branch:i});if(d(c))return s(`Failed to fetch ${i}
37
- ${c.message}`);let u=await H.setUpstream({cwd:t,branch:i,upstream:`${xe}/${i}`});return d(u)?s(`Failed to set state branch upstream
38
- ${u.message}`):l("Configured state branch upstream",!0)},Nn=async({stateBranchRoot:e,eventFileName:t})=>{let n=ri(t),r=Ot.join(e,n);if(!pt.existsSync(r))return l("No event file to stage",void 0);let o=await H.stage({cwd:e,pathspec:[n]});return d(o)?s(`Failed to stage state branch event file
39
- ${o.message}`):l("Staged state branch event file",void 0)},mi=async({repoRoot:e,stateBranchRoot:t})=>{let n=await md(e);return d(n)?s(`Create state branch sync commit failed
40
- `+n.message):mt({cwd:t,message:n.value})},Bt=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Cr(t);if(d(n))return s(n.message);let r=Je(e);if(d(r))return r;let o=r.value,i=n.value?await H.push({cwd:t}):await H.push({cwd:t,remote:xe,branch:o,setUpstream:!0});return d(i)?s(`Failed during state branch push
41
- ${i.message}`):l("Pushed state branch",!0)},pi=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=Je(e);if(d(o))return o;let i=o.value,a=[xn(),await pd({repoRoot:e,stateBranchName:i}),await Er({repoRoot:e,stateBranchRoot:t,stateBranchName:i}),await vd({stateBranchRoot:t,stateBranchName:i}),await ci(t),n?await yd({stateBranchRoot:t,repoRoot:e}):l("Skipped state branch upstream bootstrap",!1)];for(let c of a){if(d(c))return s(c.message);r=r||!!c.value}return l(n?"Bootstrapped state storage":"Bootstrapped state storage (readonly)",r)};import En from"node:fs";import br from"node:path";import{decodeTime as xd}from"ulid";var Ir=e=>{let[t,n]=e.id;return`${t}:${n??""}`},fi=e=>{let[t]=e.id;return xd(t)},hd=e=>{let{userId:t,userName:n,...r}=e;return r},Cd=e=>e.length===0?"":e.map(t=>JSON.stringify(hd(t))).join(`
42
- `)+`
43
- `,Nd=(e,t)=>{let n=new Map;for(let r of[...t,...e])n.set(Ir(r),r);return[...n.values()].sort((r,o)=>{let i=fi(r)-fi(o);return i!==0?i:Ir(r).localeCompare(Ir(o))})},Sr=({sourceFile:e,targetFile:t})=>{let n=ln(e);if(d(n))return s(n.message);let r=ln(t);if(d(r))return s(r.message);let o=Nd(r.value,n.value),i=Cd(o);return(En.existsSync(t)?En.readFileSync(t,"utf8"):"")===i?l("Event file already merged",!1):(En.mkdirSync(br.dirname(t),{recursive:!0}),En.writeFileSync(t,i,"utf8"),l("Merged event file",!0))},Ut=({repoRoot:e,stateBranchRoot:t})=>{let n=ai(t);if(d(n))return s(n.message);let r=Qe(t),o=Qe(e),i=!1;for(let a of n.value){let c=br.join(r,a),u=br.join(o,a),m=Sr({sourceFile:c,targetFile:u});if(d(m))return s(m.message);i=i||m.value}return l("Hydrated event files from state branch",i)};var vi=async(e=process.cwd())=>{fr("Syncing from remote");let t=await yi({cwd:e,ensureUpstream:!1});if(d(t))return oe(t.message);let{repoRoot:n,stateBranchRoot:r}=t.value,o=Je(e);if(d(o))return oe(o.message);let i=o.value,a=await vn({cwd:r,branch:i});if(d(a))return oe(a.message);let c=Ut({repoRoot:n,stateBranchRoot:r});return d(c)?oe(c.message):(gr("Synced from remote"),l("Synced state branch",{repoRoot:n,stateBranchRoot:r}))},Id=({repoRoot:e,stateBranchRoot:t,ownEventFileName:n})=>{let r=Nr({root:e,fileName:n}),o=Nr({root:t,fileName:n});return Ed.existsSync(r)?Sr({sourceFile:r,targetFile:o}):l("Local own event file missing, nothing to merge",!1)},yi=async({cwd:e,ensureUpstream:t})=>{let n=await hn(e);if(d(n))return s(n.message);let r=n.value,o=ii({repoRoot:r});if(d(o))return s(o.message);let i=o.value,a=await Dt(r);if(d(a))return s(a.message);if(a.value)return s("Cannot sync while a git operation is in progress in the current repo");let c=await ui(r);if(d(c))return s(c.message);let u=await pi({repoRoot:r,stateBranchRoot:i,ensureUpstream:t});if(d(u))return s(u.message);let m=await Dt(i);if(d(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=di(r,i);return d(p)?s(p.message):l("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:i,bootstrapped:u.value})},gi=async({repoRoot:e,stateBranchRoot:t,ownEventFileName:n})=>{let r=Id({repoRoot:e,stateBranchRoot:t,ownEventFileName:n});if(d(r))return s(r.message);let o=await Zo(t);if(d(o))return s(o.message);if(!r.value&&!o.value)return l("Own event file already up to date in state branch",{createdCommit:!1});let i=await Nn({stateBranchRoot:t,eventFileName:n});if(d(i))return s(i.message);let a=await mi({repoRoot:e,stateBranchRoot:t});return d(a)?s(a.message):l("Merged, staged, and committed own event file",{createdCommit:!0,commitSha:a.value})},In=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");fr("Syncing");let n=await yi({cwd:e,ensureUpstream:!0});if(d(n))return oe(n.message);let{repoRoot:r,stateBranchRoot:o,bootstrapped:i}=n.value,a=await ei(r);if(d(a))return oe(a.message);if(a.value)return oe("Cannot run :sync while the repository is in detached HEAD state");let c=!1,u,m=!1,p=!1,g=!1,x=Je(r);if(d(x))return oe(x.message);let E=x.value,A=await vn({cwd:o,branch:E});if(d(A))return oe(A.message);m=A.value;let R=Ut({repoRoot:r,stateBranchRoot:o});if(d(R))return oe(R.message);g=R.value;let b=await gi({repoRoot:r,stateBranchRoot:o,ownEventFileName:t});if(d(b))return oe(b.message);if(c=b.value.createdCommit,u=b.value.commitSha,c||i){let w=await Bt({stateBranchRoot:o,repoRoot:r}),U=w;if(d(w)&&Qo(w.message)){let le=await vn({cwd:o,branch:E});if(d(le))return oe(le.message);let ne=await gi({repoRoot:r,stateBranchRoot:o,ownEventFileName:t});if(d(ne))return oe(ne.message);ne.value.createdCommit&&(c=!0,u=ne.value.commitSha),U=await Bt({stateBranchRoot:o,repoRoot:r})}if(d(U))return oe(U.message);p=U.value,logger.debug("[sync] pushed to state branch",p)}else logger.debug("[sync] no commit created, skipped push");if(c){let w=await F({args:["rev-parse","HEAD"],cwd:o});if(d(w))return oe(w.message);u=w.value.stdout.trim()}return gr(p?"Synced and pushed":m||g||c?"Synced local state":"Already synced"),l("Synced event logs with state branch",{repoRoot:r,stateBranchRoot:o,createdCommit:c,commitSha:u,pulled:m,pushed:p,hydrated:g,bootstrapped:i})};var ft=3e3,xi=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<ft?null:t},hi=0,Rr,Ar=!1,$t=!1,wr=()=>Ar||v().syncStatus.status==="syncing",bd=()=>{let e=L().autoSyncIntervalMs??15e3,t=Date.now()-hi;return Math.max(0,e-t)},Ci=()=>{Rr||(Rr=setTimeout(async()=>{if(Rr=void 0,wr()){$t=!0;return}$t=!1,await Sd()},bd()))},Sd=async()=>{if(wr())return $t=!0,s("Sync already in progress");let e=K();if(d(e)||!e.value)return s("Unable to resolve event log path");Ar=!0,hi=Date.now();try{let t=Xe(e.value);return await In({ownEventFileName:t})}finally{Ar=!1,$t&&Ci()}},Ni=()=>{$t=!0,!wr()&&Ci()};var ie={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:a=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:P.FIELD,childRenderAxis:i,parentNodeId:n,readonly:!1,log:[],isVirtual:a}),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:a=!0})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:P.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:i,log:[],isVirtual:a})};import{ulid as wd}from"ulid";var Ze=24n,Rd=Ze*4n,et=(1n<<Rd)-1n,Ad=/^[0-9a-f]+$/;function Ei(e){return!e||!Ad.test(e)?s(`Invalid hex rank: ${e}`):l("Converted rank to bigint",BigInt("0x"+e))}function Pe(e,t=Ze){if(e<0n)return s("Negative rank not allowed");let n=e.toString(16);return l("Converted bigint to hex rank",n.padStart(Number(t),"0"))}function z(e,t){if(!e&&!t)return Pe(et/2n,Ze);let n=e?Ei(e):l("Resolved lower bound",0n);if(d(n))return n;let r=t?Ei(t):l("Resolved upper bound",et);if(d(r))return r;let o=n.value,i=r.value;if(i<=o)return Pe(et/2n,Ze);let a=(o+i)/2n;return a===o||a===i?s("No rank space available between neighbors"):Pe(a,Ze)}function Ii(){return Pe(et/2n,Ze)}function bi(e){if(e<=0)return l("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=et*BigInt(r+1)/(t+1n),i=Pe(o,Ze);if(d(i))return i;n.push(i.value)}return l("Resolved evenly spaced ranks",n)}var Tr=(e,t)=>{let n=O(e),r=bi(n.length);if(d(r))return r;let o={};for(let i=0;i<n.length;i++){let a=n[i],c=r.value[i];if(!a||!c)return s("Unable to assign rebalance rank");o[a.id]=c}return l("Created rebalance event",{id:wd(),action:"rebalance.children",payload:{parent:e,ranks:o},...t})};var Y={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History"};var Td=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[ke,bn]=Td;var k=(e,t)=>s(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),Md={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=ie.workspace(t,n,r),i=jt(o);if(d(i))return k(i.message,e);let a=I.createNode(o);return d(a)?k(a.message??"Failed to initialize workspace",e):cr(a.value)?l("Workspace initialized",{action:e.action,result:a.value}):s("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=ie.workspace(t,n,r),i=I.createNode(o);return d(i)?k(i.message??"Failed to add workspace",e):cr(i.value)?l("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=I.createNode(ie.board(t,n,r,o));return d(i)?k(i.message??"Unable to create board",e):Po(i.value)?l("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=I.createNode(ie.swimlane(t,n,r,o));return d(i)?k(i.message??"Unable to create swimlane",e):lt(i.value)?l("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=I.createNode(ie.ticket(t,n,r,o));return d(i)?k(i.message??"Unable to create issue",e):ye(i.value)?l("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,a=I.createNode(ie.field({id:t,name:n,parentNodeId:r,rank:i,props:{value:o},childRenderAxis:n.includes(Y.DESCRIPTION)?"vertical":"horizontal"}));return d(a)?k(a.message??`Unable to create field: ${n}`,e):Mo(a.value)?l("Added field",{action:e.action,result:a.value}):s("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!I.getNode(t))return k(`Unable to locate node with id ${t}`,e);let o=I.renameNode(t,n);return d(o)?k(o.message??"Unable to edit title",e):l("Edited title",{action:e.action,result:o.value})},"delete.node":e=>{let{id:t}=e.payload,n=I.tombstoneNode(t);return d(n)?k(n.message??"Unable to delete node",e):l("Deleted node",{action:e.action,result:n.value})},"create.tag":e=>{let{id:t,name:n}=e.payload,r=I.createTag({id:t,name:n});return d(r)?k(r.message??"Unable to create tag",e):l("Tag added",{action:e.action,result:r.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,r=I.createContributor({id:t,name:n});return d(r)?k(r.message??"Unable to create contributor",e):l("Contributor created",{action:e.action,result:r.value})},"tag.issue":e=>{let{id:t,target:n,tagId:r,rank:o}=e.payload,i=I.tag(n,r,t,o);return d(i)?k(i.message??"Unable to tag issue",e):l("Issue tagged",{action:e.action,result:i.value})},"untag.issue":e=>{let{target:t,tagId:n}=e.payload,r=I.untag(t,n);return d(r)?k(r.message??"Unable to untag ",e):l("Issue untagged",{action:e.action,result:r.value})},"assign.issue":e=>{let{id:t,contributor:n,target:r,rank:o}=e.payload,i=I.assign(r,n,t,o);return d(i)?k(i.message??"Unable to assign issue",e):l("Assigned successfully",{action:e.action,result:i.value})},"unassign.issue":e=>{let{target:t,contributor:n}=e.payload,r=I.unassign(t,n);return d(r)?k(r.message??"Unable to unassign issue",e):l("Issue unassigned",{action:e.action,result:r.value})},"move.node":e=>{let{id:t,parent:n,rank:r}=e.payload,o=I.moveNodeToRank({id:t,parentId:n,rank:r});return d(o)?k(o.message??"Failed to move node",e):l("Moved node",{action:e.action,result:o.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,r=I.editValue(t,n);return d(r)?k(r.message??"Unable to edit description",e):l("Set node value",{action:e.action,result:r.value})},"close.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=I.getNode(t);if(!o)return k("Unable to locate issue",e);if(!ye(o))return k("Can only close issues",e);let i=I.getNode(ke);if(!i)return k("Unable to locate target swimlane",e);if(n!==i.id)return k("Close target must be closed swimlane",e);let a=I.moveNodeToRank({id:t,parentId:n,rank:r});return d(a)?k(a.message??"Unable to close issue",e):l("Issue closed",{action:e.action,result:{id:t}})},"reopen.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=I.getNode(t);if(!o)return k("Unable to locate issue",e);if(!ye(o))return k("Can only reopen issues",e);let i=I.getNode(ke);if(!i)return k("Unable to locate closed swimlane",e);if(n===i.id)return k("Cannot reopen issue into closed swimlane",e);if(!I.getNode(n))return k("Reopen parent no longer exists",e);let c=I.moveNodeToRank({id:t,parentId:n,rank:r});return d(c)?k(c.message??"Unable to reopen issue",e):l("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=I.lockNode(t);return d(n)?k(n.message??"Unable to lock node",e):l("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=I.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 a=I.updateNode({...i,rank:o});if(d(a))return k(a.message??"Unable to rebalance child",e)}return l("Rebalanced children",{action:e.action,result:{parent:t}})}},Pd=(e,t)=>{let n=I.getNode(e);n&&I.updateNode({...n,log:[...n.log??[],t]})},kd=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=v().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 Wt(e,t=!1){let n=Md[e.action](e);if(d(n))return n;t||([...new Set(kd(e))].forEach(a=>Pd(a,e)),he(a=>({...a,eventLog:[...a.eventLog,e]})));let r=e.userId,o=e.userName;return!r?.length||!o?.length?k("Invalid user ID format",e):(I.createContributor({name:o,id:r}),n)}var _t=e=>e.map(t=>Wt(t));function _(e){let t=Wt(e);if(t.status!==Ue.Success)return t;let n=mn({event:e});return d(n)?n:t}function Sn(e){return e.map(t=>_(t))}var Si=e=>Mr(O(e),{at:"end"}),Mr=(e,t={at:"end"})=>{let n=r=>d(r)?l("Rank space exhausted",{rank:"",needsRebalance:!0}):l("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=Ri(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=Ri(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")}}},O=e=>Object.values(v().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),Ri=(e,t)=>e.findIndex(n=>n.id===t),Ai=(e,t,n={at:"end"})=>Mr(O(t).filter(r=>r.id!==e),n),tt=(e,t,n,r)=>{let o=Ai(t,e,n);if(d(o))return o;if(!o.value.needsRebalance)return l("Resolved rank",o.value.rank);let i=Tr(e,r);if(d(i))return i;let a=_(i.value);if(d(a))return a;let c=Ai(t,e,n);return d(c)?c:c.value.needsRebalance?s("Rank rebalance failed to create space"):l("Resolved rank after rebalance",c.value.rank)},gt=(e,t)=>{let n=Si(e);if(d(n))return n;if(!n.value.needsRebalance)return l("Resolved rank",n.value.rank);let r=Tr(e,t);if(d(r))return r;let o=_(r.value);if(d(o))return o;let i=Si(e);return d(i)?i:i.value.needsRebalance?s("Rank rebalance failed to create space"):l("Resolved rank after rebalance",i.value.rank)};var je=(e,t)=>{let{nodes:n}=v(),r=n[e];if(!r)return s("Node not found");if(r.context===t)return l("Resolved ancestor node",r);let o=r.parentNodeId?n[r.parentNodeId]:void 0;for(;o;){if(o.context===t)return l("Resolved ancestor node",o);o=o.parentNodeId?n[o.parentNodeId]:void 0}return s(`No ancestor found for context: ${t}`)},kr=(e,t)=>{let{nodes:n}=v(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},Pr=(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"),I={deleteNode(e){he(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},editValue(e,t){let{nodes:n}=v(),r=n[e];if(!r)return s("Edit target node not found");let o=Pr(r,"edit");if(o)return o;let i={...r,props:{...r.props,value:t}};return this.updateNode(i),l("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return s("Rename target node not found");let r=Pr(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),l("Renamed node",o)},getExistingTags(){let{tags:e}=v();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=v();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return O(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:r}=v(),o=this.getNode(e),i=this.getNode(t);if(!o)return s("Node not found");if(!i)return s("Target parent not found");if(r===e)return s("Cannot move root node");if(e===t)return s("Cannot move node into itself");let a=Pr(o,"move");if(a)return a;if(kr(t,e))return s("Cannot move node into its own descendant");let c={...o,parentNodeId:t,rank:n};return this.updateNode(c),l("Moved node successfully",c)},tombstoneNode(e){let{nodes:t,currentNodeId:n,rootNodeId:r}=v(),o=this.getNode(e);if(!o)return s("Node not found");if(r===e)return s("Cannot delete root node");let i=new Set,a=u=>{let m=t[u];if(!(!m||i.has(u))){i.add(u);for(let p of O(m.id))a(p.id)}};a(e);let c={...structuredClone(t)};for(let u of i){if(!c[u])return s("Unable to locate node to delete");c[u]={...c[u],isDeleted:!0}}return n?(S({nodes:c}),l("Successfully tomb stoned",o)):s("Unable to delete undefined")},createContributor(e){let t=he(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return d(t)?s("Unable to create contributor"):l("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 a=this.getFieldByTitle(i.id,"Assignees");if(!a)return s("Unable to locate assignees field");if(O(a.id).some(p=>p.props?.value===t))return s("Contributor already assigned");let u=ie.field({id:n,name:o.name,parentNodeId:a.id,rank:r,props:{value:t}}),m=this.createNode(u);return d(m)?m:l("Assigned contributor",u)},createTag(e){let t=he(n=>({...n,tags:{...n.tags,[e.id]:e}}));return d(t)?s("Could not create tag"):l("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 a=this.getFieldByTitle(i.id,"Tags");if(!a)return s("Unable to locate tags field");if(O(a.id).some(p=>p.props?.value===t))return s("Tag already assigned");let u=ie.field({id:n,name:o.name,parentNodeId:a.id,rank:r,props:{value:t}}),m=this.createNode(u);return d(m)?m:l("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(o.id).find(c=>c.props?.value===t);if(!i)return l("Issue is not tagged with that tag",null);let a={...i,isDeleted:!0};return this.updateNode(a),l("Tag removed",a)},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(o.id).find(c=>c.props?.value===t);if(!i)return l("Issue is not assigned to that contributor",null);let a={...i,isDeleted:!0};return this.updateNode(a),l("Assignee removed",a)},createNode(e){let t=he(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(t)?s("Unable to create node"):l("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return s("Failed to locate node");let n={...t,readonly:!0},r=he(o=>({...o,nodes:{...o.nodes,[e]:n}}));return d(r)?s(r.message):l("Locked node",n)},updateNode(e){let t=he(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(t)?t:l("Updated node",e)},getContributor(e){return v().contributors[e]},getTag(e){return v().tags[e]},getNode(e){return v().nodes[e]},getSiblings(e){return O(e)}};var se={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"},N={accent:se.cyan,accent2:se.magenta,primary:se.white,secondary:se.grayDark,secondary2:se.grayLight,gray:se.gray,green:se.green,yellow:se.yellow,red:se.red};var C={red:se.red,yellow:se.yellow,green:se.green,blue:se.blue,magenta:se.magenta,cyan:se.cyan},vt={urgent:C.red,critical:C.red,important:C.red,blocker:C.red,asap:C.red,immediate:C.red,fail:C.red,failure:C.red,broken:C.red,bug:C.red,error:C.red,incident:C.red,outage:C.red,production:C.red,crash:C.red,security:C.red,warning:C.yellow,warn:C.yellow,risky:C.yellow,risk:C.yellow,attention:C.yellow,pending:C.yellow,review:C.yellow,"needs-review":C.yellow,qa:C.yellow,testing:C.yellow,test:C.yellow,validate:C.yellow,verification:C.yellow,staging:C.yellow,check:C.yellow,"follow-up":C.yellow,followup:C.yellow,waiting:C.yellow,blocked:C.yellow,hold:C.yellow,done:C.green,complete:C.green,completed:C.green,success:C.green,ok:C.green,stable:C.green,resolved:C.green,fixed:C.green,closed:C.green,merged:C.green,released:C.green,deployed:C.green,approved:C.green,verified:C.green,working:C.green,healthy:C.green,pass:C.green,passing:C.green,info:C.blue,information:C.blue,note:C.blue,docs:C.blue,documentation:C.blue,doc:C.blue,guide:C.blue,help:C.blue,explanation:C.blue,detail:C.blue,details:C.blue,context:C.blue,design:C.blue,discussion:C.blue,proposal:C.blue,idea:C.blue,feature:C.magenta,enhancement:C.magenta,improvement:C.magenta,refactor:C.magenta,refactoring:C.magenta,cleanup:C.magenta,optimize:C.magenta,optimization:C.magenta,perf:C.magenta,performance:C.magenta,upgrade:C.magenta,migration:C.magenta,modernize:C.magenta,debt:C.magenta,todo:C.cyan,next:C.cyan,planned:C.cyan,plan:C.cyan,future:C.cyan,backlog:C.cyan,investigate:C.cyan,explore:C.cyan,prototype:C.cyan};var wi=(e,t)=>{let r=T(e.id).find(o=>o.title===t);return r?T(r.id).map(o=>typeof o.props?.value=="string"?o.props.value:"").filter(o=>!!o):[]},Dr=e=>wi(e,"Tags").map(t=>I.getTag(t)).filter(t=>!!t),Rn=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!ye(n)?s("Invalid untag target"):l("Retrieved tags from ticket in breadcrumb",Dr(n)??[])},An=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!ye(n)?s("Invalid untag target"):l("Retrieved tags from ticket in breadcrumb",Fr(n)??[])},Fr=e=>wi(e,"Assignees").map(t=>I.getContributor(t)).filter(t=>!!t);var y={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 Dd=/^(\d+)(h|d|w|mo|y)$/,Fd=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,Ld=({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},Od=(e,t=new Date)=>{let n=e.match(Dd);if(!n)return null;let[,r,o]=n,i=Number(r);if(!Number.isInteger(i)||i<=0)return null;let a=new Date(t);switch(o){case"h":return a.setHours(a.getHours()-i),a;case"d":return a.setDate(a.getDate()-i),a;case"w":return a.setDate(a.getDate()-i*7),a;case"mo":return a.setMonth(a.getMonth()-i),a;case"y":return a.setFullYear(a.getFullYear()-i),a;default:return null}},Bd=e=>{let t=e.match(Fd);if(!t)return null;let[,n,r,o,i,a]=t,c=Number(n),u=Number(r),m=Number(o),p=i?Number(i):0,g=a?Number(a):0;return Ld({year:c,month:u,day:m,hour:p,minute:g})?new Date(c,u-1,m,p,g):null},wn=e=>{let t=e.trim().toLowerCase();return Od(t)??Bd(t)},Ti=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Ud=[{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}],Mi=(e=Ud)=>{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 $d=["BOARD","TICKET","SWIMLANE"],X={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs"},He={TITLE:"title",DESCRIPTION:"description"},Wd=[X.EDITOR,X.VIEW,X.USERNAME,X.AUTOSYNC,X.SYNC_DEBOUNCE_MS],_d=[He.TITLE,He.DESCRIPTION],Or=[String(ft),"5000","15000","30000","60000"],nt=[y.SYNC,y.HELP,y.EXPORT,y.CONFIG],Tn=[y.NEW,y.EDIT,y.DELETE,y.MOVE],Lr=[y.TAG,y.UNTAG,y.ASSIGN,y.UNASSIGN,y.CLOSE_ISSUE,y.RE_OPEN_ISSUE,y.EDIT],Pi=[y.FILTER,y.PEEK],jd={WORKSPACE:[...nt,...Tn],BOARD:[...Pi,...nt,...Tn],SWIMLANE:[...Pi,...nt,...Tn],TICKET:[...nt,...Tn,...Lr],FIELD:[...nt,...Lr],FIELD_LIST:[...nt,...Lr],TEXT:[...nt]},Hd=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],Kd=()=>{let{selectedNode:e,readOnly:t,breadCrumb:n}=v(),{isSetupDone:r}=_e();if(!r)return[y.HELP,y.CONFIG];if(!Ao())return[y.HELP,y.INIT];if(t)return[y.HELP,y.PEEK,y.EXPORT,y.CONFIG];let o=e?.context,i=o&&$d.includes(o);return[...new Set([...n,e].map(c=>c?.context).flatMap(c=>c?jd[c]:[]))].filter(c=>c===y.MOVE?!1:c===y.EDIT||c===y.DELETE?i:!0)},ae=e=>{let{currentNode:t}=v(),n=t.context??"WORKSPACE";return{[y.NONE]:Kd(),[y.EXIT]:["confirm"],[y.EXPORT]:[],[y.SYNC]:[],[y.INIT]:[],[y.HELP]:[],[y.PEEK]:[...Mi(),"now","prev","next"],[y.EDIT]:[..._d],[y.DELETE]:["confirm"],[y.RE_OPEN_ISSUE]:["confirm"],[y.CLOSE_ISSUE]:["confirm"],[y.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[y.FILTER]:["tag","assignee","description","title","clear"],[y.TAG]:[...new Set([...Object.keys(vt),...I.getExistingTags()])],[y.UNTAG]:[...Rn()?.value?.map(({name:o})=>o)??[]],[y.UNASSIGN]:[...An()?.value?.map(({name:o})=>o)??[]],[y.ASSIGN]:I.getExistingAssignees(),[y.NEW]:Hd(n),[y.CONFIG]:[...Wd]}[e]??[]};import xt from"chalk";var ki=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import{decodeTime as Di}from"ulid";var Fi=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"},Li=e=>{let t=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())} ${t(e.getHours())}:${t(e.getMinutes())}`},Mn=e=>{try{return l("Decoded date",new Date(Di(e)))}catch(t){return s("Decoding failed + "+t.message)}},Br=e=>{if(!e?.id)return null;try{return Di(e.id)}catch{return null}};import yt from"chalk";var $r={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Vd=(e,t,n)=>Math.max(t,Math.min(n,e)),Ur=(e,t,n)=>e+(t-e)*n,Oi=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Gd=(e,t,n)=>{let r=t/100,o=n/100,i=(1-Math.abs(2*o-1))*r,a=e/60,c=i*(1-Math.abs(a%2-1)),u=0,m=0,p=0;a>=0&&a<1?(u=i,m=c):a>=1&&a<2?(u=c,m=i):a>=2&&a<3?(m=i,p=c):a>=3&&a<4?(m=c,p=i):a>=4&&a<5?(u=c,p=i):(u=i,p=c);let g=o-i/2;return[Math.round((u+g)*255),Math.round((m+g)*255),Math.round((p+g)*255)]},qd=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,zd=(e,t,n)=>[Math.round(Ur(e[0],t[0],n)),Math.round(Ur(e[1],t[1],n)),Math.round(Ur(e[2],t[2],n))],Ht=e=>{let n=Oi(e)%360,r=Gd(n,$r.stringColor.saturation,$r.stringColor.lightness);return qd(r)},Yd=e=>{let t=$r.gradient.stops,n=Vd(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let r=t.length-1,o=n*r,i=Math.min(Math.floor(o),r-1),a=o-i;return zd(t[i],t[i+1],a)},Pn=e=>Oi(e.toLowerCase().trim())/4294967295,Bi=e=>{let t=Pn(e);return Yd(t)},Xd=e=>{let[t,n,r]=Bi(e);return{normal:o=>yt.bgRgb(t,n,r).black(o),cursor:o=>yt.bgRgb(t,n,r).white.bold(o)}},Wr=e=>{let[t,n,r]=Bi(e);return{fg:o=>yt.rgb(t,n,r)(o),fgCursor:o=>yt.rgb(t,n,r).inverse(o),bg:o=>yt.bgRgb(t,n,r).black(o),bgCursor:o=>yt.bgRgb(t,n,r).white.bold(o)}},_r=e=>Xd(e).normal(` ${e} `),de=(e,t=vt)=>{let r=(o=>o.toLowerCase().trim())(e);return r&&t[r]?t[r]:Ht(r)};var rt={None:"none",Invalid:"invalid",Valid:"valid"};var Jd=["BOARD","TICKET","SWIMLANE"],Hr=()=>{let e=v().selectedNode;return e?.context?Jd.includes(e.context)?W():B({message:"Command not available in this context"}):B({message:"Missing target context"})},J="<ENTER> to confirm",W=(e="",t=[])=>({message:e,validity:rt.Valid,completionWordList:t}),B=({message:e,completionWordList:t=[]})=>({validity:rt.Invalid,message:e,completionWordList:t}),kn=e=>e.length===0,fe=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:i=1})=>{let a=o.trim();if(a.length<i)return"";let p=[...t.filter(Boolean).filter(g=>g.startsWith(a))].sort((g,x)=>Pn(g)-Pn(x)).slice(0,r).map(_r).join(" ");return p?`${e}${p}${n}`:""},jr=({modifier:e})=>{let t="confirm";return e===t?W(J):B({message:kn(e)?`if you are certain, enter ${_r(t)}`:"",completionWordList:[t]})},Qd=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?B({message:n}):W():B({message:kn(r)?t:"",completionWordList:[...e]}),Kt=({hint:e})=>({modifier:t,inputString:n})=>kn(t)&&kn(n)?B({message:e,completionWordList:[]}):W(J),Zd=({modifier:e,inputString:t})=>{let n=ae(y.CONFIG);if(!n.includes(e))return B({message:fe({prefix:"config... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case X.EDITOR:{let r=[...ki];return t.trim()?r.includes(t.trim())?W(J):B({message:fe({prefix:"known editors... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):B({message:fe({prefix:"editor... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case X.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?W(J):B({message:fe({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case X.USERNAME:return t.trim()?W(J):B({message:`Enter a username. Saved in ${xt.bgBlack("~/.epiq-global/config.json")}`});case X.AUTOSYNC:{let r=["yes","no"],o=L().autoSync;if(!r.includes(t.trim())){let i=wo(o);return B({message:fe({prefix:`should auto-sync (recommended)${i!==null?", currently: "+i:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return W(J)}case X.SYNC_DEBOUNCE_MS:{let r=L().autoSyncIntervalMs,o=xi(t);if(!t.trim()||o===null||o<ft){let i=fe({prefix:" examples: ",wordList:Or,minLengthForHints:0,inputString:t});return B({message:`provide duration above ${ft}ms. current duration: ${r}ms.`+i,completionWordList:Or})}return W(J)}default:return B({message:"Unknown config option",completionWordList:n})}},ec=({modifier:e})=>{let t=ae(y.EDIT);if(!t.includes(e)){let r=fe({prefix:"edit... ",wordList:t,inputString:e,minLengthForHints:0});return B({message:r||"Unknown edit option",completionWordList:t})}let n=Hr();if(n.validity==="invalid")return n;switch(e){case He.TITLE:return W(J);case He.DESCRIPTION:return W("<ENTER> to edit in "+L().preferredEditor);default:return B({message:"Unknown edit option",completionWordList:t})}},tc={[y.EXPORT]:()=>W(J+", and create export markdown file"),[y.PEEK]:e=>{let t=e.modifier;if(t==="now")return W(J);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 W(J);let r=wn(t);if(!t||!r)return B(n);let o=Se(v().breadCrumb,"BOARD");if(d(o))return B({message:"Command is not applicable in this context"});let i=Mn(o.value.id);return d(i)?B({message:"Unable to peek: board id is not a valid ULID"}):Ti({date:r,horizonDate:i.value})?W(J):B({message:xt.red(`nothing to peek before ${i.value.toISOString().slice(0,16).replace("T"," ")}`)})},[y.EXIT]:()=>W(J+" and exit the application"),[y.INIT]:()=>W(J),[y.FILTER]:e=>{if(e.modifier==="clear")return W();let t=i=>ae(y.FILTER).includes(i);if(!e.modifier||!t(e.modifier))return B({message:fe({wordList:ae(y.FILTER),inputString:e.inputString}),completionWordList:ae(y.FILTER)});let n=Object.values(v().tags).map(i=>i.name),r=Object.values(v().contributors).map(i=>i.name),o=e.modifier==="tag"?n:e.modifier==="assignee"?r:[];return e.inputString?o.length&&!o.includes(e.inputString.trim())?B({message:fe({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString}),completionWordList:o}):W():B({message:fe({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString}),completionWordList:o})},[y.NONE]:e=>{let t=ae(y.NONE);return e.command?W():B({message:fe({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[y.NEW]:e=>Qd({list:ae(y.NEW),hint:fe({wordList:ae(y.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[y.HELP]:()=>W(J),[y.EDIT]:ec,[y.CONFIG]:Zd,[y.DELETE]:e=>{let t=Hr();return t.validity==="invalid"?t:jr(e)},[y.CLOSE_ISSUE]:e=>jr(e),[y.RE_OPEN_ISSUE]:e=>jr(e),[y.MOVE]:e=>{let t=Hr();return t.validity==="invalid"?t:Kt({hint:fe({prefix:"hey hacker! These commands are blocked for you... ",wordList:ae(y.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[y.TAG]:e=>{let n=I.getExistingTags().map(r=>` ${xt.bgHex(de(r))(" "+r+" ")} `).slice(0,10).join("");return Kt({hint:n.length?"existing tags ... "+n:"create tag ..."})(e)},[y.UNTAG]:e=>{let t=Rn();if(d(t))return B({message:"Invalid untag target",completionWordList:[]});let n=t.value.map(({name:r})=>r).map(r=>` ${xt.bgHex(de(r))(" "+r+" ")} `).slice(0,10);return n.length?Kt({hint:" ... "+n.join("")})(e):B({message:"Issue has no tags",completionWordList:[]})},[y.ASSIGN]:e=>{let t=I.getExistingAssignees().map(n=>` ${xt.bgHex(de(n))(" "+n+" ")} `).slice(0,10);return Kt({hint:"assign to... "+t.join("")})(e)},[y.UNASSIGN]:e=>{let t=An();if(d(t))return B({message:"Invalid unassign target",completionWordList:[]});let n=t.value.map(({name:r})=>r).map(r=>` ${xt.bgHex(de(r))(" "+r+" ")} `).slice(0,10);return n.length?Kt({hint:"remove assignee... "+n.join("")})(e):B({message:"Issue has no assignees",completionWordList:[]})},[y.SYNC]:()=>W(J)},Ui=Object.fromEntries(Object.entries(tc).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var $i=["frontend","backend","infrastructure","architecture","integration","configuration","implementation","application","deployment","environment","framework","platform","service","component","module","gateway","pipeline","containerization","orchestrator","exception","incident","defect","regression","degradation","malfunction","instability","intermittent","reproducibility","reproduction","investigation","triage","workaround","mitigation","remediation","optimization","stabilization","refinement","failure","outage","blocking","criticality","severity","escalation","diagnostics","analysis","resolution","corruption","inconsistency","validation","verification","authorization","authentication","confidentiality","availability","accessibility","reliability","compliance","governance","encryption","decryption","integrity","auditing","traceability","accountability","protection","privileges","permissions","dependency","orchestration","provisioning","synchronization","compatibility","incompatibility","interoperability","observability","instrumentation","telemetry","loadbalancing","discovery","registration","scheduling","coordination","distribution","isolation","virtualization","serialization","deserialization","initialization","instantiation","propagation","aggregation","consolidation","normalization","standardization","transformation","reconciliation","correlation","processing","indexing","partitioning","enrichment","validation","filtering","streaming","batching","concurrency","parallelism","contention","deadlock","throttling","ratelimiting","backpressure","fragmentation","saturation","exhaustion","partitioning","replication","redundancy","failover","deprecation","obsolescence","starvation","overload","underutilization","latency","throughput","refactoring","modularization","encapsulation","abstraction","extensibility","configurability","maintainability","recoverability","sustainability","readability","testability","debuggability","reusability","simplicity","consistency","performance","functionality","requirement","recommendation","improvement","enhancement","clarification","documentation","description","acceptance","criteria","estimation","prioritization","dependency","deliverable","milestone","iteration"];var M={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 Wi=e=>Object.values(y).includes(e),_i=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:i}=e,{message:a,validity:c,completionWordList:u}=Ui[n].validate(n,r,i),m=o==="command"||o==="modifier"?ae(n):$i;return{validity:c,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:a??"",autoCompletion:t?Oo(e,[...u,...m]):{hint:"",hints:[],remainder:"",overlap:0}}};var ji=e=>{let t=e.trimStart(),n=rc(t),r=n[0]??"",o=n[1]??"",i=/\s$/.test(e),a=oc(e),c=Wi(r)?r:null,u=c!==null,m=r!=="",p=c?ae(c)??[]:[],g=c&&p.includes(o)?o:"",x="word";n.length===0||n.length===1&&!i?x="command":(n.length===1&&i||n.length===2&&!i)&&(x="modifier");let E=i?"":a,A=nc(t,c,g);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:a,hasCommand:m,command:c,isCommandKeyword:u,isLastWordCompleted:i,modifier:g,target:x,inputToMatch:E,inputString:A}},nc=(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},rc=e=>e.trim()?e.trim().split(/\s+/):[],oc=e=>e.trimEnd().split(/\s+/).at(-1)??"";var ht=e=>e===Kr||e===":",Kr=" ",ce={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:rt.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},Vr=new Set,Hi=()=>{for(let e of Vr)e()},Ki=e=>(Vr.add(e),()=>Vr.delete(e)),De=e=>{let n=e(ce),r=ji(n.value),o=n.cursorPosition===n.value.length;ce={...n,commandMeta:_i(r,o)},Hi()},Vt=({message:e,status:t})=>{let n=structuredClone(ce);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,ce=n,Hi(),l(e,null)},Gr=e=>{De(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},qr=e=>{De(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&ht(n[o-1]);)o--;for(;o>0&&!ht(n[o-1]);)o--}else{for(;o<n.length&&!ht(n[o]);)o++;for(;o<n.length&&ht(n[o]);)o++}return{...t,cursorPosition:o}})},Vi=()=>{De(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}})},Gi=()=>{De(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&ht(t[r-1]);)r--;for(;r>0&&!ht(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},$=e=>{De(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),r=t.value.slice(0,n),o=t.value.slice(n),i=e(r,t.commandMeta.autoCompletion),a=i+o,c=Math.max(0,Math.min(i.length,a.length));return{...t,value:a,cursorPosition:c,commandIsPending:!1}})},qi=()=>{De(e=>({...e,commandIsPending:!0}))},zi=({addToHistory:e=!0})=>{De(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),ic()},Yi=()=>{De(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}})},Xi=()=>{De(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},ic=()=>$(()=>""),Q=()=>ce,Ji=()=>{let[e,...t]=ce.value.split(Kr);return t.join(Kr).trim()};var sc=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",ac=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",dc=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",Qi=(e,t)=>{if(ac(e,e.sequence))return h.MoveCursorLeftOfWord;if(dc(e,e.sequence))return h.MoveCursorRightOfWord;if(sc(e,e.sequence))return h.EraseInputWord;switch(e.name){case"tab":return h.AutoCompleteCommand;case"up":return h.GetLastCommandFromHistory;case"down":return h.GetNextCommandFromHistory;case"left":return h.MoveCursorLeft;case"right":return h.MoveCursorRight;case"return":return h.Confirm;case"backspace":return t?h.EraseInput:h.ExitCommandLine;case"escape":return h.ExitCommandLine;default:return h.CaptureInput}};var h={Sync:"sync",NavPreviousItem:"navPreviousItem",NavNextItem:"navNextItem",NavToPreviousContainer:"navToPreviousContainer",NavToNextContainer:"navToNextContainer",MovePreviousItem:"movePreviousItem",MoveNextItem:"moveNextItem",MoveToPreviousContainer:"moveToPreviousContainer",MoveToNextContainer:"moveToNextContainer",Confirm:"confirm",Exit:"exit",ViewHelp:"viewHelp",HideHelp:"hideHelp",InitMove:"initMove",ConfirmMove:"confirmMove",Delete:"Delete",InitCommandLine:"initCommandLine",ExitCommandLine:"exitCommandLine",CaptureInput:"captureInput",EraseInput:"eraseInput",AddItem:"addItem",GetLastCommandFromHistory:"getLastCommandFromHistory",GetNextCommandFromHistory:"getNextCommandFromHistory",AutoCompleteCommand:"autoCompleteCommand",MoveCursorLeft:"MoveCursorLeft",MoveCursorRight:"MoveCursorRight",MoveCursorLeftOfWord:"MoveCursorLeftOfWord",MoveCursorRightOfWord:"MoveCursorRightOfWord",EraseInputWord:"EraseInputWord",None:"None",Edit:"edit",SetViewDense:"SetViewDense",SetViewWide:"SetViewWide"};function cc(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function lc(e,t,n){let r=v().currentNode.childNavigationAcrossParents;switch(t){case"up":return e==="vertical"?n.prevItem:r?n.prevContainer:null;case"down":return e==="vertical"?n.nextItem:r?n.nextContainer:null;case"left":return e==="horizontal"?n.prevItem:r?n.prevContainer:null;case"right":return e==="horizontal"?n.nextItem:r?n.nextContainer:null}}function Zi(e,t){let n=Q();if(e.sequence===":"&&n.value==="")return h.InitCommandLine;if(t===f.MOVE)switch(e.name){case"m":case"return":return h.ConfirmMove}if(t===f.COMMAND_LINE)return Qi(e,n.value);let r=cc(e);if(r){let o=t===f.MOVE?{prevItem:h.MovePreviousItem,nextItem:h.MoveNextItem,prevContainer:h.MoveToPreviousContainer,nextContainer:h.MoveToNextContainer}:{prevItem:h.NavPreviousItem,nextItem:h.NavNextItem,prevContainer:h.NavToPreviousContainer,nextContainer:h.NavToNextContainer};return lc(v().currentNode.childRenderAxis,r,o)}if(e.ctrl&&e.name==="c")return h.Exit;switch(e.name){case"e":return h.Edit;case"n":return h.AddItem;case"m":return h.InitMove;case"d":return h.Delete;case"return":return h.Confirm;case"space":return h.Confirm;case"v":return L().viewMode==="wide"?h.SetViewDense:h.SetViewWide;case"q":case"escape":return h.Exit;case"s":return h.Sync;default:return null}}var es=e=>{let{context:t}=v()?.currentNode;if(!t)return M.None;switch(e){case y.EXIT:return M.Exit;case y.EXPORT:return M.Export;case y.INIT:return M.Init;case y.DELETE:return M.Delete;case y.EDIT:return M.Edit;case y.HELP:return M.ViewHelp;case y.RE_OPEN_ISSUE:return M.ReopenIssue;case y.CLOSE_ISSUE:return M.CloseIssue;case y.TAG:return M.TagTicket;case y.UNTAG:return M.UntagTicket;case y.ASSIGN:return M.AssignUserToTicket;case y.UNASSIGN:return M.UnassignUserFromTicket;case y.NEW:return M.NewItem;case y.FILTER:return M.Filter;case y.MOVE:return M.Move;case y.PEEK:return M.Peek;case y.CONFIG:return M.Config;case y.SYNC:return M.Sync;default:return M.None}};import{ulid as V}from"ulid";import vs from"node:fs";import Uc from"node:path";import $c from"react";import{Box as Oc}from"ink";import Un from"react";import{Box as Xr,Text as Ec}from"ink";import Re from"react";import{Text as ts}from"ink";import ns,{useEffect as rs,useState as uc}from"react";var os={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"command-line":["\u276F "]},me=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=G(),r=os[n]??os.default,[o,i]=uc(0);if(rs(()=>{i(0)},[r]),rs(()=>{if(!e)return;let c=setInterval(()=>{i(u=>(u+1)%r.length)},500);return()=>clearInterval(c)},[e,r]),!e)return ns.createElement(ts,null,t);let a=r[o]??r[0]??t;return ns.createElement(ts,{color:N.accent,dimColor:o===1},a)};import{Box as zr,Text as mc}from"ink";import Dn from"react";var Fn=({children:e=[],height:t,selectedIndex:n,itemHeight:r=1,scrollByOne:o=!1})=>{if(e.length===0)return null;let i=Math.max(1,Math.floor(t)),a=Math.max(1,Math.ceil(r)),c=Math.max(1,Math.floor(i/a)),u=Math.max(0,Math.min(n,e.length-1)),m=Math.max(0,e.length-c),p=o?Math.min(m,Math.max(0,u-c+1)):Math.min(m,Math.floor(u/c)*c),g=p+c,x=e.slice(p,g),E=e.length>c,A=i,R=E?Math.max(1,Math.floor(c/e.length*A)):A,b=Math.max(0,A-R),w=Math.max(1,e.length-c),U=E?Math.floor(p/w*b):0;return Dn.createElement(zr,{flexDirection:"row",height:i,width:"100%"},Dn.createElement(zr,{flexDirection:"column",flexGrow:1,height:i},x),Dn.createElement(zr,{flexDirection:"column",width:1,height:A},Array.from({length:A}).map((le,ne)=>Dn.createElement(mc,{key:ne,color:E&&ne>=U&&ne<U+R?N.accent:N.secondary},E?"\u2502":" "))))};import{Box as Ln,Text as hc}from"ink";import ot from"react";import{Text as pc}from"ink";import fc from"react";var gc=e=>e.toLowerCase().trim(),vc=(e,t=vt)=>{let n=gc(e);return t[n]?t[n]:Ht(n)},Ct=({id:e,isSelected:t})=>{let n=I.getContributor(e);if(n)return fc.createElement(pc,{underline:t,color:vc(n.name)},"@"+n.name)};import{Text as yc}from"ink";import xc from"react";var Nt=({id:e,isSelected:t})=>{let n=I.getTag(e);if(n)return xc.createElement(yc,{underline:t,backgroundColor:de(n.name),color:N.primary}," "+n.name+" ")};var is=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=dn(lr(t.title),r),i=Dr(t),a=Fr(t);return ot.createElement(Ln,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?N.accent:N.secondary,justifyContent:"space-between"},ot.createElement(Ln,{borderBottom:!0},ot.createElement(Ln,{paddingLeft:1,flexDirection:"column"},ot.createElement(hc,{color:N.primary},o))),ot.createElement(Ln,{flexDirection:"row",paddingLeft:1},i.map(c=>ot.createElement(Nt,{key:c.id,id:c.id})),a.map(c=>ot.createElement(Ct,{key:c.id,id:c.id}))))};import Cc from"chalk";import{Box as Gt,Text as Yr}from"ink";import Fe from"react";var Nc=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,ss=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let i=T(t.id),a=R=>{let b=i.find(w=>w.title===R);return b?T(b.id).map(w=>typeof w.props?.value=="string"?w.props.value:"").filter(w=>!!w):[]},c=a("Tags").map(R=>I.getTag(R)).filter(R=>!!R),u=a("Assignees").map(R=>I.getContributor(R)).filter(R=>!!R),m=1,p=c.length*(1+m),g=u.length*(2+m),x=c.map(R=>Fe.createElement(Gt,{key:R.id,paddingRight:m},Fe.createElement(Yr,{color:de(R.name)},"\u25A0"))),E=u.map(R=>Fe.createElement(Gt,{key:R.id,paddingRight:m},Fe.createElement(Yr,{color:Ht(R.name)},"@"+R.name.at(0)))),A=n?N.accent:o===f.MOVE?N.secondary:N.primary;return Fe.createElement(Gt,{borderBottom:!0,justifyContent:"space-between"},Fe.createElement(Gt,null,Fe.createElement(me,{isSelected:n,placeholder:Cc.dim.gray(r+1+" ")}),Fe.createElement(Yr,{wrap:"truncate",color:A},Nc(t.title,e-p-g-14))),Fe.createElement(Gt,null,x,E))};var Ic=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:i,listSelectedIndex:a,mode:c})=>{let{renderedChildrenIndex:u}=G(),m=u[e.id]??[],p=`${e.title} (${m.length})`,g=3,x=o?1:4,E=r-g-(o?2:1),A=Re.createElement(Xr,{borderStyle:"round",borderColor:N.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},Re.createElement(me,{isSelected:t}),Re.createElement(Ec,{bold:!0,color:t?N.accent:N.primary},p," ",e.readonly?"\u{1F512}":"")),R=(b,w)=>{let U=i&&a===w;return o?Re.createElement(ss,{key:b.id,index:w,width:n,ticket:b,isSelected:U,mode:c}):Re.createElement(is,{key:b.id,width:n,ticket:b,isSelected:U})};return Re.createElement(Xr,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?N.accent:N.secondary,paddingRight:1,paddingLeft:1,height:r},A,Re.createElement(Xr,{padding:o?1:0},m.length>0&&Re.createElement(Fn,{selectedIndex:a,height:E,itemHeight:x},m.map(R)),Re.createElement(me,{isSelected:i&&a===-1})))},as=Re.memo(Ic);import{Box as Zr,Text as Fc}from"ink";import Ke,{useEffect as eo,useMemo as ps}from"react";import it from"chalk";import ds from"string-width";import{decodeTime as bc}from"ulid";var Sc=(e,t)=>e+" ".repeat(Math.max(0,t-ds(e))),Rc=(e,t)=>" ".repeat(Math.max(0,t-ds(e)))+e,Ac=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)})(),wc=e=>{switch(e.action){case"move.node":{let t=I.getNode(e.payload.parent);return`to ${t?it.dim.bgBlack(` ${t.title} `):"unknown"} with rank ${e.payload.rank}`}case"tag.issue":{let t=v().tags[e.payload.tagId];return t?it.bgHex(de(t.name))(` ${t.name} `):"unknown tag"}case"untag.issue":{let t=v().tags[e.payload.tagId];return t?it.bgHex(de(t.name))(` ${t.name} `):"unknown tag"}case"assign.issue":{let t=v().contributors[e.payload.contributor];return t?it.hex(de(t.name))(` ${t.name} `):"unknown user"}case"unassign.issue":{let t=v().contributors[e.payload.contributor];return t?it.hex(de(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""}},Tc=e=>{let t=Fi(bc(e));return it.gray(Rc(t,8))},Mc=12,Pc=e=>Sc(`${e}`,Mc),cs=e=>{let t=Tc(e.id),n=Pc(e.userName),r=Ac(e.action),o=wc(e),i=it.dim("\u203A"),a=[r,o].filter(Boolean).join(" ");return`${n} ${t} ${i} ${a}`};var D={exit(){process.exit(0)},enterChildNode(){let e=v(),t=e.currentNode,n=Math.max(0,e.selectedIndex),r=T(t.id)[n];!r||t.context==="FIELD"||D.navigate({currentNode:r,selectedIndex:T(r.id).length?0:-1})},enterParentNode(){let{currentNode:e,nodes:t}=v();if(!e.parentNodeId){logger.info("Missing parent node id");return}let n=t[e.parentNodeId];if(!n){logger.error("Parent not found");return}let r=T(n.id),o=r.findIndex(({id:a})=>a===e.id),i=r.length===0?-1:o>=0?o:0;D.navigate({currentNode:n,selectedIndex:i})},navigateToNextItem:()=>ls(1),navigateToPreviousItem:()=>ls(-1),navigateToNextContainer:()=>us(1),navigateToPreviousContainer:()=>us(-1),navigate:({currentNode:e=v().currentNode,selectedIndex:t})=>{S({currentNodeId:e.id,selectedIndex:t})}},ls=e=>{let t=v(),n=T(t.currentNode.id).length;if(n===0)return;let o=(Math.max(0,t.selectedIndex)+e+n)%n;D.navigate({selectedIndex:o})},us=e=>{let{currentNode:t,nodes:n,selectedIndex:r}=v();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!t||!o)return;let i=T(o.id),a=i.findIndex(x=>x.id===t.id);if(a<0)return;let c=i.at(a+e)??i.at(0);if(!c)return;let u=T(c.id),m=Math.max(0,u.length-1),p=Math.min(Math.max(0,r),m),g=u.length?p:-1;D.navigate({currentNode:c,selectedIndex:g})};import{Box as On,Text as kc}from"ink";import Le from"react";var ms=({selectedIndex:e,parent:t,selected:n})=>{let{currentNode:r}=G(),{title:o}=t,i=T(t.id).map(a=>{let c=typeof a.props?.value=="string"?a.props.value:"";if(o==="Assignees")return I.getContributor(c)?.id;if(o==="Tags")return I.getTag(c)?.id}).filter(a=>!!a);return Le.createElement(On,{alignItems:"center",paddingTop:1},Le.createElement(On,{minWidth:12},Le.createElement(me,{isSelected:n}),Le.createElement(kc,{color:n?N.accent:N.secondary2},o,":")),Le.createElement(On,{flexDirection:"row",marginLeft:1,paddingRight:1},i.map((a,c)=>{let u=r.id===t.id&&c===e;return Le.createElement(On,{key:`${o}-${a}`,paddingRight:2,minHeight:1},Le.createElement(me,{isSelected:u}),o==="Assignees"?Le.createElement(Ct,{isSelected:u,id:a}):o==="Tags"?Le.createElement(Nt,{isSelected:u,id:a}):null)})))};import{Box as Bn,Text as Jr}from"ink";import Oe,{useEffect as Dc}from"react";var Qr=({id:e,label:t,text:n,height:r,selected:o,maxWidth:i})=>{let{selectedIndex:a,currentNode:c}=G(),u=x=>String(x).replace(/\r?\n/g,""),m=typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[];Dc(()=>{let x=[];return m.forEach((E,A)=>{let R=Pe(BigInt(A+1));if(!Ee(R))return;let b=ie.text({id:`${e}-${A}`,name:`Line ${A+1}`,parentNodeId:e,rank:R.value,props:{value:E},readonly:!0,isVirtual:!0}),w=I.createNode(b);Ee(w)&&x.push(w.value.id)}),()=>x.forEach(I.deleteNode)},[e,n]);let p="\u2029",g=m.map((x,E)=>{let A=c.id===e&&a===E;return Oe.createElement(Bn,{key:`${e}-${E}`},Oe.createElement(Jr,{color:A?N.primary:N.secondary2,dimColor:!A},`${E+1} `.padStart(5,"\xA0")),Oe.createElement(Jr,{backgroundColor:A?"gray":""},u(x.length?dn(x,i-10):p)))});return Oe.createElement(Bn,{flexDirection:"column",paddingTop:1},Oe.createElement(Bn,null,Oe.createElement(me,{isSelected:o}),Oe.createElement(Jr,{color:o?N.accent:N.secondary2},t)),Oe.createElement(Bn,{flexDirection:"row",borderStyle:"round",borderColor:N.secondary,paddingLeft:1,paddingRight:1,marginLeft:1},Oe.createElement(Fn,{scrollByOne:!0,children:g,height:r-2,selectedIndex:a,itemHeight:1})))};var Lc=e=>`${e}::log`,fs=e=>e==="Assignees"||e==="Tags",gs=({ticket:e,height:t})=>{let{selectedIndex:n,currentNode:r}=G(),o=process.stdout.columns||120,i=ps(()=>Lc(e.id),[e.id]),a=ps(()=>[...e.log].reverse().map(cs).join(`
44
- `),[e.log]);eo(()=>{if(I.getNode(i))return;let w=Pe(et);if(d(w))return;let U={...ie.field({id:i,name:Y.HISTORY,parentNodeId:e.id,rank:w.value,props:{value:a},isVirtual:!0}),readonly:!0,childRenderAxis:"vertical"};return I.createNode(U),()=>{I.deleteNode(i)}},[i,e.id,a]),eo(()=>{let b=I.getNode(i);b&&b.props.value!==a&&I.updateNode({...b,props:{...b.props,value:a},childRenderAxis:"vertical",readonly:!0})},[i,a]);let c=r.id===e.id,u=r.id===i||r.parentNodeId===i;eo(()=>{u&&(n>=0||D.navigate({selectedIndex:0}))},[u,n]);let m=T(e.id);if(u){let b=I.getNode(i),U=t-3;return Ke.createElement(Zr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},b?Ke.createElement(Qr,{id:b.id,label:"Event log",text:b.props.value??"",selected:!1,maxWidth:o,height:U}):null)}let p=m.reduce((b,w)=>fs(w.title)||w.id===i?b+1:b,0),g=2,x=p*1,A=t-3-x-g,R=(b,w)=>fs(b.title)?Ke.createElement(ms,{key:b.id,parent:b,selected:w,selectedIndex:n}):b.id===i?Ke.createElement(Zr,{key:b.id,paddingTop:1},Ke.createElement(me,{isSelected:w}),Ke.createElement(Fc,{backgroundColor:N.secondary,color:w?N.accent:N.primary}," History \u203A\u203A ")):b.title===Y.DESCRIPTION?Ke.createElement(Qr,{label:"Description (press e to edit)",key:b.id,id:b.id,text:b.props.value??"",selected:w,maxWidth:o,height:A}):null;return Ke.createElement(Zr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},m.map((b,w)=>R(b,c&&n===w)))};var Bc=({swimlanes:e,currentNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:i,height:a,width:c})=>{let u=t.context,m=u===P.TICKET||u===P.FIELD_LIST||u===P.FIELD,p=u===P.BOARD||u===P.SWIMLANE,g=u===P.TICKET?t:r.find(b=>b.context===P.TICKET),x=Math.floor(c/3),E=Math.floor(c/Math.max(e.length,1)),A=Math.min(E,x),R=i==="dense";return Un.createElement(Oc,{flexDirection:"row",height:a},p&&e.map((b,w)=>{let U=t.id===b.id,le=U?n:-1,ne=t.context===P.BOARD&&n===w;return Un.createElement(as,{key:b.id,height:a,width:A,swimlane:b,isSelected:ne,isDense:R,isFocused:U,listSelectedIndex:le,mode:o})}),m&&g&&Un.createElement(gs,{height:a,ticket:g}))},$n=Un.memo(Bc);import{render as Wc}from"ink";import{Writable as _c}from"node:stream";var qt=e=>String(e).padStart(2,"0"),jc=e=>{let t=e.getUTCFullYear(),n=qt(e.getUTCMonth()+1),r=qt(e.getUTCDate()),o=qt(e.getUTCHours()),i=qt(e.getUTCMinutes()),a=qt(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${i}-${a}`},Hc=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",Kc=async(e,{width:t,height:n})=>{let r="",o=new _c({write(a,c,u){let m=Vc(a.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),u()}});o.columns=t,o.rows=n,o.isTTY=!0;let i=Wc(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(a=>setTimeout(a,0)),i.unmount(),r},Vc=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),ys=async()=>{let{viewMode:e}=L(),{currentNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:i}=v(),a=r.find(w=>w.context==="BOARD");if(!a)return s("No board found to export");let c=120,u=40,m=await Kc($c.createElement($n,{height:u,width:c,swimlanes:(i[a.id]??[]).filter(w=>w!==void 0&&lt(w)),currentNode:t,selectedIndex:n,breadCrumb:r,viewMode:e??"dense",mode:o}),{width:c,height:u});if(!m)return s("Failed to render board export");let p=$e(process.cwd());if(d(p))return s("Unable to export, epiq root not found");let g=new Date,x=jc(g),E=`board_${Hc(a.title)}_${x}.md`,A=Eo(p.value);vs.mkdirSync(A,{recursive:!0});let R=Uc.join(A,E),b=`# Board - ${a.title}
45
- Date: ${g.toISOString()}
21
+ `).filter(Boolean).filter(a=>a!==Be);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(d(o))return s(`Failed to clean storage branch
22
+ ${o.message}`);let i=await At({cwd:e,message:"[epiq:repair-storage-branch]"});return d(i)?s(i.message):c("Cleaned storage branch",!0)},wt=wr(async(e=process.cwd())=>{let t=await L({args:["rev-parse","--show-toplevel"],cwd:e});return d(t)?s("Not inside a Git repository"):c("Resolved repo root",t.value.stdout.trim())},e=>Pe.resolve(e)),kp=wr(async e=>{let t=await L({args:["rev-parse","--git-dir"],cwd:e});if(d(t))return s(t.message);let n=t.value.stdout.trim(),r=Pe.isAbsolute(n)?n:Pe.join(e,n);return c("Resolved git dir",r)},e=>Pe.resolve(e));var $p=process.env.IS_LOCAL==="true",Be=".epiq",be=".epiq-global",Mn="events",kd="project.json",En=e=>Ue.join(e,Be),Nn=e=>Ue.join(En(e),kd),Qt=e=>Ue.join(En(e),Mn),yi=e=>Ue.join(e,Be),Ld=e=>{let t=Ue.join(e,Be);return Jt.existsSync(t)&&Jt.statSync(t).isDirectory()},Fr=e=>{let t=Nn(e);return Jt.existsSync(t)&&Jt.statSync(t).isFile()},Rt=e=>{let t=Ue.resolve(e);for(;;){if(Ld(t))return c("Resolved closest .epiq root",t);let n=Ue.dirname(t);if(n===t)return s("No .epiq directory found in any parent");t=n}},Xe=e=>{let t=Ue.resolve(e);for(;;){if(Fr(t))return c("Resolved closest epiq project root",t);let n=Ue.dirname(t);if(n===t)return s("No .epiq/project.json found in any parent");t=n}},xi=e=>{let t=Qt(e);try{return Jt.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")}},we=async()=>{let e=await wt(process.cwd());if(d(e))return e;let t=wn({repoRoot:e.value});return d(t)?t:c("Resolved persist root",t.value)};var Y={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History"};import{useSyncExternalStore as iu}from"react";var f={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"command-line",PALETTE:"palette"};function Pn(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var kn=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",hi=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var Ci=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},Ei=(e,t)=>t?e.get(t)??[]:[];var Ni=new WeakMap,Dd=e=>{let t=Ni.get(e);return t||(t=Ci(e),Ni.set(e,t)),t};var bi=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return Ei(Dd(e),r).filter(i=>Pn(r,i)>=n)};var Fd={hint:"",hints:[],overlap:0,remainder:""},Si=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return Fd;let o=bi({wordList:r,inputToMatch:e,overlapThreshold:1});return Od(t,o)},Od=(e,t)=>{let n=t[0]??"",r=Pn(e.toLowerCase(),n.toLowerCase()),[o,i]=n.split(":"),a=r<(o??"").length,l=!!i,p=(l&&a?o:n)+(l&&a?":":" "),v=p.slice(r);return{hint:p,hints:t,overlap:r,remainder:v}};var Ln={autoSyncIntervalMs:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},$=()=>Ln,ye=e=>(Ln={...Ln,...e},Ln);var Tt=3e3,Ii=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<Tt?null:t},Ri=0,Or,Br=!1,Zt=!1,Ur=()=>{if(Br)return!0;let e=Je();return d(e)?!1:e.value.syncStatus.status==="syncing"},Bd=()=>{let e=$().autoSyncIntervalMs??1e4,t=Date.now()-Ri;return Math.max(0,e-t)},Ai=()=>{Or||(Or=setTimeout(async()=>{if(Or=void 0,!!Mt()){if(Ur()){Zt=!0;return}Zt=!1,await Ud()}},Bd()))},Ud=async()=>{if(!Mt())return s("Cannot auto-sync before state is initialized");if(Ur())return Zt=!0,s("Sync already in progress");Br=!0,Ri=Date.now(),b({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await Dn()}finally{Br=!1,Zt&&Ai()}},wi=()=>{Mt()&&(Zt=!0,!Ur()&&Ai())};var Qe=()=>{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}},Ti=()=>{let e=Xe(process.cwd());if(d(e))return!1;let t=Ye(e.value);return ce(t)},Mi=e=>e===!0?"yes":e===!1?"no":null,Pi=e=>e==="yes"?!0:e==="no"?!1:null;var se={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"},h={accent:se.cyan,accent2:se.magenta,primary:se.white,secondary:se.grayDark,secondary2:se.grayLight,gray:se.gray,green:se.green,yellow:se.yellow,red:se.red};var E={red:se.red,yellow:se.yellow,green:se.green,blue:se.blue,magenta:se.magenta,cyan:se.cyan},Pt={urgent:E.red,critical:E.red,important:E.red,blocker:E.red,asap:E.red,immediate:E.red,fail:E.red,failure:E.red,broken:E.red,bug:E.red,error:E.red,incident:E.red,outage:E.red,production:E.red,crash:E.red,security:E.red,warning:E.yellow,warn:E.yellow,risky:E.yellow,risk:E.yellow,attention:E.yellow,pending:E.yellow,review:E.yellow,"needs-review":E.yellow,qa:E.yellow,testing:E.yellow,test:E.yellow,validate:E.yellow,verification:E.yellow,staging:E.yellow,check:E.yellow,"follow-up":E.yellow,followup:E.yellow,waiting:E.yellow,blocked:E.yellow,hold:E.yellow,done:E.green,complete:E.green,completed:E.green,success:E.green,ok:E.green,stable:E.green,resolved:E.green,fixed:E.green,closed:E.green,merged:E.green,released:E.green,deployed:E.green,approved:E.green,verified:E.green,working:E.green,healthy:E.green,pass:E.green,passing:E.green,info:E.blue,information:E.blue,note:E.blue,docs:E.blue,documentation:E.blue,doc:E.blue,guide:E.blue,help:E.blue,explanation:E.blue,detail:E.blue,details:E.blue,context:E.blue,design:E.blue,discussion:E.blue,proposal:E.blue,idea:E.blue,feature:E.magenta,enhancement:E.magenta,improvement:E.magenta,refactor:E.magenta,refactoring:E.magenta,cleanup:E.magenta,optimize:E.magenta,optimization:E.magenta,perf:E.magenta,performance:E.magenta,upgrade:E.magenta,migration:E.magenta,modernize:E.magenta,debt:E.magenta,todo:E.cyan,next:E.cyan,planned:E.cyan,plan:E.cyan,future:E.cyan,backlog:E.cyan,investigate:E.cyan,explore:E.cyan,prototype:E.cyan};var $d=e=>e.props.tags??[],Wd=e=>e.props.assignees??[],$r=e=>$d(e).map(t=>S.getTag(t)).filter(t=>!!t),Wr=e=>Wd(e).map(t=>S.getContributor(t)).filter(t=>!!t),Fn=()=>{let{breadCrumb:e,selectedNode:t}=x(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!W(n)?s("Invalid untag target"):c("Retrieved tags from ticket in breadcrumb",$r(n))},On=()=>{let{breadCrumb:e,selectedNode:t}=x(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!W(n)?s("Invalid unassign target"):c("Retrieved assignees from ticket in breadcrumb",Wr(n))};var y={PALETTE:"?",EXIT:"exit",INIT:"init",HELP:"help",NEW:"new",TAG:"tag",UNTAG:"untag",MOVE:"move",PEEK:"peek",FILTER:"filter",ASSIGN:"assign",UNASSIGN:"unassign",DELETE:"delete",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",CONFIG:"config",EDIT:"edit",SYNC:"sync",EXPORT:"export",NONE:""};var _d=/^(\d+)(h|d|w|mo|y)$/,jd=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,Hd=({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},Vd=(e,t=new Date)=>{let n=e.match(_d);if(!n)return null;let[,r,o]=n,i=Number(r);if(!Number.isInteger(i)||i<=0)return null;let a=new Date(t);switch(o){case"h":return a.setHours(a.getHours()-i),a;case"d":return a.setDate(a.getDate()-i),a;case"w":return a.setDate(a.getDate()-i*7),a;case"mo":return a.setMonth(a.getMonth()-i),a;case"y":return a.setFullYear(a.getFullYear()-i),a;default:return null}},Kd=e=>{let t=e.match(jd);if(!t)return null;let[,n,r,o,i,a]=t,l=Number(n),u=Number(r),m=Number(o),p=i?Number(i):0,v=a?Number(a):0;return Hd({year:l,month:u,day:m,hour:p,minute:v})?new Date(l,u-1,m,p,v):null},Bn=e=>{let t=e.trim().toLowerCase();return Vd(t)??Kd(t)},ki=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,zd=[{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}],Li=(e=zd)=>{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 Gd=["BOARD","TICKET","SWIMLANE"],ee={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs"},Ze={TITLE:"title",DESCRIPTION:"description"},qd=[ee.EDITOR,ee.VIEW,ee.USERNAME,ee.AUTOSYNC,ee.SYNC_DEBOUNCE_MS],Yd=[Ze.TITLE,Ze.DESCRIPTION],jr=[String(Tt),"5000","15000","30000","60000"],mt=[y.SYNC,y.HELP,y.EXPORT,y.CONFIG],Un=[y.NEW,y.EDIT,y.DELETE,y.MOVE],_r=[y.TAG,y.UNTAG,y.ASSIGN,y.UNASSIGN,y.CLOSE_ISSUE,y.RE_OPEN_ISSUE,y.EDIT],Di=[y.FILTER,y.PEEK],Xd={WORKSPACE:[...mt,...Un],BOARD:[...Di,...mt,...Un],SWIMLANE:[...Di,...mt,...Un],TICKET:[...mt,...Un,..._r],FIELD:[...mt,..._r],FIELD_LIST:[...mt,..._r],TEXT:[...mt]},Jd=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],Qd=()=>{let{selectedNode:e,readOnly:t,breadCrumb:n}=x(),{isSetupDone:r}=Qe();if(!r)return[y.HELP,y.CONFIG];if(!Ti())return[y.HELP,y.INIT];if(t)return[y.HELP,y.PEEK,y.EXPORT,y.CONFIG];let o=e?.context,i=o&&Gd.includes(o);return[...new Set([...n,e].map(l=>l?.context).flatMap(l=>l?Xd[l]:[]))].filter(l=>l===y.MOVE?!1:l===y.EDIT||l===y.DELETE?i:!0)},X=e=>{let{currentNode:t}=x(),n=t.context??"WORKSPACE";return{[y.NONE]:Qd(),[y.EXIT]:["confirm"],[y.EXPORT]:[],[y.SYNC]:[],[y.INIT]:[],[y.HELP]:[],[y.PEEK]:[...Li(),"now","prev","next"],[y.EDIT]:[...Yd],[y.DELETE]:["confirm"],[y.RE_OPEN_ISSUE]:["confirm"],[y.CLOSE_ISSUE]:["confirm"],[y.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[y.FILTER]:["tag","assignee","description","title","clear"],[y.TAG]:[...new Set([...Object.keys(Pt),...S.getExistingTags()])],[y.UNTAG]:[...Fn()?.value?.map(({name:o})=>o)??[]],[y.UNASSIGN]:[...On()?.value?.map(({name:o})=>o)??[]],[y.ASSIGN]:S.getExistingAssignees(),[y.NEW]:Jd(n),[y.CONFIG]:[...qd]}[e]??[]};import Lt from"chalk";var Fi=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import{decodeTime as Oi}from"ulid";var Bi=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"},Ui=e=>{let t=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())} ${t(e.getHours())}:${t(e.getMinutes())}`},$n=e=>{try{return c("Decoded date",new Date(Oi(e)))}catch(t){return s("Decoding failed + "+t.message)}},Hr=e=>{if(!e?.id)return null;try{return Oi(e.id)}catch{return null}};var Te=(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 kt from"chalk";var Kr={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Zd=(e,t,n)=>Math.max(t,Math.min(n,e)),Vr=(e,t,n)=>e+(t-e)*n,$i=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},ec=(e,t,n)=>{let r=t/100,o=n/100,i=(1-Math.abs(2*o-1))*r,a=e/60,l=i*(1-Math.abs(a%2-1)),u=0,m=0,p=0;a>=0&&a<1?(u=i,m=l):a>=1&&a<2?(u=l,m=i):a>=2&&a<3?(m=i,p=l):a>=3&&a<4?(m=l,p=i):a>=4&&a<5?(u=l,p=i):(u=i,p=l);let v=o-i/2;return[Math.round((u+v)*255),Math.round((m+v)*255),Math.round((p+v)*255)]},tc=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,nc=(e,t,n)=>[Math.round(Vr(e[0],t[0],n)),Math.round(Vr(e[1],t[1],n)),Math.round(Vr(e[2],t[2],n))],en=e=>{let n=$i(e)%360,r=ec(n,Kr.stringColor.saturation,Kr.stringColor.lightness);return tc(r)},rc=e=>{let t=Kr.gradient.stops,n=Zd(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let r=t.length-1,o=n*r,i=Math.min(Math.floor(o),r-1),a=o-i;return nc(t[i],t[i+1],a)},Wn=e=>$i(e.toLowerCase().trim())/4294967295,Wi=e=>{let t=Wn(e);return rc(t)},oc=e=>{let[t,n,r]=Wi(e);return{normal:o=>kt.bgRgb(t,n,r).black(o),cursor:o=>kt.bgRgb(t,n,r).white.bold(o)}},zr=e=>{let[t,n,r]=Wi(e);return{fg:o=>kt.rgb(t,n,r)(o),fgCursor:o=>kt.rgb(t,n,r).inverse(o),bg:o=>kt.bgRgb(t,n,r).black(o),bgCursor:o=>kt.bgRgb(t,n,r).white.bold(o)}},Gr=e=>oc(e).normal(` ${e} `),ae=(e,t=Pt)=>{let r=(o=>o.toLowerCase().trim())(e);return r&&t[r]?t[r]:en(r)};var pt={None:"none",Invalid:"invalid",Valid:"valid"};var ic=["BOARD","TICKET","SWIMLANE"],Yr=()=>{let e=x().selectedNode;return e?.context?ic.includes(e.context)?H():B({message:"Command not available in this context"}):B({message:"Missing target context"})},J="<ENTER> to confirm",H=(e="",t=[])=>({message:e,validity:pt.Valid,completionWordList:t}),B=({message:e,completionWordList:t=[]})=>({validity:pt.Invalid,message:e,completionWordList:t}),_n=e=>e.length===0,xe=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:i=1})=>{let a=o.trim();if(a.length<i)return"";let p=[...t.filter(Boolean).filter(v=>v.startsWith(a))].sort((v,C)=>Wn(v)-Wn(C)).slice(0,r).map(Gr).join(" ");return p?`${e}${p}${n}`:""},qr=({modifier:e})=>{let t="confirm";return e===t?H(J):B({message:_n(e)?`if you are certain, enter ${Gr(t)}`:"",completionWordList:[t]})},sc=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?B({message:n}):H():B({message:_n(r)?t:"",completionWordList:[...e]}),tn=({hint:e})=>({modifier:t,inputString:n})=>_n(t)&&_n(n)?B({message:e,completionWordList:[]}):H(J),ac=({modifier:e,inputString:t})=>{let n=X(y.CONFIG);if(!n.includes(e))return B({message:xe({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case ee.EDITOR:{let r=[...Fi];return t.trim()?r.includes(t.trim())?H(J):B({message:xe({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):B({message:xe({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case ee.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?H(J):B({message:xe({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case ee.USERNAME:return t.trim()?H(J):B({message:`Enter a user name. Saved in ${Lt.bgBlack("~/.epiq-global/config.json")}`});case ee.AUTOSYNC:{let r=["yes","no"],o=$().autoSync;if(!r.includes(t.trim())){let i=Mi(o);return B({message:xe({prefix:`should auto-sync (recommended)${i!==null?", currently: "+i:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return H(J)}case ee.SYNC_DEBOUNCE_MS:{let r=$().autoSyncIntervalMs,o=Ii(t);if(!t.trim()||o===null||o<Tt){let i=xe({prefix:" examples: ",wordList:jr,minLengthForHints:0,inputString:t});return B({message:`provide duration above ${Tt}ms. current duration: ${r}ms.`+i,completionWordList:jr})}return H(J)}default:return B({message:"Unknown config option",completionWordList:n})}},dc=({modifier:e})=>{let t=X(y.EDIT);if(!t.includes(e)){let r=xe({prefix:"edit... ",wordList:t,inputString:e,minLengthForHints:0});return B({message:r||"Unknown edit option",completionWordList:t})}let n=Yr();if(n.validity==="invalid")return n;switch(e){case Ze.TITLE:return H(J);case Ze.DESCRIPTION:return H("<ENTER> to edit in "+$().preferredEditor);default:return B({message:"Unknown edit option",completionWordList:t})}},cc={[y.EXPORT]:()=>H(J+", and create export markdown file"),[y.PEEK]:e=>{let t=e.modifier;if(t==="now")return H(J);let n={message:"historical state from: '1h', '2d', '23h', '1mo', '2y', 'previous', 'next' or full date as YYYY-MM-DD"};if(t==="prev"||t==="next")return H(J);let r=Bn(t);if(!t||!r)return B(n);let o=Te(x().breadCrumb,"BOARD");if(d(o))return B({message:"Command is not applicable in this context"});let i=$n(o.value.id);return d(i)?B({message:"Unable to peek: board id is not a valid ULID"}):ki({date:r,horizonDate:i.value})?H(J):B({message:Lt.red(`nothing to peek before ${i.value.toISOString().slice(0,16).replace("T"," ")}`)})},[y.EXIT]:()=>H(J+" and exit the application"),[y.INIT]:()=>H(J),[y.PALETTE]:()=>H(J),[y.FILTER]:e=>{if(e.modifier==="clear")return H();let t=i=>X(y.FILTER).includes(i);if(!e.modifier||!t(e.modifier))return B({message:xe({wordList:X(y.FILTER),inputString:e.inputString}),completionWordList:X(y.FILTER)});let n=Object.values(x().tags).map(i=>i.name),r=Object.values(x().contributors).map(i=>i.name),o=e.modifier==="tag"?n:e.modifier==="assignee"?r:[];return e.inputString?o.length&&!o.includes(e.inputString.trim())?B({message:xe({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString}),completionWordList:o}):H():B({message:xe({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString}),completionWordList:o})},[y.NONE]:e=>{let t=X(y.NONE);return B({message:xe({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[y.NEW]:e=>sc({list:X(y.NEW),hint:xe({wordList:X(y.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[y.HELP]:()=>H(J),[y.EDIT]:dc,[y.CONFIG]:ac,[y.DELETE]:e=>{let t=Yr();return t.validity==="invalid"?t:qr(e)},[y.CLOSE_ISSUE]:e=>qr(e),[y.RE_OPEN_ISSUE]:e=>qr(e),[y.MOVE]:e=>{let t=Yr();return t.validity==="invalid"?t:tn({hint:xe({prefix:"hey hacker! These commands are blocked for you... ",wordList:X(y.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[y.TAG]:e=>{let n=S.getExistingTags().map(r=>` ${Lt.bgHex(ae(r))(" "+r+" ")} `).slice(0,10).join("");return tn({hint:n.length?"existing tags ... "+n:"create tag ..."})(e)},[y.UNTAG]:e=>{let t=Fn();if(d(t))return B({message:"Invalid untag target",completionWordList:[]});let n=t.value.map(({name:r})=>r).map(r=>` ${Lt.bgHex(ae(r))(" "+r+" ")} `).slice(0,10);return n.length?tn({hint:" ... "+n.join("")})(e):B({message:"Issue has no tags",completionWordList:[]})},[y.ASSIGN]:e=>{let t=S.getExistingAssignees().map(n=>` ${Lt.bgHex(ae(n))(" "+n+" ")} `).slice(0,10);return tn({hint:"assign to... "+t.join("")})(e)},[y.UNASSIGN]:e=>{let t=On();if(d(t))return B({message:"Invalid unassign target",completionWordList:[]});let n=t.value.map(({name:r})=>r).map(r=>` ${Lt.bgHex(ae(r))(" "+r+" ")} `).slice(0,10);return n.length?tn({hint:"remove assignee... "+n.join("")})(e):B({message:"Issue has no assignees",completionWordList:[]})},[y.SYNC]:()=>H(J)},_i=Object.fromEntries(Object.entries(cc).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var ji=["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 Hi=e=>Object.values(y).includes(e),Vi=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:i}=e,{message:a,validity:l,completionWordList:u}=_i[n].validate(n,r,i),m=o==="command"||o==="modifier"?X(n):ji,{mode:p}=x(),v=p===f.COMMAND_LINE?a??"":"",C=[...u,...m];return{validity:l,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:v,autoCompletion:t?Si(e,C):{hint:"",hints:[],remainder:"",overlap:0}}};var Ki=e=>{let t=e.trimStart(),n=uc(t),r=n[0]??"",o=n[1]??"",i=/\s$/.test(e),a=mc(e),l=Hi(r)?r:null,u=l!==null,m=r!=="",p=l?X(l)??[]:[],v=l&&p.includes(o)?o:"",C="word";n.length===0||n.length===1&&!i?C="command":(n.length===1&&i||n.length===2&&!i)&&(C="modifier");let N=i?"":a,I=lc(t,l,v);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:a,hasCommand:m,command:l,isCommandKeyword:u,isLastWordCompleted:i,modifier:v,target:C,inputToMatch:N,inputString:I}},lc=(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},uc=e=>e.trim()?e.trim().split(/\s+/):[],mc=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as pc}from"react";var Dt=e=>e===Xr||e===":",Xr=" ",de={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:pt.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},Jr=new Set,zi=()=>{for(let e of Jr)e()},Qr=e=>(Jr.add(e),()=>Jr.delete(e)),$e=e=>{let n=e(de),r=Ki(n.value),o=n.cursorPosition===n.value.length;de={...n,commandMeta:Vi(r,o)},zi()},nn=({message:e,status:t})=>{let n=structuredClone(de);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,de=n,zi(),c(e,null)},Zr=e=>{$e(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},eo=e=>{$e(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&Dt(n[o-1]);)o--;for(;o>0&&!Dt(n[o-1]);)o--}else{for(;o<n.length&&!Dt(n[o]);)o++;for(;o<n.length&&Dt(n[o]);)o++}return{...t,cursorPosition:o}})},Gi=()=>{$e(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}})},qi=()=>{$e(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&Dt(t[r-1]);)r--;for(;r>0&&!Dt(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},_=e=>{$e(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),r=t.value.slice(0,n),o=t.value.slice(n),i=e(r,t.commandMeta.autoCompletion),a=i+o,l=Math.max(0,Math.min(i.length,a.length));return{...t,value:a,cursorPosition:l,commandIsPending:!1}})},Yi=()=>{$e(e=>({...e,commandIsPending:!0}))},Xi=({addToHistory:e=!0})=>{$e(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),fc()},Ji=()=>{$e(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}})},Qi=()=>{$e(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},fc=()=>_(()=>""),K=()=>de,Zi=()=>pc(Qr,K,K),es=()=>{let[e,...t]=de.value.split(Xr);return t.join(Xr).trim()};var ts=(e,t)=>e.ctrl&&e.name==="w"||e.meta&&e.name==="backspace"||t==="",ns=(e,t)=>e.meta&&e.name==="b"||t==="\x1Bb",rs=(e,t)=>e.meta&&e.name==="f"||t==="\x1Bf",os=(e,t)=>{if(ns(e,e.sequence))return g.MoveCursorLeftOfWord;if(rs(e,e.sequence))return g.MoveCursorRightOfWord;if(ts(e,e.sequence))return g.EraseInputWord;switch(e.name){case"tab":return g.AutoCompleteCommand;case"up":return g.GetLastCommandFromHistory;case"down":return g.GetNextCommandFromHistory;case"left":return g.MoveCursorLeft;case"right":return g.MoveCursorRight;case"return":return g.Confirm;case"backspace":return t?g.EraseInput:g.ExitCommandLine;case"escape":return g.ExitCommandLine;default:return g.CaptureInput}},is=(e,t)=>{if(ns(e,e.sequence))return g.MoveCursorLeftOfWord;if(rs(e,e.sequence))return g.MoveCursorRightOfWord;if(ts(e,e.sequence))return g.EraseInputWord;switch(e.name){case"tab":return g.AutoCompleteCommand;case"up":return g.NavPreviousItem;case"down":return g.NavNextItem;case"left":return g.MoveCursorLeft;case"right":return g.MoveCursorRight;case"return":return g.Confirm;case"backspace":return t?g.EraseInput:g.ExitCommandLine;case"escape":return g.ExitCommandLine;default:return g.CaptureInput}};var g={Sync:"sync",NavPreviousItem:"navPreviousItem",NavNextItem:"navNextItem",NavToPreviousContainer:"navToPreviousContainer",NavToNextContainer:"navToNextContainer",MovePreviousItem:"movePreviousItem",MoveNextItem:"moveNextItem",MoveToPreviousContainer:"moveToPreviousContainer",MoveToNextContainer:"moveToNextContainer",Confirm:"confirm",Exit:"exit",ViewHelp:"viewHelp",HideHelp:"hideHelp",InitMove:"initMove",ConfirmMove:"confirmMove",Delete:"Delete",InitCommandPalette:"initCommandPalette",InitCommandLine:"initCommandLine",ExitCommandLine:"exitCommandLine",CaptureInput:"captureInput",EraseInput:"eraseInput",AddItem:"addItem",GetLastCommandFromHistory:"getLastCommandFromHistory",GetNextCommandFromHistory:"getNextCommandFromHistory",AutoCompleteCommand:"autoCompleteCommand",MoveCursorLeft:"MoveCursorLeft",MoveCursorRight:"MoveCursorRight",MoveCursorLeftOfWord:"MoveCursorLeftOfWord",MoveCursorRightOfWord:"MoveCursorRightOfWord",EraseInputWord:"EraseInputWord",None:"None",Edit:"edit",SetViewDense:"SetViewDense",SetViewWide:"SetViewWide"};function gc(e){switch(e.name){case"up":case"down":case"left":case"right":return e.name;default:return null}}function vc(e){switch(e.name){case"k":return"up";case"j":return"down";case"h":return"left";case"l":return"right";default:return null}}function yc(e,t,n){let r=x().currentNode.childNavigationAcrossParents;switch(t){case"up":return e==="vertical"?n.prevItem:r?n.prevContainer:null;case"down":return e==="vertical"?n.nextItem:r?n.nextContainer:null;case"left":return e==="horizontal"?n.prevItem:r?n.prevContainer:null;case"right":return e==="horizontal"?n.nextItem:r?n.nextContainer:null}}function ss(e,t){let n=K();if(e.sequence==="?"&&n.value==="")return g.InitCommandPalette;if(e.sequence===":"&&n.value==="")return g.InitCommandLine;if(t===f.MOVE)switch(e.name){case"m":case"return":return g.ConfirmMove}if(t===f.COMMAND_LINE)return os(e,n.value);if(t===f.PALETTE)return is(e,n.value);let r=gc(e)||vc(e);if(r)return xc(r,t);if(e.ctrl&&e.name==="c")return g.Exit;switch(e.name){case"e":return g.Edit;case"n":return g.AddItem;case"m":return g.InitMove;case"d":return g.Delete;case"return":return g.Confirm;case"space":return g.Confirm;case"v":return $().viewMode==="wide"?g.SetViewDense:g.SetViewWide;case"q":case"escape":return g.Exit;case"s":return g.Sync;default:return null}}function xc(e,t){let n=t===f.MOVE?{prevItem:g.MovePreviousItem,nextItem:g.MoveNextItem,prevContainer:g.MoveToPreviousContainer,nextContainer:g.MoveToNextContainer}:{prevItem:g.NavPreviousItem,nextItem:g.NavNextItem,prevContainer:g.NavToPreviousContainer,nextContainer:g.NavToNextContainer};return yc(x().currentNode.childRenderAxis,e,n)}var jn=e=>{let{context:t}=x().currentNode;if(!t)return T.None;switch(e){case y.EXIT:return T.Exit;case y.EXPORT:return T.Export;case y.INIT:return T.Init;case y.DELETE:return T.Delete;case y.EDIT:return T.Edit;case y.HELP:return T.ViewHelp;case y.RE_OPEN_ISSUE:return T.ReopenIssue;case y.CLOSE_ISSUE:return T.CloseIssue;case y.TAG:return T.TagTicket;case y.UNTAG:return T.UntagTicket;case y.ASSIGN:return T.AssignUserToTicket;case y.UNASSIGN:return T.UnassignUserFromTicket;case y.NEW:return T.NewItem;case y.FILTER:return T.Filter;case y.MOVE:return T.Move;case y.PEEK:return T.Peek;case y.CONFIG:return T.Config;case y.SYNC:return T.Sync;default:return T.None}},T={Exit:"exit",Init:"init",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",Peek:"peek",Config:"config",NewItem:"add-new-item",TagTicket:"ticket-tag",UntagTicket:"ticket-untag",AssignUserToTicket:"ticket-assign-user",UnassignUserFromTicket:"ticket-unassign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Sync:"sync",Export:"export"};import{ulid as ve}from"ulid";import ys from"node:fs";import Vc from"node:path";import Kc from"react";import{Box as jc}from"ink";import Gn from"react";import{Box as ro,Text as Mc}from"ink";import ke from"react";import{Text as as}from"ink";import ds,{useEffect as cs,useState as hc}from"react";var ls={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"command-line":["\u276F "],palette:["\u276F "]},ge=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=Q(),r=ls[n]??ls.default,[o,i]=hc(0);if(cs(()=>{i(0)},[r]),cs(()=>{if(!e)return;let l=setInterval(()=>{i(u=>(u+1)%r.length)},500);return()=>clearInterval(l)},[e,r]),!e)return ds.createElement(as,null,t);let a=r[o]??r[0]??t;return ds.createElement(as,{color:h.accent,dimColor:o===1},a)};import{Box as to,Text as Cc}from"ink";import Hn from"react";var Ft=({children:e=[],height:t,selectedIndex:n,itemHeight:r=1,scrollByOne:o=!1})=>{if(e.length===0)return null;let i=Math.max(1,Math.floor(t)),a=Math.max(1,Math.ceil(r)),l=Math.max(1,Math.floor(i/a)),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),v=p+l,C=e.slice(p,v),N=e.length>l,I=i,P=N?Math.max(1,Math.floor(l/e.length*I)):I,R=Math.max(0,I-P),w=Math.max(1,e.length-l),D=N?Math.floor(p/w*R):0;return Hn.createElement(to,{flexDirection:"row",height:i,width:"100%"},Hn.createElement(to,{flexDirection:"column",flexGrow:1,height:i},C),Hn.createElement(to,{flexDirection:"column",width:1,height:I},Array.from({length:I}).map((Z,oe)=>Hn.createElement(Cc,{key:oe,color:N&&oe>=D&&oe<D+P?h.accent:h.secondary},N?"\u2502":" "))))};import{Box as Vn,Text as Ac}from"ink";import ft from"react";import{Text as Ec}from"ink";import Nc from"react";var bc=e=>e.toLowerCase().trim(),Sc=(e,t=Pt)=>{let n=bc(e);return t[n]?t[n]:en(n)},Ot=({id:e,isSelected:t})=>{let n=S.getContributor(e);if(n)return Nc.createElement(Ec,{underline:t,color:Sc(n.name)},"@"+n.name)};import{Text as Ic}from"ink";import Rc from"react";var Bt=({id:e,isSelected:t})=>{let n=S.getTag(e);if(n)return Rc.createElement(Ic,{underline:t,backgroundColor:ae(n.name),color:h.primary}," "+n.name+" ")};var us=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=kn(hi(t.title),r),i=$r(t),a=Wr(t);return ft.createElement(Vn,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?h.accent:h.secondary,justifyContent:"space-between"},ft.createElement(Vn,{borderBottom:!0},ft.createElement(Vn,{paddingLeft:1,flexDirection:"column"},ft.createElement(Ac,{color:h.primary},o))),ft.createElement(Vn,{flexDirection:"row",paddingLeft:1},i.map(l=>ft.createElement(Bt,{key:l.id,id:l.id})),a.map(l=>ft.createElement(Ot,{key:l.id,id:l.id}))))};import wc from"chalk";import{Box as rn,Text as no}from"ink";import We from"react";var Tc=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,ms=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let i=(t.props.tags??[]).map(N=>S.getTag(N)).filter(N=>!!N),a=(t.props.assignees??[]).map(N=>S.getContributor(N)).filter(N=>!!N),l=1,u=i.length*(1+l),m=a.length*(2+l),p=i.map(N=>We.createElement(rn,{key:N.id,paddingRight:l},We.createElement(no,{color:ae(N.name)},"\u25A0"))),v=a.map(N=>We.createElement(rn,{key:N.id,paddingRight:l},We.createElement(no,{color:en(N.name)},"@"+N.name.at(0)))),C=n?h.accent:o===f.MOVE?h.secondary:h.primary;return We.createElement(rn,{borderBottom:!0,justifyContent:"space-between"},We.createElement(rn,null,We.createElement(ge,{isSelected:n,placeholder:wc.dim.gray(r+1+" ")}),We.createElement(no,{wrap:"truncate",color:C},Tc(t.title,e-u-m-14))),We.createElement(rn,null,p,v))};import Pc from"chalk";var kc=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:i,listSelectedIndex:a,mode:l})=>{let{renderedChildrenIndex:u}=Q(),m=u[e.id]??[],p=`${e.title} ${Pc.hex(h.secondary2).dim("("+m.length+")")}`,v=3,C=o?1:4,N=r-v-(o?2:1),I=ke.createElement(ro,{borderStyle:"round",borderColor:h.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},ke.createElement(ge,{isSelected:t}),ke.createElement(Mc,{bold:!0,color:t?h.accent:h.primary},p," ",e.readonly?"\u{1F512}":"")),P=(R,w)=>{let D=i&&a===w;return o?ke.createElement(ms,{key:R.id,index:w,width:n,ticket:R,isSelected:D,mode:l}):ke.createElement(us,{key:R.id,width:n,ticket:R,isSelected:D})};return ke.createElement(ro,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?h.accent:h.secondary,paddingRight:1,paddingLeft:1,height:r},I,ke.createElement(ro,{padding:o?1:0},m.length>0&&ke.createElement(Ft,{selectedIndex:a,height:N,itemHeight:C},m.map(P)),ke.createElement(ge,{isSelected:i&&a===-1})))},ps=ke.memo(kc);import{Box as so,Text as $c}from"ink";import tt,{useMemo as gs}from"react";import{decodeTime as Lc,encodeTime as Dc}from"ulid";var Fc="0123456789ABCDEFGHJKMNPQRSTVWXYZ",Oc=e=>{let t=2166136261;for(let o of e)t^=o.charCodeAt(0),t=Math.imul(t,16777619);let n=BigInt(t>>>0),r="";for(let o=0;o<16;o++)n=n*1103515245n+12345n&0xffffffffn,r+=Fc[Number(n%32n)];return r},et=(e,t)=>{let n=Lc(e);return Dc(n,10)+Oc(`${e}:${t}`)};import{Box as Kn,Text as Bc}from"ink";import _e from"react";var fs=({selectedIndex:e,parent:t,selected:n})=>{let{currentNode:r}=Q(),{title:o}=t,i=t.parentNodeId?S.getNode(t.parentNodeId):void 0,a=i&&W(i)?o===Y.ASSIGNEES?i.props.assignees??[]:o===Y.TAGS?i.props.tags??[]:[]:[];return _e.createElement(Kn,{alignItems:"center",paddingTop:1},_e.createElement(Kn,{minWidth:12},_e.createElement(ge,{isSelected:n}),_e.createElement(Bc,{color:n?h.accent:h.secondary2},o,":")),_e.createElement(Kn,{flexDirection:"row",marginLeft:1,paddingRight:1},a.map((l,u)=>{let m=r.id===t.id&&u===e;return _e.createElement(Kn,{key:`${o}-${l}`,paddingRight:2,minHeight:1},_e.createElement(ge,{isSelected:m}),o===Y.ASSIGNEES?_e.createElement(Ot,{isSelected:m,id:l}):o===Y.TAGS?_e.createElement(Bt,{isSelected:m,id:l}):null)})))};import{Box as zn,Text as oo}from"ink";import je,{useEffect as Uc}from"react";var te={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:A.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:A.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:A.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:a=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:A.FIELD,childRenderAxis:i,parentNodeId:n,readonly:!1,log:[],isVirtual:a}),fieldList:({id:e,name:t,parentNodeId:n,rank:r,childRenderAxis:o="horizontal",isVirtual:i=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:A.FIELD_LIST,childRenderAxis:o,parentNodeId:n,readonly:!1,log:[],isVirtual:i}),ticket:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:A.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,rank:r,props:o={},readonly:i=!0,isVirtual:a=!0})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:A.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:i,log:[],isVirtual:a})};var io=({id:e,label:t,text:n,height:r,selected:o,maxWidth:i})=>{let{selectedIndex:a,currentNode:l}=Q(),u=C=>String(C).replace(/\r?\n/g,""),m=typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[];Uc(()=>{let C=[];return m.forEach((N,I)=>{let P=Ae(BigInt(I+1));if(!ce(P))return;let R=te.text({id:`${e}-${I}`,name:`Line ${I+1}`,parentNodeId:e,rank:P.value,props:{value:N},readonly:!0,isVirtual:!0}),w=S.createNode(R);ce(w)&&C.push(w.value.id)}),()=>C.forEach(S.deleteNode)},[e,n]);let p="\u2029",v=m.map((C,N)=>{let I=l.id===e&&a===N;return je.createElement(zn,{key:`${e}-${N}`},je.createElement(oo,{color:I?h.primary:h.secondary2,dimColor:!I},`${N+1} `.padStart(5,"\xA0")),je.createElement(oo,{backgroundColor:I?"gray":""},u(C.length?kn(C,i-10):p)))});return je.createElement(zn,{flexDirection:"column",paddingTop:1},je.createElement(zn,null,je.createElement(ge,{isSelected:o}),je.createElement(oo,{color:o?h.accent:h.secondary2},t)),je.createElement(zn,{flexDirection:"row",borderStyle:"round",borderColor:h.secondary,paddingLeft:1,marginLeft:1},je.createElement(Ft,{scrollByOne:!0,children:v,height:r-2,selectedIndex:a,itemHeight:1})))};var Wc=e=>et(e,"description"),_c=e=>et(e,"history"),vs=({ticket:e,height:t})=>{let{selectedIndex:n,currentNode:r}=Q(),o=process.stdout.columns||120,i=gs(()=>Wc(e.id),[e.id]),a=gs(()=>_c(e.id),[e.id]),l=r.id===e.id,u=r.id===a||r.parentNodeId===a,m=F(e.id);if(u){let R=S.getNode(a),w=R&&Ge(R)?R.props.value??"":"",Z=t-3;return tt.createElement(so,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},R?tt.createElement(io,{id:R.id,label:"Event log",text:w,selected:!1,maxWidth:o,height:Z}):null)}let p=m.reduce((R,w)=>Kt(w)||w.id===a?R+1:R,0),v=2,C=3,N=p,I=t-C-N-v,P=(R,w)=>R.id===i?tt.createElement(io,{key:R.id,id:i,label:"Description (press e to edit)",text:e.props.description??"",selected:w,maxWidth:o,height:I}):Kt(R)?tt.createElement(fs,{key:R.id,parent:R,selected:w,selectedIndex:n}):R.id===a?tt.createElement(so,{key:R.id,paddingTop:1},tt.createElement(ge,{isSelected:w}),tt.createElement($c,{backgroundColor:h.secondary,color:w?h.accent:h.primary}," History \u203A\u203A ")):null;return tt.createElement(so,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},m.map((R,w)=>P(R,l&&n===w)))};var Hc=({swimlanes:e,currentNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:i,height:a,width:l})=>{let u=t.context,m=u===A.TICKET||u===A.FIELD_LIST||u===A.FIELD,p=u===A.BOARD||u===A.SWIMLANE,v=u===A.TICKET?t:r.find(R=>R.context===A.TICKET),C=Math.floor(l/3),N=Math.floor(l/Math.max(e.length,1)),I=Math.min(N,C),P=i==="dense";return Gn.createElement(jc,{flexDirection:"row",height:a},p&&e.map((R,w)=>{let D=t.id===R.id,Z=D?n:-1,oe=t.context===A.BOARD&&n===w;return Gn.createElement(ps,{key:R.id,height:a,width:I,swimlane:R,isSelected:oe,isDense:P,isFocused:D,listSelectedIndex:Z,mode:o})}),m&&v&&Gn.createElement(vs,{height:a,ticket:v}))},qn=Gn.memo(Hc);import{render as zc}from"ink";import{Writable as Gc}from"node:stream";var on=e=>String(e).padStart(2,"0"),qc=e=>{let t=e.getUTCFullYear(),n=on(e.getUTCMonth()+1),r=on(e.getUTCDate()),o=on(e.getUTCHours()),i=on(e.getUTCMinutes()),a=on(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${i}-${a}`},Yc=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",Xc=async(e,{width:t,height:n})=>{let r="",o=new Gc({write(a,l,u){let m=Jc(a.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),u()}});o.columns=t,o.rows=n,o.isTTY=!0;let i=zc(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(a=>setTimeout(a,0)),i.unmount(),r},Jc=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),xs=async()=>{let{viewMode:e}=$(),{currentNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:i}=x(),a=r.find(w=>w.context==="BOARD");if(!a)return s("No board found to export");let l=120,u=40,m=await Xc(Kc.createElement(qn,{height:u,width:l,swimlanes:(i[a.id]??[]).filter(w=>w!==void 0&&St(w)),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=Rt(process.cwd());if(d(p))return s("Unable to export, epiq root not found");let v=new Date,C=qc(v),N=`board_${Yc(a.title)}_${C}.md`,I=yi(p.value);ys.mkdirSync(I,{recursive:!0});let P=Vc.join(I,N),R=`# Board - ${a.title}
23
+ Date: ${v.toISOString()}
46
24
 
47
25
  \`\`\`text
48
26
  ${m}
49
27
  \`\`\`
50
- `;return vs.writeFileSync(R,b,"utf8"),l("Exported board layout",R)};var hs=()=>{let{currentNode:e,selectedIndex:t}=v(),n=T(e.id)[t];return{currentNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:n?.parentNodeId??null,selectedIndex:t}},xs=(e,t)=>Math.max(0,Math.min(e,Math.max(0,t-1))),Cs=e=>{let{nodes:t}=v(),n=t[e.currentNodeId];if(n&&!n.isDeleted&&e.selectedNodeId){let i=T(n.id).findIndex(a=>a.id===e.selectedNodeId);if(i>=0)return D.navigate({currentNode:n,selectedIndex:i}),l("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 a=T(i.id).findIndex(c=>c.id===o.id);if(a>=0)return D.navigate({currentNode:i,selectedIndex:a}),l("Restored navigation to moved node",null)}}}if(n&&!n.isDeleted){let o=T(n.id);return D.navigate({currentNode:n,selectedIndex:xs(e.selectedIndex,o.length)}),l("Restored navigation to previous container",null)}if(e.parentNodeId){let o=t[e.parentNodeId];if(o&&!o.isDeleted){let i=T(o.id);return D.navigate({currentNode:o,selectedIndex:xs(e.selectedIndex,i.length)}),l("Restored navigation to parent",null)}}let r=t[v().rootNodeId];return!r||r.isDeleted?s("Unable to restore navigation"):(D.navigate({currentNode:r,selectedIndex:0}),l("Restored navigation to root",null))};import Zc from"node:os";import bs from"node:path";import{z as st}from"zod";import{accessSync as Gc,copyFileSync as qc,existsSync as Wn,mkdirSync as Ns,readdirSync as Es,readFileSync as zc,renameSync as Yc,rmSync as Xc,statSync as Is,unlinkSync as Jc,writeFileSync as Qc}from"node:fs";import Et from"node:path";var ge={writeToFile:(e,t)=>{try{let n=Et.dirname(e);Wn(n)||Ns(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);Qc(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return zc(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=ge.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 Wn(e)&&Is(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Gc(e),!0}catch{return!1}},mkDir:e=>Ns(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=Et.parse(t);for(;;){let r=Et.join(t,e);try{if(Wn(r)&&Is(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=Et.dirname(t)}return null},readFirstJSON(e){try{if(!ge.dirExists(e))return null;let t=Es(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=Et.join(e,t);return ge.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return ge.dirExists(e)?Es(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{Jc(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{Xc(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(Et.dirname(t)),!n?.overwrite&&Wn(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{Yc(e,t)}catch(r){if(r?.code==="EXDEV"){qc(e,t),this.rmFile(e);return}throw r}}};var el={userId:"",userName:"",preferredEditor:"",autoSync:!1},Ss=st.object({preferredEditor:st.string().optional(),userName:st.string().optional(),userId:st.string().optional(),autoSync:st.boolean().nullable().optional(),autoSyncDebounceMs:st.number().optional(),viewMode:st.enum(["dense","wide"]).optional()}),tl="config.json",Rs=()=>bs.join(Zc.homedir(),ve),to=()=>bs.join(Rs(),tl),no=()=>{try{return ge.mkDir(Rs()),l(`Ensured ~/${ve} exists`,null)}catch{return s(`Unable to create ~/${ve}`)}},nl=e=>{let t;try{t=JSON.parse(e)}catch{return s(`Invalid ~/${ve}/config.json JSON`)}let n=Ss.safeParse(t??{});return n.success?l("Parsed config",n.data):s(`Invalid ~/${ve}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},As=()=>{let e=no();if(d(e))return s(e.message);let t=to(),n=ge.readFile(t);return n==null||n.trim()===""?l("No config found, using empty config",{autoSync:!1,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:15e3}):nl(n)},ws=e=>{let t=no();if(d(t))return s(t.message);let n=Ss.safeParse(e);if(!n.success)return s(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=to();try{return ge.writeToFile(r,JSON.stringify(n.data,null,2)+`
51
- `),l("Config written",null)}catch{return s(`Unable to write ~/${ve}/config.json`)}},at=e=>{let t=As();if(d(t))return s("Failed to read existing config");let n={...t.value,...e};return ws(n)},Ts=()=>{let e=to(),t=no();if(d(t))return s(`Unable to create ~/${ve}`);if(!(ge.readFile(e)!==null)){let m=ws(el);if(d(m))throw new Error(`Unable to create ~/${ve}/config.json`)}let r=As();if(d(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:i,userId:a,autoSync:c,autoSyncDebounceMs:u}=r.value;return!i||!a?s(`User name or ID not configured in ~/${ve}/config.json`):l("successfully loaded settings",{preferredEditor:o??"",userName:i,userId:a,autoSync:c??!1,autoSyncIntervalMs:u??15e3,viewMode:"dense"})};import{monotonicFactory as rl,ulid as _n}from"ulid";var jn=rl(),Ms=({name:e,parent:t,rank:n,user:{userId:r,userName:o}})=>{let i=jn(),a=jn(),c=jn(),u=jn(),m=Ii();if(d(m))return m;let p=z(m.value,void 0);if(d(p))return p;let g=z(p.value,void 0);return d(g)?g:l("Created issue events",[{id:_n(),userId:r,userName:o,action:"add.issue",payload:{id:i,parent:t,name:e,rank:n}},{id:_n(),userId:r,userName:o,action:"add.field",payload:{id:a,parent:i,name:Y.DESCRIPTION,val:"",rank:m.value}},{id:_n(),userId:r,userName:o,action:"add.field",payload:{id:c,parent:i,name:"Assignees",rank:p.value}},{id:_n(),userId:r,userName:o,action:"add.field",payload:{id:u,parent:i,name:"Tags",rank:g.value}}])};import{monotonicFactory as ol,ulid as Be}from"ulid";var zt=ol();function il(){let e=Object.values(v().nodes).find(r=>r.context==="WORKSPACE");if(!e)throw new Error("No workspace found in event log");let[t]=T(e.id),[n]=t?T(t.id):[];if(logger.debug("Boot navigation target:",{workspace:e?.id,firstBoard:t?.id,firstSwimlane:n?.id}),n){let r=v().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:v().nodes[v().rootNodeId],selectedIndex:0}}function sl(){let e=il();D.navigate(e)}function Ps({userId:e,userName:t}){let n=zt(),r=zt(),o=zt(),i=zt(),a=zt(),c=z(void 0,void 0);if(d(c))return c;let u=z(void 0,void 0);if(d(u))return u;let m=z(u.value,void 0);if(d(m))return m;let p=z(void 0,void 0);if(d(p))return p;let g=z(p.value,void 0);if(d(g))return g;let x=z(g.value,void 0);if(d(x))return x;let E=z(void 0,void 0);return d(E)?E:l("Created default events",[{id:Be(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:c.value}},{id:Be(),userId:e,userName:t,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:u.value}},{id:Be(),userId:e,userName:t,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:p.value}},{id:Be(),userId:e,userName:t,action:"add.swimlane",payload:{id:i,name:"In progress",parent:r,rank:g.value}},{id:Be(),userId:e,userName:t,action:"add.swimlane",payload:{id:a,name:"Done",parent:r,rank:x.value}},{id:Be(),userId:e,userName:t,action:"add.board",payload:{id:bn,name:"Closed",parent:n,rank:m.value}},{id:Be(),userId:e,userName:t,action:"add.swimlane",payload:{id:ke,name:"Closed",parent:bn,rank:E.value}},{id:Be(),userId:e,userName:t,action:"lock.node",payload:{id:bn}},{id:Be(),userId:e,userName:t,action:"lock.node",payload:{id:ke}}])}function Hn({hasProject:e,eventLog:t}){if(!e){let o=ie.workspace("temporary-uninitialized-workspace","Workspace","a0"),i=jt(o);return d(i)?i:(S({hasProject:!1,mode:f.DEFAULT}),l("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=_t(t).filter(d);return r.length>0?s(`Materializing failed:
52
- ${r.map(o=>o.message).join(`
53
- `)}`):(sl(),S({hasProject:!0}),l("State booted successfully",null))}var ks=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 Ls}from"ulid";import{spawnSync as al}from"node:child_process";import dl from"node:os";import Ds from"node:path";import{ulid as cl}from"ulid";function ll(){let{preferredEditor:e}=L(),t=[e,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function ul(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function Fs(e){let t=Ds.join(dl.tmpdir(),"epiq");ge.mkDir(t);let n=Ds.join(t,cl());ge.writeToFile(n,e??"");let r=ll();for(let o of r){let i=ul(o,n),a=al(i,{stdio:"inherit",shell:!0});if(!a.error&&a.status===0){let c=ge.readFile(n);if(c==null)return s("Unable to read edited file");let u=c.replace(/\r?\n$/,"");return l("Successfully edited",u)}}return s("Unable to open editor")}var Os=()=>{let e=K();if(d(e))return s("Unable to resolve user ID");let{breadCrumb:t,selectedNode:n}=v(),r=Se([...t,n],"TICKET");if(d(r))return s("Edit target must be an issue");let o=r.value;if(o.readonly)return s("Cannot edit readonly field");let i=T(o.id).find(m=>m.title===Y.DESCRIPTION);if(!i)return s("No target found");if(i.readonly)return s("Cannot edit readonly field");let a=i.props.value;if(typeof a!="string")return s("Selected field is not editable text");let c=Fs(a);if(d(c))return s("Failed to edit field");let u=c.value;return u===a?l("No changes made",null):i.title===Y.DESCRIPTION?_({id:Ls(),action:"edit.description",payload:{id:i.id,md:u},...e.value}):i.title==="Title"?_({id:Ls(),action:"edit.title",payload:{id:i.id,name:u},...e.value}):s(`Editing not supported for "${i.title}"`)};import pl from"node:fs";import Us from"node:path";import ro from"node:fs";import ml from"node:path";var Bs=async e=>{let t=ml.join(e,".gitignore"),n=ro.existsSync(t)?ro.readFileSync(t,"utf8"):"",r=[".epiq/events/",".epiq/log/"],o=n.split(`
54
- `).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 l("Local epiq paths already ignored",!1);let c=["# [epiq]: local hydrated state is never committed",...i].join(`
28
+ `;return ys.writeFileSync(P,R,"utf8"),c("Exported board layout",P)};var O={exit(){process.exit(0)},enterChildNode(){let e=x(),t=e.currentNode,n=Math.max(0,e.selectedIndex),r=U(t.id)[n];!r||t.context==="FIELD"||O.navigate({currentNode:r,selectedIndex:F(r.id).length?0:-1})},enterParentNode(){let{currentNode:e,nodes:t}=x();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=F(n.id),o=r.findIndex(({id:a})=>a===e.id),i=r.length===0?-1:o>=0?o:0;O.navigate({currentNode:n,selectedIndex:i})},navigateToNextItem:()=>hs(1),navigateToPreviousItem:()=>hs(-1),navigateToNextContainer:()=>Cs(1),navigateToPreviousContainer:()=>Cs(-1),navigate:({currentNode:e,selectedIndex:t})=>{b({currentNodeId:e.id,selectedIndex:t})}},hs=e=>{let{selectedIndex:t,currentNode:n}=x(),r=F(n.id).length;if(r===0)return;let i=(Math.max(0,t)+e+r)%r;O.navigate({selectedIndex:i,currentNode:n})},Cs=e=>{let{currentNode:t,nodes:n,selectedIndex:r}=x();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=F(o.id),a=i.findIndex(C=>C.id===t.id);if(a<0)return;let l=i.at(a+e)??i.at(0);if(!l)return;let u=F(l.id),m=Math.max(0,u.length-1),p=Math.min(Math.max(0,r),m),v=u.length?p:-1;O.navigate({currentNode:l,selectedIndex:v})};import il from"node:os";import Ss from"node:path";import{z as gt}from"zod";import{accessSync as Qc,copyFileSync as Zc,existsSync as Yn,mkdirSync as Es,readdirSync as Ns,readFileSync as el,renameSync as tl,rmSync as nl,statSync as bs,unlinkSync as rl,writeFileSync as ol}from"node:fs";import Ut from"node:path";var he={writeToFile:(e,t)=>{try{let n=Ut.dirname(e);Yn(n)||Es(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);ol(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return el(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=he.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 Yn(e)&&bs(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Qc(e),!0}catch{return!1}},mkDir:e=>Es(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=Ut.parse(t);for(;;){let r=Ut.join(t,e);try{if(Yn(r)&&bs(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=Ut.dirname(t)}return null},readFirstJSON(e){try{if(!he.dirExists(e))return null;let t=Ns(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=Ut.join(e,t);return he.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return he.dirExists(e)?Ns(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{rl(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{nl(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(Ut.dirname(t)),!n?.overwrite&&Yn(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{tl(e,t)}catch(r){if(r?.code==="EXDEV"){Zc(e,t),this.rmFile(e);return}throw r}}};var sl={userId:"",userName:"",preferredEditor:"",autoSync:!1},Is=gt.object({preferredEditor:gt.string().optional(),userName:gt.string().optional(),userId:gt.string().optional(),autoSync:gt.boolean().nullable().optional(),autoSyncDebounceMs:gt.number().optional(),viewMode:gt.enum(["dense","wide"]).optional()}),al="config.json",Rs=()=>Ss.join(il.homedir(),be),ao=()=>Ss.join(Rs(),al),co=()=>{try{return he.mkDir(Rs()),c(`Ensured ~/${be} exists`,null)}catch{return s(`Unable to create ~/${be}`)}},dl=e=>{let t;try{t=JSON.parse(e)}catch{return s(`Invalid ~/${be}/config.json JSON`)}let n=Is.safeParse(t??{});return n.success?c("Parsed config",n.data):s(`Invalid ~/${be}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},As=()=>{let e=co();if(d(e))return s(e.message);let t=ao(),n=he.readFile(t);return n==null||n.trim()===""?c("No config found, using empty config",{autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):dl(n)},ws=e=>{let t=co();if(d(t))return s(t.message);let n=Is.safeParse(e);if(!n.success)return s(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=ao();try{return he.writeToFile(r,JSON.stringify(n.data,null,2)+`
29
+ `),c("Config written",null)}catch{return s(`Unable to write ~/${be}/config.json`)}},vt=e=>{let t=As();if(d(t))return s("Failed to read existing config");let n={...t.value,...e};return ws(n)},Ts=()=>{let e=ao(),t=co();if(d(t))return s(`Unable to create ~/${be}`);if(!(he.readFile(e)!==null)){let m=ws(sl);if(d(m))throw new Error(`Unable to create ~/${be}/config.json`)}let r=As();if(d(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:i,userId:a,autoSync:l,autoSyncDebounceMs:u}=r.value;return!i||!a?s(`User name or ID not configured in ~/${be}/config.json`):c("successfully loaded settings",{preferredEditor:o??"",userName:i,userId:a,autoSync:l??!1,autoSyncIntervalMs:u??1e4,viewMode:"dense"})};import xl from"node:fs";import hl from"node:path";import{decodeTime as Cl,monotonicFactory as El}from"ulid";import{z as sn}from"zod";import Xn from"node:fs";import uo from"node:path";import{decodeTime as cl}from"ulid";import{z as lo}from"zod";var ll=lo.object({userId:lo.string().min(1).default("unknown"),userName:lo.string().min(1).default("unknown")}),ul=e=>{let[t,n]=uo.basename(e,".jsonl").split("."),r=ll.safeParse({userId:t,userName:n});return r.success?c("Parsed event file actor",r.data):s(`Invalid event file name ${uo.basename(e)}: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},ml=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])},pl=(e,t)=>t in e,fl=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),gl=e=>{let{userId:t,userName:n,...r}=e,o=ml(r);if(d(o))return s(o.message);let i=o.value,a=e.id?.[0];return a?pl(r,i)?c("Decoded persisted event",fl({id:a,action:i,payload:r[i],userId:t,userName:n})):s(`Persisted event is missing payload for action: ${i}`):s("Persisted event is missing id")},vl=e=>{if(!Xn.existsSync(e))return c("Event file missing",[]);let t=ul(e);if(d(t))return s(t.message);let n=Xn.readFileSync(e,"utf8"),r=[];for(let o of n.split(`
30
+ `)){let i=o.trim();if(!i)continue;let a;try{a=JSON.parse(i)}catch{return s(`Failed to parse event JSON from ${e}: ${i}`)}let l=mo(a);if(d(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 Ms(e){let t=Qt(e);if(!Xn.existsSync(t))return c("No events found",[]);let n=Xn.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>uo.join(t,o)),r=[];for(let o of n){let i=vl(o);if(d(i))return s(i.message);r.push(...i.value)}return c("All events loaded",yl(r))}function $t(e){let t=Ms(e);if(d(t))return s(t.message);let n=[];for(let r of t.value){let o=gl(r);if(d(o))return s(`Failed to decode event ${r.id?.[0]??"<unknown>"}: ${o.message}`);n.push(o.value)}return c("Loaded merged events",n)}function Ps(e=process.cwd()){let t=Ms(e);return d(t)?s(t.message):c("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var yl=e=>{let t=new Map,n=new Map;for(let m of e){let p=m.id[0],v=m.id[1]??null;t.set(p,m);let C=n.get(v)??[];C.push(m),n.set(v,C)}for(let m of n.values())m.sort((p,v)=>p.id[0].localeCompare(v.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 v=n.get(p)??[];for(let C of v)i(C)},a=n.get(null)??[];for(let m of a)i(m);let l=e.filter(m=>{let p=m.id[0],v=m.id[1]??null;return!o.has(p)&&v!==null&&!t.has(v)}).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},ks=(e,t)=>{let n=e.findIndex(r=>{try{return cl(r.id)>t}catch{return!0}});return n===-1?{appliedEvents:e,unappliedEvents:[]}:{appliedEvents:e.slice(0,n),unappliedEvents:e.slice(n)}};var Ls=e=>({action:e.action,payload:e.payload});var Fs=1,Ds=El(),Nl=sn.tuple([sn.string().min(1),sn.string().min(1).nullable()]),bl=sn.looseObject({v:sn.literal(Fs),id:Nl}),mo=e=>{let t=bl.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(", ")}`)},Jn=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",z=()=>{let{userName:e,userId:t}=$();return e?t?e.trim()?c("Successfully resolved actor ID",{userId:Jn(t),userName:Jn(e)}):s("Unable to resolve actor ID from settings or OS user info"):s("User ID not configured"):s("User name not configured")},an=({userId:e,userName:t})=>`${Jn(e)}.${Jn(t)}.jsonl`,Sl=(e,{userId:t,userName:n})=>{let r=an({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r))return s(`Invalid event log file name: ${r}`);let i=hl.join(Qt(e),r);return c("Successfully resolved event log path",i)},Il=(e,t)=>{let n={[e.action]:e.payload,v:Fs,id:t};return mo(n)};function Qn({event:e,rootDir:t}){try{let n=xi(t);if(d(n))return n;let r=Sl(t,{userId:e.userId,userName:e.userName});if(d(r))return r;let o=Ps(t);if(d(o))return s(o.message);let i=o.value?Ds(Math.max(Date.now(),Cl(o.value)+1)):Ds(),a=Il(Ls(e),[i,o.value]);return d(a)?s(a.message):(xl.appendFileSync(r.value,`${JSON.stringify(a.value)}
31
+ `,"utf8"),c("Event persisted",{path:r.value,entry:a.value}))}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return s(`Failed to persist event: ${r}`)}}var Os=e=>{let t=e.log??[];for(let n=t.length-1;n>=0;n--){let r=t[n];if(r&&r.action==="close.issue"&&r.payload.id===e.id)return r.payload.parent}return null};var Rl=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[He,Zn]=Rl;import{ulid as kl}from"ulid";import{spawnSync as Al}from"node:child_process";import wl from"node:os";import Bs from"node:path";import{ulid as Tl}from"ulid";function Ml(){let{preferredEditor:e}=$(),t=[e,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function Pl(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function Us(e){let t=Bs.join(wl.tmpdir(),"epiq");he.mkDir(t);let n=Bs.join(t,Tl());he.writeToFile(n,e??"");let r=Ml();for(let o of r){let i=Pl(o,n),a=Al(i,{stdio:"inherit",shell:!0});if(!a.error&&a.status===0){let l=he.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 $s=async()=>{let e=z();if(d(e))return s("Unable to resolve user ID");let t=await we();if(d(t))return t;let n=t.value,{breadCrumb:r,selectedNode:o}=x(),i=Te([...r,o],"TICKET");if(d(i))return s("Edit target must be an issue");let a=i.value;if(!W(a))return s("Edit target must be an issue");if(a.readonly)return s("Cannot edit readonly issue");let l=F(a.id).find(v=>v.title===Y.DESCRIPTION);if(!l)return s("No target found");if(l.readonly)return s("Cannot edit readonly field");let u=a.props.description??"";if(typeof u!="string")return s("Selected field is not editable text");let m=Us(u);if(d(m))return s("Failed to edit field");let p=m.value;return p===u?c("No changes made",null):Me({id:kl(),action:"edit.description",payload:{id:a.id,md:p},...e.value},n)};import Hl from"node:fs";import zs from"node:path";import po from"node:fs";import Ll from"node:path";var Ws=async e=>{let t=Ll.join(e,".gitignore"),n=po.existsSync(t)?po.readFileSync(t,"utf8"):"",r=[".epiq/events/",".epiq/log/"],o=n.split(`
32
+ `).map(u=>u.trim()),i=r.filter(u=>!o.some(m=>m===u||m===u.replace(/\/$/,"")||m==="/"+u||m==="/"+u.replace(/\/$/,"")));if(i.length===0)return c("Local epiq paths already ignored",!1);let l=["# [epiq]: local hydrated state is never committed",...i].join(`
55
33
  `);return n=n.trimEnd()+`
56
34
 
57
- ${c}
58
- `,ro.writeFileSync(t,n,"utf8"),ue.info(`Added ${i.join(", ")} to .gitignore (epiq local state)`),l("Local epiq paths ignored",!0)};var fl=async e=>{let t=await F({cwd:e,args:["status","--porcelain"]});return d(t)?t:l("Checked git diff",t.value.stdout.trim().length>0)},j=(e,t)=>s(`[${e}] ${t}`),$s=async()=>{let e=bo(),t=await hn(process.cwd());if(d(t))return j(1,t.message);let n=t.value,r=await Dt(n);if(d(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 fl(n);if(d(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(dr(n))return j(4,"Epiq project already initialized");let i=_e();if(!i.isSetupDone||!i.userName)return j(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let a=L(),c=a.userName,u=a.userId;if(!u||!c)return j(5,"Missing Epiq user id");let m=e.stateBranch,p=await fn({repoRoot:n,branch:m});if(d(p))return j(6,p.message);let g=await Cn({repoRoot:n,stateBranchName:e.stateBranch});if(d(g))return j(6,g.message);let x=xn();if(d(x))return j(7,x.message);let E=Us.join(yn(),e.projectId),A=await Er({repoRoot:n,stateBranchRoot:E,stateBranchName:e.stateBranch});if(d(A))return j(8,A.message);let R=Us.join(E,".epiq");pl.mkdirSync(R,{recursive:!0});let b=Ps({userId:u,userName:c});if(d(b))return j(9,b.message);for(let sr of b.value){let No=mn({event:sr,rootDir:E});if(d(No))return j(9,No.message)}let w=await Nn({stateBranchRoot:E,eventFileName:Xe({userId:u,userName:c})});if(d(w))return j(10,w.message);let U=await mt({cwd:E,message:"[epiq:init]"});if(d(U))return j(10,U.message);let le=await Bs(n);if(d(le))return j(12,le.message);let ne=Ro({repoRoot:n,fileContents:e});if(d(ne))return j(13,ne.message);let Zt=await H.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(d(Zt))return j(14,Zt.message);let St=await H.commit({cwd:n,message:"[epiq:init-project]"});if(d(St))return j(14,St.message);let Rt=Ut({repoRoot:n,stateBranchRoot:E});if(d(Rt))return j(15,Rt.message);let q="Project initialized!",re=await Bt({repoRoot:n,stateBranchRoot:E});d(re)&&(q+=` Warn: [init:16] ${re.message}`);let ct=await H.push({cwd:n});d(ct)&&(q+=` Warn: [init:17] ${ct.message}`);let Co=Sn(b.value).filter(d);if(Co.length>0)return j(18,Co.map(sr=>sr.message).join(`
59
- `));let{rootNodeId:Da,nodes:Fa}=v();return D.navigate({currentNode:Fa[Da],selectedIndex:0}),S({hasProject:!0,mode:f.DEFAULT}),l(q,null)};import{ulid as vl}from"ulid";import{ulid as gl}from"ulid";var Ws=null,Ve=()=>structuredClone(Ws),Yt=e=>Ws=e,_s=()=>{let{currentNode:e,selectedIndex:t}=v(),r=T(e.id)[t];return r?l("Resolved selected child",r):s("Target node not found")};var js=({id:e,parentId:t,position:n={at:"end"}})=>{let r=K();if(d(r))return s("Unable to resolve user ID");let o=tt(t,e,n,r.value);return d(o)?o:l("Created pending move state",{id:gl(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value}})},Hs=e=>{Yt(e);let t=Wt(e,!0);return d(t)?t:l("Node moved successfully",t.value)};function oo(e){let t=_s();if(d(t))return t;let{currentNode:n,nodes:r}=v();if(!n.parentNodeId)return s("Missing parent node id");let o=r[n.parentNodeId];if(!o)return s("Missing parent node");let i=O(o.id),a=i.findIndex(({id:m})=>m===n.id);if(a<0)return s("Current node not found among siblings");let c=i[a+e];if(!c)return s("Missing sibling node");let u=js({id:t.value.id,parentId:c.id,position:{at:"end"}});return d(u)?u:Hs(u.value)}function io(e){let t=_s();if(d(t))return t;let{currentNode:n,selectedIndex:r}=v(),i=O(n.id)[r+e];if(!i)return s("Missing sibling node");let a=js({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:i.id}});return d(a)?a:Hs(a.value)}var Ks=()=>{let e=K();if(d(e))return s("Unable to resolve user ID");let{modifier:t}=Q().commandMeta,n=()=>{let c=Ve();if(!c)return s("No pending move state");let u=c.payload.id;if(!v().nodes[u])return s("Moved node not found");let p=c.payload.parent,g=v().nodes[p];if(!g)return s("Move parent not found");let x=T(p).findIndex(E=>E.id===u);return x===-1?s("Moved node not found among rendered children"):(D.navigate({currentNode:g,selectedIndex:x}),l("Synchronized navigation to moved node",null))},r=c=>{if(d(c))return s(c.message);let u=n();return d(u)?s(u.message):l("Updated move preview",null)},{currentNode:o,selectedIndex:i}=v(),a=T(o.id)[i];if(!a)return S({mode:f.DEFAULT}),s("No move target");if(t==="start"){if(a.readonly)return s("Target node is read-only");if(i===-1)return s("No item selected");if(!a.parentNodeId)return s("Target has no parent");let c=O(a.parentNodeId),u=c.findIndex(({id:A})=>A===a.id);if(u===-1)return s("Target not found among siblings");let m=c[u-1],p=c[u+1],g=p!=null?{at:"before",sibling:p.id}:m!=null?{at:"after",sibling:m.id}:{at:"start"},x=tt(a.parentNodeId,a.id,g,e.value);if(d(x))return x;Yt({id:vl(),action:"move.node",payload:{id:a.id,parent:a.parentNodeId,rank:x.value},...e.value}),S({mode:f.MOVE});let E=n();return d(E)?s(E.message):l("Move initialized",null)}if(t==="next")return S({mode:f.MOVE}),r(io(1));if(t==="previous")return S({mode:f.MOVE}),r(io(-1));if(t==="to-next")return S({mode:f.MOVE}),r(oo(1));if(t==="to-previous")return S({mode:f.MOVE}),r(oo(-1));if(t==="confirm"){S({mode:f.DEFAULT});let c=Ve();if(!c)return s("No pending move to confirm");let u=_(c);if(d(u))return u;let m=n();return d(m)?s(m.message):(Yt(null),l("Moved item",null))}return t==="cancel"?(Yt(null),S({mode:f.DEFAULT}),l("Cancelling move",null)):s("Invalid move modifier")};import yl from"zod";var Vs=()=>{let e=Q().commandMeta.inputString,t=yl.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=at({autoSyncDebounceMs:t.data});return d(n)?n:(pe({autoSyncIntervalMs:t.data}),S({mode:f.DEFAULT}),l(`Auto sync interval set to ${t.data}ms`,null))};var Gs=()=>{let e=Q().commandMeta.inputString.trim();if(e!=="yes"&&e!=="no")return s("Invalid response");let t=To(e),n=at({autoSync:t});return d(n)?n:(pe({autoSync:t}),S({mode:f.DEFAULT}),l(`Auto sync set to "${e}"`,null))};var qs=e=>Object.values(v().tags).find(t=>t.name===e),zs=e=>Object.values(v().contributors).find(t=>t.name===e),Ys=[{systemOnly:!0,intent:M.Move,mode:f.COMMAND_LINE,action:Ks},{intent:M.Delete,mode:f.COMMAND_LINE,action:()=>{let e=K();if(d(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=v(),r=T(t.id)[n];return r?_({id:V(),action:"delete.node",payload:{id:r.id},...e.value}):s("Unable to resolve child to delete")},onSuccess:()=>S({mode:f.DEFAULT})},{intent:M.Filter,mode:f.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=Q().commandMeta,n=/(!=|=)/,[r,o]=e.split(n);if(!r||!(c=>ae(y.FILTER).map(u=>u.split(n)[0]).includes(c))(r))return s("Invalid filter modifier");let a={target:r,operator:"=",value:t.trim()};return he(c=>({...c,filters:e==="clear"?[]:[...c.filters,a],mode:f.DEFAULT})),l("Viewing help",null)}},{intent:M.ViewHelp,mode:f.COMMAND_LINE,action:()=>(S({mode:f.HELP}),l("Viewing help",null))},{intent:M.CloseIssue,mode:f.COMMAND_LINE,action:()=>{let e=K();if(d(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=v(),r=T(t.id)[n];if(!r)return s("Unable to close issue, no target found");if(!ye(r))return s("Cannot close in this context");let o=v().nodes[ke];if(!o)return s("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return s("Issue is already closed");let i=tt(o.id,r.id,{at:"end"},e.value);if(d(i))return i;let a=_({id:V(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:i.value},...e.value});return d(a)?a:l("Issue closed",null)},onSuccess:()=>S({mode:f.DEFAULT})},{intent:M.ReopenIssue,mode:f.COMMAND_LINE,action:()=>{let e=K();if(d(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=v(),r=T(t.id)[n];if(!r)return s("Unable to reopen issue, no target found");let o=r.context==="TICKET"?l("Resolved ticket",r):je(r.id,"TICKET");if(d(o))return s("Cannot reopen in this context");let i=o.value,a=v().nodes[ke];if(!a)return s("Unable to locate closed swimlane");if(i.parentNodeId!==a.id)return s("Issue is not closed");if(!ye(i))return s("Target node is not issue");let c=ks(i);if(!c)return s("Unable to resolve previous parent from issue history");if(c===a.id)return s("Previous parent resolves to closed swimlane");let u=v().nodes[c];if(!u)return s("Previous parent no longer exists");let m=tt(u.id,i.id,{at:"end"},e.value);if(d(m))return m;let p=_({id:V(),action:"reopen.issue",payload:{id:i.id,parent:u.id,rank:m.value},...e.value});return d(p)?p:l("Issue reopened",null)},onSuccess:()=>S({mode:f.DEFAULT})},{intent:M.Init,mode:f.COMMAND_LINE,action:$s},{intent:M.NewItem,mode:f.COMMAND_LINE,action:(e,t)=>{let n=K();if(d(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}=v(),a=c=>{let u=_(c);if(d(u))return u;let m=I.getNode(u.value.result.id);if(!m)return s("Created node not found");if(!m.parentNodeId)return u;let p=I.getNode(m.parentNodeId);return p?(D.navigate({currentNode:p,selectedIndex:I.getSiblings(m.parentNodeId).findIndex(({id:g})=>g===m.id)}),u):s("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:c}=v(),u=I.getNode(c);if(!u)return s("Workspace not found");let m=gt(u.id,n.value);return d(m)?m:a({id:V(),action:"add.board",payload:{id:V(),name:t.inputString,parent:u.id,rank:m.value},...n.value})}if(t.modifier==="swimlane"){let c=Se(r,"BOARD");if(d(c))return s("Unable to add swimlane in this context");let u=gt(c.value.id,n.value);return d(u)?u:a({id:V(),action:"add.swimlane",payload:{id:V(),name:t.inputString,parent:c.value.id,rank:u.value},...n.value})}if(t.modifier==="issue"){let c=T(o.id)[i],u=o.context==="SWIMLANE"?o:o.context==="BOARD"&&c?.context==="SWIMLANE"?c:(()=>{let b=Se(r,"SWIMLANE");return d(b)?null:b.value})();if(!u)return s("Unable to add issue in this context");let m=gt(u.id,n.value);if(d(m))return m;let p=Ms({name:t.inputString,parent:u.id,rank:m.value,user:n.value});if(d(p))return p;let g=p.value,x=Sn(g);if(x.some(b=>d(b)))return s("Issue create failed: "+x.filter(d).map(b=>b.message).filter(Boolean).join(", "));let E=x[0];if(!E||d(E))return s("Issue creation failed");let R=g.find(b=>b.action==="add.issue")?.payload.id;return R?(D.navigate({currentNode:u,selectedIndex:I.getSiblings(u.id).findIndex(({id:b})=>b===R)}),l("Issue created",null)):s("Unable to determine ticket id")}return l("Success",null)},onSuccess:()=>S({mode:f.DEFAULT})},{intent:M.Rename,mode:f.COMMAND_LINE,action:()=>{let e=K();if(d(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=v(),r=T(t.id)[n];if(!r)return s("Missing node");if(r.readonly)return s("Cannot rename readonly node");let o=Ji();return o?_({id:V(),action:"edit.title",payload:{id:r.id,name:o},...e.value}):s("Provide a new name")},onSuccess:()=>S({mode:f.DEFAULT})},{intent:M.UntagTicket,mode:f.COMMAND_LINE,action:()=>{let e=K();if(d(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=Q().commandMeta,r=(t||n).trim();if(!r)return s("Provide a tag");let o=qs(r);if(!o)return s(`Tag "${r}" does not exist`);let{selectedNode:i}=v();if(!i)return s("Invalid untag target");let a=je(i.id,"TICKET");if(d(a))return s("Unable to untag issue in this context");let c=a.value,u=I.getFieldByTitle(c.id,"Tags");if(!u)return s("Unable to locate tags field");let m=T(u.id).find(p=>p.props?.value===o.id);return m?_({id:V(),action:"untag.issue",payload:{id:m.id,target:c.id,tagId:o.id},...e.value}):s("Issue is not tagged with that tag")},onSuccess:()=>S({mode:f.DEFAULT})},{intent:M.TagTicket,mode:f.COMMAND_LINE,action:()=>{let e=K();if(d(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=Q().commandMeta,r=(t||n).trim();if(!r)return s("Provide a tag");let{selectedIndex:o,currentNode:i}=v(),a=T(i.id)[o];if(!a)return s("Invalid tag target");let c=je(a.id,"TICKET");if(d(c))return s("Unable to tag issue in this context");let u=c.value,m=qs(r),p;if(m)p=m.id;else{let A=V(),R=_({id:V(),action:"create.tag",payload:{id:A,name:r},userId:e.value.userId,userName:e.value.userName});if(d(R))return R;p=R.value.result.id}let g=I.getFieldByTitle(u.id,"Tags");if(!g)return s("Unable to locate tags field");if(T(g.id).some(A=>A.props?.value===p))return s("Already tagged with that tag");let E=gt(g.id,e.value);return d(E)?E:_({id:V(),action:"tag.issue",payload:{id:V(),target:u.id,tagId:p,rank:E.value},...e.value})},onSuccess:()=>S({mode:f.DEFAULT})},{intent:M.AssignUserToTicket,mode:f.COMMAND_LINE,action:()=>{let e=K();if(d(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=Q().commandMeta,r=(t||n).trim();if(!r)return s("Provide an assignee");let{selectedIndex:o,currentNode:i}=v(),a=T(i.id)[o];if(!a)return s("Invalid assign target");let c=je(a.id,"TICKET");if(d(c))return s("Unable to assign issue in this context");let u=c.value,m=zs(r),p;if(m)p=m.id;else{let A=V(),R=_({id:V(),action:"create.contributor",payload:{id:A,name:r},userId:e.value.userId,userName:e.value.userName});if(d(R))return R;p=R.value.result.id}let g=I.getFieldByTitle(u.id,"Assignees");if(!g)return s("Unable to locate assignees field");if(T(g.id).some(A=>A.props?.value===p))return s("Assignee already assigned");let E=gt(g.id,e.value);return d(E)?E:_({id:V(),action:"assign.issue",payload:{id:V(),target:u.id,contributor:p,rank:E.value},...e.value})},onSuccess:()=>S({mode:f.DEFAULT})},{intent:M.UnassignUserFromTicket,mode:f.COMMAND_LINE,action:()=>{let e=K();if(d(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=Q().commandMeta,r=(t||n).trim();if(!r)return s("Provide an assignee to remove");let o=zs(r);if(!o)return s(`Assignee "${r}" does not exist`);let{selectedNode:i}=v();if(!i)return s("Invalid unassign target");let a=je(i.id,"TICKET");if(d(a))return s("Unable to unassign in this context");let c=a.value,u=I.getFieldByTitle(c.id,"Assignees");if(!u)return s("Unable to locate assignees field");let m=T(u.id).find(p=>p.props?.value===o.id);return m?_({id:V(),action:"unassign.issue",payload:{id:m.id,target:c.id,contributor:o.id},...e.value}):s(`Issue is not assigned to "${r}"`)},onSuccess:()=>S({mode:f.DEFAULT})},{intent:M.Sync,mode:f.COMMAND_LINE,action:async()=>{if(v().syncStatus.status==="syncing")return s("Sync already in progress");let e=hs();$(()=>""),S({syncStatus:{msg:"Syncing",status:"syncing"}});let{userId:t,userName:n}=L();if(!t)return s("Unable to resolve userId");if(!n)return s("Unable to resolve userName");let r=K();if(d(r)||!r.value)return s("Unable to resolve event log path");let o=Xe(r.value),i=await In({ownEventFileName:o});if(d(i))return S({syncStatus:{msg:i.message,status:"outOfSync"}}),s(`Unable to sync state. ${i.message}`);let a=be(process.cwd());if(d(a))return a;let c=Mt(a.value);if(d(c))return s(`Unable to load events. ${c.message}`);let u=Hn({eventLog:c.value,hasProject:!0});if(d(u))return s(`Unable to boot synced state. ${u.message}`);S({hasProject:!0,syncStatus:{msg:"Synced",status:"synced"},mode:f.DEFAULT});let m=Cs(e);return d(m)?m:l("Synced",!0)}},{intent:M.Peek,mode:f.COMMAND_LINE,action:async()=>{let e=Se(v().breadCrumb,"BOARD");if(d(e))return e;let t=$e(process.cwd());if(d(t))throw new Error(t.message);let n=Mt(t.value);if(d(n))return s(n.message);let r=n.value,{modifier:o}=Q().commandMeta,i;if(o==="now"){let x=so();if(d(x))return x;let E=_t(r);return E.some(d)?s(E.map(A=>A.message).join(", ")):(S({mode:f.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),l("Peeking now",!0))}if(o==="prev"){let x=v().eventLog.at(-2),E=Br(x);if(E===null)return s("No previous event to peek");i=E}else if(o==="next"){let x=v().unappliedEvents.at(0),E=Br(x);if(E===null)return s("No next event to peek");i=E}else{let x=wn(o);if(!x)return s("Invalid peek date");i=x.getTime()}let a=e.value.id,{appliedEvents:c,unappliedEvents:u}=$o(r,i),m=so();if(d(m))return m;let p=_t(c);if(p.some(d))return s(p.map(x=>x.message).join(", "));let g=v().nodes[a];return g?(D.navigate({currentNode:g,selectedIndex:0}),S({mode:f.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:u}),l("Peeking ",!0)):s("Board did not exist at peek date")}},{intent:M.Export,mode:f.COMMAND_LINE,action:async()=>{let e=await ys();return d(e)?e:(S({mode:f.DEFAULT}),l("Export successful",!0))}},{intent:M.Exit,mode:f.COMMAND_LINE,action:async()=>(D.exit(),l("Exit successful",!0))},{intent:M.Edit,mode:f.COMMAND_LINE,action:(e,t)=>{if(t.modifier===He.DESCRIPTION)return Os();if(t.modifier===He.TITLE){let n=K();if(d(n))return s("Unable to resolve user ID");let{currentNode:r,selectedIndex:o}=v(),i=T(r.id)[o];if(!i)return s("Missing node");if(i.readonly)return s("Cannot rename readonly node");let a=t.inputString.trim();return a?_({id:V(),action:"edit.title",payload:{id:i.id,name:a},...n.value}):s("Provide a new name")}return s("Unknown edit command")},onSuccess:()=>S({mode:f.DEFAULT})},{intent:M.Config,mode:f.COMMAND_LINE,action:(e,t)=>{let n=t.inputString.trim();switch(t.modifier){case X.USERNAME:{let{userId:r,preferredEditor:o,userName:i}=L(),a=n||i,c=r??V();if(!a||!c)return s("Unable to resolve user name or id");let u=at({userName:a,userId:c,preferredEditor:o??""});return d(u)?u:(pe({userName:a,userId:c}),S({mode:f.DEFAULT}),l(`Username set to "${a}"`,null))}case X.EDITOR:{if(!n)return s("No editor provided");let r=at({preferredEditor:n});return d(r)?r:(pe({preferredEditor:n}),S({mode:f.DEFAULT}),l(`Editor configuration set to "${n}"`,null))}case X.VIEW:return n!=="wide"&&n!=="dense"?s("Invalid view mode"):(pe({viewMode:n}),l(`View set to "${n}"`,null));case X.AUTOSYNC:return Gs();case X.SYNC_DEBOUNCE_MS:return Vs();default:return s("Unknown config command")}}}];var xl=new Set(["peek","filter","view-help"]),Ce=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=Q();if(!t)return s("No command to confirm");if(!e&&n===rt.Invalid)return s("Invalid command");let i=es(t);qi();let{readOnly:a}=v();if(a&&!xl.has(i))return Vt({status:Ue.Fail,message:"Command not available in readonly state",value:null});let c=Ys.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===i);if(!c)return Vt({status:Ue.Fail,message:"Command not found",value:null});let u;try{u=await c.action(c,{command:t,inputString:o,modifier:r})}catch(m){return Vt({status:Ue.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return d(u)?Vt(u):(zi({addToHistory:!e}),c.onSuccess?.(),L().autoSync&&Ni(),u)};var Kn=[{intent:h.Exit,mode:f.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(S({mode:f.COMMAND_LINE}),$(()=>"move cancel"),Ce({isForceExecutedBySystem:!0}))},{intent:h.InitMove,mode:f.DEFAULT,description:"[m] move init/confirm",action:()=>(S({mode:f.COMMAND_LINE}),$(()=>"move start"),Ce({isForceExecutedBySystem:!0}))},{intent:h.ConfirmMove,mode:f.MOVE,action:()=>(S({mode:f.COMMAND_LINE}),$(()=>"move confirm"),Ce({isForceExecutedBySystem:!0}))}],Vn=[{intent:h.MovePreviousItem,mode:f.MOVE,action:()=>Ve()?(S({mode:f.COMMAND_LINE}),$(()=>"move previous"),Ce({isForceExecutedBySystem:!0})):s("No pending move")},{intent:h.MoveNextItem,mode:f.MOVE,action:()=>Ve()?(S({mode:f.COMMAND_LINE}),$(()=>"move next"),Ce({isForceExecutedBySystem:!0})):s("No pending move")}],Xs=[{intent:h.MoveToNextContainer,mode:f.MOVE,action:()=>Ve()?(S({mode:f.COMMAND_LINE}),$(()=>"move to-next"),Ce({isForceExecutedBySystem:!0})):s("No pending move")},{intent:h.MoveToPreviousContainer,mode:f.MOVE,action:()=>Ve()?(S({mode:f.COMMAND_LINE}),$(()=>"move to-previous"),Ce({isForceExecutedBySystem:!0})):s("No pending move")}];var Js={[P.WORKSPACE]:[...Kn,...Vn],[P.BOARD]:[...Kn,...Vn],[P.SWIMLANE]:[...Kn,...Vn,...Xs],[P.TICKET]:[],[P.FIELD]:[],[P.FIELD_LIST]:[],[P.TEXT]:[]};var Qs=[{intent:h.AddItem,mode:f.DEFAULT,description:"[n] new...",action:()=>(S({mode:f.COMMAND_LINE}),$(()=>`${y.NEW} `),l("Adding new item",null))},{intent:h.Delete,mode:f.DEFAULT,description:"[d] delete",action:()=>(S({mode:f.COMMAND_LINE}),$(()=>`${y.DELETE} `),l("Deleting item",null))},{intent:h.InitCommandLine,mode:f.DEFAULT,description:"[:] focus command line",action:()=>(S({mode:f.COMMAND_LINE}),$(()=>""),l("Entering command line mode",null))},{intent:h.Confirm,mode:f.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,currentNode:t}=v();if(!O(e?.id??"")?.length){if(e?.title===Y.DESCRIPTION)return $(()=>y.EDIT+"description "),S({mode:f.COMMAND_LINE}),l("Propose command",!0);if(e?.title===Y.ASSIGNEES)return $(()=>y.ASSIGN+" "),S({mode:f.COMMAND_LINE}),l("Propose command",!0);if(e?.title===Y.TAGS)return $(()=>y.TAG+" "),S({mode:f.COMMAND_LINE}),l("Propose command",!0);if(t.title===Y.DESCRIPTION&&e?.context==="TEXT")return $(()=>y.EDIT+"description "),S({mode:f.COMMAND_LINE}),l("Propose command",!0)}return D.enterChildNode(),l("Entering context",null)}},{intent:h.Exit,mode:f.DEFAULT,description:"[q] exit context",action:()=>(D.enterParentNode(),l("Exiting context",null))},{intent:h.NavPreviousItem,mode:f.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(D.navigateToPreviousItem(),l("Navigating to previous item",null))},{intent:h.NavNextItem,mode:f.DEFAULT,action:()=>(D.navigateToNextItem(),l("Navigating to next item",null))},{intent:h.NavToPreviousContainer,mode:f.DEFAULT,action:()=>(D.navigateToPreviousContainer(),l("Navigating to previous container",null))},{intent:h.NavToNextContainer,mode:f.DEFAULT,action:()=>(D.navigateToNextContainer(),l("Navigating to next container",null))},{intent:h.Edit,mode:f.DEFAULT,action:()=>(S({mode:f.COMMAND_LINE}),$(()=>"edit"),Ce(),l("Fired command",!0))},{intent:h.SetViewDense,mode:f.DEFAULT,description:"[v] view change (wide/dense)",action:()=>(pe({viewMode:"dense"}),l("View set",null))},{intent:h.SetViewWide,mode:f.DEFAULT,action:()=>(pe({viewMode:"wide"}),l("View set",null))}];var hl=500,Cl=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),Zs=e=>{let t=Cl(e);t&&$(n=>(n+t).slice(0,hl))};var ea=[{intent:h.ViewHelp,mode:f.DEFAULT,action:()=>(S({mode:f.HELP}),l("Viewing help",null))},{intent:h.Exit,mode:f.HELP,action:()=>(S({mode:f.DEFAULT}),l("Exiting help",null))},{intent:h.Confirm,mode:f.COMMAND_LINE,action:()=>(Ce(),l("Executing command",null))},{intent:h.MoveCursorLeft,mode:f.COMMAND_LINE,action:()=>(Gr(-1),l("Moving cursor left",null))},{intent:h.MoveCursorRight,mode:f.COMMAND_LINE,action:()=>(Gr(1),l("Moving cursor right",null))},{intent:h.MoveCursorLeftOfWord,mode:f.COMMAND_LINE,action:()=>(qr("left"),l("Moving cursor left of word",null))},{intent:h.MoveCursorRightOfWord,mode:f.COMMAND_LINE,action:()=>(qr("right"),l("Moving cursor right of word",null))},{intent:h.ExitCommandLine,mode:f.COMMAND_LINE,action:()=>(S({mode:f.DEFAULT}),l("Exiting command line",null))},{intent:h.AutoCompleteCommand,mode:f.COMMAND_LINE,action:()=>($((e,{remainder:t})=>t?e+t:e),l("Auto-completing command",null))},{intent:h.CaptureInput,mode:f.COMMAND_LINE,action:(e,{sequence:t})=>(Zs(t??""),l("Capturing input",null))},{intent:h.EraseInput,mode:f.COMMAND_LINE,action:()=>(Vi(),l("Erasing input",null))},{intent:h.EraseInputWord,mode:f.COMMAND_LINE,action:()=>(Gi(),l("Erasing input word",null))},{intent:h.GetLastCommandFromHistory,mode:f.COMMAND_LINE,action:()=>(Yi(),l("Getting last command from history",null))},{intent:h.GetNextCommandFromHistory,mode:f.COMMAND_LINE,action:()=>(Xi(),l("Getting next command from history",null))}];import Nl from"chalk";var Gn=": for command line",ta="q to exit",na=`${Nl.hex(N.accent)("m")} to confirm`,ao={[P.WORKSPACE]:[Gn],[P.BOARD]:[Gn],[P.BOARD+f.COMMAND_LINE]:[Gn],[P.SWIMLANE]:[Gn],[P.TICKET+f.HELP]:[ta],[P.SWIMLANE+f.HELP]:[ta],[P.TICKET]:[],[P.FIELD]:[],[P.SWIMLANE+f.MOVE]:[na],[P.TICKET+f.MOVE]:[na]};var qn=e=>e.trim().toLocaleLowerCase(),El=(e,t)=>{let n=I.getFieldByTitle(e,t);if(!n)return"";let r=n.props?.value;return typeof r=="string"?r:""},Il=e=>{let{tags:t}=v(),n=I.getFieldByTitle(e,"Tags");return n?O(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},bl=e=>{let{contributors:t}=v(),n=I.getFieldByTitle(e,"Assignees");return n?O(n.id).map(r=>{let o=r.props?.value;return typeof o=="string"?t[o]?.name:void 0}).filter(r=>!!r):[]},ra=(e,t)=>{let n=t.value;if(!n)return!0;switch(t.target){case"title":return qn(e.title??"").includes(n);case"description":return qn(El(e.id,Y.DESCRIPTION)).includes(n);case"tag":return Il(e.id).map(qn).some(c=>c.includes(n));case"assignee":return bl(e.id).map(qn).some(c=>c.includes(n));default:return!0}};function oa(e,t,n){let r=t[e];if(!r)return s("buildBreadCrumb(): current node not found");let o=[],i=r;for(;i&&(o.push(i),!(i.id===n||!i.parentNodeId));)i=t[i.parentNodeId];let a=o[o.length-1];return!a||a.id!==n?s("buildBreadCrumb(): node is not connected to root"):(o.reverse(),l("Breadcrumb built",o))}var ia=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 zn,co,lo=new Set,sa=()=>{for(let e of lo)e()},Rl=e=>(lo.add(e),()=>lo.delete(e));function aa(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 c=o[t];if(!c)return s("Unable to derive state, currentNode not found");let u=oa(t,o,r);if(d(u))return logger.error(u.message),u;let m=u.value,{context:p}=c,g=ao[p+n]??ao[p]??[],x=[...Qs,...Js[p]??[],...ea],E=ia(x),A=Al(o,i),R=A[t]?.[e.selectedIndex]??null;return l("Derived successfully",{...e,currentNode:c,breadCrumb:m,availableHints:g,availableActions:x,actionIndex:E,selectedNode:R,renderedChildrenIndex:A})}var v=()=>(zn||logger.error("State not initialized. Call initWorkspaceState() first.",new Error().stack),zn);function jt(e){co=e;let t=be(process.cwd()),n=!1;if(!d(t)){let i=We(t.value);if(d(i))return s(i.message);n=!0}let r={readOnly:!1,filters:[],tags:{},contributors:{},mode:f.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=aa(r);return d(o)?o:(zn=o.value,sa(),l("State initialized",null))}function he(e){let t=v(),n=e(t),r=aa(n);return d(r)?s(r.message??"Unable to update state"):(zn=r.value,sa(),l("State updated",null))}var S=e=>he(t=>({...t,...e}));var G=()=>Sl(Rl,v,v),Al=(e,t)=>{let n={};for(let r of Object.values(e))ye(r)&&t.length>0&&!t.every(o=>ra(r,o))||!r.parentNodeId||r.isDeleted||((!r.parentNodeId||!n[r.parentNodeId])&&(n[r.parentNodeId]=[]),n[r.parentNodeId].push(r));for(let r of Object.keys(n))n[r].sort((o,i)=>{let a=e[o.id],c=e[i.id];return!a||!c?0:a.rank.localeCompare(c.rank)});return n},T=e=>v()?.renderedChildrenIndex[e]??[],so=()=>co?jt(co):s("Cannot reset state: no initial workspace found");import{Box as Wl}from"ink";import po from"react";import Jt from"chalk";import{Box as uo,Text as da}from"ink";import Xt,{useEffect as wl,useMemo as Tl,useState as Ml}from"react";var ca=Jt.gray,Pl=Jt.inverse,kl=Jt.inverse.gray,Dl={hint:"",hints:[],overlap:0,remainder:""},ua=({value:e,command:t})=>{if(!t)return null;let n=e.trimStart(),o=e.length-n.length;return e.slice(o,o+t.length)!==t?null:{start:o,end:o+t.length}},Fl=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=de(t);return{bg:r=>Jt.bgHex(n).black(r),bgCursor:r=>Jt.bgHex(n).inverse.black(r)}}return Wr(t)},Ll=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=ua({value:e,command:t});if(!r)return null;let i=e.slice(r.end).match(/^\s*/)?.[0].length??0,a=r.end+i;return e.slice(a,a+n.length)!==n?null:{start:a,end:a+n.length}},la=()=>({value:ce.value,cursorPosition:ce.cursorPosition,commandIsPending:ce.commandIsPending,autoCompletion:ce.commandMeta.autoCompletion??Dl,infoMessage:ce.commandMeta.infoMessage,validationStatus:ce.commandMeta.validity,command:ce.commandMeta.command,inputString:ce.commandMeta.inputString,modifier:ce.commandMeta.modifier}),Ol=(e,t)=>e.value===t.value&&e.cursorPosition===t.cursorPosition&&e.commandIsPending===t.commandIsPending&&e.infoMessage===t.infoMessage&&e.autoCompletion.hint===t.autoCompletion.hint&&e.autoCompletion.overlap===t.autoCompletion.overlap&&e.autoCompletion.remainder===t.autoCompletion.remainder&&e.validationStatus===t.validationStatus&&e.command===t.command&&e.modifier===t.modifier&&e.inputString===t.inputString,ma=({width:e})=>{let[t,n]=Ml(la());wl(()=>{let g=()=>{let E=la();n(A=>Ol(A,E)?A:E)},x=Ki(g);return g(),()=>{x()}},[]);let{value:r,cursorPosition:o,infoMessage:i,commandIsPending:a,autoCompletion:c,command:u,modifier:m}=t,p=Tl(()=>{let g=Math.max(0,Math.min(o,r.length)),x=ua({value:r,command:u}),E=Ll({value:r,command:u,modifier:m}),A=u?Wr(u):null,R=Fl({command:u,modifier:m}),b=(q,re)=>{let ct=x&&re>=x.start&&re<x.end,en=E&&re>=E.start&&re<E.end;return ct&&A?A.fg(q):en&&R?R.bg(q):q},w=(q,re)=>{let ct=x&&re>=x.start&&re<x.end,en=E&&re>=E.start&&re<E.end;return ct&&A?A.fgCursor(q):en&&R?R.bgCursor(q):Pl(q)},U=r.slice(0,g),le=r[g]??" ",ne=g<r.length?r.slice(g+1):"",Zt=Array.from(U).map((q,re)=>b(q,re)).join(""),St=w(le,g),Rt=Array.from(ne).map((q,re)=>b(q,g+1+re)).join("");if(c.hint){let q=c.hint[c.overlap]??le;St=kl(q),Rt=ca(c.remainder.slice(1)+ne)}return ca(":")+Zt+St+Rt},[r,o,c,u,m]);return Xt.createElement(uo,{flexDirection:"column",justifyContent:"flex-start"},Xt.createElement(uo,{flexDirection:"column",paddingX:1,borderColor:N.secondary,borderStyle:"round",width:e},Xt.createElement(uo,null,Xt.createElement(da,null,p),i&&Xt.createElement(da,{wrap:"truncate",color:a?N.red:N.secondary2},` ${i} `))))};import pa from"chalk";import{Box as Bl,Text as mo}from"ink";import Yn from"react";var Ul=(e,t)=>e.length===t?e:e.length>t?e.slice(0,t):e.padEnd(t," "),$l=(e,t)=>{let n=[],r=0;for(let o of e){let a=(n.length>0?" | ":"").length+o.length;if(r+a>t-4)break;n.push(o),r+=a}return n},fa=({width:e,availableHints:t})=>{let n=Math.max(0,e-2),r=$l(t,e).join(" | "),o=pa.hex(N.secondary),i=pa.hex(N.secondary2),a=o(`\u256D${"\u2500".repeat(n)}\u256E`),c=o(`\u2570${"\u2500".repeat(n)}\u256F`),u=`${o("\u2502")}${i(Ul(` ${r} `,n))}${o("\u2502")}`;return Yn.createElement(Bl,{flexDirection:"column",width:e},Yn.createElement(mo,null,a),Yn.createElement(mo,null,u),Yn.createElement(mo,null,c))};var Xn=({width:e,mode:t,availableHints:n})=>{let r=[],o=0;for(let i of n){let c=(r.length>0?" | ":"").length+i.length;if(o+c>e+2)break;r.push(i),o+=c}return po.createElement(Wl,null,t===f.COMMAND_LINE?po.createElement(ma,{width:e}):po.createElement(fa,{width:e,mode:t,availableHints:n}))};import{Box as It,Text as ga}from"ink";import Ge from"react";var va=({width:e})=>{let t=[...v().availableActions].map(n=>n.description).filter(n=>n!==void 0).map(n=>{let[r,o]=n.split("]"),i=r?.replace("[",""),a=o?.trim();return[i,a]}).filter(n=>n[0]!==void 0&&n[1]!==void 0).sort(([n],[r])=>n.length===1&&r.length!==1?-1:n.length!==1&&r.length===1?1:n.localeCompare(r,void 0,{sensitivity:"base"}));return t.unshift(["Key(s)","Action"]),Ge.createElement(It,{flexDirection:"column",marginTop:3,borderColor:N.secondary,borderStyle:"round",width:e,minHeight:19},Ge.createElement(It,{flexDirection:"column",width:e},v().mode===f.HELP?t.map(([n,r],o)=>Ge.createElement(It,{paddingLeft:1,key:o,flexDirection:"row"},Ge.createElement(It,{key:o,flexDirection:"row",paddingBottom:o?0:1},Ge.createElement(It,{width:20,justifyContent:"flex-end"},Ge.createElement(ga,{color:o?N.accent:N.secondary},n)),Ge.createElement(It,{flexGrow:1,width:40,paddingLeft:2},Ge.createElement(ga,{color:o?N.primary:N.secondary},r))))):null))};import _l from"chalk";import{Box as Jn,Text as qe}from"ink";import Ne from"react";var ya=({width:e,height:t})=>Ne.createElement(Jn,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:N.secondary,rowGap:1},Ne.createElement(qe,{color:N.accent,bold:!0},"Initialize project"),Ne.createElement(qe,null,`This folder is not an ${_l.hex(N.accent)("epiq")} project yet.`),Ne.createElement(qe,{color:N.primary},"To start tracking issues here, we need to initialize a new"," ",Ne.createElement(qe,{color:N.primary,backgroundColor:N.secondary}," .epiq/project.json ")," ","file in this repository."),Ne.createElement(Jn,{marginTop:1,flexDirection:"column"},Ne.createElement(Jn,null,Ne.createElement(qe,{color:N.accent}," "),Ne.createElement(qe,{color:N.primary},"Type "),Ne.createElement(qe,{backgroundColor:N.secondary}," :init "))),Ne.createElement(Jn,{marginTop:1},Ne.createElement(qe,{color:N.secondary2},"(This will create the local epiq project files)")));import{Box as Qn,Text as Ae}from"ink";import Z from"react";var jl=({isDone:e,command:t,value:n})=>Z.createElement(Qn,null,Z.createElement(Ae,{color:N.accent,dimColor:e},e?" \u2714 ":" "),Z.createElement(Ae,{dimColor:e},"Type "),Z.createElement(Ae,{backgroundColor:N.secondary,dimColor:e}," "+t+" "),n!==void 0&&Z.createElement(Z.Fragment,null,Z.createElement(Ae,{dimColor:e}," "),Z.createElement(Ae,{color:N.secondary,dimColor:e},"<"+n+">"))),Hl=e=>{if(typeof e=="string")return e;if(typeof e=="boolean")return e?"yes":"no"};function fo({width:e,height:t}){let{isSetPreferredEditor:n,isSetUserName:r,userName:o,preferredEditor:i,autoSync:a,isSetAutoSync:c}=_e(),u=[{key:"username",done:r,command:":config username",value:o,message:"First, choose your username."},{key:"editor",done:n,command:":config editor",value:i,message:"Nice. Now pick your editor."},{key:"autosync",done:c,command:":config autosync",value:a,message:"Almost there. Configure auto sync."}],m=u.findIndex(g=>!g.done),p=m===-1?void 0:u[m];return Z.createElement(Qn,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:N.secondary,rowGap:1},Z.createElement(Ae,{color:N.accent,bold:!0},"Welcome! \u{1F539}"),Z.createElement(Ae,null,"Lets get you started - its a breeze."),Z.createElement(Ae,{color:N.secondary2},"And remember, you can always get help with"," ",Z.createElement(Ae,{color:N.accent},":help"),"."),p&&Z.createElement(Ae,{color:N.secondary2},p.message),Z.createElement(Qn,{flexDirection:"column"},u.map((g,x)=>m===-1||x<=m?Z.createElement(Qn,{key:g.key,marginBottom:1},Z.createElement(jl,{isDone:g.done,command:g.command,value:g.done?Hl(g.value):void 0})):null)))}import Sa from"chalk";import{Box as er,Text as ze}from"ink";import ee from"react";import{Box as go,Text as Kl}from"ink";import bt from"react";var Vl=(e,t)=>e.length<=t?e:t<=1?"\u2026":e.slice(0,t-1)+"\u2026",xa=({width:e})=>{let{viewMode:t}=L(),{breadCrumb:n,currentNode:r,selectedIndex:o}=v(),i=O(r.id)[o],a=je(i?.id??r.id,"TICKET"),c=Ee(a)?a.value:void 0,u=c?.id?O(c.id):[],m=R=>{let b=u.find(w=>w.title===R);return b?O(b.id).map(w=>typeof w.props?.value=="string"?w.props.value:"").filter(w=>!!w):[]},p=m("Tags"),g=m("Assignees"),x=c?.parentNodeId?!kr(r.id,c?.parentNodeId)&&t==="dense":!1,E=n.map((R,b)=>{let w=b===n.length-1,U=O(R.id),le=w?U?.[o]?.title:void 0;return`${b?" / ":""}${R.title??""}${le?` \u25B8 ${le}`:""}`}).join(""),A=Vl(E,e);return bt.createElement(go,null,bt.createElement(Kl,{color:N.secondary2},A),x?p.map(R=>bt.createElement(go,{key:R,paddingLeft:2},bt.createElement(Nt,{id:R}))):null,x?g.map(R=>bt.createElement(go,{key:R,paddingLeft:2},bt.createElement(Ct,{id:R}))):null)};import{Box as Gl,Text as ha}from"ink";import Zn from"react";var ql=({filters:e})=>Zn.createElement(Gl,{columnGap:1},Zn.createElement(ha,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>Zn.createElement(ha,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),Ca=Zn.memo(ql);var Na="0.5.2";import Ea from"chalk";import{Text as zl}from"ink";import Yl,{useEffect as Xl,useState as Jl}from"react";var Ql=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],Ia=e=>{let t=e.replace("#","");return{r:parseInt(t.slice(0,2),16),g:parseInt(t.slice(2,4),16),b:parseInt(t.slice(4,6),16)}},Zl=({r:e,g:t,b:n})=>{let r=o=>Math.round(Math.max(0,Math.min(255,o))).toString(16).padStart(2,"0");return`#${r(e)}${r(t)}${r(n)}`},eu=(e,t,n)=>{let r=Ia(e),o=Ia(t);return Zl({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},tu=(e,t)=>{if(e.length===1)return e[0];let n=t*(e.length-1),r=Math.floor(n),o=n-r,i=e[r],a=e[Math.min(r+1,e.length-1)];return eu(i,a,o)};function ba({syncStatus:e}){let[t,n]=Jl(0);Xl(()=>{if(e.status!=="syncing"){n(0);return}let a=setInterval(()=>{n(c=>c+1)},50);return()=>clearInterval(a)},[e.status]);let r={synced:"synced ",outOfSync:"unsynced",syncing:"syncing "},i={synced:N.secondary2,outOfSync:N.yellow,syncing:tu(Ql,(Math.sin(t*.12)+1)/2)??""}[e.status];return Yl.createElement(zl,null,Ea.hex(i)("\u25CF")+Ea.dim(` ${r[e.status].padEnd(2)} `))}function tr({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,eventLog:r,unappliedEvents:o,syncStatus:i}=G(),{userName:a,preferredEditor:c}=L(),u=56,m=process.stdout.columns-u-8,p=r.at(-1)?.id,g=Mn(p??""),x=Ee(g)?Li(g.value):"INVALID DATE";return ee.createElement(er,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},t?ee.createElement(ze,null," "):ee.createElement(er,{paddingLeft:1},e.length>0?ee.createElement(Ca,{filters:e}):ee.createElement(xa,{width:m})),n==="live"?ee.createElement(er,{columnGap:1,paddingRight:2,"max-width":u,overflow:"hidden",justifyContent:"flex-end"},ee.createElement(ba,{syncStatus:i}),ee.createElement(ze,{dimColor:!0,color:N.secondary2},Na+" "),ee.createElement(Ra,{icon:"@",value:a}),ee.createElement(Ra,{icon:"\u276F",value:c})):"",n==="peek"?ee.createElement(er,{paddingLeft:1},ee.createElement(ze,{backgroundColor:N.yellow}," Readonly "),ee.createElement(ze,{color:N.yellow}," "+o.length+" edits ago at "),ee.createElement(ze,{backgroundColor:N.yellow,color:N.accent}," "+x+" "),ee.createElement(ze,{color:N.yellow},". Resume with "),ee.createElement(ze,{backgroundColor:N.yellow}," :peek now ")):"")}function Ra({icon:e,value:t}){return ee.createElement(ze,null,Sa.dim(e)+Sa.hex(N.accent)(` ${t??"-"} `))}import{Box as nu,Text as ru}from"ink";import Qt from"react";import{Box as nr,Text as vo}from"ink";import Ye from"react";function yo(){let e=G(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,i=process.stdout.columns||120,a=t?.id?T(t?.id):[];return Ye.createElement(nr,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:N.secondary,width:i},Ye.createElement(nr,{padding:1,paddingTop:0,paddingBottom:0},Ye.createElement(vo,null,"Select a board:")),Ye.createElement(nr,{padding:1,flexDirection:"column"},a.map((c,u)=>{let m=e.currentNode.context==="WORKSPACE"&&e.selectedIndex===u,g=T(c.id).flatMap(({id:x})=>O(x)).length;return Ye.createElement(nr,{key:c.id??u},Ye.createElement(vo,{color:m?N.accent:N.secondary2},Ye.createElement(me,{isSelected:m})),Ye.createElement(vo,{color:m?N.accent:N.secondary2},c.title," (",g," issues)",c.readonly?" \u{1F512}":""))})))}var ou=({currentNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:i,width:a})=>{let{renderedChildrenIndex:c}=G(),u=n.find(({context:x})=>x==="BOARD"),g=i-1-3;return Qt.createElement(nu,{flexDirection:"row"},e.context==="WORKSPACE"?Qt.createElement(yo,null):u?Qt.createElement($n,{height:g,width:a,swimlanes:(c[u.id]??[]).filter(x=>x!==void 0&&lt(x)),currentNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):Qt.createElement(ru,null))},Aa=Qt.memo(ou);function xo({width:e,height:t}){let n=G(),r=n.filters;if(n.mode===f.HELP)return te.createElement(dt,{flexDirection:"column"},te.createElement(va,{width:e}));let{isSetupDone:o}=_e(),i=!o,a=o&&!n.hasProject;if(i)return te.createElement(dt,{flexDirection:"column"},te.createElement(dt,{flexDirection:"column"},te.createElement(tr,{hideBreadCrumb:!0,filters:r}),te.createElement(fo,{height:t,width:e})),te.createElement(Xn,{width:e,mode:n.mode,availableHints:n.availableHints}));if(a)return te.createElement(dt,{flexDirection:"column"},te.createElement(dt,{flexDirection:"column"},te.createElement(tr,{hideBreadCrumb:!0,filters:r}),te.createElement(ya,{height:t,width:e})),te.createElement(Xn,{width:e,mode:n.mode,availableHints:n.availableHints}));let c=Se(v().breadCrumb??[],"BOARD");if(Ee(c)){let u=c.value.id,m=T(u).length,p=3,g=Math.floor(e/p),x=Math.floor(e/Math.max(m,1));e=Math.min(x,g)*Math.max(m,p)}return te.createElement(dt,{flexDirection:"column"},te.createElement(dt,{flexDirection:"column"},te.createElement(tr,{filters:r}),te.createElement(Aa,{width:e,height:t,currentNode:n.currentNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:L().viewMode??"dense",mode:n.mode})),te.createElement(Xn,{width:e,mode:n.mode,availableHints:n.availableHints}))}import iu from"readline";var rr,or,we,su=new Set([h.MoveCursorLeft,h.EraseInputWord,h.MoveCursorLeftOfWord,h.MoveCursorRight,h.MoveCursorRightOfWord,h.NavToPreviousContainer,h.NavToNextContainer,h.NavPreviousItem,h.NavNextItem,h.SetViewDense,h.SetViewWide,h.Confirm,h.Exit,h.InitCommandLine,h.ExitCommandLine,h.CaptureInput,h.EraseInput,h.EraseInputWord,h.HideHelp,h.ViewHelp,h.SetViewDense,h.SetViewWide,h.GetLastCommandFromHistory,h.GetNextCommandFromHistory,h.AutoCompleteCommand]),wa=async e=>{if(e.ctrl&&e.name==="c")return D.exit();let{actionIndex:t,mode:n,readOnly:r}=v(),o=Zi(e,n);if(!o||r&&!su.has(o))return;let i=t[n]?.[o];if(i?.action)try{await i.action(i,e)}catch(a){logger.error(a)}},au=()=>async function(t,n){n.name!=="escape"&&(we&&(clearTimeout(we),we=void 0),await wa(n))},du=()=>async function(t){if(t.length===1&&t[0]===27){we&&clearTimeout(we),we=setTimeout(()=>{wa({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),we=void 0},25);return}we&&(clearTimeout(we),we=void 0)};function Ta(){rr&&process.stdin.removeListener("keypress",rr),or&&process.stdin.removeListener("data",or),rr=au(),or=du(),iu.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",or),process.stdin.on("keypress",rr)}lu(`${ho.bold("Epiq CLI")}
35
+ ${l}
36
+ `,po.writeFileSync(t,n,"utf8"),le.info(`Added ${i.join(", ")} to .gitignore (epiq local state)`),c("Local epiq paths ignored",!0)};import Wt from"node:fs";import dn from"node:path";var js=async e=>{if((await Ne({args:["rev-parse","--verify","HEAD"],cwd:e})).exitCode===0)return c("Initial commit already exists",!1);le.info("Creating initial commit");let n=await V.commit({cwd:e,message:"Initial commit",allowEmpty:!0});return d(n)?s(n.message):c("Created initial commit",!0)},_s=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",Dl=async e=>{let t=await Rn(e);if(d(t))return s(t.message);let n=await ii(e);return d(n)?s(n.message):c("Built sync commit message",`[epiq:sync:${_s(t.value)}:${_s(n.value)}]`)},fo=async({repoRoot:e,stateBranchName:t})=>{le.info(`Creating ${t}`);let n=await L({args:["commit-tree",mi,"-m","[epiq:init-state-branch]"],cwd:e});if(d(n))return s(`Failed to create state branch commit
37
+ ${n.message}`);let r=n.value.stdout.trim(),o=await L({args:["update-ref",`refs/heads/${t}`,r],cwd:e});return d(o)?s(`Failed to create ${t}
38
+ ${o.message}`):c("Created state branch",!0)},Fl=async({repoRoot:e,stateBranchName:t})=>{let n=await Pr({repoRoot:e});if(d(n))return s(`Ensure local state branch failed
39
+ `+n.message);let r=n.value,o=r?await Yt({repoRoot:e,branch:t}):c("No remote, no remote state branch",!1);if(d(o))return s(`Ensure local state branch failed
40
+ `+o.message);let i=o.value;if(r&&i){let l=await V.fetch({cwd:e,remote:fe,branch:t});if(d(l))return s(`Failed to fetch ${t} from remote
41
+ ${l.message}`)}let a=await In({repoRoot:e,branch:t});if(d(a))return s(`Ensure local state branch failed
42
+ `+a.message);if(a.value)return c("Local state branch already exists",!1);if(i){let l=await L({args:["branch","--track",t,`${fe}/${t}`],cwd:e});return d(l)?s(`Failed to create local ${t} from remote
43
+ ${l.message}`):c("Created local state branch from remote",!0)}return fo({repoRoot:e,stateBranchName:t})},Ol=async({repoRoot:e,branch:t})=>{let n=await L({args:["worktree","list","--porcelain"],cwd:e});if(d(n))return s(n.message);let r=n.value.stdout.split(`
44
+ `),o=null;for(let i of r){if(i.startsWith("worktree ")){o=i.slice(9);continue}if(i===`branch refs/heads/${t}`&&o)return c("Found worktree for branch",o)}return c("No worktree found for branch",null)},Bl=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=Xt(dn.dirname(t));if(d(r))return s(`Failed to create state branch worktree
45
+ `+r.message);Wt.existsSync(t)&&!Wt.existsSync(dn.join(t,".git"))&&(le.info("Removing broken state branch worktree path"),fi(t)),le.info("Creating state branch worktree");let o=await V.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return d(o)?s(`Failed to create state branch worktree
46
+ ${o.message}`):c("Created state branch worktree",!0)},go=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await Ol({repoRoot:e,branch:n});if(d(r))return s(r.message);let o=dn.resolve(t),i=r.value?dn.resolve(r.value):null;if(i&&i===o&&Wt.existsSync(i))return c("State branch already checked out in expected worktree",!1);if(i&&i!==o){le.info("Moving state branch worktree to expected location");let u=await V.worktreeRemove({cwd:e,worktreeRoot:i});if(d(u))return s(`Failed to remove existing state branch worktree
47
+ ${u.message}`)}if(i&&!Wt.existsSync(i)){le.info("Pruning stale state branch worktree");let u=await V.worktreePrune({cwd:e});if(d(u))return s(`Failed to prune stale worktrees
48
+ ${u.message}`)}let a=await oi({repoRoot:e,worktreeRoot:t});if(d(a))return s(a.message);let l=Wt.existsSync(t);if(a.value&&l)return c("State branch worktree already exists",!1);if(a.value&&!l){le.info("Pruning missing registered state branch worktree");let u=await V.worktreePrune({cwd:e});if(d(u))return s(`Failed to prune stale worktrees
49
+ ${u.message}`)}return Bl({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},Ul=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await Rn(e);if(d(n))return s(n.message);if(n.value===t)return c("State branch already checked out",!1);(await Ne({cwd:e,args:["rebase","--abort"]})).exitCode===0&&le.info("Aborted stale state branch rebase");let o=await V.checkout({cwd:e,branch:t});return d(o)?s(`Failed to checkout ${t}
50
+ ${o.message}`):c("Checked out state branch",!0)},$l=async({repoRoot:e,stateBranchRoot:t})=>{let n=await kr(t);if(d(n))return s(n.message);if(n.value)return c("State branch upstream already configured",!1);let r=await Pr({repoRoot:t});if(d(r))return s(r.message);if(!r.value)return c("No remote available for state branch upstream",!1);let o=lt(e);if(d(o))return o;let i=o.value,a=await Yt({repoRoot:t,branch:i});if(d(a))return s(a.message);if(!a.value)return c("Remote state branch missing; upstream will be configured on first push",!1);le.info(`Configuring ${i} upstream`);let l=await V.fetch({cwd:t,remote:fe,branch:i});if(d(l))return s(`Failed to fetch ${i}
51
+ ${l.message}`);let u=await V.setUpstream({cwd:t,branch:i,upstream:`${fe}/${i}`});return d(u)?s(`Failed to set state branch upstream
52
+ ${u.message}`):c("Configured state branch upstream",!0)},er=async({stateBranchRoot:e,eventFileName:t})=>{let n=ut(t),r=dn.join(e,n);if(!Wt.existsSync(r))return c("No event file to stage",void 0);let o=await V.stage({cwd:e,pathspec:[n]});return d(o)?s(`Failed to stage state branch event file
53
+ ${o.message}`):c("Staged state branch event file",void 0)},Hs=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Dl(e);return d(n)?s(`Create state branch sync commit failed
54
+ `+n.message):At({cwd:t,message:n.value})},cn=async({repoRoot:e,stateBranchRoot:t})=>{let n=await kr(t);if(d(n))return s(n.message);let r=lt(e);if(d(r))return r;let o=r.value,i=n.value?await V.push({cwd:t}):await V.push({cwd:t,remote:fe,branch:o,setUpstream:!0});return d(i)?s(`Failed during state branch push
55
+ ${i.message}`):c("Pushed state branch",!0)},Vs=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=lt(e);if(d(o))return o;let i=o.value,a=[Tn(),await Fl({repoRoot:e,stateBranchName:i}),await go({repoRoot:e,stateBranchRoot:t,stateBranchName:i}),await Ul({stateBranchRoot:t,stateBranchName:i}),await vi(t),n?await $l({stateBranchRoot:t,repoRoot:e}):c("Skipped state branch upstream bootstrap",!1)];for(let l of a){if(d(l))return s(l.message);r=r||!!l.value}return c(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",r)};import{monotonicFactory as Wl,ulid as Ve}from"ulid";var ln=Wl();function _l(){let e=Je();if(d(e))return s("Unable to boot. State not initialized");let t=e.value,n=Object.values(t.nodes).find(i=>i.context==="WORKSPACE");if(!n)throw new Error("No workspace found in event log");let[r]=F(n.id),[o]=r?F(r.id):[];if(o){let i=t.renderedChildrenIndex?.[o.id]??[];return c("Resolved boot nav target",{currentNode:o,selectedIndex:i.length>0?0:-1})}else return r?c("Resolved boot nav target",{currentNode:r,selectedIndex:0}):n?c("Resolved boot nav target",{currentNode:n,selectedIndex:0}):c("Resolved boot nav target",{currentNode:t.nodes[t.rootNodeId],selectedIndex:0})}function jl(){let e=_l();return d(e)?e:O.navigate(e.value)}function Ks({userId:e,userName:t}){let n=ln(),r=ln(),o=ln(),i=ln(),a=ln(),l=pe(void 0,void 0);if(d(l))return l;let u=pe(void 0,void 0);if(d(u))return u;let m=pe(u.value,void 0);if(d(m))return m;let p=pe(void 0,void 0);if(d(p))return p;let v=pe(p.value,void 0);if(d(v))return v;let C=pe(v.value,void 0);if(d(C))return C;let N=pe(void 0,void 0);return d(N)?N:c("Created default events",[{id:Ve(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:l.value}},{id:Ve(),userId:e,userName:t,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:u.value}},{id:Ve(),userId:e,userName:t,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:p.value}},{id:Ve(),userId:e,userName:t,action:"add.swimlane",payload:{id:i,name:"In progress",parent:r,rank:v.value}},{id:Ve(),userId:e,userName:t,action:"add.swimlane",payload:{id:a,name:"Done",parent:r,rank:C.value}},{id:Ve(),userId:e,userName:t,action:"add.board",payload:{id:Zn,name:"Closed",parent:n,rank:m.value}},{id:Ve(),userId:e,userName:t,action:"add.swimlane",payload:{id:He,name:"Closed",parent:Zn,rank:N.value}},{id:Ve(),userId:e,userName:t,action:"lock.node",payload:{id:Zn}},{id:Ve(),userId:e,userName:t,action:"lock.node",payload:{id:He}}])}function tr(e){if(!e.length){let r=te.workspace("temporary-uninitialized-workspace","Workspace","a0"),o=un(r);return d(o)?o:(b({hasProjectDefinition:!1,mode:f.DEFAULT}),c("Booted uninitialized workspace placeholder",null))}if(!e.some(r=>r.action==="init.workspace"))return s("Initialized Epiq project has no workspace init event");let n=yt(e).filter(d);return n.length>0?s(`Materializing failed:
56
+ ${n.map(r=>r.message).join(`
57
+ `)}`):(jl(),b({hasProjectDefinition:!0}),c("State booted successfully",null))}var Vl=async e=>{let t=await L({cwd:e,args:["status","--porcelain"]});return d(t)?t:c("Checked git diff",t.value.stdout.trim().length>0)},j=(e,t)=>s(`[${e}] ${t}`),Gs=async()=>{let e=Yo(),t=await wt(process.cwd());if(d(t))return j(1,t.message);let n=t.value,r=await Sn(n);if(d(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 Vl(n);if(d(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(Fr(n))return j(4,"Epiq project already initialized");let i=Qe();if(!i.isSetupDone||!i.userName)return j(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let a=$(),l=a.userName,u=a.userId;if(!u||!l)return j(5,"Missing Epiq user id");let m=e.stateBranch,p=await In({repoRoot:n,branch:m});if(d(p))return j(6,p.message);if(p.value)return j(6,`State branch already exists: ${m}`);let v=await fo({repoRoot:n,stateBranchName:m});if(d(v))return j(6,v.message);let C=Tn();if(d(C))return j(7,C.message);let N=zs.join(An(),e.projectId),I=await go({repoRoot:n,stateBranchRoot:N,stateBranchName:m});if(d(I))return j(8,I.message);let P=zs.join(N,".epiq");Hl.mkdirSync(P,{recursive:!0});let R=Ks({userId:u,userName:l});if(d(R))return j(9,R.message);for(let Ir of R.value){let Vo=Qn({event:Ir,rootDir:N});if(d(Vo))return j(9,Vo.message)}let w=await er({stateBranchRoot:N,eventFileName:an({userId:u,userName:l})});if(d(w))return j(10,w.message);let D=await At({cwd:N,message:"[epiq:init]"});if(d(D))return j(10,D.message);let Z=await Ws(n);if(d(Z))return j(11,Z.message);let oe=Jo({repoRoot:n,fileContents:e});if(d(oe))return j(12,oe.message);let Fe=await V.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(d(Fe))return j(13,Fe.message);let dt=await V.commit({cwd:n,message:"[epiq:init-project]"});if(d(dt))return j(13,dt.message);let Ee="Project initialized!",Vt=await L({cwd:n,args:["push","-u","origin","HEAD"]});d(Vt)&&(Ee+=` Warn: [init:14] ${Vt.message}`);let ie=await cn({repoRoot:n,stateBranchRoot:N});d(ie)&&(Ee+=` Warn: [init:15] ${ie.message}`);let bt=yt(R.value).filter(d);if(bt.length>0)return j(16,bt.map(Ir=>Ir.message).join(`
58
+ `));let ct=Je();if(d(ct))return j(16,ct.message);let{rootNodeId:gd,nodes:vd}=ct.value,Ho=vd[gd];return Ho?(O.navigate({currentNode:Ho,selectedIndex:0}),b({hasProjectDefinition:!0,mode:f.DEFAULT}),c(Ee,null)):j(16,"Unable to resolve initialized root node")};import{ulid as zl}from"ulid";import{ulid as Kl}from"ulid";var qs=null,nt=()=>structuredClone(qs),mn=e=>{qs=e},Ys=()=>{let{currentNode:e,selectedIndex:t}=x(),r=U(e.id)[t];return r?c("Resolved selected child",r):s("Target node not found")},vo=({id:e,parentId:t,position:n={at:"end"}})=>{let r=U(t).filter(o=>o.id!==e);return nr(r,n)},Xs=({id:e,parentId:t,position:n={at:"end"}})=>{let r=z();if(d(r))return s("Unable to resolve user ID");let o=vo({parentId:t,id:e,position:n});return d(o)?o:c("Created pending move state",{id:Kl(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value.rank}})},Js=e=>{mn(e);let t=pn(e,!0);return d(t)?t:c("Node moved successfully",t.value)};function yo(e){let t=Ys();if(d(t))return t;let{currentNode:n,nodes:r}=x();if(!n.parentNodeId)return s("Missing parent node id");let o=r[n.parentNodeId];if(!o)return s("Missing parent node");let i=U(o.id),a=i.findIndex(({id:m})=>m===n.id);if(a<0)return s("Current node not found among siblings");let l=i[a+e];if(!l)return s("Missing sibling node");let u=Xs({id:t.value.id,parentId:l.id,position:{at:"end"}});return d(u)?u:Js(u.value)}function xo(e){let t=Ys();if(d(t))return t;let{currentNode:n,selectedIndex:r}=x(),i=U(n.id)[r+e];if(!i)return s("Missing sibling node");let a=Xs({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:i.id}});return d(a)?a:Js(a.value)}var Qs=()=>{let e=nt();if(!e)return s("No pending move state");let t=e.payload.id,n=e.payload.parent,r=x().nodes[n];if(!r)return s("Move parent not found");let o=U(n).findIndex(i=>i.id===t);return o===-1?s("Moved node not found among rendered children"):(O.navigate({currentNode:r,selectedIndex:o}),c("Synchronized navigation to moved node",null))},rr=(e,t="Moved preview")=>{if(d(e))return e;let n=Qs();return d(n)?n:(b({mode:f.MOVE}),c(t,null))},Zs=async()=>{let e=z();if(d(e))return s("Unable to resolve user ID");let{modifier:t}=K().commandMeta,{currentNode:n,selectedIndex:r}=x(),o=U(n.id)[r];if(!o)return b({mode:f.DEFAULT}),s("No move target");if(t==="start"){if(o.readonly)return s("Target node is read-only");if(r===-1)return s("No item selected");if(!o.parentNodeId)return s("Target has no parent");let i=U(o.parentNodeId),a=i.findIndex(({id:v})=>v===o.id);if(a===-1)return s("Target not found among siblings");let l=i[a-1],u=i[a+1],m=u!=null?{at:"before",sibling:u.id}:l!=null?{at:"after",sibling:l.id}:{at:"start"},p=vo({parentId:o.parentNodeId,id:o.id,position:m});return d(p)?p:(mn({id:zl(),action:"move.node",payload:{id:o.id,parent:o.parentNodeId,rank:p.value.rank},...e.value}),b({mode:f.MOVE}),c("Move initialized",null))}if(t==="next")return rr(xo(1));if(t==="previous")return rr(xo(-1));if(t==="to-next")return rr(yo(1));if(t==="to-previous")return rr(yo(-1));if(t==="confirm"){let i=nt();if(!i)return s("No pending move to confirm");let a=await we();if(d(a))return a;let l=Me(i,a.value);if(d(l))return l;let u=Qs();return d(u)?u:(mn(null),b({mode:f.DEFAULT}),c("Moved item",null))}return t==="cancel"?(mn(null),b({mode:f.DEFAULT}),c("Cancelling move",null)):s("Invalid move modifier")};import{ulid as or}from"ulid";import{monotonicFactory as Gl,ulid as ql}from"ulid";var Yl=Gl(),ea=({name:e,parent:t,rank:n,user:{userId:r,userName:o}})=>{let i=Yl();return c("Created issue events",[{id:ql(),userId:r,userName:o,action:"add.issue",payload:{id:i,parent:t,name:e,rank:n}}])};var ta=async(e,t)=>{let n=z();if(d(n))return s("Unable to resolve user ID");let r=await we();if(d(r))return r;let o=r.value;if(!t.inputString)return s(`provide a name for your ${t.modifier}`);let{breadCrumb:i,currentNode:a,selectedIndex:l}=x(),u=m=>{let p=Me(m,o);if(d(p))return p;let v=S.getNode(p.value.result.id);if(!v)return s("Created node not found");if(!v.parentNodeId)return p;let C=S.getNode(v.parentNodeId);return C?(O.navigate({currentNode:C,selectedIndex:S.getSiblings(v.parentNodeId).findIndex(({id:N})=>N===v.id)}),p):s("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:m}=x(),p=S.getNode(m);if(!p)return s("Workspace not found");let v=ir(p.id,n.value,o);return d(v)?v:u({id:or(),action:"add.board",payload:{id:or(),name:t.inputString,parent:p.id,rank:v.value},...n.value})}if(t.modifier==="swimlane"){let m=Te(i,"BOARD");if(d(m))return s("Unable to add swimlane in this context");let p=ir(m.value.id,n.value,o);return d(p)?p:u({id:or(),action:"add.swimlane",payload:{id:or(),name:t.inputString,parent:m.value.id,rank:p.value},...n.value})}if(t.modifier==="issue"){let m=F(a.id)[l],p=a.context==="SWIMLANE"?a:a.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let D=Te(i,"SWIMLANE");return d(D)?null:D.value})();if(!p)return s("Unable to add issue in this context");let v=ir(p.id,n.value,o);if(d(v))return v;let C=ea({name:t.inputString,parent:p.id,rank:v.value,user:n.value});if(d(C))return C;let N=C.value,I=na(N,o);if(I.some(D=>d(D)))return s("Issue create failed: "+I.filter(d).map(D=>D.message).filter(Boolean).join(", "));let P=I[0];if(!P||d(P))return s("Issue creation failed");let w=N.find(D=>D.action==="add.issue")?.payload.id;return w?(O.navigate({currentNode:p,selectedIndex:S.getSiblings(p.id).findIndex(({id:D})=>D===w)}),c("Issue created",null)):s("Unable to determine ticket id")}return c("Success",null)};var ra=async()=>{let e=Te(x().breadCrumb,"BOARD");if(d(e))return e;let t=Rt(process.cwd());if(d(t))throw new Error(t.message);let n=$t(t.value);if(d(n))return s(n.message);let r=n.value,{modifier:o}=K().commandMeta,i;if(o==="now"){let C=ho();if(d(C))return C;let N=yt(r);return N.some(d)?s(N.map(I=>I.message).join(", ")):(b({mode:f.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),c("Peeking now",!0))}if(o==="prev"){let C=x().eventLog.at(-2),N=Hr(C);if(N===null)return s("No previous event to peek");i=N}else if(o==="next"){let C=x().unappliedEvents.at(0),N=Hr(C);if(N===null)return s("No next event to peek");i=N}else{let C=Bn(o);if(!C)return s("Invalid peek date");i=C.getTime()}let a=e.value.id,{appliedEvents:l,unappliedEvents:u}=ks(r,i),m=ho();if(d(m))return m;let p=yt(l);if(p.some(d))return s(p.map(C=>C.message).join(", "));let v=x().nodes[a];return v?(O.navigate({currentNode:v,selectedIndex:0}),b({mode:f.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:u}),c("Peeking ",!0)):s("Board did not exist at peek date")};import Xl from"zod";var oa=()=>{let e=K().commandMeta.inputString,t=Xl.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=vt({autoSyncDebounceMs:t.data});return d(n)?n:(ye({autoSyncIntervalMs:t.data}),b({mode:f.DEFAULT}),c(`Auto sync interval set to ${t.data}ms`,null))};var ia=()=>{let e=K().commandMeta.inputString.trim();if(e!=="yes"&&e!=="no")return s("Invalid response");let t=Pi(e),n=vt({autoSync:t});return d(n)?n:(ye({autoSync:t}),b({mode:f.DEFAULT}),c(`Auto sync set to "${e}"`,null))};var sa=async()=>{_(()=>""),b({mode:f.DEFAULT});let e=Je();if(d(e))return s(e.message);if(e.value.syncStatus.status==="syncing")return s("Sync already in progress");b({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await Dn();return d(t)?(b({syncStatus:{msg:t.message,status:"failed"}}),t):(b({mode:f.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};var aa=e=>Object.values(x().tags).find(t=>t.name===e),da=e=>Object.values(x().contributors).find(t=>t.name===e),sr=[{systemOnly:!0,intent:T.Move,description:"Internal move-state command",mode:f.COMMAND_LINE,action:Zs},{intent:T.Delete,description:"Delete the currently selected node",mode:f.COMMAND_LINE,action:async()=>{let e=z();if(d(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=x(),r=F(t.id)[n];return r?Se({id:ve(),action:"delete.node",payload:{id:r.id},...e.value}):s("Unable to resolve child to delete")},onSuccess:()=>b({mode:f.DEFAULT})},{intent:T.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:f.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=K().commandMeta,n=/(!=|=)/,[r]=e.split(n);if(!r||!(a=>X(y.FILTER).map(l=>l.split(n)[0]).includes(a))(r))return s("Invalid filter modifier");let i={target:r,operator:"=",value:t.trim()};return ue(a=>({...a,filters:e==="clear"?[]:[...a.filters,i],mode:f.DEFAULT})),c("Filter updated",null)}},{intent:T.ViewHelp,description:"Open the help screen",mode:f.COMMAND_LINE,action:()=>(b({mode:f.HELP}),c("Viewing help",null))},{intent:T.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:f.COMMAND_LINE,action:async()=>{let e=z();if(d(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=x(),r=F(t.id)[n];if(!r)return s("Unable to close issue, no target found");if(!W(r))return s("Cannot close in this context");let o=x().nodes[He];if(!o)return s("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return s("Issue is already closed");let i=await we();if(d(i))return i;let a=i.value,l=Co(o.id,r.id,{at:"end"},e.value,a);if(d(l))return l;let u=await Se({id:ve(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:l.value},...e.value});return d(u)?u:c("Issue closed",null)},onSuccess:()=>b({mode:f.DEFAULT})},{intent:T.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:f.COMMAND_LINE,action:async()=>{let e=z();if(d(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=x(),r=F(t.id)[n];if(!r)return s("Unable to reopen issue, no target found");let o=r.context==="TICKET"?c("Resolved ticket",r):rt(r.id,"TICKET");if(d(o))return s("Cannot reopen in this context");let i=o.value,a=x().nodes[He];if(!a)return s("Unable to locate closed swimlane");if(i.parentNodeId!==a.id)return s("Issue is not closed");if(!W(i))return s("Target node is not issue");let l=Os(i);if(!l)return s("Unable to resolve previous parent from issue history");if(l===a.id)return s("Previous parent resolves to closed swimlane");let u=x().nodes[l];if(!u)return s("Previous parent no longer exists");let m=await we();if(d(m))return m;let p=m.value,v=Co(u.id,i.id,{at:"end"},e.value,p);if(d(v))return v;let C=await Se({id:ve(),action:"reopen.issue",payload:{id:i.id,parent:u.id,rank:v.value},...e.value});return d(C)?C:c("Issue reopened",null)},onSuccess:()=>b({mode:f.DEFAULT})},{intent:T.Init,description:"Initialize Epiq in the current git repository",mode:f.COMMAND_LINE,action:Gs},{intent:T.NewItem,description:"Create a new board, swimlane, or issue",mode:f.COMMAND_LINE,action:ta,onSuccess:()=>b({mode:f.DEFAULT})},{intent:T.Rename,description:"itle] Rename the currently selected node",mode:f.COMMAND_LINE,action:async()=>{let e=z();if(d(e))return s("Unable to resolve user ID");let{currentNode:t,selectedIndex:n}=x(),r=F(t.id)[n];if(!r)return s("Missing node");if(r.readonly)return s("Cannot rename readonly node");let o=es();return o?Se({id:ve(),action:"edit.title",payload:{id:r.id,name:o},...e.value}):s("Provide a new name")},onSuccess:()=>b({mode:f.DEFAULT})},{intent:T.UntagTicket,description:"Remove a tag from the selected issue",mode:f.COMMAND_LINE,action:async()=>{let e=z();if(d(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=K().commandMeta,r=(t||n).trim();if(!r)return s("Provide a tag");let o=aa(r);if(!o)return s(`Tag "${r}" does not exist`);let{selectedNode:i}=x();if(!i)return s("Invalid untag target");let a=rt(i.id,"TICKET");if(d(a))return s("Unable to untag issue in this context");let l=a.value;return W(l)?(l.props.tags??[]).includes(o.id)?Se({id:ve(),action:"remove.issue.tag",payload:{id:l.id,tag:o.id},...e.value}):s("Issue is not tagged with that tag"):s("Target node is not issue")},onSuccess:()=>b({mode:f.DEFAULT})},{intent:T.TagTicket,description:"Add or create a tag on the selected issue",mode:f.COMMAND_LINE,action:async()=>{let e=z();if(d(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=K().commandMeta,r=(t||n).trim();if(!r)return s("Provide a tag");let{selectedNode:o}=x();if(!o)return s("Invalid tag target");let i=rt(o.id,"TICKET");if(d(i))return s("Unable to tag issue in this context");let a=i.value;if(!W(a))return s("Target node is not issue");let l=aa(r),u;if(l)u=l.id;else{let p=ve(),v=await Se({id:ve(),action:"create.tag",payload:{id:p,name:r},...e.value});if(d(v))return v;u=v.value.result.id}return(a.props.tags??[]).includes(u)?s("Already tagged with that tag"):Se({id:ve(),action:"add.issue.tag",payload:{id:a.id,tag:u},...e.value})},onSuccess:()=>b({mode:f.DEFAULT})},{intent:T.AssignUserToTicket,description:"Assign a user to the selected issue",mode:f.COMMAND_LINE,action:async()=>{let e=z();if(d(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=K().commandMeta,r=(t||n).trim();if(!r)return s("Provide an assignee");let{selectedIndex:o,currentNode:i}=x(),a=F(i.id)[o];if(!a)return s("Invalid assign target");let l=rt(a.id,"TICKET");if(d(l))return s("Unable to assign issue in this context");let u=l.value;if(!W(u))return s("Target node is not issue");let m=da(r),p;if(m)p=m.id;else{let C=ve(),N=await Se({id:ve(),action:"create.contributor",payload:{id:C,name:r},...e.value});if(d(N))return N;p=N.value.result.id}return(u.props.assignees??[]).includes(p)?s("Assignee already assigned"):Se({id:ve(),action:"add.issue.assignee",payload:{id:u.id,assignee:p},...e.value})},onSuccess:()=>b({mode:f.DEFAULT})},{intent:T.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:f.COMMAND_LINE,action:async()=>{let e=z();if(d(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=K().commandMeta,r=(t||n).trim();if(!r)return s("Provide an assignee to remove");let o=da(r);if(!o)return s(`Assignee "${r}" does not exist`);let{selectedNode:i}=x();if(!i)return s("Invalid unassign target");let a=rt(i.id,"TICKET");if(d(a))return s("Unable to unassign in this context");let l=a.value;return W(l)?(l.props.assignees??[]).includes(o.id)?Se({id:ve(),action:"remove.issue.assignee",payload:{id:l.id,assignee:o.id},...e.value}):s(`Issue is not assigned to "${r}"`):s("Target node is not issue")},onSuccess:()=>b({mode:f.DEFAULT})},{intent:T.Sync,description:"Pull, commit, and push Epiq state",mode:f.COMMAND_LINE,action:sa},{intent:T.Peek,description:"View board state at another point in time",mode:f.COMMAND_LINE,action:ra},{intent:T.Export,description:"Export the current board layout to markdown",mode:f.COMMAND_LINE,action:async()=>{let e=await xs();return d(e)?e:(b({mode:f.DEFAULT}),c("Export successful",!0))}},{intent:T.Exit,description:"Exit the application",mode:f.COMMAND_LINE,action:async()=>(O.exit(),c("Exit successful",!0))},{intent:T.Edit,description:"Edit title or description",mode:f.COMMAND_LINE,action:async(e,t)=>{if(t.modifier===Ze.DESCRIPTION)return $s();if(t.modifier===Ze.TITLE){let n=z();if(d(n))return s("Unable to resolve user ID");let{currentNode:r,selectedIndex:o}=x(),i=F(r.id)[o];if(!i)return s("Missing node");if(i.readonly)return s("Cannot rename readonly node");let a=t.inputString.trim();return a?Se({id:ve(),action:"edit.title",payload:{id:i.id,name:a},...n.value}):s("Provide a new name")}return s("Unknown edit command")},onSuccess:()=>b({mode:f.DEFAULT})},{intent:T.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:f.COMMAND_LINE,action:(e,t)=>{let n=t.inputString.trim();switch(t.modifier){case ee.USERNAME:{let{userId:r,preferredEditor:o,userName:i}=$(),a=n||i,l=r??ve();if(!a||!l)return s("Unable to resolve user name or id");let u=vt({userName:a,userId:l,preferredEditor:o??""});return d(u)?u:(ye({userName:a,userId:l}),b({mode:f.DEFAULT}),c(`Username set to "${a}"`,null))}case ee.EDITOR:{if(!n)return s("No editor provided");let r=vt({preferredEditor:n});return d(r)?r:(ye({preferredEditor:n}),b({mode:f.DEFAULT}),c(`Editor configuration set to "${n}"`,null))}case ee.VIEW:return n!=="wide"&&n!=="dense"?s("Invalid view mode"):(ye({viewMode:n}),c(`View set to "${n}"`,null));case ee.AUTOSYNC:return ia();case ee.SYNC_DEBOUNCE_MS:return oa();default:return s("Unknown config command")}}}];var Jl=new Set(["peek","filter","view-help"]),Ie=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=K();if(!t)return s("No command to confirm");if(!e&&n===pt.Invalid)return s("Invalid command");let i=jn(t);Yi();let{readOnly:a}=x();if(a&&!Jl.has(i))return nn({status:qe.Fail,message:"Command not available in readonly state",value:null});let l=sr.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===i);if(!l)return nn({status:qe.Fail,message:"Command not found",value:null});let u;try{u=await l.action(l,{command:t,inputString:o,modifier:r})}catch(m){return nn({status:qe.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return d(u)?nn(u):(Xi({addToHistory:!e}),l.onSuccess?.(),$().autoSync&&wi(),u)};var ar=[{intent:g.Exit,mode:f.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(b({mode:f.COMMAND_LINE}),_(()=>"move cancel"),Ie({isForceExecutedBySystem:!0}))},{intent:g.InitMove,mode:f.DEFAULT,description:"[m] move init/confirm",action:()=>(b({mode:f.COMMAND_LINE}),_(()=>"move start"),Ie({isForceExecutedBySystem:!0}))},{intent:g.ConfirmMove,mode:f.MOVE,action:()=>(b({mode:f.COMMAND_LINE}),_(()=>"move confirm"),Ie({isForceExecutedBySystem:!0}))}],dr=[{intent:g.MovePreviousItem,mode:f.MOVE,action:()=>nt()?(b({mode:f.COMMAND_LINE}),_(()=>"move previous"),Ie({isForceExecutedBySystem:!0})):s("No pending move")},{intent:g.MoveNextItem,mode:f.MOVE,action:()=>nt()?(b({mode:f.COMMAND_LINE}),_(()=>"move next"),Ie({isForceExecutedBySystem:!0})):s("No pending move")}],ca=[{intent:g.MoveToNextContainer,mode:f.MOVE,action:()=>nt()?(b({mode:f.COMMAND_LINE}),_(()=>"move to-next"),Ie({isForceExecutedBySystem:!0})):s("No pending move")},{intent:g.MoveToPreviousContainer,mode:f.MOVE,action:()=>nt()?(b({mode:f.COMMAND_LINE}),_(()=>"move to-previous"),Ie({isForceExecutedBySystem:!0})):s("No pending move")}];var la={[A.WORKSPACE]:[...ar,...dr],[A.BOARD]:[...ar,...dr],[A.SWIMLANE]:[...ar,...dr,...ca],[A.TICKET]:[],[A.FIELD]:[],[A.FIELD_LIST]:[],[A.TEXT]:[]};var ua=e=>[{intent:g.NavPreviousItem,mode:e,description:"[arrows/hjkl] navigate",action:()=>(O.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:g.NavNextItem,mode:e,action:()=>(O.navigateToNextItem(),c("Navigating to next item",null))},{intent:g.NavToPreviousContainer,mode:e,action:()=>(O.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:g.NavToNextContainer,mode:e,action:()=>(O.navigateToNextContainer(),c("Navigating to next container",null))}],ma=[{intent:g.AddItem,mode:f.DEFAULT,description:"[n] new...",action:()=>(b({mode:f.COMMAND_LINE}),_(()=>`${y.NEW} `),c("Adding new item",null))},{intent:g.Delete,mode:f.DEFAULT,description:"[d] delete",action:()=>(b({mode:f.COMMAND_LINE}),_(()=>`${y.DELETE} `),c("Deleting item",null))},{intent:g.InitCommandPalette,mode:f.DEFAULT,description:"[?] command palette",action:()=>(b({mode:f.PALETTE}),c("Opening command palette",null))},{intent:g.InitCommandLine,mode:f.DEFAULT,description:"[:] focus command line",action:()=>(b({mode:f.COMMAND_LINE}),_(()=>""),c("Entering command line mode",null))},{intent:g.Confirm,mode:f.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,currentNode:t}=x();if(!U(e?.id??"")?.length){if(e?.title===Y.DESCRIPTION)return _(()=>`${y.EDIT} description `),b({mode:f.COMMAND_LINE}),c("Propose command",!0);if(e?.title===Y.ASSIGNEES)return _(()=>`${y.ASSIGN} `),b({mode:f.COMMAND_LINE}),c("Propose command",!0);if(e?.title===Y.TAGS)return _(()=>`${y.TAG} `),b({mode:f.COMMAND_LINE}),c("Propose command",!0);if(t.title===Y.DESCRIPTION&&e?.context==="TEXT")return _(()=>`${y.EDIT} description `),b({mode:f.COMMAND_LINE}),c("Propose command",!0)}return O.enterChildNode(),c("Entering context",null)}},{intent:g.Confirm,mode:f.PALETTE,description:"[<Enter>] select command",action:()=>{let{selectedNode:e}=x();if(!e||!Ko(e))return s("Command only applicable on text nodes");if(e.props.disabled)return s("Command is not available in this context");let t=e?.title;return t?(b({mode:f.COMMAND_LINE}),_(()=>`${t} `),c("Selected command",t)):c("No command selected",null)}},{intent:g.Exit,mode:f.DEFAULT,description:"[q] exit context",action:()=>(O.enterParentNode(),c("Exiting context",null))},{intent:g.Exit,mode:f.PALETTE,description:"[q] close palette",action:()=>(b({mode:f.DEFAULT}),_(()=>""),c("Closed command palette",null))},...ua(f.DEFAULT),...ua(f.PALETTE),{intent:g.Edit,mode:f.DEFAULT,action:()=>(b({mode:f.COMMAND_LINE}),_(()=>y.EDIT),Ie(),c("Fired command",!0))},{intent:g.SetViewDense,mode:f.DEFAULT,description:"[v] view change (wide/dense)",action:()=>(ye({viewMode:"dense"}),c("View set",null))},{intent:g.SetViewWide,mode:f.DEFAULT,action:()=>(ye({viewMode:"wide"}),c("View set",null))}];var Ql=500,Zl=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),pa=e=>{let t=Zl(e);t&&_(n=>(n+t).slice(0,Ql))};var eu=[f.COMMAND_LINE,f.PALETTE],tu=e=>[{intent:g.MoveCursorLeft,mode:e,action:()=>(Zr(-1),c("Moving cursor left",null))},{intent:g.MoveCursorRight,mode:e,action:()=>(Zr(1),c("Moving cursor right",null))},{intent:g.MoveCursorLeftOfWord,mode:e,action:()=>(eo("left"),c("Moving cursor left of word",null))},{intent:g.MoveCursorRightOfWord,mode:e,action:()=>(eo("right"),c("Moving cursor right of word",null))},{intent:g.AutoCompleteCommand,mode:e,action:()=>(_((t,{remainder:n})=>n?t+n:t),c("Auto-completing command",null))},{intent:g.CaptureInput,mode:e,action:(t,{sequence:n})=>(pa(n??""),c("Capturing input",null))},{intent:g.EraseInput,mode:e,action:()=>(Gi(),c("Erasing input",null))},{intent:g.EraseInputWord,mode:e,action:()=>(qi(),c("Erasing input word",null))}],fa=[{intent:g.Confirm,mode:f.COMMAND_LINE,action:()=>(Ie(),c("Executing command",null))},{intent:g.ViewHelp,mode:f.DEFAULT,action:()=>(b({mode:f.HELP}),c("Viewing help",null))},{intent:g.Exit,mode:f.HELP,action:()=>(b({mode:f.DEFAULT}),c("Exiting help",null))},...eu.flatMap(tu),{intent:g.ExitCommandLine,mode:f.COMMAND_LINE,action:()=>(b({mode:f.DEFAULT}),c("Exiting command line",null))},{intent:g.ExitCommandLine,mode:f.PALETTE,action:()=>(b({mode:f.DEFAULT}),c("Exiting palette",null))},{intent:g.GetLastCommandFromHistory,mode:f.COMMAND_LINE,action:()=>(Ji(),c("Getting last command from history",null))},{intent:g.GetNextCommandFromHistory,mode:f.COMMAND_LINE,action:()=>(Qi(),c("Getting next command from history",null))}];import nu from"chalk";var cr=": for command line",ga="q to exit",va=`${nu.hex(h.accent)("m")} to confirm`,Eo={[A.WORKSPACE]:[cr],[A.BOARD]:[cr],[A.BOARD+f.COMMAND_LINE]:[cr],[A.SWIMLANE]:[cr],[A.TICKET+f.HELP]:[ga],[A.SWIMLANE+f.HELP]:[ga],[A.TICKET]:[],[A.FIELD]:[],[A.SWIMLANE+f.MOVE]:[va],[A.TICKET+f.MOVE]:[va]};var fn=e=>e.trim().toLocaleLowerCase(),ru=e=>{let{tags:t}=x();return(e.props.tags??[]).map(n=>t[n]?.name).filter(n=>!!n)},ou=e=>{let{contributors:t}=x();return(e.props.assignees??[]).map(n=>t[n]?.name).filter(n=>!!n)},ya=(e,t)=>{let n=fn(t.value);if(!n)return!0;switch(t.target){case"title":return fn(e.title??"").includes(n);case"description":return fn(e.props.description??"").includes(n);case"tag":return ru(e).map(fn).some(o=>o.includes(n));case"assignee":return ou(e).map(fn).some(o=>o.includes(n));default:return!0}};function xa(e,t,n){let r=t[e];if(!r)return s("buildBreadCrumb(): current node not found");let o=[],i=r;for(;i&&(o.push(i),!(i.id===n||!i.parentNodeId));)i=t[i.parentNodeId];let a=o[o.length-1];return!a||a.id!==n?s("buildBreadCrumb(): node is not connected to root"):(o.reverse(),c("Breadcrumb built",o))}var ha=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 xt,No,bo=new Set,Ca=()=>{for(let e of bo)e()},su=e=>(bo.add(e),()=>bo.delete(e));function Ea(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=xa(t,o,r);if(d(u))return logger.error(u.message),u;let m=u.value,{context:p}=l,v=Eo[p+n]??Eo[p]??[],C=[...ma,...la[p]??[],...fa],N=ha(C),I=au(o,i),P=I[t]?.[e.selectedIndex]??null;return c("Derived successfully",{...e,currentNode:l,breadCrumb:m,availableHints:v,availableActions:C,actionIndex:N,selectedNode:P,renderedChildrenIndex:I})}var x=()=>{if(!xt)throw new Error("State not initialized. Call initWorkspaceState() first.");return xt},Je=()=>xt?c("Retrieved state",xt):s("State not initialized. Call initWorkspaceState() first.");function un(e){No=e;let t=Xe(process.cwd()),n=!1;if(!d(t)){let i=Ye(t.value);if(d(i))return s(i.message);n=!0}let r={readOnly:!1,filters:[],tags:{},contributors:{},mode:f.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,currentNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""},eventLog:[],unappliedEvents:[],timeMode:"live",hasProjectDefinition:n,hasInitializingEvents:!1},o=Ea(r);return d(o)?o:(xt=o.value,Ca(),c("State initialized",null))}function ue(e){let t=x(),n=e(t),r=Ea(n);return d(r)?s(r.message??"Unable to update state"):(xt=r.value,Ca(),c("State updated",null))}var b=e=>ue(t=>({...t,...e}));var Q=()=>iu(su,x,x),au=(e,t)=>{let n={};for(let r of Object.values(e))W(r)&&t.length>0&&!t.every(o=>ya(r,o))||!r.parentNodeId||r.isDeleted||((!r.parentNodeId||!n[r.parentNodeId])&&(n[r.parentNodeId]=[]),n[r.parentNodeId].push(r));for(let r of Object.keys(n))n[r].sort((o,i)=>{let a=e[o.id],l=e[i.id];return!a||!l?0:a.rank.localeCompare(l.rank)});return n},F=e=>x()?.renderedChildrenIndex[e]??[],ho=()=>No?un(No):s("Cannot reset state: no initial workspace found"),Mt=()=>xt!==void 0;var rt=(e,t)=>{let{nodes:n}=x(),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}`)},So=(e,t)=>{let{nodes:n}=x(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},ht=(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"),S={deleteNode(e){ue(t=>{let n={...t.nodes};return delete n[e],{...t,nodes:n}})},editValue(e,t){let{nodes:n}=x(),r=n[e];if(!r)return s("Edit target node not found");let o=ht(r,"edit");if(o)return o;let i={...r,props:{...r.props,description:t}};return this.updateNode(i),c("Issue description updated",{md:t})},renameNode(e,t){let n=this.getNode(e);if(!n)return s("Rename target node not found");let r=ht(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),c("Renamed node",o)},getExistingTags(){let{tags:e}=x();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=x();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return U(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:r}=x(),o=this.getNode(e),i=this.getNode(t);if(!o)return s("Node not found");if(!i)return s("Target parent not found");if(r===e)return s("Cannot move root node");if(e===t)return s("Cannot move node into itself");let a=ht(o,"move");if(a)return a;if(So(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}=x(),o=this.getNode(e);if(!o)return s("Node not found");if(r===e)return s("Cannot delete root node");let i=new Set,a=u=>{let m=t[u];if(!(!m||i.has(u))){i.add(u);for(let p of U(m.id))a(p.id)}};a(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?(b({nodes:l}),c("Successfully tomb stoned",o)):s("Unable to delete undefined")},createContributor(e){let t=ue(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return d(t)?s("Unable to create contributor"):c("Created contributor",e)},assign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return s("Unable to assign contributor, missing contributor");if(!r)return s("Unable to assign contributor, missing target");let o=ht(r,"edit");if(o)return o;if(!W(r))return s("Target is not an issue");let i=r.props.assignees??[];if(i.includes(t))return s("Contributor already assigned");let a={...r,props:{...r.props,assignees:[...i,t]}};return this.updateNode(a),c("Assigned contributor",{assignee:t})},unassign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return s("Unable to unassign, missing contributor");if(!r)return s("Unable to unassign, missing target");let o=ht(r,"edit");if(o)return o;if(!W(r))return s("Target is not an issue");let i=r.props.assignees??[];if(!i.includes(t))return c("Issue is not assigned to that contributor",{assignee:t});let a={...r,props:{...r.props,assignees:i.filter(l=>l!==t)}};return this.updateNode(a),c("Assignee removed",{assignee:t})},tag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return s("Unable to add tag, missing tag");if(!r)return s("Unable to add tag, missing target");let o=ht(r,"edit");if(o)return o;if(!W(r))return s("Target is not an issue");let i=r.props.tags??[];if(i.includes(t))return s("Tag already assigned");let a={...r,props:{...r.props,tags:[...i,t]}};return this.updateNode(a),c("Tag added",{tag:t})},untag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return s("Unable to remove tag, missing tag");if(!r)return s("Unable to remove tag, missing target");let o=ht(r,"edit");if(o)return o;if(!W(r))return s("Target is not an issue");let i=r.props.tags??[];if(!i.includes(t))return c("Issue is not tagged with that tag",{tag:t});let a={...r,props:{...r.props,tags:i.filter(l=>l!==t)}};return this.updateNode(a),c("Tag removed",{tag:t})},createTag(e){let t=ue(n=>({...n,tags:{...n.tags,[e.id]:e}}));return d(t)?s("Could not create tag"):c("Tag created",e)},createNode(e){let t=ue(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(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=ue(o=>({...o,nodes:{...o.nodes,[e]:n}}));return d(r)?s(r.message):c("Locked node",n)},updateNode(e){let t=ue(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return d(t)?t:c("Updated node",e)},getContributor(e){return x().contributors[e]},getTag(e){return x().tags[e]},getNode(e){return x().nodes[e]},getSiblings(e){return U(e)}};import Ct from"chalk";import Na from"string-width";import{decodeTime as du}from"ulid";var cu=(e,t)=>e+" ".repeat(Math.max(0,t-Na(e))),lu=(e,t)=>" ".repeat(Math.max(0,t-Na(e)))+e,uu=e=>({"add.issue":"Created with title","add.issue.assignee":"Assigned to","remove.issue.assignee":"Unassigned from","close.issue":"Closed","delete.node":"Deleted","edit.title":"Changed title to","edit.description":"Changed description","reopen.issue":"Reopened","add.issue.tag":"Tagged with","remove.issue.tag":"Removed tag","lock.node":"Locked node","move.node":"Moved issue"})[e]??(e.endsWith("e")?`${e}d`:`${e}ed`),mu=(e,t)=>t?e<t?"up":e>t?"down":null:null,pu=(e,t)=>{let n=S.getNode(e.payload.parent),r=n?Ct.dim.bgBlack(` ${n.title} `):"unknown",o=t.at(-1);if(o&&"parent"in o&&"rank"in o&&o.parent===e.payload.parent){let i=mu(e.payload.rank,o.rank);if(i)return`Moved ${i} in ${r}`}return`Moved issue to ${r}`},fu=e=>{switch(e.action){case"add.issue.tag":{let t=x().tags[e.payload.tag];return t?Ct.bgHex(ae(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=x().tags[e.payload.tag];return t?Ct.bgHex(ae(t.name))(` ${t.name} `):"unknown tag"}case"add.issue.assignee":{let t=x().contributors[e.payload.assignee];return t?Ct.hex(ae(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=x().contributors[e.payload.assignee];return t?Ct.hex(ae(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""}},gu=e=>{let t=Bi(du(e));return Ct.gray(lu(t,8))},vu=12,yu=e=>cu(`${e}`,vu),ba=(e,t)=>{let n=gu(e.id),r=yu(e.userName),o=Ct.dim("\u203A"),i=e.action==="move.node"?pu(e,t):[uu(e.action),fu(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${i}`};var xu=e=>et(e,"description"),hu=e=>et(e,"assignees"),Cu=e=>et(e,"tags"),Eu=e=>et(e,"history"),Sa=({id:e,name:t,parentNodeId:n,rank:r,value:o,readonly:i=!1,childRenderAxis:a="horizontal"})=>{let l=S.getNode(e);if(!l){S.createNode({...te.field({id:e,name:t,parentNodeId:n,rank:r,props:{value:o},isVirtual:!0}),readonly:i,childRenderAxis:a});return}!Ge(l)||!(l.title!==t||l.parentNodeId!==n||l.rank!==r||l.props.value!==o||l.readonly!==i||l.childRenderAxis!==a)||S.updateNode({...l,title:t,parentNodeId:n,rank:r,props:{...l.props,value:o},readonly:i,childRenderAxis:a})},Ia=({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!1,childRenderAxis:i="horizontal"})=>{let a=S.getNode(e);if(!a){S.createNode({...te.fieldList({id:e,name:t,parentNodeId:n,rank:r,isVirtual:!0}),readonly:o,childRenderAxis:i});return}!Kt(a)||!(a.title!==t||a.parentNodeId!==n||a.rank!==r||a.readonly!==o||a.childRenderAxis!==i)||S.updateNode({...a,title:t,parentNodeId:n,rank:r,readonly:o,childRenderAxis:i})},Ra=e=>{let t=Ae(Oe/4n),n=Ae(Oe/2n),r=Ae(Oe*3n/4n),o=Ae(Oe);d(t)||d(n)||d(r)||d(o)||(Sa({id:xu(e.id),name:Y.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"}),Ia({id:hu(e.id),name:Y.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0}),Ia({id:Cu(e.id),name:Y.TAGS,parentNodeId:e.id,rank:r.value,readonly:!0}),Sa({id:Eu(e.id),name:Y.HISTORY,parentNodeId:e.id,rank:o.value,value:Nu(e),readonly:!0,childRenderAxis:"vertical"}))},Nu=e=>{let t=[...e.log].reverse(),n=new Map;for(let r of t){let o=n.get(r.action)??[];o.push(r.payload),n.set(r.action,o)}return t.map(r=>ba(r,n.get(r.action)??[])).join(`
59
+ `)};var M=(e,t)=>s(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),Aa=e=>{let t=S.getNode(e);!t||!W(t)||t.isDeleted||Ra(t)},bu=e=>{for(let t of e){Aa(t);let n=x().nodes[t]?.parentNodeId;n&&Aa(n)}},Su=(e,t)=>{let n=S.getNode(e);n&&S.updateNode({...n,log:[...n.log??[],t]})},Iu=e=>{let t=[e],n=x().nodes[e]?.parentNodeId;return n&&t.push(n),t},Ru=e=>{switch(e.action){case"delete.node":case"edit.description":return Iu(e.payload.id);case"init.workspace":case"add.workspace":case"add.board":case"add.swimlane":case"add.issue":case"add.field":case"edit.title":case"lock.node":case"move.node":case"close.issue":case"reopen.issue":case"add.issue.tag":case"remove.issue.tag":case"add.issue.assignee":case"remove.issue.assignee":return[e.payload.id];case"rebalance.children":return Object.keys(e.payload.ranks);case"create.tag":case"create.contributor":default:return[]}},Au=e=>{ue(t=>({...t,eventLog:[...t.eventLog,e]}))},wu=e=>{let t=e.userId,n=e.userName;if(!t?.length||!n?.length)return M("Invalid user ID format",e);let r=S.createContributor({id:t,name:n});return d(r)?M(r.message,e):null},Tu=(e,t)=>{let n=wu(e);if(n)return n;let r=[...new Set(Ru(e))];return t||(r.forEach(o=>Su(o,e)),Au(e)),bu(r),null},Mu={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=te.workspace(t,n,r),i=un(o);if(d(i))return M(i.message,e);let a=S.createNode(o);return d(a)?M(a.message??"Failed to initialize workspace",e):Rr(a.value)?c("Workspace initialized",{action:e.action,result:a.value}):s("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=S.createNode(te.workspace(t,n,r));return d(o)?M(o.message??"Failed to add workspace",e):Rr(o.value)?c("Added workspace",{action:e.action,result:o.value}):s("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,i=S.createNode(te.board(t,n,r,o));return d(i)?M(i.message??"Unable to create board",e):zo(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=S.createNode(te.swimlane(t,n,r,o));return d(i)?M(i.message??"Unable to create swimlane",e):St(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=S.createNode(te.ticket(t,n,r,o));return d(i)?M(i.message??"Unable to create issue",e):W(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,a=S.createNode(te.field({id:t,name:n,parentNodeId:r,rank:i,props:{value:o},childRenderAxis:n.includes(Y.DESCRIPTION)?"vertical":"horizontal"}));return d(a)?M(a.message??`Unable to create field: ${n}`,e):Ge(a.value)?c("Added field",{action:e.action,result:a.value}):s("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!S.getNode(t))return M(`Unable to locate node with id ${t}`,e);let o=S.renameNode(t,n);return d(o)?M(o.message??"Unable to edit title",e):c("Edited title",{action:e.action,result:o.value})},"delete.node":e=>{let{id:t}=e.payload,n=S.tombstoneNode(t);return d(n)?M(n.message??"Unable to delete node",e):c("Deleted node",{action:e.action,result:n.value})},"create.tag":e=>{let{id:t,name:n}=e.payload,r=S.createTag({id:t,name:n});return d(r)?M(r.message??"Unable to create tag",e):c("Tag added",{action:e.action,result:r.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,r=S.createContributor({id:t,name:n});return d(r)?M(r.message??"Unable to create contributor",e):c("Contributor created",{action:e.action,result:r.value})},"add.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=S.tag(t,n);return d(r)?M(r.message??"Unable to tag issue",e):c("Issue tagged",{action:e.action,result:{tag:n}})},"remove.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=S.untag(t,n);return d(r)?M(r.message??"Unable to untag issue",e):c("Issue untagged",{action:e.action,result:{tag:n}})},"add.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,r=S.assign(t,n);return d(r)?M(r.message??"Unable to assign issue",e):c("Assigned successfully",{action:e.action,result:{assignee:n}})},"remove.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,r=S.unassign(t,n);return d(r)?M(r.message??"Unable to unassign issue",e):c("Issue unassigned",{action:e.action,result:{assignee:n}})},"move.node":e=>{let{id:t,parent:n,rank:r}=e.payload,o=S.moveNodeToRank({id:t,parentId:n,rank:r});return d(o)?M(o.message??"Failed to move node",e):c("Moved node",{action:e.action,result:o.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,r=S.editValue(t,n);return d(r)?M(r.message??"Unable to edit description",e):c("Set node value",{action:e.action,result:r.value})},"close.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=S.getNode(t);if(!o)return M("Unable to locate issue",e);if(!W(o))return M("Can only close issues",e);let i=S.getNode(He);if(!i)return M("Unable to locate target swimlane",e);if(n!==i.id)return M("Close target must be closed swimlane",e);let a=S.moveNodeToRank({id:t,parentId:n,rank:r});return d(a)?M(a.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=S.getNode(t);if(!o)return M("Unable to locate issue",e);if(!W(o))return M("Can only reopen issues",e);let i=S.getNode(He);if(!i)return M("Unable to locate closed swimlane",e);if(n===i.id)return M("Cannot reopen issue into closed swimlane",e);if(!S.getNode(n))return M("Reopen parent no longer exists",e);let l=S.moveNodeToRank({id:t,parentId:n,rank:r});return d(l)?M(l.message??"Unable to reopen issue",e):c("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=S.lockNode(t);return d(n)?M(n.message??"Unable to lock node",e):c("Node locked",{action:e.action,result:n.value})},"rebalance.children":e=>{let{parent:t,ranks:n}=e.payload;for(let[r,o]of Object.entries(n)){let i=S.getNode(r);if(!i)return M(`Unable to locate node ${r}`,e);if(i.parentNodeId!==t)return M(`Node ${r} is not child of ${t}`,e);let a=S.updateNode({...i,rank:o});if(d(a))return M(a.message??"Unable to rebalance child",e)}return c("Rebalanced children",{action:e.action,result:{parent:t}})}};function pn(e,t=!1){let n=Mu[e.action](e);if(d(n))return n;let r=Tu(e,t);return r||n}var yt=e=>e.map(t=>pn(t));function Me(e,t){let n=pn(e);if(n.status!==qe.Success)return n;let r=Qn({event:e,rootDir:t});return d(r)?r:n}function na(e,t){return e.map(n=>Me(n,t))}var Se=async e=>{let t=await we();return d(t)?t:Me(e,t.value)};var wa=e=>nr(U(e),{at:"end"}),nr=(e,t={at:"end"})=>{let n=r=>d(r)?c("Rank space exhausted",{rank:"",needsRebalance:!0}):c("Resolved rank",{rank:r.value,needsRebalance:!1});if(e.length===0)return n(pe(void 0,void 0));switch(t.at){case"start":{let r=e[0];return r?n(pe(void 0,r.rank)):s("Unable to resolve first sibling")}case"end":{let r=e[e.length-1];return r?n(pe(r.rank,void 0)):s("Unable to resolve last sibling")}case"before":{let r=Ta(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(pe(o?.rank,i.rank)):s("Sibling not found")}case"after":{let r=Ta(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(pe(o.rank,i?.rank)):s("Sibling not found")}}},U=e=>Object.values(x().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),Ta=(e,t)=>e.findIndex(n=>n.id===t),Ma=(e,t,n={at:"end"})=>nr(U(t).filter(r=>r.id!==e),n),Co=(e,t,n,r,o)=>{let i=Ma(t,e,n);if(d(i))return i;if(!i.value.needsRebalance)return c("Resolved rank",i.value.rank);let a=Ar(e,r);if(d(a))return a;let l=Me(a.value,o);if(d(l))return l;let u=Ma(t,e,n);return d(u)?u:u.value.needsRebalance?s("Rank rebalance failed to create space"):c("Resolved rank after rebalance",u.value.rank)},ir=(e,t,n)=>{let r=wa(e);if(d(r))return r;if(!r.value.needsRebalance)return c("Resolved rank",r.value.rank);let o=Ar(e,t);if(d(o))return o;let i=Me(o.value,n);if(d(i))return i;let a=wa(e);return d(a)?a:a.value.needsRebalance?s("Rank rebalance failed to create space"):c("Resolved rank after rebalance",a.value.rank)};var ka=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),La=()=>{let{currentNode:e,selectedIndex:t,selectedNode:n}=x();return{currentNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},Pu=e=>{let t=x().nodes[e];return!!t&&!t.isDeleted&&Ge(t)&&t.childRenderAxis==="vertical"},lr=(e,t)=>{let{nodes:n}=x(),r=n[e];if(!r||r.isDeleted)return!1;let o=F(r.id);return O.navigate({currentNode:r,selectedIndex:ka(t,o.length)}),!0},Da=e=>{let{nodes:t}=x(),n=t[e];if(!n||n.isDeleted)return!1;let r=n.parentNodeId;if(!r)return lr(n.id,0);let o=t[r];if(!o||o.isDeleted)return!1;let a=U(o.id).findIndex(l=>l.id===n.id);return a>=0?(O.navigate({currentNode:o,selectedIndex:a}),!0):Da(o.id)},Pa=e=>{let{nodes:t}=x(),n=e,r=new Set;for(;n&&!r.has(n);){if(r.add(n),Da(n))return!0;n=t[n]?.parentNodeId}return!1},ku=e=>{if(!e)return!1;let t=x().nodes[e];return!!t&&!t.isDeleted},Fa=e=>{let{nodes:t,rootNodeId:n}=x();if(Pu(e.currentNodeId)&&lr(e.currentNodeId,e.selectedIndex))return c("Restored navigation inside text container",null);if(ku(e.selectedNodeId)&&e.selectedNodeId&&Pa(e.selectedNodeId))return c("Restored navigation to selected node or ancestor",null);if(lr(e.currentNodeId,e.selectedIndex))return c("Restored navigation to previous container",null);if(e.parentNodeId&&lr(e.parentNodeId,e.selectedIndex))return c("Restored navigation to previous parent",null);if(Pa(e.currentNodeId))return c("Restored navigation to previous container or ancestor",null);let r=t[n];if(!r||r.isDeleted)return s("Unable to restore navigation");let o=F(r.id);return O.navigate({currentNode:r,selectedIndex:ka(e.selectedIndex,o.length)}),c("Restored navigation to root",null)};var Io=({status:e,msg:t})=>{Mt()&&b({syncStatus:{status:e,msg:t}})},Ro=(e="Syncing...")=>{Io({status:"syncing",msg:e})},Ao=(e="Synced")=>{Io({status:"synced",msg:e})},Lu=e=>{Io({status:"failed",msg:e})},G=e=>(Lu(e),s(e));var _t=(e,t)=>(logger.error(`[boot:${e}] ${t}`),s(`[boot:${e}] ${t}`)),wo=e=>{if(e instanceof Error)return e.message;if(typeof e=="string")return e;try{return JSON.stringify(e,null,2)}catch{return String(e)}},k=(e,t)=>(d(t)&&logger.info(`[${e}]:failed`,t.message),t);import{decodeTime as Du}from"ulid";var gn=e=>{let t=[];for(let n of e.split(`
60
+ `)){let r=n.trim();if(r)try{t.push(JSON.parse(r))}catch{return s("Failed to parse persisted events")}}return c("Parsed persisted events",t)},To=e=>{let[t,n]=e.id;return`${t}:${n??""}`},Oa=e=>{try{return Du(e.id[0])}catch{return 0}},Mo=(e,t)=>{let n=new Map;for(let r of[...e,...t])n.set(To(r),r);return[...n.values()].sort((r,o)=>{let i=Oa(r)-Oa(o);return i!==0?i:To(r).localeCompare(To(o))})},Po=e=>e.length===0?"":e.map(t=>JSON.stringify(t)).join(`
61
+ `)+`
62
+ `;var ur=e=>Re.existsSync(e)?Re.readFileSync(e,"utf8"):null,Wa=(e,t)=>ur(e)===t?!1:(Re.mkdirSync(Et.dirname(e),{recursive:!0}),Re.writeFileSync(e,t,"utf8"),!0),Fu=({stateBranchRoot:e,ownEventFileName:t})=>Et.join(e,ut(t)),Ou=async({stateBranchRoot:e,ownEventFileName:t})=>{let n=ut(t),r=Et.join(e,n);return(await Ne({cwd:e,args:["checkout","--",n]})).exitCode!==0&&Re.existsSync(r)&&Re.rmSync(r,{force:!0}),c("Restored own event file to HEAD",null)},Ba=({ownEventPath:e,ownSnapshot:t})=>{if(t===null)return c("No own snapshot to merge",!1);let n=ur(e)??"",r=gn(n);if(d(r))return s(r.message);let o=gn(t);if(d(o))return s(o.message);let i=Mo(r.value,o.value),a=Wa(e,Po(i));return c("Merged own snapshot",a)},Bu=e=>{let t=Et.join(e,".epiq","events"),n=new Map;if(!Re.existsSync(t))return c("No event files to snapshot",n);for(let r of Re.readdirSync(t)){if(!r.endsWith(".jsonl"))continue;let o=Et.join(t,r);Re.statSync(o).isFile()&&n.set(r,Re.readFileSync(o,"utf8"))}return c("Snapshotted event files",n)},Uu=async e=>{if((await Ne({cwd:e,args:["checkout","--",ut("")]})).exitCode!==0){let n=Et.join(e,".epiq","events");Re.existsSync(n)&&Re.rmSync(n,{recursive:!0,force:!0})}return c("Restored event files to HEAD",null)},$u=({stateBranchRoot:e,snapshots:t})=>{let n=!1;for(let[r,o]of t){let i=Et.join(e,ut(r)),a=ur(i)??"",l=gn(a);if(d(l))return s(l.message);let u=gn(o);if(d(u))return s(u.message);let m=Mo(l.value,u.value);n=Wa(i,Po(m))||n}return c("Merged event snapshots",n)},_a=async(e=process.cwd())=>{logger.info("[sync] syncEpiqFromRemote:start",e),Ro("Syncing from remote");let t=k("ensureSyncReady",await ja({cwd:e,ensureUpstream:!1}));if(d(t))return G(t.message);let{repoRoot:n,stateBranchRoot:r}=t.value,o=k("getStateBranch",lt(n));if(d(o))return G(o.message);let i=o.value,a=k("snapshotEventFiles",Bu(r));if(d(a))return G(a.message);let l=k("restoreEventFilesToHead",await Uu(r));if(d(l))return G(l.message);let u=k("resetBranchHardToRemote",await di({cwd:r,branch:i}));if(d(u))return G(u.message);let m=k("mergeEventSnapshots",$u({stateBranchRoot:r,snapshots:a.value}));return d(m)?G(m.message):(Ao(m.value?"Synced and merged local state":"Synced from remote"),logger.info("[sync] syncEpiqFromRemote:done"),c("Synced state branch from remote",{repoRoot:n,stateBranchRoot:r}))},ja=async({cwd:e,ensureUpstream:t})=>{logger.info("[sync] ensureSyncReady:start",{cwd:e,ensureUpstream:t});let n=k("getRepoRootDir",await wt(e));if(d(n))return s(n.message);let r=n.value;logger.info("[sync] repo root",r);let o=k("getStateBranchRoot",wn({repoRoot:r}));if(d(o))return s(o.message);let i=o.value;logger.info("[sync] state branch root",i);let a=k("ensureInitialCommit",await js(r));if(d(a))return s(a.message);logger.info("[sync] initial commit result",{created:a.value}),logger.info("[sync] bootstrapping state branch storage",{repoRoot:r,stateBranchRoot:i,ensureUpstream:t});let l=k("bootstrapStateBranchStorage",await Vs({repoRoot:r,stateBranchRoot:i,ensureUpstream:t}));if(d(l))return s(l.message);logger.info("[sync] bootstrap result",{bootstrapped:l.value,stateBranchRoot:i}),logger.info("[sync] checking state branch git operation",{stateBranchRoot:i});let u=k("hasInProgressGitOperation(stateBranchRoot)",await Sn(i));if(d(u))return s(u.message);if(logger.info("[sync] state branch git operation check result",{inProgress:u.value}),u.value)return logger.info("[sync] state branch git operation in progress"),s("Cannot sync while a git operation is in progress in the state branch");logger.info("[sync] ensuring state branch layout",{repoRoot:r,stateBranchRoot:i});let m=k("ensureStateBranchLayout",gi(r,i));return d(m)?s(m.message):(logger.info("[sync] state branch layout ready"),logger.info("[sync] ensureSyncReady:done",{repoRoot:r,stateBranchRoot:i,bootstrapped:l.value}),c("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:i,bootstrapped:l.value}))},Ua=async({repoRoot:e,stateBranchRoot:t,ownEventFileName:n})=>{logger.info("[sync] committing own event file from state branch",{ownEventFileName:n,stateBranchRoot:t}),logger.info("[sync] staging own event file",{stateBranchRoot:t,ownEventFileName:n});let r=k("stageStateBranchOwnEventFile",await er({stateBranchRoot:t,eventFileName:n}));if(d(r))return s(r.message);let o=k("hasStagedChanges(after stage)",await ci(t));if(d(o))return s(o.message);if(logger.info("[sync] state branch change check after stage result",{changed:o.value}),!o.value)return logger.info("[sync] no own event file changes to commit"),c("No own event file changes to commit",{createdCommit:!1});logger.info("[sync] creating sync commit");let i=k("createStateBranchSyncCommit",await Hs({repoRoot:e,stateBranchRoot:t}));return d(i)?s(i.message):(logger.info("[sync] created sync commit",i.value),c("Committed own event file",{createdCommit:!0,commitSha:i.value}))},Wu=async({cwd:e=process.cwd(),ownEventFileName:t})=>{if(logger.info("[sync] syncEpiqWithRemote:start",{cwd:e,ownEventFileName:t}),t.includes("/")||t.includes("\\"))return logger.info("[sync] invalid own event file name: contains path separator",{ownEventFileName:t}),s("Own event file must be a file name, not a path");if(!t.endsWith(".jsonl"))return logger.info("[sync] invalid own event file name: missing .jsonl suffix",{ownEventFileName:t}),s("Own event file must end with .jsonl");Ro("Syncing");let n=k("ensureSyncReady",await ja({cwd:e,ensureUpstream:!0}));if(d(n))return G(n.message);let{repoRoot:r,stateBranchRoot:o,bootstrapped:i}=n.value;logger.info("[sync] sync preconditions ready",{repoRoot:r,stateBranchRoot:o,bootstrapped:i}),logger.info("[sync] checking detached state branch",{stateBranchRoot:o});let a=k("isDetachedHead(stateBranchRoot)",await li(o));if(d(a))return G(a.message);if(logger.info("[sync] detached state branch check result",{detached:a.value}),a.value)return logger.info("[sync] state branch is detached"),G("Cannot run :sync while the state branch is in detached HEAD state");let l=!1,u,m=!1,p=!1,v=k("getStateBranch",lt(r));if(d(v))return G(v.message);let C=v.value;logger.info("[sync] resolved state branch",{stateBranch:C,stateBranchRoot:o});let N=Fu({stateBranchRoot:o,ownEventFileName:t}),I=ur(N),P=k("restoreOwnEventFileToHead",await Ou({stateBranchRoot:o,ownEventFileName:t}));if(d(P))return G(P.message);let R=k("pullBranchRebaseIfPresent",await Lr({cwd:o,branch:C}));if(d(R))return G(R.message);m=R.value;let w=k("mergeOwnSnapshot",Ba({ownEventPath:N,ownSnapshot:I}));if(d(w))return G(w.message);let D=k("commitOwnEventFileToStateBranch",await Ua({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(d(D))return G(D.message);if(l=D.value.createdCommit,u=D.value.commitSha,logger.info("[sync] sync own result",{createdCommit:l,commitSha:u}),l||i){logger.info("[sync] pushing state branch",{createdCommit:l,bootstrapped:i,stateBranchRoot:o});let Z=k("pushStateBranch(initial)",await cn({stateBranchRoot:o,repoRoot:r})),oe=Z;if(d(Z)&&si(Z.message)){logger.info("[sync] non-fast-forward, retrying sync");let Fe=k("pullBranchRebaseIfPresent(retry)",await Lr({cwd:o,branch:C}));if(d(Fe))return G(Fe.message);logger.info("[sync] pull retry result",Fe.value);let dt=k("mergeOwnSnapshot(retry)",Ba({ownEventPath:N,ownSnapshot:I}));if(d(dt))return G(dt.message);let Ee=k("commitOwnEventFileToStateBranch(retry)",await Ua({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(d(Ee))return G(Ee.message);logger.info("[sync] retry sync result",Ee.value),Ee.value.createdCommit&&(l=!0,u=Ee.value.commitSha),oe=k("pushStateBranch(retry)",await cn({stateBranchRoot:o,repoRoot:r}))}if(d(oe))return G(oe.message);p=oe.value,logger.info("[sync] pushed to state branch",p)}else logger.info("[sync] no commit created, skipped push");if(l){logger.info("[sync] resolving final sync commit sha",{stateBranchRoot:o});let Z=k("git rev-parse HEAD",await L({args:["rev-parse","HEAD"],cwd:o}));if(d(Z))return G(Z.message);u=Z.value.stdout.trim(),logger.info("[sync] final sync commit sha",u)}return Ao(p?"Synced and pushed":m||l||w.value?"Synced local state":"Already synced"),logger.info("[sync] syncEpiqWithRemote:done",{pulled:m,pushed:p,createdCommit:l,bootstrapped:i,commitSha:u}),c("Synced event logs with state branch",{repoRoot:r,stateBranchRoot:o,createdCommit:l,commitSha:u,pulled:m,pushed:p,bootstrapped:i})},Dn=async()=>{let e=$a();if(e)return e;logger.info("[sync] syncAndReloadState:start");let t=k("resolveActorId",z());if(d(t)||!t.value)return logger.info("[sync] unable to resolve actor id"),s("Unable to resolve event log path");let n=an(t.value);logger.info("[sync] resolved own event file name",{ownEventFileName:n});let r=k("syncEpiqWithRemote",await Wu({ownEventFileName:n}));if(d(r))return logger.info("[sync] syncAndReloadState:sync failed",r.message),s(`Unable to sync state. ${r.message}`);let{stateBranchRoot:o}=r.value;logger.info("[sync] loading merged events after sync",{stateBranchRoot:o});let i=k("loadMergedEvents",$t(o));if(d(i))return s(`Unable to load events. ${i.message}`);logger.info("[sync] loaded merged events after sync",{count:i.value.length});let a=$a();if(a)return a;let l=La(),u=k("bootStateFromEventLog",tr(i.value));if(d(u))return s(`Unable to boot synced state. ${u.message}`);logger.info("[sync] booted state from synced events"),b({hasProjectDefinition:!0,syncStatus:{msg:"Synced",status:"synced"}});let m=k("restoreNavigationAnchor",Fa(l));return d(m)?m:(logger.info("[sync] syncAndReloadState:done"),c("Synced",!0))},$a=()=>x().mode===f.DEFAULT?null:(b({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),s("Will not re-materialize if not in default mode, to not lose edit data"));import{Box as at}from"ink";import q from"react";import{Box as mr,Text as pr}from"ink";import Ke,{useEffect as _u,useMemo as ju}from"react";var Nt="__epiq_palette_root__",ko="__epiq_palette_command__",Hu=e=>`${ko}${e}`,Vu=e=>{let t=new Set(X(y.NONE));return[...new Set(Object.values(y))].filter(n=>n!=="move").filter(n=>n.length>0).filter(n=>n!==y.PALETTE).map(n=>{let r=jn(n),o=sr.find(i=>i.intent===r);return{command:n,description:o?.description??`[${n}] Run command`,isAvailable:t.has(n)}}).filter(n=>n.command.toLowerCase().startsWith(e)||e.length>=2&&n.description.toLowerCase().includes(e)).sort((n,r)=>n.isAvailable!==r.isAvailable?n.isAvailable?-1:1:n.command.localeCompare(r.command))},Ku=e=>te.text({id:Nt,parentNodeId:e,rank:"000000",name:"Command Palette",props:{},readonly:!0,isVirtual:!0}),zu=(e,t,n)=>te.text({id:Hu(e.command),parentNodeId:n,rank:String(t).padStart(6,"0"),name:e.command,props:{value:e.description,disabled:!e.isAvailable},readonly:!0,isVirtual:!0}),Gu=e=>{ue(t=>{let n=Ku(t.rootNodeId),r=Object.fromEntries(Object.entries(t.nodes).filter(([i])=>i!==Nt&&!i.startsWith(ko))),o=Object.fromEntries(e.map((i,a)=>{let l=zu(i,a,Nt);return[l.id,l]}));return{...t,mode:f.PALETTE,currentNodeId:Nt,selectedIndex:e.length>0?0:-1,nodes:{...r,[Nt]:n,...o}}})},qu=()=>{ue(e=>{let t=Object.fromEntries(Object.entries(e.nodes).filter(([n,r])=>n!==Nt&&!n.startsWith(ko)&&!r.isVirtual));return{...e,nodes:t,currentNodeId:e.currentNodeId===Nt?e.rootNodeId:e.currentNodeId,selectedIndex:0}})};function Ha({width:e,height:t}){let r=Zi().value.trim().toLowerCase(),o=ju(()=>Vu(r),[r]);_u(()=>(Gu(o),()=>{qu()}),[o]);let i=x().selectedIndex;return Ke.createElement(mr,{flexDirection:"column",width:e,height:t-2},Ke.createElement(mr,{paddingX:1},Ke.createElement(pr,{color:h.accent},"Command Palette"),Ke.createElement(pr,{dimColor:!0}," \u2014 select a command and press enter")),Ke.createElement(Ft,{height:t-4,itemHeight:3,selectedIndex:i},o.map((a,l)=>{let u=l===i,m=a.isAvailable?h.accent:h.secondary2,p=a.isAvailable?"":"[unavailable] ";return Ke.createElement(mr,{key:a.command,flexDirection:"column",paddingX:1,borderLeft:!1,borderBottom:!1,borderColor:h.secondary,borderStyle:"single"},Ke.createElement(pr,{color:m,dimColor:!a.isAvailable,backgroundColor:u&&a.isAvailable?h.secondary:void 0},u?"\u276F ":" ",":"+a.command),Ke.createElement(mr,{paddingLeft:2},Ke.createElement(pr,{dimColor:!a.isAvailable,color:h.secondary2},p+a.description)))})))}import{Box as am}from"ink";import Fo from"react";import yn from"chalk";import{Box as Lo,Text as Va}from"ink";import vn,{useEffect as Yu,useMemo as Xu,useState as Ju}from"react";var Ka=yn.gray,Qu=yn.inverse,Zu=yn.inverse.gray,em={hint:"",hints:[],overlap:0,remainder:""},Ga=({value:e,command:t})=>{if(!t)return null;let n=e.trimStart(),o=e.length-n.length;return e.slice(o,o+t.length)!==t?null:{start:o,end:o+t.length}},tm=({command:e,modifier:t})=>{if(!t)return null;if(e==="tag"||e==="assign"){let n=ae(t);return{bg:r=>yn.bgHex(n).black(r),bgCursor:r=>yn.bgHex(n).inverse.black(r)}}return zr(t)},nm=({value:e,command:t,modifier:n})=>{if(!t||!n)return null;let r=Ga({value:e,command:t});if(!r)return null;let i=e.slice(r.end).match(/^\s*/)?.[0].length??0,a=r.end+i;return e.slice(a,a+n.length)!==n?null:{start:a,end:a+n.length}},za=()=>({value:de.value,cursorPosition:de.cursorPosition,commandIsPending:de.commandIsPending,autoCompletion:de.commandMeta.autoCompletion??em,infoMessage:de.commandMeta.infoMessage,validationStatus:de.commandMeta.validity,command:de.commandMeta.command,inputString:de.commandMeta.inputString,modifier:de.commandMeta.modifier}),rm=(e,t)=>e.value===t.value&&e.cursorPosition===t.cursorPosition&&e.commandIsPending===t.commandIsPending&&e.infoMessage===t.infoMessage&&e.autoCompletion.hint===t.autoCompletion.hint&&e.autoCompletion.overlap===t.autoCompletion.overlap&&e.autoCompletion.remainder===t.autoCompletion.remainder&&e.validationStatus===t.validationStatus&&e.command===t.command&&e.modifier===t.modifier&&e.inputString===t.inputString,qa=({width:e,mode:t})=>{let[n,r]=Ju(za());Yu(()=>{let C=()=>{let I=za();r(P=>rm(P,I)?P:I)},N=Qr(C);return C(),()=>{N()}},[]);let{value:o,cursorPosition:i,infoMessage:a,commandIsPending:l,autoCompletion:u,command:m,modifier:p}=n,v=Xu(()=>{let C=Math.max(0,Math.min(i,o.length)),N=Ga({value:o,command:m}),I=nm({value:o,command:m,modifier:p}),P=m?zr(m):null,R=tm({command:m,modifier:p}),w=(ie,me)=>{let bt=N&&me>=N.start&&me<N.end,ct=I&&me>=I.start&&me<I.end;return bt&&P?P.fg(ie):ct&&R?R.bg(ie):ie},D=(ie,me)=>{let bt=N&&me>=N.start&&me<N.end,ct=I&&me>=I.start&&me<I.end;return bt&&P?P.fgCursor(ie):ct&&R?R.bgCursor(ie):Qu(ie)},Z=o.slice(0,C),oe=o[C]??" ",Fe=C<o.length?o.slice(C+1):"",dt=Array.from(Z).map((ie,me)=>w(ie,me)).join(""),Ee=D(oe,C),Vt=Array.from(Fe).map((ie,me)=>w(ie,C+1+me)).join("");if(u.hint){let ie=u.hint[u.overlap]??oe;Ee=Zu(ie),Vt=Ka(u.remainder.slice(1)+Fe)}return Ka(t===f.PALETTE?"?":":")+dt+Ee+Vt},[o,i,u,m,p]);return vn.createElement(Lo,{flexDirection:"column",justifyContent:"flex-start"},vn.createElement(Lo,{flexDirection:"column",paddingX:1,borderColor:h.secondary,borderStyle:"round",width:e},vn.createElement(Lo,null,vn.createElement(Va,null,v),a&&vn.createElement(Va,{wrap:"truncate",color:l?h.red:h.secondary2},` ${a} `))))};import Ya from"chalk";import{Box as om,Text as Do}from"ink";import fr from"react";var im=(e,t)=>e.length===t?e:e.length>t?e.slice(0,t):e.padEnd(t," "),sm=(e,t)=>{let n=[],r=0;for(let o of e){let a=(n.length>0?" | ":"").length+o.length;if(r+a>t-4)break;n.push(o),r+=a}return n},Xa=({width:e,availableHints:t})=>{let n=Math.max(0,e-2),r=sm(t,e).join(" | "),o=Ya.hex(h.secondary),i=Ya.hex(h.secondary2),a=o(`\u256D${"\u2500".repeat(n)}\u256E`),l=o(`\u2570${"\u2500".repeat(n)}\u256F`),u=`${o("\u2502")}${i(im(` ${r} `,n))}${o("\u2502")}`;return fr.createElement(om,{flexDirection:"column",width:e},fr.createElement(Do,null,a),fr.createElement(Do,null,u),fr.createElement(Do,null,l))};var xn=({width:e,mode:t,availableHints:n})=>{let r=[],o=0;for(let i of n){let l=(r.length>0?" | ":"").length+i.length;if(o+l>e+2)break;r.push(i),o+=l}return Fo.createElement(am,null,t===f.COMMAND_LINE||t===f.PALETTE?Fo.createElement(qa,{width:e,mode:t}):Fo.createElement(Xa,{width:e,mode:t,availableHints:n}))};import{Box as jt,Text as Ja}from"ink";import ot from"react";var Qa=({width:e})=>{let t=[...x().availableActions].map(n=>n.description).filter(n=>n!==void 0).map(n=>{let[r,o]=n.split("]"),i=r?.replace("[",""),a=o?.trim();return[i,a]}).filter(n=>n[0]!==void 0&&n[1]!==void 0).sort(([n],[r])=>n.length===1&&r.length!==1?-1:n.length!==1&&r.length===1?1:n.localeCompare(r,void 0,{sensitivity:"base"}));return t.unshift(["Key(s)","Action"]),ot.createElement(jt,{flexDirection:"column",marginTop:3,borderColor:h.secondary,borderStyle:"round",width:e,minHeight:19},ot.createElement(jt,{flexDirection:"column",width:e},x().mode===f.HELP?t.map(([n,r],o)=>ot.createElement(jt,{paddingLeft:1,key:o,flexDirection:"row"},ot.createElement(jt,{key:o,flexDirection:"row",paddingBottom:o?0:1},ot.createElement(jt,{width:20,justifyContent:"flex-end"},ot.createElement(Ja,{color:o?h.accent:h.secondary},n)),ot.createElement(jt,{flexGrow:1,width:40,paddingLeft:2},ot.createElement(Ja,{color:o?h.primary:h.secondary},r))))):null))};import dm from"chalk";import{Box as gr,Text as ze}from"ink";import Ce from"react";var Za=({width:e,height:t})=>Ce.createElement(gr,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:h.secondary,rowGap:1},Ce.createElement(ze,{color:h.accent,bold:!0},"Initialize project"),Ce.createElement(ze,null,`This folder is not an ${dm.hex(h.accent)("epiq")} project yet.`),Ce.createElement(ze,{color:h.primary},"To start tracking issues here, we need to initialize a new",Ce.createElement(ze,{color:h.primary,backgroundColor:h.secondary}," .epiq/project.json "),"file in this repository."),Ce.createElement(gr,{marginTop:1,flexDirection:"column"},Ce.createElement(gr,null,Ce.createElement(ze,{color:h.accent}," "),Ce.createElement(ze,{color:h.primary},"Type "),Ce.createElement(ze,{backgroundColor:h.secondary}," :init "))),Ce.createElement(gr,{marginTop:1},Ce.createElement(ze,{color:h.secondary2},"This will create, commit and push "),Ce.createElement(ze,{color:h.primary,backgroundColor:h.secondary}," .epiq/project.json ")));import{Box as vr,Text as Le}from"ink";import ne from"react";var cm=({isDone:e,command:t,value:n})=>ne.createElement(vr,null,ne.createElement(Le,{color:h.accent,dimColor:e},e?" \u2714 ":" "),ne.createElement(Le,{dimColor:e},"Type "),ne.createElement(Le,{backgroundColor:h.secondary,dimColor:e}," "+t+" "),n!==void 0&&ne.createElement(ne.Fragment,null,ne.createElement(Le,{dimColor:e}," "),ne.createElement(Le,{color:h.secondary,dimColor:e},"<"+n+">"))),lm=e=>{if(typeof e=="string")return e;if(typeof e=="boolean")return e?"yes":"no"};function Oo({width:e,height:t}){let{isSetPreferredEditor:n,isSetUserName:r,userName:o,preferredEditor:i,autoSync:a,isSetAutoSync:l}=Qe(),u=[{key:"username",done:r,command:":config username",value:o,message:"First, choose your username."},{key:"editor",done:n,command:":config editor",value:i,message:"Nice. Now pick your editor."},{key:"autosync",done:l,command:":config autosync",value:a,message:"Almost there. Configure auto sync."}],m=u.findIndex(v=>!v.done),p=m===-1?void 0:u[m];return ne.createElement(vr,{height:t-4,flexDirection:"column",width:e,paddingTop:1,paddingLeft:2,borderStyle:"round",borderColor:h.secondary,rowGap:1},ne.createElement(Le,{color:h.accent,bold:!0},"Welcome! \u{1F539}"),ne.createElement(Le,null,"Let's get you started - it's a breeze."),ne.createElement(Le,{color:h.secondary2},"Remember - you can always search available commands by typing:",ne.createElement(Le,{color:h.accent}," ? ")),p&&ne.createElement(Le,{color:h.secondary2},p.message),ne.createElement(vr,{flexDirection:"column"},u.map((v,C)=>m===-1||C<=m?ne.createElement(vr,{key:v.key,marginBottom:1},ne.createElement(cm,{isDone:v.done,command:v.command,value:v.done?lm(v.value):void 0})):null)))}import ad from"chalk";import{Box as xr,Text as it}from"ink";import re from"react";import{Box as Bo,Text as um}from"ink";import Ht from"react";var mm=(e,t)=>e.length<=t?e:t<=1?"\u2026":e.slice(0,t-1)+"\u2026",ed=({width:e})=>{let{viewMode:t}=$(),{breadCrumb:n,currentNode:r,selectedIndex:o}=x(),i=U(r.id)[o],a=rt(i?.id??r.id,"TICKET"),l=ce(a)?a.value:void 0,u=l?.props.tags??[],m=l?.props.assignees??[],p=l?.parentNodeId?!So(r.id,l.parentNodeId)&&t==="dense":!1,v=n.map((N,I)=>{let P=I===n.length-1,R=U(N.id),w=P?R?.[o]?.title:void 0;return`${I?" / ":""}${N.title??""}${w?` \u25B8 ${w}`:""}`}).join(""),C=mm(v,e);return Ht.createElement(Bo,null,Ht.createElement(um,{color:h.secondary2},C),p?u.map(N=>Ht.createElement(Bo,{key:N,paddingLeft:2},Ht.createElement(Bt,{id:N}))):null,p?m.map(N=>Ht.createElement(Bo,{key:N,paddingLeft:2},Ht.createElement(Ot,{id:N}))):null)};import{Box as pm,Text as td}from"ink";import yr from"react";var fm=({filters:e})=>yr.createElement(pm,{columnGap:1},yr.createElement(td,{color:"red"},"APPLIED FILTERS:"),e.map(({value:t,target:n,operator:r})=>yr.createElement(td,{backgroundColor:"black",color:"white"},` ${n}${r}"${t}" `))),nd=yr.memo(fm);var rd="0.6.0";import Uo from"chalk";import{Box as gm,Text as od}from"ink";import $o,{useEffect as vm,useState as ym}from"react";var xm=["#4c567a","#9d7cd8","#7aa2f7","#7dcfff","#9d7cd8"],id=e=>{let t=e.replace("#","");return{r:parseInt(t.slice(0,2),16),g:parseInt(t.slice(2,4),16),b:parseInt(t.slice(4,6),16)}},hm=({r:e,g:t,b:n})=>{let r=o=>Math.round(Math.max(0,Math.min(255,o))).toString(16).padStart(2,"0");return`#${r(e)}${r(t)}${r(n)}`},Cm=(e,t,n)=>{let r=id(e),o=id(t);return hm({r:r.r+(o.r-r.r)*n,g:r.g+(o.g-r.g)*n,b:r.b+(o.b-r.b)*n})},Em=(e,t)=>{if(e.length===1)return e[0];let n=t*(e.length-1),r=Math.floor(n),o=n-r,i=e[r],a=e[Math.min(r+1,e.length-1)];return Cm(i,a,o)};function sd({syncStatus:e,autoSync:t}){let[n,r]=ym(0);vm(()=>{if(e.status!=="syncing"){r(0);return}let l=setInterval(()=>{r(u=>u+1)},50);return()=>clearInterval(l)},[e.status]);let o={synced:"ok",failed:"retry",syncing:"...",pending:"wait"},a={synced:h.secondary2,failed:h.yellow,pending:h.secondary2,syncing:Em(xm,(Math.sin(n*.12)+1)/2)??""}[e.status];return $o.createElement(gm,null,$o.createElement(od,null,Uo.hex(h.secondary2).dim(t?"AutoSync: ":"Sync: ")),$o.createElement(od,null,Uo.hex(a)("\u25CF")+Uo.hex(h.secondary2).dim(` ${o[e.status].padEnd(4)} `)))}function hr({filters:e,hideBreadCrumb:t=!1}){let{timeMode:n,eventLog:r,unappliedEvents:o,syncStatus:i}=Q(),{userName:a,preferredEditor:l,autoSync:u}=$(),m=56,p=process.stdout.columns-m-8,v=r.at(-1)?.id,C=$n(v??""),N=ce(C)?Ui(C.value):"INVALID DATE";return re.createElement(xr,{justifyContent:"space-between",flexDirection:"row","max-width":process.stdout.columns-40,overflow:"hidden"},t?re.createElement(it,null," "):re.createElement(xr,{paddingLeft:1},e.length>0?re.createElement(nd,{filters:e}):re.createElement(ed,{width:p})),n==="live"?re.createElement(xr,{columnGap:1,paddingRight:2,"max-width":m,overflow:"hidden",justifyContent:"flex-end"},re.createElement(sd,{autoSync:!!u,syncStatus:i}),re.createElement(dd,{icon:"@",value:a}),re.createElement(dd,{icon:"\u276F",value:l}),re.createElement(it,{dimColor:!0,color:h.secondary2},rd+" ")):"",n==="peek"?re.createElement(xr,{paddingLeft:1},re.createElement(it,{backgroundColor:h.yellow}," Readonly "),re.createElement(it,{color:h.yellow}," "+o.length+" edits ago at "),re.createElement(it,{backgroundColor:h.yellow,color:h.accent}," "+N+" "),re.createElement(it,{color:h.yellow},". Resume with "),re.createElement(it,{backgroundColor:h.yellow}," :peek now ")):"")}function dd({icon:e,value:t}){return re.createElement(it,null,ad.dim(e)+ad.hex(h.accent)(` ${t??"-"} `))}import{Box as Nm,Text as bm}from"ink";import hn from"react";import{Box as Cr,Text as Wo}from"ink";import st from"react";function _o(){let e=Q(),t=e.nodes[e.rootNodeId],o=process.stdout.rows-1-3,i=process.stdout.columns||120,a=t?.id?F(t?.id):[];return st.createElement(Cr,{flexDirection:"column",height:o,padding:1,borderStyle:"round",borderColor:h.secondary,width:i},st.createElement(Cr,{padding:1,paddingTop:0,paddingBottom:0},st.createElement(Wo,null,"Select a board:")),st.createElement(Cr,{padding:1,flexDirection:"column"},a.map((l,u)=>{let m=e.currentNode.context==="WORKSPACE"&&e.selectedIndex===u,v=F(l.id).flatMap(({id:C})=>U(C)).length;return st.createElement(Cr,{key:l.id??u},st.createElement(Wo,{color:m?h.accent:h.secondary2},st.createElement(ge,{isSelected:m})),st.createElement(Wo,{color:m?h.accent:h.secondary2},l.title," (",v," issues)",l.readonly?" \u{1F512}":""))})))}var Sm=({currentNode:e,selectedIndex:t,breadCrumb:n,mode:r,viewMode:o,height:i,width:a})=>{let{renderedChildrenIndex:l}=Q(),u=n.find(({context:C})=>C==="BOARD"),v=i-1-3;return hn.createElement(Nm,{flexDirection:"row"},e.context==="WORKSPACE"?hn.createElement(_o,null):u?hn.createElement(qn,{height:v,width:a,swimlanes:(l[u.id]??[]).filter(C=>C!==void 0&&St(C)),currentNode:e,selectedIndex:t,breadCrumb:n,viewMode:o,mode:r}):hn.createElement(bm,null))},cd=hn.memo(Sm);function jo({width:e,height:t}){let n=Q(),r=n.filters;if(n.mode===f.HELP)return q.createElement(at,{flexDirection:"column"},q.createElement(Qa,{width:e}));if(n.mode===f.PALETTE)return q.createElement(at,{flexDirection:"column"},q.createElement(Ha,{width:e,height:t}),q.createElement(xn,{width:e,mode:n.mode,availableHints:n.availableHints}));let{isSetupDone:o}=Qe(),i=!o,a=o&&!n.hasProjectDefinition;if(i)return q.createElement(at,{flexDirection:"column"},q.createElement(at,{flexDirection:"column"},q.createElement(hr,{hideBreadCrumb:!0,filters:r}),q.createElement(Oo,{height:t,width:e})),q.createElement(xn,{width:e,mode:n.mode,availableHints:n.availableHints}));if(a)return q.createElement(at,{flexDirection:"column"},q.createElement(at,{flexDirection:"column"},q.createElement(hr,{hideBreadCrumb:!0,filters:r}),q.createElement(Za,{height:t,width:e})),q.createElement(xn,{width:e,mode:n.mode,availableHints:n.availableHints}));let l=Te(n.breadCrumb??[],"BOARD");if(ce(l)){let u=l.value.id,m=F(u).length,p=3,v=Math.floor(e/p),C=Math.floor(e/Math.max(m,1));e=Math.min(C,v)*Math.max(m,p)}return q.createElement(at,{flexDirection:"column"},q.createElement(at,{flexDirection:"column"},q.createElement(hr,{filters:r}),q.createElement(cd,{width:e,height:t,currentNode:n.currentNode,selectedIndex:n.selectedIndex,breadCrumb:n.breadCrumb,viewMode:$().viewMode??"dense",mode:n.mode})),q.createElement(xn,{width:e,mode:n.mode,availableHints:n.availableHints}))}import Im from"readline";var Er,Nr,De,Rm=new Set([g.MoveCursorLeft,g.EraseInputWord,g.MoveCursorLeftOfWord,g.MoveCursorRight,g.MoveCursorRightOfWord,g.NavToPreviousContainer,g.NavToNextContainer,g.NavPreviousItem,g.NavNextItem,g.SetViewDense,g.SetViewWide,g.Confirm,g.Exit,g.InitCommandLine,g.InitCommandPalette,g.ExitCommandLine,g.CaptureInput,g.EraseInput,g.EraseInputWord,g.HideHelp,g.ViewHelp,g.SetViewDense,g.SetViewWide,g.GetLastCommandFromHistory,g.GetNextCommandFromHistory,g.AutoCompleteCommand]),ld=async e=>{if(e.ctrl&&e.name==="c")return O.exit();let{actionIndex:t,mode:n,readOnly:r}=x(),o=ss(e,n);if(!o||r&&!Rm.has(o))return;let i=t[n]?.[o];if(i?.action)try{await i.action(i,e)}catch(a){logger.error(a)}},Am=()=>async function(t,n){n.name!=="escape"&&(De&&(clearTimeout(De),De=void 0),await ld(n))},wm=()=>async function(t){if(t.length===1&&t[0]===27){De&&clearTimeout(De),De=setTimeout(()=>{ld({name:"escape",ctrl:!1,meta:!1,shift:!1,sequence:"\x1B"}),De=void 0},25);return}De&&(clearTimeout(De),De=void 0)};function ud(){Er&&process.stdin.removeListener("keypress",Er),Nr&&process.stdin.removeListener("data",Nr),Er=Am(),Nr=wm(),Im.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("data",Nr),process.stdin.on("keypress",Er)}Mm(`${br.bold("Epiq CLI")}
60
63
 
61
- ${ho.dim("Boot in directory:")}
62
- ${ho.cyan("$ epiq")}
64
+ ${br.dim("Boot in directory:")}
65
+ ${br.cyan("$ epiq")}
63
66
 
64
- `,{importMeta:import.meta,flags:{init:{type:"boolean",default:!1}}});var Ma=process.stdout.columns||120,Pa=process.stdout.rows||20,ir=null,mu=e=>{if(!ir){ir=cu(e);return}ir.rerender(e)},ka=()=>{mu(uu.createElement(xo,{width:Ma,height:Pa}))},pu=()=>{let e=be(process.cwd());return d(e)?{hasProject:!1,epiqRootDir:null,events:[]}:{hasProject:!0,epiqRootDir:e.value,events:[]}};async function fu(){let e=Ts();d(e)||pe(e.value);let t=pu();if(t.hasProject){await vi();let r=Mt(t.epiqRootDir);d(r)||(t.events=r.value)}let n=Hn({hasProject:t.hasProject,eventLog:t.events});d(n)&&logger.info(`Failed to boot state: ${n.message}`),S({hasProject:t.hasProject}),ka(),Ta()}process.stdout.on("resize",()=>{Ma=process.stdout.columns||120,Pa=process.stdout.rows||20,ir&&ka()});(async()=>(console.clear(),await fu()))();
67
+ `,{importMeta:import.meta,flags:{init:{type:"boolean",default:!1}}});var md=process.stdout.columns||120,pd=process.stdout.rows||20,Sr=null,km=e=>{try{return Sr?(Sr.rerender(e),c("Rerendered app",void 0)):(Sr=Tm(e),c("Rendered app",void 0))}catch(t){return s(`Unable to render app: ${wo(t)}`)}},fd=()=>km(Pm.createElement(jo,{width:md,height:pd}));async function Lm(){try{let e=Ts();ce(e)&&ye(e.value);let t=Xe(process.cwd()),n=[];if(ce(t)){let i=t.value,a=await _a(i);if(d(a))return _t(3,a.message);let l=$t(a.value.stateBranchRoot);if(d(l))return _t(3,l.message);n=l.value}let r=tr(n);if(d(r))return _t(4,r.message);b({hasProjectDefinition:ce(t),hasInitializingEvents:!!n.length});let o=fd();return d(o)?_t(6,o.message):(ud(),c("Booted Epiq",void 0))}catch(e){return _t(0,wo(e))}}process.stdout.on("resize",()=>{if(md=process.stdout.columns||120,pd=process.stdout.rows||20,!Sr)return;let e=fd();d(e)&&logger.info(`[boot:resize] ${e.message}`)});(async()=>{console.clear();let e=await Lm();d(e)&&(logger.info(e.message),console.error(br.red(`Failed to boot Epiq:
68
+ ${e.message}`)),process.exitCode=1)})();