pybao-cli 1.4.12 → 1.4.13
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-634DFL57.js +47 -0
- package/dist/{acp-E4XDOLNC.js → acp-AITGGIN7.js} +29 -29
- package/dist/{agentsValidate-GZPJASIL.js → agentsValidate-K3GLHEUJ.js} +7 -7
- package/dist/{ask-BQDZUSJ4.js → ask-XRAJ7ONM.js} +28 -28
- package/dist/{autoUpdater-XGGEYCZS.js → autoUpdater-2YW234FZ.js} +3 -3
- package/dist/{chunk-EOQY6JTU.js → chunk-2PC7UK66.js} +3 -3
- package/dist/{chunk-WLWHTU5X.js → chunk-34XEWGUY.js} +1 -1
- package/dist/{chunk-PFJM7WWU.js → chunk-5WXWY6LV.js} +70 -3
- package/dist/chunk-5WXWY6LV.js.map +7 -0
- package/dist/{chunk-EQ3NKY3J.js → chunk-6OP2JTUK.js} +1 -1
- package/dist/{chunk-EQ3NKY3J.js.map → chunk-6OP2JTUK.js.map} +1 -1
- package/dist/{chunk-2W64YTNU.js → chunk-BTS2TAAW.js} +4 -4
- package/dist/{chunk-B52OTXX2.js → chunk-CFTVDXFH.js} +3 -3
- package/dist/{chunk-2OQCOHOW.js → chunk-CPE4NPQV.js} +2 -2
- package/dist/{chunk-EN7KWHEK.js → chunk-CVJLF2VG.js} +108 -17
- package/dist/chunk-CVJLF2VG.js.map +7 -0
- package/dist/{chunk-BGY75RH7.js → chunk-CXT225X7.js} +2 -2
- package/dist/{chunk-M5YAPELI.js → chunk-FMH4U7NO.js} +1 -1
- package/dist/{chunk-H3YIL7ZG.js → chunk-FT5UM6YL.js} +1 -1
- package/dist/{chunk-VUMOG2FB.js → chunk-HCN7LMEB.js} +1 -1
- package/dist/{chunk-GCFCZ24S.js → chunk-M7QSGOTT.js} +1 -1
- package/dist/{chunk-HS6N2642.js → chunk-NG5RU74R.js} +4 -4
- package/dist/{chunk-2ADSIWFE.js → chunk-O5PGBSLH.js} +2 -2
- package/dist/{chunk-QJN4JAVY.js → chunk-OOTTUF6Z.js} +1 -1
- package/dist/{chunk-NGE3FFL4.js → chunk-OX4Q6Z5R.js} +3 -3
- package/dist/{chunk-AI77W7AH.js → chunk-P7MPKAPW.js} +1 -1
- package/dist/{chunk-KNVKVAFM.js → chunk-PHKBTCLT.js} +2 -2
- package/dist/{chunk-OYQOUTXM.js → chunk-QKB32NDM.js} +2 -2
- package/dist/{chunk-HBW2UFW3.js → chunk-RHY3RRE6.js} +2 -2
- package/dist/{chunk-HBGSB66X.js → chunk-S45DDLGG.js} +3 -3
- package/dist/{chunk-J7QJQFL4.js → chunk-TWPWHWJT.js} +4 -4
- package/dist/{chunk-XHPE7NA6.js → chunk-UDNZNXXR.js} +3 -3
- package/dist/{chunk-IBX7QYW6.js → chunk-V337ZSSD.js} +140 -35
- package/dist/{chunk-IBX7QYW6.js.map → chunk-V337ZSSD.js.map} +3 -3
- package/dist/{chunk-FS7A5V53.js → chunk-VFAFA24S.js} +3 -3
- package/dist/{chunk-N7F2AWKM.js → chunk-VGDDQSCO.js} +1 -1
- package/dist/{chunk-F2DJ35GI.js → chunk-XJZQD7RE.js} +17 -17
- package/dist/{chunk-F2DJ35GI.js.map → chunk-XJZQD7RE.js.map} +1 -1
- package/dist/{chunk-O3KEVQNA.js → chunk-Y3UMGUVE.js} +1 -1
- package/dist/{chunk-JL3VTRTU.js → chunk-ZOM357PV.js} +2 -2
- package/dist/{cli-IIMBFGDW.js → cli-MXO677IA.js} +87 -87
- package/dist/commands-Q5LUFGJ5.js +51 -0
- package/dist/{config-FTVECYMO.js → config-YFZ2WAYP.js} +4 -4
- package/dist/{context-NDUX3ORF.js → context-OOIFZD5B.js} +6 -6
- package/dist/{customCommands-GR6WWVJY.js → customCommands-C5UREHC4.js} +4 -4
- package/dist/{env-PTS2KGBD.js → env-LQJ2XZDO.js} +2 -2
- package/dist/{file-5WKQ32ID.js → file-ZBIAG7X4.js} +4 -4
- package/dist/index.js +3 -3
- package/dist/{llm-XJH5PF7T.js → llm-RCNWJH2C.js} +29 -29
- package/dist/{llmLazy-AQ7NCFL2.js → llmLazy-KXJFFPMF.js} +1 -1
- package/dist/{loader-PO73B3AB.js → loader-ENRLCLHZ.js} +4 -4
- package/dist/{lsp-IZXFXACE.js → lsp-VWL3PVQJ.js} +6 -6
- package/dist/{lspAnchor-IQFSS2WW.js → lspAnchor-WPJIG2RI.js} +6 -6
- package/dist/{mcp-S3EXRZWS.js → mcp-P5T4TUW2.js} +7 -7
- package/dist/{mentionProcessor-UY2IW2RP.js → mentionProcessor-4ICD3GVH.js} +5 -5
- package/dist/{messages-KCJBNPPP.js → messages-SEOXF7DS.js} +1 -1
- package/dist/{model-57SVT5TP.js → model-YOPR5KUS.js} +5 -5
- package/dist/{openai-RUM2XGGO.js → openai-FVFZDXPS.js} +5 -5
- package/dist/{outputStyles-V7QYGZHM.js → outputStyles-7ZZ2JBOT.js} +4 -4
- package/dist/{pluginRuntime-55XGU4OS.js → pluginRuntime-LASQNLIR.js} +6 -6
- package/dist/{pluginValidation-ICH7XE5C.js → pluginValidation-4BABNGAC.js} +6 -6
- package/dist/prompts-DJNSFFKV.js +53 -0
- package/dist/{pybAgentSessionLoad-3NWDY4SQ.js → pybAgentSessionLoad-O7V7I7CV.js} +4 -4
- package/dist/{pybAgentSessionResume-XJJ6DMEL.js → pybAgentSessionResume-Q7EYAD6H.js} +4 -4
- package/dist/{pybAgentStreamJsonSession-FOVNGGFA.js → pybAgentStreamJsonSession-N374RMH5.js} +1 -1
- package/dist/{pybHooks-ACAEY3WY.js → pybHooks-MHFEMZC6.js} +4 -4
- package/dist/query-LAUPI7JK.js +55 -0
- package/dist/{registry-KD75EMVF.js → registry-KVMGHJ4N.js} +5 -5
- package/dist/{ripgrep-6YHO2NBP.js → ripgrep-XSJJZ3W3.js} +3 -3
- package/dist/{skillMarketplace-VH7FHRA4.js → skillMarketplace-FL7XBTHJ.js} +3 -3
- package/dist/{state-Z24WIC3H.js → state-5NJOFKYB.js} +2 -2
- package/dist/{theme-3K7DL646.js → theme-Z26AKEVC.js} +5 -5
- package/dist/{toolPermissionSettings-7V3HRK2G.js → toolPermissionSettings-SPSMAX5P.js} +6 -6
- package/dist/tools-Q44D6ZG7.js +52 -0
- package/dist/{userInput-KJC6X5WI.js → userInput-3TEMRAK7.js} +30 -30
- package/package.json +1 -1
- package/dist/REPL-IXJZCNDW.js +0 -47
- package/dist/chunk-EN7KWHEK.js.map +0 -7
- package/dist/chunk-PFJM7WWU.js.map +0 -7
- package/dist/commands-WZNPO2DW.js +0 -51
- package/dist/prompts-UNCTPPON.js +0 -53
- package/dist/query-DNXATEQW.js +0 -55
- package/dist/tools-TBUVJIUV.js +0 -52
- /package/dist/{REPL-IXJZCNDW.js.map → REPL-634DFL57.js.map} +0 -0
- /package/dist/{acp-E4XDOLNC.js.map → acp-AITGGIN7.js.map} +0 -0
- /package/dist/{agentsValidate-GZPJASIL.js.map → agentsValidate-K3GLHEUJ.js.map} +0 -0
- /package/dist/{ask-BQDZUSJ4.js.map → ask-XRAJ7ONM.js.map} +0 -0
- /package/dist/{autoUpdater-XGGEYCZS.js.map → autoUpdater-2YW234FZ.js.map} +0 -0
- /package/dist/{chunk-EOQY6JTU.js.map → chunk-2PC7UK66.js.map} +0 -0
- /package/dist/{chunk-WLWHTU5X.js.map → chunk-34XEWGUY.js.map} +0 -0
- /package/dist/{chunk-2W64YTNU.js.map → chunk-BTS2TAAW.js.map} +0 -0
- /package/dist/{chunk-B52OTXX2.js.map → chunk-CFTVDXFH.js.map} +0 -0
- /package/dist/{chunk-2OQCOHOW.js.map → chunk-CPE4NPQV.js.map} +0 -0
- /package/dist/{chunk-BGY75RH7.js.map → chunk-CXT225X7.js.map} +0 -0
- /package/dist/{chunk-M5YAPELI.js.map → chunk-FMH4U7NO.js.map} +0 -0
- /package/dist/{chunk-H3YIL7ZG.js.map → chunk-FT5UM6YL.js.map} +0 -0
- /package/dist/{chunk-VUMOG2FB.js.map → chunk-HCN7LMEB.js.map} +0 -0
- /package/dist/{chunk-GCFCZ24S.js.map → chunk-M7QSGOTT.js.map} +0 -0
- /package/dist/{chunk-HS6N2642.js.map → chunk-NG5RU74R.js.map} +0 -0
- /package/dist/{chunk-2ADSIWFE.js.map → chunk-O5PGBSLH.js.map} +0 -0
- /package/dist/{chunk-QJN4JAVY.js.map → chunk-OOTTUF6Z.js.map} +0 -0
- /package/dist/{chunk-NGE3FFL4.js.map → chunk-OX4Q6Z5R.js.map} +0 -0
- /package/dist/{chunk-AI77W7AH.js.map → chunk-P7MPKAPW.js.map} +0 -0
- /package/dist/{chunk-KNVKVAFM.js.map → chunk-PHKBTCLT.js.map} +0 -0
- /package/dist/{chunk-OYQOUTXM.js.map → chunk-QKB32NDM.js.map} +0 -0
- /package/dist/{chunk-HBW2UFW3.js.map → chunk-RHY3RRE6.js.map} +0 -0
- /package/dist/{chunk-HBGSB66X.js.map → chunk-S45DDLGG.js.map} +0 -0
- /package/dist/{chunk-J7QJQFL4.js.map → chunk-TWPWHWJT.js.map} +0 -0
- /package/dist/{chunk-XHPE7NA6.js.map → chunk-UDNZNXXR.js.map} +0 -0
- /package/dist/{chunk-FS7A5V53.js.map → chunk-VFAFA24S.js.map} +0 -0
- /package/dist/{chunk-N7F2AWKM.js.map → chunk-VGDDQSCO.js.map} +0 -0
- /package/dist/{chunk-O3KEVQNA.js.map → chunk-Y3UMGUVE.js.map} +0 -0
- /package/dist/{chunk-JL3VTRTU.js.map → chunk-ZOM357PV.js.map} +0 -0
- /package/dist/{cli-IIMBFGDW.js.map → cli-MXO677IA.js.map} +0 -0
- /package/dist/{commands-WZNPO2DW.js.map → commands-Q5LUFGJ5.js.map} +0 -0
- /package/dist/{config-FTVECYMO.js.map → config-YFZ2WAYP.js.map} +0 -0
- /package/dist/{context-NDUX3ORF.js.map → context-OOIFZD5B.js.map} +0 -0
- /package/dist/{customCommands-GR6WWVJY.js.map → customCommands-C5UREHC4.js.map} +0 -0
- /package/dist/{env-PTS2KGBD.js.map → env-LQJ2XZDO.js.map} +0 -0
- /package/dist/{file-5WKQ32ID.js.map → file-ZBIAG7X4.js.map} +0 -0
- /package/dist/{llm-XJH5PF7T.js.map → llm-RCNWJH2C.js.map} +0 -0
- /package/dist/{llmLazy-AQ7NCFL2.js.map → llmLazy-KXJFFPMF.js.map} +0 -0
- /package/dist/{loader-PO73B3AB.js.map → loader-ENRLCLHZ.js.map} +0 -0
- /package/dist/{lsp-IZXFXACE.js.map → lsp-VWL3PVQJ.js.map} +0 -0
- /package/dist/{lspAnchor-IQFSS2WW.js.map → lspAnchor-WPJIG2RI.js.map} +0 -0
- /package/dist/{mcp-S3EXRZWS.js.map → mcp-P5T4TUW2.js.map} +0 -0
- /package/dist/{mentionProcessor-UY2IW2RP.js.map → mentionProcessor-4ICD3GVH.js.map} +0 -0
- /package/dist/{messages-KCJBNPPP.js.map → messages-SEOXF7DS.js.map} +0 -0
- /package/dist/{model-57SVT5TP.js.map → model-YOPR5KUS.js.map} +0 -0
- /package/dist/{openai-RUM2XGGO.js.map → openai-FVFZDXPS.js.map} +0 -0
- /package/dist/{outputStyles-V7QYGZHM.js.map → outputStyles-7ZZ2JBOT.js.map} +0 -0
- /package/dist/{pluginRuntime-55XGU4OS.js.map → pluginRuntime-LASQNLIR.js.map} +0 -0
- /package/dist/{pluginValidation-ICH7XE5C.js.map → pluginValidation-4BABNGAC.js.map} +0 -0
- /package/dist/{prompts-UNCTPPON.js.map → prompts-DJNSFFKV.js.map} +0 -0
- /package/dist/{pybAgentSessionLoad-3NWDY4SQ.js.map → pybAgentSessionLoad-O7V7I7CV.js.map} +0 -0
- /package/dist/{pybAgentSessionResume-XJJ6DMEL.js.map → pybAgentSessionResume-Q7EYAD6H.js.map} +0 -0
- /package/dist/{pybAgentStreamJsonSession-FOVNGGFA.js.map → pybAgentStreamJsonSession-N374RMH5.js.map} +0 -0
- /package/dist/{pybHooks-ACAEY3WY.js.map → pybHooks-MHFEMZC6.js.map} +0 -0
- /package/dist/{query-DNXATEQW.js.map → query-LAUPI7JK.js.map} +0 -0
- /package/dist/{registry-KD75EMVF.js.map → registry-KVMGHJ4N.js.map} +0 -0
- /package/dist/{ripgrep-6YHO2NBP.js.map → ripgrep-XSJJZ3W3.js.map} +0 -0
- /package/dist/{skillMarketplace-VH7FHRA4.js.map → skillMarketplace-FL7XBTHJ.js.map} +0 -0
- /package/dist/{state-Z24WIC3H.js.map → state-5NJOFKYB.js.map} +0 -0
- /package/dist/{theme-3K7DL646.js.map → theme-Z26AKEVC.js.map} +0 -0
- /package/dist/{toolPermissionSettings-7V3HRK2G.js.map → toolPermissionSettings-SPSMAX5P.js.map} +0 -0
- /package/dist/{tools-TBUVJIUV.js.map → tools-Q44D6ZG7.js.map} +0 -0
- /package/dist/{userInput-KJC6X5WI.js.map → userInput-3TEMRAK7.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
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/query-registry.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 type { AddressInfo } from 'net'\nimport { createHash } from 'crypto'\nimport { getCwd } from '@utils/state'\nimport { LspClientManager } from '../tools/search/LspTool/client/manager'\nimport { LspServerRegistry, getInstallNotices } 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, getParseCacheMetrics } from '@utils/tree-sitter/lsp-adapter'\nimport { ParserRegistry } from '@utils/tree-sitter/registry'\nimport { ScopeAnalyzer } from '@utils/tree-sitter/scope-analyzer'\nimport { loadLanguage } from '@utils/tree-sitter/loader'\nimport type { Node } from 'web-tree-sitter'\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\ntype SymbolSummaryGroup = {\n count: number\n names: string[]\n}\n\ntype SymbolSummary = {\n total: number\n modules: SymbolSummaryGroup\n classes: SymbolSummaryGroup\n functions: SymbolSummaryGroup\n others: number\n}\n\ntype SymbolRenderResult = {\n text: string\n rendered: number\n total: number\n truncated: boolean\n}\n\nconst SYMBOL_MODULE_KINDS = new Set(['Module', 'Namespace'])\nconst SYMBOL_CLASS_KINDS = new Set(['Class', 'Interface', 'Struct', 'Enum', 'Type'])\nconst SYMBOL_FUNCTION_KINDS = new Set(['Function', 'Method'])\n\nfunction resolveNumberEnv(raw: string | undefined, fallback: number): number {\n const parsed = Number(raw)\n if (Number.isFinite(parsed) && parsed > 0) return Math.floor(parsed)\n return fallback\n}\n\nfunction collectSymbolSummary(symbols: any[]): SymbolSummary {\n const summary: SymbolSummary = {\n total: 0,\n modules: { count: 0, names: [] },\n classes: { count: 0, names: [] },\n functions: { count: 0, names: [] },\n others: 0,\n }\n const visit = (items: any[]) => {\n for (const item of items) {\n summary.total += 1\n if (SYMBOL_MODULE_KINDS.has(item.kind)) {\n summary.modules.count += 1\n summary.modules.names.push(item.name)\n } else if (SYMBOL_CLASS_KINDS.has(item.kind)) {\n summary.classes.count += 1\n summary.classes.names.push(item.name)\n } else if (SYMBOL_FUNCTION_KINDS.has(item.kind)) {\n summary.functions.count += 1\n summary.functions.names.push(item.name)\n } else {\n summary.others += 1\n }\n if (item.children && item.children.length > 0) {\n visit(item.children)\n }\n }\n }\n visit(symbols)\n return summary\n}\n\nfunction formatSummaryList(label: string, names: string[], maxNames: number): string | null {\n if (names.length === 0) return null\n const sliced = names.slice(0, maxNames)\n const suffix = names.length > maxNames ? `, +${names.length - maxNames}` : ''\n return `${label}: ${sliced.join(', ')}${suffix}`\n}\n\nfunction formatSymbolSummary(summary: SymbolSummary, maxNames: number): string {\n const lines = [\n `Summary: total ${summary.total}, modules ${summary.modules.count}, classes ${summary.classes.count}, functions ${summary.functions.count}`,\n ]\n const moduleLine = formatSummaryList('Modules', summary.modules.names, maxNames)\n const classLine = formatSummaryList('Classes', summary.classes.names, maxNames)\n const functionLine = formatSummaryList('Functions', summary.functions.names, maxNames)\n if (moduleLine) lines.push(moduleLine)\n if (classLine) lines.push(classLine)\n if (functionLine) lines.push(functionLine)\n return lines.join('\\n')\n}\n\nfunction renderSymbolTree(symbols: any[], maxNodes: number): SymbolRenderResult {\n const lines: string[] = []\n let rendered = 0\n const total = countSymbols(symbols)\n const visit = (items: any[], depth: number) => {\n if (rendered >= maxNodes) return\n const indent = ' '.repeat(depth)\n for (const item of items) {\n if (rendered >= maxNodes) return\n lines.push(`${indent}- ${item.name} (${item.kind}) [Ln ${item.range.start.line + 1}]`)\n rendered += 1\n if (item.children && item.children.length > 0) {\n visit(item.children, depth + 1)\n }\n if (rendered >= maxNodes) return\n }\n }\n visit(symbols, 0)\n return {\n text: lines.join('\\n'),\n rendered,\n total,\n truncated: rendered < total,\n }\n}\n\nfunction countSymbols(symbols: any[]): number {\n let count = 0\n const visit = (items: any[]) => {\n for (const item of items) {\n count += 1\n if (item.children && item.children.length > 0) {\n visit(item.children)\n }\n }\n }\n visit(symbols)\n return count\n}\n\nfunction resolveCompareSampleRate(): number {\n const raw = Number(process.env.PYB_TS_COMPARE_SAMPLE_RATE)\n if (Number.isFinite(raw) && raw >= 0) return Math.min(1, raw)\n return 0.1\n}\n\nfunction shouldSampleCompare(): boolean {\n const rate = resolveCompareSampleRate()\n if (rate <= 0) return false\n if (rate >= 1) return true\n return Math.random() < rate\n}\n\nfunction recordCompareMetrics(filePath: string, comparison: any) {\n const language = ParserRegistry.getLanguage(filePath)\n if (!language) return\n const traversal = Array.isArray(comparison?.traversal) ? comparison.traversal : []\n const query = Array.isArray(comparison?.query) ? comparison.query : []\n const missing = Array.isArray(comparison?.missingInQuery) ? comparison.missingInQuery : []\n const extra = Array.isArray(comparison?.extraInQuery) ? comparison.extraInQuery : []\n LspClientManager.getInstance().recordCompareSample(language, {\n traversalCount: countSymbols(traversal),\n queryCount: countSymbols(query),\n missingCount: missing.length,\n extraCount: extra.length,\n at: Date.now(),\n })\n}\n\nfunction formatTreeSitterDocumentSymbolResult(symbols: any[]): LspResult {\n if (symbols.length === 0) {\n return { formatted: 'No symbols found.', resultCount: 0, fileCount: 0 }\n }\n const maxNodes = resolveNumberEnv(process.env.PYB_TS_SYMBOLS_MAX_NODES, 200)\n const maxNames = resolveNumberEnv(process.env.PYB_TS_SYMBOLS_SUMMARY_MAX_NAMES, 6)\n const summary = collectSymbolSummary(symbols)\n const summaryText = formatSymbolSummary(summary, maxNames)\n const rendered = renderSymbolTree(symbols, maxNodes)\n const parts = [`Document symbols:`, summaryText, rendered.text].filter(Boolean)\n const truncationLine = rendered.truncated\n ? `Truncated: showing ${rendered.rendered}/${rendered.total} symbols. Set PYB_TS_SYMBOLS_MAX_NODES to increase.`\n : ''\n const formatted = truncationLine ? `${parts.join('\\n')}\\n${truncationLine}` : parts.join('\\n')\n return {\n formatted,\n resultCount: symbols.length,\n fileCount: 1,\n }\n}\n\nfunction formatFallbackNotice(\n operation: FacadeOperation,\n reason: string,\n capability: string,\n detail?: string,\n): string {\n const base = `Fallback ${operation} (reason: ${reason}, capability: ${capability})`\n return detail ? `${base} ${detail}` : base\n}\n\ntype FastPathFailureReason = 'exception' | 'empty' | 'timeout'\ntype FastPathFallbackReason = FastPathFailureReason | 'unsupported'\n\ntype FastPathFailureState = {\n count: number\n firstAt: number\n lastAt: number\n}\n\ntype FastPathLastFallback = {\n reason: FastPathFallbackReason\n at: number\n}\n\nconst fastPathFailures = new Map<string, Map<FastPathFailureReason, FastPathFailureState>>()\nconst fastPathLastFallbackReason = new Map<string, FastPathLastFallback>()\ntype FastPathHealthState = {\n successCount: number\n failureCount: number\n timeoutCount: number\n lastSuccessAt: number | null\n lastFailureAt: number | null\n avgDurationMs: number | null\n durations: number[]\n}\n\nconst fastPathHealth = new Map<string, FastPathHealthState>()\n\ntype ScopeStrategy = 'tree-sitter' | 'lsp'\ntype ScopeFallbackReason = 'lsp-unavailable'\ntype OperationFallbackReason = 'lsp-unavailable' | 'unsupported'\n\nconst scopeLastFallbackReason = new Map<string, ScopeFallbackReason>()\nconst scopeStrategyUsed = new Map<string, ScopeStrategy>()\nconst operationFallbackReasons = new Map<\n FacadeOperation,\n Map<string, OperationFallbackReason>\n>()\n\nconst LSP_FALLBACK_BOUNDARY = new Set<FacadeOperation>(['documentSymbol'])\nconst FALLBACK_TOGGLES: Array<{ operation: FacadeOperation; env: string; defaultEnabled: boolean }> =\n [\n { operation: 'diagnostics', env: 'PYB_LSP_FALLBACK_DIAGNOSTICS', defaultEnabled: false },\n { operation: 'findReferences', env: 'PYB_LSP_FALLBACK_REFERENCES', defaultEnabled: false },\n {\n operation: 'prepareCallHierarchy',\n env: 'PYB_LSP_FALLBACK_CALL_HIERARCHY',\n defaultEnabled: false,\n },\n {\n operation: 'incomingCalls',\n env: 'PYB_LSP_FALLBACK_CALL_HIERARCHY',\n defaultEnabled: false,\n },\n {\n operation: 'outgoingCalls',\n env: 'PYB_LSP_FALLBACK_CALL_HIERARCHY',\n defaultEnabled: false,\n },\n ]\nfunction isFallbackToggleEnabled(envKey: string, defaultEnabled: boolean): boolean {\n const raw = String(process.env[envKey] ?? '').trim().toLowerCase()\n if (!raw) return defaultEnabled\n if (raw === '0' || raw === 'false' || raw === 'off' || raw === 'no') return false\n if (raw === '1' || raw === 'true' || raw === 'on' || raw === 'yes') return true\n return defaultEnabled\n}\nfunction refreshFallbackBoundaryFromEnv() {\n for (const toggle of FALLBACK_TOGGLES) {\n if (isFallbackToggleEnabled(toggle.env, toggle.defaultEnabled)) {\n LSP_FALLBACK_BOUNDARY.add(toggle.operation)\n } else {\n LSP_FALLBACK_BOUNDARY.delete(toggle.operation)\n }\n }\n}\nrefreshFallbackBoundaryFromEnv()\n\nconst FAST_PATH_CONFIG: Record<FastPathFailureReason, { windowMs: number; threshold: number }> = {\n exception: { windowMs: 5 * 60 * 1000, threshold: 3 },\n empty: { windowMs: 60 * 1000, threshold: 2 },\n timeout: { windowMs: 30 * 1000, threshold: 1 },\n}\n\nconst FAST_PATH_TIMEOUT_MS = 500\nconst FAST_PATH_CACHE_TTL_MS = 30 * 1000\nconst FAST_PATH_DOWNGRADE_TIMEOUT_MS = 60 * 1000\n\ntype FastPathCacheEntry = {\n hash: string\n expiresAt: number\n symbols: any[]\n}\n\nconst fastPathSymbolCache = new Map<string, FastPathCacheEntry>()\nconst fastPathDowngrade = new Map<string, { until: number; reason: FastPathFailureReason }>()\n\nconst diagnosticsCache = new Map<\n string,\n { expiresAt: number; diagnostics: any[] }\n>()\n\nfunction resolveDiagnosticsTtlMs(): number {\n return resolveNumberEnv(process.env.PYB_LSP_DIAGNOSTICS_TTL_MS, 3000)\n}\n\nfunction buildDiagnosticsCacheKey(filePath: string, rootPath: string): string {\n return `${rootPath}::${filePath}`\n}\n\nfunction getFailureState(\n filePath: string,\n reason: FastPathFailureReason,\n): FastPathFailureState | null {\n const perFile = fastPathFailures.get(filePath)\n return perFile?.get(reason) ?? null\n}\n\nfunction recordFastPathFailure(filePath: string, reason: FastPathFailureReason, now: number) {\n let perFile = fastPathFailures.get(filePath)\n if (!perFile) {\n perFile = new Map()\n fastPathFailures.set(filePath, perFile)\n }\n const config = FAST_PATH_CONFIG[reason]\n const existing = perFile.get(reason)\n if (!existing || now - existing.firstAt > config.windowMs) {\n perFile.set(reason, { count: 1, firstAt: now, lastAt: now })\n } else {\n existing.count += 1\n existing.lastAt = now\n }\n let state = fastPathHealth.get(filePath)\n if (!state) {\n state = {\n successCount: 0,\n failureCount: 0,\n timeoutCount: 0,\n lastSuccessAt: null,\n lastFailureAt: null,\n avgDurationMs: null,\n durations: [],\n }\n fastPathHealth.set(filePath, state)\n }\n state.failureCount += 1\n if (reason === 'timeout') {\n state.timeoutCount += 1\n fastPathDowngrade.set(filePath, {\n until: now + FAST_PATH_DOWNGRADE_TIMEOUT_MS,\n reason: 'timeout',\n })\n }\n state.lastFailureAt = now\n}\n\nfunction recordFastPathSuccess(filePath: string, durationMs: number, at: number) {\n let state = fastPathHealth.get(filePath)\n if (!state) {\n state = {\n successCount: 0,\n failureCount: 0,\n timeoutCount: 0,\n lastSuccessAt: null,\n lastFailureAt: null,\n avgDurationMs: null,\n durations: [],\n }\n fastPathHealth.set(filePath, state)\n }\n state.successCount += 1\n state.lastSuccessAt = at\n if (durationMs >= 0) {\n if (state.avgDurationMs === null) {\n state.avgDurationMs = durationMs\n } else {\n state.avgDurationMs =\n (state.avgDurationMs * (state.successCount - 1) + durationMs) / state.successCount\n }\n state.durations.push(durationMs)\n if (state.durations.length > 50) {\n state.durations.shift()\n }\n }\n}\n\nfunction resolveFastPathBaseTimeoutMs(): number {\n return resolveNumberEnv(process.env.PYB_FAST_PATH_TIMEOUT_BASE_MS, FAST_PATH_TIMEOUT_MS)\n}\n\nfunction resolveFastPathTimeoutMinMs(): number {\n return resolveNumberEnv(process.env.PYB_FAST_PATH_TIMEOUT_MIN_MS, 200)\n}\n\nfunction resolveFastPathTimeoutMaxMs(): number {\n return resolveNumberEnv(process.env.PYB_FAST_PATH_TIMEOUT_MAX_MS, 2000)\n}\n\nfunction resolveFastPathBytesPerMs(): number {\n return resolveNumberEnv(process.env.PYB_FAST_PATH_TIMEOUT_BYTES_PER_MS, 4000)\n}\n\nfunction resolveFastPathHistoryFactor(): number {\n const raw = Number(process.env.PYB_FAST_PATH_TIMEOUT_HISTORY_FACTOR)\n if (Number.isFinite(raw) && raw > 0) return raw\n return 1.2\n}\n\nfunction resolveFastPathHistoryMinSamples(): number {\n return resolveNumberEnv(process.env.PYB_FAST_PATH_TIMEOUT_HISTORY_MIN_SAMPLES, 5)\n}\n\nfunction computeP95(values: number[]): number | null {\n if (!values.length) return null\n const sorted = [...values].sort((a, b) => a - b)\n const index = Math.min(sorted.length - 1, Math.floor(sorted.length * 0.95))\n return sorted[index]\n}\n\nfunction getFastPathTimeoutMs(filePath: string, contentLength: number): number {\n const base = resolveFastPathBaseTimeoutMs()\n const bytesPerMs = resolveFastPathBytesPerMs()\n const min = resolveFastPathTimeoutMinMs()\n const max = resolveFastPathTimeoutMaxMs()\n const sizeBudget = bytesPerMs > 0 ? Math.ceil(contentLength / bytesPerMs) : 0\n let timeout = base + sizeBudget\n const state = fastPathHealth.get(filePath)\n const minSamples = resolveFastPathHistoryMinSamples()\n if (state && state.durations.length >= minSamples) {\n const p95 = computeP95(state.durations)\n if (p95 !== null) {\n const factor = resolveFastPathHistoryFactor()\n timeout = Math.max(timeout, Math.ceil(p95 * factor))\n }\n }\n if (timeout < min) return min\n if (timeout > max) return max\n return timeout\n}\n\nfunction clearFastPathFailures(filePath: string) {\n fastPathFailures.delete(filePath)\n fastPathLastFallbackReason.delete(filePath)\n}\n\nfunction setFastPathLastFallback(\n filePath: string,\n reason: FastPathFallbackReason,\n at: number,\n) {\n fastPathLastFallbackReason.set(filePath, { reason, at })\n}\n\nfunction recordOperationFallback(\n operation: FacadeOperation,\n filePath: string,\n reason: OperationFallbackReason,\n) {\n let perOperation = operationFallbackReasons.get(operation)\n if (!perOperation) {\n perOperation = new Map()\n operationFallbackReasons.set(operation, perOperation)\n }\n perOperation.set(filePath, reason)\n}\n\nfunction getOperationFallbackSnapshot(operation: FacadeOperation) {\n const entries = operationFallbackReasons.get(operation)\n if (!entries) return []\n return Array.from(entries.entries()).map(([filePath, reason]) => ({\n filePath,\n reason,\n }))\n}\n\nfunction computeContentHash(content: string): string {\n return createHash('sha256').update(content).digest('hex')\n}\n\nfunction getCachedFastPathSymbols(\n filePath: string,\n hash: string,\n now: number,\n): any[] | null {\n const cached = fastPathSymbolCache.get(filePath)\n if (!cached) return null\n if (cached.hash !== hash || now >= cached.expiresAt) {\n fastPathSymbolCache.delete(filePath)\n return null\n }\n return cached.symbols\n}\n\nfunction setCachedFastPathSymbols(\n filePath: string,\n hash: string,\n symbols: any[],\n now: number,\n) {\n fastPathSymbolCache.set(filePath, {\n hash,\n symbols,\n expiresAt: now + FAST_PATH_CACHE_TTL_MS,\n })\n}\n\nfunction shouldSkipFastPath(filePath: string, now: number): FastPathFailureReason | null {\n const downgrade = fastPathDowngrade.get(filePath)\n if (downgrade) {\n if (now < downgrade.until) {\n return downgrade.reason\n }\n fastPathDowngrade.delete(filePath)\n }\n const perFile = fastPathFailures.get(filePath)\n if (!perFile) return null\n for (const [reason, state] of perFile.entries()) {\n const config = FAST_PATH_CONFIG[reason]\n if (now - state.firstAt <= config.windowMs && state.count >= config.threshold) {\n return reason\n }\n }\n return null\n}\n\nfunction withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error('Tree-sitter timeout'))\n }, timeoutMs)\n promise\n .then(result => {\n clearTimeout(timer)\n resolve(result)\n })\n .catch(error => {\n clearTimeout(timer)\n reject(error)\n })\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 isIdentifierChar(char: string): boolean {\n return /[A-Za-z0-9_$']/.test(char)\n}\n\nfunction extractTokenAtPosition(\n lines: string[],\n zeroBasedLine: number,\n zeroBasedCharacter: number,\n): string | null {\n if (zeroBasedLine < 0 || zeroBasedLine >= lines.length) return null\n const line = lines[zeroBasedLine] ?? ''\n if (zeroBasedCharacter < 0 || zeroBasedCharacter > line.length) return null\n const tokenRe = /[\\w$'!]+|[+\\-*/%&|^~<>=]+/g\n let match: RegExpExecArray | null\n while ((match = tokenRe.exec(line)) !== null) {\n const start = match.index\n const end = start + match[0].length\n if (zeroBasedCharacter >= start && zeroBasedCharacter < end) {\n const token = match[0]\n return token.length > 50 ? token.slice(0, 50) : token\n }\n }\n return null\n}\n\nfunction findTokenOccurrencesInLines(\n token: string,\n lines: string[],\n): Array<{ line: number; start: number; end: number }> {\n const results: Array<{ line: number; start: number; end: number }> = []\n if (!token) return results\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\n const line = lines[lineIndex]\n let fromIndex = 0\n while (fromIndex < line.length) {\n const index = line.indexOf(token, fromIndex)\n if (index === -1) break\n const before = index > 0 ? line[index - 1] : ''\n const afterIndex = index + token.length\n const after = afterIndex < line.length ? line[afterIndex] : ''\n if (\n (!before || !isIdentifierChar(before)) &&\n (!after || !isIdentifierChar(after))\n ) {\n results.push({ line: lineIndex, start: index, end: afterIndex })\n }\n fromIndex = index + token.length\n }\n }\n return results\n}\n\nfunction findSymbolAtPosition(\n symbols: any[],\n line: number,\n character: number,\n): any | null {\n let matched: any | null = null\n const visit = (node: any) => {\n if (!node?.range) return\n const start = node.range.start\n const end = node.range.end\n const within =\n line > start.line ||\n (line === start.line && character >= start.character)\n ? line < end.line ||\n (line === end.line && character <= end.character)\n : false\n if (within) {\n matched = node\n if (Array.isArray(node.children)) {\n for (const child of node.children) {\n visit(child)\n }\n }\n }\n }\n for (const sym of symbols) visit(sym)\n return matched\n}\n\nasync function getTreeSitterDiagnostics(filePath: string): Promise<any[]> {\n const lang = ParserRegistry.getLanguage(filePath)\n if (!lang) return []\n const parser = await loadLanguage(lang)\n const content = await readFile(filePath, 'utf-8')\n const tree = parser.parse(content)\n if (!tree) return []\n const diagnostics: any[] = []\n const seen = new Set<string>()\n const visit = (node: Node) => {\n const shouldReport =\n node.type === 'ERROR' || node.isMissing || (node.hasError && node.childCount === 0)\n if (shouldReport) {\n const range = {\n start: { line: node.startPosition.row, character: node.startPosition.column },\n end: { line: node.endPosition.row, character: node.endPosition.column },\n }\n const key = `${range.start.line}:${range.start.character}:${range.end.line}:${range.end.character}:${node.type}`\n if (!seen.has(key)) {\n diagnostics.push({\n range,\n message: `Syntax error near ${node.type}`,\n severity: 1,\n })\n seen.add(key)\n }\n }\n for (const child of node.children) {\n visit(child)\n }\n }\n visit(tree.rootNode)\n return diagnostics\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\nfunction resolveScopeStrategy(): ScopeStrategy {\n const raw = String(process.env.PYB_GET_SCOPE_STRATEGY ?? '').trim().toLowerCase()\n if (raw === 'lsp') return 'lsp'\n return 'tree-sitter'\n}\n\nfunction getDocumentSymbolFallbackSnapshot() {\n return Array.from(fastPathLastFallbackReason.entries()).map(([filePath, fallback]) => ({\n filePath,\n reason: fallback.reason,\n at: fallback.at,\n }))\n}\n\ntype FastPathFailuresSummaryEntry = { count: number; lastAt: number | null }\n\nfunction getFastPathFailuresSummary(): Record<FastPathFallbackReason, FastPathFailuresSummaryEntry> {\n const summary: Record<FastPathFallbackReason, FastPathFailuresSummaryEntry> = {\n exception: { count: 0, lastAt: null },\n empty: { count: 0, lastAt: null },\n timeout: { count: 0, lastAt: null },\n unsupported: { count: 0, lastAt: null },\n }\n for (const perFile of fastPathFailures.values()) {\n for (const [reason, state] of perFile.entries()) {\n const entry = summary[reason]\n entry.count += state.count\n entry.lastAt = entry.lastAt === null ? state.lastAt : Math.max(entry.lastAt, state.lastAt)\n }\n }\n for (const fallback of fastPathLastFallbackReason.values()) {\n if (fallback.reason !== 'unsupported') continue\n const entry = summary.unsupported\n entry.count += 1\n entry.lastAt = entry.lastAt === null ? fallback.at : Math.max(entry.lastAt, fallback.at)\n }\n return summary\n}\n\nfunction getFastPathLastFallbackSnapshot() {\n return Array.from(fastPathLastFallbackReason.entries()).map(([filePath, fallback]) => ({\n filePath,\n reason: fallback.reason,\n at: fallback.at,\n }))\n}\n\nfunction getFastPathHealthSummary(now: number) {\n return Array.from(fastPathHealth.entries()).map(([filePath, state]) => {\n const downgrade = fastPathDowngrade.get(filePath)\n const downgradeUntil = downgrade && now < downgrade.until ? downgrade.until : null\n return {\n filePath,\n successCount: state.successCount,\n failureCount: state.failureCount,\n timeoutCount: state.timeoutCount,\n lastSuccessAt: state.lastSuccessAt,\n lastFailureAt: state.lastFailureAt,\n avgDurationMs: state.avgDurationMs,\n downgradeUntil,\n }\n })\n}\n\nfunction getScopeFallbackSnapshot() {\n return Array.from(scopeLastFallbackReason.entries()).map(([filePath, reason]) => ({\n filePath,\n reason,\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 const address = server.address()\n if (address && typeof address === 'object') {\n ;(server as StatusServer).port = (address as AddressInfo).port\n }\n })\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 manager = LspClientManager.getInstance()\n const client = await manager.getClient(\n input.filePath,\n rootPath,\n )\n const ext = extname(input.filePath)\n const fallbackServer = LspServerRegistry.getInstance().getServerForExtension(ext)\n const serverId = client\n ? (client as any).serverId ?? fallbackServer?.id ?? 'unknown'\n : fallbackServer?.id ?? 'unknown'\n const recordAttempt = (operation: Operation) => {\n manager.recordRequestAttempt(serverId, operation)\n }\n const recordSuccess = (operation: Operation, startedAt: number) => {\n manager.recordRequestSuccess(serverId, operation, Date.now() - startedAt)\n }\n const recordFailure = (\n operation: Operation,\n reason: 'unavailable' | 'error' | 'timeout' | 'invalid',\n ) => {\n manager.recordRequestFailure(serverId, operation, reason)\n }\n\n if (client) {\n try {\n switch (input.operation) {\n case 'goToDefinition': {\n if (input.line === undefined || input.character === undefined) {\n recordAttempt('goToDefinition')\n recordFailure('goToDefinition', 'invalid')\n return {\n formatted: 'Error performing goToDefinition: Missing line/character',\n resultCount: 0,\n fileCount: 0,\n }\n }\n recordAttempt('goToDefinition')\n const startedAt = Date.now()\n const result = await client.goToDefinition(\n input.filePath,\n input.line,\n input.character,\n )\n recordSuccess('goToDefinition', startedAt)\n return formatGenericDefinitionResult(result)\n }\n case 'findReferences': {\n if (input.line === undefined || input.character === undefined) {\n recordAttempt('findReferences')\n recordFailure('findReferences', 'invalid')\n return {\n formatted: 'Error performing findReferences: Missing line/character',\n resultCount: 0,\n fileCount: 0,\n }\n }\n recordAttempt('findReferences')\n const startedAt = Date.now()\n const result = await client.findReferences(\n input.filePath,\n input.line,\n input.character,\n )\n recordSuccess('findReferences', startedAt)\n return formatGenericReferencesResult(result)\n }\n case 'hover': {\n if (input.line === undefined || input.character === undefined) {\n recordAttempt('hover')\n recordFailure('hover', 'invalid')\n return {\n formatted: 'Error performing hover: Missing line/character',\n resultCount: 0,\n fileCount: 0,\n }\n }\n recordAttempt('hover')\n const startedAt = Date.now()\n const result = await client.hover(\n input.filePath,\n input.line,\n input.character,\n )\n recordSuccess('hover', startedAt)\n return formatGenericHoverResult(result, input.line, input.character)\n }\n case 'documentSymbol': {\n recordAttempt('documentSymbol')\n const startedAt = Date.now()\n const result = await client.documentSymbol(input.filePath)\n recordSuccess('documentSymbol', startedAt)\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 recordAttempt('goToImplementation')\n recordFailure('goToImplementation', 'invalid')\n return {\n formatted: 'Error performing goToImplementation: Missing line/character',\n resultCount: 0,\n fileCount: 0,\n }\n }\n recordAttempt('goToImplementation')\n const startedAt = Date.now()\n const result = await client.goToImplementation(\n input.filePath,\n input.line,\n input.character,\n )\n recordSuccess('goToImplementation', startedAt)\n return formatGenericDefinitionResult(result)\n }\n case 'prepareCallHierarchy': {\n if (input.line === undefined || input.character === undefined) {\n recordAttempt('prepareCallHierarchy')\n recordFailure('prepareCallHierarchy', 'invalid')\n return {\n formatted: 'Error performing prepareCallHierarchy: Missing line/character',\n resultCount: 0,\n fileCount: 0,\n }\n }\n recordAttempt('prepareCallHierarchy')\n const startedAt = Date.now()\n const result = await client.prepareCallHierarchy(\n input.filePath,\n input.line,\n input.character,\n )\n recordSuccess('prepareCallHierarchy', startedAt)\n return formatGenericCallHierarchyItemsResult(\n Array.isArray(result) ? result : [],\n )\n }\n case 'incomingCalls': {\n if (input.line === undefined || input.character === undefined) {\n recordAttempt('incomingCalls')\n recordFailure('incomingCalls', 'invalid')\n return {\n formatted: 'Error performing incomingCalls: Missing line/character',\n resultCount: 0,\n fileCount: 0,\n }\n }\n recordAttempt('incomingCalls')\n const startedAt = Date.now()\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 recordSuccess('incomingCalls', startedAt)\n return formatGenericIncomingCallsResult(calls)\n }\n case 'outgoingCalls': {\n if (input.line === undefined || input.character === undefined) {\n recordAttempt('outgoingCalls')\n recordFailure('outgoingCalls', 'invalid')\n return {\n formatted: 'Error performing outgoingCalls: Missing line/character',\n resultCount: 0,\n fileCount: 0,\n }\n }\n recordAttempt('outgoingCalls')\n const startedAt = Date.now()\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 recordSuccess('outgoingCalls', startedAt)\n return formatGenericOutgoingCallsResult(calls)\n }\n case 'diagnostics': {\n recordAttempt('diagnostics')\n const startedAt = Date.now()\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 recordSuccess('diagnostics', startedAt)\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 recordAttempt(input.operation)\n recordFailure(input.operation, '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 fallbackOperation = input.operation as FacadeOperation\n recordAttempt(input.operation)\n recordFailure(input.operation, 'unavailable')\n if (LSP_FALLBACK_BOUNDARY.has(fallbackOperation)) {\n const lang = ParserRegistry.getLanguage(input.filePath)\n const fallbackReason = lang ? 'lsp-unavailable' : 'unsupported'\n if (!lang) {\n recordOperationFallback(fallbackOperation, input.filePath, fallbackReason)\n } else {\n recordOperationFallback(fallbackOperation, input.filePath, fallbackReason)\n if (fallbackOperation === 'diagnostics') {\n try {\n const diagnostics = await getTreeSitterDiagnostics(input.filePath)\n const formatted = formatGenericDiagnosticsResult(diagnostics)\n return {\n formatted: formatFallbackNotice(\n 'diagnostics',\n fallbackReason,\n 'tree-sitter diagnostics',\n formatted.formatted,\n ),\n resultCount: formatted.resultCount,\n fileCount: formatted.fileCount,\n }\n } catch {\n return {\n formatted: formatFallbackNotice(\n 'diagnostics',\n fallbackReason,\n 'none',\n `LSP unavailable for ${ext}. Static analysis not available.`,\n ),\n resultCount: 0,\n fileCount: 0,\n }\n }\n }\n if (fallbackOperation === 'findReferences') {\n if (input.line !== undefined && input.character !== undefined) {\n try {\n const content = await readFile(input.filePath, 'utf-8')\n const lines = content.split('\\n')\n const token = extractTokenAtPosition(\n lines,\n input.line - 1,\n input.character - 1,\n )\n if (token) {\n const occurrences = findTokenOccurrencesInLines(token, lines)\n const uri = normalizeUri(input.filePath)\n const refs = occurrences.map(entry => ({\n uri,\n range: {\n start: { line: entry.line, character: entry.start },\n end: { line: entry.line, character: entry.end },\n },\n }))\n if (refs.length > 0) {\n const formatted = formatGenericReferencesResult(refs)\n return {\n formatted: formatFallbackNotice(\n 'findReferences',\n fallbackReason,\n 'token scan',\n formatted.formatted,\n ),\n resultCount: formatted.resultCount,\n fileCount: formatted.fileCount,\n }\n }\n }\n } catch {}\n }\n return {\n formatted: formatFallbackNotice(\n 'findReferences',\n fallbackReason,\n 'token scan',\n `LSP unavailable for ${ext}. Returning 0 references.`,\n ),\n resultCount: 0,\n fileCount: 0,\n }\n }\n if (fallbackOperation === 'prepareCallHierarchy') {\n if (input.line !== undefined && input.character !== undefined) {\n try {\n const symbols = await TreeSitterLspAdapter.getDocumentSymbols(input.filePath)\n const symbol = findSymbolAtPosition(\n symbols,\n input.line - 1,\n input.character - 1,\n )\n if (symbol) {\n const item = {\n name: symbol.name,\n kind: symbol.kind,\n uri: normalizeUri(input.filePath),\n range: symbol.range,\n selectionRange: symbol.range,\n }\n const formatted = formatGenericCallHierarchyItemsResult([item])\n return {\n formatted: formatFallbackNotice(\n 'prepareCallHierarchy',\n fallbackReason,\n 'tree-sitter symbols',\n formatted.formatted,\n ),\n resultCount: formatted.resultCount,\n fileCount: formatted.fileCount,\n }\n }\n } catch {}\n }\n return {\n formatted: formatFallbackNotice(\n 'prepareCallHierarchy',\n fallbackReason,\n 'tree-sitter symbols',\n `LSP unavailable for ${ext}. Returning 0 items.`,\n ),\n resultCount: 0,\n fileCount: 0,\n }\n }\n if (fallbackOperation === 'incomingCalls' || fallbackOperation === 'outgoingCalls') {\n return {\n formatted: formatFallbackNotice(\n fallbackOperation,\n fallbackReason,\n 'none',\n `LSP unavailable for ${ext}. Returning 0 items.`,\n ),\n resultCount: 0,\n fileCount: 0,\n }\n }\n }\n }\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 const resolvedRoot = rootPath ?? getCwd()\n const ttlMs = resolveDiagnosticsTtlMs()\n if (ttlMs > 0) {\n const key = buildDiagnosticsCacheKey(filePath, resolvedRoot)\n const cached = diagnosticsCache.get(key)\n const now = Date.now()\n if (cached && cached.expiresAt > now) {\n return cached.diagnostics\n }\n const diagnostics = await LspClientManager.getInstance().getAllDiagnostics(\n filePath,\n resolvedRoot,\n )\n diagnosticsCache.set(key, {\n diagnostics,\n expiresAt: now + ttlMs,\n })\n return diagnostics\n }\n return LspClientManager.getInstance().getAllDiagnostics(filePath, resolvedRoot)\n },\n\n async diagnosticsPretty(\n filePath: string,\n options?: { maxItems?: number; rootPath?: string },\n ): Promise<string> {\n const diagnostics = await LspAPI.diagnostics(\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 flag = String(process.env.PYB_LSP_STRICT_FIRST ?? '').trim().toLowerCase()\n const lspFirst =\n flag === ''\n ? true\n : !(flag === '0' || flag === 'false' || flag === 'off' || flag === 'no')\n if (lspFirst) {\n let fallbackReason: string | null = null\n try {\n const lspSymbols = await LspAPI.documentSymbolRaw(input.filePath, rootPath)\n const lang = ParserRegistry.getLanguage(input.filePath)\n if (lspSymbols !== null && lang && shouldSampleCompare()) {\n void TreeSitterLspAdapter.compareDocumentSymbols(input.filePath)\n .then(comparison => recordCompareMetrics(input.filePath, comparison))\n .catch(() => {})\n }\n if (lspSymbols && Array.isArray(lspSymbols) && lspSymbols.length > 0) {\n return formatGenericDocumentSymbolResult(lspSymbols)\n }\n fallbackReason = lspSymbols === null ? 'lsp-unavailable' : 'lsp-empty'\n const now = Date.now()\n if (!lang) {\n setFastPathLastFallback(input.filePath, 'unsupported', now)\n } else {\n const skipReason = shouldSkipFastPath(input.filePath, now)\n if (skipReason) {\n setFastPathLastFallback(input.filePath, skipReason, now)\n } else {\n let contentHash: string | null = null\n let contentLength = 0\n try {\n const start = Date.now()\n const content = await readFile(input.filePath, 'utf-8')\n contentLength = content.length\n contentHash = computeContentHash(content)\n const cached = getCachedFastPathSymbols(input.filePath, contentHash, now)\n if (cached) {\n clearFastPathFailures(input.filePath)\n recordFastPathSuccess(input.filePath, Date.now() - start, Date.now())\n const formatted = formatTreeSitterDocumentSymbolResult(cached)\n if (fallbackReason) {\n return {\n ...formatted,\n formatted: formatFallbackNotice(\n 'documentSymbol',\n fallbackReason,\n 'tree-sitter symbols',\n formatted.formatted,\n ),\n }\n }\n return formatted\n }\n } catch {}\n try {\n const start = Date.now()\n const symbols = await withTimeout(\n TreeSitterLspAdapter.getDocumentSymbols(input.filePath),\n getFastPathTimeoutMs(input.filePath, contentLength),\n )\n if (symbols.length > 0) {\n clearFastPathFailures(input.filePath)\n if (contentHash) {\n setCachedFastPathSymbols(input.filePath, contentHash, symbols, now)\n }\n recordFastPathSuccess(input.filePath, Date.now() - start, Date.now())\n const formatted = formatTreeSitterDocumentSymbolResult(symbols)\n if (fallbackReason) {\n return {\n ...formatted,\n formatted: formatFallbackNotice(\n 'documentSymbol',\n fallbackReason,\n 'tree-sitter symbols',\n formatted.formatted,\n ),\n }\n }\n return formatted\n }\n recordFastPathFailure(input.filePath, 'empty', now)\n setFastPathLastFallback(input.filePath, 'empty', now)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const reason: FastPathFailureReason =\n message.toLowerCase().includes('timeout') ? 'timeout' : 'exception'\n recordFastPathFailure(input.filePath, reason, now)\n setFastPathLastFallback(input.filePath, reason, now)\n }\n }\n }\n } catch {\n fallbackReason = 'lsp-error'\n const now = Date.now()\n const lang = ParserRegistry.getLanguage(input.filePath)\n if (!lang) {\n setFastPathLastFallback(input.filePath, 'unsupported', now)\n } else {\n const skipReason = shouldSkipFastPath(input.filePath, now)\n if (skipReason) {\n setFastPathLastFallback(input.filePath, skipReason, now)\n } else {\n let contentHash: string | null = null\n let contentLength = 0\n try {\n const start = Date.now()\n const content = await readFile(input.filePath, 'utf-8')\n contentLength = content.length\n contentHash = computeContentHash(content)\n const cached = getCachedFastPathSymbols(input.filePath, contentHash, now)\n if (cached) {\n clearFastPathFailures(input.filePath)\n recordFastPathSuccess(input.filePath, Date.now() - start, Date.now())\n const formatted = formatTreeSitterDocumentSymbolResult(cached)\n if (fallbackReason) {\n return {\n ...formatted,\n formatted: formatFallbackNotice(\n 'documentSymbol',\n fallbackReason,\n 'tree-sitter symbols',\n formatted.formatted,\n ),\n }\n }\n return formatted\n }\n } catch {}\n try {\n const start = Date.now()\n const symbols = await withTimeout(\n TreeSitterLspAdapter.getDocumentSymbols(input.filePath),\n getFastPathTimeoutMs(input.filePath, contentLength),\n )\n if (symbols.length > 0) {\n clearFastPathFailures(input.filePath)\n if (contentHash) {\n setCachedFastPathSymbols(input.filePath, contentHash, symbols, now)\n }\n recordFastPathSuccess(input.filePath, Date.now() - start, Date.now())\n const formatted = formatTreeSitterDocumentSymbolResult(symbols)\n if (fallbackReason) {\n return {\n ...formatted,\n formatted: formatFallbackNotice(\n 'documentSymbol',\n fallbackReason,\n 'tree-sitter symbols',\n formatted.formatted,\n ),\n }\n }\n return formatted\n }\n recordFastPathFailure(input.filePath, 'empty', now)\n setFastPathLastFallback(input.filePath, 'empty', now)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const reason: FastPathFailureReason =\n message.toLowerCase().includes('timeout') ? 'timeout' : 'exception'\n recordFastPathFailure(input.filePath, reason, now)\n setFastPathLastFallback(input.filePath, reason, now)\n }\n }\n }\n }\n } else {\n const lang = ParserRegistry.getLanguage(input.filePath)\n const now = Date.now()\n if (!lang) {\n setFastPathLastFallback(input.filePath, 'unsupported', now)\n } else {\n const skipReason = shouldSkipFastPath(input.filePath, now)\n if (skipReason) {\n setFastPathLastFallback(input.filePath, skipReason, now)\n } else {\n let contentHash: string | null = null\n let contentLength = 0\n try {\n const start = Date.now()\n const content = await readFile(input.filePath, 'utf-8')\n contentLength = content.length\n contentHash = computeContentHash(content)\n const cached = getCachedFastPathSymbols(input.filePath, contentHash, now)\n if (cached) {\n clearFastPathFailures(input.filePath)\n recordFastPathSuccess(input.filePath, Date.now() - start, Date.now())\n return formatTreeSitterDocumentSymbolResult(cached)\n }\n } catch {}\n try {\n const start = Date.now()\n const symbols = await withTimeout(\n TreeSitterLspAdapter.getDocumentSymbols(input.filePath),\n getFastPathTimeoutMs(input.filePath, contentLength),\n )\n if (symbols.length > 0) {\n clearFastPathFailures(input.filePath)\n if (contentHash) {\n setCachedFastPathSymbols(input.filePath, contentHash, symbols, now)\n }\n recordFastPathSuccess(input.filePath, Date.now() - start, Date.now())\n return formatTreeSitterDocumentSymbolResult(symbols)\n }\n recordFastPathFailure(input.filePath, 'empty', now)\n setFastPathLastFallback(input.filePath, 'empty', now)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const reason: FastPathFailureReason =\n message.toLowerCase().includes('timeout') ? 'timeout' : 'exception'\n recordFastPathFailure(input.filePath, reason, now)\n setFastPathLastFallback(input.filePath, reason, now)\n }\n }\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 strategy = resolveScopeStrategy()\n if (strategy === 'lsp') {\n scopeLastFallbackReason.set(input.filePath, 'lsp-unavailable')\n }\n const effectiveStrategy = strategy === 'lsp' ? 'tree-sitter' : strategy\n scopeStrategyUsed.set(input.filePath, effectiveStrategy)\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 if (input.operation === 'diagnostics') {\n const diagnostics = await LspAPI.diagnostics(input.filePath, rootPath)\n return formatGenericDiagnosticsResult(diagnostics)\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 const base = LspAPI.status() as Record<string, unknown>\n return {\n ...base,\n installNotices: getInstallNotices(),\n parseCache: getParseCacheMetrics(),\n fallbacks: {\n documentSymbol: getDocumentSymbolFallbackSnapshot(),\n getScope: getScopeFallbackSnapshot(),\n diagnostics: getOperationFallbackSnapshot('diagnostics'),\n findReferences: getOperationFallbackSnapshot('findReferences'),\n prepareCallHierarchy: getOperationFallbackSnapshot('prepareCallHierarchy'),\n incomingCalls: getOperationFallbackSnapshot('incomingCalls'),\n outgoingCalls: getOperationFallbackSnapshot('outgoingCalls'),\n boundary: Array.from(LSP_FALLBACK_BOUNDARY.values()),\n },\n fastPath: {\n failuresSummary: getFastPathFailuresSummary(),\n lastFallback: getFastPathLastFallbackSnapshot(),\n healthSummary: getFastPathHealthSummary(Date.now()),\n },\n }\n },\n}\n\nexport function __resetLspFastPathStateForTests() {\n fastPathFailures.clear()\n fastPathLastFallbackReason.clear()\n fastPathSymbolCache.clear()\n fastPathHealth.clear()\n fastPathDowngrade.clear()\n}\n\nexport function __resetLspDiagnosticsCacheForTests() {\n diagnosticsCache.clear()\n}\n\nexport function __resetLspOperationFallbackForTests() {\n operationFallbackReasons.clear()\n}\n\nexport function __getLspFastPathFallbackReasonForTests(\n filePath: string,\n): FastPathFallbackReason | null {\n return fastPathLastFallbackReason.get(filePath)?.reason ?? null\n}\n\nexport function __getLspFastPathHealthForTests(filePath: string) {\n return fastPathHealth.get(filePath) ?? null\n}\n\nexport function __setLspFastPathDurationsForTests(filePath: string, durations: number[]) {\n let state = fastPathHealth.get(filePath)\n if (!state) {\n state = {\n successCount: 0,\n failureCount: 0,\n timeoutCount: 0,\n lastSuccessAt: null,\n lastFailureAt: null,\n avgDurationMs: null,\n durations: [],\n }\n fastPathHealth.set(filePath, state)\n }\n state.durations = [...durations]\n if (state.durations.length > 0) {\n const total = state.durations.reduce((acc, value) => acc + value, 0)\n state.avgDurationMs = total / state.durations.length\n } else {\n state.avgDurationMs = null\n }\n}\n\nexport function __getFastPathTimeoutForTests(filePath: string, contentLength: number): number {\n return getFastPathTimeoutMs(filePath, contentLength)\n}\n\nexport function __resetScopeStateForTests() {\n scopeLastFallbackReason.clear()\n scopeStrategyUsed.clear()\n}\n\nexport function __getScopeFallbackReasonForTests(\n filePath: string,\n): ScopeFallbackReason | null {\n return scopeLastFallbackReason.get(filePath) ?? null\n}\n\nexport function __getScopeStrategyForTests(filePath: string): ScopeStrategy | null {\n return scopeStrategyUsed.get(filePath) ?? null\n}\n\nexport function __getFallbackBoundaryForTests(): FacadeOperation[] {\n return Array.from(LSP_FALLBACK_BOUNDARY.values())\n}\n\nexport function __refreshLspFallbackBoundaryForTests() {\n refreshFallbackBoundaryFromEnv()\n}\n\nexport function __formatTreeSitterDocumentSymbolsForTests(\n symbols: any[],\n options?: { maxNodes?: number; summaryMaxNames?: number },\n): string {\n if (symbols.length === 0) return 'No symbols found.'\n const maxNodes = resolveNumberEnv(String(options?.maxNodes ?? ''), 200)\n const maxNames = resolveNumberEnv(String(options?.summaryMaxNames ?? ''), 6)\n const summary = collectSymbolSummary(symbols)\n const summaryText = formatSymbolSummary(summary, maxNames)\n const rendered = renderSymbolTree(symbols, maxNodes)\n const parts = [`Document symbols:`, summaryText, rendered.text].filter(Boolean)\n const truncationLine = rendered.truncated\n ? `Truncated: showing ${rendered.rendered}/${rendered.total} symbols. Set PYB_TS_SYMBOLS_MAX_NODES to increase.`\n : ''\n return truncationLine ? `${parts.join('\\n')}\\n${truncationLine}` : parts.join('\\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 private subscriptions = new Map<string, Set<(uri: string) => 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 const subs = this.subscriptions.get(uri)\n if (subs) {\n for (const handler of Array.from(subs)) {\n handler(uri)\n }\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 subscribe(uri: string, handler: (uri: string) => void): () => void {\n const subs = this.subscriptions.get(uri) ?? new Set()\n subs.add(handler)\n this.subscriptions.set(uri, subs)\n return () => {\n const current = this.subscriptions.get(uri)\n if (!current) return\n current.delete(handler)\n if (current.size === 0) this.subscriptions.delete(uri)\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 let done = false\n const unsubscribe = this.diagnosticsBus.subscribe(normalizedUri, () => {\n done = true\n })\n await this.diagnosticsBus.waitForIdle(normalizedUri, timeoutMs)\n if (done) {\n unsubscribe()\n } else {\n unsubscribe()\n }\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'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\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\ntype CompareSample = {\n traversalCount: number\n queryCount: number\n missingCount: number\n extraCount: number\n at: number\n}\n\ntype QualitySample = {\n success: boolean\n empty: boolean\n traversalCount: number\n queryCount: number\n at: number\n}\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 private failures: Map<string, { count: number; until: number; reason: 'prepare' | 'spawn'; last: number }> = new Map()\n private readiness: Map<string, number> = new Map()\n private prewarmByRoot: Map<string, number> = new Map()\n private prewarmHits: Map<string, number> = new Map()\n private spawnMetrics: Map<\n string,\n {\n attempts: number\n successes: number\n failures: number\n latencies: number[]\n failureReasons: { prepare: number; spawn: number }\n }\n > = new Map()\n private requestMetrics: Map<\n string,\n {\n serverId: string\n operation: string\n attempts: number\n successes: number\n failures: number\n latencies: number[]\n failureReasons: { unavailable: number; error: number; timeout: number; invalid: number }\n baseline?: { avgMs: number; p95Ms: number; samples: number }\n }\n > = new Map()\n private compareSamples: Map<string, CompareSample[]> = new Map()\n private qualitySamples: Map<string, QualitySample[]> = new Map()\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 getPrewarmTtlMs(): number {\n const override = Number.parseInt(process.env.PYB_LSP_PREWARM_TTL_MS ?? '', 10)\n if (Number.isFinite(override) && override > 0) return override\n return 30000\n }\n\n private getPrewarmTriggerCount(): number {\n const override = Number.parseInt(process.env.PYB_LSP_PREWARM_TRIGGER_COUNT ?? '', 10)\n if (Number.isFinite(override) && override > 0) return override\n return 2\n }\n\n private shouldPrewarm(rootPath: string): boolean {\n const now = this.now()\n const last = this.prewarmByRoot.get(rootPath)\n const ttlMs = this.getPrewarmTtlMs()\n if (last !== undefined && now - last < ttlMs) {\n return false\n }\n const nextHits = (this.prewarmHits.get(rootPath) ?? 0) + 1\n this.prewarmHits.set(rootPath, nextHits)\n if (nextHits < this.getPrewarmTriggerCount()) {\n return false\n }\n this.prewarmHits.delete(rootPath)\n this.prewarmByRoot.set(rootPath, now)\n return true\n }\n\n private async maybeEnsureWorkspaceClients(rootPath: string) {\n if (!this.shouldPrewarm(rootPath)) return\n await this.ensureWorkspaceClients(rootPath)\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 ;(nextClient as any).serverId = serverInfo.id\n ;(nextClient as any).serverKey = key\n this.clients.set(key, nextClient)\n return nextClient\n }\n \n async shutdownAll() {\n for (const client of this.clients.values()) {\n const shutdown = (client as { shutdown?: () => Promise<void> }).shutdown\n if (typeof shutdown === 'function') {\n await shutdown()\n }\n }\n this.clients.clear()\n this.broken.clear()\n this.spawning.clear()\n this.failures.clear()\n this.readiness.clear()\n this.prewarmByRoot.clear()\n this.prewarmHits.clear()\n this.spawnMetrics.clear()\n this.requestMetrics.clear()\n this.compareSamples.clear()\n this.qualitySamples.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.maybeEnsureWorkspaceClients(rootPath)\n }\n\n const results: any[] = []\n for (const client of this.clients.values()) {\n const serverId = (client as any).serverId ?? 'unknown'\n this.recordRequestAttempt(serverId, 'workspaceSymbol')\n const startAt = this.now()\n try {\n const symbols = await client.workspaceSymbol(query)\n if (symbols && Array.isArray(symbols)) {\n results.push(...symbols)\n }\n this.recordRequestSuccess(serverId, 'workspaceSymbol', this.now() - startAt)\n } catch (e) {\n this.recordRequestFailure(serverId, 'workspaceSymbol', 'error')\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 const servers = LspServerRegistry.getInstance().getServersForExtension(extname(filePath))\n debugLogger.info('LSP_DIAGNOSTICS', {\n action: 'multi-server',\n filePath,\n rootPath,\n servers: servers.map(server => server.id)\n })\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 debugLogger.info('LSP_DIAGNOSTICS', {\n action: 'result',\n filePath,\n rootPath,\n count: results.length\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 const failures = Array.from(this.failures.entries()).map(([client, entry]) => ({\n client,\n reason: entry.reason,\n count: entry.count,\n until: entry.until,\n last: entry.last\n }))\n const readiness = Array.from(this.readiness.entries()).map(([filePath, at]) => ({\n filePath,\n at\n }))\n const prewarms = Array.from(this.prewarmByRoot.entries()).map(([root, at]) => ({\n root,\n at\n }))\n const metrics = Array.from(this.spawnMetrics.entries()).map(([server, entry]) => {\n const { avgLatency, p95Latency } = this.computeLatencyStats(entry.latencies)\n const successRate = entry.attempts === 0 ? 0 : entry.successes / entry.attempts\n return {\n server,\n attempts: entry.attempts,\n successes: entry.successes,\n failures: entry.failures,\n successRate,\n latencyAvgMs: avgLatency,\n latencyP95Ms: p95Latency,\n failureReasons: { ...entry.failureReasons }\n }\n })\n const regressionFactor = this.getRequestRegressionFactor()\n const requestMetrics = Array.from(this.requestMetrics.values()).map(entry => {\n const { avgLatency, p95Latency } = this.computeLatencyStats(entry.latencies)\n const successRate = entry.attempts === 0 ? 0 : entry.successes / entry.attempts\n const baselineAvg = entry.baseline?.avgMs ?? 0\n const baselineP95 = entry.baseline?.p95Ms ?? 0\n const regression =\n entry.baseline !== undefined &&\n (avgLatency > baselineAvg * regressionFactor || p95Latency > baselineP95 * regressionFactor)\n return {\n server: entry.serverId,\n operation: entry.operation,\n attempts: entry.attempts,\n successes: entry.successes,\n failures: entry.failures,\n successRate,\n latencyAvgMs: avgLatency,\n latencyP95Ms: p95Latency,\n baselineAvgMs: baselineAvg,\n baselineP95Ms: baselineP95,\n baselineSamples: entry.baseline?.samples ?? 0,\n regression,\n failureReasons: { ...entry.failureReasons }\n }\n })\n const compareMetrics = Array.from(this.compareSamples.entries()).map(([language, samples]) => {\n const sampleCount = samples.length\n if (sampleCount === 0) {\n return {\n language,\n samples: 0,\n traversalAvg: 0,\n queryAvg: 0,\n missingAvg: 0,\n extraAvg: 0,\n missingRateAvg: 0,\n extraRateAvg: 0,\n lastSampleAt: null\n }\n }\n const totals = samples.reduce(\n (acc, sample) => {\n acc.traversal += sample.traversalCount\n acc.query += sample.queryCount\n acc.missing += sample.missingCount\n acc.extra += sample.extraCount\n acc.missingRate +=\n sample.traversalCount > 0 ? sample.missingCount / sample.traversalCount : 0\n acc.extraRate += sample.queryCount > 0 ? sample.extraCount / sample.queryCount : 0\n acc.lastAt = Math.max(acc.lastAt, sample.at)\n return acc\n },\n {\n traversal: 0,\n query: 0,\n missing: 0,\n extra: 0,\n missingRate: 0,\n extraRate: 0,\n lastAt: 0\n }\n )\n return {\n language,\n samples: sampleCount,\n traversalAvg: totals.traversal / sampleCount,\n queryAvg: totals.query / sampleCount,\n missingAvg: totals.missing / sampleCount,\n extraAvg: totals.extra / sampleCount,\n missingRateAvg: totals.missingRate / sampleCount,\n extraRateAvg: totals.extraRate / sampleCount,\n lastSampleAt: totals.lastAt\n }\n })\n const tsQualityMetrics = Array.from(this.qualitySamples.entries()).map(([language, samples]) => {\n const sampleCount = samples.length\n if (sampleCount === 0) {\n return {\n language,\n samples: 0,\n successRate: 0,\n emptyRate: 0,\n coverageAvg: 0,\n traversalAvg: 0,\n queryAvg: 0,\n lastSampleAt: null\n }\n }\n const totals = samples.reduce(\n (acc, sample) => {\n acc.success += sample.success ? 1 : 0\n acc.empty += sample.empty ? 1 : 0\n acc.traversal += sample.traversalCount\n acc.query += sample.queryCount\n acc.coverage +=\n sample.traversalCount > 0 ? sample.queryCount / sample.traversalCount : 1\n acc.lastAt = Math.max(acc.lastAt, sample.at)\n return acc\n },\n {\n success: 0,\n empty: 0,\n traversal: 0,\n query: 0,\n coverage: 0,\n lastAt: 0\n }\n )\n return {\n language,\n samples: sampleCount,\n successRate: totals.success / sampleCount,\n emptyRate: totals.empty / sampleCount,\n coverageAvg: totals.coverage / sampleCount,\n traversalAvg: totals.traversal / sampleCount,\n queryAvg: totals.query / sampleCount,\n lastSampleAt: totals.lastAt\n }\n })\n return {\n schemaVersion: 1,\n sampleWindow: {\n latencySamples: 50,\n baselineSamples: this.getRequestBaselineSampleSize()\n },\n clients: Array.from(this.clients.keys()),\n spawning: Array.from(this.spawning.keys()),\n broken: Array.from(this.broken.values()),\n diagnostics,\n failures,\n readiness,\n prewarms,\n metrics,\n requestMetrics,\n compareMetrics,\n tsQualityMetrics\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 this.readiness.set(filePath, this.now())\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 now(): number {\n return Date.now()\n }\n\n private computeLatencyStats(latencies: number[]) {\n const latencySamples = [...latencies].sort((a, b) => a - b)\n const avgLatency =\n latencySamples.length === 0\n ? 0\n : latencySamples.reduce((sum, value) => sum + value, 0) / latencySamples.length\n const p95Index = latencySamples.length === 0 ? -1 : Math.ceil(latencySamples.length * 0.95) - 1\n const p95Latency = p95Index >= 0 ? latencySamples[p95Index] : 0\n return { avgLatency, p95Latency }\n }\n\n private getMetricsEntry(serverId: string) {\n let entry = this.spawnMetrics.get(serverId)\n if (!entry) {\n entry = {\n attempts: 0,\n successes: 0,\n failures: 0,\n latencies: [],\n failureReasons: { prepare: 0, spawn: 0 }\n }\n this.spawnMetrics.set(serverId, entry)\n }\n return entry\n }\n\n private recordAttempt(serverId: string) {\n const entry = this.getMetricsEntry(serverId)\n entry.attempts += 1\n }\n\n private recordSuccess(serverId: string, latencyMs: number) {\n const entry = this.getMetricsEntry(serverId)\n entry.successes += 1\n entry.latencies.push(latencyMs)\n if (entry.latencies.length > 50) {\n entry.latencies.shift()\n }\n }\n\n private recordFailure(serverId: string, reason: 'prepare' | 'spawn') {\n const entry = this.getMetricsEntry(serverId)\n entry.failures += 1\n entry.failureReasons[reason] += 1\n }\n\n private getRequestKey(serverId: string, operation: string): string {\n return `${serverId}::${operation}`\n }\n\n private getRequestEntry(serverId: string, operation: string) {\n const key = this.getRequestKey(serverId, operation)\n let entry = this.requestMetrics.get(key)\n if (!entry) {\n entry = {\n serverId,\n operation,\n attempts: 0,\n successes: 0,\n failures: 0,\n latencies: [],\n failureReasons: { unavailable: 0, error: 0, timeout: 0, invalid: 0 }\n }\n this.requestMetrics.set(key, entry)\n }\n return entry\n }\n\n private getRequestBaselineSampleSize(): number {\n return 10\n }\n\n private getRequestRegressionFactor(): number {\n return 1.5\n }\n\n private getCompareSampleLimit(): number {\n const override = Number.parseInt(process.env.PYB_TS_COMPARE_SAMPLE_LIMIT ?? '', 10)\n if (Number.isFinite(override) && override > 0) return override\n return 50\n }\n\n private getQualitySampleLimit(): number {\n const override = Number.parseInt(process.env.PYB_TS_QUALITY_SAMPLE_LIMIT ?? '', 10)\n if (Number.isFinite(override) && override > 0) return override\n return 50\n }\n\n recordRequestAttempt(serverId: string, operation: string) {\n const entry = this.getRequestEntry(serverId, operation)\n entry.attempts += 1\n }\n\n recordRequestSuccess(serverId: string, operation: string, latencyMs: number) {\n const entry = this.getRequestEntry(serverId, operation)\n entry.successes += 1\n entry.latencies.push(latencyMs)\n if (entry.latencies.length > 50) {\n entry.latencies.shift()\n }\n if (!entry.baseline && entry.latencies.length >= this.getRequestBaselineSampleSize()) {\n const { avgLatency, p95Latency } = this.computeLatencyStats(entry.latencies)\n entry.baseline = {\n avgMs: avgLatency,\n p95Ms: p95Latency,\n samples: entry.latencies.length\n }\n }\n }\n\n recordRequestFailure(\n serverId: string,\n operation: string,\n reason: 'unavailable' | 'error' | 'timeout' | 'invalid'\n ) {\n const entry = this.getRequestEntry(serverId, operation)\n entry.failures += 1\n entry.failureReasons[reason] += 1\n }\n\n recordCompareSample(\n language: string,\n sample: CompareSample\n ) {\n const limit = this.getCompareSampleLimit()\n if (limit <= 0) return\n const list = this.compareSamples.get(language) ?? []\n list.push(sample)\n if (list.length > limit) {\n list.splice(0, list.length - limit)\n }\n this.compareSamples.set(language, list)\n }\n\n recordQualitySample(\n language: string,\n sample: QualitySample\n ) {\n const limit = this.getQualitySampleLimit()\n if (limit <= 0) return\n const list = this.qualitySamples.get(language) ?? []\n list.push(sample)\n if (list.length > limit) {\n list.splice(0, list.length - limit)\n }\n this.qualitySamples.set(language, list)\n }\n\n private getBaseTtlMs(reason: 'prepare' | 'spawn'): number {\n const override = Number.parseInt(process.env.PYB_LSP_BROKEN_TTL_MS ?? '', 10)\n if (Number.isFinite(override) && override > 0) return override\n return reason === 'prepare' ? 5000 : 10000\n }\n\n private markBroken(key: string, reason: 'prepare' | 'spawn') {\n const prev = this.failures.get(key)\n const count = prev ? prev.count + 1 : 1\n const base = this.getBaseTtlMs(reason)\n const ttl = Math.min(base * Math.pow(2, count - 1), 60000)\n const until = this.now() + ttl\n this.failures.set(key, { count, until, reason, last: this.now() })\n this.broken.add(key)\n }\n\n private isWithinBrokenTtl(key: string): boolean {\n const entry = this.failures.get(key)\n if (!entry) return false\n const active = this.now() < entry.until\n if (!active) {\n this.failures.delete(key)\n this.broken.delete(key)\n }\n return active\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 const key = `${resolvedRoot}:${serverInfo.id}`\n if (this.isWithinBrokenTtl(key)) {\n return null\n }\n const existingClient = this.clients.get(key)\n if (existingClient) {\n return existingClient\n }\n const existingSpawn = this.spawning.get(key)\n if (existingSpawn) {\n return existingSpawn\n }\n const spawnPromise = (async () => {\n try {\n if (serverInfo.isEnabled) {\n const enabled = await serverInfo.isEnabled(resolvedRoot)\n if (!enabled) {\n return null\n }\n }\n this.recordAttempt(serverInfo.id)\n try {\n const ready = await serverInfo.prepare()\n if (!ready) {\n this.recordFailure(serverInfo.id, 'prepare')\n this.markBroken(key, 'prepare')\n return null\n }\n } catch (e) {\n this.recordFailure(serverInfo.id, 'prepare')\n this.markBroken(key, 'prepare')\n return null\n }\n const spawnStart = this.now()\n try {\n const nextClient = await this.spawnClient(resolvedRoot, serverInfo, key)\n if (nextClient) {\n this.recordSuccess(serverInfo.id, this.now() - spawnStart)\n } else {\n this.recordFailure(serverInfo.id, 'spawn')\n this.markBroken(key, 'spawn')\n }\n return nextClient\n } catch (error) {\n this.recordFailure(serverInfo.id, 'spawn')\n this.markBroken(key, 'spawn')\n return null\n }\n } finally {\n this.spawning.delete(key)\n }\n })()\n this.spawning.set(key, spawnPromise)\n return spawnPromise\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 const range = s.range ?? s.selectionRange ?? s.location?.range\n if (range?.start) {\n return `${s.name} (${kind}) at ${range.start.line + 1}:${range.start.character + 1}`\n }\n return `${s.name} (${kind})`\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 \".mjs\": \"typescript\",\n \".cjs\": \"typescript\",\n \".jsx\": \"tsx\",\n \".mts\": \"typescript\",\n \".cts\": \"typescript\",\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 type { Parser as WebTreeSitterParser } 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\ntype WebTreeSitterModule = typeof import(\"web-tree-sitter\");\n\nlet webTreeSitterModule: Promise<WebTreeSitterModule> | null = null;\n\nconst loadWebTreeSitter = async (): Promise<WebTreeSitterModule> => {\n if (!webTreeSitterModule) {\n webTreeSitterModule = import(\"web-tree-sitter\");\n }\n return webTreeSitterModule;\n};\n\n// Cache for Parser instances per language\nconst parserCache = new Map<string, WebTreeSitterParser>();\nlet isInitialized = false;\n\nconst resolveResourceDir = () => {\n const envDir = process.env.PYB_RESOURCE_DIR?.trim();\n if (envDir) return envDir;\n if (_dirname.includes('dist') || _dirname.includes('node_modules')) {\n return path.resolve(_dirname, '../resources/tree-sitter');\n }\n return path.resolve(_dirname, '../../../resources/tree-sitter');\n};\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 const resourcesDir = resolveResourceDir();\n const treeWasmPath = path.join(resourcesDir, \"tree-sitter.wasm\");\n\n const { Parser } = await loadWebTreeSitter();\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 (\n lang: keyof typeof LANGUAGE_MAP,\n): Promise<WebTreeSitterParser> => {\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 const resourcesDir = resolveResourceDir();\n const wasmPath = path.join(resourcesDir, fileName);\n \n const { Language, Parser } = await loadWebTreeSitter();\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: WebTreeSitterParser | null = null;\n\nexport const initParser = async (): Promise<WebTreeSitterParser> => {\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 { createHash } from \"crypto\";\nimport type { Node, Tree } from \"web-tree-sitter\";\nimport { QueryRegistry } from \"./query-registry\";\nimport { LspClientManager } from \"../../tools/search/LspTool/client/manager\";\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\ntype SymbolQueryMode = \"traversal\" | \"query\" | \"compare\";\n\ntype DocumentSymbolsOptions = {\n mode?: SymbolQueryMode;\n queryName?: string;\n};\n\ntype SymbolComparison = {\n traversal: LspSymbol[];\n query: LspSymbol[];\n missingInQuery: string[];\n extraInQuery: string[];\n};\n\nconst SYMBOL_KIND_MAP: Record<string, string> = {\n function_declaration: \"Function\",\n function_expression: \"Function\",\n arrow_function: \"Function\",\n method_definition: \"Method\",\n class_declaration: \"Class\",\n interface_declaration: \"Interface\",\n enum_declaration: \"Enum\",\n type_alias_declaration: \"Type\",\n variable_declarator: \"Variable\",\n export_statement: \"Module\",\n \n function_definition: \"Function\",\n class_definition: \"Class\",\n assignment: \"Variable\",\n \n namespace_declaration: \"Namespace\",\n method_declaration: \"Method\",\n struct_declaration: \"Struct\",\n property_declaration: \"Property\",\n\n type_declaration: \"Class\",\n field_declaration: \"Field\",\n\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 object_definition: \"Class\",\n trait_definition: \"Interface\",\n module: \"Module\",\n};\n\ntype ParseCacheEntry = {\n tree: Tree;\n expiresAt: number;\n};\n\nconst PARSE_CACHE = new Map<string, ParseCacheEntry>();\nconst PARSE_CACHE_TTL_MS = 30 * 1000;\n\ntype IncrementalCacheEntry = {\n tree: Tree;\n content: string;\n expiresAt: number;\n};\n\ntype TextEdit = {\n startIndex: number;\n oldEndIndex: number;\n newEndIndex: number;\n startPosition: { row: number; column: number };\n oldEndPosition: { row: number; column: number };\n newEndPosition: { row: number; column: number };\n};\n\nconst INCREMENTAL_CACHE = new Map<string, IncrementalCacheEntry>();\nconst INCREMENTAL_CACHE_TTL_MS = 30 * 1000;\n\ntype ParseCacheStats = {\n incrementalHits: number;\n incrementalMisses: number;\n fullHits: number;\n fullMisses: number;\n fallbackCount: number;\n};\n\nconst PARSE_CACHE_STATS: ParseCacheStats = {\n incrementalHits: 0,\n incrementalMisses: 0,\n fullHits: 0,\n fullMisses: 0,\n fallbackCount: 0,\n};\n\nfunction computeHash(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction getParseCacheKey(langId: string, filePath: string, code: string): string {\n const hash = computeHash(code);\n return `${langId}:${filePath}:${hash}`;\n}\n\nfunction getIncrementalCacheKey(langId: string, filePath: string): string {\n return `${langId}:${filePath}`;\n}\n\nfunction getPositionForIndex(text: string, index: number): { row: number; column: number } {\n let row = 0;\n let column = 0;\n let i = 0;\n const limit = Math.max(0, Math.min(index, text.length));\n while (i < limit) {\n if (text[i] === \"\\n\") {\n row += 1;\n column = 0;\n } else {\n column += 1;\n }\n i += 1;\n }\n return { row, column };\n}\n\nfunction computeTextEdit(oldText: string, newText: string): TextEdit | null {\n if (oldText === newText) return null;\n let startIndex = 0;\n const oldLen = oldText.length;\n const newLen = newText.length;\n const minLen = Math.min(oldLen, newLen);\n while (startIndex < minLen && oldText[startIndex] === newText[startIndex]) {\n startIndex += 1;\n }\n let oldEndIndex = oldLen;\n let newEndIndex = newLen;\n while (\n oldEndIndex > startIndex &&\n newEndIndex > startIndex &&\n oldText[oldEndIndex - 1] === newText[newEndIndex - 1]\n ) {\n oldEndIndex -= 1;\n newEndIndex -= 1;\n }\n const startPosition = getPositionForIndex(oldText, startIndex);\n const oldEndPosition = getPositionForIndex(oldText, oldEndIndex);\n const newEndPosition = getPositionForIndex(newText, newEndIndex);\n return {\n startIndex,\n oldEndIndex,\n newEndIndex,\n startPosition,\n oldEndPosition,\n newEndPosition,\n };\n}\n\nasync function parseWithUnified(\n langId: string,\n code: string,\n filePath: string,\n now: number,\n preferIncremental: boolean,\n): Promise<Tree> {\n const incrementalKey = getIncrementalCacheKey(langId, filePath);\n const parser = await loadLanguage(langId);\n const cachedIncremental = INCREMENTAL_CACHE.get(incrementalKey);\n let usedIncremental = false;\n if (preferIncremental && cachedIncremental && now < cachedIncremental.expiresAt) {\n if (cachedIncremental.content === code) {\n PARSE_CACHE_STATS.incrementalHits += 1;\n return cachedIncremental.tree;\n }\n const edit = computeTextEdit(cachedIncremental.content, code);\n if (edit) {\n try {\n cachedIncremental.tree.edit(edit);\n const tree = parser.parse(code, cachedIncremental.tree);\n INCREMENTAL_CACHE.set(incrementalKey, {\n tree,\n content: code,\n expiresAt: now + INCREMENTAL_CACHE_TTL_MS,\n });\n PARSE_CACHE_STATS.incrementalHits += 1;\n return tree;\n } catch {\n usedIncremental = true;\n }\n } else {\n usedIncremental = true;\n }\n }\n if (preferIncremental) {\n PARSE_CACHE_STATS.incrementalMisses += 1;\n }\n const fullKey = getParseCacheKey(langId, filePath, code);\n const cachedFull = PARSE_CACHE.get(fullKey);\n if (cachedFull && now < cachedFull.expiresAt) {\n PARSE_CACHE_STATS.fullHits += 1;\n INCREMENTAL_CACHE.set(incrementalKey, {\n tree: cachedFull.tree,\n content: code,\n expiresAt: now + INCREMENTAL_CACHE_TTL_MS,\n });\n if (usedIncremental) {\n PARSE_CACHE_STATS.fallbackCount += 1;\n }\n return cachedFull.tree;\n }\n PARSE_CACHE_STATS.fullMisses += 1;\n const tree = parser.parse(code);\n PARSE_CACHE.set(fullKey, { tree, expiresAt: now + PARSE_CACHE_TTL_MS });\n INCREMENTAL_CACHE.set(incrementalKey, {\n tree,\n content: code,\n expiresAt: now + INCREMENTAL_CACHE_TTL_MS,\n });\n if (usedIncremental) {\n PARSE_CACHE_STATS.fallbackCount += 1;\n }\n return tree;\n}\n\nexport async function parseWithSharedCache(\n langId: string,\n code: string,\n filePath: string,\n now: number = Date.now(),\n): Promise<Tree> {\n return parseWithUnified(langId, code, filePath, now, true);\n}\n\nexport async function parseWithCache(\n langId: string,\n code: string,\n filePath: string,\n now: number = Date.now(),\n): Promise<Tree> {\n return parseWithUnified(langId, code, filePath, now, false);\n}\n\nexport function __resetParseCacheForTests() {\n PARSE_CACHE.clear();\n}\n\nexport function __getParseCacheSizeForTests(): number {\n return PARSE_CACHE.size;\n}\n\nexport function __resetIncrementalCacheForTests() {\n INCREMENTAL_CACHE.clear();\n}\n\nexport function __getIncrementalCacheEntryForTests(langId: string, filePath: string) {\n return INCREMENTAL_CACHE.get(getIncrementalCacheKey(langId, filePath)) ?? null;\n}\n\nexport async function parseWithIncremental(\n langId: string,\n code: string,\n filePath: string,\n now: number = Date.now(),\n): Promise<Tree> {\n return parseWithSharedCache(langId, code, filePath, now);\n}\n\nexport function __resetParseCacheMetricsForTests() {\n PARSE_CACHE_STATS.incrementalHits = 0;\n PARSE_CACHE_STATS.incrementalMisses = 0;\n PARSE_CACHE_STATS.fullHits = 0;\n PARSE_CACHE_STATS.fullMisses = 0;\n PARSE_CACHE_STATS.fallbackCount = 0;\n}\n\nexport function getParseCacheMetrics() {\n return {\n incremental: {\n hits: PARSE_CACHE_STATS.incrementalHits,\n misses: PARSE_CACHE_STATS.incrementalMisses,\n size: INCREMENTAL_CACHE.size,\n },\n full: {\n hits: PARSE_CACHE_STATS.fullHits,\n misses: PARSE_CACHE_STATS.fullMisses,\n size: PARSE_CACHE.size,\n },\n fallbackCount: PARSE_CACHE_STATS.fallbackCount,\n };\n}\n\nfunction collectSymbolsFromNode(node: Node): LspSymbol[] {\n const symbols: LspSymbol[] = [];\n const kind = SYMBOL_KIND_MAP[node.type];\n if (kind) {\n const name = TreeSitterLspAdapter.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 for (const child of node.namedChildren) {\n symbol.children?.push(...collectSymbolsFromNode(child));\n }\n symbols.push(symbol);\n return symbols;\n }\n }\n for (const child of node.namedChildren) {\n symbols.push(...collectSymbolsFromNode(child));\n }\n return symbols;\n}\n\nexport class TreeSitterLspAdapter {\n static async getDocumentSymbols(\n filePath: string,\n options?: DocumentSymbolsOptions,\n ): Promise<LspSymbol[]> {\n const langId = ParserRegistry.getLanguage(filePath);\n if (!langId) {\n return [];\n }\n\n try {\n const content = await readFile(filePath, \"utf-8\");\n const tree = await parseWithSharedCache(langId, content, filePath);\n const mode = this.resolveSymbolMode(options);\n const queryName = options?.queryName ?? \"symbols\";\n const traversalSymbols = collectSymbolsFromNode(tree.rootNode);\n const querySymbols = await this.collectSymbolsViaQuery(tree.rootNode, langId, queryName);\n let result: LspSymbol[];\n if (mode === \"traversal\") {\n result = traversalSymbols;\n } else if (mode === \"query\") {\n result = querySymbols.length > 0 ? querySymbols : traversalSymbols;\n } else {\n result = traversalSymbols.length > 0 ? traversalSymbols : querySymbols;\n }\n const traversalCount = this.flattenSymbols(traversalSymbols).length;\n const queryCount = this.flattenSymbols(querySymbols).length;\n LspClientManager.getInstance().recordQualitySample(langId, {\n success: true,\n empty: result.length === 0,\n traversalCount,\n queryCount,\n at: Date.now(),\n });\n return result;\n } catch (error) {\n LspClientManager.getInstance().recordQualitySample(langId, {\n success: false,\n empty: true,\n traversalCount: 0,\n queryCount: 0,\n at: Date.now(),\n });\n if (error instanceof Error) {\n throw new Error(`Tree-sitter parse failed for ${filePath}: ${error.message}`);\n }\n throw new Error(`Tree-sitter parse failed for ${filePath}`);\n }\n }\n\n static async compareDocumentSymbols(\n filePath: string,\n options?: { queryName?: string },\n ): Promise<SymbolComparison> {\n const langId = ParserRegistry.getLanguage(filePath);\n if (!langId) {\n return { traversal: [], query: [], missingInQuery: [], extraInQuery: [] };\n }\n const content = await readFile(filePath, \"utf-8\");\n const tree = await parseWithSharedCache(langId, content, filePath);\n const traversal = collectSymbolsFromNode(tree.rootNode);\n const queryName = options?.queryName ?? \"symbols\";\n const query = await this.collectSymbolsViaQuery(tree.rootNode, langId, queryName);\n return this.compareSymbolSets(traversal, query);\n }\n\n private static resolveSymbolMode(options?: DocumentSymbolsOptions): SymbolQueryMode {\n if (options?.mode) return options.mode;\n const raw = String(process.env.PYB_TS_SYMBOLS_MODE ?? \"\").trim().toLowerCase();\n if (raw === \"query\") return \"query\";\n if (raw === \"compare\") return \"compare\";\n return \"traversal\";\n }\n\n private static async collectSymbolsViaQuery(\n node: Node,\n langId: string,\n queryName: string,\n ): Promise<LspSymbol[]> {\n const query = await QueryRegistry.getCompiledQuery(langId, queryName);\n if (!query) return [];\n const captures = query.captures(node);\n const seen = new Map<number, Node>();\n for (const capture of captures) {\n if (capture.name !== \"symbol\") continue;\n seen.set(capture.node.id, capture.node);\n }\n return this.buildSymbolTree(Array.from(seen.values()));\n }\n\n private static buildSymbolTree(nodes: Node[]): LspSymbol[] {\n const symbolsById = new Map<number, { node: Node; symbol: LspSymbol }>();\n for (const node of nodes) {\n const kind = SYMBOL_KIND_MAP[node.type];\n if (!kind) continue;\n const name = this.getName(node);\n if (!name) continue;\n symbolsById.set(node.id, {\n node,\n symbol: {\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 }\n const roots: LspSymbol[] = [];\n for (const entry of symbolsById.values()) {\n let parent: Node | null = entry.node.parent;\n let parentSymbol: LspSymbol | null = null;\n while (parent) {\n const parentEntry = symbolsById.get(parent.id);\n if (parentEntry) {\n parentSymbol = parentEntry.symbol;\n break;\n }\n parent = parent.parent;\n }\n if (parentSymbol) {\n parentSymbol.children = parentSymbol.children ?? [];\n parentSymbol.children.push(entry.symbol);\n } else {\n roots.push(entry.symbol);\n }\n }\n const sortSymbols = (items: LspSymbol[]) => {\n items.sort((a, b) => {\n if (a.range.start.line !== b.range.start.line) {\n return a.range.start.line - b.range.start.line;\n }\n return a.range.start.character - b.range.start.character;\n });\n for (const item of items) {\n if (item.children && item.children.length > 0) {\n sortSymbols(item.children);\n }\n }\n };\n sortSymbols(roots);\n return roots;\n }\n\n private static compareSymbolSets(traversal: LspSymbol[], query: LspSymbol[]): SymbolComparison {\n const traversalKeys = new Set(this.flattenSymbols(traversal).map(this.symbolKey));\n const queryKeys = new Set(this.flattenSymbols(query).map(this.symbolKey));\n const missingInQuery = Array.from(traversalKeys).filter(key => !queryKeys.has(key));\n const extraInQuery = Array.from(queryKeys).filter(key => !traversalKeys.has(key));\n return { traversal, query, missingInQuery, extraInQuery };\n }\n\n private static flattenSymbols(symbols: LspSymbol[]): LspSymbol[] {\n const result: LspSymbol[] = [];\n const walk = (items: LspSymbol[]) => {\n for (const item of items) {\n result.push(item);\n if (item.children && item.children.length > 0) {\n walk(item.children);\n }\n }\n };\n walk(symbols);\n return result;\n }\n\n private static symbolKey(symbol: LspSymbol): string {\n return `${symbol.name}|${symbol.kind}|${symbol.range.start.line}|${symbol.range.start.character}`;\n }\n\n static getName(node: Node): string | null {\n const nameNode = node.childForFieldName(\"name\");\n if (nameNode) return nameNode.text;\n\n for (const child of node.namedChildren) {\n if (\n child.type === \"identifier\" ||\n child.type === \"type_identifier\" ||\n child.type === \"property_identifier\" ||\n child.type === \"field_identifier\" ||\n child.type === \"scoped_identifier\"\n ) {\n return child.text;\n }\n }\n\n return null;\n }\n}\n\nexport async function __getDocumentSymbolsWithFullParseForTests(\n filePath: string,\n): Promise<LspSymbol[]> {\n const langId = ParserRegistry.getLanguage(filePath);\n if (!langId) {\n return [];\n }\n const content = await readFile(filePath, \"utf-8\");\n const tree = await parseWithCache(langId, content, filePath);\n return collectSymbolsFromNode(tree.rootNode);\n}\n", "import { readFile, readdir } from \"fs/promises\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { createHash } from \"crypto\";\nimport { Query } from \"web-tree-sitter\";\nimport { loadLanguage } from \"./loader\";\n\ntype QueryCacheEntry = {\n sourceHash: string;\n query: Query;\n};\n\ntype QueryLayoutValidation = {\n valid: boolean;\n errors: string[];\n queries: string[];\n invalidEntries: string[];\n};\n\ntype QueryCoverageEntry = {\n name: string;\n captureCounts: Record<string, number>;\n totalCaptures: number;\n};\n\ntype QueryCoverageReport = {\n language: string;\n totalQueries: number;\n totalCaptures: number;\n queries: QueryCoverageEntry[];\n};\n\nconst SOURCE_CACHE = new Map<string, string | null>();\nconst COMPILED_CACHE = new Map<string, QueryCacheEntry>();\nconst LIST_CACHE = new Map<string, string[]>();\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nfunction normalizeLanguage(langKey: string): string {\n if (langKey === \"tsx\") return \"typescript\";\n return langKey;\n}\n\nfunction getQueryDir(langKey: string): string {\n const normalized = normalizeLanguage(langKey);\n return path.join(__dirname, \"queries\", normalized);\n}\n\nfunction computeHash(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction getSourceCacheKey(langKey: string, queryName: string): string {\n return `${normalizeLanguage(langKey)}:${queryName}`;\n}\n\nfunction extractCaptureCounts(source: string): Record<string, number> {\n const counts: Record<string, number> = {};\n const regex = /@([A-Za-z0-9_.-]+)/g;\n let match = regex.exec(source);\n while (match) {\n const name = match[1];\n counts[name] = (counts[name] ?? 0) + 1;\n match = regex.exec(source);\n }\n return counts;\n}\n\nfunction isValidQueryFileName(name: string): boolean {\n return /^[a-z0-9_-]+\\.scm$/i.test(name);\n}\n\ntype QueryLayoutEntry = {\n name: string;\n isFile: () => boolean;\n isDirectory: () => boolean;\n};\n\nfunction validateQueryEntries(entries: QueryLayoutEntry[]): QueryLayoutValidation {\n const errors: string[] = [];\n const invalidEntries: string[] = [];\n const queries: string[] = [];\n for (const entry of entries) {\n if (entry.isDirectory()) {\n invalidEntries.push(entry.name);\n errors.push(`invalid_directory:${entry.name}`);\n continue;\n }\n if (!entry.isFile()) {\n invalidEntries.push(entry.name);\n errors.push(`invalid_entry:${entry.name}`);\n continue;\n }\n if (!entry.name.endsWith(\".scm\")) {\n invalidEntries.push(entry.name);\n errors.push(`invalid_extension:${entry.name}`);\n continue;\n }\n if (!isValidQueryFileName(entry.name)) {\n invalidEntries.push(entry.name);\n errors.push(`invalid_name:${entry.name}`);\n continue;\n }\n queries.push(entry.name.replace(/\\.scm$/, \"\"));\n }\n return {\n valid: errors.length === 0,\n errors,\n queries: queries.sort(),\n invalidEntries,\n };\n}\n\nexport class QueryRegistry {\n static async getQuerySource(langKey: string, queryName: string): Promise<string | null> {\n const key = getSourceCacheKey(langKey, queryName);\n if (SOURCE_CACHE.has(key)) {\n return SOURCE_CACHE.get(key) ?? null;\n }\n const dir = getQueryDir(langKey);\n const queryPath = path.join(dir, `${queryName}.scm`);\n try {\n const source = await readFile(queryPath, \"utf-8\");\n SOURCE_CACHE.set(key, source);\n return source;\n } catch {\n SOURCE_CACHE.set(key, null);\n return null;\n }\n }\n\n static async getCompiledQuery(langKey: string, queryName: string): Promise<Query | null> {\n const source = await this.getQuerySource(langKey, queryName);\n if (!source) return null;\n const sourceHash = computeHash(source);\n const key = getSourceCacheKey(langKey, queryName);\n const cached = COMPILED_CACHE.get(key);\n if (cached && cached.sourceHash === sourceHash) {\n return cached.query;\n }\n const parser = await loadLanguage(normalizeLanguage(langKey) as any);\n const language = parser.language;\n if (!language) return null;\n const query = new Query(language, source);\n COMPILED_CACHE.set(key, { sourceHash, query });\n return query;\n }\n\n static async listQueries(langKey: string): Promise<string[]> {\n const normalized = normalizeLanguage(langKey);\n if (LIST_CACHE.has(normalized)) {\n return LIST_CACHE.get(normalized)!;\n }\n const dir = getQueryDir(normalized);\n try {\n const files = await readdir(dir, { withFileTypes: true });\n const queries = files\n .filter(entry => entry.isFile() && entry.name.endsWith(\".scm\"))\n .map(entry => entry.name.replace(/\\.scm$/, \"\"))\n .sort();\n LIST_CACHE.set(normalized, queries);\n return queries;\n } catch {\n LIST_CACHE.set(normalized, []);\n return [];\n }\n }\n\n static async validateQueryLayout(langKey: string): Promise<QueryLayoutValidation> {\n const normalized = normalizeLanguage(langKey);\n const dir = getQueryDir(normalized);\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n return validateQueryEntries(entries);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n valid: false,\n errors: [`read_error:${message}`],\n queries: [],\n invalidEntries: [],\n };\n }\n }\n\n static async getCoverageReport(langKey: string): Promise<QueryCoverageReport> {\n const normalized = normalizeLanguage(langKey);\n const queryNames = await this.listQueries(normalized);\n const queries: QueryCoverageEntry[] = [];\n let totalCaptures = 0;\n for (const name of queryNames) {\n const source = await this.getQuerySource(normalized, name);\n if (!source) continue;\n const captureCounts = extractCaptureCounts(source);\n const total = Object.values(captureCounts).reduce((sum, count) => sum + count, 0);\n totalCaptures += total;\n queries.push({ name, captureCounts, totalCaptures: total });\n }\n return {\n language: normalized,\n totalQueries: queries.length,\n totalCaptures,\n queries,\n };\n }\n}\n\nexport function __resetQueryRegistryForTests() {\n SOURCE_CACHE.clear();\n COMPILED_CACHE.clear();\n LIST_CACHE.clear();\n}\n\nexport function __validateQueryEntriesForTests(entries: QueryLayoutEntry[]) {\n return validateQueryEntries(entries);\n}\n", "\nimport { ParserRegistry } from \"./registry\";\nimport { loadLanguage } from \"./loader\";\nimport { Query, type Node } from \"web-tree-sitter\";\nimport { createHash } from \"crypto\";\nimport { parseWithSharedCache } from \"./lsp-adapter\";\nimport { QueryRegistry } from \"./query-registry\";\n\ninterface ScopeResult {\n locals: string[];\n closure: string[];\n}\n\nconst SCOPE_NODE_TYPES: Record<string, Set<string>> = {\n python: new Set([\"function_definition\", \"class_definition\", \"module\"]),\n typescript: new Set([\n \"function_declaration\",\n \"function\",\n \"function_expression\",\n \"arrow_function\",\n \"method_definition\",\n \"class_declaration\",\n \"statement_block\",\n \"program\",\n ]),\n go: new Set([\n \"function_declaration\",\n \"method_declaration\",\n \"function_literal\",\n \"block\",\n \"source_file\",\n ]),\n rust: new Set([\n \"function_item\",\n \"impl_item\",\n \"trait_item\",\n \"block\",\n \"source_file\",\n ]),\n java: new Set([\n \"method_declaration\",\n \"constructor_declaration\",\n \"class_declaration\",\n \"interface_declaration\",\n \"block\",\n \"program\",\n ]),\n};\n\nconst SCOPE_BOUNDARY_TYPES: Record<string, Set<string>> = {\n python: new Set([\"function_definition\", \"class_definition\"]),\n typescript: new Set([\n \"function_declaration\",\n \"function\",\n \"function_expression\",\n \"arrow_function\",\n \"method_definition\",\n \"class_declaration\",\n \"statement_block\",\n ]),\n go: new Set([\"function_declaration\", \"method_declaration\", \"function_literal\"]),\n rust: new Set([\"function_item\", \"impl_item\", \"trait_item\"]),\n java: new Set([\n \"method_declaration\",\n \"constructor_declaration\",\n \"class_declaration\",\n \"interface_declaration\",\n ]),\n};\n\nfunction normalizeScopeLanguage(langKey: string): string {\n if (langKey === \"tsx\") return \"typescript\";\n return langKey;\n}\n\nasync function loadScopeQuery(langKey: string): Promise<string | null> {\n const normalized = normalizeScopeLanguage(langKey);\n return QueryRegistry.getQuerySource(normalized, \"locals\");\n}\n\nconst QUERY_PRIORITY_LANGUAGES = [\"typescript\", \"python\"];\n\nconst SCOPE_CACHE = new Map<string, { value: ScopeResult; expiresAt: number }>();\nconst SCOPE_CACHE_TTL_MS = 30 * 1000;\n\nfunction computeHash(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction getScopeCacheKey(langKey: string, code: string, position: { row: number; column: number }): string {\n const hash = computeHash(code);\n return `${langKey}:${hash}:${position.row}:${position.column}`;\n}\n\nfunction getCachedScope(key: string, now: number): ScopeResult | null {\n const cached = SCOPE_CACHE.get(key);\n if (!cached) return null;\n if (now >= cached.expiresAt) {\n SCOPE_CACHE.delete(key);\n return null;\n }\n return cached.value;\n}\n\nexport class ScopeAnalyzer {\n static async getQuerySource(langKey: string): Promise<string | null> {\n return loadScopeQuery(langKey);\n }\n\n static async getQueryCoverage(langKey: string, code: string): Promise<{ total: number; unique: number; names: string[] }> {\n const parser = await loadLanguage(langKey as any);\n const queryStr = await loadScopeQuery(langKey);\n if (!queryStr) return { total: 0, unique: 0, names: [] };\n const language = parser.language;\n if (!language) return { total: 0, unique: 0, names: [] };\n const query = new Query(language, queryStr);\n const tree = parser.parse(code);\n const captures = query.captures(tree.rootNode);\n const names = captures.map(c => c.node.text);\n const uniqueNames = Array.from(new Set(names));\n return { total: captures.length, unique: uniqueNames.length, names: uniqueNames };\n }\n\n static isPriorityLanguage(langKey: string): boolean {\n const normalized = normalizeScopeLanguage(langKey);\n return QUERY_PRIORITY_LANGUAGES.includes(normalized);\n }\n\n static getPriorityLanguages(): string[] {\n return [...QUERY_PRIORITY_LANGUAGES];\n }\n\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 const normalizedLangKey = normalizeScopeLanguage(langKey);\n\n const now = Date.now();\n const cacheKey = getScopeCacheKey(normalizedLangKey, code, position);\n const cached = getCachedScope(cacheKey, now);\n if (cached) return cached;\n\n const parser = await loadLanguage(langKey);\n const tree = await parseWithSharedCache(langKey, code, filename, now);\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 const scopeNodes = ancestors.filter(n => {\n const types = SCOPE_NODE_TYPES[normalizedLangKey];\n return types ? types.has(n.type) : false;\n });\n\n const result: ScopeResult = {\n locals: [],\n closure: []\n };\n\n if (scopeNodes.length === 0) return result;\n\n const queryStr = await loadScopeQuery(normalizedLangKey);\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 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 const defNode = capture.node;\n\n let temp: Node | null = defNode.parent;\n\n let isDirect = true;\n while (temp && temp.id !== scopeNode.id) {\n const boundaryTypes = SCOPE_BOUNDARY_TYPES[normalizedLangKey];\n if (boundaryTypes?.has(temp.type)) {\n isDirect = false;\n break;\n }\n temp = temp.parent;\n }\n \n if (capture.name === 'name') {\n const boundaryTypes = SCOPE_BOUNDARY_TYPES[normalizedLangKey];\n if (boundaryTypes?.has(defNode.parent?.type ?? '')) {\n temp = defNode.parent?.parent ?? null;\n isDirect = true;\n while (temp && temp.id !== scopeNode.id) {\n if (boundaryTypes?.has(temp.type)) {\n isDirect = false;\n break;\n }\n temp = temp.parent;\n }\n }\n }\n\n if (isDirect) {\n names.add(defNode.text);\n }\n }\n\n if (i === 0 && scopeNode.type === \"statement_block\") {\n const boundaryTypes = SCOPE_BOUNDARY_TYPES[normalizedLangKey];\n const parent = scopeNode.parent;\n if (parent && boundaryTypes?.has(parent.type)) {\n const parentCaptures = query.captures(parent);\n for (const capture of parentCaptures) {\n if (capture.name === \"param\") {\n names.add(capture.node.text);\n }\n }\n }\n if (parent && (parent.type === \"for_in_statement\" || parent.type === \"for_statement\")) {\n const parentCaptures = query.captures(parent);\n for (const capture of parentCaptures) {\n if (capture.name === \"var\") {\n names.add(capture.node.text);\n }\n }\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 SCOPE_CACHE.set(cacheKey, { value: result, expiresAt: now + SCOPE_CACHE_TTL_MS });\n return result;\n }\n}\n\nexport function __resetScopeCacheForTests() {\n SCOPE_CACHE.clear();\n}\n\nexport function __getScopeCacheSizeForTests(): number {\n return SCOPE_CACHE.size;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["extname", "pathToFileURL", "readFile", "createHash", "waiters", "fileURLToPath", "fileURLToPath", "fileURLToPath", "relative", "relative", "fileURLToPath", "fileURLToPath", "path", "readFile", "createHash", "readFile", "readdir", "path", "fileURLToPath", "fileURLToPath", "__dirname", "path", "readFile", "readdir", "SYMBOL_KIND_MAP", "computeHash", "createHash", "tree", "SYMBOL_KIND_MAP", "readFile", "Query", "createHash", "computeHash", "createHash", "Query", "pathToFileURL", "createHash", "readFile", "path", "extname"]
|
|
7
|
+
}
|