@wrongstack/plug-lsp 0.3.8 → 0.4.1
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/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/setup.js +3 -1
- package/dist/setup.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -110,7 +110,7 @@ async function commandExistsOnPath(command) {
|
|
|
110
110
|
const probe = process.platform === "win32" ? "where.exe" : "sh";
|
|
111
111
|
const args = process.platform === "win32" ? [command] : ["-lc", `command -v ${shellQuote(command)}`];
|
|
112
112
|
return new Promise((resolve6) => {
|
|
113
|
-
const child = spawn(probe, args, { stdio: "ignore", windowsHide: true });
|
|
113
|
+
const child = spawn(probe, args, { env: buildChildEnv(), stdio: "ignore", windowsHide: true });
|
|
114
114
|
child.on("error", () => resolve6(false));
|
|
115
115
|
child.on("close", (code) => resolve6(code === 0));
|
|
116
116
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/presets.ts","../src/utils/command-resolver.ts","../src/auto-discover.ts","../src/config.ts","../src/language-detect.ts","../src/utils/uri.ts","../src/document-tracker.ts","../src/server/lifecycle.ts","../src/types.ts","../src/utils/safe-spawn.ts","../src/utils/timeout.ts","../src/server/connection.ts","../src/server/initialize.ts","../src/server/lsp-server.ts","../src/workspace-root.ts","../src/registry.ts","../src/formatters/diagnostics.ts","../src/slash-commands/diagnostics.ts","../src/slash-commands/list.ts","../src/slash-commands/restart.ts","../src/slash-commands/start.ts","../src/slash-commands/stop.ts","../src/slash-commands/index.ts","../src/formatters/workspace-edit.ts","../src/position.ts","../src/server/capabilities.ts","../src/tools/shared.ts","../src/tools/workspace-edit.ts","../src/tools/code-actions.ts","../src/formatters/location.ts","../src/tools/definition.ts","../src/tools/diagnostics.ts","../src/formatters/hover.ts","../src/tools/hover.ts","../src/tools/references.ts","../src/tools/rename.ts","../src/formatters/symbols.ts","../src/tools/symbols.ts","../src/tools/index.ts","../src/index.ts"],"names":["resolve","fs","path2","path3","path4","spawn","pathToFileURL","path5","path6","fs4","path7","fs5","fs6","path"],"mappings":"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","file":"index.js","sourcesContent":["import type { ServerConfig } from './types.js';\n\nexport const PRESETS: Record<string, ServerConfig> = {\n typescript: {\n command: 'typescript-language-server',\n args: ['--stdio'],\n languages: ['typescript', 'typescriptreact', 'javascript', 'javascriptreact'],\n rootPatterns: ['tsconfig.json', 'jsconfig.json', 'package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n gopls: {\n command: 'gopls',\n args: ['serve'],\n languages: ['go'],\n rootPatterns: ['go.mod', 'go.work'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n 'rust-analyzer': {\n command: 'rust-analyzer',\n languages: ['rust'],\n rootPatterns: ['Cargo.toml'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n pyright: {\n command: 'pyright-langserver',\n args: ['--stdio'],\n languages: ['python'],\n rootPatterns: ['pyproject.toml', 'pyrightconfig.json', 'setup.py', 'requirements.txt'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n json: {\n command: 'vscode-json-language-server',\n args: ['--stdio'],\n languages: ['json'],\n rootPatterns: ['package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n html: {\n command: 'vscode-html-language-server',\n args: ['--stdio'],\n languages: ['html'],\n rootPatterns: ['package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n css: {\n command: 'vscode-css-language-server',\n args: ['--stdio'],\n languages: ['css', 'scss'],\n rootPatterns: ['package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n yaml: {\n command: 'yaml-language-server',\n args: ['--stdio'],\n languages: ['yaml'],\n rootPatterns: ['package.json', '.git'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n bash: {\n command: 'bash-language-server',\n args: ['start'],\n languages: ['shellscript'],\n rootPatterns: ['package.json', '.git'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n 'ruby-lsp': {\n command: 'ruby-lsp',\n languages: ['ruby'],\n rootPatterns: ['Gemfile', '.ruby-version'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n};\n","import { spawn } from 'node:child_process';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport async function resolveServerCommand(command: string, cwd: string): Promise<string | null> {\n const local = await findLocalBinary(cwd, command);\n if (local) return local;\n return (await commandExistsOnPath(command)) ? command : null;\n}\n\nexport async function findLocalBinary(cwd: string, command: string): Promise<string | null> {\n if (path.isAbsolute(command)) return (await fileExists(command)) ? path.normalize(command) : null;\n let dir = path.resolve(cwd);\n for (;;) {\n const binDir = path.join(dir, 'node_modules', '.bin');\n for (const candidate of commandCandidates(command)) {\n const full = path.join(binDir, candidate);\n if (await fileExists(full)) return full;\n }\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport async function commandExistsOnPath(command: string): Promise<boolean> {\n const probe = process.platform === 'win32' ? 'where.exe' : 'sh';\n const args =\n process.platform === 'win32' ? [command] : ['-lc', `command -v ${shellQuote(command)}`];\n return new Promise((resolve) => {\n const child = spawn(probe, args, { stdio: 'ignore', windowsHide: true });\n child.on('error', () => resolve(false));\n child.on('close', (code) => resolve(code === 0));\n });\n}\n\nfunction commandCandidates(command: string): string[] {\n /* v8 ignore next -- platform-specific branch; covered on non-Windows CI. */\n if (process.platform !== 'win32') return [command];\n const ext = path.extname(command).toLowerCase();\n if (ext) return [command];\n return [`${command}.cmd`, `${command}.exe`, `${command}.bat`, command, `${command}.ps1`];\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction shellQuote(value: string): string {\n /* v8 ignore next -- only used by POSIX command probing. */\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n","import { PRESETS } from './presets.js';\nimport type { ServerConfig } from './types.js';\nimport { resolveServerCommand } from './utils/command-resolver.js';\n\nexport async function autoDiscoverServers(\n userServers: Record<string, ServerConfig>,\n cwd = process.cwd(),\n): Promise<Record<string, ServerConfig>> {\n const out = { ...userServers };\n for (const [name, cfg] of Object.entries(PRESETS)) {\n if (out[name]) continue;\n const command = await resolveServerCommand(cfg.command, cwd);\n if (command) out[name] = { ...cfg, command };\n }\n return out;\n}\n","import { type JSONSchema, type PluginAPI, TOKENS } from '@wrongstack/core';\nimport { PRESETS } from './presets.js';\nimport type { PlugLSPConfig, ServerConfig, SeverityName } from './types.js';\n\nexport const PLUGIN_NAME = '@wrongstack/plug-lsp';\n\nexport const DEFAULT_CONFIG: Omit<PlugLSPConfig, 'servers'> = {\n autoStart: 'lazy',\n diagnosticsAfterEdit: 'background',\n diagnosticsWaitMs: 1500,\n severityFilter: ['error', 'warning'],\n maxDiagnosticsPerFile: 5,\n maxDiagnosticsTotal: 50,\n autoDiscover: true,\n logServerOutput: false,\n};\n\nexport const plugLspConfigSchema: JSONSchema = {\n type: 'object',\n properties: {\n servers: { type: 'object' },\n autoStart: { type: 'string', enum: ['lazy', 'eager', 'never'] },\n diagnosticsAfterEdit: { type: 'string', enum: ['background', 'manual'] },\n diagnosticsWaitMs: { type: 'integer' },\n severityFilter: {\n type: 'array',\n items: { type: 'string', enum: ['error', 'warning', 'info', 'hint'] },\n },\n maxDiagnosticsPerFile: { type: 'integer' },\n maxDiagnosticsTotal: { type: 'integer' },\n autoDiscover: { type: 'boolean' },\n logServerOutput: { type: 'boolean' },\n },\n};\n\nexport function readPlugLSPConfig(api: PluginAPI): PlugLSPConfig {\n const fromStore = readFromConfigStore(api);\n const raw = fromStore ?? api.config.extensions?.[PLUGIN_NAME] ?? {};\n return mergeConfig(raw);\n}\n\nexport function mergeConfig(raw: Readonly<Record<string, unknown>>): PlugLSPConfig {\n const servers = normalizeServers(raw.servers);\n const severity = Array.isArray(raw.severityFilter)\n ? raw.severityFilter.filter(isSeverityName)\n : DEFAULT_CONFIG.severityFilter;\n\n return {\n servers,\n autoStart: oneOf(raw.autoStart, ['lazy', 'eager', 'never'], DEFAULT_CONFIG.autoStart),\n diagnosticsAfterEdit: oneOf(\n raw.diagnosticsAfterEdit,\n ['background', 'manual'],\n DEFAULT_CONFIG.diagnosticsAfterEdit,\n ),\n diagnosticsWaitMs: positiveInt(raw.diagnosticsWaitMs, DEFAULT_CONFIG.diagnosticsWaitMs),\n severityFilter: severity.length > 0 ? severity : DEFAULT_CONFIG.severityFilter,\n maxDiagnosticsPerFile: positiveInt(\n raw.maxDiagnosticsPerFile,\n DEFAULT_CONFIG.maxDiagnosticsPerFile,\n ),\n maxDiagnosticsTotal: positiveInt(raw.maxDiagnosticsTotal, DEFAULT_CONFIG.maxDiagnosticsTotal),\n autoDiscover:\n typeof raw.autoDiscover === 'boolean' ? raw.autoDiscover : DEFAULT_CONFIG.autoDiscover,\n logServerOutput:\n typeof raw.logServerOutput === 'boolean'\n ? raw.logServerOutput\n : DEFAULT_CONFIG.logServerOutput,\n };\n}\n\nfunction readFromConfigStore(api: PluginAPI): Readonly<Record<string, unknown>> | undefined {\n if (!api.container.has(TOKENS.ConfigStore)) return undefined;\n try {\n return api.container.resolve(TOKENS.ConfigStore).getExtension(PLUGIN_NAME);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeServers(value: unknown): Record<string, ServerConfig> {\n if (!isRecord(value)) return {};\n const out: Record<string, ServerConfig> = {};\n for (const [name, raw] of Object.entries(value)) {\n if (!isRecord(raw)) continue;\n if (typeof raw.command !== 'string') continue;\n if (!Array.isArray(raw.languages) || raw.languages.some((x) => typeof x !== 'string')) {\n continue;\n }\n out[name] = {\n command: raw.command,\n args: stringArray(raw.args),\n env: stringRecord(raw.env),\n languages: raw.languages,\n rootPatterns: stringArray(raw.rootPatterns),\n initializationOptions: raw.initializationOptions,\n settings: raw.settings,\n startupTimeoutMs: positiveInt(raw.startupTimeoutMs, 15_000),\n enabled: typeof raw.enabled === 'boolean' ? raw.enabled : true,\n };\n }\n return out;\n}\n\nexport function withPresetFallbacks(cfg: PlugLSPConfig): PlugLSPConfig {\n const typescript = PRESETS.typescript;\n return {\n ...cfg,\n servers: Object.keys(cfg.servers).length > 0 || !typescript ? cfg.servers : { typescript },\n };\n}\n\nfunction oneOf<T extends string>(value: unknown, allowed: readonly T[], fallback: T): T {\n return typeof value === 'string' && allowed.includes(value as T) ? (value as T) : fallback;\n}\n\nfunction positiveInt(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isInteger(value) && value > 0 ? value : fallback;\n}\n\nfunction stringArray(value: unknown): string[] | undefined {\n return Array.isArray(value) && value.every((x) => typeof x === 'string') ? value : undefined;\n}\n\nfunction stringRecord(value: unknown): Record<string, string> | undefined {\n if (!isRecord(value)) return undefined;\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(value)) {\n if (typeof v === 'string') out[k] = v;\n }\n return out;\n}\n\nfunction isSeverityName(value: unknown): value is SeverityName {\n return value === 'error' || value === 'warning' || value === 'info' || value === 'hint';\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import * as path from 'node:path';\n\nexport const LANGUAGE_MAP: Readonly<Record<string, string>> = {\n '.ts': 'typescript',\n '.tsx': 'typescriptreact',\n '.js': 'javascript',\n '.jsx': 'javascriptreact',\n '.mjs': 'javascript',\n '.cjs': 'javascript',\n '.go': 'go',\n '.rs': 'rust',\n '.py': 'python',\n '.pyi': 'python',\n '.rb': 'ruby',\n '.java': 'java',\n '.kt': 'kotlin',\n '.swift': 'swift',\n '.c': 'c',\n '.h': 'c',\n '.cpp': 'cpp',\n '.cc': 'cpp',\n '.cxx': 'cpp',\n '.hpp': 'cpp',\n '.cs': 'csharp',\n '.lua': 'lua',\n '.zig': 'zig',\n '.php': 'php',\n '.json': 'json',\n '.html': 'html',\n '.css': 'css',\n '.scss': 'scss',\n '.yml': 'yaml',\n '.yaml': 'yaml',\n '.sh': 'shellscript',\n '.bash': 'shellscript',\n};\n\nconst FILENAME_MAP: Readonly<Record<string, string>> = {\n Dockerfile: 'dockerfile',\n Makefile: 'makefile',\n 'CMakeLists.txt': 'cmake',\n 'tsconfig.json': 'json',\n 'package.json': 'json',\n};\n\nexport function languageIdFor(filePath: string): string | null {\n const base = path.basename(filePath);\n const exact = FILENAME_MAP[base];\n if (exact) return exact;\n\n if (base.endsWith('.test.ts') || base.endsWith('.spec.ts')) return 'typescript';\n if (base.endsWith('.test.tsx') || base.endsWith('.spec.tsx')) return 'typescriptreact';\n if (base.endsWith('.test.js') || base.endsWith('.spec.js')) return 'javascript';\n if (base.endsWith('.test.jsx') || base.endsWith('.spec.jsx')) return 'javascriptreact';\n\n return LANGUAGE_MAP[path.extname(base)] ?? null;\n}\n","import * as path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\n\nexport function pathToUri(filePath: string): string {\n return pathToFileURL(path.resolve(filePath)).toString();\n}\n\nexport function uriToPath(uri: string): string {\n return fileURLToPath(uri);\n}\n\nexport function displayPath(filePath: string, cwd: string): string {\n const rel = path.relative(cwd, filePath);\n return rel && !rel.startsWith('..') && !path.isAbsolute(rel) ? rel.replace(/\\\\/g, '/') : filePath;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { EventBus, EventMap, Logger } from '@wrongstack/core';\nimport type { TextDocumentItem } from 'vscode-languageserver-protocol';\nimport { languageIdFor } from './language-detect.js';\nimport type { LSPRegistry } from './registry.js';\nimport type { LSPServer } from './server/lsp-server.js';\nimport type { TrackedDocument } from './types.js';\nimport { pathToUri } from './utils/uri.js';\n\nexport class DocumentTracker {\n private readonly docs = new Map<string, TrackedDocument>();\n private cwd: string;\n\n constructor(\n private readonly registry: () => LSPRegistry,\n private readonly log: Logger,\n cwd: string,\n private readonly events?: EventBus,\n ) {\n this.cwd = cwd;\n }\n\n setCwd(cwd: string): void {\n this.cwd = cwd;\n }\n\n async handleToolExecuted(event: EventMap['tool.executed']): Promise<void> {\n if (!event.ok) return;\n if (event.name !== 'read' && event.name !== 'edit' && event.name !== 'write') return;\n const input = event.input as { path?: unknown } | undefined;\n if (!input || typeof input.path !== 'string') return;\n const absPath = this.resolve(input.path);\n if (event.name === 'read') await this.open(absPath);\n else await this.fileWritten(absPath);\n }\n\n async fileWritten(filePath: string): Promise<void> {\n const absPath = this.resolve(filePath);\n const languageId = languageIdFor(absPath);\n if (!languageId) return;\n let text: string;\n try {\n text = await fs.readFile(absPath, 'utf8');\n } catch (err) {\n this.log.debug(`LSP tracker could not read changed file ${absPath}`, err);\n return;\n }\n const doc = this.docs.get(absPath);\n if (!doc) {\n await this.open(absPath, text);\n return;\n }\n doc.version++;\n doc.text = text;\n for (const server of this.registry().list()) {\n /* v8 ignore next -- false branch is defensive for mixed registries. */\n if (server.state !== 'ready' || !server.config.languages.includes(languageId)) continue;\n server.notifyDidChange({ uri: doc.uri, version: doc.version }, text);\n doc.serverNames.add(server.name);\n }\n }\n\n async open(filePath: string, knownText?: string): Promise<void> {\n const absPath = this.resolve(filePath);\n const languageId = languageIdFor(absPath);\n if (!languageId) return;\n const text = knownText ?? (await fs.readFile(absPath, 'utf8'));\n let doc = this.docs.get(absPath);\n /* v8 ignore next -- both create and existing paths are covered; branch accounting is source-map noisy. */\n if (!doc) {\n doc = {\n uri: pathToUri(absPath),\n path: absPath,\n languageId,\n version: 1,\n text,\n serverNames: new Set(),\n };\n this.docs.set(absPath, doc);\n this.events?.emit('lsp.document.opened', { path: absPath, language: languageId });\n }\n for (const server of this.registry().list()) {\n if (server.state !== 'ready' || !server.config.languages.includes(languageId)) continue;\n /* v8 ignore next -- duplicate-open guard is defensive/idempotent. */\n if (doc.serverNames.has(server.name)) continue;\n server.notifyDidOpen(toTextDocumentItem(doc));\n doc.serverNames.add(server.name);\n }\n }\n\n async reopenForServer(server: LSPServer): Promise<void> {\n /* v8 ignore next -- non-ready guard is covered but branch accounting is source-map noisy. */\n if (server.state !== 'ready') return;\n for (const doc of this.docs.values()) {\n /* v8 ignore next -- mixed-language registries are covered elsewhere. */\n if (!server.config.languages.includes(doc.languageId)) continue;\n server.notifyDidOpen(toTextDocumentItem(doc));\n doc.serverNames.add(server.name);\n }\n }\n\n async forceCloseAll(): Promise<void> {\n for (const doc of this.docs.values()) {\n for (const server of this.registry().list()) {\n /* v8 ignore next -- close only applies to ready servers that saw the doc. */\n if (server.state === 'ready' && doc.serverNames.has(server.name)) {\n server.notifyDidClose(doc.uri);\n this.events?.emit('lsp.document.closed', { path: doc.path });\n }\n }\n }\n this.docs.clear();\n }\n\n get(filePath: string): TrackedDocument | null {\n return this.docs.get(this.resolve(filePath)) ?? null;\n }\n\n list(): readonly TrackedDocument[] {\n return Array.from(this.docs.values());\n }\n\n private resolve(filePath: string): string {\n return path.isAbsolute(filePath) ? path.normalize(filePath) : path.resolve(this.cwd, filePath);\n }\n}\n\nfunction toTextDocumentItem(doc: TrackedDocument): TextDocumentItem {\n return {\n uri: doc.uri,\n languageId: doc.languageId,\n version: doc.version,\n text: doc.text,\n };\n}\n","import type { ServerState } from '../types.js';\n\nconst ALLOWED: Record<ServerState, ServerState[]> = {\n disabled: ['starting'],\n starting: ['initializing', 'failed', 'exited'],\n initializing: ['ready', 'failed', 'exited'],\n ready: ['shutting_down', 'failed', 'exited'],\n failed: ['reconnecting', 'disabled', 'starting'],\n reconnecting: ['starting', 'failed'],\n shutting_down: ['exited', 'failed'],\n exited: ['starting', 'disabled'],\n};\n\nexport function canTransition(from: ServerState, to: ServerState): boolean {\n return from === to || ALLOWED[from].includes(to);\n}\n\nexport function nextReconnectDelay(attempt: number): number {\n /* v8 ignore next -- array fallback is defensive after clamping. */\n return [1000, 4000, 16_000][Math.max(0, Math.min(2, attempt))] ?? 16_000;\n}\n","export type {\n CodeAction,\n Diagnostic,\n DocumentSymbol,\n Hover,\n Location,\n LocationLink,\n Range,\n ServerCapabilities,\n SymbolInformation,\n WorkspaceEdit,\n} from 'vscode-languageserver-protocol';\n\nexport type AutoStartMode = 'lazy' | 'eager' | 'never';\nexport type DiagnosticsAfterEdit = 'background' | 'manual';\nexport type SeverityName = 'error' | 'warning' | 'info' | 'hint';\n\nexport interface ServerConfig {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n languages: string[];\n rootPatterns?: string[];\n initializationOptions?: unknown;\n settings?: unknown;\n startupTimeoutMs?: number;\n enabled?: boolean;\n}\n\nexport interface PlugLSPConfig {\n servers: Record<string, ServerConfig>;\n autoStart: AutoStartMode;\n diagnosticsAfterEdit: DiagnosticsAfterEdit;\n diagnosticsWaitMs: number;\n severityFilter: SeverityName[];\n maxDiagnosticsPerFile: number;\n maxDiagnosticsTotal: number;\n autoDiscover: boolean;\n logServerOutput: boolean;\n}\n\nexport type ServerState =\n | 'disabled'\n | 'starting'\n | 'initializing'\n | 'ready'\n | 'failed'\n | 'shutting_down'\n | 'exited'\n | 'reconnecting';\n\nexport interface TrackedDocument {\n uri: string;\n path: string;\n languageId: string;\n version: number;\n text: string;\n serverNames: Set<string>;\n}\n\nexport enum LSPErrorCode {\n ServerNotFound = 'LSP_SERVER_NOT_FOUND',\n ServerNotReady = 'LSP_SERVER_NOT_READY',\n ServerFailed = 'LSP_SERVER_FAILED',\n CapabilityMissing = 'LSP_CAPABILITY_MISSING',\n RequestTimeout = 'LSP_REQUEST_TIMEOUT',\n InvalidPosition = 'LSP_INVALID_POSITION',\n ProtocolError = 'LSP_PROTOCOL_ERROR',\n ApplyEditFailed = 'LSP_APPLY_EDIT_FAILED',\n}\n\nexport class LSPError extends Error {\n constructor(\n readonly code: LSPErrorCode,\n message: string,\n readonly details?: unknown,\n ) {\n super(message);\n this.name = 'LSPError';\n }\n}\n\ndeclare module '@wrongstack/core' {\n interface EventMap {\n 'lsp.server.starting': { name: string; command: string };\n 'lsp.server.ready': { name: string; languages: string[] };\n 'lsp.server.exited': { name: string; code: number | null; signal: string | null };\n 'lsp.server.crashed': { name: string; error: string };\n 'lsp.diagnostics.updated': { path: string; count: number };\n 'lsp.document.opened': { path: string; language: string };\n 'lsp.document.closed': { path: string };\n }\n}\n","import { type ChildProcessWithoutNullStreams, spawn } from 'node:child_process';\nimport type { ServerConfig } from '../types.js';\nimport { buildChildEnv } from '@wrongstack/core';\n\nexport function safeSpawn(cfg: ServerConfig, cwd: string): ChildProcessWithoutNullStreams {\n /* v8 ignore next -- platform-specific branch differs between Windows and POSIX. */\n const shell = process.platform === 'win32' && /\\.(cmd|bat)$/i.test(cfg.command);\n return spawn(cfg.command, cfg.args ?? [], {\n cwd,\n env: buildChildEnv({ extra: cfg.env }),\n stdio: ['pipe', 'pipe', 'pipe'],\n shell,\n windowsHide: true,\n });\n}\n","import { LSPError, LSPErrorCode } from '../types.js';\n\nexport async function promiseWithTimeout<T>(\n promise: Promise<T>,\n ms: number,\n signal?: AbortSignal,\n): Promise<T> {\n if (signal?.aborted) throw abortError(signal);\n let timer: NodeJS.Timeout | undefined;\n return await new Promise<T>((resolve, reject) => {\n const cleanup = () => {\n if (timer) clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n };\n const onAbort = () => {\n cleanup();\n reject(abortError(signal));\n };\n timer = setTimeout(() => {\n cleanup();\n reject(new LSPError(LSPErrorCode.RequestTimeout, `LSP request timed out after ${ms}ms`));\n }, ms);\n signal?.addEventListener('abort', onAbort, { once: true });\n promise.then(\n (value) => {\n cleanup();\n resolve(value);\n },\n (err) => {\n cleanup();\n reject(err);\n },\n );\n });\n}\n\nfunction abortError(signal?: AbortSignal): Error {\n return signal?.reason instanceof Error ? signal.reason : new Error('aborted');\n}\n","import { EventEmitter } from 'node:events';\nimport type { Readable, Writable } from 'node:stream';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { promiseWithTimeout } from '../utils/timeout.js';\n\ninterface JsonRpcMessage {\n jsonrpc: '2.0';\n id?: number | string | null;\n method?: string;\n params?: unknown;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n}\n\ninterface Pending {\n resolve(value: unknown): void;\n reject(err: unknown): void;\n}\n\nexport class Connection {\n private nextId = 1;\n private readonly pending = new Map<number, Pending>();\n private readonly events = new EventEmitter();\n private buffer = Buffer.alloc(0);\n private closed = false;\n\n constructor(\n private readonly stdin: Writable,\n stdout: Readable,\n ) {\n stdout.on('data', (chunk: Buffer) => this.onData(chunk));\n stdout.on('close', () => this.close());\n stdout.on('error', (err) => this.failAll(err));\n }\n\n async sendRequest<R>(\n method: string,\n params: unknown,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<R> {\n this.assertOpen();\n const id = this.nextId++;\n const request: JsonRpcMessage = { jsonrpc: '2.0', id, method, params };\n const response = new Promise<R>((resolve, reject) => {\n this.pending.set(id, { resolve: resolve as (value: unknown) => void, reject });\n this.write(request);\n });\n try {\n return await promiseWithTimeout(response, timeoutMs, signal);\n } catch (err) {\n this.pending.delete(id);\n if (signal.aborted) {\n try {\n this.sendNotification('$/cancelRequest', { id });\n } catch {\n // ignore cancellation write failure\n }\n }\n throw normalizeError(err);\n }\n }\n\n sendNotification(method: string, params: unknown): void {\n this.assertOpen();\n this.write({ jsonrpc: '2.0', method, params });\n }\n\n onNotification(method: string, handler: (params: unknown) => void): () => void {\n this.events.on(method, handler);\n return () => this.events.off(method, handler);\n }\n\n onClose(handler: () => void): () => void {\n this.events.on('close', handler);\n return () => this.events.off('close', handler);\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.failAll(new LSPError(LSPErrorCode.ProtocolError, 'LSP connection closed'));\n this.events.emit('close');\n }\n\n private onData(chunk: Buffer): void {\n // Cap the receive buffer so a misbehaving server that floods data\n // without proper Content-Length headers can't exhaust memory.\n const MAX_BUFFER = 16 * 1024 * 1024; // 16 MiB\n if (this.buffer.length + chunk.length > MAX_BUFFER) {\n this.close();\n return;\n }\n this.buffer = Buffer.concat([this.buffer, chunk]);\n for (;;) {\n const sep = this.buffer.indexOf('\\r\\n\\r\\n');\n if (sep === -1) return;\n const header = this.buffer.subarray(0, sep).toString('ascii');\n const match = /Content-Length:\\s*(\\d+)/i.exec(header);\n if (!match) {\n this.buffer = this.buffer.subarray(sep + 4);\n continue;\n }\n const length = Number(match[1]);\n // Reject NaN, negative, or absurd lengths. Without this a\n // Content-Length: abc slips past as NaN and permanently stalls\n // the message parser.\n if (!Number.isFinite(length) || length < 0 || length > MAX_BUFFER) {\n this.buffer = this.buffer.subarray(sep + 4);\n continue;\n }\n const total = sep + 4 + length;\n if (this.buffer.length < total) return;\n const body = this.buffer.subarray(sep + 4, total).toString('utf8');\n this.buffer = this.buffer.subarray(total);\n try {\n this.handleMessage(JSON.parse(body) as JsonRpcMessage);\n } catch {\n // Malformed server output should not take down the agent.\n }\n }\n }\n\n private handleMessage(msg: JsonRpcMessage): void {\n if (msg.id !== undefined && msg.id !== null && !msg.method) {\n const id = Number(msg.id);\n const pending = this.pending.get(id);\n if (!pending) return;\n this.pending.delete(id);\n if (msg.error)\n pending.reject(new LSPError(LSPErrorCode.ProtocolError, msg.error.message, msg.error));\n else pending.resolve(msg.result);\n return;\n }\n if (msg.method) this.events.emit(msg.method, msg.params);\n }\n\n private write(message: JsonRpcMessage): void {\n const body = JSON.stringify(message);\n const bytes = Buffer.byteLength(body, 'utf8');\n this.stdin.write(`Content-Length: ${bytes}\\r\\n\\r\\n${body}`, 'utf8');\n }\n\n private assertOpen(): void {\n if (this.closed) throw new LSPError(LSPErrorCode.ProtocolError, 'LSP connection is closed');\n }\n\n private failAll(err: unknown): void {\n for (const pending of this.pending.values()) pending.reject(normalizeError(err));\n this.pending.clear();\n }\n}\n\nfunction normalizeError(err: unknown): Error {\n if (err instanceof Error) return err;\n /* v8 ignore next -- Node stream errors are Error objects; retained for protocol safety. */\n return new LSPError(LSPErrorCode.ProtocolError, String(err));\n}\n","import { pathToFileURL } from 'node:url';\nimport type {\n InitializeParams,\n InitializeResult,\n ServerCapabilities,\n} from 'vscode-languageserver-protocol';\nimport type { ServerConfig } from '../types.js';\nimport type { Connection } from './connection.js';\n\nexport const CLIENT_CAPABILITIES: InitializeParams['capabilities'] = {\n workspace: {\n workspaceFolders: true,\n didChangeWatchedFiles: { dynamicRegistration: false },\n symbol: {},\n executeCommand: { dynamicRegistration: false },\n },\n textDocument: {\n synchronization: {\n didSave: false,\n dynamicRegistration: false,\n willSave: false,\n willSaveWaitUntil: false,\n },\n diagnostic: { dynamicRegistration: false },\n definition: { linkSupport: true },\n references: {},\n hover: { contentFormat: ['markdown', 'plaintext'] },\n documentSymbol: { hierarchicalDocumentSymbolSupport: true },\n rename: { prepareSupport: true },\n codeAction: {},\n },\n general: { positionEncodings: ['utf-16'] },\n};\n\nexport async function initializeServer(\n connection: Connection,\n serverCfg: ServerConfig,\n rootPath: string,\n timeoutMs: number,\n signal: AbortSignal,\n): Promise<ServerCapabilities> {\n const rootUri = pathToFileURL(rootPath).toString();\n const params: InitializeParams = {\n processId: process.pid,\n rootPath,\n rootUri,\n capabilities: CLIENT_CAPABILITIES,\n initializationOptions: serverCfg.initializationOptions,\n workspaceFolders: [\n {\n uri: rootUri,\n name:\n rootPath\n .split(/[\\\\/]/)\n .pop() /* v8 ignore next */ ?? rootPath,\n },\n ],\n };\n const result = await connection.sendRequest<InitializeResult>(\n 'initialize',\n params,\n timeoutMs,\n signal,\n );\n connection.sendNotification('initialized', {});\n return result.capabilities;\n}\n","import type { ChildProcessWithoutNullStreams } from 'node:child_process';\nimport type { EventBus, Logger } from '@wrongstack/core';\nimport type {\n CodeAction,\n CodeActionParams,\n Diagnostic,\n DocumentSymbol,\n DocumentSymbolParams,\n ExecuteCommandParams,\n Hover,\n HoverParams,\n Location,\n LocationLink,\n Position,\n PrepareRenameParams,\n ReferenceParams,\n RenameParams,\n ServerCapabilities,\n SymbolInformation,\n TextDocumentItem,\n VersionedTextDocumentIdentifier,\n WorkspaceEdit,\n WorkspaceSymbolParams,\n} from 'vscode-languageserver-protocol';\nimport type { ServerConfig, ServerState } from '../types.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { safeSpawn } from '../utils/safe-spawn.js';\nimport { pathToUri, uriToPath } from '../utils/uri.js';\nimport { Connection } from './connection.js';\nimport { initializeServer } from './initialize.js';\n\nexport interface ServerContext {\n cwd: string;\n rootPath: string;\n log: Logger;\n events: EventBus;\n onCrash?: (server: LSPServer) => void;\n}\n\nexport class LSPServer {\n state: ServerState = 'exited';\n capabilities: ServerCapabilities | null = null;\n readonly diagnostics = new Map<string, Diagnostic[]>();\n private child: ChildProcessWithoutNullStreams | null = null;\n private connection: Connection | null = null;\n private processReachedReady = false;\n private stderrRing: string[] = [];\n\n constructor(\n readonly name: string,\n readonly config: ServerConfig,\n private readonly ctx: ServerContext,\n ) {\n if (config.enabled === false) this.state = 'disabled';\n }\n\n get rootPath(): string {\n return this.ctx.rootPath;\n }\n\n get lastStderr(): string {\n return this.stderrRing.slice(-20).join('\\n');\n }\n\n async start(signal: AbortSignal = new AbortController().signal): Promise<void> {\n if (this.state === 'ready' || this.state === 'starting' || this.state === 'initializing')\n return;\n if (this.config.enabled === false) {\n this.state = 'disabled';\n return;\n }\n this.state = 'starting';\n this.processReachedReady = false;\n this.ctx.events.emit('lsp.server.starting', { name: this.name, command: this.config.command });\n const child = safeSpawn(this.config, this.ctx.rootPath);\n this.child = child;\n child.stderr.on('data', (chunk: Buffer) => this.captureStderr(chunk));\n child.on('exit', (code, sig) => {\n const shouldReconnect = this.processReachedReady;\n this.connection?.close();\n this.connection = null;\n this.child = null;\n if (this.state !== 'shutting_down' && this.state !== 'exited') {\n this.state = 'failed';\n this.ctx.events.emit('lsp.server.crashed', {\n name: this.name,\n error: `process exited code=${code ?? 'null'} signal=${sig ?? 'null'}`,\n });\n if (shouldReconnect) this.ctx.onCrash?.(this);\n }\n this.ctx.events.emit('lsp.server.exited', { name: this.name, code, signal: sig });\n this.processReachedReady = false;\n });\n child.on('error', (err) => {\n const shouldReconnect = this.processReachedReady;\n this.state = 'failed';\n this.ctx.events.emit('lsp.server.crashed', { name: this.name, error: err.message });\n if (shouldReconnect) this.ctx.onCrash?.(this);\n this.processReachedReady = false;\n });\n\n this.connection = new Connection(child.stdin, child.stdout);\n this.connection.onNotification('textDocument/publishDiagnostics', (params) => {\n const p = params as { uri?: string; diagnostics?: Diagnostic[] };\n if (!p.uri || !Array.isArray(p.diagnostics)) return;\n this.diagnostics.set(p.uri, p.diagnostics);\n this.ctx.events.emit('lsp.diagnostics.updated', {\n path: p.uri.startsWith('file:') ? uriToPath(p.uri) : p.uri,\n count: p.diagnostics.length,\n });\n });\n this.connection.onNotification('window/logMessage', (params) => {\n if (this.config.enabled !== false && params && this.config) {\n this.ctx.log.debug(`LSP ${this.name} log`, params);\n }\n });\n this.connection.onClose(() => {\n if (this.state === 'ready') this.state = 'failed';\n });\n\n this.state = 'initializing';\n const startup = startupFailure(child);\n try {\n this.capabilities = await Promise.race([\n initializeServer(\n this.connection,\n this.config,\n this.ctx.rootPath,\n this.config.startupTimeoutMs ?? 15_000,\n signal,\n ),\n startup.promise,\n ]);\n startup.cancel();\n this.state = 'ready';\n this.processReachedReady = true;\n this.ctx.events.emit('lsp.server.ready', {\n name: this.name,\n languages: this.config.languages,\n });\n } catch (err) {\n startup.cancel();\n this.state = 'failed';\n this.connection?.close();\n this.child?.kill();\n this.processReachedReady = false;\n throw err;\n }\n }\n\n async shutdown(): Promise<void> {\n if (this.state === 'exited' || this.state === 'disabled') return;\n this.state = 'shutting_down';\n try {\n if (this.connection) {\n const ctrl = new AbortController();\n await this.connection\n .sendRequest('shutdown', null, 3000, ctrl.signal)\n .catch(() => undefined);\n this.connection.sendNotification('exit', null);\n }\n } finally {\n this.connection?.close();\n this.connection = null;\n if (this.child && !this.child.killed) this.child.kill();\n this.child = null;\n this.processReachedReady = false;\n this.state = 'exited';\n }\n }\n\n async definition(\n params: TextDocumentPositionParamsLike,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<Location[] | LocationLink[] | null> {\n return await this.request('textDocument/definition', params, timeoutMs, signal);\n }\n\n async references(\n params: ReferenceParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<Location[] | null> {\n return await this.request('textDocument/references', params, timeoutMs, signal);\n }\n\n async hover(params: HoverParams, timeoutMs: number, signal: AbortSignal): Promise<Hover | null> {\n return await this.request('textDocument/hover', params, timeoutMs, signal);\n }\n\n async documentSymbol(\n params: DocumentSymbolParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<DocumentSymbol[] | SymbolInformation[] | null> {\n return await this.request('textDocument/documentSymbol', params, timeoutMs, signal);\n }\n\n async workspaceSymbol(\n params: WorkspaceSymbolParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<SymbolInformation[] | null> {\n return await this.request('workspace/symbol', params, timeoutMs, signal);\n }\n\n async prepareRename(\n params: PrepareRenameParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<\n { range: unknown; placeholder?: string } | import('vscode-languageserver-protocol').Range | null\n > {\n return await this.request('textDocument/prepareRename', params, timeoutMs, signal);\n }\n\n async rename(\n params: RenameParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<WorkspaceEdit | null> {\n return await this.request('textDocument/rename', params, timeoutMs, signal);\n }\n\n async codeAction(\n params: CodeActionParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<CodeAction[]> {\n return (await this.request('textDocument/codeAction', params, timeoutMs, signal)) ?? [];\n }\n\n async executeCommand(\n params: ExecuteCommandParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<unknown> {\n return await this.request('workspace/executeCommand', params, timeoutMs, signal);\n }\n\n async pullDiagnostics(\n uri: string,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<Diagnostic[]> {\n const result = await this.request<{ items?: Diagnostic[] }>(\n 'textDocument/diagnostic',\n { textDocument: { uri } },\n timeoutMs,\n signal,\n );\n const items = result?.items ?? [];\n this.diagnostics.set(uri, items);\n return items;\n }\n\n getDiagnostics(uri: string): Diagnostic[] {\n return this.diagnostics.get(uri) ?? [];\n }\n\n notifyDidOpen(doc: TextDocumentItem): void {\n this.notification('textDocument/didOpen', { textDocument: doc });\n }\n\n notifyDidChange(doc: VersionedTextDocumentIdentifier, text: string): void {\n this.notification('textDocument/didChange', {\n textDocument: doc,\n contentChanges: [{ text }],\n });\n }\n\n notifyDidClose(uri: string): void {\n this.notification('textDocument/didClose', { textDocument: { uri } });\n }\n\n textDocumentIdentifier(filePath: string): { uri: string } {\n return { uri: pathToUri(filePath) };\n }\n\n private async request<T>(\n method: string,\n params: unknown,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<T> {\n if (this.state !== 'ready' || !this.connection) {\n throw new LSPError(LSPErrorCode.ServerNotReady, `Server \"${this.name}\" is not ready`);\n }\n return await this.connection.sendRequest<T>(method, params, timeoutMs, signal);\n }\n\n private notification(method: string, params: unknown): void {\n if (this.state !== 'ready' || !this.connection) return;\n this.connection.sendNotification(method, params);\n }\n\n private captureStderr(chunk: Buffer): void {\n const lines = chunk.toString('utf8').split(/\\r?\\n/).filter(Boolean);\n this.stderrRing.push(...lines);\n if (this.stderrRing.length > 100) this.stderrRing = this.stderrRing.slice(-100);\n }\n}\n\ninterface TextDocumentPositionParamsLike {\n textDocument: { uri: string };\n position: Position;\n}\n\nfunction startupFailure(child: ChildProcessWithoutNullStreams): {\n promise: Promise<never>;\n cancel: () => void;\n} {\n let cleanup = () => undefined;\n const promise = new Promise<never>((_, reject) => {\n const onError = (err: Error) => {\n cleanup();\n reject(\n new LSPError(LSPErrorCode.ServerFailed, `LSP server failed to start: ${err.message}`, err),\n );\n };\n const onExit = (code: number | null, signal: NodeJS.Signals | null) => {\n cleanup();\n reject(\n new LSPError(\n LSPErrorCode.ServerFailed,\n `LSP server exited during startup code=${code ?? 'null'} signal=${signal ?? 'null'}`,\n ),\n );\n };\n cleanup = () => {\n child.off('error', onError);\n child.off('exit', onExit);\n };\n child.once('error', onError);\n child.once('exit', onExit);\n });\n return { promise, cancel: cleanup };\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nexport function findWorkspaceRoot(\n filePath: string,\n rootPatterns: string[] | undefined,\n fallback: string,\n): string {\n const patterns = rootPatterns?.length ? rootPatterns : [];\n if (patterns.length === 0) return path.resolve(fallback);\n\n let dir = path.dirname(path.resolve(filePath));\n const stop = path.parse(dir).root;\n for (;;) {\n for (const pattern of patterns) {\n if (matchesAt(dir, pattern)) return dir;\n }\n if (dir === stop) return path.resolve(fallback);\n dir = path.dirname(dir);\n }\n}\n\nfunction matchesAt(dir: string, pattern: string): boolean {\n if (!pattern.includes('*')) return fs.existsSync(path.join(dir, pattern));\n const escaped = pattern\n .split('*')\n .map((part) => part.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('.*');\n const re = new RegExp(`^${escaped}$`);\n try {\n return fs.readdirSync(dir).some((name) => re.test(name));\n } catch {\n return false;\n }\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { EventBus, Logger } from '@wrongstack/core';\nimport type { DocumentTracker } from './document-tracker.js';\nimport { languageIdFor } from './language-detect.js';\nimport { nextReconnectDelay } from './server/lifecycle.js';\nimport { LSPServer } from './server/lsp-server.js';\nimport type { AutoStartMode, PlugLSPConfig } from './types.js';\nimport { LSPError, LSPErrorCode } from './types.js';\nimport { findWorkspaceRoot } from './workspace-root.js';\n\nexport interface RegistryContext {\n cwd: string;\n log: Logger;\n events: EventBus;\n}\n\nexport class LSPRegistry {\n private readonly servers = new Map<string, LSPServer>();\n private readonly languageIndex = new Map<string, string>();\n private readonly reconnectAttempts = new Map<string, number>();\n private readonly reconnectTimers = new Map<string, NodeJS.Timeout>();\n private cwd: string;\n private autoStart: AutoStartMode;\n\n constructor(\n private readonly cfg: PlugLSPConfig,\n private readonly tracker: DocumentTracker,\n private readonly ctx: RegistryContext,\n ) {\n this.cwd = ctx.cwd;\n /* v8 ignore next -- constructor assignment has no alternate behavior. */\n this.autoStart = cfg.autoStart;\n }\n\n async bind(cwd: string, autoStart: AutoStartMode = this.cfg.autoStart): Promise<void> {\n this.cwd = cwd;\n this.autoStart = autoStart;\n this.rebuildServers();\n if (autoStart === 'eager') {\n const languages = await detectProjectLanguages(cwd);\n await Promise.all(\n this.list()\n .filter((s) => s.config.languages.some((lang) => languages.has(lang)))\n .map((s) =>\n s.start().catch((err) => this.ctx.log.warn(`LSP ${s.name} failed to start`, err)),\n ),\n );\n }\n }\n\n async shutdown(): Promise<void> {\n for (const timer of this.reconnectTimers.values()) clearTimeout(timer);\n this.reconnectTimers.clear();\n await Promise.all(\n this.list().map((s) =>\n s.shutdown().catch((err) => this.ctx.log.warn(`LSP ${s.name} shutdown failed`, err)),\n ),\n );\n }\n\n async findForPath(filePath: string, signal?: AbortSignal): Promise<LSPServer | null> {\n if (this.servers.size === 0) this.rebuildServers();\n const language = languageIdFor(filePath);\n if (!language) return null;\n const name = this.languageIndex.get(language);\n if (!name) return null;\n const server = this.servers.get(name);\n if (!server) return null;\n if (server.state !== 'ready' && this.autoStart === 'lazy') {\n await server.start(signal);\n await this.tracker.reopenForServer(server);\n }\n return server.state === 'ready' ? server : null;\n }\n\n get(name: string): LSPServer | null {\n if (this.servers.size === 0) this.rebuildServers();\n return this.servers.get(name) ?? null;\n }\n\n list(): readonly LSPServer[] {\n if (this.servers.size === 0) this.rebuildServers();\n return Array.from(this.servers.values());\n }\n\n async start(name: string): Promise<void> {\n const server = this.getOrThrow(name);\n await server.start();\n await this.tracker.reopenForServer(server);\n }\n\n async stop(name: string): Promise<void> {\n await this.getOrThrow(name).shutdown();\n }\n\n async restart(name: string): Promise<void> {\n const server = this.getOrThrow(name);\n await server.shutdown();\n await server.start();\n await this.tracker.reopenForServer(server);\n }\n\n private rebuildServers(): void {\n this.servers.clear();\n this.languageIndex.clear();\n for (const [name, cfg] of Object.entries(this.cfg.servers)) {\n if (cfg.enabled === false) continue;\n const rootPath = findWorkspaceRoot(\n path.join(this.cwd, '__probe__'),\n cfg.rootPatterns,\n this.cwd,\n );\n const server = new LSPServer(name, cfg, {\n cwd: this.cwd,\n rootPath,\n log: this.ctx.log,\n events: this.ctx.events,\n onCrash: (crashed) => this.scheduleReconnect(crashed),\n });\n this.servers.set(name, server);\n for (const language of cfg.languages) {\n if (this.languageIndex.has(language)) {\n this.ctx.log.warn(\n `LSP language \"${language}\" is claimed by multiple servers; using first`,\n );\n continue;\n }\n this.languageIndex.set(language, name);\n }\n }\n }\n\n private getOrThrow(name: string): LSPServer {\n const server = this.get(name);\n if (!server) throw new LSPError(LSPErrorCode.ServerNotFound, `No LSP server named \"${name}\"`);\n return server;\n }\n\n private scheduleReconnect(server: LSPServer): void {\n if (this.reconnectTimers.has(server.name)) return;\n const attempt = this.reconnectAttempts.get(server.name) ?? 0;\n if (attempt >= 3) {\n this.ctx.log.warn(`LSP ${server.name} reconnect attempts exhausted`);\n return;\n }\n this.reconnectAttempts.set(server.name, attempt + 1);\n server.state = 'reconnecting';\n const timer = setTimeout(() => {\n this.reconnectTimers.delete(server.name);\n void server\n .start()\n .then(() => {\n this.reconnectAttempts.delete(server.name);\n return this.tracker.reopenForServer(server);\n })\n /* v8 ignore start -- reconnect failure exhaustion is timing-dependent; startup failure is covered separately. */\n .catch((err) => {\n this.ctx.log.warn(`LSP ${server.name} reconnect attempt ${attempt + 1} failed`, err);\n server.state = 'failed';\n this.scheduleReconnect(server);\n });\n /* v8 ignore stop */\n }, nextReconnectDelay(attempt));\n this.reconnectTimers.set(server.name, timer);\n }\n}\n\nasync function detectProjectLanguages(root: string): Promise<Set<string>> {\n const found = new Set<string>();\n const visit = async (dir: string, depth: number): Promise<void> => {\n if (depth > 3) return;\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n /* v8 ignore next -- unreadable directories depend on OS permissions. */\n } catch {\n return;\n }\n for (const entry of entries) {\n if (entry.name === 'node_modules' || entry.name === 'dist' || entry.name === '.git') continue;\n const p = path.join(dir, entry.name);\n if (entry.isDirectory()) await visit(p, depth + 1);\n else {\n const lang = languageIdFor(p);\n if (lang) found.add(lang);\n }\n }\n };\n await visit(root, 0);\n return found;\n}\n","import type { Diagnostic } from 'vscode-languageserver-protocol';\nimport type { SeverityName } from '../types.js';\nimport { displayPath } from '../utils/uri.js';\n\nconst SEVERITY: Record<number, SeverityName> = {\n 1: 'error',\n 2: 'warning',\n 3: 'info',\n 4: 'hint',\n};\n\nconst LABEL: Record<SeverityName, string> = {\n error: 'ERROR',\n warning: 'WARN',\n info: 'INFO',\n hint: 'HINT',\n};\n\nexport function formatDiagnostics(\n byFile: Map<string, Diagnostic[]>,\n opts: {\n cwd: string;\n severityFilter: SeverityName[];\n maxPerFile: number;\n maxTotal: number;\n },\n): string {\n const allowed = new Set(opts.severityFilter);\n const sections: string[] = [];\n let total = 0;\n let files = 0;\n for (const [file, diagnostics] of byFile.entries()) {\n const filtered = diagnostics\n /* v8 ignore next -- fallback handles invalid server severity values defensively. */\n .filter((d) => allowed.has(SEVERITY[d.severity ?? 1] ?? 'error'))\n .sort(compareDiagnostics)\n .slice(0, opts.maxPerFile);\n if (filtered.length === 0) continue;\n files++;\n total += filtered.length;\n const lines = filtered.map((d) => formatDiagnostic(d));\n sections.push(\n `${displayPath(file, opts.cwd)} (${filtered.length}):\\n${lines.map((l) => ` ${l}`).join('\\n')}`,\n );\n if (total >= opts.maxTotal) break;\n }\n if (sections.length === 0) return 'No LSP diagnostics.';\n return `${sections.join('\\n\\n')}\\n\\nTotal: ${total} diagnostics in ${files} files.`;\n}\n\nfunction formatDiagnostic(d: Diagnostic): string {\n /* v8 ignore next -- fallback handles invalid server severity values defensively. */\n const sev = SEVERITY[d.severity ?? 1] ?? 'error';\n const source = d.source ? ` ${d.source}${d.code !== undefined ? `(${String(d.code)})` : ''}` : '';\n const msg = d.message.replace(/\\s*\\r?\\n\\s*/g, ' | ');\n return `L${d.range.start.line + 1}:${d.range.start.character + 1} ${LABEL[sev]}${source}: ${msg}`;\n}\n\nfunction compareDiagnostics(a: Diagnostic, b: Diagnostic): number {\n return (\n (a.severity ?? 1) - (b.severity ?? 1) ||\n a.range.start.line - b.range.start.line ||\n a.range.start.character - b.range.start.character\n );\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport { formatDiagnostics } from '../formatters/diagnostics.js';\nimport type { LSPRegistry } from '../registry.js';\nimport { uriToPath } from '../utils/uri.js';\n\nexport function diagnosticsCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'diagnostics',\n description: 'Print buffered LSP diagnostics.',\n async run(_args, ctx) {\n const byFile = new Map<string, import('vscode-languageserver-protocol').Diagnostic[]>();\n for (const server of registry.list()) {\n for (const [uri, diagnostics] of server.diagnostics.entries()) {\n byFile.set(uriToPath(uri), diagnostics);\n }\n }\n return {\n message: formatDiagnostics(byFile, {\n cwd: ctx.cwd,\n severityFilter: ['error', 'warning'],\n maxPerFile: 10,\n maxTotal: 100,\n }),\n };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function listCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'list',\n description: 'List configured LSP servers.',\n async run() {\n const rows = registry.list().map((s) => {\n const langs = s.config.languages.join(',');\n return `${s.name.padEnd(18)} ${s.state.padEnd(14)} ${langs} ${s.rootPath}`;\n });\n return { message: rows.length ? rows.join('\\n') : 'No LSP servers configured.' };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function restartCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'restart',\n description: 'Restart an LSP server.',\n async run(args) {\n const name = args.trim();\n if (!name) return { message: 'Usage: /@wrongstack/plug-lsp:restart <name>' };\n await registry.restart(name);\n return { message: `Restarted LSP server \"${name}\".` };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function startCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'start',\n description: 'Start an LSP server.',\n async run(args) {\n const name = args.trim();\n if (!name) return { message: 'Usage: /@wrongstack/plug-lsp:start <name>' };\n await registry.start(name);\n return { message: `Started LSP server \"${name}\".` };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function stopCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'stop',\n description: 'Stop an LSP server.',\n async run(args) {\n const name = args.trim();\n if (!name) return { message: 'Usage: /@wrongstack/plug-lsp:stop <name>' };\n await registry.stop(name);\n return { message: `Stopped LSP server \"${name}\".` };\n },\n };\n}\n","import type { PluginAPI } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\nimport { diagnosticsCommand } from './diagnostics.js';\nimport { listCommand } from './list.js';\nimport { restartCommand } from './restart.js';\nimport { startCommand } from './start.js';\nimport { stopCommand } from './stop.js';\n\nexport function registerSlashCommands(api: PluginAPI, registry: LSPRegistry): string[] {\n const commands = [\n listCommand(registry),\n startCommand(registry),\n stopCommand(registry),\n restartCommand(registry),\n diagnosticsCommand(registry),\n ];\n for (const command of commands) api.slashCommands.register(command);\n return commands.map((cmd) => cmd.name);\n}\n","import type { TextEdit, WorkspaceEdit } from 'vscode-languageserver-protocol';\nimport { displayPath, uriToPath } from '../utils/uri.js';\n\nexport function summarizeWorkspaceEdit(edit: WorkspaceEdit, cwd: string): string {\n const entries = editsByPath(edit);\n if (entries.size === 0) return 'WorkspaceEdit contains no text edits.';\n let total = 0;\n const lines = ['Workspace edit:'];\n for (const [file, edits] of entries) {\n total += edits.length;\n lines.push(` ${displayPath(file, cwd)} ${edits.length} edit(s)`);\n }\n lines.push(`Total: ${total} edits across ${entries.size} files.`);\n return lines.join('\\n');\n}\n\nexport function editsByPath(edit: WorkspaceEdit): Map<string, TextEdit[]> {\n const out = new Map<string, TextEdit[]>();\n for (const [uri, edits] of Object.entries(edit.changes ?? {})) {\n out.set(uriToPath(uri), edits);\n }\n for (const change of edit.documentChanges ?? []) {\n if ('textDocument' in change && Array.isArray(change.edits)) {\n out.set(uriToPath(change.textDocument.uri), change.edits);\n }\n }\n return out;\n}\n","export interface LSPPosition {\n line: number;\n character: number;\n}\n\nexport interface HumanPosition {\n line: number;\n character: number;\n}\n\nexport interface LSPRange {\n start: LSPPosition;\n end: LSPPosition;\n}\n\nexport interface HumanRange {\n start: HumanPosition;\n end: HumanPosition;\n}\n\nexport function humanToLSP(content: string, pos: HumanPosition): LSPPosition {\n const lines = splitLines(content);\n const lineIdx = clamp(pos.line - 1, 0, Math.max(0, lines.length - 1));\n /* v8 ignore next -- splitLines always returns at least one line. */\n const line = lines[lineIdx] ?? '';\n const byteCol = clamp(pos.character - 1, 0, Buffer.byteLength(line, 'utf8'));\n let bytes = 0;\n let utf16 = 0;\n for (const ch of line) {\n const b = Buffer.byteLength(ch, 'utf8');\n if (bytes + b > byteCol) break;\n bytes += b;\n utf16 += ch.length;\n }\n return { line: lineIdx, character: utf16 };\n}\n\nexport function lspToHuman(content: string, pos: LSPPosition): HumanPosition {\n const lines = splitLines(content);\n const lineIdx = clamp(pos.line, 0, Math.max(0, lines.length - 1));\n /* v8 ignore next -- splitLines always returns at least one line. */\n const line = lines[lineIdx] ?? '';\n const utf16Col = clamp(pos.character, 0, line.length);\n let utf16 = 0;\n let bytes = 0;\n for (const ch of line) {\n if (utf16 + ch.length > utf16Col) break;\n utf16 += ch.length;\n bytes += Buffer.byteLength(ch, 'utf8');\n }\n return { line: lineIdx + 1, character: bytes + 1 };\n}\n\nexport function humanToLSPRange(content: string, range: HumanRange): LSPRange {\n return { start: humanToLSP(content, range.start), end: humanToLSP(content, range.end) };\n}\n\nexport function lspToHumanRange(content: string, range: LSPRange): HumanRange {\n return { start: lspToHuman(content, range.start), end: lspToHuman(content, range.end) };\n}\n\nexport function splitLines(content: string): string[] {\n if (content.length === 0) return [''];\n return content.split(/\\r\\n|\\r|\\n/);\n}\n\nfunction clamp(n: number, min: number, max: number): number {\n if (!Number.isFinite(n)) return min;\n return Math.max(min, Math.min(max, n));\n}\n","import type { ServerCapabilities } from 'vscode-languageserver-protocol';\n\nexport function supportsHover(cap: ServerCapabilities): boolean {\n return !!cap.hoverProvider;\n}\n\nexport function supportsDefinition(cap: ServerCapabilities): boolean {\n return !!cap.definitionProvider;\n}\n\nexport function supportsReferences(cap: ServerCapabilities): boolean {\n return !!cap.referencesProvider;\n}\n\nexport function supportsDocumentSymbol(cap: ServerCapabilities): boolean {\n return !!cap.documentSymbolProvider;\n}\n\nexport function supportsWorkspaceSymbol(cap: ServerCapabilities): boolean {\n return !!cap.workspaceSymbolProvider;\n}\n\nexport function supportsRename(cap: ServerCapabilities): boolean {\n return !!cap.renameProvider;\n}\n\nexport function supportsPrepareRename(cap: ServerCapabilities): boolean {\n const provider = cap.renameProvider;\n return typeof provider === 'object' && provider !== null && provider.prepareProvider === true;\n}\n\nexport function supportsCodeAction(cap: ServerCapabilities): boolean {\n return !!cap.codeActionProvider;\n}\n\nexport function supportsPullDiagnostics(cap: ServerCapabilities): boolean {\n return !!cap.diagnosticProvider;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Context, Logger } from '@wrongstack/core';\nimport type { DocumentTracker } from '../document-tracker.js';\nimport type { LSPRegistry } from '../registry.js';\nimport type { LSPServer } from '../server/lsp-server.js';\nimport type { PlugLSPConfig } from '../types.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\n\nexport interface ToolDeps {\n registry: LSPRegistry;\n tracker: DocumentTracker;\n cfg: PlugLSPConfig;\n log: Logger;\n}\n\nexport function resolveInputPath(inputPath: string, ctx: Context): string {\n return path.isAbsolute(inputPath) ? path.normalize(inputPath) : path.resolve(ctx.cwd, inputPath);\n}\n\nexport async function requireServer(\n registry: LSPRegistry,\n filePath: string,\n signal: AbortSignal,\n): Promise<LSPServer> {\n const server = await registry.findForPath(filePath, signal);\n if (!server) {\n throw new LSPError(LSPErrorCode.ServerNotFound, `No LSP server is configured for ${filePath}`);\n }\n return server;\n}\n\nexport async function readDocumentContent(\n filePath: string,\n tracker: DocumentTracker,\n): Promise<string> {\n const tracked = tracker.get(filePath);\n return tracked?.text ?? (await fs.readFile(filePath, 'utf8'));\n}\n\nexport function textDocumentPosition(\n uriPath: string,\n position: { line: number; character: number },\n) {\n return { textDocument: { uri: pathToUri(uriPath) }, position };\n}\n\nexport function stringifyToolError(err: unknown): string {\n if (err instanceof LSPError) return `[${err.code}] ${err.message}`;\n if (err instanceof Error) return `[${LSPErrorCode.ProtocolError}] ${err.message}`;\n return `[${LSPErrorCode.ProtocolError}] ${String(err)}`;\n}\n","import * as fs from 'node:fs/promises';\nimport { atomicWrite } from '@wrongstack/core';\nimport type { TextEdit, WorkspaceEdit } from 'vscode-languageserver-protocol';\nimport type { DocumentTracker } from '../document-tracker.js';\nimport { editsByPath } from '../formatters/workspace-edit.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\n\nexport interface ApplyWorkspaceEditResult {\n files: string[];\n edits: number;\n}\n\nexport async function applyWorkspaceEdit(\n edit: WorkspaceEdit,\n tracker: DocumentTracker,\n): Promise<ApplyWorkspaceEditResult> {\n const entries = editsByPath(edit);\n const ops: Array<{ path: string; original: string; next: string; edits: number }> = [];\n for (const [file, edits] of entries) {\n const original = await fs.readFile(file, 'utf8');\n ops.push({ path: file, original, next: applyTextEdits(original, edits), edits: edits.length });\n }\n\n const written: typeof ops = [];\n try {\n for (const op of ops) {\n await atomicWrite(op.path, op.next);\n written.push(op);\n }\n } catch (err) {\n /* v8 ignore start -- atomicWrite failures are OS-dependent; read failures are covered separately. */\n for (const op of written) {\n try {\n await atomicWrite(op.path, op.original);\n } catch {\n // best-effort rollback\n }\n }\n throw new LSPError(LSPErrorCode.ApplyEditFailed, 'Failed to apply workspace edit', err);\n /* v8 ignore stop */\n }\n\n for (const op of ops) await tracker.fileWritten(op.path);\n return { files: ops.map((op) => op.path), edits: ops.reduce((sum, op) => sum + op.edits, 0) };\n}\n\nexport function applyTextEdits(original: string, edits: TextEdit[]): string {\n const lineStarts = buildLineStarts(original);\n const sorted = [...edits].sort(\n (a, b) => offsetOf(b.range.start, lineStarts) - offsetOf(a.range.start, lineStarts),\n );\n let out = original;\n for (const edit of sorted) {\n const start = offsetOf(edit.range.start, lineStarts);\n const end = offsetOf(edit.range.end, lineStarts);\n out = out.slice(0, start) + edit.newText + out.slice(end);\n }\n return out;\n}\n\nfunction buildLineStarts(text: string): number[] {\n const starts = [0];\n for (let i = 0; i < text.length; i++) {\n const ch = text.charCodeAt(i);\n if (ch === 10) starts.push(i + 1);\n }\n return starts;\n}\n\nfunction offsetOf(pos: { line: number; character: number }, lineStarts: number[]): number {\n return (lineStarts[pos.line] ?? lineStarts[lineStarts.length - 1] ?? 0) + pos.character;\n}\n","import type { Tool } from '@wrongstack/core';\nimport type { CodeAction } from 'vscode-languageserver-protocol';\nimport { summarizeWorkspaceEdit } from '../formatters/workspace-edit.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsCodeAction } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\nimport { applyWorkspaceEdit } from './workspace-edit.js';\n\ninterface CodeActionsInput {\n path: string;\n line: number;\n character?: number;\n end_line?: number;\n end_character?: number;\n apply?: number;\n kind_filter?: string;\n}\n\nexport function createCodeActionsTool(deps: ToolDeps): Tool<CodeActionsInput, string> {\n return {\n name: 'lsp_code_actions',\n description: 'List or apply LSP code actions.',\n usageHint:\n 'Use to inspect quick fixes and refactors. This tool is confirm-gated because apply mode can mutate files.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n end_line: { type: 'integer' },\n end_character: { type: 'integer' },\n apply: { type: 'integer' },\n kind_filter: { type: 'string' },\n },\n required: ['path', 'line'],\n },\n permission: 'confirm',\n mutating: true,\n timeoutMs: 10_000,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsCodeAction(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support code actions`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const start = humanToLSP(content, { line: input.line, character: input.character ?? 1 });\n const end = humanToLSP(content, {\n line: input.end_line ?? input.line,\n character: input.end_character ?? input.character ?? 1,\n });\n const actions = await server.codeAction(\n {\n textDocument: { uri: pathToUri(file) },\n range: { start, end },\n context: {\n diagnostics: server.getDiagnostics(pathToUri(file)),\n only: input.kind_filter ? [input.kind_filter] : undefined,\n },\n },\n 10_000,\n opts.signal,\n );\n if (input.apply === undefined) return formatActions(actions);\n const action = actions[input.apply];\n if (!action) return `No code action at index ${input.apply}.`;\n const parts: string[] = [`Applying [${input.apply}] ${action.title}`];\n if (action.edit) {\n parts.push(summarizeWorkspaceEdit(action.edit, ctx.cwd));\n const applied = await applyWorkspaceEdit(action.edit, deps.tracker);\n parts.push(`Applied: ${applied.edits} edits across ${applied.files.length} files.`);\n }\n if (action.command) {\n await server.executeCommand(action.command, 10_000, opts.signal);\n parts.push(`Executed command: ${action.command.command}`);\n }\n return parts.join('\\n');\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n\nfunction formatActions(actions: CodeAction[]): string {\n if (actions.length === 0) return 'No code actions available.';\n return actions.map((a, i) => `[${i}] ${a.kind ?? 'action'} ${a.title}`).join('\\n');\n}\n","import type { Location, LocationLink } from 'vscode-languageserver-protocol';\nimport { displayPath, uriToPath } from '../utils/uri.js';\n\nexport function formatLocations(\n locations: Array<Location | LocationLink> | null,\n cwd: string,\n limit = 100,\n): string {\n if (!locations || locations.length === 0) return 'No locations found.';\n const lines = locations.slice(0, limit).map((loc) => {\n const uri = 'uri' in loc ? loc.uri : loc.targetUri;\n const range = 'range' in loc ? loc.range : loc.targetSelectionRange;\n return `${displayPath(uriToPath(uri), cwd)}:${range.start.line + 1}:${range.start.character + 1}`;\n });\n if (locations.length > limit) lines.push(`... truncated ${locations.length - limit} more`);\n return lines.join('\\n');\n}\n","import type { Tool } from '@wrongstack/core';\nimport { formatLocations } from '../formatters/location.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsDefinition } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\n\ninterface PositionInput {\n path: string;\n line: number;\n character: number;\n}\n\nexport function createDefinitionTool(deps: ToolDeps): Tool<PositionInput, string> {\n return {\n name: 'lsp_definition',\n description: 'Find where a symbol is defined.',\n usageHint:\n 'Use for semantic navigation when you know the symbol position. Lines and columns are 1-based.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n },\n required: ['path', 'line', 'character'],\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: 5000,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsDefinition(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support definition`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const position = humanToLSP(content, { line: input.line, character: input.character });\n const locs = await server.definition(\n { textDocument: { uri: pathToUri(file) }, position },\n 5000,\n opts.signal,\n );\n return formatLocations(locs, ctx.cwd);\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { Tool } from '@wrongstack/core';\nimport { formatDiagnostics } from '../formatters/diagnostics.js';\nimport { supportsPullDiagnostics } from '../server/capabilities.js';\nimport { pathToUri, uriToPath } from '../utils/uri.js';\nimport { type ToolDeps, requireServer, resolveInputPath, stringifyToolError } from './shared.js';\n\ninterface DiagnosticsInput {\n path?: string;\n limit?: number;\n}\n\nexport function createDiagnosticsTool(deps: ToolDeps): Tool<DiagnosticsInput, string> {\n return {\n name: 'lsp_diagnostics',\n description: 'Get diagnostics from configured language servers.',\n usageHint:\n 'Use after reading or editing a file when an LSP server is configured. Pass `path` for file diagnostics or omit it for tracked workspace diagnostics.',\n inputSchema: {\n type: 'object',\n properties: { path: { type: 'string' }, limit: { type: 'integer' } },\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: 5000,\n maxOutputBytes: 65_536,\n async execute(input, ctx, opts) {\n try {\n const byFile = new Map<string, import('vscode-languageserver-protocol').Diagnostic[]>();\n if (input.path) {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n const uri = pathToUri(file);\n const diagnostics =\n server.capabilities && supportsPullDiagnostics(server.capabilities)\n ? await server.pullDiagnostics(uri, 5000, opts.signal)\n : server.getDiagnostics(uri);\n byFile.set(file, diagnostics);\n } else {\n for (const doc of deps.tracker.list()) {\n const server = await deps.registry.findForPath(doc.path, opts.signal);\n if (!server) continue;\n byFile.set(uriToPath(doc.uri), server.getDiagnostics(doc.uri));\n }\n }\n return formatDiagnostics(byFile, {\n cwd: ctx.cwd,\n severityFilter: deps.cfg.severityFilter,\n maxPerFile: deps.cfg.maxDiagnosticsPerFile,\n maxTotal: input.limit ?? deps.cfg.maxDiagnosticsTotal,\n });\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { Hover, MarkedString, MarkupContent } from 'vscode-languageserver-protocol';\n\nexport function formatHover(hover: Hover | null, maxChars = 4096): string {\n if (!hover) return 'No hover information.';\n const text = hoverContentsToString(hover.contents).trim();\n if (!text) return 'No hover information.';\n return text.length > maxChars ? `${text.slice(0, maxChars)}\\n...[truncated]` : text;\n}\n\nfunction hoverContentsToString(contents: Hover['contents']): string {\n if (typeof contents === 'string') return contents;\n if (Array.isArray(contents)) return contents.map(markedStringToString).join('\\n\\n');\n if ('kind' in contents && 'value' in contents) return (contents as MarkupContent).value;\n return markedStringToString(contents as MarkedString);\n}\n\nfunction markedStringToString(value: MarkedString): string {\n if (typeof value === 'string') return value;\n return `\\`\\`\\`${value.language}\\n${value.value}\\n\\`\\`\\``;\n}\n","import type { Tool } from '@wrongstack/core';\nimport { formatHover } from '../formatters/hover.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsHover } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\n\ninterface HoverInput {\n path: string;\n line: number;\n character: number;\n}\n\nexport function createHoverTool(deps: ToolDeps): Tool<HoverInput, string> {\n return {\n name: 'lsp_hover',\n description: 'Get type information and documentation for a symbol.',\n usageHint: 'Use when you need a type/signature without opening the definition.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n },\n required: ['path', 'line', 'character'],\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: 5000,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsHover(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support hover`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const position = humanToLSP(content, { line: input.line, character: input.character });\n return formatHover(\n await server.hover(\n { textDocument: { uri: pathToUri(file) }, position },\n 5000,\n opts.signal,\n ),\n );\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { Tool } from '@wrongstack/core';\nimport { formatLocations } from '../formatters/location.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsReferences } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\n\ninterface ReferencesInput {\n path: string;\n line: number;\n character: number;\n include_declaration?: boolean;\n limit?: number;\n}\n\nexport function createReferencesTool(deps: ToolDeps): Tool<ReferencesInput, string> {\n return {\n name: 'lsp_references',\n description: 'Find references to a symbol.',\n usageHint: 'Use instead of grep when the symbol position is known; it is syntax-aware.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n include_declaration: { type: 'boolean' },\n limit: { type: 'integer' },\n },\n required: ['path', 'line', 'character'],\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: 10_000,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsReferences(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support references`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const position = humanToLSP(content, { line: input.line, character: input.character });\n const locs = await server.references(\n {\n textDocument: { uri: pathToUri(file) },\n position,\n context: { includeDeclaration: input.include_declaration ?? true },\n },\n 10_000,\n opts.signal,\n );\n return formatLocations(locs, ctx.cwd, input.limit ?? 100);\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { Tool } from '@wrongstack/core';\nimport { summarizeWorkspaceEdit } from '../formatters/workspace-edit.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsRename } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\nimport { applyWorkspaceEdit } from './workspace-edit.js';\n\ninterface RenameInput {\n path: string;\n line: number;\n character: number;\n new_name: string;\n}\n\nexport function createRenameTool(deps: ToolDeps): Tool<RenameInput, string> {\n return {\n name: 'lsp_rename',\n description: 'Rename a symbol semantically across the workspace.',\n usageHint:\n 'Prefer this over find-and-replace for functions, classes, variables, and types. This mutates files and requires confirmation.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n new_name: { type: 'string' },\n },\n required: ['path', 'line', 'character', 'new_name'],\n },\n permission: 'confirm',\n mutating: true,\n timeoutMs: 15_000,\n maxOutputBytes: 65_536,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsRename(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support rename`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const position = humanToLSP(content, { line: input.line, character: input.character });\n const edit = await server.rename(\n {\n textDocument: { uri: pathToUri(file) },\n position,\n newName: input.new_name,\n },\n 15_000,\n opts.signal,\n );\n if (!edit) return 'Rename produced no edits.';\n const summary = summarizeWorkspaceEdit(edit, ctx.cwd);\n const applied = await applyWorkspaceEdit(edit, deps.tracker);\n return `${summary}\\nApplied: ${applied.edits} edits across ${applied.files.length} files.`;\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { DocumentSymbol, SymbolInformation } from 'vscode-languageserver-protocol';\nimport { displayPath, uriToPath } from '../utils/uri.js';\n\nexport function formatDocumentSymbols(\n path: string,\n symbols: DocumentSymbol[] | SymbolInformation[] | null,\n cwd: string,\n): string {\n if (!symbols || symbols.length === 0) return 'No symbols found.';\n const lines = [`${displayPath(path, cwd)}:`];\n for (const sym of symbols) appendSymbol(lines, sym, 1, cwd);\n return lines.join('\\n');\n}\n\nexport function formatWorkspaceSymbols(\n symbols: SymbolInformation[] | null,\n query: string,\n cwd: string,\n limit = 100,\n): string {\n if (!symbols || symbols.length === 0) return `No symbols matching \"${query}\".`;\n const lines = [`${symbols.length} symbols matching \"${query}\":`];\n for (const sym of symbols.slice(0, limit)) {\n lines.push(\n ` ${kindName(sym.kind)} ${sym.name} ${displayPath(uriToPath(sym.location.uri), cwd)}:${sym.location.range.start.line + 1}`,\n );\n }\n if (symbols.length > limit) lines.push(` ... truncated ${symbols.length - limit} more`);\n return lines.join('\\n');\n}\n\nfunction appendSymbol(\n lines: string[],\n sym: DocumentSymbol | SymbolInformation,\n depth: number,\n cwd: string,\n): void {\n const indent = ' '.repeat(depth);\n if ('selectionRange' in sym) {\n lines.push(\n `${indent}${kindName(sym.kind)} ${sym.name} (L${sym.selectionRange.start.line + 1})`,\n );\n for (const child of sym.children ?? []) appendSymbol(lines, child, depth + 1, cwd);\n } else {\n lines.push(\n `${indent}${kindName(sym.kind)} ${sym.name} ${displayPath(uriToPath(sym.location.uri), cwd)}:${sym.location.range.start.line + 1}`,\n );\n }\n}\n\nfunction kindName(kind: number): string {\n return (\n [\n 'file',\n 'module',\n 'namespace',\n 'package',\n 'class',\n 'method',\n 'property',\n 'field',\n 'constructor',\n 'enum',\n 'interface',\n 'function',\n 'variable',\n 'constant',\n 'string',\n 'number',\n 'boolean',\n 'array',\n 'object',\n 'key',\n 'null',\n 'enumMember',\n 'struct',\n 'event',\n 'operator',\n 'typeParameter',\n ][kind - 1] ?? 'symbol'\n );\n}\n","import type { Tool } from '@wrongstack/core';\nimport type { SymbolInformation } from 'vscode-languageserver-protocol';\nimport { formatDocumentSymbols, formatWorkspaceSymbols } from '../formatters/symbols.js';\nimport { supportsDocumentSymbol, supportsWorkspaceSymbol } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport { type ToolDeps, requireServer, resolveInputPath, stringifyToolError } from './shared.js';\n\ninterface SymbolsInput {\n path?: string;\n query?: string;\n limit?: number;\n}\n\nexport function createSymbolsTool(deps: ToolDeps): Tool<SymbolsInput, string> {\n return {\n name: 'lsp_symbols',\n description: 'List symbols in a file or search workspace symbols.',\n usageHint: 'Pass `path` for a file outline, or `query` for workspace symbol search.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n query: { type: 'string' },\n limit: { type: 'integer' },\n },\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: 5000,\n async execute(input, ctx, opts) {\n try {\n if (input.path) {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsDocumentSymbol(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support document symbols`,\n );\n }\n const symbols = await server.documentSymbol(\n { textDocument: { uri: pathToUri(file) } },\n 5000,\n opts.signal,\n );\n return formatDocumentSymbols(file, symbols, ctx.cwd);\n }\n const query = input.query ?? '';\n const merged: SymbolInformation[] = [];\n for (const server of deps.registry.list()) {\n if (server.state !== 'ready') continue;\n if (server.capabilities && !supportsWorkspaceSymbol(server.capabilities)) continue;\n const result = await server.workspaceSymbol({ query }, 5000, opts.signal);\n if (result) merged.push(...result);\n }\n return formatWorkspaceSymbols(merged, query, ctx.cwd, input.limit ?? 100);\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { Tool } from '@wrongstack/core';\nimport { createCodeActionsTool } from './code-actions.js';\nimport { createDefinitionTool } from './definition.js';\nimport { createDiagnosticsTool } from './diagnostics.js';\nimport { createHoverTool } from './hover.js';\nimport { createReferencesTool } from './references.js';\nimport { createRenameTool } from './rename.js';\nimport type { ToolDeps } from './shared.js';\nimport { createSymbolsTool } from './symbols.js';\n\nexport function makeLSPTools(deps: ToolDeps): Tool[] {\n return [\n createDiagnosticsTool(deps),\n createDefinitionTool(deps),\n createReferencesTool(deps),\n createHoverTool(deps),\n createSymbolsTool(deps),\n createRenameTool(deps),\n createCodeActionsTool(deps),\n ];\n}\n","import type { Plugin } from '@wrongstack/core';\nimport { autoDiscoverServers } from './auto-discover.js';\nimport { PLUGIN_NAME, plugLspConfigSchema, readPlugLSPConfig } from './config.js';\nimport { DocumentTracker } from './document-tracker.js';\nimport { LSPRegistry } from './registry.js';\nimport { registerSlashCommands } from './slash-commands/index.js';\nimport { makeLSPTools } from './tools/index.js';\n\nexport type {\n AutoStartMode,\n DiagnosticsAfterEdit,\n PlugLSPConfig,\n ServerConfig,\n} from './types.js';\n\nlet teardownState: {\n offs: Array<() => void>;\n toolNames: string[];\n commandNames: string[];\n registry: LSPRegistry;\n tracker: DocumentTracker;\n} | null = null;\n\nconst plugin: Plugin = {\n name: PLUGIN_NAME,\n version: '0.1.0',\n description: 'Language Server Protocol tools for WrongStack.',\n apiVersion: '^0.1.1',\n capabilities: {\n tools: true,\n slashCommands: true,\n pipelines: [],\n },\n configSchema: plugLspConfigSchema,\n async setup(api) {\n const cfg = readPlugLSPConfig(api);\n const cwd = api.config.cwd ?? process.cwd();\n if (cfg.autoDiscover) {\n cfg.servers = await autoDiscoverServers(cfg.servers, cwd);\n }\n const holder: { registry?: LSPRegistry } = {};\n const tracker = new DocumentTracker(() => holder.registry!, api.log, cwd, api.events);\n const registry = new LSPRegistry(cfg, tracker, { cwd, log: api.log, events: api.events });\n holder.registry = registry;\n await registry.bind(cwd, cfg.autoStart);\n\n const tools = makeLSPTools({ registry, tracker, cfg, log: api.log });\n for (const tool of tools) api.tools.register(tool);\n const commandNames = registerSlashCommands(api, registry);\n\n const offs = [\n api.events.on('session.started', () => {\n const nextCwd = api.config.cwd ?? process.cwd();\n tracker.setCwd(nextCwd);\n void registry.bind(nextCwd, cfg.autoStart);\n }),\n api.events.on('session.ended', () => {\n void tracker.forceCloseAll().finally(() => registry.shutdown());\n }),\n api.events.on('tool.executed', (event) => {\n void tracker.handleToolExecuted(event);\n }),\n ];\n\n teardownState = {\n offs,\n toolNames: tools.map((t) => t.name),\n commandNames,\n registry,\n tracker,\n };\n },\n async teardown(api) {\n const state = teardownState;\n if (!state) return;\n teardownState = null;\n for (const off of state.offs) off();\n for (const name of state.toolNames) api.tools.unregister(name);\n for (const name of state.commandNames) api.slashCommands.unregister(`${PLUGIN_NAME}:${name}`);\n await state.tracker.forceCloseAll();\n await state.registry.shutdown();\n },\n};\n\nexport default plugin;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/presets.ts","../src/utils/command-resolver.ts","../src/auto-discover.ts","../src/config.ts","../src/language-detect.ts","../src/utils/uri.ts","../src/document-tracker.ts","../src/server/lifecycle.ts","../src/types.ts","../src/utils/safe-spawn.ts","../src/utils/timeout.ts","../src/server/connection.ts","../src/server/initialize.ts","../src/server/lsp-server.ts","../src/workspace-root.ts","../src/registry.ts","../src/formatters/diagnostics.ts","../src/slash-commands/diagnostics.ts","../src/slash-commands/list.ts","../src/slash-commands/restart.ts","../src/slash-commands/start.ts","../src/slash-commands/stop.ts","../src/slash-commands/index.ts","../src/formatters/workspace-edit.ts","../src/position.ts","../src/server/capabilities.ts","../src/tools/shared.ts","../src/tools/workspace-edit.ts","../src/tools/code-actions.ts","../src/formatters/location.ts","../src/tools/definition.ts","../src/tools/diagnostics.ts","../src/formatters/hover.ts","../src/tools/hover.ts","../src/tools/references.ts","../src/tools/rename.ts","../src/formatters/symbols.ts","../src/tools/symbols.ts","../src/tools/index.ts","../src/index.ts"],"names":["resolve","fs","path2","path3","path4","spawn","buildChildEnv","pathToFileURL","path5","path6","fs4","path7","fs5","fs6","path"],"mappings":"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","file":"index.js","sourcesContent":["import type { ServerConfig } from './types.js';\n\nexport const PRESETS: Record<string, ServerConfig> = {\n typescript: {\n command: 'typescript-language-server',\n args: ['--stdio'],\n languages: ['typescript', 'typescriptreact', 'javascript', 'javascriptreact'],\n rootPatterns: ['tsconfig.json', 'jsconfig.json', 'package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n gopls: {\n command: 'gopls',\n args: ['serve'],\n languages: ['go'],\n rootPatterns: ['go.mod', 'go.work'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n 'rust-analyzer': {\n command: 'rust-analyzer',\n languages: ['rust'],\n rootPatterns: ['Cargo.toml'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n pyright: {\n command: 'pyright-langserver',\n args: ['--stdio'],\n languages: ['python'],\n rootPatterns: ['pyproject.toml', 'pyrightconfig.json', 'setup.py', 'requirements.txt'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n json: {\n command: 'vscode-json-language-server',\n args: ['--stdio'],\n languages: ['json'],\n rootPatterns: ['package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n html: {\n command: 'vscode-html-language-server',\n args: ['--stdio'],\n languages: ['html'],\n rootPatterns: ['package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n css: {\n command: 'vscode-css-language-server',\n args: ['--stdio'],\n languages: ['css', 'scss'],\n rootPatterns: ['package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n yaml: {\n command: 'yaml-language-server',\n args: ['--stdio'],\n languages: ['yaml'],\n rootPatterns: ['package.json', '.git'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n bash: {\n command: 'bash-language-server',\n args: ['start'],\n languages: ['shellscript'],\n rootPatterns: ['package.json', '.git'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n 'ruby-lsp': {\n command: 'ruby-lsp',\n languages: ['ruby'],\n rootPatterns: ['Gemfile', '.ruby-version'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n};\n","import { spawn } from 'node:child_process';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { buildChildEnv } from '@wrongstack/core';\n\nexport async function resolveServerCommand(command: string, cwd: string): Promise<string | null> {\n const local = await findLocalBinary(cwd, command);\n if (local) return local;\n return (await commandExistsOnPath(command)) ? command : null;\n}\n\nexport async function findLocalBinary(cwd: string, command: string): Promise<string | null> {\n if (path.isAbsolute(command)) return (await fileExists(command)) ? path.normalize(command) : null;\n let dir = path.resolve(cwd);\n for (;;) {\n const binDir = path.join(dir, 'node_modules', '.bin');\n for (const candidate of commandCandidates(command)) {\n const full = path.join(binDir, candidate);\n if (await fileExists(full)) return full;\n }\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport async function commandExistsOnPath(command: string): Promise<boolean> {\n const probe = process.platform === 'win32' ? 'where.exe' : 'sh';\n const args =\n process.platform === 'win32' ? [command] : ['-lc', `command -v ${shellQuote(command)}`];\n return new Promise((resolve) => {\n const child = spawn(probe, args, { env: buildChildEnv(), stdio: 'ignore', windowsHide: true });\n child.on('error', () => resolve(false));\n child.on('close', (code) => resolve(code === 0));\n });\n}\n\nfunction commandCandidates(command: string): string[] {\n /* v8 ignore next -- platform-specific branch; covered on non-Windows CI. */\n if (process.platform !== 'win32') return [command];\n const ext = path.extname(command).toLowerCase();\n if (ext) return [command];\n return [`${command}.cmd`, `${command}.exe`, `${command}.bat`, command, `${command}.ps1`];\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction shellQuote(value: string): string {\n /* v8 ignore next -- only used by POSIX command probing. */\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n","import { PRESETS } from './presets.js';\nimport type { ServerConfig } from './types.js';\nimport { resolveServerCommand } from './utils/command-resolver.js';\n\nexport async function autoDiscoverServers(\n userServers: Record<string, ServerConfig>,\n cwd = process.cwd(),\n): Promise<Record<string, ServerConfig>> {\n const out = { ...userServers };\n for (const [name, cfg] of Object.entries(PRESETS)) {\n if (out[name]) continue;\n const command = await resolveServerCommand(cfg.command, cwd);\n if (command) out[name] = { ...cfg, command };\n }\n return out;\n}\n","import { type JSONSchema, type PluginAPI, TOKENS } from '@wrongstack/core';\nimport { PRESETS } from './presets.js';\nimport type { PlugLSPConfig, ServerConfig, SeverityName } from './types.js';\n\nexport const PLUGIN_NAME = '@wrongstack/plug-lsp';\n\nexport const DEFAULT_CONFIG: Omit<PlugLSPConfig, 'servers'> = {\n autoStart: 'lazy',\n diagnosticsAfterEdit: 'background',\n diagnosticsWaitMs: 1500,\n severityFilter: ['error', 'warning'],\n maxDiagnosticsPerFile: 5,\n maxDiagnosticsTotal: 50,\n autoDiscover: true,\n logServerOutput: false,\n};\n\nexport const plugLspConfigSchema: JSONSchema = {\n type: 'object',\n properties: {\n servers: { type: 'object' },\n autoStart: { type: 'string', enum: ['lazy', 'eager', 'never'] },\n diagnosticsAfterEdit: { type: 'string', enum: ['background', 'manual'] },\n diagnosticsWaitMs: { type: 'integer' },\n severityFilter: {\n type: 'array',\n items: { type: 'string', enum: ['error', 'warning', 'info', 'hint'] },\n },\n maxDiagnosticsPerFile: { type: 'integer' },\n maxDiagnosticsTotal: { type: 'integer' },\n autoDiscover: { type: 'boolean' },\n logServerOutput: { type: 'boolean' },\n },\n};\n\nexport function readPlugLSPConfig(api: PluginAPI): PlugLSPConfig {\n const fromStore = readFromConfigStore(api);\n const raw = fromStore ?? api.config.extensions?.[PLUGIN_NAME] ?? {};\n return mergeConfig(raw);\n}\n\nexport function mergeConfig(raw: Readonly<Record<string, unknown>>): PlugLSPConfig {\n const servers = normalizeServers(raw.servers);\n const severity = Array.isArray(raw.severityFilter)\n ? raw.severityFilter.filter(isSeverityName)\n : DEFAULT_CONFIG.severityFilter;\n\n return {\n servers,\n autoStart: oneOf(raw.autoStart, ['lazy', 'eager', 'never'], DEFAULT_CONFIG.autoStart),\n diagnosticsAfterEdit: oneOf(\n raw.diagnosticsAfterEdit,\n ['background', 'manual'],\n DEFAULT_CONFIG.diagnosticsAfterEdit,\n ),\n diagnosticsWaitMs: positiveInt(raw.diagnosticsWaitMs, DEFAULT_CONFIG.diagnosticsWaitMs),\n severityFilter: severity.length > 0 ? severity : DEFAULT_CONFIG.severityFilter,\n maxDiagnosticsPerFile: positiveInt(\n raw.maxDiagnosticsPerFile,\n DEFAULT_CONFIG.maxDiagnosticsPerFile,\n ),\n maxDiagnosticsTotal: positiveInt(raw.maxDiagnosticsTotal, DEFAULT_CONFIG.maxDiagnosticsTotal),\n autoDiscover:\n typeof raw.autoDiscover === 'boolean' ? raw.autoDiscover : DEFAULT_CONFIG.autoDiscover,\n logServerOutput:\n typeof raw.logServerOutput === 'boolean'\n ? raw.logServerOutput\n : DEFAULT_CONFIG.logServerOutput,\n };\n}\n\nfunction readFromConfigStore(api: PluginAPI): Readonly<Record<string, unknown>> | undefined {\n if (!api.container.has(TOKENS.ConfigStore)) return undefined;\n try {\n return api.container.resolve(TOKENS.ConfigStore).getExtension(PLUGIN_NAME);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeServers(value: unknown): Record<string, ServerConfig> {\n if (!isRecord(value)) return {};\n const out: Record<string, ServerConfig> = {};\n for (const [name, raw] of Object.entries(value)) {\n if (!isRecord(raw)) continue;\n if (typeof raw.command !== 'string') continue;\n if (!Array.isArray(raw.languages) || raw.languages.some((x) => typeof x !== 'string')) {\n continue;\n }\n out[name] = {\n command: raw.command,\n args: stringArray(raw.args),\n env: stringRecord(raw.env),\n languages: raw.languages,\n rootPatterns: stringArray(raw.rootPatterns),\n initializationOptions: raw.initializationOptions,\n settings: raw.settings,\n startupTimeoutMs: positiveInt(raw.startupTimeoutMs, 15_000),\n enabled: typeof raw.enabled === 'boolean' ? raw.enabled : true,\n };\n }\n return out;\n}\n\nexport function withPresetFallbacks(cfg: PlugLSPConfig): PlugLSPConfig {\n const typescript = PRESETS.typescript;\n return {\n ...cfg,\n servers: Object.keys(cfg.servers).length > 0 || !typescript ? cfg.servers : { typescript },\n };\n}\n\nfunction oneOf<T extends string>(value: unknown, allowed: readonly T[], fallback: T): T {\n return typeof value === 'string' && allowed.includes(value as T) ? (value as T) : fallback;\n}\n\nfunction positiveInt(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isInteger(value) && value > 0 ? value : fallback;\n}\n\nfunction stringArray(value: unknown): string[] | undefined {\n return Array.isArray(value) && value.every((x) => typeof x === 'string') ? value : undefined;\n}\n\nfunction stringRecord(value: unknown): Record<string, string> | undefined {\n if (!isRecord(value)) return undefined;\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(value)) {\n if (typeof v === 'string') out[k] = v;\n }\n return out;\n}\n\nfunction isSeverityName(value: unknown): value is SeverityName {\n return value === 'error' || value === 'warning' || value === 'info' || value === 'hint';\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import * as path from 'node:path';\n\nexport const LANGUAGE_MAP: Readonly<Record<string, string>> = {\n '.ts': 'typescript',\n '.tsx': 'typescriptreact',\n '.js': 'javascript',\n '.jsx': 'javascriptreact',\n '.mjs': 'javascript',\n '.cjs': 'javascript',\n '.go': 'go',\n '.rs': 'rust',\n '.py': 'python',\n '.pyi': 'python',\n '.rb': 'ruby',\n '.java': 'java',\n '.kt': 'kotlin',\n '.swift': 'swift',\n '.c': 'c',\n '.h': 'c',\n '.cpp': 'cpp',\n '.cc': 'cpp',\n '.cxx': 'cpp',\n '.hpp': 'cpp',\n '.cs': 'csharp',\n '.lua': 'lua',\n '.zig': 'zig',\n '.php': 'php',\n '.json': 'json',\n '.html': 'html',\n '.css': 'css',\n '.scss': 'scss',\n '.yml': 'yaml',\n '.yaml': 'yaml',\n '.sh': 'shellscript',\n '.bash': 'shellscript',\n};\n\nconst FILENAME_MAP: Readonly<Record<string, string>> = {\n Dockerfile: 'dockerfile',\n Makefile: 'makefile',\n 'CMakeLists.txt': 'cmake',\n 'tsconfig.json': 'json',\n 'package.json': 'json',\n};\n\nexport function languageIdFor(filePath: string): string | null {\n const base = path.basename(filePath);\n const exact = FILENAME_MAP[base];\n if (exact) return exact;\n\n if (base.endsWith('.test.ts') || base.endsWith('.spec.ts')) return 'typescript';\n if (base.endsWith('.test.tsx') || base.endsWith('.spec.tsx')) return 'typescriptreact';\n if (base.endsWith('.test.js') || base.endsWith('.spec.js')) return 'javascript';\n if (base.endsWith('.test.jsx') || base.endsWith('.spec.jsx')) return 'javascriptreact';\n\n return LANGUAGE_MAP[path.extname(base)] ?? null;\n}\n","import * as path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\n\nexport function pathToUri(filePath: string): string {\n return pathToFileURL(path.resolve(filePath)).toString();\n}\n\nexport function uriToPath(uri: string): string {\n return fileURLToPath(uri);\n}\n\nexport function displayPath(filePath: string, cwd: string): string {\n const rel = path.relative(cwd, filePath);\n return rel && !rel.startsWith('..') && !path.isAbsolute(rel) ? rel.replace(/\\\\/g, '/') : filePath;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { EventBus, EventMap, Logger } from '@wrongstack/core';\nimport type { TextDocumentItem } from 'vscode-languageserver-protocol';\nimport { languageIdFor } from './language-detect.js';\nimport type { LSPRegistry } from './registry.js';\nimport type { LSPServer } from './server/lsp-server.js';\nimport type { TrackedDocument } from './types.js';\nimport { pathToUri } from './utils/uri.js';\n\nexport class DocumentTracker {\n private readonly docs = new Map<string, TrackedDocument>();\n private cwd: string;\n\n constructor(\n private readonly registry: () => LSPRegistry,\n private readonly log: Logger,\n cwd: string,\n private readonly events?: EventBus,\n ) {\n this.cwd = cwd;\n }\n\n setCwd(cwd: string): void {\n this.cwd = cwd;\n }\n\n async handleToolExecuted(event: EventMap['tool.executed']): Promise<void> {\n if (!event.ok) return;\n if (event.name !== 'read' && event.name !== 'edit' && event.name !== 'write') return;\n const input = event.input as { path?: unknown } | undefined;\n if (!input || typeof input.path !== 'string') return;\n const absPath = this.resolve(input.path);\n if (event.name === 'read') await this.open(absPath);\n else await this.fileWritten(absPath);\n }\n\n async fileWritten(filePath: string): Promise<void> {\n const absPath = this.resolve(filePath);\n const languageId = languageIdFor(absPath);\n if (!languageId) return;\n let text: string;\n try {\n text = await fs.readFile(absPath, 'utf8');\n } catch (err) {\n this.log.debug(`LSP tracker could not read changed file ${absPath}`, err);\n return;\n }\n const doc = this.docs.get(absPath);\n if (!doc) {\n await this.open(absPath, text);\n return;\n }\n doc.version++;\n doc.text = text;\n for (const server of this.registry().list()) {\n /* v8 ignore next -- false branch is defensive for mixed registries. */\n if (server.state !== 'ready' || !server.config.languages.includes(languageId)) continue;\n server.notifyDidChange({ uri: doc.uri, version: doc.version }, text);\n doc.serverNames.add(server.name);\n }\n }\n\n async open(filePath: string, knownText?: string): Promise<void> {\n const absPath = this.resolve(filePath);\n const languageId = languageIdFor(absPath);\n if (!languageId) return;\n const text = knownText ?? (await fs.readFile(absPath, 'utf8'));\n let doc = this.docs.get(absPath);\n /* v8 ignore next -- both create and existing paths are covered; branch accounting is source-map noisy. */\n if (!doc) {\n doc = {\n uri: pathToUri(absPath),\n path: absPath,\n languageId,\n version: 1,\n text,\n serverNames: new Set(),\n };\n this.docs.set(absPath, doc);\n this.events?.emit('lsp.document.opened', { path: absPath, language: languageId });\n }\n for (const server of this.registry().list()) {\n if (server.state !== 'ready' || !server.config.languages.includes(languageId)) continue;\n /* v8 ignore next -- duplicate-open guard is defensive/idempotent. */\n if (doc.serverNames.has(server.name)) continue;\n server.notifyDidOpen(toTextDocumentItem(doc));\n doc.serverNames.add(server.name);\n }\n }\n\n async reopenForServer(server: LSPServer): Promise<void> {\n /* v8 ignore next -- non-ready guard is covered but branch accounting is source-map noisy. */\n if (server.state !== 'ready') return;\n for (const doc of this.docs.values()) {\n /* v8 ignore next -- mixed-language registries are covered elsewhere. */\n if (!server.config.languages.includes(doc.languageId)) continue;\n server.notifyDidOpen(toTextDocumentItem(doc));\n doc.serverNames.add(server.name);\n }\n }\n\n async forceCloseAll(): Promise<void> {\n for (const doc of this.docs.values()) {\n for (const server of this.registry().list()) {\n /* v8 ignore next -- close only applies to ready servers that saw the doc. */\n if (server.state === 'ready' && doc.serverNames.has(server.name)) {\n server.notifyDidClose(doc.uri);\n this.events?.emit('lsp.document.closed', { path: doc.path });\n }\n }\n }\n this.docs.clear();\n }\n\n get(filePath: string): TrackedDocument | null {\n return this.docs.get(this.resolve(filePath)) ?? null;\n }\n\n list(): readonly TrackedDocument[] {\n return Array.from(this.docs.values());\n }\n\n private resolve(filePath: string): string {\n return path.isAbsolute(filePath) ? path.normalize(filePath) : path.resolve(this.cwd, filePath);\n }\n}\n\nfunction toTextDocumentItem(doc: TrackedDocument): TextDocumentItem {\n return {\n uri: doc.uri,\n languageId: doc.languageId,\n version: doc.version,\n text: doc.text,\n };\n}\n","import type { ServerState } from '../types.js';\n\nconst ALLOWED: Record<ServerState, ServerState[]> = {\n disabled: ['starting'],\n starting: ['initializing', 'failed', 'exited'],\n initializing: ['ready', 'failed', 'exited'],\n ready: ['shutting_down', 'failed', 'exited'],\n failed: ['reconnecting', 'disabled', 'starting'],\n reconnecting: ['starting', 'failed'],\n shutting_down: ['exited', 'failed'],\n exited: ['starting', 'disabled'],\n};\n\nexport function canTransition(from: ServerState, to: ServerState): boolean {\n return from === to || ALLOWED[from].includes(to);\n}\n\nexport function nextReconnectDelay(attempt: number): number {\n /* v8 ignore next -- array fallback is defensive after clamping. */\n return [1000, 4000, 16_000][Math.max(0, Math.min(2, attempt))] ?? 16_000;\n}\n","export type {\n CodeAction,\n Diagnostic,\n DocumentSymbol,\n Hover,\n Location,\n LocationLink,\n Range,\n ServerCapabilities,\n SymbolInformation,\n WorkspaceEdit,\n} from 'vscode-languageserver-protocol';\n\nexport type AutoStartMode = 'lazy' | 'eager' | 'never';\nexport type DiagnosticsAfterEdit = 'background' | 'manual';\nexport type SeverityName = 'error' | 'warning' | 'info' | 'hint';\n\nexport interface ServerConfig {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n languages: string[];\n rootPatterns?: string[];\n initializationOptions?: unknown;\n settings?: unknown;\n startupTimeoutMs?: number;\n enabled?: boolean;\n}\n\nexport interface PlugLSPConfig {\n servers: Record<string, ServerConfig>;\n autoStart: AutoStartMode;\n diagnosticsAfterEdit: DiagnosticsAfterEdit;\n diagnosticsWaitMs: number;\n severityFilter: SeverityName[];\n maxDiagnosticsPerFile: number;\n maxDiagnosticsTotal: number;\n autoDiscover: boolean;\n logServerOutput: boolean;\n}\n\nexport type ServerState =\n | 'disabled'\n | 'starting'\n | 'initializing'\n | 'ready'\n | 'failed'\n | 'shutting_down'\n | 'exited'\n | 'reconnecting';\n\nexport interface TrackedDocument {\n uri: string;\n path: string;\n languageId: string;\n version: number;\n text: string;\n serverNames: Set<string>;\n}\n\nexport enum LSPErrorCode {\n ServerNotFound = 'LSP_SERVER_NOT_FOUND',\n ServerNotReady = 'LSP_SERVER_NOT_READY',\n ServerFailed = 'LSP_SERVER_FAILED',\n CapabilityMissing = 'LSP_CAPABILITY_MISSING',\n RequestTimeout = 'LSP_REQUEST_TIMEOUT',\n InvalidPosition = 'LSP_INVALID_POSITION',\n ProtocolError = 'LSP_PROTOCOL_ERROR',\n ApplyEditFailed = 'LSP_APPLY_EDIT_FAILED',\n}\n\nexport class LSPError extends Error {\n constructor(\n readonly code: LSPErrorCode,\n message: string,\n readonly details?: unknown,\n ) {\n super(message);\n this.name = 'LSPError';\n }\n}\n\ndeclare module '@wrongstack/core' {\n interface EventMap {\n 'lsp.server.starting': { name: string; command: string };\n 'lsp.server.ready': { name: string; languages: string[] };\n 'lsp.server.exited': { name: string; code: number | null; signal: string | null };\n 'lsp.server.crashed': { name: string; error: string };\n 'lsp.diagnostics.updated': { path: string; count: number };\n 'lsp.document.opened': { path: string; language: string };\n 'lsp.document.closed': { path: string };\n }\n}\n","import { type ChildProcessWithoutNullStreams, spawn } from 'node:child_process';\nimport type { ServerConfig } from '../types.js';\nimport { buildChildEnv } from '@wrongstack/core';\n\nexport function safeSpawn(cfg: ServerConfig, cwd: string): ChildProcessWithoutNullStreams {\n /* v8 ignore next -- platform-specific branch differs between Windows and POSIX. */\n const shell = process.platform === 'win32' && /\\.(cmd|bat)$/i.test(cfg.command);\n return spawn(cfg.command, cfg.args ?? [], {\n cwd,\n env: buildChildEnv({ extra: cfg.env }),\n stdio: ['pipe', 'pipe', 'pipe'],\n shell,\n windowsHide: true,\n });\n}\n","import { LSPError, LSPErrorCode } from '../types.js';\n\nexport async function promiseWithTimeout<T>(\n promise: Promise<T>,\n ms: number,\n signal?: AbortSignal,\n): Promise<T> {\n if (signal?.aborted) throw abortError(signal);\n let timer: NodeJS.Timeout | undefined;\n return await new Promise<T>((resolve, reject) => {\n const cleanup = () => {\n if (timer) clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n };\n const onAbort = () => {\n cleanup();\n reject(abortError(signal));\n };\n timer = setTimeout(() => {\n cleanup();\n reject(new LSPError(LSPErrorCode.RequestTimeout, `LSP request timed out after ${ms}ms`));\n }, ms);\n signal?.addEventListener('abort', onAbort, { once: true });\n promise.then(\n (value) => {\n cleanup();\n resolve(value);\n },\n (err) => {\n cleanup();\n reject(err);\n },\n );\n });\n}\n\nfunction abortError(signal?: AbortSignal): Error {\n return signal?.reason instanceof Error ? signal.reason : new Error('aborted');\n}\n","import { EventEmitter } from 'node:events';\nimport type { Readable, Writable } from 'node:stream';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { promiseWithTimeout } from '../utils/timeout.js';\n\ninterface JsonRpcMessage {\n jsonrpc: '2.0';\n id?: number | string | null;\n method?: string;\n params?: unknown;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n}\n\ninterface Pending {\n resolve(value: unknown): void;\n reject(err: unknown): void;\n}\n\nexport class Connection {\n private nextId = 1;\n private readonly pending = new Map<number, Pending>();\n private readonly events = new EventEmitter();\n private buffer = Buffer.alloc(0);\n private closed = false;\n\n constructor(\n private readonly stdin: Writable,\n stdout: Readable,\n ) {\n stdout.on('data', (chunk: Buffer) => this.onData(chunk));\n stdout.on('close', () => this.close());\n stdout.on('error', (err) => this.failAll(err));\n }\n\n async sendRequest<R>(\n method: string,\n params: unknown,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<R> {\n this.assertOpen();\n const id = this.nextId++;\n const request: JsonRpcMessage = { jsonrpc: '2.0', id, method, params };\n const response = new Promise<R>((resolve, reject) => {\n this.pending.set(id, { resolve: resolve as (value: unknown) => void, reject });\n this.write(request);\n });\n try {\n return await promiseWithTimeout(response, timeoutMs, signal);\n } catch (err) {\n this.pending.delete(id);\n if (signal.aborted) {\n try {\n this.sendNotification('$/cancelRequest', { id });\n } catch {\n // ignore cancellation write failure\n }\n }\n throw normalizeError(err);\n }\n }\n\n sendNotification(method: string, params: unknown): void {\n this.assertOpen();\n this.write({ jsonrpc: '2.0', method, params });\n }\n\n onNotification(method: string, handler: (params: unknown) => void): () => void {\n this.events.on(method, handler);\n return () => this.events.off(method, handler);\n }\n\n onClose(handler: () => void): () => void {\n this.events.on('close', handler);\n return () => this.events.off('close', handler);\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.failAll(new LSPError(LSPErrorCode.ProtocolError, 'LSP connection closed'));\n this.events.emit('close');\n }\n\n private onData(chunk: Buffer): void {\n // Cap the receive buffer so a misbehaving server that floods data\n // without proper Content-Length headers can't exhaust memory.\n const MAX_BUFFER = 16 * 1024 * 1024; // 16 MiB\n if (this.buffer.length + chunk.length > MAX_BUFFER) {\n this.close();\n return;\n }\n this.buffer = Buffer.concat([this.buffer, chunk]);\n for (;;) {\n const sep = this.buffer.indexOf('\\r\\n\\r\\n');\n if (sep === -1) return;\n const header = this.buffer.subarray(0, sep).toString('ascii');\n const match = /Content-Length:\\s*(\\d+)/i.exec(header);\n if (!match) {\n this.buffer = this.buffer.subarray(sep + 4);\n continue;\n }\n const length = Number(match[1]);\n // Reject NaN, negative, or absurd lengths. Without this a\n // Content-Length: abc slips past as NaN and permanently stalls\n // the message parser.\n if (!Number.isFinite(length) || length < 0 || length > MAX_BUFFER) {\n this.buffer = this.buffer.subarray(sep + 4);\n continue;\n }\n const total = sep + 4 + length;\n if (this.buffer.length < total) return;\n const body = this.buffer.subarray(sep + 4, total).toString('utf8');\n this.buffer = this.buffer.subarray(total);\n try {\n this.handleMessage(JSON.parse(body) as JsonRpcMessage);\n } catch {\n // Malformed server output should not take down the agent.\n }\n }\n }\n\n private handleMessage(msg: JsonRpcMessage): void {\n if (msg.id !== undefined && msg.id !== null && !msg.method) {\n const id = Number(msg.id);\n const pending = this.pending.get(id);\n if (!pending) return;\n this.pending.delete(id);\n if (msg.error)\n pending.reject(new LSPError(LSPErrorCode.ProtocolError, msg.error.message, msg.error));\n else pending.resolve(msg.result);\n return;\n }\n if (msg.method) this.events.emit(msg.method, msg.params);\n }\n\n private write(message: JsonRpcMessage): void {\n const body = JSON.stringify(message);\n const bytes = Buffer.byteLength(body, 'utf8');\n this.stdin.write(`Content-Length: ${bytes}\\r\\n\\r\\n${body}`, 'utf8');\n }\n\n private assertOpen(): void {\n if (this.closed) throw new LSPError(LSPErrorCode.ProtocolError, 'LSP connection is closed');\n }\n\n private failAll(err: unknown): void {\n for (const pending of this.pending.values()) pending.reject(normalizeError(err));\n this.pending.clear();\n }\n}\n\nfunction normalizeError(err: unknown): Error {\n if (err instanceof Error) return err;\n /* v8 ignore next -- Node stream errors are Error objects; retained for protocol safety. */\n return new LSPError(LSPErrorCode.ProtocolError, String(err));\n}\n","import { pathToFileURL } from 'node:url';\nimport type {\n InitializeParams,\n InitializeResult,\n ServerCapabilities,\n} from 'vscode-languageserver-protocol';\nimport type { ServerConfig } from '../types.js';\nimport type { Connection } from './connection.js';\n\nexport const CLIENT_CAPABILITIES: InitializeParams['capabilities'] = {\n workspace: {\n workspaceFolders: true,\n didChangeWatchedFiles: { dynamicRegistration: false },\n symbol: {},\n executeCommand: { dynamicRegistration: false },\n },\n textDocument: {\n synchronization: {\n didSave: false,\n dynamicRegistration: false,\n willSave: false,\n willSaveWaitUntil: false,\n },\n diagnostic: { dynamicRegistration: false },\n definition: { linkSupport: true },\n references: {},\n hover: { contentFormat: ['markdown', 'plaintext'] },\n documentSymbol: { hierarchicalDocumentSymbolSupport: true },\n rename: { prepareSupport: true },\n codeAction: {},\n },\n general: { positionEncodings: ['utf-16'] },\n};\n\nexport async function initializeServer(\n connection: Connection,\n serverCfg: ServerConfig,\n rootPath: string,\n timeoutMs: number,\n signal: AbortSignal,\n): Promise<ServerCapabilities> {\n const rootUri = pathToFileURL(rootPath).toString();\n const params: InitializeParams = {\n processId: process.pid,\n rootPath,\n rootUri,\n capabilities: CLIENT_CAPABILITIES,\n initializationOptions: serverCfg.initializationOptions,\n workspaceFolders: [\n {\n uri: rootUri,\n name:\n rootPath\n .split(/[\\\\/]/)\n .pop() /* v8 ignore next */ ?? rootPath,\n },\n ],\n };\n const result = await connection.sendRequest<InitializeResult>(\n 'initialize',\n params,\n timeoutMs,\n signal,\n );\n connection.sendNotification('initialized', {});\n return result.capabilities;\n}\n","import type { ChildProcessWithoutNullStreams } from 'node:child_process';\nimport type { EventBus, Logger } from '@wrongstack/core';\nimport type {\n CodeAction,\n CodeActionParams,\n Diagnostic,\n DocumentSymbol,\n DocumentSymbolParams,\n ExecuteCommandParams,\n Hover,\n HoverParams,\n Location,\n LocationLink,\n Position,\n PrepareRenameParams,\n ReferenceParams,\n RenameParams,\n ServerCapabilities,\n SymbolInformation,\n TextDocumentItem,\n VersionedTextDocumentIdentifier,\n WorkspaceEdit,\n WorkspaceSymbolParams,\n} from 'vscode-languageserver-protocol';\nimport type { ServerConfig, ServerState } from '../types.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { safeSpawn } from '../utils/safe-spawn.js';\nimport { pathToUri, uriToPath } from '../utils/uri.js';\nimport { Connection } from './connection.js';\nimport { initializeServer } from './initialize.js';\n\nexport interface ServerContext {\n cwd: string;\n rootPath: string;\n log: Logger;\n events: EventBus;\n onCrash?: (server: LSPServer) => void;\n}\n\nexport class LSPServer {\n state: ServerState = 'exited';\n capabilities: ServerCapabilities | null = null;\n readonly diagnostics = new Map<string, Diagnostic[]>();\n private child: ChildProcessWithoutNullStreams | null = null;\n private connection: Connection | null = null;\n private processReachedReady = false;\n private stderrRing: string[] = [];\n\n constructor(\n readonly name: string,\n readonly config: ServerConfig,\n private readonly ctx: ServerContext,\n ) {\n if (config.enabled === false) this.state = 'disabled';\n }\n\n get rootPath(): string {\n return this.ctx.rootPath;\n }\n\n get lastStderr(): string {\n return this.stderrRing.slice(-20).join('\\n');\n }\n\n async start(signal: AbortSignal = new AbortController().signal): Promise<void> {\n if (this.state === 'ready' || this.state === 'starting' || this.state === 'initializing')\n return;\n if (this.config.enabled === false) {\n this.state = 'disabled';\n return;\n }\n this.state = 'starting';\n this.processReachedReady = false;\n this.ctx.events.emit('lsp.server.starting', { name: this.name, command: this.config.command });\n const child = safeSpawn(this.config, this.ctx.rootPath);\n this.child = child;\n child.stderr.on('data', (chunk: Buffer) => this.captureStderr(chunk));\n child.on('exit', (code, sig) => {\n const shouldReconnect = this.processReachedReady;\n this.connection?.close();\n this.connection = null;\n this.child = null;\n if (this.state !== 'shutting_down' && this.state !== 'exited') {\n this.state = 'failed';\n this.ctx.events.emit('lsp.server.crashed', {\n name: this.name,\n error: `process exited code=${code ?? 'null'} signal=${sig ?? 'null'}`,\n });\n if (shouldReconnect) this.ctx.onCrash?.(this);\n }\n this.ctx.events.emit('lsp.server.exited', { name: this.name, code, signal: sig });\n this.processReachedReady = false;\n });\n child.on('error', (err) => {\n const shouldReconnect = this.processReachedReady;\n this.state = 'failed';\n this.ctx.events.emit('lsp.server.crashed', { name: this.name, error: err.message });\n if (shouldReconnect) this.ctx.onCrash?.(this);\n this.processReachedReady = false;\n });\n\n this.connection = new Connection(child.stdin, child.stdout);\n this.connection.onNotification('textDocument/publishDiagnostics', (params) => {\n const p = params as { uri?: string; diagnostics?: Diagnostic[] };\n if (!p.uri || !Array.isArray(p.diagnostics)) return;\n this.diagnostics.set(p.uri, p.diagnostics);\n this.ctx.events.emit('lsp.diagnostics.updated', {\n path: p.uri.startsWith('file:') ? uriToPath(p.uri) : p.uri,\n count: p.diagnostics.length,\n });\n });\n this.connection.onNotification('window/logMessage', (params) => {\n if (this.config.enabled !== false && params && this.config) {\n this.ctx.log.debug(`LSP ${this.name} log`, params);\n }\n });\n this.connection.onClose(() => {\n if (this.state === 'ready') this.state = 'failed';\n });\n\n this.state = 'initializing';\n const startup = startupFailure(child);\n try {\n this.capabilities = await Promise.race([\n initializeServer(\n this.connection,\n this.config,\n this.ctx.rootPath,\n this.config.startupTimeoutMs ?? 15_000,\n signal,\n ),\n startup.promise,\n ]);\n startup.cancel();\n this.state = 'ready';\n this.processReachedReady = true;\n this.ctx.events.emit('lsp.server.ready', {\n name: this.name,\n languages: this.config.languages,\n });\n } catch (err) {\n startup.cancel();\n this.state = 'failed';\n this.connection?.close();\n this.child?.kill();\n this.processReachedReady = false;\n throw err;\n }\n }\n\n async shutdown(): Promise<void> {\n if (this.state === 'exited' || this.state === 'disabled') return;\n this.state = 'shutting_down';\n try {\n if (this.connection) {\n const ctrl = new AbortController();\n await this.connection\n .sendRequest('shutdown', null, 3000, ctrl.signal)\n .catch(() => undefined);\n this.connection.sendNotification('exit', null);\n }\n } finally {\n this.connection?.close();\n this.connection = null;\n if (this.child && !this.child.killed) this.child.kill();\n this.child = null;\n this.processReachedReady = false;\n this.state = 'exited';\n }\n }\n\n async definition(\n params: TextDocumentPositionParamsLike,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<Location[] | LocationLink[] | null> {\n return await this.request('textDocument/definition', params, timeoutMs, signal);\n }\n\n async references(\n params: ReferenceParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<Location[] | null> {\n return await this.request('textDocument/references', params, timeoutMs, signal);\n }\n\n async hover(params: HoverParams, timeoutMs: number, signal: AbortSignal): Promise<Hover | null> {\n return await this.request('textDocument/hover', params, timeoutMs, signal);\n }\n\n async documentSymbol(\n params: DocumentSymbolParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<DocumentSymbol[] | SymbolInformation[] | null> {\n return await this.request('textDocument/documentSymbol', params, timeoutMs, signal);\n }\n\n async workspaceSymbol(\n params: WorkspaceSymbolParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<SymbolInformation[] | null> {\n return await this.request('workspace/symbol', params, timeoutMs, signal);\n }\n\n async prepareRename(\n params: PrepareRenameParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<\n { range: unknown; placeholder?: string } | import('vscode-languageserver-protocol').Range | null\n > {\n return await this.request('textDocument/prepareRename', params, timeoutMs, signal);\n }\n\n async rename(\n params: RenameParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<WorkspaceEdit | null> {\n return await this.request('textDocument/rename', params, timeoutMs, signal);\n }\n\n async codeAction(\n params: CodeActionParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<CodeAction[]> {\n return (await this.request('textDocument/codeAction', params, timeoutMs, signal)) ?? [];\n }\n\n async executeCommand(\n params: ExecuteCommandParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<unknown> {\n return await this.request('workspace/executeCommand', params, timeoutMs, signal);\n }\n\n async pullDiagnostics(\n uri: string,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<Diagnostic[]> {\n const result = await this.request<{ items?: Diagnostic[] }>(\n 'textDocument/diagnostic',\n { textDocument: { uri } },\n timeoutMs,\n signal,\n );\n const items = result?.items ?? [];\n this.diagnostics.set(uri, items);\n return items;\n }\n\n getDiagnostics(uri: string): Diagnostic[] {\n return this.diagnostics.get(uri) ?? [];\n }\n\n notifyDidOpen(doc: TextDocumentItem): void {\n this.notification('textDocument/didOpen', { textDocument: doc });\n }\n\n notifyDidChange(doc: VersionedTextDocumentIdentifier, text: string): void {\n this.notification('textDocument/didChange', {\n textDocument: doc,\n contentChanges: [{ text }],\n });\n }\n\n notifyDidClose(uri: string): void {\n this.notification('textDocument/didClose', { textDocument: { uri } });\n }\n\n textDocumentIdentifier(filePath: string): { uri: string } {\n return { uri: pathToUri(filePath) };\n }\n\n private async request<T>(\n method: string,\n params: unknown,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<T> {\n if (this.state !== 'ready' || !this.connection) {\n throw new LSPError(LSPErrorCode.ServerNotReady, `Server \"${this.name}\" is not ready`);\n }\n return await this.connection.sendRequest<T>(method, params, timeoutMs, signal);\n }\n\n private notification(method: string, params: unknown): void {\n if (this.state !== 'ready' || !this.connection) return;\n this.connection.sendNotification(method, params);\n }\n\n private captureStderr(chunk: Buffer): void {\n const lines = chunk.toString('utf8').split(/\\r?\\n/).filter(Boolean);\n this.stderrRing.push(...lines);\n if (this.stderrRing.length > 100) this.stderrRing = this.stderrRing.slice(-100);\n }\n}\n\ninterface TextDocumentPositionParamsLike {\n textDocument: { uri: string };\n position: Position;\n}\n\nfunction startupFailure(child: ChildProcessWithoutNullStreams): {\n promise: Promise<never>;\n cancel: () => void;\n} {\n let cleanup = () => undefined;\n const promise = new Promise<never>((_, reject) => {\n const onError = (err: Error) => {\n cleanup();\n reject(\n new LSPError(LSPErrorCode.ServerFailed, `LSP server failed to start: ${err.message}`, err),\n );\n };\n const onExit = (code: number | null, signal: NodeJS.Signals | null) => {\n cleanup();\n reject(\n new LSPError(\n LSPErrorCode.ServerFailed,\n `LSP server exited during startup code=${code ?? 'null'} signal=${signal ?? 'null'}`,\n ),\n );\n };\n cleanup = () => {\n child.off('error', onError);\n child.off('exit', onExit);\n };\n child.once('error', onError);\n child.once('exit', onExit);\n });\n return { promise, cancel: cleanup };\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nexport function findWorkspaceRoot(\n filePath: string,\n rootPatterns: string[] | undefined,\n fallback: string,\n): string {\n const patterns = rootPatterns?.length ? rootPatterns : [];\n if (patterns.length === 0) return path.resolve(fallback);\n\n let dir = path.dirname(path.resolve(filePath));\n const stop = path.parse(dir).root;\n for (;;) {\n for (const pattern of patterns) {\n if (matchesAt(dir, pattern)) return dir;\n }\n if (dir === stop) return path.resolve(fallback);\n dir = path.dirname(dir);\n }\n}\n\nfunction matchesAt(dir: string, pattern: string): boolean {\n if (!pattern.includes('*')) return fs.existsSync(path.join(dir, pattern));\n const escaped = pattern\n .split('*')\n .map((part) => part.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('.*');\n const re = new RegExp(`^${escaped}$`);\n try {\n return fs.readdirSync(dir).some((name) => re.test(name));\n } catch {\n return false;\n }\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { EventBus, Logger } from '@wrongstack/core';\nimport type { DocumentTracker } from './document-tracker.js';\nimport { languageIdFor } from './language-detect.js';\nimport { nextReconnectDelay } from './server/lifecycle.js';\nimport { LSPServer } from './server/lsp-server.js';\nimport type { AutoStartMode, PlugLSPConfig } from './types.js';\nimport { LSPError, LSPErrorCode } from './types.js';\nimport { findWorkspaceRoot } from './workspace-root.js';\n\nexport interface RegistryContext {\n cwd: string;\n log: Logger;\n events: EventBus;\n}\n\nexport class LSPRegistry {\n private readonly servers = new Map<string, LSPServer>();\n private readonly languageIndex = new Map<string, string>();\n private readonly reconnectAttempts = new Map<string, number>();\n private readonly reconnectTimers = new Map<string, NodeJS.Timeout>();\n private cwd: string;\n private autoStart: AutoStartMode;\n\n constructor(\n private readonly cfg: PlugLSPConfig,\n private readonly tracker: DocumentTracker,\n private readonly ctx: RegistryContext,\n ) {\n this.cwd = ctx.cwd;\n /* v8 ignore next -- constructor assignment has no alternate behavior. */\n this.autoStart = cfg.autoStart;\n }\n\n async bind(cwd: string, autoStart: AutoStartMode = this.cfg.autoStart): Promise<void> {\n this.cwd = cwd;\n this.autoStart = autoStart;\n this.rebuildServers();\n if (autoStart === 'eager') {\n const languages = await detectProjectLanguages(cwd);\n await Promise.all(\n this.list()\n .filter((s) => s.config.languages.some((lang) => languages.has(lang)))\n .map((s) =>\n s.start().catch((err) => this.ctx.log.warn(`LSP ${s.name} failed to start`, err)),\n ),\n );\n }\n }\n\n async shutdown(): Promise<void> {\n for (const timer of this.reconnectTimers.values()) clearTimeout(timer);\n this.reconnectTimers.clear();\n await Promise.all(\n this.list().map((s) =>\n s.shutdown().catch((err) => this.ctx.log.warn(`LSP ${s.name} shutdown failed`, err)),\n ),\n );\n }\n\n async findForPath(filePath: string, signal?: AbortSignal): Promise<LSPServer | null> {\n if (this.servers.size === 0) this.rebuildServers();\n const language = languageIdFor(filePath);\n if (!language) return null;\n const name = this.languageIndex.get(language);\n if (!name) return null;\n const server = this.servers.get(name);\n if (!server) return null;\n if (server.state !== 'ready' && this.autoStart === 'lazy') {\n await server.start(signal);\n await this.tracker.reopenForServer(server);\n }\n return server.state === 'ready' ? server : null;\n }\n\n get(name: string): LSPServer | null {\n if (this.servers.size === 0) this.rebuildServers();\n return this.servers.get(name) ?? null;\n }\n\n list(): readonly LSPServer[] {\n if (this.servers.size === 0) this.rebuildServers();\n return Array.from(this.servers.values());\n }\n\n async start(name: string): Promise<void> {\n const server = this.getOrThrow(name);\n await server.start();\n await this.tracker.reopenForServer(server);\n }\n\n async stop(name: string): Promise<void> {\n await this.getOrThrow(name).shutdown();\n }\n\n async restart(name: string): Promise<void> {\n const server = this.getOrThrow(name);\n await server.shutdown();\n await server.start();\n await this.tracker.reopenForServer(server);\n }\n\n private rebuildServers(): void {\n this.servers.clear();\n this.languageIndex.clear();\n for (const [name, cfg] of Object.entries(this.cfg.servers)) {\n if (cfg.enabled === false) continue;\n const rootPath = findWorkspaceRoot(\n path.join(this.cwd, '__probe__'),\n cfg.rootPatterns,\n this.cwd,\n );\n const server = new LSPServer(name, cfg, {\n cwd: this.cwd,\n rootPath,\n log: this.ctx.log,\n events: this.ctx.events,\n onCrash: (crashed) => this.scheduleReconnect(crashed),\n });\n this.servers.set(name, server);\n for (const language of cfg.languages) {\n if (this.languageIndex.has(language)) {\n this.ctx.log.warn(\n `LSP language \"${language}\" is claimed by multiple servers; using first`,\n );\n continue;\n }\n this.languageIndex.set(language, name);\n }\n }\n }\n\n private getOrThrow(name: string): LSPServer {\n const server = this.get(name);\n if (!server) throw new LSPError(LSPErrorCode.ServerNotFound, `No LSP server named \"${name}\"`);\n return server;\n }\n\n private scheduleReconnect(server: LSPServer): void {\n if (this.reconnectTimers.has(server.name)) return;\n const attempt = this.reconnectAttempts.get(server.name) ?? 0;\n if (attempt >= 3) {\n this.ctx.log.warn(`LSP ${server.name} reconnect attempts exhausted`);\n return;\n }\n this.reconnectAttempts.set(server.name, attempt + 1);\n server.state = 'reconnecting';\n const timer = setTimeout(() => {\n this.reconnectTimers.delete(server.name);\n void server\n .start()\n .then(() => {\n this.reconnectAttempts.delete(server.name);\n return this.tracker.reopenForServer(server);\n })\n /* v8 ignore start -- reconnect failure exhaustion is timing-dependent; startup failure is covered separately. */\n .catch((err) => {\n this.ctx.log.warn(`LSP ${server.name} reconnect attempt ${attempt + 1} failed`, err);\n server.state = 'failed';\n this.scheduleReconnect(server);\n });\n /* v8 ignore stop */\n }, nextReconnectDelay(attempt));\n this.reconnectTimers.set(server.name, timer);\n }\n}\n\nasync function detectProjectLanguages(root: string): Promise<Set<string>> {\n const found = new Set<string>();\n const visit = async (dir: string, depth: number): Promise<void> => {\n if (depth > 3) return;\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n /* v8 ignore next -- unreadable directories depend on OS permissions. */\n } catch {\n return;\n }\n for (const entry of entries) {\n if (entry.name === 'node_modules' || entry.name === 'dist' || entry.name === '.git') continue;\n const p = path.join(dir, entry.name);\n if (entry.isDirectory()) await visit(p, depth + 1);\n else {\n const lang = languageIdFor(p);\n if (lang) found.add(lang);\n }\n }\n };\n await visit(root, 0);\n return found;\n}\n","import type { Diagnostic } from 'vscode-languageserver-protocol';\nimport type { SeverityName } from '../types.js';\nimport { displayPath } from '../utils/uri.js';\n\nconst SEVERITY: Record<number, SeverityName> = {\n 1: 'error',\n 2: 'warning',\n 3: 'info',\n 4: 'hint',\n};\n\nconst LABEL: Record<SeverityName, string> = {\n error: 'ERROR',\n warning: 'WARN',\n info: 'INFO',\n hint: 'HINT',\n};\n\nexport function formatDiagnostics(\n byFile: Map<string, Diagnostic[]>,\n opts: {\n cwd: string;\n severityFilter: SeverityName[];\n maxPerFile: number;\n maxTotal: number;\n },\n): string {\n const allowed = new Set(opts.severityFilter);\n const sections: string[] = [];\n let total = 0;\n let files = 0;\n for (const [file, diagnostics] of byFile.entries()) {\n const filtered = diagnostics\n /* v8 ignore next -- fallback handles invalid server severity values defensively. */\n .filter((d) => allowed.has(SEVERITY[d.severity ?? 1] ?? 'error'))\n .sort(compareDiagnostics)\n .slice(0, opts.maxPerFile);\n if (filtered.length === 0) continue;\n files++;\n total += filtered.length;\n const lines = filtered.map((d) => formatDiagnostic(d));\n sections.push(\n `${displayPath(file, opts.cwd)} (${filtered.length}):\\n${lines.map((l) => ` ${l}`).join('\\n')}`,\n );\n if (total >= opts.maxTotal) break;\n }\n if (sections.length === 0) return 'No LSP diagnostics.';\n return `${sections.join('\\n\\n')}\\n\\nTotal: ${total} diagnostics in ${files} files.`;\n}\n\nfunction formatDiagnostic(d: Diagnostic): string {\n /* v8 ignore next -- fallback handles invalid server severity values defensively. */\n const sev = SEVERITY[d.severity ?? 1] ?? 'error';\n const source = d.source ? ` ${d.source}${d.code !== undefined ? `(${String(d.code)})` : ''}` : '';\n const msg = d.message.replace(/\\s*\\r?\\n\\s*/g, ' | ');\n return `L${d.range.start.line + 1}:${d.range.start.character + 1} ${LABEL[sev]}${source}: ${msg}`;\n}\n\nfunction compareDiagnostics(a: Diagnostic, b: Diagnostic): number {\n return (\n (a.severity ?? 1) - (b.severity ?? 1) ||\n a.range.start.line - b.range.start.line ||\n a.range.start.character - b.range.start.character\n );\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport { formatDiagnostics } from '../formatters/diagnostics.js';\nimport type { LSPRegistry } from '../registry.js';\nimport { uriToPath } from '../utils/uri.js';\n\nexport function diagnosticsCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'diagnostics',\n description: 'Print buffered LSP diagnostics.',\n async run(_args, ctx) {\n const byFile = new Map<string, import('vscode-languageserver-protocol').Diagnostic[]>();\n for (const server of registry.list()) {\n for (const [uri, diagnostics] of server.diagnostics.entries()) {\n byFile.set(uriToPath(uri), diagnostics);\n }\n }\n return {\n message: formatDiagnostics(byFile, {\n cwd: ctx.cwd,\n severityFilter: ['error', 'warning'],\n maxPerFile: 10,\n maxTotal: 100,\n }),\n };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function listCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'list',\n description: 'List configured LSP servers.',\n async run() {\n const rows = registry.list().map((s) => {\n const langs = s.config.languages.join(',');\n return `${s.name.padEnd(18)} ${s.state.padEnd(14)} ${langs} ${s.rootPath}`;\n });\n return { message: rows.length ? rows.join('\\n') : 'No LSP servers configured.' };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function restartCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'restart',\n description: 'Restart an LSP server.',\n async run(args) {\n const name = args.trim();\n if (!name) return { message: 'Usage: /@wrongstack/plug-lsp:restart <name>' };\n await registry.restart(name);\n return { message: `Restarted LSP server \"${name}\".` };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function startCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'start',\n description: 'Start an LSP server.',\n async run(args) {\n const name = args.trim();\n if (!name) return { message: 'Usage: /@wrongstack/plug-lsp:start <name>' };\n await registry.start(name);\n return { message: `Started LSP server \"${name}\".` };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function stopCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'stop',\n description: 'Stop an LSP server.',\n async run(args) {\n const name = args.trim();\n if (!name) return { message: 'Usage: /@wrongstack/plug-lsp:stop <name>' };\n await registry.stop(name);\n return { message: `Stopped LSP server \"${name}\".` };\n },\n };\n}\n","import type { PluginAPI } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\nimport { diagnosticsCommand } from './diagnostics.js';\nimport { listCommand } from './list.js';\nimport { restartCommand } from './restart.js';\nimport { startCommand } from './start.js';\nimport { stopCommand } from './stop.js';\n\nexport function registerSlashCommands(api: PluginAPI, registry: LSPRegistry): string[] {\n const commands = [\n listCommand(registry),\n startCommand(registry),\n stopCommand(registry),\n restartCommand(registry),\n diagnosticsCommand(registry),\n ];\n for (const command of commands) api.slashCommands.register(command);\n return commands.map((cmd) => cmd.name);\n}\n","import type { TextEdit, WorkspaceEdit } from 'vscode-languageserver-protocol';\nimport { displayPath, uriToPath } from '../utils/uri.js';\n\nexport function summarizeWorkspaceEdit(edit: WorkspaceEdit, cwd: string): string {\n const entries = editsByPath(edit);\n if (entries.size === 0) return 'WorkspaceEdit contains no text edits.';\n let total = 0;\n const lines = ['Workspace edit:'];\n for (const [file, edits] of entries) {\n total += edits.length;\n lines.push(` ${displayPath(file, cwd)} ${edits.length} edit(s)`);\n }\n lines.push(`Total: ${total} edits across ${entries.size} files.`);\n return lines.join('\\n');\n}\n\nexport function editsByPath(edit: WorkspaceEdit): Map<string, TextEdit[]> {\n const out = new Map<string, TextEdit[]>();\n for (const [uri, edits] of Object.entries(edit.changes ?? {})) {\n out.set(uriToPath(uri), edits);\n }\n for (const change of edit.documentChanges ?? []) {\n if ('textDocument' in change && Array.isArray(change.edits)) {\n out.set(uriToPath(change.textDocument.uri), change.edits);\n }\n }\n return out;\n}\n","export interface LSPPosition {\n line: number;\n character: number;\n}\n\nexport interface HumanPosition {\n line: number;\n character: number;\n}\n\nexport interface LSPRange {\n start: LSPPosition;\n end: LSPPosition;\n}\n\nexport interface HumanRange {\n start: HumanPosition;\n end: HumanPosition;\n}\n\nexport function humanToLSP(content: string, pos: HumanPosition): LSPPosition {\n const lines = splitLines(content);\n const lineIdx = clamp(pos.line - 1, 0, Math.max(0, lines.length - 1));\n /* v8 ignore next -- splitLines always returns at least one line. */\n const line = lines[lineIdx] ?? '';\n const byteCol = clamp(pos.character - 1, 0, Buffer.byteLength(line, 'utf8'));\n let bytes = 0;\n let utf16 = 0;\n for (const ch of line) {\n const b = Buffer.byteLength(ch, 'utf8');\n if (bytes + b > byteCol) break;\n bytes += b;\n utf16 += ch.length;\n }\n return { line: lineIdx, character: utf16 };\n}\n\nexport function lspToHuman(content: string, pos: LSPPosition): HumanPosition {\n const lines = splitLines(content);\n const lineIdx = clamp(pos.line, 0, Math.max(0, lines.length - 1));\n /* v8 ignore next -- splitLines always returns at least one line. */\n const line = lines[lineIdx] ?? '';\n const utf16Col = clamp(pos.character, 0, line.length);\n let utf16 = 0;\n let bytes = 0;\n for (const ch of line) {\n if (utf16 + ch.length > utf16Col) break;\n utf16 += ch.length;\n bytes += Buffer.byteLength(ch, 'utf8');\n }\n return { line: lineIdx + 1, character: bytes + 1 };\n}\n\nexport function humanToLSPRange(content: string, range: HumanRange): LSPRange {\n return { start: humanToLSP(content, range.start), end: humanToLSP(content, range.end) };\n}\n\nexport function lspToHumanRange(content: string, range: LSPRange): HumanRange {\n return { start: lspToHuman(content, range.start), end: lspToHuman(content, range.end) };\n}\n\nexport function splitLines(content: string): string[] {\n if (content.length === 0) return [''];\n return content.split(/\\r\\n|\\r|\\n/);\n}\n\nfunction clamp(n: number, min: number, max: number): number {\n if (!Number.isFinite(n)) return min;\n return Math.max(min, Math.min(max, n));\n}\n","import type { ServerCapabilities } from 'vscode-languageserver-protocol';\n\nexport function supportsHover(cap: ServerCapabilities): boolean {\n return !!cap.hoverProvider;\n}\n\nexport function supportsDefinition(cap: ServerCapabilities): boolean {\n return !!cap.definitionProvider;\n}\n\nexport function supportsReferences(cap: ServerCapabilities): boolean {\n return !!cap.referencesProvider;\n}\n\nexport function supportsDocumentSymbol(cap: ServerCapabilities): boolean {\n return !!cap.documentSymbolProvider;\n}\n\nexport function supportsWorkspaceSymbol(cap: ServerCapabilities): boolean {\n return !!cap.workspaceSymbolProvider;\n}\n\nexport function supportsRename(cap: ServerCapabilities): boolean {\n return !!cap.renameProvider;\n}\n\nexport function supportsPrepareRename(cap: ServerCapabilities): boolean {\n const provider = cap.renameProvider;\n return typeof provider === 'object' && provider !== null && provider.prepareProvider === true;\n}\n\nexport function supportsCodeAction(cap: ServerCapabilities): boolean {\n return !!cap.codeActionProvider;\n}\n\nexport function supportsPullDiagnostics(cap: ServerCapabilities): boolean {\n return !!cap.diagnosticProvider;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Context, Logger } from '@wrongstack/core';\nimport type { DocumentTracker } from '../document-tracker.js';\nimport type { LSPRegistry } from '../registry.js';\nimport type { LSPServer } from '../server/lsp-server.js';\nimport type { PlugLSPConfig } from '../types.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\n\nexport interface ToolDeps {\n registry: LSPRegistry;\n tracker: DocumentTracker;\n cfg: PlugLSPConfig;\n log: Logger;\n}\n\nexport function resolveInputPath(inputPath: string, ctx: Context): string {\n return path.isAbsolute(inputPath) ? path.normalize(inputPath) : path.resolve(ctx.cwd, inputPath);\n}\n\nexport async function requireServer(\n registry: LSPRegistry,\n filePath: string,\n signal: AbortSignal,\n): Promise<LSPServer> {\n const server = await registry.findForPath(filePath, signal);\n if (!server) {\n throw new LSPError(LSPErrorCode.ServerNotFound, `No LSP server is configured for ${filePath}`);\n }\n return server;\n}\n\nexport async function readDocumentContent(\n filePath: string,\n tracker: DocumentTracker,\n): Promise<string> {\n const tracked = tracker.get(filePath);\n return tracked?.text ?? (await fs.readFile(filePath, 'utf8'));\n}\n\nexport function textDocumentPosition(\n uriPath: string,\n position: { line: number; character: number },\n) {\n return { textDocument: { uri: pathToUri(uriPath) }, position };\n}\n\nexport function stringifyToolError(err: unknown): string {\n if (err instanceof LSPError) return `[${err.code}] ${err.message}`;\n if (err instanceof Error) return `[${LSPErrorCode.ProtocolError}] ${err.message}`;\n return `[${LSPErrorCode.ProtocolError}] ${String(err)}`;\n}\n","import * as fs from 'node:fs/promises';\nimport { atomicWrite } from '@wrongstack/core';\nimport type { TextEdit, WorkspaceEdit } from 'vscode-languageserver-protocol';\nimport type { DocumentTracker } from '../document-tracker.js';\nimport { editsByPath } from '../formatters/workspace-edit.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\n\nexport interface ApplyWorkspaceEditResult {\n files: string[];\n edits: number;\n}\n\nexport async function applyWorkspaceEdit(\n edit: WorkspaceEdit,\n tracker: DocumentTracker,\n): Promise<ApplyWorkspaceEditResult> {\n const entries = editsByPath(edit);\n const ops: Array<{ path: string; original: string; next: string; edits: number }> = [];\n for (const [file, edits] of entries) {\n const original = await fs.readFile(file, 'utf8');\n ops.push({ path: file, original, next: applyTextEdits(original, edits), edits: edits.length });\n }\n\n const written: typeof ops = [];\n try {\n for (const op of ops) {\n await atomicWrite(op.path, op.next);\n written.push(op);\n }\n } catch (err) {\n /* v8 ignore start -- atomicWrite failures are OS-dependent; read failures are covered separately. */\n for (const op of written) {\n try {\n await atomicWrite(op.path, op.original);\n } catch {\n // best-effort rollback\n }\n }\n throw new LSPError(LSPErrorCode.ApplyEditFailed, 'Failed to apply workspace edit', err);\n /* v8 ignore stop */\n }\n\n for (const op of ops) await tracker.fileWritten(op.path);\n return { files: ops.map((op) => op.path), edits: ops.reduce((sum, op) => sum + op.edits, 0) };\n}\n\nexport function applyTextEdits(original: string, edits: TextEdit[]): string {\n const lineStarts = buildLineStarts(original);\n const sorted = [...edits].sort(\n (a, b) => offsetOf(b.range.start, lineStarts) - offsetOf(a.range.start, lineStarts),\n );\n let out = original;\n for (const edit of sorted) {\n const start = offsetOf(edit.range.start, lineStarts);\n const end = offsetOf(edit.range.end, lineStarts);\n out = out.slice(0, start) + edit.newText + out.slice(end);\n }\n return out;\n}\n\nfunction buildLineStarts(text: string): number[] {\n const starts = [0];\n for (let i = 0; i < text.length; i++) {\n const ch = text.charCodeAt(i);\n if (ch === 10) starts.push(i + 1);\n }\n return starts;\n}\n\nfunction offsetOf(pos: { line: number; character: number }, lineStarts: number[]): number {\n return (lineStarts[pos.line] ?? lineStarts[lineStarts.length - 1] ?? 0) + pos.character;\n}\n","import type { Tool } from '@wrongstack/core';\nimport type { CodeAction } from 'vscode-languageserver-protocol';\nimport { summarizeWorkspaceEdit } from '../formatters/workspace-edit.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsCodeAction } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\nimport { applyWorkspaceEdit } from './workspace-edit.js';\n\ninterface CodeActionsInput {\n path: string;\n line: number;\n character?: number;\n end_line?: number;\n end_character?: number;\n apply?: number;\n kind_filter?: string;\n}\n\nexport function createCodeActionsTool(deps: ToolDeps): Tool<CodeActionsInput, string> {\n return {\n name: 'lsp_code_actions',\n description: 'List or apply LSP code actions.',\n usageHint:\n 'Use to inspect quick fixes and refactors. This tool is confirm-gated because apply mode can mutate files.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n end_line: { type: 'integer' },\n end_character: { type: 'integer' },\n apply: { type: 'integer' },\n kind_filter: { type: 'string' },\n },\n required: ['path', 'line'],\n },\n permission: 'confirm',\n mutating: true,\n timeoutMs: 10_000,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsCodeAction(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support code actions`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const start = humanToLSP(content, { line: input.line, character: input.character ?? 1 });\n const end = humanToLSP(content, {\n line: input.end_line ?? input.line,\n character: input.end_character ?? input.character ?? 1,\n });\n const actions = await server.codeAction(\n {\n textDocument: { uri: pathToUri(file) },\n range: { start, end },\n context: {\n diagnostics: server.getDiagnostics(pathToUri(file)),\n only: input.kind_filter ? [input.kind_filter] : undefined,\n },\n },\n 10_000,\n opts.signal,\n );\n if (input.apply === undefined) return formatActions(actions);\n const action = actions[input.apply];\n if (!action) return `No code action at index ${input.apply}.`;\n const parts: string[] = [`Applying [${input.apply}] ${action.title}`];\n if (action.edit) {\n parts.push(summarizeWorkspaceEdit(action.edit, ctx.cwd));\n const applied = await applyWorkspaceEdit(action.edit, deps.tracker);\n parts.push(`Applied: ${applied.edits} edits across ${applied.files.length} files.`);\n }\n if (action.command) {\n await server.executeCommand(action.command, 10_000, opts.signal);\n parts.push(`Executed command: ${action.command.command}`);\n }\n return parts.join('\\n');\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n\nfunction formatActions(actions: CodeAction[]): string {\n if (actions.length === 0) return 'No code actions available.';\n return actions.map((a, i) => `[${i}] ${a.kind ?? 'action'} ${a.title}`).join('\\n');\n}\n","import type { Location, LocationLink } from 'vscode-languageserver-protocol';\nimport { displayPath, uriToPath } from '../utils/uri.js';\n\nexport function formatLocations(\n locations: Array<Location | LocationLink> | null,\n cwd: string,\n limit = 100,\n): string {\n if (!locations || locations.length === 0) return 'No locations found.';\n const lines = locations.slice(0, limit).map((loc) => {\n const uri = 'uri' in loc ? loc.uri : loc.targetUri;\n const range = 'range' in loc ? loc.range : loc.targetSelectionRange;\n return `${displayPath(uriToPath(uri), cwd)}:${range.start.line + 1}:${range.start.character + 1}`;\n });\n if (locations.length > limit) lines.push(`... truncated ${locations.length - limit} more`);\n return lines.join('\\n');\n}\n","import type { Tool } from '@wrongstack/core';\nimport { formatLocations } from '../formatters/location.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsDefinition } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\n\ninterface PositionInput {\n path: string;\n line: number;\n character: number;\n}\n\nexport function createDefinitionTool(deps: ToolDeps): Tool<PositionInput, string> {\n return {\n name: 'lsp_definition',\n description: 'Find where a symbol is defined.',\n usageHint:\n 'Use for semantic navigation when you know the symbol position. Lines and columns are 1-based.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n },\n required: ['path', 'line', 'character'],\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: 5000,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsDefinition(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support definition`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const position = humanToLSP(content, { line: input.line, character: input.character });\n const locs = await server.definition(\n { textDocument: { uri: pathToUri(file) }, position },\n 5000,\n opts.signal,\n );\n return formatLocations(locs, ctx.cwd);\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { Tool } from '@wrongstack/core';\nimport { formatDiagnostics } from '../formatters/diagnostics.js';\nimport { supportsPullDiagnostics } from '../server/capabilities.js';\nimport { pathToUri, uriToPath } from '../utils/uri.js';\nimport { type ToolDeps, requireServer, resolveInputPath, stringifyToolError } from './shared.js';\n\ninterface DiagnosticsInput {\n path?: string;\n limit?: number;\n}\n\nexport function createDiagnosticsTool(deps: ToolDeps): Tool<DiagnosticsInput, string> {\n return {\n name: 'lsp_diagnostics',\n description: 'Get diagnostics from configured language servers.',\n usageHint:\n 'Use after reading or editing a file when an LSP server is configured. Pass `path` for file diagnostics or omit it for tracked workspace diagnostics.',\n inputSchema: {\n type: 'object',\n properties: { path: { type: 'string' }, limit: { type: 'integer' } },\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: 5000,\n maxOutputBytes: 65_536,\n async execute(input, ctx, opts) {\n try {\n const byFile = new Map<string, import('vscode-languageserver-protocol').Diagnostic[]>();\n if (input.path) {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n const uri = pathToUri(file);\n const diagnostics =\n server.capabilities && supportsPullDiagnostics(server.capabilities)\n ? await server.pullDiagnostics(uri, 5000, opts.signal)\n : server.getDiagnostics(uri);\n byFile.set(file, diagnostics);\n } else {\n for (const doc of deps.tracker.list()) {\n const server = await deps.registry.findForPath(doc.path, opts.signal);\n if (!server) continue;\n byFile.set(uriToPath(doc.uri), server.getDiagnostics(doc.uri));\n }\n }\n return formatDiagnostics(byFile, {\n cwd: ctx.cwd,\n severityFilter: deps.cfg.severityFilter,\n maxPerFile: deps.cfg.maxDiagnosticsPerFile,\n maxTotal: input.limit ?? deps.cfg.maxDiagnosticsTotal,\n });\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { Hover, MarkedString, MarkupContent } from 'vscode-languageserver-protocol';\n\nexport function formatHover(hover: Hover | null, maxChars = 4096): string {\n if (!hover) return 'No hover information.';\n const text = hoverContentsToString(hover.contents).trim();\n if (!text) return 'No hover information.';\n return text.length > maxChars ? `${text.slice(0, maxChars)}\\n...[truncated]` : text;\n}\n\nfunction hoverContentsToString(contents: Hover['contents']): string {\n if (typeof contents === 'string') return contents;\n if (Array.isArray(contents)) return contents.map(markedStringToString).join('\\n\\n');\n if ('kind' in contents && 'value' in contents) return (contents as MarkupContent).value;\n return markedStringToString(contents as MarkedString);\n}\n\nfunction markedStringToString(value: MarkedString): string {\n if (typeof value === 'string') return value;\n return `\\`\\`\\`${value.language}\\n${value.value}\\n\\`\\`\\``;\n}\n","import type { Tool } from '@wrongstack/core';\nimport { formatHover } from '../formatters/hover.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsHover } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\n\ninterface HoverInput {\n path: string;\n line: number;\n character: number;\n}\n\nexport function createHoverTool(deps: ToolDeps): Tool<HoverInput, string> {\n return {\n name: 'lsp_hover',\n description: 'Get type information and documentation for a symbol.',\n usageHint: 'Use when you need a type/signature without opening the definition.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n },\n required: ['path', 'line', 'character'],\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: 5000,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsHover(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support hover`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const position = humanToLSP(content, { line: input.line, character: input.character });\n return formatHover(\n await server.hover(\n { textDocument: { uri: pathToUri(file) }, position },\n 5000,\n opts.signal,\n ),\n );\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { Tool } from '@wrongstack/core';\nimport { formatLocations } from '../formatters/location.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsReferences } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\n\ninterface ReferencesInput {\n path: string;\n line: number;\n character: number;\n include_declaration?: boolean;\n limit?: number;\n}\n\nexport function createReferencesTool(deps: ToolDeps): Tool<ReferencesInput, string> {\n return {\n name: 'lsp_references',\n description: 'Find references to a symbol.',\n usageHint: 'Use instead of grep when the symbol position is known; it is syntax-aware.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n include_declaration: { type: 'boolean' },\n limit: { type: 'integer' },\n },\n required: ['path', 'line', 'character'],\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: 10_000,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsReferences(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support references`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const position = humanToLSP(content, { line: input.line, character: input.character });\n const locs = await server.references(\n {\n textDocument: { uri: pathToUri(file) },\n position,\n context: { includeDeclaration: input.include_declaration ?? true },\n },\n 10_000,\n opts.signal,\n );\n return formatLocations(locs, ctx.cwd, input.limit ?? 100);\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { Tool } from '@wrongstack/core';\nimport { summarizeWorkspaceEdit } from '../formatters/workspace-edit.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsRename } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\nimport { applyWorkspaceEdit } from './workspace-edit.js';\n\ninterface RenameInput {\n path: string;\n line: number;\n character: number;\n new_name: string;\n}\n\nexport function createRenameTool(deps: ToolDeps): Tool<RenameInput, string> {\n return {\n name: 'lsp_rename',\n description: 'Rename a symbol semantically across the workspace.',\n usageHint:\n 'Prefer this over find-and-replace for functions, classes, variables, and types. This mutates files and requires confirmation.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n new_name: { type: 'string' },\n },\n required: ['path', 'line', 'character', 'new_name'],\n },\n permission: 'confirm',\n mutating: true,\n timeoutMs: 15_000,\n maxOutputBytes: 65_536,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsRename(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support rename`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const position = humanToLSP(content, { line: input.line, character: input.character });\n const edit = await server.rename(\n {\n textDocument: { uri: pathToUri(file) },\n position,\n newName: input.new_name,\n },\n 15_000,\n opts.signal,\n );\n if (!edit) return 'Rename produced no edits.';\n const summary = summarizeWorkspaceEdit(edit, ctx.cwd);\n const applied = await applyWorkspaceEdit(edit, deps.tracker);\n return `${summary}\\nApplied: ${applied.edits} edits across ${applied.files.length} files.`;\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { DocumentSymbol, SymbolInformation } from 'vscode-languageserver-protocol';\nimport { displayPath, uriToPath } from '../utils/uri.js';\n\nexport function formatDocumentSymbols(\n path: string,\n symbols: DocumentSymbol[] | SymbolInformation[] | null,\n cwd: string,\n): string {\n if (!symbols || symbols.length === 0) return 'No symbols found.';\n const lines = [`${displayPath(path, cwd)}:`];\n for (const sym of symbols) appendSymbol(lines, sym, 1, cwd);\n return lines.join('\\n');\n}\n\nexport function formatWorkspaceSymbols(\n symbols: SymbolInformation[] | null,\n query: string,\n cwd: string,\n limit = 100,\n): string {\n if (!symbols || symbols.length === 0) return `No symbols matching \"${query}\".`;\n const lines = [`${symbols.length} symbols matching \"${query}\":`];\n for (const sym of symbols.slice(0, limit)) {\n lines.push(\n ` ${kindName(sym.kind)} ${sym.name} ${displayPath(uriToPath(sym.location.uri), cwd)}:${sym.location.range.start.line + 1}`,\n );\n }\n if (symbols.length > limit) lines.push(` ... truncated ${symbols.length - limit} more`);\n return lines.join('\\n');\n}\n\nfunction appendSymbol(\n lines: string[],\n sym: DocumentSymbol | SymbolInformation,\n depth: number,\n cwd: string,\n): void {\n const indent = ' '.repeat(depth);\n if ('selectionRange' in sym) {\n lines.push(\n `${indent}${kindName(sym.kind)} ${sym.name} (L${sym.selectionRange.start.line + 1})`,\n );\n for (const child of sym.children ?? []) appendSymbol(lines, child, depth + 1, cwd);\n } else {\n lines.push(\n `${indent}${kindName(sym.kind)} ${sym.name} ${displayPath(uriToPath(sym.location.uri), cwd)}:${sym.location.range.start.line + 1}`,\n );\n }\n}\n\nfunction kindName(kind: number): string {\n return (\n [\n 'file',\n 'module',\n 'namespace',\n 'package',\n 'class',\n 'method',\n 'property',\n 'field',\n 'constructor',\n 'enum',\n 'interface',\n 'function',\n 'variable',\n 'constant',\n 'string',\n 'number',\n 'boolean',\n 'array',\n 'object',\n 'key',\n 'null',\n 'enumMember',\n 'struct',\n 'event',\n 'operator',\n 'typeParameter',\n ][kind - 1] ?? 'symbol'\n );\n}\n","import type { Tool } from '@wrongstack/core';\nimport type { SymbolInformation } from 'vscode-languageserver-protocol';\nimport { formatDocumentSymbols, formatWorkspaceSymbols } from '../formatters/symbols.js';\nimport { supportsDocumentSymbol, supportsWorkspaceSymbol } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport { type ToolDeps, requireServer, resolveInputPath, stringifyToolError } from './shared.js';\n\ninterface SymbolsInput {\n path?: string;\n query?: string;\n limit?: number;\n}\n\nexport function createSymbolsTool(deps: ToolDeps): Tool<SymbolsInput, string> {\n return {\n name: 'lsp_symbols',\n description: 'List symbols in a file or search workspace symbols.',\n usageHint: 'Pass `path` for a file outline, or `query` for workspace symbol search.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n query: { type: 'string' },\n limit: { type: 'integer' },\n },\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: 5000,\n async execute(input, ctx, opts) {\n try {\n if (input.path) {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsDocumentSymbol(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support document symbols`,\n );\n }\n const symbols = await server.documentSymbol(\n { textDocument: { uri: pathToUri(file) } },\n 5000,\n opts.signal,\n );\n return formatDocumentSymbols(file, symbols, ctx.cwd);\n }\n const query = input.query ?? '';\n const merged: SymbolInformation[] = [];\n for (const server of deps.registry.list()) {\n if (server.state !== 'ready') continue;\n if (server.capabilities && !supportsWorkspaceSymbol(server.capabilities)) continue;\n const result = await server.workspaceSymbol({ query }, 5000, opts.signal);\n if (result) merged.push(...result);\n }\n return formatWorkspaceSymbols(merged, query, ctx.cwd, input.limit ?? 100);\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { Tool } from '@wrongstack/core';\nimport { createCodeActionsTool } from './code-actions.js';\nimport { createDefinitionTool } from './definition.js';\nimport { createDiagnosticsTool } from './diagnostics.js';\nimport { createHoverTool } from './hover.js';\nimport { createReferencesTool } from './references.js';\nimport { createRenameTool } from './rename.js';\nimport type { ToolDeps } from './shared.js';\nimport { createSymbolsTool } from './symbols.js';\n\nexport function makeLSPTools(deps: ToolDeps): Tool[] {\n return [\n createDiagnosticsTool(deps),\n createDefinitionTool(deps),\n createReferencesTool(deps),\n createHoverTool(deps),\n createSymbolsTool(deps),\n createRenameTool(deps),\n createCodeActionsTool(deps),\n ];\n}\n","import type { Plugin } from '@wrongstack/core';\nimport { autoDiscoverServers } from './auto-discover.js';\nimport { PLUGIN_NAME, plugLspConfigSchema, readPlugLSPConfig } from './config.js';\nimport { DocumentTracker } from './document-tracker.js';\nimport { LSPRegistry } from './registry.js';\nimport { registerSlashCommands } from './slash-commands/index.js';\nimport { makeLSPTools } from './tools/index.js';\n\nexport type {\n AutoStartMode,\n DiagnosticsAfterEdit,\n PlugLSPConfig,\n ServerConfig,\n} from './types.js';\n\nlet teardownState: {\n offs: Array<() => void>;\n toolNames: string[];\n commandNames: string[];\n registry: LSPRegistry;\n tracker: DocumentTracker;\n} | null = null;\n\nconst plugin: Plugin = {\n name: PLUGIN_NAME,\n version: '0.1.0',\n description: 'Language Server Protocol tools for WrongStack.',\n apiVersion: '^0.1.1',\n capabilities: {\n tools: true,\n slashCommands: true,\n pipelines: [],\n },\n configSchema: plugLspConfigSchema,\n async setup(api) {\n const cfg = readPlugLSPConfig(api);\n const cwd = api.config.cwd ?? process.cwd();\n if (cfg.autoDiscover) {\n cfg.servers = await autoDiscoverServers(cfg.servers, cwd);\n }\n const holder: { registry?: LSPRegistry } = {};\n const tracker = new DocumentTracker(() => holder.registry!, api.log, cwd, api.events);\n const registry = new LSPRegistry(cfg, tracker, { cwd, log: api.log, events: api.events });\n holder.registry = registry;\n await registry.bind(cwd, cfg.autoStart);\n\n const tools = makeLSPTools({ registry, tracker, cfg, log: api.log });\n for (const tool of tools) api.tools.register(tool);\n const commandNames = registerSlashCommands(api, registry);\n\n const offs = [\n api.events.on('session.started', () => {\n const nextCwd = api.config.cwd ?? process.cwd();\n tracker.setCwd(nextCwd);\n void registry.bind(nextCwd, cfg.autoStart);\n }),\n api.events.on('session.ended', () => {\n void tracker.forceCloseAll().finally(() => registry.shutdown());\n }),\n api.events.on('tool.executed', (event) => {\n void tracker.handleToolExecuted(event);\n }),\n ];\n\n teardownState = {\n offs,\n toolNames: tools.map((t) => t.name),\n commandNames,\n registry,\n tracker,\n };\n },\n async teardown(api) {\n const state = teardownState;\n if (!state) return;\n teardownState = null;\n for (const off of state.offs) off();\n for (const name of state.toolNames) api.tools.unregister(name);\n for (const name of state.commandNames) api.slashCommands.unregister(`${PLUGIN_NAME}:${name}`);\n await state.tracker.forceCloseAll();\n await state.registry.shutdown();\n },\n};\n\nexport default plugin;\n"]}
|
package/dist/setup.js
CHANGED
|
@@ -3,6 +3,7 @@ import { spawn } from 'child_process';
|
|
|
3
3
|
import * as fs from 'fs/promises';
|
|
4
4
|
import * as path from 'path';
|
|
5
5
|
import { pathToFileURL } from 'url';
|
|
6
|
+
import { buildChildEnv } from '@wrongstack/core';
|
|
6
7
|
|
|
7
8
|
async function resolveServerCommand(command, cwd) {
|
|
8
9
|
const local = await findLocalBinary(cwd, command);
|
|
@@ -27,7 +28,7 @@ async function commandExistsOnPath(command) {
|
|
|
27
28
|
const probe = process.platform === "win32" ? "where.exe" : "sh";
|
|
28
29
|
const args = process.platform === "win32" ? [command] : ["-lc", `command -v ${shellQuote(command)}`];
|
|
29
30
|
return new Promise((resolve3) => {
|
|
30
|
-
const child = spawn(probe, args, { stdio: "ignore", windowsHide: true });
|
|
31
|
+
const child = spawn(probe, args, { env: buildChildEnv(), stdio: "ignore", windowsHide: true });
|
|
31
32
|
child.on("error", () => resolve3(false));
|
|
32
33
|
child.on("close", (code) => resolve3(code === 0));
|
|
33
34
|
});
|
|
@@ -218,6 +219,7 @@ function runCommand(command, args, cwd) {
|
|
|
218
219
|
return new Promise((resolve3, reject) => {
|
|
219
220
|
const child = spawn(command, args, {
|
|
220
221
|
cwd,
|
|
222
|
+
env: buildChildEnv(),
|
|
221
223
|
stdio: "inherit",
|
|
222
224
|
shell,
|
|
223
225
|
windowsHide: true
|
package/dist/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/command-resolver.ts","../src/setup.ts"],"names":["resolve","args","path2","spawn","fs2"],"mappings":"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","file":"setup.js","sourcesContent":["import { spawn } from 'node:child_process';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport async function resolveServerCommand(command: string, cwd: string): Promise<string | null> {\n const local = await findLocalBinary(cwd, command);\n if (local) return local;\n return (await commandExistsOnPath(command)) ? command : null;\n}\n\nexport async function findLocalBinary(cwd: string, command: string): Promise<string | null> {\n if (path.isAbsolute(command)) return (await fileExists(command)) ? path.normalize(command) : null;\n let dir = path.resolve(cwd);\n for (;;) {\n const binDir = path.join(dir, 'node_modules', '.bin');\n for (const candidate of commandCandidates(command)) {\n const full = path.join(binDir, candidate);\n if (await fileExists(full)) return full;\n }\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport async function commandExistsOnPath(command: string): Promise<boolean> {\n const probe = process.platform === 'win32' ? 'where.exe' : 'sh';\n const args =\n process.platform === 'win32' ? [command] : ['-lc', `command -v ${shellQuote(command)}`];\n return new Promise((resolve) => {\n const child = spawn(probe, args, { stdio: 'ignore', windowsHide: true });\n child.on('error', () => resolve(false));\n child.on('close', (code) => resolve(code === 0));\n });\n}\n\nfunction commandCandidates(command: string): string[] {\n /* v8 ignore next -- platform-specific branch; covered on non-Windows CI. */\n if (process.platform !== 'win32') return [command];\n const ext = path.extname(command).toLowerCase();\n if (ext) return [command];\n return [`${command}.cmd`, `${command}.exe`, `${command}.bat`, command, `${command}.ps1`];\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction shellQuote(value: string): string {\n /* v8 ignore next -- only used by POSIX command probing. */\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n","#!/usr/bin/env node\nimport { spawn } from 'node:child_process';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { commandExistsOnPath, resolveServerCommand } from './utils/command-resolver.js';\n\ntype PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';\n\ninterface LanguageInstall {\n npmPackages?: string[];\n binary: string;\n toolchain?: {\n command: string;\n args: string[];\n label: string;\n };\n}\n\nconst DEFAULT_LANGUAGES = ['typescript', 'python', 'json', 'html', 'css', 'yaml', 'shell'];\n\nconst INSTALLS: Record<string, LanguageInstall> = {\n typescript: {\n binary: 'typescript-language-server',\n npmPackages: ['typescript', 'typescript-language-server'],\n },\n python: {\n binary: 'pyright-langserver',\n npmPackages: ['pyright'],\n },\n json: {\n binary: 'vscode-json-language-server',\n npmPackages: ['vscode-langservers-extracted'],\n },\n html: {\n binary: 'vscode-html-language-server',\n npmPackages: ['vscode-langservers-extracted'],\n },\n css: {\n binary: 'vscode-css-language-server',\n npmPackages: ['vscode-langservers-extracted'],\n },\n yaml: {\n binary: 'yaml-language-server',\n npmPackages: ['yaml-language-server'],\n },\n shell: {\n binary: 'bash-language-server',\n npmPackages: ['bash-language-server'],\n },\n go: {\n binary: 'gopls',\n toolchain: {\n command: 'go',\n args: ['install', 'golang.org/x/tools/gopls@latest'],\n label: 'Go toolchain',\n },\n },\n rust: {\n binary: 'rust-analyzer',\n toolchain: {\n command: 'rustup',\n args: ['component', 'add', 'rust-analyzer'],\n label: 'Rust toolchain',\n },\n },\n ruby: {\n binary: 'ruby-lsp',\n toolchain: {\n command: 'gem',\n args: ['install', 'ruby-lsp'],\n label: 'RubyGems',\n },\n },\n};\n\nexport interface SetupOptions {\n cwd: string;\n languages: string[];\n dryRun: boolean;\n toolchains: boolean;\n}\n\nexport interface SetupDeps {\n resolveServerCommand: typeof resolveServerCommand;\n commandExistsOnPath: typeof commandExistsOnPath;\n run: (command: string, args: string[], cwd: string) => Promise<void>;\n log: (message: string) => void;\n cwd: () => string;\n exit?: (code: number) => never;\n}\n\n/* v8 ignore start -- default process-bound deps are covered through injectable deps. */\nconst DEFAULT_DEPS: SetupDeps = {\n resolveServerCommand,\n commandExistsOnPath,\n run: runCommand,\n log: (message) => console.log(message),\n cwd: () => process.cwd(),\n exit: (code) => process.exit(code),\n};\n/* v8 ignore stop */\n\nexport async function runSetup(args: string[], deps: SetupDeps = DEFAULT_DEPS): Promise<void> {\n const opts = parseArgs(args, deps);\n const missing = opts.languages.filter((lang) => !INSTALLS[lang]);\n if (missing.length > 0) {\n throw new Error(`Unknown language preset(s): ${missing.join(', ')}`);\n }\n\n const alreadyInstalled: string[] = [];\n const npmPackages = new Set<string>();\n const toolchainInstalls: Array<NonNullable<LanguageInstall['toolchain']>> = [];\n\n for (const lang of opts.languages) {\n const install = INSTALLS[lang]!;\n if (await deps.resolveServerCommand(install.binary, opts.cwd)) {\n alreadyInstalled.push(lang);\n continue;\n }\n for (const pkg of install.npmPackages ?? []) npmPackages.add(pkg);\n if (install.toolchain) toolchainInstalls.push(install.toolchain);\n }\n\n if (alreadyInstalled.length > 0) {\n deps.log(`Already available: ${alreadyInstalled.join(', ')}`);\n }\n\n if (npmPackages.size > 0) {\n const pm = await detectPackageManager(opts.cwd);\n const { command, args } = installCommand(pm, Array.from(npmPackages));\n await runOrPrint(\n command,\n args,\n opts.cwd,\n opts.dryRun,\n 'Installing npm-based LSP servers',\n deps,\n );\n }\n\n for (const installer of toolchainInstalls) {\n if (!opts.toolchains) {\n deps.log(`Skipping ${installer.label}; rerun without --no-toolchains to install.`);\n continue;\n }\n if (!(await deps.commandExistsOnPath(installer.command))) {\n deps.log(`Missing ${installer.label}: command \"${installer.command}\" is not on PATH.`);\n continue;\n }\n await runOrPrint(\n installer.command,\n installer.args,\n opts.cwd,\n opts.dryRun,\n `Installing via ${installer.label}`,\n deps,\n );\n }\n\n deps.log('LSP setup finished.');\n}\n\nexport function parseArgs(\n args: string[],\n deps: Pick<SetupDeps, 'cwd' | 'exit' | 'log'> = DEFAULT_DEPS,\n): SetupOptions {\n let cwd = deps.cwd();\n let languages = DEFAULT_LANGUAGES;\n let dryRun = false;\n let toolchains = true;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]!;\n if (arg === '--cwd') {\n cwd = path.resolve(requiredValue(args, ++i, '--cwd'));\n } else if (arg === '--languages') {\n languages = requiredValue(args, ++i, '--languages')\n .split(',')\n .map((x) => x.trim())\n .filter(Boolean);\n } else if (arg === '--dry-run') {\n dryRun = true;\n } else if (arg === '--no-toolchains') {\n toolchains = false;\n } else if (arg === '--help' || arg === '-h') {\n printHelp(deps.log);\n deps.exit?.(0);\n } else {\n throw new Error(`Unknown option: ${arg}`);\n }\n }\n\n return { cwd, languages, dryRun, toolchains };\n}\n\nexport async function detectPackageManager(cwd: string): Promise<PackageManager> {\n if (await exists(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n if ((await exists(path.join(cwd, 'bun.lockb'))) || (await exists(path.join(cwd, 'bun.lock'))))\n return 'bun';\n if (await exists(path.join(cwd, 'yarn.lock'))) return 'yarn';\n return 'npm';\n}\n\nexport function installCommand(\n pm: PackageManager,\n packages: string[],\n): { command: string; args: string[] } {\n if (pm === 'pnpm') return { command: 'pnpm', args: ['add', '-D', ...packages] };\n if (pm === 'yarn') return { command: 'yarn', args: ['add', '-D', ...packages] };\n if (pm === 'bun') return { command: 'bun', args: ['add', '-d', ...packages] };\n return { command: 'npm', args: ['install', '-D', ...packages] };\n}\n\nasync function runOrPrint(\n command: string,\n args: string[],\n cwd: string,\n dryRun: boolean,\n label: string,\n deps: Pick<SetupDeps, 'run' | 'log'>,\n): Promise<void> {\n const rendered = [command, ...args].join(' ');\n if (dryRun) {\n deps.log(`[dry-run] ${label}: ${rendered}`);\n return;\n }\n deps.log(`${label}: ${rendered}`);\n await deps.run(command, args, cwd);\n}\n\nexport function runCommand(command: string, args: string[], cwd: string): Promise<void> {\n const shell = process.platform === 'win32' && /\\.(cmd|bat)$/i.test(command);\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n stdio: 'inherit',\n shell,\n windowsHide: true,\n });\n child.on('error', reject);\n child.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`${command} exited with code ${code ?? 'null'}`));\n });\n });\n}\n\nasync function exists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction requiredValue(args: string[], index: number, name: string): string {\n const value = args[index];\n if (!value) throw new Error(`${name} requires a value`);\n return value;\n}\n\nfunction printHelp(log: (message: string) => void): void {\n log(`wrongstack-lsp-setup\n\nInstall Language Server Protocol binaries for @wrongstack/plug-lsp.\n\nOptions:\n --cwd <path> Project directory. Defaults to current directory.\n --languages <list> Comma list. Defaults to ${DEFAULT_LANGUAGES.join(',')}.\n Available: ${Object.keys(INSTALLS).join(',')}.\n --dry-run Print commands without running them.\n --no-toolchains Skip Go/Rust/Ruby toolchain installers.\n`);\n}\n\n/* v8 ignore start -- CLI process-exit wrapper is exercised by invoking the built bin, not unit imports. */\nconst isCliEntrypoint = process.argv[1]\n ? import.meta.url === pathToFileURL(process.argv[1]).href\n : false;\n\nif (isCliEntrypoint) {\n runSetup(process.argv.slice(2)).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n });\n}\n/* v8 ignore stop */\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/command-resolver.ts","../src/setup.ts"],"names":["resolve","args","path2","spawn","buildChildEnv","fs2"],"mappings":";;;;;;;AAKA,eAAsB,oBAAA,CAAqB,SAAiB,GAAA,EAAqC;AAC/F,EAAA,MAAM,KAAA,GAAQ,MAAM,eAAA,CAAgB,GAAA,EAAK,OAAO,CAAA;AAChD,EAAA,IAAI,OAAO,OAAO,KAAA;AAClB,EAAA,OAAQ,MAAM,mBAAA,CAAoB,OAAO,CAAA,GAAK,OAAA,GAAU,IAAA;AAC1D;AAEA,eAAsB,eAAA,CAAgB,KAAa,OAAA,EAAyC;AAC1F,EAAA,IAAS,IAAA,CAAA,UAAA,CAAW,OAAO,CAAA,EAAG,OAAQ,MAAM,WAAW,OAAO,CAAA,GAAU,IAAA,CAAA,SAAA,CAAU,OAAO,CAAA,GAAI,IAAA;AAC7F,EAAA,IAAI,GAAA,GAAW,aAAQ,GAAG,CAAA;AAC1B,EAAA,WAAS;AACP,IAAA,MAAM,MAAA,GAAc,IAAA,CAAA,IAAA,CAAK,GAAA,EAAK,cAAA,EAAgB,MAAM,CAAA;AACpD,IAAA,KAAA,MAAW,SAAA,IAAa,iBAAA,CAAkB,OAAO,CAAA,EAAG;AAClD,MAAA,MAAM,IAAA,GAAY,IAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,SAAS,CAAA;AACxC,MAAA,IAAI,MAAM,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,IAAA;AAAA,IACrC;AACA,IAAA,MAAM,MAAA,GAAc,aAAQ,GAAG,CAAA;AAC/B,IAAA,IAAI,MAAA,KAAW,KAAK,OAAO,IAAA;AAC3B,IAAA,GAAA,GAAM,MAAA;AAAA,EACR;AACF;AAEA,eAAsB,oBAAoB,OAAA,EAAmC;AAC3E,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,QAAA,KAAa,OAAA,GAAU,WAAA,GAAc,IAAA;AAC3D,EAAA,MAAM,IAAA,GACJ,OAAA,CAAQ,QAAA,KAAa,OAAA,GAAU,CAAC,OAAO,CAAA,GAAI,CAAC,KAAA,EAAO,CAAA,WAAA,EAAc,UAAA,CAAW,OAAO,CAAC,CAAA,CAAE,CAAA;AACxF,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACA,QAAAA,KAAY;AAC9B,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,IAAA,EAAM,EAAE,GAAA,EAAK,aAAA,EAAc,EAAG,KAAA,EAAO,QAAA,EAAU,WAAA,EAAa,IAAA,EAAM,CAAA;AAC7F,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,MAAMA,QAAAA,CAAQ,KAAK,CAAC,CAAA;AACtC,IAAA,KAAA,CAAM,GAAG,OAAA,EAAS,CAAC,SAASA,QAAAA,CAAQ,IAAA,KAAS,CAAC,CAAC,CAAA;AAAA,EACjD,CAAC,CAAA;AACH;AAEA,SAAS,kBAAkB,OAAA,EAA2B;AAEpD,EAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,OAAA,EAAS,OAAO,CAAC,OAAO,CAAA;AACjD,EAAA,MAAM,GAAA,GAAW,IAAA,CAAA,OAAA,CAAQ,OAAO,CAAA,CAAE,WAAA,EAAY;AAC9C,EAAA,IAAI,GAAA,EAAK,OAAO,CAAC,OAAO,CAAA;AACxB,EAAA,OAAO,CAAC,CAAA,EAAG,OAAO,CAAA,IAAA,CAAA,EAAQ,CAAA,EAAG,OAAO,CAAA,IAAA,CAAA,EAAQ,CAAA,EAAG,OAAO,CAAA,IAAA,CAAA,EAAQ,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,IAAA,CAAM,CAAA;AACzF;AAEA,eAAe,WAAW,QAAA,EAAoC;AAC5D,EAAA,IAAI;AACF,IAAA,MAAS,UAAO,QAAQ,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAW,KAAA,EAAuB;AAEzC,EAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAC,CAAA,CAAA,CAAA;AACzC;;;ACrCA,IAAM,iBAAA,GAAoB,CAAC,YAAA,EAAc,QAAA,EAAU,QAAQ,MAAA,EAAQ,KAAA,EAAO,QAAQ,OAAO,CAAA;AAEzF,IAAM,QAAA,GAA4C;AAAA,EAChD,UAAA,EAAY;AAAA,IACV,MAAA,EAAQ,4BAAA;AAAA,IACR,WAAA,EAAa,CAAC,YAAA,EAAc,4BAA4B;AAAA,GAC1D;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,MAAA,EAAQ,oBAAA;AAAA,IACR,WAAA,EAAa,CAAC,SAAS;AAAA,GACzB;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,6BAAA;AAAA,IACR,WAAA,EAAa,CAAC,8BAA8B;AAAA,GAC9C;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,6BAAA;AAAA,IACR,WAAA,EAAa,CAAC,8BAA8B;AAAA,GAC9C;AAAA,EACA,GAAA,EAAK;AAAA,IACH,MAAA,EAAQ,4BAAA;AAAA,IACR,WAAA,EAAa,CAAC,8BAA8B;AAAA,GAC9C;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,sBAAA;AAAA,IACR,WAAA,EAAa,CAAC,sBAAsB;AAAA,GACtC;AAAA,EACA,KAAA,EAAO;AAAA,IACL,MAAA,EAAQ,sBAAA;AAAA,IACR,WAAA,EAAa,CAAC,sBAAsB;AAAA,GACtC;AAAA,EACA,EAAA,EAAI;AAAA,IACF,MAAA,EAAQ,OAAA;AAAA,IACR,SAAA,EAAW;AAAA,MACT,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM,CAAC,SAAA,EAAW,iCAAiC,CAAA;AAAA,MACnD,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,eAAA;AAAA,IACR,SAAA,EAAW;AAAA,MACT,OAAA,EAAS,QAAA;AAAA,MACT,IAAA,EAAM,CAAC,WAAA,EAAa,KAAA,EAAO,eAAe,CAAA;AAAA,MAC1C,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,UAAA;AAAA,IACR,SAAA,EAAW;AAAA,MACT,OAAA,EAAS,KAAA;AAAA,MACT,IAAA,EAAM,CAAC,SAAA,EAAW,UAAU,CAAA;AAAA,MAC5B,KAAA,EAAO;AAAA;AACT;AAEJ,CAAA;AAmBA,IAAM,YAAA,GAA0B;AAAA,EAC9B,oBAAA;AAAA,EACA,mBAAA;AAAA,EACA,GAAA,EAAK,UAAA;AAAA,EACL,GAAA,EAAK,CAAC,OAAA,KAAY,OAAA,CAAQ,IAAI,OAAO,CAAA;AAAA,EACrC,GAAA,EAAK,MAAM,OAAA,CAAQ,GAAA,EAAI;AAAA,EACvB,IAAA,EAAM,CAAC,IAAA,KAAS,OAAA,CAAQ,KAAK,IAAI;AACnC,CAAA;AAGA,eAAsB,QAAA,CAAS,IAAA,EAAgB,IAAA,GAAkB,YAAA,EAA6B;AAC5F,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,EAAM,IAAI,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,KAAK,SAAA,CAAU,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,QAAA,CAAS,IAAI,CAAC,CAAA;AAC/D,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,QAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACrE;AAEA,EAAA,MAAM,mBAA6B,EAAC;AACpC,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,EAAA,MAAM,oBAAsE,EAAC;AAE7E,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,SAAA,EAAW;AACjC,IAAA,MAAM,OAAA,GAAU,SAAS,IAAI,CAAA;AAC7B,IAAA,IAAI,MAAM,IAAA,CAAK,oBAAA,CAAqB,QAAQ,MAAA,EAAQ,IAAA,CAAK,GAAG,CAAA,EAAG;AAC7D,MAAA,gBAAA,CAAiB,KAAK,IAAI,CAAA;AAC1B,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,OAAO,OAAA,CAAQ,WAAA,IAAe,EAAC,EAAG,WAAA,CAAY,IAAI,GAAG,CAAA;AAChE,IAAA,IAAI,OAAA,CAAQ,SAAA,EAAW,iBAAA,CAAkB,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA,EACjE;AAEA,EAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,IAAA,IAAA,CAAK,IAAI,CAAA,mBAAA,EAAsB,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,WAAA,CAAY,OAAO,CAAA,EAAG;AACxB,IAAA,MAAM,EAAA,GAAK,MAAM,oBAAA,CAAqB,IAAA,CAAK,GAAG,CAAA;AAC9C,IAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAAC,KAAAA,EAAK,GAAI,eAAe,EAAA,EAAI,KAAA,CAAM,IAAA,CAAK,WAAW,CAAC,CAAA;AACpE,IAAA,MAAM,UAAA;AAAA,MACJ,OAAA;AAAA,MACAA,KAAAA;AAAA,MACA,IAAA,CAAK,GAAA;AAAA,MACL,IAAA,CAAK,MAAA;AAAA,MACL,kCAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,aAAa,iBAAA,EAAmB;AACzC,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,SAAA,EAAY,SAAA,CAAU,KAAK,CAAA,2CAAA,CAA6C,CAAA;AACjF,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAE,MAAM,IAAA,CAAK,mBAAA,CAAoB,SAAA,CAAU,OAAO,CAAA,EAAI;AACxD,MAAA,IAAA,CAAK,IAAI,CAAA,QAAA,EAAW,SAAA,CAAU,KAAK,CAAA,WAAA,EAAc,SAAA,CAAU,OAAO,CAAA,iBAAA,CAAmB,CAAA;AACrF,MAAA;AAAA,IACF;AACA,IAAA,MAAM,UAAA;AAAA,MACJ,SAAA,CAAU,OAAA;AAAA,MACV,SAAA,CAAU,IAAA;AAAA,MACV,IAAA,CAAK,GAAA;AAAA,MACL,IAAA,CAAK,MAAA;AAAA,MACL,CAAA,eAAA,EAAkB,UAAU,KAAK,CAAA,CAAA;AAAA,MACjC;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAA,CAAK,IAAI,qBAAqB,CAAA;AAChC;AAEO,SAAS,SAAA,CACd,IAAA,EACA,IAAA,GAAgD,YAAA,EAClC;AACd,EAAA,IAAI,GAAA,GAAM,KAAK,GAAA,EAAI;AACnB,EAAA,IAAI,SAAA,GAAY,iBAAA;AAChB,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,IAAI,UAAA,GAAa,IAAA;AAEjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,GAAA,GAAWC,aAAQ,aAAA,CAAc,IAAA,EAAM,EAAE,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,IACtD,CAAA,MAAA,IAAW,QAAQ,aAAA,EAAe;AAChC,MAAA,SAAA,GAAY,cAAc,IAAA,EAAM,EAAE,CAAA,EAAG,aAAa,EAC/C,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,CACnB,OAAO,OAAO,CAAA;AAAA,IACnB,CAAA,MAAA,IAAW,QAAQ,WAAA,EAAa;AAC9B,MAAA,MAAA,GAAS,IAAA;AAAA,IACX,CAAA,MAAA,IAAW,QAAQ,iBAAA,EAAmB;AACpC,MAAA,UAAA,GAAa,KAAA;AAAA,IACf,CAAA,MAAA,IAAW,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AAC3C,MAAA,SAAA,CAAU,KAAK,GAAG,CAAA;AAClB,MAAA,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,IACf,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,GAAG,CAAA,CAAE,CAAA;AAAA,IAC1C;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,GAAA,EAAK,SAAA,EAAW,MAAA,EAAQ,UAAA,EAAW;AAC9C;AAEA,eAAsB,qBAAqB,GAAA,EAAsC;AAC/E,EAAA,IAAI,MAAM,MAAA,CAAYA,IAAA,CAAA,IAAA,CAAK,KAAK,gBAAgB,CAAC,GAAG,OAAO,MAAA;AAC3D,EAAA,IAAK,MAAM,MAAA,CAAYA,IAAA,CAAA,IAAA,CAAK,GAAA,EAAK,WAAW,CAAC,CAAA,IAAO,MAAM,MAAA,CAAYA,IAAA,CAAA,IAAA,CAAK,GAAA,EAAK,UAAU,CAAC,CAAA;AACzF,IAAA,OAAO,KAAA;AACT,EAAA,IAAI,MAAM,MAAA,CAAYA,IAAA,CAAA,IAAA,CAAK,KAAK,WAAW,CAAC,GAAG,OAAO,MAAA;AACtD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,cAAA,CACd,IACA,QAAA,EACqC;AACrC,EAAA,IAAI,EAAA,KAAO,MAAA,EAAQ,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAM,CAAC,KAAA,EAAO,IAAA,EAAM,GAAG,QAAQ,CAAA,EAAE;AAC9E,EAAA,IAAI,EAAA,KAAO,MAAA,EAAQ,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAM,CAAC,KAAA,EAAO,IAAA,EAAM,GAAG,QAAQ,CAAA,EAAE;AAC9E,EAAA,IAAI,EAAA,KAAO,KAAA,EAAO,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,CAAC,KAAA,EAAO,IAAA,EAAM,GAAG,QAAQ,CAAA,EAAE;AAC5E,EAAA,OAAO,EAAE,SAAS,KAAA,EAAO,IAAA,EAAM,CAAC,SAAA,EAAW,IAAA,EAAM,GAAG,QAAQ,CAAA,EAAE;AAChE;AAEA,eAAe,WACb,OAAA,EACA,IAAA,EACA,GAAA,EACA,MAAA,EACA,OACA,IAAA,EACe;AACf,EAAA,MAAM,WAAW,CAAC,OAAA,EAAS,GAAG,IAAI,CAAA,CAAE,KAAK,GAAG,CAAA;AAC5C,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,UAAA,EAAa,KAAK,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAE,CAAA;AAC1C,IAAA;AAAA,EACF;AACA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAE,CAAA;AAChC,EAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,IAAA,EAAM,GAAG,CAAA;AACnC;AAEO,SAAS,UAAA,CAAW,OAAA,EAAiB,IAAA,EAAgB,GAAA,EAA4B;AACtF,EAAA,MAAM,QAAQ,OAAA,CAAQ,QAAA,KAAa,OAAA,IAAW,eAAA,CAAgB,KAAK,OAAO,CAAA;AAC1E,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACF,QAAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,KAAA,GAAQG,KAAAA,CAAM,OAAA,EAAS,IAAA,EAAM;AAAA,MACjC,GAAA;AAAA,MACA,KAAKC,aAAAA,EAAc;AAAA,MACnB,KAAA,EAAO,SAAA;AAAA,MACP,KAAA;AAAA,MACA,WAAA,EAAa;AAAA,KACd,CAAA;AACD,IAAA,KAAA,CAAM,EAAA,CAAG,SAAS,MAAM,CAAA;AACxB,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAS;AAC1B,MAAA,IAAI,IAAA,KAAS,CAAA,EAAGJ,QAAAA,EAAQ;AAAA,WACnB,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,kBAAA,EAAqB,IAAA,IAAQ,MAAM,CAAA,CAAE,CAAC,CAAA;AAAA,IACxE,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAEA,eAAe,OAAO,QAAA,EAAoC;AACxD,EAAA,IAAI;AACF,IAAA,MAASK,UAAO,QAAQ,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,SAAS,aAAA,CAAc,IAAA,EAAgB,KAAA,EAAe,IAAA,EAAsB;AAC1E,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAK,CAAA;AACxB,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,iBAAA,CAAmB,CAAA;AACtD,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,UAAU,GAAA,EAAsC;AACvD,EAAA,GAAA,CAAI,CAAA;;AAAA;;AAAA;AAAA;AAAA,mDAAA,EAM+C,iBAAA,CAAkB,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,sCAAA,EACxC,OAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA;AAAA;AAAA,CAGtE,CAAA;AACD;AAGA,IAAM,eAAA,GAAkB,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,GAClC,MAAA,CAAA,IAAA,CAAY,GAAA,KAAQ,aAAA,CAAc,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAC,EAAE,IAAA,GACnD,KAAA;AAEJ,IAAI,eAAA,EAAiB;AACnB,EAAA,QAAA,CAAS,OAAA,CAAQ,KAAK,KAAA,CAAM,CAAC,CAAC,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AAC7C,IAAA,OAAA,CAAQ,MAAM,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAC9D,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAC,CAAA;AACH","file":"setup.js","sourcesContent":["import { spawn } from 'node:child_process';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { buildChildEnv } from '@wrongstack/core';\n\nexport async function resolveServerCommand(command: string, cwd: string): Promise<string | null> {\n const local = await findLocalBinary(cwd, command);\n if (local) return local;\n return (await commandExistsOnPath(command)) ? command : null;\n}\n\nexport async function findLocalBinary(cwd: string, command: string): Promise<string | null> {\n if (path.isAbsolute(command)) return (await fileExists(command)) ? path.normalize(command) : null;\n let dir = path.resolve(cwd);\n for (;;) {\n const binDir = path.join(dir, 'node_modules', '.bin');\n for (const candidate of commandCandidates(command)) {\n const full = path.join(binDir, candidate);\n if (await fileExists(full)) return full;\n }\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport async function commandExistsOnPath(command: string): Promise<boolean> {\n const probe = process.platform === 'win32' ? 'where.exe' : 'sh';\n const args =\n process.platform === 'win32' ? [command] : ['-lc', `command -v ${shellQuote(command)}`];\n return new Promise((resolve) => {\n const child = spawn(probe, args, { env: buildChildEnv(), stdio: 'ignore', windowsHide: true });\n child.on('error', () => resolve(false));\n child.on('close', (code) => resolve(code === 0));\n });\n}\n\nfunction commandCandidates(command: string): string[] {\n /* v8 ignore next -- platform-specific branch; covered on non-Windows CI. */\n if (process.platform !== 'win32') return [command];\n const ext = path.extname(command).toLowerCase();\n if (ext) return [command];\n return [`${command}.cmd`, `${command}.exe`, `${command}.bat`, command, `${command}.ps1`];\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction shellQuote(value: string): string {\n /* v8 ignore next -- only used by POSIX command probing. */\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n","#!/usr/bin/env node\nimport { spawn } from 'node:child_process';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { buildChildEnv } from '@wrongstack/core';\nimport { commandExistsOnPath, resolveServerCommand } from './utils/command-resolver.js';\n\ntype PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';\n\ninterface LanguageInstall {\n npmPackages?: string[];\n binary: string;\n toolchain?: {\n command: string;\n args: string[];\n label: string;\n };\n}\n\nconst DEFAULT_LANGUAGES = ['typescript', 'python', 'json', 'html', 'css', 'yaml', 'shell'];\n\nconst INSTALLS: Record<string, LanguageInstall> = {\n typescript: {\n binary: 'typescript-language-server',\n npmPackages: ['typescript', 'typescript-language-server'],\n },\n python: {\n binary: 'pyright-langserver',\n npmPackages: ['pyright'],\n },\n json: {\n binary: 'vscode-json-language-server',\n npmPackages: ['vscode-langservers-extracted'],\n },\n html: {\n binary: 'vscode-html-language-server',\n npmPackages: ['vscode-langservers-extracted'],\n },\n css: {\n binary: 'vscode-css-language-server',\n npmPackages: ['vscode-langservers-extracted'],\n },\n yaml: {\n binary: 'yaml-language-server',\n npmPackages: ['yaml-language-server'],\n },\n shell: {\n binary: 'bash-language-server',\n npmPackages: ['bash-language-server'],\n },\n go: {\n binary: 'gopls',\n toolchain: {\n command: 'go',\n args: ['install', 'golang.org/x/tools/gopls@latest'],\n label: 'Go toolchain',\n },\n },\n rust: {\n binary: 'rust-analyzer',\n toolchain: {\n command: 'rustup',\n args: ['component', 'add', 'rust-analyzer'],\n label: 'Rust toolchain',\n },\n },\n ruby: {\n binary: 'ruby-lsp',\n toolchain: {\n command: 'gem',\n args: ['install', 'ruby-lsp'],\n label: 'RubyGems',\n },\n },\n};\n\nexport interface SetupOptions {\n cwd: string;\n languages: string[];\n dryRun: boolean;\n toolchains: boolean;\n}\n\nexport interface SetupDeps {\n resolveServerCommand: typeof resolveServerCommand;\n commandExistsOnPath: typeof commandExistsOnPath;\n run: (command: string, args: string[], cwd: string) => Promise<void>;\n log: (message: string) => void;\n cwd: () => string;\n exit?: (code: number) => never;\n}\n\n/* v8 ignore start -- default process-bound deps are covered through injectable deps. */\nconst DEFAULT_DEPS: SetupDeps = {\n resolveServerCommand,\n commandExistsOnPath,\n run: runCommand,\n log: (message) => console.log(message),\n cwd: () => process.cwd(),\n exit: (code) => process.exit(code),\n};\n/* v8 ignore stop */\n\nexport async function runSetup(args: string[], deps: SetupDeps = DEFAULT_DEPS): Promise<void> {\n const opts = parseArgs(args, deps);\n const missing = opts.languages.filter((lang) => !INSTALLS[lang]);\n if (missing.length > 0) {\n throw new Error(`Unknown language preset(s): ${missing.join(', ')}`);\n }\n\n const alreadyInstalled: string[] = [];\n const npmPackages = new Set<string>();\n const toolchainInstalls: Array<NonNullable<LanguageInstall['toolchain']>> = [];\n\n for (const lang of opts.languages) {\n const install = INSTALLS[lang]!;\n if (await deps.resolveServerCommand(install.binary, opts.cwd)) {\n alreadyInstalled.push(lang);\n continue;\n }\n for (const pkg of install.npmPackages ?? []) npmPackages.add(pkg);\n if (install.toolchain) toolchainInstalls.push(install.toolchain);\n }\n\n if (alreadyInstalled.length > 0) {\n deps.log(`Already available: ${alreadyInstalled.join(', ')}`);\n }\n\n if (npmPackages.size > 0) {\n const pm = await detectPackageManager(opts.cwd);\n const { command, args } = installCommand(pm, Array.from(npmPackages));\n await runOrPrint(\n command,\n args,\n opts.cwd,\n opts.dryRun,\n 'Installing npm-based LSP servers',\n deps,\n );\n }\n\n for (const installer of toolchainInstalls) {\n if (!opts.toolchains) {\n deps.log(`Skipping ${installer.label}; rerun without --no-toolchains to install.`);\n continue;\n }\n if (!(await deps.commandExistsOnPath(installer.command))) {\n deps.log(`Missing ${installer.label}: command \"${installer.command}\" is not on PATH.`);\n continue;\n }\n await runOrPrint(\n installer.command,\n installer.args,\n opts.cwd,\n opts.dryRun,\n `Installing via ${installer.label}`,\n deps,\n );\n }\n\n deps.log('LSP setup finished.');\n}\n\nexport function parseArgs(\n args: string[],\n deps: Pick<SetupDeps, 'cwd' | 'exit' | 'log'> = DEFAULT_DEPS,\n): SetupOptions {\n let cwd = deps.cwd();\n let languages = DEFAULT_LANGUAGES;\n let dryRun = false;\n let toolchains = true;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]!;\n if (arg === '--cwd') {\n cwd = path.resolve(requiredValue(args, ++i, '--cwd'));\n } else if (arg === '--languages') {\n languages = requiredValue(args, ++i, '--languages')\n .split(',')\n .map((x) => x.trim())\n .filter(Boolean);\n } else if (arg === '--dry-run') {\n dryRun = true;\n } else if (arg === '--no-toolchains') {\n toolchains = false;\n } else if (arg === '--help' || arg === '-h') {\n printHelp(deps.log);\n deps.exit?.(0);\n } else {\n throw new Error(`Unknown option: ${arg}`);\n }\n }\n\n return { cwd, languages, dryRun, toolchains };\n}\n\nexport async function detectPackageManager(cwd: string): Promise<PackageManager> {\n if (await exists(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n if ((await exists(path.join(cwd, 'bun.lockb'))) || (await exists(path.join(cwd, 'bun.lock'))))\n return 'bun';\n if (await exists(path.join(cwd, 'yarn.lock'))) return 'yarn';\n return 'npm';\n}\n\nexport function installCommand(\n pm: PackageManager,\n packages: string[],\n): { command: string; args: string[] } {\n if (pm === 'pnpm') return { command: 'pnpm', args: ['add', '-D', ...packages] };\n if (pm === 'yarn') return { command: 'yarn', args: ['add', '-D', ...packages] };\n if (pm === 'bun') return { command: 'bun', args: ['add', '-d', ...packages] };\n return { command: 'npm', args: ['install', '-D', ...packages] };\n}\n\nasync function runOrPrint(\n command: string,\n args: string[],\n cwd: string,\n dryRun: boolean,\n label: string,\n deps: Pick<SetupDeps, 'run' | 'log'>,\n): Promise<void> {\n const rendered = [command, ...args].join(' ');\n if (dryRun) {\n deps.log(`[dry-run] ${label}: ${rendered}`);\n return;\n }\n deps.log(`${label}: ${rendered}`);\n await deps.run(command, args, cwd);\n}\n\nexport function runCommand(command: string, args: string[], cwd: string): Promise<void> {\n const shell = process.platform === 'win32' && /\\.(cmd|bat)$/i.test(command);\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n env: buildChildEnv(),\n stdio: 'inherit',\n shell,\n windowsHide: true,\n });\n child.on('error', reject);\n child.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`${command} exited with code ${code ?? 'null'}`));\n });\n });\n}\n\nasync function exists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction requiredValue(args: string[], index: number, name: string): string {\n const value = args[index];\n if (!value) throw new Error(`${name} requires a value`);\n return value;\n}\n\nfunction printHelp(log: (message: string) => void): void {\n log(`wrongstack-lsp-setup\n\nInstall Language Server Protocol binaries for @wrongstack/plug-lsp.\n\nOptions:\n --cwd <path> Project directory. Defaults to current directory.\n --languages <list> Comma list. Defaults to ${DEFAULT_LANGUAGES.join(',')}.\n Available: ${Object.keys(INSTALLS).join(',')}.\n --dry-run Print commands without running them.\n --no-toolchains Skip Go/Rust/Ruby toolchain installers.\n`);\n}\n\n/* v8 ignore start -- CLI process-exit wrapper is exercised by invoking the built bin, not unit imports. */\nconst isCliEntrypoint = process.argv[1]\n ? import.meta.url === pathToFileURL(process.argv[1]).href\n : false;\n\nif (isCliEntrypoint) {\n runSetup(process.argv.slice(2)).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n });\n}\n/* v8 ignore stop */\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wrongstack/plug-lsp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "WrongStack plugin that exposes Language Server Protocol tools.",
|
|
6
6
|
"repository": {
|
|
@@ -31,13 +31,13 @@
|
|
|
31
31
|
"vscode-languageserver-protocol": "^3.17.5"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
|
-
"@wrongstack/core": "0.
|
|
34
|
+
"@wrongstack/core": "0.4.1"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/node": "^22.19.19",
|
|
38
38
|
"tsup": "^8.5.1",
|
|
39
39
|
"typescript": "^5.9.3",
|
|
40
|
-
"@wrongstack/core": "0.
|
|
40
|
+
"@wrongstack/core": "0.4.1"
|
|
41
41
|
},
|
|
42
42
|
"publishConfig": {
|
|
43
43
|
"access": "public"
|