gsd-pi 2.8.2 → 2.9.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/README.md +2 -1
- package/dist/cli.js +5 -0
- package/dist/loader.js +1 -1
- package/dist/update-check.d.ts +24 -0
- package/dist/update-check.js +93 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/extensions/types.d.ts +4 -2
- package/node_modules/@gsd/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/node_modules/@gsd/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/client.d.ts +46 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/client.js +758 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/client.js.map +1 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/config.d.ts +23 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/config.js +267 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/config.js.map +1 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/edits.d.ts +17 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/edits.d.ts.map +1 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/edits.js +101 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/edits.js.map +1 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/helpers.d.ts +15 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/helpers.d.ts.map +1 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/helpers.js +46 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/helpers.js.map +1 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/index.d.ts +35 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/index.js +709 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/index.js.map +1 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/lsp-integration.test.d.ts +2 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/lsp-integration.test.d.ts.map +1 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +308 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/lspmux.d.ts +34 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/lspmux.js +136 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/types.d.ts +262 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/types.d.ts.map +1 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/types.js +64 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/types.js.map +1 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/utils.d.ts +50 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/utils.d.ts.map +1 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/utils.js +574 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/lsp/utils.js.map +1 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
- package/node_modules/@gsd/pi-coding-agent/dist/core/slash-commands.js +1 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
- package/node_modules/@gsd/pi-coding-agent/dist/core/tools/index.d.ts +13 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
- package/node_modules/@gsd/pi-coding-agent/dist/core/tools/index.js +4 -0
- package/node_modules/@gsd/pi-coding-agent/dist/core/tools/index.js.map +1 -1
- package/node_modules/@gsd/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +10 -1
- package/node_modules/@gsd/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/node_modules/@gsd/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +2 -2
- package/node_modules/@gsd/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/node_modules/@gsd/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/node_modules/@gsd/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/node_modules/@gsd/pi-coding-agent/dist/modes/interactive/interactive-mode.js +80 -1
- package/node_modules/@gsd/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/node_modules/@gsd/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
- package/node_modules/@gsd/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/node_modules/@gsd/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +5 -0
- package/node_modules/@gsd/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/node_modules/@gsd/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
- package/node_modules/@gsd/pi-coding-agent/src/core/extensions/types.ts +4 -2
- package/node_modules/@gsd/pi-coding-agent/src/core/lsp/client.ts +880 -0
- package/node_modules/@gsd/pi-coding-agent/src/core/lsp/config.ts +325 -0
- package/node_modules/@gsd/pi-coding-agent/src/core/lsp/defaults.json +456 -0
- package/node_modules/@gsd/pi-coding-agent/src/core/lsp/edits.ts +109 -0
- package/node_modules/@gsd/pi-coding-agent/src/core/lsp/helpers.ts +54 -0
- package/node_modules/@gsd/pi-coding-agent/src/core/lsp/index.ts +943 -0
- package/node_modules/@gsd/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +407 -0
- package/node_modules/@gsd/pi-coding-agent/src/core/lsp/lsp.md +33 -0
- package/node_modules/@gsd/pi-coding-agent/src/core/lsp/lspmux.ts +199 -0
- package/node_modules/@gsd/pi-coding-agent/src/core/lsp/types.ts +421 -0
- package/node_modules/@gsd/pi-coding-agent/src/core/lsp/utils.ts +682 -0
- package/node_modules/@gsd/pi-coding-agent/src/core/slash-commands.ts +1 -0
- package/node_modules/@gsd/pi-coding-agent/src/core/tools/index.ts +10 -0
- package/node_modules/@gsd/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +2 -2
- package/node_modules/@gsd/pi-coding-agent/src/modes/interactive/interactive-mode.ts +94 -2
- package/node_modules/@gsd/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -2
- package/node_modules/@gsd/pi-coding-agent/src/modes/rpc/rpc-types.ts +2 -1
- package/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +4 -2
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +46 -0
- package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/client.js +758 -0
- package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/config.d.ts +23 -0
- package/packages/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/config.js +267 -0
- package/packages/pi-coding-agent/dist/core/lsp/config.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/edits.d.ts +17 -0
- package/packages/pi-coding-agent/dist/core/lsp/edits.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/edits.js +101 -0
- package/packages/pi-coding-agent/dist/core/lsp/edits.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/helpers.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/lsp/helpers.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/helpers.js +46 -0
- package/packages/pi-coding-agent/dist/core/lsp/helpers.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/index.d.ts +35 -0
- package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/index.js +709 -0
- package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +308 -0
- package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts +34 -0
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +136 -0
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/types.d.ts +262 -0
- package/packages/pi-coding-agent/dist/core/lsp/types.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/types.js +64 -0
- package/packages/pi-coding-agent/dist/core/lsp/types.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/utils.d.ts +50 -0
- package/packages/pi-coding-agent/dist/core/lsp/utils.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/utils.js +574 -0
- package/packages/pi-coding-agent/dist/core/lsp/utils.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
- package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.d.ts +13 -0
- package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.js +4 -0
- package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +10 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +2 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +80 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +5 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
- package/packages/pi-coding-agent/src/core/extensions/types.ts +4 -2
- package/packages/pi-coding-agent/src/core/lsp/client.ts +880 -0
- package/packages/pi-coding-agent/src/core/lsp/config.ts +325 -0
- package/packages/pi-coding-agent/src/core/lsp/defaults.json +456 -0
- package/packages/pi-coding-agent/src/core/lsp/edits.ts +109 -0
- package/packages/pi-coding-agent/src/core/lsp/helpers.ts +54 -0
- package/packages/pi-coding-agent/src/core/lsp/index.ts +943 -0
- package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +407 -0
- package/packages/pi-coding-agent/src/core/lsp/lsp.md +33 -0
- package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +199 -0
- package/packages/pi-coding-agent/src/core/lsp/types.ts +421 -0
- package/packages/pi-coding-agent/src/core/lsp/utils.ts +682 -0
- package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
- package/packages/pi-coding-agent/src/core/tools/index.ts +10 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +2 -2
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +94 -2
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -2
- package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +2 -1
- package/src/resources/extensions/ask-user-questions.ts +42 -2
- package/src/resources/extensions/bg-shell/index.ts +34 -37
- package/src/resources/extensions/browser-tools/core.d.ts +205 -0
- package/src/resources/extensions/browser-tools/index.ts +2 -2
- package/src/resources/extensions/browser-tools/refs.ts +1 -1
- package/src/resources/extensions/browser-tools/tools/session.ts +1 -1
- package/src/resources/extensions/context7/index.ts +2 -2
- package/src/resources/extensions/get-secrets-from-user.ts +3 -2
- package/src/resources/extensions/google-search/index.ts +1 -1
- package/src/resources/extensions/gsd/auto.ts +126 -12
- package/src/resources/extensions/gsd/commands.ts +218 -3
- package/src/resources/extensions/gsd/doctor.ts +1 -1
- package/src/resources/extensions/gsd/git-service.ts +163 -13
- package/src/resources/extensions/gsd/guided-flow.ts +19 -9
- package/src/resources/extensions/gsd/index.ts +17 -7
- package/src/resources/extensions/gsd/preferences.ts +1 -1
- package/src/resources/extensions/gsd/tests/git-service.test.ts +226 -0
- package/src/resources/extensions/gsd/tests/migrate-command.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +10 -10
- package/src/resources/extensions/gsd/tests/next-milestone-id.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/worktree.test.ts +352 -0
- package/src/resources/extensions/gsd/types.ts +1 -0
- package/src/resources/extensions/gsd/worktree.ts +20 -1
- package/src/resources/extensions/mac-tools/index.ts +1 -1
- package/src/resources/extensions/search-the-web/command-search-provider.ts +1 -1
- package/src/resources/extensions/search-the-web/format.ts +1 -1
- package/src/resources/extensions/search-the-web/index.ts +5 -5
- package/src/resources/extensions/search-the-web/native-search.ts +5 -6
- package/src/resources/extensions/search-the-web/tool-fetch-page.ts +7 -7
- package/src/resources/extensions/search-the-web/tool-llm-context.ts +11 -11
- package/src/resources/extensions/search-the-web/tool-search.ts +10 -10
- package/src/resources/extensions/shared/interview-ui.ts +2 -2
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { execSync, spawn } from "node:child_process";
|
|
2
|
+
import * as fsPromises from "node:fs/promises";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
// =============================================================================
|
|
6
|
+
// Constants
|
|
7
|
+
// =============================================================================
|
|
8
|
+
const DEFAULT_SUPPORTED_SERVERS = new Set([
|
|
9
|
+
"rust-analyzer",
|
|
10
|
+
]);
|
|
11
|
+
const LIVENESS_TIMEOUT_MS = 1000;
|
|
12
|
+
const STATE_CACHE_TTL_MS = 5 * 60 * 1000;
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// Helpers
|
|
15
|
+
// =============================================================================
|
|
16
|
+
function which(command) {
|
|
17
|
+
try {
|
|
18
|
+
return execSync(`which ${command}`, { encoding: "utf-8" }).trim() || null;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// =============================================================================
|
|
25
|
+
// Config Path
|
|
26
|
+
// =============================================================================
|
|
27
|
+
function getConfigPath() {
|
|
28
|
+
const home = os.homedir();
|
|
29
|
+
switch (os.platform()) {
|
|
30
|
+
case "win32":
|
|
31
|
+
return path.join(process.env.APPDATA ?? path.join(home, "AppData", "Roaming"), "lspmux", "config.toml");
|
|
32
|
+
case "darwin":
|
|
33
|
+
return path.join(home, "Library", "Application Support", "lspmux", "config.toml");
|
|
34
|
+
default:
|
|
35
|
+
return path.join(process.env.XDG_CONFIG_HOME ?? path.join(home, ".config"), "lspmux", "config.toml");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// =============================================================================
|
|
39
|
+
// State Management
|
|
40
|
+
// =============================================================================
|
|
41
|
+
let cachedState = null;
|
|
42
|
+
let cacheTimestamp = 0;
|
|
43
|
+
async function parseConfig() {
|
|
44
|
+
try {
|
|
45
|
+
const configPath = getConfigPath();
|
|
46
|
+
// lspmux config uses TOML, but since we're stripping TOML support,
|
|
47
|
+
// attempt a simple key=value parse for the config file.
|
|
48
|
+
// If the config file exists but can't be parsed, return null.
|
|
49
|
+
try {
|
|
50
|
+
await fsPromises.access(configPath);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
// Config exists but we can't parse TOML without a dependency.
|
|
56
|
+
// Return an empty config object to indicate the file exists.
|
|
57
|
+
return {};
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async function checkServerRunning(binaryPath) {
|
|
64
|
+
try {
|
|
65
|
+
const proc = spawn(binaryPath, ["status"], {
|
|
66
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
67
|
+
});
|
|
68
|
+
const exited = await Promise.race([
|
|
69
|
+
new Promise((resolve) => {
|
|
70
|
+
proc.on("exit", (code) => resolve(code ?? 1));
|
|
71
|
+
}),
|
|
72
|
+
new Promise(resolve => setTimeout(() => resolve(null), LIVENESS_TIMEOUT_MS)),
|
|
73
|
+
]);
|
|
74
|
+
if (exited === null) {
|
|
75
|
+
proc.kill();
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
return exited === 0;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export async function detectLspmux() {
|
|
85
|
+
const now = Date.now();
|
|
86
|
+
if (cachedState && now - cacheTimestamp < STATE_CACHE_TTL_MS) {
|
|
87
|
+
return cachedState;
|
|
88
|
+
}
|
|
89
|
+
if (process.env.PI_DISABLE_LSPMUX === "1" || process.env.GSD_DISABLE_LSPMUX === "1") {
|
|
90
|
+
cachedState = { available: false, running: false, binaryPath: null, config: null };
|
|
91
|
+
cacheTimestamp = now;
|
|
92
|
+
return cachedState;
|
|
93
|
+
}
|
|
94
|
+
const binaryPath = which("lspmux");
|
|
95
|
+
if (!binaryPath) {
|
|
96
|
+
cachedState = { available: false, running: false, binaryPath: null, config: null };
|
|
97
|
+
cacheTimestamp = now;
|
|
98
|
+
return cachedState;
|
|
99
|
+
}
|
|
100
|
+
const [config, running] = await Promise.all([parseConfig(), checkServerRunning(binaryPath)]);
|
|
101
|
+
cachedState = { available: true, running, binaryPath, config };
|
|
102
|
+
cacheTimestamp = now;
|
|
103
|
+
return cachedState;
|
|
104
|
+
}
|
|
105
|
+
// =============================================================================
|
|
106
|
+
// Command Wrapping
|
|
107
|
+
// =============================================================================
|
|
108
|
+
export function isLspmuxSupported(command) {
|
|
109
|
+
const baseName = command.split("/").pop() ?? command;
|
|
110
|
+
return DEFAULT_SUPPORTED_SERVERS.has(baseName);
|
|
111
|
+
}
|
|
112
|
+
export function wrapWithLspmux(originalCommand, originalArgs, state) {
|
|
113
|
+
if (!state.available || !state.running || !state.binaryPath) {
|
|
114
|
+
return { command: originalCommand, args: originalArgs ?? [] };
|
|
115
|
+
}
|
|
116
|
+
if (!isLspmuxSupported(originalCommand)) {
|
|
117
|
+
return { command: originalCommand, args: originalArgs ?? [] };
|
|
118
|
+
}
|
|
119
|
+
const baseName = originalCommand.split("/").pop() ?? originalCommand;
|
|
120
|
+
const isDefaultRustAnalyzer = baseName === "rust-analyzer" && originalCommand === "rust-analyzer";
|
|
121
|
+
const hasArgs = originalArgs && originalArgs.length > 0;
|
|
122
|
+
if (isDefaultRustAnalyzer && !hasArgs) {
|
|
123
|
+
return { command: state.binaryPath, args: [] };
|
|
124
|
+
}
|
|
125
|
+
const args = hasArgs ? ["client", "--", ...originalArgs] : ["client"];
|
|
126
|
+
return {
|
|
127
|
+
command: state.binaryPath,
|
|
128
|
+
args,
|
|
129
|
+
env: { LSPMUX_SERVER: originalCommand },
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
export async function getLspmuxCommand(command, args) {
|
|
133
|
+
const state = await detectLspmux();
|
|
134
|
+
return wrapWithLspmux(command, args, state);
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=lspmux.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lspmux.js","sourceRoot":"","sources":["../../../src/core/lsp/lspmux.ts"],"names":[],"mappings":"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","sourcesContent":["import { execSync, spawn } from \"node:child_process\";\nimport * as fsPromises from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\n/**\n * lspmux integration for LSP server multiplexing.\n *\n * When lspmux is available and running, this module wraps supported LSP server\n * commands to use lspmux client mode, enabling server instance sharing across\n * multiple editor windows.\n *\n * Integration is transparent: if lspmux is unavailable, falls back to direct spawning.\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\ninterface LspmuxConfig {\n\tinstance_timeout?: number;\n\tgc_interval?: number;\n\tlisten?: [string, number] | string;\n\tconnect?: [string, number] | string;\n\tlog_filters?: string;\n\tpass_environment?: string[];\n}\n\ninterface LspmuxState {\n\tavailable: boolean;\n\trunning: boolean;\n\tbinaryPath: string | null;\n\tconfig: LspmuxConfig | null;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst DEFAULT_SUPPORTED_SERVERS = new Set([\n\t\"rust-analyzer\",\n]);\n\nconst LIVENESS_TIMEOUT_MS = 1000;\nconst STATE_CACHE_TTL_MS = 5 * 60 * 1000;\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nfunction which(command: string): string | null {\n\ttry {\n\t\treturn execSync(`which ${command}`, { encoding: \"utf-8\" }).trim() || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n// =============================================================================\n// Config Path\n// =============================================================================\n\nfunction getConfigPath(): string {\n\tconst home = os.homedir();\n\tswitch (os.platform()) {\n\t\tcase \"win32\":\n\t\t\treturn path.join(process.env.APPDATA ?? path.join(home, \"AppData\", \"Roaming\"), \"lspmux\", \"config.toml\");\n\t\tcase \"darwin\":\n\t\t\treturn path.join(home, \"Library\", \"Application Support\", \"lspmux\", \"config.toml\");\n\t\tdefault:\n\t\t\treturn path.join(process.env.XDG_CONFIG_HOME ?? path.join(home, \".config\"), \"lspmux\", \"config.toml\");\n\t}\n}\n\n// =============================================================================\n// State Management\n// =============================================================================\n\nlet cachedState: LspmuxState | null = null;\nlet cacheTimestamp = 0;\n\nasync function parseConfig(): Promise<LspmuxConfig | null> {\n\ttry {\n\t\tconst configPath = getConfigPath();\n\t\t// lspmux config uses TOML, but since we're stripping TOML support,\n\t\t// attempt a simple key=value parse for the config file.\n\t\t// If the config file exists but can't be parsed, return null.\n\t\ttry {\n\t\t\tawait fsPromises.access(configPath);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t\t// Config exists but we can't parse TOML without a dependency.\n\t\t// Return an empty config object to indicate the file exists.\n\t\treturn {} as LspmuxConfig;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function checkServerRunning(binaryPath: string): Promise<boolean> {\n\ttry {\n\t\tconst proc = spawn(binaryPath, [\"status\"], {\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tconst exited = await Promise.race([\n\t\t\tnew Promise<number>((resolve) => {\n\t\t\t\tproc.on(\"exit\", (code: number | null) => resolve(code ?? 1));\n\t\t\t}),\n\t\t\tnew Promise<null>(resolve => setTimeout(() => resolve(null), LIVENESS_TIMEOUT_MS)),\n\t\t]);\n\n\t\tif (exited === null) {\n\t\t\tproc.kill();\n\t\t\treturn false;\n\t\t}\n\n\t\treturn exited === 0;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport async function detectLspmux(): Promise<LspmuxState> {\n\tconst now = Date.now();\n\tif (cachedState && now - cacheTimestamp < STATE_CACHE_TTL_MS) {\n\t\treturn cachedState;\n\t}\n\n\tif (process.env.PI_DISABLE_LSPMUX === \"1\" || process.env.GSD_DISABLE_LSPMUX === \"1\") {\n\t\tcachedState = { available: false, running: false, binaryPath: null, config: null };\n\t\tcacheTimestamp = now;\n\t\treturn cachedState;\n\t}\n\n\tconst binaryPath = which(\"lspmux\");\n\tif (!binaryPath) {\n\t\tcachedState = { available: false, running: false, binaryPath: null, config: null };\n\t\tcacheTimestamp = now;\n\t\treturn cachedState;\n\t}\n\n\tconst [config, running] = await Promise.all([parseConfig(), checkServerRunning(binaryPath)]);\n\n\tcachedState = { available: true, running, binaryPath, config };\n\tcacheTimestamp = now;\n\n\treturn cachedState;\n}\n\n// =============================================================================\n// Command Wrapping\n// =============================================================================\n\nexport function isLspmuxSupported(command: string): boolean {\n\tconst baseName = command.split(\"/\").pop() ?? command;\n\treturn DEFAULT_SUPPORTED_SERVERS.has(baseName);\n}\n\nexport interface LspmuxWrappedCommand {\n\tcommand: string;\n\targs: string[];\n\tenv?: Record<string, string>;\n}\n\nexport function wrapWithLspmux(\n\toriginalCommand: string,\n\toriginalArgs: string[] | undefined,\n\tstate: LspmuxState,\n): LspmuxWrappedCommand {\n\tif (!state.available || !state.running || !state.binaryPath) {\n\t\treturn { command: originalCommand, args: originalArgs ?? [] };\n\t}\n\n\tif (!isLspmuxSupported(originalCommand)) {\n\t\treturn { command: originalCommand, args: originalArgs ?? [] };\n\t}\n\n\tconst baseName = originalCommand.split(\"/\").pop() ?? originalCommand;\n\tconst isDefaultRustAnalyzer = baseName === \"rust-analyzer\" && originalCommand === \"rust-analyzer\";\n\tconst hasArgs = originalArgs && originalArgs.length > 0;\n\n\tif (isDefaultRustAnalyzer && !hasArgs) {\n\t\treturn { command: state.binaryPath, args: [] };\n\t}\n\n\tconst args = hasArgs ? [\"client\", \"--\", ...originalArgs] : [\"client\"];\n\treturn {\n\t\tcommand: state.binaryPath,\n\t\targs,\n\t\tenv: { LSPMUX_SERVER: originalCommand },\n\t};\n}\n\nexport async function getLspmuxCommand(command: string, args?: string[]): Promise<LspmuxWrappedCommand> {\n\tconst state = await detectLspmux();\n\treturn wrapWithLspmux(command, args, state);\n}\n"]}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { type Static, type TUnsafe } from "@sinclair/typebox";
|
|
2
|
+
import type { ChildProcess } from "node:child_process";
|
|
3
|
+
export declare const lspSchema: import("@sinclair/typebox").TObject<{
|
|
4
|
+
action: TUnsafe<string>;
|
|
5
|
+
file: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
6
|
+
line: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
7
|
+
symbol: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
8
|
+
occurrence: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
9
|
+
query: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
10
|
+
new_name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
11
|
+
apply: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
12
|
+
timeout: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
13
|
+
}>;
|
|
14
|
+
export type LspParams = Static<typeof lspSchema>;
|
|
15
|
+
export interface LspToolDetails {
|
|
16
|
+
serverName?: string;
|
|
17
|
+
action: string;
|
|
18
|
+
success: boolean;
|
|
19
|
+
request?: LspParams;
|
|
20
|
+
}
|
|
21
|
+
export interface Position {
|
|
22
|
+
line: number;
|
|
23
|
+
character: number;
|
|
24
|
+
}
|
|
25
|
+
export interface Range {
|
|
26
|
+
start: Position;
|
|
27
|
+
end: Position;
|
|
28
|
+
}
|
|
29
|
+
export interface Location {
|
|
30
|
+
uri: string;
|
|
31
|
+
range: Range;
|
|
32
|
+
}
|
|
33
|
+
export interface LocationLink {
|
|
34
|
+
originSelectionRange?: Range;
|
|
35
|
+
targetUri: string;
|
|
36
|
+
targetRange: Range;
|
|
37
|
+
targetSelectionRange: Range;
|
|
38
|
+
}
|
|
39
|
+
export type DiagnosticSeverity = 1 | 2 | 3 | 4;
|
|
40
|
+
export interface DiagnosticRelatedInformation {
|
|
41
|
+
location: Location;
|
|
42
|
+
message: string;
|
|
43
|
+
}
|
|
44
|
+
export interface Diagnostic {
|
|
45
|
+
range: Range;
|
|
46
|
+
severity?: DiagnosticSeverity;
|
|
47
|
+
code?: string | number;
|
|
48
|
+
codeDescription?: {
|
|
49
|
+
href: string;
|
|
50
|
+
};
|
|
51
|
+
source?: string;
|
|
52
|
+
message: string;
|
|
53
|
+
tags?: number[];
|
|
54
|
+
relatedInformation?: DiagnosticRelatedInformation[];
|
|
55
|
+
data?: unknown;
|
|
56
|
+
}
|
|
57
|
+
export interface TextEdit {
|
|
58
|
+
range: Range;
|
|
59
|
+
newText: string;
|
|
60
|
+
}
|
|
61
|
+
export interface AnnotatedTextEdit extends TextEdit {
|
|
62
|
+
annotationId?: string;
|
|
63
|
+
}
|
|
64
|
+
export interface TextDocumentIdentifier {
|
|
65
|
+
uri: string;
|
|
66
|
+
}
|
|
67
|
+
export interface VersionedTextDocumentIdentifier extends TextDocumentIdentifier {
|
|
68
|
+
version: number | null;
|
|
69
|
+
}
|
|
70
|
+
export interface OptionalVersionedTextDocumentIdentifier extends TextDocumentIdentifier {
|
|
71
|
+
version?: number | null;
|
|
72
|
+
}
|
|
73
|
+
export interface TextDocumentEdit {
|
|
74
|
+
textDocument: OptionalVersionedTextDocumentIdentifier;
|
|
75
|
+
edits: (TextEdit | AnnotatedTextEdit)[];
|
|
76
|
+
}
|
|
77
|
+
export interface CreateFileOptions {
|
|
78
|
+
overwrite?: boolean;
|
|
79
|
+
ignoreIfExists?: boolean;
|
|
80
|
+
}
|
|
81
|
+
export interface CreateFile {
|
|
82
|
+
kind: "create";
|
|
83
|
+
uri: string;
|
|
84
|
+
options?: CreateFileOptions;
|
|
85
|
+
}
|
|
86
|
+
export interface RenameFileOptions {
|
|
87
|
+
overwrite?: boolean;
|
|
88
|
+
ignoreIfExists?: boolean;
|
|
89
|
+
}
|
|
90
|
+
export interface RenameFile {
|
|
91
|
+
kind: "rename";
|
|
92
|
+
oldUri: string;
|
|
93
|
+
newUri: string;
|
|
94
|
+
options?: RenameFileOptions;
|
|
95
|
+
}
|
|
96
|
+
export interface DeleteFileOptions {
|
|
97
|
+
recursive?: boolean;
|
|
98
|
+
ignoreIfNotExists?: boolean;
|
|
99
|
+
}
|
|
100
|
+
export interface DeleteFile {
|
|
101
|
+
kind: "delete";
|
|
102
|
+
uri: string;
|
|
103
|
+
options?: DeleteFileOptions;
|
|
104
|
+
}
|
|
105
|
+
export type DocumentChange = TextDocumentEdit | CreateFile | RenameFile | DeleteFile;
|
|
106
|
+
export interface WorkspaceEdit {
|
|
107
|
+
changes?: Record<string, TextEdit[]>;
|
|
108
|
+
documentChanges?: DocumentChange[];
|
|
109
|
+
changeAnnotations?: Record<string, {
|
|
110
|
+
label: string;
|
|
111
|
+
needsConfirmation?: boolean;
|
|
112
|
+
description?: string;
|
|
113
|
+
}>;
|
|
114
|
+
}
|
|
115
|
+
export type CodeActionKind = "quickfix" | "refactor" | "refactor.extract" | "refactor.inline" | "refactor.rewrite" | "source" | "source.organizeImports" | "source.fixAll" | string;
|
|
116
|
+
export interface Command {
|
|
117
|
+
title: string;
|
|
118
|
+
command: string;
|
|
119
|
+
arguments?: unknown[];
|
|
120
|
+
}
|
|
121
|
+
export interface CodeAction {
|
|
122
|
+
title: string;
|
|
123
|
+
kind?: CodeActionKind;
|
|
124
|
+
diagnostics?: Diagnostic[];
|
|
125
|
+
isPreferred?: boolean;
|
|
126
|
+
disabled?: {
|
|
127
|
+
reason: string;
|
|
128
|
+
};
|
|
129
|
+
edit?: WorkspaceEdit;
|
|
130
|
+
command?: Command;
|
|
131
|
+
data?: unknown;
|
|
132
|
+
}
|
|
133
|
+
export interface CodeActionContext {
|
|
134
|
+
diagnostics: Diagnostic[];
|
|
135
|
+
only?: CodeActionKind[];
|
|
136
|
+
triggerKind?: 1 | 2;
|
|
137
|
+
}
|
|
138
|
+
export type SymbolKind = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26;
|
|
139
|
+
export declare const SYMBOL_KIND_NAMES: Record<SymbolKind, string>;
|
|
140
|
+
export interface DocumentSymbol {
|
|
141
|
+
name: string;
|
|
142
|
+
detail?: string;
|
|
143
|
+
kind: SymbolKind;
|
|
144
|
+
tags?: number[];
|
|
145
|
+
deprecated?: boolean;
|
|
146
|
+
range: Range;
|
|
147
|
+
selectionRange: Range;
|
|
148
|
+
children?: DocumentSymbol[];
|
|
149
|
+
}
|
|
150
|
+
export interface SymbolInformation {
|
|
151
|
+
name: string;
|
|
152
|
+
kind: SymbolKind;
|
|
153
|
+
tags?: number[];
|
|
154
|
+
deprecated?: boolean;
|
|
155
|
+
location: Location;
|
|
156
|
+
containerName?: string;
|
|
157
|
+
}
|
|
158
|
+
export interface MarkupContent {
|
|
159
|
+
kind: "plaintext" | "markdown";
|
|
160
|
+
value: string;
|
|
161
|
+
}
|
|
162
|
+
export type MarkedString = string | {
|
|
163
|
+
language: string;
|
|
164
|
+
value: string;
|
|
165
|
+
};
|
|
166
|
+
export interface Hover {
|
|
167
|
+
contents: MarkupContent | MarkedString | MarkedString[];
|
|
168
|
+
range?: Range;
|
|
169
|
+
}
|
|
170
|
+
export interface ServerCapabilities {
|
|
171
|
+
flycheck?: boolean;
|
|
172
|
+
ssr?: boolean;
|
|
173
|
+
expandMacro?: boolean;
|
|
174
|
+
runnables?: boolean;
|
|
175
|
+
relatedTests?: boolean;
|
|
176
|
+
}
|
|
177
|
+
export interface ServerConfig {
|
|
178
|
+
command: string;
|
|
179
|
+
args?: string[];
|
|
180
|
+
fileTypes: string[];
|
|
181
|
+
rootMarkers: string[];
|
|
182
|
+
initOptions?: Record<string, unknown>;
|
|
183
|
+
settings?: Record<string, unknown>;
|
|
184
|
+
disabled?: boolean;
|
|
185
|
+
/** Per-server warmup timeout in milliseconds. */
|
|
186
|
+
warmupTimeoutMs?: number;
|
|
187
|
+
capabilities?: ServerCapabilities;
|
|
188
|
+
/** If true, this is a linter/formatter server — used only for diagnostics/actions, not type intelligence */
|
|
189
|
+
isLinter?: boolean;
|
|
190
|
+
/** Resolved absolute path to the command binary (set during config loading) */
|
|
191
|
+
resolvedCommand?: string;
|
|
192
|
+
}
|
|
193
|
+
export interface OpenFile {
|
|
194
|
+
version: number;
|
|
195
|
+
languageId: string;
|
|
196
|
+
}
|
|
197
|
+
export interface PendingRequest {
|
|
198
|
+
resolve: (result: unknown) => void;
|
|
199
|
+
reject: (error: Error) => void;
|
|
200
|
+
method: string;
|
|
201
|
+
}
|
|
202
|
+
export interface LspServerCapabilities {
|
|
203
|
+
renameProvider?: boolean | {
|
|
204
|
+
prepareProvider?: boolean;
|
|
205
|
+
};
|
|
206
|
+
codeActionProvider?: boolean | {
|
|
207
|
+
resolveProvider?: boolean;
|
|
208
|
+
};
|
|
209
|
+
hoverProvider?: boolean;
|
|
210
|
+
definitionProvider?: boolean;
|
|
211
|
+
referencesProvider?: boolean;
|
|
212
|
+
documentSymbolProvider?: boolean;
|
|
213
|
+
documentFormattingProvider?: boolean;
|
|
214
|
+
workspaceSymbolProvider?: boolean;
|
|
215
|
+
[key: string]: unknown;
|
|
216
|
+
}
|
|
217
|
+
export interface LspClient {
|
|
218
|
+
name: string;
|
|
219
|
+
cwd: string;
|
|
220
|
+
config: ServerConfig;
|
|
221
|
+
proc: {
|
|
222
|
+
stdin: ChildProcess["stdin"];
|
|
223
|
+
stdout: ChildProcess["stdout"];
|
|
224
|
+
stderr: ChildProcess["stderr"];
|
|
225
|
+
pid: number;
|
|
226
|
+
exitCode: number | null;
|
|
227
|
+
exited: Promise<number>;
|
|
228
|
+
kill(signal?: number): void;
|
|
229
|
+
};
|
|
230
|
+
requestId: number;
|
|
231
|
+
diagnostics: Map<string, Diagnostic[]>;
|
|
232
|
+
diagnosticsVersion: number;
|
|
233
|
+
openFiles: Map<string, OpenFile>;
|
|
234
|
+
pendingRequests: Map<number, PendingRequest>;
|
|
235
|
+
messageBuffer: Buffer;
|
|
236
|
+
isReading: boolean;
|
|
237
|
+
serverCapabilities?: LspServerCapabilities;
|
|
238
|
+
lastActivity: number;
|
|
239
|
+
stderrBuffer: string;
|
|
240
|
+
}
|
|
241
|
+
export interface LspJsonRpcRequest {
|
|
242
|
+
jsonrpc: "2.0";
|
|
243
|
+
id: number;
|
|
244
|
+
method: string;
|
|
245
|
+
params: unknown;
|
|
246
|
+
}
|
|
247
|
+
export interface LspJsonRpcResponse {
|
|
248
|
+
jsonrpc: "2.0";
|
|
249
|
+
id?: number;
|
|
250
|
+
result?: unknown;
|
|
251
|
+
error?: {
|
|
252
|
+
code: number;
|
|
253
|
+
message: string;
|
|
254
|
+
data?: unknown;
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
export interface LspJsonRpcNotification {
|
|
258
|
+
jsonrpc: "2.0";
|
|
259
|
+
method: string;
|
|
260
|
+
params?: unknown;
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
function StringEnum(values, options) {
|
|
3
|
+
return Type.Unsafe({
|
|
4
|
+
type: "string",
|
|
5
|
+
enum: values,
|
|
6
|
+
...(options?.description && { description: options.description }),
|
|
7
|
+
...(options?.default && { default: options.default }),
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// Tool Schema
|
|
12
|
+
// =============================================================================
|
|
13
|
+
export const lspSchema = Type.Object({
|
|
14
|
+
action: StringEnum([
|
|
15
|
+
"diagnostics",
|
|
16
|
+
"definition",
|
|
17
|
+
"references",
|
|
18
|
+
"hover",
|
|
19
|
+
"symbols",
|
|
20
|
+
"rename",
|
|
21
|
+
"code_actions",
|
|
22
|
+
"type_definition",
|
|
23
|
+
"implementation",
|
|
24
|
+
"status",
|
|
25
|
+
"reload",
|
|
26
|
+
], { description: "LSP operation" }),
|
|
27
|
+
file: Type.Optional(Type.String({ description: "File path" })),
|
|
28
|
+
line: Type.Optional(Type.Number({ description: "Line number (1-indexed)" })),
|
|
29
|
+
symbol: Type.Optional(Type.String({ description: "Symbol/substring to locate on the line (used to compute column)" })),
|
|
30
|
+
occurrence: Type.Optional(Type.Number({ description: "Symbol occurrence on line (1-indexed, default: 1)" })),
|
|
31
|
+
query: Type.Optional(Type.String({ description: "Search query or SSR pattern" })),
|
|
32
|
+
new_name: Type.Optional(Type.String({ description: "New name for rename" })),
|
|
33
|
+
apply: Type.Optional(Type.Boolean({ description: "Apply edits (default: true)" })),
|
|
34
|
+
timeout: Type.Optional(Type.Number({ description: "Request timeout in seconds" })),
|
|
35
|
+
});
|
|
36
|
+
export const SYMBOL_KIND_NAMES = {
|
|
37
|
+
1: "File",
|
|
38
|
+
2: "Module",
|
|
39
|
+
3: "Namespace",
|
|
40
|
+
4: "Package",
|
|
41
|
+
5: "Class",
|
|
42
|
+
6: "Method",
|
|
43
|
+
7: "Property",
|
|
44
|
+
8: "Field",
|
|
45
|
+
9: "Constructor",
|
|
46
|
+
10: "Enum",
|
|
47
|
+
11: "Interface",
|
|
48
|
+
12: "Function",
|
|
49
|
+
13: "Variable",
|
|
50
|
+
14: "Constant",
|
|
51
|
+
15: "String",
|
|
52
|
+
16: "Number",
|
|
53
|
+
17: "Boolean",
|
|
54
|
+
18: "Array",
|
|
55
|
+
19: "Object",
|
|
56
|
+
20: "Key",
|
|
57
|
+
21: "Null",
|
|
58
|
+
22: "EnumMember",
|
|
59
|
+
23: "Struct",
|
|
60
|
+
24: "Event",
|
|
61
|
+
25: "Operator",
|
|
62
|
+
26: "TypeParameter",
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/lsp/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAGpE,SAAS,UAAU,CAClB,MAAS,EACT,OAAuD;IAEvD,OAAO,IAAI,CAAC,MAAM,CAAY;QAC7B,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,MAAa;QACnB,GAAG,CAAC,OAAO,EAAE,WAAW,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;QACjE,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;KACrD,CAAC,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,cAAc;AACd,gFAAgF;AAEhF,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;IACpC,MAAM,EAAE,UAAU,CACjB;QACC,aAAa;QACb,YAAY;QACZ,YAAY;QACZ,OAAO;QACP,SAAS;QACT,QAAQ;QACR,cAAc;QACd,iBAAiB;QACjB,gBAAgB;QAChB,QAAQ;QACR,QAAQ;KACR,EACD,EAAE,WAAW,EAAE,eAAe,EAAE,CAChC;IACD,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;IAC9D,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,yBAAyB,EAAE,CAAC,CAAC;IAC5E,MAAM,EAAE,IAAI,CAAC,QAAQ,CACpB,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,iEAAiE,EAAE,CAAC,CAC/F;IACD,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,mDAAmD,EAAE,CAAC,CAAC;IAC5G,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAAC,CAAC;IACjF,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAC5E,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAAC,CAAC;IAClF,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAAC,CAAC;CAClF,CAAC,CAAC;AA8MH,MAAM,CAAC,MAAM,iBAAiB,GAA+B;IAC5D,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,WAAW;IACd,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,UAAU;IACb,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,aAAa;IAChB,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,WAAW;IACf,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,KAAK;IACT,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,eAAe;CACnB,CAAC","sourcesContent":["import { type Static, type TUnsafe, Type } from \"@sinclair/typebox\";\nimport type { ChildProcess } from \"node:child_process\";\n\nfunction StringEnum<T extends readonly string[]>(\n\tvalues: T,\n\toptions?: { description?: string; default?: T[number] },\n): TUnsafe<T[number]> {\n\treturn Type.Unsafe<T[number]>({\n\t\ttype: \"string\",\n\t\tenum: values as any,\n\t\t...(options?.description && { description: options.description }),\n\t\t...(options?.default && { default: options.default }),\n\t});\n}\n\n// =============================================================================\n// Tool Schema\n// =============================================================================\n\nexport const lspSchema = Type.Object({\n\taction: StringEnum(\n\t\t[\n\t\t\t\"diagnostics\",\n\t\t\t\"definition\",\n\t\t\t\"references\",\n\t\t\t\"hover\",\n\t\t\t\"symbols\",\n\t\t\t\"rename\",\n\t\t\t\"code_actions\",\n\t\t\t\"type_definition\",\n\t\t\t\"implementation\",\n\t\t\t\"status\",\n\t\t\t\"reload\",\n\t\t],\n\t\t{ description: \"LSP operation\" },\n\t),\n\tfile: Type.Optional(Type.String({ description: \"File path\" })),\n\tline: Type.Optional(Type.Number({ description: \"Line number (1-indexed)\" })),\n\tsymbol: Type.Optional(\n\t\tType.String({ description: \"Symbol/substring to locate on the line (used to compute column)\" }),\n\t),\n\toccurrence: Type.Optional(Type.Number({ description: \"Symbol occurrence on line (1-indexed, default: 1)\" })),\n\tquery: Type.Optional(Type.String({ description: \"Search query or SSR pattern\" })),\n\tnew_name: Type.Optional(Type.String({ description: \"New name for rename\" })),\n\tapply: Type.Optional(Type.Boolean({ description: \"Apply edits (default: true)\" })),\n\ttimeout: Type.Optional(Type.Number({ description: \"Request timeout in seconds\" })),\n});\n\nexport type LspParams = Static<typeof lspSchema>;\n\nexport interface LspToolDetails {\n\tserverName?: string;\n\taction: string;\n\tsuccess: boolean;\n\trequest?: LspParams;\n}\n\n// =============================================================================\n// Core LSP Protocol Types\n// =============================================================================\n\nexport interface Position {\n\tline: number;\n\tcharacter: number;\n}\n\nexport interface Range {\n\tstart: Position;\n\tend: Position;\n}\n\nexport interface Location {\n\turi: string;\n\trange: Range;\n}\n\nexport interface LocationLink {\n\toriginSelectionRange?: Range;\n\ttargetUri: string;\n\ttargetRange: Range;\n\ttargetSelectionRange: Range;\n}\n\n// =============================================================================\n// Diagnostics\n// =============================================================================\n\nexport type DiagnosticSeverity = 1 | 2 | 3 | 4; // error, warning, info, hint\n\nexport interface DiagnosticRelatedInformation {\n\tlocation: Location;\n\tmessage: string;\n}\n\nexport interface Diagnostic {\n\trange: Range;\n\tseverity?: DiagnosticSeverity;\n\tcode?: string | number;\n\tcodeDescription?: { href: string };\n\tsource?: string;\n\tmessage: string;\n\ttags?: number[];\n\trelatedInformation?: DiagnosticRelatedInformation[];\n\tdata?: unknown;\n}\n\n// =============================================================================\n// Text Edits\n// =============================================================================\n\nexport interface TextEdit {\n\trange: Range;\n\tnewText: string;\n}\n\nexport interface AnnotatedTextEdit extends TextEdit {\n\tannotationId?: string;\n}\n\nexport interface TextDocumentIdentifier {\n\turi: string;\n}\n\nexport interface VersionedTextDocumentIdentifier extends TextDocumentIdentifier {\n\tversion: number | null;\n}\n\nexport interface OptionalVersionedTextDocumentIdentifier extends TextDocumentIdentifier {\n\tversion?: number | null;\n}\n\nexport interface TextDocumentEdit {\n\ttextDocument: OptionalVersionedTextDocumentIdentifier;\n\tedits: (TextEdit | AnnotatedTextEdit)[];\n}\n\n// =============================================================================\n// Resource Operations\n// =============================================================================\n\nexport interface CreateFileOptions {\n\toverwrite?: boolean;\n\tignoreIfExists?: boolean;\n}\n\nexport interface CreateFile {\n\tkind: \"create\";\n\turi: string;\n\toptions?: CreateFileOptions;\n}\n\nexport interface RenameFileOptions {\n\toverwrite?: boolean;\n\tignoreIfExists?: boolean;\n}\n\nexport interface RenameFile {\n\tkind: \"rename\";\n\toldUri: string;\n\tnewUri: string;\n\toptions?: RenameFileOptions;\n}\n\nexport interface DeleteFileOptions {\n\trecursive?: boolean;\n\tignoreIfNotExists?: boolean;\n}\n\nexport interface DeleteFile {\n\tkind: \"delete\";\n\turi: string;\n\toptions?: DeleteFileOptions;\n}\n\nexport type DocumentChange = TextDocumentEdit | CreateFile | RenameFile | DeleteFile;\n\nexport interface WorkspaceEdit {\n\tchanges?: Record<string, TextEdit[]>;\n\tdocumentChanges?: DocumentChange[];\n\tchangeAnnotations?: Record<string, { label: string; needsConfirmation?: boolean; description?: string }>;\n}\n\n// =============================================================================\n// Code Actions\n// =============================================================================\n\nexport type CodeActionKind =\n\t| \"quickfix\"\n\t| \"refactor\"\n\t| \"refactor.extract\"\n\t| \"refactor.inline\"\n\t| \"refactor.rewrite\"\n\t| \"source\"\n\t| \"source.organizeImports\"\n\t| \"source.fixAll\"\n\t| string;\n\nexport interface Command {\n\ttitle: string;\n\tcommand: string;\n\targuments?: unknown[];\n}\n\nexport interface CodeAction {\n\ttitle: string;\n\tkind?: CodeActionKind;\n\tdiagnostics?: Diagnostic[];\n\tisPreferred?: boolean;\n\tdisabled?: { reason: string };\n\tedit?: WorkspaceEdit;\n\tcommand?: Command;\n\tdata?: unknown;\n}\n\nexport interface CodeActionContext {\n\tdiagnostics: Diagnostic[];\n\tonly?: CodeActionKind[];\n\ttriggerKind?: 1 | 2; // Invoked = 1, Automatic = 2\n}\n\n// =============================================================================\n// Symbols\n// =============================================================================\n\nexport type SymbolKind =\n\t| 1 // File\n\t| 2 // Module\n\t| 3 // Namespace\n\t| 4 // Package\n\t| 5 // Class\n\t| 6 // Method\n\t| 7 // Property\n\t| 8 // Field\n\t| 9 // Constructor\n\t| 10 // Enum\n\t| 11 // Interface\n\t| 12 // Function\n\t| 13 // Variable\n\t| 14 // Constant\n\t| 15 // String\n\t| 16 // Number\n\t| 17 // Boolean\n\t| 18 // Array\n\t| 19 // Object\n\t| 20 // Key\n\t| 21 // Null\n\t| 22 // EnumMember\n\t| 23 // Struct\n\t| 24 // Event\n\t| 25 // Operator\n\t| 26; // TypeParameter\n\nexport const SYMBOL_KIND_NAMES: Record<SymbolKind, string> = {\n\t1: \"File\",\n\t2: \"Module\",\n\t3: \"Namespace\",\n\t4: \"Package\",\n\t5: \"Class\",\n\t6: \"Method\",\n\t7: \"Property\",\n\t8: \"Field\",\n\t9: \"Constructor\",\n\t10: \"Enum\",\n\t11: \"Interface\",\n\t12: \"Function\",\n\t13: \"Variable\",\n\t14: \"Constant\",\n\t15: \"String\",\n\t16: \"Number\",\n\t17: \"Boolean\",\n\t18: \"Array\",\n\t19: \"Object\",\n\t20: \"Key\",\n\t21: \"Null\",\n\t22: \"EnumMember\",\n\t23: \"Struct\",\n\t24: \"Event\",\n\t25: \"Operator\",\n\t26: \"TypeParameter\",\n};\n\nexport interface DocumentSymbol {\n\tname: string;\n\tdetail?: string;\n\tkind: SymbolKind;\n\ttags?: number[];\n\tdeprecated?: boolean;\n\trange: Range;\n\tselectionRange: Range;\n\tchildren?: DocumentSymbol[];\n}\n\nexport interface SymbolInformation {\n\tname: string;\n\tkind: SymbolKind;\n\ttags?: number[];\n\tdeprecated?: boolean;\n\tlocation: Location;\n\tcontainerName?: string;\n}\n\n// =============================================================================\n// Hover\n// =============================================================================\n\nexport interface MarkupContent {\n\tkind: \"plaintext\" | \"markdown\";\n\tvalue: string;\n}\n\nexport type MarkedString = string | { language: string; value: string };\n\nexport interface Hover {\n\tcontents: MarkupContent | MarkedString | MarkedString[];\n\trange?: Range;\n}\n\n// =============================================================================\n// Server Configuration\n// =============================================================================\n\nexport interface ServerCapabilities {\n\tflycheck?: boolean;\n\tssr?: boolean;\n\texpandMacro?: boolean;\n\trunnables?: boolean;\n\trelatedTests?: boolean;\n}\n\nexport interface ServerConfig {\n\tcommand: string;\n\targs?: string[];\n\tfileTypes: string[];\n\trootMarkers: string[];\n\tinitOptions?: Record<string, unknown>;\n\tsettings?: Record<string, unknown>;\n\tdisabled?: boolean;\n\t/** Per-server warmup timeout in milliseconds. */\n\twarmupTimeoutMs?: number;\n\tcapabilities?: ServerCapabilities;\n\t/** If true, this is a linter/formatter server — used only for diagnostics/actions, not type intelligence */\n\tisLinter?: boolean;\n\t/** Resolved absolute path to the command binary (set during config loading) */\n\tresolvedCommand?: string;\n}\n\n// =============================================================================\n// Client State\n// =============================================================================\n\nexport interface OpenFile {\n\tversion: number;\n\tlanguageId: string;\n}\n\nexport interface PendingRequest {\n\tresolve: (result: unknown) => void;\n\treject: (error: Error) => void;\n\tmethod: string;\n}\n\nexport interface LspServerCapabilities {\n\trenameProvider?: boolean | { prepareProvider?: boolean };\n\tcodeActionProvider?: boolean | { resolveProvider?: boolean };\n\thoverProvider?: boolean;\n\tdefinitionProvider?: boolean;\n\treferencesProvider?: boolean;\n\tdocumentSymbolProvider?: boolean;\n\tdocumentFormattingProvider?: boolean;\n\tworkspaceSymbolProvider?: boolean;\n\t[key: string]: unknown;\n}\n\nexport interface LspClient {\n\tname: string;\n\tcwd: string;\n\tconfig: ServerConfig;\n\tproc: {\n\t\tstdin: ChildProcess[\"stdin\"];\n\t\tstdout: ChildProcess[\"stdout\"];\n\t\tstderr: ChildProcess[\"stderr\"];\n\t\tpid: number;\n\t\texitCode: number | null;\n\t\texited: Promise<number>;\n\t\tkill(signal?: number): void;\n\t};\n\trequestId: number;\n\tdiagnostics: Map<string, Diagnostic[]>;\n\tdiagnosticsVersion: number;\n\topenFiles: Map<string, OpenFile>;\n\tpendingRequests: Map<number, PendingRequest>;\n\tmessageBuffer: Buffer;\n\tisReading: boolean;\n\tserverCapabilities?: LspServerCapabilities;\n\tlastActivity: number;\n\tstderrBuffer: string;\n}\n\n// =============================================================================\n// JSON-RPC Protocol Types\n// =============================================================================\n\nexport interface LspJsonRpcRequest {\n\tjsonrpc: \"2.0\";\n\tid: number;\n\tmethod: string;\n\tparams: unknown;\n}\n\nexport interface LspJsonRpcResponse {\n\tjsonrpc: \"2.0\";\n\tid?: number;\n\tresult?: unknown;\n\terror?: { code: number; message: string; data?: unknown };\n}\n\nexport interface LspJsonRpcNotification {\n\tjsonrpc: \"2.0\";\n\tmethod: string;\n\tparams?: unknown;\n}\n"]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { CodeAction, Command, Diagnostic, DiagnosticSeverity, DocumentSymbol, Location, SymbolInformation, SymbolKind, TextEdit, WorkspaceEdit } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Detect language ID from file path.
|
|
4
|
+
*/
|
|
5
|
+
export declare function detectLanguageId(filePath: string): string;
|
|
6
|
+
export declare function fileToUri(filePath: string): string;
|
|
7
|
+
export declare function uriToFile(uri: string): string;
|
|
8
|
+
export declare function severityToString(severity?: DiagnosticSeverity): string;
|
|
9
|
+
export declare function sortDiagnostics(diagnostics: Diagnostic[]): Diagnostic[];
|
|
10
|
+
export declare function severityToIcon(severity?: DiagnosticSeverity): string;
|
|
11
|
+
export declare function formatDiagnostic(diagnostic: Diagnostic, filePath: string): string;
|
|
12
|
+
export declare function formatGroupedDiagnosticMessages(messages: string[]): string;
|
|
13
|
+
export declare function formatDiagnosticsSummary(diagnostics: Diagnostic[]): string;
|
|
14
|
+
export declare function formatLocation(location: Location, cwd: string): string;
|
|
15
|
+
export declare function formatPosition(line: number, col: number): string;
|
|
16
|
+
export declare function formatWorkspaceEdit(edit: WorkspaceEdit, cwd: string): string[];
|
|
17
|
+
export declare function formatTextEdit(edit: TextEdit, maxLength?: number): string;
|
|
18
|
+
export declare function symbolKindToIcon(kind: SymbolKind): string;
|
|
19
|
+
export declare function symbolKindToName(kind: SymbolKind): string;
|
|
20
|
+
export declare function formatDocumentSymbol(symbol: DocumentSymbol, indent?: number): string[];
|
|
21
|
+
export declare function formatSymbolInformation(symbol: SymbolInformation, cwd: string): string;
|
|
22
|
+
export declare function filterWorkspaceSymbols(symbols: SymbolInformation[], query: string): SymbolInformation[];
|
|
23
|
+
export declare function dedupeWorkspaceSymbols(symbols: SymbolInformation[]): SymbolInformation[];
|
|
24
|
+
export declare function formatCodeAction(action: CodeAction | Command, index: number): string;
|
|
25
|
+
export interface CodeActionApplyDependencies {
|
|
26
|
+
resolveCodeAction?: (action: CodeAction) => Promise<CodeAction>;
|
|
27
|
+
applyWorkspaceEdit: (edit: WorkspaceEdit) => Promise<string[]>;
|
|
28
|
+
executeCommand: (command: Command) => Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
export interface AppliedCodeActionResult {
|
|
31
|
+
title: string;
|
|
32
|
+
edits: string[];
|
|
33
|
+
executedCommands: string[];
|
|
34
|
+
}
|
|
35
|
+
export declare function applyCodeAction(action: CodeAction | Command, dependencies: CodeActionApplyDependencies): Promise<AppliedCodeActionResult | null>;
|
|
36
|
+
export declare function hasGlobPattern(value: string): boolean;
|
|
37
|
+
export declare function collectGlobMatches(pattern: string, cwd: string, maxMatches: number): Promise<{
|
|
38
|
+
matches: string[];
|
|
39
|
+
truncated: boolean;
|
|
40
|
+
}>;
|
|
41
|
+
export declare function extractHoverText(contents: string | {
|
|
42
|
+
kind: string;
|
|
43
|
+
value: string;
|
|
44
|
+
} | {
|
|
45
|
+
language: string;
|
|
46
|
+
value: string;
|
|
47
|
+
} | unknown[]): string;
|
|
48
|
+
export declare function resolveSymbolColumn(filePath: string, line: number, symbol?: string, occurrence?: number): Promise<number>;
|
|
49
|
+
export declare function readLocationContext(filePath: string, line: number, contextLines?: number): Promise<string[]>;
|
|
50
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/utils.ts"],"names":[],"mappings":"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"}
|