epiq 0.6.7 → 0.6.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +47 -47
- package/dist/mcp.js +37 -37
- package/package.json +1 -1
- package/readme.md +1 -11
package/dist/mcp.js
CHANGED
|
@@ -1,62 +1,62 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{McpServer as ql}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as
|
|
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
|
|
4
|
-
`);if(n[n.length-1]===""&&n.pop(),n.length<=
|
|
2
|
+
import{McpServer as ql}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as Gl}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as L}from"zod";var Fe={None:"none",Success:"success",Fail:"fail"},s=e=>({status:Fe.Fail,message:e,value:null}),c=(e,t)=>({status:Fe.Success,message:e,value:t}),a=e=>e.status==="fail",St=e=>e.status==="success";import{ulid as ia}from"ulid";import be from"node:fs";import Gt from"node:path";var b={WORKSPACE:"WORKSPACE",BOARD:"BOARD",SWIMLANE:"SWIMLANE",TICKET:"TICKET",FIELD:"FIELD",FIELD_LIST:"FIELD_LIST",TEXT:"TEXT"};function Xn(e){return e.context===b.WORKSPACE}function U(e){return e.context===b.TICKET}function ro(e){return e.context===b.TEXT}function Oe(e){return e.context===b.FIELD}function Ct(e){return e.context===b.FIELD_LIST}var Yt=e=>e.context===b.SWIMLANE,oo=e=>e.context===b.BOARD;import{ulid as ha}from"ulid";var dt=24n,ya=dt*4n,Ae=(1n<<ya)-1n,xa=/^[0-9a-f]+$/;function io(e){return!e||!xa.test(e)?s(`Invalid hex rank: ${e}`):c("Converted rank to bigint",BigInt("0x"+e))}function ge(e,t=dt){if(e<0n)return s("Negative rank not allowed");let n=e.toString(16);return c("Converted bigint to hex rank",n.padStart(Number(t),"0"))}function re(e,t){if(!e&&!t)return ge(Ae/2n,dt);let n=e?io(e):c("Resolved lower bound",0n);if(a(n))return n;let r=t?io(t):c("Resolved upper bound",Ae);if(a(r))return r;let o=n.value,i=r.value;if(i<=o)return ge(Ae/2n,dt);let d=(o+i)/2n;return d===o||d===i?s("No rank space available between neighbors"):ge(d,dt)}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=Ae*BigInt(r+1)/(t+1n),i=ge(o,dt);if(a(i))return i;n.push(i.value)}return c("Resolved evenly spaced ranks",n)}var Jn=(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:ha(),action:"rebalance.children",payload:{parent:e,ranks:o},...t})};import Pt from"node:fs";import Te from"node:path";import or from"node:fs";import Ma from"node:os";import xe from"node:path";import Rt from"node:fs";import{ulid as Ea}from"ulid";import{z as Xt}from"zod";var Na="__epiq_state__",Ia=Xt.object({projectId:Xt.string().min(1),stateBranch:Xt.string().min(1),createdAt:Xt.iso.datetime()}),ao=()=>({projectId:Ea(),stateBranch:Na,createdAt:new Date().toISOString()}),Ue=e=>{let t=Zt(e);if(!Rt.existsSync(t))return s("Missing .epiq/project.json");try{let n=Rt.readFileSync(t,"utf8"),r=JSON.parse(n),o=Ia.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=Ue(e);return a(t)?s(t.message):c("Read projectId",t.value.projectId)},lo=({repoRoot:e,fileContents:t})=>{let n=Jt(e),r=Zt(e);try{if(Rt.mkdirSync(n,{recursive:!0}),Rt.existsSync(r)){let o=Ue(e);return a(o)?s(o.message):c("Project already initialized",null)}return Rt.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 Zn=(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 bt from"fs";import mo from"path";import Sa from"util";var uo=1e3,Ca=50,Qn=0,po=()=>{let e=process.cwd(),t=Qt(e);if(!a(t))return mo.join(t.value,we,"log","epiq.log")};function Ra(){let e=po();if(!e||!bt.existsSync(e))return;let n=bt.readFileSync(e,"utf8").split(`
|
|
4
|
+
`);if(n[n.length-1]===""&&n.pop(),n.length<=uo)return;let r=n.slice(-uo).join(`
|
|
5
5
|
`)+`
|
|
6
|
-
`;bt.writeFileSync(e,r,"utf8")}function
|
|
7
|
-
`;bt.mkdirSync(
|
|
8
|
-
`);u(n?{stdout:d,stderr:g,exitCode:124}:s(g))},
|
|
6
|
+
`;bt.writeFileSync(e,r,"utf8")}function er(e,t,n=!1){let r=po();if(!r)return;let o=Sa.format(...t),i=new Date,l=`[${n?i.toISOString().slice(11,19):i.toISOString()}] ${e} ${o}
|
|
7
|
+
`;bt.mkdirSync(mo.dirname(r),{recursive:!0}),bt.appendFileSync(r,l,"utf8"),Qn++,Qn>=Ca&&(Qn=0,Ra())}var te={info(...e){er("[Info]",e,!1)},debug(...e){er("[debug]",e,!0)},error(...e){let t=e.find(n=>n instanceof Error)instanceof Error?void 0:new Error().stack;er("[Error]",[...e,t].filter(Boolean),!1)}};globalThis.logger=te;import{spawn as ba}from"node:child_process";import en from"node:fs";import At 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 Ye=e=>{let t=Be(e);if(a(t))return s("Unable to resolve epiq project root");let n=Ue(t.value);return a(n)?s("Unable to read project.json"):c("Resolved state branch",n.value.stateBranch)},oe="origin";var go=1e4,Aa={...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:"echo"},vo=({args:e,cwd:t,allowFail:n})=>new Promise(r=>{if(!en.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=ba("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:Aa}),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 ${go}ms`].join(`
|
|
8
|
+
`);u(n?{stdout:d,stderr:g,exitCode:124}:s(g))},go);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
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}))})}),D=({args:e,cwd:t})=>
|
|
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}),fe=({args:e,cwd:t})=>vo({args:e,cwd:t,allowFail:!0}),ct=async({cwd:e,message:t})=>{let n=await z.commit({cwd:e,message:t});if(a(n))return s(`Failed to create commit
|
|
11
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())},
|
|
13
|
-
`).filter(i=>i.startsWith("worktree ")).map(i=>i.slice(9)).map(
|
|
14
|
-
${r.message}`);let o=await
|
|
15
|
-
${i.message}`):c("Reset branch from remote",!0)},
|
|
12
|
+
${r.message}`):c("Created commit and resolved SHA",r.value.stdout.trim())},wa=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",At.isAbsolute(n)?n:At.resolve(e,n))},Ta=async e=>{let t=await wa(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(At.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(At.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 Ta(e);return a(t)?s(t.message):c("Checked for in-progress Git operation",t.value!==null)},tr=async({repoRoot:e})=>{let n=(await fe({args:["remote","get-url",oe],cwd:e})).exitCode===0;return c(`Checked remote ${n}`,n)},wt=async({repoRoot:e,branch:t})=>{let n=await fe({args:["ls-remote","--heads",oe,t],cwd:e});return n.exitCode!==0?s(n.stderr.trim()||`Unable to inspect remote branch ${oe}/${t}`):c("Checked remote branch",n.stdout.trim().length>0)},nn=async({repoRoot:e,branch:t})=>{let n=await fe({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 At.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)},nr=async e=>{let t=await fe({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 fe({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 wt({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:oe,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",`${oe}/${t}`]});return a(i)?s(`Failed to reset ${t} from remote
|
|
15
|
+
${i.message}`):c("Reset branch from remote",!0)},rr=async({cwd:e,branch:t})=>{let n=await wt({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:oe,branch:t});if(a(o))return s(`Failed to fetch ${t}
|
|
16
16
|
${o.message}`);let i=await z.pullRebase({cwd:e,remote:oe,branch:t});return a(i)?s(`Failed during pull --rebase
|
|
17
|
-
${i.message}`):c("Pulled with rebase",!0)},
|
|
17
|
+
${i.message}`):c("Pulled with rebase",!0)},Io=async e=>{let t=await fe({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 Ro="4b825dc642cb6eb9a060e54bf8d69288fbee4904",Mt=e=>xe.join(we,an,e),bo=()=>xe.join(Ma.homedir(),le),on=()=>xe.join(bo(),"worktrees"),lt=({repoRoot:e})=>{let t=co(e);return a(t)?s(t.message):c("Resolved state branch root",xe.join(on(),t.value))},Pa=e=>xe.join(e,we),Co=e=>xe.join(Pa(e),an);var Tt=e=>{try{return or.mkdirSync(e,{recursive:!0}),c("Ensured directory",void 0)}catch(t){return s(t instanceof Error?t.message:String(t))}},sn=()=>{let e=Tt(bo());if(a(e))return s(`Ensure epiq home failed.
|
|
18
18
|
`+e.message);let t=Tt(on());return a(t)?s(`Ensure worktrees dir failed.
|
|
19
|
-
`+t.message):c("Ensured epiq storage",!0)},
|
|
19
|
+
`+t.message):c("Ensured epiq storage",!0)},Ao=e=>{or.existsSync(e)&&(te.debug("[sync] remove path",e),or.rmSync(e,{recursive:!0,force:!0}))};var wo=(e,t)=>{for(let n of[Co(e),Co(t)]){let r=Tt(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
|
|
20
20
|
`+t.message);let r=t.value.stdout.trim().split(`
|
|
21
|
-
`).filter(Boolean).filter(d=>d!==
|
|
22
|
-
${o.message}`);let i=await ct({cwd:e,message:"[epiq:repair-storage-branch]"});return a(i)?s(i.message):c("Cleaned storage branch",!0)},_e=Jn(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=>xe.resolve(e)),Yu=Jn(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=xe.isAbsolute(n)?n:xe.join(e,n);return c("Resolved git dir",r)},e=>xe.resolve(e));var nm=process.env.IS_LOCAL==="true",Ae=".epiq",le=".epiq-global",an="events",Pa="project.json",Jt=e=>we.join(e,Ae),Zt=e=>we.join(Jt(e),Pa),kt=e=>we.join(Jt(e),an),To=e=>we.join(e,Ae),ka=e=>{let t=we.join(e,Ae);return Pt.existsSync(t)&&Pt.statSync(t).isDirectory()},or=e=>{let t=Zt(e);return Pt.existsSync(t)&&Pt.statSync(t).isFile()},Qt=e=>{let t=we.resolve(e);for(;;){if(ka(t))return c("Resolved closest .epiq root",t);let n=we.dirname(t);if(n===t)return s("No .epiq directory found in any parent");t=n}},Be=e=>{let t=we.resolve(e);for(;;){if(or(t))return c("Resolved closest epiq project root",t);let n=we.dirname(t);if(n===t)return s("No .epiq/project.json found in any parent");t=n}},Mo=e=>{let t=kt(e);try{return Pt.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")}},ve=async()=>{let e=await _e(process.cwd());if(a(e))return e;let t=lt({repoRoot:e.value});return a(t)?t:c("Resolved persist root",t.value)};var V={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History"};import{useSyncExternalStore as dl}from"react";var p={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette"};function dn(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var cn=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",ln=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var Po=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},ko=(e,t)=>t?e.get(t)??[]:[];var Lo=new WeakMap,La=e=>{let t=Lo.get(e);return t||(t=Po(e),Lo.set(e,t)),t};var Do=({wordList:e,inputToMatch:t,overlapThreshold:n=1})=>{let r=t.toLowerCase();return ko(La(e),r).filter(i=>dn(r,i)>=n)};var Da={hint:"",hints:[],overlap:0,remainder:""},Fo=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return Da;let o=Do({wordList:r,inputToMatch:e,overlapThreshold:1});return Fa(t,o)},Fa=(e,t)=>{let n=t[0]??"",r=dn(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 un={autoSyncIntervalMs:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},K=()=>un,$e=e=>(un={...un,...e},un);var ut=3e3,Oo=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<ut?null:t},Uo=0,ir,sr=!1,Lt=!1,ar=()=>{if(sr)return!0;let e=he();return a(e)?!1:e.value.syncStatus.status==="syncing"},Oa=()=>{let e=K().autoSyncIntervalMs??1e4,t=Date.now()-Uo;return Math.max(0,e-t)},Bo=()=>{ir||(ir=setTimeout(async()=>{if(ir=void 0,!!mt()){if(ar()){Lt=!0;return}Lt=!1,await Ua()}},Oa()))},Ua=async()=>{if(v().readOnly||v().timeMode==="peek")return s("Cannot auto-sync while peeking");if(!mt())return s("Cannot auto-sync before state is initialized");if(ar())return Lt=!0,s("Sync already in progress");sr=!0,Uo=Date.now(),h({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await We()}finally{sr=!1,Lt&&Bo()}},_o=()=>{mt()&&(Lt=!0,!ar()&&Bo())};var mn=()=>{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}},$o=()=>{let e=Be(process.cwd());if(a(e))return!1;let t=Ue(e.value);return St(t)},Wo=e=>e===!0?"yes":e===!1?"no":null,jo=e=>e==="yes"?!0:e==="no"?!1:null;var Z={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#2a2f45",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},T={accent:Z.cyan,accent2:Z.magenta,primary:Z.white,secondary:Z.grayDark,secondary2:Z.grayLight,gray:Z.gray,green:Z.green,yellow:Z.yellow,red:Z.red};var x={red:Z.red,yellow:Z.yellow,green:Z.green,blue:Z.blue,magenta:Z.magenta,cyan:Z.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??[],dr=e=>Ba(e).map(t=>E.getTag(t)).filter(t=>!!t),cr=e=>_a(e).map(t=>E.getContributor(t)).filter(t=>!!t),pn=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!B(n)?s("Invalid untag target"):c("Retrieved tags from ticket in breadcrumb",dr(n))},gn=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!B(n)?s("Invalid unassign target"):c("Retrieved assignees from ticket in breadcrumb",cr(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),g=i?Number(i):0,y=d?Number(d):0;return ja({year:l,month:u,day:m,hour:g,minute:y})?new Date(l,u-1,m,g,y):null},fn=e=>{let t=e.trim().toLowerCase();return Ha(t)??za(t)},Ho=({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}],zo=(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"],X={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs"},je={TITLE:"title",DESCRIPTION:"description"},Va=[X.EDITOR,X.VIEW,X.USERNAME,X.AUTOSYNC,X.SYNC_DEBOUNCE_MS],Ga=[je.TITLE,je.DESCRIPTION],ur=[String(ut),"5000","15000","30000","60000"],Je=[f.EXIT,f.SYNC,f.HELP,f.EXPORT,f.CONFIG],vn=[f.NEW,f.EDIT,f.DELETE,f.MOVE],lr=[f.TAG,f.UNTAG,f.ASSIGN,f.UNASSIGN,f.CLOSE_ISSUE,f.RE_OPEN_ISSUE,f.EDIT],Ko=[f.FILTER,f.PEEK],Ya={WORKSPACE:[...Je,...vn],BOARD:[...Ko,...Je,...vn],SWIMLANE:[...Ko,...Je,...vn],TICKET:[...Je,...vn,...lr],FIELD:[...Je,...lr],FIELD_LIST:[...Je,...lr],TEXT:[...Je]},Xa=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],Ja=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:r}=mn();if(!r)return[f.HELP,f.CONFIG];if(!$o())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)},Q=(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]:[...zo(),"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),...E.getExistingTags()])],[f.UNTAG]:[...pn()?.value?.map(({name:l})=>l)??[]],[f.UNASSIGN]:[...gn()?.value?.map(({name:l})=>l)??[]],[f.ASSIGN]:E.getExistingAssignees(),[f.NEW]:Xa(i),[f.CONFIG]:[...Va]}[e]??[]};import oi from"chalk";var qo=["vim","nvim","nano","micro","emacs","hx","code","code-insiders","subl","notepad","notepad++","idea","webstorm","default","system","$EDITOR","$VISUAL"];import{decodeTime as Vo}from"ulid";var Go=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 Yo=e=>{try{return c("Decoded date",new Date(Vo(e)))}catch(t){return s("Decoding failed + "+t.message)}},mr=e=>{if(!e?.id)return null;try{return Vo(e.id)}catch{return null}};var Ee=(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 Xo from"chalk";var Za=[0,0,0],fr=.2,gr={stringColor:{saturation:50,lightness:60},gradient:{stops:[[174,150,240],[92,138,232],[102,204,226]]}},Jo=(e,t,n)=>Math.max(t,Math.min(n,e)),pr=(e,t,n)=>e+(t-e)*n,Zo=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,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)]},Qo=([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)]},ei=(e,t,n)=>{let r=Jo(n,0,1);return[Math.round(pr(e[0],t[0],r)),Math.round(pr(e[1],t[1],r)),Math.round(pr(e[2],t[2],r))]},nd=(e,t=fr)=>ei(e,Za,t),rd=(e,t=fr)=>Qo(nd(td(e),t)),od=(e,t,n)=>ei(e,t,n),Dt=e=>{let n=Zo(e)%360,r=ed(n,gr.stringColor.saturation,gr.stringColor.lightness);return Qo(r)},Ne=(e,t=Xe)=>{let n=Qa(e);return n&&t[n]?t[n]:Dt(n)},ti=(e,t=Xe,n=fr)=>rd(Ne(e,t),n),id=e=>{let t=gr.gradient.stops,n=Jo(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)},yn=e=>Zo(e.toLowerCase().trim())/4294967295,sd=e=>{let t=yn(e);return id(t)},ad=e=>{let[t,n,r]=sd(e);return{normal:o=>Xo.bgRgb(t,n,r).black(o),cursor:o=>Xo.bgRgb(t,n,r).white.bold(o)}};var xn=e=>ad(e).normal(` ${e} `);import ni from"chalk";var G=e=>ni.dim(e),ie=e=>ni.hex(T.primary)(e),se=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:i=1})=>{let d=o.trim();if(d.length<i)return"";let g=[...t.filter(Boolean).filter(y=>y.startsWith(d))].sort((y,I)=>yn(y)-yn(I)).slice(0,r).map(y=>xn(y)).join(" ");return g?`${G(e)}${g}${G(n)}`:""};var Ze={None:"none",Invalid:"invalid",Valid:"valid"};var dd=["BOARD","TICKET","SWIMLANE"],ri=()=>{let e=v().selectedNode;return e?.context?dd.includes(e.context)?H():F({message:G("Command not available in this context")}):F({message:G("Missing target context")})},Y="<ENTER> to confirm",H=(e="",t=[])=>({message:G(e),validity:Ze.Valid,completionWordList:t}),F=({message:e,completionWordList:t=[]})=>({validity:Ze.Invalid,message:e,completionWordList:t}),En=e=>e.length===0,hn=e=>` ${oi.dim.bgHex(ti(e))(` ${e} `)} `,vr=({modifier:e})=>{let t="confirm";return e===t?H(Y):F({message:En(e)?G("if you are certain, enter ")+xn(t):"",completionWordList:[t]})},cd=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?F({message:G(n)}):H():F({message:En(r)?t:"",completionWordList:[...e]}),Ft=({hint:e})=>({modifier:t,inputString:n})=>En(t)&&En(n)?F({message:e,completionWordList:[]}):H(Y),ld=({modifier:e,inputString:t})=>{let n=Q(f.CONFIG);if(!n.includes(e))return F({message:se({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case X.EDITOR:{let r=[...qo];return t.trim()?r.includes(t.trim())?H(Y):F({message:se({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):F({message:se({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case X.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?H(Y):F({message:se({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case X.USERNAME:return t.trim()?H(Y):F({message:ie("Enter a user name. Saved in ")+oi.bgBlack("~/.epiq-global/config.json")});case X.AUTOSYNC:{let r=["yes","no"],o=K().autoSync;if(!r.includes(t.trim())){let i=Wo(o);return F({message:se({prefix:`should auto-sync (recommended)${i!==null?", currently: "+i:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return H(Y)}case X.SYNC_DEBOUNCE_MS:{let r=K().autoSyncIntervalMs,o=Oo(t);if(!t.trim()||o===null||o<ut){let i=se({prefix:" examples: ",wordList:ur,minLengthForHints:0,inputString:t});return F({message:ie(`provide duration above ${ut}ms. current duration: ${r}ms.`)+i,completionWordList:ur})}return H(Y)}default:return F({message:ie("Unknown config option"),completionWordList:n})}},ud=({modifier:e})=>{let t=Q(f.EDIT);if(!t.includes(e)){let i=se({prefix:"edit... ",wordList:t,inputString:e,minLengthForHints:0});return F({message:i||ie("Unknown edit option"),completionWordList:t})}let{breadCrumb:n,selectedNode:r}=v();if(!Ee([...n,r],"TICKET"))return F({message:ie("Command not available in this context")});switch(e){case je.TITLE:return H(Y);case je.DESCRIPTION:let{preferredEditor:i}=K();return i?H(G("<ENTER> to edit in ")+i):F({message:"No editor selected"});default:return F({message:ie("Unknown edit option"),completionWordList:t})}},md={[f.EXPORT]:()=>H(Y+G(", and create export markdown file")),[f.PEEK]:e=>{let t=e.modifier;if(t==="now")return H(Y);let n={message:G("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")};if(t==="prev"||t==="next")return H(Y);let r=fn(t);if(!t||!r)return F(n);let o=Ee(v().breadCrumb,"BOARD");if(a(o))return F({message:ie("Command is not applicable in this context")});let i=Yo(o.value.id);return a(i)?F({message:ie("Unable to peek: board id is not a valid ULID")}):Ho({date:r,horizonDate:i.value})?H(Y):F({message:ie(`nothing to peek before ${i.value.toISOString().slice(0,16).replace("T"," ")}`)})},[f.EXIT]:()=>H(Y+G(" and exit the application")),[f.INIT]:()=>H(Y),[f.PALETTE]:()=>H(Y),[f.FILTER]:e=>{if(e.modifier==="clear")return H();let t=i=>Q(f.FILTER).includes(i);if(!e.modifier||!t(e.modifier))return F({message:se({wordList:Q(f.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:Q(f.FILTER)});let n=Object.values(v().tags).map(i=>i.name),r=Object.values(v().contributors).map(i=>i.name),o=e.modifier==="tag"?n:e.modifier==="assignee"?r:[];return e.inputString?o.length&&!o.includes(e.inputString.trim())?F({message:se({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString}),completionWordList:o}):H():F({message:se({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString}),completionWordList:o})},[f.NONE]:e=>{let t=Q(f.NONE);return F({message:se({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[f.NEW]:e=>cd({list:Q(f.NEW),hint:se({wordList:Q(f.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[f.HELP]:()=>H(Y),[f.EDIT]:ud,[f.CONFIG]:ld,[f.DELETE]:e=>{let t=ri();return t.validity==="invalid"?t:vr(e)},[f.CLOSE_ISSUE]:e=>vr(e),[f.RE_OPEN_ISSUE]:e=>vr(e),[f.MOVE]:e=>{let t=ri();return t.validity==="invalid"?t:Ft({hint:se({prefix:"hey hacker! These commands are blocked for you... ",wordList:Q(f.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[f.TAG]:e=>{let n=E.getExistingTags().slice(0,10).map(hn).join("");return Ft({hint:n.length?G("create tag or reuse:")+n+G(""):G("create tag ...")})(e)},[f.UNTAG]:e=>{let t=pn();if(a(t))return F({message:ie("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(hn).slice(0,10);return n.length?Ft({hint:G(" ... ")+n.join("")})(e):F({message:ie("Issue has no tags"),completionWordList:[]})},[f.ASSIGN]:e=>{let t=E.getExistingAssignees().map(hn).slice(0,10);return Ft({hint:G("assignees... ")+t.join("")})(e)},[f.UNASSIGN]:e=>{let t=gn();if(a(t))return F({message:ie("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(hn).slice(0,10);return n.length?Ft({hint:G("remove assignee... ")+n.join("")})(e):F({message:ie("Issue has no assignees"),completionWordList:[]})},[f.SYNC]:()=>H(Y)},ii=Object.fromEntries(Object.entries(md).map(([e,t])=>[e,{validate:(n,r,o)=>t({modifier:r,command:n,inputString:o})}]));var si=["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 ai=e=>Object.values(f).includes(e),di=(e,t)=>{let n=e.command??"",{modifier:r,target:o,inputString:i}=e,{message:d,validity:l,completionWordList:u}=ii[n].validate(n,r,i),m=o==="command"||o==="modifier"?Q(n):si,{mode:g}=v(),y=g===p.COMMAND_LINE?d??"":"",I=[...u,...m];return{validity:l,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:y,autoCompletion:t?Fo(e,I):{hint:"",hints:[],remainder:"",overlap:0}}};var ci=e=>{let t=e.trimStart(),n=gd(t),r=n[0]??"",o=n[1]??"",i=/\s$/.test(e),d=fd(e),l=ai(r)?r:null,u=l!==null,m=r!=="",g=l?Q(l)??[]:[],y=l&&g.includes(o)?o:"",I="word";n.length===0||n.length===1&&!i?I="command":(n.length===1&&i||n.length===2&&!i)&&(I="modifier");let N=i?"":d,S=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:I,inputToMatch:N,inputString:S}},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 Zp}from"react";var pt=e=>e===yr||e===":",yr=" ",gt={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,li=()=>{for(let e of vd)e()};var Te=e=>{let n=e(gt),r=ci(n.value),o=n.cursorPosition===n.value.length;gt={...n,commandMeta:di(r,o)},li()},Ot=({message:e,status:t})=>{let n=structuredClone(gt);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,gt=n,li(),c(e,null)},xr=e=>{Te(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},hr=e=>{Te(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&pt(n[o-1]);)o--;for(;o>0&&!pt(n[o-1]);)o--}else{for(;o<n.length&&!pt(n[o]);)o++;for(;o<n.length&&pt(n[o]);)o++}return{...t,cursorPosition:o}})},ui=()=>{Te(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}})},mi=()=>{Te(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&pt(t[r-1]);)r--;for(;r>0&&!pt(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},O=e=>{Te(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}})},pi=()=>{Te(e=>({...e,commandIsPending:!0}))},gi=({addToHistory:e=!0})=>{Te(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1})),yd()},fi=()=>{Te(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}})},vi=()=>{Te(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=()=>O(()=>""),J=()=>gt;var yi=()=>{let[e,...t]=gt.value.split(yr);return t.join(yr).trim()};var C={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 xi=e=>{let{context:t}=v().contextNode;if(!t)return M.None;switch(e){case f.EXIT:return M.Exit;case f.EXPORT:return M.Export;case f.INIT:return M.Init;case f.DELETE:return M.Delete;case f.EDIT:return M.Edit;case f.HELP:return M.ViewHelp;case f.RE_OPEN_ISSUE:return M.ReopenIssue;case f.CLOSE_ISSUE:return M.CloseIssue;case f.TAG:return M.TagTicket;case f.UNTAG:return M.UntagTicket;case f.ASSIGN:return M.AssignUserToTicket;case f.UNASSIGN:return M.UnassignUserFromTicket;case f.NEW:return M.NewItem;case f.FILTER:return M.Filter;case f.MOVE:return M.Move;case f.PEEK:return M.Peek;case f.CONFIG:return M.Config;case f.SYNC:return M.Sync;default:return M.None}},M={Exit:"exit",Init:"init",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",Peek:"peek",Config:"config",NewItem:"add-new-item",TagTicket:"ticket-tag",UntagTicket:"ticket-untag",AssignUserToTicket:"ticket-assign-user",UnassignUserFromTicket:"ticket-unassign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Sync:"sync",Export:"export"};import{ulid as de}from"ulid";import Mi from"node:fs";import Hd from"node:path";import zd from"react";import{Box as Wd}from"ink";import wn from"react";import{Box as Ir,Text as Td}from"ink";import Se from"react";import{Text as hi}from"ink";import Ei,{useEffect as Ni,useState as xd}from"react";var Ii={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "]},ue=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=Ie(),r=Ii[n]??Ii.default,[o,i]=xd(0);if(Ni(()=>{i(0)},[r]),Ni(()=>{if(!e)return;let l=setInterval(()=>{i(u=>(u+1)%r.length)},500);return()=>clearInterval(l)},[e,r]),!e)return Ei.createElement(hi,null,t);let d=r[o]??r[0]??t;return Ei.createElement(hi,{color:T.accent,dimColor:o===1},d)};import{Box as Er,Text as hd}from"ink";import Nn from"react";var In=({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,I=e.slice(g,y),N=e.length>l,S=i,A=N?Math.max(1,Math.floor(l/e.length*S)):S,R=Math.max(0,S-A),P=Math.max(1,e.length-l),_=N?Math.floor(g/P*R):0;return Nn.createElement(Er,{flexDirection:"row",height:i,width:"100%"},Nn.createElement(Er,{flexDirection:"column",flexGrow:1,height:i},I),Nn.createElement(Er,{flexDirection:"column",width:1,height:S},Array.from({length:S}).map((Ge,De)=>Nn.createElement(hd,{key:De,color:N&&De>=_&&De<_+A?T.accent:T.secondary},N?"\u2502":" "))))};import{Box as Rn,Text as bd}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]:Dt(n)},Sn=({id:e,isSelected:t})=>{let n=E.getContributor(e);if(n)return Nd.createElement(Ed,{underline:t,color:Sd(n.name)},"@"+n.name)};import{Text as Cd}from"ink";import Rd from"react";var Cn=({id:e,isSelected:t})=>{let n=E.getTag(e);if(n)return Rd.createElement(Cd,{underline:t,backgroundColor:Ne(n.name),color:T.primary}," "+n.name+" ")};var Si=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=cn(ln(t.title),r),i=dr(t),d=cr(t);return Qe.createElement(Rn,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?T.accent:T.secondary,justifyContent:"space-between"},Qe.createElement(Rn,{borderBottom:!0},Qe.createElement(Rn,{paddingLeft:1,flexDirection:"column"},Qe.createElement(bd,{color:T.primary},o))),Qe.createElement(Rn,{flexDirection:"row",paddingLeft:1},i.map(l=>Qe.createElement(Cn,{key:l.id,id:l.id})),d.map(l=>Qe.createElement(Sn,{key:l.id,id:l.id}))))};import Ad from"chalk";import{Box as Ut,Text as Nr}from"ink";import Me from"react";var wd=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,Ci=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let i=(t.props.tags??[]).map(N=>E.getTag(N)).filter(N=>!!N),d=(t.props.assignees??[]).map(N=>E.getContributor(N)).filter(N=>!!N),l=1,u=i.length*(1+l),m=d.length*(2+l),g=i.map(N=>Me.createElement(Ut,{key:N.id,paddingRight:l},Me.createElement(Nr,{color:Ne(N.name)},"\u25A0"))),y=d.map(N=>Me.createElement(Ut,{key:N.id,paddingRight:l},Me.createElement(Nr,{color:Dt(N.name)},"@"+N.name.at(0)))),I=n?T.accent:o===p.MOVE?T.secondary:T.primary;return Me.createElement(Ut,{borderBottom:!0,justifyContent:"space-between"},Me.createElement(Ut,null,Me.createElement(ue,{isSelected:n,placeholder:Ad.dim.gray(r+1+" ")}),Me.createElement(Nr,{wrap:"truncate",color:I},wd(t.title,e-u-m-14))),Me.createElement(Ut,null,g,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}=Ie(),m=u[e.id]??[],g=`${e.title} ${Md.hex(T.secondary2).dim("("+m.length+")")}`,y=3,I=o?1:4,N=r-y-(o?2:1),S=Se.createElement(Ir,{borderStyle:"round",borderColor:T.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},Se.createElement(ue,{isSelected:t}),Se.createElement(Td,{bold:!0,color:t?T.accent:T.primary},g," ",e.readonly?"\u{1F512}":"")),A=(R,P)=>{let _=i&&d===P;return o?Se.createElement(Ci,{key:R.id,index:P,width:n,ticket:R,isSelected:_,mode:l}):Se.createElement(Si,{key:R.id,width:n,ticket:R,isSelected:_})};return Se.createElement(Ir,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?T.accent:T.secondary,paddingRight:1,paddingLeft:1,height:r},S,Se.createElement(Ir,{padding:o?1:0},m.length>0&&Se.createElement(In,{selectedIndex:d,height:N,itemHeight:I},m.map(A)),Se.createElement(ue,{isSelected:i&&d===-1})))},Ri=Se.memo(Pd);import{Box as Rr,Text as Bd}from"ink";import ze,{useMemo as Ai}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},He=(e,t)=>{let n=kd(e);return Ld(n,10)+Fd(`${e}:${t}`)};import{Box as bn,Text as Od}from"ink";import Pe from"react";var bi=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:r}=Ie(),{title:o}=t,i=t.parentNodeId?E.getNode(t.parentNodeId):void 0,d=i&&B(i)?o===V.ASSIGNEES?i.props.assignees??[]:o===V.TAGS?i.props.tags??[]:[]:[];return Pe.createElement(bn,{alignItems:"center",paddingTop:1},Pe.createElement(bn,{minWidth:12},Pe.createElement(ue,{isSelected:n}),Pe.createElement(Od,{color:n?T.accent:T.secondary2},o,":")),Pe.createElement(bn,{flexDirection:"row",marginLeft:1,paddingRight:1},d.map((l,u)=>{let m=r.id===t.id&&u===e;return Pe.createElement(bn,{key:`${o}-${l}`,paddingRight:2,minHeight:1},Pe.createElement(ue,{isSelected:m}),o===V.ASSIGNEES?Pe.createElement(Sn,{isSelected:m,id:l}):o===V.TAGS?Pe.createElement(Cn,{isSelected:m,id:l}):null)})))};import{Box as An,Text as Sr}from"ink";import ke,{useEffect as Ud}from"react";var ae={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 Cr=({id:e,label:t,text:n,height:r,selected:o,maxWidth:i})=>{let{selectedIndex:d,contextNode:l}=Ie(),u=I=>String(I).replace(/\r?\n/g,""),m=typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[];Ud(()=>{let I=[];return m.forEach((N,S)=>{let A=ge(BigInt(S+1));if(!St(A))return;let R=ae.text({id:`${e}-${S}`,name:`Line ${S+1}`,parentNodeId:e,rank:A.value,props:{value:N},readonly:!0,isVirtual:!0}),P=E.createNode(R);St(P)&&I.push(P.value.id)}),()=>I.forEach(E.deleteNode)},[e,n]);let g="\u2029",y=m.map((I,N)=>{let S=l.id===e&&d===N;return ke.createElement(An,{key:`${e}-${N}`},ke.createElement(Sr,{color:S?T.primary:T.secondary2,dimColor:!S},`${N+1} `.padStart(5,"\xA0")),ke.createElement(Sr,{backgroundColor:S?"gray":""},u(I.length?cn(I,i-10):g)))});return ke.createElement(An,{flexDirection:"column",paddingTop:1},ke.createElement(An,null,ke.createElement(ue,{isSelected:o}),ke.createElement(Sr,{color:o?T.accent:T.secondary2},t)),ke.createElement(An,{flexDirection:"row",borderStyle:"round",borderColor:T.secondary,paddingLeft:1,marginLeft:1},ke.createElement(In,{scrollByOne:!0,children:y,height:r-2,selectedIndex:d,itemHeight:1})))};var _d=e=>He(e,"description"),$d=e=>He(e,"history"),wi=({ticket:e,height:t})=>{let{selectedIndex:n,contextNode:r}=Ie(),o=process.stdout.columns||120,i=Ai(()=>_d(e.id),[e.id]),d=Ai(()=>$d(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),P=R&&Oe(R)?R.props.value??"":"",Ge=t-3;return ze.createElement(Rr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},R?ze.createElement(Cr,{id:R.id,label:"Event log",text:P,selected:!1,maxWidth:o,height:Ge}):null)}let g=m.reduce((R,P)=>Ct(P)||P.id===d?R+1:R,0),y=2,I=3,N=g,S=t-I-N-y,A=(R,P)=>R.id===i?ze.createElement(Cr,{key:R.id,id:i,label:"Description (press e to edit)",text:e.props.description??"",selected:P,maxWidth:o,height:S}):Ct(R)?ze.createElement(bi,{key:R.id,parent:R,selected:P,selectedIndex:n}):R.id===d?ze.createElement(Rr,{key:R.id,paddingTop:1},ze.createElement(ue,{isSelected:P}),ze.createElement(Bd,{backgroundColor:T.secondary,color:P?T.accent:T.primary}," History \u203A\u203A ")):null;return ze.createElement(Rr,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},m.map((R,P)=>A(R,l&&n===P)))};var jd=({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),I=Math.floor(l/3),N=Math.floor(l/Math.max(e.length,1)),S=Math.min(N,I),A=i==="dense";return wn.createElement(Wd,{flexDirection:"row",height:d},g&&e.map((R,P)=>{let _=t.id===R.id,Ge=_?n:-1,De=t.context===b.BOARD&&n===P;return wn.createElement(Ri,{key:R.id,height:d,width:S,swimlane:R,isSelected:De,isDense:A,isFocused:_,listSelectedIndex:Ge,mode:o})}),m&&y&&wn.createElement(wi,{height:d,ticket:y}))},Ti=wn.memo(jd);import{render as Kd}from"ink";import{Writable as qd}from"node:stream";var Bt=e=>String(e).padStart(2,"0"),Vd=e=>{let t=e.getUTCFullYear(),n=Bt(e.getUTCMonth()+1),r=Bt(e.getUTCDate()),o=Bt(e.getUTCHours()),i=Bt(e.getUTCMinutes()),d=Bt(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,""),Pi=async()=>{let{viewMode:e}=K(),{contextNode:t,selectedIndex:n,breadCrumb:r,mode:o,renderedChildrenIndex:i}=v(),d=r.find(P=>P.context==="BOARD");if(!d)return s("No board found to export");let l=120,u=40,m=await Yd(zd.createElement(Ti,{height:u,width:l,swimlanes:(i[d.id]??[]).filter(P=>P!==void 0&&Yt(P)),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=Qt(process.cwd());if(a(g))return s("Unable to export, epiq root not found");let y=new Date,I=Vd(y),N=`board_${Gd(d.title)}_${I}.md`,S=To(g.value);Mi.mkdirSync(S,{recursive:!0});let A=Hd.join(S,N),R=`# Board - ${d.title}
|
|
21
|
+
`).filter(Boolean).filter(d=>d!==we);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 ct({cwd:e,message:"[epiq:repair-storage-branch]"});return a(i)?s(i.message):c("Cleaned storage branch",!0)},_e=Zn(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=>xe.resolve(e)),Xu=Zn(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=xe.isAbsolute(n)?n:xe.join(e,n);return c("Resolved git dir",r)},e=>xe.resolve(e));var rm=process.env.IS_LOCAL==="true",we=".epiq",le=".epiq-global",an="events",ka="project.json",Jt=e=>Te.join(e,we),Zt=e=>Te.join(Jt(e),ka),kt=e=>Te.join(Jt(e),an),Mo=e=>Te.join(e,we),La=e=>{let t=Te.join(e,we);return Pt.existsSync(t)&&Pt.statSync(t).isDirectory()},ir=e=>{let t=Zt(e);return Pt.existsSync(t)&&Pt.statSync(t).isFile()},Qt=e=>{let t=Te.resolve(e);for(;;){if(La(t))return c("Resolved closest .epiq root",t);let n=Te.dirname(t);if(n===t)return s("No .epiq directory found in any parent");t=n}},Be=e=>{let t=Te.resolve(e);for(;;){if(ir(t))return c("Resolved closest epiq project root",t);let n=Te.dirname(t);if(n===t)return s("No .epiq/project.json found in any parent");t=n}},Po=e=>{let t=kt(e);try{return Pt.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")}},ve=async()=>{let e=await _e(process.cwd());if(a(e))return e;let t=lt({repoRoot:e.value});return a(t)?t:c("Resolved persist root",t.value)};var q={DESCRIPTION:"Description",ASSIGNEES:"Assignees",TAGS:"Tags",HISTORY:"History"};import{useSyncExternalStore as cl}from"react";var p={DEFAULT:"default",MOVE:"move",HELP:"help",COMMAND_LINE:"cmd-line",PALETTE:"palette"};function dn(e,t){let n=Math.min(e.length,t.length),r=0;for(;r<n&&e[r]===t[r];)r++;return r}var cn=(e,t)=>t<=0?"":e.length<=t?e:t<=3?"...".slice(0,t):e.slice(0,t-3)+"...",ln=e=>typeof e!="string"?"":e.replace(/[\x00-\x08\x0B-\x1F\x7F]/g,"").replace(/[\r\n\t]/g," ").replace(/\s+/g," ").trim();var 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,Da=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(Da(e),r).filter(i=>dn(r,i)>=n)};var Fa={hint:"",hints:[],overlap:0,remainder:""},Oo=({inputToMatch:e,lastWord:t,isLastWordCompleted:n},r)=>{if(n||e==="")return Fa;let o=Fo({wordList:r,inputToMatch:e,overlapThreshold:1});return Oa(t,o)},Oa=(e,t)=>{let n=t[0]??"",r=dn(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}};import{useSyncExternalStore as hm}from"react";var un={autoSyncIntervalMs:null,autoSync:null,preferredEditor:null,userName:null,userId:null,viewMode:null},Ua=new Set,Ba=()=>{for(let e of Ua)e()},K=()=>un;var $e=e=>(un={...un,...e},Ba(),un);var ut=3e3,Uo=e=>{let t=Number(e.trim());return!Number.isFinite(t)||!Number.isInteger(t)||t<ut?null:t},Bo=0,sr,ar=!1,Lt=!1,dr=()=>{if(ar)return!0;let e=he();return a(e)?!1:e.value.syncStatus.status==="syncing"},_a=()=>{let e=K().autoSyncIntervalMs??1e4,t=Date.now()-Bo;return Math.max(0,e-t)},_o=()=>{sr||(sr=setTimeout(async()=>{if(sr=void 0,!!mt()){if(dr()){Lt=!0;return}Lt=!1,await $a()}},_a()))},$a=async()=>{if(v().readOnly||v().timeMode==="peek")return s("Cannot auto-sync while peeking");if(!mt())return s("Cannot auto-sync before state is initialized");if(dr())return Lt=!0,s("Sync already in progress");ar=!0,Bo=Date.now(),h({syncStatus:{msg:"Auto-syncing",status:"syncing"}});try{return await We()}finally{ar=!1,Lt&&_o()}},$o=()=>{mt()&&(Lt=!0,!dr()&&_o())};var mn=()=>{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=Be(process.cwd());if(a(e))return!1;let t=Ue(e.value);return St(t)},jo=e=>e===!0?"on":e===!1?"off":null,Ho=e=>e==="on"?!0:e==="off"?!1:null;var Z={bg:"#1a1b26",fg:"#c8d3ff",grayDark:"#3a3e54",gray:"#46507a",grayLight:"#969bb5",cyan:"#88d5ee",cyanSoft:"#8fe6fb",blue:"#5b8cff",magenta:"#a78bfa",magentaSoft:"#c4b5fd",green:"#8fdc8c",yellow:"#f1c27d",red:"#ff7a90",white:"#ffffff"},T={accent:Z.cyan,accent2:Z.magenta,primary:Z.white,secondary:Z.grayDark,secondary2:Z.grayLight,gray:Z.gray,green:Z.green,yellow:Z.yellow,red:Z.red};var x={red:Z.red,yellow:Z.yellow,green:Z.green,blue:Z.blue,magenta:Z.magenta,cyan:Z.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 Wa=e=>e.props.tags??[],ja=e=>e.props.assignees??[],cr=e=>Wa(e).map(t=>E.getTag(t)).filter(t=>!!t),lr=e=>ja(e).map(t=>E.getContributor(t)).filter(t=>!!t),pn=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!U(n)?s("Invalid untag target"):c("Retrieved tags from ticket in breadcrumb",cr(n))},gn=()=>{let{breadCrumb:e,selectedNode:t}=v(),n=[...e,t].find(r=>r?.context==="TICKET");return!n||!U(n)?s("Invalid unassign target"):c("Retrieved assignees from ticket in breadcrumb",lr(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},Va=(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}},qa=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},fn=e=>{let t=e.trim().toLowerCase();return Va(t)??qa(t)},zo=({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}],Ko=(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"],X={EDITOR:"editor",VIEW:"view",USERNAME:"username",AUTOSYNC:"autoSync",SYNC_DEBOUNCE_MS:"syncDebounceMs"},je={TITLE:"title",DESCRIPTION:"description"},Xa=[X.EDITOR,X.VIEW,X.USERNAME,X.AUTOSYNC,X.SYNC_DEBOUNCE_MS],Ja=[je.TITLE,je.DESCRIPTION],mr=[String(ut),"5000","15000","30000","60000"],Je=[f.EXIT,f.SYNC,f.HELP,f.EXPORT,f.CONFIG],vn=[f.NEW,f.EDIT,f.DELETE,f.MOVE],ur=[f.TAG,f.UNTAG,f.ASSIGN,f.UNASSIGN,f.CLOSE_ISSUE,f.RE_OPEN_ISSUE,f.EDIT],Vo=[f.FILTER,f.PEEK],Za={WORKSPACE:[...Je,...vn],BOARD:[...Vo,...Je,...vn],SWIMLANE:[...Vo,...Je,...vn],TICKET:[...Je,...vn,...ur],FIELD:[...Je,...ur],FIELD_LIST:[...Je,...ur],TEXT:[...Je]},Qa=e=>e==="WORKSPACE"?["board"]:["issue","swimlane","board"],ed=({selectedNode:e,readOnly:t,breadCrumb:n})=>{let{isSetupDone:r}=mn();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&&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)},Q=(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]:[...Ko(),"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(Xe),...E.getExistingTags()])],[f.UNTAG]:[...pn()?.value?.map(({name:l})=>l)??[]],[f.UNASSIGN]:[...gn()?.value?.map(({name:l})=>l)??[]],[f.ASSIGN]:E.getExistingAssignees(),[f.NEW]:Qa(i),[f.CONFIG]:[...Xa]}[e]??[]};import ii from"chalk";var qo=["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)}},pr=e=>{if(!e?.id)return null;try{return Go(e.id)}catch{return null}};var Ee=(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 td=[0,0,0],vr=.2,fr={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)),gr=(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},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)]},ei=([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)]},ti=(e,t,n)=>{let r=Zo(n,0,1);return[Math.round(gr(e[0],t[0],r)),Math.round(gr(e[1],t[1],r)),Math.round(gr(e[2],t[2],r))]},id=(e,t=vr)=>ti(e,td,t),sd=(e,t=vr)=>ei(id(od(e),t)),ad=(e,t,n)=>ti(e,t,n),Dt=e=>{let n=Qo(e)%360,r=rd(n,fr.stringColor.saturation,fr.stringColor.lightness);return ei(r)},Ne=(e,t=Xe)=>{let n=nd(e);return n&&t[n]?t[n]:Dt(n)},ni=(e,t=Xe,n=vr)=>sd(Ne(e,t),n),dd=e=>{let t=fr.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 ad(t[i],t[i+1],d)},yn=e=>Qo(e.toLowerCase().trim())/4294967295,cd=e=>{let t=yn(e);return dd(t)},ld=e=>{let[t,n,r]=cd(e);return{normal:o=>Jo.bgRgb(t,n,r).black(o),cursor:o=>Jo.bgRgb(t,n,r).white.bold(o)}};var xn=e=>ld(e).normal(` ${e} `);import ri from"chalk";var G=e=>ri.dim(e),ie=e=>ri.hex(T.primary)(e),se=({prefix:e="",wordList:t,postfix:n="",noOfHints:r=100,inputString:o,minLengthForHints:i=1})=>{let d=o.trim();if(d.length<i)return"";let g=[...t.filter(Boolean).filter(y=>y.startsWith(d))].sort((y,I)=>yn(y)-yn(I)).slice(0,r).map(y=>xn(y)).join(" ");return g?`${G(e)}${g}${G(n)}`:""};var Ze={None:"none",Invalid:"invalid",Valid:"valid"};var ud=["BOARD","TICKET","SWIMLANE"],oi=()=>{let e=v().selectedNode;return e?.context?ud.includes(e.context)?H():F({message:G("Command not available in this context")}):F({message:G("Missing target context")})},Y="<ENTER> to confirm",H=(e="",t=[])=>({message:G(e),validity:Ze.Valid,completionWordList:t}),F=({message:e,completionWordList:t=[]})=>({validity:Ze.Invalid,message:e,completionWordList:t}),En=e=>e.length===0,hn=e=>` ${ii.dim.bgHex(ni(e))(` ${e} `)} `,yr=({modifier:e})=>{let t="confirm";return e===t?H(Y):F({message:En(e)?G("if you are certain, enter ")+xn(t):"",completionWordList:[t]})},md=({list:e,hint:t,onValue:n})=>({modifier:r,inputString:o})=>e.includes(r)?o.trim().length<1?F({message:G(n)}):H():F({message:En(r)?t:"",completionWordList:[...e]}),Ft=({hint:e})=>({modifier:t,inputString:n})=>En(t)&&En(n)?F({message:e,completionWordList:[]}):H(Y),pd=({modifier:e,inputString:t})=>{let n=Q(f.CONFIG);if(!n.includes(e))return F({message:se({prefix:"... ",wordList:n,inputString:e,minLengthForHints:0}),completionWordList:n});switch(e){case X.EDITOR:{let r=[...qo];return t.trim()?r.includes(t.trim())?H(Y):F({message:se({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r}):F({message:se({prefix:"editors: ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case X.VIEW:{let r=["dense","wide"];return r.includes(t.trim())?H(Y):F({message:se({prefix:"view... ",wordList:r,inputString:t,minLengthForHints:0}),completionWordList:r})}case X.USERNAME:return t.trim()?H(Y):F({message:ie("Enter a user name. Saved in ")+ii.bgBlack("~/.epiq-global/config.json")});case X.AUTOSYNC:{let r=["on","off"],o=K().autoSync;if(!r.includes(t.trim())){let i=jo(o);return F({message:se({prefix:`should auto-sync (recommended)${i!==null?", currently: "+i:""} `,wordList:r,noOfHints:3,inputString:t,minLengthForHints:0}),completionWordList:r})}return H(Y)}case X.SYNC_DEBOUNCE_MS:{let r=K().autoSyncIntervalMs,o=Uo(t);if(!t.trim()||o===null||o<ut){let i=se({prefix:" examples: ",wordList:mr,minLengthForHints:0,inputString:t});return F({message:ie(`provide duration above ${ut}ms. current duration: ${r}ms.`)+i,completionWordList:mr})}return H(Y)}default:return F({message:ie("Unknown config option"),completionWordList:n})}},gd=({modifier:e})=>{let t=Q(f.EDIT);if(!t.includes(e)){let i=se({prefix:"edit... ",wordList:t,inputString:e,minLengthForHints:0});return F({message:i||ie("Unknown edit option"),completionWordList:t})}let{breadCrumb:n,selectedNode:r}=v();if(!Ee([...n,r],"TICKET"))return F({message:ie("Command not available in this context")});switch(e){case je.TITLE:return H(Y);case je.DESCRIPTION:let{preferredEditor:i}=K();return i?H(G("<ENTER> to edit in ")+i):F({message:"No editor selected"});default:return F({message:ie("Unknown edit option"),completionWordList:t})}},fd={[f.EXPORT]:()=>H(Y+G(", and create export markdown file")),[f.PEEK]:e=>{let t=e.modifier;if(t==="now")return H(Y);let n={message:G("historical state from: '1h', '2d', '23h', '1mo', '2y', 'prev', 'next' or full date as YYYY-MM-DD")};if(t==="prev"||t==="next")return H(Y);let r=fn(t);if(!t||!r)return F(n);let o=Ee(v().breadCrumb,"BOARD");if(a(o))return F({message:ie("Command is not applicable in this context")});let i=Xo(o.value.id);return a(i)?F({message:ie("Unable to peek: board id is not a valid ULID")}):zo({date:r,horizonDate:i.value})?H(Y):F({message:ie(`nothing to peek before ${i.value.toISOString().slice(0,16).replace("T"," ")}`)})},[f.EXIT]:()=>H(Y+G(" and exit the application")),[f.INIT]:()=>H(Y),[f.PALETTE]:()=>H(Y),[f.FILTER]:e=>{if(e.modifier==="clear")return H();let t=i=>Q(f.FILTER).includes(i);if(!e.modifier||!t(e.modifier))return F({message:se({wordList:Q(f.FILTER),inputString:e.inputString,minLengthForHints:0}),completionWordList:Q(f.FILTER)});let n=Object.values(v().tags).map(i=>i.name),r=Object.values(v().contributors).map(i=>i.name),o=e.modifier==="tag"?n:e.modifier==="assignee"?r:[];return e.inputString?o.length&&!o.includes(e.inputString.trim())?F({message:se({prefix:`existing ${e.modifier}s... `,wordList:o,noOfHints:10,inputString:e.inputString}),completionWordList:o}):H():F({message:se({prefix:"one of... ",wordList:o,noOfHints:10,inputString:e.inputString}),completionWordList:o})},[f.NONE]:e=>{let t=Q(f.NONE);return F({message:se({prefix:"... ",wordList:t,inputString:e.inputString,minLengthForHints:0}),completionWordList:t})},[f.NEW]:e=>md({list:Q(f.NEW),hint:se({wordList:Q(f.NEW),noOfHints:3,inputString:e.inputString,minLengthForHints:0}),onValue:"provide a name..."})(e),[f.HELP]:()=>H(Y),[f.EDIT]:gd,[f.CONFIG]:pd,[f.DELETE]:e=>{let t=oi();return t.validity==="invalid"?t:yr(e)},[f.CLOSE_ISSUE]:e=>yr(e),[f.RE_OPEN_ISSUE]:e=>yr(e),[f.MOVE]:e=>{let t=oi();return t.validity==="invalid"?t:Ft({hint:se({prefix:"hey hacker! These commands are blocked for you... ",wordList:Q(f.MOVE),noOfHints:10,inputString:e.inputString})})(e)},[f.TAG]:e=>{let n=E.getExistingTags().slice(0,10).map(hn).join("");return Ft({hint:n.length?G("create tag or reuse:")+n+G(""):G("create tag ...")})(e)},[f.UNTAG]:e=>{let t=pn();if(a(t))return F({message:ie("Invalid untag target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(hn).slice(0,10);return n.length?Ft({hint:G(" ... ")+n.join("")})(e):F({message:ie("Issue has no tags"),completionWordList:[]})},[f.ASSIGN]:e=>{let t=E.getExistingAssignees().map(hn).slice(0,10);return Ft({hint:G("assignees... ")+t.join("")})(e)},[f.UNASSIGN]:e=>{let t=gn();if(a(t))return F({message:ie("Invalid unassign target"),completionWordList:[]});let n=t.value.map(({name:r})=>r).map(hn).slice(0,10);return n.length?Ft({hint:G("remove assignee... ")+n.join("")})(e):F({message:ie("Issue has no assignees"),completionWordList:[]})},[f.SYNC]:()=>H(Y)},si=Object.fromEntries(Object.entries(fd).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"?Q(n):ai,{mode:g}=v(),y=g===p.COMMAND_LINE?d??"":"",I=[...u,...m];return{validity:l,command:e.command,modifier:e.modifier,inputString:e.inputString,infoMessage:y,autoCompletion:t?Oo(e,I):{hint:"",hints:[],remainder:"",overlap:0}}};var li=e=>{let t=e.trimStart(),n=yd(t),r=n[0]??"",o=n[1]??"",i=/\s$/.test(e),d=xd(e),l=di(r)?r:null,u=l!==null,m=r!=="",g=l?Q(l)??[]:[],y=l&&g.includes(o)?o:"",I="word";n.length===0||n.length===1&&!i?I="command":(n.length===1&&i||n.length===2&&!i)&&(I="modifier");let N=i?"":d,S=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:I,inputToMatch:N,inputString:S}},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 rg}from"react";var pt=e=>e===xr||e===":",xr=" ",gt={commandHistory:[],value:"",commandHistoryIndex:-1,cursorPosition:0,commandIsPending:!1,commandMeta:{command:null,modifier:"",infoMessage:"",inputString:"",validity:Ze.None,autoCompletion:{hint:"",hints:[],remainder:"",overlap:0}}},hd=new Set,ui=()=>{for(let e of hd)e()};var Ie=e=>{let n=e(gt),r=li(n.value),o=n.cursorPosition===n.value.length;gt={...n,commandMeta:ci(r,o)},ui()},Ot=({message:e,status:t})=>{let n=structuredClone(gt);return n.commandMeta={...n.commandMeta,infoMessage:e??"",validity:t==="fail"?"invalid":"valid"},n.commandIsPending=!0,gt=n,ui(),c(e,null)},hr=e=>{Ie(t=>({...t,cursorPosition:Math.max(0,Math.min(t.value.length,t.cursorPosition+e))}))},Er=e=>{Ie(t=>{let{value:n,cursorPosition:r}=t,o=r;if(e==="left"){for(;o>0&&pt(n[o-1]);)o--;for(;o>0&&!pt(n[o-1]);)o--}else{for(;o<n.length&&!pt(n[o]);)o++;for(;o<n.length&&pt(n[o]);)o++}return{...t,cursorPosition:o}})},mi=()=>{Ie(e=>{let t=e.value.slice(e.cursorPosition),n=Math.max(0,e.cursorPosition-1);return{...e,value:e.value.slice(0,n)+t,cursorPosition:n,commandIsPending:!1}})},pi=()=>{Ie(e=>{let{value:t,cursorPosition:n}=e,r=n;for(;r>0&&pt(t[r-1]);)r--;for(;r>0&&!pt(t[r-1]);)r--;let o=t.slice(n);return{...e,value:t.slice(0,r)+o,cursorPosition:r,commandIsPending:!1}})},Nn=e=>{Ie(t=>{let n=Math.max(0,Math.min(t.cursorPosition,t.value.length)),r=t.value.slice(0,n),o=t.value.slice(n),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=()=>{Ie(e=>({...e,commandIsPending:!0}))},B=e=>{Ie(t=>({...t,value:e,cursorPosition:e.length,commandIsPending:!1}))},fi=({addToHistory:e=!0})=>{Ie(n=>({...n,commandHistory:e?[n.value,...n.commandHistory].slice(0,40):n.commandHistory,commandHistoryIndex:-1,commandIsPending:!1,value:"",cursorPosition:0}))},vi=()=>{Ie(e=>{let t=Math.min(e.commandHistoryIndex+1,e.commandHistory.length-1),n=e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},yi=()=>{Ie(e=>{let t=Math.max(e.commandHistoryIndex-1,-1),n=t===-1?"":e.commandHistory[t]??"";return{...e,commandHistoryIndex:t,value:n,cursorPosition:n.length}})},J=()=>gt;var xi=()=>{let[e,...t]=gt.value.split(xr);return t.join(xr).trim()};var C={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 hi=e=>{let{context:t}=v().contextNode;if(!t)return M.None;switch(e){case f.EXIT:return M.Exit;case f.EXPORT:return M.Export;case f.INIT:return M.Init;case f.DELETE:return M.Delete;case f.EDIT:return M.Edit;case f.HELP:return M.ViewHelp;case f.RE_OPEN_ISSUE:return M.ReopenIssue;case f.CLOSE_ISSUE:return M.CloseIssue;case f.TAG:return M.TagTicket;case f.UNTAG:return M.UntagTicket;case f.ASSIGN:return M.AssignUserToTicket;case f.UNASSIGN:return M.UnassignUserFromTicket;case f.NEW:return M.NewItem;case f.FILTER:return M.Filter;case f.MOVE:return M.Move;case f.PEEK:return M.Peek;case f.CONFIG:return M.Config;case f.SYNC:return M.Sync;default:return M.None}},M={Exit:"exit",Init:"init",None:"none",ViewHelp:"view-help",Rename:"rename",Edit:"edit",Delete:"delete",Filter:"filter",Move:"move",Peek:"peek",Config:"config",NewItem:"add-new-item",TagTicket:"ticket-tag",UntagTicket:"ticket-untag",AssignUserToTicket:"ticket-assign-user",UnassignUserFromTicket:"ticket-unassign-user",CloseIssue:"close-issue",ReopenIssue:"re-open-issue",Sync:"sync",Export:"export"};import{ulid as de}from"ulid";import Pi from"node:fs";import zd from"node:path";import Kd from"react";import{Box as jd}from"ink";import Tn from"react";import{Box as Sr,Text as Pd}from"ink";import Ce from"react";import{Text as Ei}from"ink";import Ni,{useEffect as Ii,useState as Ed}from"react";var Si={help:["\u276F "],default:["\u276F "],move:["\u25C6 ","\u25C6 "],"cmd-line":["\u276F "],palette:["\u276F "]},ue=({isSelected:e,placeholder:t=" "})=>{let{mode:n}=Se(),r=Si[n]??Si.default,[o,i]=Ed(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:T.accent,dimColor:o===1},d)};import{Box as Nr,Text as Nd}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),g=o?Math.min(m,Math.max(0,u-l+1)):Math.min(m,Math.floor(u/l)*l),y=g+l,I=e.slice(g,y),N=e.length>l,S=i,A=N?Math.max(1,Math.floor(l/e.length*S)):S,R=Math.max(0,S-A),P=Math.max(1,e.length-l),_=N?Math.floor(g/P*R):0;return In.createElement(Nr,{flexDirection:"row",height:i,width:"100%"},In.createElement(Nr,{flexDirection:"column",flexGrow:1,height:i},I),In.createElement(Nr,{flexDirection:"column",width:1,height:S},Array.from({length:S}).map((Ge,De)=>In.createElement(Nd,{key:De,color:N&&De>=_&&De<_+A?T.accent:T.secondary},N?"\u2502":" "))))};import{Box as bn,Text as wd}from"ink";import Qe from"react";import{Text as Id}from"ink";import Sd from"react";var Cd=e=>e.toLowerCase().trim(),Rd=(e,t=Xe)=>{let n=Cd(e);return t[n]?t[n]:Dt(n)},Cn=({id:e,isSelected:t})=>{let n=E.getContributor(e);if(n)return Sd.createElement(Id,{underline:t,color:Rd(n.name)},"@"+n.name)};import{Text as bd}from"ink";import Ad from"react";var Rn=({id:e,isSelected:t})=>{let n=E.getTag(e);if(n)return Ad.createElement(bd,{underline:t,backgroundColor:Ne(n.name),color:T.primary}," "+n.name+" ")};var Ci=({width:e,ticket:t,isSelected:n})=>{let r=e-14,o=cn(ln(t.title),r),i=cr(t),d=lr(t);return Qe.createElement(bn,{borderStyle:"round",width:e-7,height:4,flexDirection:"column",borderColor:n?T.accent:T.secondary,justifyContent:"space-between"},Qe.createElement(bn,{borderBottom:!0},Qe.createElement(bn,{paddingLeft:1,flexDirection:"column"},Qe.createElement(wd,{color:T.primary},o))),Qe.createElement(bn,{flexDirection:"row",paddingLeft:1},i.map(l=>Qe.createElement(Rn,{key:l.id,id:l.id})),d.map(l=>Qe.createElement(Cn,{key:l.id,id:l.id}))))};import Td from"chalk";import{Box as Ut,Text as Ir}from"ink";import Me from"react";var Md=(e,t)=>e.length>=t?e.slice(0,t)+"...":e,Ri=({width:e,ticket:t,isSelected:n,index:r,mode:o})=>{let i=(t.props.tags??[]).map(N=>E.getTag(N)).filter(N=>!!N),d=(t.props.assignees??[]).map(N=>E.getContributor(N)).filter(N=>!!N),l=1,u=i.length*(1+l),m=d.length*(2+l),g=i.map(N=>Me.createElement(Ut,{key:N.id,paddingRight:l},Me.createElement(Ir,{color:Ne(N.name)},"\u25A0"))),y=d.map(N=>Me.createElement(Ut,{key:N.id,paddingRight:l},Me.createElement(Ir,{color:Dt(N.name)},"@"+N.name.at(0)))),I=n?T.accent:o===p.MOVE?T.secondary:T.primary;return Me.createElement(Ut,{borderBottom:!0,justifyContent:"space-between"},Me.createElement(Ut,null,Me.createElement(ue,{isSelected:n,placeholder:Td.dim.gray(r+1+" ")}),Me.createElement(Ir,{wrap:"truncate",color:I},Md(t.title,e-u-m-14))),Me.createElement(Ut,null,g,y))};import kd from"chalk";var Ld=({swimlane:e,isSelected:t,width:n,height:r,isDense:o,isFocused:i,listSelectedIndex:d,mode:l})=>{let{renderedChildrenIndex:u}=Se(),m=u[e.id]??[],g=`${e.title} ${kd.hex(T.secondary2).dim("("+m.length+")")}`,y=3,I=o?1:4,N=r-y-(o?2:1),S=Ce.createElement(Sr,{borderStyle:"round",borderColor:T.secondary,justifyContent:"flex-start",borderLeft:!1,borderTop:!1,borderRight:!1},Ce.createElement(ue,{isSelected:t}),Ce.createElement(Pd,{bold:!0,color:t?T.accent:T.primary},g," ",e.readonly?"\u{1F512}":"")),A=(R,P)=>{let _=i&&d===P;return o?Ce.createElement(Ri,{key:R.id,index:P,width:n,ticket:R,isSelected:_,mode:l}):Ce.createElement(Ci,{key:R.id,width:n,ticket:R,isSelected:_})};return Ce.createElement(Sr,{flexDirection:"column",width:n,borderStyle:"round",borderColor:t?T.accent:T.secondary,paddingRight:1,paddingLeft:1,height:r},S,Ce.createElement(Sr,{padding:o?1:0},m.length>0&&Ce.createElement(Sn,{selectedIndex:d,height:N,itemHeight:I},m.map(A)),Ce.createElement(ue,{isSelected:i&&d===-1})))},bi=Ce.memo(Ld);import{Box as br,Text as _d}from"ink";import ze,{useMemo as wi}from"react";import{createHash as Dd}from"node:crypto";var Fd="0123456789ABCDEFGHJKMNPQRSTVWXYZ",Od=e=>{let t=Dd("sha256").update(e).digest(),n=0n;for(let o=0;o<16;o++)n=n<<8n|BigInt(t[o]);let r="";for(let o=0;o<26;o++){let i=BigInt((25-o)*5);r+=Fd[Number(n>>i&31n)]}return r},He=(e,t)=>Od(`${e}:virtual:${t}`);import{Box as An,Text as Ud}from"ink";import Pe from"react";var Ai=({selectedIndex:e,parent:t,selected:n})=>{let{contextNode:r}=Se(),{title:o}=t,i=t.parentNodeId?E.getNode(t.parentNodeId):void 0,d=i&&U(i)?o===q.ASSIGNEES?i.props.assignees??[]:o===q.TAGS?i.props.tags??[]:[]:[];return Pe.createElement(An,{alignItems:"center",paddingTop:1},Pe.createElement(An,{minWidth:12},Pe.createElement(ue,{isSelected:n}),Pe.createElement(Ud,{color:n?T.accent:T.secondary2},o,":")),Pe.createElement(An,{flexDirection:"row",marginLeft:1,paddingRight:1},d.map((l,u)=>{let m=r.id===t.id&&u===e;return Pe.createElement(An,{key:`${o}-${l}`,paddingRight:2,minHeight:1},Pe.createElement(ue,{isSelected:m}),o===q.ASSIGNEES?Pe.createElement(Cn,{isSelected:m,id:l}):o===q.TAGS?Pe.createElement(Rn,{isSelected:m,id:l}):null)})))};import{Box as wn,Text as Cr}from"ink";import ke,{useEffect as Bd}from"react";var ae={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 Rr=({id:e,label:t,text:n,height:r,selected:o,maxWidth:i})=>{let{selectedIndex:d,contextNode:l}=Se(),u=I=>String(I).replace(/\r?\n/g,""),m=typeof n=="string"?n.split(/\r?\n|\u2028|\u2029/):[];Bd(()=>{let I=[];return m.forEach((N,S)=>{let A=ge(BigInt(S+1));if(!St(A))return;let R=ae.text({id:`${e}-${S}`,name:`Line ${S+1}`,parentNodeId:e,rank:A.value,props:{value:N},readonly:!0,isVirtual:!0}),P=E.createNode(R);St(P)&&I.push(P.value.id)}),()=>I.forEach(E.deleteNode)},[e,n]);let g="\u2029",y=m.map((I,N)=>{let S=l.id===e&&d===N;return ke.createElement(wn,{key:`${e}-${N}`},ke.createElement(Cr,{color:S?T.primary:T.secondary2,dimColor:!S},`${N+1} `.padStart(5,"\xA0")),ke.createElement(Cr,{backgroundColor:S?"gray":""},u(I.length?cn(I,i-10):g)))});return ke.createElement(wn,{flexDirection:"column",paddingTop:1},ke.createElement(wn,null,ke.createElement(ue,{isSelected:o}),ke.createElement(Cr,{color:o?T.accent:T.secondary2},t)),ke.createElement(wn,{flexDirection:"row",borderStyle:"round",borderColor:T.secondary,paddingLeft:1,marginLeft:1},ke.createElement(Sn,{scrollByOne:!0,children:y,height:r-2,selectedIndex:d,itemHeight:1})))};var $d=e=>He(e,"description"),Wd=e=>He(e,"history"),Ti=({ticket:e,height:t})=>{let{selectedIndex:n,contextNode:r}=Se(),o=process.stdout.columns||120,i=wi(()=>$d(e.id),[e.id]),d=wi(()=>Wd(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),P=R&&Oe(R)?R.props.value??"":"",Ge=t-3;return ze.createElement(br,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},R?ze.createElement(Rr,{id:R.id,label:"Event log",text:P,selected:!1,maxWidth:o,height:Ge}):null)}let g=m.reduce((R,P)=>Ct(P)||P.id===d?R+1:R,0),y=2,I=3,N=g,S=t-I-N-y,A=(R,P)=>R.id===i?ze.createElement(Rr,{key:R.id,id:i,label:"Description (press e to edit)",text:e.props.description??"",selected:P,maxWidth:o,height:S}):Ct(R)?ze.createElement(Ai,{key:R.id,parent:R,selected:P,selectedIndex:n}):R.id===d?ze.createElement(br,{key:R.id,paddingTop:1},ze.createElement(ue,{isSelected:P}),ze.createElement(_d,{backgroundColor:T.secondary,color:P?T.accent:T.primary}," History \u203A\u203A ")):null;return ze.createElement(br,{width:o,flexDirection:"column",paddingRight:1,paddingBottom:1,minHeight:t},m.map((R,P)=>A(R,l&&n===P)))};var Hd=({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),I=Math.floor(l/3),N=Math.floor(l/Math.max(e.length,1)),S=Math.min(N,I),A=i==="dense";return Tn.createElement(jd,{flexDirection:"row",height:d},g&&e.map((R,P)=>{let _=t.id===R.id,Ge=_?n:-1,De=t.context===b.BOARD&&n===P;return Tn.createElement(bi,{key:R.id,height:d,width:S,swimlane:R,isSelected:De,isDense:A,isFocused:_,listSelectedIndex:Ge,mode:o})}),m&&y&&Tn.createElement(Ti,{height:d,ticket:y}))},Mi=Tn.memo(Hd);import{render as Vd}from"ink";import{Writable as qd}from"node:stream";var Bt=e=>String(e).padStart(2,"0"),Gd=e=>{let t=e.getUTCFullYear(),n=Bt(e.getUTCMonth()+1),r=Bt(e.getUTCDate()),o=Bt(e.getUTCHours()),i=Bt(e.getUTCMinutes()),d=Bt(e.getUTCSeconds());return`${t}-${n}-${r}_${o}-${i}-${d}`},Yd=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[-.]+|[-.]+$/g,"").toLowerCase()||"board",Xd=async(e,{width:t,height:n})=>{let r="",o=new qd({write(d,l,u){let m=Jd(d.toString()).trimEnd();m.trim().length>0&&m.includes("\u256D")&&(r=m),u()}});o.columns=t,o.rows=n,o.isTTY=!0;let i=Vd(e,{stdout:o,debug:!1,exitOnCtrlC:!1,patchConsole:!1,incrementalRendering:!1});return await new Promise(d=>setTimeout(d,0)),i.unmount(),r},Jd=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(P=>P.context==="BOARD");if(!d)return s("No board found to export");let l=120,u=40,m=await Xd(Kd.createElement(Mi,{height:u,width:l,swimlanes:(i[d.id]??[]).filter(P=>P!==void 0&&Yt(P)),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=Qt(process.cwd());if(a(g))return s("Unable to export, epiq root not found");let y=new Date,I=Gd(y),N=`board_${Yd(d.title)}_${I}.md`,S=Mo(g.value);Pi.mkdirSync(S,{recursive:!0});let A=zd.join(S,N),R=`# Board - ${d.title}
|
|
23
23
|
Date: ${y.toISOString()}
|
|
24
24
|
|
|
25
25
|
\`\`\`text
|
|
26
26
|
${m}
|
|
27
27
|
\`\`\`
|
|
28
|
-
`;return
|
|
29
|
-
`),c("Config written",null)}catch{return s(`Unable to write ~/${le}/config.json`)}},tt=e=>{let t
|
|
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=
|
|
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
|
|
28
|
+
`;return Pi.writeFileSync(A,R,"utf8"),c("Exported board layout",A)};var w={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"||w.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;w.navigate({contextNode:n,selectedIndex:i})},navigateToNextItem:()=>Li(1),navigateToPreviousItem:()=>Li(-1),navigateToNextContainer:()=>Di(1),navigateToPreviousContainer:()=>Di(-1),navigate:({contextNode:e,selectedIndex:t})=>{h({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;w.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(I=>I.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;w.navigate({contextNode:l,selectedIndex:y})};import ic from"node:os";import Bi from"node:path";import{z as et}from"zod";import{accessSync as Zd,copyFileSync as Qd,existsSync as Mn,mkdirSync as Fi,readdirSync as Oi,readFileSync as ec,renameSync as tc,rmSync as nc,statSync as Ui,unlinkSync as rc,writeFileSync as oc}from"node:fs";import ft from"node:path";var ce={writeToFile:(e,t)=>{try{let n=ft.dirname(e);Mn(n)||Fi(n,{recursive:!0});let r=typeof t=="string"?t:JSON.stringify(t,null,2);oc(e,r,"utf-8")}catch(n){logger.error(`Failed to write file at ${e}:`,n)}},readFile:e=>{try{return ec(e,"utf-8")}catch(t){return logger.error(`Failed to read file at ${e}:`,t),null}},readFileJSON(e){try{let t=ce.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 Zd(e),!0}catch{return!1}},mkDir:e=>Fi(e,{recursive:!0}),locateFolder:e=>{let t=process.cwd(),{root:n}=ft.parse(t);for(;;){let r=ft.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=ft.dirname(t)}return null},readFirstJSON(e){try{if(!ce.dirExists(e))return null;let t=Oi(e).filter(r=>r.endsWith(".json")).sort()[0];if(!t)return null;let n=ft.join(e,t);return ce.readFileJSON(n)}catch(t){return logger.error(`Could not read first JSON in folder ${e}`,t),null}},listDir:e=>{try{return ce.dirExists(e)?Oi(e):[]}catch(t){return logger.error(`Failed to list dir ${e}`,t),[]}},rmFile(e){try{rc(e)}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove file ${e}`)}},rmDir(e){try{nc(e,{recursive:!0,force:!0})}catch(t){t?.code!=="ENOENT"&&logger.error(`Unable to remove dir ${e}`)}},moveFile(e,t,n){if(this.mkDir(ft.dirname(t)),!n?.overwrite&&Mn(t))throw new Error(`moveFile: destination exists: ${t}`);n?.overwrite&&this.rmFile(t);try{tc(e,t)}catch(r){if(r?.code==="EXDEV"){Qd(e,t),this.rmFile(e);return}throw r}}};var sc={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()}),ac="config.json",$i=()=>Bi.join(ic.homedir(),le),Ar=()=>Bi.join($i(),ac),wr=()=>{try{return ce.mkDir($i()),c(`Ensured ~/${le} exists`,null)}catch{return s(`Unable to create ~/${le}`)}},dc=e=>{let t;try{t=JSON.parse(e)}catch{return s(`Invalid ~/${le}/config.json JSON`)}let n=_i.safeParse(t??{});return n.success?c("Parsed config",n.data):s(`Invalid ~/${le}/config.json shape: ${n.error.issues.map(r=>r.path.join(".")||r.message).join(", ")}`)},Wi=()=>{let e=wr();if(a(e))return s(e.message);let t=Ar(),n=ce.readFile(t);return n==null||n.trim()===""?c("No config found, using empty config",{autoSync:null,preferredEditor:"",userId:"",userName:"",autoSyncIntervalMs:1e4}):dc(n)},ji=e=>{let t=wr();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=Ar();try{return ce.writeToFile(r,JSON.stringify(n.data,null,2)+`
|
|
29
|
+
`),c("Config written",null)}catch{return s(`Unable to write ~/${le}/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=Ar(),t=wr();if(a(t))return s(`Unable to create ~/${le}`);if(!(ce.readFile(e)!==null)){let m=ji(sc);if(a(m))throw new Error(`Unable to create ~/${le}/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 ~/${le}/config.json`):c("successfully loaded settings",{preferredEditor:o??"",userName:i,userId:d,autoSync:l??!1,autoSyncIntervalMs:u??1e4,viewMode:"dense"})};import hc from"node:fs";import Ec from"node:path";import{decodeTime as Nc,monotonicFactory as Ic}from"ulid";import{z as _t}from"zod";import Pn from"node:fs";import Mr from"node:path";import{decodeTime as cc}from"ulid";import{z as Tr}from"zod";var lc=Tr.object({userId:Tr.string().min(1).default("unknown"),userName:Tr.string().min(1).default("unknown")}),uc=e=>{let[t,n]=Mr.basename(e,".jsonl").split("."),r=lc.safeParse({userId:t,userName:n});return r.success?c("Parsed event file actor",r.data):s(`Invalid event file name ${Mr.basename(e)}: ${r.error.issues.map(o=>o.path.join(".")||o.message).join(", ")}`)},mc=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])},pc=(e,t)=>t in e,gc=({id:e,action:t,payload:n,userId:r,userName:o})=>({id:e,action:t,payload:n,userId:r,userName:o}),fc=e=>{let{userId:t,userName:n,...r}=e,o=mc(r);if(a(o))return s(o.message);let i=o.value,d=e.id?.[0];return d?pc(r,i)?c("Decoded persisted event",gc({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")},Pr=e=>{let t=[];for(let n of e){let r=fc(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)},vc=e=>{if(!Pn.existsSync(e))return c("Event file missing",[]);let t=uc(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 kr(e){let t=kt(e);if(!Pn.existsSync(t))return c("No events found",[]);let n=Pn.readdirSync(t).filter(o=>o.endsWith(".jsonl")).map(o=>Mr.join(t,o)),r=[];for(let o of n){let i=vc(o);if(a(i))return s(i.message);r.push(...i.value)}return c("All events loaded",yc(r))}function vt(e){let t=kr(e);return a(t)?s(t.message):Pr(t.value)}function zi(e,t){let n=kr(e);if(a(n))return s(n.message);let{appliedEvents:r,unappliedEvents:o}=xc(n.value,t),i=Pr(r);if(a(i))return s(i.message);let d=Pr(o);return a(d)?s(d.message):c("Loaded merged events before time",{appliedEvents:i.value,unappliedEvents:d.value})}function Ki(e=process.cwd()){let t=kr(e);return a(t)?s(t.message):c("Loaded edge reference",t.value.at(-1)?.id?.[0]??null)}var yc=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 I=n.get(y)??[];I.push(m),n.set(y,I)}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 I of y)i(I)},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},xc=(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=cc(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 Vi=e=>({action:e.action,payload:e.payload});var Gi=1,qi=Ic(),Sc=_t.tuple([_t.string().min(1),_t.string().min(1).nullable()]),Cc=_t.looseObject({v:_t.literal(Gi),id:Sc}),Lr=e=>{let t=Cc.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",V=()=>{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`,Rc=(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=Ec.join(kt(e),r);return c("Successfully resolved event log path",i)},bc=(e,t)=>{let n={[e.action]:e.payload,v:Gi,id:t};return Lr(n)};function Ln({event:e,rootDir:t}){try{let n=Po(t);if(a(n))return n;let r=Rc(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?qi(Math.max(Date.now(),Nc(o.value)+1)):qi(),d=bc(Vi(e),[i,o.value]);return a(d)?s(d.message):(hc.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 Yi=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 Ac=["00KM6CZ900T7180RM46K0JAYNF","00JR3R8E00A1Z4X9FGP9DV0SM5"],[ne,Dn]=Ac;import{ulid as Lc}from"ulid";import{spawnSync as wc}from"node:child_process";import Tc from"node:os";import Xi from"node:path";import{ulid as Mc}from"ulid";function Pc(){let{preferredEditor:e}=K(),t=[e,process.env.VISUAL,process.env.EDITOR].filter(n=>!!n?.trim());return[...new Set(t)]}function kc(e,t){return/(^|\/)code(-insiders)?$/.test(e.trim())?`${e} --wait "${t}"`:`${e} "${t}"`}function Ji(e){let t=Xi.join(Tc.tmpdir(),"epiq");ce.mkDir(t);let n=Xi.join(t,Mc());ce.writeToFile(n,e??"");let r=Pc();for(let o of r){let i=kc(o,n),d=wc(i,{stdio:"inherit",shell:!0});if(!d.error&&d.status===0){let l=ce.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 Zi=async()=>{let e=V();if(a(e))return s("Unable to resolve user ID");let t=await ve();if(a(t))return t;let n=t.value,{breadCrumb:r,selectedNode:o}=v(),i=Ee([...r,o],"TICKET");if(a(i))return s("Edit target must be an issue");let d=i.value;if(!U(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===q.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=Ji(u);if(a(m))return s("Failed to edit field");let g=m.value;return g===u?c("No changes made",null):ye({id:Lc(),action:"edit.description",payload:{id:d.id,md:g},...e.value},n)};import zc from"node:fs";import is from"node:path";import Dr from"node:fs";import Dc from"node:path";var Qi=async e=>{let t=Dc.join(e,".gitignore"),n=Dr.existsSync(t)?Dr.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
|
-
`,
|
|
36
|
+
`,Dr.writeFileSync(t,n,"utf8"),te.info(`Added ${i.join(", ")} to .gitignore (epiq local state)`),c("Local epiq paths ignored",!0)};import yt from"node:fs";import $t from"node:path";var ts=async e=>{if((await fe({args:["rev-parse","--verify","HEAD"],cwd:e})).exitCode===0)return c("Initial commit already exists",!1);te.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)},es=e=>e.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._/-]/g,"-").replace(/-+/g,"-").replace(/^[-/.]+|[-/.]+$/g,"")||"unknown",Fc=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:${es(t.value)}:${es(n.value)}]`)},Fr=async({repoRoot:e,stateBranchName:t})=>{te.info(`Creating ${t}`);let n=await D({args:["commit-tree",Ro,"-m","[epiq:init-state-branch]"],cwd:e});if(a(n))return s(`Failed to create state branch commit
|
|
37
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)},
|
|
38
|
+
${o.message}`):c("Created state branch",!0)},Oc=async({repoRoot:e,stateBranchName:t})=>{let n=await tr({repoRoot:e});if(a(n))return s(`Ensure local state branch failed
|
|
39
39
|
`+n.message);let r=n.value,o=r?await wt({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:oe,branch:t});if(a(l))return s(`Failed to fetch ${t} from remote
|
|
41
41
|
${l.message}`)}let d=await nn({repoRoot:e,branch:t});if(a(d))return s(`Ensure local state branch failed
|
|
42
42
|
`+d.message);if(d.value)return c("Local state branch already exists",!1);if(i){let l=await D({args:["branch","--track",t,`${oe}/${t}`],cwd:e});return a(l)?s(`Failed to create local ${t} from remote
|
|
43
|
-
${l.message}`):c("Created local state branch from remote",!0)}return
|
|
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)},
|
|
45
|
-
`+r.message);yt.existsSync(t)&&!yt.existsSync($t.join(t,".git"))&&(te.info("Removing broken state branch worktree path"),
|
|
46
|
-
${o.message}`):c("Created state branch worktree",!0)},
|
|
43
|
+
${l.message}`):c("Created local state branch from remote",!0)}return Fr({repoRoot:e,stateBranchName:t})},Uc=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)},Bc=async({repoRoot:e,stateBranchRoot:t,stateBranchName:n})=>{let r=Tt($t.dirname(t));if(a(r))return s(`Failed to create state branch worktree
|
|
45
|
+
`+r.message);yt.existsSync(t)&&!yt.existsSync($t.join(t,".git"))&&(te.info("Removing broken state branch worktree path"),Ao(t)),te.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 Uc({repoRoot:e,branch:n});if(a(r))return s(r.message);let o=$t.resolve(t),i=r.value?$t.resolve(r.value):null;if(i&&i===o&&yt.existsSync(i))return c("State branch already checked out in expected worktree",!1);if(i&&i!==o){te.info("Moving state branch worktree to expected location");let u=await z.worktreeRemove({cwd:e,worktreeRoot:i});if(a(u))return s(`Failed to remove existing state branch worktree
|
|
47
47
|
${u.message}`)}if(i&&!yt.existsSync(i)){te.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
|
|
49
|
-
${u.message}`)}return
|
|
50
|
-
${o.message}`):c("Checked out state branch",!0)}
|
|
48
|
+
${u.message}`)}let d=await yo({repoRoot:e,worktreeRoot:t});if(a(d))return s(d.message);let l=yt.existsSync(t);if(d.value&&l)return c("State branch worktree already exists",!1);if(d.value&&!l){te.info("Pruning missing registered state branch worktree");let u=await z.worktreePrune({cwd:e});if(a(u))return s(`Failed to prune stale worktrees
|
|
49
|
+
${u.message}`)}return Bc({repoRoot:e,stateBranchRoot:t,stateBranchName:n})},_c=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 fe({cwd:e,args:["rebase","--abort"]})).exitCode===0&&te.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)},$c=async({repoRoot:e,stateBranchRoot:t})=>{let n=await nr(t);if(a(n))return s(n.message);if(n.value)return c("State branch upstream already configured",!1);let r=await tr({repoRoot:t});if(a(r))return s(r.message);if(!r.value)return c("No remote available for state branch upstream",!1);let o=Ye(e);if(a(o))return o;let i=o.value,d=await wt({repoRoot:t,branch:i});if(a(d))return s(d.message);if(!d.value)return c("Remote state branch missing; upstream will be configured on first push",!1);te.info(`Configuring ${i} upstream`);let l=await z.fetch({cwd:t,remote:oe,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:`${oe}/${i}`});return a(u)?s(`Failed to set state branch upstream
|
|
52
|
-
${u.message}`):c("Configured state branch upstream",!0)},
|
|
53
|
-
${o.message}`):c("Staged state branch event file",void 0)},
|
|
54
|
-
`+n.message):ct({cwd:t,message:n.value})},Wt=async({repoRoot:e,stateBranchRoot:t})=>{let n=await
|
|
55
|
-
${i.message}`):c("Pushed state branch",!0)},
|
|
52
|
+
${u.message}`):c("Configured state branch upstream",!0)},Fn=async({stateBranchRoot:e,eventFileName:t})=>{let n=Mt(t),r=$t.join(e,n);if(!yt.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)},ns=async({repoRoot:e,stateBranchRoot:t})=>{let n=await Fc(e);return a(n)?s(`Create state branch sync commit failed
|
|
54
|
+
`+n.message):ct({cwd:t,message:n.value})},Wt=async({repoRoot:e,stateBranchRoot:t})=>{let n=await nr(t);if(a(n))return s(n.message);let r=Ye(e);if(a(r))return r;let o=r.value,i=n.value?await z.push({cwd:t}):await z.push({cwd:t,remote:oe,branch:o,setUpstream:!0});return a(i)?s(`Failed during state branch push
|
|
55
|
+
${i.message}`):c("Pushed state branch",!0)},rs=async({repoRoot:e,stateBranchRoot:t,ensureUpstream:n})=>{let r=!1,o=Ye(e);if(a(o))return o;let i=o.value,d=[sn(),await Oc({repoRoot:e,stateBranchName:i}),await Or({repoRoot:e,stateBranchRoot:t,stateBranchName:i}),await _c({stateBranchRoot:t,stateBranchName:i}),await To(t),n?await $c({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 Wc,ulid as Le}from"ulid";var jt=Wc();function jc(){let e=he();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 Hc(){let e=jc();return a(e)?e:w.navigate(e.value)}function os({userId:e,userName:t}){let n=jt(),r=jt(),o=jt(),i=jt(),d=jt(),l=re(void 0,void 0);if(a(l))return l;let u=re(void 0,void 0);if(a(u))return u;let m=re(u.value,void 0);if(a(m))return m;let g=re(void 0,void 0);if(a(g))return g;let y=re(g.value,void 0);if(a(y))return y;let I=re(y.value,void 0);if(a(I))return I;let N=re(void 0,void 0);return a(N)?N:c("Created default events",[{id:Le(),userId:e,userName:t,action:"init.workspace",payload:{id:n,name:"Workspace",rank:l.value}},{id:Le(),userId:e,userName:t,action:"add.board",payload:{id:r,name:"Default",parent:n,rank:u.value}},{id:Le(),userId:e,userName:t,action:"add.swimlane",payload:{id:o,name:"Todo",parent:r,rank:g.value}},{id:Le(),userId:e,userName:t,action:"add.swimlane",payload:{id:i,name:"In progress",parent:r,rank:y.value}},{id:Le(),userId:e,userName:t,action:"add.swimlane",payload:{id:d,name:"Done",parent:r,rank:I.value}},{id:Le(),userId:e,userName:t,action:"add.board",payload:{id:Dn,name:"Closed",parent:n,rank:m.value}},{id:Le(),userId:e,userName:t,action:"add.swimlane",payload:{id:ne,name:"Closed",parent:Dn,rank:N.value}},{id:Le(),userId:e,userName:t,action:"lock.node",payload:{id:Dn}},{id:Le(),userId:e,userName:t,action:"lock.node",payload:{id:ne}}])}function On(e){if(!e.length){let r=ae.workspace("temporary-uninitialized-workspace","Workspace","a0"),o=Ht(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=rt(e).filter(a);return n.length>0?s(`Materializing failed:
|
|
56
56
|
${n.map(r=>r.message).join(`
|
|
57
|
-
`)}`):(
|
|
58
|
-
`));let Vn=he();if(a(Vn))return W(16,Vn.message);let{rootNodeId:ga,nodes:fa}=Vn.value,eo=fa[ga];return eo?(w.navigate({contextNode:eo,selectedIndex:0}),h({hasProjectDefinition:!0,mode:p.DEFAULT}),c(qn,null)):W(16,"Unable to resolve initialized root node")};import{ulid as qc}from"ulid";import{ulid as Kc}from"ulid";var ss=null,Ke=()=>structuredClone(ss),zt=e=>{ss=e},as=()=>{let{contextNode:e,selectedIndex:t}=v(),r=j(e.id)[t];return r?c("Resolved selected child",r):s("Target node not found")},Or=({id:e,parentId:t,position:n={at:"end"}})=>{let r=j(t).filter(o=>o.id!==e);return On(r,n)},ds=({id:e,parentId:t,position:n={at:"end"}})=>{let r=q();if(a(r))return s("Unable to resolve user ID");let o=Or({parentId:t,id:e,position:n});return a(o)?o:c("Created pending move state",{id:Kc(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value.rank}})},cs=e=>{zt(e);let t=Kt(e,!0);return a(t)?t:c("Node moved successfully",t.value)};function Ur(e){let t=as();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=ds({id:t.value.id,parentId:l.id,position:{at:"end"}});return a(u)?u:cs(u.value)}function Br(e){let t=as();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=ds({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:i.id}});return a(d)?d:cs(d.value)}var ls=()=>{let e=Ke();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"):(w.navigate({contextNode:r,selectedIndex:o}),c("Synchronized navigation to moved node",null))},Un=(e,t="Moved preview")=>{if(a(e))return e;let n=ls();return a(n)?n:(h({mode:p.MOVE}),c(t,null))},us=async()=>{let e=q();if(a(e))return s("Unable to resolve user ID");let{modifier:t}=J().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=Or({parentId:o.parentNodeId,id:o.id,position:m});return a(g)?g:(zt({id:qc(),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 Un(Br(1));if(t==="previous")return Un(Br(-1));if(t==="to-next")return Un(Ur(1));if(t==="to-previous")return Un(Ur(-1));if(t==="confirm"){let i=Ke();if(!i)return s("No pending move to confirm");let d=await ve();if(a(d))return d;let l=ye(i,d.value);if(a(l))return l;let u=ls();return a(u)?u:(zt(null),h({mode:p.DEFAULT}),c("Moved item",null))}return t==="cancel"?(zt(null),h({mode:p.DEFAULT}),c("Cancelling move",null)):s("Invalid move modifier")};import{ulid as _n}from"ulid";import{monotonicFactory as Vc,ulid as Gc}from"ulid";var Yc=Vc(),Bn=({name:e,parent:t,rank:n,user:{userId:r,userName:o}})=>{let i=Yc();return c("Created issue events",[{id:Gc(),userId:r,userName:o,action:"add.issue",payload:{id:i,parent:t,name:e,rank:n}}])};var ms=async(e,t)=>{let n=q();if(a(n))return s("Unable to resolve user ID");let r=await ve();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=ye(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 I=E.getNode(y.parentNodeId);return I?(w.navigate({contextNode:I,selectedIndex:E.getSiblings(y.parentNodeId).findIndex(({id:N})=>N===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=xt(g.id,n.value,o);return a(y)?y:u({id:_n(),action:"add.board",payload:{id:_n(),name:t.inputString,parent:g.id,rank:y.value},...n.value})}if(t.modifier==="swimlane"){let m=Ee(i,"BOARD");if(a(m))return s("Unable to add swimlane in this context");let g=xt(m.value.id,n.value,o);return a(g)?g:u({id:_n(),action:"add.swimlane",payload:{id:_n(),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 _=Ee(i,"SWIMLANE");return a(_)?null:_.value})();if(!g)return s("Unable to add issue in this context");let y=xt(g.id,n.value,o);if(a(y))return y;let I=Bn({name:t.inputString,parent:g.id,rank:y.value,user:n.value});if(a(I))return I;let N=I.value,S=ht(N,o);if(S.some(_=>a(_)))return s("Issue create failed: "+S.filter(a).map(_=>_.message).filter(Boolean).join(", "));let A=S[0];if(!A||a(A))return s("Issue creation failed");let P=N.find(_=>_.action==="add.issue")?.payload.id;return P?(w.navigate({contextNode:g,selectedIndex:E.getSiblings(g.id).findIndex(({id:_})=>_===P)}),c("Issue created",null)):s("Unable to determine ticket id")}return c("Success",null)};var ps=async()=>{let e=Ee(v().breadCrumb,"BOARD");if(a(e))return e;let t=await _e(process.cwd());if(a(t))return s("Unable to locate repo root");let n=lt({repoRoot:t.value});if(a(n))throw new Error(n.message);let{modifier:r}=J().commandMeta;if(r==="now"){let S=vt(n.value);if(a(S))return s(S.message);let A=qt();if(a(A))return A;let P=rt(S.value).filter(a);return P.length>0?s(P.map(_=>_.message).join(", ")):(h({mode:p.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),c("Peeking now",!0))}let o;if(r==="prev"){let S=v().eventLog.at(-1),A=mr(S);if(A===null)return s("No previous event to peek");o=A}else if(r==="next"){let S=v().unappliedEvents.at(0),A=mr(S);if(A===null)return s("No next event to peek");o=A+1}else{let S=fn(r);if(!S)return s("Invalid peek date");o=S.getTime()}let i=v(),d=e.value.id,l=Hi(n.value,o);if(a(l))return s(l.message);let{appliedEvents:u,unappliedEvents:m}=l.value,g=qt();if(a(g))return g;let I=rt(u).filter(a);if(I.length>0)return qt(),h(i),s(I.map(S=>S.message).join(", "));let N=v().nodes[d];return N?(w.navigate({contextNode:N,selectedIndex:0}),h({mode:p.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:m}),c("Peeking",!0)):(qt(),h(i),s("Board did not exist at peek date"))};import Xc from"zod";var gs=()=>{let e=J().commandMeta.inputString,t=Xc.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:($e({autoSyncIntervalMs:t.data}),h({mode:p.DEFAULT}),c(`Auto sync interval set to ${t.data}ms`,null))};var fs=()=>{let e=J().commandMeta.inputString.trim();if(e!=="yes"&&e!=="no")return s("Invalid response");let t=jo(e),n=tt({autoSync:t});return a(n)?n:($e({autoSync:t}),h({mode:p.DEFAULT}),c(`Auto sync set to "${e}"`,null))};var vs=async()=>{O(()=>""),h({mode:p.DEFAULT});let e=he();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 We();return a(t)?(h({syncStatus:{msg:t.message,status:"failed"}}),t):(h({mode:p.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};import{useSyncExternalStore as Wh}from"react";var _r,Jc=new Set,Zc=()=>{for(let e of Jc)e()};var Et=()=>{if(!_r)throw new Error("Ui state not initialized. Call initUiState() first.");return _r};var Qc=e=>{let t=Et();return _r=e(t),Zc(),c("UX state updated",null)},qe=e=>Qc(t=>({...t,...e}));var ys=e=>Object.values(v().tags).find(t=>t.name===e),xs=e=>Object.values(v().contributors).find(t=>t.name===e),hs=[{systemOnly:!0,intent:M.Move,description:"Internal move-state command",mode:p.COMMAND_LINE,action:us},{intent:M.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?me({id:de(),action:"delete.node",payload:{id:r.id},...e.value}):s("Unable to resolve child to delete")},onSuccess:()=>h({mode:p.DEFAULT})},{intent:M.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:p.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=J().commandMeta,n=/(!=|=)/,[r]=e.split(n);if(!r||!(d=>Q(f.FILTER).map(l=>l.split(n)[0]).includes(d))(r))return s("Invalid filter modifier");let i={target:r,operator:"=",value:t.trim()};return pe(d=>({...d,filters:e==="clear"?[]:[...d.filters,i],mode:p.DEFAULT})),c("Filter updated",null)}},{intent:M.ViewHelp,description:"Open the help screen",mode:p.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=v();return qe({pendingNavTarget:{contextNode:e,breadCrumb:r,selectedIndex:t,selectedNode:n}}),h({mode:p.HELP}),c("Viewing help",null)}},{intent:M.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(!B(r))return s("Cannot close in this context");let o=v().nodes[ne];if(!o)return s("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return s("Issue is already closed");let i=await ve();if(a(i))return i;let d=i.value,l=It(o.id,r.id,{at:"end"},e.value,d);if(a(l))return l;let u=await me({id:de(),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:M.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):Nt(r.id,"TICKET");if(a(o))return s("Cannot reopen in this context");let i=o.value,d=v().nodes[ne];if(!d)return s("Unable to locate closed swimlane");if(i.parentNodeId!==d.id)return s("Issue is not closed");if(!B(i))return s("Target node is not issue");let l=Gi(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 ve();if(a(m))return m;let g=m.value,y=It(u.id,i.id,{at:"end"},e.value,g);if(a(y))return y;let I=await me({id:de(),action:"reopen.issue",payload:{id:i.id,parent:u.id,rank:y.value},...e.value});return a(I)?I:c("Issue reopened",null)},onSuccess:()=>h({mode:p.DEFAULT})},{intent:M.Init,description:"Initialize Epiq in the current git repository",mode:p.COMMAND_LINE,action:is},{intent:M.NewItem,description:"Create a new board, swimlane, or issue",mode:p.COMMAND_LINE,action:ms,onSuccess:()=>h({mode:p.DEFAULT})},{intent:M.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=yi();return o?me({id:de(),action:"edit.title",payload:{id:r.id,name:o},...e.value}):s("Provide a title")},onSuccess:()=>h({mode:p.DEFAULT})},{intent:M.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}=J().commandMeta,r=(t||n).trim();if(!r)return s("Provide a tag");let o=ys(r);if(!o)return s(`Tag "${r}" does not exist`);let{selectedNode:i}=v();if(!i)return s("Invalid untag target");let d=Nt(i.id,"TICKET");if(a(d))return s("Unable to untag issue in this context");let l=d.value;return B(l)?(l.props.tags??[]).includes(o.id)?me({id:de(),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:M.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}=J().commandMeta,r=(t||n).trim();if(!r)return s("Provide a tag");let{selectedNode:o}=v();if(!o)return s("Invalid tag target");let i=Nt(o.id,"TICKET");if(a(i))return s("Unable to tag issue in this context");let d=i.value;if(!B(d))return s("Target node is not issue");let l=ys(r),u;if(l)u=l.id;else{let g=de(),y=await me({id:de(),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"):me({id:de(),action:"add.issue.tag",payload:{id:d.id,tag:u},...e.value})},onSuccess:()=>h({mode:p.DEFAULT})},{intent:M.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}=J().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=Nt(d.id,"TICKET");if(a(l))return s("Unable to assign issue in this context");let u=l.value;if(!B(u))return s("Target node is not issue");let m=xs(r),g;if(m)g=m.id;else{let I=de(),N=await me({id:de(),action:"create.contributor",payload:{id:I,name:r},...e.value});if(a(N))return N;g=N.value.result.id}return(u.props.assignees??[]).includes(g)?s("Assignee already assigned"):me({id:de(),action:"add.issue.assignee",payload:{id:u.id,assignee:g},...e.value})},onSuccess:()=>h({mode:p.DEFAULT})},{intent:M.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}=J().commandMeta,r=(t||n).trim();if(!r)return s("Provide an assignee to remove");let o=xs(r);if(!o)return s(`Assignee "${r}" does not exist`);let{selectedNode:i}=v();if(!i)return s("Invalid unassign target");let d=Nt(i.id,"TICKET");if(a(d))return s("Unable to unassign in this context");let l=d.value;return B(l)?(l.props.assignees??[]).includes(o.id)?me({id:de(),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:M.Sync,description:"Pull, commit, and push Epiq state",mode:p.COMMAND_LINE,action:vs},{intent:M.Peek,description:"View board state at another point in time",mode:p.COMMAND_LINE,action:ps},{intent:M.Export,description:"Export the current board layout to markdown",mode:p.COMMAND_LINE,action:async()=>{let e=await Pi();return a(e)?e:(h({mode:p.DEFAULT}),c("Export successful",!0))}},{intent:M.Exit,description:"Exit the application",mode:p.COMMAND_LINE,action:async()=>(w.exit(),c("Exit successful",!0))},{intent:M.Edit,description:"Edit title or description",mode:p.COMMAND_LINE,action:async(e,t)=>{if(t.modifier===je.DESCRIPTION)return Ji();if(t.modifier===je.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?me({id:de(),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:M.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 X.USERNAME:{let{userId:r,preferredEditor:o,userName:i}=K(),d=n||i,l=r??de();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:($e({userName:d,userId:l}),h({mode:p.DEFAULT}),c(`Username set to "${d}"`,null))}case X.EDITOR:{if(!n)return s("No editor provided");let r=tt({preferredEditor:n});return a(r)?r:($e({preferredEditor:n}),h({mode:p.DEFAULT}),c(`Editor configuration set to "${n}"`,null))}case X.VIEW:return n!=="wide"&&n!=="dense"?s("Invalid view mode"):($e({viewMode:n}),c(`View set to "${n}"`,null));case X.AUTOSYNC:return fs();case X.SYNC_DEBOUNCE_MS:return gs();default:return s("Unknown config command")}}}];var el=new Set(["peek","filter","view-help"]),Ce=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=J();if(!t)return s("No command to confirm");if(!e&&n===Ze.Invalid)return s("Invalid command");let i=xi(t);pi();let{readOnly:d}=v();if(d&&!el.has(i))return Ot({status:Fe.Fail,message:"Command not available in readonly state",value:null});let l=hs.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===i);if(!l)return Ot({status:Fe.Fail,message:"Command not found",value:null});let u;try{u=await l.action(l,{command:t,inputString:o,modifier:r})}catch(m){return Ot({status:Fe.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return a(u)?Ot(u):(gi({addToHistory:!e}),l.onSuccess?.(),K().autoSync&&_o(),u)};var $n=[{intent:C.Exit,mode:p.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(h({mode:p.COMMAND_LINE}),O(()=>"move cancel"),Ce({isForceExecutedBySystem:!0}))},{intent:C.InitMove,mode:p.DEFAULT,description:"[m] move (init/confirm)",action:()=>(h({mode:p.COMMAND_LINE}),O(()=>"move start"),Ce({isForceExecutedBySystem:!0}))},{intent:C.ConfirmMove,mode:p.MOVE,action:()=>(h({mode:p.COMMAND_LINE}),O(()=>"move confirm"),Ce({isForceExecutedBySystem:!0}))}],Wn=[{intent:C.MovePreviousItem,mode:p.MOVE,action:()=>Ke()?(h({mode:p.COMMAND_LINE}),O(()=>"move previous"),Ce({isForceExecutedBySystem:!0})):s("No pending move")},{intent:C.MoveNextItem,mode:p.MOVE,action:()=>Ke()?(h({mode:p.COMMAND_LINE}),O(()=>"move next"),Ce({isForceExecutedBySystem:!0})):s("No pending move")}],Es=[{intent:C.MoveToNextContainer,mode:p.MOVE,action:()=>Ke()?(h({mode:p.COMMAND_LINE}),O(()=>"move to-next"),Ce({isForceExecutedBySystem:!0})):s("No pending move")},{intent:C.MoveToPreviousContainer,mode:p.MOVE,action:()=>Ke()?(h({mode:p.COMMAND_LINE}),O(()=>"move to-previous"),Ce({isForceExecutedBySystem:!0})):s("No pending move")}];var Ns={[b.WORKSPACE]:[...$n,...Wn],[b.BOARD]:[...$n,...Wn],[b.SWIMLANE]:[...$n,...Wn,...Es],[b.TICKET]:[],[b.FIELD]:[],[b.FIELD_LIST]:[],[b.TEXT]:[]};var Is=()=>{O(()=>"");let{pendingNavTarget:e}=Et();h({mode:p.DEFAULT}),e&&w.navigate(e),qe({pendingNavTarget:void 0})},Ss=[{intent:C.ExitCommandLine,mode:p.HELP,action:()=>(Is(),c("Exiting help",null))},{intent:C.Exit,mode:p.HELP,action:()=>(Is(),c("Closed help",null))},{intent:C.NavPreviousItem,mode:p.HELP,description:"[arrows/hjkl] navigate",action:()=>(w.navigateToPreviousItem(),c("Navigating to previous help item",null))},{intent:C.NavNextItem,mode:p.HELP,action:()=>(w.navigateToNextItem(),c("Navigating to next help item",null))},{intent:C.NavToPreviousContainer,mode:p.HELP,action:()=>(w.navigateToPreviousContainer(),c("Navigating to previous help container",null))},{intent:C.NavToNextContainer,mode:p.HELP,action:()=>(w.navigateToNextContainer(),c("Navigating to next help container",null))}];var tl=e=>{h({mode:p.COMMAND_LINE});let{pendingNavTarget:t}=Et();t&&w.navigate(t),qe({pendingNavTarget:void 0}),O(()=>`${e} `)},Cs=()=>{O(()=>"");let{pendingNavTarget:e}=Et();e&&w.navigate(e),qe({pendingNavTarget:void 0}),h({mode:p.DEFAULT})},Rs=[{intent:C.InitCommandPalette,mode:p.DEFAULT,description:"[?] view command palette (explore descriptions for every command)",action:()=>{O(()=>"");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=v();return qe({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}}),h({mode:p.PALETTE}),c("Opening command palette",null)}},{intent:C.Confirm,mode:p.PALETTE,action:()=>{let{selectedNode:e}=v();if(!e||!no(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?(tl(t),c("Selected command",t)):c("No command selected",null)}},{intent:C.ExitCommandLine,mode:p.PALETTE,action:()=>(Cs(),c("Exiting palette",null))},{intent:C.Exit,mode:p.PALETTE,action:()=>(Cs(),c("Closed command palette",null))},{intent:C.NavPreviousItem,mode:p.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(w.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:C.NavNextItem,mode:p.PALETTE,action:()=>(w.navigateToNextItem(),c("Navigating to next item",null))},{intent:C.NavToPreviousContainer,mode:p.PALETTE,action:()=>(w.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:C.NavToNextContainer,mode:p.PALETTE,action:()=>(w.navigateToNextContainer(),c("Navigating to next container",null))}];var bs=[...Ss,...Rs,{intent:C.AddItem,mode:p.DEFAULT,description:"[n] new...",action:()=>(h({mode:p.COMMAND_LINE}),O(()=>`${f.NEW} `),c("Adding new item",null))},{intent:C.Delete,mode:p.DEFAULT,description:"[d] delete",action:()=>(h({mode:p.COMMAND_LINE}),O(()=>`${f.DELETE} `),c("Deleting item",null))},{intent:C.InitCommandLine,mode:p.DEFAULT,description:"[:] focus command line",action:()=>(h({mode:p.COMMAND_LINE}),O(()=>""),c("Entering command line mode",null))},{intent:C.Confirm,mode:p.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=v();if(!j(e?.id??"")?.length){if(e?.title===V.DESCRIPTION)return h({mode:p.COMMAND_LINE}),O(()=>`${f.EDIT} description `),c("Propose command",!0);if(e?.title===V.ASSIGNEES)return h({mode:p.COMMAND_LINE}),O(()=>`${f.ASSIGN} `),c("Propose command",!0);if(e?.title===V.TAGS)return h({mode:p.COMMAND_LINE}),O(()=>`${f.TAG} `),c("Propose command",!0);if(t.title===V.DESCRIPTION&&e?.context==="TEXT")return h({mode:p.COMMAND_LINE}),O(()=>`${f.EDIT} description `),c("Propose command",!0)}return w.enterChildNode(),c("Entering context",null)}},{intent:C.EditTitle,mode:p.DEFAULT,description:"[r] rename title",action:()=>(h({mode:p.COMMAND_LINE}),O(()=>`${f.EDIT} title ${v().selectedNode?.title}`),c("Exiting context",null))},{intent:C.EditDescription,mode:p.DEFAULT,description:"[e] edit description",action:()=>(h({mode:p.COMMAND_LINE}),O(()=>`${f.EDIT} description `),c("Exiting context",null))},{intent:C.Exit,mode:p.DEFAULT,description:"[q] exit context",action:()=>(w.enterParentNode(),c("Exiting context",null))},{intent:C.NavPreviousItem,mode:p.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(w.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:C.NavNextItem,mode:p.DEFAULT,action:()=>(w.navigateToNextItem(),c("Navigating to next item",null))},{intent:C.NavToPreviousContainer,mode:p.DEFAULT,action:()=>(w.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:C.NavToNextContainer,mode:p.DEFAULT,action:()=>(w.navigateToNextContainer(),c("Navigating to next container",null))}];var nl=500,rl=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),As=e=>{let t=rl(e);t&&O(n=>(n+t).slice(0,nl))};var ol=[p.COMMAND_LINE,p.PALETTE],il=e=>[{intent:C.MoveCursorLeft,mode:e,action:()=>(xr(-1),c("Moving cursor left",null))},{intent:C.MoveCursorRight,mode:e,action:()=>(xr(1),c("Moving cursor right",null))},{intent:C.MoveCursorLeftOfWord,mode:e,action:()=>(hr("left"),c("Moving cursor left of word",null))},{intent:C.MoveCursorRightOfWord,mode:e,action:()=>(hr("right"),c("Moving cursor right of word",null))},{intent:C.AutoCompleteCommand,mode:e,action:()=>(O((t,{remainder:n})=>n?t+n:t),c("Auto-completing command",null))},{intent:C.CaptureInput,mode:e,action:(t,{sequence:n})=>(As(n??""),c("Capturing input",null))},{intent:C.EraseInput,mode:e,action:()=>(ui(),c("Erasing input",null))},{intent:C.EraseInputWord,mode:e,action:()=>(mi(),c("Erasing input word",null))}],ws=[{intent:C.Confirm,mode:p.COMMAND_LINE,action:()=>(Ce(),c("Executing command",null))},{intent:C.ViewHelp,mode:p.DEFAULT,action:()=>(h({mode:p.HELP}),c("Viewing help",null))},...ol.flatMap(il),{intent:C.ExitCommandLine,mode:p.COMMAND_LINE,action:()=>(h({mode:p.DEFAULT}),c("Exiting command line",null))},{intent:C.GetLastCommandFromHistory,mode:p.COMMAND_LINE,action:()=>(fi(),c("Getting last command from history",null))},{intent:C.GetNextCommandFromHistory,mode:p.COMMAND_LINE,action:()=>(vi(),c("Getting next command from history",null))}];import Ps from"chalk";var jn=Ps.dim.hex(T.secondary2)(": for command line"),Ts="q to exit",Ms=`${Ps.hex(T.accent)("m")} to confirm`,$r={[b.WORKSPACE]:[jn],[b.BOARD]:[jn],[b.BOARD+p.COMMAND_LINE]:[jn],[b.SWIMLANE]:[jn],[b.TICKET+p.HELP]:[Ts],[b.SWIMLANE+p.HELP]:[Ts],[b.TICKET]:[],[b.FIELD]:[],[b.SWIMLANE+p.MOVE]:[Ms],[b.TICKET+p.MOVE]:[Ms]};var Vt=e=>e.trim().toLocaleLowerCase(),sl=e=>{let{tags:t}=v();return(e.props.tags??[]).map(n=>t[n]?.name).filter(n=>!!n)},al=e=>{let{contributors:t}=v();return(e.props.assignees??[]).map(n=>t[n]?.name).filter(n=>!!n)},ks=(e,t)=>{let n=Vt(t.value);if(!n)return!0;switch(t.target){case"title":return Vt(e.title??"").includes(n);case"description":return Vt(e.props.description??"").includes(n);case"tag":return sl(e).map(Vt).some(o=>o.includes(n));case"assignee":return al(e).map(Vt).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,Wr,jr=new Set,Fs=()=>{for(let e of jr)e()},cl=e=>(jr.add(e),()=>jr.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:g}=l,y=$r[g+n]??$r[g]??[],I=[...bs,...Ns[g]??[],...ws],N=Ds(I),S=ll(o,i),A=S[t]?.[e.selectedIndex]??null;return c("Derived successfully",{...e,contextNode:l,breadCrumb:m,availableHints:y,availableActions:I,actionIndex:N,selectedNode:A,renderedChildrenIndex:S})}var v=()=>{if(!ot)throw new Error("State not initialized. Call initWorkspaceState() first.");return ot},he=()=>ot?c("Retrieved state",ot):s("State not initialized. Call initWorkspaceState() first.");function Ht(e){Wr=e;let t=Be(process.cwd()),n=!1;if(!a(t)){let i=Ue(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=Os(r);return a(o)?o:(ot=o.value,Fs(),c("State initialized",null))}function pe(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 h=e=>pe(t=>({...t,...e}));var Ie=()=>dl(cl,v,v),ll=(e,t)=>{let n={};for(let r of Object.values(e))B(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]??[],qt=()=>Wr?Ht(Wr):s("Cannot reset state: no initial workspace found"),mt=()=>ot!==void 0;var Nt=(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}`)},ul=(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"),E={deleteNode(e){pe(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(ul(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=pe(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(!B(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(!B(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(!B(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(!B(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=pe(n=>({...n,tags:{...n.tags,[e.id]:e}}));return a(t)?s("Could not create tag"):c("Tag created",e)},createNode(e){let t=pe(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=pe(o=>({...o,nodes:{...o.nodes,[e]:n}}));return a(r)?s(r.message):c("Locked node",n)},updateNode(e){let t=pe(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 ml}from"ulid";var pl=(e,t)=>e+" ".repeat(Math.max(0,t-Us(e))),gl=(e,t)=>" ".repeat(Math.max(0,t-Us(e)))+e,fl=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`),vl=(e,t)=>t?e<t?"up":e>t?"down":null:null,yl=(e,t)=>{let n=E.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=vl(e.payload.rank,o.rank);if(i)return`Moved ${i} in ${r}`}return`Moved issue to ${r}`},xl=e=>{switch(e.action){case"add.issue.tag":{let t=v().tags[e.payload.tag];return t?st.bgHex(Ne(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=v().tags[e.payload.tag];return t?st.bgHex(Ne(t.name))(` ${t.name} `):"unknown tag"}case"add.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?st.hex(Ne(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?st.hex(Ne(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""}},hl=e=>{let t=Go(ml(e));return st.gray(gl(t,8))},El=12,Nl=e=>pl(`${e}`,El),Bs=(e,t)=>{let n=hl(e.id),r=Nl(e.userName),o=st.dim("\u203A"),i=e.action==="move.node"?yl(e,t):[fl(e.action),xl(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${i}`};var Il=e=>He(e,"description"),Sl=e=>He(e,"assignees"),Cl=e=>He(e,"tags"),Rl=e=>He(e,"history"),_s=({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({...ae.field({id:e,name:t,parentNodeId:n,rank:r,props:{value:o},isVirtual:!0}),readonly:i,childRenderAxis:d});return}!Oe(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})},$s=({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!1,childRenderAxis:i="horizontal"})=>{let d=E.getNode(e);if(!d){E.createNode({...ae.fieldList({id:e,name:t,parentNodeId:n,rank:r,isVirtual:!0}),readonly:o,childRenderAxis:i});return}!Ct(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})},Ws=e=>{let t=ge(be/4n),n=ge(be/2n),r=ge(be*3n/4n),o=ge(be);a(t)||a(n)||a(r)||a(o)||(_s({id:Il(e.id),name:V.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"}),$s({id:Sl(e.id),name:V.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0}),$s({id:Cl(e.id),name:V.TAGS,parentNodeId:e.id,rank:r.value,readonly:!0}),_s({id:Rl(e.id),name:V.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 k=(e,t)=>s(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),js=e=>{let t=E.getNode(e);!t||!B(t)||t.isDeleted||Ws(t)},Al=e=>{for(let t of e){js(t);let n=v().nodes[t]?.parentNodeId;n&&js(n)}},wl=(e,t)=>{let n=E.getNode(e);n&&E.updateNode({...n,log:[...n.log??[],t]})},Tl=e=>{let t=[e],n=v().nodes[e]?.parentNodeId;return n&&t.push(n),t},Ml=e=>{switch(e.action){case"delete.node":case"edit.description":return Tl(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[]}},Pl=e=>{pe(t=>({...t,eventLog:[...t.eventLog,e]}))},kl=e=>{let t=e.userId,n=e.userName;if(!t?.length||!n?.length)return k("Invalid user ID format",e);let r=E.createContributor({id:t,name:n});return a(r)?k(r.message,e):null},Ll=(e,t)=>{let n=kl(e);if(n)return n;let r=[...new Set(Ml(e))];return t||(r.forEach(o=>wl(o,e)),Pl(e)),Al(r),null},Dl={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=ae.workspace(t,n,r),i=Ht(o);if(a(i))return k(i.message,e);let d=E.createNode(o);return a(d)?k(d.message??"Failed to initialize workspace",e):Yn(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(ae.workspace(t,n,r));return a(o)?k(o.message??"Failed to add workspace",e):Yn(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(ae.board(t,n,r,o));return a(i)?k(i.message??"Unable to create board",e):ro(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(ae.swimlane(t,n,r,o));return a(i)?k(i.message??"Unable to create swimlane",e):Yt(i.value)?c("Added swimlane",{action:e.action,result:i.value}):s("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,i=E.createNode(ae.ticket(t,n,r,o));return a(i)?k(i.message??"Unable to create issue",e):B(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(ae.field({id:t,name:n,parentNodeId:r,rank:i,props:{value:o},childRenderAxis:n.includes(V.DESCRIPTION)?"vertical":"horizontal"}));return a(d)?k(d.message??`Unable to create field: ${n}`,e):Oe(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 k(`Unable to locate node with id ${t}`,e);let o=E.renameNode(t,n);return a(o)?k(o.message??"Unable to edit title",e):c("Edited title",{action:e.action,result:o.value})},"delete.node":e=>{let{id:t}=e.payload,n=E.tombstoneNode(t);return a(n)?k(n.message??"Unable to delete node",e):c("Deleted node",{action:e.action,result:n.value})},"create.tag":e=>{let{id:t,name:n}=e.payload,r=E.createTag({id:t,name:n});return a(r)?k(r.message??"Unable to create tag",e):c("Tag added",{action:e.action,result:r.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,r=E.createContributor({id:t,name:n});return a(r)?k(r.message??"Unable to create contributor",e):c("Contributor created",{action:e.action,result:r.value})},"add.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=E.tag(t,n);return a(r)?k(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)?k(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)?k(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)?k(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)?k(o.message??"Failed to move node",e):c("Moved node",{action:e.action,result:o.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,r=E.editValue(t,n);return a(r)?k(r.message??"Unable to edit description",e):c("Set node value",{action:e.action,result:r.value})},"close.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=E.getNode(t);if(!o)return k("Unable to locate issue",e);if(!B(o))return k("Can only close issues",e);let i=E.getNode(ne);if(!i)return k("Unable to locate target swimlane",e);if(n!==i.id)return k("Close target must be closed swimlane",e);let d=E.moveNodeToRank({id:t,parentId:n,rank:r});return a(d)?k(d.message??"Unable to close issue",e):c("Issue closed",{action:e.action,result:{id:t}})},"reopen.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=E.getNode(t);if(!o)return k("Unable to locate issue",e);if(!B(o))return k("Can only reopen issues",e);let i=E.getNode(ne);if(!i)return k("Unable to locate closed swimlane",e);if(n===i.id)return k("Cannot reopen issue into closed swimlane",e);if(!E.getNode(n))return k("Reopen parent no longer exists",e);let l=E.moveNodeToRank({id:t,parentId:n,rank:r});return a(l)?k(l.message??"Unable to reopen issue",e):c("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=E.lockNode(t);return a(n)?k(n.message??"Unable to lock node",e):c("Node locked",{action:e.action,result:n.value})},"rebalance.children":e=>{let{parent:t,ranks:n}=e.payload;for(let[r,o]of Object.entries(n)){let i=E.getNode(r);if(!i)return k(`Unable to locate node ${r}`,e);if(i.parentNodeId!==t)return k(`Node ${r} is not child of ${t}`,e);let d=E.updateNode({...i,rank:o});if(a(d))return k(d.message??"Unable to rebalance child",e)}return c("Rebalanced children",{action:e.action,result:{parent:t}})}};function Kt(e,t=!1){let n=Dl[e.action](e);if(a(n))return n;let r=Ll(e,t);return r||n}var rt=e=>e.map(t=>Kt(t));function ye(e,t){let n=Kt(e);if(n.status!==Fe.Success)return n;let r=kn({event:e,rootDir:t});return a(r)?r:n}function ht(e,t){return e.map(n=>ye(n,t))}var me=async e=>{let t=await ve();return a(t)?t:ye(e,t.value)};var Hs=e=>On(j(e),{at:"end"}),On=(e,t={at:"end"})=>{let n=r=>a(r)?c("Rank space exhausted",{rank:"",needsRebalance:!0}):c("Resolved rank",{rank:r.value,needsRebalance:!1});if(e.length===0)return n(re(void 0,void 0));switch(t.at){case"start":{let r=e[0];return r?n(re(void 0,r.rank)):s("Unable to resolve first sibling")}case"end":{let r=e[e.length-1];return r?n(re(r.rank,void 0)):s("Unable to resolve last sibling")}case"before":{let r=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(re(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(re(o.rank,i?.rank)):s("Sibling not found")}}},j=e=>Object.values(v().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),zs=(e,t)=>e.findIndex(n=>n.id===t),Ks=(e,t,n={at:"end"})=>On(j(t).filter(r=>r.id!==e),n),It=(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=Xn(e,r);if(a(d))return d;let l=ye(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)},xt=(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=Xn(e,t);if(a(o))return o;let i=ye(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}},Fl=e=>{let t=v().nodes[e];return!!t&&!t.isDeleted&&Oe(t)&&t.childRenderAxis==="vertical"},Hn=(e,t)=>{let{nodes:n}=v(),r=n[e];if(!r||r.isDeleted)return!1;let o=$(r.id);return w.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 Hn(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?(w.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},Ol=e=>{if(!e)return!1;let t=v().nodes[e];return!!t&&!t.isDeleted},Xs=e=>{let{nodes:t,rootNodeId:n}=v();if(Fl(e.contextNodeId)&&Hn(e.contextNodeId,e.selectedIndex))return c("Restored navigation inside text container",null);if(Ol(e.selectedNodeId)&&e.selectedNodeId&&qs(e.selectedNodeId))return c("Restored navigation to selected node or ancestor",null);if(Hn(e.contextNodeId,e.selectedIndex))return c("Restored navigation to previous container",null);if(e.parentNodeId&&Hn(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 w.navigate({contextNode:r,selectedIndex:Vs(e.selectedIndex,o.length)}),c("Restored navigation to root",null)};var Hr=({status:e,msg:t})=>{mt()&&h({syncStatus:{status:e,msg:t}})},zr=(e="Syncing...")=>{Hr({status:"syncing",msg:e})},Kr=(e="Synced")=>{Hr({status:"synced",msg:e})},Ul=e=>{Hr({status:"failed",msg:e})},ee=e=>(Ul(e),s(e));var U=(e,t)=>(a(t)&&logger.info(`[${e}]:failed`,t.message),t);import{decodeTime as Bl}from"ulid";var Vr=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)},qr=e=>{let[t,n]=e.id;return`${t}:${n??""}`},
|
|
57
|
+
`)}`):(Hc(),h({hasProjectDefinition:!0}),c("State booted successfully",null))}var Kc=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}`),ss=async()=>{B("");let e=ao(),t=await _e(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 Kc(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(ir(n))return W(4,"Epiq project already initialized");let i=mn();if(!i.isSetupDone||!i.userName)return W(5,"Missing Epiq user configuration (userId / userName). Run setup first.");let d=K(),l=d.userName,u=d.userId;if(!u||!l)return W(5,"Missing Epiq user id");let m=e.stateBranch,g=await nn({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 Fr({repoRoot:n,stateBranchName:m});if(a(y))return W(6,y.message);let I=sn();if(a(I))return W(7,I.message);let N=is.join(on(),e.projectId),S=await Or({repoRoot:n,stateBranchRoot:N,stateBranchName:m});if(a(S))return W(8,S.message);let A=is.join(N,".epiq");zc.mkdirSync(A,{recursive:!0});let R=os({userId:u,userName:l});if(a(R))return W(9,R.message);for(let Yn of R.value){let no=Ln({event:Yn,rootDir:N});if(a(no))return W(9,no.message)}let P=await Fn({stateBranchRoot:N,eventFileName:nt({userId:u,userName:l})});if(a(P))return W(10,P.message);let _=await ct({cwd:N,message:"[epiq:init]"});if(a(_))return W(10,_.message);let Ge=await Qi(n);if(a(Ge))return W(11,Ge.message);let De=lo({repoRoot:n,fileContents:e});if(a(De))return W(12,De.message);let Xr=await z.stage({cwd:n,pathspec:[".epiq/project.json",".gitignore"]});if(a(Xr))return W(13,Xr.message);let Jr=await z.commit({cwd:n,message:"[epiq:init-project]"});if(a(Jr))return W(13,Jr.message);let qn="Project initialized!",Zr=await D({cwd:n,args:["push","-u","origin","HEAD"]});a(Zr)&&(qn+=` Warn: [init:14] ${Zr.message}`);let Qr=await Wt({repoRoot:n,stateBranchRoot:N});a(Qr)&&(qn+=` Warn: [init:15] ${Qr.message}`);let eo=rt(R.value).filter(a);if(eo.length>0)return W(16,eo.map(Yn=>Yn.message).join(`
|
|
58
|
+
`));let Gn=he();if(a(Gn))return W(16,Gn.message);let{rootNodeId:fa,nodes:va}=Gn.value,to=va[fa];return to?(w.navigate({contextNode:to,selectedIndex:0}),h({hasProjectDefinition:!0,mode:p.DEFAULT}),c(qn,null)):W(16,"Unable to resolve initialized root node")};import{ulid as qc}from"ulid";import{ulid as Vc}from"ulid";var as=null,Ke=()=>structuredClone(as),zt=e=>{as=e},ds=()=>{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)},cs=({id:e,parentId:t,position:n={at:"end"}})=>{let r=V();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:Vc(),...r.value,action:"move.node",payload:{id:e,parent:t,rank:o.value.rank}})},ls=e=>{zt(e);let t=Kt(e,!0);return a(t)?t:c("Node moved successfully",t.value)};function Br(e){let t=ds();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=cs({id:t.value.id,parentId:l.id,position:{at:"end"}});return a(u)?u:ls(u.value)}function _r(e){let t=ds();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=cs({id:t.value.id,parentId:n.id,position:{at:e===1?"after":"before",sibling:i.id}});return a(d)?d:ls(d.value)}var us=()=>{let e=Ke();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"):(w.navigate({contextNode:r,selectedIndex:o}),c("Synchronized navigation to moved node",null))},Bn=(e,t="Moved preview")=>{if(a(e))return e;let n=us();return a(n)?n:(h({mode:p.MOVE}),c(t,null))},ms=async()=>{let e=V();if(a(e))return s("Unable to resolve user ID");let{modifier:t}=J().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=Ur({parentId:o.parentNodeId,id:o.id,position:m});return a(g)?g:(zt({id:qc(),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 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=Ke();if(!i)return s("No pending move to confirm");let d=await ve();if(a(d))return d;let l=ye(i,d.value);if(a(l))return l;let u=us();return a(u)?u:(zt(null),h({mode:p.DEFAULT}),c("Moved item",null))}return t==="cancel"?(zt(null),h({mode:p.DEFAULT}),c("Cancelling move",null)):s("Invalid move modifier")};import{ulid as $n}from"ulid";import{monotonicFactory as Gc,ulid as Yc}from"ulid";var Xc=Gc(),_n=({name:e,parent:t,rank:n,user:{userId:r,userName:o}})=>{let i=Xc();return c("Created issue events",[{id:Yc(),userId:r,userName:o,action:"add.issue",payload:{id:i,parent:t,name:e,rank:n}}])};var ps=async(e,t)=>{let n=V();if(a(n))return s("Unable to resolve user ID");let r=await ve();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=ye(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 I=E.getNode(y.parentNodeId);return I?(w.navigate({contextNode:I,selectedIndex:E.getSiblings(y.parentNodeId).findIndex(({id:N})=>N===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=xt(g.id,n.value,o);return a(y)?y:u({id:$n(),action:"add.board",payload:{id:$n(),name:t.inputString,parent:g.id,rank:y.value},...n.value})}if(t.modifier==="swimlane"){let m=Ee(i,"BOARD");if(a(m))return s("Unable to add swimlane in this context");let g=xt(m.value.id,n.value,o);return a(g)?g:u({id:$n(),action:"add.swimlane",payload:{id:$n(),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 _=Ee(i,"SWIMLANE");return a(_)?null:_.value})();if(!g)return s("Unable to add issue in this context");let y=xt(g.id,n.value,o);if(a(y))return y;let I=_n({name:t.inputString,parent:g.id,rank:y.value,user:n.value});if(a(I))return I;let N=I.value,S=ht(N,o);if(S.some(_=>a(_)))return s("Issue create failed: "+S.filter(a).map(_=>_.message).filter(Boolean).join(", "));let A=S[0];if(!A||a(A))return s("Issue creation failed");let P=N.find(_=>_.action==="add.issue")?.payload.id;return P?(w.navigate({contextNode:g,selectedIndex:E.getSiblings(g.id).findIndex(({id:_})=>_===P)}),c("Issue created",null)):s("Unable to determine ticket id")}return c("Success",null)};var gs=async()=>{let e=Ee(v().breadCrumb,"BOARD");if(a(e))return e;let t=await _e(process.cwd());if(a(t))return s("Unable to locate repo root");let n=lt({repoRoot:t.value});if(a(n))throw new Error(n.message);let{modifier:r}=J().commandMeta;if(r==="now"){let S=vt(n.value);if(a(S))return s(S.message);let A=Vt();if(a(A))return A;let P=rt(S.value).filter(a);return P.length>0?s(P.map(_=>_.message).join(", ")):(h({mode:p.DEFAULT,readOnly:!1,timeMode:"live",unappliedEvents:[]}),c("Peeking now",!0))}let o;if(r==="prev"){let S=v().eventLog.at(-1),A=pr(S);if(A===null)return s("No previous event to peek");o=A}else if(r==="next"){let S=v().unappliedEvents.at(0),A=pr(S);if(A===null)return s("No next event to peek");o=A+1}else{let S=fn(r);if(!S)return s("Invalid peek date");o=S.getTime()}let i=v(),d=e.value.id,l=zi(n.value,o);if(a(l))return s(l.message);let{appliedEvents:u,unappliedEvents:m}=l.value,g=Vt();if(a(g))return g;let I=rt(u).filter(a);if(I.length>0)return Vt(),h(i),s(I.map(S=>S.message).join(", "));let N=v().nodes[d];return N?(w.navigate({contextNode:N,selectedIndex:0}),h({mode:p.DEFAULT,readOnly:!0,timeMode:"peek",unappliedEvents:m}),c("Peeking",!0)):(Vt(),h(i),s("Board did not exist at peek date"))};import Jc from"zod";var fs=()=>{let e=J().commandMeta.inputString,t=Jc.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:($e({autoSyncIntervalMs:t.data}),h({mode:p.DEFAULT}),c(`Auto sync interval set to ${t.data}ms`,null))};var vs=()=>{let e=J().commandMeta.inputString.trim();if(e!=="on"&&e!=="off")return s("Invalid response");let t=Ho(e),n=tt({autoSync:t});return a(n)?n:($e({autoSync:t}),h({mode:p.DEFAULT}),c(`Auto sync set to "${e}"`,null))};var ys=async()=>{B(""),h({mode:p.DEFAULT});let e=he();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 We();return a(t)?(h({syncStatus:{msg:t.message,status:"failed"}}),t):(h({mode:p.DEFAULT,syncStatus:{msg:"Synced",status:"synced"}}),t)};import{useSyncExternalStore as Kh}from"react";var $r,Zc=new Set,Qc=()=>{for(let e of Zc)e()};var Et=()=>{if(!$r)throw new Error("Ui state not initialized. Call initUiState() first.");return $r};var el=e=>{let t=Et();return $r=e(t),Qc(),c("UX state updated",null)},Ve=e=>el(t=>({...t,...e}));var xs=e=>Object.values(v().tags).find(t=>t.name===e),hs=e=>Object.values(v().contributors).find(t=>t.name===e),Es=[{systemOnly:!0,intent:M.Move,description:"Internal move-state command",mode:p.COMMAND_LINE,action:ms},{intent:M.Delete,description:"Delete the currently selected node",mode:p.COMMAND_LINE,action:async()=>{let e=V();if(a(e))return s("Unable to resolve user ID");let{contextNode:t,selectedIndex:n}=v(),r=$(t.id)[n];return r?me({id:de(),action:"delete.node",payload:{id:r.id},...e.value}):s("Unable to resolve child to delete")},onSuccess:()=>h({mode:p.DEFAULT})},{intent:M.Filter,description:"Filter the board, for example `:filter tag urgent`",mode:p.COMMAND_LINE,action:()=>{let{modifier:e,inputString:t}=J().commandMeta,n=/(!=|=)/,[r]=e.split(n);if(!r||!(d=>Q(f.FILTER).map(l=>l.split(n)[0]).includes(d))(r))return s("Invalid filter modifier");let i={target:r,operator:"=",value:t.trim()};return pe(d=>({...d,filters:e==="clear"?[]:[...d.filters,i],mode:p.DEFAULT})),c("Filter updated",null)}},{intent:M.ViewHelp,description:"Open the help screen",mode:p.COMMAND_LINE,action:()=>{let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=v();return Ve({pendingNavTarget:{contextNode:e,breadCrumb:r,selectedIndex:t,selectedNode:n}}),h({mode:p.HELP}),c("Viewing help",null)}},{intent:M.CloseIssue,description:"Move the selected issue to the closed swimlane",mode:p.COMMAND_LINE,action:async()=>{let e=V();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(!U(r))return s("Cannot close in this context");let o=v().nodes[ne];if(!o)return s("Unable to locate closed swimlane");if(r.parentNodeId===o.id)return s("Issue is already closed");let i=await ve();if(a(i))return i;let d=i.value,l=It(o.id,r.id,{at:"end"},e.value,d);if(a(l))return l;let u=await me({id:de(),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:M.ReopenIssue,description:"Move a closed issue back to its previous swimlane",mode:p.COMMAND_LINE,action:async()=>{let e=V();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):Nt(r.id,"TICKET");if(a(o))return s("Cannot reopen in this context");let i=o.value,d=v().nodes[ne];if(!d)return s("Unable to locate closed swimlane");if(i.parentNodeId!==d.id)return s("Issue is not closed");if(!U(i))return s("Target node is not issue");let l=Yi(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 ve();if(a(m))return m;let g=m.value,y=It(u.id,i.id,{at:"end"},e.value,g);if(a(y))return y;let I=await me({id:de(),action:"reopen.issue",payload:{id:i.id,parent:u.id,rank:y.value},...e.value});return a(I)?I:c("Issue reopened",null)},onSuccess:()=>h({mode:p.DEFAULT})},{intent:M.Init,description:"Initialize Epiq in the current git repository",mode:p.COMMAND_LINE,action:ss},{intent:M.NewItem,description:"Create a new board, swimlane, or issue",mode:p.COMMAND_LINE,action:ps,onSuccess:()=>h({mode:p.DEFAULT})},{intent:M.Rename,description:"itle] Rename the currently selected node",mode:p.COMMAND_LINE,action:async()=>{let e=V();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?me({id:de(),action:"edit.title",payload:{id:r.id,name:o},...e.value}):s("Provide a title")},onSuccess:()=>h({mode:p.DEFAULT})},{intent:M.UntagTicket,description:"Remove a tag from the selected issue",mode:p.COMMAND_LINE,action:async()=>{let e=V();if(a(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=J().commandMeta,r=(t||n).trim();if(!r)return s("Provide a tag");let o=xs(r);if(!o)return s(`Tag "${r}" does not exist`);let{selectedNode:i}=v();if(!i)return s("Invalid untag target");let d=Nt(i.id,"TICKET");if(a(d))return s("Unable to untag issue in this context");let l=d.value;return U(l)?(l.props.tags??[]).includes(o.id)?me({id:de(),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:M.TagTicket,description:"Add or create a tag on the selected issue",mode:p.COMMAND_LINE,action:async()=>{let e=V();if(a(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=J().commandMeta,r=(t||n).trim();if(!r)return s("Provide a tag");let{selectedNode:o}=v();if(!o)return s("Invalid tag target");let i=Nt(o.id,"TICKET");if(a(i))return s("Unable to tag issue in this context");let d=i.value;if(!U(d))return s("Target node is not issue");let l=xs(r),u;if(l)u=l.id;else{let g=de(),y=await me({id:de(),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"):me({id:de(),action:"add.issue.tag",payload:{id:d.id,tag:u},...e.value})},onSuccess:()=>h({mode:p.DEFAULT})},{intent:M.AssignUserToTicket,description:"Assign a user to the selected issue",mode:p.COMMAND_LINE,action:async()=>{let e=V();if(a(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=J().commandMeta,r=(t||n).trim();if(!r)return s("Provide an assignee");let{selectedIndex:o,contextNode:i}=v(),d=$(i.id)[o];if(!d)return s("Invalid assign target");let l=Nt(d.id,"TICKET");if(a(l))return s("Unable to assign issue in this context");let u=l.value;if(!U(u))return s("Target node is not issue");let m=hs(r),g;if(m)g=m.id;else{let I=de(),N=await me({id:de(),action:"create.contributor",payload:{id:I,name:r},...e.value});if(a(N))return N;g=N.value.result.id}return(u.props.assignees??[]).includes(g)?s("Assignee already assigned"):me({id:de(),action:"add.issue.assignee",payload:{id:u.id,assignee:g},...e.value})},onSuccess:()=>h({mode:p.DEFAULT})},{intent:M.UnassignUserFromTicket,description:"Remove an assignee from the selected issue",mode:p.COMMAND_LINE,action:async()=>{let e=V();if(a(e))return s("Unable to resolve user ID");let{modifier:t,inputString:n}=J().commandMeta,r=(t||n).trim();if(!r)return s("Provide an assignee to remove");let o=hs(r);if(!o)return s(`Assignee "${r}" does not exist`);let{selectedNode:i}=v();if(!i)return s("Invalid unassign target");let d=Nt(i.id,"TICKET");if(a(d))return s("Unable to unassign in this context");let l=d.value;return U(l)?(l.props.assignees??[]).includes(o.id)?me({id:de(),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:M.Sync,description:"Pull, commit, and push Epiq state",mode:p.COMMAND_LINE,action:ys},{intent:M.Peek,description:"View board state at another point in time",mode:p.COMMAND_LINE,action:gs},{intent:M.Export,description:"Export the current board layout to markdown",mode:p.COMMAND_LINE,action:async()=>{let e=await ki();return a(e)?e:(h({mode:p.DEFAULT}),c("Export successful",!0))}},{intent:M.Exit,description:"Exit the application",mode:p.COMMAND_LINE,action:async()=>(w.exit(),c("Exit successful",!0))},{intent:M.Edit,description:"Edit title or description",mode:p.COMMAND_LINE,action:async(e,t)=>{if(t.modifier===je.DESCRIPTION)return Zi();if(t.modifier===je.TITLE){let n=V();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?me({id:de(),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:M.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 X.USERNAME:{let{userId:r,preferredEditor:o,userName:i}=K(),d=n||i,l=r??de();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:($e({userName:d,userId:l}),h({mode:p.DEFAULT}),c(`Username set to "${d}"`,null))}case X.EDITOR:{if(!n)return s("No editor provided");let r=tt({preferredEditor:n});return a(r)?r:($e({preferredEditor:n}),h({mode:p.DEFAULT}),c(`Editor configuration set to "${n}"`,null))}case X.VIEW:return n!=="wide"&&n!=="dense"?s("Invalid view mode"):($e({viewMode:n}),c(`View set to "${n}"`,null));case X.AUTOSYNC:return vs();case X.SYNC_DEBOUNCE_MS:return fs();default:return s("Unknown config command")}}}];var tl=new Set(["peek","filter","view-help"]),Re=async({isForceExecutedBySystem:e=!1}={})=>{let{commandMeta:{command:t,validity:n,modifier:r,inputString:o}}=J();if(!t)return s("No command to confirm");if(!e&&n===Ze.Invalid)return s("Invalid command");let i=hi(t);gi();let{readOnly:d}=v();if(d&&!tl.has(i))return Ot({status:Fe.Fail,message:"Command not available in readonly state",value:null});let l=Es.filter(m=>e||m.systemOnly!==!0).find(m=>m.intent===i);if(!l)return Ot({status:Fe.Fail,message:"Command not found",value:null});let u;try{u=await l.action(l,{command:t,inputString:o,modifier:r})}catch(m){return Ot({status:Fe.Fail,message:m instanceof Error?m.message:"Command failed",value:null})}return a(u)?Ot(u):(fi({addToHistory:!e}),l.onSuccess?.(),K().autoSync&&$o(),u)};var Wn=[{intent:C.Exit,mode:p.MOVE,description:"[<Esc>] exit context / cancel",action:()=>(h({mode:p.COMMAND_LINE}),B("move cancel"),Re({isForceExecutedBySystem:!0}))},{intent:C.InitMove,mode:p.DEFAULT,description:"[m] move (init/confirm)",action:()=>(h({mode:p.COMMAND_LINE}),B("move start"),Re({isForceExecutedBySystem:!0}))},{intent:C.ConfirmMove,mode:p.MOVE,action:()=>(h({mode:p.COMMAND_LINE}),B("move confirm"),Re({isForceExecutedBySystem:!0}))}],jn=[{intent:C.MovePreviousItem,mode:p.MOVE,action:()=>Ke()?(h({mode:p.COMMAND_LINE}),B("move previous"),Re({isForceExecutedBySystem:!0})):s("No pending move")},{intent:C.MoveNextItem,mode:p.MOVE,action:()=>Ke()?(h({mode:p.COMMAND_LINE}),B("move next"),Re({isForceExecutedBySystem:!0})):s("No pending move")}],Ns=[{intent:C.MoveToNextContainer,mode:p.MOVE,action:()=>Ke()?(h({mode:p.COMMAND_LINE}),B("move to-next"),Re({isForceExecutedBySystem:!0})):s("No pending move")},{intent:C.MoveToPreviousContainer,mode:p.MOVE,action:()=>Ke()?(h({mode:p.COMMAND_LINE}),B("move to-previous"),Re({isForceExecutedBySystem:!0})):s("No pending move")}];var Is={[b.WORKSPACE]:[...Wn,...jn],[b.BOARD]:[...Wn,...jn],[b.SWIMLANE]:[...Wn,...jn,...Ns],[b.TICKET]:[],[b.FIELD]:[],[b.FIELD_LIST]:[],[b.TEXT]:[]};var Ss=()=>{B("");let{pendingNavTarget:e}=Et();h({mode:p.DEFAULT}),e&&w.navigate(e),Ve({pendingNavTarget:void 0})},Cs=[{intent:C.ExitCommandLine,mode:p.HELP,action:()=>(Ss(),c("Exiting help",null))},{intent:C.Exit,mode:p.HELP,action:()=>(Ss(),c("Closed help",null))},{intent:C.NavPreviousItem,mode:p.HELP,description:"[arrows/hjkl] navigate",action:()=>(w.navigateToPreviousItem(),c("Navigating to previous help item",null))},{intent:C.NavNextItem,mode:p.HELP,action:()=>(w.navigateToNextItem(),c("Navigating to next help item",null))},{intent:C.NavToPreviousContainer,mode:p.HELP,action:()=>(w.navigateToPreviousContainer(),c("Navigating to previous help container",null))},{intent:C.NavToNextContainer,mode:p.HELP,action:()=>(w.navigateToNextContainer(),c("Navigating to next help container",null))}];var nl=e=>{h({mode:p.COMMAND_LINE});let{pendingNavTarget:t}=Et();t&&w.navigate(t),Ve({pendingNavTarget:void 0}),B(`${e} `)},Rs=()=>{B("");let{pendingNavTarget:e}=Et();e&&w.navigate(e),Ve({pendingNavTarget:void 0}),h({mode:p.DEFAULT})},bs=[{intent:C.InitCommandPalette,mode:p.DEFAULT,description:"[?] view command palette (explore descriptions for every command)",action:()=>{B("");let{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}=v();return Ve({pendingNavTarget:{contextNode:e,selectedIndex:t,selectedNode:n,breadCrumb:r}}),h({mode:p.PALETTE}),c("Opening command palette",null)}},{intent:C.Confirm,mode:p.PALETTE,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?(nl(t),c("Selected command",t)):c("No command selected",null)}},{intent:C.ExitCommandLine,mode:p.PALETTE,action:()=>(Rs(),c("Exiting palette",null))},{intent:C.Exit,mode:p.PALETTE,action:()=>(Rs(),c("Closed command palette",null))},{intent:C.NavPreviousItem,mode:p.PALETTE,description:"[arrows/hjkl] navigate",action:()=>(w.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:C.NavNextItem,mode:p.PALETTE,action:()=>(w.navigateToNextItem(),c("Navigating to next item",null))},{intent:C.NavToPreviousContainer,mode:p.PALETTE,action:()=>(w.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:C.NavToNextContainer,mode:p.PALETTE,action:()=>(w.navigateToNextContainer(),c("Navigating to next container",null))}];var As=[...Cs,...bs,{intent:C.AddItem,mode:p.DEFAULT,description:"[n] new...",action:()=>(h({mode:p.COMMAND_LINE}),B(`${f.NEW} `),c("Adding new item",null))},{intent:C.Delete,mode:p.DEFAULT,description:"[d] delete",action:()=>(h({mode:p.COMMAND_LINE}),B(`${f.DELETE} `),c("Deleting item",null))},{intent:C.InitCommandLine,mode:p.DEFAULT,description:"[:] focus command line",action:()=>(h({mode:p.COMMAND_LINE}),B(""),c("Entering command line mode",null))},{intent:C.Confirm,mode:p.DEFAULT,description:"[<Enter>] confirm/enter",action:()=>{let{selectedNode:e,contextNode:t}=v();if(!j(e?.id??"")?.length){if(e?.title===q.DESCRIPTION)return h({mode:p.COMMAND_LINE}),B(`${f.EDIT} description `),c("Propose command",!0);if(e?.title===q.ASSIGNEES)return h({mode:p.COMMAND_LINE}),B(`${f.ASSIGN} `),c("Propose command",!0);if(e?.title===q.TAGS)return h({mode:p.COMMAND_LINE}),B(`${f.TAG} `),c("Propose command",!0);if(t.title===q.DESCRIPTION&&e?.context==="TEXT")return h({mode:p.COMMAND_LINE}),B(`${f.EDIT} description `),c("Propose command",!0)}return w.enterChildNode(),c("Entering context",null)}},{intent:C.EditTitle,mode:p.DEFAULT,description:"[r] rename title",action:()=>(h({mode:p.COMMAND_LINE}),B(`${f.EDIT} title ${v().selectedNode?.title}`),c("Exiting context",null))},{intent:C.EditDescription,mode:p.DEFAULT,description:"[e] edit description",action:()=>(h({mode:p.COMMAND_LINE}),B(`${f.EDIT} description `),c("Exiting context",null))},{intent:C.Exit,mode:p.DEFAULT,description:"[q] exit context",action:()=>(w.enterParentNode(),c("Exiting context",null))},{intent:C.NavPreviousItem,mode:p.DEFAULT,description:"[arrows/hjkl] navigate",action:()=>(w.navigateToPreviousItem(),c("Navigating to previous item",null))},{intent:C.NavNextItem,mode:p.DEFAULT,action:()=>(w.navigateToNextItem(),c("Navigating to next item",null))},{intent:C.NavToPreviousContainer,mode:p.DEFAULT,action:()=>(w.navigateToPreviousContainer(),c("Navigating to previous container",null))},{intent:C.NavToNextContainer,mode:p.DEFAULT,action:()=>(w.navigateToNextContainer(),c("Navigating to next container",null))}];var rl=500,ol=e=>e.replace(/[\r\n]/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,""),ws=e=>{let t=ol(e);t&&Nn(n=>(n+t).slice(0,rl))};var il=[p.COMMAND_LINE,p.PALETTE],sl=e=>[{intent:C.MoveCursorLeft,mode:e,action:()=>(hr(-1),c("Moving cursor left",null))},{intent:C.MoveCursorRight,mode:e,action:()=>(hr(1),c("Moving cursor right",null))},{intent:C.MoveCursorLeftOfWord,mode:e,action:()=>(Er("left"),c("Moving cursor left of word",null))},{intent:C.MoveCursorRightOfWord,mode:e,action:()=>(Er("right"),c("Moving cursor right of word",null))},{intent:C.AutoCompleteCommand,mode:e,action:()=>(Nn((t,{remainder:n})=>n?t+n:t),c("Auto-completing command",null))},{intent:C.CaptureInput,mode:e,action:(t,{sequence:n})=>(ws(n??""),c("Capturing input",null))},{intent:C.EraseInput,mode:e,action:()=>(mi(),c("Erasing input",null))},{intent:C.EraseInputWord,mode:e,action:()=>(pi(),c("Erasing input word",null))}],Ts=[{intent:C.Confirm,mode:p.COMMAND_LINE,action:()=>(Re(),c("Executing command",null))},{intent:C.ViewHelp,mode:p.DEFAULT,action:()=>(h({mode:p.HELP}),c("Viewing help",null))},...il.flatMap(sl),{intent:C.ExitCommandLine,mode:p.COMMAND_LINE,action:()=>(h({mode:p.DEFAULT}),c("Exiting command line",null))},{intent:C.GetLastCommandFromHistory,mode:p.COMMAND_LINE,action:()=>(vi(),c("Getting last command from history",null))},{intent:C.GetNextCommandFromHistory,mode:p.COMMAND_LINE,action:()=>(yi(),c("Getting next command from history",null))}];import ks from"chalk";var Hn=ks.dim.hex(T.secondary2)(": for command line"),Ms="q to exit",Ps=`${ks.hex(T.accent)("m")} to confirm`,Wr={[b.WORKSPACE]:[Hn],[b.BOARD]:[Hn],[b.BOARD+p.COMMAND_LINE]:[Hn],[b.SWIMLANE]:[Hn],[b.TICKET+p.HELP]:[Ms],[b.SWIMLANE+p.HELP]:[Ms],[b.TICKET]:[],[b.FIELD]:[],[b.SWIMLANE+p.MOVE]:[Ps],[b.TICKET+p.MOVE]:[Ps]};var qt=e=>e.trim().toLocaleLowerCase(),al=e=>{let{tags:t}=v();return(e.props.tags??[]).map(n=>t[n]?.name).filter(n=>!!n)},dl=e=>{let{contributors:t}=v();return(e.props.assignees??[]).map(n=>t[n]?.name).filter(n=>!!n)},Ls=(e,t)=>{let n=qt(t.value);if(!n)return!0;switch(t.target){case"title":return qt(e.title??"").includes(n);case"description":return qt(e.props.description??"").includes(n);case"tag":return al(e).map(qt).some(o=>o.includes(n));case"assignee":return dl(e).map(qt).some(o=>o.includes(n));default:return!0}};function Ds(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 Fs=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,jr,Hr=new Set,Os=()=>{for(let e of Hr)e()},ll=e=>(Hr.add(e),()=>Hr.delete(e));function Us(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=Ds(t,o,r);if(a(u))return logger.error(u.message),u;let m=u.value,{context:g}=l,y=Wr[g+n]??Wr[g]??[],I=[...As,...Is[g]??[],...Ts],N=Fs(I),S=ul(o,i),A=S[t]?.[e.selectedIndex]??null;return c("Derived successfully",{...e,contextNode:l,breadCrumb:m,availableHints:y,availableActions:I,actionIndex:N,selectedNode:A,renderedChildrenIndex:S})}var v=()=>{if(!ot)throw new Error("State not initialized. Call initWorkspaceState() first.");return ot},he=()=>ot?c("Retrieved state",ot):s("State not initialized. Call initWorkspaceState() first.");function Ht(e){jr=e;let t=Be(process.cwd()),n=!1;if(!a(t)){let i=Ue(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=Us(r);return a(o)?o:(ot=o.value,Os(),c("State initialized",null))}function pe(e){let t=v(),n=e(t),r=Us(n);return a(r)?s(r.message??"Unable to update state"):(ot=r.value,Os(),c("State updated",null))}var h=e=>pe(t=>({...t,...e}));var Se=()=>cl(ll,v,v),ul=(e,t)=>{let n={};for(let r of Object.values(e))U(r)&&t.length>0&&!t.every(o=>Ls(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]??[],Vt=()=>jr?Ht(jr):s("Cannot reset state: no initial workspace found"),mt=()=>ot!==void 0;var Nt=(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}`)},ml=(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"),E={deleteNode(e){pe(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(ml(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=pe(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(!U(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(!U(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(!U(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(!U(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=pe(n=>({...n,tags:{...n.tags,[e.id]:e}}));return a(t)?s("Could not create tag"):c("Tag created",e)},createNode(e){let t=pe(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=pe(o=>({...o,nodes:{...o.nodes,[e]:n}}));return a(r)?s(r.message):c("Locked node",n)},updateNode(e){let t=pe(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 Bs from"string-width";import{decodeTime as pl}from"ulid";var gl=(e,t)=>e+" ".repeat(Math.max(0,t-Bs(e))),fl=(e,t)=>" ".repeat(Math.max(0,t-Bs(e)))+e,vl=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`),yl=(e,t)=>t?e<t?"up":e>t?"down":null:null,xl=(e,t)=>{let n=E.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=yl(e.payload.rank,o.rank);if(i)return`Moved ${i} in ${r}`}return`Moved issue to ${r}`},hl=e=>{switch(e.action){case"add.issue.tag":{let t=v().tags[e.payload.tag];return t?st.bgHex(Ne(t.name))(` ${t.name} `):"unknown tag"}case"remove.issue.tag":{let t=v().tags[e.payload.tag];return t?st.bgHex(Ne(t.name))(` ${t.name} `):"unknown tag"}case"add.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?st.hex(Ne(t.name))(` ${t.name} `):"unknown user"}case"remove.issue.assignee":{let t=v().contributors[e.payload.assignee];return t?st.hex(Ne(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""}},El=e=>{let t=Yo(pl(e));return st.gray(fl(t,8))},Nl=12,Il=e=>gl(`${e}`,Nl),_s=(e,t)=>{let n=El(e.id),r=Il(e.userName),o=st.dim("\u203A"),i=e.action==="move.node"?xl(e,t):[vl(e.action),hl(e)].filter(Boolean).join(" ");return`${r} ${n} ${o} ${i}`};var Sl=e=>He(e,"description"),Cl=e=>He(e,"assignees"),Rl=e=>He(e,"tags"),bl=e=>He(e,"history"),$s=({id:e,name:t,parentNodeId:n,rank:r,value:o,readonly:i=!1,childRenderAxis:d="horizontal"})=>{let l=E.getNode(e);if(!l){let g=E.createNode({...ae.field({id:e,name:t,parentNodeId:n,rank:r,props:{value:o},isVirtual:!0}),readonly:i,childRenderAxis:d});return a(g)?g:c("Virtual field created",void 0)}if(!Oe(l))return s(`Existing virtual node ${e} is not a field`);if(!(l.title!==t||l.parentNodeId!==n||l.rank!==r||l.props.value!==o||l.readonly!==i||l.childRenderAxis!==d))return c("Virtual field unchanged",void 0);let m=E.updateNode({...l,title:t,parentNodeId:n,rank:r,props:{...l.props,value:o},readonly:i,childRenderAxis:d});return a(m)?m:c("Virtual field updated",void 0)},Ws=({id:e,name:t,parentNodeId:n,rank:r,readonly:o=!1,childRenderAxis:i="horizontal"})=>{let d=E.getNode(e);if(!d){let m=E.createNode({...ae.fieldList({id:e,name:t,parentNodeId:n,rank:r,isVirtual:!0}),readonly:o,childRenderAxis:i});return a(m)?m:c("Virtual field list created",void 0)}if(!Ct(d))return s(`Existing virtual node ${e} is not a field list`);if(!(d.title!==t||d.parentNodeId!==n||d.rank!==r||d.readonly!==o||d.childRenderAxis!==i))return c("Virtual field list unchanged",void 0);let u=E.updateNode({...d,title:t,parentNodeId:n,rank:r,readonly:o,childRenderAxis:i});return a(u)?u:c("Virtual field list updated",void 0)},js=e=>{let t=ge(Ae/4n),n=ge(Ae/2n),r=ge(Ae*3n/4n),o=ge(Ae*7n/8n);if(a(t))return t;if(a(n))return n;if(a(r))return r;if(a(o))return o;let i=$s({id:Sl(e.id),name:q.DESCRIPTION,parentNodeId:e.id,rank:t.value,value:e.props.description??"",childRenderAxis:"vertical"});if(a(i))return i;let d=Ws({id:Cl(e.id),name:q.ASSIGNEES,parentNodeId:e.id,rank:n.value,readonly:!0});if(a(d))return d;let l=Ws({id:Rl(e.id),name:q.TAGS,parentNodeId:e.id,rank:r.value,readonly:!0});if(a(l))return l;let u=$s({id:bl(e.id),name:q.HISTORY,parentNodeId:e.id,rank:o.value,value:Al(e),readonly:!0,childRenderAxis:"vertical"});return a(u)?u:c("Ticket virtual nodes materialized",void 0)},Al=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=>_s(r,n.get(r.action)??[])).join(`
|
|
59
|
+
`)};var k=(e,t)=>s(`${t.action.split(".").join(" ")+" failed, "+e.toLowerCase()}. Evt id: ${t.id}`),Hs=e=>{let t=E.getNode(e);if(!t||!U(t)||t.isDeleted)return null;let n=js(t);return a(n)?n:null},wl=e=>{for(let t of e){let n=Hs(t);if(n)return n;let r=v().nodes[t]?.parentNodeId;if(!r)continue;let o=Hs(r);if(o)return o}return null},Tl=(e,t)=>{let n=E.getNode(e);n&&E.updateNode({...n,log:[...n.log??[],t]})},Ml=e=>{let t=[e],n=v().nodes[e]?.parentNodeId;return n&&t.push(n),t},Pl=e=>{switch(e.action){case"delete.node":case"edit.description":return Ml(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[]}},kl=e=>{pe(t=>({...t,eventLog:[...t.eventLog,e]}))},Ll=e=>{let t=e.userId,n=e.userName;if(!t?.length||!n?.length)return k("Invalid user ID format",e);let r=E.createContributor({id:t,name:n});return a(r)?k(r.message,e):null},Dl=(e,t)=>{let n=Ll(e);if(n)return n;let r=[...new Set(Pl(e))];t||(r.forEach(i=>Tl(i,e)),kl(e));let o=wl(r);return o||null},Fl={"init.workspace":e=>{let{id:t,name:n,rank:r}=e.payload,o=ae.workspace(t,n,r),i=Ht(o);if(a(i))return k(i.message,e);let d=E.createNode(o);return a(d)?k(d.message??"Failed to initialize workspace",e):Xn(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(ae.workspace(t,n,r));return a(o)?k(o.message??"Failed to add workspace",e):Xn(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(ae.board(t,n,r,o));return a(i)?k(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=E.createNode(ae.swimlane(t,n,r,o));return a(i)?k(i.message??"Unable to create swimlane",e):Yt(i.value)?c("Added swimlane",{action:e.action,result:i.value}):s("Unexpected create node return value")},"add.issue":e=>{let{id:t,name:n,parent:r,rank:o}=e.payload,i=E.createNode(ae.ticket(t,n,r,o));return a(i)?k(i.message??"Unable to create issue",e):U(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(ae.field({id:t,name:n,parentNodeId:r,rank:i,props:{value:o},childRenderAxis:n.includes(q.DESCRIPTION)?"vertical":"horizontal"}));return a(d)?k(d.message??`Unable to create field: ${n}`,e):Oe(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 k(`Unable to locate node with id ${t}`,e);let o=E.renameNode(t,n);return a(o)?k(o.message??"Unable to edit title",e):c("Edited title",{action:e.action,result:o.value})},"delete.node":e=>{let{id:t}=e.payload,n=E.tombstoneNode(t);return a(n)?k(n.message??"Unable to delete node",e):c("Deleted node",{action:e.action,result:n.value})},"create.tag":e=>{let{id:t,name:n}=e.payload,r=E.createTag({id:t,name:n});return a(r)?k(r.message??"Unable to create tag",e):c("Tag added",{action:e.action,result:r.value})},"create.contributor":e=>{let{id:t,name:n}=e.payload,r=E.createContributor({id:t,name:n});return a(r)?k(r.message??"Unable to create contributor",e):c("Contributor created",{action:e.action,result:r.value})},"add.issue.tag":e=>{let{id:t,tag:n}=e.payload,r=E.tag(t,n);return a(r)?k(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)?k(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)?k(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)?k(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)?k(o.message??"Failed to move node",e):c("Moved node",{action:e.action,result:o.value})},"edit.description":e=>{let{id:t,md:n}=e.payload,r=E.editValue(t,n);return a(r)?k(r.message??"Unable to edit description",e):c("Set node value",{action:e.action,result:r.value})},"close.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=E.getNode(t);if(!o)return k("Unable to locate issue",e);if(!U(o))return k("Can only close issues",e);let i=E.getNode(ne);if(!i)return k("Unable to locate target swimlane",e);if(n!==i.id)return k("Close target must be closed swimlane",e);let d=E.moveNodeToRank({id:t,parentId:n,rank:r});return a(d)?k(d.message??"Unable to close issue",e):c("Issue closed",{action:e.action,result:{id:t}})},"reopen.issue":e=>{let{id:t,parent:n,rank:r}=e.payload,o=E.getNode(t);if(!o)return k("Unable to locate issue",e);if(!U(o))return k("Can only reopen issues",e);let i=E.getNode(ne);if(!i)return k("Unable to locate closed swimlane",e);if(n===i.id)return k("Cannot reopen issue into closed swimlane",e);if(!E.getNode(n))return k("Reopen parent no longer exists",e);let l=E.moveNodeToRank({id:t,parentId:n,rank:r});return a(l)?k(l.message??"Unable to reopen issue",e):c("Issue reopened",{action:e.action,result:{id:t}})},"lock.node":e=>{let{id:t}=e.payload,n=E.lockNode(t);return a(n)?k(n.message??"Unable to lock node",e):c("Node locked",{action:e.action,result:n.value})},"rebalance.children":e=>{let{parent:t,ranks:n}=e.payload;for(let[r,o]of Object.entries(n)){let i=E.getNode(r);if(!i)return k(`Unable to locate node ${r}`,e);if(i.parentNodeId!==t)return k(`Node ${r} is not child of ${t}`,e);let d=E.updateNode({...i,rank:o});if(a(d))return k(d.message??"Unable to rebalance child",e)}return c("Rebalanced children",{action:e.action,result:{parent:t}})}};function Kt(e,t=!1){let n=Fl[e.action](e);if(a(n))return n;let r=Dl(e,t);return r||n}var rt=e=>e.map(t=>Kt(t));function ye(e,t){let n=Kt(e);if(n.status!==Fe.Success)return n;let r=Ln({event:e,rootDir:t});return a(r)?r:n}function ht(e,t){return e.map(n=>ye(n,t))}var me=async e=>{let t=await ve();return a(t)?t:ye(e,t.value)};var zs=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(re(void 0,void 0));switch(t.at){case"start":{let r=e[0];return r?n(re(void 0,r.rank)):s("Unable to resolve first sibling")}case"end":{let r=e[e.length-1];return r?n(re(r.rank,void 0)):s("Unable to resolve last sibling")}case"before":{let r=Ks(e,t.sibling);if(r<0)return s("Sibling not found");let o=r>0?e[r-1]:void 0,i=e[r];return i?n(re(o?.rank,i.rank)):s("Sibling not found")}case"after":{let r=Ks(e,t.sibling);if(r<0)return s("Sibling not found");let o=e[r],i=r<e.length-1?e[r+1]:void 0;return o?n(re(o.rank,i?.rank)):s("Sibling not found")}}},j=e=>Object.values(v().nodes).filter(t=>!!t&&!t.isDeleted&&t.parentNodeId===e).sort((t,n)=>t.rank.localeCompare(n.rank)),Ks=(e,t)=>e.findIndex(n=>n.id===t),Vs=(e,t,n={at:"end"})=>Un(j(t).filter(r=>r.id!==e),n),It=(e,t,n,r,o)=>{let i=Vs(t,e,n);if(a(i))return i;if(!i.value.needsRebalance)return c("Resolved rank",i.value.rank);let d=Jn(e,r);if(a(d))return d;let l=ye(d.value,o);if(a(l))return l;let u=Vs(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)},xt=(e,t,n)=>{let r=zs(e);if(a(r))return r;if(!r.value.needsRebalance)return c("Resolved rank",r.value.rank);let o=Jn(e,t);if(a(o))return o;let i=ye(o.value,n);if(a(i))return i;let d=zs(e);return a(d)?d:d.value.needsRebalance?s("Rank rebalance failed to create space"):c("Resolved rank after rebalance",d.value.rank)};var Gs=(e,t)=>t<=0?-1:Math.max(0,Math.min(e,t-1)),Ys=()=>{let{contextNode:e,selectedIndex:t,selectedNode:n}=v();return{contextNodeId:e.id,selectedNodeId:n?.id??null,parentNodeId:e.id,selectedIndex:t}},Ol=e=>{let t=v().nodes[e];return!!t&&!t.isDeleted&&Oe(t)&&t.childRenderAxis==="vertical"},zn=(e,t)=>{let{nodes:n}=v(),r=n[e];if(!r||r.isDeleted)return!1;let o=$(r.id);return w.navigate({contextNode:r,selectedIndex:Gs(t,o.length)}),!0},Xs=e=>{let{nodes:t}=v(),n=t[e];if(!n||n.isDeleted)return!1;let r=n.parentNodeId;if(!r)return zn(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?(w.navigate({contextNode:o,selectedIndex:d}),!0):Xs(o.id)},qs=e=>{let{nodes:t}=v(),n=e,r=new Set;for(;n&&!r.has(n);){if(r.add(n),Xs(n))return!0;n=t[n]?.parentNodeId}return!1},Ul=e=>{if(!e)return!1;let t=v().nodes[e];return!!t&&!t.isDeleted},Js=e=>{let{nodes:t,rootNodeId:n}=v();if(Ol(e.contextNodeId)&&zn(e.contextNodeId,e.selectedIndex))return c("Restored navigation inside text container",null);if(Ul(e.selectedNodeId)&&e.selectedNodeId&&qs(e.selectedNodeId))return c("Restored navigation to selected node or ancestor",null);if(zn(e.contextNodeId,e.selectedIndex))return c("Restored navigation to previous container",null);if(e.parentNodeId&&zn(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 w.navigate({contextNode:r,selectedIndex:Gs(e.selectedIndex,o.length)}),c("Restored navigation to root",null)};var zr=({status:e,msg:t})=>{mt()&&h({syncStatus:{status:e,msg:t}})},Kr=(e="Syncing...")=>{zr({status:"syncing",msg:e})},Vr=(e="Synced")=>{zr({status:"synced",msg:e})},Bl=e=>{zr({status:"failed",msg:e})},ee=e=>(Bl(e),s(e));var O=(e,t)=>(a(t)&&logger.info(`[${e}]:failed`,t.message),t);import{decodeTime as _l}from"ulid";var Gr=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)},qr=e=>{let[t,n]=e.id;return`${t}:${n??""}`},Zs=e=>{try{return _l(e.id[0])}catch{return 0}},Qs=(e,t)=>{let n=new Map;for(let r of[...e,...t])n.set(qr(r),r);return[...n.values()].sort((r,o)=>{let i=Zs(r)-Zs(o);return i!==0?i:qr(r).localeCompare(qr(o))})},ea=e=>e.length===0?"":e.map(t=>JSON.stringify(t)).join(`
|
|
61
61
|
`)+`
|
|
62
|
-
`;var ta=e=>Re.existsSync(e)?Re.readFileSync(e,"utf8"):null,_l=(e,t)=>ta(e)===t?!1:(Re.mkdirSync(Gt.dirname(e),{recursive:!0}),Re.writeFileSync(e,t,"utf8"),!0);var $l=e=>{let t=Gt.join(e,".epiq","events"),n=new Map;if(!Re.existsSync(t))return c("No event files to snapshot",n);for(let r of Re.readdirSync(t)){if(!r.endsWith(".jsonl"))continue;let o=Gt.join(t,r);Re.statSync(o).isFile()&&n.set(r,Re.readFileSync(o,"utf8"))}return c("Snapshotted event files",n)},Wl=async e=>{if((await fe({cwd:e,args:["checkout","--",Mt("")]})).exitCode!==0){let n=Gt.join(e,".epiq","events");Re.existsSync(n)&&Re.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=Gt.join(e,Mt(r)),d=ta(i)??"",l=Vr(d);if(a(l))return s(l.message);let u=Vr(o);if(a(u))return s(u.message);let m=Zs(l.value,u.value);n=_l(i,Qs(m))||n}return c("Merged event snapshots",n)},na=async(e=process.cwd())=>{logger.info("[sync] syncEpiqFromRemote:start",e),zr("Syncing from remote");let t=U("ensureSyncReady",await ra({cwd:e,ensureUpstream:!1}));if(a(t))return ee(t.message);let{repoRoot:n,stateBranchRoot:r}=t.value,o=U("getStateBranch",Ye(n));if(a(o))return ee(o.message);let i=o.value,d=U("snapshotEventFiles",$l(r));if(a(d))return ee(d.message);let l=U("restoreEventFilesToHead",await Wl(r));if(a(l))return ee(l.message);let u=U("resetBranchHardToRemote",await Eo({cwd:r,branch:i}));if(a(u))return ee(u.message);let m=U("mergeEventSnapshots",jl({stateBranchRoot:r,snapshots:d.value}));return a(m)?ee(m.message):(Kr(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=U("getRepoRootDir",await _e(e));if(a(n))return s(n.message);let r=n.value;logger.info("[sync] repo root",r);let o=U("getStateBranchRoot",lt({repoRoot:r}));if(a(o))return s(o.message);let i=o.value;logger.info("[sync] state branch root",i);let d=U("ensureInitialCommit",await es(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=U("bootstrapStateBranchStorage",await ns({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=U("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=U("ensureStateBranchLayout",Ao(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}))},Hl=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=U("stageStateBranchOwnEventFile",await Dn({stateBranchRoot:t,eventFileName:n}));if(a(r))return s(r.message);let o=U("hasStagedChanges(after stage)",await No(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=U("createStateBranchSyncCommit",await ts({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}))},Gr=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");zr("Syncing");let n=U("ensureSyncReady",await ra({cwd:e,ensureUpstream:!0}));if(a(n))return ee(n.message);let{repoRoot:r,stateBranchRoot:o,bootstrapped:i}=n.value,d=U("isDetachedHead(stateBranchRoot)",await Io(o));if(a(d))return ee(d.message);if(logger.info("[sync] detached state branch check result",{detached:d.value}),d.value)return ee("Cannot run :sync while the state branch is in detached HEAD state");let l=!1,u,m=!1,g=!1,y=U("getStateBranch",Ye(r));if(a(y))return ee(y.message);let I=y.value;logger.info("[sync] resolved state branch",{stateBranch:I,stateBranchRoot:o});let N=U("commitOwnEventFileToStateBranch",await Hl({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(a(N))return ee(N.message);l=N.value.createdCommit,u=N.value.commitSha;let S=U("pullBranchRebaseIfPresent",await nr({cwd:o,branch:I}));if(a(S))return ee(S.message);if(m=S.value,l||i){logger.info("[sync] pushing state branch",{createdCommit:l,bootstrapped:i,stateBranchRoot:o});let A=U("pushStateBranch",await Wt({stateBranchRoot:o,repoRoot:r}));if(a(A)&&xo(A.message)){let R=U("pullBranchRebaseIfPresent(retry)",await nr({cwd:o,branch:I}));if(a(R))return ee(R.message);m=m||R.value,A=U("pushStateBranch(retry)",await Wt({stateBranchRoot:o,repoRoot:r}))}if(a(A))return ee(A.message);g=A.value}if(l){logger.info("[sync] resolving final sync commit sha",{stateBranchRoot:o});let A=U("git rev-parse HEAD",await D({args:["rev-parse","HEAD"],cwd:o}));if(a(A))return ee(A.message);u=A.value.stdout.trim(),logger.info("[sync] final sync commit sha",u)}return Kr(g?"Synced and pushed":m||l?"Synced local state":"Already synced"),logger.info("[sync] syncEpiqWithRemote:done"),c("Synced event logs with state branch",{repoRoot:r,stateBranchRoot:o,createdCommit:l,commitSha:u,pulled:m,pushed:g,bootstrapped:i})},We=async()=>{let e=ea();if(e)return e;logger.info("[sync] syncAndReloadState:start");let t=U("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=U("syncEpiqWithRemote",await Gr({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=U("loadMergedEvents",vt(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=U("bootStateFromEventLog",Fn(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=U("restoreNavigationAnchor",Xs(l));return a(m)?m:(logger.info("[sync] syncAndReloadState:done"),c("Synced",!0))},ea=()=>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 ia=e=>{let t=Be(e??process.cwd());return a(t)?s(t.message):c("Resolved Epiq repo root",t.value)},at=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=vt(r);if(a(o))return s(o.message);let i=Fn(o.value);return a(i)?s(i.message):c("Booted Epiq state",{repoRoot:t.value,stateBranchRoot:r})},zn=()=>{let e=ji();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")},Kn=()=>{let e=he();return a(e)?s(e.message):e},zl=e=>(e.props.tags??[]).map(t=>E.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name})),Kl=e=>(e.props.assignees??[]).map(t=>E.getContributor(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name})),sa=async(e={})=>{let t=await at(e.repoRoot);if(a(t))return t;let n=Kn();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 at(e.repoRoot);if(a(t))return t;let n=Kn();if(a(n))return n;let r=Object.values(n.value.nodes).filter(o=>o.context==="SWIMLANE").filter(o=>!e.boardId||o.parentNodeId===e.boardId).map(o=>({id:o.id,title:o.title,boardId:o.parentNodeId,isClosed:o.id===ne,readonly:!!o.readonly}));return c("Listed swimlanes",r)},da=async e=>{let t=await at(e.repoRoot);if(a(t))return t;let n=Kn();if(a(n))return n;let r=Object.values(n.value.nodes).filter(B).filter(o=>e.includeClosed||o.parentNodeId!==ne).map(o=>({id:o.id,title:ln(o.title),description:o.props.description??"",parentId:o.parentNodeId,isClosed:o.parentNodeId===ne,readonly:!!o.readonly,tags:zl(o),assignees:Kl(o)}));return c("Listed issues",r)},ca=async e=>{let t=await at(e.repoRoot);if(a(t))return t;let n=zn();if(a(n))return n;let r=xt(e.parentId,n.value,t.value.stateBranchRoot);if(a(r))return r;let o=Bn({name:e.title,parent:e.parentId,user:n.value,rank:r.value});if(a(o))return o;let i=o.value,l=ht(i,t.value.stateBranchRoot).find(a);if(l)return s(l.message);let u=await We();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")},la=async e=>{let t=await at(e.repoRoot);if(a(t))return t;let n=zn();if(a(n))return n;let r=It(ne,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:ne,rank:r.value}},d=ht([o],t.value.stateBranchRoot).find(a);if(d)return s(d.message);let l=await We();return a(l)?l:c("Closed issue",{id:e.issueId})},ua=async e=>{let t=await at(e.repoRoot);if(a(t))return t;let n=zn();if(a(n))return n;let r=It(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=ht([o],t.value.stateBranchRoot).find(a);if(d)return s(d.message);let l=await We();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=zn();if(a(n))return n;let r=await Gr({cwd:t.value,ownEventFileName:nt(n.value)});return a(r)?r:c("Synced",r.value)},pa=async(e={})=>{let t=await at(e.repoRoot);if(a(t))return t;let n=Kn();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)}]}),Gl=()=>{let e=new ql({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},Yl=async()=>{let e=Gl(),t=new Vl;await e.connect(t)};await Yl();export{Gl as createMcpServer,Ve as resultJson,Yl as startMcpServer};
|
|
62
|
+
`;var na=e=>be.existsSync(e)?be.readFileSync(e,"utf8"):null,$l=(e,t)=>na(e)===t?!1:(be.mkdirSync(Gt.dirname(e),{recursive:!0}),be.writeFileSync(e,t,"utf8"),!0);var Wl=e=>{let t=Gt.join(e,".epiq","events"),n=new Map;if(!be.existsSync(t))return c("No event files to snapshot",n);for(let r of be.readdirSync(t)){if(!r.endsWith(".jsonl"))continue;let o=Gt.join(t,r);be.statSync(o).isFile()&&n.set(r,be.readFileSync(o,"utf8"))}return c("Snapshotted event files",n)},jl=async e=>{if((await fe({cwd:e,args:["checkout","--",Mt("")]})).exitCode!==0){let n=Gt.join(e,".epiq","events");be.existsSync(n)&&be.rmSync(n,{recursive:!0,force:!0})}return c("Restored event files to HEAD",null)},Hl=({stateBranchRoot:e,snapshots:t})=>{let n=!1;for(let[r,o]of t){let i=Gt.join(e,Mt(r)),d=na(i)??"",l=Gr(d);if(a(l))return s(l.message);let u=Gr(o);if(a(u))return s(u.message);let m=Qs(l.value,u.value);n=$l(i,ea(m))||n}return c("Merged event snapshots",n)},ra=async(e=process.cwd())=>{logger.info("[sync] syncEpiqFromRemote:start",e),Kr("Syncing from remote");let t=O("ensureSyncReady",await oa({cwd:e,ensureUpstream:!1}));if(a(t))return ee(t.message);let{repoRoot:n,stateBranchRoot:r}=t.value,o=O("getStateBranch",Ye(n));if(a(o))return ee(o.message);let i=o.value,d=O("snapshotEventFiles",Wl(r));if(a(d))return ee(d.message);let l=O("restoreEventFilesToHead",await jl(r));if(a(l))return ee(l.message);let u=O("resetBranchHardToRemote",await No({cwd:r,branch:i}));if(a(u))return ee(u.message);let m=O("mergeEventSnapshots",Hl({stateBranchRoot:r,snapshots:d.value}));return a(m)?ee(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}))},oa=async({cwd:e,ensureUpstream:t})=>{logger.info("[sync] ensureSyncReady:start",{cwd:e,ensureUpstream:t});let n=O("getRepoRootDir",await _e(e));if(a(n))return s(n.message);let r=n.value;logger.info("[sync] repo root",r);let o=O("getStateBranchRoot",lt({repoRoot:r}));if(a(o))return s(o.message);let i=o.value;logger.info("[sync] state branch root",i);let d=O("ensureInitialCommit",await ts(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=O("bootstrapStateBranchStorage",await rs({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=O("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=O("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}))},zl=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=O("stageStateBranchOwnEventFile",await Fn({stateBranchRoot:t,eventFileName:n}));if(a(r))return s(r.message);let o=O("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=O("createStateBranchSyncCommit",await ns({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}))},Yr=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");Kr("Syncing");let n=O("ensureSyncReady",await oa({cwd:e,ensureUpstream:!0}));if(a(n))return ee(n.message);let{repoRoot:r,stateBranchRoot:o,bootstrapped:i}=n.value,d=O("isDetachedHead(stateBranchRoot)",await So(o));if(a(d))return ee(d.message);if(logger.info("[sync] detached state branch check result",{detached:d.value}),d.value)return ee("Cannot run :sync while the state branch is in detached HEAD state");let l=!1,u,m=!1,g=!1,y=O("getStateBranch",Ye(r));if(a(y))return ee(y.message);let I=y.value;logger.info("[sync] resolved state branch",{stateBranch:I,stateBranchRoot:o});let N=O("commitOwnEventFileToStateBranch",await zl({repoRoot:r,stateBranchRoot:o,ownEventFileName:t}));if(a(N))return ee(N.message);l=N.value.createdCommit,u=N.value.commitSha;let S=O("pullBranchRebaseIfPresent",await rr({cwd:o,branch:I}));if(a(S))return ee(S.message);if(m=S.value,l||i){logger.info("[sync] pushing state branch",{createdCommit:l,bootstrapped:i,stateBranchRoot:o});let A=O("pushStateBranch",await Wt({stateBranchRoot:o,repoRoot:r}));if(a(A)&&ho(A.message)){let R=O("pullBranchRebaseIfPresent(retry)",await rr({cwd:o,branch:I}));if(a(R))return ee(R.message);m=m||R.value,A=O("pushStateBranch(retry)",await Wt({stateBranchRoot:o,repoRoot:r}))}if(a(A))return ee(A.message);g=A.value}if(l){logger.info("[sync] resolving final sync commit sha",{stateBranchRoot:o});let A=O("git rev-parse HEAD",await D({args:["rev-parse","HEAD"],cwd:o}));if(a(A))return ee(A.message);u=A.value.stdout.trim(),logger.info("[sync] final sync commit sha",u)}return Vr(g?"Synced and pushed":m||l?"Synced local state":"Already synced"),logger.info("[sync] syncEpiqWithRemote:done"),c("Synced event logs with state branch",{repoRoot:r,stateBranchRoot:o,createdCommit:l,commitSha:u,pulled:m,pushed:g,bootstrapped:i})},We=async()=>{let e=ta();if(e)return e;logger.info("[sync] syncAndReloadState:start");let t=O("resolveActorId",V());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=O("syncEpiqWithRemote",await Yr({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=O("loadMergedEvents",vt(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=ta();if(d)return d;let l=Ys(),u=O("bootStateFromEventLog",On(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=O("restoreNavigationAnchor",Js(l));return a(m)?m:(logger.info("[sync] syncAndReloadState:done"),c("Synced",!0))},ta=()=>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 sa=e=>{let t=Be(e??process.cwd());return a(t)?s(t.message):c("Resolved Epiq repo root",t.value)},at=async e=>{let t=sa(e);if(a(t))return t;let n=await ra(t.value);if(a(n))return s(n.message);let{stateBranchRoot:r}=n.value,o=vt(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})},Kn=()=>{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")},Vn=()=>{let e=he();return a(e)?s(e.message):e},Kl=e=>(e.props.tags??[]).map(t=>E.getTag(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name})),Vl=e=>(e.props.assignees??[]).map(t=>E.getContributor(t)).filter(t=>t!=null).map(t=>({id:t.id,name:t.name})),aa=async(e={})=>{let t=await at(e.repoRoot);if(a(t))return t;let n=Vn();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)},da=async(e={})=>{let t=await at(e.repoRoot);if(a(t))return t;let n=Vn();if(a(n))return n;let r=Object.values(n.value.nodes).filter(o=>o.context==="SWIMLANE").filter(o=>!e.boardId||o.parentNodeId===e.boardId).map(o=>({id:o.id,title:o.title,boardId:o.parentNodeId,isClosed:o.id===ne,readonly:!!o.readonly}));return c("Listed swimlanes",r)},ca=async e=>{let t=await at(e.repoRoot);if(a(t))return t;let n=Vn();if(a(n))return n;let r=Object.values(n.value.nodes).filter(U).filter(o=>e.includeClosed||o.parentNodeId!==ne).map(o=>({id:o.id,title:ln(o.title),description:o.props.description??"",parentId:o.parentNodeId,isClosed:o.parentNodeId===ne,readonly:!!o.readonly,tags:Kl(o),assignees:Vl(o)}));return c("Listed issues",r)},la=async e=>{let t=await at(e.repoRoot);if(a(t))return t;let n=Kn();if(a(n))return n;let r=xt(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=ht(i,t.value.stateBranchRoot).find(a);if(l)return s(l.message);let u=await We();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")},ua=async e=>{let t=await at(e.repoRoot);if(a(t))return t;let n=Kn();if(a(n))return n;let r=It(ne,e.issueId,{at:"end"},n.value,t.value.stateBranchRoot);if(a(r))return r;let o={id:ia(),...n.value,action:"close.issue",payload:{id:e.issueId,parent:ne,rank:r.value}},d=ht([o],t.value.stateBranchRoot).find(a);if(d)return s(d.message);let l=await We();return a(l)?l:c("Closed issue",{id:e.issueId})},ma=async e=>{let t=await at(e.repoRoot);if(a(t))return t;let n=Kn();if(a(n))return n;let r=It(e.parentId,e.issueId,e.position??{at:"end"},n.value,t.value.stateBranchRoot);if(a(r))return r;let o={id:ia(),...n.value,action:"move.node",payload:{id:e.issueId,parent:e.parentId,rank:r.value}},d=ht([o],t.value.stateBranchRoot).find(a);if(d)return s(d.message);let l=await We();return a(l)?l:c("Moved issue",{id:e.issueId,parentId:e.parentId})},pa=async(e={})=>{let t=sa(e.repoRoot);if(a(t))return s("Sync failed");let n=Kn();if(a(n))return n;let r=await Yr({cwd:t.value,ownEventFileName:nt(n.value)});return a(r)?r:c("Synced",r.value)},ga=async(e={})=>{let t=await at(e.repoRoot);if(a(t))return t;let n=Vn();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 qe=e=>({isError:a(e),content:[{type:"text",text:JSON.stringify(e,null,2)}]}),Yl=()=>{let e=new ql({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=>qe(await ga(t))),e.registerTool("epiq_issue_list",{description:"List Epiq issues",inputSchema:L.object({repoRoot:L.string().optional(),includeClosed:L.boolean().optional()})},async t=>qe(await ca(t))),e.registerTool("epiq_board_list",{description:"List Epiq boards",inputSchema:L.object({repoRoot:L.string().optional()})},async t=>qe(await aa(t))),e.registerTool("epiq_swimlane_list",{description:"List Epiq swimlanes",inputSchema:L.object({repoRoot:L.string().optional(),boardId:L.string().optional()})},async t=>qe(await da(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=>qe(await la(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=>qe(await ua(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=>qe(await ma(t))),e.registerTool("epiq_sync",{description:"Sync Epiq state with the configured Git remote",inputSchema:L.object({repoRoot:L.string().optional()})},async t=>qe(await pa(t))),e},Xl=async()=>{let e=Yl(),t=new Gl;await e.connect(t)};await Xl();export{Yl as createMcpServer,qe as resultJson,Xl as startMcpServer};
|