@plebeiantech/lat.md 0.12.3-fork.4 → 0.12.3-fork.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/src/cli/index.js +29 -4
  2. package/dist/src/cli/search.js +6 -4
  3. package/dist/src/cli/ui-build.d.ts +4 -0
  4. package/dist/src/cli/ui-build.js +13 -0
  5. package/dist/src/cli/ui.js +18 -2
  6. package/dist/src/code-refs.js +25 -4
  7. package/dist/src/fork/upstream-drift-cli.d.ts +1 -0
  8. package/dist/src/fork/upstream-drift-cli.js +2 -0
  9. package/dist/src/fork/upstream-drift.d.ts +26 -0
  10. package/dist/src/fork/upstream-drift.js +185 -0
  11. package/dist/src/fork/upstream-guard-cli.d.ts +1 -0
  12. package/dist/src/fork/upstream-guard-cli.js +2 -0
  13. package/dist/src/fork/upstream-guard.d.ts +72 -0
  14. package/dist/src/fork/upstream-guard.js +445 -0
  15. package/dist/src/lattice.d.ts +1 -0
  16. package/dist/src/search/search.d.ts +1 -0
  17. package/dist/src/search/search.js +15 -9
  18. package/dist/src/view/client/assets/index-VZwPPiFE.js +334 -0
  19. package/dist/src/view/client/assets/index-W8ktvNj9.css +1 -0
  20. package/dist/src/view/client/assets/logo-CNF8zs47.svg +182 -0
  21. package/dist/src/view/client/index.html +2 -2
  22. package/dist/src/view/git-diff.js +17 -0
  23. package/dist/src/view/graph.d.ts +6 -0
  24. package/dist/src/view/graph.js +176 -0
  25. package/dist/src/view/markdown.d.ts +5 -1
  26. package/dist/src/view/markdown.js +112 -25
  27. package/dist/src/view/protocol.d.ts +43 -0
  28. package/dist/src/view/protocol.js +1 -1
  29. package/dist/src/view/references.d.ts +2 -0
  30. package/dist/src/view/references.js +30 -8
  31. package/dist/src/view/repository.d.ts +5 -2
  32. package/dist/src/view/repository.js +13 -12
  33. package/dist/src/view/search.js +1 -0
  34. package/dist/src/view/server.d.ts +3 -0
  35. package/dist/src/view/server.js +42 -9
  36. package/dist/src/view/source-target.d.ts +8 -0
  37. package/dist/src/view/source-target.js +22 -0
  38. package/dist/src/view/static-build.d.ts +16 -0
  39. package/dist/src/view/static-build.js +408 -0
  40. package/dist/src/view/static-protocol.d.ts +23 -0
  41. package/dist/src/view/static-protocol.js +10 -0
  42. package/dist/src/view/store.d.ts +9 -1
  43. package/dist/src/view/store.js +82 -15
  44. package/dist/src/view/table-of-contents.d.ts +9 -0
  45. package/dist/src/view/table-of-contents.js +103 -0
  46. package/package.json +3 -1
  47. package/templates/AGENTS.md +2 -0
  48. package/templates/skill/SKILL.md +2 -0
  49. package/dist/src/view/client/assets/index-B0n0u03y.css +0 -1
  50. package/dist/src/view/client/assets/index-xm2_px4q.js +0 -23
