@justyork/repo-mind 0.8.1 → 0.9.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 (92) hide show
  1. package/README.md +29 -2
  2. package/dist/ask/ask.d.ts +7 -0
  3. package/dist/ask/ask.js +68 -0
  4. package/dist/ask/citations.d.ts +6 -0
  5. package/dist/ask/citations.js +40 -0
  6. package/dist/ask/config.d.ts +9 -0
  7. package/dist/ask/config.js +19 -0
  8. package/dist/ask/llm.d.ts +8 -0
  9. package/dist/ask/llm.js +110 -0
  10. package/dist/ask/prompt.d.ts +5 -0
  11. package/dist/ask/prompt.js +39 -0
  12. package/dist/ask/retrieve.d.ts +4 -0
  13. package/dist/ask/retrieve.js +38 -0
  14. package/dist/ask/search.d.ts +7 -0
  15. package/dist/ask/search.js +232 -0
  16. package/dist/ask/small-talk.d.ts +2 -0
  17. package/dist/ask/small-talk.js +35 -0
  18. package/dist/ask/suggestions.d.ts +12 -0
  19. package/dist/ask/suggestions.js +145 -0
  20. package/dist/ask/types.d.ts +27 -0
  21. package/dist/ask/types.js +1 -0
  22. package/dist/cli.js +6 -1
  23. package/dist/commands/export.d.ts +2 -0
  24. package/dist/commands/export.js +6 -4
  25. package/dist/commands/ui.js +6 -0
  26. package/dist/env/load-repomind-env.d.ts +10 -0
  27. package/dist/env/load-repomind-env.js +96 -0
  28. package/dist/ui/api-handlers.d.ts +1 -0
  29. package/dist/ui/api-handlers.js +84 -0
  30. package/dist/ui/draft-api.js +2 -2
  31. package/dist/ui/server.js +6 -1
  32. package/package.json +2 -1
  33. package/ui/dist/assets/{arc-BitGDA7a.js → arc-BN7_EkMD.js} +1 -1
  34. package/ui/dist/assets/{architectureDiagram-3BPJPVTR-BmY2OtU5.js → architectureDiagram-3BPJPVTR-B8enQ17Y.js} +1 -1
  35. package/ui/dist/assets/{blockDiagram-GPEHLZMM-btai_20t.js → blockDiagram-GPEHLZMM-BnmnlgNm.js} +1 -1
  36. package/ui/dist/assets/{c4Diagram-AAUBKEIU-CN-pXtFe.js → c4Diagram-AAUBKEIU-DoP4UJAJ.js} +1 -1
  37. package/ui/dist/assets/channel-DqyPrNMh.js +1 -0
  38. package/ui/dist/assets/{chunk-2J33WTMH-CUgwCKKP.js → chunk-2J33WTMH-Bls2Xdkl.js} +1 -1
  39. package/ui/dist/assets/{chunk-4BX2VUAB-ZXi72_qf.js → chunk-4BX2VUAB-DCIvYWrM.js} +1 -1
  40. package/ui/dist/assets/{chunk-55IACEB6-BvoNhEcH.js → chunk-55IACEB6-BZCrHrSY.js} +1 -1
  41. package/ui/dist/assets/{chunk-727SXJPM-CPVv-LcP.js → chunk-727SXJPM-CyTz7y8e.js} +1 -1
  42. package/ui/dist/assets/{chunk-AQP2D5EJ-15HMmfKe.js → chunk-AQP2D5EJ-kOonrdhC.js} +1 -1
  43. package/ui/dist/assets/{chunk-FMBD7UC4-CTJu1mOO.js → chunk-FMBD7UC4-BVCWYiIY.js} +1 -1
  44. package/ui/dist/assets/{chunk-ND2GUHAM-BaS37xMv.js → chunk-ND2GUHAM-CiV-9tNZ.js} +1 -1
  45. package/ui/dist/assets/{chunk-QZHKN3VN-CzNZR3D9.js → chunk-QZHKN3VN-DAimc2AE.js} +1 -1
  46. package/ui/dist/assets/classDiagram-4FO5ZUOK-CwifX_Y1.js +1 -0
  47. package/ui/dist/assets/classDiagram-v2-Q7XG4LA2-CwifX_Y1.js +1 -0
  48. package/ui/dist/assets/{cose-bilkent-S5V4N54A-mpC0WnuY.js → cose-bilkent-S5V4N54A-B4yubD-y.js} +1 -1
  49. package/ui/dist/assets/{dagre-BM42HDAG-DVbZMTFr.js → dagre-BM42HDAG-EoElLLGl.js} +1 -1
  50. package/ui/dist/assets/{diagram-2AECGRRQ-BvYsIaeC.js → diagram-2AECGRRQ-Df9wv121.js} +1 -1
  51. package/ui/dist/assets/{diagram-5GNKFQAL-mM_4t2hT.js → diagram-5GNKFQAL-Ck5dW8ww.js} +1 -1
  52. package/ui/dist/assets/{diagram-KO2AKTUF-u5t0FZtc.js → diagram-KO2AKTUF-DQqRKGqm.js} +1 -1
  53. package/ui/dist/assets/{diagram-LMA3HP47-Ngnghl4t.js → diagram-LMA3HP47-Dua6RRw8.js} +1 -1
  54. package/ui/dist/assets/{diagram-OG6HWLK6-DxCLvBmh.js → diagram-OG6HWLK6-B3Ogt3zv.js} +1 -1
  55. package/ui/dist/assets/{erDiagram-TEJ5UH35-Cblf5xKO.js → erDiagram-TEJ5UH35-BYdkXgPm.js} +1 -1
  56. package/ui/dist/assets/{flowDiagram-I6XJVG4X-3aVBpTd3.js → flowDiagram-I6XJVG4X-DxwAsXVj.js} +1 -1
  57. package/ui/dist/assets/{ganttDiagram-6RSMTGT7-CCk8vbkn.js → ganttDiagram-6RSMTGT7-CkvGosG3.js} +1 -1
  58. package/ui/dist/assets/{gitGraphDiagram-PVQCEYII-DLUIS6md.js → gitGraphDiagram-PVQCEYII-xeD8b-c2.js} +1 -1
  59. package/ui/dist/assets/{graph-DwaX8nDF.js → graph-D1eDjihg.js} +1 -1
  60. package/ui/dist/assets/{infoDiagram-5YYISTIA-C6umdFYV.js → infoDiagram-5YYISTIA-CZX2wTOb.js} +1 -1
  61. package/ui/dist/assets/{ishikawaDiagram-YF4QCWOH-H8wERm8_.js → ishikawaDiagram-YF4QCWOH-B97H92r3.js} +1 -1
  62. package/ui/dist/assets/{journeyDiagram-JHISSGLW-DnTRQ6Mn.js → journeyDiagram-JHISSGLW-Djcx9Sr4.js} +1 -1
  63. package/ui/dist/assets/{kanban-definition-UN3LZRKU-DrVEsZSL.js → kanban-definition-UN3LZRKU-DGmylaB2.js} +1 -1
  64. package/ui/dist/assets/main-B3H8-mmv.js +365 -0
  65. package/ui/dist/assets/{mermaid.core-BtOBEW5j.js → mermaid.core-CkbXj8L9.js} +4 -4
  66. package/ui/dist/assets/{mindmap-definition-RKZ34NQL-BFEjh9BY.js → mindmap-definition-RKZ34NQL-BxiFVhcQ.js} +1 -1
  67. package/ui/dist/assets/{pieDiagram-4H26LBE5-KLu3myN4.js → pieDiagram-4H26LBE5-CIAMX7m1.js} +1 -1
  68. package/ui/dist/assets/{quadrantDiagram-W4KKPZXB-DwSP1nfl.js → quadrantDiagram-W4KKPZXB-BjcX-J56.js} +1 -1
  69. package/ui/dist/assets/{requirementDiagram-4Y6WPE33-CTe59AWj.js → requirementDiagram-4Y6WPE33-DDYZmURd.js} +1 -1
  70. package/ui/dist/assets/{sankeyDiagram-5OEKKPKP-DBG4pZal.js → sankeyDiagram-5OEKKPKP-Dp3WtUXa.js} +1 -1
  71. package/ui/dist/assets/{sequenceDiagram-3UESZ5HK-BV9E_Iae.js → sequenceDiagram-3UESZ5HK-DQALrsRY.js} +1 -1
  72. package/ui/dist/assets/{stateDiagram-AJRCARHV-BWnAUqpA.js → stateDiagram-AJRCARHV-Bi2QeigX.js} +1 -1
  73. package/ui/dist/assets/stateDiagram-v2-BHNVJYJU-pbZREyTr.js +1 -0
  74. package/ui/dist/assets/theme-CROa1dkI.js +21 -0
  75. package/ui/dist/assets/theme-CiCs9Mn_.css +1 -0
  76. package/ui/dist/assets/{timeline-definition-PNZ67QCA-DDoGl25M.js → timeline-definition-PNZ67QCA-C8K5LzbR.js} +1 -1
  77. package/ui/dist/assets/{vennDiagram-CIIHVFJN-DVRPIJjW.js → vennDiagram-CIIHVFJN-Bf0WkuCL.js} +1 -1
  78. package/ui/dist/assets/visual-editor-B6GUowO4.js +177 -0
  79. package/ui/dist/assets/{wardley-L42UT6IY-Li08EMdE.js → wardley-L42UT6IY-R45K8ohg.js} +1 -1
  80. package/ui/dist/assets/{wardleyDiagram-YWT4CUSO-BA2E9m1f.js → wardleyDiagram-YWT4CUSO-CZNd6CHT.js} +1 -1
  81. package/ui/dist/assets/{xychartDiagram-2RQKCTM6-DKHRvUg5.js → xychartDiagram-2RQKCTM6-ClCu9u0t.js} +1 -1
  82. package/ui/dist/graph.html +14 -3
  83. package/ui/dist/index.html +14 -3
  84. package/ui/dist/theme-boot.js +16 -0
  85. package/ui/dist/assets/channel-D1plp4bS.js +0 -1
  86. package/ui/dist/assets/classDiagram-4FO5ZUOK-BsDWU9KJ.js +0 -1
  87. package/ui/dist/assets/classDiagram-v2-Q7XG4LA2-BsDWU9KJ.js +0 -1
  88. package/ui/dist/assets/main-C0Y60ppL.js +0 -269
  89. package/ui/dist/assets/stateDiagram-v2-BHNVJYJU-yNXWOXzs.js +0 -1
  90. package/ui/dist/assets/theme-CfkLgQFf.js +0 -21
  91. package/ui/dist/assets/theme-DJYNWCef.css +0 -1
  92. package/ui/dist/assets/visual-editor-COzWiJ8C.js +0 -220
