@justyork/repo-mind 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/package.json +9 -1
  2. package/ui/dist/assets/{arc-DhC0JPue.js → arc-C6B0IXf5.js} +1 -1
  3. package/ui/dist/assets/architectureDiagram-3BPJPVTR-BwcC0zwn.js +36 -0
  4. package/ui/dist/assets/{blockDiagram-GPEHLZMM-CgiNAArN.js → blockDiagram-GPEHLZMM-DIhdWMA6.js} +2 -2
  5. package/ui/dist/assets/{c4Diagram-AAUBKEIU-BIwHcwcH.js → c4Diagram-AAUBKEIU-DAe6bsUB.js} +2 -2
  6. package/ui/dist/assets/channel-C8Q7-wTd.js +1 -0
  7. package/ui/dist/assets/{chunk-2J33WTMH-DXRgHPpp.js → chunk-2J33WTMH-Cy3md3pb.js} +1 -1
  8. package/ui/dist/assets/{chunk-4BX2VUAB-BTb70kIb.js → chunk-4BX2VUAB-CzL8eUDD.js} +1 -1
  9. package/ui/dist/assets/{chunk-55IACEB6-BrAelyhX.js → chunk-55IACEB6-CbthXzDA.js} +1 -1
  10. package/ui/dist/assets/{chunk-727SXJPM-BlYnlPdj.js → chunk-727SXJPM-B7ZW-l9j.js} +1 -1
  11. package/ui/dist/assets/{chunk-AQP2D5EJ-DSPgdKZ8.js → chunk-AQP2D5EJ-Vaux-7Ld.js} +1 -1
  12. package/ui/dist/assets/{chunk-FMBD7UC4-BhH8ir2K.js → chunk-FMBD7UC4-C6P2YSWU.js} +1 -1
  13. package/ui/dist/assets/{chunk-ND2GUHAM-DCAuTSxB.js → chunk-ND2GUHAM-gSNqdDAn.js} +1 -1
  14. package/ui/dist/assets/{chunk-QZHKN3VN-DtYEkbYr.js → chunk-QZHKN3VN-DPPMoZqF.js} +1 -1
  15. package/ui/dist/assets/classDiagram-4FO5ZUOK-pYCdSDhT.js +1 -0
  16. package/ui/dist/assets/classDiagram-v2-Q7XG4LA2-pYCdSDhT.js +1 -0
  17. package/ui/dist/assets/cose-bilkent-S5V4N54A-Ca4nXCOA.js +1 -0
  18. package/ui/dist/assets/dagre-BM42HDAG-C-4Y4Jyn.js +4 -0
  19. package/ui/dist/assets/diagram-2AECGRRQ-CNv_WVZk.js +43 -0
  20. package/ui/dist/assets/diagram-5GNKFQAL-CNwYGvCw.js +10 -0
  21. package/ui/dist/assets/{diagram-KO2AKTUF-B-kUxuHX.js → diagram-KO2AKTUF-CEULTL49.js} +2 -2
  22. package/ui/dist/assets/diagram-LMA3HP47-sGQpPW5i.js +24 -0
  23. package/ui/dist/assets/diagram-OG6HWLK6-BBEtEBkh.js +24 -0
  24. package/ui/dist/assets/editor-BcAuZsp8.js +211 -0
  25. package/ui/dist/assets/{erDiagram-TEJ5UH35-BSWwMysi.js → erDiagram-TEJ5UH35-B4mEdVPJ.js} +2 -2
  26. package/ui/dist/assets/{flowDiagram-I6XJVG4X-D-q1cK69.js → flowDiagram-I6XJVG4X-7-OngwLn.js} +2 -2
  27. package/ui/dist/assets/ganttDiagram-6RSMTGT7-Bq3z_Nvr.js +292 -0
  28. package/ui/dist/assets/gitGraphDiagram-PVQCEYII-BjMdjnGR.js +106 -0
  29. package/ui/dist/assets/{graph-DwoitsWW.js → graph-CwHQTpjf.js} +1 -1
  30. package/ui/dist/assets/infoDiagram-5YYISTIA-ByORmROU.js +2 -0
  31. package/ui/dist/assets/{ishikawaDiagram-YF4QCWOH-CY-U_l7l.js → ishikawaDiagram-YF4QCWOH-B7yRHlcY.js} +6 -6
  32. package/ui/dist/assets/{journeyDiagram-JHISSGLW-jKj4lBEJ.js → journeyDiagram-JHISSGLW-J5mLr9YH.js} +2 -2
  33. package/ui/dist/assets/{kanban-definition-UN3LZRKU-PZ-5AYw2.js → kanban-definition-UN3LZRKU-B3GyGD8X.js} +2 -2
  34. package/ui/dist/assets/main-Du7fLv5Y.js +244 -0
  35. package/ui/dist/assets/mermaid.core-C57NVZG0.js +250 -0
  36. package/ui/dist/assets/{mindmap-definition-RKZ34NQL-CPY2Fdu_.js → mindmap-definition-RKZ34NQL-CkcXt9tU.js} +10 -10
  37. package/ui/dist/assets/{pieDiagram-4H26LBE5-C7GJ49et.js → pieDiagram-4H26LBE5-Y7B3kCyQ.js} +2 -2
  38. package/ui/dist/assets/{quadrantDiagram-W4KKPZXB-DQyQN5K7.js → quadrantDiagram-W4KKPZXB-CXKUOw1G.js} +2 -2
  39. package/ui/dist/assets/{requirementDiagram-4Y6WPE33-CDrkwz1t.js → requirementDiagram-4Y6WPE33-DBmmmiXs.js} +4 -4
  40. package/ui/dist/assets/{sankeyDiagram-5OEKKPKP-BrYb9Eql.js → sankeyDiagram-5OEKKPKP-BNADiaE4.js} +2 -2
  41. package/ui/dist/assets/{sequenceDiagram-3UESZ5HK-B8If_JZp.js → sequenceDiagram-3UESZ5HK-CctElOC5.js} +14 -14
  42. package/ui/dist/assets/stateDiagram-AJRCARHV-D40_7g7Y.js +1 -0
  43. package/ui/dist/assets/stateDiagram-v2-BHNVJYJU-DSc6L6rE.js +1 -0
  44. package/ui/dist/assets/theme-BJgORXba.css +1 -0
  45. package/ui/dist/assets/{theme-DV7vqTnV.js → theme-DxqwV6dp.js} +1 -1
  46. package/ui/dist/assets/{timeline-definition-PNZ67QCA-DhUg6aIV.js → timeline-definition-PNZ67QCA-DMVhUcek.js} +2 -2
  47. package/ui/dist/assets/{vennDiagram-CIIHVFJN-DpQVNNzF.js → vennDiagram-CIIHVFJN-Ci0RqPuV.js} +2 -2
  48. package/ui/dist/assets/visual-editor-UWcMGp6p.js +39 -0
  49. package/ui/dist/assets/{wardley-L42UT6IY-CyaxzHGP.js → wardley-L42UT6IY-Chn0BKir.js} +1 -1
  50. package/ui/dist/assets/{wardleyDiagram-YWT4CUSO-Bm0mA7wm.js → wardleyDiagram-YWT4CUSO-BLdXlrC5.js} +2 -2
  51. package/ui/dist/assets/{xychartDiagram-2RQKCTM6-OJbmgDx6.js → xychartDiagram-2RQKCTM6-C4gOVVe1.js} +2 -2
  52. package/ui/dist/graph.html +3 -3
  53. package/ui/dist/index.html +4 -3
  54. package/ui/dist/assets/architectureDiagram-3BPJPVTR-Cun_Ijrv.js +0 -36
  55. package/ui/dist/assets/channel-CNwAp9ic.js +0 -1
  56. package/ui/dist/assets/classDiagram-4FO5ZUOK-DnHeGLmR.js +0 -1
  57. package/ui/dist/assets/classDiagram-v2-Q7XG4LA2-DnHeGLmR.js +0 -1
  58. package/ui/dist/assets/cose-bilkent-S5V4N54A-CAM4jLYo.js +0 -1
  59. package/ui/dist/assets/dagre-BM42HDAG-CISbgani.js +0 -4
  60. package/ui/dist/assets/diagram-2AECGRRQ-BmXargwF.js +0 -43
  61. package/ui/dist/assets/diagram-5GNKFQAL-COlrLu0O.js +0 -10
  62. package/ui/dist/assets/diagram-LMA3HP47-C3AVVxcm.js +0 -24
  63. package/ui/dist/assets/diagram-OG6HWLK6-JHeftSsO.js +0 -24
  64. package/ui/dist/assets/ganttDiagram-6RSMTGT7-DrYn1H_t.js +0 -292
  65. package/ui/dist/assets/gitGraphDiagram-PVQCEYII-vJByl99X.js +0 -106
  66. package/ui/dist/assets/infoDiagram-5YYISTIA-D6zhGTMj.js +0 -2
  67. package/ui/dist/assets/main-BBzCq-49.js +0 -308
  68. package/ui/dist/assets/mermaid.core-Bddhr0ku.js +0 -309
  69. package/ui/dist/assets/stateDiagram-AJRCARHV-BbpTp9VX.js +0 -1
  70. package/ui/dist/assets/stateDiagram-v2-BHNVJYJU-BT4PvMFS.js +0 -1
  71. package/ui/dist/assets/theme-SpsWsRN5.css +0 -1
