@mcp-graph-workflow/mcp-graph 5.11.0 → 5.13.0
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/api/routes/code-graph.d.ts.map +1 -1
- package/dist/api/routes/code-graph.js +163 -0
- package/dist/api/routes/code-graph.js.map +1 -1
- package/dist/core/code/code-indexer.d.ts +5 -3
- package/dist/core/code/code-indexer.d.ts.map +1 -1
- package/dist/core/code/code-indexer.js +57 -10
- package/dist/core/code/code-indexer.js.map +1 -1
- package/dist/core/code/code-types.d.ts +8 -0
- package/dist/core/code/code-types.d.ts.map +1 -1
- package/dist/core/code/code-types.js.map +1 -1
- package/dist/core/code/graph-traversal.d.ts +15 -0
- package/dist/core/code/graph-traversal.d.ts.map +1 -1
- package/dist/core/code/graph-traversal.js +53 -0
- package/dist/core/code/graph-traversal.js.map +1 -1
- package/dist/core/code/ts-analyzer.d.ts +6 -1
- package/dist/core/code/ts-analyzer.d.ts.map +1 -1
- package/dist/core/code/ts-analyzer.js +8 -0
- package/dist/core/code/ts-analyzer.js.map +1 -1
- package/dist/core/config/config-schema.d.ts +8 -0
- package/dist/core/config/config-schema.d.ts.map +1 -1
- package/dist/core/config/config-schema.js +3 -1
- package/dist/core/config/config-schema.js.map +1 -1
- package/dist/core/context/context-assembler.d.ts +2 -0
- package/dist/core/context/context-assembler.d.ts.map +1 -1
- package/dist/core/context/context-assembler.js +15 -0
- package/dist/core/context/context-assembler.js.map +1 -1
- package/dist/core/lsp/language-detector.d.ts +11 -0
- package/dist/core/lsp/language-detector.d.ts.map +1 -0
- package/dist/core/lsp/language-detector.js +149 -0
- package/dist/core/lsp/language-detector.js.map +1 -0
- package/dist/core/lsp/lsp-analyzer.d.ts +16 -0
- package/dist/core/lsp/lsp-analyzer.d.ts.map +1 -0
- package/dist/core/lsp/lsp-analyzer.js +30 -0
- package/dist/core/lsp/lsp-analyzer.js.map +1 -0
- package/dist/core/lsp/lsp-bridge.d.ts +40 -0
- package/dist/core/lsp/lsp-bridge.d.ts.map +1 -0
- package/dist/core/lsp/lsp-bridge.js +349 -0
- package/dist/core/lsp/lsp-bridge.js.map +1 -0
- package/dist/core/lsp/lsp-cache.d.ts +33 -0
- package/dist/core/lsp/lsp-cache.d.ts.map +1 -0
- package/dist/core/lsp/lsp-cache.js +134 -0
- package/dist/core/lsp/lsp-cache.js.map +1 -0
- package/dist/core/lsp/lsp-client.d.ts +47 -0
- package/dist/core/lsp/lsp-client.d.ts.map +1 -0
- package/dist/core/lsp/lsp-client.js +256 -0
- package/dist/core/lsp/lsp-client.js.map +1 -0
- package/dist/core/lsp/lsp-diagnostics.d.ts +40 -0
- package/dist/core/lsp/lsp-diagnostics.d.ts.map +1 -0
- package/dist/core/lsp/lsp-diagnostics.js +113 -0
- package/dist/core/lsp/lsp-diagnostics.js.map +1 -0
- package/dist/core/lsp/lsp-server-manager.d.ts +56 -0
- package/dist/core/lsp/lsp-server-manager.d.ts.map +1 -0
- package/dist/core/lsp/lsp-server-manager.js +330 -0
- package/dist/core/lsp/lsp-server-manager.js.map +1 -0
- package/dist/core/lsp/lsp-types.d.ts +130 -0
- package/dist/core/lsp/lsp-types.d.ts.map +1 -0
- package/dist/core/lsp/lsp-types.js +131 -0
- package/dist/core/lsp/lsp-types.js.map +1 -0
- package/dist/core/lsp/server-registry.d.ts +19 -0
- package/dist/core/lsp/server-registry.d.ts.map +1 -0
- package/dist/core/lsp/server-registry.js +188 -0
- package/dist/core/lsp/server-registry.js.map +1 -0
- package/dist/core/rag/multi-strategy-retrieval.d.ts +6 -0
- package/dist/core/rag/multi-strategy-retrieval.d.ts.map +1 -1
- package/dist/core/rag/multi-strategy-retrieval.js +31 -3
- package/dist/core/rag/multi-strategy-retrieval.js.map +1 -1
- package/dist/core/store/migrations.d.ts.map +1 -1
- package/dist/core/store/migrations.js +21 -0
- package/dist/core/store/migrations.js.map +1 -1
- package/dist/mcp/tools/code-intelligence.d.ts +15 -0
- package/dist/mcp/tools/code-intelligence.d.ts.map +1 -0
- package/dist/mcp/tools/code-intelligence.js +276 -0
- package/dist/mcp/tools/code-intelligence.js.map +1 -0
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +4 -0
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/schemas/knowledge.schema.d.ts +2 -0
- package/dist/schemas/knowledge.schema.d.ts.map +1 -1
- package/dist/schemas/knowledge.schema.js +1 -1
- package/dist/schemas/knowledge.schema.js.map +1 -1
- package/dist/web/dashboard/dist/assets/{benchmark-tab-DE9sF83l.js → benchmark-tab-BEhOzJlc.js} +1 -1
- package/dist/web/dashboard/dist/assets/{context-tab-BDBUYfAA.js → context-tab-ByaP4N46.js} +1 -1
- package/dist/web/dashboard/dist/assets/{gitnexus-tab-Yn1v6B3B.js → gitnexus-tab-DJRcS3G4.js} +1 -1
- package/dist/web/dashboard/dist/assets/{graph-section-C6dzE7Vr.js → graph-section-BaZ4D0V3.js} +1 -1
- package/dist/web/dashboard/dist/assets/{graph-tab-eIpG9sGq.js → graph-tab-DtcApd98.js} +1 -1
- package/dist/web/dashboard/dist/assets/{graph-utils-Cq350VUG.js → graph-utils-D63XCNDU.js} +1 -1
- package/dist/web/dashboard/dist/assets/index-CArYPWPp.css +1 -0
- package/dist/web/dashboard/dist/assets/{index-ruquw1ns.js → index-DQtPV3qe.js} +1 -1
- package/dist/web/dashboard/dist/assets/{index-BjE9IIVd.js → index-HSRYSwKs.js} +1 -1
- package/dist/web/dashboard/dist/assets/{index-CsH_Hv51.js → index-kFRgiPES.js} +27 -27
- package/dist/web/dashboard/dist/assets/{insights-tab-iSZItsRP.js → insights-tab-T0-9T-Z4.js} +1 -1
- package/dist/web/dashboard/dist/assets/{journey-tab-GXibD334.js → journey-tab-mvsQLYuc.js} +1 -1
- package/dist/web/dashboard/dist/assets/{logs-tab-DROI_l7-.js → logs-tab-HnGNd4kM.js} +1 -1
- package/dist/web/dashboard/dist/assets/{memories-tab-DUMqEP5R.js → memories-tab-DFzupuld.js} +1 -1
- package/dist/web/dashboard/dist/assets/{prd-backlog-tab-DIQ0Fmr_.js → prd-backlog-tab-D6rg9QUS.js} +1 -1
- package/dist/web/dashboard/dist/assets/{siebel-tab-Ci5KiOA6.js → siebel-tab-_cudpzBi.js} +3 -3
- package/dist/web/dashboard/dist/assets/{skills-tab-EfuAQFRT.js → skills-tab-wVTeNO96.js} +1 -1
- package/dist/web/dashboard/dist/assets/{style-DF9Y1aXX.js → style-B2fcRCDQ.js} +1 -1
- package/dist/web/dashboard/dist/index.html +2 -2
- package/package.json +1 -1
- package/dist/web/dashboard/dist/assets/index-p238Jynp.css +0 -1
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LspClient — Generic JSON-RPC 2.0 client over stdio.
|
|
3
|
+
*
|
|
4
|
+
* Communicates with ANY Language Server Protocol server by spawning
|
|
5
|
+
* it as a child process and exchanging JSON-RPC 2.0 messages via
|
|
6
|
+
* Content-Length framed stdio.
|
|
7
|
+
*/
|
|
8
|
+
import { spawn } from "node:child_process";
|
|
9
|
+
import { EventEmitter } from "node:events";
|
|
10
|
+
import { logger } from "../utils/logger.js";
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Content-Length header pattern
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
const HEADER_REGEX = /Content-Length:\s*(\d+)\r\n\r\n/;
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// LspClient
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
export class LspClient extends EventEmitter {
|
|
19
|
+
command;
|
|
20
|
+
args;
|
|
21
|
+
requestTimeoutMs;
|
|
22
|
+
process = null;
|
|
23
|
+
nextId = 1;
|
|
24
|
+
pending = new Map();
|
|
25
|
+
buffer = Buffer.alloc(0);
|
|
26
|
+
_ready = false;
|
|
27
|
+
constructor(command, args, requestTimeoutMs = 30_000) {
|
|
28
|
+
super();
|
|
29
|
+
this.command = command;
|
|
30
|
+
this.args = args;
|
|
31
|
+
this.requestTimeoutMs = requestTimeoutMs;
|
|
32
|
+
}
|
|
33
|
+
/** Whether the child process is running and ready for messages. */
|
|
34
|
+
get ready() {
|
|
35
|
+
return this._ready;
|
|
36
|
+
}
|
|
37
|
+
/** PID of the child process (if running). */
|
|
38
|
+
get pid() {
|
|
39
|
+
return this.process?.pid;
|
|
40
|
+
}
|
|
41
|
+
/** Spawn the child process. Does NOT send `initialize`. */
|
|
42
|
+
async start() {
|
|
43
|
+
if (this.process) {
|
|
44
|
+
logger.warn("LspClient.start called but process already running", {
|
|
45
|
+
command: this.command,
|
|
46
|
+
});
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
logger.info("LspClient spawning server", {
|
|
50
|
+
command: this.command,
|
|
51
|
+
args: this.args.join(" "),
|
|
52
|
+
});
|
|
53
|
+
const child = spawn(this.command, this.args, {
|
|
54
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
55
|
+
});
|
|
56
|
+
this.process = child;
|
|
57
|
+
child.stdout?.on("data", (data) => {
|
|
58
|
+
this.handleData(data);
|
|
59
|
+
});
|
|
60
|
+
child.stderr?.on("data", (data) => {
|
|
61
|
+
logger.debug("LSP stderr", {
|
|
62
|
+
command: this.command,
|
|
63
|
+
data: data.toString("utf8").trim(),
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
child.on("error", (err) => {
|
|
67
|
+
logger.error("LSP process error", {
|
|
68
|
+
command: this.command,
|
|
69
|
+
error: err.message,
|
|
70
|
+
});
|
|
71
|
+
this._ready = false;
|
|
72
|
+
this.rejectAll(err);
|
|
73
|
+
this.emit("error", err);
|
|
74
|
+
});
|
|
75
|
+
child.on("exit", (code, signal) => {
|
|
76
|
+
logger.info("LSP process exited", {
|
|
77
|
+
command: this.command,
|
|
78
|
+
code: String(code ?? "null"),
|
|
79
|
+
signal: String(signal ?? "null"),
|
|
80
|
+
});
|
|
81
|
+
this._ready = false;
|
|
82
|
+
this.rejectAll(new Error(`LSP process exited (code=${code}, signal=${signal})`));
|
|
83
|
+
this.process = null;
|
|
84
|
+
this.emit("exit", code, signal);
|
|
85
|
+
});
|
|
86
|
+
this._ready = true;
|
|
87
|
+
}
|
|
88
|
+
/** Send `shutdown` request + `exit` notification, then wait for exit. */
|
|
89
|
+
async stop() {
|
|
90
|
+
if (!this.process) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
await this.sendRequest("shutdown");
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Server may already be gone — that's fine.
|
|
98
|
+
}
|
|
99
|
+
this.sendNotification("exit");
|
|
100
|
+
await new Promise((resolve) => {
|
|
101
|
+
const killTimer = setTimeout(() => {
|
|
102
|
+
logger.warn("LSP process did not exit gracefully, killing", {
|
|
103
|
+
command: this.command,
|
|
104
|
+
});
|
|
105
|
+
this.kill();
|
|
106
|
+
resolve();
|
|
107
|
+
}, 5_000);
|
|
108
|
+
if (this.process) {
|
|
109
|
+
this.process.once("exit", () => {
|
|
110
|
+
clearTimeout(killTimer);
|
|
111
|
+
resolve();
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
clearTimeout(killTimer);
|
|
116
|
+
resolve();
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
this._ready = false;
|
|
120
|
+
}
|
|
121
|
+
/** Send a JSON-RPC request and wait for the corresponding response. */
|
|
122
|
+
async sendRequest(method, params) {
|
|
123
|
+
if (!this.process?.stdin?.writable) {
|
|
124
|
+
throw new Error("LSP process is not running or stdin is not writable");
|
|
125
|
+
}
|
|
126
|
+
const id = this.nextId++;
|
|
127
|
+
const request = {
|
|
128
|
+
jsonrpc: "2.0",
|
|
129
|
+
id,
|
|
130
|
+
method,
|
|
131
|
+
...(params !== undefined ? { params } : {}),
|
|
132
|
+
};
|
|
133
|
+
return new Promise((resolve, reject) => {
|
|
134
|
+
const timer = setTimeout(() => {
|
|
135
|
+
this.pending.delete(id);
|
|
136
|
+
reject(new Error(`LSP request timed out after ${this.requestTimeoutMs}ms: ${method}`));
|
|
137
|
+
}, this.requestTimeoutMs);
|
|
138
|
+
this.pending.set(id, {
|
|
139
|
+
resolve: resolve,
|
|
140
|
+
reject,
|
|
141
|
+
timer,
|
|
142
|
+
});
|
|
143
|
+
const encoded = this.encode(request);
|
|
144
|
+
this.process.stdin.write(encoded);
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
/** Send a JSON-RPC notification (fire-and-forget, no response expected). */
|
|
148
|
+
sendNotification(method, params) {
|
|
149
|
+
if (!this.process?.stdin?.writable) {
|
|
150
|
+
logger.warn("LspClient.sendNotification: stdin not writable", { method });
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const notification = {
|
|
154
|
+
jsonrpc: "2.0",
|
|
155
|
+
method,
|
|
156
|
+
...(params !== undefined ? { params } : {}),
|
|
157
|
+
};
|
|
158
|
+
const encoded = this.encode(notification);
|
|
159
|
+
this.process.stdin.write(encoded);
|
|
160
|
+
}
|
|
161
|
+
/** Kill the child process immediately (SIGKILL). */
|
|
162
|
+
kill() {
|
|
163
|
+
if (this.process) {
|
|
164
|
+
this.process.kill("SIGKILL");
|
|
165
|
+
this.process = null;
|
|
166
|
+
this._ready = false;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// -------------------------------------------------------------------------
|
|
170
|
+
// Internal helpers
|
|
171
|
+
// -------------------------------------------------------------------------
|
|
172
|
+
/** Encode a JSON-RPC message with Content-Length header. */
|
|
173
|
+
encode(msg) {
|
|
174
|
+
const json = JSON.stringify(msg);
|
|
175
|
+
const body = Buffer.from(json, "utf8");
|
|
176
|
+
const header = `Content-Length: ${body.byteLength}\r\n\r\n`;
|
|
177
|
+
return Buffer.concat([Buffer.from(header, "ascii"), body]);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Parse incoming data from stdout, extracting complete JSON-RPC messages.
|
|
181
|
+
*
|
|
182
|
+
* Handles chunked delivery: data is accumulated in an internal buffer
|
|
183
|
+
* and complete messages are extracted as they become available.
|
|
184
|
+
*/
|
|
185
|
+
handleData(data) {
|
|
186
|
+
this.buffer = Buffer.concat([this.buffer, data]);
|
|
187
|
+
// eslint-disable-next-line no-constant-condition
|
|
188
|
+
while (true) {
|
|
189
|
+
const headerStr = this.buffer.toString("ascii", 0, Math.min(this.buffer.byteLength, 256));
|
|
190
|
+
const match = HEADER_REGEX.exec(headerStr);
|
|
191
|
+
if (!match) {
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
const contentLength = parseInt(match[1], 10);
|
|
195
|
+
const headerEnd = match.index + match[0].length;
|
|
196
|
+
const totalLength = headerEnd + contentLength;
|
|
197
|
+
if (this.buffer.byteLength < totalLength) {
|
|
198
|
+
// Not enough data yet — wait for more.
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
const bodyBytes = this.buffer.subarray(headerEnd, totalLength);
|
|
202
|
+
this.buffer = this.buffer.subarray(totalLength);
|
|
203
|
+
try {
|
|
204
|
+
const parsed = JSON.parse(bodyBytes.toString("utf8"));
|
|
205
|
+
this.handleMessage(parsed);
|
|
206
|
+
}
|
|
207
|
+
catch (err) {
|
|
208
|
+
logger.error("Failed to parse LSP JSON-RPC message", {
|
|
209
|
+
error: err instanceof Error ? err.message : String(err),
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/** Process a single parsed JSON-RPC message (response or notification). */
|
|
215
|
+
handleMessage(msg) {
|
|
216
|
+
// Response — has "id"
|
|
217
|
+
if ("id" in msg && typeof msg.id === "number") {
|
|
218
|
+
const pending = this.pending.get(msg.id);
|
|
219
|
+
if (!pending) {
|
|
220
|
+
logger.warn("Received response for unknown request id", { id: msg.id });
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
this.pending.delete(msg.id);
|
|
224
|
+
clearTimeout(pending.timer);
|
|
225
|
+
const response = msg;
|
|
226
|
+
if (response.error) {
|
|
227
|
+
pending.reject(new Error(`LSP error ${response.error.code}: ${response.error.message}`));
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
pending.resolve(response.result);
|
|
231
|
+
}
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
// Notification — has "method" but no "id"
|
|
235
|
+
if ("method" in msg && typeof msg.method === "string") {
|
|
236
|
+
this.emit("notification", {
|
|
237
|
+
method: msg.method,
|
|
238
|
+
params: msg.params,
|
|
239
|
+
});
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
logger.warn("Received unrecognized JSON-RPC message", {
|
|
243
|
+
keys: Object.keys(msg).join(","),
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
/** Reject all pending requests with the given error. */
|
|
247
|
+
rejectAll(error) {
|
|
248
|
+
const entries = Array.from(this.pending.entries());
|
|
249
|
+
this.pending.clear();
|
|
250
|
+
for (const [, pending] of entries) {
|
|
251
|
+
clearTimeout(pending.timer);
|
|
252
|
+
pending.reject(error);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=lsp-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lsp-client.js","sourceRoot":"","sources":["../../../src/core/lsp/lsp-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAsC5C,8EAA8E;AAC9E,gCAAgC;AAChC,8EAA8E;AAE9E,MAAM,YAAY,GAAG,iCAAiC,CAAC;AAEvD,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,OAAO,SAAU,SAAQ,YAAY;IAQtB;IACA;IACA;IATX,OAAO,GAAwB,IAAI,CAAC;IACpC,MAAM,GAAG,CAAC,CAAC;IACX,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC5C,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,GAAG,KAAK,CAAC;IAEvB,YACmB,OAAe,EACf,IAAc,EACd,mBAA2B,MAAM;QAElD,KAAK,EAAE,CAAC;QAJS,YAAO,GAAP,OAAO,CAAQ;QACf,SAAI,GAAJ,IAAI,CAAU;QACd,qBAAgB,GAAhB,gBAAgB,CAAiB;IAGpD,CAAC;IAED,mEAAmE;IACnE,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,6CAA6C;IAC7C,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC;IAC3B,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,oDAAoD,EAAE;gBAChE,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE;YACvC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;SAC1B,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YAC3C,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QAErB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACxC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACxC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE;gBACzB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE;aACnC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;YAC/B,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE;gBAChC,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,KAAK,EAAE,GAAG,CAAC,OAAO;aACnB,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAmB,EAAE,MAAqB,EAAE,EAAE;YAC9D,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;gBAChC,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC;gBAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC;aACjC,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,4BAA4B,IAAI,YAAY,MAAM,GAAG,CAAC,CAAC,CAAC;YACjF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,yEAAyE;IACzE,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,4CAA4C;QAC9C,CAAC;QAED,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAE9B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAChC,MAAM,CAAC,IAAI,CAAC,8CAA8C,EAAE;oBAC1D,OAAO,EAAE,IAAI,CAAC,OAAO;iBACtB,CAAC,CAAC;gBACH,IAAI,CAAC,IAAI,EAAE,CAAC;gBACZ,OAAO,EAAE,CAAC;YACZ,CAAC,EAAE,KAAK,CAAC,CAAC;YAEV,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;oBAC7B,YAAY,CAAC,SAAS,CAAC,CAAC;oBACxB,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,SAAS,CAAC,CAAC;gBACxB,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,WAAW,CAAc,MAAc,EAAE,MAAgB;QAC7D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,OAAO,GAAmB;YAC9B,OAAO,EAAE,KAAK;YACd,EAAE;YACF,MAAM;YACN,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5C,CAAC;QAEF,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,IAAI,CAAC,gBAAgB,OAAO,MAAM,EAAE,CAAC,CAAC,CAAC;YACzF,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAE1B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE;gBACnB,OAAO,EAAE,OAAmC;gBAC5C,MAAM;gBACN,KAAK;aACN,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,CAAC,OAAQ,CAAC,KAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,gBAAgB,CAAC,MAAc,EAAE,MAAgB;QAC/C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,gDAAgD,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1E,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAwB;YACxC,OAAO,EAAE,KAAK;YACd,MAAM;YACN,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5C,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,oDAAoD;IACpD,IAAI;QACF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,mBAAmB;IACnB,4EAA4E;IAE5E,4DAA4D;IACpD,MAAM,CAAC,GAAyC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,mBAAmB,IAAI,CAAC,UAAU,UAAU,CAAC;QAC5D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED;;;;;OAKG;IACK,UAAU,CAAC,IAAY;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QAEjD,iDAAiD;QACjD,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;YAC1F,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAE3C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM;YACR,CAAC;YAED,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7C,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAChD,MAAM,WAAW,GAAG,SAAS,GAAG,aAAa,CAAC;YAE9C,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,WAAW,EAAE,CAAC;gBACzC,uCAAuC;gBACvC,MAAM;YACR,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAC/D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YAEhD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC/D,IAAI,CAAC,aAAa,CAAC,MAA+C,CAAC,CAAC;YACtE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE;oBACnD,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,2EAA2E;IACnE,aAAa,CAAC,GAA0C;QAC9D,sBAAsB;QACtB,IAAI,IAAI,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;gBACxE,OAAO;YACT,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5B,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAE5B,MAAM,QAAQ,GAAG,GAAsB,CAAC;YACxC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO,CAAC,MAAM,CACZ,IAAI,KAAK,CAAC,aAAa,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CACzE,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;YACD,OAAO;QACT,CAAC;QAED,0CAA0C;QAC1C,IAAI,QAAQ,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;gBACxB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,MAAM,EAAE,GAAG,CAAC,MAAM;aACnB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE;YACpD,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAyC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;SACvE,CAAC,CAAC;IACL,CAAC;IAED,wDAAwD;IAChD,SAAS,CAAC,KAAY;QAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC;YAClC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LspDiagnosticsCollector — Multi-language diagnostics collector.
|
|
3
|
+
*
|
|
4
|
+
* Receives diagnostics pushed from LSP servers via textDocument/publishDiagnostics
|
|
5
|
+
* and provides query APIs for files, languages, severity filtering, and summaries.
|
|
6
|
+
*/
|
|
7
|
+
import type { LspDiagnostic } from "./lsp-types.js";
|
|
8
|
+
export interface DiagnosticsSummary {
|
|
9
|
+
byLanguage: Record<string, {
|
|
10
|
+
errors: number;
|
|
11
|
+
warnings: number;
|
|
12
|
+
info: number;
|
|
13
|
+
hints: number;
|
|
14
|
+
}>;
|
|
15
|
+
total: {
|
|
16
|
+
errors: number;
|
|
17
|
+
warnings: number;
|
|
18
|
+
info: number;
|
|
19
|
+
hints: number;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export declare class LspDiagnosticsCollector {
|
|
23
|
+
/** Map<languageId, Map<file, LspDiagnostic[]>> */
|
|
24
|
+
private store;
|
|
25
|
+
/** Called when a server sends textDocument/publishDiagnostics. */
|
|
26
|
+
onDiagnostics(languageId: string, file: string, diagnostics: LspDiagnostic[]): void;
|
|
27
|
+
/** Get diagnostics for a specific file (across all languages). */
|
|
28
|
+
getForFile(file: string): LspDiagnostic[];
|
|
29
|
+
/** Get all diagnostics for a language. */
|
|
30
|
+
getForLanguage(languageId: string): Map<string, LspDiagnostic[]>;
|
|
31
|
+
/** Get all diagnostics, optionally filtered by severity (1=error,2=warning,3=info,4=hint). */
|
|
32
|
+
getAll(severity?: number): Map<string, LspDiagnostic[]>;
|
|
33
|
+
/** Get summary counts. */
|
|
34
|
+
getSummary(): DiagnosticsSummary;
|
|
35
|
+
/** Clear all diagnostics for a language (e.g., when server restarts). */
|
|
36
|
+
clearLanguage(languageId: string): void;
|
|
37
|
+
/** Clear everything. */
|
|
38
|
+
clearAll(): void;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=lsp-diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lsp-diagnostics.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/lsp-diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAIpD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9F,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1E;AAED,qBAAa,uBAAuB;IAClC,kDAAkD;IAClD,OAAO,CAAC,KAAK,CAAmD;IAEhE,kEAAkE;IAClE,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,IAAI;IAoBnF,kEAAkE;IAClE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE;IAazC,0CAA0C;IAC1C,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;IAIhE,8FAA8F;IAC9F,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;IAyBvD,0BAA0B;IAC1B,UAAU,IAAI,kBAAkB;IAsChC,yEAAyE;IACzE,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAKvC,wBAAwB;IACxB,QAAQ,IAAI,IAAI;CAIjB"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LspDiagnosticsCollector — Multi-language diagnostics collector.
|
|
3
|
+
*
|
|
4
|
+
* Receives diagnostics pushed from LSP servers via textDocument/publishDiagnostics
|
|
5
|
+
* and provides query APIs for files, languages, severity filtering, and summaries.
|
|
6
|
+
*/
|
|
7
|
+
import { LspDiagnosticSeverity } from "./lsp-types.js";
|
|
8
|
+
import { logger } from "../utils/logger.js";
|
|
9
|
+
export class LspDiagnosticsCollector {
|
|
10
|
+
/** Map<languageId, Map<file, LspDiagnostic[]>> */
|
|
11
|
+
store = new Map();
|
|
12
|
+
/** Called when a server sends textDocument/publishDiagnostics. */
|
|
13
|
+
onDiagnostics(languageId, file, diagnostics) {
|
|
14
|
+
let langMap = this.store.get(languageId);
|
|
15
|
+
if (!langMap) {
|
|
16
|
+
langMap = new Map();
|
|
17
|
+
this.store.set(languageId, langMap);
|
|
18
|
+
}
|
|
19
|
+
if (diagnostics.length === 0) {
|
|
20
|
+
langMap.delete(file);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
langMap.set(file, diagnostics);
|
|
24
|
+
}
|
|
25
|
+
logger.debug("lsp-diagnostics:onDiagnostics", {
|
|
26
|
+
languageId,
|
|
27
|
+
file,
|
|
28
|
+
count: String(diagnostics.length),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/** Get diagnostics for a specific file (across all languages). */
|
|
32
|
+
getForFile(file) {
|
|
33
|
+
const result = [];
|
|
34
|
+
for (const langMap of this.store.values()) {
|
|
35
|
+
const fileDiags = langMap.get(file);
|
|
36
|
+
if (fileDiags) {
|
|
37
|
+
result.push(...fileDiags);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
/** Get all diagnostics for a language. */
|
|
43
|
+
getForLanguage(languageId) {
|
|
44
|
+
return this.store.get(languageId) ?? new Map();
|
|
45
|
+
}
|
|
46
|
+
/** Get all diagnostics, optionally filtered by severity (1=error,2=warning,3=info,4=hint). */
|
|
47
|
+
getAll(severity) {
|
|
48
|
+
const result = new Map();
|
|
49
|
+
for (const langMap of this.store.values()) {
|
|
50
|
+
for (const [file, diagnostics] of langMap) {
|
|
51
|
+
const filtered = severity != null
|
|
52
|
+
? diagnostics.filter((d) => d.severity === severity)
|
|
53
|
+
: diagnostics;
|
|
54
|
+
if (filtered.length === 0) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const existing = result.get(file);
|
|
58
|
+
if (existing) {
|
|
59
|
+
existing.push(...filtered);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
result.set(file, [...filtered]);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
/** Get summary counts. */
|
|
69
|
+
getSummary() {
|
|
70
|
+
const total = { errors: 0, warnings: 0, info: 0, hints: 0 };
|
|
71
|
+
const byLanguage = {};
|
|
72
|
+
for (const [languageId, langMap] of this.store) {
|
|
73
|
+
const langCounts = { errors: 0, warnings: 0, info: 0, hints: 0 };
|
|
74
|
+
for (const diagnostics of langMap.values()) {
|
|
75
|
+
for (const diag of diagnostics) {
|
|
76
|
+
switch (diag.severity) {
|
|
77
|
+
case LspDiagnosticSeverity.Error:
|
|
78
|
+
langCounts.errors++;
|
|
79
|
+
total.errors++;
|
|
80
|
+
break;
|
|
81
|
+
case LspDiagnosticSeverity.Warning:
|
|
82
|
+
langCounts.warnings++;
|
|
83
|
+
total.warnings++;
|
|
84
|
+
break;
|
|
85
|
+
case LspDiagnosticSeverity.Information:
|
|
86
|
+
langCounts.info++;
|
|
87
|
+
total.info++;
|
|
88
|
+
break;
|
|
89
|
+
case LspDiagnosticSeverity.Hint:
|
|
90
|
+
langCounts.hints++;
|
|
91
|
+
total.hints++;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (langCounts.errors + langCounts.warnings + langCounts.info + langCounts.hints > 0) {
|
|
97
|
+
byLanguage[languageId] = langCounts;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return { byLanguage, total };
|
|
101
|
+
}
|
|
102
|
+
/** Clear all diagnostics for a language (e.g., when server restarts). */
|
|
103
|
+
clearLanguage(languageId) {
|
|
104
|
+
this.store.delete(languageId);
|
|
105
|
+
logger.debug("lsp-diagnostics:clearLanguage", { languageId });
|
|
106
|
+
}
|
|
107
|
+
/** Clear everything. */
|
|
108
|
+
clearAll() {
|
|
109
|
+
this.store.clear();
|
|
110
|
+
logger.debug("lsp-diagnostics:clearAll");
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=lsp-diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lsp-diagnostics.js","sourceRoot":"","sources":["../../../src/core/lsp/lsp-diagnostics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LspServerManager — Manages multiple language server instances (one per language).
|
|
3
|
+
*
|
|
4
|
+
* Handles lazy startup, keep-alive timers, auto-restart on crash,
|
|
5
|
+
* and extension-based routing via ServerRegistry.
|
|
6
|
+
*/
|
|
7
|
+
import { LspClient } from "./lsp-client.js";
|
|
8
|
+
import { ServerRegistry } from "./server-registry.js";
|
|
9
|
+
import type { LspServerState } from "./lsp-types.js";
|
|
10
|
+
export declare class LspServerManager {
|
|
11
|
+
private readonly registry;
|
|
12
|
+
private readonly rootUri;
|
|
13
|
+
private readonly keepAliveMs;
|
|
14
|
+
private servers;
|
|
15
|
+
constructor(registry: ServerRegistry, rootUri: string, keepAliveMs?: number);
|
|
16
|
+
/**
|
|
17
|
+
* Get a running LSP client for a language. Starts the server lazily if needed.
|
|
18
|
+
* Returns null if the server binary is not available.
|
|
19
|
+
*/
|
|
20
|
+
ensureServer(languageId: string): Promise<LspClient | null>;
|
|
21
|
+
/**
|
|
22
|
+
* Get a client for a file path (routes by extension via registry).
|
|
23
|
+
* Returns null if no server configured for the file's language.
|
|
24
|
+
*/
|
|
25
|
+
getClientForFile(filePath: string): Promise<LspClient | null>;
|
|
26
|
+
/**
|
|
27
|
+
* Check if a language server binary is installed.
|
|
28
|
+
* Uses probeCommand from config if available, otherwise `which` (or `where` on Windows).
|
|
29
|
+
*/
|
|
30
|
+
isServerInstalled(languageId: string): Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Get status of all known language servers.
|
|
33
|
+
*/
|
|
34
|
+
getStatus(): Map<string, LspServerState>;
|
|
35
|
+
/**
|
|
36
|
+
* Shutdown all running servers gracefully.
|
|
37
|
+
*/
|
|
38
|
+
shutdownAll(): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Stop a single language server.
|
|
41
|
+
*/
|
|
42
|
+
stopServer(languageId: string): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Reset the keep-alive timer for a language (call on each request).
|
|
45
|
+
*/
|
|
46
|
+
private resetKeepAlive;
|
|
47
|
+
/**
|
|
48
|
+
* Handle server crash: auto-restart up to MAX_RESTART_ATTEMPTS.
|
|
49
|
+
*/
|
|
50
|
+
private handleServerExit;
|
|
51
|
+
/**
|
|
52
|
+
* Start a language server: spawn process, send initialize, wait for response.
|
|
53
|
+
*/
|
|
54
|
+
private startServer;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=lsp-server-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lsp-server-manager.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/lsp-server-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAmB,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAmBtE,qBAAa,gBAAgB;IAIzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAL9B,OAAO,CAAC,OAAO,CAAoC;gBAGhC,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,MAA6B;IAG7D;;;OAGG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAqFjE;;;OAGG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IASnE;;;OAGG;IACG,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoB7D;;OAEG;IACH,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC;IAqBxC;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBlC;;OAEG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BnD;;OAEG;IACH,OAAO,CAAC,cAAc;IAmBtB;;OAEG;YACW,gBAAgB;IAiF9B;;OAEG;YACW,WAAW;CAwC1B"}
|