@nanonets/graft 0.9.1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/README.md +49 -45
  2. package/dist/ask/fuse.d.ts.map +1 -1
  3. package/dist/ask/fuse.js +32 -14
  4. package/dist/ask/fuse.js.map +1 -1
  5. package/dist/claude/init.d.ts.map +1 -1
  6. package/dist/claude/init.js +6 -3
  7. package/dist/claude/init.js.map +1 -1
  8. package/dist/cli.js +93 -39
  9. package/dist/cli.js.map +1 -1
  10. package/dist/engine.d.ts +6 -2
  11. package/dist/engine.d.ts.map +1 -1
  12. package/dist/engine.js +4 -1
  13. package/dist/engine.js.map +1 -1
  14. package/dist/graph/build.d.ts +5 -0
  15. package/dist/graph/build.d.ts.map +1 -1
  16. package/dist/graph/build.js +21 -2
  17. package/dist/graph/build.js.map +1 -1
  18. package/dist/graph/check.d.ts +1 -1
  19. package/dist/graph/check.d.ts.map +1 -1
  20. package/dist/graph/check.js +13 -3
  21. package/dist/graph/check.js.map +1 -1
  22. package/dist/graph/generic.d.ts +25 -0
  23. package/dist/graph/generic.d.ts.map +1 -0
  24. package/dist/graph/generic.js +320 -0
  25. package/dist/graph/generic.js.map +1 -0
  26. package/dist/graph/lsp/client.d.ts +43 -0
  27. package/dist/graph/lsp/client.d.ts.map +1 -0
  28. package/dist/graph/lsp/client.js +179 -0
  29. package/dist/graph/lsp/client.js.map +1 -0
  30. package/dist/graph/lsp/enrich.d.ts +11 -0
  31. package/dist/graph/lsp/enrich.d.ts.map +1 -0
  32. package/dist/graph/lsp/enrich.js +155 -0
  33. package/dist/graph/lsp/enrich.js.map +1 -0
  34. package/dist/graph/lsp/registry.d.ts +15 -0
  35. package/dist/graph/lsp/registry.d.ts.map +1 -0
  36. package/dist/graph/lsp/registry.js +46 -0
  37. package/dist/graph/lsp/registry.js.map +1 -0
  38. package/dist/graph/queries/c.scm +13 -0
  39. package/dist/graph/queries/c_sharp.scm +19 -0
  40. package/dist/graph/queries/cpp.scm +23 -0
  41. package/dist/graph/queries/elixir.scm +54 -0
  42. package/dist/graph/queries/java.scm +20 -0
  43. package/dist/graph/queries/kotlin.scm +43 -0
  44. package/dist/graph/queries/php.scm +40 -0
  45. package/dist/graph/queries/ruby.scm +65 -0
  46. package/dist/graph/queries/rust.scm +41 -0
  47. package/dist/graph/queries/scala.scm +66 -0
  48. package/dist/graph/queries/solidity.scm +43 -0
  49. package/dist/graph/queries/swift.scm +51 -0
  50. package/dist/graph/resolve.d.ts.map +1 -1
  51. package/dist/graph/resolve.js +13 -3
  52. package/dist/graph/resolve.js.map +1 -1
  53. package/dist/graph/root.d.ts +11 -0
  54. package/dist/graph/root.d.ts.map +1 -0
  55. package/dist/graph/root.js +40 -0
  56. package/dist/graph/root.js.map +1 -0
  57. package/dist/graph/source-files.d.ts.map +1 -1
  58. package/dist/graph/source-files.js +5 -1
  59. package/dist/graph/source-files.js.map +1 -1
  60. package/dist/graph/types.d.ts +12 -7
  61. package/dist/graph/types.d.ts.map +1 -1
  62. package/dist/graph/types.js +2 -2
  63. package/dist/graph/workspace-cli.d.ts +1 -1
  64. package/dist/graph/workspace-cli.d.ts.map +1 -1
  65. package/dist/graph/workspace-cli.js +2 -2
  66. package/dist/graph/workspace-cli.js.map +1 -1
  67. package/dist/graph/workspace.d.ts +2 -2
  68. package/dist/graph/workspace.d.ts.map +1 -1
  69. package/dist/graph/workspace.js +2 -2
  70. package/dist/graph/workspace.js.map +1 -1
  71. package/dist/mcp/tools.js +6 -6
  72. package/dist/mcp/tools.js.map +1 -1
  73. package/package.json +6 -2
  74. package/scripts/build-viewer.mjs +17 -1
  75. package/scripts/graph-quality.mjs +117 -0
