pybao-cli 1.3.86 → 1.3.88
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/dist/REPL-ORTTZIHU.js +47 -0
- package/dist/{acp-HZUGOVHE.js → acp-N5LUMCFW.js} +29 -29
- package/dist/{agentsValidate-O7HQSJAA.js → agentsValidate-WU4DXFHE.js} +7 -7
- package/dist/{ask-PI5RK5UV.js → ask-DW3ZOE75.js} +28 -28
- package/dist/{autoUpdater-VMLAPV65.js → autoUpdater-KPSUPSW2.js} +3 -3
- package/dist/{chunk-MNAVHXSW.js → chunk-3VLZYTZF.js} +3 -3
- package/dist/{chunk-OLZLEJQ6.js → chunk-474VRNOS.js} +3 -3
- package/dist/{chunk-S4CSO2ZH.js → chunk-6563LX5Q.js} +4 -4
- package/dist/{chunk-ARPANTL5.js → chunk-6NN7AYG5.js} +1035 -87
- package/dist/chunk-6NN7AYG5.js.map +7 -0
- package/dist/{chunk-NPB2GG6W.js → chunk-7VIXLUAA.js} +1 -1
- package/dist/{chunk-GQQLSBYO.js → chunk-A33NVFXN.js} +3 -3
- package/dist/{chunk-LSR2E3UK.js → chunk-AKWG66R7.js} +2 -2
- package/dist/{chunk-YO4DT6YI.js → chunk-ALGAURMU.js} +2 -2
- package/dist/{chunk-DXCSQJBL.js → chunk-B3FVUMDX.js} +2 -2
- package/dist/{chunk-3HDF767A.js → chunk-BSX2GZFE.js} +2 -2
- package/dist/{chunk-XTZG3RFQ.js → chunk-E7KPOGEP.js} +208 -16
- package/dist/chunk-E7KPOGEP.js.map +7 -0
- package/dist/{chunk-RZB3QGK6.js → chunk-FAZTRK5X.js} +3 -3
- package/dist/{chunk-XHAFEGQ4.js → chunk-IKZIBMB2.js} +1 -1
- package/dist/{chunk-TPDQPJ6C.js → chunk-JGBEZWTT.js} +2 -2
- package/dist/{chunk-UF7NCSRO.js → chunk-JWBNA7JZ.js} +16 -16
- package/dist/{chunk-JLQQYGR3.js → chunk-K63HFXPF.js} +1 -1
- package/dist/{chunk-MNLKFR45.js → chunk-KHYPI3CQ.js} +1 -1
- package/dist/{chunk-YV7IG5XX.js → chunk-LUTA67LS.js} +1 -1
- package/dist/{chunk-DSILT3OP.js → chunk-MV23FSF3.js} +1 -1
- package/dist/{chunk-DSILT3OP.js.map → chunk-MV23FSF3.js.map} +1 -1
- package/dist/{chunk-NIKYII4N.js → chunk-NDMBTSPF.js} +2 -2
- package/dist/{chunk-NBCFJBBX.js → chunk-NZ4EJPCM.js} +1 -1
- package/dist/{chunk-Q53PYUIA.js → chunk-OK54YOWI.js} +89 -40
- package/dist/{chunk-Q53PYUIA.js.map → chunk-OK54YOWI.js.map} +2 -2
- package/dist/{chunk-H4AQENXV.js → chunk-PAQMFEWF.js} +4 -4
- package/dist/{chunk-SIEX5WPV.js → chunk-PEJHTEHF.js} +2 -2
- package/dist/{chunk-TKDXONVW.js → chunk-PV5Z5CYP.js} +1 -1
- package/dist/{chunk-ZBVG3UAU.js → chunk-RNFV47CH.js} +3 -3
- package/dist/{chunk-UEU4FXHS.js → chunk-RRMDKSTY.js} +1 -1
- package/dist/{chunk-26JCV35N.js → chunk-SIK2ANWJ.js} +3 -3
- package/dist/{chunk-MHA6SEN4.js → chunk-TD6X22GV.js} +3 -3
- package/dist/{chunk-63AZKM53.js → chunk-XJWHLOEL.js} +1 -1
- package/dist/{cli-5PLJTPHW.js → cli-HVWWEAL7.js} +87 -87
- package/dist/commands-CHRAM5WS.js +51 -0
- package/dist/{config-SHEWOPFK.js → config-Y4MVDPA6.js} +4 -4
- package/dist/{context-LL2UPKAI.js → context-UQPJORNF.js} +5 -5
- package/dist/{customCommands-35Z3QFJ7.js → customCommands-YWYGEKU4.js} +4 -4
- package/dist/{env-NQFQMCTK.js → env-F6OX4C6F.js} +2 -2
- package/dist/{file-KM744MET.js → file-AHNZVEQN.js} +4 -4
- package/dist/index.js +3 -3
- package/dist/{llm-VLOERBXP.js → llm-EW2YTCZ5.js} +29 -29
- package/dist/{llmLazy-RBH7MNLY.js → llmLazy-5BNSJLTE.js} +1 -1
- package/dist/{loader-7WST3AYZ.js → loader-PLP3P26N.js} +4 -4
- package/dist/lsp-NWJUFY4J.js +33 -0
- package/dist/{lspAnchor-DZZU6UQ6.js → lspAnchor-DUHDQOTT.js} +6 -6
- package/dist/{mcp-X7RYSZ6L.js → mcp-EYRRKW6Y.js} +7 -7
- package/dist/{mentionProcessor-ROLDGNA5.js → mentionProcessor-2SM3E3MP.js} +5 -5
- package/dist/{messages-UJS72R2W.js → messages-S5JHQ3PM.js} +1 -1
- package/dist/{model-V7H3W6Y7.js → model-7TNEREQL.js} +5 -5
- package/dist/{openai-KGZKMMS6.js → openai-BOA5DJUN.js} +5 -5
- package/dist/{outputStyles-7RUAZ6BO.js → outputStyles-TVAV6JFM.js} +4 -4
- package/dist/{pluginRuntime-UZ55REAW.js → pluginRuntime-SPIXKVXE.js} +6 -6
- package/dist/{pluginValidation-GTXVXBWB.js → pluginValidation-IMP6FT66.js} +6 -6
- package/dist/prompts-GQLHTZEX.js +53 -0
- package/dist/{pybAgentSessionLoad-4JMXEYFZ.js → pybAgentSessionLoad-R55QBFO6.js} +4 -4
- package/dist/{pybAgentSessionResume-BO24O2NE.js → pybAgentSessionResume-NWYYW7YR.js} +4 -4
- package/dist/{pybAgentStreamJsonSession-ZPRBH4EV.js → pybAgentStreamJsonSession-LNJMEFT7.js} +1 -1
- package/dist/{pybHooks-2PL5ZVBP.js → pybHooks-PAVO67PL.js} +4 -4
- package/dist/query-DG4EGQYV.js +55 -0
- package/dist/{registry-6M7CIUP6.js → registry-34E5OJNF.js} +11 -5
- package/dist/{ripgrep-GC4KZFGD.js → ripgrep-KHBNZP7Y.js} +3 -3
- package/dist/{skillMarketplace-TCNFPAN3.js → skillMarketplace-WKEXF2PI.js} +3 -3
- package/dist/{state-64M4LRYH.js → state-E757NA7C.js} +2 -2
- package/dist/{theme-KNA2WSIO.js → theme-KZNXBKP2.js} +5 -5
- package/dist/{toolPermissionSettings-HIIWLCI7.js → toolPermissionSettings-FYVFSFBN.js} +6 -6
- package/dist/tools-XM6GAEJL.js +52 -0
- package/dist/{userInput-LB5SZ6IS.js → userInput-ROFICTJI.js} +30 -30
- package/package.json +1 -1
- package/dist/REPL-QBOTHGXR.js +0 -47
- package/dist/chunk-ARPANTL5.js.map +0 -7
- package/dist/chunk-XTZG3RFQ.js.map +0 -7
- package/dist/commands-B2WZOGHH.js +0 -51
- package/dist/lsp-OXNZT5ZE.js +0 -17
- package/dist/prompts-4VTBEFY3.js +0 -53
- package/dist/query-YHFKIZJZ.js +0 -55
- package/dist/tools-TIELMHQI.js +0 -52
- /package/dist/{REPL-QBOTHGXR.js.map → REPL-ORTTZIHU.js.map} +0 -0
- /package/dist/{acp-HZUGOVHE.js.map → acp-N5LUMCFW.js.map} +0 -0
- /package/dist/{agentsValidate-O7HQSJAA.js.map → agentsValidate-WU4DXFHE.js.map} +0 -0
- /package/dist/{ask-PI5RK5UV.js.map → ask-DW3ZOE75.js.map} +0 -0
- /package/dist/{autoUpdater-VMLAPV65.js.map → autoUpdater-KPSUPSW2.js.map} +0 -0
- /package/dist/{chunk-MNAVHXSW.js.map → chunk-3VLZYTZF.js.map} +0 -0
- /package/dist/{chunk-OLZLEJQ6.js.map → chunk-474VRNOS.js.map} +0 -0
- /package/dist/{chunk-S4CSO2ZH.js.map → chunk-6563LX5Q.js.map} +0 -0
- /package/dist/{chunk-NPB2GG6W.js.map → chunk-7VIXLUAA.js.map} +0 -0
- /package/dist/{chunk-GQQLSBYO.js.map → chunk-A33NVFXN.js.map} +0 -0
- /package/dist/{chunk-LSR2E3UK.js.map → chunk-AKWG66R7.js.map} +0 -0
- /package/dist/{chunk-YO4DT6YI.js.map → chunk-ALGAURMU.js.map} +0 -0
- /package/dist/{chunk-DXCSQJBL.js.map → chunk-B3FVUMDX.js.map} +0 -0
- /package/dist/{chunk-3HDF767A.js.map → chunk-BSX2GZFE.js.map} +0 -0
- /package/dist/{chunk-RZB3QGK6.js.map → chunk-FAZTRK5X.js.map} +0 -0
- /package/dist/{chunk-XHAFEGQ4.js.map → chunk-IKZIBMB2.js.map} +0 -0
- /package/dist/{chunk-TPDQPJ6C.js.map → chunk-JGBEZWTT.js.map} +0 -0
- /package/dist/{chunk-UF7NCSRO.js.map → chunk-JWBNA7JZ.js.map} +0 -0
- /package/dist/{chunk-JLQQYGR3.js.map → chunk-K63HFXPF.js.map} +0 -0
- /package/dist/{chunk-MNLKFR45.js.map → chunk-KHYPI3CQ.js.map} +0 -0
- /package/dist/{chunk-YV7IG5XX.js.map → chunk-LUTA67LS.js.map} +0 -0
- /package/dist/{chunk-NIKYII4N.js.map → chunk-NDMBTSPF.js.map} +0 -0
- /package/dist/{chunk-NBCFJBBX.js.map → chunk-NZ4EJPCM.js.map} +0 -0
- /package/dist/{chunk-H4AQENXV.js.map → chunk-PAQMFEWF.js.map} +0 -0
- /package/dist/{chunk-SIEX5WPV.js.map → chunk-PEJHTEHF.js.map} +0 -0
- /package/dist/{chunk-TKDXONVW.js.map → chunk-PV5Z5CYP.js.map} +0 -0
- /package/dist/{chunk-ZBVG3UAU.js.map → chunk-RNFV47CH.js.map} +0 -0
- /package/dist/{chunk-UEU4FXHS.js.map → chunk-RRMDKSTY.js.map} +0 -0
- /package/dist/{chunk-26JCV35N.js.map → chunk-SIK2ANWJ.js.map} +0 -0
- /package/dist/{chunk-MHA6SEN4.js.map → chunk-TD6X22GV.js.map} +0 -0
- /package/dist/{chunk-63AZKM53.js.map → chunk-XJWHLOEL.js.map} +0 -0
- /package/dist/{cli-5PLJTPHW.js.map → cli-HVWWEAL7.js.map} +0 -0
- /package/dist/{commands-B2WZOGHH.js.map → commands-CHRAM5WS.js.map} +0 -0
- /package/dist/{config-SHEWOPFK.js.map → config-Y4MVDPA6.js.map} +0 -0
- /package/dist/{context-LL2UPKAI.js.map → context-UQPJORNF.js.map} +0 -0
- /package/dist/{customCommands-35Z3QFJ7.js.map → customCommands-YWYGEKU4.js.map} +0 -0
- /package/dist/{env-NQFQMCTK.js.map → env-F6OX4C6F.js.map} +0 -0
- /package/dist/{file-KM744MET.js.map → file-AHNZVEQN.js.map} +0 -0
- /package/dist/{llm-VLOERBXP.js.map → llm-EW2YTCZ5.js.map} +0 -0
- /package/dist/{llmLazy-RBH7MNLY.js.map → llmLazy-5BNSJLTE.js.map} +0 -0
- /package/dist/{loader-7WST3AYZ.js.map → loader-PLP3P26N.js.map} +0 -0
- /package/dist/{lsp-OXNZT5ZE.js.map → lsp-NWJUFY4J.js.map} +0 -0
- /package/dist/{lspAnchor-DZZU6UQ6.js.map → lspAnchor-DUHDQOTT.js.map} +0 -0
- /package/dist/{mcp-X7RYSZ6L.js.map → mcp-EYRRKW6Y.js.map} +0 -0
- /package/dist/{mentionProcessor-ROLDGNA5.js.map → mentionProcessor-2SM3E3MP.js.map} +0 -0
- /package/dist/{messages-UJS72R2W.js.map → messages-S5JHQ3PM.js.map} +0 -0
- /package/dist/{model-V7H3W6Y7.js.map → model-7TNEREQL.js.map} +0 -0
- /package/dist/{openai-KGZKMMS6.js.map → openai-BOA5DJUN.js.map} +0 -0
- /package/dist/{outputStyles-7RUAZ6BO.js.map → outputStyles-TVAV6JFM.js.map} +0 -0
- /package/dist/{pluginRuntime-UZ55REAW.js.map → pluginRuntime-SPIXKVXE.js.map} +0 -0
- /package/dist/{pluginValidation-GTXVXBWB.js.map → pluginValidation-IMP6FT66.js.map} +0 -0
- /package/dist/{prompts-4VTBEFY3.js.map → prompts-GQLHTZEX.js.map} +0 -0
- /package/dist/{pybAgentSessionLoad-4JMXEYFZ.js.map → pybAgentSessionLoad-R55QBFO6.js.map} +0 -0
- /package/dist/{pybAgentSessionResume-BO24O2NE.js.map → pybAgentSessionResume-NWYYW7YR.js.map} +0 -0
- /package/dist/{pybAgentStreamJsonSession-ZPRBH4EV.js.map → pybAgentStreamJsonSession-LNJMEFT7.js.map} +0 -0
- /package/dist/{pybHooks-2PL5ZVBP.js.map → pybHooks-PAVO67PL.js.map} +0 -0
- /package/dist/{query-YHFKIZJZ.js.map → query-DG4EGQYV.js.map} +0 -0
- /package/dist/{registry-6M7CIUP6.js.map → registry-34E5OJNF.js.map} +0 -0
- /package/dist/{ripgrep-GC4KZFGD.js.map → ripgrep-KHBNZP7Y.js.map} +0 -0
- /package/dist/{skillMarketplace-TCNFPAN3.js.map → skillMarketplace-WKEXF2PI.js.map} +0 -0
- /package/dist/{state-64M4LRYH.js.map → state-E757NA7C.js.map} +0 -0
- /package/dist/{theme-KNA2WSIO.js.map → theme-KZNXBKP2.js.map} +0 -0
- /package/dist/{toolPermissionSettings-HIIWLCI7.js.map → toolPermissionSettings-FYVFSFBN.js.map} +0 -0
- /package/dist/{tools-TIELMHQI.js.map → tools-XM6GAEJL.js.map} +0 -0
- /package/dist/{userInput-LB5SZ6IS.js.map → userInput-ROFICTJI.js.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/lsp/index.ts", "../src/tools/search/LspTool/client/generic.ts", "../src/tools/search/LspTool/client/manager.ts", "../src/tools/search/LspTool/client/formatters.ts", "../src/lsp/formatters.ts", "../src/utils/tree-sitter/registry.ts", "../src/utils/tree-sitter/loader.ts", "../src/utils/tree-sitter/lsp-adapter.ts", "../src/utils/tree-sitter/scope-analyzer.ts"],
|
|
4
|
-
"sourcesContent": ["import { extname } from 'path'\nimport { pathToFileURL } from 'url'\nimport { readFile } from 'fs/promises'\nimport * as http from 'http'\nimport { getCwd } from '@utils/state'\nimport { LspClientManager } from '../tools/search/LspTool/client/manager'\nimport { LspServerRegistry } from '../tools/search/LspTool/registry'\nimport type { LspResult } from '../tools/search/LspTool/client/formatters'\nimport {\n formatGenericDefinitionResult,\n formatGenericReferencesResult,\n formatGenericHoverResult,\n formatGenericDocumentSymbolResult,\n formatGenericDiagnosticsResult,\n formatGenericCallHierarchyItemsResult,\n formatGenericIncomingCallsResult,\n formatGenericOutgoingCallsResult,\n} from '../tools/search/LspTool/client/formatters'\nimport { formatDiagnosticsPretty } from './formatters'\nimport { TreeSitterLspAdapter } from '@utils/tree-sitter/lsp-adapter'\nimport { ParserRegistry } from '@utils/tree-sitter/registry'\nimport { ScopeAnalyzer } from '@utils/tree-sitter/scope-analyzer'\n\ntype Operation =\n | 'goToDefinition'\n | 'findReferences'\n | 'hover'\n | 'documentSymbol'\n | 'workspaceSymbol'\n | 'goToImplementation'\n | 'prepareCallHierarchy'\n | 'incomingCalls'\n | 'outgoingCalls'\n | 'diagnostics'\n\ntype RunInput = {\n operation: Operation\n filePath: string\n line?: number\n character?: number\n query?: string\n waitForDiagnostics?: boolean\n timeoutMs?: number\n rootPath?: string\n}\n\ntype TouchOptions = {\n wait?: boolean\n timeoutMs?: number\n rootPath?: string\n}\n\nfunction getLanguageId(ext: string): string {\n return LspServerRegistry.getInstance().getLanguageIdForExtension(ext)\n}\n\nfunction normalizeUri(filePath: string): string {\n let uri = pathToFileURL(filePath).href\n if (process.platform === 'win32') {\n uri = uri.replace(/^file:\\/\\/\\/([a-zA-Z]):\\//, (_match, drive) => {\n return `file:///${drive.toLowerCase()}%3A/`\n })\n }\n return uri\n}\n\ntype FacadeOperation = Operation | 'getScope'\n\ntype FacadeRunInput = Omit<RunInput, 'operation'> & {\n operation: FacadeOperation\n}\n\nfunction formatTreeSitterSymbols(symbols: any[], depth = 0): string {\n let text = ''\n const indent = ' '.repeat(depth)\n for (const s of symbols) {\n text += `${indent}- ${s.name} (${s.kind}) [Ln ${s.range.start.line + 1}]\\n`\n if (s.children && s.children.length > 0) {\n text += formatTreeSitterSymbols(s.children, depth + 1)\n }\n }\n return text\n}\n\nfunction formatTreeSitterDocumentSymbolResult(symbols: any[]): LspResult {\n const formatted =\n symbols.length > 0\n ? `Document symbols:\\n${formatTreeSitterSymbols(symbols)}`\n : 'No symbols found.'\n return {\n formatted,\n resultCount: symbols.length,\n fileCount: symbols.length > 0 ? 1 : 0,\n }\n}\n\nfunction normalizeWorkspaceSymbol(sym: any) {\n if (!sym || typeof sym !== 'object') return null\n const range = sym.range ?? sym.location?.range\n if (!range || !sym.name) return null\n const uri = sym.uri ?? sym.location?.uri\n return { ...sym, range, uri }\n}\n\nfunction sortWorkspaceSymbols(symbols: any[]): any[] {\n return [...symbols].sort((a, b) => {\n const nameA = String(a?.name ?? '').toLowerCase()\n const nameB = String(b?.name ?? '').toLowerCase()\n if (nameA !== nameB) return nameA.localeCompare(nameB)\n const uriA = String(a?.uri ?? a?.location?.uri ?? '')\n const uriB = String(b?.uri ?? b?.location?.uri ?? '')\n if (uriA !== uriB) return uriA.localeCompare(uriB)\n const lineA = a?.range?.start?.line ?? a?.location?.range?.start?.line ?? 0\n const lineB = b?.range?.start?.line ?? b?.location?.range?.start?.line ?? 0\n if (lineA !== lineB) return lineA - lineB\n const charA = a?.range?.start?.character ?? a?.location?.range?.start?.character ?? 0\n const charB = b?.range?.start?.character ?? b?.location?.range?.start?.character ?? 0\n return charA - charB\n })\n}\n\ntype StatusServer = http.Server & { port: number }\n\nfunction serveStatusWithProvider(\n statusProvider: () => unknown,\n options?: {\n host?: string\n port?: number\n path?: string\n allowCors?: boolean\n },\n): StatusServer {\n const host = options?.host ?? '127.0.0.1'\n const port = typeof options?.port === 'number' ? options.port : 7337\n const path = options?.path ?? '/lsp/status'\n const allowCors = options?.allowCors ?? true\n const corsHeaders = allowCors\n ? {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET,OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type',\n }\n : {}\n\n const server = http.createServer((req, res) => {\n const method = req.method ?? 'GET'\n const url = new URL(req.url ?? '/', `http://${host}`)\n if (url.pathname !== path) {\n res.writeHead(404, corsHeaders)\n res.end('Not Found')\n return\n }\n if (method === 'OPTIONS') {\n res.writeHead(204, corsHeaders)\n res.end()\n return\n }\n if (method !== 'GET') {\n res.writeHead(405, corsHeaders)\n res.end('Method Not Allowed')\n return\n }\n const status = statusProvider()\n res.writeHead(200, { 'Content-Type': 'application/json', ...corsHeaders })\n res.end(JSON.stringify(status, null, 2))\n })\n ;(server as StatusServer).port = port\n server.listen(port, host)\n return server as StatusServer\n}\n\nexport const LspAPI = {\n async run(input: RunInput): Promise<LspResult> {\n const rootPath = input.rootPath ?? getCwd()\n const client = await LspClientManager.getInstance().getClient(\n input.filePath,\n rootPath,\n )\n\n if (client) {\n try {\n switch (input.operation) {\n case 'goToDefinition': {\n if (input.line === undefined || input.character === undefined) {\n return {\n formatted: 'Error performing goToDefinition: Missing line/character',\n resultCount: 0,\n fileCount: 0,\n }\n }\n const result = await client.goToDefinition(\n input.filePath,\n input.line,\n input.character,\n )\n return formatGenericDefinitionResult(result)\n }\n case 'findReferences': {\n if (input.line === undefined || input.character === undefined) {\n return {\n formatted: 'Error performing findReferences: Missing line/character',\n resultCount: 0,\n fileCount: 0,\n }\n }\n const result = await client.findReferences(\n input.filePath,\n input.line,\n input.character,\n )\n return formatGenericReferencesResult(result)\n }\n case 'hover': {\n if (input.line === undefined || input.character === undefined) {\n return {\n formatted: 'Error performing hover: Missing line/character',\n resultCount: 0,\n fileCount: 0,\n }\n }\n const result = await client.hover(\n input.filePath,\n input.line,\n input.character,\n )\n return formatGenericHoverResult(result, input.line, input.character)\n }\n case 'documentSymbol': {\n const result = await client.documentSymbol(input.filePath)\n return formatGenericDocumentSymbolResult(result)\n }\n case 'workspaceSymbol': {\n const query = input.query ?? input.filePath\n const results = await LspClientManager.getInstance().workspaceSymbol(\n query,\n rootPath,\n )\n return formatGenericDocumentSymbolResult(results)\n }\n case 'goToImplementation': {\n if (input.line === undefined || input.character === undefined) {\n return {\n formatted: 'Error performing goToImplementation: Missing line/character',\n resultCount: 0,\n fileCount: 0,\n }\n }\n const result = await client.goToImplementation(\n input.filePath,\n input.line,\n input.character,\n )\n return formatGenericDefinitionResult(result)\n }\n case 'prepareCallHierarchy': {\n if (input.line === undefined || input.character === undefined) {\n return {\n formatted: 'Error performing prepareCallHierarchy: Missing line/character',\n resultCount: 0,\n fileCount: 0,\n }\n }\n const result = await client.prepareCallHierarchy(\n input.filePath,\n input.line,\n input.character,\n )\n return formatGenericCallHierarchyItemsResult(\n Array.isArray(result) ? result : [],\n )\n }\n case 'incomingCalls': {\n if (input.line === undefined || input.character === undefined) {\n return {\n formatted: 'Error performing incomingCalls: Missing line/character',\n resultCount: 0,\n fileCount: 0,\n }\n }\n const items = await client.prepareCallHierarchy(\n input.filePath,\n input.line,\n input.character,\n )\n const callResults = await Promise.all(\n (Array.isArray(items) ? items : []).map(item =>\n client.incomingCalls(item),\n ),\n )\n const calls = callResults.flat().filter(Boolean)\n return formatGenericIncomingCallsResult(calls)\n }\n case 'outgoingCalls': {\n if (input.line === undefined || input.character === undefined) {\n return {\n formatted: 'Error performing outgoingCalls: Missing line/character',\n resultCount: 0,\n fileCount: 0,\n }\n }\n const items = await client.prepareCallHierarchy(\n input.filePath,\n input.line,\n input.character,\n )\n const callResults = await Promise.all(\n (Array.isArray(items) ? items : []).map(item =>\n client.outgoingCalls(item),\n ),\n )\n const calls = callResults.flat().filter(Boolean)\n return formatGenericOutgoingCallsResult(calls)\n }\n case 'diagnostics': {\n if (input.waitForDiagnostics) {\n await client.waitForReadiness(\n input.filePath,\n input.timeoutMs ?? 5000,\n )\n }\n const diagnostics = client.getDiagnostics(input.filePath)\n return formatGenericDiagnosticsResult(diagnostics)\n }\n default: {\n return {\n formatted: `Operation ${input.operation} not supported by generic client yet.`,\n resultCount: 0,\n fileCount: 0,\n }\n }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return {\n formatted: `Error performing ${input.operation} with generic client: ${message}`,\n resultCount: 0,\n fileCount: 0,\n }\n }\n }\n\n const ext = extname(input.filePath)\n return {\n formatted: `No LSP server available for file type: ${ext}`,\n resultCount: 0,\n fileCount: 0,\n }\n },\n\n async runAll(inputs: RunInput[]): Promise<LspResult[]> {\n return Promise.all(inputs.map(input => this.run(input)))\n },\n\n async touchFile(filePath: string, options: TouchOptions = {}): Promise<boolean> {\n const client = await LspClientManager.getInstance().getClientForFile(filePath)\n if (!client) return false\n const content = await readFile(filePath, 'utf-8')\n const languageId = getLanguageId(extname(filePath))\n await client.didOpen(filePath, content, languageId)\n if (options.wait) {\n await client.waitForReadiness(filePath, options.timeoutMs ?? 2000)\n }\n return true\n },\n\n async diagnostics(filePath: string, rootPath?: string): Promise<any[]> {\n return LspClientManager.getInstance().getAllDiagnostics(filePath, rootPath)\n },\n\n async diagnosticsPretty(\n filePath: string,\n options?: { maxItems?: number; rootPath?: string },\n ): Promise<string> {\n const diagnostics = await LspClientManager.getInstance().getAllDiagnostics(\n filePath,\n options?.rootPath,\n )\n return formatDiagnosticsPretty(diagnostics, { maxItems: options?.maxItems })\n },\n\n async documentSymbolRaw(\n filePath: string,\n rootPath?: string,\n ): Promise<any[] | null> {\n const manager = LspClientManager.getInstance()\n const resolvedRoot = rootPath ?? getCwd()\n const managerDocumentSymbol = (manager as any).documentSymbol\n if (typeof managerDocumentSymbol === 'function') {\n return managerDocumentSymbol.call(manager, filePath, resolvedRoot)\n }\n const client = await manager.getClient(filePath, resolvedRoot)\n if (!client) return null\n const clientDocumentSymbol = (client as any).documentSymbol\n if (typeof clientDocumentSymbol !== 'function') return []\n try {\n const symbols = await clientDocumentSymbol.call(client, filePath)\n return Array.isArray(symbols) ? symbols : []\n } catch {\n return []\n }\n },\n\n async findReferencesRaw(\n filePath: string,\n line: number,\n character: number,\n rootPath?: string,\n ): Promise<any[] | null> {\n const client = await LspClientManager.getInstance().getClient(\n filePath,\n rootPath ?? getCwd(),\n )\n if (!client) return null\n return (await client.findReferences(filePath, line, character)) as any[]\n },\n\n normalizeUri,\n\n async workspaceSymbol(\n query: string,\n options?: {\n rootPath?: string\n maxItems?: number\n filterKinds?: number[]\n nameIncludes?: string\n },\n ): Promise<any[]> {\n const { rootPath, ...rest } = options ?? {}\n return LspClientManager.getInstance().workspaceSymbol(\n query,\n rootPath ?? getCwd(),\n rest,\n )\n },\n\n serveStatus(options?: {\n host?: string\n port?: number\n path?: string\n allowCors?: boolean\n }) {\n return serveStatusWithProvider(() => LspAPI.status(), options)\n },\n\n status() {\n return LspClientManager.getInstance().status()\n },\n}\n\nexport const LspFacade = {\n async run(input: FacadeRunInput): Promise<LspResult> {\n const rootPath = input.rootPath ?? getCwd()\n if (input.operation === 'documentSymbol') {\n const lang = ParserRegistry.getLanguage(input.filePath)\n if (lang) {\n try {\n const symbols = await TreeSitterLspAdapter.getDocumentSymbols(input.filePath)\n return formatTreeSitterDocumentSymbolResult(symbols)\n } catch {\n }\n }\n }\n\n if (input.operation === 'getScope') {\n if (input.line === undefined || input.character === undefined) {\n return {\n formatted: 'Error performing getScope: Missing line/character',\n resultCount: 0,\n fileCount: 0,\n }\n }\n const lang = ParserRegistry.getLanguage(input.filePath)\n if (!lang) {\n return {\n formatted: 'getScope not supported for this language',\n resultCount: 0,\n fileCount: 0,\n }\n }\n try {\n const code = await readFile(input.filePath, 'utf-8')\n const scope = await ScopeAnalyzer.getScope(input.filePath, code, {\n row: input.line - 1,\n column: input.character - 1,\n })\n let resultText = ''\n if (scope.locals.length > 0) {\n resultText += `Locals: ${scope.locals.join(', ')}\\n`\n } else {\n resultText += 'Locals: (none)\\n'\n }\n if (scope.closure.length > 0) {\n resultText += `Closure: ${scope.closure.join(', ')}\\n`\n } else {\n resultText += 'Closure: (none)\\n'\n }\n return {\n formatted: resultText,\n resultCount: scope.locals.length + scope.closure.length,\n fileCount: 1,\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return {\n formatted: `Error performing getScope: ${message}`,\n resultCount: 0,\n fileCount: 0,\n }\n }\n }\n\n if (input.operation !== 'workspaceSymbol') {\n await LspAPI.touchFile(input.filePath, {\n wait: input.operation === 'diagnostics' && input.waitForDiagnostics,\n timeoutMs: input.timeoutMs,\n rootPath,\n })\n }\n\n if (input.operation === 'workspaceSymbol') {\n const query = input.query ?? input.filePath\n const symbols = await LspAPI.workspaceSymbol(query, { rootPath })\n const normalized = symbols.map(normalizeWorkspaceSymbol).filter(Boolean)\n const sorted = sortWorkspaceSymbols(normalized)\n return formatGenericDocumentSymbolResult(sorted)\n }\n\n const { operation, ...rest } = input\n return LspAPI.run({\n ...rest,\n operation: operation as Operation,\n rootPath,\n })\n },\n\n async runAll(inputs: FacadeRunInput[]): Promise<LspResult[]> {\n return Promise.all(inputs.map(input => this.run(input)))\n },\n\n async touchFile(filePath: string, options: TouchOptions = {}): Promise<boolean> {\n return LspAPI.touchFile(filePath, options)\n },\n\n async diagnosticsPretty(\n filePath: string,\n options?: { maxItems?: number; rootPath?: string },\n ): Promise<string> {\n return LspAPI.diagnosticsPretty(filePath, options)\n },\n\n async checkFileReferences(filePath: string): Promise<string | null> {\n const rootPath = getCwd()\n const fileUri = LspAPI.normalizeUri(filePath)\n const symbols = await LspAPI.documentSymbolRaw(filePath, rootPath)\n if (symbols === null) {\n throw new Error('LSP unavailable')\n }\n\n const checkSymbolRefs = async (sym: any): Promise<string | null> => {\n const range = sym.selectionRange || sym.range || (sym.location ? sym.location.range : null)\n if (!range) return null\n const refs = await LspAPI.findReferencesRaw(\n filePath,\n range.start.line + 1,\n range.start.character + 1,\n rootPath,\n )\n if (refs && Array.isArray(refs)) {\n const externalRefs = refs.filter((r: any) => r.uri !== fileUri)\n if (externalRefs.length > 0) {\n const refFiles = externalRefs.map((r: any) => r.uri).slice(0, 3).join(', ')\n return `Symbol '${sym.name}' referenced by ${externalRefs.length} locations (e.g. ${refFiles})`\n }\n }\n return null\n }\n\n if (symbols && Array.isArray(symbols) && symbols.length > 0) {\n for (const sym of symbols) {\n const result = await checkSymbolRefs(sym)\n if (result) return result\n }\n } else {\n const refs = await LspAPI.findReferencesRaw(filePath, 1, 1, rootPath)\n if (refs && Array.isArray(refs)) {\n const externalRefs = refs.filter((r: any) => r.uri !== fileUri)\n if (externalRefs.length > 0) {\n return `File referenced by ${externalRefs.length} locations`\n }\n }\n }\n return null\n },\n\n serveStatus(options?: {\n host?: string\n port?: number\n path?: string\n allowCors?: boolean\n }) {\n return serveStatusWithProvider(() => LspFacade.status(), options)\n },\n\n status() {\n return LspAPI.status()\n },\n}\n", "import { createMessageConnection, StreamMessageReader, StreamMessageWriter } from 'vscode-jsonrpc/node.js'\nimport type { MessageConnection } from 'vscode-jsonrpc'\nimport type { ChildProcessWithoutNullStreams, SpawnOptions } from 'child_process'\nimport { spawn } from 'child_process'\nimport { pathToFileURL, fileURLToPath } from 'url'\nimport { EventEmitter } from 'events'\n\ntype DiagnosticsEvent = {\n uri: string\n filePath: string\n diagnostics: any[]\n}\n\ntype DiagnosticsSummary = {\n uri: string\n filePath: string\n count: number\n errors: number\n warnings: number\n infos: number\n hints: number\n}\n\nexport class DiagnosticsEventBus {\n private debounceMs: number\n private lastEventAt = new Map<string, number>()\n private debounceTimers = new Map<string, NodeJS.Timeout>()\n private waiting = new Map<string, Set<() => void>>()\n\n constructor(options?: { debounceMs?: number }) {\n this.debounceMs = options?.debounceMs ?? 150\n }\n\n publish(uri: string) {\n const now = Date.now()\n this.lastEventAt.set(uri, now)\n const existing = this.debounceTimers.get(uri)\n if (existing) {\n clearTimeout(existing)\n }\n const timer = setTimeout(() => {\n this.debounceTimers.delete(uri)\n const waiters = this.waiting.get(uri)\n if (!waiters || waiters.size === 0) return\n for (const resolver of Array.from(waiters)) {\n resolver()\n }\n }, this.debounceMs)\n this.debounceTimers.set(uri, timer)\n }\n\n waitForIdle(uri: string, timeoutMs: number): Promise<void> {\n const last = this.lastEventAt.get(uri)\n if (last !== undefined && Date.now() - last >= this.debounceMs) {\n return Promise.resolve()\n }\n return new Promise(resolve => {\n let done = false\n const finish = () => {\n if (done) return\n done = true\n clearTimeout(timeout)\n const waiters = this.waiting.get(uri)\n if (waiters) {\n waiters.delete(finish)\n if (waiters.size === 0) this.waiting.delete(uri)\n }\n resolve()\n }\n const waiters = this.waiting.get(uri) ?? new Set()\n waiters.add(finish)\n this.waiting.set(uri, waiters)\n const timeout = setTimeout(() => {\n finish()\n }, timeoutMs)\n })\n }\n}\n\nexport class GenericLspClient {\n private connection: MessageConnection\n private process: ChildProcessWithoutNullStreams\n public capabilities: any\n private diagnosticEvents = new EventEmitter()\n private diagnosticsBus = new DiagnosticsEventBus()\n private diagnosticsMap = new Map<string, any[]>()\n\n constructor(\n serverCommand: string,\n serverArgs: string[],\n cwd: string,\n private rootPath: string,\n private extraEnv?: Record<string, string>,\n private initializationOptions?: Record<string, unknown>\n ) {\n // console.log('[GenericLspClient] Spawning:', serverCommand, serverArgs.join(' '))\n const env = {\n ...process.env,\n // Remove potentially conflicting variables\n NODE_OPTIONS: undefined,\n TS_NODE_PROJECT: undefined,\n ELECTRON_RUN_AS_NODE: undefined,\n ...this.extraEnv\n }\n \n const options: SpawnOptions = {\n cwd,\n stdio: 'pipe',\n env,\n shell: false\n }\n\n this.process = spawn(serverCommand, serverArgs, options)\n\n this.process.stderr.on('data', (data) => {\n console.error(`[LSP Stderr] ${data}`)\n })\n\n this.connection = createMessageConnection(\n new StreamMessageReader(this.process.stdout),\n new StreamMessageWriter(this.process.stdin)\n )\n\n this.connection.onNotification((method, params) => {\n if (method === 'window/logMessage' || method === '$/progress') {\n console.log(`[LSP Notification] ${method}:`, JSON.stringify(params))\n }\n if (method === 'textDocument/publishDiagnostics') {\n try {\n const payload = params as { uri?: string; diagnostics?: any[] }\n const uri = payload.uri ?? ''\n let filePath = uri;\n if (uri.startsWith('file://')) {\n filePath = fileURLToPath(uri);\n }\n // Store diagnostics\n const normalizedUri = this.normalizeUri(filePath);\n this.diagnosticsMap.set(normalizedUri, payload.diagnostics ?? []);\n // console.log(`[LSP] Stored diagnostics for ${normalizedUri}: ${params.diagnostics.length} items`)\n \n this.diagnosticsBus.publish(normalizedUri)\n this.diagnosticEvents.emit('diagnostics', { uri, filePath, diagnostics: payload.diagnostics ?? [] } satisfies DiagnosticsEvent);\n } catch (e) {\n console.error('[LSP] Error processing diagnostics:', e);\n }\n }\n })\n\n this.connection.onRequest((method, params) => {\n // console.log(`[LSP Request] ${method}:`, JSON.stringify(params))\n if (method === 'workspace/configuration') {\n const payload = params as { items?: any[] }\n const items = Array.isArray(payload.items) ? payload.items : []\n return items.map((item: any) => {\n const section = String(item?.section ?? '')\n if (section === 'yaml' || section.startsWith('yaml.')) {\n return { schemaStore: { enable: false }, schemas: {} }\n }\n return {}\n })\n }\n if (method === 'client/registerCapability') {\n return null\n }\n return null\n })\n\n this.connection.listen()\n }\n\n public normalizeUri(filePath: string): string {\n let uri = pathToFileURL(filePath).href\n if (process.platform === 'win32') {\n uri = uri.replace(/^file:\\/\\/\\/([a-zA-Z]):\\//, (match, drive) => {\n return `file:///${drive.toLowerCase()}%3A/`\n })\n }\n return uri\n }\n\n async initialize() {\n const rootUri = this.normalizeUri(this.rootPath)\n \n console.log('[GenericLspClient] Initializing with normalized rootUri:', rootUri)\n const params: {\n processId: number\n rootUri: string\n capabilities: any\n workspaceFolders: { name: string; uri: string }[]\n initializationOptions?: Record<string, unknown>\n } = {\n processId: process.pid,\n rootUri,\n capabilities: {\n textDocument: {\n synchronization: {\n didOpen: true,\n didChange: true,\n willSave: false,\n willSaveWaitUntil: false,\n didSave: true\n },\n hover: {\n contentFormat: ['markdown', 'plaintext']\n },\n definition: {},\n references: {}\n },\n workspace: {\n workspaceFolders: true\n }\n },\n workspaceFolders: [\n {\n name: 'workspace',\n uri: this.normalizeUri(this.rootPath)\n }\n ]\n }\n if (this.initializationOptions && Object.keys(this.initializationOptions).length > 0) {\n params.initializationOptions = this.initializationOptions\n }\n\n const result = await this.connection.sendRequest('initialize', params)\n await this.connection.sendNotification('initialized', {})\n \n // Notify configuration change (empty) to trigger analysis if needed\n await this.connection.sendNotification('workspace/didChangeConfiguration', {\n settings: { yaml: { schemaStore: { enable: false }, schemas: {} } }\n })\n \n // Give server a moment to settle\n await new Promise(resolve => setTimeout(resolve, 100))\n\n this.capabilities = (result as any).capabilities\n return result\n }\n\n async shutdown() {\n try {\n await this.connection.sendRequest('shutdown')\n await this.connection.sendNotification('exit')\n } catch (error) {\n // Ignore errors during shutdown\n }\n this.connection.dispose()\n this.process.kill()\n }\n\n async goToDefinition(filePath: string, line: number, character: number) {\n const params = {\n textDocument: { uri: this.normalizeUri(filePath) },\n position: { line: line - 1, character: character - 1 }\n }\n return this.connection.sendRequest('textDocument/definition', params)\n }\n\n async findReferences(filePath: string, line: number, character: number) {\n const params = {\n textDocument: { uri: this.normalizeUri(filePath) },\n position: { line: line - 1, character: character - 1 },\n context: { includeDeclaration: true }\n }\n return this.connection.sendRequest('textDocument/references', params)\n }\n\n async hover(filePath: string, line: number, character: number) {\n const params = {\n textDocument: { uri: this.normalizeUri(filePath) },\n position: { line: line - 1, character: character - 1 }\n }\n return this.connection.sendRequest('textDocument/hover', params)\n }\n\n async documentSymbol(filePath: string) {\n const params = {\n textDocument: { uri: this.normalizeUri(filePath) }\n }\n return this.connection.sendRequest('textDocument/documentSymbol', params)\n }\n\n async workspaceSymbol(query: string) {\n const params = {\n query\n }\n return this.connection.sendRequest('workspace/symbol', params)\n }\n\n async goToImplementation(filePath: string, line: number, character: number) {\n const params = {\n textDocument: { uri: this.normalizeUri(filePath) },\n position: { line: line - 1, character: character - 1 }\n }\n return this.connection.sendRequest('textDocument/implementation', params)\n }\n\n async prepareCallHierarchy(filePath: string, line: number, character: number) {\n const params = {\n textDocument: { uri: this.normalizeUri(filePath) },\n position: { line: line - 1, character: character - 1 }\n }\n return this.connection.sendRequest('textDocument/prepareCallHierarchy', params)\n }\n\n async incomingCalls(item: any) {\n const params = { item }\n return this.connection.sendRequest('callHierarchy/incomingCalls', params)\n }\n\n async outgoingCalls(item: any) {\n const params = { item }\n return this.connection.sendRequest('callHierarchy/outgoingCalls', params)\n }\n\n async didOpen(filePath: string, content: string, languageId: string) {\n const params = {\n textDocument: {\n uri: this.normalizeUri(filePath),\n languageId,\n version: 1,\n text: content\n }\n }\n await this.connection.sendNotification('textDocument/didOpen', params)\n }\n\n async didChange(filePath: string, content: string, version: number) {\n const params = {\n textDocument: {\n uri: this.normalizeUri(filePath),\n version\n },\n contentChanges: [{ text: content }]\n }\n await this.connection.sendNotification('textDocument/didChange', params)\n }\n\n async didClose(filePath: string) {\n const params = {\n textDocument: {\n uri: this.normalizeUri(filePath)\n }\n }\n await this.connection.sendNotification('textDocument/didClose', params)\n }\n\n async waitForReadiness(filePath: string, timeoutMs: number = 3000): Promise<void> {\n const normalizedUri = this.normalizeUri(filePath);\n await this.diagnosticsBus.waitForIdle(normalizedUri, timeoutMs)\n }\n\n on(event: 'diagnostics', handler: (event: DiagnosticsEvent) => void) {\n this.diagnosticEvents.on(event, handler)\n }\n\n off(event: 'diagnostics', handler: (event: DiagnosticsEvent) => void) {\n this.diagnosticEvents.off(event, handler)\n }\n\n getDiagnostics(filePath: string): any[] {\n return this.diagnosticsMap.get(this.normalizeUri(filePath)) || []\n }\n\n getDiagnosticsSnapshot(): DiagnosticsSummary[] {\n const summaries: DiagnosticsSummary[] = []\n for (const [uri, diagnostics] of this.diagnosticsMap.entries()) {\n let filePath = uri\n try {\n if (uri.startsWith('file://')) {\n filePath = fileURLToPath(uri)\n }\n } catch {\n filePath = uri\n }\n const summary = {\n uri,\n filePath,\n count: diagnostics.length,\n errors: 0,\n warnings: 0,\n infos: 0,\n hints: 0\n }\n for (const diagnostic of diagnostics) {\n const severity = diagnostic?.severity\n if (severity === 1) summary.errors += 1\n else if (severity === 2) summary.warnings += 1\n else if (severity === 3) summary.infos += 1\n else if (severity === 4) summary.hints += 1\n }\n summaries.push(summary)\n }\n return summaries\n }\n}\n", "import { GenericLspClient } from './generic'\nimport { extname, join, dirname, sep, relative } from 'path'\nimport { fileURLToPath } from 'url'\nimport { LspServerRegistry, LspServerInfo } from '../registry'\nimport { findNearestRoot } from '../utils'\nimport { readdir, readFile } from 'fs/promises'\nimport { existsSync } from 'fs'\nimport { getCwd } from '@utils/state'\nimport { levenshtein } from '@utils/text/smart-edit/levenshtein'\nimport { minimatch } from 'minimatch'\n\ntype LspClientFactory = (\n command: string,\n args: string[],\n cwd: string,\n root: string,\n env?: Record<string, string>,\n initializationOptions?: Record<string, unknown>\n) => GenericLspClient\n\nexport class LspClientManager {\n private static instance: LspClientManager\n private static clientFactory: LspClientFactory | null = null\n private clients: Map<string, GenericLspClient> = new Map()\n private spawning: Map<string, Promise<GenericLspClient | null>> = new Map()\n private broken: Set<string> = new Set()\n\n private constructor() {}\n\n static getInstance(): LspClientManager {\n if (!LspClientManager.instance) {\n LspClientManager.instance = new LspClientManager()\n }\n return LspClientManager.instance\n }\n\n static setClientFactoryForTests(factory: LspClientFactory | null) {\n LspClientManager.clientFactory = factory\n }\n\n getLanguageId(ext: string, serverInfo?: LspServerInfo): string {\n if (serverInfo?.languageId) return serverInfo.languageId\n return LspServerRegistry.getInstance().getLanguageIdForExtension(ext)\n }\n\n private async ensureWorkspaceClients(rootPath: string) {\n try {\n // Heuristic: Scan root directory for file extensions to auto-detect needed servers\n const files = await readdir(rootPath, { withFileTypes: true })\n const extensionMap = new Map<string, string>() // ext -> realFilePath\n\n // Smart Project Detection\n const fileNames = new Set(files.map(f => f.name))\n if (fileNames.has('tsconfig.json') || fileNames.has('package.json')) {\n // Try to find a .ts or .js file to trigger activation\n // If root has no .ts/.js, look in src/\n if (!files.some(f => f.isFile() && /\\.(ts|tsx|js|jsx)$/.test(f.name))) {\n try {\n const srcFiles = await readdir(join(rootPath, 'src'), { withFileTypes: true })\n const triggerFile = srcFiles.find(f => f.isFile() && /\\.(ts|tsx|js|jsx)$/.test(f.name))\n if (triggerFile) {\n extensionMap.set(extname(triggerFile.name), join(rootPath, 'src', triggerFile.name))\n }\n } catch (e) {\n // src not found or error, ignore\n }\n }\n }\n if (fileNames.has('go.mod')) {\n extensionMap.set('.go', join(rootPath, 'go.mod')) // fallback trigger? No, needs .go file.\n // Look for main.go\n if (fileNames.has('main.go')) extensionMap.set('.go', join(rootPath, 'main.go'))\n }\n if (fileNames.has('Cargo.toml')) {\n // Look for src/main.rs or src/lib.rs\n try {\n if (existsSync(join(rootPath, 'src', 'main.rs'))) extensionMap.set('.rs', join(rootPath, 'src', 'main.rs'))\n else if (existsSync(join(rootPath, 'src', 'lib.rs'))) extensionMap.set('.rs', join(rootPath, 'src', 'lib.rs'))\n } catch (e) {}\n }\n\n for (const file of files) {\n if (file.isFile()) {\n const ext = extname(file.name)\n if (ext && !extensionMap.has(ext)) {\n extensionMap.set(ext, join(rootPath, file.name))\n }\n }\n }\n \n // Try to initialize server for each found extension\n for (const [ext, realPath] of extensionMap) {\n // getClient will trigger server initialization if not already running\n // console.log('[LspClientManager] Initializing client for', ext, realPath)\n const client = await this.getClient(realPath, rootPath)\n \n if (client) {\n // Phase 8: Warmup with Touch & Wait\n try {\n // console.log('[LspClientManager] Warming up', realPath)\n const content = await readFile(realPath, 'utf-8')\n // For project-level triggers (like tsconfig), we still need to open a valid source file\n // If realPath is not a source file (e.g. if we used a dummy), this might fail.\n // But our logic above tries to find real source files.\n const serverInfo = LspServerRegistry.getInstance().getServerForExtension(ext)\n await client.didOpen(realPath, content, this.getLanguageId(ext, serverInfo ?? undefined))\n await client.waitForReadiness(realPath, 2000)\n // console.log('[LspClientManager] Warmup complete for', realPath)\n } catch (e) {\n // console.error('[LspClientManager] Warmup failed', e)\n // Ignore warmup errors\n }\n } else {\n // console.log('[LspClientManager] Failed to get client for', ext)\n }\n }\n } catch (e) {\n // ignore scan errors\n }\n }\n\n async getClientForFile(filePath: string): Promise<GenericLspClient | null> {\n const rootPath = await this.resolveRootForFile(filePath)\n return this.getClient(filePath, rootPath)\n }\n\n async resolveRootForFile(filePath: string): Promise<string> {\n const ext = extname(filePath)\n const serverInfo = LspServerRegistry.getInstance().getServerForExtension(ext)\n if (serverInfo) {\n return this.resolveRootForServer(filePath, serverInfo)\n }\n const cwd = getCwd()\n if (filePath.startsWith(cwd)) {\n return cwd\n }\n return dirname(filePath)\n }\n\n async getClient(filePath: string, rootPath?: string): Promise<GenericLspClient | null> {\n const ext = extname(filePath)\n const servers = LspServerRegistry.getInstance().getServersForExtension(ext)\n if (servers.length === 0) return null\n for (const serverInfo of servers) {\n const client = await this.getClientForServer(filePath, serverInfo, rootPath)\n if (client) return client\n }\n return null\n }\n\n async getClientsForFile(filePath: string, rootPath?: string): Promise<GenericLspClient[]> {\n const ext = extname(filePath)\n const servers = LspServerRegistry.getInstance().getServersForExtension(ext)\n if (servers.length === 0) return []\n const clients: GenericLspClient[] = []\n for (const serverInfo of servers) {\n const client = await this.getClientForServer(filePath, serverInfo, rootPath)\n if (client) clients.push(client)\n }\n return clients\n }\n\n private async spawnClient(\n resolvedRoot: string,\n serverInfo: LspServerInfo,\n key: string\n ): Promise<GenericLspClient | null> {\n const cmd = await serverInfo.getCommand(resolvedRoot)\n if (!cmd) {\n return null\n }\n const safeCwd = /[^\\x00-\\x7F]/.test(resolvedRoot) ? process.cwd() : resolvedRoot\n let initOpts = serverInfo.initializationOptions\n if (serverInfo.id === 'pyright' || serverInfo.id === 'ty') {\n const { detectPythonVenv } = await import('../registry')\n const pythonPath = detectPythonVenv(resolvedRoot)\n if (pythonPath) {\n initOpts = { ...(initOpts ?? {}), pythonPath }\n }\n }\n const nextClient = (LspClientManager.clientFactory ?? ((...args: Parameters<LspClientFactory>) => new GenericLspClient(...args)))(\n cmd.command,\n cmd.args,\n safeCwd,\n resolvedRoot,\n serverInfo.env,\n initOpts\n )\n await nextClient.initialize()\n this.clients.set(key, nextClient)\n return nextClient\n }\n \n async shutdownAll() {\n for (const client of this.clients.values()) {\n await client.shutdown()\n }\n this.clients.clear()\n this.broken.clear()\n this.spawning.clear()\n }\n\n async workspaceSymbol(\n query: string,\n rootPath: string = getCwd(),\n options?: { maxItems?: number; filterKinds?: number[]; nameIncludes?: string }\n ): Promise<any[]> {\n // Remediation 1.1: Ensure clients initialized\n if (this.clients.size === 0) {\n await this.ensureWorkspaceClients(rootPath)\n }\n\n const results: any[] = []\n for (const client of this.clients.values()) {\n try {\n const symbols = await client.workspaceSymbol(query)\n if (symbols && Array.isArray(symbols)) {\n results.push(...symbols)\n }\n } catch (e) {\n // ignore\n }\n }\n\n // Remediation 1.2: Fuzzy Fallback (Client-side)\n if (results.length === 0 && query.length > 0) {\n for (const client of this.clients.values()) {\n try {\n // Try to get broad list (empty query)\n // Note: Some servers might return too many results or reject empty query.\n // Ideally we'd have a 'getAllSymbols' capability check.\n // For now, we try.\n const broadSymbols = await client.workspaceSymbol('') \n if (broadSymbols && Array.isArray(broadSymbols)) {\n for (const sym of broadSymbols) {\n const dist = levenshtein(query, sym.name)\n // Allow distance <= 2 or 30% of length\n if (dist <= 2 || dist <= query.length * 0.3) {\n results.push(sym)\n }\n }\n }\n } catch (e) {\n // ignore\n }\n }\n }\n\n const normalizedResults = results.map(sym => {\n if (!sym || typeof sym !== 'object') return sym\n if (!sym.range && sym.location?.range) {\n sym.range = sym.location.range\n }\n if (!sym.uri && sym.location?.uri) {\n sym.uri = sym.location.uri\n }\n return sym\n })\n\n const resolveFilePath = (uri: string) => {\n try {\n if (uri.startsWith('file://')) {\n return fileURLToPath(uri)\n }\n } catch {}\n return uri\n }\n\n const flattenSymbols = (items: any[], output: any[] = []) => {\n for (const item of items) {\n if (!item || typeof item !== 'object') continue\n output.push(item)\n if (Array.isArray(item.children) && item.children.length > 0) {\n flattenSymbols(item.children, output)\n }\n }\n return output\n }\n\n const missingRange = normalizedResults.filter(\n sym => sym && !sym.range && typeof sym.uri === 'string' && sym.uri.length > 0\n )\n if (missingRange.length > 0) {\n const byUri = new Map<string, any[]>()\n for (const sym of missingRange) {\n if (!byUri.has(sym.uri)) byUri.set(sym.uri, [])\n byUri.get(sym.uri)!.push(sym)\n }\n const documentCache = new Map<string, any[]>()\n for (const [uri, symbols] of byUri.entries()) {\n const filePath = resolveFilePath(uri)\n let documentSymbols = documentCache.get(filePath)\n if (!documentSymbols) {\n documentSymbols = (await this.documentSymbol(filePath, rootPath)) ?? []\n documentCache.set(filePath, documentSymbols)\n }\n const flat = flattenSymbols(documentSymbols)\n for (const sym of symbols) {\n let match = flat.find(\n item => item?.name === sym.name && (sym.kind === undefined || item?.kind === sym.kind)\n )\n if (!match) {\n match = flat.find(item => item?.name === sym.name)\n }\n const range = match?.range ?? match?.location?.range\n if (range) {\n sym.range = range\n }\n }\n }\n }\n\n const finalResults = normalizedResults.filter(sym => sym && sym.range && sym.name)\n\n const seen = new Set<string>()\n const deduped: any[] = []\n for (const sym of finalResults) {\n const uri = sym?.location?.uri ?? sym?.uri ?? ''\n const line = sym?.range?.start?.line ?? sym?.location?.range?.start?.line ?? ''\n const character = sym?.range?.start?.character ?? sym?.location?.range?.start?.character ?? ''\n const kind = sym?.kind ?? ''\n const key = `${sym?.name ?? ''}|${kind}|${uri}|${line}|${character}`\n if (!seen.has(key)) {\n seen.add(key)\n deduped.push(sym)\n }\n }\n\n let filtered = deduped\n if (options?.filterKinds && options.filterKinds.length > 0) {\n const allowedKinds = new Set(options.filterKinds)\n filtered = filtered.filter(sym => allowedKinds.has(sym?.kind))\n }\n if (options?.nameIncludes) {\n const needle = options.nameIncludes.toLowerCase()\n filtered = filtered.filter(sym =>\n String(sym?.name ?? '').toLowerCase().includes(needle)\n )\n }\n if (options?.maxItems !== undefined && filtered.length > options.maxItems) {\n filtered = filtered.slice(0, options.maxItems)\n }\n\n return filtered\n }\n\n async documentSymbol(filePath: string, rootPath: string = getCwd()): Promise<any[] | null> {\n const client = await this.getClient(filePath, rootPath)\n if (!client) {\n return null\n }\n\n try {\n const content = await readFile(filePath, 'utf-8')\n const ext = extname(filePath)\n const serverInfo = LspServerRegistry.getInstance().getServerForExtension(ext)\n const languageId = this.getLanguageId(ext, serverInfo ?? undefined)\n await client.didOpen(filePath, content, languageId)\n // Phase 8: Perception-Aware Wait\n await client.waitForReadiness(filePath, 2000)\n \n const symbols = await client.documentSymbol(filePath)\n return Array.isArray(symbols) ? symbols : []\n } catch (e) {\n console.error(`Failed to get document symbols for ${filePath}:`, e)\n return null\n }\n }\n\n async getDiagnostics(filePath: string, rootPath: string = getCwd()): Promise<any[]> {\n const client = await this.getClient(filePath, rootPath)\n if (!client) {\n return []\n }\n // Ensure diagnostics are fresh if possible?\n // But getDiagnostics is synchronous map lookup.\n // We rely on waitForReadiness being called before this if needed.\n // For strict correctness, we should wait if we haven't recently.\n // But typical usage pattern is waitForReadiness() -> getDiagnostics().\n return client.getDiagnostics(filePath)\n }\n\n async getAllDiagnostics(filePath: string, rootPath: string = getCwd()): Promise<any[]> {\n await this.getClientsForFile(filePath, rootPath)\n const results: any[] = []\n for (const client of this.clients.values()) {\n try {\n const diagnostics = client.getDiagnostics(filePath)\n if (diagnostics && diagnostics.length > 0) {\n results.push(...diagnostics)\n }\n } catch (e) {\n }\n }\n return results\n }\n\n status() {\n const diagnostics = []\n for (const [key, client] of this.clients.entries()) {\n const snapshot = (client as any).getDiagnosticsSnapshot?.()\n if (Array.isArray(snapshot) && snapshot.length > 0) {\n diagnostics.push({ client: key, entries: snapshot })\n }\n }\n return {\n clients: Array.from(this.clients.keys()),\n spawning: Array.from(this.spawning.keys()),\n broken: Array.from(this.broken.values()),\n diagnostics\n }\n }\n\n // New helper to expose waitForReadiness to clients who only have a manager\n async waitForReadiness(filePath: string, rootPath: string = getCwd(), timeoutMs: number = 2000): Promise<void> {\n // Use getClientForFile to ensure correct rootPath resolution if not provided or incorrect\n const client = await this.getClientForFile(filePath)\n if (client) {\n await client.waitForReadiness(filePath, timeoutMs)\n }\n }\n\n private matchesServerFilters(filePath: string, serverInfo: LspServerInfo): boolean {\n const normalizePath = (value: string) => value.replace(/\\\\/g, '/')\n const normalizedFile = normalizePath(filePath)\n const relativeToCwd = normalizePath(relative(getCwd(), filePath))\n const matches = (patterns: string[]) =>\n patterns.some(pattern => {\n if (minimatch(normalizedFile, pattern, { dot: true })) return true\n if (relativeToCwd && !relativeToCwd.startsWith('..')) {\n return minimatch(relativeToCwd, pattern, { dot: true })\n }\n return false\n })\n if (serverInfo.rootExclude && matches(serverInfo.rootExclude)) return false\n if (serverInfo.rootInclude && !matches(serverInfo.rootInclude)) return false\n return true\n }\n\n private async resolveRootForServer(filePath: string, serverInfo: LspServerInfo): Promise<string> {\n const cwd = getCwd()\n let defaultRoot: string | undefined\n if (serverInfo.rootMarkers.length > 0) {\n defaultRoot = await findNearestRoot(dirname(filePath), serverInfo.rootMarkers, {\n include: serverInfo.rootInclude,\n exclude: serverInfo.rootExclude,\n branches: serverInfo.rootBranches,\n filePath\n })\n }\n if (!defaultRoot) {\n defaultRoot = filePath.startsWith(cwd) ? cwd : dirname(filePath)\n }\n if (serverInfo.resolveRoot) {\n const resolved = await serverInfo.resolveRoot(filePath, defaultRoot)\n return resolved || defaultRoot\n }\n return defaultRoot\n }\n\n private async getClientForServer(\n filePath: string,\n serverInfo: LspServerInfo,\n rootPath?: string\n ): Promise<GenericLspClient | null> {\n if (!this.matchesServerFilters(filePath, serverInfo)) {\n return null\n }\n const resolvedRoot = rootPath ?? (await this.resolveRootForServer(filePath, serverInfo))\n try {\n const ready = await serverInfo.prepare()\n if (!ready) {\n return null\n }\n } catch (e) {\n return null\n }\n\n const key = `${resolvedRoot}:${serverInfo.id}`\n if (this.broken.has(key)) {\n return null\n }\n const existingSpawn = this.spawning.get(key)\n if (existingSpawn) {\n return existingSpawn\n }\n let client = this.clients.get(key)\n\n if (!client) {\n const spawnPromise = (async () => {\n try {\n return await this.spawnClient(resolvedRoot, serverInfo, key)\n } catch (error) {\n this.broken.add(key)\n return null\n } finally {\n this.spawning.delete(key)\n }\n })()\n this.spawning.set(key, spawnPromise)\n client = await spawnPromise\n }\n\n return client\n }\n}\n", "import { fileURLToPath } from 'url'\nimport { relative } from 'path'\nimport { getCwd } from '@utils/state'\n\nexport type LspResult = {\n formatted: string\n resultCount: number\n fileCount: number\n}\n\nconst SYMBOL_KIND_MAP: Record<number, string> = {\n 1: 'File',\n 2: 'Module',\n 3: 'Namespace',\n 4: 'Package',\n 5: 'Class',\n 6: 'Method',\n 7: 'Property',\n 8: 'Field',\n 9: 'Constructor',\n 10: 'Enum',\n 11: 'Interface',\n 12: 'Function',\n 13: 'Variable',\n 14: 'Constant',\n 15: 'String',\n 16: 'Number',\n 17: 'Boolean',\n 18: 'Array',\n 19: 'Object',\n 20: 'Key',\n 21: 'Null',\n 22: 'EnumMember',\n 23: 'Struct',\n 24: 'Event',\n 25: 'Operator',\n 26: 'TypeParameter',\n}\n\nfunction toProjectRelative(filePath: string): string {\n const cwd = getCwd()\n try {\n const rel = relative(cwd, filePath)\n if (!rel || rel === '') return filePath\n if (rel.startsWith('..')) return filePath\n return rel\n } catch {\n return filePath\n }\n}\n\nfunction formatLocation(uri: string, range: { start: { line: number; character: number } }): string {\n const filePath = fileURLToPath(uri)\n return `${toProjectRelative(filePath)}:${range.start.line + 1}:${range.start.character + 1}`\n}\n\nfunction getSymbolKindName(kind: any): string {\n if (typeof kind === 'number') return SYMBOL_KIND_MAP[kind] || `Kind(${kind})`\n if (typeof kind === 'string') return kind\n return 'Unknown'\n}\n\nfunction formatCallHierarchyItem(item: any): { label: string; uri?: string } {\n const kind = getSymbolKindName(item?.kind)\n const range = item?.selectionRange ?? item?.range\n if (item?.uri && range) {\n return {\n label: `${item.name} (${kind}) at ${formatLocation(item.uri, range)}`,\n uri: item.uri,\n }\n }\n if (item?.uri) {\n return {\n label: `${item.name} (${kind}) at ${toProjectRelative(fileURLToPath(item.uri))}`,\n uri: item.uri,\n }\n }\n return { label: `${item?.name ?? 'Unknown'} (${kind})` }\n}\n\nfunction formatCallRanges(uri: string, ranges: any[]): string {\n const valid = Array.isArray(ranges) ? ranges : []\n if (valid.length === 0) return ''\n return valid\n .map(range => formatLocation(uri, range))\n .filter(Boolean)\n .join(', ')\n}\n\nexport function formatGenericDefinitionResult(result: any): LspResult {\n if (!result) {\n return { formatted: 'No definition found.', resultCount: 0, fileCount: 0 }\n }\n const locations = Array.isArray(result) ? result : [result]\n if (locations.length === 0) {\n return { formatted: 'No definition found.', resultCount: 0, fileCount: 0 }\n }\n\n const fileCount = new Set(locations.map((l: any) => l.uri)).size\n \n if (locations.length === 1) {\n return {\n formatted: `Defined in ${formatLocation(locations[0].uri, locations[0].range)}`,\n resultCount: 1,\n fileCount\n }\n }\n\n return {\n formatted: `Found ${locations.length} definitions:\\n${locations.map((l: any) => ` ${formatLocation(l.uri, l.range)}`).join('\\n')}`,\n resultCount: locations.length,\n fileCount\n }\n}\n\nexport function formatGenericReferencesResult(result: any): LspResult {\n if (!result || !Array.isArray(result) || result.length === 0) {\n return { formatted: 'No references found.', resultCount: 0, fileCount: 0 }\n }\n \n // Group by file\n const grouped = new Map<string, any[]>()\n for (const ref of result) {\n const file = toProjectRelative(fileURLToPath(ref.uri))\n if (!grouped.has(file)) grouped.set(file, [])\n grouped.get(file)!.push(ref)\n }\n\n const lines = [`Found ${result.length} references across ${grouped.size} files:`]\n for (const [file, refs] of grouped) {\n lines.push(`\\n${file}:`)\n for (const ref of refs) {\n lines.push(` Line ${ref.range.start.line + 1}:${ref.range.start.character + 1}`)\n }\n }\n\n return {\n formatted: lines.join('\\n'),\n resultCount: result.length,\n fileCount: grouped.size\n }\n}\n\nexport function formatGenericHoverResult(result: any, line: number, character: number): LspResult {\n if (!result || !result.contents) {\n return { formatted: 'No hover info.', resultCount: 0, fileCount: 0 }\n }\n \n let contents = ''\n if (typeof result.contents === 'string') {\n contents = result.contents\n } else if (Array.isArray(result.contents)) {\n contents = result.contents.map((c: any) => typeof c === 'string' ? c : c.value).join('\\n')\n } else {\n contents = result.contents.value\n }\n\n return {\n formatted: `Hover info at ${line}:${character}:\\n\\n${contents}`,\n resultCount: 1,\n fileCount: 1\n }\n}\n\nexport function formatGenericDocumentSymbolResult(result: any): LspResult {\n if (!result || !Array.isArray(result) || result.length === 0) {\n return { formatted: 'No symbols found.', resultCount: 0, fileCount: 0 }\n }\n\n const lines = result.map((s: any) => {\n const kind = getSymbolKindName(s.kind)\n return `${s.name} (${kind}) at ${s.range.start.line + 1}:${s.range.start.character + 1}`\n })\n\n return {\n formatted: ['Document symbols:', ...lines].join('\\n'),\n resultCount: result.length,\n fileCount: 1\n }\n}\n\nexport function formatGenericDiagnosticsResult(diagnostics: any[]): LspResult {\n if (!diagnostics || diagnostics.length === 0) {\n return { formatted: 'No diagnostics found.', resultCount: 0, fileCount: 0 }\n }\n\n const lines = diagnostics.map(d => {\n return `[${d.severity === 1 ? 'Error' : d.severity === 2 ? 'Warning' : 'Info'}] Line ${d.range.start.line + 1}: ${d.message}`\n })\n\n return {\n formatted: ['Diagnostics:', ...lines].join('\\n'),\n resultCount: diagnostics.length,\n fileCount: 1\n }\n}\n\nexport function formatGenericCallHierarchyItemsResult(items: any[]): LspResult {\n if (!items || !Array.isArray(items) || items.length === 0) {\n return { formatted: 'No call hierarchy items found.', resultCount: 0, fileCount: 0 }\n }\n const uris = new Set<string>()\n const lines = items.map(item => {\n const info = formatCallHierarchyItem(item)\n if (info.uri) uris.add(info.uri)\n return `- ${info.label}`\n })\n return {\n formatted: ['Call hierarchy items:', ...lines].join('\\n'),\n resultCount: items.length,\n fileCount: uris.size,\n }\n}\n\nexport function formatGenericIncomingCallsResult(calls: any[]): LspResult {\n if (!calls || !Array.isArray(calls) || calls.length === 0) {\n return { formatted: 'No incoming calls found.', resultCount: 0, fileCount: 0 }\n }\n const uris = new Set<string>()\n const lines: string[] = ['Incoming calls:']\n for (const call of calls) {\n const info = formatCallHierarchyItem(call?.from)\n if (info.uri) uris.add(info.uri)\n lines.push(`- ${info.label}`)\n if (call?.from?.uri) {\n const ranges = formatCallRanges(call.from.uri, call?.fromRanges ?? [])\n if (ranges) {\n lines.push(` via ${ranges}`)\n }\n }\n }\n return {\n formatted: lines.join('\\n'),\n resultCount: calls.length,\n fileCount: uris.size,\n }\n}\n\nexport function formatGenericOutgoingCallsResult(calls: any[]): LspResult {\n if (!calls || !Array.isArray(calls) || calls.length === 0) {\n return { formatted: 'No outgoing calls found.', resultCount: 0, fileCount: 0 }\n }\n const uris = new Set<string>()\n const lines: string[] = ['Outgoing calls:']\n for (const call of calls) {\n const info = formatCallHierarchyItem(call?.to)\n if (info.uri) uris.add(info.uri)\n lines.push(`- ${info.label}`)\n if (call?.to?.uri) {\n const ranges = formatCallRanges(call.to.uri, call?.fromRanges ?? [])\n if (ranges) {\n lines.push(` via ${ranges}`)\n }\n }\n }\n return {\n formatted: lines.join('\\n'),\n resultCount: calls.length,\n fileCount: uris.size,\n }\n}\n", "type FormatOptions = {\n maxItems?: number\n}\n\nconst severityOrder: Record<number, number> = {\n 1: 1,\n 2: 2,\n 3: 3,\n 4: 4,\n}\n\nfunction severityLabel(severity: number | undefined): string {\n if (severity === 1) return 'Error'\n if (severity === 2) return 'Warning'\n if (severity === 3) return 'Info'\n if (severity === 4) return 'Hint'\n return 'Unknown'\n}\n\nexport function formatDiagnosticsPretty(\n diagnostics: any[],\n options: FormatOptions = {},\n): string {\n if (!diagnostics || diagnostics.length === 0) return ''\n const items = [...diagnostics].sort((a, b) => {\n const aSeverity = severityOrder[a?.severity ?? 99] ?? 99\n const bSeverity = severityOrder[b?.severity ?? 99] ?? 99\n if (aSeverity !== bSeverity) return aSeverity - bSeverity\n const aLine = a?.range?.start?.line ?? 0\n const bLine = b?.range?.start?.line ?? 0\n if (aLine !== bLine) return aLine - bLine\n const aChar = a?.range?.start?.character ?? 0\n const bChar = b?.range?.start?.character ?? 0\n return aChar - bChar\n })\n const limited =\n options.maxItems && options.maxItems > 0\n ? items.slice(0, options.maxItems)\n : items\n return limited\n .map(d => {\n const line = (d?.range?.start?.line ?? 0) + 1\n const character = (d?.range?.start?.character ?? 0) + 1\n const label = severityLabel(d?.severity)\n const message = d?.message ?? 'Unknown diagnostic'\n return `- ${label} ${line}:${character} ${message}`\n })\n .join('\\n')\n}\n", "import path from \"path\";\nimport { LANGUAGE_MAP } from \"./loader\";\n\n// Extract keys from LANGUAGE_MAP for type safety\nexport type SupportedLanguage = keyof typeof LANGUAGE_MAP;\n\nexport class ParserRegistry {\n private static extensionMap: Record<string, SupportedLanguage> = {\n \".ts\": \"typescript\",\n \".tsx\": \"tsx\",\n \".js\": \"typescript\", // Use TS parser for JS\n \".jsx\": \"tsx\",\n \".py\": \"python\",\n \".sh\": \"bash\",\n \".bash\": \"bash\",\n \".rs\": \"rust\",\n \".go\": \"go\",\n \".java\": \"java\",\n \".cpp\": \"cpp\",\n \".c\": \"c\",\n \".h\": \"c\",\n \".cc\": \"cpp\",\n \".cs\": \"c_sharp\",\n \".scala\": \"scala\",\n \".sbt\": \"scala\",\n \".sc\": \"scala\",\n \".hs\": \"haskell\",\n \".lhs\": \"haskell\",\n \".jl\": \"julia\",\n \".ml\": \"ocaml\",\n \".mli\": \"ocaml\",\n \".swift\": \"swift\",\n \".nix\": \"nix\",\n \".rb\": \"ruby\",\n \".html\": \"html\",\n \".htm\": \"html\",\n \".css\": \"css\",\n \".json\": \"json\",\n \".jsonc\": \"json\",\n \".yaml\": \"yaml\",\n \".yml\": \"yaml\",\n };\n\n /**\n * Get the supported language ID for a given filename.\n * Returns null if the extension is not supported.\n */\n static getLanguage(filename: string): SupportedLanguage | null {\n const ext = path.extname(filename).toLowerCase();\n return this.extensionMap[ext] || null;\n }\n\n /**\n * Register or override a file extension mapping.\n */\n static registerExtension(ext: string, lang: SupportedLanguage) {\n const normalizedExt = ext.startsWith(\".\") ? ext : `.${ext}`;\n this.extensionMap[normalizedExt.toLowerCase()] = lang;\n }\n}\n", "import { createRequire } from \"module\";\nimport { Parser, Language } from \"web-tree-sitter\";\nimport { fileURLToPath } from 'url';\nimport path from \"path\";\n\n// Helper to handle __dirname in both CJS and ESM environments\nconst getDirname = () => {\n try {\n return __dirname;\n } catch {\n return path.dirname(fileURLToPath(import.meta.url));\n }\n};\nconst _dirname = getDirname();\n\n// Cache for Parser instances per language\nconst parserCache = new Map<string, Parser>();\nlet isInitialized = false;\n\n// Language to Filename mapping (in resources/tree-sitter)\nexport const LANGUAGE_MAP: Record<string, string> = {\n bash: \"tree-sitter-bash.wasm\",\n typescript: \"tree-sitter-typescript.wasm\",\n tsx: \"tree-sitter-tsx.wasm\",\n python: \"tree-sitter-python.wasm\",\n rust: \"tree-sitter-rust.wasm\",\n go: \"tree-sitter-go.wasm\",\n java: \"tree-sitter-java.wasm\",\n cpp: \"tree-sitter-cpp.wasm\",\n c: \"tree-sitter-c.wasm\",\n c_sharp: \"tree-sitter-c_sharp.wasm\",\n scala: \"tree-sitter-scala.wasm\",\n haskell: \"tree-sitter-haskell.wasm\",\n julia: \"tree-sitter-julia.wasm\",\n ocaml: \"tree-sitter-ocaml.wasm\",\n swift: \"tree-sitter-swift.wasm\",\n nix: \"tree-sitter-nix.wasm\",\n ruby: \"tree-sitter-ruby.wasm\",\n html: \"tree-sitter-html.wasm\",\n css: \"tree-sitter-css.wasm\",\n json: \"tree-sitter-json.wasm\",\n yaml: \"tree-sitter-yaml.wasm\",\n};\n\n/**\n * Initialize Tree-Sitter Core (WASM).\n * This must be called before loading any languages.\n */\nasync function ensureInitialized() {\n if (isInitialized) return;\n\n // Resolve path relative to project root -> resources/tree-sitter\n // In dev: src/utils/tree-sitter/loader.ts -> ../../../resources/tree-sitter\n // In prod: dist/index.js -> ../resources/tree-sitter (assuming resources is copied to root)\n // We can check if we are running in a bundled environment or ts-node/bun dev.\n \n let resourcesDir;\n if (_dirname.includes('dist') || _dirname.includes('node_modules')) {\n // Production / Installed\n resourcesDir = path.resolve(_dirname, '../resources/tree-sitter');\n } else {\n // Development\n resourcesDir = path.resolve(_dirname, '../../../resources/tree-sitter');\n }\n\n const treeWasmPath = path.join(resourcesDir, \"tree-sitter.wasm\");\n\n await Parser.init({\n locateFile: () => treeWasmPath,\n });\n isInitialized = true;\n}\n\n/**\n * Load a Tree-Sitter language parser dynamically.\n * Uses caching to avoid reloading WASM files.\n */\nexport const loadLanguage = async (lang: keyof typeof LANGUAGE_MAP): Promise<Parser> => {\n if (parserCache.has(lang)) {\n return parserCache.get(lang)!;\n }\n\n await ensureInitialized();\n\n const fileName = LANGUAGE_MAP[lang];\n \n if (!fileName) {\n throw new Error(`Unsupported language: ${lang}`);\n }\n\n try {\n let resourcesDir;\n if (_dirname.includes('dist') || _dirname.includes('node_modules')) {\n resourcesDir = path.resolve(_dirname, '../resources/tree-sitter');\n } else {\n resourcesDir = path.resolve(_dirname, '../../../resources/tree-sitter');\n }\n \n const wasmPath = path.join(resourcesDir, fileName);\n \n const language = await Language.load(wasmPath);\n const parser = new Parser();\n parser.setLanguage(language);\n \n parserCache.set(lang, parser);\n return parser;\n } catch (error) {\n console.error(`Error loading language ${lang}:`, error);\n throw new Error(`Failed to load language ${lang}: ${error}`);\n }\n};\n\n// Legacy compatibility for Bash (used by safety checks)\nlet legacyParserInstance: Parser | null = null;\n\nexport const initParser = async (): Promise<Parser> => {\n if (legacyParserInstance) return legacyParserInstance;\n legacyParserInstance = await loadLanguage(\"bash\");\n return legacyParserInstance;\n};\n", "import { ParserRegistry } from \"./registry\";\nimport { loadLanguage } from \"./loader\";\nimport { readFile } from \"fs/promises\";\nimport type { Node } from \"web-tree-sitter\";\n\nexport interface LspSymbol {\n name: string;\n kind: string;\n range: {\n start: { line: number; character: number };\n end: { line: number; character: number };\n };\n children?: LspSymbol[];\n}\n\nconst SYMBOL_KIND_MAP: Record<string, string> = {\n // TypeScript / JavaScript\n function_declaration: \"Function\",\n method_definition: \"Method\",\n class_declaration: \"Class\",\n interface_declaration: \"Interface\",\n variable_declarator: \"Variable\",\n export_statement: \"Module\",\n \n // Python\n function_definition: \"Function\",\n class_definition: \"Class\",\n \n // Bash\n // function_definition is shared with Python/others\n \n // C#\n namespace_declaration: \"Namespace\",\n method_declaration: \"Method\",\n struct_declaration: \"Struct\",\n enum_declaration: \"Enum\",\n property_declaration: \"Property\",\n // class_declaration shared\n // interface_declaration shared\n\n // Go\n type_declaration: \"Class\", // often struct/interface\n field_declaration: \"Field\",\n // function_declaration shared\n // method_declaration shared\n\n // Rust\n function_item: \"Function\",\n struct_item: \"Struct\",\n enum_item: \"Enum\",\n impl_item: \"Class\",\n trait_item: \"Interface\",\n mod_item: \"Module\",\n\n // Java\n // class_declaration shared\n // method_declaration shared\n // interface_declaration shared\n // enum_declaration shared\n\n // Scala\n object_definition: \"Class\",\n trait_definition: \"Interface\",\n // class_definition shared with Python\n // function_definition shared with Python\n \n // Ruby\n module: \"Module\",\n // class shared\n // method shared\n\n // PHP\n // class_declaration shared\n // method_declaration shared\n // function_definition shared\n};\n\nexport class TreeSitterLspAdapter {\n static async getDocumentSymbols(filePath: string): Promise<LspSymbol[]> {\n const langId = ParserRegistry.getLanguage(filePath);\n if (!langId) {\n console.warn(`No language found for file: ${filePath}`);\n return [];\n }\n\n try {\n const parser = await loadLanguage(langId);\n const content = await readFile(filePath, \"utf-8\");\n const tree = parser.parse(content);\n\n return this.collectSymbols(tree.rootNode);\n } catch (error) {\n console.error(`Error parsing file ${filePath}:`, error);\n return [];\n }\n }\n\n private static collectSymbols(node: Node): LspSymbol[] {\n const symbols: LspSymbol[] = [];\n const kind = SYMBOL_KIND_MAP[node.type];\n\n if (kind) {\n const name = this.getName(node);\n if (name) {\n const symbol: LspSymbol = {\n name,\n kind,\n range: {\n start: { line: node.startPosition.row, character: node.startPosition.column },\n end: { line: node.endPosition.row, character: node.endPosition.column },\n },\n children: [],\n };\n\n // Recursively find children inside this symbol\n // We need to be careful not to double-count if we iterate all descendants\n // But for a simple tree, we can just iterate named children\n for (const child of node.namedChildren) {\n symbol.children?.push(...this.collectSymbols(child));\n }\n \n symbols.push(symbol);\n return symbols; // Return here so we don't process children again at the top level\n }\n }\n\n // If this node isn't a symbol, check its children\n for (const child of node.namedChildren) {\n symbols.push(...this.collectSymbols(child));\n }\n\n return symbols;\n }\n\n private static getName(node: Node): string | null {\n // Try standard \"name\" field\n const nameNode = node.childForFieldName(\"name\");\n if (nameNode) return nameNode.text;\n\n // TypeScript variable_declarator: \"name\" field works\n // Python function_definition: \"name\" field works\n \n // Fallback: If node has a child that is an identifier\n for (const child of node.namedChildren) {\n if (child.type === \"identifier\" || child.type === \"type_identifier\") {\n return child.text;\n }\n }\n\n return null;\n }\n}\n", "\nimport { ParserRegistry } from \"./registry\";\nimport { loadLanguage } from \"./loader\";\nimport { Parser, Query, type Node } from \"web-tree-sitter\";\n\ninterface ScopeResult {\n locals: string[];\n closure: string[];\n}\n\nconst QUERIES: Record<string, string> = {\n python: `\n (function_definition name: (identifier) @name)\n (parameters (identifier) @param)\n (assignment left: (identifier) @var)\n `,\n typescript: `\n (function_declaration name: (identifier) @name)\n (variable_declarator name: (identifier) @var)\n (required_parameter pattern: (identifier) @param)\n (optional_parameter pattern: (identifier) @param)\n `\n};\n\nexport class ScopeAnalyzer {\n static async getScope(\n filename: string, \n code: string, \n position: { row: number, column: number }\n ): Promise<ScopeResult> {\n const langKey = ParserRegistry.getLanguage(filename);\n if (!langKey) {\n throw new Error(`Unsupported language for file: ${filename}`);\n }\n\n const parser = await loadLanguage(langKey);\n const tree = parser.parse(code);\n const node = tree.rootNode.descendantForPosition(position);\n\n const ancestors = [];\n let current: Node | null = node;\n while (current) {\n ancestors.push(current);\n current = current.parent;\n }\n\n // Identify scope boundaries (simplified)\n // We treat function definitions and the root as scope boundaries.\n const scopeNodes = ancestors.filter(n => \n n.type === 'function_definition' || \n n.type === 'function_declaration' ||\n n.type === 'module' || // Python root\n n.type === 'program' // TS root\n );\n\n const result: ScopeResult = {\n locals: [],\n closure: []\n };\n\n if (scopeNodes.length === 0) return result;\n\n const queryStr = QUERIES[langKey];\n if (!queryStr) return result;\n\n const language = parser.language;\n if (!language) return result;\n const query = new Query(language, queryStr);\n\n // The nearest scope is the first one in the list (closest to leaf)\n // But wait, if we are INSIDE a function, the function node itself IS the scope?\n // descendantForPosition usually returns the leaf node (identifier, etc.)\n // Its parent might be 'expression_statement', then 'block', then 'function_definition'.\n \n // We iterate from closest scope to furthest.\n // 0 is closest (locals), others are closure.\n \n for (let i = 0; i < scopeNodes.length; i++) {\n const scopeNode = scopeNodes[i];\n const captures = query.captures(scopeNode);\n \n const names = new Set<string>();\n \n for (const capture of captures) {\n // We only care about definitions that are \"visible\"\n // For simplicity, we take all captured identifiers in this scope node.\n // But we must exclude nested scopes! \n // Query captures recursively. We need to filter out captures that belong to child scopes of this scopeNode.\n \n const defNode = capture.node;\n \n // Check if defNode belongs to this scopeNode directly (not inside a nested function)\n // We can check if the closest function-like ancestor of defNode is scopeNode.\n let temp: Node | null = defNode.parent;\n \n // Special case: if defNode is the name of a function definition, \n // it belongs to the *enclosing* scope, not the function itself.\n if (temp && (temp.type === 'function_definition' || temp.type === 'function_declaration')) {\n // If this identifier is the 'name' field\n // Note: childForFieldName might not be available on all node types or versions\n // We can check if defNode is the child at 'name' field index or just use field name check if available\n // But simpler: if capture name is @name, it is the function name.\n if (capture.name === 'name') {\n temp = temp.parent; // Start checking from outside the function\n }\n }\n\n let isDirect = true;\n while (temp && temp.id !== scopeNode.id) {\n if (temp.type === 'function_definition' || temp.type === 'function_declaration') {\n isDirect = false;\n break;\n }\n temp = temp.parent;\n }\n \n if (isDirect) {\n names.add(defNode.text);\n }\n }\n\n if (i === 0) {\n result.locals = Array.from(names);\n } else {\n for (const name of names) {\n result.closure.push(name);\n }\n }\n }\n\n // Unique closure\n result.closure = Array.from(new Set(result.closure));\n \n return result;\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;AAAA,SAAS,WAAAA,gBAAe;AACxB,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,YAAAC,iBAAgB;AACzB,YAAY,UAAU;;;ACHtB,SAAS,yBAAyB,qBAAqB,2BAA2B;AAGlF,SAAS,aAAa;AACtB,SAAS,eAAe,qBAAqB;AAC7C,SAAS,oBAAoB;AAkBtB,IAAM,sBAAN,MAA0B;AAAA,EACrB;AAAA,EACA,cAAc,oBAAI,IAAoB;AAAA,EACtC,iBAAiB,oBAAI,IAA4B;AAAA,EACjD,UAAU,oBAAI,IAA6B;AAAA,EAEnD,YAAY,SAAmC;AAC3C,SAAK,aAAa,SAAS,cAAc;AAAA,EAC7C;AAAA,EAEA,QAAQ,KAAa;AACjB,UAAM,MAAM,KAAK,IAAI;AACrB,SAAK,YAAY,IAAI,KAAK,GAAG;AAC7B,UAAM,WAAW,KAAK,eAAe,IAAI,GAAG;AAC5C,QAAI,UAAU;AACV,mBAAa,QAAQ;AAAA,IACzB;AACA,UAAM,QAAQ,WAAW,MAAM;AAC3B,WAAK,eAAe,OAAO,GAAG;AAC9B,YAAM,UAAU,KAAK,QAAQ,IAAI,GAAG;AACpC,UAAI,CAAC,WAAW,QAAQ,SAAS,EAAG;AACpC,iBAAW,YAAY,MAAM,KAAK,OAAO,GAAG;AACxC,iBAAS;AAAA,MACb;AAAA,IACJ,GAAG,KAAK,UAAU;AAClB,SAAK,eAAe,IAAI,KAAK,KAAK;AAAA,EACtC;AAAA,EAEA,YAAY,KAAa,WAAkC;AACvD,UAAM,OAAO,KAAK,YAAY,IAAI,GAAG;AACrC,QAAI,SAAS,UAAa,KAAK,IAAI,IAAI,QAAQ,KAAK,YAAY;AAC5D,aAAO,QAAQ,QAAQ;AAAA,IAC3B;AACA,WAAO,IAAI,QAAQ,aAAW;AAC1B,UAAI,OAAO;AACX,YAAM,SAAS,MAAM;AACjB,YAAI,KAAM;AACV,eAAO;AACP,qBAAa,OAAO;AACpB,cAAMC,WAAU,KAAK,QAAQ,IAAI,GAAG;AACpC,YAAIA,UAAS;AACT,UAAAA,SAAQ,OAAO,MAAM;AACrB,cAAIA,SAAQ,SAAS,EAAG,MAAK,QAAQ,OAAO,GAAG;AAAA,QACnD;AACA,gBAAQ;AAAA,MACZ;AACA,YAAM,UAAU,KAAK,QAAQ,IAAI,GAAG,KAAK,oBAAI,IAAI;AACjD,cAAQ,IAAI,MAAM;AAClB,WAAK,QAAQ,IAAI,KAAK,OAAO;AAC7B,YAAM,UAAU,WAAW,MAAM;AAC7B,eAAO;AAAA,MACX,GAAG,SAAS;AAAA,IAChB,CAAC;AAAA,EACL;AACJ;AAEO,IAAM,mBAAN,MAAuB;AAAA,EAQ1B,YACI,eACA,YACA,KACQ,UACA,UACA,uBACV;AAHU;AACA;AACA;AAGR,UAAM,MAAM;AAAA,MACR,GAAG,QAAQ;AAAA;AAAA,MAEX,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,sBAAsB;AAAA,MACtB,GAAG,KAAK;AAAA,IACZ;AAEA,UAAM,UAAwB;AAAA,MAC1B;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,OAAO;AAAA,IACX;AAEA,SAAK,UAAU,MAAM,eAAe,YAAY,OAAO;AAEvD,SAAK,QAAQ,OAAO,GAAG,QAAQ,CAAC,SAAS;AACrC,cAAQ,MAAM,gBAAgB,IAAI,EAAE;AAAA,IACxC,CAAC;AAED,SAAK,aAAa;AAAA,MACd,IAAI,oBAAoB,KAAK,QAAQ,MAAM;AAAA,MAC3C,IAAI,oBAAoB,KAAK,QAAQ,KAAK;AAAA,IAC9C;AAEA,SAAK,WAAW,eAAe,CAAC,QAAQ,WAAW;AAC/C,UAAI,WAAW,uBAAuB,WAAW,cAAc;AAC3D,gBAAQ,IAAI,sBAAsB,MAAM,KAAK,KAAK,UAAU,MAAM,CAAC;AAAA,MACvE;AACA,UAAI,WAAW,mCAAmC;AAC9C,YAAI;AACC,gBAAM,UAAU;AAChB,gBAAM,MAAM,QAAQ,OAAO;AAC3B,cAAI,WAAW;AACf,cAAI,IAAI,WAAW,SAAS,GAAG;AAC3B,uBAAW,cAAc,GAAG;AAAA,UAChC;AAEA,gBAAM,gBAAgB,KAAK,aAAa,QAAQ;AAC/C,eAAK,eAAe,IAAI,eAAe,QAAQ,eAAe,CAAC,CAAC;AAGhE,eAAK,eAAe,QAAQ,aAAa;AACzC,eAAK,iBAAiB,KAAK,eAAe,EAAE,KAAK,UAAU,aAAa,QAAQ,eAAe,CAAC,EAAE,CAA4B;AAAA,QACpI,SAAS,GAAG;AACR,kBAAQ,MAAM,uCAAuC,CAAC;AAAA,QAC1D;AAAA,MACJ;AAAA,IACJ,CAAC;AAED,SAAK,WAAW,UAAU,CAAC,QAAQ,WAAW;AAE1C,UAAI,WAAW,2BAA2B;AACtC,cAAM,UAAU;AAChB,cAAM,QAAQ,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAC9D,eAAO,MAAM,IAAI,CAAC,SAAc;AAC5B,gBAAM,UAAU,OAAO,MAAM,WAAW,EAAE;AAC1C,cAAI,YAAY,UAAU,QAAQ,WAAW,OAAO,GAAG;AACnD,mBAAO,EAAE,aAAa,EAAE,QAAQ,MAAM,GAAG,SAAS,CAAC,EAAE;AAAA,UACzD;AACA,iBAAO,CAAC;AAAA,QACZ,CAAC;AAAA,MACL;AACA,UAAI,WAAW,6BAA6B;AACxC,eAAO;AAAA,MACX;AACA,aAAO;AAAA,IACX,CAAC;AAED,SAAK,WAAW,OAAO;AAAA,EAC3B;AAAA,EAxFQ;AAAA,EACA;AAAA,EACD;AAAA,EACC,mBAAmB,IAAI,aAAa;AAAA,EACpC,iBAAiB,IAAI,oBAAoB;AAAA,EACzC,iBAAiB,oBAAI,IAAmB;AAAA,EAqFzC,aAAa,UAA0B;AAC1C,QAAI,MAAM,cAAc,QAAQ,EAAE;AAClC,QAAI,QAAQ,aAAa,SAAS;AAC9B,YAAM,IAAI,QAAQ,6BAA6B,CAAC,OAAO,UAAU;AAC7D,eAAO,WAAW,MAAM,YAAY,CAAC;AAAA,MACzC,CAAC;AAAA,IACL;AACA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,aAAa;AACf,UAAM,UAAU,KAAK,aAAa,KAAK,QAAQ;AAE/C,YAAQ,IAAI,4DAA4D,OAAO;AAC/E,UAAM,SAMF;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB;AAAA,MACA,cAAc;AAAA,QACV,cAAc;AAAA,UACV,iBAAiB;AAAA,YACb,SAAS;AAAA,YACT,WAAW;AAAA,YACX,UAAU;AAAA,YACV,mBAAmB;AAAA,YACnB,SAAS;AAAA,UACb;AAAA,UACA,OAAO;AAAA,YACH,eAAe,CAAC,YAAY,WAAW;AAAA,UAC3C;AAAA,UACA,YAAY,CAAC;AAAA,UACb,YAAY,CAAC;AAAA,QACjB;AAAA,QACA,WAAW;AAAA,UACP,kBAAkB;AAAA,QACtB;AAAA,MACJ;AAAA,MACA,kBAAkB;AAAA,QACd;AAAA,UACI,MAAM;AAAA,UACN,KAAK,KAAK,aAAa,KAAK,QAAQ;AAAA,QACxC;AAAA,MACJ;AAAA,IACJ;AACA,QAAI,KAAK,yBAAyB,OAAO,KAAK,KAAK,qBAAqB,EAAE,SAAS,GAAG;AAClF,aAAO,wBAAwB,KAAK;AAAA,IACxC;AAEA,UAAM,SAAS,MAAM,KAAK,WAAW,YAAY,cAAc,MAAM;AACrE,UAAM,KAAK,WAAW,iBAAiB,eAAe,CAAC,CAAC;AAGxD,UAAM,KAAK,WAAW,iBAAiB,oCAAoC;AAAA,MACvE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,MAAM,GAAG,SAAS,CAAC,EAAE,EAAE;AAAA,IACtE,CAAC;AAGD,UAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,GAAG,CAAC;AAErD,SAAK,eAAgB,OAAe;AACpC,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,WAAW;AACb,QAAI;AACA,YAAM,KAAK,WAAW,YAAY,UAAU;AAC5C,YAAM,KAAK,WAAW,iBAAiB,MAAM;AAAA,IACjD,SAAS,OAAO;AAAA,IAEhB;AACA,SAAK,WAAW,QAAQ;AACxB,SAAK,QAAQ,KAAK;AAAA,EACtB;AAAA,EAEA,MAAM,eAAe,UAAkB,MAAc,WAAmB;AACpE,UAAM,SAAS;AAAA,MACX,cAAc,EAAE,KAAK,KAAK,aAAa,QAAQ,EAAE;AAAA,MACjD,UAAU,EAAE,MAAM,OAAO,GAAG,WAAW,YAAY,EAAE;AAAA,IACzD;AACA,WAAO,KAAK,WAAW,YAAY,2BAA2B,MAAM;AAAA,EACxE;AAAA,EAEA,MAAM,eAAe,UAAkB,MAAc,WAAmB;AACpE,UAAM,SAAS;AAAA,MACX,cAAc,EAAE,KAAK,KAAK,aAAa,QAAQ,EAAE;AAAA,MACjD,UAAU,EAAE,MAAM,OAAO,GAAG,WAAW,YAAY,EAAE;AAAA,MACrD,SAAS,EAAE,oBAAoB,KAAK;AAAA,IACxC;AACA,WAAO,KAAK,WAAW,YAAY,2BAA2B,MAAM;AAAA,EACxE;AAAA,EAEA,MAAM,MAAM,UAAkB,MAAc,WAAmB;AAC3D,UAAM,SAAS;AAAA,MACX,cAAc,EAAE,KAAK,KAAK,aAAa,QAAQ,EAAE;AAAA,MACjD,UAAU,EAAE,MAAM,OAAO,GAAG,WAAW,YAAY,EAAE;AAAA,IACzD;AACA,WAAO,KAAK,WAAW,YAAY,sBAAsB,MAAM;AAAA,EACnE;AAAA,EAEA,MAAM,eAAe,UAAkB;AACnC,UAAM,SAAS;AAAA,MACX,cAAc,EAAE,KAAK,KAAK,aAAa,QAAQ,EAAE;AAAA,IACrD;AACA,WAAO,KAAK,WAAW,YAAY,+BAA+B,MAAM;AAAA,EAC5E;AAAA,EAEA,MAAM,gBAAgB,OAAe;AACjC,UAAM,SAAS;AAAA,MACX;AAAA,IACJ;AACA,WAAO,KAAK,WAAW,YAAY,oBAAoB,MAAM;AAAA,EACjE;AAAA,EAEA,MAAM,mBAAmB,UAAkB,MAAc,WAAmB;AACxE,UAAM,SAAS;AAAA,MACX,cAAc,EAAE,KAAK,KAAK,aAAa,QAAQ,EAAE;AAAA,MACjD,UAAU,EAAE,MAAM,OAAO,GAAG,WAAW,YAAY,EAAE;AAAA,IACzD;AACA,WAAO,KAAK,WAAW,YAAY,+BAA+B,MAAM;AAAA,EAC5E;AAAA,EAEA,MAAM,qBAAqB,UAAkB,MAAc,WAAmB;AAC1E,UAAM,SAAS;AAAA,MACX,cAAc,EAAE,KAAK,KAAK,aAAa,QAAQ,EAAE;AAAA,MACjD,UAAU,EAAE,MAAM,OAAO,GAAG,WAAW,YAAY,EAAE;AAAA,IACzD;AACA,WAAO,KAAK,WAAW,YAAY,qCAAqC,MAAM;AAAA,EAClF;AAAA,EAEA,MAAM,cAAc,MAAW;AAC3B,UAAM,SAAS,EAAE,KAAK;AACtB,WAAO,KAAK,WAAW,YAAY,+BAA+B,MAAM;AAAA,EAC5E;AAAA,EAEA,MAAM,cAAc,MAAW;AAC3B,UAAM,SAAS,EAAE,KAAK;AACtB,WAAO,KAAK,WAAW,YAAY,+BAA+B,MAAM;AAAA,EAC5E;AAAA,EAEA,MAAM,QAAQ,UAAkB,SAAiB,YAAoB;AACjE,UAAM,SAAS;AAAA,MACX,cAAc;AAAA,QACV,KAAK,KAAK,aAAa,QAAQ;AAAA,QAC/B;AAAA,QACA,SAAS;AAAA,QACT,MAAM;AAAA,MACV;AAAA,IACJ;AACA,UAAM,KAAK,WAAW,iBAAiB,wBAAwB,MAAM;AAAA,EACzE;AAAA,EAEA,MAAM,UAAU,UAAkB,SAAiB,SAAiB;AAChE,UAAM,SAAS;AAAA,MACX,cAAc;AAAA,QACV,KAAK,KAAK,aAAa,QAAQ;AAAA,QAC/B;AAAA,MACJ;AAAA,MACA,gBAAgB,CAAC,EAAE,MAAM,QAAQ,CAAC;AAAA,IACtC;AACA,UAAM,KAAK,WAAW,iBAAiB,0BAA0B,MAAM;AAAA,EAC3E;AAAA,EAEA,MAAM,SAAS,UAAkB;AAC7B,UAAM,SAAS;AAAA,MACX,cAAc;AAAA,QACV,KAAK,KAAK,aAAa,QAAQ;AAAA,MACnC;AAAA,IACJ;AACA,UAAM,KAAK,WAAW,iBAAiB,yBAAyB,MAAM;AAAA,EAC1E;AAAA,EAEA,MAAM,iBAAiB,UAAkB,YAAoB,KAAqB;AAC9E,UAAM,gBAAgB,KAAK,aAAa,QAAQ;AAChD,UAAM,KAAK,eAAe,YAAY,eAAe,SAAS;AAAA,EAClE;AAAA,EAEA,GAAG,OAAsB,SAA4C;AACjE,SAAK,iBAAiB,GAAG,OAAO,OAAO;AAAA,EAC3C;AAAA,EAEA,IAAI,OAAsB,SAA4C;AAClE,SAAK,iBAAiB,IAAI,OAAO,OAAO;AAAA,EAC5C;AAAA,EAEA,eAAe,UAAyB;AACpC,WAAO,KAAK,eAAe,IAAI,KAAK,aAAa,QAAQ,CAAC,KAAK,CAAC;AAAA,EACpE;AAAA,EAEA,yBAA+C;AAC3C,UAAM,YAAkC,CAAC;AACzC,eAAW,CAAC,KAAK,WAAW,KAAK,KAAK,eAAe,QAAQ,GAAG;AAC5D,UAAI,WAAW;AACf,UAAI;AACA,YAAI,IAAI,WAAW,SAAS,GAAG;AAC3B,qBAAW,cAAc,GAAG;AAAA,QAChC;AAAA,MACJ,QAAQ;AACJ,mBAAW;AAAA,MACf;AACA,YAAM,UAAU;AAAA,QACZ;AAAA,QACA;AAAA,QACA,OAAO,YAAY;AAAA,QACnB,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,OAAO;AAAA,QACP,OAAO;AAAA,MACX;AACA,iBAAW,cAAc,aAAa;AAClC,cAAM,WAAW,YAAY;AAC7B,YAAI,aAAa,EAAG,SAAQ,UAAU;AAAA,iBAC7B,aAAa,EAAG,SAAQ,YAAY;AAAA,iBACpC,aAAa,EAAG,SAAQ,SAAS;AAAA,iBACjC,aAAa,EAAG,SAAQ,SAAS;AAAA,MAC9C;AACA,gBAAU,KAAK,OAAO;AAAA,IAC1B;AACA,WAAO;AAAA,EACX;AACJ;;;ACzYA,SAAS,SAAS,MAAM,SAAc,gBAAgB;AACtD,SAAS,iBAAAC,sBAAqB;AAG9B,SAAS,SAAS,gBAAgB;AAClC,SAAS,kBAAkB;AAG3B,SAAS,iBAAiB;AAWnB,IAAM,mBAAN,MAAM,kBAAiB;AAAA,EAC1B,OAAe;AAAA,EACf,OAAe,gBAAyC;AAAA,EAChD,UAAyC,oBAAI,IAAI;AAAA,EACjD,WAA0D,oBAAI,IAAI;AAAA,EAClE,SAAsB,oBAAI,IAAI;AAAA,EAE9B,cAAc;AAAA,EAAC;AAAA,EAEvB,OAAO,cAAgC;AACnC,QAAI,CAAC,kBAAiB,UAAU;AAC5B,wBAAiB,WAAW,IAAI,kBAAiB;AAAA,IACrD;AACA,WAAO,kBAAiB;AAAA,EAC5B;AAAA,EAEA,OAAO,yBAAyB,SAAkC;AAC9D,sBAAiB,gBAAgB;AAAA,EACrC;AAAA,EAEA,cAAc,KAAa,YAAoC;AAC3D,QAAI,YAAY,WAAY,QAAO,WAAW;AAC9C,WAAO,kBAAkB,YAAY,EAAE,0BAA0B,GAAG;AAAA,EACxE;AAAA,EAEA,MAAc,uBAAuB,UAAkB;AACnD,QAAI;AAEC,YAAM,QAAQ,MAAM,QAAQ,UAAU,EAAE,eAAe,KAAK,CAAC;AAC7D,YAAM,eAAe,oBAAI,IAAoB;AAG7C,YAAM,YAAY,IAAI,IAAI,MAAM,IAAI,OAAK,EAAE,IAAI,CAAC;AAChD,UAAI,UAAU,IAAI,eAAe,KAAK,UAAU,IAAI,cAAc,GAAG;AAGjE,YAAI,CAAC,MAAM,KAAK,OAAK,EAAE,OAAO,KAAK,qBAAqB,KAAK,EAAE,IAAI,CAAC,GAAG;AACpE,cAAI;AACA,kBAAM,WAAW,MAAM,QAAQ,KAAK,UAAU,KAAK,GAAG,EAAE,eAAe,KAAK,CAAC;AAC7E,kBAAM,cAAc,SAAS,KAAK,OAAK,EAAE,OAAO,KAAK,qBAAqB,KAAK,EAAE,IAAI,CAAC;AACtF,gBAAI,aAAa;AACb,2BAAa,IAAI,QAAQ,YAAY,IAAI,GAAG,KAAK,UAAU,OAAO,YAAY,IAAI,CAAC;AAAA,YACvF;AAAA,UACJ,SAAS,GAAG;AAAA,UAEZ;AAAA,QACH;AAAA,MACJ;AACA,UAAI,UAAU,IAAI,QAAQ,GAAG;AACzB,qBAAa,IAAI,OAAO,KAAK,UAAU,QAAQ,CAAC;AAEhD,YAAI,UAAU,IAAI,SAAS,EAAG,cAAa,IAAI,OAAO,KAAK,UAAU,SAAS,CAAC;AAAA,MACnF;AACA,UAAI,UAAU,IAAI,YAAY,GAAG;AAE7B,YAAI;AACA,cAAI,WAAW,KAAK,UAAU,OAAO,SAAS,CAAC,EAAG,cAAa,IAAI,OAAO,KAAK,UAAU,OAAO,SAAS,CAAC;AAAA,mBACjG,WAAW,KAAK,UAAU,OAAO,QAAQ,CAAC,EAAG,cAAa,IAAI,OAAO,KAAK,UAAU,OAAO,QAAQ,CAAC;AAAA,QACjH,SAAS,GAAG;AAAA,QAAC;AAAA,MACjB;AAEA,iBAAW,QAAQ,OAAO;AACtB,YAAI,KAAK,OAAO,GAAG;AACf,gBAAM,MAAM,QAAQ,KAAK,IAAI;AAC7B,cAAI,OAAO,CAAC,aAAa,IAAI,GAAG,GAAG;AAC/B,yBAAa,IAAI,KAAK,KAAK,UAAU,KAAK,IAAI,CAAC;AAAA,UACnD;AAAA,QACJ;AAAA,MACJ;AAGA,iBAAW,CAAC,KAAK,QAAQ,KAAK,cAAc;AAGxC,cAAM,SAAS,MAAM,KAAK,UAAU,UAAU,QAAQ;AAEtD,YAAI,QAAQ;AAER,cAAI;AAEA,kBAAM,UAAU,MAAM,SAAS,UAAU,OAAO;AAIjD,kBAAM,aAAa,kBAAkB,YAAY,EAAE,sBAAsB,GAAG;AAC5E,kBAAM,OAAO,QAAQ,UAAU,SAAS,KAAK,cAAc,KAAK,cAAc,MAAS,CAAC;AACvF,kBAAM,OAAO,iBAAiB,UAAU,GAAI;AAAA,UAEhD,SAAS,GAAG;AAAA,UAGZ;AAAA,QACJ,OAAO;AAAA,QAEP;AAAA,MACJ;AAAA,IACL,SAAS,GAAG;AAAA,IAEZ;AAAA,EACJ;AAAA,EAEA,MAAM,iBAAiB,UAAoD;AACvE,UAAM,WAAW,MAAM,KAAK,mBAAmB,QAAQ;AACvD,WAAO,KAAK,UAAU,UAAU,QAAQ;AAAA,EAC5C;AAAA,EAEA,MAAM,mBAAmB,UAAmC;AACxD,UAAM,MAAM,QAAQ,QAAQ;AAC5B,UAAM,aAAa,kBAAkB,YAAY,EAAE,sBAAsB,GAAG;AAC5E,QAAI,YAAY;AACZ,aAAO,KAAK,qBAAqB,UAAU,UAAU;AAAA,IACzD;AACA,UAAM,MAAM,OAAO;AACnB,QAAI,SAAS,WAAW,GAAG,GAAG;AAC1B,aAAO;AAAA,IACX;AACA,WAAO,QAAQ,QAAQ;AAAA,EAC3B;AAAA,EAEA,MAAM,UAAU,UAAkB,UAAqD;AACnF,UAAM,MAAM,QAAQ,QAAQ;AAC5B,UAAM,UAAU,kBAAkB,YAAY,EAAE,uBAAuB,GAAG;AAC1E,QAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,eAAW,cAAc,SAAS;AAC9B,YAAM,SAAS,MAAM,KAAK,mBAAmB,UAAU,YAAY,QAAQ;AAC3E,UAAI,OAAQ,QAAO;AAAA,IACvB;AACA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,kBAAkB,UAAkB,UAAgD;AACtF,UAAM,MAAM,QAAQ,QAAQ;AAC5B,UAAM,UAAU,kBAAkB,YAAY,EAAE,uBAAuB,GAAG;AAC1E,QAAI,QAAQ,WAAW,EAAG,QAAO,CAAC;AAClC,UAAM,UAA8B,CAAC;AACrC,eAAW,cAAc,SAAS;AAC9B,YAAM,SAAS,MAAM,KAAK,mBAAmB,UAAU,YAAY,QAAQ;AAC3E,UAAI,OAAQ,SAAQ,KAAK,MAAM;AAAA,IACnC;AACA,WAAO;AAAA,EACX;AAAA,EAEA,MAAc,YACV,cACA,YACA,KACgC;AAChC,UAAM,MAAM,MAAM,WAAW,WAAW,YAAY;AACpD,QAAI,CAAC,KAAK;AACN,aAAO;AAAA,IACX;AACA,UAAM,UAAU,eAAe,KAAK,YAAY,IAAI,QAAQ,IAAI,IAAI;AACpE,QAAI,WAAW,WAAW;AAC1B,QAAI,WAAW,OAAO,aAAa,WAAW,OAAO,MAAM;AACvD,YAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,wBAAa;AACvD,YAAM,aAAa,iBAAiB,YAAY;AAChD,UAAI,YAAY;AACZ,mBAAW,EAAE,GAAI,YAAY,CAAC,GAAI,WAAW;AAAA,MACjD;AAAA,IACJ;AACA,UAAM,cAAc,kBAAiB,kBAAkB,IAAI,SAAuC,IAAI,iBAAiB,GAAG,IAAI;AAAA,MAC1H,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX;AAAA,IACJ;AACA,UAAM,WAAW,WAAW;AAC5B,SAAK,QAAQ,IAAI,KAAK,UAAU;AAChC,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,cAAc;AAChB,eAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AACxC,YAAM,OAAO,SAAS;AAAA,IAC1B;AACA,SAAK,QAAQ,MAAM;AACnB,SAAK,OAAO,MAAM;AAClB,SAAK,SAAS,MAAM;AAAA,EACxB;AAAA,EAEA,MAAM,gBACF,OACA,WAAmB,OAAO,GAC1B,SACc;AAEd,QAAI,KAAK,QAAQ,SAAS,GAAG;AACzB,YAAM,KAAK,uBAAuB,QAAQ;AAAA,IAC9C;AAEA,UAAM,UAAiB,CAAC;AACxB,eAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AACxC,UAAI;AACA,cAAM,UAAU,MAAM,OAAO,gBAAgB,KAAK;AAClD,YAAI,WAAW,MAAM,QAAQ,OAAO,GAAG;AACnC,kBAAQ,KAAK,GAAG,OAAO;AAAA,QAC3B;AAAA,MACJ,SAAS,GAAG;AAAA,MAEZ;AAAA,IACJ;AAGA,QAAI,QAAQ,WAAW,KAAK,MAAM,SAAS,GAAG;AAC1C,iBAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AACxC,YAAI;AAKA,gBAAM,eAAe,MAAM,OAAO,gBAAgB,EAAE;AACpD,cAAI,gBAAgB,MAAM,QAAQ,YAAY,GAAG;AAC7C,uBAAW,OAAO,cAAc;AAC5B,oBAAM,OAAO,YAAY,OAAO,IAAI,IAAI;AAExC,kBAAI,QAAQ,KAAK,QAAQ,MAAM,SAAS,KAAK;AACzC,wBAAQ,KAAK,GAAG;AAAA,cACpB;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ,SAAS,GAAG;AAAA,QAEZ;AAAA,MACJ;AAAA,IACJ;AAEA,UAAM,oBAAoB,QAAQ,IAAI,SAAO;AACzC,UAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,UAAI,CAAC,IAAI,SAAS,IAAI,UAAU,OAAO;AACnC,YAAI,QAAQ,IAAI,SAAS;AAAA,MAC7B;AACA,UAAI,CAAC,IAAI,OAAO,IAAI,UAAU,KAAK;AAC/B,YAAI,MAAM,IAAI,SAAS;AAAA,MAC3B;AACA,aAAO;AAAA,IACX,CAAC;AAED,UAAM,kBAAkB,CAAC,QAAgB;AACrC,UAAI;AACA,YAAI,IAAI,WAAW,SAAS,GAAG;AAC3B,iBAAOC,eAAc,GAAG;AAAA,QAC5B;AAAA,MACJ,QAAQ;AAAA,MAAC;AACT,aAAO;AAAA,IACX;AAEA,UAAM,iBAAiB,CAAC,OAAc,SAAgB,CAAC,MAAM;AACzD,iBAAW,QAAQ,OAAO;AACtB,YAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AACvC,eAAO,KAAK,IAAI;AAChB,YAAI,MAAM,QAAQ,KAAK,QAAQ,KAAK,KAAK,SAAS,SAAS,GAAG;AAC1D,yBAAe,KAAK,UAAU,MAAM;AAAA,QACxC;AAAA,MACJ;AACA,aAAO;AAAA,IACX;AAEA,UAAM,eAAe,kBAAkB;AAAA,MACnC,SAAO,OAAO,CAAC,IAAI,SAAS,OAAO,IAAI,QAAQ,YAAY,IAAI,IAAI,SAAS;AAAA,IAChF;AACA,QAAI,aAAa,SAAS,GAAG;AACzB,YAAM,QAAQ,oBAAI,IAAmB;AACrC,iBAAW,OAAO,cAAc;AAC5B,YAAI,CAAC,MAAM,IAAI,IAAI,GAAG,EAAG,OAAM,IAAI,IAAI,KAAK,CAAC,CAAC;AAC9C,cAAM,IAAI,IAAI,GAAG,EAAG,KAAK,GAAG;AAAA,MAChC;AACA,YAAM,gBAAgB,oBAAI,IAAmB;AAC7C,iBAAW,CAAC,KAAK,OAAO,KAAK,MAAM,QAAQ,GAAG;AAC1C,cAAM,WAAW,gBAAgB,GAAG;AACpC,YAAI,kBAAkB,cAAc,IAAI,QAAQ;AAChD,YAAI,CAAC,iBAAiB;AAClB,4BAAmB,MAAM,KAAK,eAAe,UAAU,QAAQ,KAAM,CAAC;AACtE,wBAAc,IAAI,UAAU,eAAe;AAAA,QAC/C;AACA,cAAM,OAAO,eAAe,eAAe;AAC3C,mBAAW,OAAO,SAAS;AACvB,cAAI,QAAQ,KAAK;AAAA,YACb,UAAQ,MAAM,SAAS,IAAI,SAAS,IAAI,SAAS,UAAa,MAAM,SAAS,IAAI;AAAA,UACrF;AACA,cAAI,CAAC,OAAO;AACR,oBAAQ,KAAK,KAAK,UAAQ,MAAM,SAAS,IAAI,IAAI;AAAA,UACrD;AACA,gBAAM,QAAQ,OAAO,SAAS,OAAO,UAAU;AAC/C,cAAI,OAAO;AACP,gBAAI,QAAQ;AAAA,UAChB;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,UAAM,eAAe,kBAAkB,OAAO,SAAO,OAAO,IAAI,SAAS,IAAI,IAAI;AAEjF,UAAM,OAAO,oBAAI,IAAY;AAC7B,UAAM,UAAiB,CAAC;AACxB,eAAW,OAAO,cAAc;AAC5B,YAAM,MAAM,KAAK,UAAU,OAAO,KAAK,OAAO;AAC9C,YAAM,OAAO,KAAK,OAAO,OAAO,QAAQ,KAAK,UAAU,OAAO,OAAO,QAAQ;AAC7E,YAAM,YAAY,KAAK,OAAO,OAAO,aAAa,KAAK,UAAU,OAAO,OAAO,aAAa;AAC5F,YAAM,OAAO,KAAK,QAAQ;AAC1B,YAAM,MAAM,GAAG,KAAK,QAAQ,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,SAAS;AAClE,UAAI,CAAC,KAAK,IAAI,GAAG,GAAG;AAChB,aAAK,IAAI,GAAG;AACZ,gBAAQ,KAAK,GAAG;AAAA,MACpB;AAAA,IACJ;AAEA,QAAI,WAAW;AACf,QAAI,SAAS,eAAe,QAAQ,YAAY,SAAS,GAAG;AACxD,YAAM,eAAe,IAAI,IAAI,QAAQ,WAAW;AAChD,iBAAW,SAAS,OAAO,SAAO,aAAa,IAAI,KAAK,IAAI,CAAC;AAAA,IACjE;AACA,QAAI,SAAS,cAAc;AACvB,YAAM,SAAS,QAAQ,aAAa,YAAY;AAChD,iBAAW,SAAS;AAAA,QAAO,SACvB,OAAO,KAAK,QAAQ,EAAE,EAAE,YAAY,EAAE,SAAS,MAAM;AAAA,MACzD;AAAA,IACJ;AACA,QAAI,SAAS,aAAa,UAAa,SAAS,SAAS,QAAQ,UAAU;AACvE,iBAAW,SAAS,MAAM,GAAG,QAAQ,QAAQ;AAAA,IACjD;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,eAAe,UAAkB,WAAmB,OAAO,GAA0B;AACvF,UAAM,SAAS,MAAM,KAAK,UAAU,UAAU,QAAQ;AACtD,QAAI,CAAC,QAAQ;AACT,aAAO;AAAA,IACX;AAEA,QAAI;AACA,YAAM,UAAU,MAAM,SAAS,UAAU,OAAO;AAChD,YAAM,MAAM,QAAQ,QAAQ;AAC5B,YAAM,aAAa,kBAAkB,YAAY,EAAE,sBAAsB,GAAG;AAC5E,YAAM,aAAa,KAAK,cAAc,KAAK,cAAc,MAAS;AAClE,YAAM,OAAO,QAAQ,UAAU,SAAS,UAAU;AAElD,YAAM,OAAO,iBAAiB,UAAU,GAAI;AAE5C,YAAM,UAAU,MAAM,OAAO,eAAe,QAAQ;AACpD,aAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC;AAAA,IAC/C,SAAS,GAAG;AACR,cAAQ,MAAM,sCAAsC,QAAQ,KAAK,CAAC;AAClE,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,MAAM,eAAe,UAAkB,WAAmB,OAAO,GAAmB;AAChF,UAAM,SAAS,MAAM,KAAK,UAAU,UAAU,QAAQ;AACtD,QAAI,CAAC,QAAQ;AACT,aAAO,CAAC;AAAA,IACZ;AAMA,WAAO,OAAO,eAAe,QAAQ;AAAA,EACzC;AAAA,EAEA,MAAM,kBAAkB,UAAkB,WAAmB,OAAO,GAAmB;AACnF,UAAM,KAAK,kBAAkB,UAAU,QAAQ;AAC/C,UAAM,UAAiB,CAAC;AACxB,eAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AACxC,UAAI;AACA,cAAM,cAAc,OAAO,eAAe,QAAQ;AAClD,YAAI,eAAe,YAAY,SAAS,GAAG;AACvC,kBAAQ,KAAK,GAAG,WAAW;AAAA,QAC/B;AAAA,MACJ,SAAS,GAAG;AAAA,MACZ;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,SAAS;AACL,UAAM,cAAc,CAAC;AACrB,eAAW,CAAC,KAAK,MAAM,KAAK,KAAK,QAAQ,QAAQ,GAAG;AAChD,YAAM,WAAY,OAAe,yBAAyB;AAC1D,UAAI,MAAM,QAAQ,QAAQ,KAAK,SAAS,SAAS,GAAG;AAChD,oBAAY,KAAK,EAAE,QAAQ,KAAK,SAAS,SAAS,CAAC;AAAA,MACvD;AAAA,IACJ;AACA,WAAO;AAAA,MACH,SAAS,MAAM,KAAK,KAAK,QAAQ,KAAK,CAAC;AAAA,MACvC,UAAU,MAAM,KAAK,KAAK,SAAS,KAAK,CAAC;AAAA,MACzC,QAAQ,MAAM,KAAK,KAAK,OAAO,OAAO,CAAC;AAAA,MACvC;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,iBAAiB,UAAkB,WAAmB,OAAO,GAAG,YAAoB,KAAqB;AAE3G,UAAM,SAAS,MAAM,KAAK,iBAAiB,QAAQ;AACnD,QAAI,QAAQ;AACR,YAAM,OAAO,iBAAiB,UAAU,SAAS;AAAA,IACrD;AAAA,EACJ;AAAA,EAEQ,qBAAqB,UAAkB,YAAoC;AAC/E,UAAM,gBAAgB,CAAC,UAAkB,MAAM,QAAQ,OAAO,GAAG;AACjE,UAAM,iBAAiB,cAAc,QAAQ;AAC7C,UAAM,gBAAgB,cAAc,SAAS,OAAO,GAAG,QAAQ,CAAC;AAChE,UAAM,UAAU,CAAC,aACb,SAAS,KAAK,aAAW;AACrB,UAAI,UAAU,gBAAgB,SAAS,EAAE,KAAK,KAAK,CAAC,EAAG,QAAO;AAC9D,UAAI,iBAAiB,CAAC,cAAc,WAAW,IAAI,GAAG;AAClD,eAAO,UAAU,eAAe,SAAS,EAAE,KAAK,KAAK,CAAC;AAAA,MAC1D;AACA,aAAO;AAAA,IACX,CAAC;AACL,QAAI,WAAW,eAAe,QAAQ,WAAW,WAAW,EAAG,QAAO;AACtE,QAAI,WAAW,eAAe,CAAC,QAAQ,WAAW,WAAW,EAAG,QAAO;AACvE,WAAO;AAAA,EACX;AAAA,EAEA,MAAc,qBAAqB,UAAkB,YAA4C;AAC7F,UAAM,MAAM,OAAO;AACnB,QAAI;AACJ,QAAI,WAAW,YAAY,SAAS,GAAG;AACnC,oBAAc,MAAM,gBAAgB,QAAQ,QAAQ,GAAG,WAAW,aAAa;AAAA,QAC3E,SAAS,WAAW;AAAA,QACpB,SAAS,WAAW;AAAA,QACpB,UAAU,WAAW;AAAA,QACrB;AAAA,MACJ,CAAC;AAAA,IACL;AACA,QAAI,CAAC,aAAa;AACd,oBAAc,SAAS,WAAW,GAAG,IAAI,MAAM,QAAQ,QAAQ;AAAA,IACnE;AACA,QAAI,WAAW,aAAa;AACxB,YAAM,WAAW,MAAM,WAAW,YAAY,UAAU,WAAW;AACnE,aAAO,YAAY;AAAA,IACvB;AACA,WAAO;AAAA,EACX;AAAA,EAEA,MAAc,mBACV,UACA,YACA,UACgC;AAChC,QAAI,CAAC,KAAK,qBAAqB,UAAU,UAAU,GAAG;AAClD,aAAO;AAAA,IACX;AACA,UAAM,eAAe,YAAa,MAAM,KAAK,qBAAqB,UAAU,UAAU;AACtF,QAAI;AACA,YAAM,QAAQ,MAAM,WAAW,QAAQ;AACvC,UAAI,CAAC,OAAO;AACR,eAAO;AAAA,MACX;AAAA,IACJ,SAAS,GAAG;AACR,aAAO;AAAA,IACX;AAEA,UAAM,MAAM,GAAG,YAAY,IAAI,WAAW,EAAE;AAC5C,QAAI,KAAK,OAAO,IAAI,GAAG,GAAG;AACtB,aAAO;AAAA,IACX;AACA,UAAM,gBAAgB,KAAK,SAAS,IAAI,GAAG;AAC3C,QAAI,eAAe;AACf,aAAO;AAAA,IACX;AACA,QAAI,SAAS,KAAK,QAAQ,IAAI,GAAG;AAEjC,QAAI,CAAC,QAAQ;AACT,YAAM,gBAAgB,YAAY;AAC9B,YAAI;AACA,iBAAO,MAAM,KAAK,YAAY,cAAc,YAAY,GAAG;AAAA,QAC/D,SAAS,OAAO;AACZ,eAAK,OAAO,IAAI,GAAG;AACnB,iBAAO;AAAA,QACX,UAAE;AACE,eAAK,SAAS,OAAO,GAAG;AAAA,QAC5B;AAAA,MACJ,GAAG;AACH,WAAK,SAAS,IAAI,KAAK,YAAY;AACnC,eAAS,MAAM;AAAA,IACnB;AAEA,WAAO;AAAA,EACX;AACJ;;;ACzfA,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,YAAAC,iBAAgB;AASzB,IAAM,kBAA0C;AAAA,EAC9C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,SAAS,kBAAkB,UAA0B;AACnD,QAAM,MAAM,OAAO;AACnB,MAAI;AACF,UAAM,MAAMC,UAAS,KAAK,QAAQ;AAClC,QAAI,CAAC,OAAO,QAAQ,GAAI,QAAO;AAC/B,QAAI,IAAI,WAAW,IAAI,EAAG,QAAO;AACjC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,eAAe,KAAa,OAA+D;AAChG,QAAM,WAAWC,eAAc,GAAG;AAClC,SAAO,GAAG,kBAAkB,QAAQ,CAAC,IAAI,MAAM,MAAM,OAAO,CAAC,IAAI,MAAM,MAAM,YAAY,CAAC;AAC9F;AAEA,SAAS,kBAAkB,MAAmB;AAC5C,MAAI,OAAO,SAAS,SAAU,QAAO,gBAAgB,IAAI,KAAK,QAAQ,IAAI;AAC1E,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,SAAO;AACT;AAEA,SAAS,wBAAwB,MAA4C;AAC3E,QAAM,OAAO,kBAAkB,MAAM,IAAI;AACzC,QAAM,QAAQ,MAAM,kBAAkB,MAAM;AAC5C,MAAI,MAAM,OAAO,OAAO;AACtB,WAAO;AAAA,MACL,OAAO,GAAG,KAAK,IAAI,KAAK,IAAI,QAAQ,eAAe,KAAK,KAAK,KAAK,CAAC;AAAA,MACnE,KAAK,KAAK;AAAA,IACZ;AAAA,EACF;AACA,MAAI,MAAM,KAAK;AACb,WAAO;AAAA,MACL,OAAO,GAAG,KAAK,IAAI,KAAK,IAAI,QAAQ,kBAAkBA,eAAc,KAAK,GAAG,CAAC,CAAC;AAAA,MAC9E,KAAK,KAAK;AAAA,IACZ;AAAA,EACF;AACA,SAAO,EAAE,OAAO,GAAG,MAAM,QAAQ,SAAS,KAAK,IAAI,IAAI;AACzD;AAEA,SAAS,iBAAiB,KAAa,QAAuB;AAC5D,QAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC;AAChD,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SAAO,MACJ,IAAI,WAAS,eAAe,KAAK,KAAK,CAAC,EACvC,OAAO,OAAO,EACd,KAAK,IAAI;AACd;AAEO,SAAS,8BAA8B,QAAwB;AAClE,MAAI,CAAC,QAAQ;AACR,WAAO,EAAE,WAAW,wBAAwB,aAAa,GAAG,WAAW,EAAE;AAAA,EAC9E;AACA,QAAM,YAAY,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AAC1D,MAAI,UAAU,WAAW,GAAG;AACxB,WAAO,EAAE,WAAW,wBAAwB,aAAa,GAAG,WAAW,EAAE;AAAA,EAC7E;AAEA,QAAM,YAAY,IAAI,IAAI,UAAU,IAAI,CAAC,MAAW,EAAE,GAAG,CAAC,EAAE;AAE5D,MAAI,UAAU,WAAW,GAAG;AACxB,WAAO;AAAA,MACH,WAAW,cAAc,eAAe,UAAU,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,KAAK,CAAC;AAAA,MAC7E,aAAa;AAAA,MACb;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AAAA,IACH,WAAW,SAAS,UAAU,MAAM;AAAA,EAAkB,UAAU,IAAI,CAAC,MAAW,KAAK,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,IACjI,aAAa,UAAU;AAAA,IACvB;AAAA,EACJ;AACJ;AAEO,SAAS,8BAA8B,QAAwB;AAClE,MAAI,CAAC,UAAU,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAG;AAC1D,WAAO,EAAE,WAAW,wBAAwB,aAAa,GAAG,WAAW,EAAE;AAAA,EAC7E;AAGA,QAAM,UAAU,oBAAI,IAAmB;AACvC,aAAW,OAAO,QAAQ;AACtB,UAAM,OAAO,kBAAkBA,eAAc,IAAI,GAAG,CAAC;AACrD,QAAI,CAAC,QAAQ,IAAI,IAAI,EAAG,SAAQ,IAAI,MAAM,CAAC,CAAC;AAC5C,YAAQ,IAAI,IAAI,EAAG,KAAK,GAAG;AAAA,EAC/B;AAEA,QAAM,QAAQ,CAAC,SAAS,OAAO,MAAM,sBAAsB,QAAQ,IAAI,SAAS;AAChF,aAAW,CAAC,MAAM,IAAI,KAAK,SAAS;AAChC,UAAM,KAAK;AAAA,EAAK,IAAI,GAAG;AACvB,eAAW,OAAO,MAAM;AACpB,YAAM,KAAK,UAAU,IAAI,MAAM,MAAM,OAAO,CAAC,IAAI,IAAI,MAAM,MAAM,YAAY,CAAC,EAAE;AAAA,IACpF;AAAA,EACJ;AAEA,SAAO;AAAA,IACH,WAAW,MAAM,KAAK,IAAI;AAAA,IAC1B,aAAa,OAAO;AAAA,IACpB,WAAW,QAAQ;AAAA,EACvB;AACJ;AAEO,SAAS,yBAAyB,QAAa,MAAc,WAA8B;AAC9F,MAAI,CAAC,UAAU,CAAC,OAAO,UAAU;AAC7B,WAAO,EAAE,WAAW,kBAAkB,aAAa,GAAG,WAAW,EAAE;AAAA,EACvE;AAEA,MAAI,WAAW;AACf,MAAI,OAAO,OAAO,aAAa,UAAU;AACrC,eAAW,OAAO;AAAA,EACtB,WAAW,MAAM,QAAQ,OAAO,QAAQ,GAAG;AACvC,eAAW,OAAO,SAAS,IAAI,CAAC,MAAW,OAAO,MAAM,WAAW,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI;AAAA,EAC7F,OAAO;AACH,eAAW,OAAO,SAAS;AAAA,EAC/B;AAEA,SAAO;AAAA,IACH,WAAW,iBAAiB,IAAI,IAAI,SAAS;AAAA;AAAA,EAAQ,QAAQ;AAAA,IAC7D,aAAa;AAAA,IACb,WAAW;AAAA,EACf;AACJ;AAEO,SAAS,kCAAkC,QAAwB;AACtE,MAAI,CAAC,UAAU,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAG;AAC1D,WAAO,EAAE,WAAW,qBAAqB,aAAa,GAAG,WAAW,EAAE;AAAA,EAC1E;AAEA,QAAM,QAAQ,OAAO,IAAI,CAAC,MAAW;AACjC,UAAM,OAAO,kBAAkB,EAAE,IAAI;AACrC,WAAO,GAAG,EAAE,IAAI,KAAK,IAAI,QAAQ,EAAE,MAAM,MAAM,OAAO,CAAC,IAAI,EAAE,MAAM,MAAM,YAAY,CAAC;AAAA,EAC1F,CAAC;AAED,SAAO;AAAA,IACH,WAAW,CAAC,qBAAqB,GAAG,KAAK,EAAE,KAAK,IAAI;AAAA,IACpD,aAAa,OAAO;AAAA,IACpB,WAAW;AAAA,EACf;AACJ;AAEO,SAAS,+BAA+B,aAA+B;AAC1E,MAAI,CAAC,eAAe,YAAY,WAAW,GAAG;AAC1C,WAAO,EAAE,WAAW,yBAAyB,aAAa,GAAG,WAAW,EAAE;AAAA,EAC9E;AAEA,QAAM,QAAQ,YAAY,IAAI,OAAK;AAC/B,WAAO,IAAI,EAAE,aAAa,IAAI,UAAU,EAAE,aAAa,IAAI,YAAY,MAAM,UAAU,EAAE,MAAM,MAAM,OAAO,CAAC,KAAK,EAAE,OAAO;AAAA,EAC/H,CAAC;AAED,SAAO;AAAA,IACH,WAAW,CAAC,gBAAgB,GAAG,KAAK,EAAE,KAAK,IAAI;AAAA,IAC/C,aAAa,YAAY;AAAA,IACzB,WAAW;AAAA,EACf;AACJ;AAEO,SAAS,sCAAsC,OAAyB;AAC7E,MAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG;AACzD,WAAO,EAAE,WAAW,kCAAkC,aAAa,GAAG,WAAW,EAAE;AAAA,EACrF;AACA,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,QAAQ,MAAM,IAAI,UAAQ;AAC9B,UAAM,OAAO,wBAAwB,IAAI;AACzC,QAAI,KAAK,IAAK,MAAK,IAAI,KAAK,GAAG;AAC/B,WAAO,KAAK,KAAK,KAAK;AAAA,EACxB,CAAC;AACD,SAAO;AAAA,IACL,WAAW,CAAC,yBAAyB,GAAG,KAAK,EAAE,KAAK,IAAI;AAAA,IACxD,aAAa,MAAM;AAAA,IACnB,WAAW,KAAK;AAAA,EAClB;AACF;AAEO,SAAS,iCAAiC,OAAyB;AACxE,MAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG;AACzD,WAAO,EAAE,WAAW,4BAA4B,aAAa,GAAG,WAAW,EAAE;AAAA,EAC/E;AACA,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,QAAkB,CAAC,iBAAiB;AAC1C,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAO,wBAAwB,MAAM,IAAI;AAC/C,QAAI,KAAK,IAAK,MAAK,IAAI,KAAK,GAAG;AAC/B,UAAM,KAAK,KAAK,KAAK,KAAK,EAAE;AAC5B,QAAI,MAAM,MAAM,KAAK;AACnB,YAAM,SAAS,iBAAiB,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC,CAAC;AACrE,UAAI,QAAQ;AACV,cAAM,KAAK,SAAS,MAAM,EAAE;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,WAAW,MAAM,KAAK,IAAI;AAAA,IAC1B,aAAa,MAAM;AAAA,IACnB,WAAW,KAAK;AAAA,EAClB;AACF;AAEO,SAAS,iCAAiC,OAAyB;AACxE,MAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG;AACzD,WAAO,EAAE,WAAW,4BAA4B,aAAa,GAAG,WAAW,EAAE;AAAA,EAC/E;AACA,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,QAAkB,CAAC,iBAAiB;AAC1C,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAO,wBAAwB,MAAM,EAAE;AAC7C,QAAI,KAAK,IAAK,MAAK,IAAI,KAAK,GAAG;AAC/B,UAAM,KAAK,KAAK,KAAK,KAAK,EAAE;AAC5B,QAAI,MAAM,IAAI,KAAK;AACjB,YAAM,SAAS,iBAAiB,KAAK,GAAG,KAAK,MAAM,cAAc,CAAC,CAAC;AACnE,UAAI,QAAQ;AACV,cAAM,KAAK,SAAS,MAAM,EAAE;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,WAAW,MAAM,KAAK,IAAI;AAAA,IAC1B,aAAa,MAAM;AAAA,IACnB,WAAW,KAAK;AAAA,EAClB;AACF;;;AChQA,IAAM,gBAAwC;AAAA,EAC5C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAEA,SAAS,cAAc,UAAsC;AAC3D,MAAI,aAAa,EAAG,QAAO;AAC3B,MAAI,aAAa,EAAG,QAAO;AAC3B,MAAI,aAAa,EAAG,QAAO;AAC3B,MAAI,aAAa,EAAG,QAAO;AAC3B,SAAO;AACT;AAEO,SAAS,wBACd,aACA,UAAyB,CAAC,GAClB;AACR,MAAI,CAAC,eAAe,YAAY,WAAW,EAAG,QAAO;AACrD,QAAM,QAAQ,CAAC,GAAG,WAAW,EAAE,KAAK,CAAC,GAAG,MAAM;AAC5C,UAAM,YAAY,cAAc,GAAG,YAAY,EAAE,KAAK;AACtD,UAAM,YAAY,cAAc,GAAG,YAAY,EAAE,KAAK;AACtD,QAAI,cAAc,UAAW,QAAO,YAAY;AAChD,UAAM,QAAQ,GAAG,OAAO,OAAO,QAAQ;AACvC,UAAM,QAAQ,GAAG,OAAO,OAAO,QAAQ;AACvC,QAAI,UAAU,MAAO,QAAO,QAAQ;AACpC,UAAM,QAAQ,GAAG,OAAO,OAAO,aAAa;AAC5C,UAAM,QAAQ,GAAG,OAAO,OAAO,aAAa;AAC5C,WAAO,QAAQ;AAAA,EACjB,CAAC;AACD,QAAM,UACJ,QAAQ,YAAY,QAAQ,WAAW,IACnC,MAAM,MAAM,GAAG,QAAQ,QAAQ,IAC/B;AACN,SAAO,QACJ,IAAI,OAAK;AACR,UAAM,QAAQ,GAAG,OAAO,OAAO,QAAQ,KAAK;AAC5C,UAAM,aAAa,GAAG,OAAO,OAAO,aAAa,KAAK;AACtD,UAAM,QAAQ,cAAc,GAAG,QAAQ;AACvC,UAAM,UAAU,GAAG,WAAW;AAC9B,WAAO,KAAK,KAAK,IAAI,IAAI,IAAI,SAAS,IAAI,OAAO;AAAA,EACnD,CAAC,EACA,KAAK,IAAI;AACd;;;AChDA,OAAO,UAAU;AAMV,IAAM,iBAAN,MAAqB;AAAA,EAC1B,OAAe,eAAkD;AAAA,IAC/D,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,YAAY,UAA4C;AAC7D,UAAM,MAAM,KAAK,QAAQ,QAAQ,EAAE,YAAY;AAC/C,WAAO,KAAK,aAAa,GAAG,KAAK;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,kBAAkB,KAAa,MAAyB;AAC7D,UAAM,gBAAgB,IAAI,WAAW,GAAG,IAAI,MAAM,IAAI,GAAG;AACzD,SAAK,aAAa,cAAc,YAAY,CAAC,IAAI;AAAA,EACnD;AACF;;;AC1DA,SAAS,QAAQ,gBAAgB;AACjC,SAAS,iBAAAC,sBAAqB;AAC9B,OAAOC,WAAU;AAGjB,IAAM,aAAa,MAAM;AACvB,MAAI;AACF,WAAO;AAAA,EACT,QAAQ;AACN,WAAOA,MAAK,QAAQD,eAAc,YAAY,GAAG,CAAC;AAAA,EACpD;AACF;AACA,IAAM,WAAW,WAAW;AAG5B,IAAM,cAAc,oBAAI,IAAoB;AAC5C,IAAI,gBAAgB;AAGb,IAAM,eAAuC;AAAA,EAClD,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AACR;AAMA,eAAe,oBAAoB;AACjC,MAAI,cAAe;AAOnB,MAAI;AACJ,MAAI,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,cAAc,GAAG;AAEhE,mBAAeC,MAAK,QAAQ,UAAU,0BAA0B;AAAA,EACpE,OAAO;AAEH,mBAAeA,MAAK,QAAQ,UAAU,gCAAgC;AAAA,EAC1E;AAEA,QAAM,eAAeA,MAAK,KAAK,cAAc,kBAAkB;AAE/D,QAAM,OAAO,KAAK;AAAA,IAChB,YAAY,MAAM;AAAA,EACpB,CAAC;AACD,kBAAgB;AAClB;AAMO,IAAM,eAAe,OAAO,SAAqD;AACtF,MAAI,YAAY,IAAI,IAAI,GAAG;AACzB,WAAO,YAAY,IAAI,IAAI;AAAA,EAC7B;AAEA,QAAM,kBAAkB;AAExB,QAAM,WAAW,aAAa,IAAI;AAElC,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,yBAAyB,IAAI,EAAE;AAAA,EACjD;AAEA,MAAI;AACF,QAAI;AACJ,QAAI,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,cAAc,GAAG;AAChE,qBAAeA,MAAK,QAAQ,UAAU,0BAA0B;AAAA,IACpE,OAAO;AACH,qBAAeA,MAAK,QAAQ,UAAU,gCAAgC;AAAA,IAC1E;AAEA,UAAM,WAAWA,MAAK,KAAK,cAAc,QAAQ;AAEjD,UAAM,WAAW,MAAM,SAAS,KAAK,QAAQ;AAC7C,UAAM,SAAS,IAAI,OAAO;AAC1B,WAAO,YAAY,QAAQ;AAE3B,gBAAY,IAAI,MAAM,MAAM;AAC5B,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,0BAA0B,IAAI,KAAK,KAAK;AACtD,UAAM,IAAI,MAAM,2BAA2B,IAAI,KAAK,KAAK,EAAE;AAAA,EAC7D;AACF;AAGA,IAAI,uBAAsC;AAEnC,IAAM,aAAa,YAA6B;AACrD,MAAI,qBAAsB,QAAO;AACjC,yBAAuB,MAAM,aAAa,MAAM;AAChD,SAAO;AACT;;;ACrHA,SAAS,YAAAC,iBAAgB;AAazB,IAAMC,mBAA0C;AAAA;AAAA,EAE9C,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA;AAAA,EAGlB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA;AAAA;AAAA;AAAA,EAMlB,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA;AAAA;AAAA;AAAA,EAKtB,kBAAkB;AAAA;AAAA,EAClB,mBAAmB;AAAA;AAAA;AAAA;AAAA,EAKnB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASV,mBAAmB;AAAA,EACnB,kBAAkB;AAAA;AAAA;AAAA;AAAA,EAKlB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQV;AAEO,IAAM,uBAAN,MAA2B;AAAA,EAChC,aAAa,mBAAmB,UAAwC;AACtE,UAAM,SAAS,eAAe,YAAY,QAAQ;AAClD,QAAI,CAAC,QAAQ;AACX,cAAQ,KAAK,+BAA+B,QAAQ,EAAE;AACtD,aAAO,CAAC;AAAA,IACV;AAEA,QAAI;AACF,YAAM,SAAS,MAAM,aAAa,MAAM;AACxC,YAAM,UAAU,MAAMD,UAAS,UAAU,OAAO;AAChD,YAAM,OAAO,OAAO,MAAM,OAAO;AAEjC,aAAO,KAAK,eAAe,KAAK,QAAQ;AAAA,IAC1C,SAAS,OAAO;AACd,cAAQ,MAAM,sBAAsB,QAAQ,KAAK,KAAK;AACtD,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,OAAe,eAAe,MAAyB;AACrD,UAAM,UAAuB,CAAC;AAC9B,UAAM,OAAOC,iBAAgB,KAAK,IAAI;AAEtC,QAAI,MAAM;AACR,YAAM,OAAO,KAAK,QAAQ,IAAI;AAC9B,UAAI,MAAM;AACR,cAAM,SAAoB;AAAA,UACxB;AAAA,UACA;AAAA,UACA,OAAO;AAAA,YACL,OAAO,EAAE,MAAM,KAAK,cAAc,KAAK,WAAW,KAAK,cAAc,OAAO;AAAA,YAC5E,KAAK,EAAE,MAAM,KAAK,YAAY,KAAK,WAAW,KAAK,YAAY,OAAO;AAAA,UACxE;AAAA,UACA,UAAU,CAAC;AAAA,QACb;AAKA,mBAAW,SAAS,KAAK,eAAe;AACnC,iBAAO,UAAU,KAAK,GAAG,KAAK,eAAe,KAAK,CAAC;AAAA,QACxD;AAEA,gBAAQ,KAAK,MAAM;AACnB,eAAO;AAAA,MACT;AAAA,IACF;AAGA,eAAW,SAAS,KAAK,eAAe;AACtC,cAAQ,KAAK,GAAG,KAAK,eAAe,KAAK,CAAC;AAAA,IAC5C;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAe,QAAQ,MAA2B;AAEhD,UAAM,WAAW,KAAK,kBAAkB,MAAM;AAC9C,QAAI,SAAU,QAAO,SAAS;AAM9B,eAAW,SAAS,KAAK,eAAe;AACpC,UAAI,MAAM,SAAS,gBAAgB,MAAM,SAAS,mBAAmB;AACjE,eAAO,MAAM;AAAA,MACjB;AAAA,IACJ;AAEA,WAAO;AAAA,EACT;AACF;;;ACpJA,SAAiB,aAAwB;AAOzC,IAAM,UAAkC;AAAA,EACtC,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,EAKR,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAMd;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACzB,aAAa,SACX,UACA,MACA,UACsB;AACtB,UAAM,UAAU,eAAe,YAAY,QAAQ;AACnD,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,kCAAkC,QAAQ,EAAE;AAAA,IAC9D;AAEA,UAAM,SAAS,MAAM,aAAa,OAAO;AACzC,UAAM,OAAO,OAAO,MAAM,IAAI;AAC9B,UAAM,OAAO,KAAK,SAAS,sBAAsB,QAAQ;AAEzD,UAAM,YAAY,CAAC;AACnB,QAAI,UAAuB;AAC3B,WAAO,SAAS;AACd,gBAAU,KAAK,OAAO;AACtB,gBAAU,QAAQ;AAAA,IACpB;AAIA,UAAM,aAAa,UAAU;AAAA,MAAO,OAClC,EAAE,SAAS,yBACX,EAAE,SAAS,0BACX,EAAE,SAAS;AAAA,MACX,EAAE,SAAS;AAAA;AAAA,IACb;AAEA,UAAM,SAAsB;AAAA,MAC1B,QAAQ,CAAC;AAAA,MACT,SAAS,CAAC;AAAA,IACZ;AAEA,QAAI,WAAW,WAAW,EAAG,QAAO;AAEpC,UAAM,WAAW,QAAQ,OAAO;AAChC,QAAI,CAAC,SAAU,QAAO;AAEtB,UAAM,WAAW,OAAO;AACxB,QAAI,CAAC,SAAU,QAAO;AACtB,UAAM,QAAQ,IAAI,MAAM,UAAU,QAAQ;AAU1C,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,YAAM,YAAY,WAAW,CAAC;AAC9B,YAAM,WAAW,MAAM,SAAS,SAAS;AAEzC,YAAM,QAAQ,oBAAI,IAAY;AAE9B,iBAAW,WAAW,UAAU;AAM9B,cAAM,UAAU,QAAQ;AAIxB,YAAI,OAAoB,QAAQ;AAIhC,YAAI,SAAS,KAAK,SAAS,yBAAyB,KAAK,SAAS,yBAAyB;AAKtF,cAAI,QAAQ,SAAS,QAAQ;AACzB,mBAAO,KAAK;AAAA,UAChB;AAAA,QACL;AAEA,YAAI,WAAW;AACf,eAAO,QAAQ,KAAK,OAAO,UAAU,IAAI;AACvC,cAAI,KAAK,SAAS,yBAAyB,KAAK,SAAS,wBAAwB;AAC/E,uBAAW;AACX;AAAA,UACF;AACA,iBAAO,KAAK;AAAA,QACd;AAEA,YAAI,UAAU;AACT,gBAAM,IAAI,QAAQ,IAAI;AAAA,QAC3B;AAAA,MACF;AAEA,UAAI,MAAM,GAAG;AACX,eAAO,SAAS,MAAM,KAAK,KAAK;AAAA,MAClC,OAAO;AACL,mBAAW,QAAQ,OAAO;AACxB,iBAAO,QAAQ,KAAK,IAAI;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAGA,WAAO,UAAU,MAAM,KAAK,IAAI,IAAI,OAAO,OAAO,CAAC;AAEnD,WAAO;AAAA,EACT;AACF;;;ARnFA,SAAS,cAAc,KAAqB;AAC1C,SAAO,kBAAkB,YAAY,EAAE,0BAA0B,GAAG;AACtE;AAEA,SAAS,aAAa,UAA0B;AAC9C,MAAI,MAAMC,eAAc,QAAQ,EAAE;AAClC,MAAI,QAAQ,aAAa,SAAS;AAChC,UAAM,IAAI,QAAQ,6BAA6B,CAAC,QAAQ,UAAU;AAChE,aAAO,WAAW,MAAM,YAAY,CAAC;AAAA,IACvC,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAQA,SAAS,wBAAwB,SAAgB,QAAQ,GAAW;AAClE,MAAI,OAAO;AACX,QAAM,SAAS,KAAK,OAAO,KAAK;AAChC,aAAW,KAAK,SAAS;AACvB,YAAQ,GAAG,MAAM,KAAK,EAAE,IAAI,KAAK,EAAE,IAAI,SAAS,EAAE,MAAM,MAAM,OAAO,CAAC;AAAA;AACtE,QAAI,EAAE,YAAY,EAAE,SAAS,SAAS,GAAG;AACvC,cAAQ,wBAAwB,EAAE,UAAU,QAAQ,CAAC;AAAA,IACvD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,qCAAqC,SAA2B;AACvE,QAAM,YACJ,QAAQ,SAAS,IACb;AAAA,EAAsB,wBAAwB,OAAO,CAAC,KACtD;AACN,SAAO;AAAA,IACL;AAAA,IACA,aAAa,QAAQ;AAAA,IACrB,WAAW,QAAQ,SAAS,IAAI,IAAI;AAAA,EACtC;AACF;AAEA,SAAS,yBAAyB,KAAU;AAC1C,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,QAAM,QAAQ,IAAI,SAAS,IAAI,UAAU;AACzC,MAAI,CAAC,SAAS,CAAC,IAAI,KAAM,QAAO;AAChC,QAAM,MAAM,IAAI,OAAO,IAAI,UAAU;AACrC,SAAO,EAAE,GAAG,KAAK,OAAO,IAAI;AAC9B;AAEA,SAAS,qBAAqB,SAAuB;AACnD,SAAO,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM;AACjC,UAAM,QAAQ,OAAO,GAAG,QAAQ,EAAE,EAAE,YAAY;AAChD,UAAM,QAAQ,OAAO,GAAG,QAAQ,EAAE,EAAE,YAAY;AAChD,QAAI,UAAU,MAAO,QAAO,MAAM,cAAc,KAAK;AACrD,UAAM,OAAO,OAAO,GAAG,OAAO,GAAG,UAAU,OAAO,EAAE;AACpD,UAAM,OAAO,OAAO,GAAG,OAAO,GAAG,UAAU,OAAO,EAAE;AACpD,QAAI,SAAS,KAAM,QAAO,KAAK,cAAc,IAAI;AACjD,UAAM,QAAQ,GAAG,OAAO,OAAO,QAAQ,GAAG,UAAU,OAAO,OAAO,QAAQ;AAC1E,UAAM,QAAQ,GAAG,OAAO,OAAO,QAAQ,GAAG,UAAU,OAAO,OAAO,QAAQ;AAC1E,QAAI,UAAU,MAAO,QAAO,QAAQ;AACpC,UAAM,QAAQ,GAAG,OAAO,OAAO,aAAa,GAAG,UAAU,OAAO,OAAO,aAAa;AACpF,UAAM,QAAQ,GAAG,OAAO,OAAO,aAAa,GAAG,UAAU,OAAO,OAAO,aAAa;AACpF,WAAO,QAAQ;AAAA,EACjB,CAAC;AACH;AAIA,SAAS,wBACP,gBACA,SAMc;AACd,QAAM,OAAO,SAAS,QAAQ;AAC9B,QAAM,OAAO,OAAO,SAAS,SAAS,WAAW,QAAQ,OAAO;AAChE,QAAMC,QAAO,SAAS,QAAQ;AAC9B,QAAM,YAAY,SAAS,aAAa;AACxC,QAAM,cAAc,YAChB;AAAA,IACE,+BAA+B;AAAA,IAC/B,gCAAgC;AAAA,IAChC,gCAAgC;AAAA,EAClC,IACA,CAAC;AAEL,QAAM,SAAc,kBAAa,CAAC,KAAK,QAAQ;AAC7C,UAAM,SAAS,IAAI,UAAU;AAC7B,UAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,UAAU,IAAI,EAAE;AACpD,QAAI,IAAI,aAAaA,OAAM;AACzB,UAAI,UAAU,KAAK,WAAW;AAC9B,UAAI,IAAI,WAAW;AACnB;AAAA,IACF;AACA,QAAI,WAAW,WAAW;AACxB,UAAI,UAAU,KAAK,WAAW;AAC9B,UAAI,IAAI;AACR;AAAA,IACF;AACA,QAAI,WAAW,OAAO;AACpB,UAAI,UAAU,KAAK,WAAW;AAC9B,UAAI,IAAI,oBAAoB;AAC5B;AAAA,IACF;AACA,UAAM,SAAS,eAAe;AAC9B,QAAI,UAAU,KAAK,EAAE,gBAAgB,oBAAoB,GAAG,YAAY,CAAC;AACzE,QAAI,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,EACzC,CAAC;AACA,EAAC,OAAwB,OAAO;AACjC,SAAO,OAAO,MAAM,IAAI;AACxB,SAAO;AACT;AAEO,IAAM,SAAS;AAAA,EACpB,MAAM,IAAI,OAAqC;AAC7C,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,UAAM,SAAS,MAAM,iBAAiB,YAAY,EAAE;AAAA,MAClD,MAAM;AAAA,MACN;AAAA,IACF;AAEA,QAAI,QAAQ;AACV,UAAI;AACF,gBAAQ,MAAM,WAAW;AAAA,UACvB,KAAK,kBAAkB;AACrB,gBAAI,MAAM,SAAS,UAAa,MAAM,cAAc,QAAW;AAC7D,qBAAO;AAAA,gBACL,WAAW;AAAA,gBACX,aAAa;AAAA,gBACb,WAAW;AAAA,cACb;AAAA,YACF;AACA,kBAAM,SAAS,MAAM,OAAO;AAAA,cAC1B,MAAM;AAAA,cACN,MAAM;AAAA,cACN,MAAM;AAAA,YACR;AACA,mBAAO,8BAA8B,MAAM;AAAA,UAC7C;AAAA,UACA,KAAK,kBAAkB;AACrB,gBAAI,MAAM,SAAS,UAAa,MAAM,cAAc,QAAW;AAC7D,qBAAO;AAAA,gBACL,WAAW;AAAA,gBACX,aAAa;AAAA,gBACb,WAAW;AAAA,cACb;AAAA,YACF;AACA,kBAAM,SAAS,MAAM,OAAO;AAAA,cAC1B,MAAM;AAAA,cACN,MAAM;AAAA,cACN,MAAM;AAAA,YACR;AACA,mBAAO,8BAA8B,MAAM;AAAA,UAC7C;AAAA,UACA,KAAK,SAAS;AACZ,gBAAI,MAAM,SAAS,UAAa,MAAM,cAAc,QAAW;AAC7D,qBAAO;AAAA,gBACL,WAAW;AAAA,gBACX,aAAa;AAAA,gBACb,WAAW;AAAA,cACb;AAAA,YACF;AACA,kBAAM,SAAS,MAAM,OAAO;AAAA,cAC1B,MAAM;AAAA,cACN,MAAM;AAAA,cACN,MAAM;AAAA,YACR;AACA,mBAAO,yBAAyB,QAAQ,MAAM,MAAM,MAAM,SAAS;AAAA,UACrE;AAAA,UACA,KAAK,kBAAkB;AACrB,kBAAM,SAAS,MAAM,OAAO,eAAe,MAAM,QAAQ;AACzD,mBAAO,kCAAkC,MAAM;AAAA,UACjD;AAAA,UACA,KAAK,mBAAmB;AACtB,kBAAM,QAAQ,MAAM,SAAS,MAAM;AACnC,kBAAM,UAAU,MAAM,iBAAiB,YAAY,EAAE;AAAA,cACnD;AAAA,cACA;AAAA,YACF;AACA,mBAAO,kCAAkC,OAAO;AAAA,UAClD;AAAA,UACA,KAAK,sBAAsB;AACzB,gBAAI,MAAM,SAAS,UAAa,MAAM,cAAc,QAAW;AAC7D,qBAAO;AAAA,gBACL,WAAW;AAAA,gBACX,aAAa;AAAA,gBACb,WAAW;AAAA,cACb;AAAA,YACF;AACA,kBAAM,SAAS,MAAM,OAAO;AAAA,cAC1B,MAAM;AAAA,cACN,MAAM;AAAA,cACN,MAAM;AAAA,YACR;AACA,mBAAO,8BAA8B,MAAM;AAAA,UAC7C;AAAA,UACA,KAAK,wBAAwB;AAC3B,gBAAI,MAAM,SAAS,UAAa,MAAM,cAAc,QAAW;AAC7D,qBAAO;AAAA,gBACL,WAAW;AAAA,gBACX,aAAa;AAAA,gBACb,WAAW;AAAA,cACb;AAAA,YACF;AACA,kBAAM,SAAS,MAAM,OAAO;AAAA,cAC1B,MAAM;AAAA,cACN,MAAM;AAAA,cACN,MAAM;AAAA,YACR;AACA,mBAAO;AAAA,cACL,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC;AAAA,YACpC;AAAA,UACF;AAAA,UACA,KAAK,iBAAiB;AACpB,gBAAI,MAAM,SAAS,UAAa,MAAM,cAAc,QAAW;AAC7D,qBAAO;AAAA,gBACL,WAAW;AAAA,gBACX,aAAa;AAAA,gBACb,WAAW;AAAA,cACb;AAAA,YACF;AACA,kBAAM,QAAQ,MAAM,OAAO;AAAA,cACzB,MAAM;AAAA,cACN,MAAM;AAAA,cACN,MAAM;AAAA,YACR;AACA,kBAAM,cAAc,MAAM,QAAQ;AAAA,eAC/B,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,GAAG;AAAA,gBAAI,UACtC,OAAO,cAAc,IAAI;AAAA,cAC3B;AAAA,YACF;AACA,kBAAM,QAAQ,YAAY,KAAK,EAAE,OAAO,OAAO;AAC/C,mBAAO,iCAAiC,KAAK;AAAA,UAC/C;AAAA,UACA,KAAK,iBAAiB;AACpB,gBAAI,MAAM,SAAS,UAAa,MAAM,cAAc,QAAW;AAC7D,qBAAO;AAAA,gBACL,WAAW;AAAA,gBACX,aAAa;AAAA,gBACb,WAAW;AAAA,cACb;AAAA,YACF;AACA,kBAAM,QAAQ,MAAM,OAAO;AAAA,cACzB,MAAM;AAAA,cACN,MAAM;AAAA,cACN,MAAM;AAAA,YACR;AACA,kBAAM,cAAc,MAAM,QAAQ;AAAA,eAC/B,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,GAAG;AAAA,gBAAI,UACtC,OAAO,cAAc,IAAI;AAAA,cAC3B;AAAA,YACF;AACA,kBAAM,QAAQ,YAAY,KAAK,EAAE,OAAO,OAAO;AAC/C,mBAAO,iCAAiC,KAAK;AAAA,UAC/C;AAAA,UACA,KAAK,eAAe;AAClB,gBAAI,MAAM,oBAAoB;AAC5B,oBAAM,OAAO;AAAA,gBACX,MAAM;AAAA,gBACN,MAAM,aAAa;AAAA,cACrB;AAAA,YACF;AACA,kBAAM,cAAc,OAAO,eAAe,MAAM,QAAQ;AACxD,mBAAO,+BAA+B,WAAW;AAAA,UACnD;AAAA,UACA,SAAS;AACP,mBAAO;AAAA,cACL,WAAW,aAAa,MAAM,SAAS;AAAA,cACvC,aAAa;AAAA,cACb,WAAW;AAAA,YACb;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,cAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,eAAO;AAAA,UACL,WAAW,oBAAoB,MAAM,SAAS,yBAAyB,OAAO;AAAA,UAC9E,aAAa;AAAA,UACb,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAEA,UAAM,MAAMC,SAAQ,MAAM,QAAQ;AAClC,WAAO;AAAA,MACL,WAAW,0CAA0C,GAAG;AAAA,MACxD,aAAa;AAAA,MACb,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,QAA0C;AACrD,WAAO,QAAQ,IAAI,OAAO,IAAI,WAAS,KAAK,IAAI,KAAK,CAAC,CAAC;AAAA,EACzD;AAAA,EAEA,MAAM,UAAU,UAAkB,UAAwB,CAAC,GAAqB;AAC9E,UAAM,SAAS,MAAM,iBAAiB,YAAY,EAAE,iBAAiB,QAAQ;AAC7E,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,UAAU,MAAMC,UAAS,UAAU,OAAO;AAChD,UAAM,aAAa,cAAcD,SAAQ,QAAQ,CAAC;AAClD,UAAM,OAAO,QAAQ,UAAU,SAAS,UAAU;AAClD,QAAI,QAAQ,MAAM;AAChB,YAAM,OAAO,iBAAiB,UAAU,QAAQ,aAAa,GAAI;AAAA,IACnE;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,UAAkB,UAAmC;AACrE,WAAO,iBAAiB,YAAY,EAAE,kBAAkB,UAAU,QAAQ;AAAA,EAC5E;AAAA,EAEA,MAAM,kBACJ,UACA,SACiB;AACjB,UAAM,cAAc,MAAM,iBAAiB,YAAY,EAAE;AAAA,MACvD;AAAA,MACA,SAAS;AAAA,IACX;AACA,WAAO,wBAAwB,aAAa,EAAE,UAAU,SAAS,SAAS,CAAC;AAAA,EAC7E;AAAA,EAEA,MAAM,kBACJ,UACA,UACuB;AACvB,UAAM,UAAU,iBAAiB,YAAY;AAC7C,UAAM,eAAe,YAAY,OAAO;AACxC,UAAM,wBAAyB,QAAgB;AAC/C,QAAI,OAAO,0BAA0B,YAAY;AAC/C,aAAO,sBAAsB,KAAK,SAAS,UAAU,YAAY;AAAA,IACnE;AACA,UAAM,SAAS,MAAM,QAAQ,UAAU,UAAU,YAAY;AAC7D,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,uBAAwB,OAAe;AAC7C,QAAI,OAAO,yBAAyB,WAAY,QAAO,CAAC;AACxD,QAAI;AACF,YAAM,UAAU,MAAM,qBAAqB,KAAK,QAAQ,QAAQ;AAChE,aAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC;AAAA,IAC7C,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,kBACJ,UACA,MACA,WACA,UACuB;AACvB,UAAM,SAAS,MAAM,iBAAiB,YAAY,EAAE;AAAA,MAClD;AAAA,MACA,YAAY,OAAO;AAAA,IACrB;AACA,QAAI,CAAC,OAAQ,QAAO;AACpB,WAAQ,MAAM,OAAO,eAAe,UAAU,MAAM,SAAS;AAAA,EAC/D;AAAA,EAEA;AAAA,EAEA,MAAM,gBACJ,OACA,SAMgB;AAChB,UAAM,EAAE,UAAU,GAAG,KAAK,IAAI,WAAW,CAAC;AAC1C,WAAO,iBAAiB,YAAY,EAAE;AAAA,MACpC;AAAA,MACA,YAAY,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY,SAKT;AACD,WAAO,wBAAwB,MAAM,OAAO,OAAO,GAAG,OAAO;AAAA,EAC/D;AAAA,EAEA,SAAS;AACP,WAAO,iBAAiB,YAAY,EAAE,OAAO;AAAA,EAC/C;AACF;AAEO,IAAM,YAAY;AAAA,EACvB,MAAM,IAAI,OAA2C;AACnD,UAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,QAAI,MAAM,cAAc,kBAAkB;AACxC,YAAM,OAAO,eAAe,YAAY,MAAM,QAAQ;AACtD,UAAI,MAAM;AACR,YAAI;AACF,gBAAM,UAAU,MAAM,qBAAqB,mBAAmB,MAAM,QAAQ;AAC5E,iBAAO,qCAAqC,OAAO;AAAA,QACrD,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,QAAI,MAAM,cAAc,YAAY;AAClC,UAAI,MAAM,SAAS,UAAa,MAAM,cAAc,QAAW;AAC7D,eAAO;AAAA,UACL,WAAW;AAAA,UACX,aAAa;AAAA,UACb,WAAW;AAAA,QACb;AAAA,MACF;AACA,YAAM,OAAO,eAAe,YAAY,MAAM,QAAQ;AACtD,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,UACL,WAAW;AAAA,UACX,aAAa;AAAA,UACb,WAAW;AAAA,QACb;AAAA,MACF;AACA,UAAI;AACF,cAAM,OAAO,MAAMC,UAAS,MAAM,UAAU,OAAO;AACnD,cAAM,QAAQ,MAAM,cAAc,SAAS,MAAM,UAAU,MAAM;AAAA,UAC/D,KAAK,MAAM,OAAO;AAAA,UAClB,QAAQ,MAAM,YAAY;AAAA,QAC5B,CAAC;AACD,YAAI,aAAa;AACjB,YAAI,MAAM,OAAO,SAAS,GAAG;AAC3B,wBAAc,WAAW,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA;AAAA,QAClD,OAAO;AACL,wBAAc;AAAA,QAChB;AACA,YAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,wBAAc,YAAY,MAAM,QAAQ,KAAK,IAAI,CAAC;AAAA;AAAA,QACpD,OAAO;AACL,wBAAc;AAAA,QAChB;AACA,eAAO;AAAA,UACL,WAAW;AAAA,UACX,aAAa,MAAM,OAAO,SAAS,MAAM,QAAQ;AAAA,UACjD,WAAW;AAAA,QACb;AAAA,MACF,SAAS,OAAO;AACd,cAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,eAAO;AAAA,UACL,WAAW,8BAA8B,OAAO;AAAA,UAChD,aAAa;AAAA,UACb,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAEA,QAAI,MAAM,cAAc,mBAAmB;AACzC,YAAM,OAAO,UAAU,MAAM,UAAU;AAAA,QACrC,MAAM,MAAM,cAAc,iBAAiB,MAAM;AAAA,QACjD,WAAW,MAAM;AAAA,QACjB;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,MAAM,cAAc,mBAAmB;AACzC,YAAM,QAAQ,MAAM,SAAS,MAAM;AACnC,YAAM,UAAU,MAAM,OAAO,gBAAgB,OAAO,EAAE,SAAS,CAAC;AAChE,YAAM,aAAa,QAAQ,IAAI,wBAAwB,EAAE,OAAO,OAAO;AACvE,YAAM,SAAS,qBAAqB,UAAU;AAC9C,aAAO,kCAAkC,MAAM;AAAA,IACjD;AAEA,UAAM,EAAE,WAAW,GAAG,KAAK,IAAI;AAC/B,WAAO,OAAO,IAAI;AAAA,MAChB,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,QAAgD;AAC3D,WAAO,QAAQ,IAAI,OAAO,IAAI,WAAS,KAAK,IAAI,KAAK,CAAC,CAAC;AAAA,EACzD;AAAA,EAEA,MAAM,UAAU,UAAkB,UAAwB,CAAC,GAAqB;AAC9E,WAAO,OAAO,UAAU,UAAU,OAAO;AAAA,EAC3C;AAAA,EAEA,MAAM,kBACJ,UACA,SACiB;AACjB,WAAO,OAAO,kBAAkB,UAAU,OAAO;AAAA,EACnD;AAAA,EAEA,MAAM,oBAAoB,UAA0C;AAClE,UAAM,WAAW,OAAO;AACxB,UAAM,UAAU,OAAO,aAAa,QAAQ;AAC5C,UAAM,UAAU,MAAM,OAAO,kBAAkB,UAAU,QAAQ;AACjE,QAAI,YAAY,MAAM;AACpB,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACnC;AAEA,UAAM,kBAAkB,OAAO,QAAqC;AAClE,YAAM,QAAQ,IAAI,kBAAkB,IAAI,UAAU,IAAI,WAAW,IAAI,SAAS,QAAQ;AACtF,UAAI,CAAC,MAAO,QAAO;AACnB,YAAM,OAAO,MAAM,OAAO;AAAA,QACxB;AAAA,QACA,MAAM,MAAM,OAAO;AAAA,QACnB,MAAM,MAAM,YAAY;AAAA,QACxB;AAAA,MACF;AACA,UAAI,QAAQ,MAAM,QAAQ,IAAI,GAAG;AAC/B,cAAM,eAAe,KAAK,OAAO,CAAC,MAAW,EAAE,QAAQ,OAAO;AAC9D,YAAI,aAAa,SAAS,GAAG;AAC3B,gBAAM,WAAW,aAAa,IAAI,CAAC,MAAW,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AAC1E,iBAAO,WAAW,IAAI,IAAI,mBAAmB,aAAa,MAAM,oBAAoB,QAAQ;AAAA,QAC9F;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,QAAI,WAAW,MAAM,QAAQ,OAAO,KAAK,QAAQ,SAAS,GAAG;AAC3D,iBAAW,OAAO,SAAS;AACzB,cAAM,SAAS,MAAM,gBAAgB,GAAG;AACxC,YAAI,OAAQ,QAAO;AAAA,MACrB;AAAA,IACF,OAAO;AACL,YAAM,OAAO,MAAM,OAAO,kBAAkB,UAAU,GAAG,GAAG,QAAQ;AACpE,UAAI,QAAQ,MAAM,QAAQ,IAAI,GAAG;AAC/B,cAAM,eAAe,KAAK,OAAO,CAAC,MAAW,EAAE,QAAQ,OAAO;AAC9D,YAAI,aAAa,SAAS,GAAG;AAC3B,iBAAO,sBAAsB,aAAa,MAAM;AAAA,QAClD;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,SAKT;AACD,WAAO,wBAAwB,MAAM,UAAU,OAAO,GAAG,OAAO;AAAA,EAClE;AAAA,EAEA,SAAS;AACP,WAAO,OAAO,OAAO;AAAA,EACvB;AACF;",
|
|
6
|
-
"names": ["extname", "pathToFileURL", "readFile", "waiters", "fileURLToPath", "fileURLToPath", "fileURLToPath", "relative", "relative", "fileURLToPath", "fileURLToPath", "path", "readFile", "SYMBOL_KIND_MAP", "pathToFileURL", "path", "extname", "readFile"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/tools/search/LspTool/registry.ts", "../src/tools/search/LspTool/utils.ts"],
|
|
4
|
-
"sourcesContent": ["import { join, dirname, basename } from 'path'\nimport { fileURLToPath } from 'url'\nimport { existsSync, mkdirSync, mkdtempSync, rmSync, readdirSync, writeFileSync, chmodSync, renameSync } from 'fs'\nimport { tmpdir } from 'os'\nimport { getLspBinDir } from './utils'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\nimport { env } from '@utils/config/env'\nimport { loadSettingsWithLegacyFallback } from '@utils/config/settingsFiles'\nimport { getCwd } from '@utils/state'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\n\nconst lspInstallDir = getLspBinDir()\n\nfunction parseBoolean(value?: string): boolean | undefined {\n if (value === undefined) return undefined\n const normalized = value.trim().toLowerCase()\n if (!normalized) return undefined\n if (['1', 'true', 'yes', 'on'].includes(normalized)) return true\n if (['0', 'false', 'no', 'off'].includes(normalized)) return false\n return undefined\n}\n\nasync function isAutoInstallEnabled(): Promise<boolean> {\n const disabled = parseBoolean(\n process.env.PYB_DISABLE_LSP_DOWNLOAD ??\n process.env.PYB_DISABLE_LSP_INSTALL ??\n process.env.OPENCODE_DISABLE_LSP_DOWNLOAD\n )\n if (disabled === true) return false\n const enabled = parseBoolean(\n process.env.PYB_LSP_AUTO_INSTALL ?? process.env.PYB_ENABLE_LSP_AUTO_INSTALL\n )\n if (enabled === false) return false\n return env.hasInternetAccess()\n}\n\nfunction ensureInstallDir() {\n if (!existsSync(lspInstallDir)) {\n mkdirSync(lspInstallDir, { recursive: true })\n }\n}\n\nfunction resolveBinInDir(dir: string, binName: string): string {\n const exts = process.platform === 'win32' ? ['.cmd', '.exe', '.ps1', ''] : ['']\n for (const ext of exts) {\n const binPath = join(dir, `${binName}${ext}`)\n if (existsSync(binPath)) {\n return binPath\n }\n }\n return ''\n}\n\nasync function bunInstall(packages: string[], cwd: string = lspInstallDir): Promise<boolean> {\n const bunBin = Bun.which('bun') ?? process.execPath\n if (!existsSync(cwd)) {\n mkdirSync(cwd, { recursive: true })\n }\n const proc = Bun.spawn({\n cmd: [bunBin, 'install', ...packages],\n cwd,\n env: {\n ...process.env,\n BUN_BE_BUN: '1'\n },\n stdout: 'pipe',\n stderr: 'pipe',\n stdin: 'pipe'\n })\n const exitCode = await proc.exited\n return exitCode === 0\n}\n\nasync function runBinary(\n cmd: string[],\n extraEnv?: NodeJS.ProcessEnv,\n cwd: string = lspInstallDir\n): Promise<{ ok: boolean; error?: string }> {\n const proc = Bun.spawn({\n cmd,\n cwd,\n env: {\n ...process.env,\n ...extraEnv\n },\n stdout: 'pipe',\n stderr: 'pipe',\n stdin: 'pipe'\n })\n const [stdout, stderr, exitCode] = await Promise.all([\n new Response(proc.stdout).text(),\n new Response(proc.stderr).text(),\n proc.exited\n ])\n if (exitCode === 0) {\n return { ok: true }\n }\n return { ok: false, error: stderr || stdout }\n}\n\nasync function getJavaMajorVersion(): Promise<number | null> {\n const proc = Bun.spawn({\n cmd: ['java', '-version'],\n stdout: 'pipe',\n stderr: 'pipe',\n stdin: 'pipe'\n })\n const [stdout, stderr, exitCode] = await Promise.all([\n new Response(proc.stdout).text(),\n new Response(proc.stderr).text(),\n proc.exited\n ])\n if (exitCode !== 0) return null\n const output = `${stderr}\\n${stdout}`\n const match = /\"(\\d+)(?:\\.\\d+)?(?:\\.\\d+)?\"?/.exec(output)\n if (!match) return null\n const major = Number.parseInt(match[1], 10)\n return Number.isNaN(major) ? null : major\n}\n\nconst ESLINT_ARCHIVE_URL = 'https://github.com/microsoft/vscode-eslint/archive/refs/heads/main.zip'\n\nexport function getEslintInstallDir(installDir: string = lspInstallDir): string {\n return join(installDir, 'vscode-eslint')\n}\n\nexport function getEslintServerPath(installDir: string = lspInstallDir): string {\n return join(getEslintInstallDir(installDir), 'server', 'out', 'eslintServer.js')\n}\n\nexport async function installEslintServer(installDir: string = lspInstallDir): Promise<boolean> {\n const serverPath = getEslintServerPath(installDir)\n if (existsSync(serverPath)) return true\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) return false\n if (!existsSync(installDir)) {\n mkdirSync(installDir, { recursive: true })\n }\n debugLogger.info('LSP_INSTALL', { server: 'eslint', action: 'start' })\n try {\n await downloadAndExtractArchive({\n url: ESLINT_ARCHIVE_URL,\n archiveType: 'zip',\n installDir,\n expectedFiles: ['vscode-eslint-main']\n })\n const extractedPath = join(installDir, 'vscode-eslint-main')\n const finalPath = getEslintInstallDir(installDir)\n if (!existsSync(extractedPath)) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: 'eslint', error: 'extracted path missing' })\n return false\n }\n if (existsSync(finalPath)) {\n rmSync(finalPath, { recursive: true, force: true })\n }\n renameSync(extractedPath, finalPath)\n const npmCmd = process.platform === 'win32' ? 'npm.cmd' : 'npm'\n if (!Bun.which(npmCmd)) {\n debugLogger.error('LSP_MISSING_DEP', { server: 'eslint', error: `${npmCmd} not found` })\n return false\n }\n const installResult = await runBinary([npmCmd, 'install'], undefined, finalPath)\n if (!installResult.ok) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: 'eslint', error: installResult.error })\n return false\n }\n const compileResult = await runBinary([npmCmd, 'run', 'compile'], undefined, finalPath)\n if (!compileResult.ok) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: 'eslint', error: compileResult.error })\n return false\n }\n if (!existsSync(serverPath)) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: 'eslint', error: 'eslintServer.js not found' })\n return false\n }\n debugLogger.info('LSP_INSTALL', { server: 'eslint', action: 'success' })\n return true\n } catch (e) {\n debugLogger.error('LSP_INSTALL_ERROR', { server: 'eslint', error: String(e) })\n return false\n }\n}\n\nconst DEFAULT_LANGUAGE_MAP: Record<string, string> = {\n '.sh': 'shellscript',\n '.bash': 'shellscript',\n '.zsh': 'shellscript',\n '.ksh': 'shellscript',\n '.ps1': 'powershell',\n '.psm1': 'powershell',\n '.bat': 'bat',\n '.cmd': 'bat',\n '.js': 'javascript',\n '.mjs': 'javascript',\n '.cjs': 'javascript',\n '.jsx': 'javascriptreact',\n '.ts': 'typescript',\n '.mts': 'typescript',\n '.cts': 'typescript',\n '.ets': 'typescript',\n '.tsx': 'typescriptreact',\n '.mtsx': 'typescriptreact',\n '.ctsx': 'typescriptreact',\n '.vue': 'vue',\n '.svelte': 'svelte',\n '.astro': 'astro',\n '.html': 'html',\n '.htm': 'html',\n '.css': 'css',\n '.scss': 'scss',\n '.sass': 'sass',\n '.less': 'less',\n '.json': 'json',\n '.yml': 'yaml',\n '.yaml': 'yaml',\n '.py': 'python',\n '.go': 'go',\n '.java': 'java',\n '.kt': 'kotlin',\n '.kts': 'kotlin',\n '.rb': 'ruby',\n '.rake': 'ruby',\n '.gemspec': 'ruby',\n '.ru': 'ruby',\n '.erb': 'erb',\n '.php': 'php',\n '.rs': 'rust',\n '.c': 'c',\n '.cpp': 'cpp',\n '.cxx': 'cpp',\n '.cc': 'cpp',\n '.hpp': 'cpp',\n '.h': 'c',\n '.cs': 'csharp',\n '.fs': 'fsharp',\n '.fsi': 'fsharp',\n '.fsx': 'fsharp',\n '.fsscript': 'fsharp',\n '.scala': 'scala',\n '.swift': 'swift',\n '.dart': 'dart',\n '.dockerfile': 'dockerfile',\n 'dockerfile': 'dockerfile',\n '.tf': 'terraform',\n '.tfvars': 'terraform',\n '.hcl': 'hcl',\n '.nix': 'nix',\n '.makefile': 'makefile',\n 'makefile': 'makefile',\n '.md': 'markdown',\n '.markdown': 'markdown',\n '.sql': 'sql',\n '.xml': 'xml',\n '.xsl': 'xml',\n '.tex': 'latex',\n '.latex': 'latex',\n '.bib': 'bibtex',\n '.bibtex': 'bibtex',\n '.diff': 'diff',\n '.patch': 'diff',\n '.clj': 'clojure',\n '.cljs': 'clojure',\n '.cljc': 'clojure',\n '.edn': 'clojure',\n '.ex': 'elixir',\n '.exs': 'elixir',\n '.erl': 'erlang',\n '.hrl': 'erlang',\n '.hs': 'haskell',\n '.lhs': 'haskell',\n '.ml': 'ocaml',\n '.mli': 'ocaml',\n '.zig': 'zig',\n '.zon': 'zig',\n '.gleam': 'gleam',\n '.typ': 'typst',\n '.typc': 'typst'\n}\n\nconst DEFAULT_LANGUAGE_CATEGORIES: Record<string, string> = {\n javascript: 'web',\n javascriptreact: 'web',\n typescript: 'web',\n typescriptreact: 'web',\n vue: 'web',\n svelte: 'web',\n astro: 'web',\n html: 'web',\n css: 'web',\n scss: 'web',\n sass: 'web',\n less: 'web',\n python: 'backend',\n go: 'backend',\n java: 'backend',\n kotlin: 'backend',\n ruby: 'backend',\n php: 'backend',\n rust: 'backend',\n csharp: 'backend',\n fsharp: 'backend',\n scala: 'backend',\n swift: 'backend',\n dart: 'backend',\n elixir: 'backend',\n erlang: 'backend',\n haskell: 'backend',\n ocaml: 'backend',\n c: 'system',\n cpp: 'system',\n zig: 'system',\n shellscript: 'system',\n powershell: 'system',\n makefile: 'system',\n sql: 'data',\n json: 'data',\n yaml: 'data',\n xml: 'data',\n latex: 'data',\n bibtex: 'data',\n dockerfile: 'infra',\n terraform: 'infra',\n hcl: 'infra',\n nix: 'infra',\n markdown: 'docs',\n diff: 'docs'\n}\n\ntype LspServerOverride = {\n disabled?: boolean\n extensions?: string[]\n rootMarkers?: string[]\n command?: string\n args?: string[]\n env?: Record<string, string>\n initializationOptions?: Record<string, unknown>\n root?: {\n include?: string[]\n exclude?: string[]\n branches?: string[][]\n }\n languageId?: string\n priority?: number\n group?: string\n}\n\nexport type LspServerGroup = {\n id: string\n strategy: 'parallel' | 'exclusive' | 'fallback'\n serverIds: string[]\n extensions?: string[]\n}\n\nexport type LspSettings = {\n disabledServers?: string[]\n servers?: Record<string, LspServerOverride>\n experimental?: Record<string, boolean>\n languageMap?: Record<string, string>\n languageCategories?: Record<string, string>\n serverGroups?: LspServerGroup[]\n initializationOptions?: Record<string, unknown>\n env?: Record<string, string>\n}\n\nconst EXPERIMENTAL_SWITCHES: Record<string, { enable: string[]; disable: string[] }> = {\n ty: { enable: ['ty'], disable: ['pyright'] }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value))\n}\n\nfunction normalizeStringArray(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) return undefined\n const out: string[] = []\n const seen = new Set<string>()\n for (const entry of value) {\n if (typeof entry !== 'string') continue\n const trimmed = entry.trim()\n if (!trimmed || seen.has(trimmed)) continue\n seen.add(trimmed)\n out.push(trimmed)\n }\n return out.length ? out : undefined\n}\n\nfunction normalizeStringRecord(value: unknown): Record<string, string> | undefined {\n if (!isRecord(value)) return undefined\n const out: Record<string, string> = {}\n for (const [key, raw] of Object.entries(value)) {\n if (typeof raw === 'string') {\n out[key] = raw\n }\n }\n return Object.keys(out).length ? out : undefined\n}\n\nfunction normalizeBooleanRecord(value: unknown): Record<string, boolean> | undefined {\n if (!isRecord(value)) return undefined\n const out: Record<string, boolean> = {}\n for (const [key, raw] of Object.entries(value)) {\n if (typeof raw === 'boolean') {\n out[key] = raw\n }\n }\n return Object.keys(out).length ? out : undefined\n}\n\nfunction normalizeInitializationOptions(value: unknown): Record<string, unknown> | undefined {\n if (!isRecord(value)) return undefined\n return Object.keys(value).length ? value : undefined\n}\n\nfunction normalizeServerOverrides(value: unknown): Record<string, LspServerOverride> | undefined {\n if (!isRecord(value)) return undefined\n const out: Record<string, LspServerOverride> = {}\n for (const [id, raw] of Object.entries(value)) {\n if (!isRecord(raw)) continue\n const entry: LspServerOverride = {}\n if (typeof raw.disabled === 'boolean') entry.disabled = raw.disabled\n entry.extensions = normalizeStringArray(raw.extensions)\n entry.rootMarkers = normalizeStringArray(raw.rootMarkers)\n if (typeof raw.command === 'string' && raw.command.trim()) entry.command = raw.command\n entry.args = normalizeStringArray(raw.args)\n entry.env = normalizeStringRecord(raw.env)\n entry.initializationOptions = normalizeInitializationOptions(raw.initializationOptions)\n if (isRecord(raw.root)) {\n const include = normalizeStringArray(raw.root.include)\n const exclude = normalizeStringArray(raw.root.exclude)\n const branches = Array.isArray(raw.root.branches)\n ? raw.root.branches\n .map(branch => normalizeStringArray(branch))\n .filter((branch): branch is string[] => Boolean(branch && branch.length))\n : undefined\n if (include || exclude || branches) {\n entry.root = { include, exclude, branches }\n }\n }\n if (typeof raw.languageId === 'string' && raw.languageId.trim()) entry.languageId = raw.languageId\n if (typeof raw.priority === 'number' && Number.isFinite(raw.priority)) entry.priority = raw.priority\n if (typeof raw.group === 'string' && raw.group.trim()) entry.group = raw.group\n out[id] = entry\n }\n return Object.keys(out).length ? out : undefined\n}\n\nfunction normalizeServerGroups(value: unknown): LspServerGroup[] | undefined {\n if (!Array.isArray(value)) return undefined\n const out: LspServerGroup[] = []\n for (const entry of value) {\n if (!isRecord(entry)) continue\n const id = typeof entry.id === 'string' ? entry.id.trim() : ''\n const strategy =\n entry.strategy === 'parallel' || entry.strategy === 'exclusive' || entry.strategy === 'fallback'\n ? entry.strategy\n : undefined\n const serverIds = normalizeStringArray(entry.serverIds)\n if (!id || !strategy || !serverIds || serverIds.length === 0) continue\n out.push({\n id,\n strategy,\n serverIds,\n extensions: normalizeStringArray(entry.extensions)\n })\n }\n return out.length ? out : undefined\n}\n\nfunction mergeOverrides(\n base: Record<string, LspServerOverride> | undefined,\n next: Record<string, LspServerOverride> | undefined\n): Record<string, LspServerOverride> | undefined {\n if (!base && !next) return undefined\n const out: Record<string, LspServerOverride> = { ...(base ?? {}) }\n if (next) {\n for (const [key, value] of Object.entries(next)) {\n out[key] = { ...(out[key] ?? {}), ...value }\n }\n }\n return out\n}\n\nfunction mergeStringArrays(base: string[] | undefined, next: string[] | undefined): string[] | undefined {\n if (!base && !next) return undefined\n return normalizeStringArray([...(base ?? []), ...(next ?? [])])\n}\n\nfunction mergeStringRecords(\n base: Record<string, string> | undefined,\n next: Record<string, string> | undefined\n): Record<string, string> | undefined {\n if (!base && !next) return undefined\n return { ...(base ?? {}), ...(next ?? {}) }\n}\n\nfunction mergeBooleanRecords(\n base: Record<string, boolean> | undefined,\n next: Record<string, boolean> | undefined\n): Record<string, boolean> | undefined {\n if (!base && !next) return undefined\n return { ...(base ?? {}), ...(next ?? {}) }\n}\n\nfunction mergeLspSettings(base: LspSettings | undefined, next: LspSettings | undefined): LspSettings | undefined {\n if (!base && !next) return undefined\n const merged: LspSettings = { ...(base ?? {}) }\n merged.disabledServers = mergeStringArrays(base?.disabledServers, next?.disabledServers)\n merged.servers = mergeOverrides(base?.servers, next?.servers)\n merged.experimental = mergeBooleanRecords(base?.experimental, next?.experimental)\n merged.languageMap = mergeStringRecords(base?.languageMap, next?.languageMap)\n merged.languageCategories = mergeStringRecords(base?.languageCategories, next?.languageCategories)\n merged.serverGroups = next?.serverGroups ?? base?.serverGroups\n merged.initializationOptions = mergeInitializationOptions(base?.initializationOptions, next?.initializationOptions)\n merged.env = mergeStringRecords(base?.env as Record<string, string> | undefined, next?.env as Record<string, string> | undefined)\n return merged\n}\n\nfunction mergeInitializationOptions(\n base: Record<string, unknown> | undefined,\n next: Record<string, unknown> | undefined\n): Record<string, unknown> | undefined {\n if (!base && !next) return undefined\n return { ...(base ?? {}), ...(next ?? {}) }\n}\n\nfunction hasDenoConfig(rootPath: string): boolean {\n return ['deno.json', 'deno.jsonc'].some(name => existsSync(join(rootPath, name)))\n}\n\nfunction resolveTyBinary(rootPath: string): string | null {\n const direct = Bun.which('ty')\n if (direct) return direct\n const venvPaths = [process.env.VIRTUAL_ENV, join(rootPath, '.venv'), join(rootPath, 'venv')].filter(\n (value): value is string => Boolean(value)\n )\n for (const venvPath of venvPaths) {\n const binary =\n process.platform === 'win32'\n ? join(venvPath, 'Scripts', 'ty.exe')\n : join(venvPath, 'bin', 'ty')\n if (existsSync(binary)) return binary\n }\n return null\n}\n\nfunction hasTyBinary(rootPath: string): boolean {\n return Boolean(resolveTyBinary(rootPath))\n}\n\nfunction applyExperimentalSwitches(settings: LspSettings | undefined): LspSettings | undefined {\n if (!settings) return undefined\n if (!settings.experimental) return settings\n const disabled = new Set(settings.disabledServers ?? [])\n for (const [key, enabled] of Object.entries(settings.experimental)) {\n if (!enabled) continue\n const rule = EXPERIMENTAL_SWITCHES[key]\n if (!rule) continue\n const canDisable =\n key !== 'ty' || hasTyBinary(getCwd())\n for (const id of rule.enable) {\n disabled.delete(id)\n }\n for (const id of rule.disable) {\n if (canDisable) {\n disabled.add(id)\n }\n }\n }\n return {\n ...settings,\n disabledServers: disabled.size ? Array.from(disabled) : undefined\n }\n}\n\nfunction normalizeLspSettings(value: unknown): LspSettings | undefined {\n if (!isRecord(value)) return undefined\n return {\n disabledServers: normalizeStringArray(value.disabledServers),\n servers: normalizeServerOverrides(value.servers),\n experimental: normalizeBooleanRecord(value.experimental),\n languageMap: normalizeStringRecord(value.languageMap),\n languageCategories: normalizeStringRecord(value.languageCategories),\n serverGroups: normalizeServerGroups(value.serverGroups),\n initializationOptions: normalizeInitializationOptions(value.initializationOptions),\n env: normalizeStringRecord(value.env)\n }\n}\n\nfunction loadLspSettingsFromFiles(options?: { projectDir?: string; homeDir?: string }): LspSettings | undefined {\n const projectDir = options?.projectDir ?? getCwd()\n const homeDir = options?.homeDir\n const user = loadSettingsWithLegacyFallback({\n destination: 'userSettings',\n projectDir,\n homeDir,\n migrateToPrimary: true\n }).settings\n const project = loadSettingsWithLegacyFallback({\n destination: 'projectSettings',\n projectDir,\n homeDir,\n migrateToPrimary: true\n }).settings\n const local = loadSettingsWithLegacyFallback({\n destination: 'localSettings',\n projectDir,\n homeDir,\n migrateToPrimary: true\n }).settings\n\n const userSettings = normalizeLspSettings((user as Record<string, unknown> | null)?.lsp)\n const projectSettings = normalizeLspSettings((project as Record<string, unknown> | null)?.lsp)\n const localSettings = normalizeLspSettings((local as Record<string, unknown> | null)?.lsp)\n\n return mergeLspSettings(mergeLspSettings(userSettings, projectSettings), localSettings)\n}\n\nexport function detectPythonVenv(rootPath: string): string | null {\n const envVenv = process.env.VIRTUAL_ENV?.trim()\n const candidates =\n process.platform === 'win32'\n ? [\n ...(envVenv ? [join(envVenv, 'Scripts', 'python.exe')] : []),\n join(rootPath, '.venv', 'Scripts', 'python.exe'),\n join(rootPath, 'venv', 'Scripts', 'python.exe')\n ]\n : [\n ...(envVenv ? [join(envVenv, 'bin', 'python')] : []),\n join(rootPath, '.venv', 'bin', 'python'),\n join(rootPath, 'venv', 'bin', 'python')\n ]\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate\n }\n return null\n}\n\nexport async function npmInstallIfMissing(\n packages: string[],\n cwd: string = lspInstallDir\n): Promise<boolean> {\n const missing = packages.filter(pkg => !existsSync(join(cwd, 'node_modules', pkg, 'package.json')))\n if (missing.length === 0) return true\n return bunInstall(missing, cwd)\n}\n\nexport function multiResolveBinary(options: {\n binNames: string[]\n packageName?: string\n args?: string[]\n cwd?: string\n}): LspServerCommand | null {\n const cwd = options.cwd ?? process.cwd()\n const localBinDir = join(cwd, 'node_modules', '.bin')\n for (const binName of options.binNames) {\n if (Bun.which(binName)) {\n return { command: binName, args: options.args ?? [] }\n }\n const localBin = resolveBinInDir(localBinDir, binName)\n if (localBin) {\n return { command: localBin, args: options.args ?? [] }\n }\n const lspBin = resolveBinInDir(join(lspInstallDir, 'node_modules', '.bin'), binName)\n if (lspBin) {\n return { command: lspBin, args: options.args ?? [] }\n }\n }\n if (options.packageName) {\n const bunBin = Bun.which('bun') ?? process.execPath\n return { command: bunBin, args: ['x', options.packageName, ...(options.args ?? [])] }\n }\n return null\n}\n\nexport type BinaryDownloadPlan = {\n url: string\n archiveType: 'zip' | 'tar.gz'\n installDir: string\n expectedFiles: string[]\n}\n\nexport function planLuaLsDownload(installDir: string): BinaryDownloadPlan {\n const version = process.env.PYB_LUA_LS_VERSION?.trim() || '3.13.5'\n const platform =\n process.platform === 'win32'\n ? 'win32'\n : process.platform === 'darwin'\n ? 'darwin'\n : 'linux'\n const arch = process.arch === 'arm64' ? 'arm64' : 'x64'\n const archiveType = process.platform === 'win32' ? 'zip' : 'tar.gz'\n const filename = `lua-language-server-${version}-${platform}-${arch}.${archiveType}`\n return {\n url: `https://github.com/LuaLS/lua-language-server/releases/download/${version}/${filename}`,\n archiveType,\n installDir,\n expectedFiles: [process.platform === 'win32' ? 'bin/lua-language-server.exe' : 'bin/lua-language-server']\n }\n}\n\nexport function planZlsDownload(installDir: string): BinaryDownloadPlan {\n const version = process.env.PYB_ZLS_VERSION?.trim() || '0.13.0'\n const platform =\n process.platform === 'win32'\n ? 'windows'\n : process.platform === 'darwin'\n ? 'macos'\n : 'linux'\n const arch = process.arch === 'arm64' ? 'aarch64' : 'x86_64'\n const archiveType = process.platform === 'win32' ? 'zip' : 'tar.gz'\n const filename = `zls-${platform}-${arch}.${archiveType}`\n return {\n url: `https://github.com/zls/zls/releases/download/${version}/${filename}`,\n archiveType,\n installDir,\n expectedFiles: [process.platform === 'win32' ? 'zls.exe' : 'zls']\n }\n}\n\nexport function planElixirLsDownload(installDir: string): BinaryDownloadPlan {\n const version = process.env.PYB_ELIXIR_LS_VERSION?.trim() || '0.18.2'\n const archiveType = 'zip'\n const filename = `elixir-ls-${version}.zip`\n return {\n url: `https://github.com/elixir-lsp/elixir-ls/releases/download/${version}/${filename}`,\n archiveType,\n installDir,\n expectedFiles: ['language_server.sh']\n }\n}\n\nexport function planJdtlsDownload(installDir: string): BinaryDownloadPlan {\n const version = process.env.PYB_JDTLS_VERSION?.trim() || '1.34.0'\n const platform =\n process.platform === 'win32'\n ? 'win32'\n : process.platform === 'darwin'\n ? 'mac'\n : 'linux'\n const archiveType = 'tar.gz'\n const filename = `jdtls-${version}-${platform}.tar.gz`\n return {\n url: `https://download.eclipse.org/jdtls/milestones/${version}/${filename}`,\n archiveType,\n installDir,\n expectedFiles: ['plugins', 'configuration']\n }\n}\n\nasync function extractArchive(buffer: Uint8Array, archiveType: 'zip' | 'tar.gz', targetDir: string): Promise<void> {\n if (archiveType === 'zip') {\n const { unzipSync } = await import('fflate')\n const files = unzipSync(buffer)\n for (const [name, data] of Object.entries(files)) {\n const targetPath = join(targetDir, name)\n const targetDirPath = dirname(targetPath)\n if (!existsSync(targetDirPath)) {\n mkdirSync(targetDirPath, { recursive: true })\n }\n writeFileSync(targetPath, data)\n }\n return\n }\n const archiveName = `archive-${Date.now()}.tar.gz`\n const tempDir = mkdtempSync(join(targetDir, 'tmp-'))\n const archivePath = join(tempDir, archiveName)\n writeFileSync(archivePath, buffer)\n await runBinary(['tar', '-xzf', archivePath, '-C', targetDir], undefined, tempDir)\n rmSync(tempDir, { recursive: true, force: true })\n}\n\nexport async function downloadAndExtractArchive(plan: BinaryDownloadPlan): Promise<void> {\n if (!existsSync(plan.installDir)) {\n mkdirSync(plan.installDir, { recursive: true })\n }\n const response = await fetch(plan.url)\n if (!response.ok) {\n throw new Error(`Failed to download ${plan.url}: ${response.status}`)\n }\n const buffer = new Uint8Array(await response.arrayBuffer())\n await extractArchive(buffer, plan.archiveType, plan.installDir)\n}\n\nfunction findFileRecursive(root: string, filename: string): string | null {\n const entries = readdirSync(root, { withFileTypes: true })\n for (const entry of entries) {\n const full = join(root, entry.name)\n if (entry.isDirectory()) {\n const found = findFileRecursive(full, filename)\n if (found) return found\n } else if (entry.isFile() && entry.name === filename) {\n return full\n }\n }\n return null\n}\n\nexport async function installLuaLs(installDir: string): Promise<boolean> {\n const plan = planLuaLsDownload(installDir)\n await downloadAndExtractArchive(plan)\n const expected = plan.expectedFiles.find(file => findFileRecursive(installDir, basename(file)))\n if (!expected) {\n throw new Error('LuaLS binary not found after extraction')\n }\n if (process.platform !== 'win32') {\n chmodSync(expected, 0o755)\n }\n return true\n}\n\nexport async function installZls(installDir: string): Promise<boolean> {\n if (!Bun.which('zig')) {\n throw new Error('zig not found')\n }\n const plan = planZlsDownload(installDir)\n await downloadAndExtractArchive(plan)\n const expected = plan.expectedFiles.find(file => findFileRecursive(installDir, basename(file)))\n if (!expected) {\n throw new Error('zls binary not found after extraction')\n }\n if (process.platform !== 'win32') {\n chmodSync(expected, 0o755)\n }\n return true\n}\n\nexport async function installElixirLs(installDir: string): Promise<boolean> {\n if (!Bun.which('elixir') || !Bun.which('mix')) {\n throw new Error('elixir or mix not found')\n }\n const plan = planElixirLsDownload(installDir)\n await downloadAndExtractArchive(plan)\n const script =\n findFileRecursive(\n installDir,\n process.platform === 'win32' ? 'language_server.bat' : 'language_server.sh'\n ) ?? findFileRecursive(installDir, 'language_server.sh')\n if (!script) {\n throw new Error('language_server script not found after extraction')\n }\n await runBinary(['mix', 'deps.get'], undefined, installDir)\n await runBinary(['mix', 'compile'], undefined, installDir)\n if (process.platform !== 'win32') {\n chmodSync(script, 0o755)\n }\n return true\n}\n\nexport async function installJdtls(installDir: string): Promise<boolean> {\n if (!Bun.which('java')) {\n throw new Error('java not found')\n }\n const javaMajor = await getJavaMajorVersion()\n if (!javaMajor || javaMajor < 21) {\n throw new Error('java 21 or newer required')\n }\n const plan = planJdtlsDownload(installDir)\n await downloadAndExtractArchive(plan)\n const pluginsDir = join(installDir, 'plugins')\n const configDir = join(installDir, 'configuration')\n if (!existsSync(pluginsDir) || !existsSync(configDir)) {\n throw new Error('jdtls install incomplete')\n }\n return true\n}\n\nfunction getJdtlsLauncherJar(installDir: string): string | null {\n const pluginsDir = join(installDir, 'plugins')\n if (!existsSync(pluginsDir)) return null\n const launcher = readdirSync(pluginsDir).find(name =>\n name.startsWith('org.eclipse.equinox.launcher_') && name.endsWith('.jar')\n )\n if (!launcher) return null\n const launcherPath = join(pluginsDir, launcher)\n return existsSync(launcherPath) ? launcherPath : null\n}\n\nfunction getJdtlsConfigDir(installDir: string): string | null {\n const suffix = process.platform === 'darwin' ? 'mac' : process.platform === 'win32' ? 'win' : 'linux'\n const baseConfig = join(installDir, 'configuration')\n const candidates = [\n join(installDir, `config_${suffix}`),\n join(baseConfig, `config_${suffix}`),\n baseConfig\n ]\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate\n }\n return null\n}\n\nexport type LspServerCommand = { command: string; args: string[] }\n\nexport type LspInstallStrategy = () => Promise<boolean>\n\nexport type LspSpawnStrategy = (rootPath: string) => Promise<LspServerCommand | null>\n\nexport type LspRootStrategy = (filePath: string, defaultRoot: string) => Promise<string> | string\n\nexport interface LspServerInfo {\n id: string\n extensions: string[]\n rootMarkers: string[]\n prepare(): Promise<boolean>\n getCommand(rootPath: string): Promise<LspServerCommand | null>\n resolveRoot?: LspRootStrategy\n env?: Record<string, string>\n initializationOptions?: Record<string, unknown>\n languageId?: string\n rootInclude?: string[]\n rootExclude?: string[]\n rootBranches?: string[][]\n priority?: number\n group?: string\n disabled?: boolean\n}\n\nabstract class BaseLspServer implements LspServerInfo {\n abstract id: string\n abstract extensions: string[]\n abstract rootMarkers: string[]\n\n abstract prepare(): Promise<boolean>\n abstract getCommand(rootPath: string): Promise<LspServerCommand | null>\n\n protected isInPath(cmd: string): boolean {\n return Boolean(Bun.which(cmd))\n }\n\n protected getLocalBinPath(binName: string, npmPackageName?: string): string {\n const localNodeModulesBin = join(process.cwd(), 'node_modules', '.bin')\n const localBin = resolveBinInDir(localNodeModulesBin, binName)\n if (localBin) return localBin\n\n try {\n const pkgName = npmPackageName || binName\n const pkgEntry = require.resolve(pkgName, { paths: [process.cwd(), __dirname] })\n let current = pkgEntry\n let pkgRoot = ''\n for (let i = 0; i < 5; i++) {\n current = join(current, '..')\n if (existsSync(join(current, 'package.json'))) {\n pkgRoot = current\n break\n }\n }\n if (pkgRoot) {\n const nodeModulesRoot = join(pkgRoot, '..')\n const resolved = resolveBinInDir(join(nodeModulesRoot, '.bin'), binName)\n if (resolved) return resolved\n }\n } catch (e) {}\n\n const lspBin = resolveBinInDir(join(lspInstallDir, 'node_modules', '.bin'), binName)\n if (lspBin) return lspBin\n\n return ''\n }\n\n protected getRuntimeCommand(): string {\n if (process.execPath && existsSync(process.execPath)) {\n return process.execPath\n }\n const nodeBin = Bun.which('node')\n if (nodeBin && existsSync(nodeBin)) {\n return nodeBin\n }\n const bunBin = Bun.which('bun')\n if (bunBin && existsSync(bunBin)) {\n return bunBin\n }\n return 'node'\n }\n}\n\nexport class ServerDefinition extends BaseLspServer {\n id: string\n extensions: string[]\n rootMarkers: string[]\n private installStrategy?: LspInstallStrategy\n private spawnStrategy?: LspSpawnStrategy\n resolveRoot?: LspRootStrategy\n priority?: number\n group?: string\n\n constructor(options: {\n id: string\n extensions: string[]\n rootMarkers: string[]\n install?: LspInstallStrategy\n spawn?: LspSpawnStrategy\n resolveRoot?: LspRootStrategy\n priority?: number\n group?: string\n }) {\n super()\n this.id = options.id\n this.extensions = options.extensions\n this.rootMarkers = options.rootMarkers\n this.installStrategy = options.install\n this.spawnStrategy = options.spawn\n this.resolveRoot = options.resolveRoot\n this.priority = options.priority\n this.group = options.group\n }\n\n async prepare(): Promise<boolean> {\n if (this.installStrategy) {\n return this.installStrategy()\n }\n return true\n }\n\n async getCommand(rootPath: string): Promise<LspServerCommand | null> {\n if (this.spawnStrategy) {\n return this.spawnStrategy(rootPath)\n }\n return null\n }\n}\n\nclass OverriddenServer implements LspServerInfo {\n id: string\n extensions: string[]\n rootMarkers: string[]\n resolveRoot?: LspRootStrategy\n env?: Record<string, string>\n initializationOptions?: Record<string, unknown>\n languageId?: string\n rootInclude?: string[]\n rootExclude?: string[]\n rootBranches?: string[][]\n priority?: number\n group?: string\n disabled?: boolean\n private overrideCommand?: string\n private overrideArgs?: string[]\n\n constructor(\n private base: LspServerInfo,\n override: LspServerOverride | undefined,\n globalEnv: Record<string, string> | undefined,\n globalInitializationOptions: Record<string, unknown> | undefined\n ) {\n this.id = base.id\n this.extensions = override?.extensions ?? base.extensions\n this.rootMarkers = override?.rootMarkers ?? base.rootMarkers\n this.resolveRoot = base.resolveRoot\n this.env = mergeStringRecords(mergeStringRecords(base.env, globalEnv), override?.env)\n this.initializationOptions = mergeInitializationOptions(\n mergeInitializationOptions(base.initializationOptions, globalInitializationOptions),\n override?.initializationOptions\n )\n this.languageId = override?.languageId ?? base.languageId\n this.rootInclude = override?.root?.include ?? base.rootInclude\n this.rootExclude = override?.root?.exclude ?? base.rootExclude\n this.rootBranches = override?.root?.branches ?? base.rootBranches\n this.priority = override?.priority ?? base.priority\n this.group = override?.group ?? base.group\n this.disabled = override?.disabled ?? base.disabled\n this.overrideCommand = override?.command\n this.overrideArgs = override?.args\n }\n\n async prepare(): Promise<boolean> {\n return this.base.prepare()\n }\n\n async getCommand(rootPath: string): Promise<LspServerCommand | null> {\n if (this.overrideCommand) {\n return { command: this.overrideCommand, args: this.overrideArgs ?? [] }\n }\n if (this.base.id && this.base.id.length > 0) {\n return this.base.getCommand(rootPath)\n }\n return null\n }\n}\n\nexport class GenericNpmServer extends BaseLspServer {\n id: string\n extensions: string[]\n rootMarkers: string[]\n npmPackage: string\n binName: string\n args: string[]\n\n constructor(id: string, extensions: string[], rootMarkers: string[], npmPackage: string, binName: string, args: string[]) {\n super()\n this.id = id\n this.extensions = extensions\n this.rootMarkers = rootMarkers\n this.npmPackage = npmPackage\n this.binName = binName\n this.args = args\n }\n\n async prepare(): Promise<boolean> {\n if (this.isInPath(this.binName)) {\n return true\n }\n \n const localBin = this.getLocalBinPath(this.binName, this.npmPackage)\n if (existsSync(localBin)) {\n return true\n }\n\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) {\n return false\n }\n\n debugLogger.info('LSP_INSTALL', { server: this.id, action: 'start' })\n const ok = await bunInstall([this.npmPackage])\n if (!ok) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: this.id })\n return false\n }\n debugLogger.info('LSP_INSTALL', { server: this.id, action: 'success' })\n return true\n }\n\n async getCommand(rootPath: string): Promise<LspServerCommand | null> {\n // Optimization for Windows: Always try to run node script directly to avoid cmd.exe issues\n // We do this BEFORE checking PATH because 'bun run' adds node_modules/.bin to PATH,\n // which points to the .cmd shim that we want to avoid.\n if (process.platform === 'win32') {\n const pkgJsonPaths: string[] = []\n try {\n const resolvedPath = require.resolve(`${this.npmPackage}/package.json`, { paths: [process.cwd(), __dirname] })\n if (resolvedPath) {\n pkgJsonPaths.push(resolvedPath)\n }\n } catch (e) {}\n const localPkgJson = join(lspInstallDir, 'node_modules', ...this.npmPackage.split('/'), 'package.json')\n if (existsSync(localPkgJson)) {\n pkgJsonPaths.push(localPkgJson)\n }\n\n for (const pkgJsonPath of pkgJsonPaths) {\n try {\n const pkgJson = require(pkgJsonPath)\n let binScript = ''\n if (typeof pkgJson.bin === 'string') {\n binScript = pkgJson.bin\n } else if (typeof pkgJson.bin === 'object' && pkgJson.bin[this.binName]) {\n binScript = pkgJson.bin[this.binName]\n }\n\n if (binScript) {\n if (this.npmPackage === 'pyright' && binScript.endsWith('langserver.index.js')) {\n const distScript = join(dirname(pkgJsonPath), 'dist', 'pyright-langserver.js')\n if (existsSync(distScript)) {\n return { command: this.getRuntimeCommand(), args: [distScript, ...this.args] }\n }\n }\n\n const scriptPath = join(dirname(pkgJsonPath), binScript)\n if (existsSync(scriptPath)) {\n return { command: this.getRuntimeCommand(), args: [scriptPath, ...this.args] }\n }\n }\n } catch (e) {}\n }\n }\n\n if (this.isInPath(this.binName)) {\n return { command: this.binName, args: this.args }\n }\n \n const localBin = this.getLocalBinPath(this.binName, this.npmPackage)\n if (existsSync(localBin)) {\n return { command: localBin, args: this.args }\n }\n \n return null\n }\n}\n\nclass GenericBinaryServer extends BaseLspServer {\n id: string\n extensions: string[]\n rootMarkers: string[]\n binNames: string[]\n args: string[]\n\n constructor(id: string, extensions: string[], rootMarkers: string[], binNames: string | string[], args: string[]) {\n super()\n this.id = id\n this.extensions = extensions\n this.rootMarkers = rootMarkers\n this.binNames = Array.isArray(binNames) ? binNames : [binNames]\n this.args = args\n }\n\n async prepare(): Promise<boolean> {\n return this.binNames.some(bin => this.isInPath(bin))\n }\n\n async getCommand(rootPath: string): Promise<LspServerCommand | null> {\n for (const bin of this.binNames) {\n if (this.isInPath(bin)) {\n return { command: bin, args: this.args }\n }\n }\n return null\n }\n}\n\nclass GoplsServer extends BaseLspServer {\n id = 'gopls'\n extensions = ['.go', '.mod']\n rootMarkers = ['go.mod', 'go.work', '.git']\n\n async prepare(): Promise<boolean> {\n if (this.isInPath('gopls')) {\n return true\n }\n\n if (!this.isInPath('go')) {\n debugLogger.error('LSP_MISSING_DEP', { server: this.id, error: 'go command not found' })\n return false\n }\n\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) {\n return false\n }\n\n return this.installGo()\n }\n\n async getCommand(rootPath: string): Promise<LspServerCommand | null> {\n if (this.isInPath('gopls')) {\n return { command: 'gopls', args: ['serve'] }\n }\n\n const localBin = resolveBinInDir(lspInstallDir, 'gopls')\n if (localBin) {\n return { command: localBin, args: ['serve'] }\n }\n\n return null\n }\n\n private async installGo(): Promise<boolean> {\n try {\n debugLogger.info('LSP_INSTALL', { server: this.id, action: 'start' })\n\n const result = await runBinary(\n ['go', 'install', 'golang.org/x/tools/gopls@latest'],\n {\n GOBIN: lspInstallDir,\n PATH: process.env.PATH ? `${lspInstallDir}${process.platform === 'win32' ? ';' : ':'}${process.env.PATH}` : lspInstallDir\n }\n )\n\n if (!result.ok) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: this.id, error: result.error })\n return false\n }\n\n if (!this.isInPath('gopls') && !resolveBinInDir(lspInstallDir, 'gopls')) {\n debugLogger.warn('LSP_INSTALL_WARNING', { server: this.id, message: 'gopls installed but not found in PATH.' })\n }\n\n debugLogger.info('LSP_INSTALL', { server: this.id, action: 'success' })\n return true\n } catch (e) {\n debugLogger.error('LSP_INSTALL_ERROR', { server: this.id, error: String(e) })\n return false\n }\n }\n}\n\nclass RustAnalyzerServer extends BaseLspServer {\n id = 'rust-analyzer'\n extensions = ['.rs']\n rootMarkers = ['Cargo.toml', 'rust-project.json', '.git']\n\n async prepare(): Promise<boolean> {\n if (this.isInPath('rust-analyzer')) {\n return true\n }\n\n if (this.isInPath('rustup')) {\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) {\n return false\n }\n return this.installRustup()\n }\n\n debugLogger.warn('LSP_MISSING_DEP', { server: this.id, message: 'rust-analyzer not found and rustup not available. Please install rust-analyzer manually.' })\n return false\n }\n\n async getCommand(rootPath: string): Promise<LspServerCommand | null> {\n if (this.isInPath('rust-analyzer')) {\n return { command: 'rust-analyzer', args: [] }\n }\n return null\n }\n\n private async installRustup(): Promise<boolean> {\n try {\n debugLogger.info('LSP_INSTALL', { server: this.id, action: 'start' })\n\n const result = await runBinary(['rustup', 'component', 'add', 'rust-analyzer'])\n\n if (!result.ok) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: this.id, error: result.error })\n return false\n }\n\n debugLogger.info('LSP_INSTALL', { server: this.id, action: 'success' })\n return true\n } catch (e) {\n debugLogger.error('LSP_INSTALL_ERROR', { server: this.id, error: String(e) })\n return false\n }\n }\n}\n\n\nexport class LspServerRegistry {\n private static instance: LspServerRegistry\n private servers: LspServerInfo[] = []\n private baseServers: LspServerInfo[] = []\n private globalSettings: LspSettings | undefined\n\n private constructor() {\n // Pyright (GenericNpmServer)\n this.register(new GenericNpmServer(\n 'pyright',\n ['.py', '.pyi'],\n ['pyrightconfig.json', 'pyproject.toml', 'setup.py', 'requirements.txt', 'Pipfile'],\n 'pyright',\n 'pyright-langserver',\n ['--stdio']\n ))\n\n this.register(new ServerDefinition({\n id: 'ty',\n extensions: ['.py', '.pyi'],\n rootMarkers: ['pyproject.toml', 'ty.toml', 'setup.py', 'setup.cfg', 'requirements.txt', 'Pipfile', 'pyrightconfig.json'],\n spawn: async (rootPath) => {\n const binary = resolveTyBinary(rootPath)\n if (!binary) return null\n return { command: binary, args: ['server'] }\n },\n priority: -1\n }))\n \n this.register(new GoplsServer())\n this.register(new RustAnalyzerServer())\n this.register(new GenericNpmServer(\n 'bash-language-server',\n ['.sh', '.bash', '.zsh'],\n ['.git'],\n 'bash-language-server',\n 'bash-language-server',\n ['start']\n ))\n\n this.register(new ServerDefinition({\n id: 'deno',\n extensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.mts', '.cts'],\n rootMarkers: ['deno.json', 'deno.jsonc'],\n spawn: async (rootPath) => {\n if (!hasDenoConfig(rootPath)) return null\n const deno = Bun.which('deno')\n if (!deno) return null\n return { command: deno, args: ['lsp'] }\n },\n priority: 5\n }))\n\n // TypeScript/JavaScript (typescript-language-server)\n this.register(new GenericNpmServer(\n 'typescript-language-server',\n ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'],\n ['tsconfig.json', 'package.json', 'jsconfig.json'],\n 'typescript-language-server',\n 'typescript-language-server',\n ['--stdio']\n ))\n\n // Tier 1: Easy NPM-based Servers\n // YAML\n this.register(new GenericNpmServer(\n 'yaml-language-server',\n ['.yaml', '.yml'],\n [],\n 'yaml-language-server',\n 'yaml-language-server',\n ['--stdio']\n ))\n\n // Dockerfile\n this.register(new GenericNpmServer(\n 'dockerfile-language-server',\n ['Dockerfile', '.dockerfile'],\n [],\n 'dockerfile-language-server-nodejs',\n 'docker-langserver',\n ['--stdio']\n ))\n\n // Vue\n this.register(new ServerDefinition({\n id: 'vue-language-server',\n extensions: ['.vue'],\n rootMarkers: ['package.json'],\n install: async () => {\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) return false\n ensureInstallDir()\n return npmInstallIfMissing(['@vue/language-server'])\n },\n spawn: async (rootPath) =>\n multiResolveBinary({\n binNames: ['vue-language-server'],\n args: ['--stdio'],\n packageName: '@vue/language-server',\n cwd: rootPath\n })\n }))\n\n this.register(new ServerDefinition({\n id: 'eslint',\n extensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.mts', '.cts', '.vue'],\n rootMarkers: [\n 'package-lock.json',\n 'bun.lockb',\n 'bun.lock',\n 'pnpm-lock.yaml',\n 'yarn.lock',\n 'package.json'\n ],\n install: async () => installEslintServer(),\n spawn: async (rootPath) => {\n const serverPath = getEslintServerPath()\n if (!existsSync(serverPath)) return null\n try {\n await Bun.resolve('eslint', rootPath)\n } catch {\n return null\n }\n const bunBin = Bun.which('bun') ?? process.execPath\n return { command: bunBin, args: [serverPath, '--stdio'] }\n },\n priority: -10,\n group: 'lint'\n }))\n\n this.register(new ServerDefinition({\n id: 'oxlint',\n extensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.mts', '.cts', '.vue', '.astro', '.svelte'],\n rootMarkers: [\n '.oxlintrc.json',\n 'package-lock.json',\n 'bun.lockb',\n 'bun.lock',\n 'pnpm-lock.yaml',\n 'yarn.lock',\n 'package.json'\n ],\n spawn: async (rootPath) => {\n const lintCommand = multiResolveBinary({\n binNames: ['oxlint'],\n args: ['--lsp'],\n cwd: rootPath\n })\n if (lintCommand) return lintCommand\n const serverCommand = multiResolveBinary({\n binNames: ['oxc_language_server'],\n cwd: rootPath\n })\n if (serverCommand) return serverCommand\n return multiResolveBinary({\n binNames: ['oxlint'],\n args: ['--lsp'],\n packageName: 'oxlint',\n cwd: rootPath\n })\n },\n priority: -5,\n group: 'lint'\n }))\n\n this.register(new ServerDefinition({\n id: 'biome',\n extensions: [\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.mjs',\n '.cjs',\n '.mts',\n '.cts',\n '.json',\n '.jsonc',\n '.vue',\n '.astro',\n '.svelte',\n '.css',\n '.graphql',\n '.gql',\n '.html'\n ],\n rootMarkers: [\n 'biome.json',\n 'biome.jsonc',\n 'package-lock.json',\n 'bun.lockb',\n 'bun.lock',\n 'pnpm-lock.yaml',\n 'yarn.lock'\n ],\n spawn: async (rootPath) =>\n multiResolveBinary({\n binNames: ['biome'],\n args: ['lsp-proxy', '--stdio'],\n packageName: 'biome',\n cwd: rootPath\n }),\n priority: -5,\n group: 'lint'\n }))\n\n // HTML/CSS/JSON (vscode-langservers-extracted)\n // Note: The binary names might vary, usually `vscode-html-language-server`, `vscode-css-language-server`\n // Let's add them individually but sharing the same package install? \n // GenericNpmServer assumes 1 package = 1 binary. \n // vscode-langservers-extracted provides multiple bins.\n // We can just instantiate multiple GenericNpmServer with the same package name. It's fine, it will just try to install it again (npm handles it).\n \n this.register(new GenericNpmServer(\n 'html-language-server',\n ['.html', '.htm'],\n [],\n 'vscode-langservers-extracted',\n 'vscode-html-language-server',\n ['--stdio']\n ))\n\n this.register(new GenericNpmServer(\n 'css-language-server',\n ['.css', '.scss', '.less'],\n [],\n 'vscode-langservers-extracted',\n 'vscode-css-language-server',\n ['--stdio']\n ))\n\n this.register(new GenericNpmServer(\n 'json-language-server',\n ['.json', '.jsonc'],\n [],\n 'vscode-langservers-extracted',\n 'vscode-json-language-server',\n ['--stdio']\n ))\n\n // Tier 2: Easy NPM-based Servers (More)\n // PHP (intelephense)\n this.register(new GenericNpmServer(\n 'intelephense',\n ['.php'],\n ['composer.json'],\n 'intelephense',\n 'intelephense',\n ['--stdio']\n ))\n\n // Svelte\n this.register(new ServerDefinition({\n id: 'svelte-language-server',\n extensions: ['.svelte'],\n rootMarkers: ['package.json'],\n install: async () => {\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) return false\n ensureInstallDir()\n return npmInstallIfMissing(['svelte-language-server'])\n },\n spawn: async (rootPath) =>\n multiResolveBinary({\n binNames: ['svelte-language-server'],\n args: ['--stdio'],\n packageName: 'svelte-language-server',\n cwd: rootPath\n })\n }))\n\n // Astro\n this.register(new ServerDefinition({\n id: 'astro-ls',\n extensions: ['.astro'],\n rootMarkers: ['package.json'],\n install: async () => {\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) return false\n ensureInstallDir()\n return npmInstallIfMissing(['@astrojs/language-server'])\n },\n spawn: async (rootPath) =>\n multiResolveBinary({\n binNames: ['astro-ls'],\n args: ['--stdio'],\n packageName: '@astrojs/language-server',\n cwd: rootPath\n })\n }))\n\n // Prisma\n this.register(new GenericNpmServer(\n 'prisma-language-server',\n ['.prisma'],\n ['schema.prisma'],\n '@prisma/language-server',\n 'prisma-language-server',\n ['--stdio']\n ))\n\n // GraphQL\n this.register(new GenericNpmServer(\n 'graphql-lsp',\n ['.graphql', '.gql'],\n ['.graphqlrc', 'graphql.config.js'],\n 'graphql-language-service-cli',\n 'graphql-lsp',\n ['server', '-m', 'stream']\n ))\n\n // Tier 3: Binary Path Detection (System Dependencies)\n this.register(new ServerDefinition({\n id: 'jdtls',\n extensions: ['.java'],\n rootMarkers: ['pom.xml', 'build.gradle', 'build.gradle.kts', '.project', '.classpath'],\n install: async () => {\n const installDir = join(lspInstallDir, 'jdtls')\n const launcherJar = getJdtlsLauncherJar(installDir)\n const configDir = getJdtlsConfigDir(installDir)\n if (launcherJar && configDir) return true\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) return false\n ensureInstallDir()\n try {\n await installJdtls(installDir)\n return true\n } catch (error) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: 'jdtls', error: String(error) })\n return false\n }\n },\n spawn: async () => {\n const java = Bun.which('java')\n if (!java) return null\n const javaMajor = await getJavaMajorVersion()\n if (!javaMajor || javaMajor < 21) return null\n const installDir = join(lspInstallDir, 'jdtls')\n const launcherJar = getJdtlsLauncherJar(installDir)\n const configDir = getJdtlsConfigDir(installDir)\n if (!launcherJar || !configDir) return null\n const dataDir = mkdtempSync(join(tmpdir(), 'pyb-jdtls-'))\n return {\n command: java,\n args: [\n '-jar',\n launcherJar,\n '-configuration',\n configDir,\n '-data',\n dataDir,\n '-Declipse.application=org.eclipse.jdt.ls.core.id1',\n '-Dosgi.bundles.defaultStartLevel=4',\n '-Declipse.product=org.eclipse.jdt.ls.core.product',\n '-Dlog.level=ALL',\n '--add-modules=ALL-SYSTEM',\n '--add-opens',\n 'java.base/java.util=ALL-UNNAMED',\n '--add-opens',\n 'java.base/java.lang=ALL-UNNAMED'\n ]\n }\n }\n }))\n\n // C/C++ (clangd)\n this.register(new GenericBinaryServer(\n 'clangd',\n ['.c', '.cpp', '.h', '.hpp', '.cc'],\n ['compile_commands.json', '.clang-format'],\n 'clangd',\n ['--stdio']\n ))\n\n // Ruby (ruby-lsp)\n this.register(new GenericBinaryServer(\n 'ruby-lsp',\n ['.rb', '.rake'],\n ['Gemfile', '.ruby-version'],\n 'ruby-lsp',\n ['--stdio']\n ))\n\n this.register(new ServerDefinition({\n id: 'lua-language-server',\n extensions: ['.lua'],\n rootMarkers: [\n '.luarc.json',\n '.luarc.jsonc',\n '.luacheckrc',\n '.stylua.toml',\n 'stylua.toml',\n 'selene.toml',\n 'selene.yml'\n ],\n install: async () => {\n const installDir = join(lspInstallDir, 'lua-language-server')\n const existing = findFileRecursive(\n installDir,\n process.platform === 'win32' ? 'lua-language-server.exe' : 'lua-language-server'\n )\n if (existing) return true\n if (Bun.which('lua-language-server') || Bun.which('lua-ls')) return true\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) return false\n ensureInstallDir()\n try {\n await installLuaLs(installDir)\n return true\n } catch (error) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: 'lua-language-server', error: String(error) })\n return false\n }\n },\n spawn: async (rootPath) => {\n const direct = multiResolveBinary({\n binNames: ['lua-language-server', 'lua-ls'],\n cwd: rootPath\n })\n if (direct) return direct\n const installDir = join(lspInstallDir, 'lua-language-server')\n const binary = findFileRecursive(\n installDir,\n process.platform === 'win32' ? 'lua-language-server.exe' : 'lua-language-server'\n )\n if (!binary) return null\n return { command: binary, args: [] }\n }\n }))\n\n // Terraform (terraform-ls)\n this.register(new GenericBinaryServer(\n 'terraform-ls',\n ['.tf', '.tfvars'],\n [],\n 'terraform-ls',\n ['serve']\n ))\n\n // Kotlin (kotlin-language-server)\n this.register(new GenericBinaryServer(\n 'kotlin-language-server',\n ['.kt', '.kts'],\n ['build.gradle.kts'],\n ['kotlin-ls', 'kotlin-language-server'],\n []\n ))\n\n this.register(new ServerDefinition({\n id: 'elixir-ls',\n extensions: ['.ex', '.exs'],\n rootMarkers: ['mix.exs', 'mix.lock'],\n install: async () => {\n const installDir = join(lspInstallDir, 'elixir-ls')\n const existing = findFileRecursive(\n installDir,\n process.platform === 'win32' ? 'language_server.bat' : 'language_server.sh'\n )\n if (existing) return true\n if (Bun.which('elixir-ls')) return true\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) return false\n ensureInstallDir()\n try {\n await installElixirLs(installDir)\n return true\n } catch (error) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: 'elixir-ls', error: String(error) })\n return false\n }\n },\n spawn: async (rootPath) => {\n if (Bun.which('elixir-ls')) {\n return { command: 'elixir-ls', args: [] }\n }\n const installDir = join(lspInstallDir, 'elixir-ls')\n const binary =\n findFileRecursive(installDir, process.platform === 'win32' ? 'language_server.bat' : 'language_server.sh') ??\n findFileRecursive(installDir, 'language_server.sh')\n if (!binary) return null\n return { command: binary, args: [] }\n }\n }))\n\n this.register(new ServerDefinition({\n id: 'zls',\n extensions: ['.zig', '.zon'],\n rootMarkers: ['build.zig'],\n install: async () => {\n const installDir = join(lspInstallDir, 'zls')\n const existing = findFileRecursive(installDir, process.platform === 'win32' ? 'zls.exe' : 'zls')\n if (existing) return true\n if (Bun.which('zls')) return true\n const canInstall = await isAutoInstallEnabled()\n if (!canInstall) return false\n ensureInstallDir()\n try {\n await installZls(installDir)\n return true\n } catch (error) {\n debugLogger.error('LSP_INSTALL_FAILED', { server: 'zls', error: String(error) })\n return false\n }\n },\n spawn: async (rootPath) => {\n const direct = multiResolveBinary({ binNames: ['zls'], cwd: rootPath })\n if (direct) return direct\n const installDir = join(lspInstallDir, 'zls')\n const binary = findFileRecursive(installDir, process.platform === 'win32' ? 'zls.exe' : 'zls')\n if (!binary) return null\n return { command: binary, args: [] }\n }\n }))\n\n // C# (csharp-ls)\n this.register(new GenericBinaryServer(\n 'csharp-ls',\n ['.cs'],\n ['.csproj', '.sln'],\n 'csharp-ls',\n []\n ))\n\n // F# (fsautocomplete)\n this.register(new GenericBinaryServer(\n 'fsautocomplete',\n ['.fs', '.fsi', '.fsx'],\n ['.fsproj', '.sln'],\n 'fsautocomplete',\n ['--background-service-enabled']\n ))\n\n // Swift (sourcekit-lsp)\n this.register(new GenericBinaryServer(\n 'sourcekit-lsp',\n ['.swift'],\n ['Package.swift'],\n 'sourcekit-lsp',\n []\n ))\n\n // Dart (dart language-server)\n this.register(new GenericBinaryServer(\n 'dart',\n ['.dart'],\n ['pubspec.yaml'],\n 'dart',\n ['language-server']\n ))\n\n // OCaml (ocamllsp)\n this.register(new GenericBinaryServer(\n 'ocamllsp',\n ['.ml', '.mli'],\n ['dune-project'],\n ['ocaml-lsp', 'ocamllsp'],\n []\n ))\n\n // Gleam (gleam lsp)\n this.register(new GenericBinaryServer(\n 'gleam',\n ['.gleam'],\n ['gleam.toml'],\n 'gleam',\n ['lsp']\n ))\n\n // Clojure (clojure-lsp)\n this.register(new GenericBinaryServer(\n 'clojure-lsp',\n ['.clj', '.cljs', '.cljc', '.edn'],\n ['deps.edn', 'project.clj'],\n 'clojure-lsp',\n []\n ))\n\n // Nix (nixd)\n this.register(new GenericBinaryServer(\n 'nixd',\n ['.nix'],\n ['flake.nix'],\n 'nixd',\n []\n ))\n\n // Typst (tinymist)\n this.register(new GenericBinaryServer(\n 'tinymist',\n ['.typ'],\n [],\n 'tinymist',\n []\n ))\n\n // Scala (metals)\n this.register(new GenericBinaryServer(\n 'metals',\n ['.scala', '.sbt', '.sc'],\n ['build.sbt'],\n 'metals',\n []\n ))\n\n // Haskell (haskell-language-server-wrapper)\n this.register(new GenericBinaryServer(\n 'haskell-language-server',\n ['.hs', '.lhs'],\n ['stack.yaml', 'cabal.project', '*.cabal'],\n 'haskell-language-server-wrapper',\n ['--lsp']\n ))\n\n // Tex/Latex (texlab)\n this.register(new GenericBinaryServer(\n 'texlab',\n ['.tex', '.bib'],\n [],\n 'texlab',\n []\n ))\n this.applyConfigOverrides(loadLspSettingsFromFiles())\n }\n\n static getInstance(): LspServerRegistry {\n if (!LspServerRegistry.instance) {\n LspServerRegistry.instance = new LspServerRegistry()\n }\n return LspServerRegistry.instance\n }\n\n register(server: LspServerInfo) {\n this.baseServers.push(server)\n this.servers.push(server)\n }\n\n getServerForExtension(ext: string): LspServerInfo | null {\n const servers = this.getServersForExtension(ext)\n return servers[0] ?? null\n }\n\n getServersForExtension(ext: string): LspServerInfo[] {\n const candidates = this.servers.filter(server => server.extensions.includes(ext))\n const enabled = candidates.filter(server => !this.isServerDisabled(server))\n const grouped = this.applyGroupStrategies(enabled, ext)\n return grouped.length ? grouped : this.sortByPriority(enabled)\n }\n\n getLanguageIdForExtension(ext: string): string {\n const map = this.getLanguageMap()\n return map[ext] ?? 'plaintext'\n }\n\n getLanguageCategoryForExtension(ext: string): string | undefined {\n const languageId = this.getLanguageIdForExtension(ext)\n return this.getLanguageCategoryForLanguageId(languageId)\n }\n\n getLanguageCategoryForLanguageId(languageId: string): string | undefined {\n const categories = this.getLanguageCategories()\n return categories[languageId]\n }\n\n getSettings(): LspSettings | undefined {\n return this.globalSettings\n }\n\n reloadSettingsFromFiles(options?: { projectDir?: string; homeDir?: string }): void {\n this.applyConfigOverrides(loadLspSettingsFromFiles(options))\n }\n\n applyConfigOverrides(settings?: LspSettings): void {\n const merged = mergeLspSettings(this.globalSettings, settings)\n const withExperiments = applyExperimentalSwitches(merged)\n this.globalSettings = withExperiments\n const overrides = withExperiments?.servers\n const baseIds = new Set(this.baseServers.map(server => server.id))\n const customServers: LspServerInfo[] = []\n if (overrides) {\n for (const [id, override] of Object.entries(overrides)) {\n if (baseIds.has(id)) continue\n if (!override.command) continue\n if (!override.extensions || override.extensions.length === 0) continue\n const base = new ServerDefinition({\n id,\n extensions: override.extensions,\n rootMarkers: override.rootMarkers ?? [],\n spawn: async () => ({ command: override.command ?? '', args: override.args ?? [] }),\n priority: override.priority,\n group: override.group\n })\n customServers.push(\n new OverriddenServer(\n base,\n override,\n withExperiments?.env,\n withExperiments?.initializationOptions\n )\n )\n }\n }\n this.servers = [\n ...this.baseServers.map(\n server =>\n new OverriddenServer(\n server,\n withExperiments?.servers?.[server.id],\n withExperiments?.env,\n withExperiments?.initializationOptions\n )\n ),\n ...customServers\n ]\n }\n\n resetOverridesForTests(): void {\n this.globalSettings = undefined\n this.servers = [...this.baseServers]\n }\n\n private getLanguageMap(): Record<string, string> {\n return { ...DEFAULT_LANGUAGE_MAP, ...(this.globalSettings?.languageMap ?? {}) }\n }\n\n private getLanguageCategories(): Record<string, string> {\n return { ...DEFAULT_LANGUAGE_CATEGORIES, ...(this.globalSettings?.languageCategories ?? {}) }\n }\n\n private isServerDisabled(server: LspServerInfo): boolean {\n if (server.disabled) return true\n const disabledServers = this.globalSettings?.disabledServers\n return Boolean(disabledServers?.includes(server.id))\n }\n\n private sortByPriority(servers: LspServerInfo[]): LspServerInfo[] {\n return [...servers].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n }\n\n private applyGroupStrategies(servers: LspServerInfo[], ext: string): LspServerInfo[] {\n const groups = this.globalSettings?.serverGroups\n if (!groups || groups.length === 0) return []\n const byId = new Map(servers.map(server => [server.id, server]))\n const results: LspServerInfo[] = []\n const used = new Set<string>()\n for (const group of groups) {\n if (group.extensions && !group.extensions.includes(ext)) continue\n const groupServers = group.serverIds\n .map(id => byId.get(id))\n .filter((server): server is LspServerInfo => Boolean(server))\n if (groupServers.length === 0) continue\n const sorted = this.sortByPriority(groupServers)\n if (group.strategy === 'parallel') {\n for (const server of sorted) {\n if (used.has(server.id)) continue\n used.add(server.id)\n results.push(server)\n }\n continue\n }\n const selected = sorted[0]\n if (selected && !used.has(selected.id)) {\n used.add(selected.id)\n results.push(selected)\n }\n }\n return results\n }\n}\n", "import { join, relative } from 'path'\nimport { existsSync, statSync } from 'fs'\nimport { resolveXdgDataPath } from '@utils/config/env'\nimport { minimatch } from 'minimatch'\n\nexport function getToolsDir(): string {\n return resolveXdgDataPath('tools')\n}\n\nexport function getLspBinDir(): string {\n return join(getToolsDir(), 'bin')\n}\n\nexport async function findNearestRoot(\n startDir: string,\n markers: string[],\n options?: {\n include?: string[]\n exclude?: string[]\n branches?: string[][]\n filePath?: string\n }\n): Promise<string | undefined> {\n const filePath = options?.filePath\n if (filePath) {\n const normalizedFile = filePath.replace(/\\\\/g, '/')\n const relativeToStart = relative(startDir, filePath).replace(/\\\\/g, '/')\n const matchesAny = (patterns: string[]) =>\n patterns.some(pattern => {\n if (minimatch(normalizedFile, pattern, { dot: true })) return true\n if (relativeToStart && !relativeToStart.startsWith('..')) {\n return minimatch(relativeToStart, pattern, { dot: true })\n }\n return false\n })\n if (options?.exclude && matchesAny(options.exclude)) return undefined\n if (options?.include && !matchesAny(options.include)) return undefined\n }\n\n if (options?.branches && options.branches.length > 0) {\n for (const branch of options.branches) {\n const resolved = await findNearestRoot(startDir, branch, {\n ...options,\n branches: undefined\n })\n if (resolved) return resolved\n }\n }\n let current = startDir\n while (true) {\n for (const marker of markers) {\n const p = join(current, marker)\n if (existsSync(p)) {\n return current\n }\n }\n const parent = join(current, '..')\n if (parent === current) {\n break\n }\n current = parent\n }\n return undefined\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["join", "existsSync", "existsSync", "join"]
|
|
7
|
-
}
|