@nogataka/smart-edit 0.0.14
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/LICENSE +22 -0
- package/README.md +244 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +7 -0
- package/dist/devtools/generate_prompt_factory.d.ts +5 -0
- package/dist/devtools/generate_prompt_factory.js +114 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.js +34 -0
- package/dist/interprompt/index.d.ts +2 -0
- package/dist/interprompt/index.js +1 -0
- package/dist/interprompt/jinja_template.d.ts +10 -0
- package/dist/interprompt/jinja_template.js +174 -0
- package/dist/interprompt/multilang_prompt.d.ts +54 -0
- package/dist/interprompt/multilang_prompt.js +302 -0
- package/dist/interprompt/prompt_factory.d.ts +16 -0
- package/dist/interprompt/prompt_factory.js +189 -0
- package/dist/interprompt/util/class_decorators.d.ts +1 -0
- package/dist/interprompt/util/class_decorators.js +1 -0
- package/dist/interprompt/util/index.d.ts +1 -0
- package/dist/interprompt/util/index.js +1 -0
- package/dist/serena/agent.d.ts +118 -0
- package/dist/serena/agent.js +675 -0
- package/dist/serena/agno.d.ts +111 -0
- package/dist/serena/agno.js +278 -0
- package/dist/serena/analytics.d.ts +24 -0
- package/dist/serena/analytics.js +119 -0
- package/dist/serena/cli.d.ts +9 -0
- package/dist/serena/cli.js +731 -0
- package/dist/serena/code_editor.d.ts +42 -0
- package/dist/serena/code_editor.js +239 -0
- package/dist/serena/config/context_mode.d.ts +41 -0
- package/dist/serena/config/context_mode.js +239 -0
- package/dist/serena/config/serena_config.d.ts +134 -0
- package/dist/serena/config/serena_config.js +718 -0
- package/dist/serena/constants.d.ts +18 -0
- package/dist/serena/constants.js +27 -0
- package/dist/serena/dashboard.d.ts +55 -0
- package/dist/serena/dashboard.js +472 -0
- package/dist/serena/generated/generated_prompt_factory.d.ts +27 -0
- package/dist/serena/generated/generated_prompt_factory.js +42 -0
- package/dist/serena/gui_log_viewer.d.ts +41 -0
- package/dist/serena/gui_log_viewer.js +436 -0
- package/dist/serena/mcp.d.ts +118 -0
- package/dist/serena/mcp.js +904 -0
- package/dist/serena/project.d.ts +62 -0
- package/dist/serena/project.js +321 -0
- package/dist/serena/prompt_factory.d.ts +20 -0
- package/dist/serena/prompt_factory.js +42 -0
- package/dist/serena/resources/config/contexts/agent.yml +8 -0
- package/dist/serena/resources/config/contexts/chatgpt.yml +28 -0
- package/dist/serena/resources/config/contexts/codex.yml +27 -0
- package/dist/serena/resources/config/contexts/context.template.yml +11 -0
- package/dist/serena/resources/config/contexts/desktop-app.yml +17 -0
- package/dist/serena/resources/config/contexts/ide-assistant.yml +26 -0
- package/dist/serena/resources/config/contexts/oaicompat-agent.yml +8 -0
- package/dist/serena/resources/config/internal_modes/jetbrains.yml +15 -0
- package/dist/serena/resources/config/modes/editing.yml +112 -0
- package/dist/serena/resources/config/modes/interactive.yml +11 -0
- package/dist/serena/resources/config/modes/mode.template.yml +7 -0
- package/dist/serena/resources/config/modes/no-onboarding.yml +8 -0
- package/dist/serena/resources/config/modes/onboarding.yml +16 -0
- package/dist/serena/resources/config/modes/one-shot.yml +15 -0
- package/dist/serena/resources/config/modes/planning.yml +15 -0
- package/dist/serena/resources/config/prompt_templates/simple_tool_outputs.yml +75 -0
- package/dist/serena/resources/config/prompt_templates/system_prompt.yml +66 -0
- package/dist/serena/resources/dashboard/dashboard.js +815 -0
- package/dist/serena/resources/dashboard/index.html +314 -0
- package/dist/serena/resources/dashboard/jquery.min.js +3 -0
- package/dist/serena/resources/dashboard/serena-icon-16.png +0 -0
- package/dist/serena/resources/dashboard/serena-icon-32.png +0 -0
- package/dist/serena/resources/dashboard/serena-icon-48.png +0 -0
- package/dist/serena/resources/dashboard/serena-logs-dark-mode.png +0 -0
- package/dist/serena/resources/dashboard/serena-logs.png +0 -0
- package/dist/serena/resources/project.template.yml +67 -0
- package/dist/serena/resources/serena_config.template.yml +85 -0
- package/dist/serena/symbol.d.ts +199 -0
- package/dist/serena/symbol.js +616 -0
- package/dist/serena/text_utils.d.ts +51 -0
- package/dist/serena/text_utils.js +267 -0
- package/dist/serena/tools/cmd_tools.d.ts +31 -0
- package/dist/serena/tools/cmd_tools.js +48 -0
- package/dist/serena/tools/config_tools.d.ts +53 -0
- package/dist/serena/tools/config_tools.js +176 -0
- package/dist/serena/tools/file_tools.d.ts +231 -0
- package/dist/serena/tools/file_tools.js +511 -0
- package/dist/serena/tools/index.d.ts +7 -0
- package/dist/serena/tools/index.js +7 -0
- package/dist/serena/tools/memory_tools.d.ts +60 -0
- package/dist/serena/tools/memory_tools.js +135 -0
- package/dist/serena/tools/symbol_tools.d.ts +165 -0
- package/dist/serena/tools/symbol_tools.js +362 -0
- package/dist/serena/tools/tools_base.d.ts +162 -0
- package/dist/serena/tools/tools_base.js +378 -0
- package/dist/serena/tools/workflow_tools.d.ts +35 -0
- package/dist/serena/tools/workflow_tools.js +161 -0
- package/dist/serena/util/class_decorators.d.ts +7 -0
- package/dist/serena/util/class_decorators.js +37 -0
- package/dist/serena/util/exception.d.ts +8 -0
- package/dist/serena/util/exception.js +53 -0
- package/dist/serena/util/file_system.d.ts +30 -0
- package/dist/serena/util/file_system.js +352 -0
- package/dist/serena/util/general.d.ts +11 -0
- package/dist/serena/util/general.js +42 -0
- package/dist/serena/util/git.d.ts +11 -0
- package/dist/serena/util/git.js +37 -0
- package/dist/serena/util/inspection.d.ts +45 -0
- package/dist/serena/util/inspection.js +221 -0
- package/dist/serena/util/logging.d.ts +46 -0
- package/dist/serena/util/logging.js +205 -0
- package/dist/serena/util/shell.d.ts +21 -0
- package/dist/serena/util/shell.js +95 -0
- package/dist/serena/util/thread.d.ts +23 -0
- package/dist/serena/util/thread.js +88 -0
- package/dist/serena/version.d.ts +1 -0
- package/dist/serena/version.js +23 -0
- package/dist/solidlsp/language_servers/autoload.d.ts +23 -0
- package/dist/solidlsp/language_servers/autoload.js +25 -0
- package/dist/solidlsp/language_servers/bash_language_server.d.ts +10 -0
- package/dist/solidlsp/language_servers/bash_language_server.js +64 -0
- package/dist/solidlsp/language_servers/clangd_language_server.d.ts +13 -0
- package/dist/solidlsp/language_servers/clangd_language_server.js +110 -0
- package/dist/solidlsp/language_servers/clojure_lsp.d.ts +13 -0
- package/dist/solidlsp/language_servers/clojure_lsp.js +137 -0
- package/dist/solidlsp/language_servers/common.d.ts +41 -0
- package/dist/solidlsp/language_servers/common.js +365 -0
- package/dist/solidlsp/language_servers/csharp_language_server.d.ts +21 -0
- package/dist/solidlsp/language_servers/csharp_language_server.js +694 -0
- package/dist/solidlsp/language_servers/dart_language_server.d.ts +10 -0
- package/dist/solidlsp/language_servers/dart_language_server.js +122 -0
- package/dist/solidlsp/language_servers/eclipse_jdtls.d.ts +24 -0
- package/dist/solidlsp/language_servers/eclipse_jdtls.js +671 -0
- package/dist/solidlsp/language_servers/erlang_language_server.d.ts +22 -0
- package/dist/solidlsp/language_servers/erlang_language_server.js +327 -0
- package/dist/solidlsp/language_servers/gopls.d.ts +12 -0
- package/dist/solidlsp/language_servers/gopls.js +59 -0
- package/dist/solidlsp/language_servers/intelephense.d.ts +13 -0
- package/dist/solidlsp/language_servers/intelephense.js +121 -0
- package/dist/solidlsp/language_servers/jedi_server.d.ts +18 -0
- package/dist/solidlsp/language_servers/jedi_server.js +234 -0
- package/dist/solidlsp/language_servers/kotlin_language_server.d.ts +19 -0
- package/dist/solidlsp/language_servers/kotlin_language_server.js +474 -0
- package/dist/solidlsp/language_servers/lua_ls.d.ts +18 -0
- package/dist/solidlsp/language_servers/lua_ls.js +319 -0
- package/dist/solidlsp/language_servers/nixd_language_server.d.ts +17 -0
- package/dist/solidlsp/language_servers/nixd_language_server.js +341 -0
- package/dist/solidlsp/language_servers/pyright_server.d.ts +19 -0
- package/dist/solidlsp/language_servers/pyright_server.js +180 -0
- package/dist/solidlsp/language_servers/r_language_server.d.ts +19 -0
- package/dist/solidlsp/language_servers/r_language_server.js +184 -0
- package/dist/solidlsp/language_servers/ruby_common.d.ts +10 -0
- package/dist/solidlsp/language_servers/ruby_common.js +136 -0
- package/dist/solidlsp/language_servers/ruby_lsp.d.ts +18 -0
- package/dist/solidlsp/language_servers/ruby_lsp.js +230 -0
- package/dist/solidlsp/language_servers/rust_analyzer.d.ts +13 -0
- package/dist/solidlsp/language_servers/rust_analyzer.js +96 -0
- package/dist/solidlsp/language_servers/solargraph.d.ts +18 -0
- package/dist/solidlsp/language_servers/solargraph.js +208 -0
- package/dist/solidlsp/language_servers/sourcekit_lsp.d.ts +24 -0
- package/dist/solidlsp/language_servers/sourcekit_lsp.js +449 -0
- package/dist/solidlsp/language_servers/terraform_ls.d.ts +13 -0
- package/dist/solidlsp/language_servers/terraform_ls.js +139 -0
- package/dist/solidlsp/language_servers/typescript_language_server.d.ts +20 -0
- package/dist/solidlsp/language_servers/typescript_language_server.js +237 -0
- package/dist/solidlsp/language_servers/vts_language_server.d.ts +13 -0
- package/dist/solidlsp/language_servers/vts_language_server.js +121 -0
- package/dist/solidlsp/language_servers/zls.d.ts +20 -0
- package/dist/solidlsp/language_servers/zls.js +254 -0
- package/dist/solidlsp/ls.d.ts +197 -0
- package/dist/solidlsp/ls.js +507 -0
- package/dist/solidlsp/ls_config.d.ts +43 -0
- package/dist/solidlsp/ls_config.js +157 -0
- package/dist/solidlsp/ls_exceptions.d.ts +5 -0
- package/dist/solidlsp/ls_exceptions.js +14 -0
- package/dist/solidlsp/ls_handler.d.ts +54 -0
- package/dist/solidlsp/ls_handler.js +406 -0
- package/dist/solidlsp/ls_request.d.ts +31 -0
- package/dist/solidlsp/ls_request.js +42 -0
- package/dist/solidlsp/ls_types.d.ts +7 -0
- package/dist/solidlsp/ls_types.js +8 -0
- package/dist/solidlsp/lsp_protocol_handler/server.d.ts +61 -0
- package/dist/solidlsp/lsp_protocol_handler/server.js +68 -0
- package/dist/solidlsp/util/subprocess_util.d.ts +6 -0
- package/dist/solidlsp/util/subprocess_util.js +11 -0
- package/dist/solidlsp/util/zip.d.ts +25 -0
- package/dist/solidlsp/util/zip.js +188 -0
- package/package.json +65 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { execFile, spawn } from 'node:child_process';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import process from 'node:process';
|
|
5
|
+
import { ensureDefaultSubprocessOptions } from '../../solidlsp/util/subprocess_util.js';
|
|
6
|
+
export async function executeShellCommand(command, { cwd, captureStderr = false, env } = {}) {
|
|
7
|
+
const resolvedCwd = cwd ? path.resolve(cwd) : process.cwd();
|
|
8
|
+
const mergedEnv = env ? { ...process.env, ...env } : process.env;
|
|
9
|
+
return new Promise((resolve, reject) => {
|
|
10
|
+
const spawnOptions = ensureDefaultSubprocessOptions({
|
|
11
|
+
shell: true,
|
|
12
|
+
cwd: resolvedCwd,
|
|
13
|
+
env: mergedEnv,
|
|
14
|
+
stdio: ['ignore', 'pipe', captureStderr ? 'pipe' : 'inherit']
|
|
15
|
+
});
|
|
16
|
+
const child = spawn(command, spawnOptions);
|
|
17
|
+
let stdout = '';
|
|
18
|
+
let stderr = '';
|
|
19
|
+
if (child.stdout) {
|
|
20
|
+
child.stdout.setEncoding('utf8');
|
|
21
|
+
child.stdout.on('data', (chunk) => {
|
|
22
|
+
stdout += chunk;
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
if (captureStderr && child.stderr) {
|
|
26
|
+
child.stderr.setEncoding('utf8');
|
|
27
|
+
child.stderr.on('data', (chunk) => {
|
|
28
|
+
stderr += chunk;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
child.once('error', reject);
|
|
32
|
+
child.once('close', (code, signal) => {
|
|
33
|
+
const returnCode = typeof code === 'number'
|
|
34
|
+
? code
|
|
35
|
+
: resolveSignalExitCode(signal);
|
|
36
|
+
resolve({
|
|
37
|
+
stdout,
|
|
38
|
+
stderr: captureStderr ? stderr : undefined,
|
|
39
|
+
returnCode,
|
|
40
|
+
cwd: resolvedCwd,
|
|
41
|
+
signal: signal ?? undefined
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
export async function subprocessCheckOutput(args, { encoding = 'utf8', strip = true, timeoutMs, cwd, env } = {}) {
|
|
47
|
+
if (args.length === 0) {
|
|
48
|
+
throw new Error('subprocessCheckOutput requires at least one argument');
|
|
49
|
+
}
|
|
50
|
+
const [command, ...commandArgs] = args;
|
|
51
|
+
const resolvedCwd = cwd ? path.resolve(cwd) : undefined;
|
|
52
|
+
/*
|
|
53
|
+
* encoding option is validated by the SubprocessCheckOutputOptions schema above. The Node.js type
|
|
54
|
+
* signatures expose these helper utilities with loose `any` assignments, so we locally suppress
|
|
55
|
+
* the unsafe-assignment diagnostics while building the exec options object.
|
|
56
|
+
*/
|
|
57
|
+
const execOptions = ensureDefaultSubprocessOptions({
|
|
58
|
+
encoding
|
|
59
|
+
});
|
|
60
|
+
if (resolvedCwd) {
|
|
61
|
+
execOptions.cwd = resolvedCwd;
|
|
62
|
+
}
|
|
63
|
+
if (env) {
|
|
64
|
+
execOptions.env = { ...process.env, ...env };
|
|
65
|
+
}
|
|
66
|
+
if (typeof timeoutMs === 'number') {
|
|
67
|
+
execOptions.timeout = timeoutMs;
|
|
68
|
+
}
|
|
69
|
+
const { stdout } = await execFilePromise(command, commandArgs, execOptions);
|
|
70
|
+
return strip ? stdout.trim() : stdout;
|
|
71
|
+
}
|
|
72
|
+
function resolveSignalExitCode(signal) {
|
|
73
|
+
if (!signal) {
|
|
74
|
+
return 0;
|
|
75
|
+
}
|
|
76
|
+
const signalNumber = os.constants.signals[signal];
|
|
77
|
+
if (typeof signalNumber === 'number') {
|
|
78
|
+
return -signalNumber;
|
|
79
|
+
}
|
|
80
|
+
return 0;
|
|
81
|
+
}
|
|
82
|
+
function execFilePromise(command, args, options) {
|
|
83
|
+
return new Promise((resolve, reject) => {
|
|
84
|
+
execFile(command, args, options, (error, stdout, stderr) => {
|
|
85
|
+
if (error) {
|
|
86
|
+
const wrappedError = error instanceof Error
|
|
87
|
+
? error
|
|
88
|
+
: new Error('Subprocess execution failed');
|
|
89
|
+
reject(wrappedError);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
resolve({ stdout, stderr });
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare class TimeoutException extends Error {
|
|
2
|
+
readonly timeoutSeconds: number;
|
|
3
|
+
constructor(message: string, timeoutSeconds: number);
|
|
4
|
+
}
|
|
5
|
+
export declare enum ExecutionStatus {
|
|
6
|
+
Success = "success",
|
|
7
|
+
Timeout = "timeout",
|
|
8
|
+
Exception = "error"
|
|
9
|
+
}
|
|
10
|
+
export declare class ExecutionResult<T> {
|
|
11
|
+
resultValue: T | undefined;
|
|
12
|
+
status: ExecutionStatus | undefined;
|
|
13
|
+
exception: Error | undefined;
|
|
14
|
+
setResultValue(value: T): void;
|
|
15
|
+
setTimedOut(exception: TimeoutException): void;
|
|
16
|
+
setException(exception: Error): void;
|
|
17
|
+
toString(): string;
|
|
18
|
+
}
|
|
19
|
+
export interface ExecuteWithTimeoutOptions {
|
|
20
|
+
timeoutSeconds: number;
|
|
21
|
+
functionName: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function executeWithTimeout<T>(func: () => T | Promise<T>, { timeoutSeconds, functionName }: ExecuteWithTimeoutOptions): Promise<ExecutionResult<T>>;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
export class TimeoutException extends Error {
|
|
2
|
+
timeoutSeconds;
|
|
3
|
+
constructor(message, timeoutSeconds) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = 'TimeoutException';
|
|
6
|
+
this.timeoutSeconds = timeoutSeconds;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export var ExecutionStatus;
|
|
10
|
+
(function (ExecutionStatus) {
|
|
11
|
+
ExecutionStatus["Success"] = "success";
|
|
12
|
+
ExecutionStatus["Timeout"] = "timeout";
|
|
13
|
+
ExecutionStatus["Exception"] = "error";
|
|
14
|
+
})(ExecutionStatus || (ExecutionStatus = {}));
|
|
15
|
+
export class ExecutionResult {
|
|
16
|
+
resultValue;
|
|
17
|
+
status;
|
|
18
|
+
exception;
|
|
19
|
+
setResultValue(value) {
|
|
20
|
+
this.resultValue = value;
|
|
21
|
+
this.status = ExecutionStatus.Success;
|
|
22
|
+
}
|
|
23
|
+
setTimedOut(exception) {
|
|
24
|
+
this.exception = exception;
|
|
25
|
+
this.status = ExecutionStatus.Timeout;
|
|
26
|
+
}
|
|
27
|
+
setException(exception) {
|
|
28
|
+
this.exception = exception;
|
|
29
|
+
this.status = ExecutionStatus.Exception;
|
|
30
|
+
}
|
|
31
|
+
toString() {
|
|
32
|
+
const parts = [
|
|
33
|
+
`status=${this.status ?? 'unknown'}`,
|
|
34
|
+
`result=${this.resultValue !== undefined ? 'set' : 'unset'}`,
|
|
35
|
+
`exception=${this.exception ? this.exception.message : 'none'}`
|
|
36
|
+
];
|
|
37
|
+
return `ExecutionResult(${parts.join(', ')})`;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export async function executeWithTimeout(func, { timeoutSeconds, functionName }) {
|
|
41
|
+
const executionResult = new ExecutionResult();
|
|
42
|
+
const timeout = Math.max(0, timeoutSeconds);
|
|
43
|
+
const timeoutException = new TimeoutException(`Execution of '${functionName}' timed out after ${timeout} seconds.`, timeout);
|
|
44
|
+
let timeoutHandle;
|
|
45
|
+
let didTimeout = false;
|
|
46
|
+
const timeoutPromise = (async () => {
|
|
47
|
+
await new Promise((resolve) => {
|
|
48
|
+
timeoutHandle = setNodeTimeout(resolve, timeout * 1000);
|
|
49
|
+
timeoutHandle.unref?.();
|
|
50
|
+
});
|
|
51
|
+
didTimeout = true;
|
|
52
|
+
throw timeoutException;
|
|
53
|
+
})();
|
|
54
|
+
let operationPromise;
|
|
55
|
+
try {
|
|
56
|
+
operationPromise = Promise.resolve(func());
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
operationPromise = Promise.reject(normalizeToError(error));
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const value = await Promise.race([operationPromise, timeoutPromise]);
|
|
63
|
+
if (!didTimeout) {
|
|
64
|
+
executionResult.setResultValue(value);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
if (error === timeoutException) {
|
|
69
|
+
executionResult.setTimedOut(timeoutException);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
executionResult.setException(normalizeToError(error));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
if (timeoutHandle) {
|
|
77
|
+
clearNodeTimeout(timeoutHandle);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return executionResult;
|
|
81
|
+
}
|
|
82
|
+
function normalizeToError(value) {
|
|
83
|
+
if (value instanceof Error) {
|
|
84
|
+
return value;
|
|
85
|
+
}
|
|
86
|
+
return new Error(String(value));
|
|
87
|
+
}
|
|
88
|
+
import { clearTimeout as clearNodeTimeout, setTimeout as setNodeTimeout } from 'node:timers';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function serenaVersion(): string;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { createSerenaLogger } from './util/logging.js';
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
const { version: packageVersion } = require('../../package.json');
|
|
6
|
+
const { logger } = createSerenaLogger({ name: 'serena.version', emitToConsole: false, level: 'info' });
|
|
7
|
+
export function serenaVersion() {
|
|
8
|
+
let version = packageVersion ?? '0.0.0';
|
|
9
|
+
try {
|
|
10
|
+
const commit = execFileSync('git', ['rev-parse', 'HEAD'], { encoding: 'utf-8' }).trim();
|
|
11
|
+
if (commit.length > 0) {
|
|
12
|
+
version += `-${commit.slice(0, 8)}`;
|
|
13
|
+
}
|
|
14
|
+
const status = execFileSync('git', ['status', '--porcelain'], { encoding: 'utf-8' }).trim();
|
|
15
|
+
if (status.length > 0) {
|
|
16
|
+
version += '-dirty';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
logger.debug('Failed to read git metadata for version string', error);
|
|
21
|
+
}
|
|
22
|
+
return version;
|
|
23
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import './bash_language_server.js';
|
|
2
|
+
import './csharp_language_server.js';
|
|
3
|
+
import './clangd_language_server.js';
|
|
4
|
+
import './clojure_lsp.js';
|
|
5
|
+
import './eclipse_jdtls.js';
|
|
6
|
+
import './erlang_language_server.js';
|
|
7
|
+
import './intelephense.js';
|
|
8
|
+
import './kotlin_language_server.js';
|
|
9
|
+
import './dart_language_server.js';
|
|
10
|
+
import './gopls.js';
|
|
11
|
+
import './terraform_ls.js';
|
|
12
|
+
import './pyright_server.js';
|
|
13
|
+
import './jedi_server.js';
|
|
14
|
+
import './rust_analyzer.js';
|
|
15
|
+
import './typescript_language_server.js';
|
|
16
|
+
import './vts_language_server.js';
|
|
17
|
+
import './lua_ls.js';
|
|
18
|
+
import './r_language_server.js';
|
|
19
|
+
import './ruby_lsp.js';
|
|
20
|
+
import './solargraph.js';
|
|
21
|
+
import './sourcekit_lsp.js';
|
|
22
|
+
import './nixd_language_server.js';
|
|
23
|
+
import './zls.js';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Autoload registry for SolidLSP language servers implemented in TypeScript.
|
|
2
|
+
// Import modules here to ensure they register themselves at runtime.
|
|
3
|
+
import './bash_language_server.js';
|
|
4
|
+
import './csharp_language_server.js';
|
|
5
|
+
import './clangd_language_server.js';
|
|
6
|
+
import './clojure_lsp.js';
|
|
7
|
+
import './eclipse_jdtls.js';
|
|
8
|
+
import './erlang_language_server.js';
|
|
9
|
+
import './intelephense.js';
|
|
10
|
+
import './kotlin_language_server.js';
|
|
11
|
+
import './dart_language_server.js';
|
|
12
|
+
import './gopls.js';
|
|
13
|
+
import './terraform_ls.js';
|
|
14
|
+
import './pyright_server.js';
|
|
15
|
+
import './jedi_server.js';
|
|
16
|
+
import './rust_analyzer.js';
|
|
17
|
+
import './typescript_language_server.js';
|
|
18
|
+
import './vts_language_server.js';
|
|
19
|
+
import './lua_ls.js';
|
|
20
|
+
import './r_language_server.js';
|
|
21
|
+
import './ruby_lsp.js';
|
|
22
|
+
import './solargraph.js';
|
|
23
|
+
import './sourcekit_lsp.js';
|
|
24
|
+
import './nixd_language_server.js';
|
|
25
|
+
import './zls.js';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type LogLevel } from '../../serena/util/logging.js';
|
|
2
|
+
import { SolidLanguageServer, type LanguageServerConfigLike, type SolidLspSettingsInit } from '../ls.js';
|
|
3
|
+
export declare class BashLanguageServer extends SolidLanguageServer {
|
|
4
|
+
constructor(config: LanguageServerConfigLike, loggerLike: {
|
|
5
|
+
level?: number | LogLevel;
|
|
6
|
+
} | null, repositoryRootPath: string, options?: {
|
|
7
|
+
timeout?: number | null;
|
|
8
|
+
solidlspSettings?: SolidLspSettingsInit;
|
|
9
|
+
});
|
|
10
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { createSerenaLogger } from '../../serena/util/logging.js';
|
|
4
|
+
import { Language } from '../ls_config.js';
|
|
5
|
+
import { SolidLanguageServer, SolidLspSettings, registerLanguageServer } from '../ls.js';
|
|
6
|
+
import { NodeLanguageServerHandler } from '../ls_handler.js';
|
|
7
|
+
import { Platform, RuntimeDependencyCollection, quoteWindowsPath } from './common.js';
|
|
8
|
+
function resolveRuntimeDirectory(settings) {
|
|
9
|
+
return path.join(settings.languageServersStaticDir, 'BashLanguageServer');
|
|
10
|
+
}
|
|
11
|
+
function ensureDependencies(settings) {
|
|
12
|
+
const runtimeDir = resolveRuntimeDirectory(settings);
|
|
13
|
+
if (process.env.SERENA_SKIP_RUNTIME_INSTALL === '1') {
|
|
14
|
+
return runtimeDir;
|
|
15
|
+
}
|
|
16
|
+
const dependencies = new RuntimeDependencyCollection([
|
|
17
|
+
{
|
|
18
|
+
id: 'bash-language-server',
|
|
19
|
+
description: 'bash-language-server npm package',
|
|
20
|
+
command: ['npm', 'install', '--prefix', './', 'bash-language-server@5.6.0'],
|
|
21
|
+
platformId: 'any'
|
|
22
|
+
}
|
|
23
|
+
]);
|
|
24
|
+
const { logger } = createSerenaLogger({
|
|
25
|
+
emitToConsole: false,
|
|
26
|
+
name: 'solidlsp.language_servers.bash'
|
|
27
|
+
});
|
|
28
|
+
try {
|
|
29
|
+
dependencies.install(logger, runtimeDir);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
logger.warn(`npm install for bash-language-server failed (${String(error)}). Falling back to system binary if available.`);
|
|
33
|
+
}
|
|
34
|
+
return runtimeDir;
|
|
35
|
+
}
|
|
36
|
+
function determineCommand(settings) {
|
|
37
|
+
const runtimeDir = ensureDependencies(settings);
|
|
38
|
+
const binName = Platform.isWindows() ? 'bash-language-server.cmd' : 'bash-language-server';
|
|
39
|
+
const localBinary = path.join(runtimeDir, 'node_modules', '.bin', binName);
|
|
40
|
+
if (fs.existsSync(localBinary)) {
|
|
41
|
+
return {
|
|
42
|
+
cmd: `${quoteWindowsPath(localBinary)} start`
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
cmd: 'bash-language-server start'
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export class BashLanguageServer extends SolidLanguageServer {
|
|
50
|
+
constructor(config, loggerLike, repositoryRootPath, options = {}) {
|
|
51
|
+
const solidSettings = new SolidLspSettings(options?.solidlspSettings);
|
|
52
|
+
const launchInfo = determineCommand(solidSettings);
|
|
53
|
+
const handler = new NodeLanguageServerHandler({
|
|
54
|
+
...launchInfo,
|
|
55
|
+
cwd: repositoryRootPath
|
|
56
|
+
});
|
|
57
|
+
super(config, loggerLike, repositoryRootPath, {
|
|
58
|
+
...options,
|
|
59
|
+
solidlspSettings: options?.solidlspSettings,
|
|
60
|
+
handler
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
registerLanguageServer(Language.BASH, BashLanguageServer);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type LogLevel } from '../../serena/util/logging.js';
|
|
2
|
+
import { SolidLanguageServer, type LanguageServerConfigLike, type SolidLspSettingsInit } from '../ls.js';
|
|
3
|
+
import { NodeLanguageServerHandler } from '../ls_handler.js';
|
|
4
|
+
export declare class ClangdLanguageServer extends SolidLanguageServer {
|
|
5
|
+
protected readonly handler: NodeLanguageServerHandler;
|
|
6
|
+
constructor(config: LanguageServerConfigLike, loggerLike: {
|
|
7
|
+
level?: number | LogLevel;
|
|
8
|
+
} | null, repositoryRootPath: string, options?: {
|
|
9
|
+
timeout?: number | null;
|
|
10
|
+
solidlspSettings?: SolidLspSettingsInit;
|
|
11
|
+
});
|
|
12
|
+
private registerDefaultHandlers;
|
|
13
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { createSerenaLogger } from '../../serena/util/logging.js';
|
|
4
|
+
import { Language } from '../ls_config.js';
|
|
5
|
+
import { SolidLanguageServer, SolidLspSettings, registerLanguageServer, coerceLogLevel } from '../ls.js';
|
|
6
|
+
import { NodeLanguageServerHandler } from '../ls_handler.js';
|
|
7
|
+
import { RuntimeDependencyCollection, quoteWindowsPath } from './common.js';
|
|
8
|
+
const CLANGD_DEPENDENCIES = [
|
|
9
|
+
{
|
|
10
|
+
id: 'clangd',
|
|
11
|
+
description: 'Clangd for Linux (x64)',
|
|
12
|
+
url: 'https://github.com/clangd/clangd/releases/download/19.1.2/clangd-linux-19.1.2.zip',
|
|
13
|
+
platformId: 'linux-x64',
|
|
14
|
+
archiveType: 'zip',
|
|
15
|
+
binaryName: 'clangd_19.1.2/bin/clangd'
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
id: 'clangd',
|
|
19
|
+
description: 'Clangd for Windows (x64)',
|
|
20
|
+
url: 'https://github.com/clangd/clangd/releases/download/19.1.2/clangd-windows-19.1.2.zip',
|
|
21
|
+
platformId: 'win-x64',
|
|
22
|
+
archiveType: 'zip',
|
|
23
|
+
binaryName: 'clangd_19.1.2/bin/clangd.exe'
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
id: 'clangd',
|
|
27
|
+
description: 'Clangd for macOS (x64)',
|
|
28
|
+
url: 'https://github.com/clangd/clangd/releases/download/19.1.2/clangd-mac-19.1.2.zip',
|
|
29
|
+
platformId: 'osx-x64',
|
|
30
|
+
archiveType: 'zip',
|
|
31
|
+
binaryName: 'clangd_19.1.2/bin/clangd'
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
id: 'clangd',
|
|
35
|
+
description: 'Clangd for macOS (arm64)',
|
|
36
|
+
url: 'https://github.com/clangd/clangd/releases/download/19.1.2/clangd-mac-19.1.2.zip',
|
|
37
|
+
platformId: 'osx-arm64',
|
|
38
|
+
archiveType: 'zip',
|
|
39
|
+
binaryName: 'clangd_19.1.2/bin/clangd'
|
|
40
|
+
}
|
|
41
|
+
];
|
|
42
|
+
function resolveRuntimeDirectory(settings) {
|
|
43
|
+
const dir = path.join(settings.languageServersStaticDir, 'clangd');
|
|
44
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
45
|
+
return dir;
|
|
46
|
+
}
|
|
47
|
+
function ensureClangdBinary(runtimeDir, dependencies, loggerLevel) {
|
|
48
|
+
const { logger } = createSerenaLogger({
|
|
49
|
+
name: 'solidlsp.language_servers.clangd',
|
|
50
|
+
emitToConsole: false,
|
|
51
|
+
level: loggerLevel === undefined ? undefined : coerceLogLevel(loggerLevel)
|
|
52
|
+
});
|
|
53
|
+
const binaryPath = dependencies.binaryPath(runtimeDir);
|
|
54
|
+
if (!fs.existsSync(binaryPath)) {
|
|
55
|
+
if (process.env.SERENA_SKIP_RUNTIME_INSTALL === '1') {
|
|
56
|
+
throw new Error(`clangd executable not found at ${binaryPath}. Set SERENA_SKIP_RUNTIME_INSTALL=0 to allow downloads.`);
|
|
57
|
+
}
|
|
58
|
+
const dep = dependencies.getSingleDepForCurrentPlatform();
|
|
59
|
+
logger.info(`Downloading clangd runtime dependency from ${dep.url}`);
|
|
60
|
+
dependencies.install(logger, runtimeDir);
|
|
61
|
+
if (!fs.existsSync(binaryPath)) {
|
|
62
|
+
throw new Error(`clangd executable not found after installation (expected at ${binaryPath}). Please install clangd manually from https://clangd.llvm.org/installation.`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (process.platform !== 'win32') {
|
|
66
|
+
try {
|
|
67
|
+
fs.chmodSync(binaryPath, 0o755);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// ignore chmod failures
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return binaryPath;
|
|
74
|
+
}
|
|
75
|
+
export class ClangdLanguageServer extends SolidLanguageServer {
|
|
76
|
+
handler;
|
|
77
|
+
constructor(config, loggerLike, repositoryRootPath, options = {}) {
|
|
78
|
+
const solidSettings = new SolidLspSettings(options?.solidlspSettings);
|
|
79
|
+
const runtimeDir = resolveRuntimeDirectory(solidSettings);
|
|
80
|
+
const dependencies = new RuntimeDependencyCollection(CLANGD_DEPENDENCIES);
|
|
81
|
+
const binaryPath = ensureClangdBinary(runtimeDir, dependencies, loggerLike?.level);
|
|
82
|
+
const handler = new NodeLanguageServerHandler({
|
|
83
|
+
cmd: quoteWindowsPath(binaryPath),
|
|
84
|
+
cwd: repositoryRootPath
|
|
85
|
+
});
|
|
86
|
+
super(config, loggerLike, repositoryRootPath, {
|
|
87
|
+
...options,
|
|
88
|
+
handler,
|
|
89
|
+
solidlspSettings: options?.solidlspSettings
|
|
90
|
+
});
|
|
91
|
+
this.handler = handler;
|
|
92
|
+
this.registerDefaultHandlers();
|
|
93
|
+
}
|
|
94
|
+
registerDefaultHandlers() {
|
|
95
|
+
const noop = () => undefined;
|
|
96
|
+
this.handler.onNotification('$/progress', noop);
|
|
97
|
+
this.handler.onNotification('textDocument/publishDiagnostics', noop);
|
|
98
|
+
this.handler.onNotification('language/actionableNotification', noop);
|
|
99
|
+
this.handler.onNotification('experimental/serverStatus', noop);
|
|
100
|
+
this.handler.onNotification('window/logMessage', (payload) => {
|
|
101
|
+
const message = typeof payload === 'object' && payload !== null ? payload.message : null;
|
|
102
|
+
if (typeof message === 'string' && message.trim().length > 0) {
|
|
103
|
+
this.logger.info(`clangd: ${message}`);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
this.handler.onRequest('client/registerCapability', noop);
|
|
107
|
+
this.handler.onRequest('workspace/executeClientCommand', () => []);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
registerLanguageServer(Language.CPP, ClangdLanguageServer);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type LogLevel } from '../../serena/util/logging.js';
|
|
2
|
+
import { SolidLanguageServer, type LanguageServerConfigLike, type SolidLspSettingsInit } from '../ls.js';
|
|
3
|
+
import { NodeLanguageServerHandler } from '../ls_handler.js';
|
|
4
|
+
export declare class ClojureLanguageServer extends SolidLanguageServer {
|
|
5
|
+
protected readonly handler: NodeLanguageServerHandler;
|
|
6
|
+
constructor(config: LanguageServerConfigLike, loggerLike: {
|
|
7
|
+
level?: number | LogLevel;
|
|
8
|
+
} | null, repositoryRootPath: string, options?: {
|
|
9
|
+
timeout?: number | null;
|
|
10
|
+
solidlspSettings?: SolidLspSettingsInit;
|
|
11
|
+
});
|
|
12
|
+
private registerHandlers;
|
|
13
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { createSerenaLogger } from '../../serena/util/logging.js';
|
|
5
|
+
import { Language } from '../ls_config.js';
|
|
6
|
+
import { ensureDefaultSubprocessOptions } from '../util/subprocess_util.js';
|
|
7
|
+
import { SolidLanguageServer, SolidLspSettings, registerLanguageServer, coerceLogLevel } from '../ls.js';
|
|
8
|
+
import { NodeLanguageServerHandler } from '../ls_handler.js';
|
|
9
|
+
import { RuntimeDependencyCollection, quoteWindowsPath } from './common.js';
|
|
10
|
+
const CLOJURE_LSP_RELEASES = 'https://github.com/clojure-lsp/clojure-lsp/releases/latest/download';
|
|
11
|
+
const CLOJURE_DEPENDENCIES = [
|
|
12
|
+
{
|
|
13
|
+
id: 'clojure-lsp',
|
|
14
|
+
url: `${CLOJURE_LSP_RELEASES}/clojure-lsp-native-macos-aarch64.zip`,
|
|
15
|
+
platformId: 'osx-arm64',
|
|
16
|
+
archiveType: 'zip',
|
|
17
|
+
binaryName: 'clojure-lsp'
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
id: 'clojure-lsp',
|
|
21
|
+
url: `${CLOJURE_LSP_RELEASES}/clojure-lsp-native-macos-amd64.zip`,
|
|
22
|
+
platformId: 'osx-x64',
|
|
23
|
+
archiveType: 'zip',
|
|
24
|
+
binaryName: 'clojure-lsp'
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
id: 'clojure-lsp',
|
|
28
|
+
url: `${CLOJURE_LSP_RELEASES}/clojure-lsp-native-linux-aarch64.zip`,
|
|
29
|
+
platformId: 'linux-arm64',
|
|
30
|
+
archiveType: 'zip',
|
|
31
|
+
binaryName: 'clojure-lsp'
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
id: 'clojure-lsp',
|
|
35
|
+
url: `${CLOJURE_LSP_RELEASES}/clojure-lsp-native-linux-amd64.zip`,
|
|
36
|
+
platformId: 'linux-x64',
|
|
37
|
+
archiveType: 'zip',
|
|
38
|
+
binaryName: 'clojure-lsp'
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
id: 'clojure-lsp',
|
|
42
|
+
url: `${CLOJURE_LSP_RELEASES}/clojure-lsp-native-windows-amd64.zip`,
|
|
43
|
+
platformId: 'win-x64',
|
|
44
|
+
archiveType: 'zip',
|
|
45
|
+
binaryName: 'clojure-lsp.exe'
|
|
46
|
+
}
|
|
47
|
+
];
|
|
48
|
+
function verifyClojureCli() {
|
|
49
|
+
if (process.env.SERENA_ASSUME_CLOJURE === '1') {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const whichCmd = process.platform === 'win32' ? 'where' : 'which';
|
|
53
|
+
const clojureExists = spawnSync(whichCmd, ['clojure'], ensureDefaultSubprocessOptions({ stdio: 'ignore' })).status === 0;
|
|
54
|
+
if (!clojureExists) {
|
|
55
|
+
throw new Error('`clojure` CLI was not found in PATH. Please install the official Clojure CLI from https://clojure.org/guides/getting_started');
|
|
56
|
+
}
|
|
57
|
+
const helpResult = spawnSync('clojure', ['--help'], ensureDefaultSubprocessOptions({ encoding: 'utf-8' }));
|
|
58
|
+
if (helpResult.status !== 0 || !helpResult.stdout.includes('-Aaliases')) {
|
|
59
|
+
throw new Error('Detected a `clojure` executable, but it does not appear to be the official CLI (missing -Aaliases support).');
|
|
60
|
+
}
|
|
61
|
+
const spathResult = spawnSync('clojure', ['-Spath'], ensureDefaultSubprocessOptions({}));
|
|
62
|
+
if (spathResult.status !== 0) {
|
|
63
|
+
throw new Error('`clojure -Spath` failed; ensure you are using Clojure CLI 1.10 or newer.');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function resolveRuntimeDirectory(settings) {
|
|
67
|
+
const dir = path.join(settings.languageServersStaticDir, 'clojure-lsp');
|
|
68
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
69
|
+
return dir;
|
|
70
|
+
}
|
|
71
|
+
function ensureBinary(runtimeDir, dependencies, loggerLevel) {
|
|
72
|
+
const { logger } = createSerenaLogger({
|
|
73
|
+
name: 'solidlsp.language_servers.clojure',
|
|
74
|
+
emitToConsole: false,
|
|
75
|
+
level: loggerLevel === undefined ? undefined : coerceLogLevel(loggerLevel)
|
|
76
|
+
});
|
|
77
|
+
const binaryPath = dependencies.binaryPath(runtimeDir);
|
|
78
|
+
if (!fs.existsSync(binaryPath)) {
|
|
79
|
+
if (process.env.SERENA_SKIP_RUNTIME_INSTALL === '1') {
|
|
80
|
+
throw new Error(`clojure-lsp binary not found at ${binaryPath}. Allow downloads or install clojure-lsp manually.`);
|
|
81
|
+
}
|
|
82
|
+
logger.info('Downloading clojure-lsp runtime dependency.');
|
|
83
|
+
dependencies.install(logger, runtimeDir);
|
|
84
|
+
if (!fs.existsSync(binaryPath)) {
|
|
85
|
+
throw new Error(`Failed to install clojure-lsp runtime dependency (expected binary at ${binaryPath}).`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (process.platform !== 'win32') {
|
|
89
|
+
try {
|
|
90
|
+
fs.chmodSync(binaryPath, 0o755);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// ignore
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return binaryPath;
|
|
97
|
+
}
|
|
98
|
+
export class ClojureLanguageServer extends SolidLanguageServer {
|
|
99
|
+
handler;
|
|
100
|
+
constructor(config, loggerLike, repositoryRootPath, options = {}) {
|
|
101
|
+
verifyClojureCli();
|
|
102
|
+
const solidSettings = new SolidLspSettings(options?.solidlspSettings);
|
|
103
|
+
const runtimeDir = resolveRuntimeDirectory(solidSettings);
|
|
104
|
+
const dependencies = new RuntimeDependencyCollection(CLOJURE_DEPENDENCIES);
|
|
105
|
+
const binaryPath = ensureBinary(runtimeDir, dependencies, loggerLike?.level);
|
|
106
|
+
const handler = new NodeLanguageServerHandler({
|
|
107
|
+
cmd: quoteWindowsPath(binaryPath),
|
|
108
|
+
cwd: repositoryRootPath
|
|
109
|
+
});
|
|
110
|
+
super(config, loggerLike, repositoryRootPath, {
|
|
111
|
+
...options,
|
|
112
|
+
handler,
|
|
113
|
+
solidlspSettings: options?.solidlspSettings
|
|
114
|
+
});
|
|
115
|
+
this.handler = handler;
|
|
116
|
+
this.registerHandlers();
|
|
117
|
+
}
|
|
118
|
+
registerHandlers() {
|
|
119
|
+
const noop = () => undefined;
|
|
120
|
+
this.handler.onNotification('window/logMessage', (payload) => {
|
|
121
|
+
if (payload && typeof payload === 'object' && 'message' in payload) {
|
|
122
|
+
this.logger.info(`clojure-lsp: ${payload.message ?? ''}`);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
this.handler.onNotification('$/progress', noop);
|
|
126
|
+
this.handler.onNotification('textDocument/publishDiagnostics', noop);
|
|
127
|
+
this.handler.onNotification('language/actionableNotification', noop);
|
|
128
|
+
this.handler.onNotification('experimental/serverStatus', (payload) => {
|
|
129
|
+
if (payload && typeof payload === 'object' && payload.quiescent) {
|
|
130
|
+
this.logger.debug('clojure-lsp reported quiescent=true');
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
this.handler.onRequest('client/registerCapability', noop);
|
|
134
|
+
this.handler.onRequest('workspace/executeClientCommand', () => []);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
registerLanguageServer(Language.CLOJURE, ClojureLanguageServer);
|