import type { ChildProcessWithoutNullStreams } from 'node:child_process'; import type { EventBus } from '@wrongstack/core/kernel'; import type { Logger } from '@wrongstack/core/types'; import type { CodeAction, CodeActionParams, CompletionItem, CompletionList, CompletionParams, Diagnostic, DocumentSymbol, DocumentSymbolParams, ExecuteCommandParams, Hover, HoverParams, Location, LocationLink, Position, PrepareRenameParams, ReferenceParams, RenameParams, ServerCapabilities, SymbolInformation, TextDocumentItem, VersionedTextDocumentIdentifier, WorkspaceEdit, WorkspaceSymbolParams } from 'vscode-languageserver-protocol'; import type { ServerConfig, ServerState } from '../types.js'; export interface ServerContext { cwd: string; rootPath: string; log: Logger; events: EventBus; onCrash?: ((server: LSPServer) => void) | undefined; } export declare class LSPServer { readonly name: string; readonly config: ServerConfig; private readonly ctx; /** * Hard cap on retained diagnostics entries. Each entry holds a `Diagnostic[]` * for one file URI; without a cap a long-lived server keeps one entry per * distinct URI ever opened (RAM-leak audit 2026-07-31, MEDIUM). Oldest * entries are evicted first; `notifyDidClose` drops entries eagerly. */ static readonly MAX_DIAGNOSTICS_ENTRIES = 500; state: ServerState; capabilities: ServerCapabilities | null; readonly diagnostics: Map; private child; private connection; private processReachedReady; private stderrRing; constructor(name: string, config: ServerConfig, ctx: ServerContext); get rootPath(): string; get lastStderr(): string; start(signal?: AbortSignal): Promise; shutdown(): Promise; definition(params: TextDocumentPositionParamsLike, timeoutMs: number, signal: AbortSignal): Promise; references(params: ReferenceParams, timeoutMs: number, signal: AbortSignal): Promise; hover(params: HoverParams, timeoutMs: number, signal: AbortSignal): Promise; completion(params: CompletionParams, timeoutMs: number, signal: AbortSignal): Promise; documentSymbol(params: DocumentSymbolParams, timeoutMs: number, signal: AbortSignal): Promise; workspaceSymbol(params: WorkspaceSymbolParams, timeoutMs: number, signal: AbortSignal): Promise; prepareRename(params: PrepareRenameParams, timeoutMs: number, signal: AbortSignal): Promise<{ range: unknown; placeholder?: string | undefined; } | import('vscode-languageserver-protocol').Range | null>; rename(params: RenameParams, timeoutMs: number, signal: AbortSignal): Promise; codeAction(params: CodeActionParams, timeoutMs: number, signal: AbortSignal): Promise; executeCommand(params: ExecuteCommandParams, timeoutMs: number, signal: AbortSignal): Promise; pullDiagnostics(uri: string, timeoutMs: number, signal: AbortSignal): Promise; getDiagnostics(uri: string): Diagnostic[]; notifyDidOpen(doc: TextDocumentItem): void; notifyDidChange(doc: VersionedTextDocumentIdentifier, text: string): void; notifyDidClose(uri: string): void; textDocumentIdentifier(filePath: string): { uri: string; }; private request; private notification; /** * Store diagnostics with LRU semantics: re-insert so the entry becomes * most-recently-used, then evict the oldest entries past the cap. */ private setDiagnostics; private captureStderr; } interface TextDocumentPositionParamsLike { textDocument: { uri: string; }; position: Position; } declare function startupFailure(child: ChildProcessWithoutNullStreams): { promise: Promise; cancel: () => void; }; /** Direct-module test seam; not re-exported by the package barrel. */ export declare const lspServerCoverage: { startupFailure: typeof startupFailure; }; export {}; //# sourceMappingURL=lsp-server.d.ts.map