@@ -0,0 +1,365 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/visual-editor-B6GUowO4.js","assets/editor-CTtDusro.js","assets/theme-CROa1dkI.js","assets/theme-CiCs9Mn_.css","assets/mermaid.core-CkbXj8L9.js","assets/transform-BwXaE9hv.js"])))=>i.map(i=>d[i]);
2
+ import{p as Ut,s as Bt,c as jt,d as Kt,f as zt,l as X,h as Gt,j as Vt,k as ve,m as Jt,n as Xt,o as Yt,q as Qt,r as dt,t as Zt,v as en,w as tn,x as nn,y as sn,z as Oe,A as rn,B as an,C as on,i as ln,e as dn,b as cn,D as un,E as j,F as Ue,G as Q,g as pn}from"./theme-CROa1dkI.js";import{m as ct}from"./editor-CTtDusro.js";const fn={"wiki-page":"Wiki",adr:"ADR","feature-spec":"Feature specs","glossary-term":"Glossary","open-question":"Open questions","agent-instruction":"Agent instructions"},Be="folder:";function be(e){if(e.startsWith(Be)){const t=e.slice(Be.length);return t==="__root__"?"General":t.split(/[-_/]/).map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join(" ")}return fn[e]??e}function gn(e,t){var S,m,P,k;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-export.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 n=e.querySelector("#dash-check"),s=e.querySelector("#dash-links"),r=e.querySelector("#dash-unprepared"),i=e.querySelector("#dash-queue");function l(d){const u=d.ok?"check-ok":"check-fail",a=d.ok?"All checks passed":`${d.violations.length} issue(s)`;let o=`
26
+ <h2>Schema check</h2>
27
+ <p class="check-status ${u}">${a}</p>
28
+ `;if(d.violations.length>0){o+='<ul class="violation-list">';for(const p of d.violations)o+=`<li><code>${I(p.path)}</code> — ${I(p.message)}</li>`;o+="</ul>"}if(d.warnings.length>0){o+='<h3 class="warnings-title">Warnings</h3><ul class="warning-list">';for(const p of d.warnings)o+=`<li>${I(p)}</li>`;o+="</ul>"}n.innerHTML=o}function c(d){let u=`
29
+ <h2>Link health</h2>
30
+ <div class="link-health-stats">
31
+ <div class="link-health-stat"><span class="link-health-value">${d.orphanCount}</span> orphans</div>
32
+ <div class="link-health-stat"><span class="link-health-value">${d.brokenCount}</span> broken</div>
33
+ <div class="link-health-stat"><span class="link-health-value">${d.oneWayCount}</span> one-way</div>
34
+ </div>
35
+ `;if(d.brokenTargets.length>0){u+='<h3 class="warnings-title">Broken targets</h3><ul class="warning-list">';for(const a of d.brokenTargets)u+=`<li><code>${I(a)}</code></li>`;u+="</ul>"}if(d.orphanSlugs.length>0){u+='<h3 class="warnings-title">Orphan pages</h3><ul class="warning-list">';for(const a of d.orphanSlugs)u+=`<li><code>${I(a)}</code></li>`;u+="</ul>"}s.innerHTML=u}function h(d){var u;if(r.innerHTML="",d.length===0){r.innerHTML='<li class="placeholder">All docs have frontmatter</li>';return}for(const a of d){const o=document.createElement("li");o.className="queue-item",o.innerHTML=`
36
+ <div class="queue-main">
37
+ <div class="queue-title">${I(a.relativePath)}</div>
38
+ <div class="meta">${I(a.suggestedType)} · slug: ${I(a.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
+ `,(u=o.querySelector('[data-action="prepare"]'))==null||u.addEventListener("click",()=>{Vt(a.relativePath,a.suggestedType).then(({result:p})=>{t.onNotify(`Prepared: ${p.slug}`),g()}).catch(p=>{t.onNotify(p instanceof Error?p.message:"Prepare failed",!0)})}),r.appendChild(o)}}function f(d){var u,a;if(i.innerHTML="",d.length===0){i.innerHTML='<li class="placeholder">No drafts in queue</li>';return}for(const o of d){const p=document.createElement("li");p.className="queue-item",p.innerHTML=`
44
+ <div class="queue-main">
45
+ <div class="queue-title">${I(o.title||o.slug)}</div>
46
+ <div class="meta">${I(o.slug)} · ${I(o.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
+ `,(u=p.querySelector('[data-action="edit"]'))==null||u.addEventListener("click",()=>{t.onOpenDraft(o)}),(a=p.querySelector('[data-action="publish"]'))==null||a.addEventListener("click",()=>{ve(o.id).then(({result:b})=>{t.onPublished(b.path),g()}).catch(b=>{t.onNotify(b instanceof Error?b.message:"Publish failed",!0)})}),i.appendChild(p)}}async function g(){try{const[d,u,{drafts:a},{files:o}]=await Promise.all([Kt(),zt(),X(),Gt()]);l(d),c(u),h(o),f(a)}catch(d){n.innerHTML=`<p class="check-status check-fail">${I(d instanceof Error?d.message:"Failed to load")}</p>`}}return(S=e.querySelector("#dash-refresh"))==null||S.addEventListener("click",()=>{g()}),(m=e.querySelector("#dash-prepare-all"))==null||m.addEventListener("click",()=>{Ut().then(({result:d})=>{t.onNotify(`Prepared ${d.prepared.length} file(s)`),g()}).catch(d=>{t.onNotify(d instanceof Error?d.message:"Prepare all failed",!0)})}),(P=e.querySelector("#dash-sync-links"))==null||P.addEventListener("click",()=>{Bt().then(({result:d})=>{const u=d.files.filter(a=>a.changed).length;t.onNotify(`Synced links in ${u} file(s)`),g()}).catch(d=>{t.onNotify(d instanceof Error?d.message:"Sync links failed",!0)})}),(k=e.querySelector("#dash-export"))==null||k.addEventListener("click",()=>{jt().then(({path:d})=>{t.onNotify(`Exported ${d}`)}).catch(d=>{t.onNotify(d instanceof Error?d.message:"Export failed",!0)})}),g(),{refresh:g}}function I(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}const ut="repomind-page-info-hidden";function x(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function ie(){try{const e=localStorage.getItem(ut);return e===null?!0:e==="true"}catch{return!0}}function pt(e){try{localStorage.setItem(ut,e?"true":"false")}catch{}}function hn(e){return e.map((t,n)=>{const s=n>0?'<span class="crumb-sep">›</span>':"";return t.current?`${s}<span class="crumb current">${x(t.label)}</span>`:t.crumbId?`${s}<button type="button" class="crumb" data-crumb="${x(t.crumbId)}">${x(t.label)}</button>`:`${s}<span class="crumb">${x(t.label)}</span>`}).join("")}function we(e,t){const n=t.focusMode??ie();e.className=t.rootClass??"workspace-main",e.innerHTML=`
53
+ <nav class="breadcrumb" aria-label="Breadcrumb">
54
+ ${hn(t.breadcrumbs)}
55
+ </nav>
56
+ <div class="page-layout${n?" page-layout--focus":""}">
57
+ <article class="page-content">
58
+ <header class="page-header">
59
+ <div class="page-title-slot">${t.titleHtml}</div>
60
+ <div class="workspace-actions">${t.actionsHtml}</div>
61
+ </header>
62
+ <div class="page-body-slot">${t.mainHtml}</div>
63
+ </article>
64
+ <aside class="page-info">${t.railHtml}</aside>
65
+ </div>
66
+ `;const s=e.querySelector(".page-layout");return{pageLayout:s,bodySlot:e.querySelector(".page-body-slot"),railSlot:e.querySelector(".page-info"),setFocusMode(r){s.classList.toggle("page-layout--focus",r),pt(r)}}}function Se(e,t,n){const s=e.querySelector("#toggle-focus"),r=e.querySelector(".page-layout");!s||!r||(r.classList.toggle("page-layout--focus",t),s.setAttribute("aria-pressed",String(t)),s.textContent=t?"Show info":"Hide info",s.addEventListener("click",()=>{const i=!r.classList.contains("page-layout--focus");r.classList.toggle("page-layout--focus",i),pt(i),s.setAttribute("aria-pressed",String(i)),s.textContent=i?"Show info":"Hide info"}))}function mn(e,t){e.querySelectorAll(".breadcrumb [data-crumb]").forEach(n=>{n.addEventListener("click",()=>{const s=n.dataset.crumb;s&&t[s]&&t[s]()})})}const ft=/\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/g;function gt(e,t){const n=e.trim(),s=((t==null?void 0:t.trim())||n).trim();return{display:n,slug:s}}function _s(e,t){const n=e.trim(),s=(t??n).trim();return s===n?`[[${n}]]`:`[[${n}|${s}]]`}function vn(e){const t=[];for(const n of e.matchAll(ft)){const{slug:s}=gt(n[1]??"",n[2]);s&&t.push(s)}return t}function yn(e){return vn(e)}function bn(e,t){const n=t.find(i=>i.slug===e);if(n)return n.slug;const s=e.toLowerCase(),r=t.find(i=>i.title.toLowerCase()===s);return(r==null?void 0:r.slug)??null}function wn(e,t,n){const s=new Set(t),r=[];for(const i of yn(e)){const l=bn(i,n);!l||s.has(l)||r.includes(l)||r.push(l)}return r}function Sn(e,t,n){const s=e.toLowerCase();if(!s)return 1;const r=t.toLowerCase(),i=n.toLowerCase();return r.startsWith(s)||i.startsWith(s)?3:r.includes(s)||i.includes(s)?2:0}function En(e,t,n=12){return t.map(s=>({doc:s,score:Sn(e,s.slug,s.title)})).filter(s=>s.score>0).sort((s,r)=>r.score-s.score||s.doc.slug.localeCompare(r.doc.slug)).slice(0,n).map(s=>s.doc)}const Ln=["adr","feature-spec","glossary-term","open-question","agent-instruction","wiki-page"],kn=["draft","proposed","accepted","superseded"];function ht(e){return`
67
+ <h2 class="page-info-title">Page properties</h2>
68
+ <div class="workspace-badges editor-badges">
69
+ <span class="badge badge-draft">draft</span>
70
+ ${e.forkedFrom?`<span class="badge">fork: ${x(e.forkedFrom)}</span>`:""}
71
+ </div>
72
+ <div class="props-section">
73
+ <div class="props-label">Status</div>
74
+ <div class="props-chip-row">
75
+ <button type="button" id="ed-status-chip" class="status-chip props-chip-trigger" aria-haspopup="listbox"></button>
76
+ <div id="ed-status-menu" class="props-dropdown hidden" role="listbox"></div>
77
+ </div>
78
+ </div>
79
+ <div class="props-section">
80
+ <div class="props-label">Type</div>
81
+ <div class="props-chip-row">
82
+ <button type="button" id="ed-type-chip" class="props-chip props-chip-trigger" aria-haspopup="listbox"></button>
83
+ <div id="ed-type-menu" class="props-dropdown hidden" role="listbox"></div>
84
+ </div>
85
+ <div class="props-hint" id="ed-catalog-hint"></div>
86
+ </div>
87
+ <div class="props-section">
88
+ <div class="props-label">Slug</div>
89
+ <input id="ed-slug" class="props-slug-input" spellcheck="false" />
90
+ <div class="props-hint props-hint-slug hidden" id="ed-slug-hint"></div>
91
+ </div>
92
+ <div class="props-section">
93
+ <div class="props-label">Tags</div>
94
+ <div id="ed-tags-chips" class="props-chip-list"></div>
95
+ <input id="ed-tags-input" class="props-add-input" placeholder="Add tag…" />
96
+ </div>
97
+ <div class="props-section">
98
+ <div class="props-label">Related</div>
99
+ <div id="ed-related-chips" class="props-chip-list"></div>
100
+ <input id="ed-related-input" class="props-add-input" placeholder="Add related slug…" autocomplete="off" />
101
+ <div id="ed-related-menu" class="props-dropdown hidden" role="listbox"></div>
102
+ </div>
103
+ `}function $n(e,t,n,s){const r=e.querySelector("#ed-slug"),i=e.querySelector("#ed-slug-hint"),l=e.querySelector("#ed-status-chip"),c=e.querySelector("#ed-status-menu"),h=e.querySelector("#ed-type-chip"),f=e.querySelector("#ed-type-menu"),g=e.querySelector("#ed-catalog-hint"),S=e.querySelector("#ed-tags-chips"),m=e.querySelector("#ed-tags-input"),P=e.querySelector("#ed-related-chips"),k=e.querySelector("#ed-related-input"),d=e.querySelector("#ed-related-menu");let u=[...t.tags],a=[...t.related],o=t.status,p=t.type;r.value=t.slug,t.forkedFrom&&(r.readOnly=!0,r.title="Slug is fixed for edits of an existing published page",i.textContent=`Locked while editing published page (${t.forkedFrom})`,i.classList.remove("hidden")),E(),q(),$(),T();function b(){s()}function E(){l.textContent=o,l.className=`status-chip props-chip-trigger status-${o}`,c.innerHTML=kn.map(v=>`<button type="button" class="props-dropdown-item" data-value="${v}" role="option">${v}</button>`).join("")}function q(){h.textContent=p,g.textContent=be(p),f.innerHTML=Ln.map(v=>`<button type="button" class="props-dropdown-item" data-value="${v}" role="option">${v}</button>`).join("")}function $(){S.innerHTML=u.map(v=>`<span class="tag-chip props-removable-chip">${x(v)}<button type="button" class="chip-remove" data-tag="${x(v)}" aria-label="Remove tag">×</button></span>`).join(""),S.querySelectorAll(".chip-remove").forEach(v=>{v.addEventListener("click",()=>{const L=v.dataset.tag;u=u.filter(D=>D!==L),$(),b()})})}function T(){P.innerHTML=a.map(v=>`<span class="related-chip props-removable-chip">${x(v)}<button type="button" class="chip-remove" data-slug="${x(v)}" aria-label="Remove related">×</button></span>`).join(""),P.querySelectorAll(".chip-remove").forEach(v=>{v.addEventListener("click",()=>{const L=v.dataset.slug;a=a.filter(D=>D!==L),T(),b()})})}function y(){c.classList.add("hidden"),f.classList.add("hidden"),d.classList.add("hidden")}l.addEventListener("click",()=>{c.classList.toggle("hidden")||(f.classList.add("hidden"),d.classList.add("hidden"))}),c.addEventListener("click",v=>{const L=v.target.closest("[data-value]");L&&(o=L.dataset.value??o,E(),c.classList.add("hidden"),b())}),h.addEventListener("click",()=>{f.classList.toggle("hidden")||(c.classList.add("hidden"),d.classList.add("hidden"))}),f.addEventListener("click",v=>{const L=v.target.closest("[data-value]");L&&(p=L.dataset.value??p,q(),f.classList.add("hidden"),b())}),r.addEventListener("input",b),m.addEventListener("keydown",v=>{if(v.key!=="Enter"&&v.key!==",")return;v.preventDefault();const L=m.value.trim().replace(/,$/,"");if(!L||u.includes(L)){m.value="";return}u.push(L),m.value="",$(),b()});function C(v){const L=En(v,n).filter(D=>!a.includes(D.slug));if(L.length===0){d.classList.add("hidden");return}d.innerHTML=L.map(D=>`<button type="button" class="props-dropdown-item" data-slug="${x(D.slug)}" role="option">
104
+ <span class="wikilink-option-slug">${x(D.slug)}</span>
105
+ <span class="wikilink-option-title">${x(D.title)}</span>
106
+ </button>`).join(""),d.classList.remove("hidden")}return k.addEventListener("input",()=>{C(k.value.trim())}),k.addEventListener("keydown",v=>{if(v.key==="Enter"){v.preventDefault();const L=k.value.trim();L&&!a.includes(L)&&(a.push(L),k.value="",T(),d.classList.add("hidden"),b())}}),d.addEventListener("mousedown",v=>{v.preventDefault();const L=v.target.closest("[data-slug]");if(!L)return;const D=L.dataset.slug??"";D&&!a.includes(D)&&(a.push(D),k.value="",T(),d.classList.add("hidden"),b())}),document.addEventListener("click",v=>{const L=v.target;!l.contains(L)&&!c.contains(L)&&!h.contains(L)&&!f.contains(L)&&!k.contains(L)&&!d.contains(L)&&y()}),{getState:()=>({slug:r.value.trim(),type:p,status:o,tags:[...u],related:[...a]}),setRelated(v){a=[...new Set(v)],T(),b()}}}const Pn="modulepreload",Cn=function(e){return"/"+e},je={},mt=function(t,n,s){let r=Promise.resolve();if(n&&n.length>0){let l=function(f){return Promise.all(f.map(g=>Promise.resolve(g).then(S=>({status:"fulfilled",value:S}),S=>({status:"rejected",reason:S}))))};document.getElementsByTagName("link");const c=document.querySelector("meta[property=csp-nonce]"),h=(c==null?void 0:c.nonce)||(c==null?void 0:c.getAttribute("nonce"));r=l(n.map(f=>{if(f=Cn(f),f in je)return;je[f]=!0;const g=f.endsWith(".css"),S=g?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${f}"]${S}`))return;const m=document.createElement("link");if(m.rel=g?"stylesheet":Pn,g||(m.as="script"),m.crossOrigin="",m.href=f,h&&m.setAttribute("nonce",h),document.head.appendChild(m),g)return new Promise((P,k)=>{m.addEventListener("load",P),m.addEventListener("error",()=>k(new Error(`Unable to preload CSS for ${f}`)))})}))}function i(l){const c=new Event("vite:preloadError",{cancelable:!0});if(c.payload=l,window.dispatchEvent(c),!c.defaultPrevented)throw l}return r.then(l=>{for(const c of l||[])c.status==="rejected"&&i(c.reason);return t().catch(i)})};let O=null,V=null;function vt(e,t,n,s,r=[]){var Te,Ae,qe,De,xe,Me,Re,Ne,He,Ie,Fe,_e;const i=r.map(w=>({slug:w.slug,title:w.title}));let l=null,c=n.body;const h=e.querySelector("#ed-title"),f=e.querySelector("#ed-save-status"),g=t.bodySlot.querySelector("#ed-visual-canvas"),S=document.createElement("div");S.id="publish-modal",S.className="modal hidden",S.innerHTML=`
107
+ <div class="modal-card modal-card-wide">
108
+ <p>Publish to git as markdown?</p>
109
+ <code id="publish-target"></code>
110
+ <pre id="publish-diff" class="diff-preview"></pre>
111
+ <div id="publish-related" class="publish-related hidden">
112
+ <p id="publish-related-prompt"></p>
113
+ <ul id="publish-related-list" class="publish-related-list"></ul>
114
+ <div class="editor-actions">
115
+ <button type="button" id="publish-related-apply" class="btn-primary">Add to related</button>
116
+ <button type="button" id="publish-related-skip" class="btn-ghost">Skip</button>
117
+ </div>
118
+ </div>
119
+ <div class="editor-actions">
120
+ <button type="button" id="publish-confirm" class="btn-primary">Confirm</button>
121
+ <button type="button" id="publish-cancel" class="btn-ghost">Cancel</button>
122
+ </div>
123
+ </div>
124
+ `,e.appendChild(S);const m=document.createElement("div");m.id="view-md-modal",m.className="modal hidden",m.innerHTML=`
125
+ <div class="modal-card modal-card-wide">
126
+ <h3 class="modal-title">Markdown source</h3>
127
+ <pre id="view-md-content" class="md-source"></pre>
128
+ <div class="editor-actions">
129
+ <button type="button" id="view-md-copy" class="btn-primary">Copy</button>
130
+ <button type="button" id="view-md-close" class="btn-ghost">Close</button>
131
+ </div>
132
+ </div>
133
+ `,e.appendChild(m);const P=e.querySelector("#ed-publish-menu");h.value=n.title;const k=$n(t.railSlot,{slug:n.slug,type:n.type,status:n.status,tags:n.tags,related:n.related},i,()=>b());mt(async()=>{const{mountVisualEditor:w}=await import("./visual-editor-B6GUowO4.js");return{mountVisualEditor:w}},__vite__mapDeps([0,1,2,3])).then(({mountVisualEditor:w})=>{l=w(g,{initialMarkdown:n.body,docCandidates:i,onBodyChange:()=>b(),onError:s.onError})});let d=[];function u(){return(l==null?void 0:l.getMarkdownBody())??c}function a(){const w=k.getState();return{title:h.value,slug:w.slug,type:w.type,status:w.status,tags:w.tags,related:w.related,body:u()}}function o(w){f.textContent=w}async function p(){o("Saving…");const w=a();c=w.body,await Xt(n.id,w),o("Saved")}function b(){O&&clearTimeout(O),O=setTimeout(()=>{O=null,V=p().catch(w=>{o(""),s.onError(w instanceof Error?w.message:"Autosave failed")})},800)}async function E(){O&&(clearTimeout(O),O=null,V=p().catch(w=>{throw o(""),s.onError(w instanceof Error?w.message:"Autosave failed"),w})),V&&(await V,V=null)}h.addEventListener("input",()=>b()),h.addEventListener("change",()=>b());function q(){const w=e.querySelector("#publish-related"),M=e.querySelector("#publish-related-prompt"),B=e.querySelector("#publish-related-list"),F=k.getState();if(d=wn(u(),F.related,i),d.length===0){w.classList.add("hidden");return}M.textContent=`Add ${d.length} body link(s) to related?`,B.innerHTML=d.map(de=>{var We;const Wt=((We=i.find(Ot=>Ot.slug===de))==null?void 0:We.title)??de;return`<li><code>${x(de)}</code> — ${x(Wt)}</li>`}).join(""),w.classList.remove("hidden")}function $(){var M;if(d.length===0)return;const w=k.getState();k.setRelated([...new Set([...w.related,...d])]),d=[],(M=e.querySelector("#publish-related"))==null||M.classList.add("hidden")}(Te=e.querySelector("#publish-related-apply"))==null||Te.addEventListener("click",()=>{$()}),(Ae=e.querySelector("#publish-related-skip"))==null||Ae.addEventListener("click",()=>{var w;d=[],(w=e.querySelector("#publish-related"))==null||w.classList.add("hidden")});let T=null,y=null;function C(){S.classList.add("hidden"),T&&(document.removeEventListener("keydown",T),T=null)}function v(){S.classList.remove("hidden"),T||(T=w=>{w.key==="Escape"&&C()},document.addEventListener("keydown",T))}function L(){m.classList.add("hidden")}function D(){const w=m.querySelector("#view-md-content");w.textContent=u(),m.classList.remove("hidden")}async function A(){await E(),v(),q();const w=e.querySelector("#publish-target"),M=e.querySelector("#publish-diff"),B=k.getState();w.textContent=`docs/.../${B.slug}.md`,M.textContent="Loading diff…";try{const F=await Yt(n.id);F.targetPath&&(w.textContent=F.targetPath),M.textContent=F.diff}catch(F){M.textContent=F instanceof Error?F.message:"Diff unavailable"}}async function H(){const w=e.querySelector("#ed-publish");w.setAttribute("aria-busy","true"),w.disabled=!0;try{await E();const{result:M}=await ve(n.id);s.onPublished(M.path)}finally{w.removeAttribute("aria-busy"),w.disabled=!1}}(qe=e.querySelector("#ed-publish"))==null||qe.addEventListener("click",()=>{H().catch(w=>{s.onError(w instanceof Error?w.message:"Publish failed")})}),(De=e.querySelector("#ed-publish-review"))==null||De.addEventListener("click",()=>{P.classList.add("hidden"),A().catch(w=>{s.onError(w instanceof Error?w.message:"Failed to prepare publish")})}),(xe=e.querySelector("#ed-publish-menu-btn"))==null||xe.addEventListener("click",()=>{var M;const w=P.classList.toggle("hidden");(M=e.querySelector("#ed-publish-menu-btn"))==null||M.setAttribute("aria-expanded",w?"false":"true")});const Y=w=>{var B,F;const M=w.target;!P.contains(M)&&!((B=e.querySelector("#ed-publish-menu-btn"))!=null&&B.contains(M))&&(P.classList.add("hidden"),(F=e.querySelector("#ed-publish-menu-btn"))==null||F.setAttribute("aria-expanded","false"))};document.addEventListener("click",Y),(Me=e.querySelector("#ed-view-md"))==null||Me.addEventListener("click",()=>{D()}),(Re=m.querySelector("#view-md-close"))==null||Re.addEventListener("click",()=>{L()}),m.addEventListener("click",w=>{w.target===m&&L()}),(Ne=m.querySelector("#view-md-copy"))==null||Ne.addEventListener("click",()=>{navigator.clipboard.writeText(u()).catch(w=>{s.onError(w instanceof Error?w.message:"Copy failed")})}),(He=e.querySelector("#publish-cancel"))==null||He.addEventListener("click",()=>{C()}),S.addEventListener("click",w=>{w.target===S&&C()}),(Ie=e.querySelector("#publish-confirm"))==null||Ie.addEventListener("click",()=>{(async()=>{await E();const{result:w}=await ve(n.id);C(),s.onPublished(w.path)})().catch(w=>{s.onError(w instanceof Error?w.message:"Publish failed")})});const Ce=()=>{l==null||l.destroy(),s.onClosed()};return(Fe=e.querySelector("#ed-close"))==null||Fe.addEventListener("click",Ce),(_e=e.querySelector("#ed-discard"))==null||_e.addEventListener("click",()=>{confirm("Discard this draft?")&&(l==null||l.destroy(),Jt(n.id).then(()=>s.onDeleted()).catch(w=>{s.onError(w instanceof Error?w.message:"Delete failed")}))}),y=w=>{w.key==="Escape"&&S.classList.contains("hidden")&&m.classList.contains("hidden")&&Ce()},document.addEventListener("keydown",y),{destroy:()=>{l==null||l.destroy(),document.removeEventListener("click",Y),y&&document.removeEventListener("keydown",y),C(),L(),S.remove(),m.remove()}}}function yt(e,t){const n=(t==null?void 0:t.showDiscard)??!0;return`
134
+ <div class="editor-action-bar">
135
+ <span class="editing-badge" aria-hidden="true">Editing</span>
136
+ <span id="ed-save-status" class="save-status" aria-live="polite"></span>
137
+ <div class="editor-action-spacer" aria-hidden="true"></div>
138
+ <div class="editor-action-primary">
139
+ <div class="publish-split">
140
+ <button type="button" id="ed-publish" class="btn-primary publish-main">Publish</button>
141
+ <button type="button" id="ed-publish-menu-btn" class="btn-primary publish-menu-trigger" aria-haspopup="true" aria-expanded="false" title="More publish options">▾</button>
142
+ <div id="ed-publish-menu" class="publish-menu hidden" role="menu">
143
+ <button type="button" id="ed-publish-review" role="menuitem">Review changes</button>
144
+ </div>
145
+ </div>
146
+ </div>
147
+ <div class="editor-action-secondary">
148
+ <button type="button" id="ed-view-md" class="btn-ghost btn-sm">Markdown</button>
149
+ <button type="button" id="toggle-focus" class="btn-ghost btn-sm" aria-pressed="${e}">
150
+ ${e?"Show info":"Hide info"}
151
+ </button>
152
+ <button type="button" id="ed-close" class="btn-ghost btn-sm">Close</button>
153
+ ${n?'<button type="button" id="ed-discard" class="btn-ghost btn-sm btn-danger-text">Discard</button>':""}
154
+ </div>
155
+ </div>
156
+ `}function ae(e){e.scrollTop=0,e.scrollLeft=0,window.scrollTo(0,0),document.documentElement.scrollTop=0,document.body.scrollTop=0}function Ee(e){ae(e),requestAnimationFrame(()=>{ae(e)})}function Ke(e,t,n,s=[]){const r=ie(),i=we(e,{rootClass:"workspace-main workspace-editor",breadcrumbs:[{label:"Knowledge"},{label:"Drafts"},{label:t.title||t.slug,current:!0}],titleHtml:'<input id="ed-title" class="title-input doc-title" type="text" placeholder="Document title" />',actionsHtml:yt(r),mainHtml:'<div id="ed-visual-canvas"></div>',railHtml:ht({forkedFrom:t.forked_from}),focusMode:r});return Se(e,r),Ee(e),vt(e,i,t,n,s)}const Tn=2;function An(e,t,n){const s=e.toLowerCase().replace(/[^\p{L}\p{N}\s-]/gu,"").trim().replace(/\s+/g,"-").slice(0,48)||`section-${t+1}`;let r=s,i=2;for(;n.has(r);)r=`${s}-${i}`,i+=1;return r}function qn(e){const t=e.querySelectorAll("h1, h2, h3"),n=new Set,s=[];return t.forEach((r,i)=>{var f;const l=((f=r.textContent)==null?void 0:f.trim())??"";if(!l)return;const c=Number(r.tagName.charAt(1));let h=r.id;h||(h=An(l,i,n),r.id=h),n.add(h),s.push({id:h,level:c,text:l,element:r})}),s}function bt(e,t){const n=e.getBoundingClientRect(),s=t.getBoundingClientRect();return n.top-s.top+t.scrollTop}function ze(e,t,n="smooth"){const s=bt(t,e)-16;e.scrollTo({top:Math.max(0,s),behavior:n})}function Dn(e){var d;const t=e.minHeadings??Tn,n=qn(e.contentRoot);if(n.length<t)return e.mountEl.classList.add("hidden"),e.mountEl.replaceChildren(),null;e.mountEl.classList.remove("hidden"),e.mountEl.replaceChildren();const s=document.createElement("div");s.className="doc-outline-track",s.setAttribute("role","presentation");const r=document.createElement("div");r.className="doc-outline-menu",r.setAttribute("role","navigation"),r.setAttribute("aria-label","On this page");const i=document.createElement("ul");i.className="doc-outline-menu-list";const l=[],c=[];for(const u of n){const a=document.createElement("button");a.type="button",a.className=`doc-outline-mark doc-outline-mark--${u.level}`,a.dataset.headingId=u.id,a.title=u.text,a.setAttribute("aria-label",u.text),s.appendChild(a),l.push(a);const o=document.createElement("li");o.className=`doc-outline-menu-item doc-outline-menu-item--${u.level}`;const p=document.createElement("button");p.type="button",p.className="doc-outline-menu-btn",p.textContent=u.text,p.addEventListener("click",()=>{ze(e.scrollRoot,u.element)}),o.appendChild(p),i.appendChild(o),c.push(p),a.addEventListener("click",()=>{ze(e.scrollRoot,u.element)})}r.appendChild(i),e.mountEl.className="doc-outline",e.mountEl.append(s,r);let h=((d=n[0])==null?void 0:d.id)??"";function f(u){var a;if(h!==u){h=u;for(const o of l)o.classList.toggle("is-active",o.dataset.headingId===u);for(const[o,p]of c.entries())p.classList.toggle("is-active",((a=n[o])==null?void 0:a.id)===u)}}function g(){const u=Math.max(e.scrollRoot.scrollHeight,1),a=s.clientHeight||1;n.forEach((o,p)=>{const b=l[p];if(!b)return;const E=bt(o.element,e.scrollRoot),q=Math.min(1,Math.max(0,E/u));b.style.top=`${q*(a-4)}px`})}function S(){const u=e.scrollRoot.getBoundingClientRect(),a=u.top+u.height*.22;let o=n[0];for(const p of n)if(p.element.getBoundingClientRect().top<=a)o=p;else break;o&&f(o.id)}const m=()=>{S()},P=()=>{g(),S()},k=new IntersectionObserver(()=>{S()},{root:e.scrollRoot,rootMargin:"-15% 0px -75% 0px",threshold:[0,.25,.5,1]});for(const u of n)k.observe(u.element);return e.scrollRoot.addEventListener("scroll",m,{passive:!0}),window.addEventListener("resize",P,{passive:!0}),g(),S(),{refresh:()=>{g(),S()},destroy:()=>{k.disconnect(),e.scrollRoot.removeEventListener("scroll",m),window.removeEventListener("resize",P),e.mountEl.classList.add("hidden"),e.mountEl.replaceChildren()}}}function xn(e){if(!e)return null;if(e.startsWith("?slug=")||e.startsWith("/?slug=")){const t=e.includes("?")?e.slice(e.indexOf("?")):e,n=new URLSearchParams(t).get("slug");return(n==null?void 0:n.trim())||null}try{const n=new URL(e,"http://local").searchParams.get("slug");return(n==null?void 0:n.trim())||null}catch{return null}}function Le(e){var t,n;return((n=(t=e.split("#")[0])==null?void 0:t.split("?")[0])==null?void 0:n.trim())??""}function wt(e){const t=e.replace(/\\/g,"/").replace(/^\/+/,"");return t?t.toLowerCase().endsWith(".md")?t:`${t}.md`:""}function Mn(e,t){const n=Le(t);if(!n||n.startsWith("http://")||n.startsWith("https://")||n.startsWith("mailto:")||n.startsWith("#"))return null;const s=e.includes("/")?e.slice(0,e.lastIndexOf("/")):"",r=n.replace(/\\/g,"/").split("/"),i=s?s.split("/"):[];for(const l of r)if(!(!l||l===".")){if(l===".."){if(i.length===0)return null;i.pop();continue}i.push(l)}return wt(i.join("/"))}function Rn(e){let t=Le(e).replace(/\\/g,"/");return!t||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("mailto:")||t.startsWith("#")||(t.startsWith("/")&&(t=t.slice(1)),t.startsWith("docs/")&&(t=t.slice(5)),!t)?null:wt(t)}function Nn(e,t){const n=t.get(e);if(n)return n;const s=e.toLowerCase();for(const[r,i]of t.entries())if(r.toLowerCase()===s)return i;return null}function Hn(e,t,n){const s=xn(t);if(s){for(const i of n.values())if(i===s)return s;return null}const r=[Mn(e,t),Rn(t)].filter(i=>!!i);for(const i of r){const l=Nn(i,n);if(l)return l}return null}const In=[".png",".jpg",".jpeg",".gif",".webp",".svg"];function Ge(e){const t=e.toLowerCase();return In.some(n=>t.endsWith(n))}function Fn(e,t){const n=Le(t);if(!n||n.startsWith("http://")||n.startsWith("https://")||n.startsWith("mailto:")||n.startsWith("#")||n.startsWith("data:"))return null;let s=n.replace(/\\/g,"/");if(s.startsWith("/")&&(s=s.slice(1)),s.startsWith("docs/")?s=s.slice(5):s="",s&&!s.split("/").includes("..")&&Ge(s))return s;const r=e.includes("/")?e.slice(0,e.lastIndexOf("/")):"",i=n.replace(/\\/g,"/").split("/"),l=r?r.split("/"):[];for(const h of i)if(!(!h||h===".")){if(h===".."){if(l.length===0)return null;l.pop();continue}l.push(h)}const c=l.join("/");return c&&Ge(c)?c:null}function _n(e,t){const n=Fn(e,t);return n?`/api/assets/${n.split("/").map(encodeURIComponent).join("/")}`:null}let Ve=null;async function Wn(e){const t=e.querySelectorAll("pre.mermaid");if(t.length===0)return;const n=document.documentElement.dataset.theme==="dark"?"dark":"default",s=await mt(()=>import("./mermaid.core-CkbXj8L9.js").then(r=>r.ba),__vite__mapDeps([4,5,1]));Ve!==n&&(s.default.initialize({startOnLoad:!1,theme:n,securityLevel:"loose"}),Ve=n);try{await s.default.run({nodes:[...t]})}catch{for(const r of t)if(!r.closest(".mermaid-error")){const i=r.parentElement;i==null||i.classList.add("mermaid-error")}}}let Je=!1,U=null;function K(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function On(e){return e.replace(ft,(t,n,s)=>{const{display:r,slug:i}=gt(n,s),l=encodeURIComponent(i);return`[${r}](#wikilink:${l})`})}function Un(){Je||(ct.use({gfm:!0,renderer:{code({text:e,lang:t}){return t==="mermaid"?`<div class="mermaid-wrapper"><pre class="mermaid">${K(e.trim())}</pre></div>
157
+ `:!1},list(e){if(!e.items.some(i=>i.task))return!1;const n=e.ordered?"ol":"ul",s=e.ordered&&e.start!==1&&e.start!=null?` start="${e.start}"`:"";let r="";for(const i of e.items)r+=this.listitem(i);return`<${n} class="contains-task-list"${s}>
158
+ ${r}</${n}>
159
+ `},listitem(e){if(!e.task)return!1;const t=`<input type="checkbox" class="task-list-item-checkbox"${e.checked?" checked":""} disabled>`,n=this.parser.parse(e.tokens,!!e.loose).trim();return`<li class="task-list-item"><label class="task-list-item-label">${t}<span class="task-list-item-content">${n}</span></label></li>
160
+ `},image({href:e,text:t,title:n}){if(!e||e.startsWith("http://")||e.startsWith("https://")||e.startsWith("data:"))return!1;if(U){const s=_n(U.docRelativePath,e);if(s){const r=K(t||n||"");return`<img src="${K(s)}" alt="${r}" loading="lazy" class="markdown-image">`}}return!1},link({href:e,text:t}){if(e!=null&&e.startsWith("#wikilink:")){const n=decodeURIComponent(e.slice(10));return`<a href="#" class="wikilink" data-slug="${K(n)}">${t}</a>`}if(U&&e){const n=Hn(U.docRelativePath,e,U.slugByRelative);if(n)return`<a href="#" class="wikilink" data-slug="${K(n)}">${t}</a>`}return e!=null&&e.startsWith("http://")||e!=null&&e.startsWith("https://")?`<a href="${K(e)}" target="_blank" rel="noopener noreferrer">${t}</a>`:e!=null&&e.startsWith("mailto:")||e!=null&&e.startsWith("#")?!1:e?`<a href="#" class="md-link-unresolved" title="Link not in docs index">${t}</a>`:!1}}}),Je=!0)}function St(e,t){Un(),U=t??null;try{return ct.parse(On(e),{async:!1})}finally{U=null}}const ke="slug",Et="path",Bn="draft";function $e(){const e=new URLSearchParams(window.location.search).get(ke);return e!=null&&e.trim()?e.trim():null}function jn(){const e=new URLSearchParams(window.location.search).get(Et);return e!=null&&e.trim()?e.trim().replace(/\\/g,"/"):null}function Kn(){const e=new URLSearchParams(window.location.search).get(Bn);return e!=null&&e.trim()?e.trim():null}function zn(){const e=new URL(window.location.href),t=e.pathname;if(t==="/"||t==="/index.html")return;const n=$e();e.pathname="/",history.replaceState(n?{slug:n}:{},"",e)}function Lt(){const e=new URL(window.location.href);return e.pathname="/",e}function Gn(e){const t=Lt();return t.search="",t.searchParams.set(ke,e),t.toString()}function Vn(e,t="push"){const n=Lt();n.searchParams.delete(Et),n.searchParams.set(ke,e);const s={slug:e};t==="replace"?history.replaceState(s,"",n):history.pushState(s,"",n)}function Jn(e){const t=()=>{e($e())};return window.addEventListener("popstate",t),()=>window.removeEventListener("popstate",t)}function Xn(e,t){if(t==="json")try{const n=JSON.parse(e);return JSON.stringify(n,null,2)}catch{return e}return e}function Yn(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function Qn(e,t){const n=Xn(e,t);return`<pre class="structured-preview ${t==="json"?"structured-preview--json":"structured-preview--yaml"}"><code>${Yn(n)}</code></pre>`}let J=null,N=null;function le(){J==null||J.destroy(),J=null,N==null||N.destroy(),N=null}function Zn(e,t){const n=typeof t.status=="string"?t.status:"",s=typeof t.type=="string"?t.type:"",r=typeof t.domain=="string"?t.domain:"",i=Array.isArray(t.tags)?t.tags.filter(h=>typeof h=="string"):[],l=Array.isArray(t.related)?t.related.filter(h=>typeof h=="string"):[],c=e.contentKind??"markdown";return`
161
+ <h2 class="page-info-title">Page info</h2>
162
+ <dl class="info-list">
163
+ <dt>Status</dt><dd><span class="status-chip status-${x(n)}">${x(n)}</span></dd>
164
+ <dt>Type</dt><dd>${x(s)}</dd>
165
+ ${r?`<dt>Domain</dt><dd>${x(r)}</dd>`:""}
166
+ <dt>Format</dt><dd>${x(c)}</dd>
167
+ ${i.length>0?`<dt>Tags</dt><dd>${i.map(h=>`<span class="tag-chip">${x(h)}</span>`).join(" ")}</dd>`:""}
168
+ </dl>
169
+ ${l.length>0?`<div class="info-block"><div class="info-block-label">Related</div>${l.map(h=>`<button type="button" class="related-chip" data-slug="${x(h)}">${x(h)}</button>`).join("")}</div>`:""}
170
+ <div class="info-tabs tabs">
171
+ <button class="tab active" data-tab="frontmatter">Frontmatter</button>
172
+ <button class="tab" data-tab="agent">Agent JSON</button>
173
+ </div>
174
+ <div id="tab-frontmatter" class="tab-panel active"></div>
175
+ <div id="tab-agent" class="tab-panel"></div>
176
+ <footer class="page-info-footer">
177
+ <code id="doc-path">${x(e.path??"")}</code>
178
+ </footer>
179
+ `}function es(e){e.querySelectorAll(".info-tabs .tab").forEach(t=>{t.addEventListener("click",()=>{var s;const n=t.dataset.tab;e.querySelectorAll(".info-tabs .tab").forEach(r=>r.classList.remove("active")),e.querySelectorAll(".page-info .tab-panel").forEach(r=>r.classList.remove("active")),t.classList.add("active"),(s=e.querySelector(`#tab-${n}`))==null||s.classList.add("active")})})}function Xe(e){e.querySelectorAll(".related-chip").forEach(t=>{t.addEventListener("click",()=>{const n=t.dataset.slug;n&&e.dispatchEvent(new CustomEvent("navigate-slug",{detail:{slug:n}}))})})}function kt(e,t,n){return[{label:"Knowledge",crumbId:"root"},{label:be(n),crumbId:"catalog"},{label:t,current:!0}]}function $t(e,t,n,s){le();const r=t.frontmatter??{},i=typeof r.title=="string"?r.title:t.slug??"",l=typeof r.type=="string"?r.type:"",c=ie(),h=we(e,{rootClass:"workspace-main workspace-editor workspace-page",breadcrumbs:kt(t,i,l),titleHtml:'<input id="ed-title" class="title-input doc-title" type="text" placeholder="Document title" />',actionsHtml:yt(c,{showDiscard:!0}),mainHtml:'<div id="ed-visual-canvas"></div>',railHtml:ht({forkedFrom:n.forked_from}),focusMode:c});Se(e,c),J=vt(e,h,n,{onPublished:f=>{(async()=>{var g;if(await s.onPublished(f),(g=s.onDraftsChanged)==null||g.call(s),t.slug){const S=await s.onReloadDoc(t.slug);z(e,S,s)}})()},onClosed:()=>{(async()=>{var f;if((f=s.onDraftsChanged)==null||f.call(s),t.slug)try{const g=await s.onReloadDoc(t.slug);z(e,g,s)}catch(g){s.onError(g instanceof Error?g.message:"Failed to reload page")}})()},onDeleted:()=>{var f;(f=s.onDraftsChanged)==null||f.call(s),t.slug&&s.onReloadDoc(t.slug).then(g=>z(e,g,s),()=>z(e,t,s))},onError:s.onError},s.docIndex)}function z(e,t,n){var k,d,u;le();const s=t.frontmatter??{},r=typeof s.title=="string"?s.title:t.slug??"",i=typeof s.type=="string"?s.type:"",l=ie(),c=t.contentKind??"markdown",h=c==="json"||c==="yaml",f=we(e,{rootClass:"workspace-main workspace-page",breadcrumbs:kt(t,r,i),titleHtml:`<h1 class="doc-title reader-title">${x(r)}</h1>`,actionsHtml:`
180
+ <button type="button" id="toggle-focus" class="btn-ghost" aria-pressed="${l}">
181
+ ${l?"Show info":"Hide info"}
182
+ </button>
183
+ ${h?"":'<button type="button" id="edit-page" class="btn-primary">Edit</button>'}
184
+ <button type="button" id="copy-link" class="btn-ghost">Copy link</button>
185
+ <button type="button" id="copy-path" class="btn-ghost">Copy path</button>
186
+ `,mainHtml:`
187
+ <div class="reader-body">
188
+ <div class="reader-layout">
189
+ <div id="tab-preview" class="markdown-preview reader-preview"></div>
190
+ <nav id="doc-outline" class="doc-outline hidden" aria-label="On this page"></nav>
191
+ </div>
192
+ <section id="reader-backlinks" class="reader-backlinks hidden" aria-label="Backlinks"></section>
193
+ </div>
194
+ `,railHtml:Zn(t,s),focusMode:l});Se(e,l),mn(e,{root:()=>{var a;return(a=n.onNavigateRoot)==null?void 0:a.call(n)},catalog:()=>{var a;return(a=n.onNavigateCatalog)==null?void 0:a.call(n)}});const g=f.bodySlot.querySelector("#tab-preview");if(h)g.innerHTML=Qn(t.body??"",c);else{const a=n.docRelativePath&&n.slugByRelative?{docRelativePath:n.docRelativePath,slugByRelative:n.slugByRelative}:void 0;g.innerHTML=St(t.body??"",a),g.querySelectorAll("a.wikilink").forEach(o=>{o.addEventListener("click",p=>{p.preventDefault();const b=o.dataset.slug;b&&e.dispatchEvent(new CustomEvent("navigate-slug",{detail:{slug:b}}))})}),g.querySelectorAll("a.md-link-unresolved").forEach(o=>{o.addEventListener("click",p=>{p.preventDefault()})}),N==null||N.destroy(),N=Dn({scrollRoot:e,contentRoot:g,mountEl:f.bodySlot.querySelector("#doc-outline")}),Wn(g).then(()=>{N==null||N.refresh(),Ee(e)})}const S=f.railSlot.querySelector("#tab-frontmatter");S.innerHTML='<pre class="frontmatter-yaml"></pre>',S.querySelector("pre").textContent=JSON.stringify(s,null,2);const m=f.railSlot.querySelector("#tab-agent");m.innerHTML='<pre class="agent-json"></pre>',m.querySelector("pre").textContent=JSON.stringify(t.agentShape,null,2),es(e),Xe(e),(k=e.querySelector("#copy-path"))==null||k.addEventListener("click",()=>{t.path&&navigator.clipboard.writeText(t.path)}),(d=e.querySelector("#copy-link"))==null||d.addEventListener("click",()=>{var a;t.slug&&(navigator.clipboard.writeText(Gn(t.slug)),(a=n.onCopyLink)==null||a.call(n))});const P=()=>{if(!t.slug||h)return;const a=f.bodySlot;a.innerHTML='<p class="reader-loading">Opening editor…</p>',dt(t.slug).then(({draft:o})=>{var p;(p=n.onDraftsChanged)==null||p.call(n),$t(e,t,o,n)}).catch(o=>{n.onError(o instanceof Error?o.message:"Edit failed"),z(e,t,n)})};(u=e.querySelector("#edit-page"))==null||u.addEventListener("click",P),t.slug&&!h&&Qt(t.slug).then(({backlinks:a})=>{const o=f.bodySlot.querySelector("#reader-backlinks");!o||a.length===0||(o.classList.remove("hidden"),o.innerHTML=`
195
+ <h2 class="reader-backlinks-title">Backlinks</h2>
196
+ <div class="reader-backlinks-list">
197
+ ${a.map(p=>`<button type="button" class="related-chip" data-slug="${x(p.slug)}">${x(p.title)} <span class="backlink-kind">${x(p.kind)}</span></button>`).join("")}
198
+ </div>
199
+ `,Xe(e),N==null||N.refresh())}).catch(()=>{})}function _(e,t,n){if(le(),ae(e),!t||!t.found){e.className="workspace-main",e.innerHTML=`
200
+ <div class="workspace-empty">
201
+ <h1>Knowledge</h1>
202
+ <p class="placeholder">Select a page from the tree or use the ⋯ menu to create one.</p>
203
+ </div>
204
+ `;return}z(e,t,n),Ee(e)}function Ye(e,t,n,s){ae(e),$t(e,t,n,s)}function Qe(e){const t=[];function n(s){for(const r of s.children)r.kind==="page"?t.push(r.slug):n(r)}return n(e),t}function ts(e){if(!(e instanceof HTMLElement))return!1;const t=e.tagName;return t==="INPUT"||t==="TEXTAREA"||t==="SELECT"?!0:e.isContentEditable}function ns(e){const t=n=>{if(n.metaKey||n.ctrlKey||n.altKey)return;const s=ts(n.target);if(n.key==="/"&&!s){n.preventDefault(),e.onFocusSearch();return}if(!s)switch(n.key){case"j":n.preventDefault(),e.onNext();break;case"k":n.preventDefault(),e.onPrev();break;case"e":e.onEdit();break}};return document.addEventListener("keydown",t),()=>document.removeEventListener("keydown",t)}const Pt="http://www.w3.org/2000/svg",oe={folder:"M1.75 5.25A1 1 0 0 1 2.75 4.25h3.85L8 5.65h5.25A1 1 0 0 1 14.25 6.65v5.7a1 1 0 0 1-1 1H2.75a1 1 0 0 1-1-1V5.25z",page:"M4.75 2.25A1 1 0 0 0 3.75 3.25v9.5a1 1 0 0 0 1 1h6.5a1 1 0 0 0 1-1V5.35a1 1 0 0 0-.29-.71L9.11 2.54A1 1 0 0 0 8.46 2.25H4.75zm4.35 1.79L11.75 5.5H9.1V4.04z",json:"M5.1 4.5c-.55 0-1 .45-1 1v1.2c0 .45-.2.85-.5 1.15.3.3.5.7.5 1.15v1.2c0 .55.45 1 1 1M10.9 4.5c.55 0 1 .45 1 1v1.2c0 .45.2.85.5 1.15-.3.3-.5.7-.5 1.15v1.2c0 .55-.45 1-1 1",yaml:"M3.75 5h8.5M3.75 8h8.5M3.75 11h5.5"};function ss(e){if(e.startsWith("folder:"))return"tree-icon--type-folder-catalog";const t=e.replace(/[^a-z0-9-]/gi,"");return t?`tree-icon--type-${t}`:"tree-icon--type-default"}function ne(e,t){return`<span class="tree-icon ${e}" aria-hidden="true">${t}</span>`}function ye(e,t){const n=(t==null?void 0:t.fill)!==!1?"currentColor":"none",s=t!=null&&t.stroke?"currentColor":"none",r=t!=null&&t.stroke?"1.15":"0",i=t!=null&&t.stroke?"round":"butt";return`<svg viewBox="0 0 16 16" xmlns="${Pt}" fill="none" aria-hidden="true"><path d="${e}" fill="${n}" stroke="${s}" stroke-width="${r}" stroke-linecap="${i}" stroke-linejoin="round"/></svg>`}function rs(){return`<svg viewBox="0 0 16 16" xmlns="${Pt}" fill="none" aria-hidden="true"><path d="${oe.yaml}" stroke="currentColor" stroke-width="1.15" stroke-linecap="round"/></svg>`}function as(){return ne("tree-icon--folder",ye(oe.folder))}function Ct(e,t="markdown"){return t==="json"?ne("tree-icon--page tree-icon--structured",ye(oe.json,{fill:!1,stroke:!0})):t==="yaml"?ne("tree-icon--page tree-icon--structured",rs()):ne(`tree-icon--page ${ss(e)}`,ye(oe.page))}function os(e){return e.indexPageSlug&&e.indexPageType&&e.indexPageContentKind?Ct(e.indexPageType,e.indexPageContentKind):as()}function Pe(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function is(e){return Pe(e)}function Tt(e,t){var l;const n=document.createElement("div");n.className="modal",n.innerHTML=`
205
+ <div class="modal-card tree-page-modal" role="dialog" aria-modal="true">
206
+ <h2 class="modal-title">${Pe(e)}</h2>
207
+ ${t}
208
+ <div class="modal-actions">
209
+ <button type="button" class="btn-ghost" data-action="cancel">Отмена</button>
210
+ <button type="button" class="btn-primary" data-action="create">Создать</button>
211
+ </div>
212
+ </div>
213
+ `;const s=()=>{n.remove()};n.querySelector(".modal-card").addEventListener("click",c=>{c.stopPropagation()}),(l=n.querySelector('[data-action="cancel"]'))==null||l.addEventListener("click",s),n.addEventListener("click",c=>{c.target===n&&s()});const i=n.querySelector("#tree-page-name");return i.focus(),document.body.appendChild(n),{backdrop:n,nameInput:i,close:s}}function At(e,t,n,s,r){var l;const i=()=>{const c=t.value.trim();if(!c){t.focus();return}r&&!r()||(n(),s(c))};(l=e.querySelector('[data-action="create"]'))==null||l.addEventListener("click",i),t.addEventListener("keydown",c=>{c.key==="Enter"&&(c.preventDefault(),i()),c.key==="Escape"&&n()})}function ls(e){const t=`
214
+ <label class="modal-field">
215
+ <span class="modal-label">Имя (без .md)</span>
216
+ <input type="text" class="modal-input" id="tree-page-name" autocomplete="off" />
217
+ </label>
218
+ `,{backdrop:n,nameInput:s,close:r}=Tt("Новый файл",t);At(n,s,r,e)}function ds(e,t){var h;const n=`
219
+ <label class="modal-field">
220
+ <span class="modal-label">Имя (без .md)</span>
221
+ <input type="text" class="modal-input" id="tree-page-name" autocomplete="off" />
222
+ </label>
223
+ <div class="modal-field">
224
+ <span class="modal-label" id="tree-template-label">Шаблон</span>
225
+ <div class="tree-template-list" role="listbox" aria-labelledby="tree-template-label">
226
+ ${e.map((f,g)=>`
227
+ <button
228
+ type="button"
229
+ class="tree-template-item${g===0?" is-selected":""}"
230
+ role="option"
231
+ aria-selected="${g===0?"true":"false"}"
232
+ data-template-id="${is(f.id)}"
233
+ >${Pe(f.label)}</button>`).join("")}
234
+ </div>
235
+ </div>
236
+ `,{backdrop:s,nameInput:r,close:i}=Tt("Новый файл из шаблона",n),l=s.querySelector(".tree-template-list");let c=((h=e[0])==null?void 0:h.id)??"";l.addEventListener("click",f=>{const g=f.target.closest(".tree-template-item");g!=null&&g.dataset.templateId&&(c=g.dataset.templateId,l.querySelectorAll(".tree-template-item").forEach(S=>{const m=S===g;S.classList.toggle("is-selected",m),S.setAttribute("aria-selected",String(m))}))}),At(s,r,i,f=>{c&&t(f,c)},()=>!!c)}function cs(e){const t=e.relativePath.replace(/\\/g,"/");if(t==="README.md")return"";const n=t.lastIndexOf("/"),s=n===-1?t:t.slice(n+1),r=n===-1?"":t.slice(0,n);if(s.toLowerCase()==="readme.md")return r;const i=s.replace(/\.(md|ya?ml|json)$/i,"");return r?`${r}/${i}`:i}function us(e){const t=e.relativePath.replace(/\\/g,"/");return t==="README.md"?!1:(t.includes("/")?t.slice(t.lastIndexOf("/")+1):t).toLowerCase()!=="readme.md"}async function ps(e,t){var n,s,r;if(!us(e))return cs(e);try{const{result:i}=await Zt(e.relativePath);return(n=t.onTreeChanged)==null||n.call(t),(s=t.onExpandFolder)==null||s.call(t,i.folderPath),i.folderPath}catch(i){return(r=t.onError)==null||r.call(t,i instanceof Error?i.message:"Promote page failed"),null}}const qt="application/x-repomind-tree-node";function W(e){return e.replace(/\\/g,"/").replace(/^\/+|\/+$/g,"")}function Dt(e){const t=W(e),n=t.lastIndexOf("/");return n===-1?"":t.slice(0,n)}function xt(e,t){const n=W(e),s=W(t);return n?s===n||s.startsWith(`${n}/`):!0}function Ze(e){var n;const t=(n=e.dataTransfer)==null?void 0:n.getData(qt);if(!t)return null;try{const s=JSON.parse(t);return s.kind!=="page"&&s.kind!=="folder"||typeof s.path!="string"?null:{kind:s.kind,path:W(s.path)}}catch{return null}}function et(e,t){const n=W(e.path),s=W(t);return!(Dt(n)===s||xt(n.replace(/\.md$/i,""),s))}function tt(e,t){const n=W(e.path),s=W(t);return!(n===s||Dt(n)===s||xt(n,s))}function fs(e,t){let n=null,s=null;function r(d){return d.target.closest("[data-drop-dir]")}function i(){n&&(n.classList.remove("tree-drop-target","tree-drop-invalid"),n=null)}function l(d,u){n&&n!==d&&n.classList.remove("tree-drop-target","tree-drop-invalid"),n=d,d.classList.toggle("tree-drop-target",u),d.classList.toggle("tree-drop-invalid",!u)}function c(d){const u=d.dataset.dropDir;return u===void 0?null:u}async function h(d,u){var a,o,p,b,E,q;try{if(d.kind==="page"){const{result:T}=await en(d.path,u);(a=t.onTreeChanged)==null||a.call(t),T.cascadeUpdated.length>0?(o=t.onNotify)==null||o.call(t,`Moved page; updated links in ${T.cascadeUpdated.length} file(s).`):T.inboundWarnings.length>0&&((p=t.onError)==null||p.call(t,`${T.inboundWarnings.length} page(s) still reference old slug "${T.previousSlug}".`));return}const{result:$}=await tn(d.path,u);(b=t.onTreeChanged)==null||b.call(t),$.cascadeUpdated.length>0&&((E=t.onNotify)==null||E.call(t,`Moved folder; updated links in ${$.cascadeUpdated.length} file(s).`))}catch($){(q=t.onError)==null||q.call(t,$ instanceof Error?$.message:"Move failed")}}const f=d=>{const u=d.target.closest(".tree-row[data-drag-kind]");if(!u||!d.dataTransfer)return;if(d.target.closest(".tree-menu, .tree-toggle")){d.preventDefault();return}const a=u.dataset.dragKind,o=u.dataset.dragPath;if(!a||!o){d.preventDefault();return}const p={kind:a,path:o};s=p,d.dataTransfer.setData(qt,JSON.stringify(p)),d.dataTransfer.setData("text/plain",o),d.dataTransfer.effectAllowed="move",u.classList.add("is-dragging")},g=d=>{s=null;const u=d.target.closest(".tree-row");u==null||u.classList.remove("is-dragging"),i()},S=d=>{!s||!r(d)||d.preventDefault()},m=d=>{const u=s??Ze(d),a=r(d);if(!u||!a)return;const o=c(a);if(o===null)return;const p=u.kind==="page"?et(u,o):tt(u,o);d.preventDefault(),d.dataTransfer.dropEffect=p?"move":"none";const b=a.classList.contains("tree-row")?a:a.closest(".tree-row");b&&l(b,p)},P=d=>{const u=r(d);if(!u||u.contains(d.relatedTarget))return;const a=u.classList.contains("tree-row")?u:u.closest(".tree-row");a&&n===a&&i()},k=d=>{d.preventDefault(),d.stopPropagation();const u=s??Ze(d),a=r(d),o=a?c(a):null;i(),s=null,!(!u||o===null||!(u.kind==="page"?et(u,o):tt(u,o)))&&h(u,o)};return e.addEventListener("dragstart",f),e.addEventListener("dragend",g),e.addEventListener("dragenter",S),e.addEventListener("dragover",m),e.addEventListener("dragleave",P),e.addEventListener("drop",k),()=>{s=null,e.removeEventListener("dragstart",f),e.removeEventListener("dragend",g),e.removeEventListener("dragenter",S),e.removeEventListener("dragover",m),e.removeEventListener("dragleave",P),e.removeEventListener("drop",k),i()}}function nt(e,t,n){e.draggable=!0,e.dataset.dragKind=t,e.dataset.dragPath=n}function gs(e,t){e.dataset.dropDir=t}function hs(e,t){e.dataset.dropDir=t}const Mt="repomind-tree-expanded";function ms(){try{const e=localStorage.getItem(Mt);return e?new Set(JSON.parse(e)):new Set([""])}catch{return new Set([""])}}function Z(e){localStorage.setItem(Mt,JSON.stringify([...e]))}function vs(){document.querySelectorAll(".tree-context-menu").forEach(e=>e.remove())}function st(e,t,n,s){rn(e,t,void 0,n).then(({draft:r})=>{var i,l;(i=s.onTreeChanged)==null||i.call(s),(l=s.onSelectDraft)==null||l.call(s,r)}).catch(r=>{var i;(i=s.onError)==null||i.call(s,r instanceof Error?r.message:"Create page failed")})}function ys(e,t,n){var k,d,u,a;vs();const{kind:s,folderPath:r,page:i,templates:l,resolveCreateParent:c}=t,h=s==="page"||s==="folder"&&!!r,f=l.length>0,g=document.createElement("div");g.className="tree-create-menu tree-context-menu",g.innerHTML=`
237
+ <button type="button" data-action="folder">Добавить директорию</button>
238
+ <button type="button" data-action="page">Создать файл</button>
239
+ ${f?'<button type="button" data-action="template">Создать из шаблона</button>':""}
240
+ ${h?'<button type="button" data-action="delete" class="tree-menu-danger">Удалить</button>':""}
241
+ `;const S=e.getBoundingClientRect();g.style.top=`${S.bottom+4}px`,g.style.left=`${Math.max(8,S.right-200)}px`,document.body.appendChild(g);const m=()=>g.remove(),P=o=>{g.contains(o.target)||(m(),document.removeEventListener("click",P))};setTimeout(()=>document.addEventListener("click",P),0),(k=g.querySelector('[data-action="page"]'))==null||k.addEventListener("click",()=>{m(),(async()=>{const o=await c();o!==null&&ls(p=>{st(o,p,void 0,n)})})()}),(d=g.querySelector('[data-action="template"]'))==null||d.addEventListener("click",()=>{m(),(async()=>{const o=await c();o!==null&&ds(l,(p,b)=>{st(o,p,b,n)})})()}),(u=g.querySelector('[data-action="folder"]'))==null||u.addEventListener("click",()=>{m();const o=window.prompt("Имя директории:");o!=null&&o.trim()&&(async()=>{const p=await c();p!==null&&sn(p,o.trim()).then(()=>{var b;return(b=n.onTreeChanged)==null?void 0:b.call(n)}).catch(b=>{var E;(E=n.onError)==null||E.call(n,b instanceof Error?b.message:"Create folder failed")})})()}),(a=g.querySelector('[data-action="delete"]'))==null||a.addEventListener("click",()=>{if(m(),s==="page"&&i){if(!window.confirm(`Удалить «${i.title}»?`))return;Oe(i.relativePath,"page").then(({result:o})=>{var p,b,E,q;(p=n.onFsDeleted)==null||p.call(n,[o.slug]),(b=n.onTreeChanged)==null||b.call(n),o.cascadeUpdated.length>0?(E=n.onNotify)==null||E.call(n,`Deleted ${o.slug}; cleaned links in ${o.cascadeUpdated.length} file(s).`):o.inboundWarnings.length>0&&((q=n.onError)==null||q.call(n,`${o.inboundWarnings.length} page(s) still reference deleted slug "${o.slug}".`))}).catch(o=>{var p;(p=n.onError)==null||p.call(n,o instanceof Error?o.message:"Delete failed")});return}if(s==="folder"&&r){if(!window.confirm(`Удалить «${r}» и всё содержимое?`))return;Oe(r,"folder").then(({result:o})=>{var p,b,E,q;(p=n.onFsDeleted)==null||p.call(n,o.deletedSlugs),(b=n.onTreeChanged)==null||b.call(n),o.cascadeUpdated.length>0?(E=n.onNotify)==null||E.call(n,`Deleted folder; cleaned links in ${o.cascadeUpdated.length} file(s).`):o.inboundWarnings.length>0&&((q=n.onError)==null||q.call(n,`${o.inboundWarnings.length} page(s) still reference deleted page(s).`))}).catch(o=>{var p;(p=n.onError)==null||p.call(n,o instanceof Error?o.message:"Delete folder failed")})}})}function bs(e,t,n,s){var u;e.innerHTML=`
242
+ <nav id="docs-tree" class="docs-tree" aria-label="Documentation tree"></nav>
243
+ <section class="catalog-section catalog-drafts">
244
+ <button type="button" class="catalog-header" data-catalog="__drafts__" aria-expanded="true">
245
+ <span class="catalog-chevron" aria-hidden="true">▾</span>
246
+ <span class="catalog-icon catalog-icon--draft" aria-hidden="true">✎</span>
247
+ <span class="catalog-label">Drafts</span>
248
+ <span class="catalog-count">${n.length}</span>
249
+ </button>
250
+ <ul id="draft-list" class="catalog-pages"></ul>
251
+ </section>
252
+ `;const r=e.querySelector("#docs-tree"),i=e.querySelector("#draft-list"),l=ms();let c=null,h=null,f=null;function g(a){l.add("");let o="";for(const p of a.split("/").filter(Boolean))o=o?`${o}/${p}`:p,l.add(o);Z(l)}async function S(a,o){var p;try{c||(c=(await nn()).templates),ys(a,{...o,templates:c},s)}catch(b){(p=s.onError)==null||p.call(s,b instanceof Error?b.message:"Failed to open menu")}}function m(a,o){var q,$;const p=document.createElement("div");p.className="tree-page";const b=document.createElement("div");b.className="tree-row",b.style.paddingLeft=`${o*12+8}px`,a.slug===h&&b.classList.add("active"),b.innerHTML=`
253
+ <span class="tree-spacer" aria-hidden="true"></span>
254
+ <button type="button" class="tree-label">
255
+ ${Ct(a.type,a.contentKind)}
256
+ <span class="tree-title">${ce(a.title)}</span>
257
+ </button>
258
+ <button type="button" class="tree-menu" title="Actions">⋯</button>
259
+ `;const E=a.relativePath.includes("/")?a.relativePath.slice(0,a.relativePath.lastIndexOf("/")):"";return(q=b.querySelector(".tree-menu"))==null||q.addEventListener("click",T=>{T.stopPropagation(),S(T.currentTarget,{kind:"page",parentPath:E,folderPath:E,page:a,resolveCreateParent:()=>ps(a,{onTreeChanged:s.onTreeChanged,onError:s.onError,onExpandFolder:g})})}),($=b.querySelector(".tree-label"))==null||$.addEventListener("click",()=>{h=a.slug,f=null,k(),d(),s.onSelectSlug(a.slug)}),nt(b,"page",a.relativePath),p.appendChild(b),p}function P(a,o){var T,y,C;const p=document.createElement("div");p.className="tree-folder";const b=l.has(a.relativePath),E=!!a.indexPageSlug,q=a.indexPageTitle??a.name,$=document.createElement("div");if($.className="tree-row",$.style.paddingLeft=`${o*12+8}px`,E&&a.indexPageSlug===h&&$.classList.add("active"),$.innerHTML=`
260
+ <button type="button" class="tree-toggle" aria-expanded="${b}">${b?"▾":"▸"}</button>
261
+ <button type="button" class="tree-label">
262
+ ${os(a)}
263
+ <span class="tree-title">${ce(q)}</span>
264
+ </button>
265
+ <button type="button" class="tree-menu" title="Actions">⋯</button>
266
+ `,(T=$.querySelector(".tree-toggle"))==null||T.addEventListener("click",v=>{v.stopPropagation(),l.has(a.relativePath)?l.delete(a.relativePath):l.add(a.relativePath),Z(l),k()}),(y=$.querySelector(".tree-label"))==null||y.addEventListener("click",()=>{if(E&&a.indexPageSlug){h=a.indexPageSlug,f=null,k(),d(),s.onSelectSlug(a.indexPageSlug);return}l.has(a.relativePath)?l.delete(a.relativePath):l.add(a.relativePath),Z(l),k()}),(C=$.querySelector(".tree-menu"))==null||C.addEventListener("click",v=>{v.stopPropagation(),S(v.currentTarget,{kind:"folder",parentPath:a.relativePath,folderPath:a.relativePath,resolveCreateParent:async()=>a.relativePath})}),nt($,"folder",a.relativePath),gs($,a.relativePath),p.appendChild($),b){const v=document.createElement("div");v.className="tree-children",hs(v,a.relativePath);for(const L of a.children??[])L.kind==="folder"?v.appendChild(P(L,o+1)):v.appendChild(m(L,o+1));p.appendChild(v)}return p}function k(){r.innerHTML="",r.appendChild(P(t,0))}function d(){if(i.innerHTML="",n.length===0){i.innerHTML='<li class="placeholder page-item">No drafts</li>';return}for(const a of n){const o=document.createElement("li");o.className="page-item",a.id===f&&o.classList.add("active"),o.innerHTML=`<span class="page-title">${ce(a.title||a.slug)}</span><span class="status-chip status-draft">draft</span>`,o.addEventListener("click",()=>{var p;f=a.id,h=null,k(),d(),(p=s.onSelectDraft)==null||p.call(s,a)}),i.appendChild(o)}}k(),d(),fs(r,{onTreeChanged:s.onTreeChanged,onError:s.onError,onNotify:s.onNotify}),(u=e.querySelector('[data-catalog="__drafts__"]'))==null||u.addEventListener("click",()=>{const a=e.querySelector("#draft-list"),o=e.querySelector('[data-catalog="__drafts__"]'),p=(a==null?void 0:a.classList.toggle("hidden"))===!1;o==null||o.setAttribute("aria-expanded",String(p));const b=o==null?void 0:o.querySelector(".catalog-chevron");b&&(b.textContent=p?"▾":"▸")}),e.setActiveSlug=a=>{h=a,f=null,l.add(""),Z(l),k(),d()},e.setActiveDraft=a=>{f=a,h=null,k(),d()},e.refreshDrafts=a=>{n.length=0,n.push(...a),d();const o=e.querySelector(".catalog-drafts .catalog-count");o&&(o.textContent=String(n.length))},e.refreshTree=(a,o)=>{t.children=a.children??[],t.emoji=a.emoji,t.indexPageSlug=a.indexPageSlug,t.indexPageTitle=a.indexPageTitle,t.indexPageRelativePath=a.indexPageRelativePath,t.indexPageType=a.indexPageType,t.indexPageContentKind=a.indexPageContentKind,t.name=a.name,n.length=0,n.push(...o??[]),k(),d()}}function ce(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}const se="repomind-sidebar-width",Rt=220,Nt=420,G=280;function re(e){return Math.min(Nt,Math.max(Rt,e))}function ws(){try{const e=localStorage.getItem(se);if(!e)return G;const t=Number.parseInt(e,10);return Number.isFinite(t)?re(t):G}catch{return G}}function ee(e,t){e.style.setProperty("--sidebar-width",`${t}px`)}function Ss(e){const t=ws();ee(e,t);const n=document.createElement("div");n.className="sidebar-resize-handle",n.setAttribute("role","separator"),n.setAttribute("aria-orientation","vertical"),n.setAttribute("aria-label","Resize sidebar"),n.tabIndex=0;const s=e.querySelector("#sidebar");s!=null&&s.nextSibling?e.insertBefore(n,s.nextSibling):e.appendChild(n);let r=!1,i=0,l=t;const c=m=>{if(!r)return;const P=m.clientX-i;ee(e,re(l+P))},h=()=>{if(!r)return;r=!1,n.classList.remove("is-dragging"),document.body.style.cursor="",document.body.style.userSelect="";const m=ue(e);localStorage.setItem(se,String(m)),window.removeEventListener("pointermove",c),window.removeEventListener("pointerup",h)},f=m=>{m.button===0&&(r=!0,i=m.clientX,l=ue(e),n.classList.add("is-dragging"),document.body.style.cursor="col-resize",document.body.style.userSelect="none",n.setPointerCapture(m.pointerId),window.addEventListener("pointermove",c),window.addEventListener("pointerup",h))},g=m=>{const P=m.shiftKey?40:16;let k=ue(e);if(m.key==="ArrowLeft")k=re(k-P);else if(m.key==="ArrowRight")k=re(k+P);else if(m.key==="Home")k=Rt;else if(m.key==="End")k=Nt;else return;m.preventDefault(),ee(e,k),localStorage.setItem(se,String(k))},S=()=>{ee(e,G),localStorage.setItem(se,String(G))};return n.addEventListener("pointerdown",f),n.addEventListener("keydown",g),n.addEventListener("dblclick",S),()=>{n.removeEventListener("pointerdown",f),n.removeEventListener("keydown",g),n.removeEventListener("dblclick",S),n.remove()}}function ue(e){const t=getComputedStyle(e).getPropertyValue("--sidebar-width").trim(),n=Number.parseInt(t,10);return Number.isFinite(n)?n:G}function Es(e){const t=new EventSource("/api/events");return t.onmessage=()=>{e()},()=>{t.close()}}/**
267
+ * @license lucide v1.21.0 - ISC
268
+ *
269
+ * This source code is licensed under the ISC license.
270
+ * See the LICENSE file in the root directory of this source tree.
271
+ */const Ht={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};/**
272
+ * @license lucide v1.21.0 - ISC
273
+ *
274
+ * This source code is licensed under the ISC license.
275
+ * See the LICENSE file in the root directory of this source tree.
276
+ */const It=([e,t,n])=>{const s=document.createElementNS("http://www.w3.org/2000/svg",e);return Object.keys(t).forEach(r=>{s.setAttribute(r,String(t[r]))}),n!=null&&n.length&&n.forEach(r=>{const i=It(r);s.appendChild(i)}),s},Ls=(e,t={})=>{const s={...Ht,...t};return It(["svg",s,e])};/**
277
+ * @license lucide v1.21.0 - ISC
278
+ *
279
+ * This source code is licensed under the ISC license.
280
+ * See the LICENSE file in the root directory of this source tree.
281
+ */const ks=e=>{for(const t in e)if(t.startsWith("aria-")||t==="role"||t==="title")return!0;return!1};/**
282
+ * @license lucide v1.21.0 - ISC
283
+ *
284
+ * This source code is licensed under the ISC license.
285
+ * See the LICENSE file in the root directory of this source tree.
286
+ */const $s=(...e)=>e.filter((t,n,s)=>!!t&&t.trim()!==""&&s.indexOf(t)===n).join(" ").trim();/**
287
+ * @license lucide v1.21.0 - ISC
288
+ *
289
+ * This source code is licensed under the ISC license.
290
+ * See the LICENSE file in the root directory of this source tree.
291
+ */const Ps=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(t,n,s)=>s?s.toUpperCase():n.toLowerCase());/**
292
+ * @license lucide v1.21.0 - ISC
293
+ *
294
+ * This source code is licensed under the ISC license.
295
+ * See the LICENSE file in the root directory of this source tree.
296
+ */const Cs=e=>{const t=Ps(e);return t.charAt(0).toUpperCase()+t.slice(1)};/**
297
+ * @license lucide v1.21.0 - ISC
298
+ *
299
+ * This source code is licensed under the ISC license.
300
+ * See the LICENSE file in the root directory of this source tree.
301
+ */const Ts=e=>Array.from(e.attributes).reduce((t,n)=>(t[n.name]=n.value,t),{}),rt=e=>typeof e=="string"?e:!e||!e.class?"":e.class&&typeof e.class=="string"?e.class.split(" "):e.class&&Array.isArray(e.class)?e.class:"",at=(e,{nameAttr:t,icons:n,attrs:s})=>{var k;const r=e.getAttribute(t);if(r==null)return;const i=Cs(r),l=n[i];if(!l)return console.warn(`${e.outerHTML} icon name was not found in the provided icons object.`);const c=Ts(e),h=ks(c)?{}:{"aria-hidden":"true"},f={...Ht,"data-lucide":r,...h,...s,...c},g=rt(c),S=rt(s),m=$s("lucide",`lucide-${r}`,...g,...S);m&&Object.assign(f,{class:m});const P=Ls(l,f);return(k=e.parentNode)==null?void 0:k.replaceChild(P,e)};/**
302
+ * @license lucide v1.21.0 - ISC
303
+ *
304
+ * This source code is licensed under the ISC license.
305
+ * See the LICENSE file in the root directory of this source tree.
306
+ */const As=[["path",{d:"M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719"}]];/**
307
+ * @license lucide v1.21.0 - ISC
308
+ *
309
+ * This source code is licensed under the ISC license.
310
+ * See the LICENSE file in the root directory of this source tree.
311
+ */const qs=[["path",{d:"M18 6 6 18"}],["path",{d:"m6 6 12 12"}]];/**
312
+ * @license lucide v1.21.0 - ISC
313
+ *
314
+ * This source code is licensed under the ISC license.
315
+ * See the LICENSE file in the root directory of this source tree.
316
+ */const Ft=({icons:e={},nameAttr:t="data-lucide",attrs:n={},root:s=document,inTemplates:r}={})=>{if(!Object.values(e).length)throw new Error(`Please provide an icons object.
317
+ If you want to use all the icons you can import it like:
318
+ \`import { createIcons, icons } from 'lucide';
319
+ lucide.createIcons({icons});\``);if(typeof s>"u")throw new Error("`createIcons()` only works in a browser environment.");if(Array.from(s.querySelectorAll(`[${t}]`)).forEach(l=>at(l,{nameAttr:t,icons:e,attrs:n})),r&&Array.from(s.querySelectorAll("template")).forEach(c=>Ft({icons:e,nameAttr:t,attrs:n,root:c.content,inTemplates:r})),t==="data-lucide"){const l=s.querySelectorAll("[icon-name]");l.length>0&&(console.warn("[Lucide] Some icons were found with the now deprecated icon-name attribute. These will still be replaced for backwards compatibility, but will no longer be supported in v1.0 and you should switch to data-lucide"),Array.from(l).forEach(c=>at(c,{nameAttr:"icon-name",icons:e,attrs:n})))}},_t="repomind-ask-settings",pe={provider:"openai",model:"gpt-4o-mini",apiKey:""};function Ds(){try{const e=localStorage.getItem(_t);if(!e)return{...pe};const t=JSON.parse(e);return{provider:t.provider==="anthropic"?"anthropic":"openai",model:typeof t.model=="string"&&t.model.trim()?t.model.trim():pe.model,apiKey:typeof t.apiKey=="string"?t.apiKey:""}}catch{return{...pe}}}function fe(e){localStorage.setItem(_t,JSON.stringify(e))}function te(e){return e==="anthropic"?"claude-3-5-haiku-latest":"gpt-4o-mini"}function xs(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function ot(e,t,n={}){var f,g;const s=n.serverConfigured===!0,r=document.createElement("div");r.className="modal ask-settings-modal",r.innerHTML=`
320
+ <div class="modal-card ask-settings-card" role="dialog" aria-modal="true" aria-labelledby="ask-settings-title">
321
+ <h3 id="ask-settings-title" class="modal-title">Ask assistant settings</h3>
322
+ <p class="ask-settings-hint">${s?"API key is configured on the server via <code>REPOMIND_ASK_API_KEY</code> in <code>.env</code>. It is never sent from the browser.":"Your API key is stored only in this browser (localStorage) and sent to the local RepoMind server for each request."}</p>
323
+ <label class="modal-field">
324
+ <span class="modal-label">Provider</span>
325
+ <select id="ask-settings-provider" class="modal-input" ${s?"disabled":""}>
326
+ <option value="openai">OpenAI</option>
327
+ <option value="anthropic">Anthropic</option>
328
+ </select>
329
+ </label>
330
+ <label class="modal-field">
331
+ <span class="modal-label">Model</span>
332
+ <input type="text" id="ask-settings-model" class="modal-input" autocomplete="off" ${s?"disabled":""} />
333
+ </label>
334
+ ${s?"":`<label class="modal-field">
335
+ <span class="modal-label">API key</span>
336
+ <input type="password" id="ask-settings-api-key" class="modal-input" autocomplete="off" placeholder="sk-…" />
337
+ </label>`}
338
+ <div class="modal-actions">
339
+ <button type="button" class="btn-ghost" data-action="cancel">Cancel</button>
340
+ <button type="button" class="btn-primary" data-action="save">${s?"Close":"Save"}</button>
341
+ </div>
342
+ </div>
343
+ `;const i=r.querySelector("#ask-settings-provider"),l=r.querySelector("#ask-settings-model"),c=r.querySelector("#ask-settings-api-key");i&&(i.value=e.provider),l&&(l.value=e.model),c&&(c.value=e.apiKey),i==null||i.addEventListener("change",()=>{if(!i||!l)return;const S=i.value==="anthropic"?"anthropic":"openai";(l.value===te("openai")||l.value===te("anthropic"))&&(l.value=te(S))});function h(){r.remove()}r.addEventListener("click",S=>{S.target===r&&h()}),(f=r.querySelector('[data-action="cancel"]'))==null||f.addEventListener("click",h),(g=r.querySelector('[data-action="save"]'))==null||g.addEventListener("click",()=>{if(s){h();return}const S=(i==null?void 0:i.value)==="anthropic"?"anthropic":"openai";t({provider:S,model:(l==null?void 0:l.value.trim())||te(S),apiKey:(c==null?void 0:c.value.trim())??""}),h()}),document.body.appendChild(r)}function ge(e){return xs(e)}const Ms={MessageCircle:As,X:qs};function Rs(e){return e.replace(/\[([^\]]+)\]\(\?slug=([^)]+)\)/g,(t,n,s)=>`[${n}](#wikilink:${s})`)}function it(e,t){e.innerHTML=`<i data-lucide="${t?"x":"message-circle"}" aria-hidden="true"></i>`,Ft({icons:Ms,root:e,attrs:{width:22,height:22,"stroke-width":1.75}})}function Ns(e){var p,b;let t=Ds(),n=!1,s=!1,r=!1;const i=[];an().then(E=>{n=E.serverConfigured,n&&(t={provider:E.provider,model:E.model,apiKey:""},fe(t))}).catch(()=>{});const l=document.createElement("button");l.type="button",l.id="ask-toggle",l.className="ask-fab",l.setAttribute("aria-label","Open documentation assistant"),l.setAttribute("aria-pressed","false"),l.title="Ask",document.body.appendChild(l),it(l,!1);const c=document.createElement("aside");c.id="ask-panel",c.className="ask-panel hidden",c.setAttribute("aria-label","Documentation assistant"),c.innerHTML=`
344
+ <header class="ask-panel-header">
345
+ <div>
346
+ <h2 class="ask-panel-title">Ask</h2>
347
+ <p class="ask-panel-subtitle">Answers from published docs with source links</p>
348
+ </div>
349
+ <div class="ask-panel-actions">
350
+ <button type="button" class="btn-ghost ask-settings-btn" title="Settings">Settings</button>
351
+ <button type="button" class="btn-ghost ask-close-btn" title="Close">Close</button>
352
+ </div>
353
+ </header>
354
+ <div class="ask-messages" role="log" aria-live="polite"></div>
355
+ <form class="ask-form">
356
+ <textarea class="ask-input" rows="3" placeholder="Ask about your documentation…" aria-label="Question"></textarea>
357
+ <div class="ask-form-actions">
358
+ <button type="submit" class="btn-primary ask-submit-btn">Ask</button>
359
+ </div>
360
+ </form>
361
+ <p class="ask-error hidden" role="alert"></p>
362
+ `,document.body.appendChild(c);const h=c.querySelector(".ask-messages"),f=c.querySelector(".ask-form"),g=c.querySelector(".ask-input"),S=c.querySelector(".ask-submit-btn"),m=c.querySelector(".ask-error");function P(E){s=E,c.classList.toggle("hidden",!s),l.classList.toggle("ask-fab--open",s),l.setAttribute("aria-pressed",s?"true":"false"),l.setAttribute("aria-label",s?"Close documentation assistant":"Open documentation assistant"),it(l,s),s&&g.focus()}function k(E){if(!E){m.textContent="",m.classList.add("hidden");return}m.textContent=E,m.classList.remove("hidden")}function d(E){return E.length===0?"":`<div class="ask-sources"><span class="ask-sources-label">Sources</span>${E.map($=>`<button type="button" class="ask-source-chip" data-slug="${ge($.slug)}">${ge($.title)}</button>`).join("")}</div>`}function u(){h.innerHTML=i.map(E=>{if(E.role==="user")return`<div class="ask-message ask-message-user"><div class="ask-bubble">${ge(E.content)}</div></div>`;const q=St(Rs(E.content)),$=E.sources?d(E.sources):"";return`<div class="ask-message ask-message-assistant"><div class="ask-bubble markdown-body">${q}</div>${$}</div>`}).join(""),h.scrollTop=h.scrollHeight}function a(E){r=E,S.disabled=r,g.disabled=r,S.textContent=r?"Thinking…":"Ask"}async function o(){const E=g.value.trim();if(!(!E||r)){k(null),i.push({role:"user",content:E}),g.value="",u(),a(!0);try{const q=i.slice(0,-1).map(T=>({role:T.role,content:T.content})),$=await on(E,t,q);i.push({role:"assistant",content:$.answer,sources:$.sources}),u()}catch(q){const $=q instanceof Error?q.message:"Ask failed";k($),i.pop(),u(),$.includes("API key")&&ot(t,T=>{t=T,fe(t)},{serverConfigured:n})}finally{a(!1)}}}l.addEventListener("click",()=>{P(!s)}),(p=c.querySelector(".ask-close-btn"))==null||p.addEventListener("click",()=>{P(!1)}),(b=c.querySelector(".ask-settings-btn"))==null||b.addEventListener("click",()=>{ot(t,E=>{t=E,fe(t),k(null)},{serverConfigured:n})}),f.addEventListener("submit",E=>{E.preventDefault(),o()}),g.addEventListener("keydown",E=>{E.key==="Enter"&&!E.shiftKey&&(E.preventDefault(),o())}),h.addEventListener("click",E=>{const $=E.target.closest("[data-slug]");if(!$)return;const T=$.getAttribute("data-slug");T&&(e.onOpenSlug(T),P(!1))})}zn();ln();function he(e){return new Map(e.map(t=>[t.relativePath,t.slug]))}function me(e,t){var n;return(n=e.find(s=>s.slug===t))==null?void 0:n.relativePath}function R(e,t=!1){const n=document.querySelector("#banner");n&&(n.textContent=e,n.classList.toggle("error",t),n.classList.remove("hidden"),setTimeout(()=>n.classList.add("hidden"),5e3))}async function lt(e){var n;const{drafts:t}=await X();return(n=e.refreshDrafts)==null||n.call(e,t),t}async function Hs(){var T;const e=document.querySelector("#app");if(!e||!await dn(e))return;cn(document.querySelector("#theme-toggle"));const n=document.querySelector(".layout");n&&Ss(n);const s=document.querySelector("#sidebar"),r=document.querySelector("#workspace"),i=document.querySelector("#health-toggle"),l=document.querySelector("#stats"),c=document.querySelector("#global-search"),h=document.querySelector("#search-dropdown");let f=[],g=null,S=[],m="workspace",P=null,k=null;async function d(y){var L;const[{tree:C},{drafts:v}]=await Promise.all([Ue(),X()]);return(L=y.refreshTree)==null||L.call(y,C,v),S=Qe(C),C}function u(y){if(m=y,i.setAttribute("aria-pressed",String(y==="dashboard")),y==="dashboard"){P=gn(r,{onOpenDraft:v=>{u("workspace"),b(v)},onPublished:v=>{(async()=>(await d(s),await a(),R(`Published: ${v}`)))()},onNotify:(v,L)=>R(v,L)}).refresh;return}P=null,le(),_(r,null,o())}i.addEventListener("click",()=>{u(m==="dashboard"?"workspace":"dashboard")}),ns({onNext:()=>{if(m!=="workspace"||!g)return;const y=S.indexOf(g);y>=0&&y<S.length-1&&$(S[y+1])},onPrev:()=>{if(m!=="workspace"||!g)return;const y=S.indexOf(g);y>0&&$(S[y-1])},onFocusSearch:()=>{c.focus(),c.select()},onEdit:()=>{m==="workspace"&&g&&q(g)}});async function a(){const y=await pn(),v=await(await fetch("/api/stats")).json(),{drafts:L}=await X(),D=v.brokenRelatedCount>0?` · ${v.brokenRelatedCount} broken links`:"";l.textContent=`v${y.version} · ${y.docCount} pages · ${L.length} drafts${D}`}function o(){return{docIndex:f,onPublished:async y=>{f=(await j()).docs,await d(s),await a(),P==null||P(),R(`Published: ${y}`)},onError:y=>R(y,!0),onReloadDoc:y=>Q(y),onDraftsChanged:()=>{lt(s)},onCopyLink:()=>R("Link copied")}}function p(y){if(y.length===0){h.innerHTML='<p class="search-empty">No matches</p>',h.classList.remove("hidden");return}const C=document.createElement("ul");C.className="search-results";for(const v of y){const L=f.find(A=>A.slug===v.slug),D=document.createElement("li");D.innerHTML=`
363
+ <div class="search-result-title">${v.title}</div>
364
+ <div class="search-result-meta">${be((L==null?void 0:L.type)??"")} · ${v.snippet}</div>
365
+ `,D.addEventListener("click",()=>{h.classList.add("hidden"),c.value="",$(v.slug)}),C.appendChild(D)}h.innerHTML="",h.appendChild(C),h.classList.remove("hidden")}c.addEventListener("input",()=>{const y=c.value.trim();if(k&&clearTimeout(k),!y){h.classList.add("hidden"),h.innerHTML="";return}k=setTimeout(()=>{un(y).then(({results:C})=>p(C)).catch(C=>R(C instanceof Error?C.message:"Search failed",!0))},300)}),document.addEventListener("click",y=>{!h.contains(y.target)&&y.target!==c&&h.classList.add("hidden")});function b(y){var v;u("workspace"),(v=s.setActiveDraft)==null||v.call(s,y.id);const C=y.forked_from??(f.some(L=>L.slug===y.slug)?y.slug:null);if(C){Q(C).then(L=>{Ye(r,L,y,{...o(),docRelativePath:me(f,C),slugByRelative:he(f),onPublished:async D=>{await o().onPublished(D),await $(y.slug)}})}).catch(()=>{Ke(r,y,E(),f)});return}Ke(r,y,E(),f)}function E(){return{onPublished:y=>{(async()=>{f=(await j()).docs,await d(s),await a(),P==null||P(),R(`Published: ${y}`);const v=f.find(L=>L.slug===draft.slug);v&&await $(v.slug)})()},onClosed:()=>{_(r,null,o())},onDeleted:()=>{(async()=>(await d(s),_(r,null,o())))()},onError:y=>R(y,!0)}}async function q(y){if(m==="workspace")try{const C=await Q(y),{draft:v}=await dt(y);await lt(s),Ye(r,C,v,{...o(),docRelativePath:me(f,y),slugByRelative:he(f)})}catch(C){R(C instanceof Error?C.message:"Edit failed",!0)}}async function $(y,C={}){var D;const v=C.updateUrl??!0,L=C.urlMode??"push";m==="dashboard"&&u("workspace"),g=y,(D=s.setActiveSlug)==null||D.call(s,y);try{const A=await Q(y),H=me(f,y);_(r,A,{...o(),docRelativePath:H,slugByRelative:he(f)}),v&&Vn(y,L)}catch(A){R(A instanceof Error?A.message:"Failed to load doc",!0)}}Ns({onOpenSlug:y=>{$(y)}}),r.addEventListener("navigate-slug",(y=>{$(y.detail.slug)}));try{await a();const[y,{tree:C},{drafts:v}]=await Promise.all([j(),Ue(),X()]);f=y.docs,S=Qe(C),bs(s,C,v,{onSelectSlug:A=>{$(A)},onSelectDraft:A=>b(A),onTreeChanged:()=>{(async()=>(f=(await j()).docs,await d(s),await a()))()},onFsDeleted:A=>{(async()=>(f=(await j()).docs,g&&A.includes(g)&&(g=null,_(r,null,o())),await d(s),await a()))()},onError:A=>R(A,!0),onNotify:A=>R(A)}),Es(()=>{(async()=>{try{f=(await j()).docs,await d(s),await a(),g&&!f.some(H=>H.slug===g)&&(g=null,_(r,null,o()))}catch{}})()}),Jn(A=>{if(!A){g=null,_(r,null,o());return}f.some(H=>H.slug===A)&&$(A,{updateUrl:!1})}),_(r,null,o());const L=$e(),D=Kn();if(D){const A=v.find(H=>H.id===D);A?b(A):R(`Unknown draft: ${D}`,!0)}else if(L)f.some(A=>A.slug===L)?await $(L,{updateUrl:!1}):R(`Unknown page: ${L}`,!0);else{const A=jn(),H=A?(T=f.find(Y=>Y.relativePath===A))==null?void 0:T.slug:void 0;A&&H?await $(H,{updateUrl:!1}):A?R(`Unknown path: ${A}`,!0):C.indexPageSlug?await $(C.indexPageSlug,{urlMode:"replace"}):f.length>0&&f[0]&&await $(f[0].slug,{urlMode:"replace"})}}catch(y){R(y instanceof Error?y.message:"Failed to load workspace",!0)}}Hs();export{mt as _,En as a,Ft as c,Wn as e,_s as f,gt as p};