@kenkaiiii/ggcoder 5.23.1 → 5.23.3
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/app-sidecar.js +11 -0
- package/dist/app-sidecar.js.map +1 -1
- package/dist/chat-agents/general.test.js +6 -3
- package/dist/chat-agents/general.test.js.map +1 -1
- package/dist/chat-agents/specialists.test.js +3 -2
- package/dist/chat-agents/specialists.test.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +12 -0
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +41 -40
- package/dist/config.js.map +1 -1
- package/dist/config.test.js +61 -1
- package/dist/config.test.js.map +1 -1
- package/dist/core/agent-mcp-passthrough.test.d.ts +2 -0
- package/dist/core/agent-mcp-passthrough.test.d.ts.map +1 -0
- package/dist/core/agent-mcp-passthrough.test.js +61 -0
- package/dist/core/agent-mcp-passthrough.test.js.map +1 -0
- package/dist/core/agent-session-compaction.test.js +4 -7
- package/dist/core/agent-session-compaction.test.js.map +1 -1
- package/dist/core/agent-session-marker-anchors.test.js +4 -7
- package/dist/core/agent-session-marker-anchors.test.js.map +1 -1
- package/dist/core/agent-session-memory-tail.test.js +4 -7
- package/dist/core/agent-session-memory-tail.test.js.map +1 -1
- package/dist/core/agent-session-queue.test.js +4 -7
- package/dist/core/agent-session-queue.test.js.map +1 -1
- package/dist/core/agent-tools-allowlist.test.js +5 -3
- package/dist/core/agent-tools-allowlist.test.js.map +1 -1
- package/dist/core/agents.d.ts +11 -0
- package/dist/core/agents.d.ts.map +1 -1
- package/dist/core/agents.js +21 -0
- package/dist/core/agents.js.map +1 -1
- package/dist/core/agents.test.d.ts +2 -0
- package/dist/core/agents.test.d.ts.map +1 -0
- package/dist/core/agents.test.js +67 -0
- package/dist/core/agents.test.js.map +1 -0
- package/dist/core/encode-cwd.d.ts +17 -0
- package/dist/core/encode-cwd.d.ts.map +1 -1
- package/dist/core/encode-cwd.js +20 -7
- package/dist/core/encode-cwd.js.map +1 -1
- package/dist/core/encode-cwd.test.js +20 -1
- package/dist/core/encode-cwd.test.js.map +1 -1
- package/dist/core/ideal-review.d.ts.map +1 -1
- package/dist/core/ideal-review.js +6 -1
- package/dist/core/ideal-review.js.map +1 -1
- package/dist/core/ideal-review.test.js +7 -2
- package/dist/core/ideal-review.test.js.map +1 -1
- package/dist/core/lsp/client.d.ts +50 -0
- package/dist/core/lsp/client.d.ts.map +1 -1
- package/dist/core/lsp/client.js +158 -13
- package/dist/core/lsp/client.js.map +1 -1
- package/dist/core/lsp/jsonrpc.d.ts +38 -1
- package/dist/core/lsp/jsonrpc.d.ts.map +1 -1
- package/dist/core/lsp/jsonrpc.js +13 -1
- package/dist/core/lsp/jsonrpc.js.map +1 -1
- package/dist/core/lsp/manager.d.ts.map +1 -1
- package/dist/core/lsp/manager.js +23 -2
- package/dist/core/lsp/manager.js.map +1 -1
- package/dist/core/lsp/manager.test.js +32 -1
- package/dist/core/lsp/manager.test.js.map +1 -1
- package/dist/core/lsp/test-support.d.ts +18 -0
- package/dist/core/lsp/test-support.d.ts.map +1 -0
- package/dist/core/lsp/test-support.js +27 -0
- package/dist/core/lsp/test-support.js.map +1 -0
- package/dist/core/lsp/uri.test.d.ts +2 -0
- package/dist/core/lsp/uri.test.d.ts.map +1 -0
- package/dist/core/lsp/uri.test.js +56 -0
- package/dist/core/lsp/uri.test.js.map +1 -0
- package/dist/core/lsp/windows.test.d.ts +2 -0
- package/dist/core/lsp/windows.test.d.ts.map +1 -0
- package/dist/core/lsp/windows.test.js +251 -0
- package/dist/core/lsp/windows.test.js.map +1 -0
- package/dist/core/mcp/resolve-stdio.d.ts +35 -0
- package/dist/core/mcp/resolve-stdio.d.ts.map +1 -1
- package/dist/core/mcp/resolve-stdio.js +80 -1
- package/dist/core/mcp/resolve-stdio.js.map +1 -1
- package/dist/core/mcp/resolve-stdio.test.js +99 -4
- package/dist/core/mcp/resolve-stdio.test.js.map +1 -1
- package/dist/core/persistent-shell.d.ts +3 -1
- package/dist/core/persistent-shell.d.ts.map +1 -1
- package/dist/core/persistent-shell.js +13 -3
- package/dist/core/persistent-shell.js.map +1 -1
- package/dist/core/process-manager-dev-server-repro.test.js +34 -12
- package/dist/core/process-manager-dev-server-repro.test.js.map +1 -1
- package/dist/core/process-manager.d.ts +1 -1
- package/dist/core/process-manager.d.ts.map +1 -1
- package/dist/core/process-manager.js +23 -13
- package/dist/core/process-manager.js.map +1 -1
- package/dist/core/project-discovery.d.ts +10 -0
- package/dist/core/project-discovery.d.ts.map +1 -1
- package/dist/core/project-discovery.js +42 -8
- package/dist/core/project-discovery.js.map +1 -1
- package/dist/core/project-discovery.test.js +102 -1
- package/dist/core/project-discovery.test.js.map +1 -1
- package/dist/core/prompt-commands.d.ts.map +1 -1
- package/dist/core/prompt-commands.js +12 -9
- package/dist/core/prompt-commands.js.map +1 -1
- package/dist/core/prompt-commands.test.js +10 -0
- package/dist/core/prompt-commands.test.js.map +1 -1
- package/dist/core/radio.test.js +4 -1
- package/dist/core/radio.test.js.map +1 -1
- package/dist/core/runtime-mode.d.ts +8 -0
- package/dist/core/runtime-mode.d.ts.map +1 -1
- package/dist/core/runtime-mode.js +10 -0
- package/dist/core/runtime-mode.js.map +1 -1
- package/dist/core/session-storage.d.ts.map +1 -1
- package/dist/core/session-storage.js +25 -1
- package/dist/core/session-storage.js.map +1 -1
- package/dist/core/session-storage.test.js +4 -1
- package/dist/core/session-storage.test.js.map +1 -1
- package/dist/core/skills-routing.test.js +3 -1
- package/dist/core/skills-routing.test.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +7 -3
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/speed-benchmark.test.js +9 -3
- package/dist/core/speed-benchmark.test.js.map +1 -1
- package/dist/core/subagent-manager.d.ts +1 -1
- package/dist/core/subagent-manager.d.ts.map +1 -1
- package/dist/core/subagent-manager.js +9 -0
- package/dist/core/subagent-manager.js.map +1 -1
- package/dist/core/subagent-store.test.js +14 -2
- package/dist/core/subagent-store.test.js.map +1 -1
- package/dist/modes/json-mode.d.ts +7 -0
- package/dist/modes/json-mode.d.ts.map +1 -1
- package/dist/modes/json-mode.js +1 -0
- package/dist/modes/json-mode.js.map +1 -1
- package/dist/modes/subagent-worker-mode.d.ts +2 -0
- package/dist/modes/subagent-worker-mode.d.ts.map +1 -1
- package/dist/modes/subagent-worker-mode.js.map +1 -1
- package/dist/system-prompt.js +1 -1
- package/dist/system-prompt.js.map +1 -1
- package/dist/system-prompt.test.js +3 -0
- package/dist/system-prompt.test.js.map +1 -1
- package/dist/test-support/fake-home.d.ts +20 -0
- package/dist/test-support/fake-home.d.ts.map +1 -0
- package/dist/test-support/fake-home.js +37 -0
- package/dist/test-support/fake-home.js.map +1 -0
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +7 -3
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/bash.test.js +103 -7
- package/dist/tools/bash.test.js.map +1 -1
- package/dist/tools/edit-robustness.test.js +3 -1
- package/dist/tools/edit-robustness.test.js.map +1 -1
- package/dist/tools/find.d.ts.map +1 -1
- package/dist/tools/find.js +4 -1
- package/dist/tools/find.js.map +1 -1
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +3 -1
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/overflow.test.js +4 -7
- package/dist/tools/overflow.test.js.map +1 -1
- package/dist/tools/path-utils.d.ts +15 -0
- package/dist/tools/path-utils.d.ts.map +1 -1
- package/dist/tools/path-utils.js +17 -0
- package/dist/tools/path-utils.js.map +1 -1
- package/dist/tools/path-utils.test.js +7 -2
- package/dist/tools/path-utils.test.js.map +1 -1
- package/dist/tools/search-code.d.ts.map +1 -1
- package/dist/tools/search-code.js +6 -4
- package/dist/tools/search-code.js.map +1 -1
- package/dist/tools/subagent.d.ts +1 -1
- package/dist/tools/subagent.d.ts.map +1 -1
- package/dist/tools/subagent.js +8 -0
- package/dist/tools/subagent.js.map +1 -1
- package/dist/utils/process.d.ts +26 -3
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js +68 -10
- package/dist/utils/process.js.map +1 -1
- package/dist/utils/process.test.d.ts +2 -0
- package/dist/utils/process.test.d.ts.map +1 -0
- package/dist/utils/process.test.js +42 -0
- package/dist/utils/process.test.js.map +1 -0
- package/package.json +4 -4
package/dist/core/lsp/client.js
CHANGED
|
@@ -2,19 +2,95 @@ import { spawn } from "node:child_process";
|
|
|
2
2
|
import { pathToFileURL } from "node:url";
|
|
3
3
|
import { JsonRpcConnection, JsonRpcRequestError } from "./jsonrpc.js";
|
|
4
4
|
import { getSafeToolEnv } from "../../tools/safe-env.js";
|
|
5
|
+
import { killProcessTree } from "../../utils/process.js";
|
|
6
|
+
import { log } from "../logger.js";
|
|
5
7
|
function progressTokenKey(token) {
|
|
6
8
|
return `${typeof token}:${String(token)}`;
|
|
7
9
|
}
|
|
8
10
|
const SERVER_CANCELLED = -32802;
|
|
9
11
|
const METHOD_NOT_FOUND = -32601;
|
|
10
12
|
const PULL_POLL_INTERVAL_MS = 300;
|
|
13
|
+
/** Bounded stderr retained per server for failure diagnostics. */
|
|
14
|
+
const STDERR_TAIL_BYTES = 4000;
|
|
11
15
|
const SHUTDOWN_TIMEOUT_MS = 2000;
|
|
12
16
|
const KILL_GRACE_MS = 1500;
|
|
17
|
+
/**
|
|
18
|
+
* JSON-RPC wire tracer, enabled only by `GG_LSP_TRACE=1`.
|
|
19
|
+
*
|
|
20
|
+
* When a server accepts a document and then never publishes diagnostics, the
|
|
21
|
+
* outcome (`timeout`) looks identical whether our `didOpen` never went out, the
|
|
22
|
+
* server rejected it, or it answered about a URI we weren't watching. Only the
|
|
23
|
+
* wire tells those apart. Opt-in because it is genuinely chatty, and params are
|
|
24
|
+
* SUMMARIZED rather than dumped so a trace can never spill file contents into a
|
|
25
|
+
* log.
|
|
26
|
+
*/
|
|
27
|
+
function wireTracer(serverId) {
|
|
28
|
+
if (process.env.GG_LSP_TRACE !== "1")
|
|
29
|
+
return undefined;
|
|
30
|
+
return (direction, message) => {
|
|
31
|
+
const params = message.params;
|
|
32
|
+
// `window/logMessage` / `window/showMessage` are the server's own
|
|
33
|
+
// human-readable complaints ("cannot find tsserver", bad option, …) and are
|
|
34
|
+
// frequently the only statement of what actually went wrong. Everything
|
|
35
|
+
// else is summarized — never file contents.
|
|
36
|
+
const isServerMessage = message.method === "window/logMessage" || message.method === "window/showMessage";
|
|
37
|
+
log("DEBUG", "lsp", `${serverId} rpc ${direction}`, {
|
|
38
|
+
method: message.method ?? `(response id=${String(message.id)})`,
|
|
39
|
+
uri: params?.textDocument?.uri ?? params?.uri,
|
|
40
|
+
// Counts only, never the diagnostics themselves.
|
|
41
|
+
diagnostics: Array.isArray(params?.diagnostics) ? params.diagnostics.length : undefined,
|
|
42
|
+
text: isServerMessage ? params?.message?.slice(0, 300) : undefined,
|
|
43
|
+
error: message.error?.message,
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
}
|
|
13
47
|
function sleep(ms) {
|
|
14
48
|
return new Promise((resolve) => {
|
|
15
49
|
setTimeout(resolve, ms).unref();
|
|
16
50
|
});
|
|
17
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Canonical cache key for a `file://` URI.
|
|
54
|
+
*
|
|
55
|
+
* Diagnostics live in a Map keyed by URI: we `set` what the server sends and
|
|
56
|
+
* `get` what we built from the edited path, so the two must be the SAME STRING.
|
|
57
|
+
* There is no single canonical spelling of a file URI, and on Windows we and
|
|
58
|
+
* tsserver disagreed in two independent ways at once. Measured on CI:
|
|
59
|
+
*
|
|
60
|
+
* we sent: file:///c:/Users/RUNNER%7E1/…/main.ts
|
|
61
|
+
* server sent: file:///c%3A/Users/RUNNER~1/…/main.ts
|
|
62
|
+
*
|
|
63
|
+
* `~` is an RFC 3986 unreserved character that `pathToFileURL` percent-encodes
|
|
64
|
+
* and tsserver leaves literal; the drive colon is the reverse. Every lookup
|
|
65
|
+
* missed, so the diagnostics arrived (the wire trace shows `diagnostics=1`)
|
|
66
|
+
* and were then dropped on the floor — reported to the user as a clean file,
|
|
67
|
+
* because LSP degrades silently by design. 8.3 short names like `RUNNER~1` are
|
|
68
|
+
* not exotic: that IS the Windows temp path on GitHub runners, and `PROGRA~1`
|
|
69
|
+
* and friends show up in real user paths.
|
|
70
|
+
*
|
|
71
|
+
* Fix: decode percent-escapes and lower-case the drive letter, so both
|
|
72
|
+
* spellings collapse to one key. Used ONLY as a Map key — the URI actually put
|
|
73
|
+
* on the wire is still the properly encoded one from `pathToFileURL`.
|
|
74
|
+
*
|
|
75
|
+
* Windows paths are also case-insensitive, but case is deliberately NOT folded:
|
|
76
|
+
* both sides derive from the same path string, and folding would break the
|
|
77
|
+
* genuinely case-sensitive POSIX servers that share this code.
|
|
78
|
+
*/
|
|
79
|
+
export function normalizeUri(uri) {
|
|
80
|
+
let decoded = uri;
|
|
81
|
+
try {
|
|
82
|
+
decoded = decodeURI(uri);
|
|
83
|
+
// decodeURI leaves %3A alone (`:` is reserved), so unescape it explicitly
|
|
84
|
+
// rather than reaching for decodeURIComponent, which would also mangle any
|
|
85
|
+
// literal `#`/`?` a filename is allowed to contain.
|
|
86
|
+
decoded = decoded.replace(/%3A/gi, ":");
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Malformed escape sequence — fall back to the raw URI rather than throwing
|
|
90
|
+
// inside a notification handler.
|
|
91
|
+
}
|
|
92
|
+
return decoded.replace(/^(file:\/\/\/)([A-Za-z])(:)/, (_m, prefix, drive) => `${prefix}${drive.toLowerCase()}:`);
|
|
93
|
+
}
|
|
18
94
|
/**
|
|
19
95
|
* One language-server process bound to one project root. Owns document sync
|
|
20
96
|
* (didOpen / didChange / didSave with per-uri version counters), the
|
|
@@ -33,29 +109,49 @@ export class LspClient {
|
|
|
33
109
|
activeProgressTokens = new Set();
|
|
34
110
|
alive = true;
|
|
35
111
|
initializationOptions;
|
|
112
|
+
stderrBuffer = "";
|
|
36
113
|
constructor(spec, rootPath, command) {
|
|
37
114
|
this.spec = spec;
|
|
38
115
|
this.rootPath = rootPath;
|
|
39
116
|
this.initializationOptions = command.initializationOptions ?? {};
|
|
40
117
|
this.proc = spawn(command.command, command.args, {
|
|
41
118
|
cwd: rootPath,
|
|
42
|
-
|
|
119
|
+
// stderr was "ignore" — which made every server-side failure completely
|
|
120
|
+
// unattributable. LSP degrades silently by design, so a server that boots
|
|
121
|
+
// and then errors (a tsserver that can't start, a bad
|
|
122
|
+
// initializationOptions path, an unsupported flag) produced exactly the
|
|
123
|
+
// same empty output as a clean file, with nothing anywhere saying why.
|
|
124
|
+
// Diagnosing the Windows timeout was blind for precisely this reason.
|
|
125
|
+
// Pipe it and log it; the pipe MUST be drained either way, or a chatty
|
|
126
|
+
// server eventually blocks on a full stderr buffer.
|
|
127
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
43
128
|
env: getSafeToolEnv(),
|
|
44
129
|
});
|
|
130
|
+
this.captureStderr();
|
|
45
131
|
this.proc.on("error", () => this.markDead());
|
|
46
|
-
this.proc.on("exit", () =>
|
|
132
|
+
this.proc.on("exit", (code, signal) => {
|
|
133
|
+
if (code !== 0 && code !== null) {
|
|
134
|
+
log("WARN", "lsp", `${spec.id} language server exited`, {
|
|
135
|
+
code,
|
|
136
|
+
signal,
|
|
137
|
+
stderr: this.stderrTail(),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
this.markDead();
|
|
141
|
+
});
|
|
47
142
|
const { stdout, stdin } = this.proc;
|
|
48
143
|
if (!stdout || !stdin) {
|
|
49
144
|
// Cannot happen with "pipe" stdio, but guard instead of asserting.
|
|
50
145
|
this.proc.kill("SIGKILL");
|
|
51
146
|
throw new Error(`failed to open stdio pipes for ${spec.id} language server`);
|
|
52
147
|
}
|
|
53
|
-
this.conn = new JsonRpcConnection(stdout, stdin);
|
|
148
|
+
this.conn = new JsonRpcConnection(stdout, stdin, wireTracer(spec.id));
|
|
54
149
|
this.conn.onNotification("textDocument/publishDiagnostics", (params) => {
|
|
55
150
|
const publish = params;
|
|
56
|
-
|
|
151
|
+
const uri = normalizeUri(publish.uri);
|
|
152
|
+
this.published.set(uri, publish.diagnostics);
|
|
57
153
|
this.waiters = this.waiters.filter((waiter) => {
|
|
58
|
-
if (waiter.uri !==
|
|
154
|
+
if (waiter.uri !== uri)
|
|
59
155
|
return true;
|
|
60
156
|
waiter.resolve(publish.diagnostics);
|
|
61
157
|
return false;
|
|
@@ -79,7 +175,30 @@ export class LspClient {
|
|
|
79
175
|
get hasActiveProgress() {
|
|
80
176
|
return this.activeProgressTokens.size > 0;
|
|
81
177
|
}
|
|
178
|
+
/**
|
|
179
|
+
* Drain the server's stderr into a bounded ring, and mirror it to the debug
|
|
180
|
+
* log so a misbehaving server is diagnosable from `~/.gg/*.log` alone.
|
|
181
|
+
* Bounded because a looping server can emit stderr without limit.
|
|
182
|
+
*/
|
|
183
|
+
captureStderr() {
|
|
184
|
+
this.proc.stderr?.on("data", (chunk) => {
|
|
185
|
+
const text = chunk.toString();
|
|
186
|
+
this.stderrBuffer = (this.stderrBuffer + text).slice(-STDERR_TAIL_BYTES);
|
|
187
|
+
const trimmed = text.trim();
|
|
188
|
+
if (trimmed)
|
|
189
|
+
log("DEBUG", "lsp", `${this.spec.id} stderr`, { text: trimmed.slice(0, 500) });
|
|
190
|
+
});
|
|
191
|
+
// A read error must not take the process down; the server is still usable.
|
|
192
|
+
this.proc.stderr?.on("error", () => { });
|
|
193
|
+
}
|
|
194
|
+
/** Most recent server stderr, for failure diagnostics. */
|
|
195
|
+
stderrTail() {
|
|
196
|
+
return this.stderrBuffer.trim().slice(-STDERR_TAIL_BYTES);
|
|
197
|
+
}
|
|
82
198
|
async initialize(timeoutMs) {
|
|
199
|
+
// Wire value: keep it properly percent-encoded. `normalizeUri` is a cache
|
|
200
|
+
// key helper, and a decoded root (`C:\Program Files\…` → a literal space)
|
|
201
|
+
// is not a valid URI to hand a server at initialize.
|
|
83
202
|
const rootUri = pathToFileURL(this.rootPath).href;
|
|
84
203
|
const result = (await this.conn.request("initialize", {
|
|
85
204
|
processId: process.pid,
|
|
@@ -106,11 +225,16 @@ export class LspClient {
|
|
|
106
225
|
* report computed against THIS content rather than a stale one.
|
|
107
226
|
*/
|
|
108
227
|
syncDocument(filePath, content) {
|
|
228
|
+
// Two different strings on purpose: `uri` is the properly percent-encoded
|
|
229
|
+
// form that goes ON THE WIRE (a literal space or `~` there would be an
|
|
230
|
+
// invalid URI), while `key` is the decoded form used for our own bookkeeping
|
|
231
|
+
// so it matches whatever spelling the server replies with.
|
|
109
232
|
const uri = pathToFileURL(filePath).href;
|
|
110
|
-
|
|
111
|
-
|
|
233
|
+
const key = normalizeUri(uri);
|
|
234
|
+
this.published.delete(key);
|
|
235
|
+
const previousVersion = this.versions.get(key);
|
|
112
236
|
if (previousVersion === undefined) {
|
|
113
|
-
this.versions.set(
|
|
237
|
+
this.versions.set(key, 1);
|
|
114
238
|
this.conn.notify("textDocument/didOpen", {
|
|
115
239
|
textDocument: {
|
|
116
240
|
uri,
|
|
@@ -122,7 +246,7 @@ export class LspClient {
|
|
|
122
246
|
}
|
|
123
247
|
else {
|
|
124
248
|
const version = previousVersion + 1;
|
|
125
|
-
this.versions.set(
|
|
249
|
+
this.versions.set(key, version);
|
|
126
250
|
this.conn.notify("textDocument/didChange", {
|
|
127
251
|
textDocument: { uri, version },
|
|
128
252
|
contentChanges: [{ text: content }],
|
|
@@ -173,10 +297,28 @@ export class LspClient {
|
|
|
173
297
|
this.conn.notify("exit");
|
|
174
298
|
const killTimer = setTimeout(() => {
|
|
175
299
|
if (this.alive)
|
|
176
|
-
this.
|
|
300
|
+
this.terminate();
|
|
177
301
|
}, KILL_GRACE_MS);
|
|
178
302
|
killTimer.unref();
|
|
179
303
|
}
|
|
304
|
+
/**
|
|
305
|
+
* Force-kill the server and everything it spawned, immediately.
|
|
306
|
+
*
|
|
307
|
+
* For a server that never completed the handshake, the polite
|
|
308
|
+
* `shutdown`/`exit` sequence is pointless — it has already proven it isn't
|
|
309
|
+
* answering — so skip straight to the kill.
|
|
310
|
+
*
|
|
311
|
+
* Uses `killProcessTree`, not `proc.kill()`: language servers spawn children
|
|
312
|
+
* (typescript-language-server runs tsserver), Windows has no process groups,
|
|
313
|
+
* and killing only the parent leaves those children alive holding file
|
|
314
|
+
* handles in the project directory.
|
|
315
|
+
*/
|
|
316
|
+
terminate() {
|
|
317
|
+
this.conn.dispose();
|
|
318
|
+
if (this.proc.pid !== undefined)
|
|
319
|
+
killProcessTree(this.proc.pid);
|
|
320
|
+
this.markDead();
|
|
321
|
+
}
|
|
180
322
|
markDead() {
|
|
181
323
|
this.alive = false;
|
|
182
324
|
this.activeProgressTokens.clear();
|
|
@@ -187,14 +329,17 @@ export class LspClient {
|
|
|
187
329
|
waiter.resolve([]);
|
|
188
330
|
}
|
|
189
331
|
waitForPublish(uri, timeoutMs) {
|
|
190
|
-
|
|
332
|
+
// Both the cache and the waiter list are keyed by the normalized form, which
|
|
333
|
+
// is what the publishDiagnostics handler stores under.
|
|
334
|
+
const key = normalizeUri(uri);
|
|
335
|
+
const cached = this.published.get(key);
|
|
191
336
|
if (cached !== undefined)
|
|
192
337
|
return Promise.resolve(cached);
|
|
193
338
|
if (!this.alive)
|
|
194
339
|
return Promise.resolve(null);
|
|
195
340
|
return new Promise((resolve) => {
|
|
196
341
|
const waiter = {
|
|
197
|
-
uri,
|
|
342
|
+
uri: key,
|
|
198
343
|
resolve: (diagnostics) => {
|
|
199
344
|
clearTimeout(timer);
|
|
200
345
|
resolve(diagnostics);
|
|
@@ -214,7 +359,7 @@ export class LspClient {
|
|
|
214
359
|
if (report?.kind === "full")
|
|
215
360
|
return report.items ?? [];
|
|
216
361
|
if (report?.kind === "unchanged")
|
|
217
|
-
return this.published.get(uri) ?? [];
|
|
362
|
+
return this.published.get(normalizeUri(uri)) ?? [];
|
|
218
363
|
return "unsupported";
|
|
219
364
|
}
|
|
220
365
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/core/lsp/client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/core/lsp/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAmB,MAAM,cAAc,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AA2BnC,SAAS,gBAAgB,CAAC,KAAsB;IAC9C,OAAO,GAAG,OAAO,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,gBAAgB,GAAG,CAAC,KAAK,CAAC;AAChC,MAAM,gBAAgB,GAAG,CAAC,KAAK,CAAC;AAChC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,kEAAkE;AAClE,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAC/B,MAAM,mBAAmB,GAAG,IAAI,CAAC;AACjC,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B;;;;;;;;;GASG;AACH,SAAS,UAAU,CAAC,QAAgB;IAClC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,GAAG;QAAE,OAAO,SAAS,CAAC;IACvD,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE;QAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,MAOV,CAAC;QACd,kEAAkE;QAClE,4EAA4E;QAC5E,wEAAwE;QACxE,4CAA4C;QAC5C,MAAM,eAAe,GACnB,OAAO,CAAC,MAAM,KAAK,mBAAmB,IAAI,OAAO,CAAC,MAAM,KAAK,oBAAoB,CAAC;QACpF,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,QAAQ,QAAQ,SAAS,EAAE,EAAE;YAClD,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,gBAAgB,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG;YAC/D,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG;YAC7C,iDAAiD;YACjD,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YACvF,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;YAClE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO;SAC9B,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,IAAI,CAAC;QACH,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QACzB,0EAA0E;QAC1E,2EAA2E;QAC3E,oDAAoD;QACpD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,4EAA4E;QAC5E,iCAAiC;IACnC,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CACpB,6BAA6B,EAC7B,CAAC,EAAE,EAAE,MAAc,EAAE,KAAa,EAAE,EAAE,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE,GAAG,CAC1E,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,SAAS;IAcD;IACA;IAdF,IAAI,CAAe;IACnB,IAAI,CAAoB;IACxB,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IACrC,SAAS,GAAG,IAAI,GAAG,EAA2B,CAAC;IACxD,OAAO,GAAuB,EAAE,CAAC;IACjC,kBAAkB,GAAG,KAAK,CAAC;IAClB,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAC;IAClD,KAAK,GAAG,IAAI,CAAC;IAEJ,qBAAqB,CAAU;IACxC,YAAY,GAAG,EAAE,CAAC;IAE1B,YACmB,IAAmB,EACnB,QAAgB,EACjC,OAAwB;QAFP,SAAI,GAAJ,IAAI,CAAe;QACnB,aAAQ,GAAR,QAAQ,CAAQ;QAGjC,IAAI,CAAC,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,IAAI,EAAE,CAAC;QACjE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE;YAC/C,GAAG,EAAE,QAAQ;YACb,wEAAwE;YACxE,0EAA0E;YAC1E,sDAAsD;YACtD,wEAAwE;YACxE,uEAAuE;YACvE,sEAAsE;YACtE,uEAAuE;YACvE,oDAAoD;YACpD,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,GAAG,EAAE,cAAc,EAAE;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACpC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAChC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,EAAE,yBAAyB,EAAE;oBACtD,IAAI;oBACJ,MAAM;oBACN,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE;iBAC1B,CAAC,CAAC;YACL,CAAC;YACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;QACpC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACtB,mEAAmE;YACnE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,kCAAkC,IAAI,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,iCAAiC,EAAE,CAAC,MAAM,EAAE,EAAE;YACrE,MAAM,OAAO,GAAG,MAAkC,CAAC;YACnD,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;YAC7C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC5C,IAAI,MAAM,CAAC,GAAG,KAAK,GAAG;oBAAE,OAAO,IAAI,CAAC;gBACpC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBACpC,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE;YAChD,MAAM,QAAQ,GAAG,MAAwB,CAAC;YAC1C,IAAI,QAAQ,EAAE,KAAK,KAAK,SAAS;gBAAE,OAAO;YAC1C,MAAM,GAAG,GAAG,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC7C,IAAI,QAAQ,CAAC,KAAK,EAAE,IAAI,KAAK,OAAO;gBAAE,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;iBACpE,IAAI,QAAQ,CAAC,KAAK,EAAE,IAAI,KAAK,KAAK;gBAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,iFAAiF;IACjF,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,oBAAoB,CAAC,IAAI,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACK,aAAa;QACnB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;YACtD,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC,CAAC;YACzE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,OAAO;gBAAE,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9F,CAAC,CAAC,CAAC;QACH,2EAA2E;QAC3E,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,0DAA0D;IAC1D,UAAU;QACR,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAiB;QAChC,0EAA0E;QAC1E,0EAA0E;QAC1E,qDAAqD;QACrD,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;QAClD,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CACrC,YAAY,EACZ;YACE,SAAS,EAAE,OAAO,CAAC,GAAG;YACtB,OAAO;YACP,gBAAgB,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YACrD,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;YACjD,YAAY,EAAE;gBACZ,YAAY,EAAE;oBACZ,eAAe,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;oBAClC,kBAAkB,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE;oBACjD,UAAU,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,sBAAsB,EAAE,KAAK,EAAE;iBAC1E;gBACD,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE;gBAC1D,MAAM,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE;aACnC;SACF,EACD,SAAS,CACV,CAA+D,CAAC;QACjE,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC;QAC5E,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,QAAgB,EAAE,OAAe;QAC5C,0EAA0E;QAC1E,uEAAuE;QACvE,6EAA6E;QAC7E,2DAA2D;QAC3D,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;QACzC,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE;gBACvC,YAAY,EAAE;oBACZ,GAAG;oBACH,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;oBAC1D,OAAO,EAAE,CAAC;oBACV,IAAI,EAAE,OAAO;iBACd;aACF,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,eAAe,GAAG,CAAC,CAAC;YACpC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,wBAAwB,EAAE;gBACzC,YAAY,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;gBAC9B,cAAc,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;aACpC,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACrF,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,kBAAkB,CAAC,GAAW,EAAE,SAAiB;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAAE,OAAO,IAAI,CAAC;QAE1C,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,IAAI,GAAG,CAAC,KAAK,IAAqC,EAAE;YACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACxC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;gBACvD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAClF,IAAI,KAAK,KAAK,aAAa;oBAAE,OAAO,IAAI,CAAC;gBACzC,IAAI,KAAK,KAAK,OAAO;oBAAE,OAAO,KAAK,CAAC;gBACpC,MAAM,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACrC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,EAAE,CAAC;QAEL,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1C,CAAC;gBAAS,CAAC;YACT,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,QAAQ;QACN,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;QACxB,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,mBAAmB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC9E,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAChC,IAAI,IAAI,CAAC,KAAK;gBAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QACnC,CAAC,EAAE,aAAa,CAAC,CAAC;QAClB,SAAS,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAED;;;;;;;;;;;OAWG;IACH,SAAS;QACP,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS;YAAE,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChE,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAEO,QAAQ;QACd,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACnD,CAAC;IAEO,cAAc,CAAC,GAAW,EAAE,SAAiB;QACnD,6EAA6E;QAC7E,uDAAuD;QACvD,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9C,OAAO,IAAI,OAAO,CAAyB,CAAC,OAAO,EAAE,EAAE;YACrD,MAAM,MAAM,GAAqB;gBAC/B,GAAG,EAAE,GAAG;gBACR,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE;oBACvB,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,OAAO,CAAC,WAAW,CAAC,CAAC;gBACvB,CAAC;aACF,CAAC;YACF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;gBACxD,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,EAAE,SAAS,CAAC,CAAC;YACd,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,eAAe,CAC3B,GAAW,EACX,SAAiB;QAEjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CACrC,yBAAyB,EACzB,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,EAAE,EACzB,SAAS,CACV,CAAsD,CAAC;YACxD,IAAI,MAAM,EAAE,IAAI,KAAK,MAAM;gBAAE,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;YACvD,IAAI,MAAM,EAAE,IAAI,KAAK,WAAW;gBAAE,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACrF,OAAO,aAAa,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,mBAAmB,EAAE,CAAC;gBACzC,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB;oBAAE,OAAO,OAAO,CAAC;gBACpD,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB;oBAAE,OAAO,aAAa,CAAC;YAC5D,CAAC;YACD,OAAO,aAAa,CAAC;QACvB,CAAC;IACH,CAAC;CACF;AAED,SAAS,WAAW,CAAC,QAAgB;IACnC,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;AAC7D,CAAC"}
|
|
@@ -1,9 +1,29 @@
|
|
|
1
1
|
import type { Readable, Writable } from "node:stream";
|
|
2
|
+
/**
|
|
3
|
+
* Minimal JSON-RPC 2.0 connection over a byte stream pair with LSP-style
|
|
4
|
+
* Content-Length framing. Zero dependencies by design — this module must
|
|
5
|
+
* never pull in vscode-jsonrpc or any other package (hard distribution
|
|
6
|
+
* constraint: LSP diagnostics add no install weight).
|
|
7
|
+
*/
|
|
8
|
+
interface JsonRpcMessage {
|
|
9
|
+
jsonrpc?: string;
|
|
10
|
+
id?: number | string;
|
|
11
|
+
method?: string;
|
|
12
|
+
params?: unknown;
|
|
13
|
+
result?: unknown;
|
|
14
|
+
error?: {
|
|
15
|
+
code: number;
|
|
16
|
+
message: string;
|
|
17
|
+
data?: unknown;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
2
20
|
export declare class JsonRpcRequestError extends Error {
|
|
3
21
|
readonly code: number;
|
|
4
22
|
constructor(method: string, code: number, message: string);
|
|
5
23
|
}
|
|
6
24
|
export type NotificationHandler = (params: unknown) => void;
|
|
25
|
+
/** Observer for every framed message crossing the wire, in both directions. */
|
|
26
|
+
export type WireTracer = (direction: "out" | "in", message: JsonRpcMessage) => void;
|
|
7
27
|
/**
|
|
8
28
|
* JSON-RPC connection speaking Content-Length framed messages.
|
|
9
29
|
*
|
|
@@ -14,12 +34,28 @@ export type NotificationHandler = (params: unknown) => void;
|
|
|
14
34
|
*/
|
|
15
35
|
export declare class JsonRpcConnection {
|
|
16
36
|
private readonly output;
|
|
37
|
+
/**
|
|
38
|
+
* Optional wire tracer. Diagnosing a server that accepts a document and
|
|
39
|
+
* then never publishes requires seeing whether our notification actually
|
|
40
|
+
* went out and whether anything came back — indistinguishable from outside,
|
|
41
|
+
* because LSP failures are silent by design. Off unless a caller passes
|
|
42
|
+
* one, so the normal path is byte-identical.
|
|
43
|
+
*/
|
|
44
|
+
private readonly trace?;
|
|
17
45
|
private buffer;
|
|
18
46
|
private nextId;
|
|
19
47
|
private readonly pending;
|
|
20
48
|
private readonly notificationHandlers;
|
|
21
49
|
private disposed;
|
|
22
|
-
constructor(input: Readable, output: Writable
|
|
50
|
+
constructor(input: Readable, output: Writable,
|
|
51
|
+
/**
|
|
52
|
+
* Optional wire tracer. Diagnosing a server that accepts a document and
|
|
53
|
+
* then never publishes requires seeing whether our notification actually
|
|
54
|
+
* went out and whether anything came back — indistinguishable from outside,
|
|
55
|
+
* because LSP failures are silent by design. Off unless a caller passes
|
|
56
|
+
* one, so the normal path is byte-identical.
|
|
57
|
+
*/
|
|
58
|
+
trace?: WireTracer | undefined);
|
|
23
59
|
onNotification(method: string, handler: NotificationHandler): void;
|
|
24
60
|
request(method: string, params: unknown, timeoutMs: number): Promise<unknown>;
|
|
25
61
|
notify(method: string, params?: unknown): void;
|
|
@@ -29,4 +65,5 @@ export declare class JsonRpcConnection {
|
|
|
29
65
|
private onData;
|
|
30
66
|
private onMessage;
|
|
31
67
|
}
|
|
68
|
+
export {};
|
|
32
69
|
//# sourceMappingURL=jsonrpc.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonrpc.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/jsonrpc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"jsonrpc.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/jsonrpc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEtD;;;;;GAKG;AAEH,UAAU,cAAc;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC3D;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1D;AAED,MAAM,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;AAE5D,+EAA+E;AAC/E,MAAM,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;AAIpF;;;;;;;GAOG;AACH,qBAAa,iBAAiB;IAS1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;IAhBzB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoD;IAC5E,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA4C;IACjF,OAAO,CAAC,QAAQ,CAAS;gBAGvB,KAAK,EAAE,QAAQ,EACE,MAAM,EAAE,QAAQ;IACjC;;;;;;OAMG;IACc,KAAK,CAAC,EAAE,UAAU,YAAA;IAOrC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAMlE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuB7E,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI;IAI9C,iEAAiE;IACjE,OAAO,IAAI,IAAI;IASf,OAAO,CAAC,IAAI;IAWZ,OAAO,CAAC,MAAM;IA0Bd,OAAO,CAAC,SAAS;CA6BlB"}
|
package/dist/core/lsp/jsonrpc.js
CHANGED
|
@@ -17,13 +17,23 @@ const HEADER_SEPARATOR = "\r\n\r\n";
|
|
|
17
17
|
*/
|
|
18
18
|
export class JsonRpcConnection {
|
|
19
19
|
output;
|
|
20
|
+
trace;
|
|
20
21
|
buffer = Buffer.alloc(0);
|
|
21
22
|
nextId = 1;
|
|
22
23
|
pending = new Map();
|
|
23
24
|
notificationHandlers = new Map();
|
|
24
25
|
disposed = false;
|
|
25
|
-
constructor(input, output
|
|
26
|
+
constructor(input, output,
|
|
27
|
+
/**
|
|
28
|
+
* Optional wire tracer. Diagnosing a server that accepts a document and
|
|
29
|
+
* then never publishes requires seeing whether our notification actually
|
|
30
|
+
* went out and whether anything came back — indistinguishable from outside,
|
|
31
|
+
* because LSP failures are silent by design. Off unless a caller passes
|
|
32
|
+
* one, so the normal path is byte-identical.
|
|
33
|
+
*/
|
|
34
|
+
trace) {
|
|
26
35
|
this.output = output;
|
|
36
|
+
this.trace = trace;
|
|
27
37
|
input.on("data", (chunk) => this.onData(chunk));
|
|
28
38
|
// Writing to a dead server's stdin must never crash the host process.
|
|
29
39
|
output.on("error", () => { });
|
|
@@ -72,6 +82,7 @@ export class JsonRpcConnection {
|
|
|
72
82
|
send(msg) {
|
|
73
83
|
if (this.disposed)
|
|
74
84
|
return;
|
|
85
|
+
this.trace?.("out", msg);
|
|
75
86
|
const body = JSON.stringify(msg);
|
|
76
87
|
try {
|
|
77
88
|
this.output.write(`Content-Length: ${Buffer.byteLength(body)}\r\n\r\n${body}`);
|
|
@@ -109,6 +120,7 @@ export class JsonRpcConnection {
|
|
|
109
120
|
}
|
|
110
121
|
}
|
|
111
122
|
onMessage(msg) {
|
|
123
|
+
this.trace?.("in", msg);
|
|
112
124
|
// Response to one of our requests.
|
|
113
125
|
if (msg.id !== undefined && msg.method === undefined) {
|
|
114
126
|
const settle = typeof msg.id === "number" ? this.pending.get(msg.id) : undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonrpc.js","sourceRoot":"","sources":["../../../src/core/lsp/jsonrpc.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACnC,IAAI,CAAS;IAEtB,YAAY,MAAc,EAAE,IAAY,EAAE,OAAe;QACvD,KAAK,CAAC,GAAG,MAAM,KAAK,OAAO,UAAU,IAAI,GAAG,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"jsonrpc.js","sourceRoot":"","sources":["../../../src/core/lsp/jsonrpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,iBAAiB;IAChC,sEAAsE;IACtE,OAAO,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IACnC,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,cAAc,GACtB,aAAa,GACb,OAAO,GACP,gBAAgB,GAChB,SAAS,GACT,aAAa,GACb,aAAa,GACb,eAAe,CAAC;AAEpB,UAAU,cAAc;IACtB,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,oBAAoB,GAC5B,CAAC,cAAc,GAAG;IAChB,IAAI,EAAE,aAAa,CAAC;IACpB,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,GACF,CAAC,cAAc,GAAG;IAChB,IAAI,EAAE,OAAO,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;CAC9C,CAAC,CAAC;AAWP;;;;GAIG;AACH,qBAAa,UAAU;IAanB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAZtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,iEAAiE;IACjE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgD;IACxE,qEAAqE;IACrE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA2C;IAC1E,OAAO,CAAC,QAAQ,CAAS;gBAGN,GAAG,EAAE,MAAM,EAC5B,OAAO,CAAC,EAAE,iBAAiB;IAQ7B;;;OAGG;IACG,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/E,qEAAqE;IAC/D,6BAA6B,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,oBAAoB,CAAC;IA6BhC,8EAA8E;IAC9E,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS;IAIpE,mDAAmD;IACnD,iBAAiB,IAAI,oBAAoB,EAAE;IAI3C,oEAAoE;IACpE,WAAW,IAAI,IAAI;IAanB,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,MAAM;YAWA,OAAO;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,iBAAiB;IAChC,sEAAsE;IACtE,OAAO,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IACnC,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,cAAc,GACtB,aAAa,GACb,OAAO,GACP,gBAAgB,GAChB,SAAS,GACT,aAAa,GACb,aAAa,GACb,eAAe,CAAC;AAEpB,UAAU,cAAc;IACtB,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,oBAAoB,GAC5B,CAAC,cAAc,GAAG;IAChB,IAAI,EAAE,aAAa,CAAC;IACpB,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,GACF,CAAC,cAAc,GAAG;IAChB,IAAI,EAAE,OAAO,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;CAC9C,CAAC,CAAC;AAWP;;;;GAIG;AACH,qBAAa,UAAU;IAanB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAZtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,iEAAiE;IACjE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgD;IACxE,qEAAqE;IACrE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA2C;IAC1E,OAAO,CAAC,QAAQ,CAAS;gBAGN,GAAG,EAAE,MAAM,EAC5B,OAAO,CAAC,EAAE,iBAAiB;IAQ7B;;;OAGG;IACG,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/E,qEAAqE;IAC/D,6BAA6B,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,oBAAoB,CAAC;IA6BhC,8EAA8E;IAC9E,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS;IAIpE,mDAAmD;IACnD,iBAAiB,IAAI,oBAAoB,EAAE;IAI3C,oEAAoE;IACpE,WAAW,IAAI,IAAI;IAanB,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,MAAM;YAWA,OAAO;IAkDrB,OAAO,CAAC,YAAY;CA2CrB"}
|
package/dist/core/lsp/manager.js
CHANGED
|
@@ -120,8 +120,18 @@ export class LspManager {
|
|
|
120
120
|
this.clients.set(key, Promise.resolve({ status: "server_failed" }));
|
|
121
121
|
return this.outcome("server_failed", filePath);
|
|
122
122
|
}
|
|
123
|
-
if (diagnostics === null)
|
|
123
|
+
if (diagnostics === null) {
|
|
124
|
+
// A timeout carries no other evidence and is indistinguishable from
|
|
125
|
+
// "clean" in the tool output. Log the server's own stderr alongside it —
|
|
126
|
+
// usually the only thing that explains why a server accepted the document
|
|
127
|
+
// and then never reported on it.
|
|
128
|
+
log("WARN", "lsp", `${spec.id} diagnostics timed out`, {
|
|
129
|
+
file: filePath,
|
|
130
|
+
budgetMs,
|
|
131
|
+
stderr: client.stderrTail() || "(none)",
|
|
132
|
+
});
|
|
124
133
|
return this.outcome("timeout", filePath);
|
|
134
|
+
}
|
|
125
135
|
if (diagnostics.length > 0) {
|
|
126
136
|
const relPath = path.relative(this.cwd, filePath);
|
|
127
137
|
return {
|
|
@@ -144,9 +154,16 @@ export class LspManager {
|
|
|
144
154
|
log("INFO", "lsp", `${spec.id} language server not available`, { root });
|
|
145
155
|
return { status: "unavailable" };
|
|
146
156
|
}
|
|
157
|
+
// `client` is declared outside the try so one that fails to initialize
|
|
158
|
+
// can still be killed. `new LspClient` SPAWNS the process, so discarding
|
|
159
|
+
// the reference on a throw leaked the server forever — one orphan per
|
|
160
|
+
// (server, root) every time initialize timed out, for the life of the
|
|
161
|
+
// session. Invisible on POSIX; on Windows the orphan keeps handles open
|
|
162
|
+
// in the project directory.
|
|
163
|
+
let client;
|
|
147
164
|
try {
|
|
148
165
|
const startedAt = Date.now();
|
|
149
|
-
|
|
166
|
+
client = new LspClient(spec, root, command);
|
|
150
167
|
await client.initialize(INIT_TIMEOUT_MS);
|
|
151
168
|
if (!client.isAlive)
|
|
152
169
|
return { status: "server_failed" };
|
|
@@ -160,7 +177,11 @@ export class LspManager {
|
|
|
160
177
|
log("WARN", "lsp", `${spec.id} server failed to start`, {
|
|
161
178
|
root,
|
|
162
179
|
error: error instanceof Error ? error.message : String(error),
|
|
180
|
+
// The server's own last words — usually the only explanation of why
|
|
181
|
+
// the handshake never completed.
|
|
182
|
+
stderr: client?.stderrTail() || "(none)",
|
|
163
183
|
});
|
|
184
|
+
client?.terminate();
|
|
164
185
|
return { status: "server_failed" };
|
|
165
186
|
}
|
|
166
187
|
})();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/core/lsp/manager.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/core/lsp/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
2
|
import fs from "node:fs/promises";
|
|
3
|
+
import { removeWhenReleased } from "./test-support.js";
|
|
3
4
|
import path from "node:path";
|
|
4
5
|
import os from "node:os";
|
|
5
6
|
import { fileURLToPath } from "node:url";
|
|
@@ -26,7 +27,7 @@ describe("LspManager", () => {
|
|
|
26
27
|
afterEach(async () => {
|
|
27
28
|
for (const manager of managers)
|
|
28
29
|
manager.shutdownAll();
|
|
29
|
-
await
|
|
30
|
+
await removeWhenReleased(tmpDir);
|
|
30
31
|
});
|
|
31
32
|
function makeManager(spec, budgets) {
|
|
32
33
|
const manager = new LspManager(tmpDir, {
|
|
@@ -131,6 +132,36 @@ describe("LspManager", () => {
|
|
|
131
132
|
const outcome = await manager.diagnosticsAfterWriteDetailed(path.join(tmpDir, "init-failed.fake"), "ERROR\n");
|
|
132
133
|
expect(outcome.kind).toBe("server_failed");
|
|
133
134
|
});
|
|
135
|
+
it("kills a server that fails to initialize instead of leaking it", async () => {
|
|
136
|
+
// `new LspClient` SPAWNS the process, so an initialize that rejects used to
|
|
137
|
+
// drop the only reference to a LIVE server: one orphan per (server, root)
|
|
138
|
+
// for the whole session. Invisible on POSIX; on Windows the orphan holds
|
|
139
|
+
// handles in the project directory, which is how it surfaced — as an EBUSY
|
|
140
|
+
// rmdir in this suite's teardown, long after the assertions had passed.
|
|
141
|
+
const pidFile = path.join(tmpDir, "server.pid");
|
|
142
|
+
const manager = makeManager(fakeSpec(["--init-error", `--pid-file=${pidFile}`]));
|
|
143
|
+
const outcome = await manager.diagnosticsAfterWriteDetailed(path.join(tmpDir, "init-failed.fake"), "ERROR\n");
|
|
144
|
+
expect(outcome.kind).toBe("server_failed");
|
|
145
|
+
const pid = Number(await fs.readFile(pidFile, "utf-8"));
|
|
146
|
+
expect(Number.isInteger(pid)).toBe(true);
|
|
147
|
+
const alive = () => {
|
|
148
|
+
try {
|
|
149
|
+
process.kill(pid, 0);
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
// Termination is asynchronous (taskkill on Windows); give it a moment.
|
|
157
|
+
for (let attempt = 0; attempt < 50 && alive(); attempt++) {
|
|
158
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
159
|
+
}
|
|
160
|
+
if (alive()) {
|
|
161
|
+
process.kill(pid, "SIGKILL"); // never leak a live process out of the suite
|
|
162
|
+
throw new Error(`language server ${pid} survived a failed initialize`);
|
|
163
|
+
}
|
|
164
|
+
}, 30_000);
|
|
134
165
|
it("records a post-initialization server crash", async () => {
|
|
135
166
|
const manager = makeManager(fakeSpec(["--crash-on-open"]));
|
|
136
167
|
const outcome = await manager.diagnosticsAfterWriteDetailed(path.join(tmpDir, "crashed.fake"), "ERROR\n");
|