export interface Position { line: number; character: number; } export interface Range { start: Position; end: Position; } export interface Location { uri: string; range: Range; } export interface LocationLink { targetUri: string; targetRange: Range; targetSelectionRange?: Range; } export interface Diagnostic { range: Range; severity?: 1 | 2 | 3 | 4; code?: string | number; source?: string; message: string; } export interface TextEdit { range: Range; newText: string; } export interface WorkspaceEdit { changes?: Record; documentChanges?: Array< | { textDocument: { uri: string; version?: number | null }; edits: TextEdit[] } | { kind: "create"; uri: string } | { kind: "rename"; oldUri: string; newUri: string } | { kind: "delete"; uri: string; options?: { recursive?: boolean } } >; } export interface LspServerConfig { name: string; command: string; args: string[]; fileTypes: string[]; rootMarkers: string[]; initializationOptions?: unknown; settings?: unknown; env?: Record; } export interface ServerStatus { name: string; command: string; root: string; state: "configured" | "starting" | "ready" | "stopped" | "error"; error?: string; capabilities?: Record; } export interface LspClientLike { readonly config: LspServerConfig; readonly root: string; readonly capabilities: Record; readonly closed: boolean; ensureFileOpen(file: string): Promise; request(method: string, params: unknown, signal?: AbortSignal, timeoutMs?: number): Promise; notify(method: string, params: unknown): void; getDiagnostics(uri: string, waitMs?: number, signal?: AbortSignal): Promise; shutdown(): Promise; } export interface LspManagerLike { clientForFile(file: string, cwd: string, serverName?: string, signal?: AbortSignal, timeoutMs?: number): Promise; clientsForWorkspace(cwd: string, signal?: AbortSignal, timeoutMs?: number): Promise; status(cwd: string): Promise; reload(): Promise; shutdown(): Promise; }