markdown-lsp 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,9 +6,9 @@
6
6
  [![license](https://img.shields.io/npm/l/markdown-lsp.svg?style=flat-square)](https://github.com/Docsbook-io/markdown-lsp/blob/main/LICENSE)
7
7
  [![node](https://img.shields.io/node/v/markdown-lsp.svg?style=flat-square)](https://www.npmjs.com/package/markdown-lsp)
8
8
 
9
- CLI and library for querying Markdown documentation graphs. Point it at a folder of `.md` files and get instant full-text search, outline, link analysis, and symbol lookup — all as JSON.
9
+ CLI and library for querying Markdown documentation graphs. Point it at a folder of `.md` files and get instant full-text search, outline, link analysis, symbol lookup, interactive HTML graphs, and AI-powered semantic search — all as JSON.
10
10
 
11
- **Status: v1.1.0. CLI is the default interface. LSP stdio mode available as a subcommand.**
11
+ **Status: v1.2.0. CLI is the default interface. LSP stdio mode available as a subcommand.**
12
12
 
13
13
  ---
14
14
 
@@ -18,11 +18,40 @@ CLI and library for querying Markdown documentation graphs. Point it at a folder
18
18
  # List all pages
19
19
  npx markdown-lsp workspace-outline ./docs
20
20
 
21
+ # Heading outline of a page
22
+ npx markdown-lsp outline ./docs introduction.md
23
+
21
24
  # Full-text search (natural-language, ranked)
22
25
  npx markdown-lsp search-text ./docs "getting started"
23
26
 
24
27
  # Fuzzy heading search
25
28
  npx markdown-lsp search-symbols ./docs "auth" --limit 10
29
+
30
+ # Find pages by glob
31
+ npx markdown-lsp search-paths ./docs "ai/*.md"
32
+
33
+ # Backlinks and outgoing links
34
+ npx markdown-lsp links-to ./docs quick-start.md
35
+ npx markdown-lsp links-from ./docs README.md
36
+
37
+ # Resolve a link text / read a section
38
+ npx markdown-lsp resolve-link ./docs README.md "Getting Started"
39
+ npx markdown-lsp get-section ./docs overview.md "quick-links"
40
+
41
+ # Interactive link graph (HTML, JSON, DOT, Mermaid)
42
+ npx markdown-lsp graph ./docs --format html --out graph.html
43
+ npx markdown-lsp graph ./docs --format json --pretty
44
+ npx markdown-lsp graph ./docs --format dot | dot -Tsvg > graph.svg
45
+ npx markdown-lsp graph ./docs --format mermaid
46
+
47
+ # Build embeddings + interactive semantic graph in one command
48
+ OPENROUTER_API_KEY=sk-or-... npx markdown-lsp graph ./docs --format html --semantic --out graph.html
49
+
50
+ # AI semantic search
51
+ OPENROUTER_API_KEY=sk-or-... npx markdown-lsp semantic-search ./docs "how to configure webhooks"
52
+
53
+ # LSP server (for editors)
54
+ npx markdown-lsp lsp --stdio
26
55
  ```
27
56
 
28
57
  ---
@@ -54,9 +83,9 @@ All subcommands accept a **`--pretty`** flag for indented JSON output (compact b
54
83
  | `links-from` | `<docs-dir> <page>` | All links originating from `<page>` |
55
84
  | `resolve-link` | `<docs-dir> <from-page> <link-text>` | Resolve a specific link text from a page |
56
85
  | `get-section` | `<docs-dir> <page> <anchor>` | Get a section by anchor slug |
86
+ | `graph` | `<docs-dir> [--format json\|dot\|mermaid\|html] [--out file] [--semantic] [--sim-threshold n] [--sim-top-k n] [--model m]` | Export doc link graph; `--semantic` adds AI similarity edges |
87
+ | `semantic-search` | `<docs-dir> <query> [--limit n] [--model m]` | AI semantic search via embeddings |
57
88
  | `lsp` / `serve` | `[--stdio]` | Start the LSP stdio server |
58
- | `graph` | `<docs-dir> [--format json\|dot\|mermaid\|html] [--out file]` | Export the doc link graph |
59
- | `semantic-search` | `<docs-dir> <query> [--limit n] [--model model]` | AI semantic search via embeddings |
60
89
 
61
90
  ### search-text modes
62
91
 
@@ -118,21 +147,60 @@ markdown-lsp graph ./docs --format dot > graph.dot
118
147
  markdown-lsp graph ./docs --format mermaid
119
148
 
120
149
  # Self-contained interactive HTML with D3 force-directed graph
121
- # (drag, zoom, hover highlights neighbours, click to inspect)
150
+ # (drag, zoom, hover highlights neighbours, click to inspect side-panel)
122
151
  markdown-lsp graph ./docs --format html --out graph.html
123
152
  ```
124
153
 
125
154
  JSON output shape:
126
155
  ```json
127
156
  {
128
- "nodes": [{"id": "README.md", "title": "Docsbook", "charCount": 2634, "sectionsCount": 10}],
157
+ "nodes": [{"id": "README.md", "title": "Docsbook", "charCount": 2634, "sectionsCount": 10,
158
+ "sections": [...], "outgoing": [...], "incoming": [...], "topSimilar": []}],
129
159
  "edges": [{"source": "README.md", "target": "quick-start.md", "kind": "inline", "label": "Get started"}],
160
+ "semanticEdges": [],
130
161
  "unresolvedCount": 3
131
162
  }
132
163
  ```
133
164
 
134
165
  ---
135
166
 
167
+ ## Turnkey semantic graph (v1.2)
168
+
169
+ Overlay AI-powered semantic similarity edges on top of the link graph — one command, no pipeline.
170
+
171
+ ```bash
172
+ # Build embeddings + interactive semantic graph in one command
173
+ OPENROUTER_API_KEY=sk-or-... markdown-lsp graph ./docs --format html --semantic --out graph.html
174
+
175
+ # With explicit thresholds
176
+ OPENROUTER_API_KEY=sk-or-... markdown-lsp graph ./docs --format html --semantic \
177
+ --sim-threshold 0.75 --sim-top-k 5 --out graph.html
178
+ ```
179
+
180
+ **What you get in the HTML:**
181
+
182
+ - Two types of edges — **solid lines** (explicit markdown links) and **dashed amber lines** (semantic similarity)
183
+ - **Checkboxes** in the toolbar to toggle each edge type independently
184
+ - **Click any node** to open a side-panel showing: title, path, sections, outgoing links, incoming links, and top semantically similar pages with scores
185
+ - Clicking a linked page in the side-panel focuses the graph on that node
186
+ - Background click closes the panel and clears selection
187
+ - Drag and zoom preserved from v1.1
188
+
189
+ **Semantic flags:**
190
+
191
+ | Flag | Default | Description |
192
+ |---|---|---|
193
+ | `--semantic` | off | Enable AI similarity edges |
194
+ | `--sim-threshold` | `0.75` | Minimum cosine similarity score to draw an edge |
195
+ | `--sim-top-k` | `5` | Max semantic neighbours per node |
196
+ | `--model` | `openai/text-embedding-3-small` | Embedding model override |
197
+
198
+ **Caching:** embeddings are cached in `.markdown-lsp-cache/embeddings/` — the second run is instant with 0 API calls.
199
+
200
+ **OpenRouter model naming:** when using `OPENROUTER_API_KEY`, the model name requires the `openai/` prefix (e.g. `openai/text-embedding-3-small`). When using `AI_GATEWAY_API_KEY` (Vercel AI Gateway), use the bare name (`text-embedding-3-small`). If the model is rejected, the CLI outputs a clear hint to try the other form.
201
+
202
+ ---
203
+
136
204
  ## Semantic search
137
205
 
138
206
  AI-powered semantic search using text embeddings — finds conceptually related pages even if they
@@ -233,6 +301,7 @@ export AI_GATEWAY_API_KEY=... # Vercel AI Gateway
233
301
 
234
302
  - **CLI** — `node:util parseArgs`, zero extra deps, reads `.md` files into an in-memory graph
235
303
  - **Graph** — pure TypeScript, no DB needed; `buildGraph(docsRoot)` walks the directory tree
304
+ - **Semantic graph** — in-memory cosine similarity (N×N in ~5ms); embeddings via OpenRouter or Vercel AI Gateway; disk-cached per sha256(model+text)
236
305
  - **LSP** — `vscode-languageserver/node` over stdio; requires Postgres (Drizzle ORM, `mdlsp_` prefix)
237
306
  - **AI layer** (opt-in) — pgvector cosine search on canonical-term embeddings; `text-embedding-3-small` via Vercel AI Gateway
238
307
  - **Bridge** — pure in-memory search (searchText, searchTextRanked, searchSymbols, searchPaths, listPages)
@@ -255,8 +324,10 @@ pnpm test
255
324
  - **M1 — Structural layer** ✅
256
325
  - **M2 — Semantic extract** (opt-in, code present, awaiting live AI Gateway credit)
257
326
  - **M3 — CLI-first interface** ✅ (v1.0.0)
258
- - M4 — User overrides for the glossary (merge / split / rename / add_synonym)
259
- - M5 — Docsbook integration
327
+ - **M4 — Graph export + HTML D3 visualisation** (v1.1.0)
328
+ - **M5 — Turnkey semantic graph (graph --semantic)** ✅ (v1.2.0)
329
+ - M6 — User overrides for the glossary (merge / split / rename / add_synonym)
330
+ - M7 — Docsbook integration
260
331
 
261
332
  ---
262
333
 
package/dist/cli.js CHANGED
@@ -3,7 +3,7 @@ import * as fs from "node:fs";
3
3
  import { buildGraph } from "./graph.js";
4
4
  import { listPages, searchText, searchTextRanked, searchSymbols, searchPaths, } from "./bridge/index.js";
5
5
  const USAGE = `
6
- markdown-lsp v1.1.0 — CLI for querying Markdown documentation graphs
6
+ markdown-lsp v1.2.0 — CLI for querying Markdown documentation graphs
7
7
 
8
8
  USAGE
9
9
  markdown-lsp <subcommand> [options]
@@ -39,9 +39,19 @@ SUBCOMMANDS
39
39
  Retrieve a section by its anchor slug.
40
40
 
41
41
  graph <docs-dir> [--format json|dot|mermaid|html] [--out <file>]
42
+ [--semantic] [--sim-threshold <0-1>] [--sim-top-k <n>]
43
+ [--model <embedding-model>]
42
44
  Export the doc link graph. Default format: json (nodes/edges).
43
45
  Use --format html for a self-contained interactive D3 visualisation.
44
46
  Use --out <file> to write to disk instead of stdout.
47
+ Add --semantic to overlay AI-powered similarity edges (requires
48
+ OPENROUTER_API_KEY or AI_GATEWAY_API_KEY). Both link edges and
49
+ semantic edges are shown in the HTML graph with checkboxes to
50
+ toggle each type. Clicking a node opens a side-panel with full
51
+ info and highlights all its connections.
52
+ --sim-threshold Minimum cosine similarity for a semantic edge (default: 0.75)
53
+ --sim-top-k Maximum semantic neighbours per node (default: 5)
54
+ --model Embedding model override (default: openai/text-embedding-3-small)
45
55
 
46
56
  semantic-search <docs-dir> <query> [--limit <n>] [--model <embedding-model>]
47
57
  AI-powered semantic search using embeddings. Requires OPENROUTER_API_KEY
@@ -65,12 +75,45 @@ OUTPUT
65
75
  over stdio — it does NOT print JSON.
66
76
 
67
77
  EXAMPLES
78
+ # Overview of all pages
68
79
  markdown-lsp workspace-outline ./docs
69
- markdown-lsp search-text ./docs "getting started" --pretty
80
+
81
+ # Heading outline of one page
70
82
  markdown-lsp outline ./docs introduction.md
83
+
84
+ # Full-text search (natural-language, ranked)
85
+ markdown-lsp search-text ./docs "getting started"
86
+ markdown-lsp search-text ./docs "webhook signing" --mode verbatim --limit 5
87
+
88
+ # Fuzzy heading search
89
+ markdown-lsp search-symbols ./docs "webhook" --limit 10
90
+
91
+ # Find pages by filename glob
92
+ markdown-lsp search-paths ./docs "ai/*.md"
93
+
94
+ # Link graph
71
95
  markdown-lsp graph ./docs --format json --pretty
72
96
  markdown-lsp graph ./docs --format html --out graph.html
97
+ markdown-lsp graph ./docs --format dot | dot -Tsvg > graph.svg
98
+ markdown-lsp graph ./docs --format mermaid
99
+
100
+ # Build embeddings + interactive semantic graph in one command
101
+ markdown-lsp graph ./docs --format html --semantic --out graph.html
102
+ markdown-lsp graph ./docs --format html --semantic --sim-threshold 0.75 --sim-top-k 5 --out graph.html
103
+
104
+ # Backlinks / outgoing links
105
+ markdown-lsp links-to ./docs quick-start.md
106
+ markdown-lsp links-from ./docs README.md
107
+
108
+ # Resolve / read
109
+ markdown-lsp resolve-link ./docs README.md "Getting Started"
110
+ markdown-lsp get-section ./docs overview.md "quick-links"
111
+
112
+ # Semantic search (AI)
73
113
  markdown-lsp semantic-search ./docs "how to set up webhooks" --limit 5
114
+ markdown-lsp semantic-search ./docs "authentication" --model openai/text-embedding-3-small
115
+
116
+ # LSP server
74
117
  markdown-lsp lsp --stdio
75
118
  `.trim();
76
119
  function die(msg) {
@@ -80,43 +123,150 @@ function die(msg) {
80
123
  function out(value, pretty) {
81
124
  process.stdout.write((pretty ? JSON.stringify(value, null, 2) : JSON.stringify(value)) + "\n");
82
125
  }
83
- async function startLsp() {
84
- await import("./lsp.js");
85
- }
86
126
  function buildGraphExport(raw) {
87
- const nodes = raw.pages.map((p) => ({
88
- id: p.path,
89
- title: p.title ?? p.path,
90
- charCount: p.content.length,
91
- sectionsCount: p.sections.length,
92
- }));
93
- const edges = raw.links
94
- .filter((l) => l.toResolvedPath !== null)
95
- .map((l) => ({
96
- source: l.fromPath,
97
- target: l.toResolvedPath,
98
- kind: l.kind,
99
- ...(l.textAtLink ? { label: l.textAtLink } : {}),
100
- }));
101
- return { nodes, edges, unresolvedCount: raw.unresolved.length };
127
+ // Build node map with full side-panel data
128
+ const nodeMap = new Map();
129
+ for (const p of raw.pages) {
130
+ nodeMap.set(p.path, {
131
+ id: p.path,
132
+ title: p.title ?? p.path,
133
+ charCount: p.content.length,
134
+ sectionsCount: p.sections.length,
135
+ sections: p.sections.map((s) => ({
136
+ anchor: s.anchor,
137
+ headingPath: s.headingPath,
138
+ level: s.level,
139
+ })),
140
+ outgoing: [],
141
+ incoming: [],
142
+ topSimilar: [],
143
+ });
144
+ }
145
+ const edges = [];
146
+ for (const l of raw.links) {
147
+ if (l.toResolvedPath === null)
148
+ continue;
149
+ edges.push({
150
+ source: l.fromPath,
151
+ target: l.toResolvedPath,
152
+ kind: l.kind,
153
+ ...(l.textAtLink ? { label: l.textAtLink } : {}),
154
+ });
155
+ nodeMap.get(l.fromPath)?.outgoing.push({
156
+ target: l.toResolvedPath,
157
+ label: l.textAtLink,
158
+ kind: l.kind,
159
+ });
160
+ nodeMap.get(l.toResolvedPath)?.incoming.push({
161
+ source: l.fromPath,
162
+ label: l.textAtLink,
163
+ kind: l.kind,
164
+ });
165
+ }
166
+ return {
167
+ nodes: Array.from(nodeMap.values()),
168
+ edges,
169
+ semanticEdges: [],
170
+ unresolvedCount: raw.unresolved.length,
171
+ };
172
+ }
173
+ // ── Cosine similarity (no deps) ───────────────────────────────────────────────
174
+ function cosineSim(a, b) {
175
+ let dot = 0, na = 0, nb = 0;
176
+ for (let i = 0; i < a.length; i++) {
177
+ dot += a[i] * b[i];
178
+ na += a[i] * a[i];
179
+ nb += b[i] * b[i];
180
+ }
181
+ if (na === 0 || nb === 0)
182
+ return 0;
183
+ return dot / (Math.sqrt(na) * Math.sqrt(nb));
102
184
  }
185
+ // ── Semantic edge computation ─────────────────────────────────────────────────
186
+ async function addSemanticEdges(data, pages, modelOverride, simThreshold, simTopK) {
187
+ const { assertApiKey } = await import("./ai/config.js");
188
+ assertApiKey();
189
+ const { embedTexts } = await import("./ai/embeddings.js");
190
+ const pageTexts = pages.map((p) => {
191
+ const titlePart = p.title ? p.title + "\n\n" : "";
192
+ return titlePart + p.content.slice(0, 2000);
193
+ });
194
+ process.stderr.write(`[markdown-lsp] Embedding ${pages.length} pages` +
195
+ ` (model: ${modelOverride ?? "openai/text-embedding-3-small"})...\n`);
196
+ const { vectors, tokensUsed } = await embedTexts(pageTexts, modelOverride, true);
197
+ if (tokensUsed > 0) {
198
+ process.stderr.write(`[markdown-lsp] Embeddings computed (${tokensUsed} tokens used).\n`);
199
+ }
200
+ else {
201
+ process.stderr.write(`[markdown-lsp] Embeddings loaded from cache (0 API tokens).\n`);
202
+ }
203
+ const semanticEdges = [];
204
+ for (let i = 0; i < pages.length; i++) {
205
+ const vecI = vectors[i];
206
+ if (!vecI)
207
+ continue;
208
+ // Compute similarity to all other pages
209
+ const sims = [];
210
+ for (let j = 0; j < pages.length; j++) {
211
+ if (j === i)
212
+ continue;
213
+ const vecJ = vectors[j];
214
+ if (!vecJ)
215
+ continue;
216
+ const score = cosineSim(vecI, vecJ);
217
+ if (score >= simThreshold) {
218
+ sims.push({ j, score });
219
+ }
220
+ }
221
+ // topSimilar for side panel (no i<j constraint, full ranking)
222
+ const topSimilar = [...sims]
223
+ .sort((a, b) => b.score - a.score)
224
+ .slice(0, simTopK)
225
+ .map(({ j, score }) => ({
226
+ path: pages[j].path,
227
+ title: pages[j].title,
228
+ score: Math.round(score * 10000) / 10000,
229
+ }));
230
+ const node = data.nodes.find((n) => n.id === pages[i].path);
231
+ if (node)
232
+ node.topSimilar = topSimilar;
233
+ // Semantic edges: de-dup using i<j to avoid duplicates
234
+ for (const { j, score } of sims) {
235
+ if (j > i) {
236
+ semanticEdges.push({
237
+ source: pages[i].path,
238
+ target: pages[j].path,
239
+ score: Math.round(score * 10000) / 10000,
240
+ kind: "semantic",
241
+ });
242
+ }
243
+ }
244
+ }
245
+ data.semanticEdges = semanticEdges;
246
+ process.stderr.write(`[markdown-lsp] ${semanticEdges.length} semantic edges` +
247
+ ` (threshold=${simThreshold}, topK=${simTopK}).\n`);
248
+ }
249
+ // ── Graph renderers ───────────────────────────────────────────────────────────
103
250
  function renderGraphJson(data, pretty) {
104
251
  return pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
105
252
  }
106
253
  function renderGraphDot(data) {
107
254
  const lines = ['digraph G {', ' rankdir=LR;'];
108
- // Declare nodes with labels
109
255
  for (const n of data.nodes) {
110
256
  const label = n.title.replace(/"/g, '\\"');
111
257
  const id = n.id.replace(/"/g, '\\"');
112
258
  lines.push(` "${id}" [label="${label}"];`);
113
259
  }
114
- // Edges
115
260
  for (const e of data.edges) {
116
261
  const src = e.source.replace(/"/g, '\\"');
117
262
  const tgt = e.target.replace(/"/g, '\\"');
118
263
  lines.push(` "${src}" -> "${tgt}";`);
119
264
  }
265
+ for (const e of data.semanticEdges) {
266
+ const src = e.source.replace(/"/g, '\\"');
267
+ const tgt = e.target.replace(/"/g, '\\"');
268
+ lines.push(` "${src}" -> "${tgt}" [style=dashed color="#f59e0b" label="${e.score}"];`);
269
+ }
120
270
  lines.push('}');
121
271
  return lines.join('\n');
122
272
  }
@@ -127,9 +277,14 @@ function renderGraphMermaid(data) {
127
277
  const tgt = e.target.replace(/"/g, '\\"');
128
278
  lines.push(` "${src}" --> "${tgt}"`);
129
279
  }
280
+ for (const e of data.semanticEdges) {
281
+ const src = e.source.replace(/"/g, '\\"');
282
+ const tgt = e.target.replace(/"/g, '\\"');
283
+ lines.push(` "${src}" -. ${e.score} .-> "${tgt}"`);
284
+ }
130
285
  return lines.join('\n');
131
286
  }
132
- function renderGraphHtml(data, docsDir) {
287
+ function renderGraphHtml(data, docsDir, hasSemantic) {
133
288
  const title = docsDir.split('/').filter(Boolean).pop() ?? docsDir;
134
289
  const jsonData = JSON.stringify(data);
135
290
  return `<!DOCTYPE html>
@@ -143,167 +298,429 @@ function renderGraphHtml(data, docsDir) {
143
298
  body { font-family: system-ui, sans-serif; background: #0f1117; color: #e2e8f0; overflow: hidden; }
144
299
  #toolbar { position: fixed; top: 0; left: 0; right: 0; height: 44px; background: #1a1d27;
145
300
  border-bottom: 1px solid #2d3148; display: flex; align-items: center; padding: 0 16px;
146
- z-index: 10; gap: 12px; font-size: 13px; }
301
+ z-index: 10; gap: 16px; font-size: 13px; }
147
302
  #toolbar h1 { font-size: 14px; font-weight: 600; color: #a5b4fc; }
148
303
  #toolbar span { color: #64748b; }
149
- #graph { position: fixed; top: 44px; left: 0; right: 0; bottom: 0; }
304
+ .toggle-label { display: flex; align-items: center; gap: 6px; cursor: pointer; user-select: none; font-size: 12px; }
305
+ .toggle-label input[type=checkbox] { accent-color: #a5b4fc; width: 14px; height: 14px; cursor: pointer; }
306
+ .toggle-links { color: #a5b4fc; }
307
+ .toggle-semantic { color: #f59e0b; }
308
+ .toggle-label.disabled { opacity: 0.4; cursor: not-allowed; pointer-events: none; }
309
+ #graph-wrap { position: fixed; top: 44px; left: 0; bottom: 0; right: 0; transition: right 0.25s; }
310
+ #graph-wrap.panel-open { right: 320px; }
311
+ svg#graph { width: 100%; height: 100%; display: block; }
150
312
  #tooltip { position: fixed; pointer-events: none; background: #1e2130; border: 1px solid #3b4168;
151
313
  border-radius: 6px; padding: 8px 12px; font-size: 12px; line-height: 1.5;
152
314
  max-width: 280px; z-index: 20; display: none; }
153
315
  #tooltip .title { font-weight: 600; color: #c7d2fe; margin-bottom: 2px; }
154
316
  #tooltip .path { color: #64748b; font-size: 11px; }
155
317
  #tooltip .stats { color: #94a3b8; font-size: 11px; margin-top: 4px; }
318
+ #panel { position: fixed; top: 44px; right: 0; width: 320px; bottom: 0;
319
+ background: #1a1d27; border-left: 1px solid #2d3148; z-index: 15;
320
+ overflow-y: auto; display: none; }
321
+ #panel.open { display: block; }
322
+ #panel-header { padding: 14px 16px 10px; border-bottom: 1px solid #2d3148;
323
+ display: flex; align-items: flex-start; gap: 8px; }
324
+ #panel-close { background: none; border: none; color: #64748b; cursor: pointer;
325
+ font-size: 18px; line-height: 1; padding: 2px; flex-shrink: 0; margin-left: auto; }
326
+ #panel-close:hover { color: #e2e8f0; }
327
+ #panel-title { font-weight: 700; font-size: 14px; color: #c7d2fe; margin-bottom: 2px; word-break: break-all; }
328
+ #panel-path { font-size: 11px; color: #64748b; word-break: break-all; }
329
+ #panel-stats { font-size: 11px; color: #94a3b8; margin-top: 4px; }
330
+ #panel-body { padding: 12px 16px; }
331
+ .panel-section { margin-bottom: 16px; }
332
+ .panel-section h3 { font-size: 11px; font-weight: 600; color: #64748b; text-transform: uppercase;
333
+ letter-spacing: 0.05em; margin-bottom: 8px; }
334
+ .panel-section ul { list-style: none; }
335
+ .panel-section ul li { font-size: 12px; color: #94a3b8; padding: 3px 0; border-bottom: 1px solid #1e2130; }
336
+ .panel-section ul li:last-child { border-bottom: none; }
337
+ .panel-section ul li a { color: #a5b4fc; text-decoration: none; cursor: pointer; }
338
+ .panel-section ul li a:hover { text-decoration: underline; }
339
+ .panel-section ul li .score { font-size: 11px; color: #64748b; margin-left: 6px; }
340
+ .panel-section ul li .kind { font-size: 10px; color: #475569; margin-left: 4px; background: #1e2130;
341
+ padding: 1px 4px; border-radius: 3px; }
342
+ .panel-section .empty { color: #475569; font-size: 12px; font-style: italic; }
156
343
  .node circle { cursor: pointer; transition: r 0.15s; }
157
344
  .node text { pointer-events: none; font-size: 10px; fill: #cbd5e1; }
158
345
  .link { stroke: #3b4168; stroke-opacity: 0.6; fill: none; }
159
- .link.highlighted { stroke: #a5b4fc; stroke-opacity: 1; }
160
- .node.dimmed circle { opacity: 0.25; }
161
- .node.dimmed text { opacity: 0.15; }
346
+ .link.highlighted { stroke: #a5b4fc; stroke-opacity: 1; stroke-width: 1.5; }
347
+ .link-semantic { stroke: #f59e0b; stroke-opacity: 0.35; stroke-dasharray: 5,3; fill: none; }
348
+ .link-semantic.highlighted { stroke-opacity: 0.9; stroke-dasharray: none; }
349
+ .node.dimmed circle { opacity: 0.12; }
350
+ .node.dimmed text { opacity: 0.06; }
162
351
  .node.highlighted circle { stroke: #a5b4fc !important; stroke-width: 2px !important; }
352
+ .node.selected circle { stroke: #f59e0b !important; stroke-width: 2.5px !important; }
163
353
  </style>
164
354
  </head>
165
355
  <body>
166
356
  <div id="toolbar">
167
357
  <h1>Doc Graph — ${title}</h1>
168
358
  <span id="stats"></span>
359
+ <label class="toggle-label toggle-links" title="Toggle link edges (solid lines)">
360
+ <input type="checkbox" id="chk-links" checked> Links
361
+ </label>
362
+ <label class="toggle-label toggle-semantic${hasSemantic ? '' : ' disabled'}"
363
+ title="${hasSemantic ? 'Toggle semantic similarity edges (dashed lines)' : 'Run graph --semantic to enable'}">
364
+ <input type="checkbox" id="chk-semantic"${hasSemantic ? ' checked' : ' disabled'}> Semantic
365
+ </label>
366
+ </div>
367
+ <div id="graph-wrap">
368
+ <svg id="graph"></svg>
369
+ </div>
370
+ <div id="panel">
371
+ <div id="panel-header">
372
+ <div>
373
+ <div id="panel-title"></div>
374
+ <div id="panel-path"></div>
375
+ <div id="panel-stats"></div>
376
+ </div>
377
+ <button id="panel-close" title="Close panel">&#x2715;</button>
378
+ </div>
379
+ <div id="panel-body"></div>
169
380
  </div>
170
381
  <div id="tooltip"></div>
171
- <svg id="graph"></svg>
172
382
  <script>
173
383
  const DATA = ${jsonData};
384
+ const HAS_SEMANTIC = ${hasSemantic};
174
385
 
175
- const width = window.innerWidth;
176
- const height = window.innerHeight - 44;
177
- const svg = d3.select('#graph')
178
- .attr('width', width)
179
- .attr('height', height);
386
+ // Node map for fast lookup
387
+ const nodeById = new Map(DATA.nodes.map(n => [n.id, n]));
180
388
 
181
- // Build adjacency for highlight
182
- const adjacency = new Map();
183
- for (const n of DATA.nodes) adjacency.set(n.id, new Set());
389
+ // Build adjacency maps for highlight
390
+ const adjLink = new Map();
391
+ const adjSemantic = new Map();
392
+ for (const n of DATA.nodes) { adjLink.set(n.id, new Set()); adjSemantic.set(n.id, new Set()); }
184
393
  for (const e of DATA.edges) {
185
- if (adjacency.has(e.source)) adjacency.get(e.source).add(e.target);
186
- if (adjacency.has(e.target)) adjacency.get(e.target).add(e.source);
394
+ if (adjLink.has(e.source)) adjLink.get(e.source).add(e.target);
395
+ if (adjLink.has(e.target)) adjLink.get(e.target).add(e.source);
396
+ }
397
+ for (const e of DATA.semanticEdges) {
398
+ if (adjSemantic.has(e.source)) adjSemantic.get(e.source).add(e.target);
399
+ if (adjSemantic.has(e.target)) adjSemantic.get(e.target).add(e.source);
187
400
  }
188
401
 
402
+ const linkCount = DATA.edges.length;
403
+ const semCount = DATA.semanticEdges.length;
189
404
  document.getElementById('stats').textContent =
190
- DATA.nodes.length + ' pages · ' + DATA.edges.length + ' links · ' +
191
- DATA.unresolvedCount + ' unresolved';
405
+ DATA.nodes.length + ' pages · ' + linkCount + ' links' +
406
+ (semCount > 0 ? ' · ' + semCount + ' semantic' : '') +
407
+ ' · ' + DATA.unresolvedCount + ' unresolved';
408
+
409
+ const graphWrap = document.getElementById('graph-wrap');
410
+ function wrapW() { return graphWrap.offsetWidth || window.innerWidth; }
411
+ function wrapH() { return graphWrap.offsetHeight || (window.innerHeight - 44); }
412
+
413
+ const svg = d3.select('svg#graph');
192
414
 
193
415
  const g = svg.append('g');
194
416
 
195
- // Zoom
417
+ // Zoom + click-on-background
196
418
  svg.call(d3.zoom()
197
419
  .scaleExtent([0.05, 4])
198
420
  .on('zoom', (event) => g.attr('transform', event.transform)));
199
421
 
200
- // Links
422
+ svg.on('click', (event) => {
423
+ if (event.target.tagName === 'svg' || event.target.tagName === 'rect') {
424
+ clearHighlight();
425
+ closePanel();
426
+ }
427
+ });
428
+
429
+ // Arrow markers
430
+ const defs = svg.append('defs');
431
+ defs.append('marker').attr('id','arrow')
432
+ .attr('viewBox','0 -4 8 8').attr('refX',14).attr('refY',0)
433
+ .attr('markerWidth',6).attr('markerHeight',6).attr('orient','auto')
434
+ .append('path').attr('d','M0,-4L8,0L0,4').attr('fill','#3b4168');
435
+ defs.append('marker').attr('id','arrow-sem')
436
+ .attr('viewBox','0 -4 8 8').attr('refX',14).attr('refY',0)
437
+ .attr('markerWidth',6).attr('markerHeight',6).attr('orient','auto')
438
+ .append('path').attr('d','M0,-4L8,0L0,4').attr('fill','#f59e0b');
439
+
440
+ // Semantic edges (behind links)
441
+ const semanticLinkSel = g.append('g').selectAll('line')
442
+ .data(DATA.semanticEdges)
443
+ .join('line')
444
+ .attr('class','link-semantic')
445
+ .attr('stroke-width', d => Math.max(0.8, d.score * 2.5))
446
+ .attr('marker-end','url(#arrow-sem)');
447
+
448
+ // Link edges
201
449
  const linkSel = g.append('g').selectAll('line')
202
450
  .data(DATA.edges)
203
451
  .join('line')
204
- .attr('class', 'link')
205
- .attr('marker-end', 'url(#arrow)');
206
-
207
- // Arrow marker
208
- svg.append('defs').append('marker')
209
- .attr('id', 'arrow')
210
- .attr('viewBox', '0 -4 8 8')
211
- .attr('refX', 14)
212
- .attr('refY', 0)
213
- .attr('markerWidth', 6)
214
- .attr('markerHeight', 6)
215
- .attr('orient', 'auto')
216
- .append('path')
217
- .attr('d', 'M0,-4L8,0L0,4')
218
- .attr('fill', '#3b4168');
219
-
220
- // Color scale by first path segment
452
+ .attr('class','link')
453
+ .attr('marker-end','url(#arrow)');
454
+
455
+ // Color by first path segment
221
456
  const color = d3.scaleOrdinal(d3.schemeTableau10);
222
- const segColor = (id) => color(id.split('/')[0] ?? '');
457
+ const segColor = id => color(id.split('/')[0] ?? '');
458
+
459
+ let selectedNodeId = null;
223
460
 
224
461
  // Nodes
225
462
  const nodeSel = g.append('g').selectAll('g')
226
463
  .data(DATA.nodes)
227
464
  .join('g')
228
- .attr('class', 'node')
465
+ .attr('class','node')
229
466
  .call(d3.drag()
230
- .on('start', (event, d) => { if (!event.active) sim.alphaTarget(0.3).restart(); d.fx = d.x; d.fy = d.y; })
231
- .on('drag', (event, d) => { d.fx = event.x; d.fy = event.y; })
232
- .on('end', (event, d) => { if (!event.active) sim.alphaTarget(0); d.fx = null; d.fy = null; }));
467
+ .on('start',(ev,d)=>{ if(!ev.active) sim.alphaTarget(0.3).restart(); d.fx=d.x; d.fy=d.y; })
468
+ .on('drag',(ev,d)=>{ d.fx=ev.x; d.fy=ev.y; })
469
+ .on('end',(ev,d)=>{ if(!ev.active) sim.alphaTarget(0); d.fx=null; d.fy=null; }));
233
470
 
234
471
  nodeSel.append('circle')
235
- .attr('r', d => Math.max(5, Math.min(14, Math.sqrt(d.charCount / 120))))
472
+ .attr('r', d => Math.max(5, Math.min(14, Math.sqrt(d.charCount/120))))
236
473
  .attr('fill', d => segColor(d.id))
237
474
  .attr('fill-opacity', 0.85)
238
475
  .attr('stroke', d => segColor(d.id))
239
476
  .attr('stroke-width', 1);
240
477
 
241
478
  nodeSel.append('text')
242
- .attr('dx', d => Math.max(5, Math.min(14, Math.sqrt(d.charCount / 120))) + 3)
479
+ .attr('dx', d => Math.max(5, Math.min(14, Math.sqrt(d.charCount/120))) + 3)
243
480
  .attr('dy', '0.35em')
244
- .text(d => d.title.length > 24 ? d.title.slice(0, 22) + '' : d.title);
481
+ .text(d => d.title.length > 24 ? d.title.slice(0,22) + '\\u2026' : d.title);
245
482
 
246
483
  // Tooltip
247
484
  const tooltip = document.getElementById('tooltip');
248
485
  nodeSel
249
- .on('mouseover', (event, d) => {
486
+ .on('mouseover', (ev,d) => {
250
487
  tooltip.style.display = 'block';
251
- tooltip.innerHTML = '<div class="title">' + d.title + '</div>' +
252
- '<div class="path">' + d.id + '</div>' +
253
- '<div class="stats">' + d.charCount.toLocaleString() + ' chars · ' + d.sectionsCount + ' sections</div>';
254
- highlightNode(d);
488
+ tooltip.innerHTML =
489
+ '<div class="title">'+esc(d.title)+'</div>'+
490
+ '<div class="path">'+esc(d.id)+'</div>'+
491
+ '<div class="stats">'+d.charCount.toLocaleString()+' chars · '+d.sectionsCount+' sections</div>';
492
+ if (!selectedNodeId) highlightNode(d);
255
493
  })
256
- .on('mousemove', (event) => {
257
- tooltip.style.left = (event.clientX + 14) + 'px';
258
- tooltip.style.top = (event.clientY + 14) + 'px';
494
+ .on('mousemove', ev => {
495
+ tooltip.style.left = (ev.clientX+14)+'px';
496
+ tooltip.style.top = (ev.clientY+14)+'px';
259
497
  })
260
498
  .on('mouseout', () => {
261
- tooltip.style.display = 'none';
262
- clearHighlight();
499
+ tooltip.style.display='none';
500
+ if (!selectedNodeId) clearHighlight();
501
+ })
502
+ .on('click', (ev,d) => {
503
+ ev.stopPropagation();
504
+ if (selectedNodeId === d.id) {
505
+ selectedNodeId = null;
506
+ clearHighlight();
507
+ closePanel();
508
+ } else {
509
+ selectedNodeId = d.id;
510
+ highlightNode(d);
511
+ openPanel(d);
512
+ }
263
513
  });
264
514
 
515
+ function esc(s) {
516
+ return String(s)
517
+ .replace(/&/g,'&amp;').replace(/</g,'&lt;')
518
+ .replace(/>/g,'&gt;').replace(/"/g,'&quot;');
519
+ }
520
+
265
521
  function highlightNode(d) {
266
- const neighbors = adjacency.get(d.id) ?? new Set();
267
- nodeSel.classed('dimmed', n => n.id !== d.id && !neighbors.has(n.id));
268
- nodeSel.classed('highlighted', n => n.id === d.id);
269
- linkSel.classed('highlighted', e => e.source.id === d.id || e.target.id === d.id);
522
+ const ln = adjLink.get(d.id) ?? new Set();
523
+ const sn = adjSemantic.get(d.id) ?? new Set();
524
+ const all = new Set([...ln, ...sn]);
525
+ nodeSel
526
+ .classed('dimmed', n => n.id !== d.id && !all.has(n.id))
527
+ .classed('highlighted',n => n.id !== d.id && all.has(n.id))
528
+ .classed('selected', n => n.id === d.id);
529
+ linkSel.classed('highlighted',
530
+ e => e.source.id === d.id || e.target.id === d.id);
531
+ semanticLinkSel.classed('highlighted',
532
+ e => e.source.id === d.id || e.target.id === d.id);
270
533
  }
271
534
 
272
535
  function clearHighlight() {
273
- nodeSel.classed('dimmed', false).classed('highlighted', false);
274
- linkSel.classed('highlighted', false);
536
+ selectedNodeId = null;
537
+ nodeSel.classed('dimmed',false).classed('highlighted',false).classed('selected',false);
538
+ linkSel.classed('highlighted',false);
539
+ semanticLinkSel.classed('highlighted',false);
540
+ }
541
+
542
+ // ── Side panel ────────────────────────────────────────────────────────────────
543
+
544
+ const panel = document.getElementById('panel');
545
+ const panelTitle = document.getElementById('panel-title');
546
+ const panelPath = document.getElementById('panel-path');
547
+ const panelStats = document.getElementById('panel-stats');
548
+ const panelBody = document.getElementById('panel-body');
549
+
550
+ document.getElementById('panel-close').addEventListener('click', () => {
551
+ clearHighlight(); closePanel();
552
+ });
553
+
554
+ function openPanel(d) {
555
+ panelTitle.textContent = d.title;
556
+ panelPath.textContent = d.id;
557
+ panelStats.textContent = d.charCount.toLocaleString()+' chars · '+d.sectionsCount+' sections';
558
+ panelBody.innerHTML = '';
559
+
560
+ // Sections
561
+ if (d.sections && d.sections.length > 0) {
562
+ const sec = ps('Sections ('+d.sections.length+')');
563
+ const ul = document.createElement('ul');
564
+ const shown = d.sections.slice(0,10);
565
+ for (const s of shown) {
566
+ const li = document.createElement('li');
567
+ const label = s.headingPath.length > 0
568
+ ? s.headingPath[s.headingPath.length-1]
569
+ : (s.anchor ?? '(section)');
570
+ li.innerHTML = esc(label)+(s.anchor ? ' <span class="kind">#'+esc(s.anchor)+'</span>' : '');
571
+ ul.appendChild(li);
572
+ }
573
+ if (d.sections.length > 10) {
574
+ const li = document.createElement('li');
575
+ li.className = 'empty';
576
+ li.textContent = '… and '+(d.sections.length-10)+' more';
577
+ ul.appendChild(li);
578
+ }
579
+ sec.appendChild(ul); panelBody.appendChild(sec);
580
+ }
581
+
582
+ // Outgoing links
583
+ {
584
+ const out = d.outgoing || [];
585
+ const sec = ps('Links from this page'+(out.length ? ' ('+out.length+')' : ''));
586
+ if (out.length > 0) {
587
+ const ul = document.createElement('ul');
588
+ for (const o of out.slice(0,15)) {
589
+ const li = document.createElement('li');
590
+ const a = document.createElement('a');
591
+ a.textContent = (o.label && o.label !== o.target) ? o.label : o.target;
592
+ a.title = o.target;
593
+ a.addEventListener('click', ()=>focusNode(o.target));
594
+ li.appendChild(a);
595
+ const sp = document.createElement('span');
596
+ sp.className = 'kind'; sp.textContent = o.kind;
597
+ li.appendChild(sp);
598
+ ul.appendChild(li);
599
+ }
600
+ if (out.length > 15) {
601
+ const li = document.createElement('li');
602
+ li.className = 'empty';
603
+ li.textContent = '… and '+(out.length-15)+' more';
604
+ ul.appendChild(li);
605
+ }
606
+ sec.appendChild(ul);
607
+ } else {
608
+ sec.appendChild(empty('None'));
609
+ }
610
+ panelBody.appendChild(sec);
611
+ }
612
+
613
+ // Incoming links
614
+ {
615
+ const inc = d.incoming || [];
616
+ const sec = ps('Pages linking here'+(inc.length ? ' ('+inc.length+')' : ''));
617
+ if (inc.length > 0) {
618
+ const ul = document.createElement('ul');
619
+ for (const i of inc.slice(0,15)) {
620
+ const li = document.createElement('li');
621
+ const a = document.createElement('a');
622
+ a.textContent = i.source; a.title = i.source;
623
+ a.addEventListener('click', ()=>focusNode(i.source));
624
+ li.appendChild(a);
625
+ ul.appendChild(li);
626
+ }
627
+ if (inc.length > 15) {
628
+ const li = document.createElement('li');
629
+ li.className = 'empty';
630
+ li.textContent = '… and '+(inc.length-15)+' more';
631
+ ul.appendChild(li);
632
+ }
633
+ sec.appendChild(ul);
634
+ } else {
635
+ sec.appendChild(empty('None (orphan page)'));
636
+ }
637
+ panelBody.appendChild(sec);
638
+ }
639
+
640
+ // Semantic similar
641
+ if (HAS_SEMANTIC) {
642
+ const sim2 = d.topSimilar || [];
643
+ const sec = ps('Semantically similar'+(sim2.length ? ' ('+sim2.length+')' : ''));
644
+ if (sim2.length > 0) {
645
+ const ul = document.createElement('ul');
646
+ for (const s of sim2) {
647
+ const li = document.createElement('li');
648
+ const a = document.createElement('a');
649
+ a.textContent = s.title ?? s.path; a.title = s.path;
650
+ a.addEventListener('click', ()=>focusNode(s.path));
651
+ li.appendChild(a);
652
+ const sp = document.createElement('span');
653
+ sp.className = 'score'; sp.textContent = s.score.toFixed(3);
654
+ li.appendChild(sp);
655
+ ul.appendChild(li);
656
+ }
657
+ sec.appendChild(ul);
658
+ } else {
659
+ sec.appendChild(empty('No pages above threshold'));
660
+ }
661
+ panelBody.appendChild(sec);
662
+ }
663
+
664
+ panel.classList.add('open');
665
+ graphWrap.classList.add('panel-open');
666
+ if (sim) sim.force('center', d3.forceCenter(wrapW()/2, wrapH()/2)).alpha(0.1).restart();
275
667
  }
276
668
 
277
- // Force simulation
669
+ function closePanel() {
670
+ panel.classList.remove('open');
671
+ graphWrap.classList.remove('panel-open');
672
+ if (sim) sim.force('center', d3.forceCenter(wrapW()/2, wrapH()/2)).alpha(0.1).restart();
673
+ }
674
+
675
+ function focusNode(nodeId) {
676
+ const node = DATA.nodes.find(n => n.id === nodeId);
677
+ if (!node) return;
678
+ selectedNodeId = nodeId;
679
+ highlightNode(node);
680
+ openPanel(node);
681
+ }
682
+
683
+ function ps(heading) {
684
+ const div = document.createElement('div'); div.className = 'panel-section';
685
+ const h3 = document.createElement('h3'); h3.textContent = heading;
686
+ div.appendChild(h3); return div;
687
+ }
688
+ function empty(text) {
689
+ const p = document.createElement('p'); p.className = 'empty'; p.textContent = text; return p;
690
+ }
691
+
692
+ // ── Checkbox toggles ──────────────────────────────────────────────────────────
693
+
694
+ document.getElementById('chk-links').addEventListener('change', ev => {
695
+ linkSel.style('display', ev.target.checked ? null : 'none');
696
+ });
697
+ document.getElementById('chk-semantic').addEventListener('change', ev => {
698
+ semanticLinkSel.style('display', ev.target.checked ? null : 'none');
699
+ });
700
+
701
+ // ── Force simulation ──────────────────────────────────────────────────────────
702
+
703
+ const allSimEdges = [...DATA.edges, ...DATA.semanticEdges];
704
+
278
705
  const sim = d3.forceSimulation(DATA.nodes)
279
- .force('link', d3.forceLink(DATA.edges).id(d => d.id).distance(80).strength(0.5))
706
+ .force('link', d3.forceLink(allSimEdges).id(d => d.id)
707
+ .distance(80).strength(e => e.kind === 'semantic' ? 0.2 : 0.5))
280
708
  .force('charge', d3.forceManyBody().strength(-180))
281
- .force('center', d3.forceCenter(width / 2, height / 2))
709
+ .force('center', d3.forceCenter(wrapW()/2, wrapH()/2))
282
710
  .force('collide', d3.forceCollide(18))
283
711
  .on('tick', () => {
284
712
  linkSel
285
- .attr('x1', d => d.source.x)
286
- .attr('y1', d => d.source.y)
287
- .attr('x2', d => d.target.x)
288
- .attr('y2', d => d.target.y);
289
- nodeSel.attr('transform', d => 'translate(' + d.x + ',' + d.y + ')');
713
+ .attr('x1', d => d.source.x).attr('y1', d => d.source.y)
714
+ .attr('x2', d => d.target.x).attr('y2', d => d.target.y);
715
+ semanticLinkSel
716
+ .attr('x1', d => d.source.x).attr('y1', d => d.source.y)
717
+ .attr('x2', d => d.target.x).attr('y2', d => d.target.y);
718
+ nodeSel.attr('transform', d => 'translate('+d.x+','+d.y+')');
290
719
  });
291
720
  </script>
292
721
  </body>
293
722
  </html>`;
294
723
  }
295
- // ── Cosine similarity (no deps) ───────────────────────────────────────────────
296
- function cosineSim(a, b) {
297
- let dot = 0, na = 0, nb = 0;
298
- for (let i = 0; i < a.length; i++) {
299
- dot += a[i] * b[i];
300
- na += a[i] * a[i];
301
- nb += b[i] * b[i];
302
- }
303
- if (na === 0 || nb === 0)
304
- return 0;
305
- return dot / (Math.sqrt(na) * Math.sqrt(nb));
306
- }
307
724
  // ── Main ──────────────────────────────────────────────────────────────────────
308
725
  async function startLspServer() {
309
726
  await import("./lsp.js");
@@ -498,14 +915,56 @@ async function main() {
498
915
  options: {
499
916
  format: { type: "string" },
500
917
  out: { type: "string" },
918
+ semantic: { type: "boolean" },
919
+ "sim-threshold": { type: "string" },
920
+ "sim-top-k": { type: "string" },
921
+ model: { type: "string" },
501
922
  },
502
923
  allowPositionals: true,
503
924
  });
504
925
  const docsDir = positionals[0] ?? die("graph requires <docs-dir>");
505
926
  const format = (values.format ?? "json");
927
+ const semantic = values.semantic ?? false;
928
+ const simThreshold = values["sim-threshold"] !== undefined
929
+ ? parseFloat(values["sim-threshold"])
930
+ : 0.75;
931
+ const simTopK = values["sim-top-k"] !== undefined
932
+ ? parseInt(values["sim-top-k"], 10)
933
+ : 5;
934
+ const modelOverride = values.model;
506
935
  const graph = buildGraph(docsDir);
507
936
  const raw = graph.toJSON();
508
937
  const data = buildGraphExport(raw);
938
+ if (semantic) {
939
+ try {
940
+ await addSemanticEdges(data, raw.pages, modelOverride, simThreshold, simTopK);
941
+ }
942
+ catch (err) {
943
+ const msg = err instanceof Error ? err.message : String(err);
944
+ if (msg.includes("OPENROUTER_API_KEY") ||
945
+ msg.includes("AI_GATEWAY_API_KEY") ||
946
+ msg.includes("assertApiKey") ||
947
+ msg.includes("API key") ||
948
+ msg.includes("api key")) {
949
+ process.stderr.write("Error: --semantic requires an API key.\n" +
950
+ " Set OPENROUTER_API_KEY=<key> (OpenRouter — recommended)\n" +
951
+ " or AI_GATEWAY_API_KEY=<key> (Vercel AI Gateway)\n\n" +
952
+ " Default model: openai/text-embedding-3-small\n" +
953
+ " To override: --model openai/text-embedding-3-small\n" +
954
+ " If the model name is rejected try: --model text-embedding-3-small (no prefix)\n");
955
+ process.exit(1);
956
+ }
957
+ if (msg.toLowerCase().includes("model") ||
958
+ msg.includes("404") ||
959
+ msg.includes("not found")) {
960
+ process.stderr.write("Error computing semantic embeddings: " + msg + "\n" +
961
+ " Tip: try --model text-embedding-3-small (no openai/ prefix)\n" +
962
+ " or --model openai/text-embedding-3-small (with prefix for OpenRouter)\n");
963
+ process.exit(1);
964
+ }
965
+ throw err;
966
+ }
967
+ }
509
968
  let result;
510
969
  switch (format) {
511
970
  case "json":
@@ -518,7 +977,7 @@ async function main() {
518
977
  result = renderGraphMermaid(data);
519
978
  break;
520
979
  case "html":
521
- result = renderGraphHtml(data, docsDir);
980
+ result = renderGraphHtml(data, docsDir, semantic && data.semanticEdges.length > 0);
522
981
  break;
523
982
  default:
524
983
  die(`Unknown format: ${format}. Use json, dot, mermaid, or html.`);
@@ -571,7 +1030,6 @@ async function main() {
571
1030
  scored.sort((a, b) => b.score - a.score);
572
1031
  const topN = scored.slice(0, limit);
573
1032
  const results = topN.map(({ page, score }) => {
574
- // Extract a short snippet (first 200 chars of content)
575
1033
  const snippet = page.content.slice(0, 200).replace(/\s+/g, " ").trim();
576
1034
  return {
577
1035
  pagePath: page.path,
@@ -589,7 +1047,8 @@ async function main() {
589
1047
  }
590
1048
  }
591
1049
  main().catch((err) => {
592
- process.stderr.write("[markdown-lsp] Fatal error: " + (err instanceof Error ? err.stack ?? err.message : String(err)) + "\n");
1050
+ process.stderr.write("[markdown-lsp] Fatal error: " +
1051
+ (err instanceof Error ? err.stack ?? err.message : String(err)) + "\n");
593
1052
  process.exit(1);
594
1053
  });
595
1054
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EACL,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAE1B,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiHb,CAAC,IAAI,EAAE,CAAA;AAER,SAAS,GAAG,CAAC,GAAW;IACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAA;IAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,SAAS,GAAG,CAAC,KAAc,EAAE,MAAe;IAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;AAChG,CAAC;AAqCD,SAAS,gBAAgB,CAAC,GAAwD;IAChF,2CAA2C;IAC3C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAA;IAC5C,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;YAClB,EAAE,EAAE,CAAC,CAAC,IAAI;YACV,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI;YACxB,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM;YAC3B,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM;YAChC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC/B,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,KAAK,EAAE,CAAC,CAAC,KAAK;aACf,CAAC,CAAC;YACH,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,EAAE;SACf,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,KAAK,GAAgB,EAAE,CAAA;IAC7B,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,cAAc,KAAK,IAAI;YAAE,SAAQ;QACvC,KAAK,CAAC,IAAI,CAAC;YACT,MAAM,EAAE,CAAC,CAAC,QAAQ;YAClB,MAAM,EAAE,CAAC,CAAC,cAAc;YACxB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjD,CAAC,CAAA;QACF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC;YACrC,MAAM,EAAE,CAAC,CAAC,cAAc;YACxB,KAAK,EAAE,CAAC,CAAC,UAAU;YACnB,IAAI,EAAE,CAAC,CAAC,IAAI;SACb,CAAC,CAAA;QACF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC;YAC3C,MAAM,EAAE,CAAC,CAAC,QAAQ;YAClB,KAAK,EAAE,CAAC,CAAC,UAAU;YACnB,IAAI,EAAE,CAAC,CAAC,IAAI;SACb,CAAC,CAAA;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,KAAK;QACL,aAAa,EAAE,EAAE;QACjB,eAAe,EAAE,GAAG,CAAC,UAAU,CAAC,MAAM;KACvC,CAAA;AACH,CAAC;AAED,iFAAiF;AAEjF,SAAS,SAAS,CAAC,CAAW,EAAE,CAAW;IACzC,IAAI,GAAG,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;QACpB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;QACnB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;IACrB,CAAC;IACD,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IAClC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;AAC9C,CAAC;AAED,iFAAiF;AAEjF,KAAK,UAAU,gBAAgB,CAC7B,IAAiB,EACjB,KAAmE,EACnE,aAAiC,EACjC,YAAoB,EACpB,OAAe;IAEf,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAA;IACvD,YAAY,EAAE,CAAA;IAEd,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAA;IAEzD,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAChC,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;QACjD,OAAO,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,4BAA4B,KAAK,CAAC,MAAM,QAAQ;QAChD,YAAY,aAAa,IAAI,+BAA+B,QAAQ,CACrE,CAAA;IACD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,aAAa,EAAE,IAAI,CAAC,CAAA;IAChF,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,UAAU,kBAAkB,CAAC,CAAA;IAC3F,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAA;IACvF,CAAC;IAED,MAAM,aAAa,GAAmB,EAAE,CAAA;IAExC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;QACvB,IAAI,CAAC,IAAI;YAAE,SAAQ;QAEnB,wCAAwC;QACxC,MAAM,IAAI,GAAwC,EAAE,CAAA;QACpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,CAAC,KAAK,CAAC;gBAAE,SAAQ;YACrB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YACvB,IAAI,CAAC,IAAI;gBAAE,SAAQ;YACnB,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YACnC,IAAI,KAAK,IAAI,YAAY,EAAE,CAAC;gBAC1B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;YACzB,CAAC;QACH,CAAC;QAED,8DAA8D;QAC9D,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC;aACzB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;aACjC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC;aACjB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YACtB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI;YACpB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK;YACtB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,KAAK;SACzC,CAAC,CAAC,CAAA;QAEL,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAA;QAC5D,IAAI,IAAI;YAAE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAEtC,uDAAuD;QACvD,KAAK,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACV,aAAa,CAAC,IAAI,CAAC;oBACjB,MAAM,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI;oBACtB,MAAM,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI;oBACtB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,KAAK;oBACxC,IAAI,EAAE,UAAU;iBACjB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;IAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kBAAkB,aAAa,CAAC,MAAM,iBAAiB;QACvD,eAAe,YAAY,UAAU,OAAO,MAAM,CACnD,CAAA;AACH,CAAC;AAED,iFAAiF;AAEjF,SAAS,eAAe,CAAC,IAAiB,EAAE,MAAe;IACzD,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;AACtE,CAAC;AAED,SAAS,cAAc,CAAC,IAAiB;IACvC,MAAM,KAAK,GAAa,CAAC,aAAa,EAAE,eAAe,CAAC,CAAA;IACxD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAC1C,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACpC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,KAAK,KAAK,CAAC,CAAA;IAC7C,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACzC,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACzC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,CAAA;IACvC,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACzC,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACzC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS,GAAG,0CAA0C,CAAC,CAAC,KAAK,KAAK,CAAC,CAAA;IACzF,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAiB;IAC3C,MAAM,KAAK,GAAa,CAAC,UAAU,CAAC,CAAA;IACpC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACzC,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACzC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,UAAU,GAAG,GAAG,CAAC,CAAA;IACvC,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACzC,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACzC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,KAAK,SAAS,GAAG,GAAG,CAAC,CAAA;IACrD,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,SAAS,eAAe,CAAC,IAAiB,EAAE,OAAe,EAAE,WAAoB;IAC/E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,OAAO,CAAA;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IACrC,OAAO;;;;qBAIY,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBA+DN,KAAK;;;;;8CAKqB,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW;kBAC1D,WAAW,CAAC,CAAC,CAAC,iDAAiD,CAAC,CAAC,CAAC,gCAAgC;8CACtE,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW;;;;;;;;;;;;;;;;;;;eAmBrE,QAAQ;uBACA,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAkV1B,CAAA;AACR,CAAC;AAED,iFAAiF;AAEjF,KAAK,UAAU,cAAc;IAC3B,MAAM,MAAM,CAAC,UAAU,CAAC,CAAA;AAC1B,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAElC,4EAA4E;IAC5E,IACE,IAAI,CAAC,MAAM,KAAK,CAAC;QACjB,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS;QACrB,IAAI,CAAC,CAAC,CAAC,KAAK,YAAY;QACxB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EACzD,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,iEAAiE;YACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAA;YAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,yEAAyE;QACzE,MAAM,cAAc,EAAE,CAAA;QACtB,OAAM;IACR,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAE,CAAA;IAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAE1B,iBAAiB;IACjB,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAA;QAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,iBAAiB;IACjB,IAAI,UAAU,KAAK,KAAK,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QACnD,MAAM,cAAc,EAAE,CAAA;QACtB,OAAM;IACR,CAAC;IAED,6CAA6C;IAC7C,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,MAAM,YAAY,GAAa,EAAE,CAAA;IACjC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,UAAU;YAAE,MAAM,GAAG,IAAI,CAAA;;YAChC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IAED,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACzB,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBACxC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE;oBACP,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC1B;gBACD,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,uCAAuC,CAAC,CAAA;YAC9E,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE;gBAC9B,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;aAC3E,CAAC,CAAA;YACF,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YACnB,MAAK;QACP,CAAC;QAED,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBAChC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,EAAE;gBACX,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,6BAA6B,CAAC,CAAA;YACpE,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,yBAAyB,CAAC,CAAA;YAC7D,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YACpC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YACnB,MAAK;QACP,CAAC;QAED,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBACxC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE;oBACP,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxB,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;oBAC1B,gBAAgB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;oBACrC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC5B;gBACD,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,iCAAiC,CAAC,CAAA;YACxE,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,8BAA8B,CAAC,CAAA;YACnE,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,IAAI,GAAG;gBACX,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,aAAa,EAAE,MAAM,CAAC,gBAAgB,CAAC;gBACvC,UAAU,EAAE,MAAM,CAAC,MAAM;gBACzB,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC1E,YAAY,EAAE,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;aACtF,CAAA;YACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAA;YACpC,MAAM,MAAM,GAAG,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,KAAK;gBAChD,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC;gBAChC,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;YACxC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YACnB,MAAK;QACP,CAAC;QAED,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBACxC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE;oBACP,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC1B;gBACD,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,oCAAoC,CAAC,CAAA;YAC3E,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,iCAAiC,CAAC,CAAA;YACtE,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YACjF,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;YACjD,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YACnB,MAAK;QACP,CAAC;QAED,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBAChC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,EAAE;gBACX,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,kCAAkC,CAAC,CAAA;YACzE,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,8BAA8B,CAAC,CAAA;YAClE,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YACvC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YACnB,MAAK;QACP,CAAC;QAED,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBAChC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,EAAE;gBACX,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,8BAA8B,CAAC,CAAA;YACrE,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,0BAA0B,CAAC,CAAA;YAC9D,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;YACxC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YACnB,MAAK;QACP,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBAChC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,EAAE;gBACX,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,gCAAgC,CAAC,CAAA;YACvE,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,4BAA4B,CAAC,CAAA;YAChE,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;YACxC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YACnB,MAAK;QACP,CAAC;QAED,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBAChC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,EAAE;gBACX,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,kCAAkC,CAAC,CAAA;YACzE,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,mCAAmC,CAAC,CAAA;YAC3E,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,mCAAmC,CAAC,CAAA;YAC3E,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;YAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,IAAI,IAAI,CAAA;YAClE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;YAClB,MAAK;QACP,CAAC;QAED,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBAChC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,EAAE;gBACX,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,iCAAiC,CAAC,CAAA;YACxE,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,6BAA6B,CAAC,CAAA;YACjE,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,+BAA+B,CAAC,CAAA;YACrE,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;YACtC,MAAM,OAAO,GAAG,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,IAAI,CAAA;YAC1E,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YACpB,MAAK;QACP,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBACxC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE;oBACP,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACvB,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;oBAC7B,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACnC,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC/B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC1B;gBACD,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,2BAA2B,CAAC,CAAA;YAClE,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAwC,CAAA;YAC/E,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAA;YACzC,MAAM,YAAY,GAAG,MAAM,CAAC,eAAe,CAAC,KAAK,SAAS;gBACxD,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;gBACrC,CAAC,CAAC,IAAI,CAAA;YACR,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,SAAS;gBAC/C,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;gBACnC,CAAC,CAAC,CAAC,CAAA;YACL,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAA;YAElC,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAA;YAC1B,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAA;YAElC,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC;oBACH,MAAM,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,CAAC,CAAA;gBAC/E,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;oBAC5D,IACE,GAAG,CAAC,QAAQ,CAAC,oBAAoB,CAAC;wBAClC,GAAG,CAAC,QAAQ,CAAC,oBAAoB,CAAC;wBAClC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;wBAC5B,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;wBACvB,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EACvB,CAAC;wBACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,0CAA0C;4BAC1C,8DAA8D;4BAC9D,yDAAyD;4BACzD,kDAAkD;4BAClD,wDAAwD;4BACxD,mFAAmF,CACpF,CAAA;wBACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;oBACjB,CAAC;oBACD,IACE,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;wBACnC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;wBACnB,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EACzB,CAAC;wBACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uCAAuC,GAAG,GAAG,GAAG,IAAI;4BACpD,iEAAiE;4BACjE,6EAA6E,CAC9E,CAAA;wBACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;oBACjB,CAAC;oBACD,MAAM,GAAG,CAAA;gBACX,CAAC;YACH,CAAC;YAED,IAAI,MAAc,CAAA;YAClB,QAAQ,MAAM,EAAE,CAAC;gBACf,KAAK,MAAM;oBACT,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;oBACtC,MAAK;gBACP,KAAK,KAAK;oBACR,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;oBAC7B,MAAK;gBACP,KAAK,SAAS;oBACZ,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAA;oBACjC,MAAK;gBACP,KAAK,MAAM;oBACT,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;oBAClF,MAAK;gBACP;oBACE,GAAG,CAAC,mBAAmB,MAAM,oCAAoC,CAAC,CAAA;YACtE,CAAC;YAED,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;gBACf,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;gBAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAA;YAC1D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;YACrC,CAAC;YACD,MAAK;QACP,CAAC;QAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBACxC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE;oBACP,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC1B;gBACD,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,qCAAqC,CAAC,CAAA;YAC5E,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,kCAAkC,CAAC,CAAA;YACvE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;YAC1E,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAA;YAElC,sCAAsC;YACtC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAA;YACvD,YAAY,EAAE,CAAA;YAEd,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAA;YAEnE,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;YAEzB,uEAAuE;YACvE,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBAChC,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;gBACjD,OAAO,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;YAC7C,CAAC,CAAC,CAAA;YAEF,yCAAyC;YACzC,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACnD,UAAU,CAAC,SAAS,EAAE,aAAa,EAAE,IAAI,CAAC;gBAC1C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;aAC/B,CAAC,CAAA;YAEF,kBAAkB;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAChC,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;gBACrC,IAAI,CAAC,GAAG;oBAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;gBACtC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAA;YACrD,CAAC,CAAC,CAAA;YAEF,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAA;YACxC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;YAEnC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;gBACtE,OAAO;oBACL,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,SAAS,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI;oBAClC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,KAAK;oBACxC,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO;iBACxE,CAAA;YACH,CAAC,CAAC,CAAA;YAEF,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YACpB,MAAK;QACP,CAAC;QAED;YACE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,UAAU,OAAO,KAAK,IAAI,CAAC,CAAA;YACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,8BAA8B;QAC9B,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CACvE,CAAA;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "markdown-lsp",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Language Server Protocol implementation for Markdown with optional AI-canonicalized glossary that resolves synonyms across docs",
5
5
  "type": "module",
6
6
  "bin": {