epiq 0.6.3 → 0.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/index.js +45 -45
  2. package/dist/mcp.js +45 -45
  3. package/package.json +16 -16
package/dist/mcp.js CHANGED
@@ -1,62 +1,62 @@
1
1
  #!/usr/bin/env node
2
- import{McpServer as Kl}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as ql}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as L}from"zod";var Ue={None:"none",Success:"success",Fail:"fail"},s=e=>({status:Ue.Fail,message:e,value:null}),c=(e,t)=>({status:Ue.Success,message:e,value:t}),a=e=>e.status==="fail",Rt=e=>e.status==="success";import{ulid as oa}from"ulid";import ye from"node:fs";import at from"node:path";var C={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function Zn(e){return e.context===C.WORKSPACE}function O(e){return e.context===C.TICKET}function ro(e){return e.context===C.TEXT}function Be(e){return e.context===C.FIELD}function At(e){return e.context===C.FIELD_LIST}var Xt=e=>e.context===C.SWIMLANE,oo=e=>e.context===C.BOARD;import{ulid as xa}from"ulid";var lt=24n,va=lt*4n,Te=(1n<<va)-1n,ya=/^[0-9a-f]+$/;function io(e){return!e||!ya.test(e)?s(`Invalid hex rank: ${e}`):c("Converted rank to bigint",BigInt("0x"+e))}function xe(e,t=lt){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 oe(e,t){if(!e&&!t)return xe(Te/2n,lt);let n=e?io(e):c("Resolved lower bound",0n);if(a(n))return n;let r=t?io(t):c("Resolved upper bound",Te);if(a(r))return r;let o=n.value,i=r.value;if(i<=o)return xe(Te/2n,lt);let d=(o+i)/2n;return d===o||d===i?s("No rank space available between neighbors"):xe(d,lt)}function so(e){if(e<=0)return c("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=Te*BigInt(r+1)/(t+1n),i=xe(o,lt);if(a(i))return i;n.push(i.value)}return c("Resolved evenly spaced ranks",n)}var Qn=(e,t)=>{let n=j(e),r=so(n.length);if(a(r))return r;let o={};for(let i=0;i<n.length;i++){let d=n[i],l=r.value[i];if(!d||!l)return s("Unable to assign rebalance rank");o[d.id]=l}return c("Created rebalance event",{id:xa(),action:"rebalance.children",payload:{parent:e,ranks:o},...t})};import Lt from"node:fs";import Pe from"node:path";import sr from"node:fs";import Ta from"node:os";import Ne from"node:path";import wt from"node:fs";import{ulid as ha}from"ulid";import{z as Jt}from"zod";var Ea="_epiq/_evt",Na=Jt.object({projectId:Jt.string().min(1),stateBranch:Jt.string().min(1),createdAt:Jt.iso.datetime()}),ao=()=>({projectId:ha(),stateBranch:Ea,createdAt:new Date().toISOString()}),_e=e=>{let t=Qt(e);if(!wt.existsSync(t))return s("Missing .epiq/project.json");try{let n=wt.readFileSync(t,"utf8"),r=JSON.parse(n),o=Na.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")}},co=e=>{let t=_e(e);return a(t)?s(t.message):c("Read projectId",t.value.projectId)},lo=({repoRoot:e,fileContents:t})=>{let n=Zt(e),r=Qt(e);try{if(wt.mkdirSync(n,{recursive:!0}),wt.existsSync(r)){let o=_e(e);return a(o)?s(o.message):c("Project already initialized",null)}return wt.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 er=(e,t)=>{let n=new Map,r=t??((...i)=>JSON.stringify(i)),o=((...i)=>{let d=r(...i);if(!n.has(d)){let l=e(...i).then(u=>(a(u)&&n.delete(d),u));n.set(d,l)}return n.get(d)});return o.clear=()=>n.clear(),o};import Tt from"fs";import mo from"path";import Ia from"util";var uo=1e3,Sa=50,tr=0,po=()=>{let e=process.cwd(),t=ut(e);if(!a(t))return mo.join(t.value,Me,"log","epiq.log")};function Ca(){let e=po();if(!e||!Tt.existsSync(e))return;let n=Tt.readFileSync(e,"utf8").split(`
4
- `);if(n[n.length-1]===""&&n.pop(),n.length<=uo)return;let r=n.slice(-uo).join(`
2
+ import{McpServer as Yl}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as Xl}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as L}from"zod";var Ue={None:"none",Success:"success",Fail:"fail"},s=e=>({status:Ue.Fail,message:e,value:null}),c=(e,t)=>({status:Ue.Success,message:e,value:t}),a=e=>e.status==="fail",wt=e=>e.status==="success";import{ulid as aa}from"ulid";import ye from"node:fs";import ct from"node:path";var b={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function Qn(e){return e.context===b.WORKSPACE}function _(e){return e.context===b.TICKET}function io(e){return e.context===b.TEXT}function Be(e){return e.context===b.FIELD}function Tt(e){return e.context===b.FIELD_LIST}var Qt=e=>e.context===b.SWIMLANE,so=e=>e.context===b.BOARD;import{ulid as Na}from"ulid";var mt=24n,ha=mt*4n,Te=(1n<<ha)-1n,Ea=/^[0-9a-f]+$/;function ao(e){return!e||!Ea.test(e)?s(`Invalid hex rank: ${e}`):c("Converted rank to bigint",BigInt("0x"+e))}function xe(e,t=mt){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 oe(e,t){if(!e&&!t)return xe(Te/2n,mt);let n=e?ao(e):c("Resolved lower bound",0n);if(a(n))return n;let r=t?ao(t):c("Resolved upper bound",Te);if(a(r))return r;let o=n.value,i=r.value;if(i<=o)return xe(Te/2n,mt);let d=(o+i)/2n;return d===o||d===i?s("No rank space available between neighbors"):xe(d,mt)}function co(e){if(e<=0)return c("Resolved empty rank list",[]);let t=BigInt(e),n=[];for(let r=0;r<e;r++){let o=Te*BigInt(r+1)/(t+1n),i=xe(o,mt);if(a(i))return i;n.push(i.value)}return c("Resolved evenly spaced ranks",n)}var er=(e,t)=>{let n=j(e),r=co(n.length);if(a(r))return r;let o={};for(let i=0;i<n.length;i++){let d=n[i],l=r.value[i];if(!d||!l)return s("Unable to assign rebalance rank");o[d.id]=l}return c("Created rebalance event",{id:Na(),action:"rebalance.children",payload:{parent:e,ranks:o},...t})};import Ft from"node:fs";import Pe from"node:path";import ar from"node:fs";import ka from"node:os";import Ne from"node:path";import Mt from"node:fs";import{ulid as Ia}from"ulid";import{z as en}from"zod";var Sa="_epiq/_evt",Ca=en.object({projectId:en.string().min(1),stateBranch:en.string().min(1),createdAt:en.iso.datetime()}),lo=()=>({projectId:Ia(),stateBranch:Sa,createdAt:new Date().toISOString()}),_e=e=>{let t=nn(e);if(!Mt.existsSync(t))return s("Missing .epiq/project.json");try{let n=Mt.readFileSync(t,"utf8"),r=JSON.parse(n),o=Ca.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")}},uo=e=>{let t=_e(e);return a(t)?s(t.message):c("Read projectId",t.value.projectId)},mo=({repoRoot:e,fileContents:t})=>{let n=tn(e),r=nn(e);try{if(Mt.mkdirSync(n,{recursive:!0}),Mt.existsSync(r)){let o=_e(e);return a(o)?s(o.message):c("Project already initialized",null)}return Mt.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 tr=(e,t)=>{let n=new Map,r=t??((...i)=>JSON.stringify(i)),o=((...i)=>{let d=r(...i);if(!n.has(d)){let l=e(...i).then(u=>(a(u)&&n.delete(d),u));n.set(d,l)}return n.get(d)});return o.clear=()=>n.clear(),o};import Pt from"fs";import go from"path";import Ra from"util";var po=1e3,ba=50,nr=0,fo=()=>{let e=process.cwd(),t=rn(e);if(!a(t))return go.join(t.value,Me,"log","epiq.log")};function Aa(){let e=fo();if(!e||!Pt.existsSync(e))return;let n=Pt.readFileSync(e,"utf8").split(`
4
+ `);if(n[n.length-1]===""&&n.pop(),n.length<=po)return;let r=n.slice(-po).join(`
5
5
  `)+`
6
- `;Tt.writeFileSync(e,r,"utf8")}function nr(e,t,n=!1){let r=po();if(!r)return;let o=Ia.format(...t),i=new Date,l=`[${n?i.toISOString().slice(11,19):i.toISOString()}] ${e} ${o}
7
- `;Tt.mkdirSync(mo.dirname(r),{recursive:!0}),Tt.appendFileSync(r,l,"utf8"),tr++,tr>=Sa&&(tr=0,Ca())}var ne={info(...e){nr("[Info]",e,!1)},debug(...e){nr("[debug]",e,!0)},error(...e){let t=e.find(n=>n instanceof Error)instanceof Error?void 0:new Error().stack;nr("[Error]",[...e,t].filter(Boolean),!1)}};globalThis.logger=ne;import{spawn as ba}from"node:child_process";import en from"node:fs";import Mt from"node:path";var z={stage:({cwd:e,pathspec:t})=>D({args:["add",...t],cwd:e}),commit:({cwd:e,message:t,allowEmpty:n=!1})=>D({args:["commit",...n?["--allow-empty"]:[],"-m",t],cwd:e}),fetch:({cwd:e,remote:t,branch:n})=>D({args:["fetch",t,n],cwd:e}),pullRebase:({cwd:e,remote:t,branch:n})=>D({args:["pull","--rebase",t,n],cwd:e}),checkout:({cwd:e,branch:t})=>D({args:["checkout",t],cwd:e}),push:({cwd:e,remote:t,branch:n,setUpstream:r=!1})=>{let o=t&&n?["push",...r?["-u"]:[],t,n]:["push"];return D({args:o,cwd:e})},setUpstream:({cwd:e,branch:t,upstream:n})=>D({args:["branch","--set-upstream-to",n,t],cwd:e}),worktreeAdd:({cwd:e,worktreeRoot:t,branch:n})=>D({args:["worktree","add",t,n],cwd:e}),worktreeRemove:({cwd:e,worktreeRoot:t})=>D({args:["worktree","remove","--force",t],cwd:e}),worktreePrune:({cwd:e})=>D({args:["worktree","prune"],cwd:e})};var Ge=e=>{let t=$e(e);if(a(t))return s("Unable to resolve epiq project root");let n=_e(t.value);return a(n)?s("Unable to read project.json"):c("Resolved state branch",n.value.stateBranch)},ie="origin";var go=1e4,Ra={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo"},vo=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!en.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=ba("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:Ra}),i=!1,d="",l="",u=p=>{i||(i=!0,clearTimeout(m),r(p))},m=setTimeout(()=>{o.kill("SIGTERM");let p=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${go}ms`].join(`
8
- `);u(n?{stdout:d,stderr:p,exitCode:124}:s(p))},go);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",p=>{d+=p}),o.stderr.on("data",p=>{l+=p}),o.on("error",p=>{if(n){u({stdout:d,stderr:p.message,exitCode:1});return}u(s([`git ${e.join(" ")}`,`cwd=${t}`,p.message].join(`
9
- `)))}),o.on("close",p=>{let y=p??1;if(n){u({stdout:d,stderr:l,exitCode:y});return}if(y!==0){u(s([`git ${e.join(" ")}`,l.trim()||d.trim()||"Git command failed"].filter(Boolean).join(`
10
- `)));return}u(c("Git command succeeded",{stdout:d,stderr:l,exitCode:y}))})}),D=({args:e,cwd:t})=>vo({args:e,cwd:t,allowFail:!1}),me=({args:e,cwd:t})=>vo({args:e,cwd:t,allowFail:!0}),mt=async({cwd:e,message:t})=>{let n=await z.commit({cwd:e,message:t});if(a(n))return s(`Failed to create commit
11
- ${n.message}`);let r=await D({args:["rev-parse","HEAD"],cwd:e});return a(r)?s(`Commit created, but failed to read HEAD SHA
12
- ${r.message}`):c("Created commit and resolved SHA",r.value.stdout.trim())},Aa=async e=>{let t=await D({cwd:e,args:["rev-parse","--git-dir"]});if(a(t))return s(t.message);let n=t.value.stdout.trim();return c("Resolved git dir",Mt.isAbsolute(n)?n:Mt.resolve(e,n))},wa=async e=>{let t=await Aa(e);if(a(t))return s(t.message);let n=t.value,r={MERGE_HEAD:"merge in progress",REBASE_HEAD:"rebase in progress",CHERRY_PICK_HEAD:"cherry-pick in progress",REVERT_HEAD:"revert in progress",BISECT_LOG:"bisect in progress"};for(let[u,m]of Object.entries(r))if(en.existsSync(Mt.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(en.existsSync(Mt.join(n,u)))return c("Checked for in-progress Git operation",m);let i=await D({cwd:e,args:["status","--porcelain=v1","--branch"]});if(a(i))return s(i.message);let d=i.value.stdout.toLowerCase(),l=["rebase in progress","merge in progress","cherry-pick in progress","revert in progress","bisect in progress"].find(u=>d.includes(u));return c("Checked for in-progress Git operation",l??null)},tn=async e=>{let t=await wa(e);return a(t)?s(t.message):c("Checked for in-progress Git operation",t.value!==null)},rr=async({repoRoot:e})=>{let n=(await me({args:["remote","get-url",ie],cwd:e})).exitCode===0;return c(`Checked remote ${n}`,n)},Pt=async({repoRoot:e,branch:t})=>{let n=await me({args:["ls-remote","--heads",ie,t],cwd:e});return n.exitCode!==0?s(n.stderr.trim()||`Unable to inspect remote branch ${ie}/${t}`):c("Checked remote branch",n.stdout.trim().length>0)},nn=async({repoRoot:e,branch:t})=>{let n=await me({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}`)},fo=e=>{try{return en.realpathSync.native(e)}catch{return Mt.resolve(e)}},yo=async({repoRoot:e,worktreeRoot:t})=>{let n=await D({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return s(n.message);let r=fo(t),o=n.value.stdout.split(`
13
- `).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(fo).includes(r);return c("Checked worktree registration",o)},or=async e=>{let t=await me({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 D({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return a(t)?s(t.message):c("Resolved current branch",t.value.stdout.trim())},xo=async e=>{let t=await D({args:["rev-parse","--short","HEAD"],cwd:e});return a(t)?s(t.message):c("Resolved short HEAD sha",t.value.stdout.trim())},ho=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),Eo=async e=>(await me({cwd:e,args:["rebase","--abort"]})).exitCode===0?c("Aborted stale rebase",!0):c("No rebase to abort",!1),No=async({cwd:e,branch:t})=>{let n=await Pt({repoRoot:e,branch:t});if(a(n))return s(n.message);if(!n.value)return c("Remote branch missing, skipped reset",!1);let r=await z.fetch({cwd:e,remote:ie,branch:t});if(a(r))return s(`Failed to fetch ${t}
14
- ${r.message}`);let o=await Eo(e);if(a(o))return s(o.message);let i=await D({cwd:e,args:["reset","--hard",`${ie}/${t}`]});return a(i)?s(`Failed to reset ${t} from remote
15
- ${i.message}`):c("Reset branch from remote",!0)},ir=async({cwd:e,branch:t})=>{let n=await Pt({repoRoot:e,branch:t});if(a(n))return s(n.message);if(!n.value)return c("Remote branch missing, skipped pull",!1);let r=await Eo(e);if(a(r))return s(r.message);let o=await z.fetch({cwd:e,remote:ie,branch:t});if(a(o))return s(`Failed to fetch ${t}
6
+ `;Pt.writeFileSync(e,r,"utf8")}function rr(e,t,n=!1){let r=fo();if(!r)return;let o=Ra.format(...t),i=new Date,l=`[${n?i.toISOString().slice(11,19):i.toISOString()}] ${e} ${o}
7
+ `;Pt.mkdirSync(go.dirname(r),{recursive:!0}),Pt.appendFileSync(r,l,"utf8"),nr++,nr>=ba&&(nr=0,Aa())}var ne={info(...e){rr("[Info]",e,!1)},debug(...e){rr("[debug]",e,!0)},error(...e){let t=e.find(n=>n instanceof Error)instanceof Error?void 0:new Error().stack;rr("[Error]",[...e,t].filter(Boolean),!1)}};globalThis.logger=ne;import{spawn as wa}from"node:child_process";import on from"node:fs";import kt from"node:path";var z={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 Xe=e=>{let t=$e(e);if(a(t))return s("Unable to resolve epiq project root");let n=_e(t.value);return a(n)?s("Unable to read project.json"):c("Resolved state branch",n.value.stateBranch)},ie="origin";var vo=1e4,Ta={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo"},xo=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!on.existsSync(t)){let g=`Git cwd does not exist: ${t}`;if(n){r({stdout:"",stderr:g,exitCode:1});return}r(s(g));return}let o=wa("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:Ta}),i=!1,d="",l="",u=g=>{i||(i=!0,clearTimeout(m),r(g))},m=setTimeout(()=>{o.kill("SIGTERM");let g=[`git ${e.join(" ")}`,`cwd=${t}`,`Git command timed out after ${vo}ms`].join(`
8
+ `);u(n?{stdout:d,stderr:g,exitCode:124}:s(g))},vo);o.stdout.setEncoding("utf8"),o.stderr.setEncoding("utf8"),o.stdout.on("data",g=>{d+=g}),o.stderr.on("data",g=>{l+=g}),o.on("error",g=>{if(n){u({stdout:d,stderr:g.message,exitCode:1});return}u(s([`git ${e.join(" ")}`,`cwd=${t}`,g.message].join(`
9
+ `)))}),o.on("close",g=>{let y=g??1;if(n){u({stdout:d,stderr:l,exitCode:y});return}if(y!==0){u(s([`git ${e.join(" ")}`,l.trim()||d.trim()||"Git command failed"].filter(Boolean).join(`
10
+ `)));return}u(c("Git command succeeded",{stdout:d,stderr:l,exitCode:y}))})}),F=({args:e,cwd:t})=>xo({args:e,cwd:t,allowFail:!1}),me=({args:e,cwd:t})=>xo({args:e,cwd:t,allowFail:!0}),pt=async({cwd:e,message:t})=>{let n=await z.commit({cwd:e,message:t});if(a(n))return s(`Failed to create commit
11
+ ${n.message}`);let r=await F({args:["rev-parse","HEAD"],cwd:e});return a(r)?s(`Commit created, but failed to read HEAD SHA
12
+ ${r.message}`):c("Created commit and resolved SHA",r.value.stdout.trim())},Ma=async e=>{let t=await F({cwd:e,args:["rev-parse","--git-dir"]});if(a(t))return s(t.message);let n=t.value.stdout.trim();return c("Resolved git dir",kt.isAbsolute(n)?n:kt.resolve(e,n))},Pa=async e=>{let t=await Ma(e);if(a(t))return s(t.message);let n=t.value,r={MERGE_HEAD:"merge in progress",REBASE_HEAD:"rebase in progress",CHERRY_PICK_HEAD:"cherry-pick in progress",REVERT_HEAD:"revert in progress",BISECT_LOG:"bisect in progress"};for(let[u,m]of Object.entries(r))if(on.existsSync(kt.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(on.existsSync(kt.join(n,u)))return c("Checked for in-progress Git operation",m);let i=await F({cwd:e,args:["status","--porcelain=v1","--branch"]});if(a(i))return s(i.message);let d=i.value.stdout.toLowerCase(),l=["rebase in progress","merge in progress","cherry-pick in progress","revert in progress","bisect in progress"].find(u=>d.includes(u));return c("Checked for in-progress Git operation",l??null)},sn=async e=>{let t=await Pa(e);return a(t)?s(t.message):c("Checked for in-progress Git operation",t.value!==null)},or=async({repoRoot:e})=>{let n=(await me({args:["remote","get-url",ie],cwd:e})).exitCode===0;return c(`Checked remote ${n}`,n)},Lt=async({repoRoot:e,branch:t})=>{let n=await me({args:["ls-remote","--heads",ie,t],cwd:e});return n.exitCode!==0?s(n.stderr.trim()||`Unable to inspect remote branch ${ie}/${t}`):c("Checked remote branch",n.stdout.trim().length>0)},an=async({repoRoot:e,branch:t})=>{let n=await me({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}`)},yo=e=>{try{return on.realpathSync.native(e)}catch{return kt.resolve(e)}},ho=async({repoRoot:e,worktreeRoot:t})=>{let n=await F({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return s(n.message);let r=yo(t),o=n.value.stdout.split(`
13
+ `).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(yo).includes(r);return c("Checked worktree registration",o)},ir=async e=>{let t=await me({args:["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],cwd:e});return c("Checked upstream",t.exitCode===0&&t.stdout.trim().length>0)},dn=async e=>{let t=await F({args:["rev-parse","--abbrev-ref","HEAD"],cwd:e});return a(t)?s(t.message):c("Resolved current branch",t.value.stdout.trim())},Eo=async e=>{let t=await F({args:["rev-parse","--short","HEAD"],cwd:e});return a(t)?s(t.message):c("Resolved short HEAD sha",t.value.stdout.trim())},No=e=>e.includes("fetch first")||e.includes("non-fast-forward")||e.includes("failed to push some refs"),Io=async e=>(await me({cwd:e,args:["rebase","--abort"]})).exitCode===0?c("Aborted stale rebase",!0):c("No rebase to abort",!1),So=async({cwd:e,branch:t})=>{let n=await Lt({repoRoot:e,branch:t});if(a(n))return s(n.message);if(!n.value)return c("Remote branch missing, skipped reset",!1);let r=await z.fetch({cwd:e,remote:ie,branch:t});if(a(r))return s(`Failed to fetch ${t}
14
+ ${r.message}`);let o=await Io(e);if(a(o))return s(o.message);let i=await F({cwd:e,args:["reset","--hard",`${ie}/${t}`]});return a(i)?s(`Failed to reset ${t} from remote
15
+ ${i.message}`):c("Reset branch from remote",!0)},sr=async({cwd:e,branch:t})=>{let n=await Lt({repoRoot:e,branch:t});if(a(n))return s(n.message);if(!n.value)return c("Remote branch missing, skipped pull",!1);let r=await Io(e);if(a(r))return s(r.message);let o=await z.fetch({cwd:e,remote:ie,branch:t});if(a(o))return s(`Failed to fetch ${t}
16
16
  ${o.message}`);let i=await z.pullRebase({cwd:e,remote:ie,branch:t});return a(i)?s(`Failed during pull --rebase
17
- ${i.message}`):c("Pulled with rebase",!0)},Io=async e=>{let t=await me({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 So=async e=>{let t=await rn(e);return a(t)?s(t.message):c("Checked detached HEAD state",t.value==="HEAD")};var bo="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Ye=e=>Ne.join(Me,dn,e),Ro=()=>Ne.join(Ta.homedir(),pe),on=()=>Ne.join(Ro(),"worktrees"),sn=({repoRoot:e})=>{let t=co(e);return a(t)?s(t.message):c("Resolved state branch root",Ne.join(on(),t.value))},Ma=e=>Ne.join(e,Me),Co=e=>Ne.join(Ma(e),dn);var kt=e=>{try{return sr.mkdirSync(e,{recursive:!0}),c("Ensured directory",void 0)}catch(t){return s(t instanceof Error?t.message:String(t))}},an=()=>{let e=kt(Ro());if(a(e))return s(`Ensure epiq home failed.
18
- `+e.message);let t=kt(on());return a(t)?s(`Ensure worktrees dir failed.
19
- `+t.message):c("Ensured epiq storage",!0)},Ao=e=>{sr.existsSync(e)&&(ne.debug("[sync] remove path",e),sr.rmSync(e,{recursive:!0,force:!0}))};var wo=(e,t)=>{for(let n of[Co(e),Co(t)]){let r=kt(n);if(a(r))return s(r.message)}return c("Ensured state branch",void 0)},To=async e=>{let t=await D({args:["ls-tree","--name-only","HEAD"],cwd:e});if(a(t))return s(`ensure state branch is storage only failed
17
+ ${i.message}`):c("Pulled with rebase",!0)},Co=async e=>{let t=await me({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 Ro=async e=>{let t=await dn(e);return a(t)?s(t.message):c("Checked detached HEAD state",t.value==="HEAD")};var Ao="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Je=e=>Ne.join(Me,un,e),wo=()=>Ne.join(ka.homedir(),pe),cn=()=>Ne.join(wo(),"worktrees"),gt=({repoRoot:e})=>{let t=uo(e);return a(t)?s(t.message):c("Resolved state branch root",Ne.join(cn(),t.value))},La=e=>Ne.join(e,Me),bo=e=>Ne.join(La(e),un);var Dt=e=>{try{return ar.mkdirSync(e,{recursive:!0}),c("Ensured directory",void 0)}catch(t){return s(t instanceof Error?t.message:String(t))}},ln=()=>{let e=Dt(wo());if(a(e))return s(`Ensure epiq home failed.
18
+ `+e.message);let t=Dt(cn());return a(t)?s(`Ensure worktrees dir failed.
19
+ `+t.message):c("Ensured epiq storage",!0)},To=e=>{ar.existsSync(e)&&(ne.debug("[sync] remove path",e),ar.rmSync(e,{recursive:!0,force:!0}))};var Mo=(e,t)=>{for(let n of[bo(e),bo(t)]){let r=Dt(n);if(a(r))return s(r.message)}return c("Ensured state branch",void 0)},Po=async e=>{let t=await F({args:["ls-tree","--name-only","HEAD"],cwd:e});if(a(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(d=>d!==Me);if(r.length===0)return c("State branch is storage-only",!1);let o=await D({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(a(o))return s(`Failed to clean storage branch
22
- ${o.message}`);let i=await mt({cwd:e,message:"[epiq:repair-storage-branch]"});return a(i)?s(i.message):c("Cleaned storage branch",!0)},pt=er(async(e=process.cwd())=>{let t=await D({args:["rev-parse","--show-toplevel"],cwd:e});return a(t)?s("Not inside a Git repository"):c("Resolved repo root",t.value.stdout.trim())},e=>Ne.resolve(e)),Gu=er(async e=>{let t=await D({args:["rev-parse","--git-dir"],cwd:e});if(a(t))return s(t.message);let n=t.value.stdout.trim(),r=Ne.isAbsolute(n)?n:Ne.join(e,n);return c("Resolved git dir",r)},e=>Ne.resolve(e));var tm=process.env.IS_LOCAL==="true",Me=".epiq",pe=".epiq-global",dn="events",Pa="project.json",Zt=e=>Pe.join(e,Me),Qt=e=>Pe.join(Zt(e),Pa),Dt=e=>Pe.join(Zt(e),dn),Mo=e=>Pe.join(e,Me),ka=e=>{let t=Pe.join(e,Me);return Lt.existsSync(t)&&Lt.statSync(t).isDirectory()},ar=e=>{let t=Qt(e);return Lt.existsSync(t)&&Lt.statSync(t).isFile()},ut=e=>{let t=Pe.resolve(e);for(;;){if(ka(t))return c("Resolved closest .epiq root",t);let n=Pe.dirname(t);if(n===t)return s("No .epiq directory found in any parent");t=n}},$e=e=>{let t=Pe.resolve(e);for(;;){if(ar(t))return c("Resolved closest epiq project root",t);let n=Pe.dirname(t);if(n===t)return s("No .epiq/project.json found in any parent");t=n}},Po=e=>{let t=Dt(e);try{return Lt.mkdirSync(t,{recursive:!0}),c("Resolved events dir",t)}catch(n){return s(n instanceof Error?`Failed to ensure events dir: ${n.message}`:"Failed to ensure events dir")}},he=async()=>{let e=await pt(process.cwd());if(a(e))return e;let t=sn({repoRoot:e.value});return a(t)?t:c("Resolved persist root",t.value)};var G={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History"};import{useSyncExternalStore as al}from"react";var g={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette"};function cn(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var ln=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",un=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},Lo=(e,t)=>t?e.get(t)??[]:[];var Do=new WeakMap,La=e=>{let t=Do.get(e);return t||(t=ko(e),Do.set(e,t)),t};var Fo=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return Lo(La(e),r).filter(i=>cn(r,i)>=n)};var Da={hint:"",hints:[],overlap:0,remainder:""},Oo=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return Da;let o=Fo({wordList:r,inputToMatch:e,overlapThreshold:1});return Fa(t,o)},Fa=(e,t)=>{let n=t[0]??"",r=cn(e.toLowerCase(),n.toLowerCase()),[o,i]=n.split(":"),d=r<(o??"").length,l=!!i,p=(l&&d?o:n)+(l&&d?":":" "),y=p.slice(r);return{hint:p,hints:t,overlap:r,remainder:y}};var mn={autoSyncIntervalMs:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},K=()=>mn,We=e=>(mn={...mn,...e},mn);var gt=3e3,Uo=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<gt?null:t},Bo=0,dr,cr=!1,Ft=!1,lr=()=>{if(cr)return!0;let e=Ie();return a(e)?!1:e.value.syncStatus.status==="syncing"},Oa=()=>{let e=K().autoSyncIntervalMs??1e4,t=Date.now()-Bo;return Math.max(0,e-t)},_o=()=>{dr||(dr=setTimeout(async()=>{if(dr=void 0,!!ft()){if(lr()){Ft=!0;return}Ft=!1,await Ua()}},Oa()))},Ua=async()=>{if(!ft())return s("Cannot auto-sync before state is initialized");if(lr())return Ft=!0,s("Sync already in progress");cr=!0,Bo=Date.now(),E({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await je()}finally{cr=!1,Ft&&_o()}},$o=()=>{ft()&&(Ft=!0,!lr()&&_o())};var pn=()=>{let e=K(),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}},Wo=()=>{let e=$e(process.cwd());if(a(e))return!1;let t=_e(e.value);return Rt(t)},jo=e=>e===!0?"yes":e===!1?"no":null,Ho=e=>e==="yes"?!0:e==="no"?!1:null;var Q={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#2a2f45",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},R={accent:Q.cyan,accent2:Q.magenta,primary:Q.white,secondary:Q.grayDark,secondary2:Q.grayLight,gray:Q.gray,green:Q.green,yellow:Q.yellow,red:Q.red};var x={red:Q.red,yellow:Q.yellow,green:Q.green,blue:Q.blue,magenta:Q.magenta,cyan:Q.cyan},Xe={urgent:x.red,critical:x.red,important:x.red,blocker:x.red,asap:x.red,immediate:x.red,fail:x.red,failure:x.red,broken:x.red,bug:x.red,error:x.red,incident:x.red,outage:x.red,production:x.red,crash:x.red,security:x.red,warning:x.yellow,warn:x.yellow,risky:x.yellow,risk:x.yellow,attention:x.yellow,pending:x.yellow,review:x.yellow,"needs-review":x.yellow,qa:x.yellow,testing:x.yellow,test:x.yellow,validate:x.yellow,verification:x.yellow,staging:x.yellow,check:x.yellow,"follow-up":x.yellow,followup:x.yellow,waiting:x.yellow,blocked:x.yellow,hold:x.yellow,done:x.green,complete:x.green,completed:x.green,success:x.green,ok:x.green,stable:x.green,resolved:x.green,fixed:x.green,closed:x.green,merged:x.green,released:x.green,deployed:x.green,approved:x.green,verified:x.green,working:x.green,healthy:x.green,pass:x.green,passing:x.green,info:x.blue,information:x.blue,note:x.blue,docs:x.blue,documentation:x.blue,doc:x.blue,guide:x.blue,help:x.blue,explanation:x.blue,detail:x.blue,details:x.blue,context:x.blue,design:x.blue,discussion:x.blue,proposal:x.blue,idea:x.blue,feature:x.magenta,enhancement:x.magenta,improvement:x.magenta,refactor:x.magenta,refactoring:x.magenta,cleanup:x.magenta,optimize:x.magenta,optimization:x.magenta,perf:x.magenta,performance:x.magenta,upgrade:x.magenta,migration:x.magenta,modernize:x.magenta,debt:x.magenta,todo:x.cyan,next:x.cyan,planned:x.cyan,plan:x.cyan,future:x.cyan,backlog:x.cyan,investigate:x.cyan,explore:x.cyan,prototype:x.cyan};var Ba=e=>e.props.tags??[],_a=e=>e.props.assignees??[],ur=e=>Ba(e).map(t=>N.getTag(t)).filter(t=>!!t),mr=e=>_a(e).map(t=>N.getContributor(t)).filter(t=>!!t),gn=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!O(n)?s("Invalid untag target"):c("Retrieved tags from ticket in breadcrumb",ur(n))},fn=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!O(n)?s("Invalid unassign target"):c("Retrieved assignees from ticket in breadcrumb",mr(n))};var f={PALETTE:"?",EXIT:"exit",INIT:"init",HELP:"help",NEW:"new",TAG:"tag",UNTAG:"untag",MOVE:"move",PEEK:"peek",FILTER:"filter",ASSIGN:"assign",UNASSIGN:"unassign",DELETE:"delete",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",CONFIG:"config",EDIT:"edit",SYNC:"sync",EXPORT:"export",NONE:""};var $a=/^(\d+)(h|d|w|mo|y)$/,Wa=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,ja=({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},Ha=(e,t=new Date)=>{let n=e.match($a);if(!n)return null;let[,r,o]=n,i=Number(r);if(!Number.isInteger(i)||i<=0)return null;let d=new Date(t);switch(o){case"h":return d.setHours(d.getHours()-i),d;case"d":return d.setDate(d.getDate()-i),d;case"w":return d.setDate(d.getDate()-i*7),d;case"mo":return d.setMonth(d.getMonth()-i),d;case"y":return d.setFullYear(d.getFullYear()-i),d;default:return null}},za=e=>{let t=e.match(Wa);if(!t)return null;let[,n,r,o,i,d]=t,l=Number(n),u=Number(r),m=Number(o),p=i?Number(i):0,y=d?Number(d):0;return ja({year:l,month:u,day:m,hour:p,minute:y})?new Date(l,u-1,m,p,y):null},vn=e=>{let t=e.trim().toLowerCase();return Ha(t)??za(t)},zo=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Ka=[{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}],Ko=(e=Ka)=>{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 qa=["BOARD","TICKET","SWIMLANE"],J={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs"},He={TITLE:"title",DESCRIPTION:"description"},Va=[J.EDITOR,J.VIEW,J.USERNAME,J.AUTOSYNC,J.SYNC_DEBOUNCE_MS],Ga=[He.TITLE,He.DESCRIPTION],gr=[String(gt),"5000","15000","30000","60000"],Je=[f.EXIT,f.SYNC,f.HELP,f.EXPORT,f.CONFIG],yn=[f.NEW,f.EDIT,f.DELETE,f.MOVE],pr=[f.TAG,f.UNTAG,f.ASSIGN,f.UNASSIGN,f.CLOSE_ISSUE,f.RE_OPEN_ISSUE,f.EDIT],qo=[f.FILTER,f.PEEK],Ya={WORKSPACE:[...Je,...yn],BOARD:[...qo,...Je,...yn],SWIMLANE:[...qo,...Je,...yn],TICKET:[...Je,...yn,...pr],FIELD:[...Je,...pr],FIELD_LIST:[...Je,...pr],TEXT:[...Je]},Xa=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],Ja=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:r}=pn();if(!r)return[f.HELP,f.CONFIG];if(!Wo())return[f.HELP,f.INIT];if(t)return[f.HELP,f.PEEK,f.EXPORT,f.CONFIG];let o=e?.context,i=o&&qa.includes(o);return[...new Set([...n,e].map(l=>l?.context).flatMap(l=>l?Ya[l]:[]))].filter(l=>l===f.MOVE?!1:l===f.EDIT||l===f.DELETE?i:!0)},ee=(e,{contextNode:t,selectedNode:n,readOnly:r,breadCrumb:o}=v())=>{let i=t.context??"WORKSPACE";return{[f.NONE]:Ja({breadCrumb:o,readOnly:r,selectedNode:n}),[f.EXIT]:["confirm"],[f.EXPORT]:[],[f.SYNC]:[],[f.INIT]:[],[f.HELP]:[],[f.PEEK]:[...Ko(),"now","prev","next"],[f.EDIT]:[...Ga],[f.DELETE]:["confirm"],[f.RE_OPEN_ISSUE]:["confirm"],[f.CLOSE_ISSUE]:["confirm"],[f.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[f.FILTER]:["tag","assignee","description","title","clear"],[f.TAG]:[...new Set([...Object.keys(Xe),...N.getExistingTags()])],[f.UNTAG]:[...gn()?.value?.map(({name:l})=>l)??[]],[f.UNASSIGN]:[...fn()?.value?.map(({name:l})=>l)??[]],[f.ASSIGN]:N.getExistingAssignees(),[f.NEW]:Xa(i),[f.CONFIG]:[...Va]}[e]??[]};import ii from"chalk";var Vo=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import{decodeTime as Go}from"ulid";var Yo=e=>{let t=Date.now()-e,n=[{label:"y",ms:1e3*60*60*24*365},{label:"mo",ms:1e3*60*60*24*30},{label:"w",ms:1e3*60*60*24*7},{label:"d",ms:1e3*60*60*24},{label:"h",ms:1e3*60*60},{label:"m",ms:1e3*60},{label:"s",ms:1e3}];for(let{label:r,ms:o}of n){let i=Math.floor(t/o);if(i>=1)return`${i}${r} ago`}return"just now"};var Xo=e=>{try{return c("Decoded date",new Date(Go(e)))}catch(t){return s("Decoding failed + "+t.message)}},fr=e=>{if(!e?.id)return null;try{return Go(e.id)}catch{return null}};var Se=(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 Jo from"chalk";var Za=[0,0,0],xr=.2,yr={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Zo=(e,t,n)=>Math.max(t,Math.min(n,e)),vr=(e,t,n)=>e+(t-e)*n,Qo=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},Qa=e=>e.toLowerCase().trim(),ed=(e,t,n)=>{let r=t/100,o=n/100,i=(1-Math.abs(2*o-1))*r,d=e/60,l=i*(1-Math.abs(d%2-1)),u=0,m=0,p=0;d>=0&&d<1?(u=i,m=l):d>=1&&d<2?(u=l,m=i):d>=2&&d<3?(m=i,p=l):d>=3&&d<4?(m=l,p=i):d>=4&&d<5?(u=l,p=i):(u=i,p=l);let y=o-i/2;return[Math.round((u+y)*255),Math.round((m+y)*255),Math.round((p+y)*255)]},ei=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,td=e=>{let t=e.replace("#","");return[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]},ti=(e,t,n)=>{let r=Zo(n,0,1);return[Math.round(vr(e[0],t[0],r)),Math.round(vr(e[1],t[1],r)),Math.round(vr(e[2],t[2],r))]},nd=(e,t=xr)=>ti(e,Za,t),rd=(e,t=xr)=>ei(nd(td(e),t)),od=(e,t,n)=>ti(e,t,n),Ot=e=>{let n=Qo(e)%360,r=ed(n,yr.stringColor.saturation,yr.stringColor.lightness);return ei(r)},Ce=(e,t=Xe)=>{let n=Qa(e);return n&&t[n]?t[n]:Ot(n)},ni=(e,t=Xe,n=xr)=>rd(Ce(e,t),n),id=e=>{let t=yr.gradient.stops,n=Zo(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let r=t.length-1,o=n*r,i=Math.min(Math.floor(o),r-1),d=o-i;return od(t[i],t[i+1],d)},xn=e=>Qo(e.toLowerCase().trim())/4294967295,sd=e=>{let t=xn(e);return id(t)},ad=e=>{let[t,n,r]=sd(e);return{normal:o=>Jo.bgRgb(t,n,r).black(o),cursor:o=>Jo.bgRgb(t,n,r).white.bold(o)}};var hn=e=>ad(e).normal(` ${e} `);import ri from"chalk";var Y=e=>ri.dim(e),se=e=>ri.hex(R.primary)(e),ae=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:i=1})=>{let d=o.trim();if(d.length<i)return"";let p=[...t.filter(Boolean).filter(y=>y.startsWith(d))].sort((y,h)=>xn(y)-xn(h)).slice(0,r).map(y=>hn(y)).join(" ");return p?`${Y(e)}${p}${Y(n)}`:""};var Ze={None:"none",Invalid:"invalid",Valid:"valid"};var dd=["BOARD","TICKET","SWIMLANE"],oi=()=>{let e=v().selectedNode;return e?.context?dd.includes(e.context)?H():F({message:Y("Command not available in this context")}):F({message:Y("Missing target context")})},X="<ENTER> to confirm",H=(e="",t=[])=>({message:Y(e),validity:Ze.Valid,completionWordList:t}),F=({message:e,completionWordList:t=[]})=>({validity:Ze.Invalid,message:e,completionWordList:t}),Nn=e=>e.length===0,En=e=>` ${ii.dim.bgHex(ni(e))(` ${e} `)} `,hr=({modifier:e})=>{let t="confirm";return e===t?H(X):F({message:Nn(e)?Y("if you are certain, enter ")+hn(t):"",completionWordList:[t]})},cd=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?F({message:Y(n)}):H():F({message:Nn(r)?t:"",completionWordList:[...e]}),Ut=({hint:e})=>({modifier:t,inputString:n})=>Nn(t)&&Nn(n)?F({message:e,completionWordList:[]}):H(X),ld=({modifier:e,inputString:t})=>{let n=ee(f.CONFIG);if(!n.includes(e))return F({message:ae({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case J.EDITOR:{let r=[...Vo];return t.trim()?r.includes(t.trim())?H(X):F({message:ae({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):F({message:ae({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case J.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?H(X):F({message:ae({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case J.USERNAME:return t.trim()?H(X):F({message:se("Enter a user name. Saved in ")+ii.bgBlack("~/.epiq-global/config.json")});case J.AUTOSYNC:{let r=["yes","no"],o=K().autoSync;if(!r.includes(t.trim())){let i=jo(o);return F({message:ae({prefix:`should auto-sync (recommended)${i!==null?", currently: "+i:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return H(X)}case J.SYNC_DEBOUNCE_MS:{let r=K().autoSyncIntervalMs,o=Uo(t);if(!t.trim()||o===null||o<gt){let i=ae({prefix:" examples: ",wordList:gr,minLengthForHints:0,inputString:t});return F({message:se(`provide duration above ${gt}ms. current duration: ${r}ms.`)+i,completionWordList:gr})}return H(X)}default:return F({message:se("Unknown config option"),completionWordList:n})}},ud=({modifier:e})=>{let t=ee(f.EDIT);if(!t.includes(e)){let i=ae({prefix:"edit... ",wordList:t,inputString:e,minLengthForHints:0});return F({message:i||se("Unknown edit option"),completionWordList:t})}let{breadCrumb:n,selectedNode:r}=v();if(!Se([...n,r],"TICKET"))return F({message:se("Command not available in this context")});switch(e){case He.TITLE:return H(X);case He.DESCRIPTION:let{preferredEditor:i}=K();return i?H(Y("<ENTER> to edit in ")+i):F({message:"No editor selected"});default:return F({message:se("Unknown edit option"),completionWordList:t})}},md={[f.EXPORT]:()=>H(X+Y(", and create export markdown file")),[f.PEEK]:e=>{let t=e.modifier;if(t==="now")return H(X);let n={message:Y("historical state from: '1h', '2d', '23h', '1mo', '2y', 'previous', 'next' or full date as YYYY-MM-DD")};if(t==="prev"||t==="next")return H(X);let r=vn(t);if(!t||!r)return F(n);let o=Se(v().breadCrumb,"BOARD");if(a(o))return F({message:se("Command is not applicable in this context")});let i=Xo(o.value.id);return a(i)?F({message:se("Unable to peek: board id is not a valid ULID")}):zo({date:r,horizonDate:i.value})?H(X):F({message:se(`nothing to peek before ${i.value.toISOString().slice(0,16).replace("T"," ")}`)})},[f.EXIT]:()=>H(X+Y(" and exit the application")),[f.INIT]:()=>H(X),[f.PALETTE]:()=>H(X),[f.FILTER]:e=>{if(e.modifier==="clear")return H();let t=i=>ee(f.FILTER).includes(i);if(!e.modifier||!t(e.modifier))return F({message:ae({wordList:ee(f.FILTER),inputString:e.inputString}),completionWordList:ee(f.FILTER)});let n=Object.values(v().tags).map(i=>i.name),r=Object.values(v().contributors).map(i=>i.name),o=e.modifier==="tag"?n:e.modifier==="assignee"?r:[];return e.inputString?o.length&&!o.includes(e.inputString.trim())?F({message:ae({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString}),completionWordList:o}):H():F({message:ae({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString}),completionWordList:o})},[f.NONE]:e=>{let t=ee(f.NONE);return F({message:ae({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[f.NEW]:e=>cd({list:ee(f.NEW),hint:ae({wordList:ee(f.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[f.HELP]:()=>H(X),[f.EDIT]:ud,[f.CONFIG]:ld,[f.DELETE]:e=>{let t=oi();return t.validity==="invalid"?t:hr(e)},[f.CLOSE_ISSUE]:e=>hr(e),[f.RE_OPEN_ISSUE]:e=>hr(e),[f.MOVE]:e=>{let t=oi();return t.validity==="invalid"?t:Ut({hint:ae({prefix:"hey hacker! These commands are blocked for you... ",wordList:ee(f.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[f.TAG]:e=>{let n=N.getExistingTags().slice(0,10).map(En).join("");return Ut({hint:n.length?Y("create tag or reuse:")+n+Y(""):Y("create tag ...")})(e)},[f.UNTAG]:e=>{let t=gn();if(a(t))return F({message:se("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(En).slice(0,10);return n.length?Ut({hint:Y(" ... ")+n.join("")})(e):F({message:se("Issue has no tags"),completionWordList:[]})},[f.ASSIGN]:e=>{let t=N.getExistingAssignees().map(En).slice(0,10);return Ut({hint:Y("assignees... ")+t.join("")})(e)},[f.UNASSIGN]:e=>{let t=fn();if(a(t))return F({message:se("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(En).slice(0,10);return n.length?Ut({hint:Y("remove assignee... ")+n.join("")})(e):F({message:se("Issue has no assignees"),completionWordList:[]})},[f.SYNC]:()=>H(X)},si=Object.fromEntries(Object.entries(md).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var ai=["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 di=e=>Object.values(f).includes(e),ci=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:i}=e,{message:d,validity:l,completionWordList:u}=si[n].validate(n,r,i),m=o==="command"||o==="modifier"?ee(n):ai,{mode:p}=v(),y=p===g.COMMAND_LINE?d??"":"",h=[...u,...m];return{validity:l,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:y,autoCompletion:t?Oo(e,h):{hint:"",hints:[],remainder:"",overlap:0}}};var li=e=>{let t=e.trimStart(),n=gd(t),r=n[0]??"",o=n[1]??"",i=/\s$/.test(e),d=fd(e),l=di(r)?r:null,u=l!==null,m=r!=="",p=l?ee(l)??[]:[],y=l&&p.includes(o)?o:"",h="word";n.length===0||n.length===1&&!i?h="command":(n.length===1&&i||n.length===2&&!i)&&(h="modifier");let I=i?"":d,w=pd(t,l,y);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:d,hasCommand:m,command:l,isCommandKeyword:u,isLastWordCompleted:i,modifier:y,target:h,inputToMatch:I,inputString:w}},pd=(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},gd=e=>e.trim()?e.trim().split(/\s+/):[],fd=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as Jp}from"react";var vt=e=>e===Er||e===":",Er=" ",yt={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:Ze.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},vd=new Set,ui=()=>{for(let e of vd)e()};var ke=e=>{let n=e(yt),r=li(n.value),o=n.cursorPosition===n.value.length;yt={...n,commandMeta:ci(r,o)},ui()},Bt=({message:e,status:t})=>{let n=structuredClone(yt);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,yt=n,ui(),c(e,null)},Nr=e=>{ke(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},Ir=e=>{ke(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&vt(n[o-1]);)o--;for(;o>0&&!vt(n[o-1]);)o--}else{for(;o<n.length&&!vt(n[o]);)o++;for(;o<n.length&&vt(n[o]);)o++}return{...t,cursorPosition:o}})},mi=()=>{ke(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}})},pi=()=>{ke(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&vt(t[r-1]);)r--;for(;r>0&&!vt(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},B=e=>{ke(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),r=t.value.slice(0,n),o=t.value.slice(n),i=e(r,t.commandMeta.autoCompletion),d=i+o,l=Math.max(0,Math.min(i.length,d.length));return{...t,value:d,cursorPosition:l,commandIsPending:!1}})},gi=()=>{ke(e=>({...e,commandIsPending:!0}))},fi=({addToHistory:e=!0})=>{ke(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),yd()},vi=()=>{ke(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}})},yi=()=>{ke(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},yd=()=>B(()=>""),Z=()=>yt;var xi=()=>{let[e,...t]=yt.value.split(Er);return t.join(Er).trim()};var b={NavPreviousItem:"navPreviousItem",NavNextItem:"navNextItem",NavToPreviousContainer:"navToPreviousContainer",NavToNextContainer:"navToNextContainer",MovePreviousItem:"movePreviousItem",MoveNextItem:"moveNextItem",MoveToPreviousContainer:"moveToPreviousContainer",MoveToNextContainer:"moveToNextContainer",Confirm:"confirm",Exit:"exit",ViewHelp:"viewHelp",HideHelp:"hideHelp",InitMove:"initMove",ConfirmMove:"confirmMove",Delete:"Delete",InitCommandPalette:"initCommandPalette",InitCommandLine:"initCommandLine",ExitCommandLine:"exitCommandLine",CaptureInput:"captureInput",EraseInput:"eraseInput",AddItem:"addItem",GetLastCommandFromHistory:"getLastCommandFromHistory",GetNextCommandFromHistory:"getNextCommandFromHistory",AutoCompleteCommand:"autoCompleteCommand",MoveCursorLeft:"MoveCursorLeft",MoveCursorRight:"MoveCursorRight",MoveCursorLeftOfWord:"MoveCursorLeftOfWord",MoveCursorRightOfWord:"MoveCursorRightOfWord",EraseInputWord:"EraseInputWord",None:"None",Edit:"edit",SetViewDense:"SetViewDense",SetViewWide:"SetViewWide"};var hi=e=>{let{context:t}=v().contextNode;if(!t)return A.None;switch(e){case f.EXIT:return A.Exit;case f.EXPORT:return A.Export;case f.INIT:return A.Init;case f.DELETE:return A.Delete;case f.EDIT:return A.Edit;case f.HELP:return A.ViewHelp;case f.RE_OPEN_ISSUE:return A.ReopenIssue;case f.CLOSE_ISSUE:return A.CloseIssue;case f.TAG:return A.TagTicket;case f.UNTAG:return A.UntagTicket;case f.ASSIGN:return A.AssignUserToTicket;case f.UNASSIGN:return A.UnassignUserFromTicket;case f.NEW:return A.NewItem;case f.FILTER:return A.Filter;case f.MOVE:return A.Move;case f.PEEK:return A.Peek;case f.CONFIG:return A.Config;case f.SYNC:return A.Sync;default:return A.None}},A={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 ce}from"ulid";import Pi from"node:fs";import Hd from"node:path";import zd from"react";import{Box as Wd}from"ink";import Tn from"react";import{Box as br,Text as Td}from"ink";import Re from"react";import{Text as Ei}from"ink";import Ni,{useEffect as Ii,useState as xd}from"react";var Si={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "]},ge=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=be(),r=Si[n]??Si.default,[o,i]=xd(0);if(Ii(()=>{i(0)},[r]),Ii(()=>{if(!e)return;let l=setInterval(()=>{i(u=>(u+1)%r.length)},500);return()=>clearInterval(l)},[e,r]),!e)return Ni.createElement(Ei,null,t);let d=r[o]??r[0]??t;return Ni.createElement(Ei,{color:R.accent,dimColor:o===1},d)};import{Box as Sr,Text as hd}from"ink";import In from"react";var Sn=({children:e=[],height:t,selectedIndex:n,itemHeight:r=1,scrollByOne:o=!1})=>{if(e.length===0)return null;let i=Math.max(1,Math.floor(t)),d=Math.max(1,Math.ceil(r)),l=Math.max(1,Math.floor(i/d)),u=Math.max(0,Math.min(n,e.length-1)),m=Math.max(0,e.length-l),p=o?Math.min(m,Math.max(0,u-l+1)):Math.min(m,Math.floor(u/l)*l),y=p+l,h=e.slice(p,y),I=e.length>l,w=i,$=I?Math.max(1,Math.floor(l/e.length*w)):w,S=Math.max(0,w-$),T=Math.max(1,e.length-l),U=I?Math.floor(p/T*S):0;return In.createElement(Sr,{flexDirection:"row",height:i,width:"100%"},In.createElement(Sr,{flexDirection:"column",flexGrow:1,height:i},h),In.createElement(Sr,{flexDirection:"column",width:1,height:w},Array.from({length:w}).map((te,le)=>In.createElement(hd,{key:le,color:I&&le>=U&&le<U+$?R.accent:R.secondary},I?"\u2502":" "))))};import{Box as Rn,Text as Rd}from"ink";import Qe from"react";import{Text as Ed}from"ink";import Nd from"react";var Id=e=>e.toLowerCase().trim(),Sd=(e,t=Xe)=>{let n=Id(e);return t[n]?t[n]:Ot(n)},Cn=({id:e,isSelected:t})=>{let n=N.getContributor(e);if(n)return Nd.createElement(Ed,{underline:t,color:Sd(n.name)},"@"+n.name)};import{Text as Cd}from"ink";import bd from"react";var bn=({id:e,isSelected:t})=>{let n=N.getTag(e);if(n)return bd.createElement(Cd,{underline:t,backgroundColor:Ce(n.name),color:R.primary}," "+n.name+" ")};var Ci=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=ln(un(t.title),r),i=ur(t),d=mr(t);return Qe.createElement(Rn,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?R.accent:R.secondary,justifyContent:"space-between"},Qe.createElement(Rn,{borderBottom:!0},Qe.createElement(Rn,{paddingLeft:1,flexDirection:"column"},Qe.createElement(Rd,{color:R.primary},o))),Qe.createElement(Rn,{flexDirection:"row",paddingLeft:1},i.map(l=>Qe.createElement(bn,{key:l.id,id:l.id})),d.map(l=>Qe.createElement(Cn,{key:l.id,id:l.id}))))};import Ad from"chalk";import{Box as _t,Text as Cr}from"ink";import Le from"react";var wd=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,bi=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let i=(t.props.tags??[]).map(I=>N.getTag(I)).filter(I=>!!I),d=(t.props.assignees??[]).map(I=>N.getContributor(I)).filter(I=>!!I),l=1,u=i.length*(1+l),m=d.length*(2+l),p=i.map(I=>Le.createElement(_t,{key:I.id,paddingRight:l},Le.createElement(Cr,{color:Ce(I.name)},"\u25A0"))),y=d.map(I=>Le.createElement(_t,{key:I.id,paddingRight:l},Le.createElement(Cr,{color:Ot(I.name)},"@"+I.name.at(0)))),h=n?R.accent:o===g.MOVE?R.secondary:R.primary;return Le.createElement(_t,{borderBottom:!0,justifyContent:"space-between"},Le.createElement(_t,null,Le.createElement(ge,{isSelected:n,placeholder:Ad.dim.gray(r+1+" ")}),Le.createElement(Cr,{wrap:"truncate",color:h},wd(t.title,e-u-m-14))),Le.createElement(_t,null,p,y))};import Md from"chalk";var Pd=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:i,listSelectedIndex:d,mode:l})=>{let{renderedChildrenIndex:u}=be(),m=u[e.id]??[],p=`${e.title} ${Md.hex(R.secondary2).dim("("+m.length+")")}`,y=3,h=o?1:4,I=r-y-(o?2:1),w=Re.createElement(br,{borderStyle:"round",borderColor:R.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},Re.createElement(ge,{isSelected:t}),Re.createElement(Td,{bold:!0,color:t?R.accent:R.primary},p," ",e.readonly?"\u{1F512}":"")),$=(S,T)=>{let U=i&&d===T;return o?Re.createElement(bi,{key:S.id,index:T,width:n,ticket:S,isSelected:U,mode:l}):Re.createElement(Ci,{key:S.id,width:n,ticket:S,isSelected:U})};return Re.createElement(br,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?R.accent:R.secondary,paddingRight:1,paddingLeft:1,height:r},w,Re.createElement(br,{padding:o?1:0},m.length>0&&Re.createElement(Sn,{selectedIndex:d,height:I,itemHeight:h},m.map($)),Re.createElement(ge,{isSelected:i&&d===-1})))},Ri=Re.memo(Pd);import{Box as wr,Text as Bd}from"ink";import Ke,{useMemo as wi}from"react";import{decodeTime as kd,encodeTime as Ld}from"ulid";var Dd="0123456789ABCDEFGHJKMNPQRSTVWXYZ",Fd=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+=Dd[Number(n%32n)];return r},ze=(e,t)=>{let n=kd(e);return Ld(n,10)+Fd(`${e}:${t}`)};import{Box as An,Text as Od}from"ink";import De from"react";var Ai=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:r}=be(),{title:o}=t,i=t.parentNodeId?N.getNode(t.parentNodeId):void 0,d=i&&O(i)?o===G.ASSIGNEES?i.props.assignees??[]:o===G.TAGS?i.props.tags??[]:[]:[];return De.createElement(An,{alignItems:"center",paddingTop:1},De.createElement(An,{minWidth:12},De.createElement(ge,{isSelected:n}),De.createElement(Od,{color:n?R.accent:R.secondary2},o,":")),De.createElement(An,{flexDirection:"row",marginLeft:1,paddingRight:1},d.map((l,u)=>{let m=r.id===t.id&&u===e;return De.createElement(An,{key:`${o}-${l}`,paddingRight:2,minHeight:1},De.createElement(ge,{isSelected:m}),o===G.ASSIGNEES?De.createElement(Cn,{isSelected:m,id:l}):o===G.TAGS?De.createElement(bn,{isSelected:m,id:l}):null)})))};import{Box as wn,Text as Rr}from"ink";import Fe,{useEffect as Ud}from"react";var de={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:C.WORKSPACE,childRenderAxis:"vertical",parentNodeId:null,readonly:!0,log:[]}),board:(e,t,n,r,o=!1)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:C.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:C.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:({id:e,name:t,parentNodeId:n,rank:r,props:o={},childRenderAxis:i="horizontal",isVirtual:d=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:C.FIELD,childRenderAxis:i,parentNodeId:n,readonly:!1,log:[],isVirtual:d}),fieldList:({id:e,name:t,parentNodeId:n,rank:r,childRenderAxis:o="horizontal",isVirtual:i=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:C.FIELD_LIST,childRenderAxis:o,parentNodeId:n,readonly:!1,log:[],isVirtual:i}),ticket:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:C.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,rank:r,props:o={},readonly:i=!0,isVirtual:d=!0})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:C.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:i,log:[],isVirtual:d})};var Ar=({id:e,label:t,text:n,height:r,selected:o,maxWidth:i})=>{let{selectedIndex:d,contextNode:l}=be(),u=h=>String(h).replace(/\r?\n/g,""),m=typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[];Ud(()=>{let h=[];return m.forEach((I,w)=>{let $=xe(BigInt(w+1));if(!Rt($))return;let S=de.text({id:`${e}-${w}`,name:`Line ${w+1}`,parentNodeId:e,rank:$.value,props:{value:I},readonly:!0,isVirtual:!0}),T=N.createNode(S);Rt(T)&&h.push(T.value.id)}),()=>h.forEach(N.deleteNode)},[e,n]);let p="\u2029",y=m.map((h,I)=>{let w=l.id===e&&d===I;return Fe.createElement(wn,{key:`${e}-${I}`},Fe.createElement(Rr,{color:w?R.primary:R.secondary2,dimColor:!w},`${I+1} `.padStart(5,"\xA0")),Fe.createElement(Rr,{backgroundColor:w?"gray":""},u(h.length?ln(h,i-10):p)))});return Fe.createElement(wn,{flexDirection:"column",paddingTop:1},Fe.createElement(wn,null,Fe.createElement(ge,{isSelected:o}),Fe.createElement(Rr,{color:o?R.accent:R.secondary2},t)),Fe.createElement(wn,{flexDirection:"row",borderStyle:"round",borderColor:R.secondary,paddingLeft:1,marginLeft:1},Fe.createElement(Sn,{scrollByOne:!0,children:y,height:r-2,selectedIndex:d,itemHeight:1})))};var _d=e=>ze(e,"description"),$d=e=>ze(e,"history"),Ti=({ticket:e,height:t})=>{let{selectedIndex:n,contextNode:r}=be(),o=process.stdout.columns||120,i=wi(()=>_d(e.id),[e.id]),d=wi(()=>$d(e.id),[e.id]),l=r.id===e.id,u=r.id===d||r.parentNodeId===d,m=_(e.id);if(u){let S=N.getNode(d),T=S&&Be(S)?S.props.value??"":"",te=t-3;return Ke.createElement(wr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},S?Ke.createElement(Ar,{id:S.id,label:"Event log",text:T,selected:!1,maxWidth:o,height:te}):null)}let p=m.reduce((S,T)=>At(T)||T.id===d?S+1:S,0),y=2,h=3,I=p,w=t-h-I-y,$=(S,T)=>S.id===i?Ke.createElement(Ar,{key:S.id,id:i,label:"Description (press e to edit)",text:e.props.description??"",selected:T,maxWidth:o,height:w}):At(S)?Ke.createElement(Ai,{key:S.id,parent:S,selected:T,selectedIndex:n}):S.id===d?Ke.createElement(wr,{key:S.id,paddingTop:1},Ke.createElement(ge,{isSelected:T}),Ke.createElement(Bd,{backgroundColor:R.secondary,color:T?R.accent:R.primary}," History \u203A\u203A ")):null;return Ke.createElement(wr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},m.map((S,T)=>$(S,l&&n===T)))};var jd=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:i,height:d,width:l})=>{let u=t.context,m=u===C.TICKET||u===C.FIELD_LIST||u===C.FIELD,p=u===C.BOARD||u===C.SWIMLANE,y=u===C.TICKET?t:r.find(S=>S.context===C.TICKET),h=Math.floor(l/3),I=Math.floor(l/Math.max(e.length,1)),w=Math.min(I,h),$=i==="dense";return Tn.createElement(Wd,{flexDirection:"row",height:d},p&&e.map((S,T)=>{let U=t.id===S.id,te=U?n:-1,le=t.context===C.BOARD&&n===T;return Tn.createElement(Ri,{key:S.id,height:d,width:w,swimlane:S,isSelected:le,isDense:$,isFocused:U,listSelectedIndex:te,mode:o})}),m&&y&&Tn.createElement(Ti,{height:d,ticket:y}))},Mi=Tn.memo(jd);import{render as Kd}from"ink";import{Writable as qd}from"node:stream";var $t=e=>String(e).padStart(2,"0"),Vd=e=>{let t=e.getUTCFullYear(),n=$t(e.getUTCMonth()+1),r=$t(e.getUTCDate()),o=$t(e.getUTCHours()),i=$t(e.getUTCMinutes()),d=$t(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${i}-${d}`},Gd=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",Yd=async(e,{width:t,height:n})=>{let r="",o=new qd({write(d,l,u){let m=Xd(d.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),u()}});o.columns=t,o.rows=n,o.isTTY=!0;let i=Kd(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(d=>setTimeout(d,0)),i.unmount(),r},Xd=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),ki=async()=>{let{viewMode:e}=K(),{contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:i}=v(),d=r.find(T=>T.context==="BOARD");if(!d)return s("No board found to export");let l=120,u=40,m=await Yd(zd.createElement(Mi,{height:u,width:l,swimlanes:(i[d.id]??[]).filter(T=>T!==void 0&&Xt(T)),contextNode: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=ut(process.cwd());if(a(p))return s("Unable to export, epiq root not found");let y=new Date,h=Vd(y),I=`board_${Gd(d.title)}_${h}.md`,w=Mo(p.value);Pi.mkdirSync(w,{recursive:!0});let $=Hd.join(w,I),S=`# Board - ${d.title}
21
+ `).filter(Boolean).filter(d=>d!==Me);if(r.length===0)return c("State branch is storage-only",!1);let o=await F({args:["rm","-r","--ignore-unmatch","--",...r],cwd:e});if(a(o))return s(`Failed to clean storage branch
22
+ ${o.message}`);let i=await pt({cwd:e,message:"[epiq:repair-storage-branch]"});return a(i)?s(i.message):c("Cleaned storage branch",!0)},We=tr(async(e=process.cwd())=>{let t=await F({args:["rev-parse","--show-toplevel"],cwd:e});return a(t)?s("Not inside a Git repository"):c("Resolved repo root",t.value.stdout.trim())},e=>Ne.resolve(e)),Zu=tr(async e=>{let t=await F({args:["rev-parse","--git-dir"],cwd:e});if(a(t))return s(t.message);let n=t.value.stdout.trim(),r=Ne.isAbsolute(n)?n:Ne.join(e,n);return c("Resolved git dir",r)},e=>Ne.resolve(e));var im=process.env.IS_LOCAL==="true",Me=".epiq",pe=".epiq-global",un="events",Da="project.json",tn=e=>Pe.join(e,Me),nn=e=>Pe.join(tn(e),Da),Ot=e=>Pe.join(tn(e),un),ko=e=>Pe.join(e,Me),Fa=e=>{let t=Pe.join(e,Me);return Ft.existsSync(t)&&Ft.statSync(t).isDirectory()},dr=e=>{let t=nn(e);return Ft.existsSync(t)&&Ft.statSync(t).isFile()},rn=e=>{let t=Pe.resolve(e);for(;;){if(Fa(t))return c("Resolved closest .epiq root",t);let n=Pe.dirname(t);if(n===t)return s("No .epiq directory found in any parent");t=n}},$e=e=>{let t=Pe.resolve(e);for(;;){if(dr(t))return c("Resolved closest epiq project root",t);let n=Pe.dirname(t);if(n===t)return s("No .epiq/project.json found in any parent");t=n}},Lo=e=>{let t=Ot(e);try{return Ft.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")}},he=async()=>{let e=await We(process.cwd());if(a(e))return e;let t=gt({repoRoot:e.value});return a(t)?t:c("Resolved persist root",t.value)};var G={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History"};import{useSyncExternalStore as ul}from"react";var p={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette"};function mn(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var pn=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",gn=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var Do=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},Fo=(e,t)=>t?e.get(t)??[]:[];var Oo=new WeakMap,Oa=e=>{let t=Oo.get(e);return t||(t=Do(e),Oo.set(e,t)),t};var Uo=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return Fo(Oa(e),r).filter(i=>mn(r,i)>=n)};var Ua={hint:"",hints:[],overlap:0,remainder:""},Bo=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return Ua;let o=Uo({wordList:r,inputToMatch:e,overlapThreshold:1});return Ba(t,o)},Ba=(e,t)=>{let n=t[0]??"",r=mn(e.toLowerCase(),n.toLowerCase()),[o,i]=n.split(":"),d=r<(o??"").length,l=!!i,g=(l&&d?o:n)+(l&&d?":":" "),y=g.slice(r);return{hint:g,hints:t,overlap:r,remainder:y}};var fn={autoSyncIntervalMs:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},K=()=>fn,je=e=>(fn={...fn,...e},fn);var ft=3e3,_o=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<ft?null:t},$o=0,cr,lr=!1,Ut=!1,ur=()=>{if(lr)return!0;let e=Ie();return a(e)?!1:e.value.syncStatus.status==="syncing"},_a=()=>{let e=K().autoSyncIntervalMs??1e4,t=Date.now()-$o;return Math.max(0,e-t)},Wo=()=>{cr||(cr=setTimeout(async()=>{if(cr=void 0,!!vt()){if(ur()){Ut=!0;return}Ut=!1,await $a()}},_a()))},$a=async()=>{if(v().readOnly||v().timeMode==="peek")return s("Cannot auto-sync while peeking");if(!vt())return s("Cannot auto-sync before state is initialized");if(ur())return Ut=!0,s("Sync already in progress");lr=!0,$o=Date.now(),h({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await He()}finally{lr=!1,Ut&&Wo()}},jo=()=>{vt()&&(Ut=!0,!ur()&&Wo())};var vn=()=>{let e=K(),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}},Ho=()=>{let e=$e(process.cwd());if(a(e))return!1;let t=_e(e.value);return wt(t)},zo=e=>e===!0?"yes":e===!1?"no":null,Ko=e=>e==="yes"?!0:e==="no"?!1:null;var Q={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#2a2f45",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},w={accent:Q.cyan,accent2:Q.magenta,primary:Q.white,secondary:Q.grayDark,secondary2:Q.grayLight,gray:Q.gray,green:Q.green,yellow:Q.yellow,red:Q.red};var x={red:Q.red,yellow:Q.yellow,green:Q.green,blue:Q.blue,magenta:Q.magenta,cyan:Q.cyan},Ze={urgent:x.red,critical:x.red,important:x.red,blocker:x.red,asap:x.red,immediate:x.red,fail:x.red,failure:x.red,broken:x.red,bug:x.red,error:x.red,incident:x.red,outage:x.red,production:x.red,crash:x.red,security:x.red,warning:x.yellow,warn:x.yellow,risky:x.yellow,risk:x.yellow,attention:x.yellow,pending:x.yellow,review:x.yellow,"needs-review":x.yellow,qa:x.yellow,testing:x.yellow,test:x.yellow,validate:x.yellow,verification:x.yellow,staging:x.yellow,check:x.yellow,"follow-up":x.yellow,followup:x.yellow,waiting:x.yellow,blocked:x.yellow,hold:x.yellow,done:x.green,complete:x.green,completed:x.green,success:x.green,ok:x.green,stable:x.green,resolved:x.green,fixed:x.green,closed:x.green,merged:x.green,released:x.green,deployed:x.green,approved:x.green,verified:x.green,working:x.green,healthy:x.green,pass:x.green,passing:x.green,info:x.blue,information:x.blue,note:x.blue,docs:x.blue,documentation:x.blue,doc:x.blue,guide:x.blue,help:x.blue,explanation:x.blue,detail:x.blue,details:x.blue,context:x.blue,design:x.blue,discussion:x.blue,proposal:x.blue,idea:x.blue,feature:x.magenta,enhancement:x.magenta,improvement:x.magenta,refactor:x.magenta,refactoring:x.magenta,cleanup:x.magenta,optimize:x.magenta,optimization:x.magenta,perf:x.magenta,performance:x.magenta,upgrade:x.magenta,migration:x.magenta,modernize:x.magenta,debt:x.magenta,todo:x.cyan,next:x.cyan,planned:x.cyan,plan:x.cyan,future:x.cyan,backlog:x.cyan,investigate:x.cyan,explore:x.cyan,prototype:x.cyan};var Wa=e=>e.props.tags??[],ja=e=>e.props.assignees??[],mr=e=>Wa(e).map(t=>E.getTag(t)).filter(t=>!!t),pr=e=>ja(e).map(t=>E.getContributor(t)).filter(t=>!!t),yn=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!_(n)?s("Invalid untag target"):c("Retrieved tags from ticket in breadcrumb",mr(n))},xn=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!_(n)?s("Invalid unassign target"):c("Retrieved assignees from ticket in breadcrumb",pr(n))};var f={PALETTE:"?",EXIT:"exit",INIT:"init",HELP:"help",NEW:"new",TAG:"tag",UNTAG:"untag",MOVE:"move",PEEK:"peek",FILTER:"filter",ASSIGN:"assign",UNASSIGN:"unassign",DELETE:"delete",CLOSE_ISSUE:"close",RE_OPEN_ISSUE:"reopen",CONFIG:"config",EDIT:"edit",SYNC:"sync",EXPORT:"export",NONE:""};var Ha=/^(\d+)(h|d|w|mo|y)$/,za=/^(\d{4})-(\d{2})-(\d{2})(?:(?::|\s)(\d{2}):(\d{2}))?$/,Ka=({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},qa=(e,t=new Date)=>{let n=e.match(Ha);if(!n)return null;let[,r,o]=n,i=Number(r);if(!Number.isInteger(i)||i<=0)return null;let d=new Date(t);switch(o){case"h":return d.setHours(d.getHours()-i),d;case"d":return d.setDate(d.getDate()-i),d;case"w":return d.setDate(d.getDate()-i*7),d;case"mo":return d.setMonth(d.getMonth()-i),d;case"y":return d.setFullYear(d.getFullYear()-i),d;default:return null}},Va=e=>{let t=e.match(za);if(!t)return null;let[,n,r,o,i,d]=t,l=Number(n),u=Number(r),m=Number(o),g=i?Number(i):0,y=d?Number(d):0;return Ka({year:l,month:u,day:m,hour:g,minute:y})?new Date(l,u-1,m,g,y):null},hn=e=>{let t=e.trim().toLowerCase();return qa(t)??Va(t)},qo=({date:e,horizonDate:t})=>t?e.getTime()>=t.getTime():!0,Ga=[{unit:"h",from:1,to:24},{unit:"d",from:1,to:7},{unit:"w",from:1,to:52},{unit:"mo",from:1,to:12},{unit:"y",from:1,to:5}],Vo=(e=Ga)=>{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 Ya=["BOARD","TICKET","SWIMLANE"],J={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs"},ze={TITLE:"title",DESCRIPTION:"description"},Xa=[J.EDITOR,J.VIEW,J.USERNAME,J.AUTOSYNC,J.SYNC_DEBOUNCE_MS],Ja=[ze.TITLE,ze.DESCRIPTION],fr=[String(ft),"5000","15000","30000","60000"],Qe=[f.EXIT,f.SYNC,f.HELP,f.EXPORT,f.CONFIG],En=[f.NEW,f.EDIT,f.DELETE,f.MOVE],gr=[f.TAG,f.UNTAG,f.ASSIGN,f.UNASSIGN,f.CLOSE_ISSUE,f.RE_OPEN_ISSUE,f.EDIT],Go=[f.FILTER,f.PEEK],Za={WORKSPACE:[...Qe,...En],BOARD:[...Go,...Qe,...En],SWIMLANE:[...Go,...Qe,...En],TICKET:[...Qe,...En,...gr],FIELD:[...Qe,...gr],FIELD_LIST:[...Qe,...gr],TEXT:[...Qe]},Qa=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],ed=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:r}=vn();if(!r)return[f.HELP,f.CONFIG];if(!Ho())return[f.HELP,f.INIT];if(t)return[f.HELP,f.PEEK,f.EXPORT,f.CONFIG];let o=e?.context,i=o&&Ya.includes(o);return[...new Set([...n,e].map(l=>l?.context).flatMap(l=>l?Za[l]:[]))].filter(l=>l===f.MOVE?!1:l===f.EDIT||l===f.DELETE?i:!0)},ee=(e,{contextNode:t,selectedNode:n,readOnly:r,breadCrumb:o}=v())=>{let i=t.context??"WORKSPACE";return{[f.NONE]:ed({breadCrumb:o,readOnly:r,selectedNode:n}),[f.EXIT]:["confirm"],[f.EXPORT]:[],[f.SYNC]:[],[f.INIT]:[],[f.HELP]:[],[f.PEEK]:[...Vo(),"now","prev","next"],[f.EDIT]:[...Ja],[f.DELETE]:["confirm"],[f.RE_OPEN_ISSUE]:["confirm"],[f.CLOSE_ISSUE]:["confirm"],[f.MOVE]:["start","confirm","next","previous","to-next","to-previous","cancel"],[f.FILTER]:["tag","assignee","description","title","clear"],[f.TAG]:[...new Set([...Object.keys(Ze),...E.getExistingTags()])],[f.UNTAG]:[...yn()?.value?.map(({name:l})=>l)??[]],[f.UNASSIGN]:[...xn()?.value?.map(({name:l})=>l)??[]],[f.ASSIGN]:E.getExistingAssignees(),[f.NEW]:Qa(i),[f.CONFIG]:[...Xa]}[e]??[]};import ai from"chalk";var Yo=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import{decodeTime as Xo}from"ulid";var Jo=e=>{let t=Date.now()-e,n=[{label:"y",ms:1e3*60*60*24*365},{label:"mo",ms:1e3*60*60*24*30},{label:"w",ms:1e3*60*60*24*7},{label:"d",ms:1e3*60*60*24},{label:"h",ms:1e3*60*60},{label:"m",ms:1e3*60},{label:"s",ms:1e3}];for(let{label:r,ms:o}of n){let i=Math.floor(t/o);if(i>=1)return`${i}${r} ago`}return"just now"};var Zo=e=>{try{return c("Decoded date",new Date(Xo(e)))}catch(t){return s("Decoding failed + "+t.message)}},vr=e=>{if(!e?.id)return null;try{return Xo(e.id)}catch{return null}};var Se=(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 Qo from"chalk";var td=[0,0,0],hr=.2,xr={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},ei=(e,t,n)=>Math.max(t,Math.min(n,e)),yr=(e,t,n)=>e+(t-e)*n,ti=e=>{let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)>>>0;return t},nd=e=>e.toLowerCase().trim(),rd=(e,t,n)=>{let r=t/100,o=n/100,i=(1-Math.abs(2*o-1))*r,d=e/60,l=i*(1-Math.abs(d%2-1)),u=0,m=0,g=0;d>=0&&d<1?(u=i,m=l):d>=1&&d<2?(u=l,m=i):d>=2&&d<3?(m=i,g=l):d>=3&&d<4?(m=l,g=i):d>=4&&d<5?(u=l,g=i):(u=i,g=l);let y=o-i/2;return[Math.round((u+y)*255),Math.round((m+y)*255),Math.round((g+y)*255)]},ni=([e,t,n])=>`#${e.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}`,od=e=>{let t=e.replace("#","");return[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]},ri=(e,t,n)=>{let r=ei(n,0,1);return[Math.round(yr(e[0],t[0],r)),Math.round(yr(e[1],t[1],r)),Math.round(yr(e[2],t[2],r))]},id=(e,t=hr)=>ri(e,td,t),sd=(e,t=hr)=>ni(id(od(e),t)),ad=(e,t,n)=>ri(e,t,n),Bt=e=>{let n=ti(e)%360,r=rd(n,xr.stringColor.saturation,xr.stringColor.lightness);return ni(r)},Ce=(e,t=Ze)=>{let n=nd(e);return n&&t[n]?t[n]:Bt(n)},oi=(e,t=Ze,n=hr)=>sd(Ce(e,t),n),dd=e=>{let t=xr.gradient.stops,n=ei(e,0,1);if(t.length===0)return[0,0,0];if(t.length===1)return t[0];let r=t.length-1,o=n*r,i=Math.min(Math.floor(o),r-1),d=o-i;return ad(t[i],t[i+1],d)},Nn=e=>ti(e.toLowerCase().trim())/4294967295,cd=e=>{let t=Nn(e);return dd(t)},ld=e=>{let[t,n,r]=cd(e);return{normal:o=>Qo.bgRgb(t,n,r).black(o),cursor:o=>Qo.bgRgb(t,n,r).white.bold(o)}};var In=e=>ld(e).normal(` ${e} `);import ii from"chalk";var Y=e=>ii.dim(e),se=e=>ii.hex(w.primary)(e),ae=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:i=1})=>{let d=o.trim();if(d.length<i)return"";let g=[...t.filter(Boolean).filter(y=>y.startsWith(d))].sort((y,N)=>Nn(y)-Nn(N)).slice(0,r).map(y=>In(y)).join(" ");return g?`${Y(e)}${g}${Y(n)}`:""};var et={None:"none",Invalid:"invalid",Valid:"valid"};var ud=["BOARD","TICKET","SWIMLANE"],si=()=>{let e=v().selectedNode;return e?.context?ud.includes(e.context)?H():O({message:Y("Command not available in this context")}):O({message:Y("Missing target context")})},X="<ENTER> to confirm",H=(e="",t=[])=>({message:Y(e),validity:et.Valid,completionWordList:t}),O=({message:e,completionWordList:t=[]})=>({validity:et.Invalid,message:e,completionWordList:t}),Cn=e=>e.length===0,Sn=e=>` ${ai.dim.bgHex(oi(e))(` ${e} `)} `,Er=({modifier:e})=>{let t="confirm";return e===t?H(X):O({message:Cn(e)?Y("if you are certain, enter ")+In(t):"",completionWordList:[t]})},md=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?O({message:Y(n)}):H():O({message:Cn(r)?t:"",completionWordList:[...e]}),_t=({hint:e})=>({modifier:t,inputString:n})=>Cn(t)&&Cn(n)?O({message:e,completionWordList:[]}):H(X),pd=({modifier:e,inputString:t})=>{let n=ee(f.CONFIG);if(!n.includes(e))return O({message:ae({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case J.EDITOR:{let r=[...Yo];return t.trim()?r.includes(t.trim())?H(X):O({message:ae({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):O({message:ae({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case J.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?H(X):O({message:ae({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case J.USERNAME:return t.trim()?H(X):O({message:se("Enter a user name. Saved in ")+ai.bgBlack("~/.epiq-global/config.json")});case J.AUTOSYNC:{let r=["yes","no"],o=K().autoSync;if(!r.includes(t.trim())){let i=zo(o);return O({message:ae({prefix:`should auto-sync (recommended)${i!==null?", currently: "+i:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return H(X)}case J.SYNC_DEBOUNCE_MS:{let r=K().autoSyncIntervalMs,o=_o(t);if(!t.trim()||o===null||o<ft){let i=ae({prefix:" examples: ",wordList:fr,minLengthForHints:0,inputString:t});return O({message:se(`provide duration above ${ft}ms. current duration: ${r}ms.`)+i,completionWordList:fr})}return H(X)}default:return O({message:se("Unknown config option"),completionWordList:n})}},gd=({modifier:e})=>{let t=ee(f.EDIT);if(!t.includes(e)){let i=ae({prefix:"edit... ",wordList:t,inputString:e,minLengthForHints:0});return O({message:i||se("Unknown edit option"),completionWordList:t})}let{breadCrumb:n,selectedNode:r}=v();if(!Se([...n,r],"TICKET"))return O({message:se("Command not available in this context")});switch(e){case ze.TITLE:return H(X);case ze.DESCRIPTION:let{preferredEditor:i}=K();return i?H(Y("<ENTER> to edit in ")+i):O({message:"No editor selected"});default:return O({message:se("Unknown edit option"),completionWordList:t})}},fd={[f.EXPORT]:()=>H(X+Y(", and create export markdown file")),[f.PEEK]:e=>{let t=e.modifier;if(t==="now")return H(X);let n={message:Y("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")};if(t==="prev"||t==="next")return H(X);let r=hn(t);if(!t||!r)return O(n);let o=Se(v().breadCrumb,"BOARD");if(a(o))return O({message:se("Command is not applicable in this context")});let i=Zo(o.value.id);return a(i)?O({message:se("Unable to peek: board id is not a valid ULID")}):qo({date:r,horizonDate:i.value})?H(X):O({message:se(`nothing to peek before ${i.value.toISOString().slice(0,16).replace("T"," ")}`)})},[f.EXIT]:()=>H(X+Y(" and exit the application")),[f.INIT]:()=>H(X),[f.PALETTE]:()=>H(X),[f.FILTER]:e=>{if(e.modifier==="clear")return H();let t=i=>ee(f.FILTER).includes(i);if(!e.modifier||!t(e.modifier))return O({message:ae({wordList:ee(f.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:ee(f.FILTER)});let n=Object.values(v().tags).map(i=>i.name),r=Object.values(v().contributors).map(i=>i.name),o=e.modifier==="tag"?n:e.modifier==="assignee"?r:[];return e.inputString?o.length&&!o.includes(e.inputString.trim())?O({message:ae({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString}),completionWordList:o}):H():O({message:ae({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString}),completionWordList:o})},[f.NONE]:e=>{let t=ee(f.NONE);return O({message:ae({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[f.NEW]:e=>md({list:ee(f.NEW),hint:ae({wordList:ee(f.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[f.HELP]:()=>H(X),[f.EDIT]:gd,[f.CONFIG]:pd,[f.DELETE]:e=>{let t=si();return t.validity==="invalid"?t:Er(e)},[f.CLOSE_ISSUE]:e=>Er(e),[f.RE_OPEN_ISSUE]:e=>Er(e),[f.MOVE]:e=>{let t=si();return t.validity==="invalid"?t:_t({hint:ae({prefix:"hey hacker! These commands are blocked for you... ",wordList:ee(f.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[f.TAG]:e=>{let n=E.getExistingTags().slice(0,10).map(Sn).join("");return _t({hint:n.length?Y("create tag or reuse:")+n+Y(""):Y("create tag ...")})(e)},[f.UNTAG]:e=>{let t=yn();if(a(t))return O({message:se("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(Sn).slice(0,10);return n.length?_t({hint:Y(" ... ")+n.join("")})(e):O({message:se("Issue has no tags"),completionWordList:[]})},[f.ASSIGN]:e=>{let t=E.getExistingAssignees().map(Sn).slice(0,10);return _t({hint:Y("assignees... ")+t.join("")})(e)},[f.UNASSIGN]:e=>{let t=xn();if(a(t))return O({message:se("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(Sn).slice(0,10);return n.length?_t({hint:Y("remove assignee... ")+n.join("")})(e):O({message:se("Issue has no assignees"),completionWordList:[]})},[f.SYNC]:()=>H(X)},di=Object.fromEntries(Object.entries(fd).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var ci=["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 li=e=>Object.values(f).includes(e),ui=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:i}=e,{message:d,validity:l,completionWordList:u}=di[n].validate(n,r,i),m=o==="command"||o==="modifier"?ee(n):ci,{mode:g}=v(),y=g===p.COMMAND_LINE?d??"":"",N=[...u,...m];return{validity:l,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:y,autoCompletion:t?Bo(e,N):{hint:"",hints:[],remainder:"",overlap:0}}};var mi=e=>{let t=e.trimStart(),n=yd(t),r=n[0]??"",o=n[1]??"",i=/\s$/.test(e),d=xd(e),l=li(r)?r:null,u=l!==null,m=r!=="",g=l?ee(l)??[]:[],y=l&&g.includes(o)?o:"",N="word";n.length===0||n.length===1&&!i?N="command":(n.length===1&&i||n.length===2&&!i)&&(N="modifier");let I=i?"":d,C=vd(t,l,y);return{raw:e,trimmedStart:t,words:n,firstWord:r,lastWord:d,hasCommand:m,command:l,isCommandKeyword:u,isLastWordCompleted:i,modifier:y,target:N,inputToMatch:I,inputString:C}},vd=(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},yd=e=>e.trim()?e.trim().split(/\s+/):[],xd=e=>e.trimEnd().split(/\s+/).at(-1)??"";import{useSyncExternalStore as tg}from"react";var yt=e=>e===Nr||e===":",Nr=" ",xt={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:et.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},hd=new Set,pi=()=>{for(let e of hd)e()};var ke=e=>{let n=e(xt),r=mi(n.value),o=n.cursorPosition===n.value.length;xt={...n,commandMeta:ui(r,o)},pi()},$t=({message:e,status:t})=>{let n=structuredClone(xt);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,xt=n,pi(),c(e,null)},Ir=e=>{ke(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},Sr=e=>{ke(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&yt(n[o-1]);)o--;for(;o>0&&!yt(n[o-1]);)o--}else{for(;o<n.length&&!yt(n[o]);)o++;for(;o<n.length&&yt(n[o]);)o++}return{...t,cursorPosition:o}})},gi=()=>{ke(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}})},fi=()=>{ke(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&yt(t[r-1]);)r--;for(;r>0&&!yt(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},U=e=>{ke(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),r=t.value.slice(0,n),o=t.value.slice(n),i=e(r,t.commandMeta.autoCompletion),d=i+o,l=Math.max(0,Math.min(i.length,d.length));return{...t,value:d,cursorPosition:l,commandIsPending:!1}})},vi=()=>{ke(e=>({...e,commandIsPending:!0}))},yi=({addToHistory:e=!0})=>{ke(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),Ed()},xi=()=>{ke(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}})},hi=()=>{ke(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},Ed=()=>U(()=>""),Z=()=>xt;var Ei=()=>{let[e,...t]=xt.value.split(Nr);return t.join(Nr).trim()};var S={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",EditTitle:"editTitle",EditDescription:"editDescription",SetViewDense:"SetViewDense",SetViewWide:"SetViewWide"};var Ni=e=>{let{context:t}=v().contextNode;if(!t)return T.None;switch(e){case f.EXIT:return T.Exit;case f.EXPORT:return T.Export;case f.INIT:return T.Init;case f.DELETE:return T.Delete;case f.EDIT:return T.Edit;case f.HELP:return T.ViewHelp;case f.RE_OPEN_ISSUE:return T.ReopenIssue;case f.CLOSE_ISSUE:return T.CloseIssue;case f.TAG:return T.TagTicket;case f.UNTAG:return T.UntagTicket;case f.ASSIGN:return T.AssignUserToTicket;case f.UNASSIGN:return T.UnassignUserFromTicket;case f.NEW:return T.NewItem;case f.FILTER:return T.Filter;case f.MOVE:return T.Move;case f.PEEK:return T.Peek;case f.CONFIG:return T.Config;case f.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 ce}from"ulid";import Li from"node:fs";import qd from"node:path";import Vd from"react";import{Box as zd}from"ink";import kn from"react";import{Box as br,Text as kd}from"ink";import be from"react";import{Text as Ii}from"ink";import Si,{useEffect as Ci,useState as Nd}from"react";var Ri={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "]},ge=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=Re(),r=Ri[n]??Ri.default,[o,i]=Nd(0);if(Ci(()=>{i(0)},[r]),Ci(()=>{if(!e)return;let l=setInterval(()=>{i(u=>(u+1)%r.length)},500);return()=>clearInterval(l)},[e,r]),!e)return Si.createElement(Ii,null,t);let d=r[o]??r[0]??t;return Si.createElement(Ii,{color:w.accent,dimColor:o===1},d)};import{Box as Cr,Text as Id}from"ink";import Rn from"react";var bn=({children:e=[],height:t,selectedIndex:n,itemHeight:r=1,scrollByOne:o=!1})=>{if(e.length===0)return null;let i=Math.max(1,Math.floor(t)),d=Math.max(1,Math.ceil(r)),l=Math.max(1,Math.floor(i/d)),u=Math.max(0,Math.min(n,e.length-1)),m=Math.max(0,e.length-l),g=o?Math.min(m,Math.max(0,u-l+1)):Math.min(m,Math.floor(u/l)*l),y=g+l,N=e.slice(g,y),I=e.length>l,C=i,D=I?Math.max(1,Math.floor(l/e.length*C)):C,R=Math.max(0,C-D),M=Math.max(1,e.length-l),B=I?Math.floor(g/M*R):0;return Rn.createElement(Cr,{flexDirection:"row",height:i,width:"100%"},Rn.createElement(Cr,{flexDirection:"column",flexGrow:1,height:i},N),Rn.createElement(Cr,{flexDirection:"column",width:1,height:C},Array.from({length:C}).map((te,le)=>Rn.createElement(Id,{key:le,color:I&&le>=B&&le<B+D?w.accent:w.secondary},I?"\u2502":" "))))};import{Box as Tn,Text as Td}from"ink";import tt from"react";import{Text as Sd}from"ink";import Cd from"react";var Rd=e=>e.toLowerCase().trim(),bd=(e,t=Ze)=>{let n=Rd(e);return t[n]?t[n]:Bt(n)},An=({id:e,isSelected:t})=>{let n=E.getContributor(e);if(n)return Cd.createElement(Sd,{underline:t,color:bd(n.name)},"@"+n.name)};import{Text as Ad}from"ink";import wd from"react";var wn=({id:e,isSelected:t})=>{let n=E.getTag(e);if(n)return wd.createElement(Ad,{underline:t,backgroundColor:Ce(n.name),color:w.primary}," "+n.name+" ")};var bi=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=pn(gn(t.title),r),i=mr(t),d=pr(t);return tt.createElement(Tn,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?w.accent:w.secondary,justifyContent:"space-between"},tt.createElement(Tn,{borderBottom:!0},tt.createElement(Tn,{paddingLeft:1,flexDirection:"column"},tt.createElement(Td,{color:w.primary},o))),tt.createElement(Tn,{flexDirection:"row",paddingLeft:1},i.map(l=>tt.createElement(wn,{key:l.id,id:l.id})),d.map(l=>tt.createElement(An,{key:l.id,id:l.id}))))};import Md from"chalk";import{Box as Wt,Text as Rr}from"ink";import Le from"react";var Pd=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,Ai=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let i=(t.props.tags??[]).map(I=>E.getTag(I)).filter(I=>!!I),d=(t.props.assignees??[]).map(I=>E.getContributor(I)).filter(I=>!!I),l=1,u=i.length*(1+l),m=d.length*(2+l),g=i.map(I=>Le.createElement(Wt,{key:I.id,paddingRight:l},Le.createElement(Rr,{color:Ce(I.name)},"\u25A0"))),y=d.map(I=>Le.createElement(Wt,{key:I.id,paddingRight:l},Le.createElement(Rr,{color:Bt(I.name)},"@"+I.name.at(0)))),N=n?w.accent:o===p.MOVE?w.secondary:w.primary;return Le.createElement(Wt,{borderBottom:!0,justifyContent:"space-between"},Le.createElement(Wt,null,Le.createElement(ge,{isSelected:n,placeholder:Md.dim.gray(r+1+" ")}),Le.createElement(Rr,{wrap:"truncate",color:N},Pd(t.title,e-u-m-14))),Le.createElement(Wt,null,g,y))};import Ld from"chalk";var Dd=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:i,listSelectedIndex:d,mode:l})=>{let{renderedChildrenIndex:u}=Re(),m=u[e.id]??[],g=`${e.title} ${Ld.hex(w.secondary2).dim("("+m.length+")")}`,y=3,N=o?1:4,I=r-y-(o?2:1),C=be.createElement(br,{borderStyle:"round",borderColor:w.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},be.createElement(ge,{isSelected:t}),be.createElement(kd,{bold:!0,color:t?w.accent:w.primary},g," ",e.readonly?"\u{1F512}":"")),D=(R,M)=>{let B=i&&d===M;return o?be.createElement(Ai,{key:R.id,index:M,width:n,ticket:R,isSelected:B,mode:l}):be.createElement(bi,{key:R.id,width:n,ticket:R,isSelected:B})};return be.createElement(br,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?w.accent:w.secondary,paddingRight:1,paddingLeft:1,height:r},C,be.createElement(br,{padding:o?1:0},m.length>0&&be.createElement(bn,{selectedIndex:d,height:I,itemHeight:N},m.map(D)),be.createElement(ge,{isSelected:i&&d===-1})))},wi=be.memo(Dd);import{Box as Tr,Text as Wd}from"ink";import qe,{useMemo as Mi}from"react";import{decodeTime as Fd,encodeTime as Od}from"ulid";var Ud="0123456789ABCDEFGHJKMNPQRSTVWXYZ",Bd=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+=Ud[Number(n%32n)];return r},Ke=(e,t)=>{let n=Fd(e);return Od(n,10)+Bd(`${e}:${t}`)};import{Box as Mn,Text as _d}from"ink";import De from"react";var Ti=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:r}=Re(),{title:o}=t,i=t.parentNodeId?E.getNode(t.parentNodeId):void 0,d=i&&_(i)?o===G.ASSIGNEES?i.props.assignees??[]:o===G.TAGS?i.props.tags??[]:[]:[];return De.createElement(Mn,{alignItems:"center",paddingTop:1},De.createElement(Mn,{minWidth:12},De.createElement(ge,{isSelected:n}),De.createElement(_d,{color:n?w.accent:w.secondary2},o,":")),De.createElement(Mn,{flexDirection:"row",marginLeft:1,paddingRight:1},d.map((l,u)=>{let m=r.id===t.id&&u===e;return De.createElement(Mn,{key:`${o}-${l}`,paddingRight:2,minHeight:1},De.createElement(ge,{isSelected:m}),o===G.ASSIGNEES?De.createElement(An,{isSelected:m,id:l}):o===G.TAGS?De.createElement(wn,{isSelected:m,id:l}):null)})))};import{Box as Pn,Text as Ar}from"ink";import Fe,{useEffect as $d}from"react";var de={workspace:(e,t,n)=>({id:e,title:t,rank:n,isDeleted:!1,props:{},context:b.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:b.BOARD,childRenderAxis:"horizontal",parentNodeId:n,readonly:o,log:[]}),swimlane:(e,t,n,r)=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:b.SWIMLANE,childRenderAxis:"vertical",childNavigationAcrossParents:!0,parentNodeId:n,readonly:!1,log:[]}),field:({id:e,name:t,parentNodeId:n,rank:r,props:o={},childRenderAxis:i="horizontal",isVirtual:d=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:b.FIELD,childRenderAxis:i,parentNodeId:n,readonly:!1,log:[],isVirtual:d}),fieldList:({id:e,name:t,parentNodeId:n,rank:r,childRenderAxis:o="horizontal",isVirtual:i=!1})=>({id:e,title:t,rank:r,isDeleted:!1,props:{},context:b.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:b.TICKET,childRenderAxis:"vertical",parentNodeId:n,readonly:!1,log:[]}),text:({id:e,name:t,parentNodeId:n,rank:r,props:o={},readonly:i=!0,isVirtual:d=!0})=>({id:e,title:t,rank:r,isDeleted:!1,props:o,context:b.TEXT,childRenderAxis:"vertical",parentNodeId:n,readonly:i,log:[],isVirtual:d})};var wr=({id:e,label:t,text:n,height:r,selected:o,maxWidth:i})=>{let{selectedIndex:d,contextNode:l}=Re(),u=N=>String(N).replace(/\r?\n/g,""),m=typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[];$d(()=>{let N=[];return m.forEach((I,C)=>{let D=xe(BigInt(C+1));if(!wt(D))return;let R=de.text({id:`${e}-${C}`,name:`Line ${C+1}`,parentNodeId:e,rank:D.value,props:{value:I},readonly:!0,isVirtual:!0}),M=E.createNode(R);wt(M)&&N.push(M.value.id)}),()=>N.forEach(E.deleteNode)},[e,n]);let g="\u2029",y=m.map((N,I)=>{let C=l.id===e&&d===I;return Fe.createElement(Pn,{key:`${e}-${I}`},Fe.createElement(Ar,{color:C?w.primary:w.secondary2,dimColor:!C},`${I+1} `.padStart(5,"\xA0")),Fe.createElement(Ar,{backgroundColor:C?"gray":""},u(N.length?pn(N,i-10):g)))});return Fe.createElement(Pn,{flexDirection:"column",paddingTop:1},Fe.createElement(Pn,null,Fe.createElement(ge,{isSelected:o}),Fe.createElement(Ar,{color:o?w.accent:w.secondary2},t)),Fe.createElement(Pn,{flexDirection:"row",borderStyle:"round",borderColor:w.secondary,paddingLeft:1,marginLeft:1},Fe.createElement(bn,{scrollByOne:!0,children:y,height:r-2,selectedIndex:d,itemHeight:1})))};var jd=e=>Ke(e,"description"),Hd=e=>Ke(e,"history"),Pi=({ticket:e,height:t})=>{let{selectedIndex:n,contextNode:r}=Re(),o=process.stdout.columns||120,i=Mi(()=>jd(e.id),[e.id]),d=Mi(()=>Hd(e.id),[e.id]),l=r.id===e.id,u=r.id===d||r.parentNodeId===d,m=$(e.id);if(u){let R=E.getNode(d),M=R&&Be(R)?R.props.value??"":"",te=t-3;return qe.createElement(Tr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},R?qe.createElement(wr,{id:R.id,label:"Event log",text:M,selected:!1,maxWidth:o,height:te}):null)}let g=m.reduce((R,M)=>Tt(M)||M.id===d?R+1:R,0),y=2,N=3,I=g,C=t-N-I-y,D=(R,M)=>R.id===i?qe.createElement(wr,{key:R.id,id:i,label:"Description (press e to edit)",text:e.props.description??"",selected:M,maxWidth:o,height:C}):Tt(R)?qe.createElement(Ti,{key:R.id,parent:R,selected:M,selectedIndex:n}):R.id===d?qe.createElement(Tr,{key:R.id,paddingTop:1},qe.createElement(ge,{isSelected:M}),qe.createElement(Wd,{backgroundColor:w.secondary,color:M?w.accent:w.primary}," History \u203A\u203A ")):null;return qe.createElement(Tr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},m.map((R,M)=>D(R,l&&n===M)))};var Kd=({swimlanes:e,contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,viewMode:i,height:d,width:l})=>{let u=t.context,m=u===b.TICKET||u===b.FIELD_LIST||u===b.FIELD,g=u===b.BOARD||u===b.SWIMLANE,y=u===b.TICKET?t:r.find(R=>R.context===b.TICKET),N=Math.floor(l/3),I=Math.floor(l/Math.max(e.length,1)),C=Math.min(I,N),D=i==="dense";return kn.createElement(zd,{flexDirection:"row",height:d},g&&e.map((R,M)=>{let B=t.id===R.id,te=B?n:-1,le=t.context===b.BOARD&&n===M;return kn.createElement(wi,{key:R.id,height:d,width:C,swimlane:R,isSelected:le,isDense:D,isFocused:B,listSelectedIndex:te,mode:o})}),m&&y&&kn.createElement(Pi,{height:d,ticket:y}))},ki=kn.memo(Kd);import{render as Gd}from"ink";import{Writable as Yd}from"node:stream";var jt=e=>String(e).padStart(2,"0"),Xd=e=>{let t=e.getUTCFullYear(),n=jt(e.getUTCMonth()+1),r=jt(e.getUTCDate()),o=jt(e.getUTCHours()),i=jt(e.getUTCMinutes()),d=jt(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${i}-${d}`},Jd=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",Zd=async(e,{width:t,height:n})=>{let r="",o=new Yd({write(d,l,u){let m=Qd(d.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),u()}});o.columns=t,o.rows=n,o.isTTY=!0;let i=Gd(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(d=>setTimeout(d,0)),i.unmount(),r},Qd=e=>e.replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,""),Di=async()=>{let{viewMode:e}=K(),{contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:i}=v(),d=r.find(M=>M.context==="BOARD");if(!d)return s("No board found to export");let l=120,u=40,m=await Zd(Vd.createElement(ki,{height:u,width:l,swimlanes:(i[d.id]??[]).filter(M=>M!==void 0&&Qt(M)),contextNode:t,selectedIndex:n,breadCrumb:r,viewMode:e??"dense",mode:o}),{width:l,height:u});if(!m)return s("Failed to render board export");let g=rn(process.cwd());if(a(g))return s("Unable to export, epiq root not found");let y=new Date,N=Xd(y),I=`board_${Jd(d.title)}_${N}.md`,C=ko(g.value);Li.mkdirSync(C,{recursive:!0});let D=qd.join(C,I),R=`# Board - ${d.title}
23
23
  Date: ${y.toISOString()}
24
24
 
25
25
  \`\`\`text
26
26
  ${m}
27
27
  \`\`\`
28
- `;return Pi.writeFileSync($,S,"utf8"),c("Exported board layout",$)};var M={exit(){process.exit(0)},enterChildNode(){let e=v(),t=e.contextNode,n=Math.max(0,e.selectedIndex),r=j(t.id)[n];!r||t.context==="FIELD"||M.navigate({contextNode:r,selectedIndex:_(r.id).length?0:-1})},enterParentNode(){let{contextNode:e,nodes:t}=v();if(!e.parentNodeId){logger.info("Missing parent node id");return}let n=t[e.parentNodeId];if(!n){logger.error("Parent not found");return}let r=_(n.id),o=r.findIndex(({id:d})=>d===e.id),i=r.length===0?-1:o>=0?o:0;M.navigate({contextNode:n,selectedIndex:i})},navigateToNextItem:()=>Li(1),navigateToPreviousItem:()=>Li(-1),navigateToNextContainer:()=>Di(1),navigateToPreviousContainer:()=>Di(-1),navigate:({contextNode:e,selectedIndex:t})=>{E({contextNodeId:e.id,selectedIndex:t})}},Li=e=>{let{selectedIndex:t,contextNode:n}=v(),r=_(n.id).length;if(r===0)return;let i=(Math.max(0,t)+e+r)%r;M.navigate({selectedIndex:i,contextNode:n})},Di=e=>{let{contextNode:t,nodes:n,selectedIndex:r}=v();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!t||!o)return;let i=_(o.id),d=i.findIndex(h=>h.id===t.id);if(d<0)return;let l=i.at(d+e)??i.at(0);if(!l)return;let u=_(l.id),m=Math.max(0,u.length-1),p=Math.min(Math.max(0,r),m),y=u.length?p:-1;M.navigate({contextNode:l,selectedIndex:y})};import oc from"node:os";import Bi from"node:path";import{z as et}from"zod";import{accessSync as Jd,copyFileSync as Zd,existsSync as Mn,mkdirSync as Fi,readdirSync as Oi,readFileSync as Qd,renameSync as ec,rmSync as tc,statSync as Ui,unlinkSync as nc,writeFileSync as rc}from"node:fs";import xt from"node:path";var ue={writeToFile:(e,t)=>{try{let n=xt.dirname(e);Mn(n)||Fi(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);rc(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return Qd(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=ue.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 Mn(e)&&Ui(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await Jd(e),!0}catch{return!1}},mkDir:e=>Fi(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=xt.parse(t);for(;;){let r=xt.join(t,e);try{if(Mn(r)&&Ui(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=xt.dirname(t)}return null},readFirstJSON(e){try{if(!ue.dirExists(e))return null;let t=Oi(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=xt.join(e,t);return ue.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return ue.dirExists(e)?Oi(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{nc(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{tc(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(xt.dirname(t)),!n?.overwrite&&Mn(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{ec(e,t)}catch(r){if(r?.code==="EXDEV"){Zd(e,t),this.rmFile(e);return}throw r}}};var ic={userId:"",userName:"",preferredEditor:"",autoSync:!1},_i=et.object({preferredEditor:et.string().optional(),userName:et.string().optional(),userId:et.string().optional(),autoSync:et.boolean().nullable().optional(),autoSyncDebounceMs:et.number().optional(),viewMode:et.enum(["dense","wide"]).optional()}),sc="config.json",$i=()=>Bi.join(oc.homedir(),pe),Tr=()=>Bi.join($i(),sc),Mr=()=>{try{return ue.mkDir($i()),c(`Ensured ~/${pe} exists`,null)}catch{return s(`Unable to create ~/${pe}`)}},ac=e=>{let t;try{t=JSON.parse(e)}catch{return s(`Invalid ~/${pe}/config.json JSON`)}let n=_i.safeParse(t??{});return n.success?c("Parsed config",n.data):s(`Invalid ~/${pe}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},Wi=()=>{let e=Mr();if(a(e))return s(e.message);let t=Tr(),n=ue.readFile(t);return n==null||n.trim()===""?c("No config found, using empty config",{autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):ac(n)},ji=e=>{let t=Mr();if(a(t))return s(t.message);let n=_i.safeParse(e);if(!n.success)return s(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=Tr();try{return ue.writeToFile(r,JSON.stringify(n.data,null,2)+`
29
- `),c("Config written",null)}catch{return s(`Unable to write ~/${pe}/config.json`)}},tt=e=>{let t=Wi();if(a(t))return s("Failed to read existing config");let n={...t.value,...e};return ji(n)},Hi=()=>{let e=Tr(),t=Mr();if(a(t))return s(`Unable to create ~/${pe}`);if(!(ue.readFile(e)!==null)){let m=ji(ic);if(a(m))throw new Error(`Unable to create ~/${pe}/config.json`)}let r=Wi();if(a(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:i,userId:d,autoSync:l,autoSyncDebounceMs:u}=r.value;return!i||!d?s(`User name or ID not configured in ~/${pe}/config.json`):c("successfully loaded settings",{preferredEditor:o??"",userName:i,userId:d,autoSync:l??!1,autoSyncIntervalMs:u??1e4,viewMode:"dense"})};import yc from"node:fs";import xc from"node:path";import{decodeTime as hc,monotonicFactory as Ec}from"ulid";import{z as Wt}from"zod";import Pn from"node:fs";import kr from"node:path";import{decodeTime as dc}from"ulid";import{z as Pr}from"zod";var cc=Pr.object({userId:Pr.string().min(1).default("unknown"),userName:Pr.string().min(1).default("unknown")}),lc=e=>{let[t,n]=kr.basename(e,".jsonl").split("."),r=cc.safeParse({userId:t,userName:n});return r.success?c("Parsed event file actor",r.data):s(`Invalid event file name ${kr.basename(e)}: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},uc=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])},mc=(e,t)=>t in e,pc=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),gc=e=>{let{userId:t,userName:n,...r}=e,o=uc(r);if(a(o))return s(o.message);let i=o.value,d=e.id?.[0];return d?mc(r,i)?c("Decoded persisted event",pc({id:d,action:i,payload:r[i],userId:t,userName:n})):s(`Persisted event is missing payload for action: ${i}`):s("Persisted event is missing id")},fc=e=>{if(!Pn.existsSync(e))return c("Event file missing",[]);let t=lc(e);if(a(t))return s(t.message);let n=Pn.readFileSync(e,"utf8"),r=[];for(let o of n.split(`
30
- `)){let i=o.trim();if(!i)continue;let d;try{d=JSON.parse(i)}catch{return s(`Failed to parse event JSON from ${e}: ${i}`)}let l=Lr(d);if(a(l))return s(`${l.message} in ${e}: ${i}`);r.push({...l.value,userId:t.value.userId,userName:t.value.userName})}return c("Parsed persisted events file",r)};function zi(e){let t=Dt(e);if(!Pn.existsSync(t))return c("No events found",[]);let n=Pn.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>kr.join(t,o)),r=[];for(let o of n){let i=fc(o);if(a(i))return s(i.message);r.push(...i.value)}return c("All events loaded",vc(r))}function ht(e){let t=zi(e);if(a(t))return s(t.message);let n=[];for(let r of t.value){let o=gc(r);if(a(o))return s(`Failed to decode event ${r.id?.[0]??"<unknown>"}: ${o.message}`);n.push(o.value)}return c("Loaded merged events",n)}function Ki(e=process.cwd()){let t=zi(e);return a(t)?s(t.message):c("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var vc=e=>{let t=new Map,n=new Map;for(let m of e){let p=m.id[0],y=m.id[1]??null;t.set(p,m);let h=n.get(y)??[];h.push(m),n.set(y,h)}for(let m of n.values())m.sort((p,y)=>p.id[0].localeCompare(y.id[0]));let r=[],o=new Set,i=m=>{let p=m.id[0];if(o.has(p))return;r.push(m),o.add(p);let y=n.get(p)??[];for(let h of y)i(h)},d=n.get(null)??[];for(let m of d)i(m);let l=e.filter(m=>{let p=m.id[0],y=m.id[1]??null;return!o.has(p)&&y!==null&&!t.has(y)}).sort((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of l)i(m);let u=e.filter(m=>!o.has(m.id[0])).sort((m,p)=>m.id[0].localeCompare(p.id[0]));for(let m of u)i(m);return r},qi=(e,t)=>{let n=e.findIndex(r=>{try{return dc(r.id)>t}catch{return!0}});return n===-1?{appliedEvents:e,unappliedEvents:[]}:{appliedEvents:e.slice(0,n),unappliedEvents:e.slice(n)}};var Vi=e=>({action:e.action,payload:e.payload});var Yi=1,Gi=Ec(),Nc=Wt.tuple([Wt.string().min(1),Wt.string().min(1).nullable()]),Ic=Wt.looseObject({v:Wt.literal(Yi),id:Nc}),Lr=e=>{let t=Ic.safeParse(e);return t.success?c("Parsed persisted event",t.data):s(`Invalid persisted event: ${t.error.issues.map(n=>n.path.join(".")||n.message).join(", ")}`)},kn=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",q=()=>{let{userName:e,userId:t}=K();return e?t?e.trim()?c("Successfully resolved actor ID",{userId:kn(t),userName:kn(e)}):s("Unable to resolve actor ID from settings or OS user info"):s("User ID not configured"):s("User name not configured")},nt=({userId:e,userName:t})=>`${kn(e)}.${kn(t)}.jsonl`,Sc=(e,{userId:t,userName:n})=>{let r=nt({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r))return s(`Invalid event log file name: ${r}`);let i=xc.join(Dt(e),r);return c("Successfully resolved event log path",i)},Cc=(e,t)=>{let n={[e.action]:e.payload,v:Yi,id:t};return Lr(n)};function Ln({event:e,rootDir:t}){try{let n=Po(t);if(a(n))return n;let r=Sc(t,{userId:e.userId,userName:e.userName});if(a(r))return r;let o=Ki(t);if(a(o))return s(o.message);let i=o.value?Gi(Math.max(Date.now(),hc(o.value)+1)):Gi(),d=Cc(Vi(e),[i,o.value]);return a(d)?s(d.message):(yc.appendFileSync(r.value,`${JSON.stringify(d.value)}
31
- `,"utf8"),c("Event persisted",{path:r.value,entry:d.value}))}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return s(`Failed to persist event: ${r}`)}}var Xi=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 bc=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[re,Dn]=bc;import{ulid as Pc}from"ulid";import{spawnSync as Rc}from"node:child_process";import Ac from"node:os";import Ji from"node:path";import{ulid as wc}from"ulid";function Tc(){let{preferredEditor:e}=K(),t=[e,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function Mc(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function Zi(e){let t=Ji.join(Ac.tmpdir(),"epiq");ue.mkDir(t);let n=Ji.join(t,wc());ue.writeToFile(n,e??"");let r=Tc();for(let o of r){let i=Mc(o,n),d=Rc(i,{stdio:"inherit",shell:!0});if(!d.error&&d.status===0){let l=ue.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 Qi=async()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let t=await he();if(a(t))return t;let n=t.value,{breadCrumb:r,selectedNode:o}=v(),i=Se([...r,o],"TICKET");if(a(i))return s("Edit target must be an issue");let d=i.value;if(!O(d))return s("Edit target must be an issue");if(d.readonly)return s("Cannot edit readonly issue");let l=_(d.id).find(y=>y.title===G.DESCRIPTION);if(!l)return s("No target found");if(l.readonly)return s("Cannot edit readonly field");let u=d.props.description??"";if(typeof u!="string")return s("Selected field is not editable text");let m=Zi(u);if(a(m))return s("Failed to edit field");let p=m.value;return p===u?c("No changes made",null):Ee({id:Pc(),action:"edit.description",payload:{id:d.id,md:p},...e.value},n)};import jc from"node:fs";import ss from"node:path";import Dr from"node:fs";import kc from"node:path";var es=async e=>{let t=kc.join(e,".gitignore"),n=Dr.existsSync(t)?Dr.readFileSync(t,"utf8"):"",r=[".epiq/events/",".epiq/log/"],o=n.split(`
28
+ `;return Li.writeFileSync(D,R,"utf8"),c("Exported board layout",D)};var A={exit(){process.exit(0)},enterChildNode(){let e=v(),t=e.contextNode,n=Math.max(0,e.selectedIndex),r=j(t.id)[n];!r||t.context==="FIELD"||A.navigate({contextNode:r,selectedIndex:$(r.id).length?0:-1})},enterParentNode(){let{contextNode:e,nodes:t}=v();if(!e.parentNodeId){logger.info("Missing parent node id");return}let n=t[e.parentNodeId];if(!n){logger.error("Parent not found");return}let r=$(n.id),o=r.findIndex(({id:d})=>d===e.id),i=r.length===0?-1:o>=0?o:0;A.navigate({contextNode:n,selectedIndex:i})},navigateToNextItem:()=>Fi(1),navigateToPreviousItem:()=>Fi(-1),navigateToNextContainer:()=>Oi(1),navigateToPreviousContainer:()=>Oi(-1),navigate:({contextNode:e,selectedIndex:t})=>{h({contextNodeId:e.id,selectedIndex:t})}},Fi=e=>{let{selectedIndex:t,contextNode:n}=v(),r=$(n.id).length;if(r===0)return;let i=(Math.max(0,t)+e+r)%r;A.navigate({selectedIndex:i,contextNode:n})},Oi=e=>{let{contextNode:t,nodes:n,selectedIndex:r}=v();if(!t.childNavigationAcrossParents)return;if(!t.parentNodeId){logger.error("Missing parent node id");return}let o=n[t.parentNodeId];if(!t||!o)return;let i=$(o.id),d=i.findIndex(N=>N.id===t.id);if(d<0)return;let l=i.at(d+e)??i.at(0);if(!l)return;let u=$(l.id),m=Math.max(0,u.length-1),g=Math.min(Math.max(0,r),m),y=u.length?g:-1;A.navigate({contextNode:l,selectedIndex:y})};import ac from"node:os";import $i from"node:path";import{z as nt}from"zod";import{accessSync as ec,copyFileSync as tc,existsSync as Ln,mkdirSync as Ui,readdirSync as Bi,readFileSync as nc,renameSync as rc,rmSync as oc,statSync as _i,unlinkSync as ic,writeFileSync as sc}from"node:fs";import ht from"node:path";var ue={writeToFile:(e,t)=>{try{let n=ht.dirname(e);Ln(n)||Ui(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);sc(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return nc(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=ue.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 Ln(e)&&_i(e).isDirectory()}catch{return!1}},async fileExists(e){try{return await ec(e),!0}catch{return!1}},mkDir:e=>Ui(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=ht.parse(t);for(;;){let r=ht.join(t,e);try{if(Ln(r)&&_i(r).isDirectory())return r}catch{logger.error(`Unable to locate folder ${e}`)}if(t===n)break;t=ht.dirname(t)}return null},readFirstJSON(e){try{if(!ue.dirExists(e))return null;let t=Bi(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=ht.join(e,t);return ue.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return ue.dirExists(e)?Bi(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{ic(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{oc(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(ht.dirname(t)),!n?.overwrite&&Ln(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{rc(e,t)}catch(r){if(r?.code==="EXDEV"){tc(e,t),this.rmFile(e);return}throw r}}};var dc={userId:"",userName:"",preferredEditor:"",autoSync:!1},Wi=nt.object({preferredEditor:nt.string().optional(),userName:nt.string().optional(),userId:nt.string().optional(),autoSync:nt.boolean().nullable().optional(),autoSyncDebounceMs:nt.number().optional(),viewMode:nt.enum(["dense","wide"]).optional()}),cc="config.json",ji=()=>$i.join(ac.homedir(),pe),Mr=()=>$i.join(ji(),cc),Pr=()=>{try{return ue.mkDir(ji()),c(`Ensured ~/${pe} exists`,null)}catch{return s(`Unable to create ~/${pe}`)}},lc=e=>{let t;try{t=JSON.parse(e)}catch{return s(`Invalid ~/${pe}/config.json JSON`)}let n=Wi.safeParse(t??{});return n.success?c("Parsed config",n.data):s(`Invalid ~/${pe}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},Hi=()=>{let e=Pr();if(a(e))return s(e.message);let t=Mr(),n=ue.readFile(t);return n==null||n.trim()===""?c("No config found, using empty config",{autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):lc(n)},zi=e=>{let t=Pr();if(a(t))return s(t.message);let n=Wi.safeParse(e);if(!n.success)return s(`Invalid config: ${n.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`);let r=Mr();try{return ue.writeToFile(r,JSON.stringify(n.data,null,2)+`
29
+ `),c("Config written",null)}catch{return s(`Unable to write ~/${pe}/config.json`)}},rt=e=>{let t=Hi();if(a(t))return s("Failed to read existing config");let n={...t.value,...e};return zi(n)},Ki=()=>{let e=Mr(),t=Pr();if(a(t))return s(`Unable to create ~/${pe}`);if(!(ue.readFile(e)!==null)){let m=zi(dc);if(a(m))throw new Error(`Unable to create ~/${pe}/config.json`)}let r=Hi();if(a(r))throw new Error(r.message||"Unable to load settings");let{preferredEditor:o,userName:i,userId:d,autoSync:l,autoSyncDebounceMs:u}=r.value;return!i||!d?s(`User name or ID not configured in ~/${pe}/config.json`):c("successfully loaded settings",{preferredEditor:o??"",userName:i,userId:d,autoSync:l??!1,autoSyncIntervalMs:u??1e4,viewMode:"dense"})};import Nc from"node:fs";import Ic from"node:path";import{decodeTime as Sc,monotonicFactory as Cc}from"ulid";import{z as Ht}from"zod";import Dn from"node:fs";import Lr from"node:path";import{decodeTime as uc}from"ulid";import{z as kr}from"zod";var mc=kr.object({userId:kr.string().min(1).default("unknown"),userName:kr.string().min(1).default("unknown")}),pc=e=>{let[t,n]=Lr.basename(e,".jsonl").split("."),r=mc.safeParse({userId:t,userName:n});return r.success?c("Parsed event file actor",r.data):s(`Invalid event file name ${Lr.basename(e)}: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},gc=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])},fc=(e,t)=>t in e,vc=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),yc=e=>{let{userId:t,userName:n,...r}=e,o=gc(r);if(a(o))return s(o.message);let i=o.value,d=e.id?.[0];return d?fc(r,i)?c("Decoded persisted event",vc({id:d,action:i,payload:r[i],userId:t,userName:n})):s(`Persisted event is missing payload for action: ${i}`):s("Persisted event is missing id")},Dr=e=>{let t=[];for(let n of e){let r=yc(n);if(a(r))return s(`Failed to decode event ${n.id?.[0]??"<unknown>"}: ${r.message}`);t.push(r.value)}return c("Decoded reconstructed events",t)},xc=e=>{if(!Dn.existsSync(e))return c("Event file missing",[]);let t=pc(e);if(a(t))return s(t.message);let n=Dn.readFileSync(e,"utf8"),r=[];for(let o of n.split(`
30
+ `)){let i=o.trim();if(!i)continue;let d;try{d=JSON.parse(i)}catch{return s(`Failed to parse event JSON from ${e}: ${i}`)}let l=Or(d);if(a(l))return s(`${l.message} in ${e}: ${i}`);r.push({...l.value,userId:t.value.userId,userName:t.value.userName})}return c("Parsed persisted events file",r)};function Fr(e){let t=Ot(e);if(!Dn.existsSync(t))return c("No events found",[]);let n=Dn.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>Lr.join(t,o)),r=[];for(let o of n){let i=xc(o);if(a(i))return s(i.message);r.push(...i.value)}return c("All events loaded",hc(r))}function Et(e){let t=Fr(e);return a(t)?s(t.message):Dr(t.value)}function qi(e,t){let n=Fr(e);if(a(n))return s(n.message);let{appliedEvents:r,unappliedEvents:o}=Ec(n.value,t),i=Dr(r);if(a(i))return s(i.message);let d=Dr(o);return a(d)?s(d.message):c("Loaded merged events before time",{appliedEvents:i.value,unappliedEvents:d.value})}function Vi(e=process.cwd()){let t=Fr(e);return a(t)?s(t.message):c("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var hc=e=>{let t=new Map,n=new Map;for(let m of e){let g=m.id[0],y=m.id[1]??null;t.set(g,m);let N=n.get(y)??[];N.push(m),n.set(y,N)}for(let m of n.values())m.sort((g,y)=>g.id[0].localeCompare(y.id[0]));let r=[],o=new Set,i=m=>{let g=m.id[0];if(o.has(g))return;r.push(m),o.add(g);let y=n.get(g)??[];for(let N of y)i(N)},d=n.get(null)??[];for(let m of d)i(m);let l=e.filter(m=>{let g=m.id[0],y=m.id[1]??null;return!o.has(g)&&y!==null&&!t.has(y)}).sort((m,g)=>m.id[0].localeCompare(g.id[0]));for(let m of l)i(m);let u=e.filter(m=>!o.has(m.id[0])).sort((m,g)=>m.id[0].localeCompare(g.id[0]));for(let m of u)i(m);return r},Ec=(e,t)=>{let n=new Set,r=[],o=[];for(let i of e){let d=i.id[0],l=i.id[1],u=!1;try{u=uc(d)<t}catch{u=!1}!u||l&&n.has(l)?(n.add(d),o.push(i)):r.push(i)}return{appliedEvents:r,unappliedEvents:o}};var Gi=e=>({action:e.action,payload:e.payload});var Xi=1,Yi=Cc(),Rc=Ht.tuple([Ht.string().min(1),Ht.string().min(1).nullable()]),bc=Ht.looseObject({v:Ht.literal(Xi),id:Rc}),Or=e=>{let t=bc.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(", ")}`)},Fn=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown",q=()=>{let{userName:e,userId:t}=K();return e?t?e.trim()?c("Successfully resolved actor ID",{userId:Fn(t),userName:Fn(e)}):s("Unable to resolve actor ID from settings or OS user info"):s("User ID not configured"):s("User name not configured")},ot=({userId:e,userName:t})=>`${Fn(e)}.${Fn(t)}.jsonl`,Ac=(e,{userId:t,userName:n})=>{let r=ot({userId:t,userName:n});if(!/^(?!.*\.jsonl.*\.jsonl).*\.jsonl$/.test(r))return s(`Invalid event log file name: ${r}`);let i=Ic.join(Ot(e),r);return c("Successfully resolved event log path",i)},wc=(e,t)=>{let n={[e.action]:e.payload,v:Xi,id:t};return Or(n)};function On({event:e,rootDir:t}){try{let n=Lo(t);if(a(n))return n;let r=Ac(t,{userId:e.userId,userName:e.userName});if(a(r))return r;let o=Vi(t);if(a(o))return s(o.message);let i=o.value?Yi(Math.max(Date.now(),Sc(o.value)+1)):Yi(),d=wc(Gi(e),[i,o.value]);return a(d)?s(d.message):(Nc.appendFileSync(r.value,`${JSON.stringify(d.value)}
31
+ `,"utf8"),c("Event persisted",{path:r.value,entry:d.value}))}catch(n){let r=n instanceof Error?n.message:"Unknown persist error";return s(`Failed to persist event: ${r}`)}}var Ji=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 Tc=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[re,Un]=Tc;import{ulid as Fc}from"ulid";import{spawnSync as Mc}from"node:child_process";import Pc from"node:os";import Zi from"node:path";import{ulid as kc}from"ulid";function Lc(){let{preferredEditor:e}=K(),t=[e,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function Dc(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function Qi(e){let t=Zi.join(Pc.tmpdir(),"epiq");ue.mkDir(t);let n=Zi.join(t,kc());ue.writeToFile(n,e??"");let r=Lc();for(let o of r){let i=Dc(o,n),d=Mc(i,{stdio:"inherit",shell:!0});if(!d.error&&d.status===0){let l=ue.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 es=async()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let t=await he();if(a(t))return t;let n=t.value,{breadCrumb:r,selectedNode:o}=v(),i=Se([...r,o],"TICKET");if(a(i))return s("Edit target must be an issue");let d=i.value;if(!_(d))return s("Edit target must be an issue");if(d.readonly)return s("Cannot edit readonly issue");let l=$(d.id).find(y=>y.title===G.DESCRIPTION);if(!l)return s("No target found");if(l.readonly)return s("Cannot edit readonly field");let u=d.props.description??"";if(typeof u!="string")return s("Selected field is not editable text");let m=Qi(u);if(a(m))return s("Failed to edit field");let g=m.value;return g===u?c("No changes made",null):Ee({id:Fc(),action:"edit.description",payload:{id:d.id,md:g},...e.value},n)};import qc from"node:fs";import as from"node:path";import Ur from"node:fs";import Oc from"node:path";var ts=async e=>{let t=Oc.join(e,".gitignore"),n=Ur.existsSync(t)?Ur.readFileSync(t,"utf8"):"",r=[".epiq/events/",".epiq/log/"],o=n.split(`
32
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(`
33
33
  `);return n=n.trimEnd()+`
34
34
 
35
35
  ${l}
36
- `,Dr.writeFileSync(t,n,"utf8"),ne.info(`Added ${i.join(", ")} to .gitignore (epiq local state)`),c("Local epiq paths ignored",!0)};import Et from"node:fs";import jt from"node:path";var ns=async e=>{if((await me({args:["rev-parse","--verify","HEAD"],cwd:e})).exitCode===0)return c("Initial commit already exists",!1);ne.info("Creating initial commit");let n=await z.commit({cwd:e,message:"Initial commit",allowEmpty:!0});return a(n)?s(n.message):c("Created initial commit",!0)},ts=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",Lc=async e=>{let t=await rn(e);if(a(t))return s(t.message);let n=await xo(e);return a(n)?s(n.message):c("Built sync commit message",`[epiq:sync:${ts(t.value)}:${ts(n.value)}]`)},Fr=async({repoRoot:e,stateBranchName:t})=>{ne.info(`Creating ${t}`);let n=await D({args:["commit-tree",bo,"-m","[epiq:init-state-branch]"],cwd:e});if(a(n))return s(`Failed to create state branch commit
37
- ${n.message}`);let r=n.value.stdout.trim(),o=await D({args:["update-ref",`refs/heads/${t}`,r],cwd:e});return a(o)?s(`Failed to create ${t}
38
- ${o.message}`):c("Created state branch",!0)},Dc=async({repoRoot:e,stateBranchName:t})=>{let n=await rr({repoRoot:e});if(a(n))return s(`Ensure local state branch failed
39
- `+n.message);let r=n.value,o=r?await Pt({repoRoot:e,branch:t}):c("No remote, no remote state branch",!1);if(a(o))return s(`Ensure local state branch failed
36
+ `,Ur.writeFileSync(t,n,"utf8"),ne.info(`Added ${i.join(", ")} to .gitignore (epiq local state)`),c("Local epiq paths ignored",!0)};import Nt from"node:fs";import zt from"node:path";var rs=async e=>{if((await me({args:["rev-parse","--verify","HEAD"],cwd:e})).exitCode===0)return c("Initial commit already exists",!1);ne.info("Creating initial commit");let n=await z.commit({cwd:e,message:"Initial commit",allowEmpty:!0});return a(n)?s(n.message):c("Created initial commit",!0)},ns=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",Uc=async e=>{let t=await dn(e);if(a(t))return s(t.message);let n=await Eo(e);return a(n)?s(n.message):c("Built sync commit message",`[epiq:sync:${ns(t.value)}:${ns(n.value)}]`)},Br=async({repoRoot:e,stateBranchName:t})=>{ne.info(`Creating ${t}`);let n=await F({args:["commit-tree",Ao,"-m","[epiq:init-state-branch]"],cwd:e});if(a(n))return s(`Failed to create state branch commit
37
+ ${n.message}`);let r=n.value.stdout.trim(),o=await F({args:["update-ref",`refs/heads/${t}`,r],cwd:e});return a(o)?s(`Failed to create ${t}
38
+ ${o.message}`):c("Created state branch",!0)},Bc=async({repoRoot:e,stateBranchName:t})=>{let n=await or({repoRoot:e});if(a(n))return s(`Ensure local state branch failed
39
+ `+n.message);let r=n.value,o=r?await Lt({repoRoot:e,branch:t}):c("No remote, no remote state branch",!1);if(a(o))return s(`Ensure local state branch failed
40
40
  `+o.message);let i=o.value;if(r&&i){let l=await z.fetch({cwd:e,remote:ie,branch:t});if(a(l))return s(`Failed to fetch ${t} from remote
41
- ${l.message}`)}let d=await nn({repoRoot:e,branch:t});if(a(d))return s(`Ensure local state branch failed
42
- `+d.message);if(d.value)return c("Local state branch already exists",!1);if(i){let l=await D({args:["branch","--track",t,`${ie}/${t}`],cwd:e});return a(l)?s(`Failed to create local ${t} from remote
43
- ${l.message}`):c("Created local state branch from remote",!0)}return Fr({repoRoot:e,stateBranchName:t})},Fc=async({repoRoot:e,branch:t})=>{let n=await D({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return s(n.message);let r=n.value.stdout.split(`
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)},Oc=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=kt(jt.dirname(t));if(a(r))return s(`Failed to create state branch worktree
45
- `+r.message);Et.existsSync(t)&&!Et.existsSync(jt.join(t,".git"))&&(ne.info("Removing broken state branch worktree path"),Ao(t)),ne.info("Creating state branch worktree");let o=await z.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return a(o)?s(`Failed to create state branch worktree
46
- ${o.message}`):c("Created state branch worktree",!0)},Or=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await Fc({repoRoot:e,branch:n});if(a(r))return s(r.message);let o=jt.resolve(t),i=r.value?jt.resolve(r.value):null;if(i&&i===o&&Et.existsSync(i))return c("State branch already checked out in expected worktree",!1);if(i&&i!==o){ne.info("Moving state branch worktree to expected location");let u=await z.worktreeRemove({cwd:e,worktreeRoot:i});if(a(u))return s(`Failed to remove existing state branch worktree
47
- ${u.message}`)}if(i&&!Et.existsSync(i)){ne.info("Pruning stale state branch worktree");let u=await z.worktreePrune({cwd:e});if(a(u))return s(`Failed to prune stale worktrees
48
- ${u.message}`)}let d=await yo({repoRoot:e,worktreeRoot:t});if(a(d))return s(d.message);let l=Et.existsSync(t);if(d.value&&l)return c("State branch worktree already exists",!1);if(d.value&&!l){ne.info("Pruning missing registered state branch worktree");let u=await z.worktreePrune({cwd:e});if(a(u))return s(`Failed to prune stale worktrees
49
- ${u.message}`)}return Oc({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},Uc=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await rn(e);if(a(n))return s(n.message);if(n.value===t)return c("State branch already checked out",!1);(await me({cwd:e,args:["rebase","--abort"]})).exitCode===0&&ne.info("Aborted stale state branch rebase");let o=await z.checkout({cwd:e,branch:t});return a(o)?s(`Failed to checkout ${t}
50
- ${o.message}`):c("Checked out state branch",!0)},Bc=async({repoRoot:e,stateBranchRoot:t})=>{let n=await or(t);if(a(n))return s(n.message);if(n.value)return c("State branch upstream already configured",!1);let r=await rr({repoRoot:t});if(a(r))return s(r.message);if(!r.value)return c("No remote available for state branch upstream",!1);let o=Ge(e);if(a(o))return o;let i=o.value,d=await Pt({repoRoot:t,branch:i});if(a(d))return s(d.message);if(!d.value)return c("Remote state branch missing; upstream will be configured on first push",!1);ne.info(`Configuring ${i} upstream`);let l=await z.fetch({cwd:t,remote:ie,branch:i});if(a(l))return s(`Failed to fetch ${i}
41
+ ${l.message}`)}let d=await an({repoRoot:e,branch:t});if(a(d))return s(`Ensure local state branch failed
42
+ `+d.message);if(d.value)return c("Local state branch already exists",!1);if(i){let l=await F({args:["branch","--track",t,`${ie}/${t}`],cwd:e});return a(l)?s(`Failed to create local ${t} from remote
43
+ ${l.message}`):c("Created local state branch from remote",!0)}return Br({repoRoot:e,stateBranchName:t})},_c=async({repoRoot:e,branch:t})=>{let n=await F({args:["worktree","list","--porcelain"],cwd:e});if(a(n))return s(n.message);let r=n.value.stdout.split(`
44
+ `),o=null;for(let i of r){if(i.startsWith("worktree ")){o=i.slice(9);continue}if(i===`branch refs/heads/${t}`&&o)return c("Found worktree for branch",o)}return c("No worktree found for branch",null)},$c=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=Dt(zt.dirname(t));if(a(r))return s(`Failed to create state branch worktree
45
+ `+r.message);Nt.existsSync(t)&&!Nt.existsSync(zt.join(t,".git"))&&(ne.info("Removing broken state branch worktree path"),To(t)),ne.info("Creating state branch worktree");let o=await z.worktreeAdd({cwd:e,worktreeRoot:t,branch:n});return a(o)?s(`Failed to create state branch worktree
46
+ ${o.message}`):c("Created state branch worktree",!0)},_r=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=await _c({repoRoot:e,branch:n});if(a(r))return s(r.message);let o=zt.resolve(t),i=r.value?zt.resolve(r.value):null;if(i&&i===o&&Nt.existsSync(i))return c("State branch already checked out in expected worktree",!1);if(i&&i!==o){ne.info("Moving state branch worktree to expected location");let u=await z.worktreeRemove({cwd:e,worktreeRoot:i});if(a(u))return s(`Failed to remove existing state branch worktree
47
+ ${u.message}`)}if(i&&!Nt.existsSync(i)){ne.info("Pruning stale state branch worktree");let u=await z.worktreePrune({cwd:e});if(a(u))return s(`Failed to prune stale worktrees
48
+ ${u.message}`)}let d=await ho({repoRoot:e,worktreeRoot:t});if(a(d))return s(d.message);let l=Nt.existsSync(t);if(d.value&&l)return c("State branch worktree already exists",!1);if(d.value&&!l){ne.info("Pruning missing registered state branch worktree");let u=await z.worktreePrune({cwd:e});if(a(u))return s(`Failed to prune stale worktrees
49
+ ${u.message}`)}return $c({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},Wc=async({stateBranchRoot:e,stateBranchName:t})=>{let n=await dn(e);if(a(n))return s(n.message);if(n.value===t)return c("State branch already checked out",!1);(await me({cwd:e,args:["rebase","--abort"]})).exitCode===0&&ne.info("Aborted stale state branch rebase");let o=await z.checkout({cwd:e,branch:t});return a(o)?s(`Failed to checkout ${t}
50
+ ${o.message}`):c("Checked out state branch",!0)},jc=async({repoRoot:e,stateBranchRoot:t})=>{let n=await ir(t);if(a(n))return s(n.message);if(n.value)return c("State branch upstream already configured",!1);let r=await or({repoRoot:t});if(a(r))return s(r.message);if(!r.value)return c("No remote available for state branch upstream",!1);let o=Xe(e);if(a(o))return o;let i=o.value,d=await Lt({repoRoot:t,branch:i});if(a(d))return s(d.message);if(!d.value)return c("Remote state branch missing; upstream will be configured on first push",!1);ne.info(`Configuring ${i} upstream`);let l=await z.fetch({cwd:t,remote:ie,branch:i});if(a(l))return s(`Failed to fetch ${i}
51
51
  ${l.message}`);let u=await z.setUpstream({cwd:t,branch:i,upstream:`${ie}/${i}`});return a(u)?s(`Failed to set state branch upstream
52
- ${u.message}`):c("Configured state branch upstream",!0)},Fn=async({stateBranchRoot:e,eventFileName:t})=>{let n=Ye(t),r=jt.join(e,n);if(!Et.existsSync(r))return c("No event file to stage",void 0);let o=await z.stage({cwd:e,pathspec:[n]});return a(o)?s(`Failed to stage state branch event file
53
- ${o.message}`):c("Staged state branch event file",void 0)},rs=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Lc(e);return a(n)?s(`Create state branch sync commit failed
54
- `+n.message):mt({cwd:t,message:n.value})},Ht=async({repoRoot:e,stateBranchRoot:t})=>{let n=await or(t);if(a(n))return s(n.message);let r=Ge(e);if(a(r))return r;let o=r.value,i=n.value?await z.push({cwd:t}):await z.push({cwd:t,remote:ie,branch:o,setUpstream:!0});return a(i)?s(`Failed during state branch push
55
- ${i.message}`):c("Pushed state branch",!0)},os=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=Ge(e);if(a(o))return o;let i=o.value,d=[an(),await Dc({repoRoot:e,stateBranchName:i}),await Or({repoRoot:e,stateBranchRoot:t,stateBranchName:i}),await Uc({stateBranchRoot:t,stateBranchName:i}),await To(t),n?await Bc({stateBranchRoot:t,repoRoot:e}):c("Skipped state branch upstream bootstrap",!1)];for(let l of d){if(a(l))return s(l.message);r=r||!!l.value}return c(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",r)};import{monotonicFactory as _c,ulid as Oe}from"ulid";var zt=_c();function $c(){let e=Ie();if(a(e))return s("Unable to boot. State not initialized");let t=e.value,n=Object.values(t.nodes).find(i=>i.context==="WORKSPACE");if(!n)throw new Error("No workspace found in event log");let[r]=_(n.id),[o]=r?_(r.id):[];if(o){let i=t.renderedChildrenIndex?.[o.id]??[];return c("Resolved boot nav target",{contextNode:o,selectedIndex:i.length>0?0:-1})}else return r?c("Resolved boot nav target",{contextNode:r,selectedIndex:0}):n?c("Resolved boot nav target",{contextNode:n,selectedIndex:0}):c("Resolved boot nav target",{contextNode:t.nodes[t.rootNodeId],selectedIndex:0})}function Wc(){let e=$c();return a(e)?e:M.navigate(e.value)}function is({userId:e,userName:t}){let n=zt(),r=zt(),o=zt(),i=zt(),d=zt(),l=oe(void 0,void 0);if(a(l))return l;let u=oe(void 0,void 0);if(a(u))return u;let m=oe(u.value,void 0);if(a(m))return m;let p=oe(void 0,void 0);if(a(p))return p;let y=oe(p.value,void 0);if(a(y))return y;let h=oe(y.value,void 0);if(a(h))return h;let I=oe(void 0,void 0);return a(I)?I:c("Created default events",[{id:Oe(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:l.value}},{id:Oe(),userId:e,userName:t,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:u.value}},{id:Oe(),userId:e,userName:t,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:p.value}},{id:Oe(),userId:e,userName:t,action:"add.swimlane",payload:{id:i,name:"In progress",parent:r,rank:y.value}},{id:Oe(),userId:e,userName:t,action:"add.swimlane",payload:{id:d,name:"Done",parent:r,rank:h.value}},{id:Oe(),userId:e,userName:t,action:"add.board",payload:{id:Dn,name:"Closed",parent:n,rank:m.value}},{id:Oe(),userId:e,userName:t,action:"add.swimlane",payload:{id:re,name:"Closed",parent:Dn,rank:I.value}},{id:Oe(),userId:e,userName:t,action:"lock.node",payload:{id:Dn}},{id:Oe(),userId:e,userName:t,action:"lock.node",payload:{id:re}}])}function On(e){if(!e.length){let r=de.workspace("temporary-uninitialized-workspace","Workspace","a0"),o=Kt(r);return a(o)?o:(E({hasProjectDefinition:!1,mode:g.DEFAULT}),c("Booted uninitialized workspace placeholder",null))}if(!e.some(r=>r.action==="init.workspace"))return s("Initialized Epiq project has no workspace init event");let n=rt(e).filter(a);return n.length>0?s(`Materializing failed:
52
+ ${u.message}`):c("Configured state branch upstream",!0)},Bn=async({stateBranchRoot:e,eventFileName:t})=>{let n=Je(t),r=zt.join(e,n);if(!Nt.existsSync(r))return c("No event file to stage",void 0);let o=await z.stage({cwd:e,pathspec:[n]});return a(o)?s(`Failed to stage state branch event file
53
+ ${o.message}`):c("Staged state branch event file",void 0)},os=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Uc(e);return a(n)?s(`Create state branch sync commit failed
54
+ `+n.message):pt({cwd:t,message:n.value})},Kt=async({repoRoot:e,stateBranchRoot:t})=>{let n=await ir(t);if(a(n))return s(n.message);let r=Xe(e);if(a(r))return r;let o=r.value,i=n.value?await z.push({cwd:t}):await z.push({cwd:t,remote:ie,branch:o,setUpstream:!0});return a(i)?s(`Failed during state branch push
55
+ ${i.message}`):c("Pushed state branch",!0)},is=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=Xe(e);if(a(o))return o;let i=o.value,d=[ln(),await Bc({repoRoot:e,stateBranchName:i}),await _r({repoRoot:e,stateBranchRoot:t,stateBranchName:i}),await Wc({stateBranchRoot:t,stateBranchName:i}),await Po(t),n?await jc({stateBranchRoot:t,repoRoot:e}):c("Skipped state branch upstream bootstrap",!1)];for(let l of d){if(a(l))return s(l.message);r=r||!!l.value}return c(n?"Bootstrapped state storage":"Bootstrapped state storage readonly",r)};import{monotonicFactory as Hc,ulid as Oe}from"ulid";var qt=Hc();function zc(){let e=Ie();if(a(e))return s("Unable to boot. State not initialized");let t=e.value,n=Object.values(t.nodes).find(i=>i.context==="WORKSPACE");if(!n)throw new Error("No workspace found in event log");let[r]=$(n.id),[o]=r?$(r.id):[];if(o){let i=t.renderedChildrenIndex?.[o.id]??[];return c("Resolved boot nav target",{contextNode:o,selectedIndex:i.length>0?0:-1})}else return r?c("Resolved boot nav target",{contextNode:r,selectedIndex:0}):n?c("Resolved boot nav target",{contextNode:n,selectedIndex:0}):c("Resolved boot nav target",{contextNode:t.nodes[t.rootNodeId],selectedIndex:0})}function Kc(){let e=zc();return a(e)?e:A.navigate(e.value)}function ss({userId:e,userName:t}){let n=qt(),r=qt(),o=qt(),i=qt(),d=qt(),l=oe(void 0,void 0);if(a(l))return l;let u=oe(void 0,void 0);if(a(u))return u;let m=oe(u.value,void 0);if(a(m))return m;let g=oe(void 0,void 0);if(a(g))return g;let y=oe(g.value,void 0);if(a(y))return y;let N=oe(y.value,void 0);if(a(N))return N;let I=oe(void 0,void 0);return a(I)?I:c("Created default events",[{id:Oe(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:l.value}},{id:Oe(),userId:e,userName:t,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:u.value}},{id:Oe(),userId:e,userName:t,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:g.value}},{id:Oe(),userId:e,userName:t,action:"add.swimlane",payload:{id:i,name:"In progress",parent:r,rank:y.value}},{id:Oe(),userId:e,userName:t,action:"add.swimlane",payload:{id:d,name:"Done",parent:r,rank:N.value}},{id:Oe(),userId:e,userName:t,action:"add.board",payload:{id:Un,name:"Closed",parent:n,rank:m.value}},{id:Oe(),userId:e,userName:t,action:"add.swimlane",payload:{id:re,name:"Closed",parent:Un,rank:I.value}},{id:Oe(),userId:e,userName:t,action:"lock.node",payload:{id:Un}},{id:Oe(),userId:e,userName:t,action:"lock.node",payload:{id:re}}])}function _n(e){if(!e.length){let r=de.workspace("temporary-uninitialized-workspace","Workspace","a0"),o=Vt(r);return a(o)?o:(h({hasProjectDefinition:!1,mode:p.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=it(e).filter(a);return n.length>0?s(`Materializing failed:
56
56
  ${n.map(r=>r.message).join(`
57
- `)}`):(Wc(),E({hasProjectDefinition:!0}),c("State booted successfully",null))}var Hc=async e=>{let t=await D({cwd:e,args:["status","--porcelain"]});return a(t)?t:c("Checked git diff",t.value.stdout.trim().length>0)},W=(e,t)=>s(`[${e}] ${t}`),as=async()=>{let e=ao(),t=await pt(process.cwd());if(a(t))return W(1,t.message);let n=t.value,r=await tn(n);if(a(r))return W(2,r.message);if(r.value)return W(2,"Cannot initialize Epiq while a git operation is in progress");let o=await Hc(n);if(a(o))return W(2.5,o.message);if(o.value)return W(3,"Cannot initialize Epiq with uncommitted changes. Commit or stash your changes first.");if(ar(n))return W(4,"Epiq project already initialized");let i=pn();if(!i.isSetupDone||!i.userName)return W(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let d=K(),l=d.userName,u=d.userId;if(!u||!l)return W(5,"Missing Epiq user id");let m=e.stateBranch,p=await nn({repoRoot:n,branch:m});if(a(p))return W(6,p.message);if(p.value)return W(6,`State branch already exists: ${m}`);let y=await Fr({repoRoot:n,stateBranchName:m});if(a(y))return W(6,y.message);let h=an();if(a(h))return W(7,h.message);let I=ss.join(on(),e.projectId),w=await Or({repoRoot:n,stateBranchRoot:I,stateBranchName:m});if(a(w))return W(8,w.message);let $=ss.join(I,".epiq");jc.mkdirSync($,{recursive:!0});let S=is({userId:u,userName:l});if(a(S))return W(9,S.message);for(let Jn of S.value){let no=Ln({event:Jn,rootDir:I});if(a(no))return W(9,no.message)}let T=await Fn({stateBranchRoot:I,eventFileName:nt({userId:u,userName:l})});if(a(T))return W(10,T.message);let U=await mt({cwd:I,message:"[epiq:init]"});if(a(U))return W(10,U.message);let te=await es(n);if(a(te))return W(11,te.message);let le=lo({repoRoot:n,fileContents:e});if(a(le))return W(12,le.message);let ct=await z.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(a(ct))return W(13,ct.message);let bt=await z.commit({cwd:n,message:"[epiq:init-project]"});if(a(bt))return W(13,bt.message);let we="Project initialized!",Zr=await D({cwd:n,args:["push","-u","origin","HEAD"]});a(Zr)&&(we+=` Warn: [init:14] ${Zr.message}`);let Qr=await Ht({repoRoot:n,stateBranchRoot:I});a(Qr)&&(we+=` Warn: [init:15] ${Qr.message}`);let eo=rt(S.value).filter(a);if(eo.length>0)return W(16,eo.map(Jn=>Jn.message).join(`
58
- `));let Xn=Ie();if(a(Xn))return W(16,Xn.message);let{rootNodeId:ga,nodes:fa}=Xn.value,to=fa[ga];return to?(M.navigate({contextNode:to,selectedIndex:0}),E({hasProjectDefinition:!0,mode:g.DEFAULT}),c(we,null)):W(16,"Unable to resolve initialized root node")};import{ulid as Kc}from"ulid";import{ulid as zc}from"ulid";var ds=null,qe=()=>structuredClone(ds),qt=e=>{ds=e},cs=()=>{let{contextNode:e,selectedIndex:t}=v(),r=j(e.id)[t];return r?c("Resolved selected child",r):s("Target node not found")},Ur=({id:e,parentId:t,position:n={at:"end"}})=>{let r=j(t).filter(o=>o.id!==e);return Un(r,n)},ls=({id:e,parentId:t,position:n={at:"end"}})=>{let r=q();if(a(r))return s("Unable to resolve user ID");let o=Ur({parentId:t,id:e,position:n});return a(o)?o:c("Created pending move state",{id:zc(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value.rank}})},us=e=>{qt(e);let t=Vt(e,!0);return a(t)?t:c("Node moved successfully",t.value)};function Br(e){let t=cs();if(a(t))return t;let{contextNode:n,nodes:r}=v();if(!n.parentNodeId)return s("Missing parent node id");let o=r[n.parentNodeId];if(!o)return s("Missing parent node");let i=j(o.id),d=i.findIndex(({id:m})=>m===n.id);if(d<0)return s("Current node not found among siblings");let l=i[d+e];if(!l)return s("Missing sibling node");let u=ls({id:t.value.id,parentId:l.id,position:{at:"end"}});return a(u)?u:us(u.value)}function _r(e){let t=cs();if(a(t))return t;let{contextNode:n,selectedIndex:r}=v(),i=j(n.id)[r+e];if(!i)return s("Missing sibling node");let d=ls({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:i.id}});return a(d)?d:us(d.value)}var ms=()=>{let e=qe();if(!e)return s("No pending move state");let t=e.payload.id,n=e.payload.parent,r=v().nodes[n];if(!r)return s("Move parent not found");let o=j(n).findIndex(i=>i.id===t);return o===-1?s("Moved node not found among rendered children"):(M.navigate({contextNode:r,selectedIndex:o}),c("Synchronized navigation to moved node",null))},Bn=(e,t="Moved preview")=>{if(a(e))return e;let n=ms();return a(n)?n:(E({mode:g.MOVE}),c(t,null))},ps=async()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let{modifier:t}=Z().commandMeta,{contextNode:n,selectedIndex:r}=v(),o=j(n.id)[r];if(!o)return E({mode:g.DEFAULT}),s("No move target");if(t==="start"){if(o.readonly)return s("Target node is read-only");if(r===-1)return s("No item selected");if(!o.parentNodeId)return s("Target has no parent");let i=j(o.parentNodeId),d=i.findIndex(({id:y})=>y===o.id);if(d===-1)return s("Target not found among siblings");let l=i[d-1],u=i[d+1],m=u!=null?{at:"before",sibling:u.id}:l!=null?{at:"after",sibling:l.id}:{at:"start"},p=Ur({parentId:o.parentNodeId,id:o.id,position:m});return a(p)?p:(qt({id:Kc(),action:"move.node",payload:{id:o.id,parent:o.parentNodeId,rank:p.value.rank},...e.value}),E({mode:g.MOVE}),c("Move initialized",null))}if(t==="next")return Bn(_r(1));if(t==="previous")return Bn(_r(-1));if(t==="to-next")return Bn(Br(1));if(t==="to-previous")return Bn(Br(-1));if(t==="confirm"){let i=qe();if(!i)return s("No pending move to confirm");let d=await he();if(a(d))return d;let l=Ee(i,d.value);if(a(l))return l;let u=ms();return a(u)?u:(qt(null),E({mode:g.DEFAULT}),c("Moved item",null))}return t==="cancel"?(qt(null),E({mode:g.DEFAULT}),c("Cancelling move",null)):s("Invalid move modifier")};import{ulid as $n}from"ulid";import{monotonicFactory as qc,ulid as Vc}from"ulid";var Gc=qc(),_n=({name:e,parent:t,rank:n,user:{userId:r,userName:o}})=>{let i=Gc();return c("Created issue events",[{id:Vc(),userId:r,userName:o,action:"add.issue",payload:{id:i,parent:t,name:e,rank:n}}])};var gs=async(e,t)=>{let n=q();if(a(n))return s("Unable to resolve user ID");let r=await he();if(a(r))return r;let o=r.value;if(!t.inputString)return s(`provide a name for your ${t.modifier}`);let{breadCrumb:i,contextNode:d,selectedIndex:l}=v(),u=m=>{let p=Ee(m,o);if(a(p))return p;let y=N.getNode(p.value.result.id);if(!y)return s("Created node not found");if(!y.parentNodeId)return p;let h=N.getNode(y.parentNodeId);return h?(M.navigate({contextNode:h,selectedIndex:N.getSiblings(y.parentNodeId).findIndex(({id:I})=>I===y.id)}),p):s("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:m}=v(),p=N.getNode(m);if(!p)return s("Workspace not found");let y=Nt(p.id,n.value,o);return a(y)?y:u({id:$n(),action:"add.board",payload:{id:$n(),name:t.inputString,parent:p.id,rank:y.value},...n.value})}if(t.modifier==="swimlane"){let m=Se(i,"BOARD");if(a(m))return s("Unable to add swimlane in this context");let p=Nt(m.value.id,n.value,o);return a(p)?p:u({id:$n(),action:"add.swimlane",payload:{id:$n(),name:t.inputString,parent:m.value.id,rank:p.value},...n.value})}if(t.modifier==="issue"){let m=_(d.id)[l],p=d.context==="SWIMLANE"?d:d.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let U=Se(i,"SWIMLANE");return a(U)?null:U.value})();if(!p)return s("Unable to add issue in this context");let y=Nt(p.id,n.value,o);if(a(y))return y;let h=_n({name:t.inputString,parent:p.id,rank:y.value,user:n.value});if(a(h))return h;let I=h.value,w=It(I,o);if(w.some(U=>a(U)))return s("Issue create failed: "+w.filter(a).map(U=>U.message).filter(Boolean).join(", "));let $=w[0];if(!$||a($))return s("Issue creation failed");let T=I.find(U=>U.action==="add.issue")?.payload.id;return T?(M.navigate({contextNode:p,selectedIndex:N.getSiblings(p.id).findIndex(({id:U})=>U===T)}),c("Issue created",null)):s("Unable to determine ticket id")}return c("Success",null)};var fs=async()=>{let e=Se(v().breadCrumb,"BOARD");if(a(e))return e;let t=ut(process.cwd());if(a(t))throw new Error(t.message);let n=ht(t.value);if(a(n))return s(n.message);let r=n.value,{modifier:o}=Z().commandMeta,i;if(o==="now"){let h=$r();if(a(h))return h;let I=rt(r);return I.some(a)?s(I.map(w=>w.message).join(", ")):(E({mode:g.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),c("Peeking now",!0))}if(o==="prev"){let h=v().eventLog.at(-2),I=fr(h);if(I===null)return s("No previous event to peek");i=I}else if(o==="next"){let h=v().unappliedEvents.at(0),I=fr(h);if(I===null)return s("No next event to peek");i=I}else{let h=vn(o);if(!h)return s("Invalid peek date");i=h.getTime()}let d=e.value.id,{appliedEvents:l,unappliedEvents:u}=qi(r,i),m=$r();if(a(m))return m;let p=rt(l);if(p.some(a))return s(p.map(h=>h.message).join(", "));let y=v().nodes[d];return y?(M.navigate({contextNode:y,selectedIndex:0}),E({mode:g.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:u}),c("Peeking ",!0)):s("Board did not exist at peek date")};import Yc from"zod";var vs=()=>{let e=Z().commandMeta.inputString,t=Yc.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=tt({autoSyncDebounceMs:t.data});return a(n)?n:(We({autoSyncIntervalMs:t.data}),E({mode:g.DEFAULT}),c(`Auto sync interval set to ${t.data}ms`,null))};var ys=()=>{let e=Z().commandMeta.inputString.trim();if(e!=="yes"&&e!=="no")return s("Invalid response");let t=Ho(e),n=tt({autoSync:t});return a(n)?n:(We({autoSync:t}),E({mode:g.DEFAULT}),c(`Auto sync set to "${e}"`,null))};var xs=async()=>{B(()=>""),E({mode:g.DEFAULT});let e=Ie();if(a(e))return s(e.message);if(e.value.syncStatus.status==="syncing")return s("Sync already in progress");E({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await je();return a(t)?(E({syncStatus:{msg:t.message,status:"failed"}}),t):(E({mode:g.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};var hs=e=>Object.values(v().tags).find(t=>t.name===e),Es=e=>Object.values(v().contributors).find(t=>t.name===e),Ns=[{systemOnly:!0,intent:A.Move,description:"Internal move-state command",mode:g.COMMAND_LINE,action:ps},{intent:A.Delete,description:"Delete the currently selected node",mode:g.COMMAND_LINE,action:async()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=_(t.id)[n];return r?fe({id:ce(),action:"delete.node",payload:{id:r.id},...e.value}):s("Unable to resolve child to delete")},onSuccess:()=>E({mode:g.DEFAULT})},{intent:A.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:g.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=Z().commandMeta,n=/(!=|=)/,[r]=e.split(n);if(!r||!(d=>ee(f.FILTER).map(l=>l.split(n)[0]).includes(d))(r))return s("Invalid filter modifier");let i={target:r,operator:"=",value:t.trim()};return ve(d=>({...d,filters:e==="clear"?[]:[...d.filters,i],mode:g.DEFAULT})),c("Filter updated",null)}},{intent:A.ViewHelp,description:"Open the help screen",mode:g.COMMAND_LINE,action:()=>(E({mode:g.HELP}),c("Viewing help",null))},{intent:A.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:g.COMMAND_LINE,action:async()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=_(t.id)[n];if(!r)return s("Unable to close issue, no target found");if(!O(r))return s("Cannot close in this context");let o=v().nodes[re];if(!o)return s("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return s("Issue is already closed");let i=await he();if(a(i))return i;let d=i.value,l=Ct(o.id,r.id,{at:"end"},e.value,d);if(a(l))return l;let u=await fe({id:ce(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:l.value},...e.value});return a(u)?u:c("Issue closed",null)},onSuccess:()=>E({mode:g.DEFAULT})},{intent:A.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:g.COMMAND_LINE,action:async()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=_(t.id)[n];if(!r)return s("Unable to reopen issue, no target found");let o=r.context==="TICKET"?c("Resolved ticket",r):St(r.id,"TICKET");if(a(o))return s("Cannot reopen in this context");let i=o.value,d=v().nodes[re];if(!d)return s("Unable to locate closed swimlane");if(i.parentNodeId!==d.id)return s("Issue is not closed");if(!O(i))return s("Target node is not issue");let l=Xi(i);if(!l)return s("Unable to resolve previous parent from issue history");if(l===d.id)return s("Previous parent resolves to closed swimlane");let u=v().nodes[l];if(!u)return s("Previous parent no longer exists");let m=await he();if(a(m))return m;let p=m.value,y=Ct(u.id,i.id,{at:"end"},e.value,p);if(a(y))return y;let h=await fe({id:ce(),action:"reopen.issue",payload:{id:i.id,parent:u.id,rank:y.value},...e.value});return a(h)?h:c("Issue reopened",null)},onSuccess:()=>E({mode:g.DEFAULT})},{intent:A.Init,description:"Initialize Epiq in the current git repository",mode:g.COMMAND_LINE,action:as},{intent:A.NewItem,description:"Create a new board, swimlane, or issue",mode:g.COMMAND_LINE,action:gs,onSuccess:()=>E({mode:g.DEFAULT})},{intent:A.Rename,description:"itle] Rename the currently selected node",mode:g.COMMAND_LINE,action:async()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=_(t.id)[n];if(!r)return s("Missing node");if(r.readonly)return s("Cannot rename readonly node");let o=xi();return o?fe({id:ce(),action:"edit.title",payload:{id:r.id,name:o},...e.value}):s("Provide a title")},onSuccess:()=>E({mode:g.DEFAULT})},{intent:A.UntagTicket,description:"Remove a tag from the selected issue",mode:g.COMMAND_LINE,action:async()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=Z().commandMeta,r=(t||n).trim();if(!r)return s("Provide a tag");let o=hs(r);if(!o)return s(`Tag "${r}" does not exist`);let{selectedNode:i}=v();if(!i)return s("Invalid untag target");let d=St(i.id,"TICKET");if(a(d))return s("Unable to untag issue in this context");let l=d.value;return O(l)?(l.props.tags??[]).includes(o.id)?fe({id:ce(),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:()=>E({mode:g.DEFAULT})},{intent:A.TagTicket,description:"Add or create a tag on the selected issue",mode:g.COMMAND_LINE,action:async()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=Z().commandMeta,r=(t||n).trim();if(!r)return s("Provide a tag");let{selectedNode:o}=v();if(!o)return s("Invalid tag target");let i=St(o.id,"TICKET");if(a(i))return s("Unable to tag issue in this context");let d=i.value;if(!O(d))return s("Target node is not issue");let l=hs(r),u;if(l)u=l.id;else{let p=ce(),y=await fe({id:ce(),action:"create.tag",payload:{id:p,name:r},...e.value});if(a(y))return y;u=y.value.result.id}return(d.props.tags??[]).includes(u)?s("Already tagged with that tag"):fe({id:ce(),action:"add.issue.tag",payload:{id:d.id,tag:u},...e.value})},onSuccess:()=>E({mode:g.DEFAULT})},{intent:A.AssignUserToTicket,description:"Assign a user to the selected issue",mode:g.COMMAND_LINE,action:async()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=Z().commandMeta,r=(t||n).trim();if(!r)return s("Provide an assignee");let{selectedIndex:o,contextNode:i}=v(),d=_(i.id)[o];if(!d)return s("Invalid assign target");let l=St(d.id,"TICKET");if(a(l))return s("Unable to assign issue in this context");let u=l.value;if(!O(u))return s("Target node is not issue");let m=Es(r),p;if(m)p=m.id;else{let h=ce(),I=await fe({id:ce(),action:"create.contributor",payload:{id:h,name:r},...e.value});if(a(I))return I;p=I.value.result.id}return(u.props.assignees??[]).includes(p)?s("Assignee already assigned"):fe({id:ce(),action:"add.issue.assignee",payload:{id:u.id,assignee:p},...e.value})},onSuccess:()=>E({mode:g.DEFAULT})},{intent:A.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:g.COMMAND_LINE,action:async()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=Z().commandMeta,r=(t||n).trim();if(!r)return s("Provide an assignee to remove");let o=Es(r);if(!o)return s(`Assignee "${r}" does not exist`);let{selectedNode:i}=v();if(!i)return s("Invalid unassign target");let d=St(i.id,"TICKET");if(a(d))return s("Unable to unassign in this context");let l=d.value;return O(l)?(l.props.assignees??[]).includes(o.id)?fe({id:ce(),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:()=>E({mode:g.DEFAULT})},{intent:A.Sync,description:"Pull, commit, and push Epiq state",mode:g.COMMAND_LINE,action:xs},{intent:A.Peek,description:"View board state at another point in time",mode:g.COMMAND_LINE,action:fs},{intent:A.Export,description:"Export the current board layout to markdown",mode:g.COMMAND_LINE,action:async()=>{let e=await ki();return a(e)?e:(E({mode:g.DEFAULT}),c("Export successful",!0))}},{intent:A.Exit,description:"Exit the application",mode:g.COMMAND_LINE,action:async()=>(M.exit(),c("Exit successful",!0))},{intent:A.Edit,description:"Edit title or description",mode:g.COMMAND_LINE,action:async(e,t)=>{if(t.modifier===He.DESCRIPTION)return Qi();if(t.modifier===He.TITLE){let n=q();if(a(n))return s("Unable to resolve user ID");let{contextNode:r,selectedIndex:o}=v(),i=_(r.id)[o];if(!i)return s("Missing node");if(i.readonly)return s("Cannot rename readonly node");let d=t.inputString.trim();return d?fe({id:ce(),action:"edit.title",payload:{id:i.id,name:d},...n.value}):s("Provide a title")}return s("Unknown edit command")},onSuccess:()=>E({mode:g.DEFAULT})},{intent:A.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:g.COMMAND_LINE,action:(e,t)=>{let n=t.inputString.trim();switch(t.modifier){case J.USERNAME:{let{userId:r,preferredEditor:o,userName:i}=K(),d=n||i,l=r??ce();if(!d||!l)return s("Unable to resolve user name or id");let u=tt({userName:d,userId:l,preferredEditor:o??""});return a(u)?u:(We({userName:d,userId:l}),E({mode:g.DEFAULT}),c(`Username set to "${d}"`,null))}case J.EDITOR:{if(!n)return s("No editor provided");let r=tt({preferredEditor:n});return a(r)?r:(We({preferredEditor:n}),E({mode:g.DEFAULT}),c(`Editor configuration set to "${n}"`,null))}case J.VIEW:return n!=="wide"&&n!=="dense"?s("Invalid view mode"):(We({viewMode:n}),c(`View set to "${n}"`,null));case J.AUTOSYNC:return ys();case J.SYNC_DEBOUNCE_MS:return vs();default:return s("Unknown config command")}}}];var Xc=new Set(["peek","filter","view-help"]),Ae=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=Z();if(!t)return s("No command to confirm");if(!e&&n===Ze.Invalid)return s("Invalid command");let i=hi(t);gi();let{readOnly:d}=v();if(d&&!Xc.has(i))return Bt({status:Ue.Fail,message:"Command not available in readonly state",value:null});let l=Ns.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===i);if(!l)return Bt({status:Ue.Fail,message:"Command not found",value:null});let u;try{u=await l.action(l,{command:t,inputString:o,modifier:r})}catch(m){return Bt({status:Ue.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return a(u)?Bt(u):(fi({addToHistory:!e}),l.onSuccess?.(),K().autoSync&&$o(),u)};var Wn=[{intent:b.Exit,mode:g.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(E({mode:g.COMMAND_LINE}),B(()=>"move cancel"),Ae({isForceExecutedBySystem:!0}))},{intent:b.InitMove,mode:g.DEFAULT,description:"[m] move init/confirm",action:()=>(E({mode:g.COMMAND_LINE}),B(()=>"move start"),Ae({isForceExecutedBySystem:!0}))},{intent:b.ConfirmMove,mode:g.MOVE,action:()=>(E({mode:g.COMMAND_LINE}),B(()=>"move confirm"),Ae({isForceExecutedBySystem:!0}))}],jn=[{intent:b.MovePreviousItem,mode:g.MOVE,action:()=>qe()?(E({mode:g.COMMAND_LINE}),B(()=>"move previous"),Ae({isForceExecutedBySystem:!0})):s("No pending move")},{intent:b.MoveNextItem,mode:g.MOVE,action:()=>qe()?(E({mode:g.COMMAND_LINE}),B(()=>"move next"),Ae({isForceExecutedBySystem:!0})):s("No pending move")}],Is=[{intent:b.MoveToNextContainer,mode:g.MOVE,action:()=>qe()?(E({mode:g.COMMAND_LINE}),B(()=>"move to-next"),Ae({isForceExecutedBySystem:!0})):s("No pending move")},{intent:b.MoveToPreviousContainer,mode:g.MOVE,action:()=>qe()?(E({mode:g.COMMAND_LINE}),B(()=>"move to-previous"),Ae({isForceExecutedBySystem:!0})):s("No pending move")}];var Ss={[C.WORKSPACE]:[...Wn,...jn],[C.BOARD]:[...Wn,...jn],[C.SWIMLANE]:[...Wn,...jn,...Is],[C.TICKET]:[],[C.FIELD]:[],[C.FIELD_LIST]:[],[C.TEXT]:[]};import{useSyncExternalStore as BE}from"react";var Wr,Jc=new Set,Zc=()=>{for(let e of Jc)e()};var Hn=()=>{if(!Wr)throw new Error("Ui state not initialized. Call initUiState() first.");return Wr};var Qc=e=>{let t=Hn();return Wr=e(t),Zc(),c("UX state updated",null)},zn=e=>Qc(t=>({...t,...e}));var el=e=>{E({mode:g.COMMAND_LINE});let{pendingNavTarget:t}=Hn();t&&M.navigate(t),zn({pendingNavTarget:void 0}),B(()=>`${e} `)},Cs=()=>{B(()=>"");let{pendingNavTarget:e}=Hn();e&&M.navigate(e),zn({pendingNavTarget:void 0}),E({mode:g.DEFAULT})},bs=[{intent:b.InitCommandPalette,mode:g.DEFAULT,description:"[?] command palette",action:()=>{B(()=>"");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=v();return zn({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}}),E({mode:g.PALETTE}),c("Opening command palette",null)}},{intent:b.Confirm,mode:g.PALETTE,description:"[<Enter>] select command",action:()=>{let{selectedNode:e}=v();if(!e||!ro(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?(el(t),c("Selected command",t)):c("No command selected",null)}},{intent:b.ExitCommandLine,mode:g.PALETTE,action:()=>(Cs(),c("Exiting palette",null))},{intent:b.Exit,mode:g.PALETTE,description:"[q] close palette",action:()=>(Cs(),c("Closed command palette",null))},{intent:b.NavPreviousItem,mode:g.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(M.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:b.NavNextItem,mode:g.PALETTE,action:()=>(M.navigateToNextItem(),c("Navigating to next item",null))},{intent:b.NavToPreviousContainer,mode:g.PALETTE,action:()=>(M.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:b.NavToNextContainer,mode:g.PALETTE,action:()=>(M.navigateToNextContainer(),c("Navigating to next container",null))}];var Rs=[...bs,{intent:b.AddItem,mode:g.DEFAULT,description:"[n] new...",action:()=>(E({mode:g.COMMAND_LINE}),B(()=>`${f.NEW} `),c("Adding new item",null))},{intent:b.Delete,mode:g.DEFAULT,description:"[d] delete",action:()=>(E({mode:g.COMMAND_LINE}),B(()=>`${f.DELETE} `),c("Deleting item",null))},{intent:b.InitCommandLine,mode:g.DEFAULT,description:"[:] focus command line",action:()=>(E({mode:g.COMMAND_LINE}),B(()=>""),c("Entering command line mode",null))},{intent:b.Confirm,mode:g.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=v();if(!j(e?.id??"")?.length){if(e?.title===G.DESCRIPTION)return E({mode:g.COMMAND_LINE}),B(()=>`${f.EDIT} description `),c("Propose command",!0);if(e?.title===G.ASSIGNEES)return E({mode:g.COMMAND_LINE}),B(()=>`${f.ASSIGN} `),c("Propose command",!0);if(e?.title===G.TAGS)return E({mode:g.COMMAND_LINE}),B(()=>`${f.TAG} `),c("Propose command",!0);if(t.title===G.DESCRIPTION&&e?.context==="TEXT")return E({mode:g.COMMAND_LINE}),B(()=>`${f.EDIT} description `),c("Propose command",!0)}return M.enterChildNode(),c("Entering context",null)}},{intent:b.Exit,mode:g.DEFAULT,description:"[q] exit context",action:()=>(M.enterParentNode(),c("Exiting context",null))},{intent:b.NavPreviousItem,mode:g.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(M.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:b.NavNextItem,mode:g.DEFAULT,action:()=>(M.navigateToNextItem(),c("Navigating to next item",null))},{intent:b.NavToPreviousContainer,mode:g.DEFAULT,action:()=>(M.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:b.NavToNextContainer,mode:g.DEFAULT,action:()=>(M.navigateToNextContainer(),c("Navigating to next container",null))}];var tl=500,nl=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),As=e=>{let t=nl(e);t&&B(n=>(n+t).slice(0,tl))};var rl=[g.COMMAND_LINE,g.PALETTE],ol=e=>[{intent:b.MoveCursorLeft,mode:e,action:()=>(Nr(-1),c("Moving cursor left",null))},{intent:b.MoveCursorRight,mode:e,action:()=>(Nr(1),c("Moving cursor right",null))},{intent:b.MoveCursorLeftOfWord,mode:e,action:()=>(Ir("left"),c("Moving cursor left of word",null))},{intent:b.MoveCursorRightOfWord,mode:e,action:()=>(Ir("right"),c("Moving cursor right of word",null))},{intent:b.AutoCompleteCommand,mode:e,action:()=>(B((t,{remainder:n})=>n?t+n:t),c("Auto-completing command",null))},{intent:b.CaptureInput,mode:e,action:(t,{sequence:n})=>(As(n??""),c("Capturing input",null))},{intent:b.EraseInput,mode:e,action:()=>(mi(),c("Erasing input",null))},{intent:b.EraseInputWord,mode:e,action:()=>(pi(),c("Erasing input word",null))}],ws=[{intent:b.Confirm,mode:g.COMMAND_LINE,action:()=>(Ae(),c("Executing command",null))},{intent:b.ViewHelp,mode:g.DEFAULT,action:()=>(E({mode:g.HELP}),c("Viewing help",null))},{intent:b.Exit,mode:g.HELP,action:()=>(E({mode:g.DEFAULT}),c("Exiting help",null))},...rl.flatMap(ol),{intent:b.ExitCommandLine,mode:g.COMMAND_LINE,action:()=>(E({mode:g.DEFAULT}),c("Exiting command line",null))},{intent:b.GetLastCommandFromHistory,mode:g.COMMAND_LINE,action:()=>(vi(),c("Getting last command from history",null))},{intent:b.GetNextCommandFromHistory,mode:g.COMMAND_LINE,action:()=>(yi(),c("Getting next command from history",null))}];import Ps from"chalk";var Kn=Ps.dim.hex(R.secondary2)(": for command line"),Ts="q to exit",Ms=`${Ps.hex(R.accent)("m")} to confirm`,jr={[C.WORKSPACE]:[Kn],[C.BOARD]:[Kn],[C.BOARD+g.COMMAND_LINE]:[Kn],[C.SWIMLANE]:[Kn],[C.TICKET+g.HELP]:[Ts],[C.SWIMLANE+g.HELP]:[Ts],[C.TICKET]:[],[C.FIELD]:[],[C.SWIMLANE+g.MOVE]:[Ms],[C.TICKET+g.MOVE]:[Ms]};var Gt=e=>e.trim().toLocaleLowerCase(),il=e=>{let{tags:t}=v();return(e.props.tags??[]).map(n=>t[n]?.name).filter(n=>!!n)},sl=e=>{let{contributors:t}=v();return(e.props.assignees??[]).map(n=>t[n]?.name).filter(n=>!!n)},ks=(e,t)=>{let n=Gt(t.value);if(!n)return!0;switch(t.target){case"title":return Gt(e.title??"").includes(n);case"description":return Gt(e.props.description??"").includes(n);case"tag":return il(e).map(Gt).some(o=>o.includes(n));case"assignee":return sl(e).map(Gt).some(o=>o.includes(n));default:return!0}};function Ls(e,t,n){let r=t[e];if(!r)return s("buildBreadCrumb(): current node not found");let o=[],i=r;for(;i&&(o.push(i),!(i.id===n||!i.parentNodeId));)i=t[i.parentNodeId];let d=o[o.length-1];return!d||d.id!==n?s("buildBreadCrumb(): node is not connected to root"):(o.reverse(),c("Breadcrumb built",o))}var Ds=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 ot,Hr,zr=new Set,Fs=()=>{for(let e of zr)e()},dl=e=>(zr.add(e),()=>zr.delete(e));function Os(e){let{contextNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:i}=e;if(!t)return s("derive(): contextNodeId 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, contextNode not found");let u=Ls(t,o,r);if(a(u))return logger.error(u.message),u;let m=u.value,{context:p}=l,y=jr[p+n]??jr[p]??[],h=[...Rs,...Ss[p]??[],...ws],I=Ds(h),w=cl(o,i),$=w[t]?.[e.selectedIndex]??null;return c("Derived successfully",{...e,contextNode:l,breadCrumb:m,availableHints:y,availableActions:h,actionIndex:I,selectedNode:$,renderedChildrenIndex:w})}var v=()=>{if(!ot)throw new Error("State not initialized. Call initWorkspaceState() first.");return ot},Ie=()=>ot?c("Retrieved state",ot):s("State not initialized. Call initWorkspaceState() first.");function Kt(e){Hr=e;let t=$e(process.cwd()),n=!1;if(!a(t)){let i=_e(t.value);if(a(i))return s(i.message);n=!0}let r={readOnly:!1,filters:[],tags:{},contributors:{},mode:g.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,contextNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""},eventLog:[],unappliedEvents:[],timeMode:"live",hasProjectDefinition:n,hasInitializingEvents:!1},o=Os(r);return a(o)?o:(ot=o.value,Fs(),c("State initialized",null))}function ve(e){let t=v(),n=e(t),r=Os(n);return a(r)?s(r.message??"Unable to update state"):(ot=r.value,Fs(),c("State updated",null))}var E=e=>ve(t=>({...t,...e}));var be=()=>al(dl,v,v),cl=(e,t)=>{let n={};for(let r of Object.values(e))O(r)&&t.length>0&&!t.every(o=>ks(r,o))||!r.parentNodeId||r.isDeleted||((!r.parentNodeId||!n[r.parentNodeId])&&(n[r.parentNodeId]=[]),n[r.parentNodeId].push(r));for(let r of Object.keys(n))n[r].sort((o,i)=>{let d=e[o.id],l=e[i.id];return!d||!l?0:d.rank.localeCompare(l.rank)});return n},_=e=>v()?.renderedChildrenIndex[e]??[],$r=()=>Hr?Kt(Hr):s("Cannot reset state: no initial workspace found"),ft=()=>ot!==void 0;var St=(e,t)=>{let{nodes:n}=v(),r=n[e];if(!r)return s("Node not found");if(r.context===t)return c("Resolved ancestor node",r);let o=r.parentNodeId?n[r.parentNodeId]:void 0;for(;o;){if(o.context===t)return c("Resolved ancestor node",o);o=o.parentNodeId?n[o.parentNodeId]:void 0}return s(`No ancestor found for context: ${t}`)},ll=(e,t)=>{let{nodes:n}=v(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},it=(e,t)=>e?e.readonly?s({move:"Cannot move readonly node",rename:"Cannot rename readonly node",edit:"Cannot edit readonly node"}[t]):null:s("Node not found"),N={deleteNode(e){ve(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=it(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=it(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),c("Renamed node",o)},getExistingTags(){let{tags:e}=v();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=v();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return j(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:r}=v(),o=this.getNode(e),i=this.getNode(t);if(!o)return s("Node not found");if(!i)return s("Target parent not found");if(r===e)return s("Cannot move root node");if(e===t)return s("Cannot move node into itself");let d=it(o,"move");if(d)return d;if(ll(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,contextNodeId:n,rootNodeId:r}=v(),o=this.getNode(e);if(!o)return s("Node not found");if(r===e)return s("Cannot delete root node");let i=new Set,d=u=>{let m=t[u];if(!(!m||i.has(u))){i.add(u);for(let p of j(m.id))d(p.id)}};d(e);let l={...structuredClone(t)};for(let u of i){if(!l[u])return s("Unable to locate node to delete");l[u]={...l[u],isDeleted:!0}}return n?(E({nodes:l}),c("Successfully tomb stoned",o)):s("Unable to delete undefined")},createContributor(e){let t=ve(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return a(t)?s("Unable to create contributor"):c("Created contributor",e)},assign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return s("Unable to assign contributor, missing contributor");if(!r)return s("Unable to assign contributor, missing target");let o=it(r,"edit");if(o)return o;if(!O(r))return s("Target is not an issue");let i=r.props.assignees??[];if(i.includes(t))return s("Contributor already assigned");let d={...r,props:{...r.props,assignees:[...i,t]}};return this.updateNode(d),c("Assigned contributor",{assignee:t})},unassign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return s("Unable to unassign, missing contributor");if(!r)return s("Unable to unassign, missing target");let o=it(r,"edit");if(o)return o;if(!O(r))return s("Target is not an issue");let i=r.props.assignees??[];if(!i.includes(t))return c("Issue is not assigned to that contributor",{assignee:t});let d={...r,props:{...r.props,assignees:i.filter(l=>l!==t)}};return this.updateNode(d),c("Assignee removed",{assignee:t})},tag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return s("Unable to add tag, missing tag");if(!r)return s("Unable to add tag, missing target");let o=it(r,"edit");if(o)return o;if(!O(r))return s("Target is not an issue");let i=r.props.tags??[];if(i.includes(t))return s("Tag already assigned");let d={...r,props:{...r.props,tags:[...i,t]}};return this.updateNode(d),c("Tag added",{tag:t})},untag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return s("Unable to remove tag, missing tag");if(!r)return s("Unable to remove tag, missing target");let o=it(r,"edit");if(o)return o;if(!O(r))return s("Target is not an issue");let i=r.props.tags??[];if(!i.includes(t))return c("Issue is not tagged with that tag",{tag:t});let d={...r,props:{...r.props,tags:i.filter(l=>l!==t)}};return this.updateNode(d),c("Tag removed",{tag:t})},createTag(e){let t=ve(n=>({...n,tags:{...n.tags,[e.id]:e}}));return a(t)?s("Could not create tag"):c("Tag created",e)},createNode(e){let t=ve(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return a(t)?s("Unable to create node"):c("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return s("Failed to locate node");let n={...t,readonly:!0},r=ve(o=>({...o,nodes:{...o.nodes,[e]:n}}));return a(r)?s(r.message):c("Locked node",n)},updateNode(e){let t=ve(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return a(t)?t:c("Updated node",e)},getContributor(e){return v().contributors[e]},getTag(e){return v().tags[e]},getNode(e){return v().nodes[e]},getSiblings(e){return j(e)}};import st from"chalk";import Us from"string-width";import{decodeTime as ul}from"ulid";var ml=(e,t)=>e+" ".repeat(Math.max(0,t-Us(e))),pl=(e,t)=>" ".repeat(Math.max(0,t-Us(e)))+e,gl=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`),fl=(e,t)=>t?e<t?"up":e>t?"down":null:null,vl=(e,t)=>{let n=N.getNode(e.payload.parent),r=n?st.dim.bgBlack(` ${n.title} `):"unknown",o=t.at(-1);if(o&&"parent"in o&&"rank"in o&&o.parent===e.payload.parent){let i=fl(e.payload.rank,o.rank);if(i)return`Moved ${i} in ${r}`}return`Moved issue to ${r}`},yl=e=>{switch(e.action){case"add.issue.tag":{let t=v().tags[e.payload.tag];return t?st.bgHex(Ce(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=v().tags[e.payload.tag];return t?st.bgHex(Ce(t.name))(` ${t.name} `):"unknown tag"}case"add.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?st.hex(Ce(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?st.hex(Ce(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""}},xl=e=>{let t=Yo(ul(e));return st.gray(pl(t,8))},hl=12,El=e=>ml(`${e}`,hl),Bs=(e,t)=>{let n=xl(e.id),r=El(e.userName),o=st.dim("\u203A"),i=e.action==="move.node"?vl(e,t):[gl(e.action),yl(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${i}`};var Nl=e=>ze(e,"description"),Il=e=>ze(e,"assignees"),Sl=e=>ze(e,"tags"),Cl=e=>ze(e,"history"),_s=({id:e,name:t,parentNodeId:n,rank:r,value:o,readonly:i=!1,childRenderAxis:d="horizontal"})=>{let l=N.getNode(e);if(!l){N.createNode({...de.field({id:e,name:t,parentNodeId:n,rank:r,props:{value:o},isVirtual:!0}),readonly:i,childRenderAxis:d});return}!Be(l)||!(l.title!==t||l.parentNodeId!==n||l.rank!==r||l.props.value!==o||l.readonly!==i||l.childRenderAxis!==d)||N.updateNode({...l,title:t,parentNodeId:n,rank:r,props:{...l.props,value:o},readonly:i,childRenderAxis:d})},$s=({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!1,childRenderAxis:i="horizontal"})=>{let d=N.getNode(e);if(!d){N.createNode({...de.fieldList({id:e,name:t,parentNodeId:n,rank:r,isVirtual:!0}),readonly:o,childRenderAxis:i});return}!At(d)||!(d.title!==t||d.parentNodeId!==n||d.rank!==r||d.readonly!==o||d.childRenderAxis!==i)||N.updateNode({...d,title:t,parentNodeId:n,rank:r,readonly:o,childRenderAxis:i})},Ws=e=>{let t=xe(Te/4n),n=xe(Te/2n),r=xe(Te*3n/4n),o=xe(Te);a(t)||a(n)||a(r)||a(o)||(_s({id:Nl(e.id),name:G.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"}),$s({id:Il(e.id),name:G.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0}),$s({id:Sl(e.id),name:G.TAGS,parentNodeId:e.id,rank:r.value,readonly:!0}),_s({id:Cl(e.id),name:G.HISTORY,parentNodeId:e.id,rank:o.value,value:bl(e),readonly:!0,childRenderAxis:"vertical"}))},bl=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=>Bs(r,n.get(r.action)??[])).join(`
59
- `)};var P=(e,t)=>s(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),js=e=>{let t=N.getNode(e);!t||!O(t)||t.isDeleted||Ws(t)},Rl=e=>{for(let t of e){js(t);let n=v().nodes[t]?.parentNodeId;n&&js(n)}},Al=(e,t)=>{let n=N.getNode(e);n&&N.updateNode({...n,log:[...n.log??[],t]})},wl=e=>{let t=[e],n=v().nodes[e]?.parentNodeId;return n&&t.push(n),t},Tl=e=>{switch(e.action){case"delete.node":case"edit.description":return wl(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[]}},Ml=e=>{ve(t=>({...t,eventLog:[...t.eventLog,e]}))},Pl=e=>{let t=e.userId,n=e.userName;if(!t?.length||!n?.length)return P("Invalid user ID format",e);let r=N.createContributor({id:t,name:n});return a(r)?P(r.message,e):null},kl=(e,t)=>{let n=Pl(e);if(n)return n;let r=[...new Set(Tl(e))];return t||(r.forEach(o=>Al(o,e)),Ml(e)),Rl(r),null},Ll={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=de.workspace(t,n,r),i=Kt(o);if(a(i))return P(i.message,e);let d=N.createNode(o);return a(d)?P(d.message??"Failed to initialize workspace",e):Zn(d.value)?c("Workspace initialized",{action:e.action,result:d.value}):s("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=N.createNode(de.workspace(t,n,r));return a(o)?P(o.message??"Failed to add workspace",e):Zn(o.value)?c("Added workspace",{action:e.action,result:o.value}):s("Unexpected create node return value")},"add.board":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,i=N.createNode(de.board(t,n,r,o));return a(i)?P(i.message??"Unable to create board",e):oo(i.value)?c("Added board",{action:e.action,result:i.value}):s("Unexpected create node return value")},"add.swimlane":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,i=N.createNode(de.swimlane(t,n,r,o));return a(i)?P(i.message??"Unable to create swimlane",e):Xt(i.value)?c("Added swimlane",{action:e.action,result:i.value}):s("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,i=N.createNode(de.ticket(t,n,r,o));return a(i)?P(i.message??"Unable to create issue",e):O(i.value)?c("Added issue",{action:e.action,result:i.value}):s("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:r,val:o,rank:i}=e.payload,d=N.createNode(de.field({id:t,name:n,parentNodeId:r,rank:i,props:{value:o},childRenderAxis:n.includes(G.DESCRIPTION)?"vertical":"horizontal"}));return a(d)?P(d.message??`Unable to create field: ${n}`,e):Be(d.value)?c("Added field",{action:e.action,result:d.value}):s("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!N.getNode(t))return P(`Unable to locate node with id ${t}`,e);let o=N.renameNode(t,n);return a(o)?P(o.message??"Unable to edit title",e):c("Edited title",{action:e.action,result:o.value})},"delete.node":e=>{let{id:t}=e.payload,n=N.tombstoneNode(t);return a(n)?P(n.message??"Unable to delete node",e):c("Deleted node",{action:e.action,result:n.value})},"create.tag":e=>{let{id:t,name:n}=e.payload,r=N.createTag({id:t,name:n});return a(r)?P(r.message??"Unable to create tag",e):c("Tag added",{action:e.action,result:r.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,r=N.createContributor({id:t,name:n});return a(r)?P(r.message??"Unable to create contributor",e):c("Contributor created",{action:e.action,result:r.value})},"add.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=N.tag(t,n);return a(r)?P(r.message??"Unable to tag issue",e):c("Issue tagged",{action:e.action,result:{tag:n}})},"remove.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=N.untag(t,n);return a(r)?P(r.message??"Unable to untag issue",e):c("Issue untagged",{action:e.action,result:{tag:n}})},"add.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,r=N.assign(t,n);return a(r)?P(r.message??"Unable to assign issue",e):c("Assigned successfully",{action:e.action,result:{assignee:n}})},"remove.issue.assignee":e=>{let{id:t,assignee:n}=e.payload,r=N.unassign(t,n);return a(r)?P(r.message??"Unable to unassign issue",e):c("Issue unassigned",{action:e.action,result:{assignee:n}})},"move.node":e=>{let{id:t,parent:n,rank:r}=e.payload,o=N.moveNodeToRank({id:t,parentId:n,rank:r});return a(o)?P(o.message??"Failed to move node",e):c("Moved node",{action:e.action,result:o.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,r=N.editValue(t,n);return a(r)?P(r.message??"Unable to edit description",e):c("Set node value",{action:e.action,result:r.value})},"close.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=N.getNode(t);if(!o)return P("Unable to locate issue",e);if(!O(o))return P("Can only close issues",e);let i=N.getNode(re);if(!i)return P("Unable to locate target swimlane",e);if(n!==i.id)return P("Close target must be closed swimlane",e);let d=N.moveNodeToRank({id:t,parentId:n,rank:r});return a(d)?P(d.message??"Unable to close issue",e):c("Issue closed",{action:e.action,result:{id:t}})},"reopen.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=N.getNode(t);if(!o)return P("Unable to locate issue",e);if(!O(o))return P("Can only reopen issues",e);let i=N.getNode(re);if(!i)return P("Unable to locate closed swimlane",e);if(n===i.id)return P("Cannot reopen issue into closed swimlane",e);if(!N.getNode(n))return P("Reopen parent no longer exists",e);let l=N.moveNodeToRank({id:t,parentId:n,rank:r});return a(l)?P(l.message??"Unable to reopen issue",e):c("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=N.lockNode(t);return a(n)?P(n.message??"Unable to lock node",e):c("Node locked",{action:e.action,result:n.value})},"rebalance.children":e=>{let{parent:t,ranks:n}=e.payload;for(let[r,o]of Object.entries(n)){let i=N.getNode(r);if(!i)return P(`Unable to locate node ${r}`,e);if(i.parentNodeId!==t)return P(`Node ${r} is not child of ${t}`,e);let d=N.updateNode({...i,rank:o});if(a(d))return P(d.message??"Unable to rebalance child",e)}return c("Rebalanced children",{action:e.action,result:{parent:t}})}};function Vt(e,t=!1){let n=Ll[e.action](e);if(a(n))return n;let r=kl(e,t);return r||n}var rt=e=>e.map(t=>Vt(t));function Ee(e,t){let n=Vt(e);if(n.status!==Ue.Success)return n;let r=Ln({event:e,rootDir:t});return a(r)?r:n}function It(e,t){return e.map(n=>Ee(n,t))}var fe=async e=>{let t=await he();return a(t)?t:Ee(e,t.value)};var Hs=e=>Un(j(e),{at:"end"}),Un=(e,t={at:"end"})=>{let n=r=>a(r)?c("Rank space exhausted",{rank:"",needsRebalance:!0}):c("Resolved rank",{rank:r.value,needsRebalance:!1});if(e.length===0)return n(oe(void 0,void 0));switch(t.at){case"start":{let r=e[0];return r?n(oe(void 0,r.rank)):s("Unable to resolve first sibling")}case"end":{let r=e[e.length-1];return r?n(oe(r.rank,void 0)):s("Unable to resolve last sibling")}case"before":{let r=zs(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(oe(o?.rank,i.rank)):s("Sibling not found")}case"after":{let r=zs(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(oe(o.rank,i?.rank)):s("Sibling not found")}}},j=e=>Object.values(v().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),zs=(e,t)=>e.findIndex(n=>n.id===t),Ks=(e,t,n={at:"end"})=>Un(j(t).filter(r=>r.id!==e),n),Ct=(e,t,n,r,o)=>{let i=Ks(t,e,n);if(a(i))return i;if(!i.value.needsRebalance)return c("Resolved rank",i.value.rank);let d=Qn(e,r);if(a(d))return d;let l=Ee(d.value,o);if(a(l))return l;let u=Ks(t,e,n);return a(u)?u:u.value.needsRebalance?s("Rank rebalance failed to create space"):c("Resolved rank after rebalance",u.value.rank)},Nt=(e,t,n)=>{let r=Hs(e);if(a(r))return r;if(!r.value.needsRebalance)return c("Resolved rank",r.value.rank);let o=Qn(e,t);if(a(o))return o;let i=Ee(o.value,n);if(a(i))return i;let d=Hs(e);return a(d)?d:d.value.needsRebalance?s("Rank rebalance failed to create space"):c("Resolved rank after rebalance",d.value.rank)};var Vs=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),Gs=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=v();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},Dl=e=>{let t=v().nodes[e];return!!t&&!t.isDeleted&&Be(t)&&t.childRenderAxis==="vertical"},qn=(e,t)=>{let{nodes:n}=v(),r=n[e];if(!r||r.isDeleted)return!1;let o=_(r.id);return M.navigate({contextNode:r,selectedIndex:Vs(t,o.length)}),!0},Ys=e=>{let{nodes:t}=v(),n=t[e];if(!n||n.isDeleted)return!1;let r=n.parentNodeId;if(!r)return qn(n.id,0);let o=t[r];if(!o||o.isDeleted)return!1;let d=j(o.id).findIndex(l=>l.id===n.id);return d>=0?(M.navigate({contextNode:o,selectedIndex:d}),!0):Ys(o.id)},qs=e=>{let{nodes:t}=v(),n=e,r=new Set;for(;n&&!r.has(n);){if(r.add(n),Ys(n))return!0;n=t[n]?.parentNodeId}return!1},Fl=e=>{if(!e)return!1;let t=v().nodes[e];return!!t&&!t.isDeleted},Xs=e=>{let{nodes:t,rootNodeId:n}=v();if(Dl(e.contextNodeId)&&qn(e.contextNodeId,e.selectedIndex))return c("Restored navigation inside text container",null);if(Fl(e.selectedNodeId)&&e.selectedNodeId&&qs(e.selectedNodeId))return c("Restored navigation to selected node or ancestor",null);if(qn(e.contextNodeId,e.selectedIndex))return c("Restored navigation to previous container",null);if(e.parentNodeId&&qn(e.parentNodeId,e.selectedIndex))return c("Restored navigation to previous parent",null);if(qs(e.contextNodeId))return c("Restored navigation to previous container or ancestor",null);let r=t[n];if(!r||r.isDeleted)return s("Unable to restore navigation");let o=_(r.id);return M.navigate({contextNode:r,selectedIndex:Vs(e.selectedIndex,o.length)}),c("Restored navigation to root",null)};var Kr=({status:e,msg:t})=>{ft()&&E({syncStatus:{status:e,msg:t}})},qr=(e="Syncing...")=>{Kr({status:"syncing",msg:e})},Vr=(e="Synced")=>{Kr({status:"synced",msg:e})},Ol=e=>{Kr({status:"failed",msg:e})},V=e=>(Ol(e),s(e));var k=(e,t)=>(a(t)&&logger.info(`[${e}]:failed`,t.message),t);import{decodeTime as Ul}from"ulid";var Yt=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)},Gr=e=>{let[t,n]=e.id;return`${t}:${n??""}`},Js=e=>{try{return Ul(e.id[0])}catch{return 0}},Yr=(e,t)=>{let n=new Map;for(let r of[...e,...t])n.set(Gr(r),r);return[...n.values()].sort((r,o)=>{let i=Js(r)-Js(o);return i!==0?i:Gr(r).localeCompare(Gr(o))})},Xr=e=>e.length===0?"":e.map(t=>JSON.stringify(t)).join(`
57
+ `)}`):(Kc(),h({hasProjectDefinition:!0}),c("State booted successfully",null))}var Vc=async e=>{let t=await F({cwd:e,args:["status","--porcelain"]});return a(t)?t:c("Checked git diff",t.value.stdout.trim().length>0)},W=(e,t)=>s(`[${e}] ${t}`),ds=async()=>{let e=lo(),t=await We(process.cwd());if(a(t))return W(1,t.message);let n=t.value,r=await sn(n);if(a(r))return W(2,r.message);if(r.value)return W(2,"Cannot initialize Epiq while a git operation is in progress");let o=await Vc(n);if(a(o))return W(2.5,o.message);if(o.value)return W(3,"Cannot initialize Epiq with uncommitted changes. Commit or stash your changes first.");if(dr(n))return W(4,"Epiq project already initialized");let i=vn();if(!i.isSetupDone||!i.userName)return W(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let d=K(),l=d.userName,u=d.userId;if(!u||!l)return W(5,"Missing Epiq user id");let m=e.stateBranch,g=await an({repoRoot:n,branch:m});if(a(g))return W(6,g.message);if(g.value)return W(6,`State branch already exists: ${m}`);let y=await Br({repoRoot:n,stateBranchName:m});if(a(y))return W(6,y.message);let N=ln();if(a(N))return W(7,N.message);let I=as.join(cn(),e.projectId),C=await _r({repoRoot:n,stateBranchRoot:I,stateBranchName:m});if(a(C))return W(8,C.message);let D=as.join(I,".epiq");qc.mkdirSync(D,{recursive:!0});let R=ss({userId:u,userName:l});if(a(R))return W(9,R.message);for(let Zn of R.value){let oo=On({event:Zn,rootDir:I});if(a(oo))return W(9,oo.message)}let M=await Bn({stateBranchRoot:I,eventFileName:ot({userId:u,userName:l})});if(a(M))return W(10,M.message);let B=await pt({cwd:I,message:"[epiq:init]"});if(a(B))return W(10,B.message);let te=await ts(n);if(a(te))return W(11,te.message);let le=mo({repoRoot:n,fileContents:e});if(a(le))return W(12,le.message);let ut=await z.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(a(ut))return W(13,ut.message);let At=await z.commit({cwd:n,message:"[epiq:init-project]"});if(a(At))return W(13,At.message);let we="Project initialized!",eo=await F({cwd:n,args:["push","-u","origin","HEAD"]});a(eo)&&(we+=` Warn: [init:14] ${eo.message}`);let to=await Kt({repoRoot:n,stateBranchRoot:I});a(to)&&(we+=` Warn: [init:15] ${to.message}`);let no=it(R.value).filter(a);if(no.length>0)return W(16,no.map(Zn=>Zn.message).join(`
58
+ `));let Jn=Ie();if(a(Jn))return W(16,Jn.message);let{rootNodeId:ya,nodes:xa}=Jn.value,ro=xa[ya];return ro?(A.navigate({contextNode:ro,selectedIndex:0}),h({hasProjectDefinition:!0,mode:p.DEFAULT}),c(we,null)):W(16,"Unable to resolve initialized root node")};import{ulid as Yc}from"ulid";import{ulid as Gc}from"ulid";var cs=null,Ve=()=>structuredClone(cs),Gt=e=>{cs=e},ls=()=>{let{contextNode:e,selectedIndex:t}=v(),r=j(e.id)[t];return r?c("Resolved selected child",r):s("Target node not found")},$r=({id:e,parentId:t,position:n={at:"end"}})=>{let r=j(t).filter(o=>o.id!==e);return $n(r,n)},us=({id:e,parentId:t,position:n={at:"end"}})=>{let r=q();if(a(r))return s("Unable to resolve user ID");let o=$r({parentId:t,id:e,position:n});return a(o)?o:c("Created pending move state",{id:Gc(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value.rank}})},ms=e=>{Gt(e);let t=Yt(e,!0);return a(t)?t:c("Node moved successfully",t.value)};function Wr(e){let t=ls();if(a(t))return t;let{contextNode:n,nodes:r}=v();if(!n.parentNodeId)return s("Missing parent node id");let o=r[n.parentNodeId];if(!o)return s("Missing parent node");let i=j(o.id),d=i.findIndex(({id:m})=>m===n.id);if(d<0)return s("Current node not found among siblings");let l=i[d+e];if(!l)return s("Missing sibling node");let u=us({id:t.value.id,parentId:l.id,position:{at:"end"}});return a(u)?u:ms(u.value)}function jr(e){let t=ls();if(a(t))return t;let{contextNode:n,selectedIndex:r}=v(),i=j(n.id)[r+e];if(!i)return s("Missing sibling node");let d=us({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:i.id}});return a(d)?d:ms(d.value)}var ps=()=>{let e=Ve();if(!e)return s("No pending move state");let t=e.payload.id,n=e.payload.parent,r=v().nodes[n];if(!r)return s("Move parent not found");let o=j(n).findIndex(i=>i.id===t);return o===-1?s("Moved node not found among rendered children"):(A.navigate({contextNode:r,selectedIndex:o}),c("Synchronized navigation to moved node",null))},Wn=(e,t="Moved preview")=>{if(a(e))return e;let n=ps();return a(n)?n:(h({mode:p.MOVE}),c(t,null))},gs=async()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let{modifier:t}=Z().commandMeta,{contextNode:n,selectedIndex:r}=v(),o=j(n.id)[r];if(!o)return h({mode:p.DEFAULT}),s("No move target");if(t==="start"){if(o.readonly)return s("Target node is read-only");if(r===-1)return s("No item selected");if(!o.parentNodeId)return s("Target has no parent");let i=j(o.parentNodeId),d=i.findIndex(({id:y})=>y===o.id);if(d===-1)return s("Target not found among siblings");let l=i[d-1],u=i[d+1],m=u!=null?{at:"before",sibling:u.id}:l!=null?{at:"after",sibling:l.id}:{at:"start"},g=$r({parentId:o.parentNodeId,id:o.id,position:m});return a(g)?g:(Gt({id:Yc(),action:"move.node",payload:{id:o.id,parent:o.parentNodeId,rank:g.value.rank},...e.value}),h({mode:p.MOVE}),c("Move initialized",null))}if(t==="next")return Wn(jr(1));if(t==="previous")return Wn(jr(-1));if(t==="to-next")return Wn(Wr(1));if(t==="to-previous")return Wn(Wr(-1));if(t==="confirm"){let i=Ve();if(!i)return s("No pending move to confirm");let d=await he();if(a(d))return d;let l=Ee(i,d.value);if(a(l))return l;let u=ps();return a(u)?u:(Gt(null),h({mode:p.DEFAULT}),c("Moved item",null))}return t==="cancel"?(Gt(null),h({mode:p.DEFAULT}),c("Cancelling move",null)):s("Invalid move modifier")};import{ulid as Hn}from"ulid";import{monotonicFactory as Xc,ulid as Jc}from"ulid";var Zc=Xc(),jn=({name:e,parent:t,rank:n,user:{userId:r,userName:o}})=>{let i=Zc();return c("Created issue events",[{id:Jc(),userId:r,userName:o,action:"add.issue",payload:{id:i,parent:t,name:e,rank:n}}])};var fs=async(e,t)=>{let n=q();if(a(n))return s("Unable to resolve user ID");let r=await he();if(a(r))return r;let o=r.value;if(!t.inputString)return s(`provide a name for your ${t.modifier}`);let{breadCrumb:i,contextNode:d,selectedIndex:l}=v(),u=m=>{let g=Ee(m,o);if(a(g))return g;let y=E.getNode(g.value.result.id);if(!y)return s("Created node not found");if(!y.parentNodeId)return g;let N=E.getNode(y.parentNodeId);return N?(A.navigate({contextNode:N,selectedIndex:E.getSiblings(y.parentNodeId).findIndex(({id:I})=>I===y.id)}),g):s("Parent node not found")};if(t.modifier==="board"){let{rootNodeId:m}=v(),g=E.getNode(m);if(!g)return s("Workspace not found");let y=It(g.id,n.value,o);return a(y)?y:u({id:Hn(),action:"add.board",payload:{id:Hn(),name:t.inputString,parent:g.id,rank:y.value},...n.value})}if(t.modifier==="swimlane"){let m=Se(i,"BOARD");if(a(m))return s("Unable to add swimlane in this context");let g=It(m.value.id,n.value,o);return a(g)?g:u({id:Hn(),action:"add.swimlane",payload:{id:Hn(),name:t.inputString,parent:m.value.id,rank:g.value},...n.value})}if(t.modifier==="issue"){let m=$(d.id)[l],g=d.context==="SWIMLANE"?d:d.context==="BOARD"&&m?.context==="SWIMLANE"?m:(()=>{let B=Se(i,"SWIMLANE");return a(B)?null:B.value})();if(!g)return s("Unable to add issue in this context");let y=It(g.id,n.value,o);if(a(y))return y;let N=jn({name:t.inputString,parent:g.id,rank:y.value,user:n.value});if(a(N))return N;let I=N.value,C=St(I,o);if(C.some(B=>a(B)))return s("Issue create failed: "+C.filter(a).map(B=>B.message).filter(Boolean).join(", "));let D=C[0];if(!D||a(D))return s("Issue creation failed");let M=I.find(B=>B.action==="add.issue")?.payload.id;return M?(A.navigate({contextNode:g,selectedIndex:E.getSiblings(g.id).findIndex(({id:B})=>B===M)}),c("Issue created",null)):s("Unable to determine ticket id")}return c("Success",null)};var vs=async()=>{let e=Se(v().breadCrumb,"BOARD");if(a(e))return e;let t=await We(process.cwd());if(a(t))return s("Unable to locate repo root");let n=gt({repoRoot:t.value});if(a(n))throw new Error(n.message);let{modifier:r}=Z().commandMeta;if(r==="now"){let C=Et(n.value);if(a(C))return s(C.message);let D=Xt();if(a(D))return D;let M=it(C.value).filter(a);return M.length>0?s(M.map(B=>B.message).join(", ")):(h({mode:p.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),c("Peeking now",!0))}let o;if(r==="prev"){let C=v().eventLog.at(-1),D=vr(C);if(D===null)return s("No previous event to peek");o=D}else if(r==="next"){let C=v().unappliedEvents.at(0),D=vr(C);if(D===null)return s("No next event to peek");o=D+1}else{let C=hn(r);if(!C)return s("Invalid peek date");o=C.getTime()}let i=v(),d=e.value.id,l=qi(n.value,o);if(a(l))return s(l.message);let{appliedEvents:u,unappliedEvents:m}=l.value,g=Xt();if(a(g))return g;let N=it(u).filter(a);if(N.length>0)return Xt(),h(i),s(N.map(C=>C.message).join(", "));let I=v().nodes[d];return I?(A.navigate({contextNode:I,selectedIndex:0}),h({mode:p.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:m}),c("Peeking",!0)):(Xt(),h(i),s("Board did not exist at peek date"))};import Qc from"zod";var ys=()=>{let e=Z().commandMeta.inputString,t=Qc.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=rt({autoSyncDebounceMs:t.data});return a(n)?n:(je({autoSyncIntervalMs:t.data}),h({mode:p.DEFAULT}),c(`Auto sync interval set to ${t.data}ms`,null))};var xs=()=>{let e=Z().commandMeta.inputString.trim();if(e!=="yes"&&e!=="no")return s("Invalid response");let t=Ko(e),n=rt({autoSync:t});return a(n)?n:(je({autoSync:t}),h({mode:p.DEFAULT}),c(`Auto sync set to "${e}"`,null))};var hs=async()=>{U(()=>""),h({mode:p.DEFAULT});let e=Ie();if(a(e))return s(e.message);if(e.value.syncStatus.status==="syncing")return s("Sync already in progress");h({syncStatus:{msg:"Syncing",status:"syncing"}});let t=await He();return a(t)?(h({syncStatus:{msg:t.message,status:"failed"}}),t):(h({mode:p.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};import{useSyncExternalStore as zh}from"react";var Hr,el=new Set,tl=()=>{for(let e of el)e()};var Ct=()=>{if(!Hr)throw new Error("Ui state not initialized. Call initUiState() first.");return Hr};var nl=e=>{let t=Ct();return Hr=e(t),tl(),c("UX state updated",null)},Ge=e=>nl(t=>({...t,...e}));var Es=e=>Object.values(v().tags).find(t=>t.name===e),Ns=e=>Object.values(v().contributors).find(t=>t.name===e),Is=[{systemOnly:!0,intent:T.Move,description:"Internal move-state command",mode:p.COMMAND_LINE,action:gs},{intent:T.Delete,description:"Delete the currently selected node",mode:p.COMMAND_LINE,action:async()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=$(t.id)[n];return r?fe({id:ce(),action:"delete.node",payload:{id:r.id},...e.value}):s("Unable to resolve child to delete")},onSuccess:()=>h({mode:p.DEFAULT})},{intent:T.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:p.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=Z().commandMeta,n=/(!=|=)/,[r]=e.split(n);if(!r||!(d=>ee(f.FILTER).map(l=>l.split(n)[0]).includes(d))(r))return s("Invalid filter modifier");let i={target:r,operator:"=",value:t.trim()};return ve(d=>({...d,filters:e==="clear"?[]:[...d.filters,i],mode:p.DEFAULT})),c("Filter updated",null)}},{intent:T.ViewHelp,description:"Open the help screen",mode:p.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=v();return Ge({pendingNavTarget:{contextNode:e,breadCrumb:r,selectedIndex:t,selectedNode:n}}),h({mode:p.HELP}),c("Viewing help",null)}},{intent:T.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:p.COMMAND_LINE,action:async()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=$(t.id)[n];if(!r)return s("Unable to close issue, no target found");if(!_(r))return s("Cannot close in this context");let o=v().nodes[re];if(!o)return s("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return s("Issue is already closed");let i=await he();if(a(i))return i;let d=i.value,l=bt(o.id,r.id,{at:"end"},e.value,d);if(a(l))return l;let u=await fe({id:ce(),action:"close.issue",payload:{id:r.id,parent:o.id,rank:l.value},...e.value});return a(u)?u:c("Issue closed",null)},onSuccess:()=>h({mode:p.DEFAULT})},{intent:T.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:p.COMMAND_LINE,action:async()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=$(t.id)[n];if(!r)return s("Unable to reopen issue, no target found");let o=r.context==="TICKET"?c("Resolved ticket",r):Rt(r.id,"TICKET");if(a(o))return s("Cannot reopen in this context");let i=o.value,d=v().nodes[re];if(!d)return s("Unable to locate closed swimlane");if(i.parentNodeId!==d.id)return s("Issue is not closed");if(!_(i))return s("Target node is not issue");let l=Ji(i);if(!l)return s("Unable to resolve previous parent from issue history");if(l===d.id)return s("Previous parent resolves to closed swimlane");let u=v().nodes[l];if(!u)return s("Previous parent no longer exists");let m=await he();if(a(m))return m;let g=m.value,y=bt(u.id,i.id,{at:"end"},e.value,g);if(a(y))return y;let N=await fe({id:ce(),action:"reopen.issue",payload:{id:i.id,parent:u.id,rank:y.value},...e.value});return a(N)?N:c("Issue reopened",null)},onSuccess:()=>h({mode:p.DEFAULT})},{intent:T.Init,description:"Initialize Epiq in the current git repository",mode:p.COMMAND_LINE,action:ds},{intent:T.NewItem,description:"Create a new board, swimlane, or issue",mode:p.COMMAND_LINE,action:fs,onSuccess:()=>h({mode:p.DEFAULT})},{intent:T.Rename,description:"itle] Rename the currently selected node",mode:p.COMMAND_LINE,action:async()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=$(t.id)[n];if(!r)return s("Missing node");if(r.readonly)return s("Cannot rename readonly node");let o=Ei();return o?fe({id:ce(),action:"edit.title",payload:{id:r.id,name:o},...e.value}):s("Provide a title")},onSuccess:()=>h({mode:p.DEFAULT})},{intent:T.UntagTicket,description:"Remove a tag from the selected issue",mode:p.COMMAND_LINE,action:async()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=Z().commandMeta,r=(t||n).trim();if(!r)return s("Provide a tag");let o=Es(r);if(!o)return s(`Tag "${r}" does not exist`);let{selectedNode:i}=v();if(!i)return s("Invalid untag target");let d=Rt(i.id,"TICKET");if(a(d))return s("Unable to untag issue in this context");let l=d.value;return _(l)?(l.props.tags??[]).includes(o.id)?fe({id:ce(),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:()=>h({mode:p.DEFAULT})},{intent:T.TagTicket,description:"Add or create a tag on the selected issue",mode:p.COMMAND_LINE,action:async()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=Z().commandMeta,r=(t||n).trim();if(!r)return s("Provide a tag");let{selectedNode:o}=v();if(!o)return s("Invalid tag target");let i=Rt(o.id,"TICKET");if(a(i))return s("Unable to tag issue in this context");let d=i.value;if(!_(d))return s("Target node is not issue");let l=Es(r),u;if(l)u=l.id;else{let g=ce(),y=await fe({id:ce(),action:"create.tag",payload:{id:g,name:r},...e.value});if(a(y))return y;u=y.value.result.id}return(d.props.tags??[]).includes(u)?s("Already tagged with that tag"):fe({id:ce(),action:"add.issue.tag",payload:{id:d.id,tag:u},...e.value})},onSuccess:()=>h({mode:p.DEFAULT})},{intent:T.AssignUserToTicket,description:"Assign a user to the selected issue",mode:p.COMMAND_LINE,action:async()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=Z().commandMeta,r=(t||n).trim();if(!r)return s("Provide an assignee");let{selectedIndex:o,contextNode:i}=v(),d=$(i.id)[o];if(!d)return s("Invalid assign target");let l=Rt(d.id,"TICKET");if(a(l))return s("Unable to assign issue in this context");let u=l.value;if(!_(u))return s("Target node is not issue");let m=Ns(r),g;if(m)g=m.id;else{let N=ce(),I=await fe({id:ce(),action:"create.contributor",payload:{id:N,name:r},...e.value});if(a(I))return I;g=I.value.result.id}return(u.props.assignees??[]).includes(g)?s("Assignee already assigned"):fe({id:ce(),action:"add.issue.assignee",payload:{id:u.id,assignee:g},...e.value})},onSuccess:()=>h({mode:p.DEFAULT})},{intent:T.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:p.COMMAND_LINE,action:async()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=Z().commandMeta,r=(t||n).trim();if(!r)return s("Provide an assignee to remove");let o=Ns(r);if(!o)return s(`Assignee "${r}" does not exist`);let{selectedNode:i}=v();if(!i)return s("Invalid unassign target");let d=Rt(i.id,"TICKET");if(a(d))return s("Unable to unassign in this context");let l=d.value;return _(l)?(l.props.assignees??[]).includes(o.id)?fe({id:ce(),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:()=>h({mode:p.DEFAULT})},{intent:T.Sync,description:"Pull, commit, and push Epiq state",mode:p.COMMAND_LINE,action:hs},{intent:T.Peek,description:"View board state at another point in time",mode:p.COMMAND_LINE,action:vs},{intent:T.Export,description:"Export the current board layout to markdown",mode:p.COMMAND_LINE,action:async()=>{let e=await Di();return a(e)?e:(h({mode:p.DEFAULT}),c("Export successful",!0))}},{intent:T.Exit,description:"Exit the application",mode:p.COMMAND_LINE,action:async()=>(A.exit(),c("Exit successful",!0))},{intent:T.Edit,description:"Edit title or description",mode:p.COMMAND_LINE,action:async(e,t)=>{if(t.modifier===ze.DESCRIPTION)return es();if(t.modifier===ze.TITLE){let n=q();if(a(n))return s("Unable to resolve user ID");let{contextNode:r,selectedIndex:o}=v(),i=$(r.id)[o];if(!i)return s("Missing node");if(i.readonly)return s("Cannot rename readonly node");let d=t.inputString.trim();return d?fe({id:ce(),action:"edit.title",payload:{id:i.id,name:d},...n.value}):s("Provide a title")}return s("Unknown edit command")},onSuccess:()=>h({mode:p.DEFAULT})},{intent:T.Config,description:"Update editor, username, view, autosync, or sync debounce",mode:p.COMMAND_LINE,action:(e,t)=>{let n=t.inputString.trim();switch(t.modifier){case J.USERNAME:{let{userId:r,preferredEditor:o,userName:i}=K(),d=n||i,l=r??ce();if(!d||!l)return s("Unable to resolve user name or id");let u=rt({userName:d,userId:l,preferredEditor:o??""});return a(u)?u:(je({userName:d,userId:l}),h({mode:p.DEFAULT}),c(`Username set to "${d}"`,null))}case J.EDITOR:{if(!n)return s("No editor provided");let r=rt({preferredEditor:n});return a(r)?r:(je({preferredEditor:n}),h({mode:p.DEFAULT}),c(`Editor configuration set to "${n}"`,null))}case J.VIEW:return n!=="wide"&&n!=="dense"?s("Invalid view mode"):(je({viewMode:n}),c(`View set to "${n}"`,null));case J.AUTOSYNC:return xs();case J.SYNC_DEBOUNCE_MS:return ys();default:return s("Unknown config command")}}}];var rl=new Set(["peek","filter","view-help"]),Ae=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=Z();if(!t)return s("No command to confirm");if(!e&&n===et.Invalid)return s("Invalid command");let i=Ni(t);vi();let{readOnly:d}=v();if(d&&!rl.has(i))return $t({status:Ue.Fail,message:"Command not available in readonly state",value:null});let l=Is.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===i);if(!l)return $t({status:Ue.Fail,message:"Command not found",value:null});let u;try{u=await l.action(l,{command:t,inputString:o,modifier:r})}catch(m){return $t({status:Ue.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return a(u)?$t(u):(yi({addToHistory:!e}),l.onSuccess?.(),K().autoSync&&jo(),u)};var zn=[{intent:S.Exit,mode:p.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(h({mode:p.COMMAND_LINE}),U(()=>"move cancel"),Ae({isForceExecutedBySystem:!0}))},{intent:S.InitMove,mode:p.DEFAULT,description:"[m] move (init/confirm)",action:()=>(h({mode:p.COMMAND_LINE}),U(()=>"move start"),Ae({isForceExecutedBySystem:!0}))},{intent:S.ConfirmMove,mode:p.MOVE,action:()=>(h({mode:p.COMMAND_LINE}),U(()=>"move confirm"),Ae({isForceExecutedBySystem:!0}))}],Kn=[{intent:S.MovePreviousItem,mode:p.MOVE,action:()=>Ve()?(h({mode:p.COMMAND_LINE}),U(()=>"move previous"),Ae({isForceExecutedBySystem:!0})):s("No pending move")},{intent:S.MoveNextItem,mode:p.MOVE,action:()=>Ve()?(h({mode:p.COMMAND_LINE}),U(()=>"move next"),Ae({isForceExecutedBySystem:!0})):s("No pending move")}],Ss=[{intent:S.MoveToNextContainer,mode:p.MOVE,action:()=>Ve()?(h({mode:p.COMMAND_LINE}),U(()=>"move to-next"),Ae({isForceExecutedBySystem:!0})):s("No pending move")},{intent:S.MoveToPreviousContainer,mode:p.MOVE,action:()=>Ve()?(h({mode:p.COMMAND_LINE}),U(()=>"move to-previous"),Ae({isForceExecutedBySystem:!0})):s("No pending move")}];var Cs={[b.WORKSPACE]:[...zn,...Kn],[b.BOARD]:[...zn,...Kn],[b.SWIMLANE]:[...zn,...Kn,...Ss],[b.TICKET]:[],[b.FIELD]:[],[b.FIELD_LIST]:[],[b.TEXT]:[]};var Rs=()=>{U(()=>"");let{pendingNavTarget:e}=Ct();h({mode:p.DEFAULT}),e&&A.navigate(e),Ge({pendingNavTarget:void 0})},bs=[{intent:S.ExitCommandLine,mode:p.HELP,action:()=>(Rs(),c("Exiting help",null))},{intent:S.Exit,mode:p.HELP,action:()=>(Rs(),c("Closed help",null))},{intent:S.NavPreviousItem,mode:p.HELP,description:"[arrows/hjkl] navigate",action:()=>(A.navigateToPreviousItem(),c("Navigating to previous help item",null))},{intent:S.NavNextItem,mode:p.HELP,action:()=>(A.navigateToNextItem(),c("Navigating to next help item",null))},{intent:S.NavToPreviousContainer,mode:p.HELP,action:()=>(A.navigateToPreviousContainer(),c("Navigating to previous help container",null))},{intent:S.NavToNextContainer,mode:p.HELP,action:()=>(A.navigateToNextContainer(),c("Navigating to next help container",null))}];var ol=e=>{h({mode:p.COMMAND_LINE});let{pendingNavTarget:t}=Ct();t&&A.navigate(t),Ge({pendingNavTarget:void 0}),U(()=>`${e} `)},As=()=>{U(()=>"");let{pendingNavTarget:e}=Ct();e&&A.navigate(e),Ge({pendingNavTarget:void 0}),h({mode:p.DEFAULT})},ws=[{intent:S.InitCommandPalette,mode:p.DEFAULT,description:"[?] view command palette (explore descriptions for every command)",action:()=>{U(()=>"");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=v();return Ge({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}}),h({mode:p.PALETTE}),c("Opening command palette",null)}},{intent:S.Confirm,mode:p.PALETTE,action:()=>{let{selectedNode:e}=v();if(!e||!io(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?(ol(t),c("Selected command",t)):c("No command selected",null)}},{intent:S.ExitCommandLine,mode:p.PALETTE,action:()=>(As(),c("Exiting palette",null))},{intent:S.Exit,mode:p.PALETTE,action:()=>(As(),c("Closed command palette",null))},{intent:S.NavPreviousItem,mode:p.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(A.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:S.NavNextItem,mode:p.PALETTE,action:()=>(A.navigateToNextItem(),c("Navigating to next item",null))},{intent:S.NavToPreviousContainer,mode:p.PALETTE,action:()=>(A.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:S.NavToNextContainer,mode:p.PALETTE,action:()=>(A.navigateToNextContainer(),c("Navigating to next container",null))}];var Ts=[...bs,...ws,{intent:S.AddItem,mode:p.DEFAULT,description:"[n] new...",action:()=>(h({mode:p.COMMAND_LINE}),U(()=>`${f.NEW} `),c("Adding new item",null))},{intent:S.Delete,mode:p.DEFAULT,description:"[d] delete",action:()=>(h({mode:p.COMMAND_LINE}),U(()=>`${f.DELETE} `),c("Deleting item",null))},{intent:S.InitCommandLine,mode:p.DEFAULT,description:"[:] focus command line",action:()=>(h({mode:p.COMMAND_LINE}),U(()=>""),c("Entering command line mode",null))},{intent:S.Confirm,mode:p.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=v();if(!j(e?.id??"")?.length){if(e?.title===G.DESCRIPTION)return h({mode:p.COMMAND_LINE}),U(()=>`${f.EDIT} description `),c("Propose command",!0);if(e?.title===G.ASSIGNEES)return h({mode:p.COMMAND_LINE}),U(()=>`${f.ASSIGN} `),c("Propose command",!0);if(e?.title===G.TAGS)return h({mode:p.COMMAND_LINE}),U(()=>`${f.TAG} `),c("Propose command",!0);if(t.title===G.DESCRIPTION&&e?.context==="TEXT")return h({mode:p.COMMAND_LINE}),U(()=>`${f.EDIT} description `),c("Propose command",!0)}return A.enterChildNode(),c("Entering context",null)}},{intent:S.EditTitle,mode:p.DEFAULT,description:"[r] rename title",action:()=>(h({mode:p.COMMAND_LINE}),U(()=>`${f.EDIT} title ${v().selectedNode?.title}`),c("Exiting context",null))},{intent:S.EditDescription,mode:p.DEFAULT,description:"[e] edit description",action:()=>(h({mode:p.COMMAND_LINE}),U(()=>`${f.EDIT} description `),c("Exiting context",null))},{intent:S.Exit,mode:p.DEFAULT,description:"[q] exit context",action:()=>(A.enterParentNode(),c("Exiting context",null))},{intent:S.NavPreviousItem,mode:p.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(A.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:S.NavNextItem,mode:p.DEFAULT,action:()=>(A.navigateToNextItem(),c("Navigating to next item",null))},{intent:S.NavToPreviousContainer,mode:p.DEFAULT,action:()=>(A.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:S.NavToNextContainer,mode:p.DEFAULT,action:()=>(A.navigateToNextContainer(),c("Navigating to next container",null))}];var il=500,sl=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),Ms=e=>{let t=sl(e);t&&U(n=>(n+t).slice(0,il))};var al=[p.COMMAND_LINE,p.PALETTE],dl=e=>[{intent:S.MoveCursorLeft,mode:e,action:()=>(Ir(-1),c("Moving cursor left",null))},{intent:S.MoveCursorRight,mode:e,action:()=>(Ir(1),c("Moving cursor right",null))},{intent:S.MoveCursorLeftOfWord,mode:e,action:()=>(Sr("left"),c("Moving cursor left of word",null))},{intent:S.MoveCursorRightOfWord,mode:e,action:()=>(Sr("right"),c("Moving cursor right of word",null))},{intent:S.AutoCompleteCommand,mode:e,action:()=>(U((t,{remainder:n})=>n?t+n:t),c("Auto-completing command",null))},{intent:S.CaptureInput,mode:e,action:(t,{sequence:n})=>(Ms(n??""),c("Capturing input",null))},{intent:S.EraseInput,mode:e,action:()=>(gi(),c("Erasing input",null))},{intent:S.EraseInputWord,mode:e,action:()=>(fi(),c("Erasing input word",null))}],Ps=[{intent:S.Confirm,mode:p.COMMAND_LINE,action:()=>(Ae(),c("Executing command",null))},{intent:S.ViewHelp,mode:p.DEFAULT,action:()=>(h({mode:p.HELP}),c("Viewing help",null))},...al.flatMap(dl),{intent:S.ExitCommandLine,mode:p.COMMAND_LINE,action:()=>(h({mode:p.DEFAULT}),c("Exiting command line",null))},{intent:S.GetLastCommandFromHistory,mode:p.COMMAND_LINE,action:()=>(xi(),c("Getting last command from history",null))},{intent:S.GetNextCommandFromHistory,mode:p.COMMAND_LINE,action:()=>(hi(),c("Getting next command from history",null))}];import Ds from"chalk";var qn=Ds.dim.hex(w.secondary2)(": for command line"),ks="q to exit",Ls=`${Ds.hex(w.accent)("m")} to confirm`,zr={[b.WORKSPACE]:[qn],[b.BOARD]:[qn],[b.BOARD+p.COMMAND_LINE]:[qn],[b.SWIMLANE]:[qn],[b.TICKET+p.HELP]:[ks],[b.SWIMLANE+p.HELP]:[ks],[b.TICKET]:[],[b.FIELD]:[],[b.SWIMLANE+p.MOVE]:[Ls],[b.TICKET+p.MOVE]:[Ls]};var Jt=e=>e.trim().toLocaleLowerCase(),cl=e=>{let{tags:t}=v();return(e.props.tags??[]).map(n=>t[n]?.name).filter(n=>!!n)},ll=e=>{let{contributors:t}=v();return(e.props.assignees??[]).map(n=>t[n]?.name).filter(n=>!!n)},Fs=(e,t)=>{let n=Jt(t.value);if(!n)return!0;switch(t.target){case"title":return Jt(e.title??"").includes(n);case"description":return Jt(e.props.description??"").includes(n);case"tag":return cl(e).map(Jt).some(o=>o.includes(n));case"assignee":return ll(e).map(Jt).some(o=>o.includes(n));default:return!0}};function Os(e,t,n){let r=t[e];if(!r)return s("buildBreadCrumb(): current node not found");let o=[],i=r;for(;i&&(o.push(i),!(i.id===n||!i.parentNodeId));)i=t[i.parentNodeId];let d=o[o.length-1];return!d||d.id!==n?s("buildBreadCrumb(): node is not connected to root"):(o.reverse(),c("Breadcrumb built",o))}var Us=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 st,Kr,qr=new Set,Bs=()=>{for(let e of qr)e()},ml=e=>(qr.add(e),()=>qr.delete(e));function _s(e){let{contextNodeId:t,mode:n,rootNodeId:r,nodes:o,filters:i}=e;if(!t)return s("derive(): contextNodeId 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, contextNode not found");let u=Os(t,o,r);if(a(u))return logger.error(u.message),u;let m=u.value,{context:g}=l,y=zr[g+n]??zr[g]??[],N=[...Ts,...Cs[g]??[],...Ps],I=Us(N),C=pl(o,i),D=C[t]?.[e.selectedIndex]??null;return c("Derived successfully",{...e,contextNode:l,breadCrumb:m,availableHints:y,availableActions:N,actionIndex:I,selectedNode:D,renderedChildrenIndex:C})}var v=()=>{if(!st)throw new Error("State not initialized. Call initWorkspaceState() first.");return st},Ie=()=>st?c("Retrieved state",st):s("State not initialized. Call initWorkspaceState() first.");function Vt(e){Kr=e;let t=$e(process.cwd()),n=!1;if(!a(t)){let i=_e(t.value);if(a(i))return s(i.message);n=!0}let r={readOnly:!1,filters:[],tags:{},contributors:{},mode:p.DEFAULT,nodes:{[e.id]:e},rootNodeId:e.id,contextNodeId:e.id,renderedChildrenIndex:{},selectedIndex:-1,syncStatus:{status:"synced",msg:""},eventLog:[],unappliedEvents:[],timeMode:"live",hasProjectDefinition:n,hasInitializingEvents:!1},o=_s(r);return a(o)?o:(st=o.value,Bs(),c("State initialized",null))}function ve(e){let t=v(),n=e(t),r=_s(n);return a(r)?s(r.message??"Unable to update state"):(st=r.value,Bs(),c("State updated",null))}var h=e=>ve(t=>({...t,...e}));var Re=()=>ul(ml,v,v),pl=(e,t)=>{let n={};for(let r of Object.values(e))_(r)&&t.length>0&&!t.every(o=>Fs(r,o))||!r.parentNodeId||r.isDeleted||((!r.parentNodeId||!n[r.parentNodeId])&&(n[r.parentNodeId]=[]),n[r.parentNodeId].push(r));for(let r of Object.keys(n))n[r].sort((o,i)=>{let d=e[o.id],l=e[i.id];return!d||!l?0:d.rank.localeCompare(l.rank)});return n},$=e=>v()?.renderedChildrenIndex[e]??[],Xt=()=>Kr?Vt(Kr):s("Cannot reset state: no initial workspace found"),vt=()=>st!==void 0;var Rt=(e,t)=>{let{nodes:n}=v(),r=n[e];if(!r)return s("Node not found");if(r.context===t)return c("Resolved ancestor node",r);let o=r.parentNodeId?n[r.parentNodeId]:void 0;for(;o;){if(o.context===t)return c("Resolved ancestor node",o);o=o.parentNodeId?n[o.parentNodeId]:void 0}return s(`No ancestor found for context: ${t}`)},gl=(e,t)=>{let{nodes:n}=v(),r=n[e];for(;r?.parentNodeId;){if(r.parentNodeId===t)return!0;r=n[r.parentNodeId]}return!1},at=(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"),E={deleteNode(e){ve(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=at(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=at(n,"rename");if(r)return r;let o={...n,title:t};return this.updateNode(o),c("Renamed node",o)},getExistingTags(){let{tags:e}=v();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getExistingAssignees(){let{contributors:e}=v();return[...new Set(Object.values(e).map(t=>t.name).filter(Boolean))]},getFieldByTitle(e,t){return j(e).find(n=>n.title===t)},moveNodeToRank({id:e,parentId:t,rank:n}){let{rootNodeId:r}=v(),o=this.getNode(e),i=this.getNode(t);if(!o)return s("Node not found");if(!i)return s("Target parent not found");if(r===e)return s("Cannot move root node");if(e===t)return s("Cannot move node into itself");let d=at(o,"move");if(d)return d;if(gl(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,contextNodeId:n,rootNodeId:r}=v(),o=this.getNode(e);if(!o)return s("Node not found");if(r===e)return s("Cannot delete root node");let i=new Set,d=u=>{let m=t[u];if(!(!m||i.has(u))){i.add(u);for(let g of j(m.id))d(g.id)}};d(e);let l={...structuredClone(t)};for(let u of i){if(!l[u])return s("Unable to locate node to delete");l[u]={...l[u],isDeleted:!0}}return n?(h({nodes:l}),c("Successfully tomb stoned",o)):s("Unable to delete undefined")},createContributor(e){let t=ve(n=>({...n,contributors:{...n.contributors,[e.id]:e}}));return a(t)?s("Unable to create contributor"):c("Created contributor",e)},assign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return s("Unable to assign contributor, missing contributor");if(!r)return s("Unable to assign contributor, missing target");let o=at(r,"edit");if(o)return o;if(!_(r))return s("Target is not an issue");let i=r.props.assignees??[];if(i.includes(t))return s("Contributor already assigned");let d={...r,props:{...r.props,assignees:[...i,t]}};return this.updateNode(d),c("Assigned contributor",{assignee:t})},unassign(e,t){let n=this.getContributor(t),r=this.getNode(e);if(!n)return s("Unable to unassign, missing contributor");if(!r)return s("Unable to unassign, missing target");let o=at(r,"edit");if(o)return o;if(!_(r))return s("Target is not an issue");let i=r.props.assignees??[];if(!i.includes(t))return c("Issue is not assigned to that contributor",{assignee:t});let d={...r,props:{...r.props,assignees:i.filter(l=>l!==t)}};return this.updateNode(d),c("Assignee removed",{assignee:t})},tag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return s("Unable to add tag, missing tag");if(!r)return s("Unable to add tag, missing target");let o=at(r,"edit");if(o)return o;if(!_(r))return s("Target is not an issue");let i=r.props.tags??[];if(i.includes(t))return s("Tag already assigned");let d={...r,props:{...r.props,tags:[...i,t]}};return this.updateNode(d),c("Tag added",{tag:t})},untag(e,t){let n=this.getTag(t),r=this.getNode(e);if(!n)return s("Unable to remove tag, missing tag");if(!r)return s("Unable to remove tag, missing target");let o=at(r,"edit");if(o)return o;if(!_(r))return s("Target is not an issue");let i=r.props.tags??[];if(!i.includes(t))return c("Issue is not tagged with that tag",{tag:t});let d={...r,props:{...r.props,tags:i.filter(l=>l!==t)}};return this.updateNode(d),c("Tag removed",{tag:t})},createTag(e){let t=ve(n=>({...n,tags:{...n.tags,[e.id]:e}}));return a(t)?s("Could not create tag"):c("Tag created",e)},createNode(e){let t=ve(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return a(t)?s("Unable to create node"):c("Node created",e)},lockNode(e){let t=this.getNode(e);if(!t)return s("Failed to locate node");let n={...t,readonly:!0},r=ve(o=>({...o,nodes:{...o.nodes,[e]:n}}));return a(r)?s(r.message):c("Locked node",n)},updateNode(e){let t=ve(n=>({...n,nodes:{...n.nodes,[e.id]:e}}));return a(t)?t:c("Updated node",e)},getContributor(e){return v().contributors[e]},getTag(e){return v().tags[e]},getNode(e){return v().nodes[e]},getSiblings(e){return j(e)}};import dt from"chalk";import $s from"string-width";import{decodeTime as fl}from"ulid";var vl=(e,t)=>e+" ".repeat(Math.max(0,t-$s(e))),yl=(e,t)=>" ".repeat(Math.max(0,t-$s(e)))+e,xl=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`),hl=(e,t)=>t?e<t?"up":e>t?"down":null:null,El=(e,t)=>{let n=E.getNode(e.payload.parent),r=n?dt.dim.bgBlack(` ${n.title} `):"unknown",o=t.at(-1);if(o&&"parent"in o&&"rank"in o&&o.parent===e.payload.parent){let i=hl(e.payload.rank,o.rank);if(i)return`Moved ${i} in ${r}`}return`Moved issue to ${r}`},Nl=e=>{switch(e.action){case"add.issue.tag":{let t=v().tags[e.payload.tag];return t?dt.bgHex(Ce(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=v().tags[e.payload.tag];return t?dt.bgHex(Ce(t.name))(` ${t.name} `):"unknown tag"}case"add.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?dt.hex(Ce(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?dt.hex(Ce(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""}},Il=e=>{let t=Jo(fl(e));return dt.gray(yl(t,8))},Sl=12,Cl=e=>vl(`${e}`,Sl),Ws=(e,t)=>{let n=Il(e.id),r=Cl(e.userName),o=dt.dim("\u203A"),i=e.action==="move.node"?El(e,t):[xl(e.action),Nl(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${i}`};var Rl=e=>Ke(e,"description"),bl=e=>Ke(e,"assignees"),Al=e=>Ke(e,"tags"),wl=e=>Ke(e,"history"),js=({id:e,name:t,parentNodeId:n,rank:r,value:o,readonly:i=!1,childRenderAxis:d="horizontal"})=>{let l=E.getNode(e);if(!l){E.createNode({...de.field({id:e,name:t,parentNodeId:n,rank:r,props:{value:o},isVirtual:!0}),readonly:i,childRenderAxis:d});return}!Be(l)||!(l.title!==t||l.parentNodeId!==n||l.rank!==r||l.props.value!==o||l.readonly!==i||l.childRenderAxis!==d)||E.updateNode({...l,title:t,parentNodeId:n,rank:r,props:{...l.props,value:o},readonly:i,childRenderAxis:d})},Hs=({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!1,childRenderAxis:i="horizontal"})=>{let d=E.getNode(e);if(!d){E.createNode({...de.fieldList({id:e,name:t,parentNodeId:n,rank:r,isVirtual:!0}),readonly:o,childRenderAxis:i});return}!Tt(d)||!(d.title!==t||d.parentNodeId!==n||d.rank!==r||d.readonly!==o||d.childRenderAxis!==i)||E.updateNode({...d,title:t,parentNodeId:n,rank:r,readonly:o,childRenderAxis:i})},zs=e=>{let t=xe(Te/4n),n=xe(Te/2n),r=xe(Te*3n/4n),o=xe(Te);a(t)||a(n)||a(r)||a(o)||(js({id:Rl(e.id),name:G.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"}),Hs({id:bl(e.id),name:G.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0}),Hs({id:Al(e.id),name:G.TAGS,parentNodeId:e.id,rank:r.value,readonly:!0}),js({id:wl(e.id),name:G.HISTORY,parentNodeId:e.id,rank:o.value,value:Tl(e),readonly:!0,childRenderAxis:"vertical"}))},Tl=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=>Ws(r,n.get(r.action)??[])).join(`
59
+ `)};var P=(e,t)=>s(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),Ks=e=>{let t=E.getNode(e);!t||!_(t)||t.isDeleted||zs(t)},Ml=e=>{for(let t of e){Ks(t);let n=v().nodes[t]?.parentNodeId;n&&Ks(n)}},Pl=(e,t)=>{let n=E.getNode(e);n&&E.updateNode({...n,log:[...n.log??[],t]})},kl=e=>{let t=[e],n=v().nodes[e]?.parentNodeId;return n&&t.push(n),t},Ll=e=>{switch(e.action){case"delete.node":case"edit.description":return kl(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[]}},Dl=e=>{ve(t=>({...t,eventLog:[...t.eventLog,e]}))},Fl=e=>{let t=e.userId,n=e.userName;if(!t?.length||!n?.length)return P("Invalid user ID format",e);let r=E.createContributor({id:t,name:n});return a(r)?P(r.message,e):null},Ol=(e,t)=>{let n=Fl(e);if(n)return n;let r=[...new Set(Ll(e))];return t||(r.forEach(o=>Pl(o,e)),Dl(e)),Ml(r),null},Ul={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=de.workspace(t,n,r),i=Vt(o);if(a(i))return P(i.message,e);let d=E.createNode(o);return a(d)?P(d.message??"Failed to initialize workspace",e):Qn(d.value)?c("Workspace initialized",{action:e.action,result:d.value}):s("Unexpected create node return value")},"add.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=E.createNode(de.workspace(t,n,r));return a(o)?P(o.message??"Failed to add workspace",e):Qn(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=E.createNode(de.board(t,n,r,o));return a(i)?P(i.message??"Unable to create board",e):so(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=E.createNode(de.swimlane(t,n,r,o));return a(i)?P(i.message??"Unable to create swimlane",e):Qt(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=E.createNode(de.ticket(t,n,r,o));return a(i)?P(i.message??"Unable to create issue",e):_(i.value)?c("Added issue",{action:e.action,result:i.value}):s("Unexpected create node return value")},"add.field":e=>{let{id:t,name:n,parent:r,val:o,rank:i}=e.payload,d=E.createNode(de.field({id:t,name:n,parentNodeId:r,rank:i,props:{value:o},childRenderAxis:n.includes(G.DESCRIPTION)?"vertical":"horizontal"}));return a(d)?P(d.message??`Unable to create field: ${n}`,e):Be(d.value)?c("Added field",{action:e.action,result:d.value}):s("Unexpected create node return value")},"edit.title":e=>{let{id:t,name:n}=e.payload;if(!E.getNode(t))return P(`Unable to locate node with id ${t}`,e);let o=E.renameNode(t,n);return a(o)?P(o.message??"Unable to edit title",e):c("Edited title",{action:e.action,result:o.value})},"delete.node":e=>{let{id:t}=e.payload,n=E.tombstoneNode(t);return a(n)?P(n.message??"Unable to delete node",e):c("Deleted node",{action:e.action,result:n.value})},"create.tag":e=>{let{id:t,name:n}=e.payload,r=E.createTag({id:t,name:n});return a(r)?P(r.message??"Unable to create tag",e):c("Tag added",{action:e.action,result:r.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,r=E.createContributor({id:t,name:n});return a(r)?P(r.message??"Unable to create contributor",e):c("Contributor created",{action:e.action,result:r.value})},"add.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=E.tag(t,n);return a(r)?P(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=E.untag(t,n);return a(r)?P(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=E.assign(t,n);return a(r)?P(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=E.unassign(t,n);return a(r)?P(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=E.moveNodeToRank({id:t,parentId:n,rank:r});return a(o)?P(o.message??"Failed to move node",e):c("Moved node",{action:e.action,result:o.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,r=E.editValue(t,n);return a(r)?P(r.message??"Unable to edit description",e):c("Set node value",{action:e.action,result:r.value})},"close.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=E.getNode(t);if(!o)return P("Unable to locate issue",e);if(!_(o))return P("Can only close issues",e);let i=E.getNode(re);if(!i)return P("Unable to locate target swimlane",e);if(n!==i.id)return P("Close target must be closed swimlane",e);let d=E.moveNodeToRank({id:t,parentId:n,rank:r});return a(d)?P(d.message??"Unable to close issue",e):c("Issue closed",{action:e.action,result:{id:t}})},"reopen.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=E.getNode(t);if(!o)return P("Unable to locate issue",e);if(!_(o))return P("Can only reopen issues",e);let i=E.getNode(re);if(!i)return P("Unable to locate closed swimlane",e);if(n===i.id)return P("Cannot reopen issue into closed swimlane",e);if(!E.getNode(n))return P("Reopen parent no longer exists",e);let l=E.moveNodeToRank({id:t,parentId:n,rank:r});return a(l)?P(l.message??"Unable to reopen issue",e):c("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=E.lockNode(t);return a(n)?P(n.message??"Unable to lock node",e):c("Node locked",{action:e.action,result:n.value})},"rebalance.children":e=>{let{parent:t,ranks:n}=e.payload;for(let[r,o]of Object.entries(n)){let i=E.getNode(r);if(!i)return P(`Unable to locate node ${r}`,e);if(i.parentNodeId!==t)return P(`Node ${r} is not child of ${t}`,e);let d=E.updateNode({...i,rank:o});if(a(d))return P(d.message??"Unable to rebalance child",e)}return c("Rebalanced children",{action:e.action,result:{parent:t}})}};function Yt(e,t=!1){let n=Ul[e.action](e);if(a(n))return n;let r=Ol(e,t);return r||n}var it=e=>e.map(t=>Yt(t));function Ee(e,t){let n=Yt(e);if(n.status!==Ue.Success)return n;let r=On({event:e,rootDir:t});return a(r)?r:n}function St(e,t){return e.map(n=>Ee(n,t))}var fe=async e=>{let t=await he();return a(t)?t:Ee(e,t.value)};var qs=e=>$n(j(e),{at:"end"}),$n=(e,t={at:"end"})=>{let n=r=>a(r)?c("Rank space exhausted",{rank:"",needsRebalance:!0}):c("Resolved rank",{rank:r.value,needsRebalance:!1});if(e.length===0)return n(oe(void 0,void 0));switch(t.at){case"start":{let r=e[0];return r?n(oe(void 0,r.rank)):s("Unable to resolve first sibling")}case"end":{let r=e[e.length-1];return r?n(oe(r.rank,void 0)):s("Unable to resolve last sibling")}case"before":{let r=Vs(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(oe(o?.rank,i.rank)):s("Sibling not found")}case"after":{let r=Vs(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(oe(o.rank,i?.rank)):s("Sibling not found")}}},j=e=>Object.values(v().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),Vs=(e,t)=>e.findIndex(n=>n.id===t),Gs=(e,t,n={at:"end"})=>$n(j(t).filter(r=>r.id!==e),n),bt=(e,t,n,r,o)=>{let i=Gs(t,e,n);if(a(i))return i;if(!i.value.needsRebalance)return c("Resolved rank",i.value.rank);let d=er(e,r);if(a(d))return d;let l=Ee(d.value,o);if(a(l))return l;let u=Gs(t,e,n);return a(u)?u:u.value.needsRebalance?s("Rank rebalance failed to create space"):c("Resolved rank after rebalance",u.value.rank)},It=(e,t,n)=>{let r=qs(e);if(a(r))return r;if(!r.value.needsRebalance)return c("Resolved rank",r.value.rank);let o=er(e,t);if(a(o))return o;let i=Ee(o.value,n);if(a(i))return i;let d=qs(e);return a(d)?d:d.value.needsRebalance?s("Rank rebalance failed to create space"):c("Resolved rank after rebalance",d.value.rank)};var Xs=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),Js=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=v();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},Bl=e=>{let t=v().nodes[e];return!!t&&!t.isDeleted&&Be(t)&&t.childRenderAxis==="vertical"},Vn=(e,t)=>{let{nodes:n}=v(),r=n[e];if(!r||r.isDeleted)return!1;let o=$(r.id);return A.navigate({contextNode:r,selectedIndex:Xs(t,o.length)}),!0},Zs=e=>{let{nodes:t}=v(),n=t[e];if(!n||n.isDeleted)return!1;let r=n.parentNodeId;if(!r)return Vn(n.id,0);let o=t[r];if(!o||o.isDeleted)return!1;let d=j(o.id).findIndex(l=>l.id===n.id);return d>=0?(A.navigate({contextNode:o,selectedIndex:d}),!0):Zs(o.id)},Ys=e=>{let{nodes:t}=v(),n=e,r=new Set;for(;n&&!r.has(n);){if(r.add(n),Zs(n))return!0;n=t[n]?.parentNodeId}return!1},_l=e=>{if(!e)return!1;let t=v().nodes[e];return!!t&&!t.isDeleted},Qs=e=>{let{nodes:t,rootNodeId:n}=v();if(Bl(e.contextNodeId)&&Vn(e.contextNodeId,e.selectedIndex))return c("Restored navigation inside text container",null);if(_l(e.selectedNodeId)&&e.selectedNodeId&&Ys(e.selectedNodeId))return c("Restored navigation to selected node or ancestor",null);if(Vn(e.contextNodeId,e.selectedIndex))return c("Restored navigation to previous container",null);if(e.parentNodeId&&Vn(e.parentNodeId,e.selectedIndex))return c("Restored navigation to previous parent",null);if(Ys(e.contextNodeId))return c("Restored navigation to previous container or ancestor",null);let r=t[n];if(!r||r.isDeleted)return s("Unable to restore navigation");let o=$(r.id);return A.navigate({contextNode:r,selectedIndex:Xs(e.selectedIndex,o.length)}),c("Restored navigation to root",null)};var Vr=({status:e,msg:t})=>{vt()&&h({syncStatus:{status:e,msg:t}})},Gr=(e="Syncing...")=>{Vr({status:"syncing",msg:e})},Yr=(e="Synced")=>{Vr({status:"synced",msg:e})},$l=e=>{Vr({status:"failed",msg:e})},V=e=>($l(e),s(e));var k=(e,t)=>(a(t)&&logger.info(`[${e}]:failed`,t.message),t);import{decodeTime as Wl}from"ulid";var Zt=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)},Xr=e=>{let[t,n]=e.id;return`${t}:${n??""}`},ea=e=>{try{return Wl(e.id[0])}catch{return 0}},Jr=(e,t)=>{let n=new Map;for(let r of[...e,...t])n.set(Xr(r),r);return[...n.values()].sort((r,o)=>{let i=ea(r)-ea(o);return i!==0?i:Xr(r).localeCompare(Xr(o))})},Zr=e=>e.length===0?"":e.map(t=>JSON.stringify(t)).join(`
61
61
  `)+`
62
- `;var Vn=e=>ye.existsSync(e)?ye.readFileSync(e,"utf8"):null,ta=(e,t)=>Vn(e)===t?!1:(ye.mkdirSync(at.dirname(e),{recursive:!0}),ye.writeFileSync(e,t,"utf8"),!0),Bl=({stateBranchRoot:e,ownEventFileName:t})=>at.join(e,Ye(t)),_l=async({stateBranchRoot:e,ownEventFileName:t})=>{let n=Ye(t),r=at.join(e,n);return(await me({cwd:e,args:["checkout","--",n]})).exitCode!==0&&ye.existsSync(r)&&ye.rmSync(r,{force:!0}),c("Restored own event file to HEAD",null)},Zs=({ownEventPath:e,ownSnapshot:t})=>{if(t===null)return c("No own snapshot to merge",!1);let n=Vn(e)??"",r=Yt(n);if(a(r))return s(r.message);let o=Yt(t);if(a(o))return s(o.message);let i=Yr(r.value,o.value),d=ta(e,Xr(i));return c("Merged own snapshot",d)},$l=e=>{let t=at.join(e,".epiq","events"),n=new Map;if(!ye.existsSync(t))return c("No event files to snapshot",n);for(let r of ye.readdirSync(t)){if(!r.endsWith(".jsonl"))continue;let o=at.join(t,r);ye.statSync(o).isFile()&&n.set(r,ye.readFileSync(o,"utf8"))}return c("Snapshotted event files",n)},Wl=async e=>{if((await me({cwd:e,args:["checkout","--",Ye("")]})).exitCode!==0){let n=at.join(e,".epiq","events");ye.existsSync(n)&&ye.rmSync(n,{recursive:!0,force:!0})}return c("Restored event files to HEAD",null)},jl=({stateBranchRoot:e,snapshots:t})=>{let n=!1;for(let[r,o]of t){let i=at.join(e,Ye(r)),d=Vn(i)??"",l=Yt(d);if(a(l))return s(l.message);let u=Yt(o);if(a(u))return s(u.message);let m=Yr(l.value,u.value);n=ta(i,Xr(m))||n}return c("Merged event snapshots",n)},na=async(e=process.cwd())=>{logger.info("[sync] syncEpiqFromRemote:start",e),qr("Syncing from remote");let t=k("ensureSyncReady",await ra({cwd:e,ensureUpstream:!1}));if(a(t))return V(t.message);let{repoRoot:n,stateBranchRoot:r}=t.value,o=k("getStateBranch",Ge(n));if(a(o))return V(o.message);let i=o.value,d=k("snapshotEventFiles",$l(r));if(a(d))return V(d.message);let l=k("restoreEventFilesToHead",await Wl(r));if(a(l))return V(l.message);let u=k("resetBranchHardToRemote",await No({cwd:r,branch:i}));if(a(u))return V(u.message);let m=k("mergeEventSnapshots",jl({stateBranchRoot:r,snapshots:d.value}));return a(m)?V(m.message):(Vr(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}))},ra=async({cwd:e,ensureUpstream:t})=>{logger.info("[sync] ensureSyncReady:start",{cwd:e,ensureUpstream:t});let n=k("getRepoRootDir",await pt(e));if(a(n))return s(n.message);let r=n.value;logger.info("[sync] repo root",r);let o=k("getStateBranchRoot",sn({repoRoot:r}));if(a(o))return s(o.message);let i=o.value;logger.info("[sync] state branch root",i);let d=k("ensureInitialCommit",await ns(r));if(a(d))return s(d.message);logger.info("[sync] initial commit result",{created:d.value}),logger.info("[sync] bootstrapping state branch storage",{repoRoot:r,stateBranchRoot:i,ensureUpstream:t});let l=k("bootstrapStateBranchStorage",await os({repoRoot:r,stateBranchRoot:i,ensureUpstream:t}));if(a(l))return s(l.message);logger.info("[sync] bootstrap result",{bootstrapped:l.value,stateBranchRoot:i}),logger.info("[sync] checking state branch git operation",{stateBranchRoot:i});let u=k("hasInProgressGitOperation(stateBranchRoot)",await tn(i));if(a(u))return s(u.message);if(logger.info("[sync] state branch git operation check result",{inProgress:u.value}),u.value)return logger.info("[sync] state branch git operation in progress"),s("Cannot sync while a git operation is in progress in the state branch");logger.info("[sync] ensuring state branch layout",{repoRoot:r,stateBranchRoot:i});let m=k("ensureStateBranchLayout",wo(r,i));return a(m)?s(m.message):(logger.info("[sync] state branch layout ready"),logger.info("[sync] ensureSyncReady:done",{repoRoot:r,stateBranchRoot:i,bootstrapped:l.value}),c("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:i,bootstrapped:l.value}))},Qs=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 Fn({stateBranchRoot:t,eventFileName:n}));if(a(r))return s(r.message);let o=k("hasStagedChanges(after stage)",await Io(t));if(a(o))return s(o.message);if(logger.info("[sync] state branch change check after stage result",{changed:o.value}),!o.value)return logger.info("[sync] no own event file changes to commit"),c("No own event file changes to commit",{createdCommit:!1});logger.info("[sync] creating sync commit");let i=k("createStateBranchSyncCommit",await rs({repoRoot:e,stateBranchRoot:t}));return a(i)?s(i.message):(logger.info("[sync] created sync commit",i.value),c("Committed own event file",{createdCommit:!0,commitSha:i.value}))},Jr=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");qr("Syncing");let n=k("ensureSyncReady",await ra({cwd:e,ensureUpstream:!0}));if(a(n))return V(n.message);let{repoRoot:r,stateBranchRoot:o,bootstrapped:i}=n.value;logger.info("[sync] sync preconditions ready",{repoRoot:r,stateBranchRoot:o,bootstrapped:i}),logger.info("[sync] checking detached state branch",{stateBranchRoot:o});let d=k("isDetachedHead(stateBranchRoot)",await So(o));if(a(d))return V(d.message);if(logger.info("[sync] detached state branch check result",{detached:d.value}),d.value)return logger.info("[sync] state branch is detached"),V("Cannot run :sync while the state branch is in detached HEAD state");let l=!1,u,m=!1,p=!1,y=k("getStateBranch",Ge(r));if(a(y))return V(y.message);let h=y.value;logger.info("[sync] resolved state branch",{stateBranch:h,stateBranchRoot:o});let I=Bl({stateBranchRoot:o,ownEventFileName:t}),w=Vn(I),$=k("restoreOwnEventFileToHead",await _l({stateBranchRoot:o,ownEventFileName:t}));if(a($))return V($.message);let S=k("pullBranchRebaseIfPresent",await ir({cwd:o,branch:h}));if(a(S))return V(S.message);m=S.value;let T=k("mergeOwnSnapshot",Zs({ownEventPath:I,ownSnapshot:w}));if(a(T))return V(T.message);let U=k("commitOwnEventFileToStateBranch",await Qs({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(a(U))return V(U.message);if(l=U.value.createdCommit,u=U.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 te=k("pushStateBranch(initial)",await Ht({stateBranchRoot:o,repoRoot:r})),le=te;if(a(te)&&ho(te.message)){logger.info("[sync] non-fast-forward, retrying sync");let ct=k("pullBranchRebaseIfPresent(retry)",await ir({cwd:o,branch:h}));if(a(ct))return V(ct.message);logger.info("[sync] pull retry result",ct.value);let bt=k("mergeOwnSnapshot(retry)",Zs({ownEventPath:I,ownSnapshot:w}));if(a(bt))return V(bt.message);let we=k("commitOwnEventFileToStateBranch(retry)",await Qs({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(a(we))return V(we.message);logger.info("[sync] retry sync result",we.value),we.value.createdCommit&&(l=!0,u=we.value.commitSha),le=k("pushStateBranch(retry)",await Ht({stateBranchRoot:o,repoRoot:r}))}if(a(le))return V(le.message);p=le.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 te=k("git rev-parse HEAD",await D({args:["rev-parse","HEAD"],cwd:o}));if(a(te))return V(te.message);u=te.value.stdout.trim(),logger.info("[sync] final sync commit sha",u)}return Vr(p?"Synced and pushed":m||l||T.value?"Synced local state":"Already synced"),logger.info("[sync] syncEpiqWithRemote:done",{pulled:m,pushed:p,createdCommit:l,bootstrapped:i,commitSha:u}),c("Synced event logs with state branch",{repoRoot:r,stateBranchRoot:o,createdCommit:l,commitSha:u,pulled:m,pushed:p,bootstrapped:i})},je=async()=>{let e=ea();if(e)return e;logger.info("[sync] syncAndReloadState:start");let t=k("resolveActorId",q());if(a(t)||!t.value)return logger.info("[sync] unable to resolve actor id"),s("Unable to resolve event log path");let n=nt(t.value);logger.info("[sync] resolved own event file name",{ownEventFileName:n});let r=k("syncEpiqWithRemote",await Jr({ownEventFileName:n}));if(a(r))return logger.info("[sync] syncAndReloadState:sync failed",r.message),s(`Unable to sync state. ${r.message}`);let{stateBranchRoot:o}=r.value;logger.info("[sync] loading merged events after sync",{stateBranchRoot:o});let i=k("loadMergedEvents",ht(o));if(a(i))return s(`Unable to load events. ${i.message}`);logger.info("[sync] loaded merged events after sync",{count:i.value.length});let d=ea();if(d)return d;let l=Gs(),u=k("bootStateFromEventLog",On(i.value));if(a(u))return s(`Unable to boot synced state. ${u.message}`);logger.info("[sync] booted state from synced events"),E({hasProjectDefinition:!0,syncStatus:{msg:"Synced",status:"synced"}});let m=k("restoreNavigationAnchor",Xs(l));return a(m)?m:(logger.info("[sync] syncAndReloadState:done"),c("Synced",!0))},ea=()=>v().mode===g.DEFAULT?null:(E({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),s("Will not re-materialize if not in default mode, to not lose edit data"));var ia=e=>{let t=$e(e??process.cwd());return a(t)?s(t.message):c("Resolved Epiq repo root",t.value)},dt=async e=>{let t=ia(e);if(a(t))return t;let n=await na(t.value);if(a(n))return s(n.message);let{stateBranchRoot:r}=n.value,o=ht(r);if(a(o))return s(o.message);let i=On(o.value);return a(i)?s(i.message):c("Booted Epiq state",{repoRoot:t.value,stateBranchRoot:r})},Gn=()=>{let e=Hi();return a(e)?s(e.message):e.value.userId?e.value.userName?c("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):s("Unable to retrieve user name"):s("Unable to retrieve user id")},Yn=()=>{let e=Ie();return a(e)?s(e.message):e},Hl=e=>(e.props.tags??[]).map(t=>N.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name})),zl=e=>(e.props.assignees??[]).map(t=>N.getContributor(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name})),sa=async(e={})=>{let t=await dt(e.repoRoot);if(a(t))return t;let n=Yn();if(a(n))return n;let r=Object.values(n.value.nodes).filter(o=>o.context==="BOARD").map(o=>({id:o.id,title:o.title,parentId:o.parentNodeId,readonly:!!o.readonly}));return c("Listed boards",r)},aa=async(e={})=>{let t=await dt(e.repoRoot);if(a(t))return t;let n=Yn();if(a(n))return n;let r=Object.values(n.value.nodes).filter(o=>o.context==="SWIMLANE").filter(o=>!e.boardId||o.parentNodeId===e.boardId).map(o=>({id:o.id,title:o.title,boardId:o.parentNodeId,isClosed:o.id===re,readonly:!!o.readonly}));return c("Listed swimlanes",r)},da=async e=>{let t=await dt(e.repoRoot);if(a(t))return t;let n=Yn();if(a(n))return n;let r=Object.values(n.value.nodes).filter(O).filter(o=>e.includeClosed||o.parentNodeId!==re).map(o=>({id:o.id,title:un(o.title),description:o.props.description??"",parentId:o.parentNodeId,isClosed:o.parentNodeId===re,readonly:!!o.readonly,tags:Hl(o),assignees:zl(o)}));return c("Listed issues",r)},ca=async e=>{let t=await dt(e.repoRoot);if(a(t))return t;let n=Gn();if(a(n))return n;let r=Nt(e.parentId,n.value,t.value.stateBranchRoot);if(a(r))return r;let o=_n({name:e.title,parent:e.parentId,user:n.value,rank:r.value});if(a(o))return o;let i=o.value,l=It(i,t.value.stateBranchRoot).find(a);if(l)return s(l.message);let u=await je();if(a(u))return u;let m=i.find(p=>p.action==="add.issue")?.payload.id;return m?c("Created issue",{id:m,title:e.title,parentId:e.parentId}):s("Unable to determine created issue id")},la=async e=>{let t=await dt(e.repoRoot);if(a(t))return t;let n=Gn();if(a(n))return n;let r=Ct(re,e.issueId,{at:"end"},n.value,t.value.stateBranchRoot);if(a(r))return r;let o={id:oa(),...n.value,action:"close.issue",payload:{id:e.issueId,parent:re,rank:r.value}},d=It([o],t.value.stateBranchRoot).find(a);if(d)return s(d.message);let l=await je();return a(l)?l:c("Closed issue",{id:e.issueId})},ua=async e=>{let t=await dt(e.repoRoot);if(a(t))return t;let n=Gn();if(a(n))return n;let r=Ct(e.parentId,e.issueId,e.position??{at:"end"},n.value,t.value.stateBranchRoot);if(a(r))return r;let o={id:oa(),...n.value,action:"move.node",payload:{id:e.issueId,parent:e.parentId,rank:r.value}},d=It([o],t.value.stateBranchRoot).find(a);if(d)return s(d.message);let l=await je();return a(l)?l:c("Moved issue",{id:e.issueId,parentId:e.parentId})},ma=async(e={})=>{let t=ia(e.repoRoot);if(a(t))return s("Sync failed");let n=Gn();if(a(n))return n;let r=await Jr({cwd:t.value,ownEventFileName:nt(n.value)});return a(r)?r:c("Synced",r.value)},pa=async(e={})=>{let t=await dt(e.repoRoot);if(a(t))return t;let n=Yn();return a(n)?n:c("Retrieved Epiq state",{root:t.value.repoRoot,stateBranchRoot:t.value.stateBranchRoot,nodes:n.value.nodes,rootNodeId:n.value.rootNodeId,contextNode:n.value.contextNode,selectedIndex:n.value.selectedIndex,eventLog:n.value.eventLog})};var Ve=e=>({isError:a(e),content:[{type:"text",text:JSON.stringify(e,null,2)}]}),Vl=()=>{let e=new Kl({name:"epiq",version:"0.2.30"});return e.registerTool("epiq_state_get",{description:"Get the full current Epiq state, including nodes and event log",inputSchema:L.object({repoRoot:L.string().optional()})},async t=>Ve(await pa(t))),e.registerTool("epiq_issue_list",{description:"List Epiq issues",inputSchema:L.object({repoRoot:L.string().optional(),includeClosed:L.boolean().optional()})},async t=>Ve(await da(t))),e.registerTool("epiq_board_list",{description:"List Epiq boards",inputSchema:L.object({repoRoot:L.string().optional()})},async t=>Ve(await sa(t))),e.registerTool("epiq_swimlane_list",{description:"List Epiq swimlanes",inputSchema:L.object({repoRoot:L.string().optional(),boardId:L.string().optional()})},async t=>Ve(await aa(t))),e.registerTool("epiq_issue_create",{description:"Create an Epiq issue",inputSchema:L.object({title:L.string().min(1),parentId:L.string().min(1),repoRoot:L.string().optional()})},async t=>Ve(await ca(t))),e.registerTool("epiq_issue_close",{description:"Close an Epiq issue",inputSchema:L.object({issueId:L.string().min(1),repoRoot:L.string().optional()})},async t=>Ve(await la(t))),e.registerTool("epiq_issue_move",{description:"Move an Epiq issue to another swimlane",inputSchema:L.object({issueId:L.string().min(1),parentId:L.string().min(1),position:L.discriminatedUnion("at",[L.object({at:L.literal("start")}),L.object({at:L.literal("end")}),L.object({at:L.literal("before"),sibling:L.string().min(1)}),L.object({at:L.literal("after"),sibling:L.string().min(1)})]).optional(),repoRoot:L.string().optional()})},async t=>Ve(await ua(t))),e.registerTool("epiq_sync",{description:"Sync Epiq state with the configured Git remote",inputSchema:L.object({repoRoot:L.string().optional()})},async t=>Ve(await ma(t))),e},Gl=async()=>{let e=Vl(),t=new ql;await e.connect(t)};await Gl();export{Vl as createMcpServer,Ve as resultJson,Gl as startMcpServer};
62
+ `;var Gn=e=>ye.existsSync(e)?ye.readFileSync(e,"utf8"):null,oa=(e,t)=>Gn(e)===t?!1:(ye.mkdirSync(ct.dirname(e),{recursive:!0}),ye.writeFileSync(e,t,"utf8"),!0),jl=({stateBranchRoot:e,ownEventFileName:t})=>ct.join(e,Je(t)),Hl=async({stateBranchRoot:e,ownEventFileName:t})=>{let n=Je(t),r=ct.join(e,n);return(await me({cwd:e,args:["checkout","--",n]})).exitCode!==0&&ye.existsSync(r)&&ye.rmSync(r,{force:!0}),c("Restored own event file to HEAD",null)},ta=({ownEventPath:e,ownSnapshot:t})=>{if(t===null)return c("No own snapshot to merge",!1);let n=Gn(e)??"",r=Zt(n);if(a(r))return s(r.message);let o=Zt(t);if(a(o))return s(o.message);let i=Jr(r.value,o.value),d=oa(e,Zr(i));return c("Merged own snapshot",d)},zl=e=>{let t=ct.join(e,".epiq","events"),n=new Map;if(!ye.existsSync(t))return c("No event files to snapshot",n);for(let r of ye.readdirSync(t)){if(!r.endsWith(".jsonl"))continue;let o=ct.join(t,r);ye.statSync(o).isFile()&&n.set(r,ye.readFileSync(o,"utf8"))}return c("Snapshotted event files",n)},Kl=async e=>{if((await me({cwd:e,args:["checkout","--",Je("")]})).exitCode!==0){let n=ct.join(e,".epiq","events");ye.existsSync(n)&&ye.rmSync(n,{recursive:!0,force:!0})}return c("Restored event files to HEAD",null)},ql=({stateBranchRoot:e,snapshots:t})=>{let n=!1;for(let[r,o]of t){let i=ct.join(e,Je(r)),d=Gn(i)??"",l=Zt(d);if(a(l))return s(l.message);let u=Zt(o);if(a(u))return s(u.message);let m=Jr(l.value,u.value);n=oa(i,Zr(m))||n}return c("Merged event snapshots",n)},ia=async(e=process.cwd())=>{logger.info("[sync] syncEpiqFromRemote:start",e),Gr("Syncing from remote");let t=k("ensureSyncReady",await sa({cwd:e,ensureUpstream:!1}));if(a(t))return V(t.message);let{repoRoot:n,stateBranchRoot:r}=t.value,o=k("getStateBranch",Xe(n));if(a(o))return V(o.message);let i=o.value,d=k("snapshotEventFiles",zl(r));if(a(d))return V(d.message);let l=k("restoreEventFilesToHead",await Kl(r));if(a(l))return V(l.message);let u=k("resetBranchHardToRemote",await So({cwd:r,branch:i}));if(a(u))return V(u.message);let m=k("mergeEventSnapshots",ql({stateBranchRoot:r,snapshots:d.value}));return a(m)?V(m.message):(Yr(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}))},sa=async({cwd:e,ensureUpstream:t})=>{logger.info("[sync] ensureSyncReady:start",{cwd:e,ensureUpstream:t});let n=k("getRepoRootDir",await We(e));if(a(n))return s(n.message);let r=n.value;logger.info("[sync] repo root",r);let o=k("getStateBranchRoot",gt({repoRoot:r}));if(a(o))return s(o.message);let i=o.value;logger.info("[sync] state branch root",i);let d=k("ensureInitialCommit",await rs(r));if(a(d))return s(d.message);logger.info("[sync] initial commit result",{created:d.value}),logger.info("[sync] bootstrapping state branch storage",{repoRoot:r,stateBranchRoot:i,ensureUpstream:t});let l=k("bootstrapStateBranchStorage",await is({repoRoot:r,stateBranchRoot:i,ensureUpstream:t}));if(a(l))return s(l.message);logger.info("[sync] bootstrap result",{bootstrapped:l.value,stateBranchRoot:i}),logger.info("[sync] checking state branch git operation",{stateBranchRoot:i});let u=k("hasInProgressGitOperation(stateBranchRoot)",await sn(i));if(a(u))return s(u.message);if(logger.info("[sync] state branch git operation check result",{inProgress:u.value}),u.value)return logger.info("[sync] state branch git operation in progress"),s("Cannot sync while a git operation is in progress in the state branch");logger.info("[sync] ensuring state branch layout",{repoRoot:r,stateBranchRoot:i});let m=k("ensureStateBranchLayout",Mo(r,i));return a(m)?s(m.message):(logger.info("[sync] state branch layout ready"),logger.info("[sync] ensureSyncReady:done",{repoRoot:r,stateBranchRoot:i,bootstrapped:l.value}),c("Sync preconditions satisfied",{repoRoot:r,stateBranchRoot:i,bootstrapped:l.value}))},na=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 Bn({stateBranchRoot:t,eventFileName:n}));if(a(r))return s(r.message);let o=k("hasStagedChanges(after stage)",await Co(t));if(a(o))return s(o.message);if(logger.info("[sync] state branch change check after stage result",{changed:o.value}),!o.value)return logger.info("[sync] no own event file changes to commit"),c("No own event file changes to commit",{createdCommit:!1});logger.info("[sync] creating sync commit");let i=k("createStateBranchSyncCommit",await os({repoRoot:e,stateBranchRoot:t}));return a(i)?s(i.message):(logger.info("[sync] created sync commit",i.value),c("Committed own event file",{createdCommit:!0,commitSha:i.value}))},Qr=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");Gr("Syncing");let n=k("ensureSyncReady",await sa({cwd:e,ensureUpstream:!0}));if(a(n))return V(n.message);let{repoRoot:r,stateBranchRoot:o,bootstrapped:i}=n.value;logger.info("[sync] sync preconditions ready",{repoRoot:r,stateBranchRoot:o,bootstrapped:i}),logger.info("[sync] checking detached state branch",{stateBranchRoot:o});let d=k("isDetachedHead(stateBranchRoot)",await Ro(o));if(a(d))return V(d.message);if(logger.info("[sync] detached state branch check result",{detached:d.value}),d.value)return logger.info("[sync] state branch is detached"),V("Cannot run :sync while the state branch is in detached HEAD state");let l=!1,u,m=!1,g=!1,y=k("getStateBranch",Xe(r));if(a(y))return V(y.message);let N=y.value;logger.info("[sync] resolved state branch",{stateBranch:N,stateBranchRoot:o});let I=jl({stateBranchRoot:o,ownEventFileName:t}),C=Gn(I),D=k("restoreOwnEventFileToHead",await Hl({stateBranchRoot:o,ownEventFileName:t}));if(a(D))return V(D.message);let R=k("pullBranchRebaseIfPresent",await sr({cwd:o,branch:N}));if(a(R))return V(R.message);m=R.value;let M=k("mergeOwnSnapshot",ta({ownEventPath:I,ownSnapshot:C}));if(a(M))return V(M.message);let B=k("commitOwnEventFileToStateBranch",await na({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(a(B))return V(B.message);if(l=B.value.createdCommit,u=B.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 te=k("pushStateBranch(initial)",await Kt({stateBranchRoot:o,repoRoot:r})),le=te;if(a(te)&&No(te.message)){logger.info("[sync] non-fast-forward, retrying sync");let ut=k("pullBranchRebaseIfPresent(retry)",await sr({cwd:o,branch:N}));if(a(ut))return V(ut.message);logger.info("[sync] pull retry result",ut.value);let At=k("mergeOwnSnapshot(retry)",ta({ownEventPath:I,ownSnapshot:C}));if(a(At))return V(At.message);let we=k("commitOwnEventFileToStateBranch(retry)",await na({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(a(we))return V(we.message);logger.info("[sync] retry sync result",we.value),we.value.createdCommit&&(l=!0,u=we.value.commitSha),le=k("pushStateBranch(retry)",await Kt({stateBranchRoot:o,repoRoot:r}))}if(a(le))return V(le.message);g=le.value,logger.info("[sync] pushed to state branch",g)}else logger.info("[sync] no commit created, skipped push");if(l){logger.info("[sync] resolving final sync commit sha",{stateBranchRoot:o});let te=k("git rev-parse HEAD",await F({args:["rev-parse","HEAD"],cwd:o}));if(a(te))return V(te.message);u=te.value.stdout.trim(),logger.info("[sync] final sync commit sha",u)}return Yr(g?"Synced and pushed":m||l||M.value?"Synced local state":"Already synced"),logger.info("[sync] syncEpiqWithRemote:done",{pulled:m,pushed:g,createdCommit:l,bootstrapped:i,commitSha:u}),c("Synced event logs with state branch",{repoRoot:r,stateBranchRoot:o,createdCommit:l,commitSha:u,pulled:m,pushed:g,bootstrapped:i})},He=async()=>{let e=ra();if(e)return e;logger.info("[sync] syncAndReloadState:start");let t=k("resolveActorId",q());if(a(t)||!t.value)return logger.info("[sync] unable to resolve actor id"),s("Unable to resolve event log path");let n=ot(t.value);logger.info("[sync] resolved own event file name",{ownEventFileName:n});let r=k("syncEpiqWithRemote",await Qr({ownEventFileName:n}));if(a(r))return logger.info("[sync] syncAndReloadState:sync failed",r.message),s(`Unable to sync state. ${r.message}`);let{stateBranchRoot:o}=r.value;logger.info("[sync] loading merged events after sync",{stateBranchRoot:o});let i=k("loadMergedEvents",Et(o));if(a(i))return s(`Unable to load events. ${i.message}`);logger.info("[sync] loaded merged events after sync",{count:i.value.length});let d=ra();if(d)return d;let l=Js(),u=k("bootStateFromEventLog",_n(i.value));if(a(u))return s(`Unable to boot synced state. ${u.message}`);logger.info("[sync] booted state from synced events"),h({hasProjectDefinition:!0,syncStatus:{msg:"Synced",status:"synced"}});let m=k("restoreNavigationAnchor",Qs(l));return a(m)?m:(logger.info("[sync] syncAndReloadState:done"),c("Synced",!0))},ra=()=>v().mode===p.DEFAULT?null:(h({syncStatus:{msg:"Reload skipped while editing",status:"pending"}}),s("Will not re-materialize if not in default mode, to not lose edit data"));var da=e=>{let t=$e(e??process.cwd());return a(t)?s(t.message):c("Resolved Epiq repo root",t.value)},lt=async e=>{let t=da(e);if(a(t))return t;let n=await ia(t.value);if(a(n))return s(n.message);let{stateBranchRoot:r}=n.value,o=Et(r);if(a(o))return s(o.message);let i=_n(o.value);return a(i)?s(i.message):c("Booted Epiq state",{repoRoot:t.value,stateBranchRoot:r})},Yn=()=>{let e=Ki();return a(e)?s(e.message):e.value.userId?e.value.userName?c("Resolved actor",{userId:e.value.userId,userName:e.value.userName}):s("Unable to retrieve user name"):s("Unable to retrieve user id")},Xn=()=>{let e=Ie();return a(e)?s(e.message):e},Vl=e=>(e.props.tags??[]).map(t=>E.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name})),Gl=e=>(e.props.assignees??[]).map(t=>E.getContributor(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name})),ca=async(e={})=>{let t=await lt(e.repoRoot);if(a(t))return t;let n=Xn();if(a(n))return n;let r=Object.values(n.value.nodes).filter(o=>o.context==="BOARD").map(o=>({id:o.id,title:o.title,parentId:o.parentNodeId,readonly:!!o.readonly}));return c("Listed boards",r)},la=async(e={})=>{let t=await lt(e.repoRoot);if(a(t))return t;let n=Xn();if(a(n))return n;let r=Object.values(n.value.nodes).filter(o=>o.context==="SWIMLANE").filter(o=>!e.boardId||o.parentNodeId===e.boardId).map(o=>({id:o.id,title:o.title,boardId:o.parentNodeId,isClosed:o.id===re,readonly:!!o.readonly}));return c("Listed swimlanes",r)},ua=async e=>{let t=await lt(e.repoRoot);if(a(t))return t;let n=Xn();if(a(n))return n;let r=Object.values(n.value.nodes).filter(_).filter(o=>e.includeClosed||o.parentNodeId!==re).map(o=>({id:o.id,title:gn(o.title),description:o.props.description??"",parentId:o.parentNodeId,isClosed:o.parentNodeId===re,readonly:!!o.readonly,tags:Vl(o),assignees:Gl(o)}));return c("Listed issues",r)},ma=async e=>{let t=await lt(e.repoRoot);if(a(t))return t;let n=Yn();if(a(n))return n;let r=It(e.parentId,n.value,t.value.stateBranchRoot);if(a(r))return r;let o=jn({name:e.title,parent:e.parentId,user:n.value,rank:r.value});if(a(o))return o;let i=o.value,l=St(i,t.value.stateBranchRoot).find(a);if(l)return s(l.message);let u=await He();if(a(u))return u;let m=i.find(g=>g.action==="add.issue")?.payload.id;return m?c("Created issue",{id:m,title:e.title,parentId:e.parentId}):s("Unable to determine created issue id")},pa=async e=>{let t=await lt(e.repoRoot);if(a(t))return t;let n=Yn();if(a(n))return n;let r=bt(re,e.issueId,{at:"end"},n.value,t.value.stateBranchRoot);if(a(r))return r;let o={id:aa(),...n.value,action:"close.issue",payload:{id:e.issueId,parent:re,rank:r.value}},d=St([o],t.value.stateBranchRoot).find(a);if(d)return s(d.message);let l=await He();return a(l)?l:c("Closed issue",{id:e.issueId})},ga=async e=>{let t=await lt(e.repoRoot);if(a(t))return t;let n=Yn();if(a(n))return n;let r=bt(e.parentId,e.issueId,e.position??{at:"end"},n.value,t.value.stateBranchRoot);if(a(r))return r;let o={id:aa(),...n.value,action:"move.node",payload:{id:e.issueId,parent:e.parentId,rank:r.value}},d=St([o],t.value.stateBranchRoot).find(a);if(d)return s(d.message);let l=await He();return a(l)?l:c("Moved issue",{id:e.issueId,parentId:e.parentId})},fa=async(e={})=>{let t=da(e.repoRoot);if(a(t))return s("Sync failed");let n=Yn();if(a(n))return n;let r=await Qr({cwd:t.value,ownEventFileName:ot(n.value)});return a(r)?r:c("Synced",r.value)},va=async(e={})=>{let t=await lt(e.repoRoot);if(a(t))return t;let n=Xn();return a(n)?n:c("Retrieved Epiq state",{root:t.value.repoRoot,stateBranchRoot:t.value.stateBranchRoot,nodes:n.value.nodes,rootNodeId:n.value.rootNodeId,contextNode:n.value.contextNode,selectedIndex:n.value.selectedIndex,eventLog:n.value.eventLog})};var Ye=e=>({isError:a(e),content:[{type:"text",text:JSON.stringify(e,null,2)}]}),Jl=()=>{let e=new Yl({name:"epiq",version:"0.2.30"});return e.registerTool("epiq_state_get",{description:"Get the full current Epiq state, including nodes and event log",inputSchema:L.object({repoRoot:L.string().optional()})},async t=>Ye(await va(t))),e.registerTool("epiq_issue_list",{description:"List Epiq issues",inputSchema:L.object({repoRoot:L.string().optional(),includeClosed:L.boolean().optional()})},async t=>Ye(await ua(t))),e.registerTool("epiq_board_list",{description:"List Epiq boards",inputSchema:L.object({repoRoot:L.string().optional()})},async t=>Ye(await ca(t))),e.registerTool("epiq_swimlane_list",{description:"List Epiq swimlanes",inputSchema:L.object({repoRoot:L.string().optional(),boardId:L.string().optional()})},async t=>Ye(await la(t))),e.registerTool("epiq_issue_create",{description:"Create an Epiq issue",inputSchema:L.object({title:L.string().min(1),parentId:L.string().min(1),repoRoot:L.string().optional()})},async t=>Ye(await ma(t))),e.registerTool("epiq_issue_close",{description:"Close an Epiq issue",inputSchema:L.object({issueId:L.string().min(1),repoRoot:L.string().optional()})},async t=>Ye(await pa(t))),e.registerTool("epiq_issue_move",{description:"Move an Epiq issue to another swimlane",inputSchema:L.object({issueId:L.string().min(1),parentId:L.string().min(1),position:L.discriminatedUnion("at",[L.object({at:L.literal("start")}),L.object({at:L.literal("end")}),L.object({at:L.literal("before"),sibling:L.string().min(1)}),L.object({at:L.literal("after"),sibling:L.string().min(1)})]).optional(),repoRoot:L.string().optional()})},async t=>Ye(await ga(t))),e.registerTool("epiq_sync",{description:"Sync Epiq state with the configured Git remote",inputSchema:L.object({repoRoot:L.string().optional()})},async t=>Ye(await fa(t))),e},Zl=async()=>{let e=Jl(),t=new Xl;await e.connect(t)};await Zl();export{Jl as createMcpServer,Ye as resultJson,Zl as startMcpServer};