@askdkc/dsh-lsp-server 0.1.14 → 0.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/lib/{code-intelligence-DvhxPnpu.js → code-intelligence-BUs39chK.js} +36 -8
- package/lib/code-intelligence-BUs39chK.js.map +1 -0
- package/lib/code-intelligence.js +1 -1
- package/lib/grammars/manifest.json +10 -0
- package/lib/grammars/tree-sitter-php.wasm +0 -0
- package/lib/parser-worker.mjs +76 -9
- package/lib/provider.js +1 -1
- package/lib/types/structure/types.d.ts +1 -1
- package/lib/types/structure/worker-pool.d.ts +4 -0
- package/package.json +7 -5
- package/lib/code-intelligence-DvhxPnpu.js.map +0 -1
package/README.md
CHANGED
|
@@ -6,11 +6,11 @@ Markdown and other unsupported documents return an explicit `skipped` diagnostic
|
|
|
6
6
|
|
|
7
7
|
## Read-only code structure
|
|
8
8
|
|
|
9
|
-
The provider also bundles Tree-sitter WASM grammars for JavaScript, TypeScript, and
|
|
9
|
+
The provider also bundles Tree-sitter WASM grammars for JavaScript, TypeScript, TSX, and PHP. Svelte instance and module scripts reuse the JavaScript/TypeScript grammars, with ranges mapped back to the component snapshot. Through `lsp_extra`, open a workspace-relative snapshot, use its opaque handle with `structure` (`outline`, `enclosing`, `query`, or bounded `span`) or `semantic` operations, then release the snapshot. Structure and semantic positions use zero-based UTF-16 coordinates; completion keeps its existing one-based coordinates. Only registered query IDs (`declarations`, `calls`, `imports`) are accepted. No edits or arbitrary Tree-sitter queries are exposed.
|
|
10
10
|
|
|
11
11
|
For example, inspect parser availability, open `src/index.ts` with `operation: "snapshot", action: "open", file_path: "src/index.ts"`, pass the returned handle to `operation: "structure", action: "outline"`, and release it with `operation: "snapshot", action: "release"`. Snapshot documents are capped at 2 MiB; outline/query results, source spans, responses, and evaluation budgets are bounded. Unsupported languages or unavailable semantic servers are reported explicitly rather than treated as empty successful results. Tree-sitter cache entries are bounded and released with their snapshots or worker lifetime.
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
PHP supports `declarations` (named classes, functions, and methods) and the corresponding outline, enclosing, and span operations without PHPantom. Svelte supports the registered JavaScript/TypeScript queries inside top-level `<script>` blocks, including `lang="ts"`, `module`, and `context="module"`; markup and styles are not code declarations. Positions and spans refer to the original component snapshot, not extracted scripts (DSH may normalize line endings and strip a UTF-8 BOM when reading text). Blade, HTML, CSS, and Rust structural grammars are not included; their existing LSP routing does not imply structural-parser support.
|
|
14
14
|
|
|
15
15
|
## Requirements
|
|
16
16
|
|
|
@@ -16,7 +16,9 @@ const EXTENSION_LANGUAGE = {
|
|
|
16
16
|
".ts": "typescript",
|
|
17
17
|
".mts": "typescript",
|
|
18
18
|
".cts": "typescript",
|
|
19
|
-
".tsx": "tsx"
|
|
19
|
+
".tsx": "tsx",
|
|
20
|
+
".php": "php",
|
|
21
|
+
".svelte": "svelte"
|
|
20
22
|
};
|
|
21
23
|
var DocumentSnapshotStore = class {
|
|
22
24
|
records = /* @__PURE__ */ new Map();
|
|
@@ -146,6 +148,7 @@ var DocumentSnapshotStore = class {
|
|
|
146
148
|
}
|
|
147
149
|
};
|
|
148
150
|
function languageForPath(filePath) {
|
|
151
|
+
if (filePath.toLowerCase().endsWith(".blade.php")) return null;
|
|
149
152
|
const suffix = filePath.slice(filePath.lastIndexOf(".")).toLowerCase();
|
|
150
153
|
return EXTENSION_LANGUAGE[suffix] ?? null;
|
|
151
154
|
}
|
|
@@ -257,6 +260,11 @@ function isBetweenSurrogatePair(text, index) {
|
|
|
257
260
|
//#endregion
|
|
258
261
|
//#region src/structure/queries.ts
|
|
259
262
|
const declarations = {
|
|
263
|
+
php: [
|
|
264
|
+
"(class_declaration name: (_) @name) @declaration",
|
|
265
|
+
"(function_definition name: (_) @name) @declaration",
|
|
266
|
+
"(method_declaration name: (_) @name) @declaration"
|
|
267
|
+
],
|
|
260
268
|
javascript: [
|
|
261
269
|
"(function_declaration name: (_) @name) @declaration",
|
|
262
270
|
"(class_declaration name: (_) @name) @declaration",
|
|
@@ -507,7 +515,7 @@ var StructureEngine = class {
|
|
|
507
515
|
const node = this.node(record, scope, declaration.kind, declaration.startIndex, declaration.endIndex, nameCapture ? record.source.text.slice(nameCapture.startIndex, nameCapture.endIndex).slice(0, 256) : void 0, declaration.childCount, coordinates);
|
|
508
516
|
declarations$1.push(node);
|
|
509
517
|
}
|
|
510
|
-
return this.outlineResult(record, declarations$1, result);
|
|
518
|
+
return this.outlineResult(record, declarations$1, result, limit);
|
|
511
519
|
}
|
|
512
520
|
async enclosing(record, scope, position, kinds, signal) {
|
|
513
521
|
const language = record.descriptor.language;
|
|
@@ -567,7 +575,7 @@ var StructureEngine = class {
|
|
|
567
575
|
version: record.descriptor.version,
|
|
568
576
|
queryId,
|
|
569
577
|
captures,
|
|
570
|
-
truncated: Boolean(result.truncated || (result.matches
|
|
578
|
+
truncated: Boolean(result.truncated || (result.matches ?? []).reduce((total, match) => total + match.captures.length, 0) > limit),
|
|
571
579
|
processed: captures.length,
|
|
572
580
|
errors: publicErrors(result.errors)
|
|
573
581
|
};
|
|
@@ -619,7 +627,9 @@ var StructureEngine = class {
|
|
|
619
627
|
".mts",
|
|
620
628
|
".cts"
|
|
621
629
|
], 14),
|
|
622
|
-
this.capability("tsx", [".tsx"], 14)
|
|
630
|
+
this.capability("tsx", [".tsx"], 14),
|
|
631
|
+
this.capability("php", [".php"], 15),
|
|
632
|
+
this.capability("svelte", [".svelte"], null)
|
|
623
633
|
];
|
|
624
634
|
}
|
|
625
635
|
async dispose() {
|
|
@@ -628,6 +638,22 @@ var StructureEngine = class {
|
|
|
628
638
|
await this.workers.dispose();
|
|
629
639
|
}
|
|
630
640
|
async runMatches(language, record, queryId, limit, range, signal) {
|
|
641
|
+
if (language === "svelte") {
|
|
642
|
+
const scriptQueries = {
|
|
643
|
+
javascript: getRegisteredQuery("javascript", queryId),
|
|
644
|
+
typescript: getRegisteredQuery("typescript", queryId)
|
|
645
|
+
};
|
|
646
|
+
return this.runWorker(language, {
|
|
647
|
+
operation: "matches",
|
|
648
|
+
language,
|
|
649
|
+
text: record.source.text,
|
|
650
|
+
querySource: "",
|
|
651
|
+
scriptQueries,
|
|
652
|
+
limit,
|
|
653
|
+
snapshotHandle: record.descriptor.handle,
|
|
654
|
+
...range ?? {}
|
|
655
|
+
}, signal);
|
|
656
|
+
}
|
|
631
657
|
const querySource = getRegisteredQuery(language, queryId);
|
|
632
658
|
if (!querySource) throw new WebstackLspError("LSP_STRUCTURE_UNSUPPORTED", `query ${queryId} is not registered for ${language}`);
|
|
633
659
|
return this.runWorker(language, {
|
|
@@ -660,9 +686,9 @@ var StructureEngine = class {
|
|
|
660
686
|
throw error;
|
|
661
687
|
}
|
|
662
688
|
}
|
|
663
|
-
outlineResult(record, declarations$1, result) {
|
|
664
|
-
const truncated = Boolean(result.truncated || declarations$1.length >
|
|
665
|
-
const selected = declarations$1.slice(0,
|
|
689
|
+
outlineResult(record, declarations$1, result, limit) {
|
|
690
|
+
const truncated = Boolean(result.truncated || declarations$1.length > limit);
|
|
691
|
+
const selected = declarations$1.slice(0, limit);
|
|
666
692
|
if (Buffer.byteLength(JSON.stringify(selected), "utf8") > MAX_STRUCTURE_RESPONSE_BYTES) throw new WebstackLspError("LSP_STRUCTURE_LIMIT", "outline result exceeds the response byte limit");
|
|
667
693
|
return {
|
|
668
694
|
status: result.status,
|
|
@@ -706,11 +732,13 @@ function publicErrors(errors) {
|
|
|
706
732
|
function publicNodeKind(kind) {
|
|
707
733
|
return {
|
|
708
734
|
function_declaration: "function",
|
|
735
|
+
function_definition: "function",
|
|
709
736
|
class_declaration: "class",
|
|
710
737
|
interface_declaration: "interface",
|
|
711
738
|
type_alias_declaration: "type",
|
|
712
739
|
enum_declaration: "enum",
|
|
713
740
|
method_definition: "method",
|
|
741
|
+
method_declaration: "method",
|
|
714
742
|
variable_declarator: "variable"
|
|
715
743
|
}[kind] ?? kind;
|
|
716
744
|
}
|
|
@@ -887,4 +915,4 @@ function limitSemanticResult(result, limit) {
|
|
|
887
915
|
|
|
888
916
|
//#endregion
|
|
889
917
|
export { DocumentSnapshotStore, createCodeIntelligenceToolServiceV1 };
|
|
890
|
-
//# sourceMappingURL=code-intelligence-
|
|
918
|
+
//# sourceMappingURL=code-intelligence-BUs39chK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-intelligence-BUs39chK.js","names":["EXTENSION_LANGUAGE: Record<string, StructureLanguage>","readSource: SnapshotReader","maxDocumentBytes: number","descriptor: SnapshotDescriptor","record: SnapshotRecord","text: string","declarations: Partial<Record<StructureLanguage, string[]>>","imports: Partial<Record<StructureLanguage, string[]>>","calls: Partial<Record<StructureLanguage, string[]>>","task: PendingTask","slot: WorkerSlot","declarations: StructureNode[]","declarations","captures: StructureCapture[]","value: SemanticResult","record: Awaited<ReturnType<DocumentSnapshotStore['current']>>"],"sources":["../src/structure/snapshots.ts","../src/structure/coordinates.ts","../src/structure/queries.ts","../src/structure/worker-pool.ts","../src/structure/engine.ts","../src/structure/code-intelligence.ts"],"sourcesContent":["import { createHash, randomUUID } from 'node:crypto'\nimport { isAbsolute } from 'node:path'\nimport { WebstackLspError } from '../errors.js'\nimport type { HostSource } from '../host/dsh.js'\nimport type { SnapshotDescriptor, SnapshotScope, StructureLanguage } from './types.js'\n\nexport const SNAPSHOT_TTL_MS = 5 * 60_000\nexport const SNAPSHOT_MAX_DOCUMENTS = 32\nexport const SNAPSHOT_MAX_BYTES = 32 * 1024 * 1024\nexport const STRUCTURE_MAX_DOCUMENT_BYTES = 2 * 1024 * 1024\n\nexport interface SnapshotRecord {\n readonly descriptor: SnapshotDescriptor\n readonly scopeKey: string\n readonly source: HostSource\n readonly previousSnapshotHandle?: string\n readonly openedAt: number\n lastUsedAt: number\n}\n\ninterface VersionRecord { hash: string; version: number; scopeKey: string }\n\nexport type SnapshotReader = (workspaceRoot: string, filePath: string, maxBytes: number, signal?: AbortSignal) => Promise<HostSource>\n\nconst EXTENSION_LANGUAGE: Record<string, StructureLanguage> = {\n '.js': 'javascript', '.jsx': 'javascript', '.mjs': 'javascript', '.cjs': 'javascript',\n '.ts': 'typescript', '.mts': 'typescript', '.cts': 'typescript',\n '.tsx': 'tsx',\n '.php': 'php', '.svelte': 'svelte',\n}\n\nexport class DocumentSnapshotStore {\n private readonly records = new Map<string, SnapshotRecord>()\n private readonly versions = new Map<string, VersionRecord>()\n\n constructor(private readonly readSource: SnapshotReader, private readonly maxDocumentBytes: number) {}\n\n async open(scope: SnapshotScope, filePath: string, signal?: AbortSignal): Promise<SnapshotRecord> {\n validateScope(scope)\n const normalizedPath = normalizeRelativePath(filePath)\n signal?.throwIfAborted()\n const first = await this.readSource(scope.workspaceRoot, normalizedPath, Math.min(this.maxDocumentBytes, STRUCTURE_MAX_DOCUMENT_BYTES), signal)\n signal?.throwIfAborted()\n const second = await this.readSource(scope.workspaceRoot, normalizedPath, Math.min(this.maxDocumentBytes, STRUCTURE_MAX_DOCUMENT_BYTES), signal)\n if (hashText(first.text) !== hashText(second.text) || first.uri !== second.uri || first.key !== second.key)\n throw new WebstackLspError('LSP_STALE_SNAPSHOT', 'document changed while opening the snapshot')\n\n const ownerKey = scopeKey(scope)\n const hash = hashText(second.text)\n const fileKey = JSON.stringify([ownerKey, second.key, second.uri])\n const version = this.rememberVersion(fileKey, scope, hash)\n const sourceBytes = Buffer.byteLength(second.text, 'utf8')\n this.evictExpired()\n if (this.records.size >= SNAPSHOT_MAX_DOCUMENTS || this.totalBytes() + sourceBytes > SNAPSHOT_MAX_BYTES)\n throw new WebstackLspError('LSP_SNAPSHOT_LIMIT', 'snapshot capacity is full; release an existing snapshot and retry')\n\n const descriptor: SnapshotDescriptor = {\n handle: randomUUID(), version, filePath: normalizedPath,\n language: languageForPath(normalizedPath), sourceKind: 'disk', contentHash: hash, sourceBytes,\n }\n const previous = [...this.records.values()]\n .filter(item => item.scopeKey === ownerKey && item.source.key === second.key && item.source.uri === second.uri)\n .sort((a, b) => b.openedAt - a.openedAt)[0]\n const record: SnapshotRecord = {\n descriptor, scopeKey: ownerKey, source: second, openedAt: Date.now(), lastUsedAt: Date.now(),\n ...(previous ? { previousSnapshotHandle: previous.descriptor.handle } : {}),\n }\n this.records.set(descriptor.handle, record)\n return record\n }\n\n async current(scope: SnapshotScope, handle: string, signal?: AbortSignal): Promise<SnapshotRecord> {\n validateScope(scope)\n signal?.throwIfAborted()\n const record = this.records.get(handle)\n if (!record || record.scopeKey !== scopeKey(scope)) throw staleSnapshot()\n if (Date.now() - record.openedAt > SNAPSHOT_TTL_MS) {\n this.records.delete(handle)\n throw staleSnapshot()\n }\n const current = await this.readSource(scope.workspaceRoot, record.descriptor.filePath, Math.min(this.maxDocumentBytes, STRUCTURE_MAX_DOCUMENT_BYTES), signal)\n signal?.throwIfAborted()\n if (current.uri !== record.source.uri || current.key !== record.source.key || hashText(current.text) !== record.descriptor.contentHash) {\n this.records.delete(handle)\n throw staleSnapshot()\n }\n record.lastUsedAt = Date.now()\n return record\n }\n\n async readFresh(scope: SnapshotScope, filePath: string, signal?: AbortSignal): Promise<HostSource> {\n validateScope(scope)\n signal?.throwIfAborted()\n const source = await this.readSource(scope.workspaceRoot, filePath, this.maxDocumentBytes, signal)\n signal?.throwIfAborted()\n const fileKey = JSON.stringify([scopeKey(scope), source.key, source.uri])\n this.rememberVersion(fileKey, scope, hashText(source.text))\n return source\n }\n\n release(scope: SnapshotScope, handle: string): boolean {\n validateScope(scope)\n const record = this.records.get(handle)\n if (!record || record.scopeKey !== scopeKey(scope)) return false\n return this.records.delete(handle)\n }\n\n releaseOwner(scope: SnapshotScope): number {\n validateScope(scope)\n const owner = scopeKey(scope)\n let released = 0\n for (const [handle, record] of this.records) {\n if (record.scopeKey === owner) { this.records.delete(handle); released++ }\n }\n for (const [key, version] of this.versions) if (version.scopeKey === owner) this.versions.delete(key)\n return released\n }\n\n clear(): void { this.records.clear(); this.versions.clear() }\n get size(): number { return this.records.size }\n get documentByteLimit(): number { return this.maxDocumentBytes }\n\n private totalBytes(): number {\n let bytes = 0\n for (const record of this.records.values()) bytes += record.descriptor.sourceBytes\n return bytes\n }\n\n private rememberVersion(fileKey: string, scope: SnapshotScope, hash: string): number {\n const owner = scopeKey(scope), previous = this.versions.get(fileKey)\n const version = previous ? (previous.hash === hash ? previous.version : previous.version + 1) : 1\n this.versions.delete(fileKey)\n this.versions.set(fileKey, { hash, version, scopeKey: owner })\n while (this.versions.size > 4096) this.versions.delete(this.versions.keys().next().value!)\n return version\n }\n\n private evictExpired(): void {\n const now = Date.now()\n for (const [handle, record] of this.records) if (now - record.openedAt > SNAPSHOT_TTL_MS) this.records.delete(handle)\n }\n}\n\nexport function languageForPath(filePath: string): StructureLanguage | null {\n // Blade's PHP-like suffix does not make its template syntax a PHP document.\n if (filePath.toLowerCase().endsWith('.blade.php')) return null\n const suffix = filePath.slice(filePath.lastIndexOf('.')).toLowerCase()\n return EXTENSION_LANGUAGE[suffix] ?? null\n}\n\nexport function validateScope(scope: SnapshotScope): void {\n if (!scope || typeof scope !== 'object' || !scope.ownerId?.trim() || !scope.sessionId?.trim() || !scope.workspaceRoot?.trim() || !isAbsolute(scope.workspaceRoot) || /[\\u0000-\\u001f\\u007f]/u.test(`${scope.ownerId}${scope.sessionId}${scope.workspaceRoot}`))\n throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'trusted owner, session and absolute workspace root are required')\n}\n\nexport function normalizeRelativePath(filePath: string): string {\n if (typeof filePath !== 'string' || !filePath.trim() || filePath.length > 4096 || /[\\u0000-\\u001f\\u007f]/u.test(filePath) || isAbsolute(filePath))\n throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'file path must be a relative workspace path')\n const segments = filePath.replaceAll('\\\\', '/').split('/')\n if (segments.some(segment => segment === '..' || segment === '')) throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'file path contains an invalid segment')\n return segments.filter(segment => segment !== '.').join('/')\n}\n\nexport function scopeIdentity(scope: SnapshotScope): string { return JSON.stringify([scope.ownerId, scope.sessionId, scope.workspaceRoot]) }\nfunction scopeKey(scope: SnapshotScope): string { return scopeIdentity(scope) }\nfunction hashText(text: string): string { return createHash('sha256').update(text, 'utf8').digest('hex') }\nfunction staleSnapshot(): WebstackLspError { return new WebstackLspError('LSP_STALE_SNAPSHOT', 'snapshot is stale, expired or belongs to another owner') }\n","import type { LspPosition, LspRange } from '../service.js'\n\ninterface Line { start: number; end: number }\n\n/** web-tree-sitter 0.27.1 exposes JS-string indices as UTF-16 code-unit offsets. */\nexport class Utf16Coordinates {\n private readonly lines: Line[]\n\n constructor(private readonly text: string) {\n this.lines = []\n let start = 0\n for (let index = 0; index < text.length;) {\n const char = text[index]!\n if (char !== '\\r' && char !== '\\n') { index++; continue }\n this.lines.push({ start, end: index })\n if (char === '\\r' && text[index + 1] === '\\n') index++\n index++\n start = index\n }\n this.lines.push({ start, end: text.length })\n }\n\n positionToIndex(position: LspPosition): number {\n if (!isPosition(position)) throw new RangeError('position must use non-negative zero-based UTF-16 coordinates')\n const line = this.lines[position.line]\n if (!line || position.character > line.end - line.start) throw new RangeError('position is outside document')\n const index = line.start + position.character\n if (isBetweenSurrogatePair(this.text, index)) throw new RangeError('position splits a UTF-16 surrogate pair')\n return index\n }\n\n indexToPosition(index: number): LspPosition {\n if (!Number.isSafeInteger(index) || index < 0 || index > this.text.length) throw new RangeError('Tree-sitter index is outside document')\n let low = 0, high = this.lines.length\n while (low < high) {\n const middle = (low + high) >>> 1\n if (this.lines[middle]!.start <= index) low = middle + 1\n else high = middle\n }\n const lineNumber = Math.max(0, low - 1)\n const line = this.lines[lineNumber]!\n return { line: lineNumber, character: Math.min(index, line.end) - line.start }\n }\n\n rangeToIndices(range: LspRange): { startIndex: number; endIndex: number } {\n const startIndex = this.positionToIndex(range.start)\n const endIndex = this.positionToIndex(range.end)\n if (endIndex < startIndex) throw new RangeError('range end precedes range start')\n return { startIndex, endIndex }\n }\n\n indicesToRange(startIndex: number, endIndex: number): LspRange {\n if (endIndex < startIndex) throw new RangeError('range end precedes range start')\n return { start: this.indexToPosition(startIndex), end: this.indexToPosition(endIndex) }\n }\n}\n\nfunction isPosition(value: unknown): value is LspPosition {\n if (typeof value !== 'object' || value === null) return false\n const position = value as { line?: unknown; character?: unknown }\n return Number.isSafeInteger(position.line) && Number.isSafeInteger(position.character) && (position.line as number) >= 0 && (position.character as number) >= 0\n}\n\nfunction isBetweenSurrogatePair(text: string, index: number): boolean {\n if (index <= 0 || index >= text.length) return false\n const previous = text.charCodeAt(index - 1), next = text.charCodeAt(index)\n return previous >= 0xd800 && previous <= 0xdbff && next >= 0xdc00 && next <= 0xdfff\n}\n","import type { StructureLanguage } from './types.js'\n\nconst declarations: Partial<Record<StructureLanguage, string[]>> = {\n php: [\n '(class_declaration name: (_) @name) @declaration',\n '(function_definition name: (_) @name) @declaration',\n '(method_declaration name: (_) @name) @declaration',\n ],\n javascript: [\n '(function_declaration name: (_) @name) @declaration',\n '(class_declaration name: (_) @name) @declaration',\n '(method_definition name: (_) @name) @declaration',\n '(variable_declarator name: (_) @name) @declaration',\n ],\n typescript: [\n '(function_declaration name: (_) @name) @declaration',\n '(class_declaration name: (_) @name) @declaration',\n '(interface_declaration name: (_) @name) @declaration',\n '(type_alias_declaration name: (_) @name) @declaration',\n '(enum_declaration name: (_) @name) @declaration',\n '(method_definition name: (_) @name) @declaration',\n '(variable_declarator name: (_) @name) @declaration',\n ],\n tsx: [\n '(function_declaration name: (_) @name) @declaration',\n '(class_declaration name: (_) @name) @declaration',\n '(interface_declaration name: (_) @name) @declaration',\n '(type_alias_declaration name: (_) @name) @declaration',\n '(enum_declaration name: (_) @name) @declaration',\n '(method_definition name: (_) @name) @declaration',\n '(variable_declarator name: (_) @name) @declaration',\n ],\n}\n\nconst imports: Partial<Record<StructureLanguage, string[]>> = {\n javascript: ['(import_statement) @import', '(export_statement) @export'],\n typescript: ['(import_statement) @import', '(export_statement) @export'],\n tsx: ['(import_statement) @import', '(export_statement) @export'],\n}\n\nconst calls: Partial<Record<StructureLanguage, string[]>> = {\n javascript: ['(call_expression function: (_) @call) @callsite'],\n typescript: ['(call_expression function: (_) @call) @callsite'],\n tsx: ['(call_expression function: (_) @call) @callsite'],\n}\n\nexport type RegisteredQueryId = 'declarations' | 'calls' | 'imports'\n\nexport function getRegisteredQuery(language: StructureLanguage, queryId: string): string | undefined {\n const patterns = queryId === 'declarations' ? declarations[language] : queryId === 'calls' ? calls[language] : queryId === 'imports' ? imports[language] : undefined\n return patterns?.join('\\n')\n}\n\nexport function isRegisteredQueryId(value: string): value is RegisteredQueryId {\n return value === 'declarations' || value === 'calls' || value === 'imports'\n}\n","import { randomUUID } from 'node:crypto'\nimport { Worker } from 'node:worker_threads'\nimport { WebstackLspError } from '../errors.js'\nimport type { StructureLanguage } from './types.js'\n\nexport interface StructureWorkerRequest {\n operation: 'matches' | 'enclosing' | 'inspect'\n language: StructureLanguage\n text: string\n querySource: string\n scriptQueries?: { javascript: string; typescript: string }\n limit: number\n snapshotHandle?: string\n previousSnapshotHandle?: string\n startIndex?: number\n endIndex?: number\n index?: number\n kinds?: string[]\n}\n\nexport interface WorkerNodeSummary {\n kind: string\n startIndex: number\n endIndex: number\n startPosition: { row: number; column: number }\n endPosition: { row: number; column: number }\n nameStartIndex?: number\n nameEndIndex?: number\n childCount: number\n}\n\nexport interface WorkerErrorSummary { hasError: boolean; errorNodes: number; missingNodes: number; truncated: boolean }\nexport interface WorkerMatch { captures: Array<{ name: string } & WorkerNodeSummary> }\nexport interface StructureWorkerResult {\n status: 'ok' | 'partial'\n abiVersion?: number\n reusedTree?: boolean\n incremental?: boolean\n matches?: WorkerMatch[]\n nodes?: WorkerNodeSummary[]\n truncated?: boolean\n errors: WorkerErrorSummary\n}\n\ninterface WorkerReply { id: string; ok: boolean; value?: StructureWorkerResult; error?: string }\ninterface PendingTask {\n id: string\n request: StructureWorkerRequest\n signal?: AbortSignal\n resolve(value: StructureWorkerResult): void\n reject(error: unknown): void\n timer?: ReturnType<typeof setTimeout>\n removeAbort?: () => void\n}\ninterface WorkerSlot { worker: Worker; current: PendingTask | undefined; completed: number; failed: boolean }\n\nconst MAX_WORKERS = 2\nconst MAX_QUEUE = 16\nconst WORKER_TASK_LIMIT = 100\nconst PARSE_TIMEOUT_MS = 2_000\n\n/** CPU-bound parsing runs off the event loop; cancellation terminates the active worker. */\nexport class StructureWorkerPool {\n private readonly slots = new Set<WorkerSlot>()\n private readonly queue: PendingTask[] = []\n private disposed = false\n\n execute(request: StructureWorkerRequest, signal?: AbortSignal): Promise<StructureWorkerResult> {\n if (this.disposed) return Promise.reject(new WebstackLspError('LSP_DISPOSED', 'structure worker pool is disposed'))\n if (signal?.aborted) return Promise.reject(abortError())\n if (this.queue.length >= MAX_QUEUE) return Promise.reject(new WebstackLspError('LSP_STRUCTURE_BUSY', 'structure worker queue is full'))\n return new Promise((resolve, reject) => {\n const task: PendingTask = { id: randomUUID(), request, ...(signal ? { signal } : {}), resolve, reject }\n if (signal) {\n const abort = () => {\n const index = this.queue.indexOf(task)\n if (index >= 0) { this.queue.splice(index, 1); this.finishTask(task, abortError()) }\n else {\n const slot = [...this.slots].find(candidate => candidate.current === task)\n if (slot) void this.retire(slot, abortError())\n }\n }\n signal.addEventListener('abort', abort, { once: true })\n task.removeAbort = () => signal.removeEventListener('abort', abort)\n }\n this.queue.push(task)\n this.pump()\n })\n }\n\n async dispose(): Promise<void> {\n this.disposed = true\n for (const task of this.queue.splice(0)) this.finishTask(task, new WebstackLspError('LSP_DISPOSED', 'structure worker pool is disposed'))\n await Promise.all([...this.slots].map(slot => this.retire(slot, new WebstackLspError('LSP_DISPOSED', 'structure worker pool is disposed'))))\n }\n\n releaseSnapshot(snapshotHandle: string): void {\n for (const slot of this.slots) {\n if (!slot.failed) {\n try { slot.worker.postMessage({ releaseSnapshotHandle: snapshotHandle }) }\n catch { void this.retire(slot, new WebstackLspError('LSP_STRUCTURE_UNAVAILABLE', 'structure worker could not release a cached snapshot')) }\n }\n }\n }\n\n get queued(): number { return this.queue.length }\n get active(): number { return [...this.slots].filter(slot => slot.current !== undefined).length }\n\n private pump(): void {\n if (this.disposed) return\n while (this.queue.length) {\n let slot = [...this.slots].find(candidate => !candidate.current && !candidate.failed)\n if (!slot && this.slots.size < MAX_WORKERS) slot = this.createWorker()\n if (!slot) return\n const task = this.queue.shift()!\n if (task.signal?.aborted) { this.finishTask(task, abortError()); continue }\n slot.current = task\n task.timer = setTimeout(() => { void this.retire(slot!, new WebstackLspError('LSP_STRUCTURE_TIMEOUT', 'structure parsing exceeded its time limit')) }, PARSE_TIMEOUT_MS)\n try { slot.worker.postMessage({ id: task.id, ...task.request }) }\n catch (error) { void this.retire(slot, error) }\n }\n }\n\n private createWorker(): WorkerSlot {\n const worker = new Worker(new URL('./parser-worker.mjs', import.meta.url))\n const slot: WorkerSlot = { worker, current: undefined, completed: 0, failed: false }\n this.slots.add(slot)\n worker.on('message', (reply: WorkerReply) => {\n if (!slot.current || reply.id !== slot.current.id) { void this.retire(slot, new WebstackLspError('LSP_MALFORMED_RESPONSE', 'structure worker returned an unexpected task identity')); return }\n const task = slot.current\n slot.current = undefined\n slot.completed++\n if (!reply.ok || !reply.value) this.finishTask(task, new WebstackLspError('LSP_STRUCTURE_UNAVAILABLE', reply.error ?? 'structure parsing failed'))\n else this.finishTask(task, undefined, reply.value)\n if (slot.completed >= WORKER_TASK_LIMIT) void this.retire(slot)\n this.pump()\n })\n worker.on('error', error => { void this.retire(slot, error) })\n worker.on('exit', code => {\n if (this.slots.has(slot) && !slot.failed) void this.retire(slot, code === 0 ? undefined : new WebstackLspError('LSP_STRUCTURE_UNAVAILABLE', `structure worker exited (${code})`))\n })\n return slot\n }\n\n private async retire(slot: WorkerSlot, error?: unknown): Promise<void> {\n if (slot.failed) return\n slot.failed = true\n this.slots.delete(slot)\n const task = slot.current\n slot.current = undefined\n if (task) this.finishTask(task, error ?? new WebstackLspError('LSP_STRUCTURE_UNAVAILABLE', 'structure worker was restarted'))\n await slot.worker.terminate().catch(() => 0)\n this.pump()\n }\n\n private finishTask(task: PendingTask, error?: unknown, value?: StructureWorkerResult): void {\n if (task.timer) clearTimeout(task.timer)\n task.removeAbort?.()\n if (error !== undefined) task.reject(error)\n else task.resolve(value!)\n }\n}\n\nfunction abortError(): DOMException { return new DOMException('The operation was aborted', 'AbortError') }\n","import { randomUUID } from 'node:crypto'\nimport { WebstackLspError } from '../errors.js'\nimport { Utf16Coordinates } from './coordinates.js'\nimport { getRegisteredQuery, isRegisteredQueryId } from './queries.js'\nimport { scopeIdentity, type SnapshotRecord } from './snapshots.js'\nimport { StructureWorkerPool } from './worker-pool.js'\nimport type { SnapshotScope, StructureCapture, StructureEnclosingResult, StructureErrorSummary, StructureLanguage, StructureNode, StructureOutlineResult, StructureQueryResult, StructureSpanResult } from './types.js'\n\nexport const MAX_CAPTURES = 200\nexport const MAX_OUTLINE = 100\nexport const MAX_SPAN_CHARS = 8_000\nexport const MAX_STRUCTURE_RESPONSE_BYTES = 32 * 1024\nconst MAX_NODE_HANDLES = 10_000\n\ninterface NodeHandleRecord {\n scopeKey: string\n snapshotHandle: string\n startIndex: number\n endIndex: number\n kind: string\n range: StructureNode['range']\n}\n\nexport class StructureEngine {\n private readonly nodeHandles = new Map<string, NodeHandleRecord>()\n private readonly snapshotOwners = new Map<string, string>()\n private readonly parserFailures = new Map<StructureLanguage, string>()\n constructor(private readonly workers = new StructureWorkerPool()) {}\n\n async inspect(record: SnapshotRecord, signal?: AbortSignal): Promise<{ available: boolean; parseErrors: boolean; reason?: string }> {\n this.snapshotOwners.set(record.descriptor.handle, record.scopeKey)\n const language = record.descriptor.language\n if (!language) return { available: false, parseErrors: false, reason: 'grammar_missing' }\n try {\n const result = await this.runWorker(language, { operation: 'inspect', language, text: record.source.text, querySource: '', limit: 1, snapshotHandle: record.descriptor.handle, ...(record.previousSnapshotHandle ? { previousSnapshotHandle: record.previousSnapshotHandle } : {}) }, signal)\n this.parserFailures.delete(language)\n return { available: true, parseErrors: result.errors.hasError }\n } catch (error) {\n const reason = error instanceof Error ? error.message.slice(0, 128) : 'parser_unavailable'\n return { available: false, parseErrors: false, reason }\n }\n }\n\n async outline(record: SnapshotRecord, scope: SnapshotScope, options: { range?: StructureNode['range']; limit?: number } = {}, signal?: AbortSignal): Promise<StructureOutlineResult> {\n const language = record.descriptor.language\n if (!language) return { status: 'unsupported', handle: record.descriptor.handle, version: record.descriptor.version, declarations: [], truncated: false, processed: 0, errors: { hasError: false, errorNodes: 0, missingNodes: 0, truncated: false } }\n const limit = positiveLimit(options.limit, MAX_OUTLINE, 'outline limit')\n const coordinates = new Utf16Coordinates(record.source.text)\n const range = options.range ? coordinates.rangeToIndices(options.range) : undefined\n const result = await this.runMatches(language, record, 'declarations', limit, range, signal)\n const declarations: StructureNode[] = []\n for (const match of result.matches ?? []) {\n const declaration = match.captures.find(capture => capture.name === 'declaration')\n const nameCapture = match.captures.find(capture => capture.name === 'name')\n if (!declaration) continue\n const node = this.node(record, scope, declaration.kind, declaration.startIndex, declaration.endIndex, nameCapture ? record.source.text.slice(nameCapture.startIndex, nameCapture.endIndex).slice(0, 256) : undefined, declaration.childCount, coordinates)\n declarations.push(node)\n }\n return this.outlineResult(record, declarations, result, limit)\n }\n\n async enclosing(record: SnapshotRecord, scope: SnapshotScope, position: { line: number; character: number }, kinds?: string[], signal?: AbortSignal): Promise<StructureEnclosingResult> {\n const language = record.descriptor.language\n if (!language) return { status: 'unsupported', handle: record.descriptor.handle, version: record.descriptor.version, ancestors: [] }\n const coordinates = new Utf16Coordinates(record.source.text)\n const index = coordinates.positionToIndex(position)\n if (kinds && (!Array.isArray(kinds) || kinds.length > 32 || kinds.some(kind => typeof kind !== 'string' || kind.length > 128 || !/^[a-z][a-z0-9_]*$/u.test(kind))))\n throw new WebstackLspError('LSP_STRUCTURE_LIMIT', 'kinds must be a list of at most 32 node type names')\n const result = await this.runWorker(language, { operation: 'enclosing', language, text: record.source.text, querySource: '', limit: 16, snapshotHandle: record.descriptor.handle, index, ...(kinds ? { kinds: [...kinds] } : {}) }, signal)\n const nodes = result.nodes ?? []\n const summaries = nodes.map(item => this.node(record, scope, item.kind, item.startIndex, item.endIndex, undefined, item.childCount, coordinates))\n const [node, ...ancestors] = summaries\n return { status: result.status, handle: record.descriptor.handle, version: record.descriptor.version, ...(node ? { node } : {}), ancestors, errors: publicErrors(result.errors) }\n }\n\n async query(record: SnapshotRecord, scope: SnapshotScope, queryId: string, options: { range?: StructureNode['range']; limit?: number } = {}, signal?: AbortSignal): Promise<StructureQueryResult> {\n const language = record.descriptor.language\n if (!language) throw new WebstackLspError('LSP_STRUCTURE_UNSUPPORTED', 'no bundled Tree-sitter grammar is available for this document')\n if (!isRegisteredQueryId(queryId)) throw new WebstackLspError('LSP_STRUCTURE_UNSUPPORTED', 'queryId is not in the registered query allowlist')\n const limit = positiveLimit(options.limit, MAX_CAPTURES, 'capture limit')\n const coordinates = new Utf16Coordinates(record.source.text)\n const range = options.range ? coordinates.rangeToIndices(options.range) : undefined\n const result = await this.runMatches(language, record, queryId, limit, range, signal)\n const captures: StructureCapture[] = []\n captureLoop: for (const match of result.matches ?? []) for (const capture of match.captures) {\n const node = this.node(record, scope, capture.kind, capture.startIndex, capture.endIndex, undefined, capture.childCount, coordinates)\n captures.push({ capture: capture.name, kind: capture.kind, range: node.range, nodeHandle: node.handle, ...(capture.name === 'name' ? { name: record.source.text.slice(capture.startIndex, capture.endIndex).slice(0, 256) } : {}) })\n if (captures.length >= limit) break captureLoop\n }\n if (Buffer.byteLength(JSON.stringify(captures), 'utf8') > MAX_STRUCTURE_RESPONSE_BYTES) throw new WebstackLspError('LSP_STRUCTURE_LIMIT', 'query result exceeds the response byte limit')\n return { status: result.status, handle: record.descriptor.handle, version: record.descriptor.version, queryId, captures, truncated: Boolean(result.truncated || (result.matches ?? []).reduce((total, match) => total + match.captures.length, 0) > limit), processed: captures.length, errors: publicErrors(result.errors) }\n }\n\n async span(record: SnapshotRecord, scope: SnapshotScope, nodeHandle: string, maxChars = MAX_SPAN_CHARS): Promise<StructureSpanResult> {\n const handle = this.nodeHandles.get(nodeHandle)\n if (!handle || handle.snapshotHandle !== record.descriptor.handle || handle.scopeKey !== scopeIdentity(scope))\n throw new WebstackLspError('LSP_STALE_SNAPSHOT', 'node handle is stale or belongs to another owner')\n if (!Number.isSafeInteger(maxChars) || maxChars < 1 || maxChars > MAX_SPAN_CHARS)\n throw new WebstackLspError('LSP_STRUCTURE_LIMIT', `maxChars must be between 1 and ${MAX_SPAN_CHARS}`)\n const full = record.source.text.slice(handle.startIndex, handle.endIndex)\n const codePoints = Array.from(full)\n const truncated = codePoints.length > maxChars\n const text = codePoints.slice(0, maxChars).join('')\n if (Buffer.byteLength(text, 'utf8') > MAX_STRUCTURE_RESPONSE_BYTES) throw new WebstackLspError('LSP_STRUCTURE_LIMIT', 'span result exceeds the response byte limit')\n return { status: truncated ? 'partial' : 'ok', text, truncated, range: handle.range }\n }\n\n releaseSnapshot(handle: string): void {\n for (const [nodeHandle, node] of this.nodeHandles) if (node.snapshotHandle === handle) this.nodeHandles.delete(nodeHandle)\n this.snapshotOwners.delete(handle)\n this.workers.releaseSnapshot(handle)\n }\n\n releaseSnapshotForOwner(scope: SnapshotScope, handle: string): void {\n if (this.snapshotOwners.get(handle) === scopeIdentity(scope)) this.releaseSnapshot(handle)\n }\n\n snapshotForNode(scope: SnapshotScope, nodeHandle: string): string {\n const record = this.nodeHandles.get(nodeHandle)\n if (!record || record.scopeKey !== scopeIdentity(scope)) throw new WebstackLspError('LSP_STALE_SNAPSHOT', 'node handle is stale or belongs to another owner')\n return record.snapshotHandle\n }\n\n releaseOwner(scope: SnapshotScope): void {\n const owner = scopeIdentity(scope)\n for (const [nodeHandle, node] of this.nodeHandles) if (node.scopeKey === owner) this.nodeHandles.delete(nodeHandle)\n for (const [snapshotHandle, snapshotOwner] of this.snapshotOwners) {\n if (snapshotOwner === owner) this.releaseSnapshot(snapshotHandle)\n }\n }\n\n capabilities(): Array<{ language: StructureLanguage; extensions: string[]; available: boolean; abiVersion: number | null; lastError?: string }> {\n return [\n this.capability('javascript', ['.js', '.jsx', '.mjs', '.cjs'], 15),\n this.capability('typescript', ['.ts', '.mts', '.cts'], 14),\n this.capability('tsx', ['.tsx'], 14),\n this.capability('php', ['.php'], 15),\n // Svelte uses both script grammars, not a separate grammar ABI.\n this.capability('svelte', ['.svelte'], null),\n ]\n }\n\n async dispose(): Promise<void> { this.nodeHandles.clear(); this.snapshotOwners.clear(); await this.workers.dispose() }\n\n private async runMatches(language: StructureLanguage, record: SnapshotRecord, queryId: string, limit: number, range?: { startIndex: number; endIndex: number }, signal?: AbortSignal) {\n if (language === 'svelte') {\n const scriptQueries = { javascript: getRegisteredQuery('javascript', queryId)!, typescript: getRegisteredQuery('typescript', queryId)! }\n return this.runWorker(language, { operation: 'matches', language, text: record.source.text, querySource: '', scriptQueries, limit, snapshotHandle: record.descriptor.handle, ...(range ?? {}) }, signal)\n }\n const querySource = getRegisteredQuery(language, queryId)\n if (!querySource) throw new WebstackLspError('LSP_STRUCTURE_UNSUPPORTED', `query ${queryId} is not registered for ${language}`)\n return this.runWorker(language, { operation: 'matches', language, text: record.source.text, querySource, limit, snapshotHandle: record.descriptor.handle, ...(range ?? {}) }, signal)\n }\n\n private capability(language: StructureLanguage, extensions: string[], abiVersion: number | null) {\n const lastError = this.parserFailures.get(language)\n return { language, extensions, available: !lastError, abiVersion, ...(lastError ? { lastError } : {}) }\n }\n\n private async runWorker(language: StructureLanguage, request: Parameters<StructureWorkerPool['execute']>[0], signal?: AbortSignal) {\n try {\n const result = await this.workers.execute(request, signal)\n this.parserFailures.delete(language)\n return result\n } catch (error) {\n if (error instanceof WebstackLspError && ['LSP_STRUCTURE_TIMEOUT', 'LSP_STRUCTURE_UNAVAILABLE'].includes(error.code))\n this.parserFailures.set(language, error.message.slice(0, 128))\n throw error\n }\n }\n\n private outlineResult(record: SnapshotRecord, declarations: StructureNode[], result: Awaited<ReturnType<StructureWorkerPool['execute']>>, limit: number): StructureOutlineResult {\n const truncated = Boolean(result.truncated || declarations.length > limit)\n const selected = declarations.slice(0, limit)\n const jsonBytes = Buffer.byteLength(JSON.stringify(selected), 'utf8')\n if (jsonBytes > MAX_STRUCTURE_RESPONSE_BYTES) throw new WebstackLspError('LSP_STRUCTURE_LIMIT', 'outline result exceeds the response byte limit')\n return { status: result.status, handle: record.descriptor.handle, version: record.descriptor.version, declarations: selected, truncated, processed: selected.length, errors: publicErrors(result.errors) }\n }\n\n private node(record: SnapshotRecord, scope: SnapshotScope, kind: string, startIndex: number, endIndex: number, name?: string, childCount?: number, coordinates = new Utf16Coordinates(record.source.text)): StructureNode {\n if (this.nodeHandles.size >= MAX_NODE_HANDLES) throw new WebstackLspError('LSP_SNAPSHOT_LIMIT', 'node handle capacity is full; release a snapshot and retry')\n const handle = randomUUID()\n const range = coordinates.indicesToRange(startIndex, endIndex)\n this.nodeHandles.set(handle, { scopeKey: scopeIdentity(scope), snapshotHandle: record.descriptor.handle, startIndex, endIndex, kind, range })\n return { handle, kind: publicNodeKind(kind), range, ...(name ? { name } : {}), ...(childCount === undefined ? {} : { childCount }) }\n }\n}\n\nfunction positiveLimit(value: number | undefined, maximum: number, label: string): number {\n const limit = value ?? maximum\n if (!Number.isSafeInteger(limit) || limit < 1 || limit > maximum) throw new WebstackLspError('LSP_STRUCTURE_LIMIT', `${label} must be between 1 and ${maximum}`)\n return limit\n}\n\nfunction publicErrors(errors: StructureErrorSummary): StructureErrorSummary { return { ...errors } }\n\nfunction publicNodeKind(kind: string): string {\n return ({ function_declaration: 'function', function_definition: 'function', class_declaration: 'class', interface_declaration: 'interface', type_alias_declaration: 'type', enum_declaration: 'enum', method_definition: 'method', method_declaration: 'method', variable_declarator: 'variable' } as Record<string, string>)[kind] ?? kind\n}\n","import { WebstackLspError } from '../errors.js'\nimport { DocumentSnapshotStore } from './snapshots.js'\nimport type { SnapshotRecord } from './snapshots.js'\nimport { StructureEngine, MAX_CAPTURES, MAX_OUTLINE, MAX_SPAN_CHARS, MAX_STRUCTURE_RESPONSE_BYTES } from './engine.js'\nimport type { CodeIntelligenceCapabilities, CodeIntelligenceToolServiceV1, SemanticQuery, SemanticResult, SnapshotScope, StructureEnclosingResult, StructureOutlineResult, StructureQueryResult, StructureSpanResult } from './types.js'\nimport type { CompletionResult, DiagnosticsResult, NavigationResult } from '../service.js'\n\nexport interface CodeIntelligenceServiceOptions {\n snapshots: DocumentSnapshotStore\n semanticQuery(scope: SnapshotScope, snapshot: SnapshotRecord, request: SemanticQuery, signal: AbortSignal): Promise<CompletionResult | DiagnosticsResult | NavigationResult>\n}\n\nexport class CodeIntelligenceRuntime implements CodeIntelligenceToolServiceV1 {\n readonly version = 1 as const\n readonly snapshot: CodeIntelligenceToolServiceV1['snapshot']\n readonly structure: CodeIntelligenceToolServiceV1['structure']\n readonly semantic: CodeIntelligenceToolServiceV1['semantic']\n private readonly store: DocumentSnapshotStore\n private readonly engine: StructureEngine\n\n constructor(options: CodeIntelligenceServiceOptions) {\n this.store = options.snapshots\n this.engine = new StructureEngine()\n\n this.snapshot = {\n open: async (scope, filePath, signal) => {\n const record = await this.store.open(scope, filePath, signal)\n try {\n const parser = await this.engine.inspect(record, signal)\n await this.store.current(scope, record.descriptor.handle, signal)\n return { status: 'ok', ...record.descriptor, parserAvailable: parser.available, parseErrors: parser.parseErrors }\n } catch (error) {\n this.store.release(scope, record.descriptor.handle)\n this.engine.releaseSnapshot(record.descriptor.handle)\n throw error\n }\n },\n release: async (scope, handle) => {\n const released = this.store.release(scope, handle)\n if (released) this.engine.releaseSnapshot(handle)\n return { released }\n },\n }\n\n this.structure = {\n outline: (scope, handle, request, signal) => this.withSnapshot(scope, handle, signal, record => this.engine.outline(record, scope, request, signal)) as Promise<StructureOutlineResult>,\n enclosing: (scope, handle, position, request, signal) => this.withSnapshot(scope, handle, signal, record => this.engine.enclosing(record, scope, position, request?.kinds, signal)) as Promise<StructureEnclosingResult>,\n query: (scope, handle, queryId, request, signal) => this.withSnapshot(scope, handle, signal, record => this.engine.query(record, scope, queryId, request, signal)) as Promise<StructureQueryResult>,\n span: (scope, nodeHandle, maxChars, signal) => this.span(scope, nodeHandle, maxChars, signal),\n }\n\n this.semantic = {\n query: async (scope, handle, request, signal) => {\n validateSemanticQuery(request)\n return this.withSnapshot(scope, handle, signal, async record => {\n const raw = await options.semanticQuery(scope, record, request, signal ?? new AbortController().signal)\n await this.store.current(scope, handle, signal)\n const bounded = limitSemanticResult(raw, request.maxResults ?? 200)\n const truncated = 'truncated' in bounded && Boolean(bounded.truncated)\n const status = semanticIsPartial(bounded) || truncated ? 'partial' : 'ok'\n const value: SemanticResult = { status, operation: request.operation, result: bounded, ...(truncated ? { truncated: true, omitted: 'omitted' in bounded && typeof bounded.omitted === 'number' ? bounded.omitted : 0 } : {}) }\n if (Buffer.byteLength(JSON.stringify(value), 'utf8') > MAX_STRUCTURE_RESPONSE_BYTES)\n throw new WebstackLspError('LSP_STRUCTURE_LIMIT', 'semantic result exceeds the response byte limit')\n return value\n }) as Promise<SemanticResult>\n },\n }\n }\n\n capabilities(): CodeIntelligenceCapabilities {\n const parsers = this.engine.capabilities().map(parser => ({\n ...parser,\n runtimeAbi: { minimum: 13, current: 15 },\n }))\n return {\n version: 1,\n parsers,\n sourceKind: 'disk',\n overlay: 'unavailable',\n limits: {\n maxDocumentBytes: Math.min(this.store.documentByteLimit, 2 * 1024 * 1024),\n maxCaptures: MAX_CAPTURES,\n maxOutline: MAX_OUTLINE,\n maxSpanChars: MAX_SPAN_CHARS,\n maxResponseBytes: MAX_STRUCTURE_RESPONSE_BYTES,\n },\n incrementalParsing: true,\n }\n }\n\n async releaseOwner(scope: SnapshotScope): Promise<number> {\n this.engine.releaseOwner(scope)\n return this.store.releaseOwner(scope)\n }\n\n async dispose(): Promise<void> { this.store.clear(); await this.engine.dispose() }\n\n private async span(scope: SnapshotScope, nodeHandle: string, maxChars = MAX_SPAN_CHARS, signal?: AbortSignal): Promise<StructureSpanResult> {\n const snapshotHandle = this.engine.snapshotForNode(scope, nodeHandle)\n return this.withSnapshot(scope, snapshotHandle, signal, record => this.engine.span(record, scope, nodeHandle, maxChars)) as Promise<StructureSpanResult>\n }\n\n private async withSnapshot<T>(scope: SnapshotScope, handle: string, signal: AbortSignal | undefined, execute: (record: Awaited<ReturnType<DocumentSnapshotStore['current']>>) => Promise<T>): Promise<T> {\n let record: Awaited<ReturnType<DocumentSnapshotStore['current']>>\n try { record = await this.store.current(scope, handle, signal) }\n catch (error) {\n if (error instanceof WebstackLspError && error.code === 'LSP_STALE_SNAPSHOT') this.engine.releaseSnapshotForOwner(scope, handle)\n throw error\n }\n try {\n const result = await execute(record)\n await this.store.current(scope, handle, signal)\n return result\n } catch (error) {\n if (error instanceof WebstackLspError && error.code === 'LSP_STALE_SNAPSHOT') this.engine.releaseSnapshotForOwner(scope, handle)\n throw error\n }\n }\n\n}\n\nexport function createCodeIntelligenceToolServiceV1(options: CodeIntelligenceServiceOptions): CodeIntelligenceToolServiceV1 {\n return new CodeIntelligenceRuntime(options)\n}\n\nfunction validateSemanticQuery(request: SemanticQuery): void {\n if (!request || !['definition', 'references', 'implementation', 'hover', 'diagnostics', 'completion'].includes(request.operation))\n throw new WebstackLspError('LSP_UNSUPPORTED_OPERATION', 'semantic operation is not supported')\n if (request.operation !== 'diagnostics' && !request.position)\n throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'semantic position is required for this operation')\n if (request.position && (!Number.isSafeInteger(request.position.line) || !Number.isSafeInteger(request.position.character) || request.position.line < 0 || request.position.character < 0))\n throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'semantic position must be a zero-based UTF-16 position')\n if (request.servers && (!Array.isArray(request.servers) || request.servers.length > 6 || request.servers.some(server => typeof server !== 'string' || server.length > 64)))\n throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'semantic server filter is invalid')\n if (request.maxResults !== undefined && (!Number.isSafeInteger(request.maxResults) || request.maxResults < 1 || request.maxResults > 200))\n throw new WebstackLspError('LSP_STRUCTURE_LIMIT', 'maxResults must be between 1 and 200')\n}\n\nfunction semanticIsPartial(result: CompletionResult | DiagnosticsResult | NavigationResult): boolean {\n if ('diagnostics' in result) return Boolean(result.omittedServers?.length || result.truncated)\n if ('items' in result) return Boolean(result.truncated)\n if (result.kind === 'locations') return Boolean(result.truncated)\n return false\n}\n\nfunction limitSemanticResult(result: CompletionResult | DiagnosticsResult | NavigationResult, limit: number): CompletionResult | DiagnosticsResult | NavigationResult {\n if ('items' in result) {\n if (result.items.length <= limit) return result\n return { ...result, items: result.items.slice(0, limit), truncated: { items: result.items.length - limit, characters: 0 } }\n }\n if ('diagnostics' in result) {\n if (result.diagnostics.length <= limit) return result\n return { ...result, diagnostics: result.diagnostics.slice(0, limit), truncated: { diagnostics: result.diagnostics.length - limit, characters: 0 } }\n }\n if (result.kind === 'locations' && result.locations.length > limit)\n return { ...result, locations: result.locations.slice(0, limit), truncated: true, omitted: result.locations.length - limit }\n return result\n}\n"],"mappings":"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"}
|
package/lib/code-intelligence.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "./errors-DtyWAUi0.js";
|
|
2
|
-
import { createCodeIntelligenceToolServiceV1 } from "./code-intelligence-
|
|
2
|
+
import { createCodeIntelligenceToolServiceV1 } from "./code-intelligence-BUs39chK.js";
|
|
3
3
|
import { CODE_INTELLIGENCE_SERVICE, CODE_INTELLIGENCE_VERSION } from "./code-intelligence-contracts-CWXTofdI.js";
|
|
4
4
|
|
|
5
5
|
export { CODE_INTELLIGENCE_SERVICE, CODE_INTELLIGENCE_VERSION, createCodeIntelligenceToolServiceV1 };
|
|
@@ -35,6 +35,16 @@
|
|
|
35
35
|
"abiVersion": 14,
|
|
36
36
|
"asset": "tree-sitter-tsx.wasm",
|
|
37
37
|
"sha256": "79e5da75ea62855a0cd67177685f0164eac87d5f630b3cbe1e0a099751ad30f8"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"language": "php",
|
|
41
|
+
"package": "tree-sitter-php",
|
|
42
|
+
"version": "0.24.2",
|
|
43
|
+
"sourceCommit": "5b5627faaa290d89eb3d01b9bf47c3bb9e797dea",
|
|
44
|
+
"license": "MIT",
|
|
45
|
+
"abiVersion": 15,
|
|
46
|
+
"asset": "tree-sitter-php.wasm",
|
|
47
|
+
"sha256": "d4df6a6ff08c87c3ec4f9cbb785fe09998a0cb570e03f57d7b19b3acfb146aa7"
|
|
38
48
|
}
|
|
39
49
|
]
|
|
40
50
|
}
|
|
Binary file
|
package/lib/parser-worker.mjs
CHANGED
|
@@ -7,6 +7,7 @@ const assets = {
|
|
|
7
7
|
javascript: 'tree-sitter-javascript.wasm',
|
|
8
8
|
typescript: 'tree-sitter-typescript.wasm',
|
|
9
9
|
tsx: 'tree-sitter-tsx.wasm',
|
|
10
|
+
php: 'tree-sitter-php.wasm',
|
|
10
11
|
}
|
|
11
12
|
const MAX_CACHE_ENTRIES = 16
|
|
12
13
|
const MAX_CACHE_BYTES = 16 * 1024 * 1024
|
|
@@ -54,6 +55,70 @@ function nodeSummary(node) {
|
|
|
54
55
|
}
|
|
55
56
|
|
|
56
57
|
async function run(request) {
|
|
58
|
+
return request.language === 'svelte' ? runSvelte(request) : runScript(request)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Let Svelte identify its actual top-level scripts. Recover incomplete script
|
|
62
|
+
// bodies with Tree-sitter instead of treating an Acorn failure as a clean file.
|
|
63
|
+
async function runSvelte(request) {
|
|
64
|
+
const { parse, preprocess } = await import('svelte/compiler')
|
|
65
|
+
// Svelte strips a leading BOM; replacing it keeps original UTF-16 offsets.
|
|
66
|
+
const source = request.text.replace(/^\uFEFF/, ' ')
|
|
67
|
+
let ast
|
|
68
|
+
try { ast = parse(source, { modern: true, loose: true }) }
|
|
69
|
+
catch {
|
|
70
|
+
// The compiler preprocessor is a fallback only: its tag scanner can mistake
|
|
71
|
+
// script-looking strings in valid markup for tags, unlike the real parser.
|
|
72
|
+
const mask = ({ content }) => ({ code: content.replace(/[^\r\n]/g, ' ') })
|
|
73
|
+
const masked = await preprocess(source, { script: mask, style: mask })
|
|
74
|
+
if (masked.code.length !== source.length) throw new Error('Svelte preprocessing changed source offsets')
|
|
75
|
+
ast = parse(masked.code, { modern: true, loose: true })
|
|
76
|
+
}
|
|
77
|
+
const scripts = [ast.instance, ast.module].filter(Boolean).sort((a, b) => a.start - b.start)
|
|
78
|
+
const errors = { hasError: false, errorNodes: 0, missingNodes: 0, truncated: false }
|
|
79
|
+
const matches = [], nodes = []
|
|
80
|
+
let truncated = false, reusedTree = scripts.length > 0, incremental = false
|
|
81
|
+
for (const script of scripts) {
|
|
82
|
+
const start = script.content.start, end = script.content.end
|
|
83
|
+
if (request.operation === 'enclosing' && (request.index < start || request.index >= end)) continue
|
|
84
|
+
const lang = script.attributes.find(attribute => attribute.name === 'lang')
|
|
85
|
+
const language = lang?.value?.[0]?.data === 'ts' ? 'typescript' : 'javascript'
|
|
86
|
+
if (lang && !['ts', 'js', 'javascript'].includes(lang.value?.[0]?.data)) throw new Error('unsupported Svelte script language')
|
|
87
|
+
const key = script.context
|
|
88
|
+
const result = await runScript({
|
|
89
|
+
...request, language, text: request.text.slice(start, end),
|
|
90
|
+
querySource: request.scriptQueries?.[language] ?? request.querySource,
|
|
91
|
+
snapshotHandle: request.snapshotHandle ? `${request.snapshotHandle}:${key}` : undefined,
|
|
92
|
+
previousSnapshotHandle: request.previousSnapshotHandle ? `${request.previousSnapshotHandle}:${key}` : undefined,
|
|
93
|
+
ownerSnapshotHandle: request.snapshotHandle,
|
|
94
|
+
...(request.index === undefined ? {} : { index: request.index - start }),
|
|
95
|
+
...(request.startIndex === undefined ? {} : { startIndex: Math.max(0, Math.min(end - start, request.startIndex - start)) }),
|
|
96
|
+
...(request.endIndex === undefined ? {} : { endIndex: Math.max(0, Math.min(end - start, request.endIndex - start)) }),
|
|
97
|
+
})
|
|
98
|
+
errors.hasError ||= result.errors.hasError
|
|
99
|
+
errors.errorNodes = Math.min(100, errors.errorNodes + result.errors.errorNodes)
|
|
100
|
+
errors.missingNodes = Math.min(100, errors.missingNodes + result.errors.missingNodes)
|
|
101
|
+
errors.truncated ||= result.errors.truncated
|
|
102
|
+
reusedTree &&= Boolean(result.reusedTree)
|
|
103
|
+
incremental ||= Boolean(result.incremental)
|
|
104
|
+
truncated ||= Boolean(result.truncated)
|
|
105
|
+
const offset = pointAt(request.text, start)
|
|
106
|
+
const originalPoint = point => ({ row: point.row + offset.row, column: point.column + (point.row === 0 ? offset.column : 0) })
|
|
107
|
+
const original = node => ({
|
|
108
|
+
...node, startIndex: node.startIndex + start, endIndex: node.endIndex + start,
|
|
109
|
+
startPosition: originalPoint(node.startPosition),
|
|
110
|
+
endPosition: originalPoint(node.endPosition),
|
|
111
|
+
...(node.nameStartIndex === undefined ? {} : { nameStartIndex: node.nameStartIndex + start, nameEndIndex: node.nameEndIndex + start }),
|
|
112
|
+
})
|
|
113
|
+
if (request.startIndex === undefined || request.endIndex === undefined || (request.startIndex < end && request.endIndex > start)) {
|
|
114
|
+
matches.push(...(result.matches ?? []).map(match => ({ captures: match.captures.map(original) })))
|
|
115
|
+
}
|
|
116
|
+
nodes.push(...(result.nodes ?? []).map(original))
|
|
117
|
+
}
|
|
118
|
+
return { status: errors.hasError ? 'partial' : 'ok', errors, matches: matches.slice(0, request.limit + 1), nodes, truncated: truncated || matches.length > request.limit, reusedTree, incremental }
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
async function runScript(request) {
|
|
57
122
|
const language = await loadLanguage(request.language)
|
|
58
123
|
let cached = request.snapshotHandle ? trees.get(request.snapshotHandle) : undefined
|
|
59
124
|
let incremental = false
|
|
@@ -74,7 +139,7 @@ async function run(request) {
|
|
|
74
139
|
} else if (previous && previous.text === request.text) {
|
|
75
140
|
trees.delete(request.previousSnapshotHandle)
|
|
76
141
|
tree = previous.tree
|
|
77
|
-
if (request.snapshotHandle) trees.set(request.snapshotHandle, previous)
|
|
142
|
+
if (request.snapshotHandle) trees.set(request.snapshotHandle, { ...previous, ownerSnapshotHandle: request.ownerSnapshotHandle })
|
|
78
143
|
else { cachedBytes -= previous.bytes; tree.delete() }
|
|
79
144
|
} else {
|
|
80
145
|
parser = new Parser()
|
|
@@ -97,7 +162,7 @@ async function run(request) {
|
|
|
97
162
|
if (!tree) throw new Error('parser returned no tree')
|
|
98
163
|
if (request.snapshotHandle && Buffer.byteLength(request.text, 'utf8') <= MAX_CACHE_BYTES) {
|
|
99
164
|
const bytes = Buffer.byteLength(request.text, 'utf8')
|
|
100
|
-
trees.set(request.snapshotHandle, { tree, text: request.text, languageName: request.language, bytes })
|
|
165
|
+
trees.set(request.snapshotHandle, { tree, text: request.text, languageName: request.language, bytes, ownerSnapshotHandle: request.ownerSnapshotHandle })
|
|
101
166
|
cachedBytes += bytes
|
|
102
167
|
while (trees.size > MAX_CACHE_ENTRIES || cachedBytes > MAX_CACHE_BYTES) {
|
|
103
168
|
const [oldestKey, oldest] = trees.entries().next().value
|
|
@@ -127,8 +192,9 @@ async function run(request) {
|
|
|
127
192
|
try {
|
|
128
193
|
const options = {
|
|
129
194
|
matchLimit: Math.max(1, Math.min(2048, request.limit + 1)),
|
|
130
|
-
|
|
131
|
-
...(request.
|
|
195
|
+
// Query index bounds use the underlying byte units; point columns use UTF-16.
|
|
196
|
+
...(request.startIndex === undefined ? {} : { startPosition: pointAt(request.text, request.startIndex) }),
|
|
197
|
+
...(request.endIndex === undefined ? {} : { endPosition: pointAt(request.text, request.endIndex) }),
|
|
132
198
|
}
|
|
133
199
|
const matches = query.matches(root, options)
|
|
134
200
|
const result = matches.slice(0, request.limit + 1).map(match => ({
|
|
@@ -183,11 +249,12 @@ function splitsSurrogate(text, index) {
|
|
|
183
249
|
|
|
184
250
|
port.on('message', async request => {
|
|
185
251
|
if (typeof request.releaseSnapshotHandle === 'string') {
|
|
186
|
-
const cached
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
252
|
+
for (const [key, cached] of trees) {
|
|
253
|
+
if (key === request.releaseSnapshotHandle || cached.ownerSnapshotHandle === request.releaseSnapshotHandle) {
|
|
254
|
+
trees.delete(key)
|
|
255
|
+
cachedBytes -= cached.bytes
|
|
256
|
+
cached.tree.delete()
|
|
257
|
+
}
|
|
191
258
|
}
|
|
192
259
|
return
|
|
193
260
|
}
|
package/lib/provider.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { WebstackLspError } from "./errors-DtyWAUi0.js";
|
|
2
2
|
import { SERVER_IDS, createWebstackLspService, initializationOptions, resolveConfig, resolveLaunch, serverConfiguration } from "./launch-ByUvgkVv.js";
|
|
3
3
|
import { mergeCompletions, mergeDiagnostics } from "./completion-B7NPVCEN.js";
|
|
4
|
-
import { DocumentSnapshotStore, createCodeIntelligenceToolServiceV1 } from "./code-intelligence-
|
|
4
|
+
import { DocumentSnapshotStore, createCodeIntelligenceToolServiceV1 } from "./code-intelligence-BUs39chK.js";
|
|
5
5
|
import { LspProviderId } from "@deepseek-ai/dsh-lsp";
|
|
6
6
|
import { isAbsolute } from "node:path";
|
|
7
7
|
import { TextDecoder } from "node:util";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CompletionResult, DiagnosticsResult, LspPosition, LspRange, NavigationResult } from '../service.js';
|
|
2
|
-
export type StructureLanguage = 'javascript' | 'typescript' | 'tsx';
|
|
2
|
+
export type StructureLanguage = 'javascript' | 'typescript' | 'tsx' | 'php' | 'svelte';
|
|
3
3
|
export type CodeIntelligenceStatus = 'ok' | 'partial' | 'unsupported' | 'unavailable' | 'stale' | 'cancelled' | 'timeout' | 'limit_exceeded';
|
|
4
4
|
export type SourceKind = 'disk' | 'overlay';
|
|
5
5
|
/** Values are created by the trusted host adapter, never from model arguments. */
|
|
@@ -4,6 +4,10 @@ export interface StructureWorkerRequest {
|
|
|
4
4
|
language: StructureLanguage;
|
|
5
5
|
text: string;
|
|
6
6
|
querySource: string;
|
|
7
|
+
scriptQueries?: {
|
|
8
|
+
javascript: string;
|
|
9
|
+
typescript: string;
|
|
10
|
+
};
|
|
7
11
|
limit: number;
|
|
8
12
|
snapshotHandle?: string;
|
|
9
13
|
previousSnapshotHandle?: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@askdkc/dsh-lsp-server",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.16",
|
|
4
4
|
"description": "Composite read-only LSP provider for DeepSeek Harness web stacks",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/provider.js",
|
|
@@ -60,12 +60,13 @@
|
|
|
60
60
|
"check": "npm run typecheck && npm test && npm run build && npm run test:package",
|
|
61
61
|
"test:package": "vitest run --config vitest.package.config.ts",
|
|
62
62
|
"prepare": "npm run build",
|
|
63
|
-
"prepublishOnly": "npm run check"
|
|
63
|
+
"prepublishOnly": "pnpm install --frozen-lockfile --ignore-scripts --prod=false --optional=true && npm run check"
|
|
64
64
|
},
|
|
65
65
|
"dependencies": {
|
|
66
66
|
"@deepseek-ai/dsh-lsp": "0.2.0-rc.2",
|
|
67
67
|
"@deepseek-ai/dsh-tool-lsp": "0.2.0-rc.2",
|
|
68
68
|
"@tailwindcss/language-server": "0.16.0",
|
|
69
|
+
"svelte": "5.55.7",
|
|
69
70
|
"svelte-language-server": "0.17.15",
|
|
70
71
|
"typescript": "5.7.3",
|
|
71
72
|
"typescript-language-server": "4.3.3",
|
|
@@ -106,10 +107,11 @@
|
|
|
106
107
|
"tailwindcss-v3": "npm:tailwindcss@3.4.17",
|
|
107
108
|
"tailwindcss-v4": "npm:tailwindcss@4.1.13",
|
|
108
109
|
"tree-sitter-javascript": "0.25.0",
|
|
110
|
+
"tree-sitter-php": "0.24.2",
|
|
109
111
|
"tree-sitter-typescript": "0.23.2",
|
|
110
112
|
"tsdown": "0.15.0",
|
|
111
113
|
"typescript": "5.7.3",
|
|
112
|
-
"vitest": "4.1.
|
|
114
|
+
"vitest": "4.1.12"
|
|
113
115
|
},
|
|
114
116
|
"engines": {
|
|
115
117
|
"node": "^22.19.0 || >=24.0.0"
|
|
@@ -122,7 +124,7 @@
|
|
|
122
124
|
"overrides": {
|
|
123
125
|
"tsdown>rolldown": "1.0.0-beta.38",
|
|
124
126
|
"svelte-language-server>svelte": "5.55.7",
|
|
125
|
-
"vite": "6.4.
|
|
127
|
+
"vite": "6.4.5",
|
|
126
128
|
"source-map-js": "1.2.2",
|
|
127
129
|
"postcss-selector-parser": "7.1.6"
|
|
128
130
|
}
|
|
@@ -139,7 +141,7 @@
|
|
|
139
141
|
"svelte-language-server": {
|
|
140
142
|
"svelte": "5.55.7"
|
|
141
143
|
},
|
|
142
|
-
"vite": "6.4.
|
|
144
|
+
"vite": "6.4.5"
|
|
143
145
|
},
|
|
144
146
|
"peerDependenciesMeta": {
|
|
145
147
|
"@deepseek-ai/cordis": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"code-intelligence-DvhxPnpu.js","names":["EXTENSION_LANGUAGE: Record<string, StructureLanguage>","readSource: SnapshotReader","maxDocumentBytes: number","descriptor: SnapshotDescriptor","record: SnapshotRecord","text: string","task: PendingTask","slot: WorkerSlot","declarations: StructureNode[]","declarations","captures: StructureCapture[]","value: SemanticResult","record: Awaited<ReturnType<DocumentSnapshotStore['current']>>"],"sources":["../src/structure/snapshots.ts","../src/structure/coordinates.ts","../src/structure/queries.ts","../src/structure/worker-pool.ts","../src/structure/engine.ts","../src/structure/code-intelligence.ts"],"sourcesContent":["import { createHash, randomUUID } from 'node:crypto'\nimport { isAbsolute } from 'node:path'\nimport { WebstackLspError } from '../errors.js'\nimport type { HostSource } from '../host/dsh.js'\nimport type { SnapshotDescriptor, SnapshotScope, StructureLanguage } from './types.js'\n\nexport const SNAPSHOT_TTL_MS = 5 * 60_000\nexport const SNAPSHOT_MAX_DOCUMENTS = 32\nexport const SNAPSHOT_MAX_BYTES = 32 * 1024 * 1024\nexport const STRUCTURE_MAX_DOCUMENT_BYTES = 2 * 1024 * 1024\n\nexport interface SnapshotRecord {\n readonly descriptor: SnapshotDescriptor\n readonly scopeKey: string\n readonly source: HostSource\n readonly previousSnapshotHandle?: string\n readonly openedAt: number\n lastUsedAt: number\n}\n\ninterface VersionRecord { hash: string; version: number; scopeKey: string }\n\nexport type SnapshotReader = (workspaceRoot: string, filePath: string, maxBytes: number, signal?: AbortSignal) => Promise<HostSource>\n\nconst EXTENSION_LANGUAGE: Record<string, StructureLanguage> = {\n '.js': 'javascript', '.jsx': 'javascript', '.mjs': 'javascript', '.cjs': 'javascript',\n '.ts': 'typescript', '.mts': 'typescript', '.cts': 'typescript',\n '.tsx': 'tsx',\n}\n\nexport class DocumentSnapshotStore {\n private readonly records = new Map<string, SnapshotRecord>()\n private readonly versions = new Map<string, VersionRecord>()\n\n constructor(private readonly readSource: SnapshotReader, private readonly maxDocumentBytes: number) {}\n\n async open(scope: SnapshotScope, filePath: string, signal?: AbortSignal): Promise<SnapshotRecord> {\n validateScope(scope)\n const normalizedPath = normalizeRelativePath(filePath)\n signal?.throwIfAborted()\n const first = await this.readSource(scope.workspaceRoot, normalizedPath, Math.min(this.maxDocumentBytes, STRUCTURE_MAX_DOCUMENT_BYTES), signal)\n signal?.throwIfAborted()\n const second = await this.readSource(scope.workspaceRoot, normalizedPath, Math.min(this.maxDocumentBytes, STRUCTURE_MAX_DOCUMENT_BYTES), signal)\n if (hashText(first.text) !== hashText(second.text) || first.uri !== second.uri || first.key !== second.key)\n throw new WebstackLspError('LSP_STALE_SNAPSHOT', 'document changed while opening the snapshot')\n\n const ownerKey = scopeKey(scope)\n const hash = hashText(second.text)\n const fileKey = JSON.stringify([ownerKey, second.key, second.uri])\n const version = this.rememberVersion(fileKey, scope, hash)\n const sourceBytes = Buffer.byteLength(second.text, 'utf8')\n this.evictExpired()\n if (this.records.size >= SNAPSHOT_MAX_DOCUMENTS || this.totalBytes() + sourceBytes > SNAPSHOT_MAX_BYTES)\n throw new WebstackLspError('LSP_SNAPSHOT_LIMIT', 'snapshot capacity is full; release an existing snapshot and retry')\n\n const descriptor: SnapshotDescriptor = {\n handle: randomUUID(), version, filePath: normalizedPath,\n language: languageForPath(normalizedPath), sourceKind: 'disk', contentHash: hash, sourceBytes,\n }\n const previous = [...this.records.values()]\n .filter(item => item.scopeKey === ownerKey && item.source.key === second.key && item.source.uri === second.uri)\n .sort((a, b) => b.openedAt - a.openedAt)[0]\n const record: SnapshotRecord = {\n descriptor, scopeKey: ownerKey, source: second, openedAt: Date.now(), lastUsedAt: Date.now(),\n ...(previous ? { previousSnapshotHandle: previous.descriptor.handle } : {}),\n }\n this.records.set(descriptor.handle, record)\n return record\n }\n\n async current(scope: SnapshotScope, handle: string, signal?: AbortSignal): Promise<SnapshotRecord> {\n validateScope(scope)\n signal?.throwIfAborted()\n const record = this.records.get(handle)\n if (!record || record.scopeKey !== scopeKey(scope)) throw staleSnapshot()\n if (Date.now() - record.openedAt > SNAPSHOT_TTL_MS) {\n this.records.delete(handle)\n throw staleSnapshot()\n }\n const current = await this.readSource(scope.workspaceRoot, record.descriptor.filePath, Math.min(this.maxDocumentBytes, STRUCTURE_MAX_DOCUMENT_BYTES), signal)\n signal?.throwIfAborted()\n if (current.uri !== record.source.uri || current.key !== record.source.key || hashText(current.text) !== record.descriptor.contentHash) {\n this.records.delete(handle)\n throw staleSnapshot()\n }\n record.lastUsedAt = Date.now()\n return record\n }\n\n async readFresh(scope: SnapshotScope, filePath: string, signal?: AbortSignal): Promise<HostSource> {\n validateScope(scope)\n signal?.throwIfAborted()\n const source = await this.readSource(scope.workspaceRoot, filePath, this.maxDocumentBytes, signal)\n signal?.throwIfAborted()\n const fileKey = JSON.stringify([scopeKey(scope), source.key, source.uri])\n this.rememberVersion(fileKey, scope, hashText(source.text))\n return source\n }\n\n release(scope: SnapshotScope, handle: string): boolean {\n validateScope(scope)\n const record = this.records.get(handle)\n if (!record || record.scopeKey !== scopeKey(scope)) return false\n return this.records.delete(handle)\n }\n\n releaseOwner(scope: SnapshotScope): number {\n validateScope(scope)\n const owner = scopeKey(scope)\n let released = 0\n for (const [handle, record] of this.records) {\n if (record.scopeKey === owner) { this.records.delete(handle); released++ }\n }\n for (const [key, version] of this.versions) if (version.scopeKey === owner) this.versions.delete(key)\n return released\n }\n\n clear(): void { this.records.clear(); this.versions.clear() }\n get size(): number { return this.records.size }\n get documentByteLimit(): number { return this.maxDocumentBytes }\n\n private totalBytes(): number {\n let bytes = 0\n for (const record of this.records.values()) bytes += record.descriptor.sourceBytes\n return bytes\n }\n\n private rememberVersion(fileKey: string, scope: SnapshotScope, hash: string): number {\n const owner = scopeKey(scope), previous = this.versions.get(fileKey)\n const version = previous ? (previous.hash === hash ? previous.version : previous.version + 1) : 1\n this.versions.delete(fileKey)\n this.versions.set(fileKey, { hash, version, scopeKey: owner })\n while (this.versions.size > 4096) this.versions.delete(this.versions.keys().next().value!)\n return version\n }\n\n private evictExpired(): void {\n const now = Date.now()\n for (const [handle, record] of this.records) if (now - record.openedAt > SNAPSHOT_TTL_MS) this.records.delete(handle)\n }\n}\n\nexport function languageForPath(filePath: string): StructureLanguage | null {\n const suffix = filePath.slice(filePath.lastIndexOf('.')).toLowerCase()\n return EXTENSION_LANGUAGE[suffix] ?? null\n}\n\nexport function validateScope(scope: SnapshotScope): void {\n if (!scope || typeof scope !== 'object' || !scope.ownerId?.trim() || !scope.sessionId?.trim() || !scope.workspaceRoot?.trim() || !isAbsolute(scope.workspaceRoot) || /[\\u0000-\\u001f\\u007f]/u.test(`${scope.ownerId}${scope.sessionId}${scope.workspaceRoot}`))\n throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'trusted owner, session and absolute workspace root are required')\n}\n\nexport function normalizeRelativePath(filePath: string): string {\n if (typeof filePath !== 'string' || !filePath.trim() || filePath.length > 4096 || /[\\u0000-\\u001f\\u007f]/u.test(filePath) || isAbsolute(filePath))\n throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'file path must be a relative workspace path')\n const segments = filePath.replaceAll('\\\\', '/').split('/')\n if (segments.some(segment => segment === '..' || segment === '')) throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'file path contains an invalid segment')\n return segments.filter(segment => segment !== '.').join('/')\n}\n\nexport function scopeIdentity(scope: SnapshotScope): string { return JSON.stringify([scope.ownerId, scope.sessionId, scope.workspaceRoot]) }\nfunction scopeKey(scope: SnapshotScope): string { return scopeIdentity(scope) }\nfunction hashText(text: string): string { return createHash('sha256').update(text, 'utf8').digest('hex') }\nfunction staleSnapshot(): WebstackLspError { return new WebstackLspError('LSP_STALE_SNAPSHOT', 'snapshot is stale, expired or belongs to another owner') }\n","import type { LspPosition, LspRange } from '../service.js'\n\ninterface Line { start: number; end: number }\n\n/** web-tree-sitter 0.27.1 exposes JS-string indices as UTF-16 code-unit offsets. */\nexport class Utf16Coordinates {\n private readonly lines: Line[]\n\n constructor(private readonly text: string) {\n this.lines = []\n let start = 0\n for (let index = 0; index < text.length;) {\n const char = text[index]!\n if (char !== '\\r' && char !== '\\n') { index++; continue }\n this.lines.push({ start, end: index })\n if (char === '\\r' && text[index + 1] === '\\n') index++\n index++\n start = index\n }\n this.lines.push({ start, end: text.length })\n }\n\n positionToIndex(position: LspPosition): number {\n if (!isPosition(position)) throw new RangeError('position must use non-negative zero-based UTF-16 coordinates')\n const line = this.lines[position.line]\n if (!line || position.character > line.end - line.start) throw new RangeError('position is outside document')\n const index = line.start + position.character\n if (isBetweenSurrogatePair(this.text, index)) throw new RangeError('position splits a UTF-16 surrogate pair')\n return index\n }\n\n indexToPosition(index: number): LspPosition {\n if (!Number.isSafeInteger(index) || index < 0 || index > this.text.length) throw new RangeError('Tree-sitter index is outside document')\n let low = 0, high = this.lines.length\n while (low < high) {\n const middle = (low + high) >>> 1\n if (this.lines[middle]!.start <= index) low = middle + 1\n else high = middle\n }\n const lineNumber = Math.max(0, low - 1)\n const line = this.lines[lineNumber]!\n return { line: lineNumber, character: Math.min(index, line.end) - line.start }\n }\n\n rangeToIndices(range: LspRange): { startIndex: number; endIndex: number } {\n const startIndex = this.positionToIndex(range.start)\n const endIndex = this.positionToIndex(range.end)\n if (endIndex < startIndex) throw new RangeError('range end precedes range start')\n return { startIndex, endIndex }\n }\n\n indicesToRange(startIndex: number, endIndex: number): LspRange {\n if (endIndex < startIndex) throw new RangeError('range end precedes range start')\n return { start: this.indexToPosition(startIndex), end: this.indexToPosition(endIndex) }\n }\n}\n\nfunction isPosition(value: unknown): value is LspPosition {\n if (typeof value !== 'object' || value === null) return false\n const position = value as { line?: unknown; character?: unknown }\n return Number.isSafeInteger(position.line) && Number.isSafeInteger(position.character) && (position.line as number) >= 0 && (position.character as number) >= 0\n}\n\nfunction isBetweenSurrogatePair(text: string, index: number): boolean {\n if (index <= 0 || index >= text.length) return false\n const previous = text.charCodeAt(index - 1), next = text.charCodeAt(index)\n return previous >= 0xd800 && previous <= 0xdbff && next >= 0xdc00 && next <= 0xdfff\n}\n","import type { StructureLanguage } from './types.js'\n\nconst declarations = {\n javascript: [\n '(function_declaration name: (_) @name) @declaration',\n '(class_declaration name: (_) @name) @declaration',\n '(method_definition name: (_) @name) @declaration',\n '(variable_declarator name: (_) @name) @declaration',\n ],\n typescript: [\n '(function_declaration name: (_) @name) @declaration',\n '(class_declaration name: (_) @name) @declaration',\n '(interface_declaration name: (_) @name) @declaration',\n '(type_alias_declaration name: (_) @name) @declaration',\n '(enum_declaration name: (_) @name) @declaration',\n '(method_definition name: (_) @name) @declaration',\n '(variable_declarator name: (_) @name) @declaration',\n ],\n tsx: [\n '(function_declaration name: (_) @name) @declaration',\n '(class_declaration name: (_) @name) @declaration',\n '(interface_declaration name: (_) @name) @declaration',\n '(type_alias_declaration name: (_) @name) @declaration',\n '(enum_declaration name: (_) @name) @declaration',\n '(method_definition name: (_) @name) @declaration',\n '(variable_declarator name: (_) @name) @declaration',\n ],\n} satisfies Record<StructureLanguage, string[]>\n\nconst imports = {\n javascript: ['(import_statement) @import', '(export_statement) @export'],\n typescript: ['(import_statement) @import', '(export_statement) @export'],\n tsx: ['(import_statement) @import', '(export_statement) @export'],\n} satisfies Record<StructureLanguage, string[]>\n\nconst calls = {\n javascript: ['(call_expression function: (_) @call) @callsite'],\n typescript: ['(call_expression function: (_) @call) @callsite'],\n tsx: ['(call_expression function: (_) @call) @callsite'],\n} satisfies Record<StructureLanguage, string[]>\n\nexport type RegisteredQueryId = 'declarations' | 'calls' | 'imports'\n\nexport function getRegisteredQuery(language: StructureLanguage, queryId: string): string | undefined {\n const patterns = queryId === 'declarations' ? declarations[language] : queryId === 'calls' ? calls[language] : queryId === 'imports' ? imports[language] : undefined\n return patterns?.join('\\n')\n}\n\nexport function isRegisteredQueryId(value: string): value is RegisteredQueryId {\n return value === 'declarations' || value === 'calls' || value === 'imports'\n}\n","import { randomUUID } from 'node:crypto'\nimport { Worker } from 'node:worker_threads'\nimport { WebstackLspError } from '../errors.js'\nimport type { StructureLanguage } from './types.js'\n\nexport interface StructureWorkerRequest {\n operation: 'matches' | 'enclosing' | 'inspect'\n language: StructureLanguage\n text: string\n querySource: string\n limit: number\n snapshotHandle?: string\n previousSnapshotHandle?: string\n startIndex?: number\n endIndex?: number\n index?: number\n kinds?: string[]\n}\n\nexport interface WorkerNodeSummary {\n kind: string\n startIndex: number\n endIndex: number\n startPosition: { row: number; column: number }\n endPosition: { row: number; column: number }\n nameStartIndex?: number\n nameEndIndex?: number\n childCount: number\n}\n\nexport interface WorkerErrorSummary { hasError: boolean; errorNodes: number; missingNodes: number; truncated: boolean }\nexport interface WorkerMatch { captures: Array<{ name: string } & WorkerNodeSummary> }\nexport interface StructureWorkerResult {\n status: 'ok' | 'partial'\n abiVersion?: number\n reusedTree?: boolean\n incremental?: boolean\n matches?: WorkerMatch[]\n nodes?: WorkerNodeSummary[]\n truncated?: boolean\n errors: WorkerErrorSummary\n}\n\ninterface WorkerReply { id: string; ok: boolean; value?: StructureWorkerResult; error?: string }\ninterface PendingTask {\n id: string\n request: StructureWorkerRequest\n signal?: AbortSignal\n resolve(value: StructureWorkerResult): void\n reject(error: unknown): void\n timer?: ReturnType<typeof setTimeout>\n removeAbort?: () => void\n}\ninterface WorkerSlot { worker: Worker; current: PendingTask | undefined; completed: number; failed: boolean }\n\nconst MAX_WORKERS = 2\nconst MAX_QUEUE = 16\nconst WORKER_TASK_LIMIT = 100\nconst PARSE_TIMEOUT_MS = 2_000\n\n/** CPU-bound parsing runs off the event loop; cancellation terminates the active worker. */\nexport class StructureWorkerPool {\n private readonly slots = new Set<WorkerSlot>()\n private readonly queue: PendingTask[] = []\n private disposed = false\n\n execute(request: StructureWorkerRequest, signal?: AbortSignal): Promise<StructureWorkerResult> {\n if (this.disposed) return Promise.reject(new WebstackLspError('LSP_DISPOSED', 'structure worker pool is disposed'))\n if (signal?.aborted) return Promise.reject(abortError())\n if (this.queue.length >= MAX_QUEUE) return Promise.reject(new WebstackLspError('LSP_STRUCTURE_BUSY', 'structure worker queue is full'))\n return new Promise((resolve, reject) => {\n const task: PendingTask = { id: randomUUID(), request, ...(signal ? { signal } : {}), resolve, reject }\n if (signal) {\n const abort = () => {\n const index = this.queue.indexOf(task)\n if (index >= 0) { this.queue.splice(index, 1); this.finishTask(task, abortError()) }\n else {\n const slot = [...this.slots].find(candidate => candidate.current === task)\n if (slot) void this.retire(slot, abortError())\n }\n }\n signal.addEventListener('abort', abort, { once: true })\n task.removeAbort = () => signal.removeEventListener('abort', abort)\n }\n this.queue.push(task)\n this.pump()\n })\n }\n\n async dispose(): Promise<void> {\n this.disposed = true\n for (const task of this.queue.splice(0)) this.finishTask(task, new WebstackLspError('LSP_DISPOSED', 'structure worker pool is disposed'))\n await Promise.all([...this.slots].map(slot => this.retire(slot, new WebstackLspError('LSP_DISPOSED', 'structure worker pool is disposed'))))\n }\n\n releaseSnapshot(snapshotHandle: string): void {\n for (const slot of this.slots) {\n if (!slot.failed) {\n try { slot.worker.postMessage({ releaseSnapshotHandle: snapshotHandle }) }\n catch { void this.retire(slot, new WebstackLspError('LSP_STRUCTURE_UNAVAILABLE', 'structure worker could not release a cached snapshot')) }\n }\n }\n }\n\n get queued(): number { return this.queue.length }\n get active(): number { return [...this.slots].filter(slot => slot.current !== undefined).length }\n\n private pump(): void {\n if (this.disposed) return\n while (this.queue.length) {\n let slot = [...this.slots].find(candidate => !candidate.current && !candidate.failed)\n if (!slot && this.slots.size < MAX_WORKERS) slot = this.createWorker()\n if (!slot) return\n const task = this.queue.shift()!\n if (task.signal?.aborted) { this.finishTask(task, abortError()); continue }\n slot.current = task\n task.timer = setTimeout(() => { void this.retire(slot!, new WebstackLspError('LSP_STRUCTURE_TIMEOUT', 'structure parsing exceeded its time limit')) }, PARSE_TIMEOUT_MS)\n try { slot.worker.postMessage({ id: task.id, ...task.request }) }\n catch (error) { void this.retire(slot, error) }\n }\n }\n\n private createWorker(): WorkerSlot {\n const worker = new Worker(new URL('./parser-worker.mjs', import.meta.url))\n const slot: WorkerSlot = { worker, current: undefined, completed: 0, failed: false }\n this.slots.add(slot)\n worker.on('message', (reply: WorkerReply) => {\n if (!slot.current || reply.id !== slot.current.id) { void this.retire(slot, new WebstackLspError('LSP_MALFORMED_RESPONSE', 'structure worker returned an unexpected task identity')); return }\n const task = slot.current\n slot.current = undefined\n slot.completed++\n if (!reply.ok || !reply.value) this.finishTask(task, new WebstackLspError('LSP_STRUCTURE_UNAVAILABLE', reply.error ?? 'structure parsing failed'))\n else this.finishTask(task, undefined, reply.value)\n if (slot.completed >= WORKER_TASK_LIMIT) void this.retire(slot)\n this.pump()\n })\n worker.on('error', error => { void this.retire(slot, error) })\n worker.on('exit', code => {\n if (this.slots.has(slot) && !slot.failed) void this.retire(slot, code === 0 ? undefined : new WebstackLspError('LSP_STRUCTURE_UNAVAILABLE', `structure worker exited (${code})`))\n })\n return slot\n }\n\n private async retire(slot: WorkerSlot, error?: unknown): Promise<void> {\n if (slot.failed) return\n slot.failed = true\n this.slots.delete(slot)\n const task = slot.current\n slot.current = undefined\n if (task) this.finishTask(task, error ?? new WebstackLspError('LSP_STRUCTURE_UNAVAILABLE', 'structure worker was restarted'))\n await slot.worker.terminate().catch(() => 0)\n this.pump()\n }\n\n private finishTask(task: PendingTask, error?: unknown, value?: StructureWorkerResult): void {\n if (task.timer) clearTimeout(task.timer)\n task.removeAbort?.()\n if (error !== undefined) task.reject(error)\n else task.resolve(value!)\n }\n}\n\nfunction abortError(): DOMException { return new DOMException('The operation was aborted', 'AbortError') }\n","import { randomUUID } from 'node:crypto'\nimport { WebstackLspError } from '../errors.js'\nimport { Utf16Coordinates } from './coordinates.js'\nimport { getRegisteredQuery, isRegisteredQueryId } from './queries.js'\nimport { scopeIdentity, type SnapshotRecord } from './snapshots.js'\nimport { StructureWorkerPool } from './worker-pool.js'\nimport type { SnapshotScope, StructureCapture, StructureEnclosingResult, StructureErrorSummary, StructureLanguage, StructureNode, StructureOutlineResult, StructureQueryResult, StructureSpanResult } from './types.js'\n\nexport const MAX_CAPTURES = 200\nexport const MAX_OUTLINE = 100\nexport const MAX_SPAN_CHARS = 8_000\nexport const MAX_STRUCTURE_RESPONSE_BYTES = 32 * 1024\nconst MAX_NODE_HANDLES = 10_000\n\ninterface NodeHandleRecord {\n scopeKey: string\n snapshotHandle: string\n startIndex: number\n endIndex: number\n kind: string\n range: StructureNode['range']\n}\n\nexport class StructureEngine {\n private readonly nodeHandles = new Map<string, NodeHandleRecord>()\n private readonly snapshotOwners = new Map<string, string>()\n private readonly parserFailures = new Map<StructureLanguage, string>()\n constructor(private readonly workers = new StructureWorkerPool()) {}\n\n async inspect(record: SnapshotRecord, signal?: AbortSignal): Promise<{ available: boolean; parseErrors: boolean; reason?: string }> {\n this.snapshotOwners.set(record.descriptor.handle, record.scopeKey)\n const language = record.descriptor.language\n if (!language) return { available: false, parseErrors: false, reason: 'grammar_missing' }\n try {\n const result = await this.runWorker(language, { operation: 'inspect', language, text: record.source.text, querySource: '', limit: 1, snapshotHandle: record.descriptor.handle, ...(record.previousSnapshotHandle ? { previousSnapshotHandle: record.previousSnapshotHandle } : {}) }, signal)\n this.parserFailures.delete(language)\n return { available: true, parseErrors: result.errors.hasError }\n } catch (error) {\n const reason = error instanceof Error ? error.message.slice(0, 128) : 'parser_unavailable'\n return { available: false, parseErrors: false, reason }\n }\n }\n\n async outline(record: SnapshotRecord, scope: SnapshotScope, options: { range?: StructureNode['range']; limit?: number } = {}, signal?: AbortSignal): Promise<StructureOutlineResult> {\n const language = record.descriptor.language\n if (!language) return { status: 'unsupported', handle: record.descriptor.handle, version: record.descriptor.version, declarations: [], truncated: false, processed: 0, errors: { hasError: false, errorNodes: 0, missingNodes: 0, truncated: false } }\n const limit = positiveLimit(options.limit, MAX_OUTLINE, 'outline limit')\n const coordinates = new Utf16Coordinates(record.source.text)\n const range = options.range ? coordinates.rangeToIndices(options.range) : undefined\n const result = await this.runMatches(language, record, 'declarations', limit, range, signal)\n const declarations: StructureNode[] = []\n for (const match of result.matches ?? []) {\n const declaration = match.captures.find(capture => capture.name === 'declaration')\n const nameCapture = match.captures.find(capture => capture.name === 'name')\n if (!declaration) continue\n const node = this.node(record, scope, declaration.kind, declaration.startIndex, declaration.endIndex, nameCapture ? record.source.text.slice(nameCapture.startIndex, nameCapture.endIndex).slice(0, 256) : undefined, declaration.childCount, coordinates)\n declarations.push(node)\n }\n return this.outlineResult(record, declarations, result)\n }\n\n async enclosing(record: SnapshotRecord, scope: SnapshotScope, position: { line: number; character: number }, kinds?: string[], signal?: AbortSignal): Promise<StructureEnclosingResult> {\n const language = record.descriptor.language\n if (!language) return { status: 'unsupported', handle: record.descriptor.handle, version: record.descriptor.version, ancestors: [] }\n const coordinates = new Utf16Coordinates(record.source.text)\n const index = coordinates.positionToIndex(position)\n if (kinds && (!Array.isArray(kinds) || kinds.length > 32 || kinds.some(kind => typeof kind !== 'string' || kind.length > 128 || !/^[a-z][a-z0-9_]*$/u.test(kind))))\n throw new WebstackLspError('LSP_STRUCTURE_LIMIT', 'kinds must be a list of at most 32 node type names')\n const result = await this.runWorker(language, { operation: 'enclosing', language, text: record.source.text, querySource: '', limit: 16, snapshotHandle: record.descriptor.handle, index, ...(kinds ? { kinds: [...kinds] } : {}) }, signal)\n const nodes = result.nodes ?? []\n const summaries = nodes.map(item => this.node(record, scope, item.kind, item.startIndex, item.endIndex, undefined, item.childCount, coordinates))\n const [node, ...ancestors] = summaries\n return { status: result.status, handle: record.descriptor.handle, version: record.descriptor.version, ...(node ? { node } : {}), ancestors, errors: publicErrors(result.errors) }\n }\n\n async query(record: SnapshotRecord, scope: SnapshotScope, queryId: string, options: { range?: StructureNode['range']; limit?: number } = {}, signal?: AbortSignal): Promise<StructureQueryResult> {\n const language = record.descriptor.language\n if (!language) throw new WebstackLspError('LSP_STRUCTURE_UNSUPPORTED', 'no bundled Tree-sitter grammar is available for this document')\n if (!isRegisteredQueryId(queryId)) throw new WebstackLspError('LSP_STRUCTURE_UNSUPPORTED', 'queryId is not in the registered query allowlist')\n const limit = positiveLimit(options.limit, MAX_CAPTURES, 'capture limit')\n const coordinates = new Utf16Coordinates(record.source.text)\n const range = options.range ? coordinates.rangeToIndices(options.range) : undefined\n const result = await this.runMatches(language, record, queryId, limit, range, signal)\n const captures: StructureCapture[] = []\n captureLoop: for (const match of result.matches ?? []) for (const capture of match.captures) {\n const node = this.node(record, scope, capture.kind, capture.startIndex, capture.endIndex, undefined, capture.childCount, coordinates)\n captures.push({ capture: capture.name, kind: capture.kind, range: node.range, nodeHandle: node.handle, ...(capture.name === 'name' ? { name: record.source.text.slice(capture.startIndex, capture.endIndex).slice(0, 256) } : {}) })\n if (captures.length >= limit) break captureLoop\n }\n if (Buffer.byteLength(JSON.stringify(captures), 'utf8') > MAX_STRUCTURE_RESPONSE_BYTES) throw new WebstackLspError('LSP_STRUCTURE_LIMIT', 'query result exceeds the response byte limit')\n return { status: result.status, handle: record.descriptor.handle, version: record.descriptor.version, queryId, captures, truncated: Boolean(result.truncated || (result.matches?.length ?? 0) > limit), processed: captures.length, errors: publicErrors(result.errors) }\n }\n\n async span(record: SnapshotRecord, scope: SnapshotScope, nodeHandle: string, maxChars = MAX_SPAN_CHARS): Promise<StructureSpanResult> {\n const handle = this.nodeHandles.get(nodeHandle)\n if (!handle || handle.snapshotHandle !== record.descriptor.handle || handle.scopeKey !== scopeIdentity(scope))\n throw new WebstackLspError('LSP_STALE_SNAPSHOT', 'node handle is stale or belongs to another owner')\n if (!Number.isSafeInteger(maxChars) || maxChars < 1 || maxChars > MAX_SPAN_CHARS)\n throw new WebstackLspError('LSP_STRUCTURE_LIMIT', `maxChars must be between 1 and ${MAX_SPAN_CHARS}`)\n const full = record.source.text.slice(handle.startIndex, handle.endIndex)\n const codePoints = Array.from(full)\n const truncated = codePoints.length > maxChars\n const text = codePoints.slice(0, maxChars).join('')\n if (Buffer.byteLength(text, 'utf8') > MAX_STRUCTURE_RESPONSE_BYTES) throw new WebstackLspError('LSP_STRUCTURE_LIMIT', 'span result exceeds the response byte limit')\n return { status: truncated ? 'partial' : 'ok', text, truncated, range: handle.range }\n }\n\n releaseSnapshot(handle: string): void {\n for (const [nodeHandle, node] of this.nodeHandles) if (node.snapshotHandle === handle) this.nodeHandles.delete(nodeHandle)\n this.snapshotOwners.delete(handle)\n this.workers.releaseSnapshot(handle)\n }\n\n releaseSnapshotForOwner(scope: SnapshotScope, handle: string): void {\n if (this.snapshotOwners.get(handle) === scopeIdentity(scope)) this.releaseSnapshot(handle)\n }\n\n snapshotForNode(scope: SnapshotScope, nodeHandle: string): string {\n const record = this.nodeHandles.get(nodeHandle)\n if (!record || record.scopeKey !== scopeIdentity(scope)) throw new WebstackLspError('LSP_STALE_SNAPSHOT', 'node handle is stale or belongs to another owner')\n return record.snapshotHandle\n }\n\n releaseOwner(scope: SnapshotScope): void {\n const owner = scopeIdentity(scope)\n for (const [nodeHandle, node] of this.nodeHandles) if (node.scopeKey === owner) this.nodeHandles.delete(nodeHandle)\n for (const [snapshotHandle, snapshotOwner] of this.snapshotOwners) {\n if (snapshotOwner === owner) this.releaseSnapshot(snapshotHandle)\n }\n }\n\n capabilities(): Array<{ language: StructureLanguage; extensions: string[]; available: boolean; abiVersion: number | null; lastError?: string }> {\n return [\n this.capability('javascript', ['.js', '.jsx', '.mjs', '.cjs'], 15),\n this.capability('typescript', ['.ts', '.mts', '.cts'], 14),\n this.capability('tsx', ['.tsx'], 14),\n ]\n }\n\n async dispose(): Promise<void> { this.nodeHandles.clear(); this.snapshotOwners.clear(); await this.workers.dispose() }\n\n private async runMatches(language: StructureLanguage, record: SnapshotRecord, queryId: string, limit: number, range?: { startIndex: number; endIndex: number }, signal?: AbortSignal) {\n const querySource = getRegisteredQuery(language, queryId)\n if (!querySource) throw new WebstackLspError('LSP_STRUCTURE_UNSUPPORTED', `query ${queryId} is not registered for ${language}`)\n return this.runWorker(language, { operation: 'matches', language, text: record.source.text, querySource, limit, snapshotHandle: record.descriptor.handle, ...(range ?? {}) }, signal)\n }\n\n private capability(language: StructureLanguage, extensions: string[], abiVersion: number) {\n const lastError = this.parserFailures.get(language)\n return { language, extensions, available: !lastError, abiVersion, ...(lastError ? { lastError } : {}) }\n }\n\n private async runWorker(language: StructureLanguage, request: Parameters<StructureWorkerPool['execute']>[0], signal?: AbortSignal) {\n try {\n const result = await this.workers.execute(request, signal)\n this.parserFailures.delete(language)\n return result\n } catch (error) {\n if (error instanceof WebstackLspError && ['LSP_STRUCTURE_TIMEOUT', 'LSP_STRUCTURE_UNAVAILABLE'].includes(error.code))\n this.parserFailures.set(language, error.message.slice(0, 128))\n throw error\n }\n }\n\n private outlineResult(record: SnapshotRecord, declarations: StructureNode[], result: Awaited<ReturnType<StructureWorkerPool['execute']>>): StructureOutlineResult {\n const truncated = Boolean(result.truncated || declarations.length > MAX_OUTLINE)\n const selected = declarations.slice(0, MAX_OUTLINE)\n const jsonBytes = Buffer.byteLength(JSON.stringify(selected), 'utf8')\n if (jsonBytes > MAX_STRUCTURE_RESPONSE_BYTES) throw new WebstackLspError('LSP_STRUCTURE_LIMIT', 'outline result exceeds the response byte limit')\n return { status: result.status, handle: record.descriptor.handle, version: record.descriptor.version, declarations: selected, truncated, processed: selected.length, errors: publicErrors(result.errors) }\n }\n\n private node(record: SnapshotRecord, scope: SnapshotScope, kind: string, startIndex: number, endIndex: number, name?: string, childCount?: number, coordinates = new Utf16Coordinates(record.source.text)): StructureNode {\n if (this.nodeHandles.size >= MAX_NODE_HANDLES) throw new WebstackLspError('LSP_SNAPSHOT_LIMIT', 'node handle capacity is full; release a snapshot and retry')\n const handle = randomUUID()\n const range = coordinates.indicesToRange(startIndex, endIndex)\n this.nodeHandles.set(handle, { scopeKey: scopeIdentity(scope), snapshotHandle: record.descriptor.handle, startIndex, endIndex, kind, range })\n return { handle, kind: publicNodeKind(kind), range, ...(name ? { name } : {}), ...(childCount === undefined ? {} : { childCount }) }\n }\n}\n\nfunction positiveLimit(value: number | undefined, maximum: number, label: string): number {\n const limit = value ?? maximum\n if (!Number.isSafeInteger(limit) || limit < 1 || limit > maximum) throw new WebstackLspError('LSP_STRUCTURE_LIMIT', `${label} must be between 1 and ${maximum}`)\n return limit\n}\n\nfunction publicErrors(errors: StructureErrorSummary): StructureErrorSummary { return { ...errors } }\n\nfunction publicNodeKind(kind: string): string {\n return ({ function_declaration: 'function', class_declaration: 'class', interface_declaration: 'interface', type_alias_declaration: 'type', enum_declaration: 'enum', method_definition: 'method', variable_declarator: 'variable' } as Record<string, string>)[kind] ?? kind\n}\n","import { WebstackLspError } from '../errors.js'\nimport { DocumentSnapshotStore } from './snapshots.js'\nimport type { SnapshotRecord } from './snapshots.js'\nimport { StructureEngine, MAX_CAPTURES, MAX_OUTLINE, MAX_SPAN_CHARS, MAX_STRUCTURE_RESPONSE_BYTES } from './engine.js'\nimport type { CodeIntelligenceCapabilities, CodeIntelligenceToolServiceV1, SemanticQuery, SemanticResult, SnapshotScope, StructureEnclosingResult, StructureOutlineResult, StructureQueryResult, StructureSpanResult } from './types.js'\nimport type { CompletionResult, DiagnosticsResult, NavigationResult } from '../service.js'\n\nexport interface CodeIntelligenceServiceOptions {\n snapshots: DocumentSnapshotStore\n semanticQuery(scope: SnapshotScope, snapshot: SnapshotRecord, request: SemanticQuery, signal: AbortSignal): Promise<CompletionResult | DiagnosticsResult | NavigationResult>\n}\n\nexport class CodeIntelligenceRuntime implements CodeIntelligenceToolServiceV1 {\n readonly version = 1 as const\n readonly snapshot: CodeIntelligenceToolServiceV1['snapshot']\n readonly structure: CodeIntelligenceToolServiceV1['structure']\n readonly semantic: CodeIntelligenceToolServiceV1['semantic']\n private readonly store: DocumentSnapshotStore\n private readonly engine: StructureEngine\n\n constructor(options: CodeIntelligenceServiceOptions) {\n this.store = options.snapshots\n this.engine = new StructureEngine()\n\n this.snapshot = {\n open: async (scope, filePath, signal) => {\n const record = await this.store.open(scope, filePath, signal)\n try {\n const parser = await this.engine.inspect(record, signal)\n await this.store.current(scope, record.descriptor.handle, signal)\n return { status: 'ok', ...record.descriptor, parserAvailable: parser.available, parseErrors: parser.parseErrors }\n } catch (error) {\n this.store.release(scope, record.descriptor.handle)\n this.engine.releaseSnapshot(record.descriptor.handle)\n throw error\n }\n },\n release: async (scope, handle) => {\n const released = this.store.release(scope, handle)\n if (released) this.engine.releaseSnapshot(handle)\n return { released }\n },\n }\n\n this.structure = {\n outline: (scope, handle, request, signal) => this.withSnapshot(scope, handle, signal, record => this.engine.outline(record, scope, request, signal)) as Promise<StructureOutlineResult>,\n enclosing: (scope, handle, position, request, signal) => this.withSnapshot(scope, handle, signal, record => this.engine.enclosing(record, scope, position, request?.kinds, signal)) as Promise<StructureEnclosingResult>,\n query: (scope, handle, queryId, request, signal) => this.withSnapshot(scope, handle, signal, record => this.engine.query(record, scope, queryId, request, signal)) as Promise<StructureQueryResult>,\n span: (scope, nodeHandle, maxChars, signal) => this.span(scope, nodeHandle, maxChars, signal),\n }\n\n this.semantic = {\n query: async (scope, handle, request, signal) => {\n validateSemanticQuery(request)\n return this.withSnapshot(scope, handle, signal, async record => {\n const raw = await options.semanticQuery(scope, record, request, signal ?? new AbortController().signal)\n await this.store.current(scope, handle, signal)\n const bounded = limitSemanticResult(raw, request.maxResults ?? 200)\n const truncated = 'truncated' in bounded && Boolean(bounded.truncated)\n const status = semanticIsPartial(bounded) || truncated ? 'partial' : 'ok'\n const value: SemanticResult = { status, operation: request.operation, result: bounded, ...(truncated ? { truncated: true, omitted: 'omitted' in bounded && typeof bounded.omitted === 'number' ? bounded.omitted : 0 } : {}) }\n if (Buffer.byteLength(JSON.stringify(value), 'utf8') > MAX_STRUCTURE_RESPONSE_BYTES)\n throw new WebstackLspError('LSP_STRUCTURE_LIMIT', 'semantic result exceeds the response byte limit')\n return value\n }) as Promise<SemanticResult>\n },\n }\n }\n\n capabilities(): CodeIntelligenceCapabilities {\n const parsers = this.engine.capabilities().map(parser => ({\n ...parser,\n runtimeAbi: { minimum: 13, current: 15 },\n }))\n return {\n version: 1,\n parsers,\n sourceKind: 'disk',\n overlay: 'unavailable',\n limits: {\n maxDocumentBytes: Math.min(this.store.documentByteLimit, 2 * 1024 * 1024),\n maxCaptures: MAX_CAPTURES,\n maxOutline: MAX_OUTLINE,\n maxSpanChars: MAX_SPAN_CHARS,\n maxResponseBytes: MAX_STRUCTURE_RESPONSE_BYTES,\n },\n incrementalParsing: true,\n }\n }\n\n async releaseOwner(scope: SnapshotScope): Promise<number> {\n this.engine.releaseOwner(scope)\n return this.store.releaseOwner(scope)\n }\n\n async dispose(): Promise<void> { this.store.clear(); await this.engine.dispose() }\n\n private async span(scope: SnapshotScope, nodeHandle: string, maxChars = MAX_SPAN_CHARS, signal?: AbortSignal): Promise<StructureSpanResult> {\n const snapshotHandle = this.engine.snapshotForNode(scope, nodeHandle)\n return this.withSnapshot(scope, snapshotHandle, signal, record => this.engine.span(record, scope, nodeHandle, maxChars)) as Promise<StructureSpanResult>\n }\n\n private async withSnapshot<T>(scope: SnapshotScope, handle: string, signal: AbortSignal | undefined, execute: (record: Awaited<ReturnType<DocumentSnapshotStore['current']>>) => Promise<T>): Promise<T> {\n let record: Awaited<ReturnType<DocumentSnapshotStore['current']>>\n try { record = await this.store.current(scope, handle, signal) }\n catch (error) {\n if (error instanceof WebstackLspError && error.code === 'LSP_STALE_SNAPSHOT') this.engine.releaseSnapshotForOwner(scope, handle)\n throw error\n }\n try {\n const result = await execute(record)\n await this.store.current(scope, handle, signal)\n return result\n } catch (error) {\n if (error instanceof WebstackLspError && error.code === 'LSP_STALE_SNAPSHOT') this.engine.releaseSnapshotForOwner(scope, handle)\n throw error\n }\n }\n\n}\n\nexport function createCodeIntelligenceToolServiceV1(options: CodeIntelligenceServiceOptions): CodeIntelligenceToolServiceV1 {\n return new CodeIntelligenceRuntime(options)\n}\n\nfunction validateSemanticQuery(request: SemanticQuery): void {\n if (!request || !['definition', 'references', 'implementation', 'hover', 'diagnostics', 'completion'].includes(request.operation))\n throw new WebstackLspError('LSP_UNSUPPORTED_OPERATION', 'semantic operation is not supported')\n if (request.operation !== 'diagnostics' && !request.position)\n throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'semantic position is required for this operation')\n if (request.position && (!Number.isSafeInteger(request.position.line) || !Number.isSafeInteger(request.position.character) || request.position.line < 0 || request.position.character < 0))\n throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'semantic position must be a zero-based UTF-16 position')\n if (request.servers && (!Array.isArray(request.servers) || request.servers.length > 6 || request.servers.some(server => typeof server !== 'string' || server.length > 64)))\n throw new WebstackLspError('LSP_WORKSPACE_REQUIRED', 'semantic server filter is invalid')\n if (request.maxResults !== undefined && (!Number.isSafeInteger(request.maxResults) || request.maxResults < 1 || request.maxResults > 200))\n throw new WebstackLspError('LSP_STRUCTURE_LIMIT', 'maxResults must be between 1 and 200')\n}\n\nfunction semanticIsPartial(result: CompletionResult | DiagnosticsResult | NavigationResult): boolean {\n if ('diagnostics' in result) return Boolean(result.omittedServers?.length || result.truncated)\n if ('items' in result) return Boolean(result.truncated)\n if (result.kind === 'locations') return Boolean(result.truncated)\n return false\n}\n\nfunction limitSemanticResult(result: CompletionResult | DiagnosticsResult | NavigationResult, limit: number): CompletionResult | DiagnosticsResult | NavigationResult {\n if ('items' in result) {\n if (result.items.length <= limit) return result\n return { ...result, items: result.items.slice(0, limit), truncated: { items: result.items.length - limit, characters: 0 } }\n }\n if ('diagnostics' in result) {\n if (result.diagnostics.length <= limit) return result\n return { ...result, diagnostics: result.diagnostics.slice(0, limit), truncated: { diagnostics: result.diagnostics.length - limit, characters: 0 } }\n }\n if (result.kind === 'locations' && result.locations.length > limit)\n return { ...result, locations: result.locations.slice(0, limit), truncated: true, omitted: result.locations.length - limit }\n return result\n}\n"],"mappings":";;;;;;AAMA,MAAa,kBAAkB,IAAI;AACnC,MAAa,yBAAyB;AACtC,MAAa,qBAAqB,KAAK,OAAO;AAC9C,MAAa,+BAA+B,IAAI,OAAO;AAevD,MAAMA,qBAAwD;CAC5D,OAAO;CAAc,QAAQ;CAAc,QAAQ;CAAc,QAAQ;CACzE,OAAO;CAAc,QAAQ;CAAc,QAAQ;CACnD,QAAQ;CACT;AAED,IAAa,wBAAb,MAAmC;CACjC,AAAiB,0BAAU,IAAI,KAA6B;CAC5D,AAAiB,2BAAW,IAAI,KAA4B;CAE5D,YAAY,AAAiBC,YAA4B,AAAiBC,kBAA0B;EAAvE;EAA6C;;CAE1E,MAAM,KAAK,OAAsB,UAAkB,QAA+C;AAChG,gBAAc,MAAM;EACpB,MAAM,iBAAiB,sBAAsB,SAAS;AACtD,UAAQ,gBAAgB;EACxB,MAAM,QAAQ,MAAM,KAAK,WAAW,MAAM,eAAe,gBAAgB,KAAK,IAAI,KAAK,kBAAkB,6BAA6B,EAAE,OAAO;AAC/I,UAAQ,gBAAgB;EACxB,MAAM,SAAS,MAAM,KAAK,WAAW,MAAM,eAAe,gBAAgB,KAAK,IAAI,KAAK,kBAAkB,6BAA6B,EAAE,OAAO;AAChJ,MAAI,SAAS,MAAM,KAAK,KAAK,SAAS,OAAO,KAAK,IAAI,MAAM,QAAQ,OAAO,OAAO,MAAM,QAAQ,OAAO,IACrG,OAAM,IAAI,iBAAiB,sBAAsB,8CAA8C;EAEjG,MAAM,WAAW,SAAS,MAAM;EAChC,MAAM,OAAO,SAAS,OAAO,KAAK;EAClC,MAAM,UAAU,KAAK,UAAU;GAAC;GAAU,OAAO;GAAK,OAAO;GAAI,CAAC;EAClE,MAAM,UAAU,KAAK,gBAAgB,SAAS,OAAO,KAAK;EAC1D,MAAM,cAAc,OAAO,WAAW,OAAO,MAAM,OAAO;AAC1D,OAAK,cAAc;AACnB,MAAI,KAAK,QAAQ,QAAQ,0BAA0B,KAAK,YAAY,GAAG,cAAc,mBACnF,OAAM,IAAI,iBAAiB,sBAAsB,oEAAoE;EAEvH,MAAMC,aAAiC;GACrC,QAAQ,YAAY;GAAE;GAAS,UAAU;GACzC,UAAU,gBAAgB,eAAe;GAAE,YAAY;GAAQ,aAAa;GAAM;GACnF;EACD,MAAM,WAAW,CAAC,GAAG,KAAK,QAAQ,QAAQ,CAAC,CACxC,QAAO,SAAQ,KAAK,aAAa,YAAY,KAAK,OAAO,QAAQ,OAAO,OAAO,KAAK,OAAO,QAAQ,OAAO,IAAI,CAC9G,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC;EAC3C,MAAMC,SAAyB;GAC7B;GAAY,UAAU;GAAU,QAAQ;GAAQ,UAAU,KAAK,KAAK;GAAE,YAAY,KAAK,KAAK;GAC5F,GAAI,WAAW,EAAE,wBAAwB,SAAS,WAAW,QAAQ,GAAG,EAAE;GAC3E;AACD,OAAK,QAAQ,IAAI,WAAW,QAAQ,OAAO;AAC3C,SAAO;;CAGT,MAAM,QAAQ,OAAsB,QAAgB,QAA+C;AACjG,gBAAc,MAAM;AACpB,UAAQ,gBAAgB;EACxB,MAAM,SAAS,KAAK,QAAQ,IAAI,OAAO;AACvC,MAAI,CAAC,UAAU,OAAO,aAAa,SAAS,MAAM,CAAE,OAAM,eAAe;AACzE,MAAI,KAAK,KAAK,GAAG,OAAO,WAAW,iBAAiB;AAClD,QAAK,QAAQ,OAAO,OAAO;AAC3B,SAAM,eAAe;;EAEvB,MAAM,UAAU,MAAM,KAAK,WAAW,MAAM,eAAe,OAAO,WAAW,UAAU,KAAK,IAAI,KAAK,kBAAkB,6BAA6B,EAAE,OAAO;AAC7J,UAAQ,gBAAgB;AACxB,MAAI,QAAQ,QAAQ,OAAO,OAAO,OAAO,QAAQ,QAAQ,OAAO,OAAO,OAAO,SAAS,QAAQ,KAAK,KAAK,OAAO,WAAW,aAAa;AACtI,QAAK,QAAQ,OAAO,OAAO;AAC3B,SAAM,eAAe;;AAEvB,SAAO,aAAa,KAAK,KAAK;AAC9B,SAAO;;CAGT,MAAM,UAAU,OAAsB,UAAkB,QAA2C;AACjG,gBAAc,MAAM;AACpB,UAAQ,gBAAgB;EACxB,MAAM,SAAS,MAAM,KAAK,WAAW,MAAM,eAAe,UAAU,KAAK,kBAAkB,OAAO;AAClG,UAAQ,gBAAgB;EACxB,MAAM,UAAU,KAAK,UAAU;GAAC,SAAS,MAAM;GAAE,OAAO;GAAK,OAAO;GAAI,CAAC;AACzE,OAAK,gBAAgB,SAAS,OAAO,SAAS,OAAO,KAAK,CAAC;AAC3D,SAAO;;CAGT,QAAQ,OAAsB,QAAyB;AACrD,gBAAc,MAAM;EACpB,MAAM,SAAS,KAAK,QAAQ,IAAI,OAAO;AACvC,MAAI,CAAC,UAAU,OAAO,aAAa,SAAS,MAAM,CAAE,QAAO;AAC3D,SAAO,KAAK,QAAQ,OAAO,OAAO;;CAGpC,aAAa,OAA8B;AACzC,gBAAc,MAAM;EACpB,MAAM,QAAQ,SAAS,MAAM;EAC7B,IAAI,WAAW;AACf,OAAK,MAAM,CAAC,QAAQ,WAAW,KAAK,QAClC,KAAI,OAAO,aAAa,OAAO;AAAE,QAAK,QAAQ,OAAO,OAAO;AAAE;;AAEhE,OAAK,MAAM,CAAC,KAAK,YAAY,KAAK,SAAU,KAAI,QAAQ,aAAa,MAAO,MAAK,SAAS,OAAO,IAAI;AACrG,SAAO;;CAGT,QAAc;AAAE,OAAK,QAAQ,OAAO;AAAE,OAAK,SAAS,OAAO;;CAC3D,IAAI,OAAe;AAAE,SAAO,KAAK,QAAQ;;CACzC,IAAI,oBAA4B;AAAE,SAAO,KAAK;;CAE9C,AAAQ,aAAqB;EAC3B,IAAI,QAAQ;AACZ,OAAK,MAAM,UAAU,KAAK,QAAQ,QAAQ,CAAE,UAAS,OAAO,WAAW;AACvE,SAAO;;CAGT,AAAQ,gBAAgB,SAAiB,OAAsB,MAAsB;EACnF,MAAM,QAAQ,SAAS,MAAM,EAAE,WAAW,KAAK,SAAS,IAAI,QAAQ;EACpE,MAAM,UAAU,WAAY,SAAS,SAAS,OAAO,SAAS,UAAU,SAAS,UAAU,IAAK;AAChG,OAAK,SAAS,OAAO,QAAQ;AAC7B,OAAK,SAAS,IAAI,SAAS;GAAE;GAAM;GAAS,UAAU;GAAO,CAAC;AAC9D,SAAO,KAAK,SAAS,OAAO,KAAM,MAAK,SAAS,OAAO,KAAK,SAAS,MAAM,CAAC,MAAM,CAAC,MAAO;AAC1F,SAAO;;CAGT,AAAQ,eAAqB;EAC3B,MAAM,MAAM,KAAK,KAAK;AACtB,OAAK,MAAM,CAAC,QAAQ,WAAW,KAAK,QAAS,KAAI,MAAM,OAAO,WAAW,gBAAiB,MAAK,QAAQ,OAAO,OAAO;;;AAIzH,SAAgB,gBAAgB,UAA4C;CAC1E,MAAM,SAAS,SAAS,MAAM,SAAS,YAAY,IAAI,CAAC,CAAC,aAAa;AACtE,QAAO,mBAAmB,WAAW;;AAGvC,SAAgB,cAAc,OAA4B;AACxD,KAAI,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,SAAS,MAAM,IAAI,CAAC,MAAM,WAAW,MAAM,IAAI,CAAC,MAAM,eAAe,MAAM,IAAI,CAAC,WAAW,MAAM,cAAc,IAAI,yBAAyB,KAAK,GAAG,MAAM,UAAU,MAAM,YAAY,MAAM,gBAAgB,CAC5P,OAAM,IAAI,iBAAiB,0BAA0B,kEAAkE;;AAG3H,SAAgB,sBAAsB,UAA0B;AAC9D,KAAI,OAAO,aAAa,YAAY,CAAC,SAAS,MAAM,IAAI,SAAS,SAAS,QAAQ,yBAAyB,KAAK,SAAS,IAAI,WAAW,SAAS,CAC/I,OAAM,IAAI,iBAAiB,0BAA0B,8CAA8C;CACrG,MAAM,WAAW,SAAS,WAAW,MAAM,IAAI,CAAC,MAAM,IAAI;AAC1D,KAAI,SAAS,MAAK,YAAW,YAAY,QAAQ,YAAY,GAAG,CAAE,OAAM,IAAI,iBAAiB,0BAA0B,wCAAwC;AAC/J,QAAO,SAAS,QAAO,YAAW,YAAY,IAAI,CAAC,KAAK,IAAI;;AAG9D,SAAgB,cAAc,OAA8B;AAAE,QAAO,KAAK,UAAU;EAAC,MAAM;EAAS,MAAM;EAAW,MAAM;EAAc,CAAC;;AAC1I,SAAS,SAAS,OAA8B;AAAE,QAAO,cAAc,MAAM;;AAC7E,SAAS,SAAS,MAAsB;AAAE,QAAO,WAAW,SAAS,CAAC,OAAO,MAAM,OAAO,CAAC,OAAO,MAAM;;AACxG,SAAS,gBAAkC;AAAE,QAAO,IAAI,iBAAiB,sBAAsB,yDAAyD;;;;;;AC9JxJ,IAAa,mBAAb,MAA8B;CAC5B,AAAiB;CAEjB,YAAY,AAAiBC,MAAc;EAAd;AAC3B,OAAK,QAAQ,EAAE;EACf,IAAI,QAAQ;AACZ,OAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,SAAS;GACxC,MAAM,OAAO,KAAK;AAClB,OAAI,SAAS,QAAQ,SAAS,MAAM;AAAE;AAAS;;AAC/C,QAAK,MAAM,KAAK;IAAE;IAAO,KAAK;IAAO,CAAC;AACtC,OAAI,SAAS,QAAQ,KAAK,QAAQ,OAAO,KAAM;AAC/C;AACA,WAAQ;;AAEV,OAAK,MAAM,KAAK;GAAE;GAAO,KAAK,KAAK;GAAQ,CAAC;;CAG9C,gBAAgB,UAA+B;AAC7C,MAAI,CAAC,WAAW,SAAS,CAAE,OAAM,IAAI,WAAW,+DAA+D;EAC/G,MAAM,OAAO,KAAK,MAAM,SAAS;AACjC,MAAI,CAAC,QAAQ,SAAS,YAAY,KAAK,MAAM,KAAK,MAAO,OAAM,IAAI,WAAW,+BAA+B;EAC7G,MAAM,QAAQ,KAAK,QAAQ,SAAS;AACpC,MAAI,uBAAuB,KAAK,MAAM,MAAM,CAAE,OAAM,IAAI,WAAW,0CAA0C;AAC7G,SAAO;;CAGT,gBAAgB,OAA4B;AAC1C,MAAI,CAAC,OAAO,cAAc,MAAM,IAAI,QAAQ,KAAK,QAAQ,KAAK,KAAK,OAAQ,OAAM,IAAI,WAAW,wCAAwC;EACxI,IAAI,MAAM,GAAG,OAAO,KAAK,MAAM;AAC/B,SAAO,MAAM,MAAM;GACjB,MAAM,SAAU,MAAM,SAAU;AAChC,OAAI,KAAK,MAAM,QAAS,SAAS,MAAO,OAAM,SAAS;OAClD,QAAO;;EAEd,MAAM,aAAa,KAAK,IAAI,GAAG,MAAM,EAAE;EACvC,MAAM,OAAO,KAAK,MAAM;AACxB,SAAO;GAAE,MAAM;GAAY,WAAW,KAAK,IAAI,OAAO,KAAK,IAAI,GAAG,KAAK;GAAO;;CAGhF,eAAe,OAA2D;EACxE,MAAM,aAAa,KAAK,gBAAgB,MAAM,MAAM;EACpD,MAAM,WAAW,KAAK,gBAAgB,MAAM,IAAI;AAChD,MAAI,WAAW,WAAY,OAAM,IAAI,WAAW,iCAAiC;AACjF,SAAO;GAAE;GAAY;GAAU;;CAGjC,eAAe,YAAoB,UAA4B;AAC7D,MAAI,WAAW,WAAY,OAAM,IAAI,WAAW,iCAAiC;AACjF,SAAO;GAAE,OAAO,KAAK,gBAAgB,WAAW;GAAE,KAAK,KAAK,gBAAgB,SAAS;GAAE;;;AAI3F,SAAS,WAAW,OAAsC;AACxD,KAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;CACxD,MAAM,WAAW;AACjB,QAAO,OAAO,cAAc,SAAS,KAAK,IAAI,OAAO,cAAc,SAAS,UAAU,IAAK,SAAS,QAAmB,KAAM,SAAS,aAAwB;;AAGhK,SAAS,uBAAuB,MAAc,OAAwB;AACpE,KAAI,SAAS,KAAK,SAAS,KAAK,OAAQ,QAAO;CAC/C,MAAM,WAAW,KAAK,WAAW,QAAQ,EAAE,EAAE,OAAO,KAAK,WAAW,MAAM;AAC1E,QAAO,YAAY,SAAU,YAAY,SAAU,QAAQ,SAAU,QAAQ;;;;;AChE/E,MAAM,eAAe;CACnB,YAAY;EACV;EACA;EACA;EACA;EACD;CACD,YAAY;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,KAAK;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACF;AAED,MAAM,UAAU;CACd,YAAY,CAAC,8BAA8B,6BAA6B;CACxE,YAAY,CAAC,8BAA8B,6BAA6B;CACxE,KAAK,CAAC,8BAA8B,6BAA6B;CAClE;AAED,MAAM,QAAQ;CACZ,YAAY,CAAC,kDAAkD;CAC/D,YAAY,CAAC,kDAAkD;CAC/D,KAAK,CAAC,kDAAkD;CACzD;AAID,SAAgB,mBAAmB,UAA6B,SAAqC;AAEnG,SADiB,YAAY,iBAAiB,aAAa,YAAY,YAAY,UAAU,MAAM,YAAY,YAAY,YAAY,QAAQ,YAAY,SAC1I,KAAK,KAAK;;AAG7B,SAAgB,oBAAoB,OAA2C;AAC7E,QAAO,UAAU,kBAAkB,UAAU,WAAW,UAAU;;;;;ACMpE,MAAM,cAAc;AACpB,MAAM,YAAY;AAClB,MAAM,oBAAoB;AAC1B,MAAM,mBAAmB;;AAGzB,IAAa,sBAAb,MAAiC;CAC/B,AAAiB,wBAAQ,IAAI,KAAiB;CAC9C,AAAiB,QAAuB,EAAE;CAC1C,AAAQ,WAAW;CAEnB,QAAQ,SAAiC,QAAsD;AAC7F,MAAI,KAAK,SAAU,QAAO,QAAQ,OAAO,IAAI,iBAAiB,gBAAgB,oCAAoC,CAAC;AACnH,MAAI,QAAQ,QAAS,QAAO,QAAQ,OAAO,YAAY,CAAC;AACxD,MAAI,KAAK,MAAM,UAAU,UAAW,QAAO,QAAQ,OAAO,IAAI,iBAAiB,sBAAsB,iCAAiC,CAAC;AACvI,SAAO,IAAI,SAAS,WAAS,WAAW;GACtC,MAAMC,OAAoB;IAAE,IAAI,YAAY;IAAE;IAAS,GAAI,SAAS,EAAE,QAAQ,GAAG,EAAE;IAAG;IAAS;IAAQ;AACvG,OAAI,QAAQ;IACV,MAAM,cAAc;KAClB,MAAM,QAAQ,KAAK,MAAM,QAAQ,KAAK;AACtC,SAAI,SAAS,GAAG;AAAE,WAAK,MAAM,OAAO,OAAO,EAAE;AAAE,WAAK,WAAW,MAAM,YAAY,CAAC;YAC7E;MACH,MAAM,OAAO,CAAC,GAAG,KAAK,MAAM,CAAC,MAAK,cAAa,UAAU,YAAY,KAAK;AAC1E,UAAI,KAAM,CAAK,KAAK,OAAO,MAAM,YAAY,CAAC;;;AAGlD,WAAO,iBAAiB,SAAS,OAAO,EAAE,MAAM,MAAM,CAAC;AACvD,SAAK,oBAAoB,OAAO,oBAAoB,SAAS,MAAM;;AAErE,QAAK,MAAM,KAAK,KAAK;AACrB,QAAK,MAAM;IACX;;CAGJ,MAAM,UAAyB;AAC7B,OAAK,WAAW;AAChB,OAAK,MAAM,QAAQ,KAAK,MAAM,OAAO,EAAE,CAAE,MAAK,WAAW,MAAM,IAAI,iBAAiB,gBAAgB,oCAAoC,CAAC;AACzI,QAAM,QAAQ,IAAI,CAAC,GAAG,KAAK,MAAM,CAAC,KAAI,SAAQ,KAAK,OAAO,MAAM,IAAI,iBAAiB,gBAAgB,oCAAoC,CAAC,CAAC,CAAC;;CAG9I,gBAAgB,gBAA8B;AAC5C,OAAK,MAAM,QAAQ,KAAK,MACtB,KAAI,CAAC,KAAK,OACR,KAAI;AAAE,QAAK,OAAO,YAAY,EAAE,uBAAuB,gBAAgB,CAAC;UAClE;AAAE,GAAK,KAAK,OAAO,MAAM,IAAI,iBAAiB,6BAA6B,uDAAuD,CAAC;;;CAK/I,IAAI,SAAiB;AAAE,SAAO,KAAK,MAAM;;CACzC,IAAI,SAAiB;AAAE,SAAO,CAAC,GAAG,KAAK,MAAM,CAAC,QAAO,SAAQ,KAAK,YAAY,OAAU,CAAC;;CAEzF,AAAQ,OAAa;AACnB,MAAI,KAAK,SAAU;AACnB,SAAO,KAAK,MAAM,QAAQ;GACxB,IAAI,OAAO,CAAC,GAAG,KAAK,MAAM,CAAC,MAAK,cAAa,CAAC,UAAU,WAAW,CAAC,UAAU,OAAO;AACrF,OAAI,CAAC,QAAQ,KAAK,MAAM,OAAO,YAAa,QAAO,KAAK,cAAc;AACtE,OAAI,CAAC,KAAM;GACX,MAAM,OAAO,KAAK,MAAM,OAAO;AAC/B,OAAI,KAAK,QAAQ,SAAS;AAAE,SAAK,WAAW,MAAM,YAAY,CAAC;AAAE;;AACjE,QAAK,UAAU;AACf,QAAK,QAAQ,iBAAiB;AAAE,IAAK,KAAK,OAAO,MAAO,IAAI,iBAAiB,yBAAyB,4CAA4C,CAAC;MAAI,iBAAiB;AACxK,OAAI;AAAE,SAAK,OAAO,YAAY;KAAE,IAAI,KAAK;KAAI,GAAG,KAAK;KAAS,CAAC;YACxD,OAAO;AAAE,IAAK,KAAK,OAAO,MAAM,MAAM;;;;CAIjD,AAAQ,eAA2B;EACjC,MAAM,SAAS,IAAI,OAAO,IAAI,IAAI,uBAAuB,OAAO,KAAK,IAAI,CAAC;EAC1E,MAAMC,OAAmB;GAAE;GAAQ,SAAS;GAAW,WAAW;GAAG,QAAQ;GAAO;AACpF,OAAK,MAAM,IAAI,KAAK;AACpB,SAAO,GAAG,YAAY,UAAuB;AAC3C,OAAI,CAAC,KAAK,WAAW,MAAM,OAAO,KAAK,QAAQ,IAAI;AAAE,IAAK,KAAK,OAAO,MAAM,IAAI,iBAAiB,0BAA0B,wDAAwD,CAAC;AAAE;;GACtL,MAAM,OAAO,KAAK;AAClB,QAAK,UAAU;AACf,QAAK;AACL,OAAI,CAAC,MAAM,MAAM,CAAC,MAAM,MAAO,MAAK,WAAW,MAAM,IAAI,iBAAiB,6BAA6B,MAAM,SAAS,2BAA2B,CAAC;OAC7I,MAAK,WAAW,MAAM,QAAW,MAAM,MAAM;AAClD,OAAI,KAAK,aAAa,kBAAmB,CAAK,KAAK,OAAO,KAAK;AAC/D,QAAK,MAAM;IACX;AACF,SAAO,GAAG,UAAS,UAAS;AAAE,GAAK,KAAK,OAAO,MAAM,MAAM;IAAG;AAC9D,SAAO,GAAG,SAAQ,SAAQ;AACxB,OAAI,KAAK,MAAM,IAAI,KAAK,IAAI,CAAC,KAAK,OAAQ,CAAK,KAAK,OAAO,MAAM,SAAS,IAAI,SAAY,IAAI,iBAAiB,6BAA6B,4BAA4B,KAAK,GAAG,CAAC;IACjL;AACF,SAAO;;CAGT,MAAc,OAAO,MAAkB,OAAgC;AACrE,MAAI,KAAK,OAAQ;AACjB,OAAK,SAAS;AACd,OAAK,MAAM,OAAO,KAAK;EACvB,MAAM,OAAO,KAAK;AAClB,OAAK,UAAU;AACf,MAAI,KAAM,MAAK,WAAW,MAAM,SAAS,IAAI,iBAAiB,6BAA6B,iCAAiC,CAAC;AAC7H,QAAM,KAAK,OAAO,WAAW,CAAC,YAAY,EAAE;AAC5C,OAAK,MAAM;;CAGb,AAAQ,WAAW,MAAmB,OAAiB,OAAqC;AAC1F,MAAI,KAAK,MAAO,cAAa,KAAK,MAAM;AACxC,OAAK,eAAe;AACpB,MAAI,UAAU,OAAW,MAAK,OAAO,MAAM;MACtC,MAAK,QAAQ,MAAO;;;AAI7B,SAAS,aAA2B;AAAE,QAAO,IAAI,aAAa,6BAA6B,aAAa;;;;;AC1JxG,MAAa,eAAe;AAC5B,MAAa,cAAc;AAC3B,MAAa,iBAAiB;AAC9B,MAAa,+BAA+B,KAAK;AACjD,MAAM,mBAAmB;AAWzB,IAAa,kBAAb,MAA6B;CAC3B,AAAiB,8BAAc,IAAI,KAA+B;CAClE,AAAiB,iCAAiB,IAAI,KAAqB;CAC3D,AAAiB,iCAAiB,IAAI,KAAgC;CACtE,YAAY,AAAiB,UAAU,IAAI,qBAAqB,EAAE;EAArC;;CAE7B,MAAM,QAAQ,QAAwB,QAA8F;AAClI,OAAK,eAAe,IAAI,OAAO,WAAW,QAAQ,OAAO,SAAS;EAClE,MAAM,WAAW,OAAO,WAAW;AACnC,MAAI,CAAC,SAAU,QAAO;GAAE,WAAW;GAAO,aAAa;GAAO,QAAQ;GAAmB;AACzF,MAAI;GACF,MAAM,SAAS,MAAM,KAAK,UAAU,UAAU;IAAE,WAAW;IAAW;IAAU,MAAM,OAAO,OAAO;IAAM,aAAa;IAAI,OAAO;IAAG,gBAAgB,OAAO,WAAW;IAAQ,GAAI,OAAO,yBAAyB,EAAE,wBAAwB,OAAO,wBAAwB,GAAG,EAAE;IAAG,EAAE,OAAO;AAC7R,QAAK,eAAe,OAAO,SAAS;AACpC,UAAO;IAAE,WAAW;IAAM,aAAa,OAAO,OAAO;IAAU;WACxD,OAAO;AAEd,UAAO;IAAE,WAAW;IAAO,aAAa;IAAO,QADhC,iBAAiB,QAAQ,MAAM,QAAQ,MAAM,GAAG,IAAI,GAAG;IACf;;;CAI3D,MAAM,QAAQ,QAAwB,OAAsB,UAA8D,EAAE,EAAE,QAAuD;EACnL,MAAM,WAAW,OAAO,WAAW;AACnC,MAAI,CAAC,SAAU,QAAO;GAAE,QAAQ;GAAe,QAAQ,OAAO,WAAW;GAAQ,SAAS,OAAO,WAAW;GAAS,cAAc,EAAE;GAAE,WAAW;GAAO,WAAW;GAAG,QAAQ;IAAE,UAAU;IAAO,YAAY;IAAG,cAAc;IAAG,WAAW;IAAO;GAAE;EACtP,MAAM,QAAQ,cAAc,QAAQ,OAAO,aAAa,gBAAgB;EACxE,MAAM,cAAc,IAAI,iBAAiB,OAAO,OAAO,KAAK;EAC5D,MAAM,QAAQ,QAAQ,QAAQ,YAAY,eAAe,QAAQ,MAAM,GAAG;EAC1E,MAAM,SAAS,MAAM,KAAK,WAAW,UAAU,QAAQ,gBAAgB,OAAO,OAAO,OAAO;EAC5F,MAAMC,iBAAgC,EAAE;AACxC,OAAK,MAAM,SAAS,OAAO,WAAW,EAAE,EAAE;GACxC,MAAM,cAAc,MAAM,SAAS,MAAK,YAAW,QAAQ,SAAS,cAAc;GAClF,MAAM,cAAc,MAAM,SAAS,MAAK,YAAW,QAAQ,SAAS,OAAO;AAC3E,OAAI,CAAC,YAAa;GAClB,MAAM,OAAO,KAAK,KAAK,QAAQ,OAAO,YAAY,MAAM,YAAY,YAAY,YAAY,UAAU,cAAc,OAAO,OAAO,KAAK,MAAM,YAAY,YAAY,YAAY,SAAS,CAAC,MAAM,GAAG,IAAI,GAAG,QAAW,YAAY,YAAY,YAAY;AAC1P,kBAAa,KAAK,KAAK;;AAEzB,SAAO,KAAK,cAAc,QAAQC,gBAAc,OAAO;;CAGzD,MAAM,UAAU,QAAwB,OAAsB,UAA+C,OAAkB,QAAyD;EACtL,MAAM,WAAW,OAAO,WAAW;AACnC,MAAI,CAAC,SAAU,QAAO;GAAE,QAAQ;GAAe,QAAQ,OAAO,WAAW;GAAQ,SAAS,OAAO,WAAW;GAAS,WAAW,EAAE;GAAE;EACpI,MAAM,cAAc,IAAI,iBAAiB,OAAO,OAAO,KAAK;EAC5D,MAAM,QAAQ,YAAY,gBAAgB,SAAS;AACnD,MAAI,UAAU,CAAC,MAAM,QAAQ,MAAM,IAAI,MAAM,SAAS,MAAM,MAAM,MAAK,SAAQ,OAAO,SAAS,YAAY,KAAK,SAAS,OAAO,CAAC,qBAAqB,KAAK,KAAK,CAAC,EAC/J,OAAM,IAAI,iBAAiB,uBAAuB,qDAAqD;EACzG,MAAM,SAAS,MAAM,KAAK,UAAU,UAAU;GAAE,WAAW;GAAa;GAAU,MAAM,OAAO,OAAO;GAAM,aAAa;GAAI,OAAO;GAAI,gBAAgB,OAAO,WAAW;GAAQ;GAAO,GAAI,QAAQ,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE;GAAG,EAAE,OAAO;EAG3O,MAAM,CAAC,MAAM,GAAG,cAFF,OAAO,SAAS,EAAE,EACR,KAAI,SAAQ,KAAK,KAAK,QAAQ,OAAO,KAAK,MAAM,KAAK,YAAY,KAAK,UAAU,QAAW,KAAK,YAAY,YAAY,CAAC;AAEjJ,SAAO;GAAE,QAAQ,OAAO;GAAQ,QAAQ,OAAO,WAAW;GAAQ,SAAS,OAAO,WAAW;GAAS,GAAI,OAAO,EAAE,MAAM,GAAG,EAAE;GAAG;GAAW,QAAQ,aAAa,OAAO,OAAO;GAAE;;CAGnL,MAAM,MAAM,QAAwB,OAAsB,SAAiB,UAA8D,EAAE,EAAE,QAAqD;EAChM,MAAM,WAAW,OAAO,WAAW;AACnC,MAAI,CAAC,SAAU,OAAM,IAAI,iBAAiB,6BAA6B,gEAAgE;AACvI,MAAI,CAAC,oBAAoB,QAAQ,CAAE,OAAM,IAAI,iBAAiB,6BAA6B,mDAAmD;EAC9I,MAAM,QAAQ,cAAc,QAAQ,OAAO,cAAc,gBAAgB;EACzE,MAAM,cAAc,IAAI,iBAAiB,OAAO,OAAO,KAAK;EAC5D,MAAM,QAAQ,QAAQ,QAAQ,YAAY,eAAe,QAAQ,MAAM,GAAG;EAC1E,MAAM,SAAS,MAAM,KAAK,WAAW,UAAU,QAAQ,SAAS,OAAO,OAAO,OAAO;EACrF,MAAMC,WAA+B,EAAE;AACvC,cAAa,MAAK,MAAM,SAAS,OAAO,WAAW,EAAE,CAAE,MAAK,MAAM,WAAW,MAAM,UAAU;GAC3F,MAAM,OAAO,KAAK,KAAK,QAAQ,OAAO,QAAQ,MAAM,QAAQ,YAAY,QAAQ,UAAU,QAAW,QAAQ,YAAY,YAAY;AACrI,YAAS,KAAK;IAAE,SAAS,QAAQ;IAAM,MAAM,QAAQ;IAAM,OAAO,KAAK;IAAO,YAAY,KAAK;IAAQ,GAAI,QAAQ,SAAS,SAAS,EAAE,MAAM,OAAO,OAAO,KAAK,MAAM,QAAQ,YAAY,QAAQ,SAAS,CAAC,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE;IAAG,CAAC;AACpO,OAAI,SAAS,UAAU,MAAO,OAAM;;AAEtC,MAAI,OAAO,WAAW,KAAK,UAAU,SAAS,EAAE,OAAO,GAAG,6BAA8B,OAAM,IAAI,iBAAiB,uBAAuB,+CAA+C;AACzL,SAAO;GAAE,QAAQ,OAAO;GAAQ,QAAQ,OAAO,WAAW;GAAQ,SAAS,OAAO,WAAW;GAAS;GAAS;GAAU,WAAW,QAAQ,OAAO,cAAc,OAAO,SAAS,UAAU,KAAK,MAAM;GAAE,WAAW,SAAS;GAAQ,QAAQ,aAAa,OAAO,OAAO;GAAE;;CAG3Q,MAAM,KAAK,QAAwB,OAAsB,YAAoB,WAAW,gBAA8C;EACpI,MAAM,SAAS,KAAK,YAAY,IAAI,WAAW;AAC/C,MAAI,CAAC,UAAU,OAAO,mBAAmB,OAAO,WAAW,UAAU,OAAO,aAAa,cAAc,MAAM,CAC3G,OAAM,IAAI,iBAAiB,sBAAsB,mDAAmD;AACtG,MAAI,CAAC,OAAO,cAAc,SAAS,IAAI,WAAW,KAAK,WAAW,eAChE,OAAM,IAAI,iBAAiB,uBAAuB,kCAAkC,iBAAiB;EACvG,MAAM,OAAO,OAAO,OAAO,KAAK,MAAM,OAAO,YAAY,OAAO,SAAS;EACzE,MAAM,aAAa,MAAM,KAAK,KAAK;EACnC,MAAM,YAAY,WAAW,SAAS;EACtC,MAAM,OAAO,WAAW,MAAM,GAAG,SAAS,CAAC,KAAK,GAAG;AACnD,MAAI,OAAO,WAAW,MAAM,OAAO,GAAG,6BAA8B,OAAM,IAAI,iBAAiB,uBAAuB,8CAA8C;AACpK,SAAO;GAAE,QAAQ,YAAY,YAAY;GAAM;GAAM;GAAW,OAAO,OAAO;GAAO;;CAGvF,gBAAgB,QAAsB;AACpC,OAAK,MAAM,CAAC,YAAY,SAAS,KAAK,YAAa,KAAI,KAAK,mBAAmB,OAAQ,MAAK,YAAY,OAAO,WAAW;AAC1H,OAAK,eAAe,OAAO,OAAO;AAClC,OAAK,QAAQ,gBAAgB,OAAO;;CAGtC,wBAAwB,OAAsB,QAAsB;AAClE,MAAI,KAAK,eAAe,IAAI,OAAO,KAAK,cAAc,MAAM,CAAE,MAAK,gBAAgB,OAAO;;CAG5F,gBAAgB,OAAsB,YAA4B;EAChE,MAAM,SAAS,KAAK,YAAY,IAAI,WAAW;AAC/C,MAAI,CAAC,UAAU,OAAO,aAAa,cAAc,MAAM,CAAE,OAAM,IAAI,iBAAiB,sBAAsB,mDAAmD;AAC7J,SAAO,OAAO;;CAGhB,aAAa,OAA4B;EACvC,MAAM,QAAQ,cAAc,MAAM;AAClC,OAAK,MAAM,CAAC,YAAY,SAAS,KAAK,YAAa,KAAI,KAAK,aAAa,MAAO,MAAK,YAAY,OAAO,WAAW;AACnH,OAAK,MAAM,CAAC,gBAAgB,kBAAkB,KAAK,eACjD,KAAI,kBAAkB,MAAO,MAAK,gBAAgB,eAAe;;CAIrE,eAAgJ;AAC9I,SAAO;GACL,KAAK,WAAW,cAAc;IAAC;IAAO;IAAQ;IAAQ;IAAO,EAAE,GAAG;GAClE,KAAK,WAAW,cAAc;IAAC;IAAO;IAAQ;IAAO,EAAE,GAAG;GAC1D,KAAK,WAAW,OAAO,CAAC,OAAO,EAAE,GAAG;GACrC;;CAGH,MAAM,UAAyB;AAAE,OAAK,YAAY,OAAO;AAAE,OAAK,eAAe,OAAO;AAAE,QAAM,KAAK,QAAQ,SAAS;;CAEpH,MAAc,WAAW,UAA6B,QAAwB,SAAiB,OAAe,OAAkD,QAAsB;EACpL,MAAM,cAAc,mBAAmB,UAAU,QAAQ;AACzD,MAAI,CAAC,YAAa,OAAM,IAAI,iBAAiB,6BAA6B,SAAS,QAAQ,yBAAyB,WAAW;AAC/H,SAAO,KAAK,UAAU,UAAU;GAAE,WAAW;GAAW;GAAU,MAAM,OAAO,OAAO;GAAM;GAAa;GAAO,gBAAgB,OAAO,WAAW;GAAQ,GAAI,SAAS,EAAE;GAAG,EAAE,OAAO;;CAGvL,AAAQ,WAAW,UAA6B,YAAsB,YAAoB;EACxF,MAAM,YAAY,KAAK,eAAe,IAAI,SAAS;AACnD,SAAO;GAAE;GAAU;GAAY,WAAW,CAAC;GAAW;GAAY,GAAI,YAAY,EAAE,WAAW,GAAG,EAAE;GAAG;;CAGzG,MAAc,UAAU,UAA6B,SAAwD,QAAsB;AACjI,MAAI;GACF,MAAM,SAAS,MAAM,KAAK,QAAQ,QAAQ,SAAS,OAAO;AAC1D,QAAK,eAAe,OAAO,SAAS;AACpC,UAAO;WACA,OAAO;AACd,OAAI,iBAAiB,oBAAoB,CAAC,yBAAyB,4BAA4B,CAAC,SAAS,MAAM,KAAK,CAClH,MAAK,eAAe,IAAI,UAAU,MAAM,QAAQ,MAAM,GAAG,IAAI,CAAC;AAChE,SAAM;;;CAIV,AAAQ,cAAc,QAAwB,gBAA+B,QAAqF;EAChK,MAAM,YAAY,QAAQ,OAAO,aAAaD,eAAa,SAAS,YAAY;EAChF,MAAM,WAAWA,eAAa,MAAM,GAAG,YAAY;AAEnD,MADkB,OAAO,WAAW,KAAK,UAAU,SAAS,EAAE,OAAO,GACrD,6BAA8B,OAAM,IAAI,iBAAiB,uBAAuB,iDAAiD;AACjJ,SAAO;GAAE,QAAQ,OAAO;GAAQ,QAAQ,OAAO,WAAW;GAAQ,SAAS,OAAO,WAAW;GAAS,cAAc;GAAU;GAAW,WAAW,SAAS;GAAQ,QAAQ,aAAa,OAAO,OAAO;GAAE;;CAG5M,AAAQ,KAAK,QAAwB,OAAsB,MAAc,YAAoB,UAAkB,MAAe,YAAqB,cAAc,IAAI,iBAAiB,OAAO,OAAO,KAAK,EAAiB;AACxN,MAAI,KAAK,YAAY,QAAQ,iBAAkB,OAAM,IAAI,iBAAiB,sBAAsB,6DAA6D;EAC7J,MAAM,SAAS,YAAY;EAC3B,MAAM,QAAQ,YAAY,eAAe,YAAY,SAAS;AAC9D,OAAK,YAAY,IAAI,QAAQ;GAAE,UAAU,cAAc,MAAM;GAAE,gBAAgB,OAAO,WAAW;GAAQ;GAAY;GAAU;GAAM;GAAO,CAAC;AAC7I,SAAO;GAAE;GAAQ,MAAM,eAAe,KAAK;GAAE;GAAO,GAAI,OAAO,EAAE,MAAM,GAAG,EAAE;GAAG,GAAI,eAAe,SAAY,EAAE,GAAG,EAAE,YAAY;GAAG;;;AAIxI,SAAS,cAAc,OAA2B,SAAiB,OAAuB;CACxF,MAAM,QAAQ,SAAS;AACvB,KAAI,CAAC,OAAO,cAAc,MAAM,IAAI,QAAQ,KAAK,QAAQ,QAAS,OAAM,IAAI,iBAAiB,uBAAuB,GAAG,MAAM,yBAAyB,UAAU;AAChK,QAAO;;AAGT,SAAS,aAAa,QAAsD;AAAE,QAAO,EAAE,GAAG,QAAQ;;AAElG,SAAS,eAAe,MAAsB;AAC5C,QAAQ;EAAE,sBAAsB;EAAY,mBAAmB;EAAS,uBAAuB;EAAa,wBAAwB;EAAQ,kBAAkB;EAAQ,mBAAmB;EAAU,qBAAqB;EAAY,CAA4B,SAAS;;;;;AClL3Q,IAAa,0BAAb,MAA8E;CAC5E,AAAS,UAAU;CACnB,AAAS;CACT,AAAS;CACT,AAAS;CACT,AAAiB;CACjB,AAAiB;CAEjB,YAAY,SAAyC;AACnD,OAAK,QAAQ,QAAQ;AACrB,OAAK,SAAS,IAAI,iBAAiB;AAEnC,OAAK,WAAW;GACd,MAAM,OAAO,OAAO,UAAU,WAAW;IACvC,MAAM,SAAS,MAAM,KAAK,MAAM,KAAK,OAAO,UAAU,OAAO;AAC7D,QAAI;KACF,MAAM,SAAS,MAAM,KAAK,OAAO,QAAQ,QAAQ,OAAO;AACxD,WAAM,KAAK,MAAM,QAAQ,OAAO,OAAO,WAAW,QAAQ,OAAO;AACjE,YAAO;MAAE,QAAQ;MAAM,GAAG,OAAO;MAAY,iBAAiB,OAAO;MAAW,aAAa,OAAO;MAAa;aAC1G,OAAO;AACd,UAAK,MAAM,QAAQ,OAAO,OAAO,WAAW,OAAO;AACnD,UAAK,OAAO,gBAAgB,OAAO,WAAW,OAAO;AACrD,WAAM;;;GAGV,SAAS,OAAO,OAAO,WAAW;IAChC,MAAM,WAAW,KAAK,MAAM,QAAQ,OAAO,OAAO;AAClD,QAAI,SAAU,MAAK,OAAO,gBAAgB,OAAO;AACjD,WAAO,EAAE,UAAU;;GAEtB;AAED,OAAK,YAAY;GACf,UAAU,OAAO,QAAQ,SAAS,WAAW,KAAK,aAAa,OAAO,QAAQ,SAAQ,WAAU,KAAK,OAAO,QAAQ,QAAQ,OAAO,SAAS,OAAO,CAAC;GACpJ,YAAY,OAAO,QAAQ,UAAU,SAAS,WAAW,KAAK,aAAa,OAAO,QAAQ,SAAQ,WAAU,KAAK,OAAO,UAAU,QAAQ,OAAO,UAAU,SAAS,OAAO,OAAO,CAAC;GACnL,QAAQ,OAAO,QAAQ,SAAS,SAAS,WAAW,KAAK,aAAa,OAAO,QAAQ,SAAQ,WAAU,KAAK,OAAO,MAAM,QAAQ,OAAO,SAAS,SAAS,OAAO,CAAC;GAClK,OAAO,OAAO,YAAY,UAAU,WAAW,KAAK,KAAK,OAAO,YAAY,UAAU,OAAO;GAC9F;AAED,OAAK,WAAW,EACd,OAAO,OAAO,OAAO,QAAQ,SAAS,WAAW;AAC/C,yBAAsB,QAAQ;AAC9B,UAAO,KAAK,aAAa,OAAO,QAAQ,QAAQ,OAAM,WAAU;IAC9D,MAAM,MAAM,MAAM,QAAQ,cAAc,OAAO,QAAQ,SAAS,UAAU,IAAI,iBAAiB,CAAC,OAAO;AACvG,UAAM,KAAK,MAAM,QAAQ,OAAO,QAAQ,OAAO;IAC/C,MAAM,UAAU,oBAAoB,KAAK,QAAQ,cAAc,IAAI;IACnE,MAAM,YAAY,eAAe,WAAW,QAAQ,QAAQ,UAAU;IAEtE,MAAME,QAAwB;KAAE,QADjB,kBAAkB,QAAQ,IAAI,YAAY,YAAY;KAC7B,WAAW,QAAQ;KAAW,QAAQ;KAAS,GAAI,YAAY;MAAE,WAAW;MAAM,SAAS,aAAa,WAAW,OAAO,QAAQ,YAAY,WAAW,QAAQ,UAAU;MAAG,GAAG,EAAE;KAAG;AAC9N,QAAI,OAAO,WAAW,KAAK,UAAU,MAAM,EAAE,OAAO,GAAG,6BACrD,OAAM,IAAI,iBAAiB,uBAAuB,kDAAkD;AACtG,WAAO;KACP;KAEL;;CAGH,eAA6C;AAK3C,SAAO;GACL,SAAS;GACT,SANc,KAAK,OAAO,cAAc,CAAC,KAAI,YAAW;IACxD,GAAG;IACH,YAAY;KAAE,SAAS;KAAI,SAAS;KAAI;IACzC,EAAE;GAID,YAAY;GACZ,SAAS;GACT,QAAQ;IACN,kBAAkB,KAAK,IAAI,KAAK,MAAM,mBAAmB,IAAI,OAAO,KAAK;IACzE,aAAa;IACb,YAAY;IACZ,cAAc;IACd,kBAAkB;IACnB;GACD,oBAAoB;GACrB;;CAGH,MAAM,aAAa,OAAuC;AACxD,OAAK,OAAO,aAAa,MAAM;AAC/B,SAAO,KAAK,MAAM,aAAa,MAAM;;CAGvC,MAAM,UAAyB;AAAE,OAAK,MAAM,OAAO;AAAE,QAAM,KAAK,OAAO,SAAS;;CAEhF,MAAc,KAAK,OAAsB,YAAoB,WAAW,gBAAgB,QAAoD;EAC1I,MAAM,iBAAiB,KAAK,OAAO,gBAAgB,OAAO,WAAW;AACrE,SAAO,KAAK,aAAa,OAAO,gBAAgB,SAAQ,WAAU,KAAK,OAAO,KAAK,QAAQ,OAAO,YAAY,SAAS,CAAC;;CAG1H,MAAc,aAAgB,OAAsB,QAAgB,QAAiC,SAAoG;EACvM,IAAIC;AACJ,MAAI;AAAE,YAAS,MAAM,KAAK,MAAM,QAAQ,OAAO,QAAQ,OAAO;WACvD,OAAO;AACZ,OAAI,iBAAiB,oBAAoB,MAAM,SAAS,qBAAsB,MAAK,OAAO,wBAAwB,OAAO,OAAO;AAChI,SAAM;;AAER,MAAI;GACF,MAAM,SAAS,MAAM,QAAQ,OAAO;AACpC,SAAM,KAAK,MAAM,QAAQ,OAAO,QAAQ,OAAO;AAC/C,UAAO;WACA,OAAO;AACd,OAAI,iBAAiB,oBAAoB,MAAM,SAAS,qBAAsB,MAAK,OAAO,wBAAwB,OAAO,OAAO;AAChI,SAAM;;;;AAMZ,SAAgB,oCAAoC,SAAwE;AAC1H,QAAO,IAAI,wBAAwB,QAAQ;;AAG7C,SAAS,sBAAsB,SAA8B;AAC3D,KAAI,CAAC,WAAW,CAAC;EAAC;EAAc;EAAc;EAAkB;EAAS;EAAe;EAAa,CAAC,SAAS,QAAQ,UAAU,CAC/H,OAAM,IAAI,iBAAiB,6BAA6B,sCAAsC;AAChG,KAAI,QAAQ,cAAc,iBAAiB,CAAC,QAAQ,SAClD,OAAM,IAAI,iBAAiB,0BAA0B,mDAAmD;AAC1G,KAAI,QAAQ,aAAa,CAAC,OAAO,cAAc,QAAQ,SAAS,KAAK,IAAI,CAAC,OAAO,cAAc,QAAQ,SAAS,UAAU,IAAI,QAAQ,SAAS,OAAO,KAAK,QAAQ,SAAS,YAAY,GACtL,OAAM,IAAI,iBAAiB,0BAA0B,yDAAyD;AAChH,KAAI,QAAQ,YAAY,CAAC,MAAM,QAAQ,QAAQ,QAAQ,IAAI,QAAQ,QAAQ,SAAS,KAAK,QAAQ,QAAQ,MAAK,WAAU,OAAO,WAAW,YAAY,OAAO,SAAS,GAAG,EACvK,OAAM,IAAI,iBAAiB,0BAA0B,oCAAoC;AAC3F,KAAI,QAAQ,eAAe,WAAc,CAAC,OAAO,cAAc,QAAQ,WAAW,IAAI,QAAQ,aAAa,KAAK,QAAQ,aAAa,KACnI,OAAM,IAAI,iBAAiB,uBAAuB,uCAAuC;;AAG7F,SAAS,kBAAkB,QAA0E;AACnG,KAAI,iBAAiB,OAAQ,QAAO,QAAQ,OAAO,gBAAgB,UAAU,OAAO,UAAU;AAC9F,KAAI,WAAW,OAAQ,QAAO,QAAQ,OAAO,UAAU;AACvD,KAAI,OAAO,SAAS,YAAa,QAAO,QAAQ,OAAO,UAAU;AACjE,QAAO;;AAGT,SAAS,oBAAoB,QAAiE,OAAwE;AACpK,KAAI,WAAW,QAAQ;AACrB,MAAI,OAAO,MAAM,UAAU,MAAO,QAAO;AACzC,SAAO;GAAE,GAAG;GAAQ,OAAO,OAAO,MAAM,MAAM,GAAG,MAAM;GAAE,WAAW;IAAE,OAAO,OAAO,MAAM,SAAS;IAAO,YAAY;IAAG;GAAE;;AAE7H,KAAI,iBAAiB,QAAQ;AAC3B,MAAI,OAAO,YAAY,UAAU,MAAO,QAAO;AAC/C,SAAO;GAAE,GAAG;GAAQ,aAAa,OAAO,YAAY,MAAM,GAAG,MAAM;GAAE,WAAW;IAAE,aAAa,OAAO,YAAY,SAAS;IAAO,YAAY;IAAG;GAAE;;AAErJ,KAAI,OAAO,SAAS,eAAe,OAAO,UAAU,SAAS,MAC3D,QAAO;EAAE,GAAG;EAAQ,WAAW,OAAO,UAAU,MAAM,GAAG,MAAM;EAAE,WAAW;EAAM,SAAS,OAAO,UAAU,SAAS;EAAO;AAC9H,QAAO"}
|