@@ -0,0 +1,320 @@
1
+ /**
2
+ * Generic "breadth" extractor tier — one language-agnostic extractor over any
3
+ * tree-sitter grammar + its `tags.scm` (the standard tree-sitter tags convention). This is how
4
+ * graft covers the long tail of languages for ~one registry row each, instead of
5
+ * a hand-written extractor per language (the depth tier in extract.ts).
6
+ *
7
+ * Grammars are WASM (`tree-sitter-wasms` bundle) loaded via `web-tree-sitter`, so
8
+ * a new language needs no native node-gyp build. Loading is async (WASM init), so
9
+ * callers MUST `await warmGenericGrammars([...])` once before the synchronous
10
+ * `extractGeneric()` is used in a build/check loop. If a grammar isn't warmed,
11
+ * `extractGeneric` degrades to a file node only (never throws).
12
+ *
13
+ * What it emits (signature-only): a file node + one node per `@definition.<kind>`
14
+ * capture, and bare-name `calls` raw edges from `@reference.call` attributed to
15
+ * the innermost enclosing definition. resolve.ts then resolves those calls by
16
+ * name for free (same-file → extracted, unique-global → inferred). Member-call
17
+ * receiver typing (recvType) is NOT produced here — that needs a per-language
18
+ * binding pass; the opt-in LSP tier fills that gap for popular languages.
19
+ */
20
+ import { readFileSync } from "node:fs";
21
+ import { fileURLToPath } from "node:url";
22
+ import { dirname, join } from "node:path";
23
+ import { createRequire } from "node:module";
24
+ import { contentHash } from "../util/id.js";
25
+ const HERE = dirname(fileURLToPath(import.meta.url));
26
+ const require = createRequire(import.meta.url);
27
+ // queries/ ships beside the compiled JS (copied by the build); fall back to src.
28
+ const QUERY_DIRS = [join(HERE, "queries"), join(HERE, "..", "..", "src", "graph", "queries")];
29
+ /** The breadth registry. Add a row + a queries/<name>.scm to support a language.
30
+ * Extensions here must NOT collide with the depth tier's EXTENSIONS (extract.ts). */
31
+ export const GENERIC_LANGS = [
32
+ { name: "rust", exts: [".rs"], wasm: "rust" },
33
+ { name: "java", exts: [".java"], wasm: "java" },
34
+ { name: "c", exts: [".c", ".h"], wasm: "c" },
35
+ { name: "cpp", exts: [".cpp", ".cc", ".cxx", ".hpp", ".hh"], wasm: "cpp" },
36
+ { name: "ruby", exts: [".rb"], wasm: "ruby" },
37
+ { name: "php", exts: [".php"], wasm: "php" },
38
+ { name: "c_sharp", exts: [".cs"], wasm: "c_sharp" },
39
+ // These ship a tags.scm (calls + symbols); ocaml/zig have none and use the
40
+ // node-kind walker fallback (symbols only) — still one row, zero query.
41
+ { name: "kotlin", exts: [".kt", ".kts"], wasm: "kotlin" },
42
+ { name: "scala", exts: [".scala", ".sc"], wasm: "scala" },
43
+ { name: "swift", exts: [".swift"], wasm: "swift" },
44
+ { name: "elixir", exts: [".ex", ".exs"], wasm: "elixir" },
45
+ { name: "solidity", exts: [".sol"], wasm: "solidity" },
46
+ { name: "ocaml", exts: [".ml", ".mli"], wasm: "ocaml" },
47
+ { name: "zig", exts: [".zig"], wasm: "zig" },
48
+ { name: "dart", exts: [".dart"], wasm: "dart" }, // surfaced by PR #38 (@muneebshere)
49
+ ];
50
+ const byExt = new Map();
51
+ for (const l of GENERIC_LANGS)
52
+ for (const e of l.exts)
53
+ byExt.set(e, l);
54
+ /** The generic language for a path, or null if no breadth grammar claims it. */
55
+ export function genericLangOf(path) {
56
+ const lower = path.toLowerCase();
57
+ for (const [ext, l] of byExt)
58
+ if (lower.endsWith(ext))
59
+ return l;
60
+ return null;
61
+ }
62
+ // tags.scm @definition.<X> → graft Kind (types.ts). Unmapped → "function".
63
+ const KIND = {
64
+ function: "function", method: "method", class: "class", interface: "interface",
65
+ type: "type", struct: "struct", enum: "enum", module: "module",
66
+ constant: "constant", variable: "variable", field: "variable",
67
+ object: "class", property: "variable", // Scala object; Swift/Scala property
68
+ };
69
+ const loaded = new Map();
70
+ let tsMod = null;
71
+ let initPromise = null;
72
+ function requireWasm(wasm) {
73
+ // Resolve the grammar wasm from the tree-sitter-wasms bundle.
74
+ try {
75
+ const p = require.resolve(`tree-sitter-wasms/out/tree-sitter-${wasm}.wasm`);
76
+ return readFileSync(p);
77
+ }
78
+ catch {
79
+ return null;
80
+ }
81
+ }
82
+ function loadQuery(name) {
83
+ for (const dir of QUERY_DIRS) {
84
+ try {
85
+ const raw = readFileSync(join(dir, `${name}.scm`), "utf8");
86
+ // Sanitize editor-specific query predicates the tree-sitter Query compiler rejects.
87
+ return raw.replace(/\(#(?:strip!|set!|set-adjacent!|select-adjacent!|make-range!|offset!|gsub!)[^()]*\)/g, "");
88
+ }
89
+ catch {
90
+ /* try next dir */
91
+ }
92
+ }
93
+ return null;
94
+ }
95
+ /** Warm the WASM grammars for the given graft lang names. Idempotent; must be
96
+ * awaited once before extractGeneric is used in a sync loop. Unknown/unavailable
97
+ * grammars are silently skipped (their files then extract as file-only). */
98
+ export async function warmGenericGrammars(langNames) {
99
+ const want = new Set(langNames);
100
+ const need = [...want].filter((n) => !loaded.has(n) && GENERIC_LANGS.some((l) => l.name === n));
101
+ if (need.length === 0)
102
+ return;
103
+ if (!tsMod) {
104
+ tsMod = await import("web-tree-sitter");
105
+ initPromise = initPromise ?? tsMod.Parser.init();
106
+ }
107
+ await initPromise;
108
+ const { Language, Query } = tsMod;
109
+ for (const name of need) {
110
+ const row = GENERIC_LANGS.find((l) => l.name === name);
111
+ const bytes = requireWasm(row.wasm);
112
+ if (!bytes)
113
+ continue;
114
+ try {
115
+ const language = await Language.load(bytes);
116
+ const scm = loadQuery(name);
117
+ let query = null;
118
+ if (scm) {
119
+ try {
120
+ query = new Query(language, scm);
121
+ }
122
+ catch {
123
+ query = null;
124
+ }
125
+ }
126
+ loaded.set(name, { language, query });
127
+ }
128
+ catch {
129
+ /* grammar failed to instantiate — skip; files extract as file-only */
130
+ }
131
+ }
132
+ }
133
+ /** True if a grammar has been warmed for this lang (else extractGeneric is file-only). */
134
+ export function isWarm(langName) {
135
+ return loaded.has(langName);
136
+ }
137
+ const PARSE_CHUNK = 16384; // <32KB slices — same tree-sitter limit workaround as extract.ts
138
+ function fileNode(rel, source) {
139
+ return {
140
+ id: rel, name: rel.split("/").pop() ?? rel, kind: "file", path: rel,
141
+ span: `L1-L${Math.max(1, source.split("\n").length)}`, signature: null,
142
+ exported: true, origin: "generic", body_hash: contentHash(source),
143
+ chars: Buffer.byteLength(source), summary_state: "pending", summary: null, crux: null,
144
+ };
145
+ }
146
+ /** Extract a single generic-tier file. Synchronous; needs the grammar pre-warmed.
147
+ * Uses the grammar's compiled tags.scm when present (symbols + call edges);
148
+ * otherwise falls back to a node-kind tree walker (symbols only) so ANY warmed
149
+ * grammar yields a graph even with no vendored query. */
150
+ export function extractGeneric(rel, source, langName) {
151
+ const nodes = [fileNode(rel, source)];
152
+ const rawEdges = [];
153
+ const entry = loaded.get(langName);
154
+ if (!entry || !tsMod)
155
+ return { nodes, rawEdges };
156
+ let tree;
157
+ try {
158
+ const parser = new tsMod.Parser();
159
+ parser.setLanguage(entry.language);
160
+ tree = parser.parse((i) => source.slice(i, i + PARSE_CHUNK));
161
+ }
162
+ catch {
163
+ return { nodes, rawEdges };
164
+ }
165
+ if (!tree)
166
+ return { nodes, rawEdges };
167
+ const minted = new Set([rel]);
168
+ const lines = source.split("\n");
169
+ const defs = [];
170
+ // One definition per source span: a grammar's tags.scm can capture the same node
171
+ // under two @definition kinds (Swift `func` is method AND function), and the
172
+ // walker can revisit a nested match — both would emit near-duplicate nodes.
173
+ const spanSeen = new Set();
174
+ // Mint one definition node from a whole-definition tree node. Shared by both
175
+ // the tags.scm path and the walker fallback so id/span/signature/body_text are
176
+ // built identically.
177
+ const mkDef = (name, kind, whole) => {
178
+ if (spanSeen.has(whole.startIndex))
179
+ return;
180
+ spanSeen.add(whole.startIndex);
181
+ const idBase = `${rel}#${name}`;
182
+ let id = idBase, n = 2;
183
+ while (minted.has(id))
184
+ id = `${idBase}~${n++}`;
185
+ minted.add(id);
186
+ const startRow = whole.startPosition.row, endRow = whole.endPosition.row;
187
+ const sigLine = (lines[startRow] ?? "").trim().replace(/\s*\{?\s*$/, "");
188
+ nodes.push({
189
+ id, name, kind, path: rel,
190
+ span: `L${startRow + 1}-L${endRow + 1}`,
191
+ signature: sigLine || null, exported: true, origin: "generic",
192
+ body_hash: contentHash(source.slice(whole.startIndex, whole.endIndex)),
193
+ body_text: source.slice(whole.startIndex, whole.endIndex).replace(/\s+/g, " ").slice(0, 5000),
194
+ summary_state: "pending", summary: null, crux: null,
195
+ });
196
+ defs.push({ id, startIndex: whole.startIndex, endIndex: whole.endIndex });
197
+ };
198
+ if (entry.query) {
199
+ tagsExtract(entry.query, tree.rootNode, rel, mkDef, defs, rawEdges);
200
+ }
201
+ else {
202
+ walkExtract(tree.rootNode, mkDef); // no tags.scm → symbols only
203
+ }
204
+ return { nodes, rawEdges };
205
+ }
206
+ /** tags.scm path: @definition.<kind> → nodes, @reference.call/@reference.send →
207
+ * bare-name call edges attributed to the innermost enclosing definition. */
208
+ function tagsExtract(query, root, rel, mkDef, defs, rawEdges) {
209
+ const q = query;
210
+ const matches = q.matches(root);
211
+ // Some grammars' tags.scm capture a definition's own NAME token as a
212
+ // @reference.call too (Ruby tags `def foo`'s `foo` as both @name and a call),
213
+ // producing bogus self-loops (foo→foo). Skip any call at a definition's name token.
214
+ const defNameAt = new Set();
215
+ const calls = [];
216
+ for (const m of matches) {
217
+ const cap = {};
218
+ for (const c of m.captures)
219
+ cap[c.name] = c.node;
220
+ const defKey = Object.keys(cap).find((k) => k.startsWith("definition."));
221
+ if (defKey && cap.name) {
222
+ defNameAt.add(cap.name.startIndex);
223
+ mkDef(cap.name.text, KIND[defKey.slice("definition.".length)] ?? "function", defScope(cap[defKey]));
224
+ }
225
+ if (("reference.call" in cap || "reference.send" in cap) && cap.name)
226
+ calls.push({ name: cap.name.text, at: cap.name.startIndex });
227
+ }
228
+ for (const c of calls) {
229
+ if (defNameAt.has(c.at))
230
+ continue;
231
+ const enc = defs
232
+ .filter((d) => d.startIndex <= c.at && c.at < d.endIndex)
233
+ .sort((a, b) => (a.endIndex - a.startIndex) - (b.endIndex - b.startIndex))[0];
234
+ rawEdges.push({ source: enc ? enc.id : rel, relation: "calls", file: rel, name: c.name });
235
+ }
236
+ }
237
+ // Node-type → Kind for the walker fallback. A node is a definition when its type
238
+ // ends with a declaration-ish suffix AND names a construct — matched most-specific
239
+ // first (method before function). Covers the common tree-sitter grammar vocab
240
+ // without any per-language query.
241
+ const DEF_SUFFIX = /(declaration|definition|_item|_specifier|_decl|_def|_binding)$/;
242
+ function classifyKind(type) {
243
+ const t = type.toLowerCase();
244
+ if (!DEF_SUFFIX.test(t) && !/^(class|struct|enum|interface|trait|module|namespace)/.test(t))
245
+ return null;
246
+ if (/method|constructor/.test(t))
247
+ return "method";
248
+ if (/func|function|def\b|subroutine|procedure/.test(t))
249
+ return "function";
250
+ if (/class/.test(t))
251
+ return "class";
252
+ if (/struct|record/.test(t))
253
+ return "struct";
254
+ if (/interface|trait|protocol/.test(t))
255
+ return "interface";
256
+ if (/enum/.test(t))
257
+ return "enum";
258
+ if (/module|namespace|package|mod_/.test(t))
259
+ return "module";
260
+ if (/const/.test(t))
261
+ return "constant";
262
+ if (/typedef|type_alias|type_def|alias/.test(t))
263
+ return "type";
264
+ if (/type/.test(t))
265
+ return "type";
266
+ if (/(^|_)(val|var|let|field|property)/.test(t))
267
+ return "variable";
268
+ return null;
269
+ }
270
+ /** The declared name of a node: its `name` field, else the first identifier-ish
271
+ * descendant within a couple of levels. */
272
+ function nodeName(node) {
273
+ const byField = node.childForFieldName?.("name");
274
+ if (byField?.text)
275
+ return byField.text;
276
+ const stack = [{ n: node, d: 0 }];
277
+ while (stack.length) {
278
+ const { n, d } = stack.shift();
279
+ if (d > 0 && /identifier|name/.test(n.type) && n.text && !n.text.includes("\n"))
280
+ return n.text;
281
+ if (d < 3)
282
+ for (let i = 0; i < (n.namedChildCount ?? 0); i++) {
283
+ const c = n.namedChild?.(i);
284
+ if (c)
285
+ stack.push({ n: c, d: d + 1 });
286
+ }
287
+ }
288
+ return null;
289
+ }
290
+ /** Walker fallback: DFS every named node, emit a def for each classified one
291
+ * (symbols only — no call resolution without a query). */
292
+ function walkExtract(root, mkDef) {
293
+ const visit = (n) => {
294
+ const kind = classifyKind(n.type);
295
+ if (kind) {
296
+ const name = nodeName(n);
297
+ if (name)
298
+ mkDef(name, kind, n);
299
+ }
300
+ for (let i = 0; i < (n.namedChildCount ?? 0); i++) {
301
+ const c = n.namedChild?.(i);
302
+ if (c)
303
+ visit(c);
304
+ }
305
+ };
306
+ visit(root);
307
+ }
308
+ // Some grammars' tags.scm put @definition.<X> on a narrow node (C tags the
309
+ // `function_declarator`, not the whole `function_definition` with its body), so
310
+ // the capture's span stops before the body and calls inside it can't be
311
+ // attributed to the function. Expand up to the outermost enclosing
312
+ // declaration/definition node so a def's span covers its body.
313
+ const DEF_CONTAINER = /(definition|declaration|specifier|_item)$/;
314
+ function defScope(node) {
315
+ let n = node;
316
+ while (n.parent && DEF_CONTAINER.test(n.parent.type))
317
+ n = n.parent;
318
+ return n;
319
+ }
320
+ //# sourceMappingURL=generic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic.js","sourceRoot":"","sources":["../../src/graph/generic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAI5C,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,iFAAiF;AACjF,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;AAU9F;qFACqF;AACrF,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;IAC7C,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;IAC/C,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE;IAC5C,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE;IAC1E,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;IAC7C,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE;IAC5C,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE;IACnD,2EAA2E;IAC3E,wEAAwE;IACxE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE;IACzD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE;IACzD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE;IAClD,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE;IACzD,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE;IACtD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE;IACvD,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE;IAC5C,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,oCAAoC;CACtF,CAAC;AAEF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;AAC7C,KAAK,MAAM,CAAC,IAAI,aAAa;IAAE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI;QAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEvE,gFAAgF;AAChF,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,KAAK;QAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6EAA6E;AAC7E,MAAM,IAAI,GAAyB;IACjC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW;IAC9E,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ;IAC9D,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU;IAC7D,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,qCAAqC;CAC7E,CAAC;AAKF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;AACzC,IAAI,KAAK,GAA4C,IAAI,CAAC;AAC1D,IAAI,WAAW,GAAyB,IAAI,CAAC;AAE7C,SAAS,WAAW,CAAC,IAAY;IAC/B,8DAA8D;IAC9D,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,qCAAqC,IAAI,OAAO,CAAC,CAAC;QAC5E,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;YAC3D,oFAAoF;YACpF,OAAO,GAAG,CAAC,OAAO,CAChB,sFAAsF,EACtF,EAAE,CACH,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;4EAE4E;AAC5E,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,SAA2B;IACnE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IAChG,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACxC,WAAW,GAAG,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACnD,CAAC;IACD,MAAM,WAAW,CAAC;IAClB,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAE,CAAC;QACxD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5C,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,KAAK,GAAmB,IAAI,CAAC;YACjC,IAAI,GAAG,EAAE,CAAC;gBACR,IAAI,CAAC;oBAAC,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,KAAK,GAAG,IAAI,CAAC;gBAAC,CAAC;YACnE,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,sEAAsE;QACxE,CAAC;IACH,CAAC;AACH,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,MAAM,CAAC,QAAgB;IACrC,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,iEAAiE;AAE5F,SAAS,QAAQ,CAAC,GAAW,EAAE,MAAc;IAC3C,OAAO;QACL,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG;QACnE,IAAI,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI;QACtE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC;QACjE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;KACtF,CAAC;AACJ,CAAC;AAID;;;yDAGyD;AACzD,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,MAAc,EAAE,QAAgB;IAC1E,MAAM,KAAK,GAAa,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAEjD,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAiB,CAAC,CAAC;QAC5C,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC7B,CAAC;IACD,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAEtC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,IAAI,GAAU,EAAE,CAAC;IACvB,iFAAiF;IACjF,6EAA6E;IAC7E,4EAA4E;IAC5E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,6EAA6E;IAC7E,+EAA+E;IAC/E,qBAAqB;IACrB,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,IAAU,EAAE,KAAa,EAAQ,EAAE;QAC9D,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC;YAAE,OAAO;QAC3C,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QAChC,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,EAAE,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACf,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC;QACzE,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACzE,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG;YACzB,IAAI,EAAE,IAAI,QAAQ,GAAG,CAAC,KAAK,MAAM,GAAG,CAAC,EAAE;YACvC,SAAS,EAAE,OAAO,IAAI,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS;YAC7D,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;YAC7F,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;SACpD,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC;IAEF,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,QAAkB,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAChF,CAAC;SAAM,CAAC;QACN,WAAW,CAAC,IAAI,CAAC,QAAkB,EAAE,KAAK,CAAC,CAAC,CAAC,6BAA6B;IAC5E,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC7B,CAAC;AAED;4EAC4E;AAC5E,SAAS,WAAW,CAClB,KAAc,EACd,IAAY,EACZ,GAAW,EACX,KAAwD,EACxD,IAAW,EACX,QAAmB;IAEnB,MAAM,CAAC,GAAG,KAA4F,CAAC;IACvG,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,qEAAqE;IACrE,8EAA8E;IAC9E,oFAAoF;IACpF,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,MAAM,KAAK,GAAwC,EAAE,CAAC;IACtD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,GAA2B,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ;YAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;QACzE,IAAI,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACvB,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACtG,CAAC;QACD,IAAI,CAAC,gBAAgB,IAAI,GAAG,IAAI,gBAAgB,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI;YAClE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAAE,SAAS;QAClC,MAAM,GAAG,GAAG,IAAI;aACb,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC;aACxD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,mFAAmF;AACnF,8EAA8E;AAC9E,kCAAkC;AAClC,MAAM,UAAU,GAAG,gEAAgE,CAAC;AACpF,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,uDAAuD,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACzG,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IAClD,IAAI,0CAA0C,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC;IAC1E,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IACpC,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC7C,IAAI,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,WAAW,CAAC;IAC3D,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,+BAA+B,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC7D,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC;IACvC,IAAI,mCAAmC,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAC/D,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,mCAAmC,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC;IACnE,OAAO,IAAI,CAAC;AACd,CAAC;AACD;2CAC2C;AAC3C,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,OAAO,EAAE,IAAI;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC;IACvC,MAAM,KAAK,GAAoC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACnE,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC;QAC/F,IAAI,CAAC,GAAG,CAAC;YAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7D,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC5B,IAAI,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACxC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AACD;0DAC0D;AAC1D,SAAS,WAAW,CAAC,IAAY,EAAE,KAAwD;IACzF,MAAM,KAAK,GAAG,CAAC,CAAS,EAAQ,EAAE;QAChC,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI;gBAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACjC,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAClD,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC;gBAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAeD,2EAA2E;AAC3E,gFAAgF;AAChF,wEAAwE;AACxE,mEAAmE;AACnE,+DAA+D;AAC/D,MAAM,aAAa,GAAG,2CAA2C,CAAC;AAClE,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC,GAAG,IAAI,CAAC;IACb,OAAO,CAAC,CAAC,MAAM,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnE,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,43 @@
1
+ export interface LspPosition {
2
+ line: number;
3
+ character: number;
4
+ }
5
+ export interface LspRange {
6
+ start: LspPosition;
7
+ end: LspPosition;
8
+ }
9
+ export interface CallHierarchyItem {
10
+ name: string;
11
+ kind: number;
12
+ uri: string;
13
+ range: LspRange;
14
+ selectionRange: LspRange;
15
+ }
16
+ export declare class LspClient {
17
+ private readonly root;
18
+ private readonly languageId;
19
+ private readonly callTimeoutMs;
20
+ private proc;
21
+ private conn;
22
+ private opened;
23
+ private ready;
24
+ private spawnFailed;
25
+ constructor(command: string, args: string[], root: string, languageId: string, callTimeoutMs?: number);
26
+ /** Safe to write to the server's stdin right now? */
27
+ private canWrite;
28
+ /** A request with a timeout so a wedged server can't hang the whole build. */
29
+ private call;
30
+ initialize(): Promise<boolean>;
31
+ /** Open a document (idempotent). Servers resolve cross-file refs from disk, but
32
+ * the LSP spec wants the queried document opened first. */
33
+ didOpen(abs: string): void;
34
+ /** Poll one probe position until call-hierarchy returns something — servers
35
+ * like rust-analyzer/clangd index AFTER `initialized` and answer empty until
36
+ * ready. Returns true once ready (or false at the cap). */
37
+ waitUntilReady(abs: string, pos: LspPosition, maxMs?: number): Promise<boolean>;
38
+ prepareCallHierarchy(abs: string, pos: LspPosition): Promise<CallHierarchyItem[]>;
39
+ /** The callees of an item — returns each outgoing call's `to` target. */
40
+ outgoingCalls(item: CallHierarchyItem): Promise<CallHierarchyItem[]>;
41
+ dispose(): Promise<void>;
42
+ }
43
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/graph/lsp/client.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,WAAW;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AAChE,MAAM,WAAW,QAAQ;IAAG,KAAK,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,WAAW,CAAA;CAAE;AAClE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,QAAQ,CAAC;IAChB,cAAc,EAAE,QAAQ,CAAC;CAC1B;AAID,qBAAa,SAAS;IAUlB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAXhC,OAAO,CAAC,IAAI,CAAiC;IAC7C,OAAO,CAAC,IAAI,CAAoB;IAChC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,WAAW,CAAS;gBAG1B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACG,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,aAAa,SAAQ;IAkCxC,qDAAqD;IACrD,OAAO,CAAC,QAAQ;IAIhB,8EAA8E;IAC9E,OAAO,CAAC,IAAI;IAYN,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IA6BpC;+DAC2D;IAC3D,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAY1B;;+DAE2D;IACrD,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,SAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAW9E,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IASvF,yEAAyE;IACnE,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAMpE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAS/B"}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * A minimal LSP client for the opt-in `--lsp` enrichment pass — just enough to
3
+ * pull compiler-grade call edges out of a language server: spawn it over stdio,
4
+ * initialize, open documents, and run the call-hierarchy requests. Built on
5
+ * `vscode-jsonrpc` (we don't hand-roll the framing). Everything is best-effort:
6
+ * a server that is missing, slow, or errors degrades to "no enrichment", never a
7
+ * crash — the AST graph stands on its own.
8
+ */
9
+ import { spawn } from "node:child_process";
10
+ import { pathToFileURL } from "node:url";
11
+ import { readFileSync } from "node:fs";
12
+ import { createMessageConnection, StreamMessageReader, StreamMessageWriter, } from "vscode-jsonrpc/node.js";
13
+ const uriOf = (abs) => pathToFileURL(abs).toString();
14
+ export class LspClient {
15
+ root;
16
+ languageId;
17
+ callTimeoutMs;
18
+ proc;
19
+ conn;
20
+ opened = new Set();
21
+ ready = false;
22
+ spawnFailed = false;
23
+ constructor(command, args, root, languageId, callTimeoutMs = 15000) {
24
+ this.root = root;
25
+ this.languageId = languageId;
26
+ this.callTimeoutMs = callTimeoutMs;
27
+ this.proc = spawn(command, args, { cwd: root, stdio: ["pipe", "pipe", "pipe"] });
28
+ // ENOENT (bad path) OR an immediate exit (e.g. a rustup shim whose component
29
+ // isn't installed) must fail fast, not hang a request for the full timeout.
30
+ this.proc.on("error", () => { this.spawnFailed = true; });
31
+ // An immediate exit (shim without its component, crash on startup) must fail
32
+ // fast so initialize bails instead of waiting out the timeout; once we've
33
+ // marked !ready, in-flight queries no-op. Firing during dispose is harmless.
34
+ this.proc.on("exit", () => { this.spawnFailed = true; this.ready = false; });
35
+ this.proc.stderr.resume(); // drain; servers are chatty on stderr
36
+ // Swallow write-after-destroy (EPIPE / ERR_STREAM_DESTROYED) when the server
37
+ // closes its stdin during/after shutdown — otherwise it surfaces as an
38
+ // unhandled stream error and taints the process exit code.
39
+ this.proc.stdin.on("error", () => { });
40
+ this.conn = createMessageConnection(new StreamMessageReader(this.proc.stdout), new StreamMessageWriter(this.proc.stdin));
41
+ // Answer the reverse-RPC requests every server makes during startup so it
42
+ // doesn't block waiting on us; we take defaults for all of them.
43
+ this.conn.onRequest("workspace/configuration", (p) => (p.items ?? []).map(() => ({})));
44
+ this.conn.onRequest("client/registerCapability", () => null);
45
+ this.conn.onRequest("window/workDoneProgress/create", () => null);
46
+ this.conn.onRequest("workspace/applyEdit", () => ({ applied: false }));
47
+ this.conn.onNotification(() => { }); // swallow all notifications (diagnostics, progress, logs)
48
+ // The connection/streams can error or close asynchronously (server exits,
49
+ // stdin destroyed) — absorb both so a late write never becomes an unhandled
50
+ // exception that taints the build's exit code.
51
+ this.conn.onError(() => { this.ready = false; });
52
+ this.conn.onClose(() => { this.ready = false; });
53
+ this.conn.listen();
54
+ }
55
+ /** Safe to write to the server's stdin right now? */
56
+ canWrite() {
57
+ return this.ready && this.proc.stdin.writable && !this.proc.stdin.destroyed;
58
+ }
59
+ /** A request with a timeout so a wedged server can't hang the whole build. */
60
+ call(method, params) {
61
+ if (!this.canWrite())
62
+ return Promise.resolve(null);
63
+ return new Promise((resolve) => {
64
+ let done = false;
65
+ const t = setTimeout(() => { if (!done) {
66
+ done = true;
67
+ resolve(null);
68
+ } }, this.callTimeoutMs);
69
+ this.conn.sendRequest(method, params).then((r) => { if (!done) {
70
+ done = true;
71
+ clearTimeout(t);
72
+ resolve(r);
73
+ } }, () => { if (!done) {
74
+ done = true;
75
+ clearTimeout(t);
76
+ resolve(null);
77
+ } });
78
+ });
79
+ }
80
+ async initialize() {
81
+ // Let a synchronous spawn failure (ENOENT) surface before we wait on a
82
+ // response that will never come.
83
+ await new Promise((r) => setTimeout(r, 50));
84
+ if (this.spawnFailed || this.proc.pid === undefined)
85
+ return false;
86
+ const rootUri = uriOf(this.root);
87
+ // Cold-workspace load (rust-analyzer/clangd index the project) can take a
88
+ // while — give initialize a generous timeout, separate from per-request.
89
+ const init = await new Promise((resolve) => {
90
+ const t = setTimeout(() => resolve(null), 120000);
91
+ this.conn.sendRequest("initialize", {
92
+ processId: process.pid,
93
+ rootUri,
94
+ workspaceFolders: [{ uri: rootUri, name: "root" }],
95
+ capabilities: {
96
+ textDocument: {
97
+ callHierarchy: { dynamicRegistration: false },
98
+ synchronization: { dynamicRegistration: false },
99
+ },
100
+ workspace: { workspaceFolders: true, configuration: true },
101
+ },
102
+ }).then((r) => { clearTimeout(t); resolve(r); }, () => { clearTimeout(t); resolve(null); });
103
+ });
104
+ if (!init)
105
+ return false;
106
+ this.conn.sendNotification("initialized", {});
107
+ this.ready = true;
108
+ return true;
109
+ }
110
+ /** Open a document (idempotent). Servers resolve cross-file refs from disk, but
111
+ * the LSP spec wants the queried document opened first. */
112
+ didOpen(abs) {
113
+ if (!this.canWrite() || this.opened.has(abs))
114
+ return;
115
+ let text = "";
116
+ try {
117
+ text = readFileSync(abs, "utf8");
118
+ }
119
+ catch {
120
+ return;
121
+ }
122
+ this.opened.add(abs);
123
+ try {
124
+ this.conn.sendNotification("textDocument/didOpen", {
125
+ textDocument: { uri: uriOf(abs), languageId: this.languageId, version: 1, text },
126
+ });
127
+ }
128
+ catch { /* stream closed mid-write */ }
129
+ }
130
+ /** Poll one probe position until call-hierarchy returns something — servers
131
+ * like rust-analyzer/clangd index AFTER `initialized` and answer empty until
132
+ * ready. Returns true once ready (or false at the cap). */
133
+ async waitUntilReady(abs, pos, maxMs = 90000) {
134
+ this.didOpen(abs);
135
+ const deadline = Date.now() + maxMs;
136
+ while (Date.now() < deadline) {
137
+ const items = await this.prepareCallHierarchy(abs, pos);
138
+ if (items.length)
139
+ return true;
140
+ await new Promise((r) => setTimeout(r, 2000));
141
+ }
142
+ return false;
143
+ }
144
+ async prepareCallHierarchy(abs, pos) {
145
+ if (!this.ready)
146
+ return [];
147
+ const r = await this.call("textDocument/prepareCallHierarchy", {
148
+ textDocument: { uri: uriOf(abs) },
149
+ position: pos,
150
+ });
151
+ return r ?? [];
152
+ }
153
+ /** The callees of an item — returns each outgoing call's `to` target. */
154
+ async outgoingCalls(item) {
155
+ if (!this.ready)
156
+ return [];
157
+ const r = await this.call("callHierarchy/outgoingCalls", { item });
158
+ return (r ?? []).map((c) => c.to).filter(Boolean);
159
+ }
160
+ async dispose() {
161
+ // Skip the graceful LSP shutdown/exit handshake: writing `exit` to a server
162
+ // that has already closed its stdin throws ERR_STREAM_DESTROYED and taints
163
+ // the exit code. The graph is already built; just tear the process down.
164
+ this.ready = false;
165
+ try {
166
+ this.conn.dispose();
167
+ }
168
+ catch { /* ignore */ }
169
+ try {
170
+ this.proc.stdin.destroy();
171
+ }
172
+ catch { /* ignore */ }
173
+ try {
174
+ this.proc.kill("SIGKILL");
175
+ }
176
+ catch { /* ignore */ }
177
+ }
178
+ }
179
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/graph/lsp/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { GraphV1 } from "../types.js";
2
+ export interface LspEnrichResult {
3
+ added: number;
4
+ queried: number;
5
+ server: string | null;
6
+ }
7
+ export declare function enrichWithLsp(graph: GraphV1, root: string, opts?: {
8
+ onProgress?: (done: number, total: number) => void;
9
+ maxNodes?: number;
10
+ }): Promise<LspEnrichResult>;
11
+ //# sourceMappingURL=enrich.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enrich.d.ts","sourceRoot":"","sources":["../../../src/graph/lsp/enrich.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,OAAO,EAAkB,MAAM,aAAa,CAAC;AAe3D,MAAM,WAAW,eAAe;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAE1F,wBAAsB,aAAa,CACjC,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GACnF,OAAO,CAAC,eAAe,CAAC,CAqG1B"}