@plebeiantech/lat.md 0.12.3-fork.3 → 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.
- package/README.md +2 -0
- package/dist/src/cli/check-mode.js +5 -1
- package/dist/src/cli/comment-guard.d.ts +14 -0
- package/dist/src/cli/comment-guard.js +10 -33
- package/dist/src/cli/comment-reminder.d.ts +65 -6
- package/dist/src/cli/comment-reminder.js +164 -28
- package/dist/src/cli/index.js +29 -4
- package/dist/src/cli/search.js +6 -4
- package/dist/src/cli/ui-build.d.ts +4 -0
- package/dist/src/cli/ui-build.js +13 -0
- package/dist/src/cli/ui.js +18 -2
- package/dist/src/code-refs.js +25 -4
- package/dist/src/fork/upstream-drift-cli.d.ts +1 -0
- package/dist/src/fork/upstream-drift-cli.js +2 -0
- package/dist/src/fork/upstream-drift.d.ts +26 -0
- package/dist/src/fork/upstream-drift.js +185 -0
- package/dist/src/fork/upstream-guard-cli.d.ts +1 -0
- package/dist/src/fork/upstream-guard-cli.js +2 -0
- package/dist/src/fork/upstream-guard.d.ts +72 -0
- package/dist/src/fork/upstream-guard.js +445 -0
- package/dist/src/graph-export.d.ts +2 -0
- package/dist/src/graph-export.js +31 -12
- package/dist/src/knowledge/claude-memory.d.ts +1 -0
- package/dist/src/knowledge/claude-memory.js +33 -4
- package/dist/src/lattice.d.ts +1 -0
- package/dist/src/search/search.d.ts +1 -0
- package/dist/src/search/search.js +15 -9
- package/dist/src/untrusted.d.ts +0 -6
- package/dist/src/untrusted.js +7 -11
- package/dist/src/view/client/assets/index-VZwPPiFE.js +334 -0
- package/dist/src/view/client/assets/index-W8ktvNj9.css +1 -0
- package/dist/src/view/client/assets/logo-CNF8zs47.svg +182 -0
- package/dist/src/view/client/index.html +2 -2
- package/dist/src/view/git-diff.js +17 -0
- package/dist/src/view/graph.d.ts +6 -0
- package/dist/src/view/graph.js +176 -0
- package/dist/src/view/markdown.d.ts +5 -1
- package/dist/src/view/markdown.js +112 -25
- package/dist/src/view/protocol.d.ts +43 -0
- package/dist/src/view/protocol.js +1 -1
- package/dist/src/view/references.d.ts +2 -0
- package/dist/src/view/references.js +30 -8
- package/dist/src/view/repository.d.ts +5 -2
- package/dist/src/view/repository.js +13 -12
- package/dist/src/view/search.js +1 -0
- package/dist/src/view/server.d.ts +3 -0
- package/dist/src/view/server.js +42 -9
- package/dist/src/view/source-target.d.ts +8 -0
- package/dist/src/view/source-target.js +22 -0
- package/dist/src/view/static-build.d.ts +16 -0
- package/dist/src/view/static-build.js +408 -0
- package/dist/src/view/static-protocol.d.ts +23 -0
- package/dist/src/view/static-protocol.js +10 -0
- package/dist/src/view/store.d.ts +9 -1
- package/dist/src/view/store.js +82 -15
- package/dist/src/view/table-of-contents.d.ts +9 -0
- package/dist/src/view/table-of-contents.js +103 -0
- package/package.json +3 -1
- package/templates/AGENTS.md +2 -0
- package/templates/skill/SKILL.md +2 -0
- package/dist/src/view/client/assets/index-B0n0u03y.css +0 -1
- 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-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
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
|
|
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;
|