@@ -0,0 +1,244 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/mermaid.core-C57NVZG0.js","assets/transform-BwXaE9hv.js","assets/editor-BcAuZsp8.js","assets/visual-editor-UWcMGp6p.js","assets/theme-DxqwV6dp.js","assets/theme-BJgORXba.css"])))=>i.map(i=>d[i]);
2
+ import{p as Fe,s as je,e as Ie,g as Oe,a as Be,l as O,b as Ke,c as Ge,d as V,f as ze,h as Je,i as Ve,j as Xe,k as Ye,m as Qe,n as Ze,r as et,o as tt,q as fe,t as nt,v as st,w as rt,x as it,y as F,z as ge,A as at,B as ot,C as lt}from"./theme-DxqwV6dp.js";import{m as Le}from"./editor-BcAuZsp8.js";const dt={"wiki-page":"Wiki",adr:"ADR","feature-spec":"Feature specs","glossary-term":"Glossary","open-question":"Open questions","agent-instruction":"Agent instructions"},ut={"wiki-page":"W",adr:"A","feature-spec":"S","glossary-term":"G","open-question":"?","agent-instruction":"◎"},K="folder:";function ct(e){return e.startsWith(K)?e.slice(K.length).slice(0,1).toUpperCase():ut[e]??e.slice(0,1).toUpperCase()}function G(e){if(e.startsWith(K)){const n=e.slice(K.length);return n==="__root__"?"General":n.split(/[-_/]/).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}return dt[e]??e}function pt(e,n){var P,S,q,L;e.className="workspace-main workspace-dashboard",e.innerHTML=`
3
+ <div class="dashboard-header">
4
+ <h1 class="doc-title">Health &amp; publish</h1>
5
+ <div class="workspace-actions">
6
+ <button type="button" id="dash-export" class="btn-ghost">Export agents.md</button>
7
+ <button type="button" id="dash-refresh" class="btn-ghost">Refresh</button>
8
+ </div>
9
+ </div>
10
+ <div id="dash-check" class="dashboard-section"></div>
11
+ <div id="dash-links" class="dashboard-section"></div>
12
+ <div class="dashboard-section">
13
+ <h2>Prepare docs</h2>
14
+ <p class="dashboard-hint">Markdown files without RepoMind frontmatter. Add frontmatter to index them for MCP and the catalog.</p>
15
+ <div class="dashboard-actions">
16
+ <button type="button" id="dash-prepare-all" class="btn-primary btn-sm">Prepare all</button>
17
+ <button type="button" id="dash-sync-links" class="btn-ghost btn-sm">Sync all links</button>
18
+ </div>
19
+ <ul id="dash-unprepared" class="queue-list"></ul>
20
+ </div>
21
+ <div class="dashboard-section">
22
+ <h2>Publish queue</h2>
23
+ <ul id="dash-queue" class="queue-list"></ul>
24
+ </div>
25
+ `;const t=e.querySelector("#dash-check"),r=e.querySelector("#dash-links"),p=e.querySelector("#dash-unprepared"),u=e.querySelector("#dash-queue");function i(m){const o=m.ok?"check-ok":"check-fail",h=m.ok?"All checks passed":`${m.violations.length} issue(s)`;let f=`
26
+ <h2>Schema check</h2>
27
+ <p class="check-status ${o}">${h}</p>
28
+ `;if(m.violations.length>0){f+='<ul class="violation-list">';for(const w of m.violations)f+=`<li><code>${A(w.path)}</code> — ${A(w.message)}</li>`;f+="</ul>"}if(m.warnings.length>0){f+='<h3 class="warnings-title">Warnings</h3><ul class="warning-list">';for(const w of m.warnings)f+=`<li>${A(w)}</li>`;f+="</ul>"}t.innerHTML=f}function v(m){let o=`
29
+ <h2>Link health</h2>
30
+ <div class="link-health-stats">
31
+ <div class="link-health-stat"><span class="link-health-value">${m.orphanCount}</span> orphans</div>
32
+ <div class="link-health-stat"><span class="link-health-value">${m.brokenCount}</span> broken</div>
33
+ <div class="link-health-stat"><span class="link-health-value">${m.oneWayCount}</span> one-way</div>
34
+ </div>
35
+ `;if(m.brokenTargets.length>0){o+='<h3 class="warnings-title">Broken targets</h3><ul class="warning-list">';for(const h of m.brokenTargets)o+=`<li><code>${A(h)}</code></li>`;o+="</ul>"}if(m.orphanSlugs.length>0){o+='<h3 class="warnings-title">Orphan pages</h3><ul class="warning-list">';for(const h of m.orphanSlugs)o+=`<li><code>${A(h)}</code></li>`;o+="</ul>"}r.innerHTML=o}function $(m){var o;if(p.innerHTML="",m.length===0){p.innerHTML='<li class="placeholder">All docs have frontmatter</li>';return}for(const h of m){const f=document.createElement("li");f.className="queue-item",f.innerHTML=`
36
+ <div class="queue-main">
37
+ <div class="queue-title">${A(h.relativePath)}</div>
38
+ <div class="meta">${A(h.suggestedType)} · slug: ${A(h.suggestedSlug)}</div>
39
+ </div>
40
+ <div class="queue-actions">
41
+ <button type="button" class="btn-primary btn-sm" data-action="prepare">Add frontmatter</button>
42
+ </div>
43
+ `,(o=f.querySelector('[data-action="prepare"]'))==null||o.addEventListener("click",()=>{Ge(h.relativePath,h.suggestedType).then(({result:w})=>{n.onNotify(`Prepared: ${w.slug}`),y()}).catch(w=>{n.onNotify(w instanceof Error?w.message:"Prepare failed",!0)})}),p.appendChild(f)}}function E(m){var o,h;if(u.innerHTML="",m.length===0){u.innerHTML='<li class="placeholder">No drafts in queue</li>';return}for(const f of m){const w=document.createElement("li");w.className="queue-item",w.innerHTML=`
44
+ <div class="queue-main">
45
+ <div class="queue-title">${A(f.title||f.slug)}</div>
46
+ <div class="meta">${A(f.slug)} · ${A(f.type)}</div>
47
+ </div>
48
+ <div class="queue-actions">
49
+ <button type="button" class="btn-ghost btn-sm" data-action="edit">Edit</button>
50
+ <button type="button" class="btn-primary btn-sm" data-action="publish">Publish</button>
51
+ </div>
52
+ `,(o=w.querySelector('[data-action="edit"]'))==null||o.addEventListener("click",()=>{n.onOpenDraft(f)}),(h=w.querySelector('[data-action="publish"]'))==null||h.addEventListener("click",()=>{V(f.id).then(({result:s})=>{n.onPublished(s.path),y()}).catch(s=>{n.onNotify(s instanceof Error?s.message:"Publish failed",!0)})}),u.appendChild(w)}}async function y(){try{const[m,o,{drafts:h},{files:f}]=await Promise.all([Oe(),Be(),O(),Ke()]);i(m),v(o),$(f),E(h)}catch(m){t.innerHTML=`<p class="check-status check-fail">${A(m instanceof Error?m.message:"Failed to load")}</p>`}}return(P=e.querySelector("#dash-refresh"))==null||P.addEventListener("click",()=>{y()}),(S=e.querySelector("#dash-prepare-all"))==null||S.addEventListener("click",()=>{Fe().then(({result:m})=>{n.onNotify(`Prepared ${m.prepared.length} file(s)`),y()}).catch(m=>{n.onNotify(m instanceof Error?m.message:"Prepare all failed",!0)})}),(q=e.querySelector("#dash-sync-links"))==null||q.addEventListener("click",()=>{je().then(({result:m})=>{const o=m.files.filter(h=>h.changed).length;n.onNotify(`Synced links in ${o} file(s)`),y()}).catch(m=>{n.onNotify(m instanceof Error?m.message:"Sync links failed",!0)})}),(L=e.querySelector("#dash-export"))==null||L.addEventListener("click",()=>{Ie().then(({path:m})=>{n.onNotify(`Exported ${m}`)}).catch(m=>{n.onNotify(m instanceof Error?m.message:"Export failed",!0)})}),y(),{refresh:y}}function A(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}const ft="modulepreload",gt=function(e){return"/"+e},he={},$e=function(n,t,r){let p=Promise.resolve();if(t&&t.length>0){let i=function(E){return Promise.all(E.map(y=>Promise.resolve(y).then(P=>({status:"fulfilled",value:P}),P=>({status:"rejected",reason:P}))))};document.getElementsByTagName("link");const v=document.querySelector("meta[property=csp-nonce]"),$=(v==null?void 0:v.nonce)||(v==null?void 0:v.getAttribute("nonce"));p=i(t.map(E=>{if(E=gt(E),E in he)return;he[E]=!0;const y=E.endsWith(".css"),P=y?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${E}"]${P}`))return;const S=document.createElement("link");if(S.rel=y?"stylesheet":ft,y||(S.as="script"),S.crossOrigin="",S.href=E,$&&S.setAttribute("nonce",$),document.head.appendChild(S),y)return new Promise((q,L)=>{S.addEventListener("load",q),S.addEventListener("error",()=>L(new Error(`Unable to preload CSS for ${E}`)))})}))}function u(i){const v=new Event("vite:preloadError",{cancelable:!0});if(v.payload=i,window.dispatchEvent(v),!v.defaultPrevented)throw i}return p.then(i=>{for(const v of i||[])v.status==="rejected"&&u(v.reason);return n().catch(u)})};function ht(e){if(!e)return null;if(e.startsWith("?slug=")||e.startsWith("/?slug=")){const n=e.includes("?")?e.slice(e.indexOf("?")):e,t=new URLSearchParams(n).get("slug");return(t==null?void 0:t.trim())||null}try{const t=new URL(e,"http://local").searchParams.get("slug");return(t==null?void 0:t.trim())||null}catch{return null}}function X(e){var n,t;return((t=(n=e.split("#")[0])==null?void 0:n.split("?")[0])==null?void 0:t.trim())??""}function qe(e){const n=e.replace(/\\/g,"/").replace(/^\/+/,"");return n?n.toLowerCase().endsWith(".md")?n:`${n}.md`:""}function mt(e,n){const t=X(n);if(!t||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("mailto:")||t.startsWith("#"))return null;const r=e.includes("/")?e.slice(0,e.lastIndexOf("/")):"",p=t.replace(/\\/g,"/").split("/"),u=r?r.split("/"):[];for(const i of p)if(!(!i||i===".")){if(i===".."){if(u.length===0)return null;u.pop();continue}u.push(i)}return qe(u.join("/"))}function vt(e){let n=X(e).replace(/\\/g,"/");return!n||n.startsWith("http://")||n.startsWith("https://")||n.startsWith("mailto:")||n.startsWith("#")||(n.startsWith("/")&&(n=n.slice(1)),n.startsWith("docs/")&&(n=n.slice(5)),!n)?null:qe(n)}function yt(e,n){const t=n.get(e);if(t)return t;const r=e.toLowerCase();for(const[p,u]of n.entries())if(p.toLowerCase()===r)return u;return null}function wt(e,n,t){const r=ht(n);if(r){for(const u of t.values())if(u===r)return r;return null}const p=[mt(e,n),vt(n)].filter(u=>!!u);for(const u of p){const i=yt(u,t);if(i)return i}return null}const St=[".png",".jpg",".jpeg",".gif",".webp",".svg"];function me(e){const n=e.toLowerCase();return St.some(t=>n.endsWith(t))}function bt(e,n){const t=X(n);if(!t||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("mailto:")||t.startsWith("#")||t.startsWith("data:"))return null;let r=t.replace(/\\/g,"/");if(r.startsWith("/")&&(r=r.slice(1)),r.startsWith("docs/")?r=r.slice(5):r="",r&&!r.split("/").includes("..")&&me(r))return r;const p=e.includes("/")?e.slice(0,e.lastIndexOf("/")):"",u=t.replace(/\\/g,"/").split("/"),i=p?p.split("/"):[];for(const $ of u)if(!(!$||$===".")){if($===".."){if(i.length===0)return null;i.pop();continue}i.push($)}const v=i.join("/");return v&&me(v)?v:null}function Et(e,n){const t=bt(e,n);return t?`/api/assets/${t.split("/").map(encodeURIComponent).join("/")}`:null}const Pe=/\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/g;function Ce(e,n){const t=e.trim(),r=((n==null?void 0:n.trim())||t).trim();return{display:t,slug:r}}function rn(e,n){const t=e.trim(),r=(n??t).trim();return r===t?`[[${t}]]`:`[[${t}|${r}]]`}function Lt(e){const n=[];for(const t of e.matchAll(Pe)){const{slug:r}=Ce(t[1]??"",t[2]);r&&n.push(r)}return n}let ve=!1,N=null;function H(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function $t(e){return e.replace(Pe,(n,t,r)=>{const{display:p,slug:u}=Ce(t,r),i=encodeURIComponent(u);return`[${p}](#wikilink:${i})`})}function qt(){ve||(Le.use({gfm:!0,renderer:{code({text:e,lang:n}){return n==="mermaid"?`<div class="mermaid-wrapper"><pre class="mermaid">${H(e.trim())}</pre></div>
53
+ `:!1},list(e){if(!e.items.some(u=>u.task))return!1;const t=e.ordered?"ol":"ul",r=e.ordered&&e.start!==1&&e.start!=null?` start="${e.start}"`:"";let p="";for(const u of e.items)p+=this.listitem(u);return`<${t} class="contains-task-list"${r}>
54
+ ${p}</${t}>
55
+ `},listitem(e){if(!e.task)return!1;const n=`<input type="checkbox" class="task-list-item-checkbox"${e.checked?" checked":""} disabled>`,t=this.parser.parse(e.tokens,!!e.loose).trim();return`<li class="task-list-item"><label class="task-list-item-label">${n}<span class="task-list-item-content">${t}</span></label></li>
56
+ `},image({href:e,text:n,title:t}){if(!e||e.startsWith("http://")||e.startsWith("https://")||e.startsWith("data:"))return!1;if(N){const r=Et(N.docRelativePath,e);if(r){const p=H(n||t||"");return`<img src="${H(r)}" alt="${p}" loading="lazy" class="markdown-image">`}}return!1},link({href:e,text:n}){if(e!=null&&e.startsWith("#wikilink:")){const t=decodeURIComponent(e.slice(10));return`<a href="#" class="wikilink" data-slug="${H(t)}">${n}</a>`}if(N&&e){const t=wt(N.docRelativePath,e,N.slugByRelative);if(t)return`<a href="#" class="wikilink" data-slug="${H(t)}">${n}</a>`}return e!=null&&e.startsWith("http://")||e!=null&&e.startsWith("https://")?`<a href="${H(e)}" target="_blank" rel="noopener noreferrer">${n}</a>`:e!=null&&e.startsWith("mailto:")||e!=null&&e.startsWith("#")?!1:e?`<a href="#" class="md-link-unresolved" title="Link not in docs index">${n}</a>`:!1}}}),ve=!0)}function Pt(e,n){qt(),N=n??null;try{return Le.parse($t(e),{async:!1})}finally{N=null}}let ye=null;async function Ct(e){const n=e.querySelectorAll("pre.mermaid");if(n.length===0)return;const t=document.documentElement.dataset.theme==="dark"?"dark":"default",r=await $e(()=>import("./mermaid.core-C57NVZG0.js").then(p=>p.ba),__vite__mapDeps([0,1,2]));ye!==t&&(r.default.initialize({startOnLoad:!1,theme:t,securityLevel:"loose"}),ye=t);try{await r.default.run({nodes:[...n]})}catch{for(const p of n)if(!p.closest(".mermaid-error")){const u=p.parentElement;u==null||u.classList.add("mermaid-error")}}}const Y="slug",Te="path";function Q(){const e=new URLSearchParams(window.location.search).get(Y);return e!=null&&e.trim()?e.trim():null}function Tt(){const e=new URLSearchParams(window.location.search).get(Te);return e!=null&&e.trim()?e.trim().replace(/\\/g,"/"):null}function kt(){const e=new URL(window.location.href),n=e.pathname;if(n==="/"||n==="/index.html")return;const t=Q();e.pathname="/",history.replaceState(t?{slug:t}:{},"",e)}function ke(){const e=new URL(window.location.href);return e.pathname="/",e}function At(e){const n=ke();return n.search="",n.searchParams.set(Y,e),n.toString()}function Mt(e,n="push"){const t=ke();t.searchParams.delete(Te),t.searchParams.set(Y,e);const r={slug:e};n==="replace"?history.replaceState(r,"",t):history.pushState(r,"",t)}function xt(e){const n=()=>{e(Q())};return window.addEventListener("popstate",n),()=>window.removeEventListener("popstate",n)}function Dt(e,n){if(n==="json")try{const t=JSON.parse(e);return JSON.stringify(t,null,2)}catch{return e}return e}function Rt(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function Nt(e,n){const t=Dt(e,n);return`<pre class="structured-preview ${n==="json"?"structured-preview--json":"structured-preview--yaml"}"><code>${Rt(t)}</code></pre>`}const Ae="repomind-page-info-hidden";function Wt(){try{const e=localStorage.getItem(Ae);return e===null?!0:e==="true"}catch{return!0}}function _t(e){try{localStorage.setItem(Ae,e?"true":"false")}catch{}}function D(e,n,t={}){var f,w,s,l;if(e.className="workspace-main",!n||!n.found){e.innerHTML=`
57
+ <div class="workspace-empty">
58
+ <h1>Knowledge</h1>
59
+ <p class="placeholder">Select a page from the tree or use the ⋯ menu to create one.</p>
60
+ </div>
61
+ `;return}const r=n.frontmatter??{},p=typeof r.title=="string"?r.title:n.slug??"",u=typeof r.status=="string"?r.status:"",i=typeof r.type=="string"?r.type:"",v=typeof r.domain=="string"?r.domain:"",$=Array.isArray(r.tags)?r.tags.filter(a=>typeof a=="string"):[],E=Array.isArray(r.related)?r.related.filter(a=>typeof a=="string"):[],y=G(i),P=Wt(),S=n.contentKind??"markdown",q=S==="json"||S==="yaml",L=q?"":'<button type="button" id="edit-page" class="btn-primary">Edit</button>';e.innerHTML=`
62
+ <nav class="breadcrumb" aria-label="Breadcrumb">
63
+ <button type="button" class="crumb" data-crumb="root">Knowledge</button>
64
+ <span class="crumb-sep">›</span>
65
+ <button type="button" class="crumb" data-crumb="catalog">${T(y)}</button>
66
+ <span class="crumb-sep">›</span>
67
+ <span class="crumb current">${T(p)}</span>
68
+ </nav>
69
+ <div class="page-layout${P?" page-layout--focus":""}">
70
+ <article class="page-content">
71
+ <header class="page-header">
72
+ <h1 class="doc-title">${T(p)}</h1>
73
+ <div class="workspace-actions">
74
+ <button type="button" id="toggle-focus" class="btn-ghost" aria-pressed="${P}">
75
+ ${P?"Show info":"Hide info"}
76
+ </button>
77
+ ${L}
78
+ <button type="button" id="copy-link" class="btn-ghost">Copy link</button>
79
+ <button type="button" id="copy-path" class="btn-ghost">Copy path</button>
80
+ </div>
81
+ </header>
82
+ <div id="tab-preview" class="markdown-preview reader-preview"></div>
83
+ <section id="reader-backlinks" class="reader-backlinks hidden" aria-label="Backlinks"></section>
84
+ </article>
85
+ <aside class="page-info">
86
+ <h2 class="page-info-title">Page info</h2>
87
+ <dl class="info-list">
88
+ <dt>Status</dt><dd><span class="status-chip status-${T(u)}">${T(u)}</span></dd>
89
+ <dt>Type</dt><dd>${T(i)}</dd>
90
+ ${v?`<dt>Domain</dt><dd>${T(v)}</dd>`:""}
91
+ <dt>Format</dt><dd>${T(S)}</dd>
92
+ ${$.length>0?`<dt>Tags</dt><dd>${$.map(a=>`<span class="tag-chip">${T(a)}</span>`).join(" ")}</dd>`:""}
93
+ </dl>
94
+ ${E.length>0?`<div class="info-block"><div class="info-block-label">Related</div>${E.map(a=>`<button type="button" class="related-chip" data-slug="${T(a)}">${T(a)}</button>`).join("")}</div>`:""}
95
+ <div class="info-tabs tabs">
96
+ <button class="tab active" data-tab="frontmatter">Frontmatter</button>
97
+ <button class="tab" data-tab="agent">Agent JSON</button>
98
+ </div>
99
+ <div id="tab-frontmatter" class="tab-panel active"></div>
100
+ <div id="tab-agent" class="tab-panel"></div>
101
+ <footer class="page-info-footer">
102
+ <code id="doc-path">${T(n.path??"")}</code>
103
+ </footer>
104
+ </aside>
105
+ </div>
106
+ `;const m=e.querySelector("#tab-preview");if(q)m.innerHTML=Nt(n.body??"",S);else{const a=t.docRelativePath&&t.slugByRelative?{docRelativePath:t.docRelativePath,slugByRelative:t.slugByRelative}:void 0;m.innerHTML=Pt(n.body??"",a),Ct(m),m.querySelectorAll("a.wikilink").forEach(g=>{g.addEventListener("click",d=>{d.preventDefault();const b=g.dataset.slug;b&&e.dispatchEvent(new CustomEvent("navigate-slug",{detail:{slug:b}}))})}),m.querySelectorAll("a.md-link-unresolved").forEach(g=>{g.addEventListener("click",d=>{d.preventDefault()})})}const o=e.querySelector("#tab-frontmatter");o.innerHTML='<pre class="frontmatter-yaml"></pre>',o.querySelector("pre").textContent=JSON.stringify(r,null,2);const h=e.querySelector("#tab-agent");h.innerHTML='<pre class="agent-json"></pre>',h.querySelector("pre").textContent=JSON.stringify(n.agentShape,null,2),e.querySelectorAll(".info-tabs .tab").forEach(a=>{a.addEventListener("click",()=>{var d;const g=a.dataset.tab;e.querySelectorAll(".info-tabs .tab").forEach(b=>b.classList.remove("active")),e.querySelectorAll(".page-info .tab-panel").forEach(b=>b.classList.remove("active")),a.classList.add("active"),(d=e.querySelector(`#tab-${g}`))==null||d.classList.add("active")})}),(f=e.querySelector("#toggle-focus"))==null||f.addEventListener("click",()=>{const a=e.querySelector(".page-layout"),g=e.querySelector("#toggle-focus"),d=!(a!=null&&a.classList.contains("page-layout--focus"));a==null||a.classList.toggle("page-layout--focus",d),_t(d),g&&(g.setAttribute("aria-pressed",String(d)),g.textContent=d?"Show info":"Hide info")}),(w=e.querySelector("#copy-path"))==null||w.addEventListener("click",()=>{n.path&&navigator.clipboard.writeText(n.path)}),(s=e.querySelector("#copy-link"))==null||s.addEventListener("click",()=>{var a;n.slug&&(navigator.clipboard.writeText(At(n.slug)),(a=t.onCopyLink)==null||a.call(t))}),(l=e.querySelector("#edit-page"))==null||l.addEventListener("click",()=>{n.slug&&t.onEdit&&t.onEdit(n.slug)}),e.querySelectorAll(".related-chip").forEach(a=>{a.addEventListener("click",()=>{const g=a.dataset.slug;g&&e.dispatchEvent(new CustomEvent("navigate-slug",{detail:{slug:g}}))})}),n.slug&&!q&&ze(n.slug).then(({backlinks:a})=>{const g=e.querySelector("#reader-backlinks");!g||a.length===0||(g.classList.remove("hidden"),g.innerHTML=`
107
+ <h2 class="reader-backlinks-title">Backlinks</h2>
108
+ <div class="reader-backlinks-list">
109
+ ${a.map(d=>`<button type="button" class="related-chip" data-slug="${T(d.slug)}">${T(d.title)} <span class="backlink-kind">${T(d.kind)}</span></button>`).join("")}
110
+ </div>
111
+ `,g.querySelectorAll(".related-chip").forEach(d=>{d.addEventListener("click",()=>{const b=d.dataset.slug;b&&e.dispatchEvent(new CustomEvent("navigate-slug",{detail:{slug:b}}))})}))}).catch(()=>{})}function T(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function Ht(e){return Lt(e)}function Ut(e,n){const t=n.find(u=>u.slug===e);if(t)return t.slug;const r=e.toLowerCase(),p=n.find(u=>u.title.toLowerCase()===r);return(p==null?void 0:p.slug)??null}function Ft(e,n,t){const r=new Set(n),p=[];for(const u of Ht(e)){const i=Ut(u,t);!i||r.has(i)||p.includes(i)||p.push(i)}return p}function jt(e,n,t){const r=e.toLowerCase();if(!r)return 1;const p=n.toLowerCase(),u=t.toLowerCase();return p.startsWith(r)||u.startsWith(r)?3:p.includes(r)||u.includes(r)?2:0}function an(e,n,t=12){return n.map(r=>({doc:r,score:jt(e,r.slug,r.title)})).filter(r=>r.score>0).sort((r,p)=>p.score-r.score||r.doc.slug.localeCompare(p.doc.slug)).slice(0,t).map(r=>r.doc)}let R=null,j=null;function It(e,n,t,r=[]){var ee,te,ne,se,re,ie,ae,oe,le,de,ue,ce;const p=r.map(c=>({slug:c.slug,title:c.title})),u=p.map(c=>c.slug);let i=null,v=n.body;e.className="workspace-main workspace-editor";const $=G(n.type);e.innerHTML=`
112
+ <nav class="breadcrumb" aria-label="Breadcrumb">
113
+ <span class="crumb">Knowledge</span>
114
+ <span class="crumb-sep">›</span>
115
+ <span class="crumb">Drafts</span>
116
+ <span class="crumb-sep">›</span>
117
+ <span class="crumb current">${I(n.title||n.slug)}</span>
118
+ </nav>
119
+ <div class="page-layout">
120
+ <div class="page-content">
121
+ <header class="page-header">
122
+ <input id="ed-title" class="title-input doc-title" type="text" placeholder="Document title" />
123
+ <div class="workspace-actions">
124
+ <div class="publish-split">
125
+ <button type="button" id="ed-publish" class="btn-primary publish-main">Publish</button>
126
+ <button type="button" id="ed-publish-menu-btn" class="btn-primary publish-menu-trigger" aria-haspopup="true" aria-expanded="false">▾</button>
127
+ <div id="ed-publish-menu" class="publish-menu hidden" role="menu">
128
+ <button type="button" id="ed-publish-review" role="menuitem">Review changes</button>
129
+ </div>
130
+ </div>
131
+ <button type="button" id="ed-view-md" class="btn-ghost">View markdown</button>
132
+ <button type="button" id="ed-close" class="btn-ghost">Close</button>
133
+ <button type="button" id="ed-discard" class="btn-ghost">Discard draft</button>
134
+ </div>
135
+ </header>
136
+ <div id="ed-visual-canvas"></div>
137
+ </div>
138
+ <aside class="page-info">
139
+ <h2 class="page-info-title">Page properties</h2>
140
+ <div class="workspace-badges editor-badges">
141
+ <span class="badge badge-draft">draft</span>
142
+ ${n.forked_from?`<span class="badge">fork: ${I(n.forked_from)}</span>`:""}
143
+ </div>
144
+ <div class="meta-grid editor-meta">
145
+ <div class="field"><label>Slug</label><input id="ed-slug" /></div>
146
+ <div class="field"><label>Catalog</label><input id="ed-catalog" readonly value="${I($)}" /></div>
147
+ <div class="field"><label>Type</label>
148
+ <select id="ed-type">
149
+ <option value="adr">adr</option>
150
+ <option value="feature-spec">feature-spec</option>
151
+ <option value="glossary-term">glossary-term</option>
152
+ <option value="open-question">open-question</option>
153
+ <option value="agent-instruction">agent-instruction</option>
154
+ <option value="wiki-page">wiki-page</option>
155
+ </select>
156
+ </div>
157
+ <div class="field"><label>Status</label>
158
+ <select id="ed-status">
159
+ <option value="draft">draft</option>
160
+ <option value="proposed">proposed</option>
161
+ <option value="accepted">accepted</option>
162
+ <option value="superseded">superseded</option>
163
+ </select>
164
+ </div>
165
+ <div class="field field-wide"><label>Tags</label><input id="ed-tags" placeholder="comma-separated" /></div>
166
+ <div class="field field-wide"><label>Related</label><input id="ed-related" list="ed-related-suggestions" placeholder="slug-one, slug-two" /></div>
167
+ </div>
168
+ <datalist id="ed-related-suggestions">
169
+ ${u.map(c=>`<option value="${c}"></option>`).join("")}
170
+ </datalist>
171
+ </aside>
172
+ </div>
173
+ <div id="publish-modal" class="modal hidden">
174
+ <div class="modal-card modal-card-wide">
175
+ <p>Publish to git as markdown?</p>
176
+ <code id="publish-target"></code>
177
+ <pre id="publish-diff" class="diff-preview"></pre>
178
+ <div id="publish-related" class="publish-related hidden">
179
+ <p id="publish-related-prompt"></p>
180
+ <ul id="publish-related-list" class="publish-related-list"></ul>
181
+ <div class="editor-actions">
182
+ <button type="button" id="publish-related-apply" class="btn-primary">Add to related</button>
183
+ <button type="button" id="publish-related-skip" class="btn-ghost">Skip</button>
184
+ </div>
185
+ </div>
186
+ <div class="editor-actions">
187
+ <button type="button" id="publish-confirm" class="btn-primary">Confirm</button>
188
+ <button type="button" id="publish-cancel" class="btn-ghost">Cancel</button>
189
+ </div>
190
+ </div>
191
+ </div>
192
+ <div id="view-md-modal" class="modal hidden">
193
+ <div class="modal-card modal-card-wide">
194
+ <h3 class="modal-title">Markdown source</h3>
195
+ <pre id="view-md-content" class="md-source"></pre>
196
+ <div class="editor-actions">
197
+ <button type="button" id="view-md-copy" class="btn-primary">Copy</button>
198
+ <button type="button" id="view-md-close" class="btn-ghost">Close</button>
199
+ </div>
200
+ </div>
201
+ </div>
202
+ `;const E=e.querySelector("#ed-title"),y=e.querySelector("#ed-slug"),P=e.querySelector("#ed-type"),S=e.querySelector("#ed-status"),q=e.querySelector("#ed-tags"),L=e.querySelector("#ed-related"),m=e.querySelector("#ed-visual-canvas"),o=e.querySelector("#publish-modal"),h=e.querySelector("#view-md-modal"),f=e.querySelector("#ed-publish-menu");E.value=n.title,y.value=n.slug,P.value=n.type,S.value=n.status,q.value=n.tags.join(", "),L.value=n.related.join(", "),$e(async()=>{const{mountVisualEditor:c}=await import("./visual-editor-UWcMGp6p.js");return{mountVisualEditor:c}},__vite__mapDeps([3,2,4,5])).then(({mountVisualEditor:c})=>{i=c(m,{initialMarkdown:n.body,docCandidates:p,onBodyChange:()=>d(),onError:t.onError})});let w=[];function s(c){return c.split(",").map(C=>C.trim()).filter(Boolean)}function l(){return(i==null?void 0:i.getMarkdownBody())??v}function a(){return{title:E.value,slug:y.value,type:P.value,status:S.value,tags:s(q.value),related:s(L.value),body:l()}}async function g(){const c=a();v=c.body,await Ve(n.id,c)}function d(){R&&clearTimeout(R),R=setTimeout(()=>{R=null,j=g().catch(c=>{t.onError(c instanceof Error?c.message:"Autosave failed")})},800)}async function b(){R&&(clearTimeout(R),R=null,j=g().catch(c=>{throw t.onError(c instanceof Error?c.message:"Autosave failed"),c})),j&&(await j,j=null)}const x=()=>{const c=e.querySelector("#ed-catalog");c&&(c.value=G(P.value)),d()};for(const c of[E,y,P,S,q,L])c.addEventListener("input",x),c.addEventListener("change",x);function z(){const c=e.querySelector("#publish-related"),C=e.querySelector("#publish-related-prompt"),M=e.querySelector("#publish-related-list");if(w=Ft(l(),s(L.value),p),w.length===0){c.classList.add("hidden");return}C.textContent=`Add ${w.length} body link(s) to related?`,M.innerHTML=w.map(_=>{var pe;const He=((pe=p.find(Ue=>Ue.slug===_))==null?void 0:pe.title)??_;return`<li><code>${I(_)}</code> — ${I(He)}</li>`}).join(""),c.classList.remove("hidden")}function De(){var C;if(w.length===0)return;const c=[...new Set([...s(L.value),...w])];L.value=c.join(", "),w=[],(C=e.querySelector("#publish-related"))==null||C.classList.add("hidden"),d()}(ee=e.querySelector("#publish-related-apply"))==null||ee.addEventListener("click",()=>{De()}),(te=e.querySelector("#publish-related-skip"))==null||te.addEventListener("click",()=>{var c;w=[],(c=e.querySelector("#publish-related"))==null||c.classList.add("hidden")});let W=null;function B(){o.classList.add("hidden"),W&&(document.removeEventListener("keydown",W),W=null)}function Re(){o.classList.remove("hidden"),W||(W=c=>{c.key==="Escape"&&B()},document.addEventListener("keydown",W))}function Z(){h.classList.add("hidden")}function Ne(){const c=e.querySelector("#view-md-content");c.textContent=l(),h.classList.remove("hidden")}async function We(){await b(),Re(),z();const c=e.querySelector("#publish-target"),C=e.querySelector("#publish-diff");c.textContent=`docs/.../${y.value}.md`,C.textContent="Loading diff…";try{const M=await Xe(n.id);M.targetPath&&(c.textContent=M.targetPath),C.textContent=M.diff}catch(M){C.textContent=M instanceof Error?M.message:"Diff unavailable"}}async function _e(){const c=e.querySelector("#ed-publish");c.setAttribute("aria-busy","true"),c.disabled=!0;try{await b();const{result:C}=await V(n.id);t.onPublished(C.path)}finally{c.removeAttribute("aria-busy"),c.disabled=!1}}(ne=e.querySelector("#ed-publish"))==null||ne.addEventListener("click",()=>{_e().catch(c=>{t.onError(c instanceof Error?c.message:"Publish failed")})}),(se=e.querySelector("#ed-publish-review"))==null||se.addEventListener("click",()=>{f.classList.add("hidden"),We().catch(c=>{t.onError(c instanceof Error?c.message:"Failed to prepare publish")})}),(re=e.querySelector("#ed-publish-menu-btn"))==null||re.addEventListener("click",()=>{var C;const c=f.classList.toggle("hidden");(C=e.querySelector("#ed-publish-menu-btn"))==null||C.setAttribute("aria-expanded",c?"false":"true")}),document.addEventListener("click",c=>{var M,_;const C=c.target;!f.contains(C)&&!((M=e.querySelector("#ed-publish-menu-btn"))!=null&&M.contains(C))&&(f.classList.add("hidden"),(_=e.querySelector("#ed-publish-menu-btn"))==null||_.setAttribute("aria-expanded","false"))}),(ie=e.querySelector("#ed-view-md"))==null||ie.addEventListener("click",()=>{Ne()}),(ae=e.querySelector("#view-md-close"))==null||ae.addEventListener("click",()=>{Z()}),h.addEventListener("click",c=>{c.target===h&&Z()}),(oe=e.querySelector("#view-md-copy"))==null||oe.addEventListener("click",()=>{navigator.clipboard.writeText(l()).catch(c=>{t.onError(c instanceof Error?c.message:"Copy failed")})}),(le=e.querySelector("#publish-cancel"))==null||le.addEventListener("click",()=>{B()}),o.addEventListener("click",c=>{c.target===o&&B()}),(de=e.querySelector("#publish-confirm"))==null||de.addEventListener("click",()=>{(async()=>{await b();const{result:c}=await V(n.id);B(),t.onPublished(c.path)})().catch(c=>{t.onError(c instanceof Error?c.message:"Publish failed")})}),(ue=e.querySelector("#ed-close"))==null||ue.addEventListener("click",()=>{i==null||i.destroy(),t.onClosed()}),(ce=e.querySelector("#ed-discard"))==null||ce.addEventListener("click",()=>{confirm("Discard this draft?")&&(i==null||i.destroy(),Je(n.id).then(()=>t.onDeleted()).catch(c=>{t.onError(c instanceof Error?c.message:"Delete failed")}))})}function I(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function we(e){const n=[];function t(r){r.indexPageSlug&&n.push(r.indexPageSlug);for(const p of r.children)p.kind==="page"?n.push(p.slug):t(p)}return t(e),n}function Ot(e){if(!(e instanceof HTMLElement))return!1;const n=e.tagName;return n==="INPUT"||n==="TEXTAREA"||n==="SELECT"?!0:e.isContentEditable}function Bt(e){const n=t=>{if(t.metaKey||t.ctrlKey||t.altKey)return;const r=Ot(t.target);if(t.key==="/"&&!r){t.preventDefault(),e.onFocusSearch();return}if(!r)switch(t.key){case"j":t.preventDefault(),e.onNext();break;case"k":t.preventDefault(),e.onPrev();break;case"e":e.onEdit();break}};return document.addEventListener("keydown",n),()=>document.removeEventListener("keydown",n)}const Me="repomind-tree-expanded";function Kt(){try{const e=localStorage.getItem(Me);return e?new Set(JSON.parse(e)):new Set([""])}catch{return new Set([""])}}function J(e){localStorage.setItem(Me,JSON.stringify([...e]))}function Gt(e){return e.emoji?e.emoji:"📁"}function zt(e,n){if(n==="json")return"{ }";if(n==="yaml")return"Y";const t=ct(e);return t.length===1?t:"📄"}function Jt(){document.querySelectorAll(".tree-context-menu").forEach(e=>e.remove())}function xe(e){const n=[e.relativePath];for(const t of e.children??[])t.kind==="folder"&&n.push(...xe(t));return n}function Se(){const e=window.prompt("Page name (without .md):");return e!=null&&e.trim()?e.trim():null}function be(e,n,t,r){nt(e,n,void 0,t).then(({draft:p})=>{var u,i;(u=r.onTreeChanged)==null||u.call(r),(i=r.onSelectDraft)==null||i.call(r,p)}).catch(p=>{var u;(u=r.onError)==null||u.call(r,p instanceof Error?p.message:"Create page failed")})}function Vt(e,n,t){var L,m,o,h,f,w;Jt();const{kind:r,parentPath:p,folderPath:u,page:i,tree:v,templates:$}=n,E=r==="page"&&i?xe(v).filter(s=>{const l=i.relativePath.includes("/")?i.relativePath.slice(0,i.relativePath.lastIndexOf("/")):"";return s!==l}):[],y=document.createElement("div");y.className="tree-create-menu tree-context-menu",y.innerHTML=`
203
+ <div class="tree-menu-label">Create</div>
204
+ <button type="button" data-action="page">New page</button>
205
+ ${$.map(s=>`<button type="button" data-action="template" data-template="${Ee(s.id)}">From template: ${U(s.label)}</button>`).join("")}
206
+ <button type="button" data-action="folder">New folder</button>
207
+ ${r==="folder"&&u?'<button type="button" data-action="emoji">Set emoji</button>':""}
208
+ ${r==="page"&&i?`
209
+ <div class="tree-menu-label">Page</div>
210
+ <button type="button" data-action="rename">Rename…</button>
211
+ ${E.length>0?'<div class="tree-menu-label">Move to</div>':""}
212
+ ${E.map(s=>`<button type="button" data-action="move" data-folder="${Ee(s)}">${U(s||"(root)")}</button>`).join("")}
213
+ <button type="button" data-action="delete-page" class="tree-menu-danger">Delete page</button>
214
+ `:""}
215
+ ${r==="folder"&&u?'<button type="button" data-action="delete-folder" class="tree-menu-danger">Delete folder</button>':""}
216
+ `;const P=e.getBoundingClientRect();y.style.top=`${P.bottom+4}px`,y.style.left=`${Math.max(8,P.left-160)}px`,document.body.appendChild(y);const S=()=>y.remove(),q=s=>{y.contains(s.target)||(S(),document.removeEventListener("click",q))};setTimeout(()=>document.addEventListener("click",q),0),(L=y.querySelector('[data-action="page"]'))==null||L.addEventListener("click",()=>{S();const s=Se();s&&be(p,s,void 0,t)}),y.querySelectorAll('[data-action="template"]').forEach(s=>{s.addEventListener("click",()=>{S();const l=Se();l&&be(p,l,s.dataset.template,t)})}),(m=y.querySelector('[data-action="folder"]'))==null||m.addEventListener("click",()=>{S();const s=window.prompt("Folder name:");s!=null&&s.trim()&&Qe(p,s.trim()).then(()=>{var l;return(l=t.onTreeChanged)==null?void 0:l.call(t)}).catch(l=>{var a;(a=t.onError)==null||a.call(t,l instanceof Error?l.message:"Create folder failed")})}),(o=y.querySelector('[data-action="emoji"]'))==null||o.addEventListener("click",()=>{S();const s=window.prompt("Emoji for this folder:");s!==null&&Ze(u,s).then(()=>{var l;return(l=t.onTreeChanged)==null?void 0:l.call(t)}).catch(l=>{var a;(a=t.onError)==null||a.call(t,l instanceof Error?l.message:"Set emoji failed")})}),(h=y.querySelector('[data-action="rename"]'))==null||h.addEventListener("click",()=>{var a;if(S(),!i)return;const s=((a=i.relativePath.split("/").pop())==null?void 0:a.replace(/\.md$/,""))??i.name,l=window.prompt("New page name (without .md):",s);!(l!=null&&l.trim())||l.trim()===s||et(i.relativePath,l.trim()).then(({result:g})=>{var d,b,x;(d=t.onTreeChanged)==null||d.call(t),g.cascadeUpdated.length>0?(b=t.onNotify)==null||b.call(t,`Renamed to ${g.slug}; updated links in ${g.cascadeUpdated.length} file(s).`):g.slugChanged&&g.inboundWarnings.length>0&&((x=t.onError)==null||x.call(t,`Renamed to ${g.slug}; ${g.inboundWarnings.length} page(s) may still reference the old slug.`)),t.onSelectSlug(g.slug)}).catch(g=>{var d;(d=t.onError)==null||d.call(t,g instanceof Error?g.message:"Rename failed")})}),y.querySelectorAll('[data-action="move"]').forEach(s=>{s.addEventListener("click",()=>{if(S(),!i)return;const l=s.dataset.folder??"";tt(i.relativePath,l).then(({result:a})=>{var g,d,b;(g=t.onTreeChanged)==null||g.call(t),a.cascadeUpdated.length>0?(d=t.onNotify)==null||d.call(t,`Moved to ${a.relativePath}; updated links in ${a.cascadeUpdated.length} file(s).`):a.slugChanged&&a.inboundWarnings.length>0&&((b=t.onError)==null||b.call(t,`Moved; slug is now ${a.slug}. ${a.inboundWarnings.length} page(s) still reference the old slug.`)),t.onSelectSlug(a.slug)}).catch(a=>{var g;(g=t.onError)==null||g.call(t,a instanceof Error?a.message:"Move failed")})})}),(f=y.querySelector('[data-action="delete-page"]'))==null||f.addEventListener("click",()=>{S(),i&&window.confirm(`Delete page "${i.title}"?`)&&fe(i.relativePath,"page").then(({result:s})=>{var l,a,g,d;(l=t.onFsDeleted)==null||l.call(t,[s.slug]),(a=t.onTreeChanged)==null||a.call(t),s.cascadeUpdated.length>0?(g=t.onNotify)==null||g.call(t,`Deleted ${s.slug}; cleaned links in ${s.cascadeUpdated.length} file(s).`):s.inboundWarnings.length>0&&((d=t.onError)==null||d.call(t,`${s.inboundWarnings.length} page(s) still reference deleted slug "${s.slug}".`))}).catch(s=>{var l;(l=t.onError)==null||l.call(t,s instanceof Error?s.message:"Delete failed")})}),(w=y.querySelector('[data-action="delete-folder"]'))==null||w.addEventListener("click",()=>{S(),u&&window.confirm(`Delete folder "${u}" and all pages inside?`)&&fe(u,"folder").then(({result:s})=>{var l,a,g,d;(l=t.onFsDeleted)==null||l.call(t,s.deletedSlugs),(a=t.onTreeChanged)==null||a.call(t),s.cascadeUpdated.length>0?(g=t.onNotify)==null||g.call(t,`Deleted folder; cleaned links in ${s.cascadeUpdated.length} file(s).`):s.inboundWarnings.length>0&&((d=t.onError)==null||d.call(t,`${s.inboundWarnings.length} page(s) still reference deleted page(s).`))}).catch(s=>{var l;(l=t.onError)==null||l.call(t,s instanceof Error?s.message:"Delete folder failed")})})}function Xt(e,n,t,r){var m;e.innerHTML=`
217
+ <nav id="docs-tree" class="docs-tree" aria-label="Documentation tree"></nav>
218
+ <section class="catalog-section catalog-drafts">
219
+ <button type="button" class="catalog-header" data-catalog="__drafts__" aria-expanded="true">
220
+ <span class="catalog-chevron" aria-hidden="true">▾</span>
221
+ <span class="catalog-icon catalog-icon--draft" aria-hidden="true">✎</span>
222
+ <span class="catalog-label">Drafts</span>
223
+ <span class="catalog-count">${t.length}</span>
224
+ </button>
225
+ <ul id="draft-list" class="catalog-pages"></ul>
226
+ </section>
227
+ `;const p=e.querySelector("#docs-tree"),u=e.querySelector("#draft-list"),i=Kt();let v=null,$=null,E=null;async function y(o,h){var f;try{v||(v=(await Ye()).templates),Vt(o,{...h,templates:v},r)}catch(w){(f=r.onError)==null||f.call(r,w instanceof Error?w.message:"Failed to open menu")}}function P(o,h){var s,l;const f=document.createElement("div");f.className="tree-row",f.style.paddingLeft=`${h*12+8}px`,o.slug===$&&f.classList.add("active"),f.innerHTML=`
228
+ <span class="tree-spacer" aria-hidden="true"></span>
229
+ <button type="button" class="tree-label">
230
+ <span class="tree-icon tree-icon--page">${zt(o.type,o.contentKind)}</span>
231
+ <span class="tree-title">${U(o.title)}</span>
232
+ </button>
233
+ <button type="button" class="tree-menu" title="Actions">⋯</button>
234
+ `;const w=o.relativePath.includes("/")?o.relativePath.slice(0,o.relativePath.lastIndexOf("/")):"";return(s=f.querySelector(".tree-menu"))==null||s.addEventListener("click",a=>{a.stopPropagation(),y(a.currentTarget,{kind:"page",parentPath:w,folderPath:w,page:o,tree:n})}),(l=f.querySelector(".tree-label"))==null||l.addEventListener("click",()=>{$=o.slug,E=null,q(),L(),r.onSelectSlug(o.slug)}),f}function S(o,h){var l,a,g;const f=document.createElement("div");f.className="tree-folder";const w=i.has(o.relativePath),s=document.createElement("div");if(s.className="tree-row",s.style.paddingLeft=`${h*12+8}px`,s.innerHTML=`
235
+ <button type="button" class="tree-toggle" aria-expanded="${w}">${w?"▾":"▸"}</button>
236
+ <button type="button" class="tree-label">
237
+ <span class="tree-icon tree-icon--folder">${Gt(o)}</span>
238
+ <span class="tree-title">${U(o.name)}</span>
239
+ </button>
240
+ <button type="button" class="tree-menu" title="Actions">⋯</button>
241
+ `,(l=s.querySelector(".tree-toggle"))==null||l.addEventListener("click",d=>{d.stopPropagation(),i.has(o.relativePath)?i.delete(o.relativePath):i.add(o.relativePath),J(i),q()}),(a=s.querySelector(".tree-label"))==null||a.addEventListener("click",()=>{if(o.indexPageSlug){$=o.indexPageSlug,E=null,q(),L(),r.onSelectSlug(o.indexPageSlug);return}i.has(o.relativePath)?i.delete(o.relativePath):i.add(o.relativePath),J(i),q()}),(g=s.querySelector(".tree-menu"))==null||g.addEventListener("click",d=>{d.stopPropagation(),y(d.currentTarget,{kind:"folder",parentPath:o.relativePath,folderPath:o.relativePath,tree:n})}),f.appendChild(s),w){const d=document.createElement("div");d.className="tree-children";for(const b of o.children??[])b.kind==="folder"?d.appendChild(S(b,h+1)):d.appendChild(P(b,h+1));f.appendChild(d)}return f}function q(){p.innerHTML="",p.appendChild(S(n,0))}function L(){if(u.innerHTML="",t.length===0){u.innerHTML='<li class="placeholder page-item">No drafts</li>';return}for(const o of t){const h=document.createElement("li");h.className="page-item",o.id===E&&h.classList.add("active"),h.innerHTML=`<span class="page-title">${U(o.title||o.slug)}</span><span class="status-chip status-draft">draft</span>`,h.addEventListener("click",()=>{var f;E=o.id,$=null,q(),L(),(f=r.onSelectDraft)==null||f.call(r,o)}),u.appendChild(h)}}q(),L(),(m=e.querySelector('[data-catalog="__drafts__"]'))==null||m.addEventListener("click",()=>{const o=e.querySelector("#draft-list"),h=e.querySelector('[data-catalog="__drafts__"]'),f=(o==null?void 0:o.classList.toggle("hidden"))===!1;h==null||h.setAttribute("aria-expanded",String(f));const w=h==null?void 0:h.querySelector(".catalog-chevron");w&&(w.textContent=f?"▾":"▸")}),e.setActiveSlug=o=>{$=o,E=null,i.add(""),J(i),q(),L()},e.setActiveDraft=o=>{E=o,$=null,q(),L()},e.refreshDrafts=o=>{t.length=0,t.push(...o),L();const h=e.querySelector(".catalog-drafts .catalog-count");h&&(h.textContent=String(t.length))},e.refreshTree=(o,h)=>{n.children=o.children??[],n.emoji=o.emoji,n.indexPageSlug=o.indexPageSlug,n.name=o.name,t.length=0,t.push(...h??[]),q(),L()}}function U(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function Ee(e){return U(e)}function Yt(e){const n=new EventSource("/api/events");return n.onmessage=()=>{e()},()=>{n.close()}}kt();st();function Qt(e){return new Map(e.map(n=>[n.relativePath,n.slug]))}function Zt(e,n){var t;return(t=e.find(r=>r.slug===n))==null?void 0:t.relativePath}function k(e,n=!1){const t=document.querySelector("#banner");t&&(t.textContent=e,t.classList.toggle("error",n),t.classList.remove("hidden"),setTimeout(()=>t.classList.add("hidden"),5e3))}async function en(e){var t;const{drafts:n}=await O();return(t=e.refreshDrafts)==null||t.call(e,n),n}async function tn(){var w;rt(document.querySelector("#theme-toggle"));const e=document.querySelector("#sidebar"),n=document.querySelector("#workspace"),t=document.querySelector("#health-toggle"),r=document.querySelector("#stats"),p=document.querySelector("#global-search"),u=document.querySelector("#search-dropdown");let i=[],v=null,$=[],E="workspace",y=null,P=null;async function S(s){var g;const[{tree:l},{drafts:a}]=await Promise.all([ge(),O()]);return(g=s.refreshTree)==null||g.call(s,l,a),$=we(l),l}function q(s){if(E=s,t.setAttribute("aria-pressed",String(s==="dashboard")),s==="dashboard"){y=pt(n,{onOpenDraft:a=>{q("workspace"),o(a)},onPublished:a=>{(async()=>(await S(e),await L(),k(`Published: ${a}`)))()},onNotify:(a,g)=>k(a,g)}).refresh;return}y=null,D(n,null)}t.addEventListener("click",()=>{q(E==="dashboard"?"workspace":"dashboard")}),Bt({onNext:()=>{if(E!=="workspace"||!v)return;const s=$.indexOf(v);s>=0&&s<$.length-1&&f($[s+1])},onPrev:()=>{if(E!=="workspace"||!v)return;const s=$.indexOf(v);s>0&&f($[s-1])},onFocusSearch:()=>{p.focus(),p.select()},onEdit:()=>{E==="workspace"&&v&&h(v)}});async function L(){const s=await ot(),a=await(await fetch("/api/stats")).json(),{drafts:g}=await O(),d=a.brokenRelatedCount>0?` · ${a.brokenRelatedCount} broken links`:"";r.textContent=`v${s.version} · ${s.docCount} pages · ${g.length} drafts${d}`}function m(s){if(s.length===0){u.innerHTML='<p class="search-empty">No matches</p>',u.classList.remove("hidden");return}const l=document.createElement("ul");l.className="search-results";for(const a of s){const g=i.find(b=>b.slug===a.slug),d=document.createElement("li");d.innerHTML=`
242
+ <div class="search-result-title">${a.title}</div>
243
+ <div class="search-result-meta">${G((g==null?void 0:g.type)??"")} · ${a.snippet}</div>
244
+ `,d.addEventListener("click",()=>{u.classList.add("hidden"),p.value="",f(a.slug)}),l.appendChild(d)}u.innerHTML="",u.appendChild(l),u.classList.remove("hidden")}p.addEventListener("input",()=>{const s=p.value.trim();if(P&&clearTimeout(P),!s){u.classList.add("hidden"),u.innerHTML="";return}P=setTimeout(()=>{it(s).then(({results:l})=>m(l)).catch(l=>k(l instanceof Error?l.message:"Search failed",!0))},300)}),document.addEventListener("click",s=>{!u.contains(s.target)&&s.target!==p&&u.classList.add("hidden")});function o(s){var l;q("workspace"),(l=e.setActiveDraft)==null||l.call(e,s.id),It(n,s,{onPublished:a=>{(async()=>(i=(await F()).docs,await S(e),await L(),y==null||y(),k(`Published: ${a}`),await f(s.slug)))()},onClosed:()=>{f(s.forked_from??s.slug).catch(()=>{D(n,null)})},onDeleted:()=>{(async()=>(await S(e),D(n,null)))()},onError:a=>k(a,!0)},i)}async function h(s){try{const{draft:l}=await lt(s);await en(e),o(l)}catch(l){k(l instanceof Error?l.message:"Edit failed",!0)}}async function f(s,l={}){var d;const a=l.updateUrl??!0,g=l.urlMode??"push";E==="dashboard"&&q("workspace"),v=s,(d=e.setActiveSlug)==null||d.call(e,s);try{const b=await at(s),x=Zt(i,s);D(n,b,{onEdit:z=>{h(z)},docRelativePath:x,slugByRelative:Qt(i),onCopyLink:()=>k("Link copied")}),a&&Mt(s,g)}catch(b){k(b instanceof Error?b.message:"Failed to load doc",!0)}}n.addEventListener("navigate-slug",(s=>{f(s.detail.slug)}));try{await L();const[s,{tree:l},{drafts:a}]=await Promise.all([F(),ge(),O()]);i=s.docs,$=we(l),Xt(e,l,a,{onSelectSlug:d=>{f(d)},onSelectDraft:d=>o(d),onTreeChanged:()=>{(async()=>(i=(await F()).docs,await S(e),await L()))()},onFsDeleted:d=>{(async()=>(i=(await F()).docs,v&&d.includes(v)&&(v=null,D(n,null)),await S(e),await L()))()},onError:d=>k(d,!0),onNotify:d=>k(d)}),Yt(()=>{(async()=>{try{i=(await F()).docs,await S(e),await L(),v&&!i.some(b=>b.slug===v)&&(v=null,D(n,null))}catch{}})()}),xt(d=>{if(!d){v=null,D(n,null);return}i.some(b=>b.slug===d)&&f(d,{updateUrl:!1})}),D(n,null);const g=Q();if(g)i.some(d=>d.slug===g)?await f(g,{updateUrl:!1}):k(`Unknown page: ${g}`,!0);else{const d=Tt(),b=d?(w=i.find(x=>x.relativePath===d))==null?void 0:w.slug:void 0;d&&b?await f(b,{updateUrl:!1}):d?k(`Unknown path: ${d}`,!0):l.indexPageSlug?await f(l.indexPageSlug,{urlMode:"replace"}):i.length>0&&i[0]&&await f(i[0].slug,{urlMode:"replace"})}}catch(s){k(s instanceof Error?s.message:"Failed to load workspace",!0)}}tn();export{$e as _,an as a,rn as f,Ce as p};