@@ -0,0 +1 @@
1
+ :root{color:#171717;background:#fff;font-family:Geist,Geist Sans,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-synthesis:none;text-rendering:optimizeLegibility;color-scheme:light dark;--background: #fff;--panel: #fafafa;--sidebar: #fafafa;--sidebar-selection: #eaeaea;--panel-border: #eaeaea;--text: #171717;--muted: #666;--accent: #171717;--accent-soft: #ededed;--link: #0070f3;--danger: #e5484d;--danger-soft: #ffebe9;--danger-border: #f3b8b8;--warning: #b7791f;--warning-soft: #fff4ce;--success: #2e7d46;--success-soft: #e9f9ee;--git-notification: #e47f19;--code: #f5f5f5;--context-surface: #f7f7f7;--inline-code: #ededed;--reference-control: #e5e5e5;--graph-document: #0070f3;--graph-code: #d97706;--syntax-built-in: #9a3f75;--syntax-comment: #737373;--syntax-keyword: #6c4bc2;--syntax-number: #a85414;--syntax-string: #397348;--syntax-title: #26649a}@media(prefers-color-scheme:dark){:root{color:#ededed;background:#000;--background: #000;--panel: #0a0a0a;--sidebar: #000;--sidebar-selection: #242424;--panel-border: #262626;--text: #ededed;--muted: #888;--accent: #fff;--accent-soft: #1f1f1f;--link: rgb(82, 168, 255);--danger: #ff6166;--danger-soft: #2a1314;--danger-border: #5c2628;--warning: #f5a623;--warning-soft: #2a210f;--success: #62c073;--success-soft: #12261a;--git-notification: #f0a044;--code: #111;--context-surface: #111;--inline-code: #1f1f1f;--reference-control: #262626;--graph-document: rgb(82, 168, 255);--graph-code: #f5a623;--syntax-built-in: #e6a2cc;--syntax-comment: #888;--syntax-keyword: #c2adff;--syntax-number: #efb271;--syntax-string: #9fd0a5;--syntax-title: #8fc6ef}}*{box-sizing:border-box}body{margin:0;min-width:320px;min-height:100vh;color:var(--text);background:var(--background);-webkit-font-smoothing:antialiased}::selection{color:var(--background);background:var(--text)}a{color:var(--link)}.app-shell{display:grid;grid-template-columns:260px minmax(0,1fr);min-height:100vh}.sidebar{position:sticky;top:0;height:100vh;padding:28px 18px;overflow-y:auto;background:var(--sidebar);border-right:0}.sidebar-header{display:flex;margin:0 2px 34px 10px;align-items:center;justify-content:space-between}.mobile-navigation-trigger{display:none}.brand{display:inline-flex;min-width:0;align-items:center;overflow:hidden;color:var(--text);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:21px;font-weight:750;letter-spacing:-.04em;text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.brand-logo{display:block;width:auto;height:21px;flex:none}.brand span{color:inherit}.sidebar-actions{display:flex;flex:none;align-items:center;gap:3px}.sidebar-search,.sidebar-graph,.sidebar-git{display:inline-flex;width:28px;height:28px;align-items:center;justify-content:center;color:var(--muted);cursor:pointer;background:transparent;border:0;border-radius:6px}.sidebar-search:hover,.sidebar-search[aria-current=page],.sidebar-graph:hover,.sidebar-graph[aria-current=page],.sidebar-git:hover{color:var(--accent);background:var(--sidebar-selection)}.sidebar-git[aria-pressed=true]{color:var(--warning);background:var(--warning-soft)}.sidebar-git{position:relative}.sidebar-git[data-has-changes=true]:after{position:absolute;top:3px;right:3px;width:6px;height:6px;content:"";background:var(--git-notification);border-radius:50%;box-shadow:0 0 0 1.5px var(--sidebar)}.sidebar-search svg,.sidebar-graph svg,.sidebar-git svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-linecap:round;stroke-width:1.8}.file-tree{display:grid;min-width:0;gap:2px}.tree-directory>summary{display:flex;padding:7px 10px;align-items:center;gap:7px;color:var(--muted);font-size:12px;font-weight:650;cursor:pointer;list-style:none;border-radius:7px}.tree-directory>summary::-webkit-details-marker{display:none}.tree-directory>summary>a,.tree-directory>summary>span{min-width:0;flex:1;color:inherit;text-decoration:none}.tree-directory>summary>a,.tree-directory>summary>span{display:flex;align-items:center;gap:8px}.tree-directory>summary:before{content:"›";display:inline-block;width:10px;font-size:15px;line-height:1;transform-origin:center;transition:transform .12s ease}.tree-directory[open]>summary:before{transform:rotate(90deg)}.tree-directory>summary:hover{color:var(--text);background:var(--sidebar-selection)}.tree-children{display:grid;margin-left:15px;padding-left:7px;gap:2px;border-left:1px solid var(--panel-border)}.tree-directory[open]>.tree-children{margin-top:2px}.document-link{display:flex;padding:7px 10px;align-items:center;gap:8px;overflow:hidden;color:var(--muted);font-size:13px;line-height:1.35;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;border-radius:7px}.document-link-name{min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document-state-disc{width:7px;height:7px;flex:0 0 auto;border-radius:50%}.document-state-disc.has-errors{background:var(--danger);box-shadow:0 0 0 2px color-mix(in srgb,var(--danger) 12%,transparent)}.document-state-disc.git-modified{background:var(--warning);box-shadow:0 0 0 2px color-mix(in srgb,var(--warning) 12%,transparent)}.document-state-disc.git-new{background:var(--success);box-shadow:0 0 0 2px color-mix(in srgb,var(--success) 12%,transparent)}.document-state-disc.has-errors.git-modified{background:linear-gradient(90deg,var(--danger) 0 50%,var(--warning) 50% 100%)}.document-state-disc.has-errors.git-new{background:linear-gradient(90deg,var(--danger) 0 50%,var(--success) 50% 100%)}.document-link:hover,.document-link.active{color:var(--text);background:var(--sidebar-selection)}.document-link.active{font-weight:650}.main{--document-gutter: clamp(28px, 3vw, 48px);--document-toc-gutter: calc(var(--document-gutter) + 16px);width:100%;max-width:1280px;min-width:0;padding:28px var(--document-gutter) 100px}.main.restoring-history-scroll{visibility:hidden}.document-header{max-width:760px;margin-bottom:34px}.document-layout{display:grid;grid-template-columns:minmax(0,760px) 286px;grid-template-areas:"document toc";gap:var(--document-toc-gutter);align-items:start}.document-column{grid-area:document;min-width:0}.document-toc{grid-area:toc;position:sticky;top:28px;height:calc(100vh - 56px);box-sizing:border-box;padding-right:16px;overflow:hidden}.document-toc-title{display:flex;width:100%;min-height:24px;padding:0;align-items:center;gap:9px;color:var(--muted);font-family:inherit;font-size:13px;font-weight:650;text-align:left;background:transparent;border:0}.document-toc-toggle{display:none}.document-toc-title svg{width:17px;height:17px;flex:0 0 auto;fill:none;stroke:currentColor;stroke-linecap:round;stroke-width:2}.document-toc-list{display:block;max-height:calc(100% - 38px);margin-top:14px;overflow-y:auto;overscroll-behavior:contain;border-left:1px solid var(--panel-border);scrollbar-width:none}.document-toc-list::-webkit-scrollbar{display:none}.document-toc-link{position:relative;display:flex;padding:7px 0 7px calc(14px + var(--toc-depth) * 13px);align-items:center;gap:7px;color:var(--muted);font-size:12.5px;font-weight:520;line-height:17px;text-decoration:none;transition:color .14s ease;overflow-wrap:anywhere}.document-toc-link-label{min-width:0;flex:1}.document-toc-states{display:inline-flex;padding-right:2px;flex:0 0 auto;align-items:center;gap:4px}.document-toc-state{width:6px;height:6px;border-radius:50%;box-shadow:0 0 0 2px color-mix(in srgb,currentColor 12%,transparent)}.document-toc-state.git{color:var(--git-notification);background:currentColor}.document-toc-state.error{color:var(--danger);background:currentColor}.document-toc-link:before{position:absolute;top:4px;bottom:4px;left:-1px;width:2px;content:"";background:transparent;border-radius:2px}.document-toc-link:hover{color:var(--text)}.document-toc-link[data-depth="1"]{font-weight:650}.document-toc-link[aria-current=location]{color:var(--link)}.document-toc-link[aria-current=location]:before{background:var(--link)}.document-metadata{display:flex;min-height:28px;align-items:center;gap:10px;flex-wrap:wrap}.document-path{min-width:0;overflow-wrap:anywhere;color:var(--muted);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:12px}.document-flag{padding:3px 8px;color:var(--accent);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:10px;font-weight:700;letter-spacing:.025em;background:var(--accent-soft);border:1px solid color-mix(in srgb,var(--accent) 25%,transparent);border-radius:999px}.document-error-toggle{display:inline-flex;padding:3px 8px;align-items:center;color:var(--danger);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:10px;font-weight:700;letter-spacing:.025em;cursor:pointer;background:var(--danger-soft);border:1px solid var(--danger-border);border-radius:999px}.document-error-toggle:hover,.document-error-toggle[aria-expanded=true]{color:var(--text)}.document-error-panel{margin-top:12px;overflow:hidden;font-family:Geist,Geist Sans,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:color-mix(in srgb,var(--danger-soft) 55%,var(--background));border:1px solid var(--danger-border);border-radius:8px}.document-error-header{padding:9px 13px 7px;color:var(--danger);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:10px;font-weight:750;letter-spacing:.08em;text-transform:uppercase}.document-error-item{display:grid;padding:10px 13px 11px;gap:5px;color:inherit;text-decoration:none}.document-error-item+.document-error-item{border-top:1px solid var(--danger-border)}.document-error-item:hover{background:color-mix(in srgb,var(--danger-soft) 75%,transparent)}.document-error-location{color:var(--danger);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:11px;font-weight:700}.document-error-message{color:var(--muted);font-size:12px;line-height:1.45;white-space:pre-wrap}.source-context{position:relative;z-index:1;width:calc(100% - 5.25rem);max-width:760px;margin:12px 16px 12px 4.25rem;overflow:visible;font-family:Geist,Geist Sans,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:var(--context-surface);border:1px solid var(--panel-border);border-radius:8px}.source-context.has-references:not(.references-open){margin-bottom:24px}.source-context-header{display:flex;min-height:36px;padding:7px 10px 7px 13px;align-items:center;gap:12px;color:var(--muted);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:10px;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.source-reference-toggle{position:relative;z-index:1;display:flex;height:0;align-items:center;gap:10px}.source-reference-toggle:before,.source-reference-toggle:after{height:1px;flex:1;content:"";background:var(--panel-border);visibility:hidden}.source-context.references-open .source-reference-toggle:before,.source-context.references-open .source-reference-toggle:after{visibility:visible}.source-reference-toggle button{display:inline-flex;padding:4px 7px;align-items:center;gap:6px;color:var(--accent);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:10px;font-weight:650;line-height:1.3;letter-spacing:.02em;text-transform:none;cursor:pointer;background:var(--reference-control);border:0;border-radius:5px}.source-reference-toggle button:hover{color:var(--text)}.source-reference-toggle button>span{min-width:16px;padding:1px 4px;color:var(--muted);text-align:center;background:color-mix(in srgb,var(--background) 65%,transparent);border-radius:999px}.source-context-current{padding:0 13px 13px}.source-context-current>a,.source-reference-item>a{color:var(--text);text-decoration:none}.source-breadcrumbs{display:flex;align-items:center;gap:5px;overflow:hidden;color:var(--link);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:12px;font-weight:650;white-space:nowrap}.source-breadcrumbs>span{display:inline-flex;min-width:0;align-items:center;gap:5px}.source-breadcrumbs>span>span{color:var(--muted)}.source-context-current>a:hover .source-breadcrumbs,.source-reference-item>a:hover .source-breadcrumbs{text-decoration:underline;text-underline-offset:3px}.source-context-paragraph p{margin:8px 0 0;color:var(--text);font-size:13px;line-height:1.5}.source-context-paragraph a,.source-reference-paragraph a{text-underline-offset:2px}.source-reference-list{padding:17px 0 3px}.source-reference-item{padding:10px 13px}.source-reference-item+.source-reference-item{border-top:1px solid var(--panel-border)}.source-reference-paragraph p{margin:5px 0 0;color:var(--muted);font-size:12px;line-height:1.4}.source-code{max-width:100%;padding:10px 0;overflow-x:auto;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:13px;line-height:1.55;background:var(--code);border:1px solid var(--panel-border);border-radius:10px;overflow-anchor:none}.document-metadata+.source-code{margin-top:14px}.source-collapse{display:flex;min-width:max-content;min-height:34px;align-items:center;color:var(--muted);background:color-mix(in srgb,var(--panel) 52%,transparent);border-top:1px solid color-mix(in srgb,var(--panel-border) 72%,transparent);border-bottom:1px solid color-mix(in srgb,var(--panel-border) 72%,transparent)}.source-collapse:first-child{margin-top:-10px;border-top:0;border-radius:10px 10px 0 0}.source-collapse:last-child{margin-bottom:-10px;border-bottom:0;border-radius:0 0 10px 10px}.source-collapse>span{flex:0 0 4.25rem;padding-right:14px;text-align:right;-webkit-user-select:none;user-select:none}.source-collapse button{padding:6px 20px 6px 0;color:var(--muted);font:inherit;font-size:11px;cursor:pointer;background:transparent;border:0}.source-collapse button:hover{color:var(--accent)}.source-line{display:flex;min-width:max-content}.source-line.focused{background:color-mix(in srgb,var(--accent-soft) 72%,transparent)}.source-line-number{flex:0 0 4.25rem;padding-right:14px;color:var(--muted);text-align:right;-webkit-user-select:none;user-select:none}.source-line.focused .source-line-number{color:var(--accent)}.source-line-content{flex:1 0 auto;padding-right:20px;color:var(--text);white-space:pre}.source-code .hljs-comment,.source-code .hljs-quote{color:var(--syntax-comment);font-style:italic}.source-code .hljs-keyword,.source-code .hljs-literal,.source-code .hljs-selector-tag,.source-code .hljs-section{color:var(--syntax-keyword)}.source-code .hljs-string,.source-code .hljs-regexp,.source-code .hljs-addition,.source-code .hljs-attribute{color:var(--syntax-string)}.source-code .hljs-number,.source-code .hljs-symbol,.source-code .hljs-bullet{color:var(--syntax-number)}.source-code .hljs-title,.source-code .hljs-function,.source-code .hljs-class,.source-code .hljs-type{color:var(--syntax-title)}.source-code .hljs-built_in,.source-code .hljs-variable.language_,.source-code .hljs-meta{color:var(--syntax-built-in)}.source-code .hljs-deletion{color:#bd3d3d}.source-code .hljs-emphasis{font-style:italic}.source-code .hljs-strong{font-weight:700}.markdown{max-width:760px;font-size:16px;line-height:1.72}.markdown h1,.markdown h2,.markdown h3,.markdown h4{margin:2em 0 .65em;line-height:1.2;letter-spacing:-.025em;scroll-margin-top:24px}.section-back-reference-toggle{display:inline-flex;padding:3px 5px 3px 7px;margin-left:10px;align-items:center;gap:5px;color:var(--accent);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:10px;font-weight:650;line-height:1.3;letter-spacing:.01em;vertical-align:middle;cursor:pointer;background:var(--reference-control);border:0;border-radius:5px}.section-back-reference-toggle:hover,.section-back-reference-toggle[aria-expanded=true]{color:var(--text)}.section-back-reference-count{min-width:16px;padding:1px 4px;color:var(--muted);text-align:center;background:color-mix(in srgb,var(--background) 65%,transparent);border-radius:999px}.section-back-reference-panel{margin:-.15em 0 1.5em;overflow:hidden;font-family:Geist,Geist Sans,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:var(--context-surface);border:1px solid var(--panel-border);border-radius:8px}.section-back-reference-panel[hidden]{display:none}.section-back-reference-header{padding:9px 13px 7px;color:var(--muted);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:10px;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.section-back-reference-item{padding:10px 13px 11px}.section-back-reference-item+.section-back-reference-item{border-top:1px solid var(--panel-border)}.section-back-reference-location{display:inline-flex;align-items:center;gap:5px;color:var(--link);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:12px;font-weight:650;line-height:1.35;text-decoration:none}.section-back-reference-location:hover{text-decoration:underline;text-underline-offset:3px}.section-back-reference-location>span[aria-hidden=true]{color:var(--muted)}.section-back-reference-paragraph p{margin:5px 0 0;color:var(--muted);font-size:12px;line-height:1.45}.section-back-reference-paragraph a{text-underline-offset:2px}.section-back-reference-code .code-link-language{margin-right:0;font-size:7px}.markdown .section-back-reference-code>code{display:block;padding:7px 9px;margin-top:7px;overflow-x:auto;color:var(--muted);font-size:11px;line-height:1.4;white-space:pre;border:1px solid color-mix(in srgb,var(--panel-border) 75%,transparent)}.markdown h1{margin-top:0;font-size:clamp(32px,5vw,46px)}.markdown h2{font-size:26px}.markdown h3{font-size:20px}.markdown p,.markdown ul,.markdown ol,.markdown blockquote,.markdown pre{margin:0 0 1.25em}.markdown li+li{margin-top:.35em}.markdown a{overflow-wrap:anywhere;text-decoration-thickness:1px;text-underline-offset:3px}.markdown .markdown-error{color:var(--danger);scroll-margin-top:24px;text-decoration-color:currentColor}.markdown p.markdown-error,.markdown li.markdown-error,.markdown blockquote.markdown-error,.markdown pre.markdown-error,.markdown h1.markdown-error,.markdown h2.markdown-error,.markdown h3.markdown-error,.markdown h4.markdown-error,.markdown h5.markdown-error,.markdown h6.markdown-error{padding-left:10px;background:color-mix(in srgb,var(--danger-soft) 42%,transparent);box-shadow:inset 3px 0 0 var(--danger)}.markdown a.markdown-error,.markdown span.markdown-error{padding:.08em .2em;margin:-.08em -.2em;background:var(--danger-soft);border-radius:3px;box-decoration-break:clone;-webkit-box-decoration-break:clone}.markdown ins.git-added,.markdown del.git-removed{padding:.08em .12em;margin:-.08em -.04em;border-radius:3px;box-decoration-break:clone;-webkit-box-decoration-break:clone}.markdown ins.git-added{color:var(--success);text-decoration:none;background:var(--success-soft)}.markdown del.git-removed{color:var(--danger);background:var(--danger-soft);text-decoration-thickness:1px}.markdown p.git-added,.markdown blockquote.git-added,.markdown pre.git-added,.markdown h1.git-added,.markdown h2.git-added,.markdown h3.git-added,.markdown h4.git-added,.markdown h5.git-added,.markdown h6.git-added,.markdown ul.git-added,.markdown ol.git-added,.markdown li.git-added{padding-left:10px;color:var(--success);background:color-mix(in srgb,var(--success-soft) 55%,transparent);box-shadow:inset 3px 0 0 var(--success)}.markdown pre:has(>code.git-added){color:var(--success);background:color-mix(in srgb,var(--success-soft) 55%,var(--code));box-shadow:inset 3px 0 0 var(--success)}.markdown p.git-removed,.markdown div.git-removed,.markdown blockquote.git-removed,.markdown pre.git-removed,.markdown ul.git-removed,.markdown ol.git-removed,.markdown li.git-removed{padding-left:10px;color:var(--danger);text-decoration:line-through;background:color-mix(in srgb,var(--danger-soft) 55%,transparent);box-shadow:inset 3px 0 0 var(--danger)}.markdown pre:has(>code.git-removed){color:var(--danger);text-decoration:line-through;background:color-mix(in srgb,var(--danger-soft) 55%,var(--code));box-shadow:inset 3px 0 0 var(--danger)}.wiki-link-context{color:var(--muted)}a.wiki-link-segmented{text-decoration:none}a.wiki-link-segmented>.wiki-link-context,a.wiki-link-segmented>.wiki-link-leaf{text-decoration-line:underline;text-decoration-color:currentColor;text-decoration-thickness:1px;text-underline-offset:3px}.wiki-link-ref-count{display:inline-flex;min-width:1.45em;height:1.45em;padding:0 .34em;margin-left:.4em;align-items:center;justify-content:center;color:var(--muted);font-size:.66em;font-style:normal;font-weight:750;line-height:1;text-decoration:none;vertical-align:.15em;background:color-mix(in srgb,var(--muted) 14%,transparent);border-radius:999px}.markdown a:hover .wiki-link-ref-count{color:var(--text)}.external-link-icon{display:inline-block;width:.78em;height:.78em;margin-left:.28em;vertical-align:.02em;background:currentColor;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M15 3h6v6M10 14 21 3M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M15 3h6v6M10 14 21 3M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat}.code-link-language{display:inline-flex;width:1.55em;height:1.55em;margin-right:.38em;align-items:center;justify-content:center;color:var(--background);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.62em;font-style:normal;font-weight:800;line-height:1;text-decoration:none;vertical-align:.12em;background:var(--text);border-radius:3px}.code-link-leading{display:inline-flex;align-items:baseline;white-space:nowrap}a.wiki-link-active{padding:.12em .28em;margin:-.12em -.28em;background:var(--accent-soft);border-radius:4px;box-decoration-break:clone;-webkit-box-decoration-break:clone}.markdown blockquote{margin-left:0;padding-left:18px;color:var(--muted);border-left:3px solid var(--panel-border)}.markdown code{padding:.16em .36em;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.9em;background:var(--inline-code);border-radius:5px}.markdown pre{padding:18px 20px;overflow-x:auto;background:var(--code);border:1px solid var(--panel-border);border-radius:10px}.markdown pre code{padding:0;background:transparent}.markdown img{max-width:100%}.markdown hr{margin:2.5em 0;border:0;border-top:1px solid var(--panel-border)}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;white-space:nowrap;border:0;clip:rect(0,0,0,0)}.search-page{width:100%;max-width:760px}.search-input-shell{display:flex;height:52px;padding:0 16px;align-items:center;gap:11px;color:var(--muted);background:var(--panel);border:1px solid var(--panel-border);border-radius:6px;box-shadow:0 1px 1px color-mix(in srgb,var(--text) 5%,transparent)}.search-input-shell:focus-within{color:var(--accent);border-color:color-mix(in srgb,var(--accent) 55%,var(--panel-border));box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 12%,transparent)}.search-input-shell svg{width:20px;height:20px;flex:0 0 auto;fill:none;stroke:currentColor;stroke-linecap:round;stroke-width:1.8}.search-input-shell input{width:100%;min-width:0;padding:0;color:var(--text);font:inherit;font-size:17px;line-height:1;background:transparent;border:0;outline:0}.search-input-shell input::placeholder{color:var(--muted)}.search-input-shell input::-webkit-search-cancel-button{cursor:pointer}.search-status{min-height:42px;padding:12px 2px 8px;color:var(--muted);font-size:12px}.search-results{display:grid;gap:10px}.search-result{display:block;padding:16px 18px;color:var(--text);text-decoration:none;background:color-mix(in srgb,var(--panel) 72%,transparent);border:1px solid var(--panel-border);border-radius:6px;transition:border-color .12s ease,background .12s ease,transform .12s ease}.search-result:hover{background:var(--panel);border-color:color-mix(in srgb,var(--accent) 38%,var(--panel-border));transform:translateY(-1px)}.search-result-breadcrumbs{display:flex;align-items:center;gap:5px;overflow:hidden;color:var(--link);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:11px;font-weight:650;white-space:nowrap}.search-result-breadcrumbs>span{display:inline-flex;min-width:0;align-items:center;gap:5px}.search-result-breadcrumbs>span>span{color:var(--muted)}.search-result h2{margin:7px 0 0;font-size:18px;line-height:1.3;letter-spacing:-.015em}.search-result p{margin:6px 0 0;color:var(--muted);font-size:13px;line-height:1.5}.state{display:flex;min-height:50vh;align-items:center;justify-content:center;color:var(--muted)}.state.error{flex-direction:column;gap:8px;text-align:center}.state.error strong{color:var(--text)}.graph-shell{position:relative;height:100vh;overflow:hidden;background:var(--panel)}.graph-topbar{position:absolute;z-index:8;inset:0 auto auto 0;width:50%;height:84px;pointer-events:none}.graph-topbar-graph{display:flex;min-width:0;padding:0 28px;align-items:center;gap:14px;height:100%;pointer-events:auto}.graph-topbar-graph .graph-header{display:flex;min-width:0;flex:0 0 212px;align-items:center;justify-content:space-between}.graph-topbar-graph .graph-tools{min-width:0}.graph-workspace{display:grid;height:100vh;min-height:0;grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.graph-pane,.graph-inspector{position:relative;min-width:0;min-height:0}.graph-pane{overflow:hidden;border-right:1px solid var(--panel-border)}.graph-canvas-shell,.graph-canvas{position:absolute;inset:0}.graph-canvas-shell{background:radial-gradient(circle at center,color-mix(in srgb,var(--accent-soft) 22%,transparent),transparent 58%),var(--panel)}.graph-tools{display:flex;min-width:0;flex:1 1 auto;align-items:center;gap:8px}.graph-filter{display:flex;min-width:100px;height:36px;flex:1 1 220px;align-items:center;background:color-mix(in srgb,var(--background) 72%,transparent);border:1px solid var(--panel-border);border-radius:8px}.graph-filter:focus-within{border-color:color-mix(in srgb,var(--accent) 55%,var(--panel-border));box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 12%,transparent)}.graph-filter input{width:auto;min-width:0;flex:1 1 auto;padding:0 12px;color:var(--text);font:inherit;font-size:13px;background:transparent;border:0;outline:0}.graph-filter input::placeholder{color:var(--muted)}.graph-kind-filters{display:flex;flex:0 0 auto;align-items:center;gap:5px}.graph-kind-filters label{position:relative;display:inline-flex;cursor:pointer}.graph-kind-filters input{position:absolute;opacity:0;pointer-events:none}.graph-kind-filters label span{padding:4px 7px;color:var(--muted);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:9px;font-weight:700;text-transform:capitalize;background:color-mix(in srgb,var(--background) 82%,transparent);border:1px solid var(--panel-border);border-radius:999px;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.graph-kind-filters input:checked+span{color:var(--accent);background:var(--accent-soft);border-color:color-mix(in srgb,var(--accent) 30%,var(--panel-border))}.graph-kind-filters input:focus-visible+span{outline:2px solid var(--accent);outline-offset:2px}.graph-node-count{flex:0 0 auto;padding-right:10px;color:var(--muted);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:9px;font-weight:650;white-space:nowrap}.graph-fit{position:absolute;z-index:4;right:18px;bottom:18px;padding:5px 8px;color:var(--muted);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:9px;font-weight:700;cursor:pointer;background:color-mix(in srgb,var(--background) 84%,transparent);border:1px solid var(--panel-border);border-radius:6px;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.graph-fit:hover{color:var(--accent);border-color:color-mix(in srgb,var(--accent) 35%,var(--panel-border))}.graph-legend{position:absolute;z-index:4;bottom:20px;left:18px;display:flex;gap:12px;color:var(--muted);font-size:9px;font-weight:650}.graph-legend span{display:inline-flex;align-items:center;gap:5px}.graph-legend span:before{width:6px;height:6px;content:"";background:currentColor;border-radius:50%}.graph-legend .document{color:var(--graph-document)}.graph-legend .code{color:var(--graph-code)}.graph-legend .document input:checked+span{color:var(--graph-document)}.graph-legend .code input:checked+span{color:var(--graph-code)}.graph-legend input:not(:checked)+span{opacity:.42}.graph-no-results{position:absolute;z-index:3;inset:0;display:flex;align-items:center;justify-content:center;color:var(--muted);font-size:12px;pointer-events:none}.graph-inspector{background:var(--panel)}.graph-inspector-scroll{height:100%;overflow-y:auto;overscroll-behavior:contain}.graph-inspector-empty{display:flex;height:100%;padding:40px;align-items:center;justify-content:center;color:var(--muted);font-size:12px;line-height:1.5;text-align:center}.graph-inspector-document,.graph-inspector-source{padding:28px 28px 80px}.graph-inspector-document .markdown{max-width:none}.graph-inspector-document>.document-metadata{margin-bottom:28px}.graph-inspector-source .source-context{width:calc(100% - 5.25rem)}.graph-state{height:calc(100vh - 84px);min-height:0}@media(prefers-reduced-motion:reduce){.document-toc-link,.document-toc-chevron{transition:none}}@media(max-width:1100px)and (min-width:64rem){.graph-topbar-graph{padding:0 18px 0 28px;gap:8px}.graph-node-count{display:none}}@media(max-width:1340px){.document-layout{display:flex;flex-direction:column;gap:0}.document-toc{position:static;width:100%;max-width:760px;height:auto;padding:0;margin-bottom:28px;overflow:visible}.document-toc-heading{display:none}.document-toc-toggle{display:flex;min-height:52px;padding:0 16px;cursor:pointer;background:var(--panel);border:1px solid var(--panel-border);border-radius:7px}.document-toc-toggle:hover,.document-toc-toggle[aria-expanded=true]{color:var(--text)}.document-toc-chevron{margin-left:auto;color:var(--muted);font-size:18px;line-height:1;transform:rotate(90deg);transition:transform .12s ease}.document-toc[data-expanded=true] .document-toc-chevron{transform:rotate(-90deg)}.document-toc-list{display:none;max-height:min(52vh,420px);padding:8px 0;margin-top:0;background:var(--panel);border:1px solid var(--panel-border);border-top:0;border-radius:0 0 7px 7px}.document-toc[data-expanded=true] .document-toc-toggle{border-radius:7px 7px 0 0}.document-toc[data-expanded=true] .document-toc-list{display:block}}@media not (min-width:64rem){body.mobile-navigation-open{overflow:hidden}.app-shell{display:block}.sidebar{position:sticky;z-index:20;top:0;width:100%;height:104px;padding:0;overflow:visible;border-right:0;border-bottom:1px solid var(--panel-border)}.sidebar-header{height:48px;padding:0 16px;margin:0}.sidebar-header .brand{font-size:18px}.sidebar-header .brand-logo{height:18px}.sidebar-actions{gap:5px}.sidebar-search,.sidebar-graph,.sidebar-git{width:36px;height:36px}.mobile-navigation-trigger{display:flex;width:100%;height:56px;padding:0 18px;align-items:center;gap:13px;overflow:hidden;color:var(--muted);font:inherit;font-size:13px;text-align:left;cursor:pointer;background:transparent;border:0;border-top:1px solid var(--panel-border)}.mobile-navigation-trigger:hover,.mobile-navigation-trigger[aria-expanded=true]{color:var(--text)}.mobile-navigation-trigger svg{width:18px;height:18px;flex:0 0 auto;fill:none;stroke:currentColor;stroke-linecap:round;stroke-width:1.8}.mobile-navigation-context{display:flex;min-width:0;align-items:center;gap:9px}.mobile-navigation-context>span:first-child{color:var(--text);font-weight:600}.mobile-navigation-context>span[aria-hidden=true]{color:var(--muted)}.mobile-navigation-current{min-width:0;overflow:hidden;color:var(--muted);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;text-overflow:ellipsis;white-space:nowrap}.sidebar nav{display:none}.sidebar[data-mobile-navigation-open=true] nav{position:fixed;z-index:19;inset:104px 0 0;display:block;padding:16px 16px max(28px,env(safe-area-inset-bottom));overflow-y:auto;overscroll-behavior:contain;background:var(--sidebar);outline:0}.sidebar[data-mobile-navigation-open=true] .file-tree{max-width:560px;margin:0 auto}.sidebar[data-mobile-navigation-open=true] .tree-directory>summary,.sidebar[data-mobile-navigation-open=true] .document-link{min-height:44px;padding-top:10px;padding-bottom:10px}.main{--mobile-gutter: clamp(20px, 5vw, 48px);padding:28px clamp(20px,5vw,48px) 80px}.document-toc{position:sticky;z-index:10;top:104px;width:calc(100% + var(--mobile-gutter) * 2);max-width:none;margin:-28px calc(var(--mobile-gutter) * -1) 28px;background:var(--background)}.document-toc-toggle{min-height:56px;padding:0 var(--mobile-gutter);background:color-mix(in srgb,var(--background) 94%,transparent);border-right:0;border-left:0;border-radius:0;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.document-toc[data-expanded=true] .document-toc-toggle{border-radius:0}.document-toc-list{max-height:calc(100vh - 160px);max-height:calc(100dvh - 160px);padding-right:var(--mobile-gutter);padding-left:var(--mobile-gutter);background:var(--background);border-right:0;border-left:0;border-radius:0}.markdown h1,.markdown h2,.markdown h3,.markdown h4,.markdown .markdown-error{scroll-margin-top:180px}.source-context{width:calc(100% - 24px);margin-right:12px;margin-left:12px}.graph-shell{height:auto;min-height:100vh;min-height:100dvh;overflow:visible}.graph-topbar{position:sticky;top:0;width:100%;height:auto;background:color-mix(in srgb,var(--panel) 92%,transparent);border-bottom:1px solid var(--panel-border);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);pointer-events:auto}.graph-topbar-graph{min-height:64px;padding:10px 16px;border-right:0}.graph-topbar-graph .graph-header{flex-basis:190px}.graph-header .brand{font-size:18px}.graph-header .brand-logo{height:18px}.graph-header .sidebar-search,.graph-header .sidebar-graph,.graph-header .sidebar-git{width:36px;height:36px}.graph-workspace{display:block;height:auto}.graph-pane{height:min(58vh,520px);height:min(58svh,520px);min-height:320px;border-right:0;border-bottom:1px solid var(--panel-border)}.graph-canvas{touch-action:none}.graph-filter input{font-size:16px}.graph-kind-filters label span{min-height:32px;padding:7px 10px}.graph-fit{min-width:44px;min-height:32px}.graph-inspector{min-height:55vh;min-height:55svh}.graph-inspector-scroll{height:auto;overflow:visible}.graph-inspector-empty{min-height:45vh}.graph-inspector-document,.graph-inspector-source{padding-right:20px;padding-left:20px}.graph-inspector-source .source-context{width:calc(100% - 24px)}.graph-state{height:auto;min-height:50vh}}@media(max-width:600px){.main{--mobile-gutter: 18px;padding-right:18px;padding-left:18px}.markdown{font-size:15.5px}.markdown h1{font-size:32px}.markdown h2{font-size:24px}.graph-topbar-graph{flex-wrap:wrap}.graph-topbar-graph .graph-header,.graph-topbar-graph .graph-tools,.graph-filter{flex-basis:100%}.graph-pane{height:52vh;height:52svh;min-height:300px}}
@@ -0,0 +1,182 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 73224 16688" fill="#ddd">
2
+ <defs>
3
+ <path id="g2588" d="M-20 -512V1576H1253V-512Z"/>
4
+ <path id="g2591" d="M934 -512V-251H1094V-512ZM298 -512V-251H457V-512ZM616 -147V114H775V-147ZM-20 -147V114H138V-147ZM934 219V480H1094V219ZM298 219V480H457V219ZM616 584V845H775V584ZM-20 584V845H138V584ZM934 950V1211H1094V950ZM298 950V1211H457V950ZM616 1315V1576H775V1315ZM-20 1315V1576H138V1315Z"/>
5
+ </defs>
6
+ <use href="#g2591" transform="translate(0,0) scale(1,-1) translate(0,-1901)"/>
7
+ <use href="#g2588" transform="translate(1356,0) scale(1,-1) translate(0,-1901)"/>
8
+ <use href="#g2588" transform="translate(2712,0) scale(1,-1) translate(0,-1901)"/>
9
+ <use href="#g2591" transform="translate(21696,0) scale(1,-1) translate(0,-1901)"/>
10
+ <use href="#g2588" transform="translate(23052,0) scale(1,-1) translate(0,-1901)"/>
11
+ <use href="#g2588" transform="translate(24408,0) scale(1,-1) translate(0,-1901)"/>
12
+ <use href="#g2591" transform="translate(69156,0) scale(1,-1) translate(0,-1901)"/>
13
+ <use href="#g2588" transform="translate(70512,0) scale(1,-1) translate(0,-1901)"/>
14
+ <use href="#g2588" transform="translate(71868,0) scale(1,-1) translate(0,-1901)"/>
15
+ <use href="#g2591" transform="translate(0,2384) scale(1,-1) translate(0,-1901)"/>
16
+ <use href="#g2588" transform="translate(1356,2384) scale(1,-1) translate(0,-1901)"/>
17
+ <use href="#g2588" transform="translate(2712,2384) scale(1,-1) translate(0,-1901)"/>
18
+ <use href="#g2591" transform="translate(21696,2384) scale(1,-1) translate(0,-1901)"/>
19
+ <use href="#g2588" transform="translate(23052,2384) scale(1,-1) translate(0,-1901)"/>
20
+ <use href="#g2588" transform="translate(24408,2384) scale(1,-1) translate(0,-1901)"/>
21
+ <use href="#g2591" transform="translate(69156,2384) scale(1,-1) translate(0,-1901)"/>
22
+ <use href="#g2588" transform="translate(70512,2384) scale(1,-1) translate(0,-1901)"/>
23
+ <use href="#g2588" transform="translate(71868,2384) scale(1,-1) translate(0,-1901)"/>
24
+ <use href="#g2591" transform="translate(0,4768) scale(1,-1) translate(0,-1901)"/>
25
+ <use href="#g2588" transform="translate(1356,4768) scale(1,-1) translate(0,-1901)"/>
26
+ <use href="#g2588" transform="translate(2712,4768) scale(1,-1) translate(0,-1901)"/>
27
+ <use href="#g2591" transform="translate(6780,4768) scale(1,-1) translate(0,-1901)"/>
28
+ <use href="#g2588" transform="translate(8136,4768) scale(1,-1) translate(0,-1901)"/>
29
+ <use href="#g2588" transform="translate(9492,4768) scale(1,-1) translate(0,-1901)"/>
30
+ <use href="#g2588" transform="translate(10848,4768) scale(1,-1) translate(0,-1901)"/>
31
+ <use href="#g2588" transform="translate(12204,4768) scale(1,-1) translate(0,-1901)"/>
32
+ <use href="#g2588" transform="translate(13560,4768) scale(1,-1) translate(0,-1901)"/>
33
+ <use href="#g2588" transform="translate(14916,4768) scale(1,-1) translate(0,-1901)"/>
34
+ <use href="#g2591" transform="translate(18984,4768) scale(1,-1) translate(0,-1901)"/>
35
+ <use href="#g2588" transform="translate(20340,4768) scale(1,-1) translate(0,-1901)"/>
36
+ <use href="#g2588" transform="translate(21696,4768) scale(1,-1) translate(0,-1901)"/>
37
+ <use href="#g2588" transform="translate(23052,4768) scale(1,-1) translate(0,-1901)"/>
38
+ <use href="#g2588" transform="translate(24408,4768) scale(1,-1) translate(0,-1901)"/>
39
+ <use href="#g2588" transform="translate(25764,4768) scale(1,-1) translate(0,-1901)"/>
40
+ <use href="#g2588" transform="translate(27120,4768) scale(1,-1) translate(0,-1901)"/>
41
+ <use href="#g2591" transform="translate(37968,4768) scale(1,-1) translate(0,-1901)"/>
42
+ <use href="#g2588" transform="translate(39324,4768) scale(1,-1) translate(0,-1901)"/>
43
+ <use href="#g2588" transform="translate(40680,4768) scale(1,-1) translate(0,-1901)"/>
44
+ <use href="#g2588" transform="translate(42036,4768) scale(1,-1) translate(0,-1901)"/>
45
+ <use href="#g2588" transform="translate(43392,4768) scale(1,-1) translate(0,-1901)"/>
46
+ <use href="#g2588" transform="translate(44748,4768) scale(1,-1) translate(0,-1901)"/>
47
+ <use href="#g2588" transform="translate(46104,4768) scale(1,-1) translate(0,-1901)"/>
48
+ <use href="#g2588" transform="translate(47460,4768) scale(1,-1) translate(0,-1901)"/>
49
+ <use href="#g2588" transform="translate(48816,4768) scale(1,-1) translate(0,-1901)"/>
50
+ <use href="#g2588" transform="translate(50172,4768) scale(1,-1) translate(0,-1901)"/>
51
+ <use href="#g2588" transform="translate(51528,4768) scale(1,-1) translate(0,-1901)"/>
52
+ <use href="#g2588" transform="translate(52884,4768) scale(1,-1) translate(0,-1901)"/>
53
+ <use href="#g2588" transform="translate(54240,4768) scale(1,-1) translate(0,-1901)"/>
54
+ <use href="#g2588" transform="translate(55596,4768) scale(1,-1) translate(0,-1901)"/>
55
+ <use href="#g2591" transform="translate(61020,4768) scale(1,-1) translate(0,-1901)"/>
56
+ <use href="#g2588" transform="translate(62376,4768) scale(1,-1) translate(0,-1901)"/>
57
+ <use href="#g2588" transform="translate(63732,4768) scale(1,-1) translate(0,-1901)"/>
58
+ <use href="#g2588" transform="translate(65088,4768) scale(1,-1) translate(0,-1901)"/>
59
+ <use href="#g2588" transform="translate(66444,4768) scale(1,-1) translate(0,-1901)"/>
60
+ <use href="#g2588" transform="translate(67800,4768) scale(1,-1) translate(0,-1901)"/>
61
+ <use href="#g2588" transform="translate(69156,4768) scale(1,-1) translate(0,-1901)"/>
62
+ <use href="#g2588" transform="translate(70512,4768) scale(1,-1) translate(0,-1901)"/>
63
+ <use href="#g2588" transform="translate(71868,4768) scale(1,-1) translate(0,-1901)"/>
64
+ <use href="#g2591" transform="translate(0,7152) scale(1,-1) translate(0,-1901)"/>
65
+ <use href="#g2588" transform="translate(1356,7152) scale(1,-1) translate(0,-1901)"/>
66
+ <use href="#g2588" transform="translate(2712,7152) scale(1,-1) translate(0,-1901)"/>
67
+ <use href="#g2591" transform="translate(13560,7152) scale(1,-1) translate(0,-1901)"/>
68
+ <use href="#g2588" transform="translate(14916,7152) scale(1,-1) translate(0,-1901)"/>
69
+ <use href="#g2588" transform="translate(16272,7152) scale(1,-1) translate(0,-1901)"/>
70
+ <use href="#g2591" transform="translate(21696,7152) scale(1,-1) translate(0,-1901)"/>
71
+ <use href="#g2588" transform="translate(23052,7152) scale(1,-1) translate(0,-1901)"/>
72
+ <use href="#g2588" transform="translate(24408,7152) scale(1,-1) translate(0,-1901)"/>
73
+ <use href="#g2591" transform="translate(37968,7152) scale(1,-1) translate(0,-1901)"/>
74
+ <use href="#g2588" transform="translate(39324,7152) scale(1,-1) translate(0,-1901)"/>
75
+ <use href="#g2588" transform="translate(40680,7152) scale(1,-1) translate(0,-1901)"/>
76
+ <use href="#g2591" transform="translate(46104,7152) scale(1,-1) translate(0,-1901)"/>
77
+ <use href="#g2588" transform="translate(47460,7152) scale(1,-1) translate(0,-1901)"/>
78
+ <use href="#g2588" transform="translate(48816,7152) scale(1,-1) translate(0,-1901)"/>
79
+ <use href="#g2591" transform="translate(54240,7152) scale(1,-1) translate(0,-1901)"/>
80
+ <use href="#g2588" transform="translate(55596,7152) scale(1,-1) translate(0,-1901)"/>
81
+ <use href="#g2588" transform="translate(56952,7152) scale(1,-1) translate(0,-1901)"/>
82
+ <use href="#g2591" transform="translate(59664,7152) scale(1,-1) translate(0,-1901)"/>
83
+ <use href="#g2588" transform="translate(61020,7152) scale(1,-1) translate(0,-1901)"/>
84
+ <use href="#g2588" transform="translate(62376,7152) scale(1,-1) translate(0,-1901)"/>
85
+ <use href="#g2591" transform="translate(69156,7152) scale(1,-1) translate(0,-1901)"/>
86
+ <use href="#g2588" transform="translate(70512,7152) scale(1,-1) translate(0,-1901)"/>
87
+ <use href="#g2588" transform="translate(71868,7152) scale(1,-1) translate(0,-1901)"/>
88
+ <use href="#g2591" transform="translate(0,9536) scale(1,-1) translate(0,-1901)"/>
89
+ <use href="#g2588" transform="translate(1356,9536) scale(1,-1) translate(0,-1901)"/>
90
+ <use href="#g2588" transform="translate(2712,9536) scale(1,-1) translate(0,-1901)"/>
91
+ <use href="#g2591" transform="translate(6780,9536) scale(1,-1) translate(0,-1901)"/>
92
+ <use href="#g2588" transform="translate(8136,9536) scale(1,-1) translate(0,-1901)"/>
93
+ <use href="#g2588" transform="translate(9492,9536) scale(1,-1) translate(0,-1901)"/>
94
+ <use href="#g2588" transform="translate(10848,9536) scale(1,-1) translate(0,-1901)"/>
95
+ <use href="#g2588" transform="translate(12204,9536) scale(1,-1) translate(0,-1901)"/>
96
+ <use href="#g2588" transform="translate(13560,9536) scale(1,-1) translate(0,-1901)"/>
97
+ <use href="#g2588" transform="translate(14916,9536) scale(1,-1) translate(0,-1901)"/>
98
+ <use href="#g2588" transform="translate(16272,9536) scale(1,-1) translate(0,-1901)"/>
99
+ <use href="#g2591" transform="translate(21696,9536) scale(1,-1) translate(0,-1901)"/>
100
+ <use href="#g2588" transform="translate(23052,9536) scale(1,-1) translate(0,-1901)"/>
101
+ <use href="#g2588" transform="translate(24408,9536) scale(1,-1) translate(0,-1901)"/>
102
+ <use href="#g2591" transform="translate(37968,9536) scale(1,-1) translate(0,-1901)"/>
103
+ <use href="#g2588" transform="translate(39324,9536) scale(1,-1) translate(0,-1901)"/>
104
+ <use href="#g2588" transform="translate(40680,9536) scale(1,-1) translate(0,-1901)"/>
105
+ <use href="#g2591" transform="translate(46104,9536) scale(1,-1) translate(0,-1901)"/>
106
+ <use href="#g2588" transform="translate(47460,9536) scale(1,-1) translate(0,-1901)"/>
107
+ <use href="#g2588" transform="translate(48816,9536) scale(1,-1) translate(0,-1901)"/>
108
+ <use href="#g2591" transform="translate(54240,9536) scale(1,-1) translate(0,-1901)"/>
109
+ <use href="#g2588" transform="translate(55596,9536) scale(1,-1) translate(0,-1901)"/>
110
+ <use href="#g2588" transform="translate(56952,9536) scale(1,-1) translate(0,-1901)"/>
111
+ <use href="#g2591" transform="translate(59664,9536) scale(1,-1) translate(0,-1901)"/>
112
+ <use href="#g2588" transform="translate(61020,9536) scale(1,-1) translate(0,-1901)"/>
113
+ <use href="#g2588" transform="translate(62376,9536) scale(1,-1) translate(0,-1901)"/>
114
+ <use href="#g2591" transform="translate(69156,9536) scale(1,-1) translate(0,-1901)"/>
115
+ <use href="#g2588" transform="translate(70512,9536) scale(1,-1) translate(0,-1901)"/>
116
+ <use href="#g2588" transform="translate(71868,9536) scale(1,-1) translate(0,-1901)"/>
117
+ <use href="#g2591" transform="translate(0,11920) scale(1,-1) translate(0,-1901)"/>
118
+ <use href="#g2588" transform="translate(1356,11920) scale(1,-1) translate(0,-1901)"/>
119
+ <use href="#g2588" transform="translate(2712,11920) scale(1,-1) translate(0,-1901)"/>
120
+ <use href="#g2591" transform="translate(5424,11920) scale(1,-1) translate(0,-1901)"/>
121
+ <use href="#g2588" transform="translate(6780,11920) scale(1,-1) translate(0,-1901)"/>
122
+ <use href="#g2588" transform="translate(8136,11920) scale(1,-1) translate(0,-1901)"/>
123
+ <use href="#g2591" transform="translate(13560,11920) scale(1,-1) translate(0,-1901)"/>
124
+ <use href="#g2588" transform="translate(14916,11920) scale(1,-1) translate(0,-1901)"/>
125
+ <use href="#g2588" transform="translate(16272,11920) scale(1,-1) translate(0,-1901)"/>
126
+ <use href="#g2591" transform="translate(21696,11920) scale(1,-1) translate(0,-1901)"/>
127
+ <use href="#g2588" transform="translate(23052,11920) scale(1,-1) translate(0,-1901)"/>
128
+ <use href="#g2588" transform="translate(24408,11920) scale(1,-1) translate(0,-1901)"/>
129
+ <use href="#g2591" transform="translate(37968,11920) scale(1,-1) translate(0,-1901)"/>
130
+ <use href="#g2588" transform="translate(39324,11920) scale(1,-1) translate(0,-1901)"/>
131
+ <use href="#g2588" transform="translate(40680,11920) scale(1,-1) translate(0,-1901)"/>
132
+ <use href="#g2591" transform="translate(46104,11920) scale(1,-1) translate(0,-1901)"/>
133
+ <use href="#g2588" transform="translate(47460,11920) scale(1,-1) translate(0,-1901)"/>
134
+ <use href="#g2588" transform="translate(48816,11920) scale(1,-1) translate(0,-1901)"/>
135
+ <use href="#g2591" transform="translate(54240,11920) scale(1,-1) translate(0,-1901)"/>
136
+ <use href="#g2588" transform="translate(55596,11920) scale(1,-1) translate(0,-1901)"/>
137
+ <use href="#g2588" transform="translate(56952,11920) scale(1,-1) translate(0,-1901)"/>
138
+ <use href="#g2591" transform="translate(59664,11920) scale(1,-1) translate(0,-1901)"/>
139
+ <use href="#g2588" transform="translate(61020,11920) scale(1,-1) translate(0,-1901)"/>
140
+ <use href="#g2588" transform="translate(62376,11920) scale(1,-1) translate(0,-1901)"/>
141
+ <use href="#g2591" transform="translate(67800,11920) scale(1,-1) translate(0,-1901)"/>
142
+ <use href="#g2588" transform="translate(69156,11920) scale(1,-1) translate(0,-1901)"/>
143
+ <use href="#g2588" transform="translate(70512,11920) scale(1,-1) translate(0,-1901)"/>
144
+ <use href="#g2588" transform="translate(71868,11920) scale(1,-1) translate(0,-1901)"/>
145
+ <use href="#g2591" transform="translate(0,14304) scale(1,-1) translate(0,-1901)"/>
146
+ <use href="#g2588" transform="translate(1356,14304) scale(1,-1) translate(0,-1901)"/>
147
+ <use href="#g2588" transform="translate(2712,14304) scale(1,-1) translate(0,-1901)"/>
148
+ <use href="#g2591" transform="translate(6780,14304) scale(1,-1) translate(0,-1901)"/>
149
+ <use href="#g2588" transform="translate(8136,14304) scale(1,-1) translate(0,-1901)"/>
150
+ <use href="#g2588" transform="translate(9492,14304) scale(1,-1) translate(0,-1901)"/>
151
+ <use href="#g2588" transform="translate(10848,14304) scale(1,-1) translate(0,-1901)"/>
152
+ <use href="#g2588" transform="translate(12204,14304) scale(1,-1) translate(0,-1901)"/>
153
+ <use href="#g2588" transform="translate(13560,14304) scale(1,-1) translate(0,-1901)"/>
154
+ <use href="#g2591" transform="translate(14916,14304) scale(1,-1) translate(0,-1901)"/>
155
+ <use href="#g2588" transform="translate(16272,14304) scale(1,-1) translate(0,-1901)"/>
156
+ <use href="#g2588" transform="translate(17628,14304) scale(1,-1) translate(0,-1901)"/>
157
+ <use href="#g2591" transform="translate(23052,14304) scale(1,-1) translate(0,-1901)"/>
158
+ <use href="#g2588" transform="translate(24408,14304) scale(1,-1) translate(0,-1901)"/>
159
+ <use href="#g2588" transform="translate(25764,14304) scale(1,-1) translate(0,-1901)"/>
160
+ <use href="#g2588" transform="translate(27120,14304) scale(1,-1) translate(0,-1901)"/>
161
+ <use href="#g2591" transform="translate(31188,14304) scale(1,-1) translate(0,-1901)"/>
162
+ <use href="#g2588" transform="translate(32544,14304) scale(1,-1) translate(0,-1901)"/>
163
+ <use href="#g2588" transform="translate(33900,14304) scale(1,-1) translate(0,-1901)"/>
164
+ <use href="#g2591" transform="translate(37968,14304) scale(1,-1) translate(0,-1901)"/>
165
+ <use href="#g2588" transform="translate(39324,14304) scale(1,-1) translate(0,-1901)"/>
166
+ <use href="#g2588" transform="translate(40680,14304) scale(1,-1) translate(0,-1901)"/>
167
+ <use href="#g2591" transform="translate(46104,14304) scale(1,-1) translate(0,-1901)"/>
168
+ <use href="#g2588" transform="translate(47460,14304) scale(1,-1) translate(0,-1901)"/>
169
+ <use href="#g2588" transform="translate(48816,14304) scale(1,-1) translate(0,-1901)"/>
170
+ <use href="#g2591" transform="translate(54240,14304) scale(1,-1) translate(0,-1901)"/>
171
+ <use href="#g2588" transform="translate(55596,14304) scale(1,-1) translate(0,-1901)"/>
172
+ <use href="#g2588" transform="translate(56952,14304) scale(1,-1) translate(0,-1901)"/>
173
+ <use href="#g2591" transform="translate(61020,14304) scale(1,-1) translate(0,-1901)"/>
174
+ <use href="#g2588" transform="translate(62376,14304) scale(1,-1) translate(0,-1901)"/>
175
+ <use href="#g2588" transform="translate(63732,14304) scale(1,-1) translate(0,-1901)"/>
176
+ <use href="#g2588" transform="translate(65088,14304) scale(1,-1) translate(0,-1901)"/>
177
+ <use href="#g2588" transform="translate(66444,14304) scale(1,-1) translate(0,-1901)"/>
178
+ <use href="#g2588" transform="translate(67800,14304) scale(1,-1) translate(0,-1901)"/>
179
+ <use href="#g2591" transform="translate(69156,14304) scale(1,-1) translate(0,-1901)"/>
180
+ <use href="#g2588" transform="translate(70512,14304) scale(1,-1) translate(0,-1901)"/>
181
+ <use href="#g2588" transform="translate(71868,14304) scale(1,-1) translate(0,-1901)"/>
182
+ </svg>
@@ -5,8 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <meta name="color-scheme" content="light dark" />
7
7
  <title>lat.md</title>
8
- <script type="module" crossorigin src="/assets/index-xm2_px4q.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-B0n0u03y.css">
8
+ <script type="module" crossorigin src="/assets/index-VZwPPiFE.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-W8ktvNj9.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
@@ -1,6 +1,8 @@
1
1
  import { parse } from '../parser.js';
2
2
  const MAX_DIFF_CELLS = 1_000_000;
3
+ const MIN_INLINE_WORD_OVERLAP = 0.6;
3
4
  const WORDS = /\s+|[\p{L}\p{N}_]+|[^\s\p{L}\p{N}_]+/gu;
5
+ const WORD_TOKENS = /[\p{L}\p{N}_]+/gu;
4
6
  function sequenceDiff(oldValues, newValues, key) {
5
7
  const oldKeys = oldValues.map(key);
6
8
  const newKeys = newValues.map(key);
@@ -83,6 +85,15 @@ function nodeText(node) {
83
85
  return node.value;
84
86
  return withChildren(node) ? node.children.map(nodeText).join('') : '';
85
87
  }
88
+ function inlineWordOverlap(oldNode, newNode) {
89
+ const oldWords = nodeText(oldNode).toLowerCase().match(WORD_TOKENS) ?? [];
90
+ const newWords = nodeText(newNode).toLowerCase().match(WORD_TOKENS) ?? [];
91
+ if (oldWords.length === 0 || newWords.length === 0) {
92
+ return oldWords.length === newWords.length ? 1 : 0;
93
+ }
94
+ const shared = sequenceDiff(oldWords, newWords, (word) => word).filter((change) => change.kind === 'same').length;
95
+ return shared / (oldWords.length + newWords.length - shared);
96
+ }
86
97
  function wrapperSignature(node) {
87
98
  switch (node.type) {
88
99
  case 'link':
@@ -166,6 +177,9 @@ function addClass(node, kind) {
166
177
  : current
167
178
  ? [String(current)]
168
179
  : [];
180
+ if (result.type === 'code' && result.lang) {
181
+ classes.push(`language-${result.lang}`);
182
+ }
169
183
  classes.push(`git-${kind}`);
170
184
  result.data = {
171
185
  ...result.data,
@@ -189,6 +203,9 @@ function pairedNode(oldNode, newNode, oldMarkdown, newMarkdown) {
189
203
  if ((newNode.type === 'heading' || newNode.type === 'paragraph') &&
190
204
  withChildren(oldNode) &&
191
205
  withChildren(newNode)) {
206
+ if (inlineWordOverlap(oldNode, newNode) < MIN_INLINE_WORD_OVERLAP) {
207
+ return null;
208
+ }
192
209
  return {
193
210
  ...structuredClone(newNode),
194
211
  children: diffInline(oldNode.children, newNode.children),
@@ -0,0 +1,6 @@
1
+ import { type Section } from '../lattice.js';
2
+ import type { ViewDocumentError, ViewGraph } from './protocol.js';
3
+ import type { ViewCodeReferenceFile, ViewParsedMarkdownFile } from './references.js';
4
+ import type { ViewGitSnapshot } from './git.js';
5
+ /** Project the cached view state into stable nodes and weighted relationships. */
6
+ export declare function buildViewGraph(markdownFiles: Iterable<ViewParsedMarkdownFile>, codeFiles: Iterable<ViewCodeReferenceFile>, allSections: Section[], diagnostics: ReadonlyMap<string, readonly ViewDocumentError[]>, git: ViewGitSnapshot, generation: number): ViewGraph;
@@ -0,0 +1,176 @@
1
+ import { posix } from 'node:path';
2
+ import { buildFileIndex, buildSectionSlugIndex, flattenSections, resolveRef, } from '../lattice.js';
3
+ import { linkedSection } from './references.js';
4
+ import { viewSourceTarget } from './source-target.js';
5
+ function encodedPath(path) {
6
+ return path.split('/').map(encodeURIComponent).join('/');
7
+ }
8
+ function documentUrl(path, fragment = '') {
9
+ return `/docs/${encodedPath(path)}${fragment ? `#${encodeURIComponent(fragment)}` : ''}`;
10
+ }
11
+ function sourceUrl(path, symbol = '', line = 0) {
12
+ const search = line > 0 ? `?at=${line}` : '';
13
+ const fragment = symbol ? `#${encodeURIComponent(symbol)}` : '';
14
+ return `/code/${encodedPath(path)}${search}${fragment}`;
15
+ }
16
+ function pathBreadcrumbs(path) {
17
+ return path.replace(/\.md$/i, '').split('/');
18
+ }
19
+ function nodeLabelFromPath(path) {
20
+ return posix.basename(path).replace(/\.md$/i, '');
21
+ }
22
+ /** Project the cached view state into stable nodes and weighted relationships. */
23
+ export function buildViewGraph(markdownFiles, codeFiles, allSections, diagnostics, git, generation) {
24
+ const files = [...markdownFiles].sort((left, right) => left.path.localeCompare(right.path));
25
+ const sections = flattenSections(allSections);
26
+ const sectionIds = new Set(sections.map((section) => section.id.toLowerCase()));
27
+ const fileIndex = buildFileIndex(allSections);
28
+ const slugIndex = buildSectionSlugIndex(allSections);
29
+ const sectionById = new Map(sections.map((section) => [section.id.toLowerCase(), section]));
30
+ const sectionsByPath = new Map();
31
+ const documentNodeBySection = new Map();
32
+ const nodes = new Map();
33
+ const edges = new Map();
34
+ const invalidWikiTargets = new Set();
35
+ for (const [path, errors] of diagnostics) {
36
+ for (const error of errors) {
37
+ invalidWikiTargets.add(`${path}\0${error.line}\0${error.target}`);
38
+ }
39
+ }
40
+ const addNode = (node) => {
41
+ if (!nodes.has(node.id))
42
+ nodes.set(node.id, node);
43
+ return node.id;
44
+ };
45
+ const addEdge = (from, to, kind) => {
46
+ if (from === to)
47
+ return;
48
+ const key = `${kind}\0${from}\0${to}`;
49
+ const existing = edges.get(key);
50
+ if (existing) {
51
+ existing.weight++;
52
+ return;
53
+ }
54
+ edges.set(key, {
55
+ id: `edge:${kind}:${from}->${to}`,
56
+ from,
57
+ to,
58
+ kind,
59
+ weight: 1,
60
+ });
61
+ };
62
+ for (const file of files) {
63
+ const flat = flattenSections(file.sections);
64
+ sectionsByPath.set(file.path.toLowerCase(), flat);
65
+ const root = file.sections[0];
66
+ const id = `document:${file.path}`;
67
+ for (const section of flat) {
68
+ documentNodeBySection.set(section.id.toLowerCase(), id);
69
+ }
70
+ const errorCount = diagnostics.get(file.path)?.length ?? 0;
71
+ addNode({
72
+ id,
73
+ kind: 'document',
74
+ label: root?.heading ?? nodeLabelFromPath(file.path),
75
+ url: documentUrl(file.path),
76
+ breadcrumbs: pathBreadcrumbs(file.path),
77
+ documentPath: file.path,
78
+ sectionId: root?.id,
79
+ inDegree: 0,
80
+ outDegree: 0,
81
+ ...(git.files.get(file.path)?.status
82
+ ? { gitStatus: git.files.get(file.path)?.status }
83
+ : {}),
84
+ ...(errorCount > 0 ? { errorCount } : {}),
85
+ });
86
+ }
87
+ const documentNodeForSection = (section) => documentNodeBySection.get(section.id.toLowerCase()) ?? null;
88
+ for (const file of files) {
89
+ const fileSections = flattenSections(file.sections).sort((left, right) => left.startLine - right.startLine);
90
+ const containingSection = (line) => fileSections.filter((section) => section.startLine <= line).at(-1) ??
91
+ file.sections[0];
92
+ for (const ref of file.wikiRefs) {
93
+ const sourceSection = sectionById.get(ref.fromSection.toLowerCase());
94
+ const from = sourceSection ? documentNodeForSection(sourceSection) : null;
95
+ if (!from)
96
+ continue;
97
+ const source = viewSourceTarget(ref.target);
98
+ if (source) {
99
+ if (invalidWikiTargets.has(`${file.path}\0${ref.line}\0${ref.target}`)) {
100
+ continue;
101
+ }
102
+ const sourceId = addNode({
103
+ id: `source:${source.path}${source.symbol ? `#${source.symbol}` : ''}`,
104
+ kind: 'source',
105
+ label: source.symbol || posix.basename(source.path),
106
+ url: sourceUrl(source.path, source.symbol),
107
+ breadcrumbs: [
108
+ ...source.path.split('/'),
109
+ ...(source.symbol ? [source.symbol] : []),
110
+ ],
111
+ sourcePath: source.path,
112
+ symbol: source.symbol || undefined,
113
+ inDegree: 0,
114
+ outDegree: 0,
115
+ });
116
+ addEdge(from, sourceId, 'source');
117
+ continue;
118
+ }
119
+ const resolved = resolveRef(ref.target, sectionIds, fileIndex, slugIndex);
120
+ if (resolved.ambiguous)
121
+ continue;
122
+ const target = sectionById.get(resolved.resolved.toLowerCase());
123
+ const to = target ? documentNodeForSection(target) : null;
124
+ if (to)
125
+ addEdge(from, to, 'wiki');
126
+ }
127
+ for (const link of file.markdownLinks) {
128
+ if (link.kind !== 'link')
129
+ continue;
130
+ const target = linkedSection(link.url, file.path, sectionsByPath);
131
+ const source = containingSection(link.line);
132
+ const from = source ? documentNodeForSection(source) : null;
133
+ const to = target ? documentNodeForSection(target) : null;
134
+ if (from && to)
135
+ addEdge(from, to, 'markdown');
136
+ }
137
+ }
138
+ for (const file of [...codeFiles].sort((left, right) => left.path.localeCompare(right.path))) {
139
+ for (const ref of [...file.refs].sort((left, right) => left.line - right.line)) {
140
+ const resolved = resolveRef(ref.target, sectionIds, fileIndex, slugIndex);
141
+ if (resolved.ambiguous)
142
+ continue;
143
+ const target = sectionById.get(resolved.resolved.toLowerCase());
144
+ const to = target ? documentNodeForSection(target) : null;
145
+ if (!to)
146
+ continue;
147
+ const snippet = file.lines[ref.line - 1]?.trim() ?? '';
148
+ const from = addNode({
149
+ id: `code-ref:${file.path}:${ref.line}`,
150
+ kind: 'code-reference',
151
+ label: `${posix.basename(file.path)}:${ref.line}`,
152
+ url: sourceUrl(file.path, '', ref.line),
153
+ breadcrumbs: [...file.path.split('/'), `line ${ref.line}`],
154
+ sourcePath: file.path,
155
+ line: ref.line,
156
+ snippet,
157
+ inDegree: 0,
158
+ outDegree: 0,
159
+ });
160
+ addEdge(from, to, 'code-mention');
161
+ }
162
+ }
163
+ for (const edge of edges.values()) {
164
+ const source = nodes.get(edge.from);
165
+ const target = nodes.get(edge.to);
166
+ if (source)
167
+ source.outDegree += edge.weight;
168
+ if (target)
169
+ target.inDegree += edge.weight;
170
+ }
171
+ return {
172
+ generation,
173
+ nodes: [...nodes.values()].sort((left, right) => left.id.localeCompare(right.id)),
174
+ edges: [...edges.values()].sort((left, right) => left.id.localeCompare(right.id)),
175
+ };
176
+ }
@@ -2,7 +2,11 @@ import type { Root } from 'mdast';
2
2
  export type WikiLinkContext = {
3
3
  line: number;
4
4
  };
5
- export type WikiLinkResolver = (target: string, context: WikiLinkContext) => string | null | Promise<string | null>;
5
+ export type WikiLinkResolution = {
6
+ href: string;
7
+ referenceCount: number;
8
+ };
9
+ export type WikiLinkResolver = (target: string, context: WikiLinkContext) => WikiLinkResolution | null | Promise<WikiLinkResolution | null>;
6
10
  export type MarkdownRenderOptions = {
7
11
  activeMarkdownLink?: string;
8
12
  activeWikiLink?: string;