@oni.bot/core 0.8.0 → 1.0.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/CHANGELOG.md +15 -0
- package/README.md +59 -373
- package/dist/checkpointers/sqlite.d.ts.map +1 -1
- package/dist/checkpointers/sqlite.js +23 -8
- package/dist/checkpointers/sqlite.js.map +1 -1
- package/dist/cli/build.d.ts +11 -0
- package/dist/cli/build.d.ts.map +1 -0
- package/dist/cli/build.js +61 -0
- package/dist/cli/build.js.map +1 -0
- package/dist/cli/dev.d.ts +5 -0
- package/dist/cli/dev.d.ts.map +1 -0
- package/dist/cli/dev.js +54 -0
- package/dist/cli/dev.js.map +1 -0
- package/dist/cli/index.js +16 -27
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +18 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/inspect.d.ts +5 -0
- package/dist/cli/inspect.d.ts.map +1 -0
- package/dist/cli/inspect.js +85 -0
- package/dist/cli/inspect.js.map +1 -0
- package/dist/cli/router.d.ts +14 -0
- package/dist/cli/router.d.ts.map +1 -0
- package/dist/cli/router.js +107 -0
- package/dist/cli/router.js.map +1 -0
- package/dist/cli/run.d.ts +5 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +53 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/templates.d.ts +1 -0
- package/dist/cli/templates.d.ts.map +1 -1
- package/dist/cli/templates.js +106 -66
- package/dist/cli/templates.js.map +1 -1
- package/dist/cli/test.d.ts +3 -0
- package/dist/cli/test.d.ts.map +1 -0
- package/dist/cli/test.js +29 -0
- package/dist/cli/test.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +37 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +180 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +74 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +5 -0
- package/dist/config/types.js.map +1 -0
- package/dist/coordination/pubsub.d.ts +4 -0
- package/dist/coordination/pubsub.d.ts.map +1 -1
- package/dist/coordination/pubsub.js +8 -0
- package/dist/coordination/pubsub.js.map +1 -1
- package/dist/coordination/request-reply.d.ts +3 -1
- package/dist/coordination/request-reply.d.ts.map +1 -1
- package/dist/coordination/request-reply.js +11 -2
- package/dist/coordination/request-reply.js.map +1 -1
- package/dist/errors.d.ts +7 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +18 -3
- package/dist/errors.js.map +1 -1
- package/dist/events/bridge.d.ts +17 -0
- package/dist/events/bridge.d.ts.map +1 -0
- package/dist/events/bridge.js +67 -0
- package/dist/events/bridge.js.map +1 -0
- package/dist/events/bus.d.ts +9 -0
- package/dist/events/bus.d.ts.map +1 -1
- package/dist/events/bus.js +39 -4
- package/dist/events/bus.js.map +1 -1
- package/dist/events/index.d.ts +2 -1
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +2 -0
- package/dist/events/index.js.map +1 -1
- package/dist/events/types.d.ts +123 -1
- package/dist/events/types.d.ts.map +1 -1
- package/dist/graph.d.ts.map +1 -1
- package/dist/graph.js +16 -8
- package/dist/graph.js.map +1 -1
- package/dist/guardrails/types.d.ts +1 -1
- package/dist/guardrails/types.d.ts.map +1 -1
- package/dist/harness/agent-loop.d.ts.map +1 -1
- package/dist/harness/agent-loop.js +226 -29
- package/dist/harness/agent-loop.js.map +1 -1
- package/dist/harness/context-compactor.d.ts +21 -2
- package/dist/harness/context-compactor.d.ts.map +1 -1
- package/dist/harness/context-compactor.js +45 -6
- package/dist/harness/context-compactor.js.map +1 -1
- package/dist/harness/hooks-engine.d.ts +7 -1
- package/dist/harness/hooks-engine.d.ts.map +1 -1
- package/dist/harness/hooks-engine.js.map +1 -1
- package/dist/harness/index.d.ts +3 -2
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +2 -0
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/skill-loader.d.ts +14 -1
- package/dist/harness/skill-loader.d.ts.map +1 -1
- package/dist/harness/skill-loader.js +33 -3
- package/dist/harness/skill-loader.js.map +1 -1
- package/dist/harness/types.d.ts +24 -2
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/harness/validate-args.d.ts +16 -0
- package/dist/harness/validate-args.d.ts.map +1 -0
- package/dist/harness/validate-args.js +132 -0
- package/dist/harness/validate-args.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -12
- package/dist/index.js.map +1 -1
- package/dist/internal/timeout.d.ts +2 -0
- package/dist/internal/timeout.d.ts.map +1 -0
- package/dist/internal/timeout.js +16 -0
- package/dist/internal/timeout.js.map +1 -0
- package/dist/lsp/client.d.ts +70 -0
- package/dist/lsp/client.d.ts.map +1 -0
- package/dist/lsp/client.js +421 -0
- package/dist/lsp/client.js.map +1 -0
- package/dist/lsp/index.d.ts +77 -0
- package/dist/lsp/index.d.ts.map +1 -0
- package/dist/lsp/index.js +183 -0
- package/dist/lsp/index.js.map +1 -0
- package/dist/lsp/servers.d.ts +48 -0
- package/dist/lsp/servers.d.ts.map +1 -0
- package/dist/lsp/servers.js +108 -0
- package/dist/lsp/servers.js.map +1 -0
- package/dist/lsp/types.d.ts +142 -0
- package/dist/lsp/types.d.ts.map +1 -0
- package/dist/lsp/types.js +16 -0
- package/dist/lsp/types.js.map +1 -0
- package/dist/mcp/client.d.ts +56 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +170 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/convert.d.ts +26 -0
- package/dist/mcp/convert.d.ts.map +1 -0
- package/dist/mcp/convert.js +56 -0
- package/dist/mcp/convert.js.map +1 -0
- package/dist/mcp/index.d.ts +21 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +19 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/transport.d.ts +56 -0
- package/dist/mcp/transport.d.ts.map +1 -0
- package/dist/mcp/transport.js +204 -0
- package/dist/mcp/transport.js.map +1 -0
- package/dist/mcp/types.d.ts +96 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +11 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/models/anthropic.d.ts.map +1 -1
- package/dist/models/anthropic.js +78 -41
- package/dist/models/anthropic.js.map +1 -1
- package/dist/models/google.d.ts.map +1 -1
- package/dist/models/google.js +47 -46
- package/dist/models/google.js.map +1 -1
- package/dist/models/http-error.d.ts +16 -0
- package/dist/models/http-error.d.ts.map +1 -0
- package/dist/models/http-error.js +67 -0
- package/dist/models/http-error.js.map +1 -0
- package/dist/models/index.d.ts +3 -0
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +2 -0
- package/dist/models/index.js.map +1 -1
- package/dist/models/ollama.d.ts.map +1 -1
- package/dist/models/ollama.js +4 -3
- package/dist/models/ollama.js.map +1 -1
- package/dist/models/openai.d.ts.map +1 -1
- package/dist/models/openai.js +36 -44
- package/dist/models/openai.js.map +1 -1
- package/dist/models/openrouter.d.ts +13 -0
- package/dist/models/openrouter.d.ts.map +1 -1
- package/dist/models/openrouter.js +86 -47
- package/dist/models/openrouter.js.map +1 -1
- package/dist/models/sse.d.ts +9 -0
- package/dist/models/sse.d.ts.map +1 -0
- package/dist/models/sse.js +45 -0
- package/dist/models/sse.js.map +1 -0
- package/dist/models/types.d.ts +10 -0
- package/dist/models/types.d.ts.map +1 -1
- package/dist/pregel.d.ts +4 -0
- package/dist/pregel.d.ts.map +1 -1
- package/dist/pregel.js +121 -54
- package/dist/pregel.js.map +1 -1
- package/dist/retry.d.ts.map +1 -1
- package/dist/retry.js +10 -3
- package/dist/retry.js.map +1 -1
- package/dist/store/index.d.ts +3 -0
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +17 -0
- package/dist/store/index.js.map +1 -1
- package/dist/streaming.d.ts +4 -1
- package/dist/streaming.d.ts.map +1 -1
- package/dist/streaming.js +21 -7
- package/dist/streaming.js.map +1 -1
- package/dist/swarm/graph.d.ts +81 -2
- package/dist/swarm/graph.d.ts.map +1 -1
- package/dist/swarm/graph.js +517 -32
- package/dist/swarm/graph.js.map +1 -1
- package/dist/swarm/index.d.ts +10 -2
- package/dist/swarm/index.d.ts.map +1 -1
- package/dist/swarm/index.js +6 -1
- package/dist/swarm/index.js.map +1 -1
- package/dist/swarm/mermaid.d.ts +10 -0
- package/dist/swarm/mermaid.d.ts.map +1 -0
- package/dist/swarm/mermaid.js +64 -0
- package/dist/swarm/mermaid.js.map +1 -0
- package/dist/swarm/pool.d.ts +9 -1
- package/dist/swarm/pool.d.ts.map +1 -1
- package/dist/swarm/pool.js +58 -10
- package/dist/swarm/pool.js.map +1 -1
- package/dist/swarm/registry.d.ts +11 -1
- package/dist/swarm/registry.d.ts.map +1 -1
- package/dist/swarm/registry.js +17 -3
- package/dist/swarm/registry.js.map +1 -1
- package/dist/swarm/scaling.d.ts +95 -0
- package/dist/swarm/scaling.d.ts.map +1 -0
- package/dist/swarm/scaling.js +214 -0
- package/dist/swarm/scaling.js.map +1 -0
- package/dist/swarm/snapshot.d.ts +51 -0
- package/dist/swarm/snapshot.d.ts.map +1 -0
- package/dist/swarm/snapshot.js +115 -0
- package/dist/swarm/snapshot.js.map +1 -0
- package/dist/swarm/supervisor.d.ts.map +1 -1
- package/dist/swarm/supervisor.js +82 -0
- package/dist/swarm/supervisor.js.map +1 -1
- package/dist/swarm/tracer.d.ts +57 -0
- package/dist/swarm/tracer.d.ts.map +1 -0
- package/dist/swarm/tracer.js +138 -0
- package/dist/swarm/tracer.js.map +1 -0
- package/dist/swarm/types.d.ts +23 -1
- package/dist/swarm/types.d.ts.map +1 -1
- package/dist/swarm/types.js.map +1 -1
- package/dist/tools/types.d.ts +2 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/package.json +160 -141
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,oCAAoC;AACpC,+DAA+D;AAE/D,+BAA+B;AAC/B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAQ,YAAY,CAAC;AAGxD,mBAAmB;AACnB,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAC/F,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAE5G,qBAAqB;AACrB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAExC,0BAA0B;AAC1B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEhF,oBAAoB;AACpB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG3C,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.d.ts","sourceRoot":"","sources":["../../src/internal/timeout.ts"],"names":[],"mappings":"AAAA,wBAAsB,cAAc,CAAC,CAAC,EACpC,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,kBAAkB,EAAE,MAAM,KAAK,GAC9B,OAAO,CAAC,CAAC,CAAC,CAgBZ"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export async function runWithTimeout(operation, timeoutMs, createTimeoutError) {
|
|
2
|
+
if (timeoutMs == null || timeoutMs <= 0) {
|
|
3
|
+
return operation();
|
|
4
|
+
}
|
|
5
|
+
return await new Promise((resolve, reject) => {
|
|
6
|
+
const timer = setTimeout(() => reject(createTimeoutError()), timeoutMs);
|
|
7
|
+
if (typeof timer === "object" && timer !== null && "unref" in timer && typeof timer.unref === "function") {
|
|
8
|
+
timer.unref();
|
|
9
|
+
}
|
|
10
|
+
Promise.resolve()
|
|
11
|
+
.then(operation)
|
|
12
|
+
.then(resolve, reject)
|
|
13
|
+
.finally(() => clearTimeout(timer));
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=timeout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.js","sourceRoot":"","sources":["../../src/internal/timeout.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAA2B,EAC3B,SAA6B,EAC7B,kBAA+B;IAE/B,IAAI,SAAS,IAAI,IAAI,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACxC,OAAO,SAAS,EAAE,CAAC;IACrB,CAAC;IAED,OAAO,MAAM,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC9C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;QACxE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YACzG,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QAED,OAAO,CAAC,OAAO,EAAE;aACd,IAAI,CAAC,SAAS,CAAC;aACf,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC;aACrB,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LSP Client — Language Server Protocol client over stdio.
|
|
3
|
+
*
|
|
4
|
+
* Manages a single language server connection:
|
|
5
|
+
* - Spawn process with Content-Length framed JSON-RPC
|
|
6
|
+
* - Initialize handshake (capabilities, rootUri)
|
|
7
|
+
* - Track open files with version numbers
|
|
8
|
+
* - Receive and cache diagnostics per file
|
|
9
|
+
* - touchFile() → open/change → await diagnostics
|
|
10
|
+
*
|
|
11
|
+
* Swarm-aware: A single LSPClient instance is shared across all agents.
|
|
12
|
+
* Concurrent touchFile() calls are safe — file versions are tracked atomically.
|
|
13
|
+
*
|
|
14
|
+
* Zero-dependency: uses only node:child_process and node:path.
|
|
15
|
+
*/
|
|
16
|
+
import type { LSPServerConfig, LSPClientState, LSPClientInfo, LSPDiagnostic } from "./types.js";
|
|
17
|
+
export declare class LSPClient {
|
|
18
|
+
private readonly config;
|
|
19
|
+
private readonly rootDir;
|
|
20
|
+
private process;
|
|
21
|
+
private state;
|
|
22
|
+
private serverInfo?;
|
|
23
|
+
private nextId;
|
|
24
|
+
private pending;
|
|
25
|
+
private buffer;
|
|
26
|
+
private fileVersions;
|
|
27
|
+
private diagnosticsCache;
|
|
28
|
+
private diagnosticsWaiters;
|
|
29
|
+
constructor(config: LSPServerConfig, rootDir: string);
|
|
30
|
+
/**
|
|
31
|
+
* Start the language server and complete the initialize handshake.
|
|
32
|
+
*/
|
|
33
|
+
start(): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Stop the language server.
|
|
36
|
+
*/
|
|
37
|
+
stop(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Notify the server about a file change and optionally wait for diagnostics.
|
|
40
|
+
*
|
|
41
|
+
* If the file hasn't been opened yet, sends didOpen. Otherwise sends didChange.
|
|
42
|
+
* Reads the file content from disk.
|
|
43
|
+
*/
|
|
44
|
+
touchFile(filePath: string, waitForDiagnostics?: boolean): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Get cached diagnostics for a file.
|
|
47
|
+
*/
|
|
48
|
+
getDiagnostics(filePath: string): LSPDiagnostic[];
|
|
49
|
+
/**
|
|
50
|
+
* Get all cached diagnostics keyed by file path.
|
|
51
|
+
*/
|
|
52
|
+
getAllDiagnostics(): Map<string, LSPDiagnostic[]>;
|
|
53
|
+
getState(): LSPClientState;
|
|
54
|
+
getInfo(): LSPClientInfo;
|
|
55
|
+
getServerId(): string;
|
|
56
|
+
private waitForDiagnostics;
|
|
57
|
+
private notifyDiagnosticsWaiters;
|
|
58
|
+
private removeWaiter;
|
|
59
|
+
private clearAllWaiters;
|
|
60
|
+
private sendRequest;
|
|
61
|
+
private sendNotification;
|
|
62
|
+
private writeMessage;
|
|
63
|
+
private processBuffer;
|
|
64
|
+
private handleMessage;
|
|
65
|
+
private handleNotification;
|
|
66
|
+
private uriToPath;
|
|
67
|
+
private handleProcessExit;
|
|
68
|
+
private rejectAllPending;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lsp/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,aAAa,EACb,aAAa,EAMd,MAAM,YAAY,CAAC;AA2BpB,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,UAAU,CAAC,CAAqC;IAGxD,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,MAAM,CAAM;IAGpB,OAAO,CAAC,YAAY,CAA6B;IAGjD,OAAO,CAAC,gBAAgB,CAAsC;IAC9D,OAAO,CAAC,kBAAkB,CAA0C;gBAExD,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM;IAOpD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4E5B;;OAEG;IACH,IAAI,IAAI,IAAI;IAoBZ;;;;;OAKG;IACG,SAAS,CACb,QAAQ,EAAE,MAAM,EAChB,kBAAkB,UAAQ,GACzB,OAAO,CAAC,IAAI,CAAC;IA6ChB;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE;IAIjD;;OAEG;IACH,iBAAiB,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;IAMjD,QAAQ,IAAI,cAAc;IAI1B,OAAO,IAAI,aAAa;IASxB,WAAW,IAAI,MAAM;IAMrB,OAAO,CAAC,kBAAkB;IAuB1B,OAAO,CAAC,wBAAwB;IAahC,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,WAAW;IA6BnB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,aAAa;IAiCrB,OAAO,CAAC,aAAa;IA6CrB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,SAAS;IAmBjB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,gBAAgB;CAOzB"}
|
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LSP Client — Language Server Protocol client over stdio.
|
|
3
|
+
*
|
|
4
|
+
* Manages a single language server connection:
|
|
5
|
+
* - Spawn process with Content-Length framed JSON-RPC
|
|
6
|
+
* - Initialize handshake (capabilities, rootUri)
|
|
7
|
+
* - Track open files with version numbers
|
|
8
|
+
* - Receive and cache diagnostics per file
|
|
9
|
+
* - touchFile() → open/change → await diagnostics
|
|
10
|
+
*
|
|
11
|
+
* Swarm-aware: A single LSPClient instance is shared across all agents.
|
|
12
|
+
* Concurrent touchFile() calls are safe — file versions are tracked atomically.
|
|
13
|
+
*
|
|
14
|
+
* Zero-dependency: uses only node:child_process and node:path.
|
|
15
|
+
*/
|
|
16
|
+
import { spawn } from "node:child_process";
|
|
17
|
+
import { pathToFileURL } from "node:url";
|
|
18
|
+
import { readFileSync } from "node:fs";
|
|
19
|
+
// ── Constants ────────────────────────────────────────────────
|
|
20
|
+
const INITIALIZE_TIMEOUT_MS = 30_000;
|
|
21
|
+
const REQUEST_TIMEOUT_MS = 10_000;
|
|
22
|
+
const DIAGNOSTICS_DEBOUNCE_MS = 150;
|
|
23
|
+
const DIAGNOSTICS_TIMEOUT_MS = 3_000;
|
|
24
|
+
// ── LSPClient ────────────────────────────────────────────────
|
|
25
|
+
export class LSPClient {
|
|
26
|
+
config;
|
|
27
|
+
rootDir;
|
|
28
|
+
process = null;
|
|
29
|
+
state = "disconnected";
|
|
30
|
+
serverInfo;
|
|
31
|
+
// JSON-RPC
|
|
32
|
+
nextId = 1;
|
|
33
|
+
pending = new Map();
|
|
34
|
+
buffer = "";
|
|
35
|
+
// File tracking
|
|
36
|
+
fileVersions = new Map();
|
|
37
|
+
// Diagnostics
|
|
38
|
+
diagnosticsCache = new Map();
|
|
39
|
+
diagnosticsWaiters = new Map();
|
|
40
|
+
constructor(config, rootDir) {
|
|
41
|
+
this.config = config;
|
|
42
|
+
this.rootDir = rootDir;
|
|
43
|
+
}
|
|
44
|
+
// ── Lifecycle ────────────────────────────────────────────
|
|
45
|
+
/**
|
|
46
|
+
* Start the language server and complete the initialize handshake.
|
|
47
|
+
*/
|
|
48
|
+
async start() {
|
|
49
|
+
if (this.state === "ready")
|
|
50
|
+
return;
|
|
51
|
+
if (this.state === "broken") {
|
|
52
|
+
throw new Error(`LSP server "${this.config.id}" is marked as broken`);
|
|
53
|
+
}
|
|
54
|
+
this.state = "connecting";
|
|
55
|
+
try {
|
|
56
|
+
this.process = spawn(this.config.command, this.config.args ?? [], {
|
|
57
|
+
cwd: this.rootDir,
|
|
58
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
59
|
+
env: { ...process.env },
|
|
60
|
+
});
|
|
61
|
+
// Wire up stdout for JSON-RPC responses
|
|
62
|
+
this.process.stdout?.on("data", (chunk) => {
|
|
63
|
+
this.processBuffer(chunk.toString());
|
|
64
|
+
});
|
|
65
|
+
// Ignore stderr (server logs)
|
|
66
|
+
this.process.stderr?.on("data", () => { });
|
|
67
|
+
// Handle process exit
|
|
68
|
+
this.process.on("exit", () => {
|
|
69
|
+
this.handleProcessExit();
|
|
70
|
+
});
|
|
71
|
+
this.process.on("error", () => {
|
|
72
|
+
this.state = "broken";
|
|
73
|
+
this.rejectAllPending("LSP server process error");
|
|
74
|
+
});
|
|
75
|
+
// Send initialize request
|
|
76
|
+
const rootUri = pathToFileURL(this.rootDir).toString();
|
|
77
|
+
const result = await this.sendRequest("initialize", {
|
|
78
|
+
processId: this.process.pid ?? null,
|
|
79
|
+
rootUri,
|
|
80
|
+
capabilities: {
|
|
81
|
+
textDocument: {
|
|
82
|
+
synchronization: {
|
|
83
|
+
didOpen: true,
|
|
84
|
+
didChange: true,
|
|
85
|
+
},
|
|
86
|
+
publishDiagnostics: {
|
|
87
|
+
versionSupport: true,
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
window: {
|
|
91
|
+
workDoneProgress: true,
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
workspaceFolders: [
|
|
95
|
+
{ uri: rootUri, name: this.rootDir.split("/").pop() ?? "workspace" },
|
|
96
|
+
],
|
|
97
|
+
initializationOptions: this.config.initializationOptions,
|
|
98
|
+
}, INITIALIZE_TIMEOUT_MS);
|
|
99
|
+
if (result.error) {
|
|
100
|
+
throw new Error(`Initialize failed: ${result.error.message}`);
|
|
101
|
+
}
|
|
102
|
+
const initResult = result.result;
|
|
103
|
+
this.serverInfo = initResult.serverInfo;
|
|
104
|
+
// Send initialized notification
|
|
105
|
+
this.sendNotification("initialized", {});
|
|
106
|
+
this.state = "ready";
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
this.stop();
|
|
110
|
+
this.state = "broken"; // Set AFTER stop() so it isn't overwritten
|
|
111
|
+
throw err;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Stop the language server.
|
|
116
|
+
*/
|
|
117
|
+
stop() {
|
|
118
|
+
this.rejectAllPending("LSP client stopping");
|
|
119
|
+
this.clearAllWaiters();
|
|
120
|
+
if (this.process) {
|
|
121
|
+
try {
|
|
122
|
+
this.process.kill();
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// Already dead
|
|
126
|
+
}
|
|
127
|
+
this.process = null;
|
|
128
|
+
}
|
|
129
|
+
this.state = "disconnected";
|
|
130
|
+
this.fileVersions.clear();
|
|
131
|
+
this.diagnosticsCache.clear();
|
|
132
|
+
}
|
|
133
|
+
// ── File Operations ──────────────────────────────────────
|
|
134
|
+
/**
|
|
135
|
+
* Notify the server about a file change and optionally wait for diagnostics.
|
|
136
|
+
*
|
|
137
|
+
* If the file hasn't been opened yet, sends didOpen. Otherwise sends didChange.
|
|
138
|
+
* Reads the file content from disk.
|
|
139
|
+
*/
|
|
140
|
+
async touchFile(filePath, waitForDiagnostics = false) {
|
|
141
|
+
if (this.state !== "ready")
|
|
142
|
+
return;
|
|
143
|
+
let content;
|
|
144
|
+
try {
|
|
145
|
+
content = readFileSync(filePath, "utf-8");
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return; // File doesn't exist or unreadable
|
|
149
|
+
}
|
|
150
|
+
const uri = pathToFileURL(filePath).toString();
|
|
151
|
+
const version = this.fileVersions.get(filePath);
|
|
152
|
+
// Set up diagnostics waiter before sending notification
|
|
153
|
+
const waiterPromise = waitForDiagnostics
|
|
154
|
+
? this.waitForDiagnostics(filePath)
|
|
155
|
+
: undefined;
|
|
156
|
+
if (version === undefined) {
|
|
157
|
+
// First time — didOpen
|
|
158
|
+
this.fileVersions.set(filePath, 0);
|
|
159
|
+
this.sendNotification("textDocument/didOpen", {
|
|
160
|
+
textDocument: {
|
|
161
|
+
uri,
|
|
162
|
+
languageId: this.config.languageId,
|
|
163
|
+
version: 0,
|
|
164
|
+
text: content,
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
// Subsequent — didChange
|
|
170
|
+
const nextVersion = version + 1;
|
|
171
|
+
this.fileVersions.set(filePath, nextVersion);
|
|
172
|
+
this.sendNotification("textDocument/didChange", {
|
|
173
|
+
textDocument: { uri, version: nextVersion },
|
|
174
|
+
contentChanges: [{ text: content }],
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
// Optionally wait for diagnostics
|
|
178
|
+
if (waiterPromise) {
|
|
179
|
+
await waiterPromise;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Get cached diagnostics for a file.
|
|
184
|
+
*/
|
|
185
|
+
getDiagnostics(filePath) {
|
|
186
|
+
return this.diagnosticsCache.get(filePath) ?? [];
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Get all cached diagnostics keyed by file path.
|
|
190
|
+
*/
|
|
191
|
+
getAllDiagnostics() {
|
|
192
|
+
return new Map(this.diagnosticsCache);
|
|
193
|
+
}
|
|
194
|
+
// ── State Queries ────────────────────────────────────────
|
|
195
|
+
getState() {
|
|
196
|
+
return this.state;
|
|
197
|
+
}
|
|
198
|
+
getInfo() {
|
|
199
|
+
return {
|
|
200
|
+
serverId: this.config.id,
|
|
201
|
+
state: this.state,
|
|
202
|
+
rootDir: this.rootDir,
|
|
203
|
+
serverInfo: this.serverInfo,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
getServerId() {
|
|
207
|
+
return this.config.id;
|
|
208
|
+
}
|
|
209
|
+
// ── Diagnostics Waiter ───────────────────────────────────
|
|
210
|
+
waitForDiagnostics(filePath) {
|
|
211
|
+
return new Promise((resolve) => {
|
|
212
|
+
const overallTimer = setTimeout(() => {
|
|
213
|
+
this.removeWaiter(filePath, waiter);
|
|
214
|
+
resolve(); // Swallow timeout — diagnostics are best-effort
|
|
215
|
+
}, DIAGNOSTICS_TIMEOUT_MS);
|
|
216
|
+
const waiter = {
|
|
217
|
+
resolve: () => {
|
|
218
|
+
clearTimeout(overallTimer);
|
|
219
|
+
if (waiter.debounceTimer)
|
|
220
|
+
clearTimeout(waiter.debounceTimer);
|
|
221
|
+
this.removeWaiter(filePath, waiter);
|
|
222
|
+
resolve();
|
|
223
|
+
},
|
|
224
|
+
overallTimer,
|
|
225
|
+
};
|
|
226
|
+
const existing = this.diagnosticsWaiters.get(filePath) ?? [];
|
|
227
|
+
existing.push(waiter);
|
|
228
|
+
this.diagnosticsWaiters.set(filePath, existing);
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
notifyDiagnosticsWaiters(filePath) {
|
|
232
|
+
const waiters = this.diagnosticsWaiters.get(filePath);
|
|
233
|
+
if (!waiters || waiters.length === 0)
|
|
234
|
+
return;
|
|
235
|
+
for (const waiter of waiters) {
|
|
236
|
+
// Debounce: wait 150ms for follow-up diagnostics
|
|
237
|
+
if (waiter.debounceTimer)
|
|
238
|
+
clearTimeout(waiter.debounceTimer);
|
|
239
|
+
waiter.debounceTimer = setTimeout(() => {
|
|
240
|
+
waiter.resolve();
|
|
241
|
+
}, DIAGNOSTICS_DEBOUNCE_MS);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
removeWaiter(filePath, waiter) {
|
|
245
|
+
const waiters = this.diagnosticsWaiters.get(filePath);
|
|
246
|
+
if (!waiters)
|
|
247
|
+
return;
|
|
248
|
+
const idx = waiters.indexOf(waiter);
|
|
249
|
+
if (idx >= 0)
|
|
250
|
+
waiters.splice(idx, 1);
|
|
251
|
+
if (waiters.length === 0)
|
|
252
|
+
this.diagnosticsWaiters.delete(filePath);
|
|
253
|
+
}
|
|
254
|
+
clearAllWaiters() {
|
|
255
|
+
for (const [, waiters] of this.diagnosticsWaiters) {
|
|
256
|
+
for (const w of waiters) {
|
|
257
|
+
clearTimeout(w.overallTimer);
|
|
258
|
+
if (w.debounceTimer)
|
|
259
|
+
clearTimeout(w.debounceTimer);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
this.diagnosticsWaiters.clear();
|
|
263
|
+
}
|
|
264
|
+
// ── JSON-RPC Transport ───────────────────────────────────
|
|
265
|
+
sendRequest(method, params, timeoutMs = REQUEST_TIMEOUT_MS) {
|
|
266
|
+
return new Promise((resolve, reject) => {
|
|
267
|
+
if (!this.process?.stdin?.writable) {
|
|
268
|
+
reject(new Error("LSP process not connected"));
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
const id = this.nextId++;
|
|
272
|
+
const request = {
|
|
273
|
+
jsonrpc: "2.0",
|
|
274
|
+
id,
|
|
275
|
+
method,
|
|
276
|
+
params,
|
|
277
|
+
};
|
|
278
|
+
const timer = setTimeout(() => {
|
|
279
|
+
this.pending.delete(id);
|
|
280
|
+
reject(new Error(`LSP request "${method}" timed out after ${timeoutMs}ms`));
|
|
281
|
+
}, timeoutMs);
|
|
282
|
+
this.pending.set(id, { resolve, reject, timer });
|
|
283
|
+
this.writeMessage(request);
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
sendNotification(method, params) {
|
|
287
|
+
if (!this.process?.stdin?.writable)
|
|
288
|
+
return;
|
|
289
|
+
const notification = {
|
|
290
|
+
jsonrpc: "2.0",
|
|
291
|
+
method,
|
|
292
|
+
params,
|
|
293
|
+
};
|
|
294
|
+
this.writeMessage(notification);
|
|
295
|
+
}
|
|
296
|
+
writeMessage(message) {
|
|
297
|
+
const json = JSON.stringify(message);
|
|
298
|
+
const header = `Content-Length: ${Buffer.byteLength(json)}\r\n\r\n`;
|
|
299
|
+
try {
|
|
300
|
+
this.process?.stdin?.write(header + json);
|
|
301
|
+
}
|
|
302
|
+
catch {
|
|
303
|
+
// Process may have died
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
processBuffer(data) {
|
|
307
|
+
this.buffer += data;
|
|
308
|
+
while (true) {
|
|
309
|
+
const headerEnd = this.buffer.indexOf("\r\n\r\n");
|
|
310
|
+
if (headerEnd === -1)
|
|
311
|
+
break;
|
|
312
|
+
const header = this.buffer.slice(0, headerEnd);
|
|
313
|
+
const match = header.match(/Content-Length:\s*(\d+)/i);
|
|
314
|
+
if (!match) {
|
|
315
|
+
// Malformed header — skip to next potential header
|
|
316
|
+
this.buffer = this.buffer.slice(headerEnd + 4);
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
const contentLength = parseInt(match[1], 10);
|
|
320
|
+
const bodyStart = headerEnd + 4;
|
|
321
|
+
const bodyEnd = bodyStart + contentLength;
|
|
322
|
+
if (this.buffer.length < bodyEnd)
|
|
323
|
+
break; // Incomplete body
|
|
324
|
+
const body = this.buffer.slice(bodyStart, bodyEnd);
|
|
325
|
+
this.buffer = this.buffer.slice(bodyEnd);
|
|
326
|
+
try {
|
|
327
|
+
const message = JSON.parse(body);
|
|
328
|
+
this.handleMessage(message);
|
|
329
|
+
}
|
|
330
|
+
catch {
|
|
331
|
+
// Malformed JSON — skip
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
handleMessage(message) {
|
|
336
|
+
// Response (has id)
|
|
337
|
+
if ("id" in message && message.id !== null) {
|
|
338
|
+
const id = message.id;
|
|
339
|
+
const pending = this.pending.get(id);
|
|
340
|
+
if (pending) {
|
|
341
|
+
clearTimeout(pending.timer);
|
|
342
|
+
this.pending.delete(id);
|
|
343
|
+
pending.resolve(message);
|
|
344
|
+
}
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
// Server → client request (has id + method, needs response)
|
|
348
|
+
if ("id" in message && "method" in message) {
|
|
349
|
+
const method = message.method;
|
|
350
|
+
// Handle common server requests with empty responses
|
|
351
|
+
if (method === "window/workDoneProgress/create" ||
|
|
352
|
+
method === "client/registerCapability" ||
|
|
353
|
+
method === "client/unregisterCapability") {
|
|
354
|
+
this.writeMessage({
|
|
355
|
+
jsonrpc: "2.0",
|
|
356
|
+
id: message.id,
|
|
357
|
+
result: null,
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
else if (method === "workspace/configuration") {
|
|
361
|
+
// Return initialization options for each requested item
|
|
362
|
+
const items = message.params?.items ?? [];
|
|
363
|
+
this.writeMessage({
|
|
364
|
+
jsonrpc: "2.0",
|
|
365
|
+
id: message.id,
|
|
366
|
+
result: items.map(() => this.config.initializationOptions ?? {}),
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
// Notification (no id)
|
|
372
|
+
if ("method" in message) {
|
|
373
|
+
this.handleNotification(message);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
handleNotification(notification) {
|
|
377
|
+
if (notification.method === "textDocument/publishDiagnostics") {
|
|
378
|
+
const params = notification.params;
|
|
379
|
+
const filePath = this.uriToPath(params.uri);
|
|
380
|
+
this.diagnosticsCache.set(filePath, params.diagnostics);
|
|
381
|
+
this.notifyDiagnosticsWaiters(filePath);
|
|
382
|
+
}
|
|
383
|
+
// Other notifications silently ignored
|
|
384
|
+
}
|
|
385
|
+
// ── Helpers ──────────────────────────────────────────────
|
|
386
|
+
uriToPath(uri) {
|
|
387
|
+
// file:///C:/foo/bar.ts → C:/foo/bar.ts (Windows)
|
|
388
|
+
// file:///home/user/bar.ts → /home/user/bar.ts (Unix)
|
|
389
|
+
try {
|
|
390
|
+
const url = new URL(uri);
|
|
391
|
+
if (url.protocol === "file:") {
|
|
392
|
+
// On Windows, pathname starts with / before drive letter
|
|
393
|
+
let p = decodeURIComponent(url.pathname);
|
|
394
|
+
if (process.platform === "win32" && p.startsWith("/") && /^\/[A-Za-z]:/.test(p)) {
|
|
395
|
+
p = p.slice(1);
|
|
396
|
+
}
|
|
397
|
+
return p;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
catch {
|
|
401
|
+
// Not a valid URL
|
|
402
|
+
}
|
|
403
|
+
return uri;
|
|
404
|
+
}
|
|
405
|
+
handleProcessExit() {
|
|
406
|
+
if (this.state === "ready" || this.state === "connecting") {
|
|
407
|
+
this.state = "broken";
|
|
408
|
+
}
|
|
409
|
+
this.rejectAllPending("LSP server exited");
|
|
410
|
+
this.clearAllWaiters();
|
|
411
|
+
this.process = null;
|
|
412
|
+
}
|
|
413
|
+
rejectAllPending(reason) {
|
|
414
|
+
for (const [id, req] of this.pending) {
|
|
415
|
+
clearTimeout(req.timer);
|
|
416
|
+
req.reject(new Error(reason));
|
|
417
|
+
}
|
|
418
|
+
this.pending.clear();
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/lsp/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LSP Module — Language Server Protocol integration.
|
|
3
|
+
*
|
|
4
|
+
* High-level facade for managing LSP clients:
|
|
5
|
+
* - Auto-spawns appropriate language server for each file type
|
|
6
|
+
* - Caches broken servers to avoid repeated spawn attempts
|
|
7
|
+
* - Provides touchFile() → diagnostics() flow for edit tools
|
|
8
|
+
* - Single instance shared across all swarm agents (concurrent-safe)
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* const lsp = new LSPManager(rootDir);
|
|
12
|
+
* await lsp.touchFile("src/index.ts", true); // true = wait for diagnostics
|
|
13
|
+
* const diags = lsp.getDiagnostics("src/index.ts");
|
|
14
|
+
*
|
|
15
|
+
* Swarm-aware: Multiple agents can call touchFile() concurrently.
|
|
16
|
+
* File versions are tracked per-file, not per-agent.
|
|
17
|
+
*/
|
|
18
|
+
import type { LSPServerConfig, LSPDiagnostic, LSPClientInfo } from "./types.js";
|
|
19
|
+
export { LSPClient } from "./client.js";
|
|
20
|
+
export { BUILTIN_SERVERS, TYPESCRIPT_SERVER, PYRIGHT_SERVER, GOPLS_SERVER, RUST_ANALYZER_SERVER, findServersForExtension, getLanguageId, LANGUAGE_MAP, } from "./servers.js";
|
|
21
|
+
export type { LSPServerConfig, LSPDiagnostic, LSPClientState, LSPClientInfo, LSPPosition, LSPRange, DiagnosticSeverity, InitializeResult, ServerCapabilities, PublishDiagnosticsParams, } from "./types.js";
|
|
22
|
+
export { DiagnosticSeverity as DiagSeverity } from "./types.js";
|
|
23
|
+
export declare class LSPManager {
|
|
24
|
+
private readonly rootDir;
|
|
25
|
+
private readonly clients;
|
|
26
|
+
private readonly broken;
|
|
27
|
+
private readonly spawning;
|
|
28
|
+
private customServers;
|
|
29
|
+
private disabled;
|
|
30
|
+
constructor(rootDir: string);
|
|
31
|
+
/**
|
|
32
|
+
* Add custom server configurations (from config file).
|
|
33
|
+
*/
|
|
34
|
+
addServers(servers: LSPServerConfig[]): void;
|
|
35
|
+
/**
|
|
36
|
+
* Disable LSP entirely (e.g., from config: `lsp: false`).
|
|
37
|
+
*/
|
|
38
|
+
disable(): void;
|
|
39
|
+
/**
|
|
40
|
+
* Touch a file — notify appropriate LSP servers and optionally
|
|
41
|
+
* wait for diagnostics.
|
|
42
|
+
*
|
|
43
|
+
* Lazily spawns servers on first call for each file type.
|
|
44
|
+
* Skips broken servers silently.
|
|
45
|
+
*/
|
|
46
|
+
touchFile(filePath: string, waitForDiagnostics?: boolean): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Get diagnostics for a specific file across all active servers.
|
|
49
|
+
*/
|
|
50
|
+
getDiagnostics(filePath: string): LSPDiagnostic[];
|
|
51
|
+
/**
|
|
52
|
+
* Get error-level diagnostics for a file, formatted for tool output.
|
|
53
|
+
*
|
|
54
|
+
* Returns a string suitable for appending to edit_file results,
|
|
55
|
+
* or empty string if no errors.
|
|
56
|
+
*/
|
|
57
|
+
getErrorDiagnosticsText(filePath: string): string;
|
|
58
|
+
/**
|
|
59
|
+
* Get info about all active clients.
|
|
60
|
+
*/
|
|
61
|
+
getClientInfos(): LSPClientInfo[];
|
|
62
|
+
/**
|
|
63
|
+
* Check if a server is marked as broken.
|
|
64
|
+
*/
|
|
65
|
+
isBroken(serverId: string): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Dispose all clients and clear state.
|
|
68
|
+
*/
|
|
69
|
+
disposeAll(): void;
|
|
70
|
+
private getClientsForFile;
|
|
71
|
+
private spawnClient;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Format a diagnostic for human-readable output.
|
|
75
|
+
*/
|
|
76
|
+
export declare function formatDiagnostic(d: LSPDiagnostic): string;
|
|
77
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lsp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAsB,MAAM,YAAY,CAAC;AAEpG,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,oBAAoB,EACpB,uBAAuB,EACvB,aAAa,EACb,YAAY,GACb,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,eAAe,EACf,aAAa,EACb,cAAc,EACd,aAAa,EACb,WAAW,EACX,QAAQ,EACR,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kBAAkB,IAAI,YAAY,EAAE,MAAM,YAAY,CAAC;AAQhE,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgD;IACzE,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,EAAE,MAAM;IAM3B;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI;IAI5C;;OAEG;IACH,OAAO,IAAI,IAAI;IAOf;;;;;;OAMG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,kBAAkB,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAe5E;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE;IAQjD;;;;;OAKG;IACH,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAcjD;;OAEG;IACH,cAAc,IAAI,aAAa,EAAE;IAIjC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAMnC;;OAEG;IACH,UAAU,IAAI,IAAI;YAWJ,iBAAiB;YA+CjB,WAAW;CAgB1B;AAID;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAMzD"}
|