@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.
Files changed (186) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +244 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +7 -0
  5. package/dist/devtools/generate_prompt_factory.d.ts +5 -0
  6. package/dist/devtools/generate_prompt_factory.js +114 -0
  7. package/dist/index.d.ts +34 -0
  8. package/dist/index.js +34 -0
  9. package/dist/interprompt/index.d.ts +2 -0
  10. package/dist/interprompt/index.js +1 -0
  11. package/dist/interprompt/jinja_template.d.ts +10 -0
  12. package/dist/interprompt/jinja_template.js +174 -0
  13. package/dist/interprompt/multilang_prompt.d.ts +54 -0
  14. package/dist/interprompt/multilang_prompt.js +302 -0
  15. package/dist/interprompt/prompt_factory.d.ts +16 -0
  16. package/dist/interprompt/prompt_factory.js +189 -0
  17. package/dist/interprompt/util/class_decorators.d.ts +1 -0
  18. package/dist/interprompt/util/class_decorators.js +1 -0
  19. package/dist/interprompt/util/index.d.ts +1 -0
  20. package/dist/interprompt/util/index.js +1 -0
  21. package/dist/serena/agent.d.ts +118 -0
  22. package/dist/serena/agent.js +675 -0
  23. package/dist/serena/agno.d.ts +111 -0
  24. package/dist/serena/agno.js +278 -0
  25. package/dist/serena/analytics.d.ts +24 -0
  26. package/dist/serena/analytics.js +119 -0
  27. package/dist/serena/cli.d.ts +9 -0
  28. package/dist/serena/cli.js +731 -0
  29. package/dist/serena/code_editor.d.ts +42 -0
  30. package/dist/serena/code_editor.js +239 -0
  31. package/dist/serena/config/context_mode.d.ts +41 -0
  32. package/dist/serena/config/context_mode.js +239 -0
  33. package/dist/serena/config/serena_config.d.ts +134 -0
  34. package/dist/serena/config/serena_config.js +718 -0
  35. package/dist/serena/constants.d.ts +18 -0
  36. package/dist/serena/constants.js +27 -0
  37. package/dist/serena/dashboard.d.ts +55 -0
  38. package/dist/serena/dashboard.js +472 -0
  39. package/dist/serena/generated/generated_prompt_factory.d.ts +27 -0
  40. package/dist/serena/generated/generated_prompt_factory.js +42 -0
  41. package/dist/serena/gui_log_viewer.d.ts +41 -0
  42. package/dist/serena/gui_log_viewer.js +436 -0
  43. package/dist/serena/mcp.d.ts +118 -0
  44. package/dist/serena/mcp.js +904 -0
  45. package/dist/serena/project.d.ts +62 -0
  46. package/dist/serena/project.js +321 -0
  47. package/dist/serena/prompt_factory.d.ts +20 -0
  48. package/dist/serena/prompt_factory.js +42 -0
  49. package/dist/serena/resources/config/contexts/agent.yml +8 -0
  50. package/dist/serena/resources/config/contexts/chatgpt.yml +28 -0
  51. package/dist/serena/resources/config/contexts/codex.yml +27 -0
  52. package/dist/serena/resources/config/contexts/context.template.yml +11 -0
  53. package/dist/serena/resources/config/contexts/desktop-app.yml +17 -0
  54. package/dist/serena/resources/config/contexts/ide-assistant.yml +26 -0
  55. package/dist/serena/resources/config/contexts/oaicompat-agent.yml +8 -0
  56. package/dist/serena/resources/config/internal_modes/jetbrains.yml +15 -0
  57. package/dist/serena/resources/config/modes/editing.yml +112 -0
  58. package/dist/serena/resources/config/modes/interactive.yml +11 -0
  59. package/dist/serena/resources/config/modes/mode.template.yml +7 -0
  60. package/dist/serena/resources/config/modes/no-onboarding.yml +8 -0
  61. package/dist/serena/resources/config/modes/onboarding.yml +16 -0
  62. package/dist/serena/resources/config/modes/one-shot.yml +15 -0
  63. package/dist/serena/resources/config/modes/planning.yml +15 -0
  64. package/dist/serena/resources/config/prompt_templates/simple_tool_outputs.yml +75 -0
  65. package/dist/serena/resources/config/prompt_templates/system_prompt.yml +66 -0
  66. package/dist/serena/resources/dashboard/dashboard.js +815 -0
  67. package/dist/serena/resources/dashboard/index.html +314 -0
  68. package/dist/serena/resources/dashboard/jquery.min.js +3 -0
  69. package/dist/serena/resources/dashboard/serena-icon-16.png +0 -0
  70. package/dist/serena/resources/dashboard/serena-icon-32.png +0 -0
  71. package/dist/serena/resources/dashboard/serena-icon-48.png +0 -0
  72. package/dist/serena/resources/dashboard/serena-logs-dark-mode.png +0 -0
  73. package/dist/serena/resources/dashboard/serena-logs.png +0 -0
  74. package/dist/serena/resources/project.template.yml +67 -0
  75. package/dist/serena/resources/serena_config.template.yml +85 -0
  76. package/dist/serena/symbol.d.ts +199 -0
  77. package/dist/serena/symbol.js +616 -0
  78. package/dist/serena/text_utils.d.ts +51 -0
  79. package/dist/serena/text_utils.js +267 -0
  80. package/dist/serena/tools/cmd_tools.d.ts +31 -0
  81. package/dist/serena/tools/cmd_tools.js +48 -0
  82. package/dist/serena/tools/config_tools.d.ts +53 -0
  83. package/dist/serena/tools/config_tools.js +176 -0
  84. package/dist/serena/tools/file_tools.d.ts +231 -0
  85. package/dist/serena/tools/file_tools.js +511 -0
  86. package/dist/serena/tools/index.d.ts +7 -0
  87. package/dist/serena/tools/index.js +7 -0
  88. package/dist/serena/tools/memory_tools.d.ts +60 -0
  89. package/dist/serena/tools/memory_tools.js +135 -0
  90. package/dist/serena/tools/symbol_tools.d.ts +165 -0
  91. package/dist/serena/tools/symbol_tools.js +362 -0
  92. package/dist/serena/tools/tools_base.d.ts +162 -0
  93. package/dist/serena/tools/tools_base.js +378 -0
  94. package/dist/serena/tools/workflow_tools.d.ts +35 -0
  95. package/dist/serena/tools/workflow_tools.js +161 -0
  96. package/dist/serena/util/class_decorators.d.ts +7 -0
  97. package/dist/serena/util/class_decorators.js +37 -0
  98. package/dist/serena/util/exception.d.ts +8 -0
  99. package/dist/serena/util/exception.js +53 -0
  100. package/dist/serena/util/file_system.d.ts +30 -0
  101. package/dist/serena/util/file_system.js +352 -0
  102. package/dist/serena/util/general.d.ts +11 -0
  103. package/dist/serena/util/general.js +42 -0
  104. package/dist/serena/util/git.d.ts +11 -0
  105. package/dist/serena/util/git.js +37 -0
  106. package/dist/serena/util/inspection.d.ts +45 -0
  107. package/dist/serena/util/inspection.js +221 -0
  108. package/dist/serena/util/logging.d.ts +46 -0
  109. package/dist/serena/util/logging.js +205 -0
  110. package/dist/serena/util/shell.d.ts +21 -0
  111. package/dist/serena/util/shell.js +95 -0
  112. package/dist/serena/util/thread.d.ts +23 -0
  113. package/dist/serena/util/thread.js +88 -0
  114. package/dist/serena/version.d.ts +1 -0
  115. package/dist/serena/version.js +23 -0
  116. package/dist/solidlsp/language_servers/autoload.d.ts +23 -0
  117. package/dist/solidlsp/language_servers/autoload.js +25 -0
  118. package/dist/solidlsp/language_servers/bash_language_server.d.ts +10 -0
  119. package/dist/solidlsp/language_servers/bash_language_server.js +64 -0
  120. package/dist/solidlsp/language_servers/clangd_language_server.d.ts +13 -0
  121. package/dist/solidlsp/language_servers/clangd_language_server.js +110 -0
  122. package/dist/solidlsp/language_servers/clojure_lsp.d.ts +13 -0
  123. package/dist/solidlsp/language_servers/clojure_lsp.js +137 -0
  124. package/dist/solidlsp/language_servers/common.d.ts +41 -0
  125. package/dist/solidlsp/language_servers/common.js +365 -0
  126. package/dist/solidlsp/language_servers/csharp_language_server.d.ts +21 -0
  127. package/dist/solidlsp/language_servers/csharp_language_server.js +694 -0
  128. package/dist/solidlsp/language_servers/dart_language_server.d.ts +10 -0
  129. package/dist/solidlsp/language_servers/dart_language_server.js +122 -0
  130. package/dist/solidlsp/language_servers/eclipse_jdtls.d.ts +24 -0
  131. package/dist/solidlsp/language_servers/eclipse_jdtls.js +671 -0
  132. package/dist/solidlsp/language_servers/erlang_language_server.d.ts +22 -0
  133. package/dist/solidlsp/language_servers/erlang_language_server.js +327 -0
  134. package/dist/solidlsp/language_servers/gopls.d.ts +12 -0
  135. package/dist/solidlsp/language_servers/gopls.js +59 -0
  136. package/dist/solidlsp/language_servers/intelephense.d.ts +13 -0
  137. package/dist/solidlsp/language_servers/intelephense.js +121 -0
  138. package/dist/solidlsp/language_servers/jedi_server.d.ts +18 -0
  139. package/dist/solidlsp/language_servers/jedi_server.js +234 -0
  140. package/dist/solidlsp/language_servers/kotlin_language_server.d.ts +19 -0
  141. package/dist/solidlsp/language_servers/kotlin_language_server.js +474 -0
  142. package/dist/solidlsp/language_servers/lua_ls.d.ts +18 -0
  143. package/dist/solidlsp/language_servers/lua_ls.js +319 -0
  144. package/dist/solidlsp/language_servers/nixd_language_server.d.ts +17 -0
  145. package/dist/solidlsp/language_servers/nixd_language_server.js +341 -0
  146. package/dist/solidlsp/language_servers/pyright_server.d.ts +19 -0
  147. package/dist/solidlsp/language_servers/pyright_server.js +180 -0
  148. package/dist/solidlsp/language_servers/r_language_server.d.ts +19 -0
  149. package/dist/solidlsp/language_servers/r_language_server.js +184 -0
  150. package/dist/solidlsp/language_servers/ruby_common.d.ts +10 -0
  151. package/dist/solidlsp/language_servers/ruby_common.js +136 -0
  152. package/dist/solidlsp/language_servers/ruby_lsp.d.ts +18 -0
  153. package/dist/solidlsp/language_servers/ruby_lsp.js +230 -0
  154. package/dist/solidlsp/language_servers/rust_analyzer.d.ts +13 -0
  155. package/dist/solidlsp/language_servers/rust_analyzer.js +96 -0
  156. package/dist/solidlsp/language_servers/solargraph.d.ts +18 -0
  157. package/dist/solidlsp/language_servers/solargraph.js +208 -0
  158. package/dist/solidlsp/language_servers/sourcekit_lsp.d.ts +24 -0
  159. package/dist/solidlsp/language_servers/sourcekit_lsp.js +449 -0
  160. package/dist/solidlsp/language_servers/terraform_ls.d.ts +13 -0
  161. package/dist/solidlsp/language_servers/terraform_ls.js +139 -0
  162. package/dist/solidlsp/language_servers/typescript_language_server.d.ts +20 -0
  163. package/dist/solidlsp/language_servers/typescript_language_server.js +237 -0
  164. package/dist/solidlsp/language_servers/vts_language_server.d.ts +13 -0
  165. package/dist/solidlsp/language_servers/vts_language_server.js +121 -0
  166. package/dist/solidlsp/language_servers/zls.d.ts +20 -0
  167. package/dist/solidlsp/language_servers/zls.js +254 -0
  168. package/dist/solidlsp/ls.d.ts +197 -0
  169. package/dist/solidlsp/ls.js +507 -0
  170. package/dist/solidlsp/ls_config.d.ts +43 -0
  171. package/dist/solidlsp/ls_config.js +157 -0
  172. package/dist/solidlsp/ls_exceptions.d.ts +5 -0
  173. package/dist/solidlsp/ls_exceptions.js +14 -0
  174. package/dist/solidlsp/ls_handler.d.ts +54 -0
  175. package/dist/solidlsp/ls_handler.js +406 -0
  176. package/dist/solidlsp/ls_request.d.ts +31 -0
  177. package/dist/solidlsp/ls_request.js +42 -0
  178. package/dist/solidlsp/ls_types.d.ts +7 -0
  179. package/dist/solidlsp/ls_types.js +8 -0
  180. package/dist/solidlsp/lsp_protocol_handler/server.d.ts +61 -0
  181. package/dist/solidlsp/lsp_protocol_handler/server.js +68 -0
  182. package/dist/solidlsp/util/subprocess_util.d.ts +6 -0
  183. package/dist/solidlsp/util/subprocess_util.js +11 -0
  184. package/dist/solidlsp/util/zip.d.ts +25 -0
  185. package/dist/solidlsp/util/zip.js +188 -0
  186. package/package.json +65 -0
@@ -0,0 +1,474 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { pathToFileURL } from 'node:url';
4
+ import { createSerenaLogger } from '../../serena/util/logging.js';
5
+ import { Language } from '../ls_config.js';
6
+ import { SolidLanguageServer, SolidLspSettings, registerLanguageServer, coerceLogLevel } from '../ls.js';
7
+ import { NodeLanguageServerHandler } from '../ls_handler.js';
8
+ import { Platform, RuntimeDependencyCollection } from './common.js';
9
+ const KOTLIN_LSP_DEPENDENCY = {
10
+ id: 'kotlin-lsp',
11
+ description: 'Kotlin Language Server',
12
+ url: 'https://download-cdn.jetbrains.com/kotlin-lsp/0.253.10629/kotlin-0.253.10629.zip',
13
+ archiveType: 'zip'
14
+ };
15
+ const JAVA_DEPENDENCIES = {
16
+ 'win-x64': {
17
+ id: 'vscode-java-runtime',
18
+ description: 'VSCode Java JRE (win-x64)',
19
+ url: 'https://github.com/redhat-developer/vscode-java/releases/download/v1.42.0/java-win32-x64-1.42.0-561.vsix',
20
+ archiveType: 'zip',
21
+ javaHomePath: 'extension/jre/21.0.7-win32-x86_64',
22
+ javaBinaryPath: 'extension/jre/21.0.7-win32-x86_64/bin/java.exe'
23
+ },
24
+ 'linux-x64': {
25
+ id: 'vscode-java-runtime',
26
+ description: 'VSCode Java JRE (linux-x64)',
27
+ url: 'https://github.com/redhat-developer/vscode-java/releases/download/v1.42.0/java-linux-x64-1.42.0-561.vsix',
28
+ archiveType: 'zip',
29
+ javaHomePath: 'extension/jre/21.0.7-linux-x86_64',
30
+ javaBinaryPath: 'extension/jre/21.0.7-linux-x86_64/bin/java'
31
+ },
32
+ 'linux-arm64': {
33
+ id: 'vscode-java-runtime',
34
+ description: 'VSCode Java JRE (linux-arm64)',
35
+ url: 'https://github.com/redhat-developer/vscode-java/releases/download/v1.42.0/java-linux-arm64-1.42.0-561.vsix',
36
+ archiveType: 'zip',
37
+ javaHomePath: 'extension/jre/21.0.7-linux-aarch64',
38
+ javaBinaryPath: 'extension/jre/21.0.7-linux-aarch64/bin/java'
39
+ },
40
+ 'osx-x64': {
41
+ id: 'vscode-java-runtime',
42
+ description: 'VSCode Java JRE (macOS x64)',
43
+ url: 'https://github.com/redhat-developer/vscode-java/releases/download/v1.42.0/java-darwin-x64-1.42.0-561.vsix',
44
+ archiveType: 'zip',
45
+ javaHomePath: 'extension/jre/21.0.7-macosx-x86_64',
46
+ javaBinaryPath: 'extension/jre/21.0.7-macosx-x86_64/bin/java'
47
+ },
48
+ 'osx-arm64': {
49
+ id: 'vscode-java-runtime',
50
+ description: 'VSCode Java JRE (macOS arm64)',
51
+ url: 'https://github.com/redhat-developer/vscode-java/releases/download/v1.42.0/java-darwin-arm64-1.42.0-561.vsix',
52
+ archiveType: 'zip',
53
+ javaHomePath: 'extension/jre/21.0.7-macosx-aarch64',
54
+ javaBinaryPath: 'extension/jre/21.0.7-macosx-aarch64/bin/java'
55
+ }
56
+ };
57
+ const JAVA_DEPENDENCY_FALLBACKS = {
58
+ 'win-arm64': 'win-x64',
59
+ 'win-x86': 'win-x64',
60
+ osx: 'osx-x64',
61
+ 'linux-musl-x64': 'linux-x64',
62
+ 'linux-musl-arm64': 'linux-arm64',
63
+ 'linux-x86': 'linux-x64'
64
+ };
65
+ export class KotlinLanguageServer extends SolidLanguageServer {
66
+ handler;
67
+ runtimePaths;
68
+ initialized = false;
69
+ constructor(config, loggerLike, repositoryRootPath, options = {}) {
70
+ const solidSettings = new SolidLspSettings(options?.solidlspSettings);
71
+ const { logger } = createSerenaLogger({
72
+ name: 'solidlsp.language_servers.kotlin',
73
+ emitToConsole: false,
74
+ level: loggerLike?.level === undefined ? undefined : coerceLogLevel(loggerLike.level)
75
+ });
76
+ const runtimePaths = ensureRuntimeDependencies(solidSettings, logger);
77
+ const handler = new NodeLanguageServerHandler({
78
+ cmd: [runtimePaths.kotlinExecutablePath, '--stdio'],
79
+ env: {
80
+ JAVA_HOME: runtimePaths.javaHomePath
81
+ },
82
+ cwd: repositoryRootPath
83
+ }, {
84
+ requestTimeoutSeconds: options?.timeout ?? null
85
+ });
86
+ super(config, loggerLike, repositoryRootPath, {
87
+ ...options,
88
+ handler,
89
+ solidlspSettings: options?.solidlspSettings
90
+ });
91
+ this.handler = handler;
92
+ this.runtimePaths = runtimePaths;
93
+ this.registerHandlers();
94
+ }
95
+ start() {
96
+ const shouldInitialize = !this.initialized;
97
+ super.start();
98
+ if (shouldInitialize) {
99
+ this.initializeLanguageServer();
100
+ this.initialized = true;
101
+ }
102
+ return this;
103
+ }
104
+ stop(shutdownTimeout = 2.0) {
105
+ super.stop(shutdownTimeout);
106
+ this.initialized = false;
107
+ }
108
+ registerHandlers() {
109
+ const noop = () => undefined;
110
+ this.handler.onRequest('client/registerCapability', noop);
111
+ this.handler.onRequest('workspace/executeClientCommand', () => []);
112
+ this.handler.onNotification('language/status', noop);
113
+ this.handler.onNotification('language/actionableNotification', noop);
114
+ this.handler.onNotification('$/progress', noop);
115
+ this.handler.onNotification('textDocument/publishDiagnostics', noop);
116
+ this.handler.onNotification('experimental/serverStatus', (payload) => {
117
+ const params = payload;
118
+ if (params?.quiescent) {
119
+ this.logger.debug('Kotlin language server reported experimental/serverStatus quiescent=true');
120
+ }
121
+ });
122
+ this.handler.onNotification('window/logMessage', (payload) => {
123
+ const message = extractWindowMessage(payload);
124
+ if (message) {
125
+ this.logger.info(`Kotlin LS message: ${message}`);
126
+ }
127
+ });
128
+ }
129
+ initializeLanguageServer() {
130
+ this.logger.info('Initializing Kotlin language server');
131
+ const params = this.buildInitializeParams();
132
+ const response = this.handler.sendRequest('initialize', params);
133
+ if (!response || typeof response !== 'object') {
134
+ throw new Error('Kotlin language server returned an invalid initialize response.');
135
+ }
136
+ if (!response.capabilities || typeof response.capabilities !== 'object') {
137
+ throw new Error('Kotlin language server did not return capabilities during initialization.');
138
+ }
139
+ this.handler.notify.initialized({});
140
+ }
141
+ buildInitializeParams() {
142
+ const repositoryAbsolutePath = path.resolve(this.repositoryRootPath);
143
+ const rootUri = pathToFileURL(repositoryAbsolutePath).href;
144
+ return {
145
+ clientInfo: { name: 'Multilspy Kotlin Client', version: '1.0.0' },
146
+ locale: 'en',
147
+ processId: process.pid,
148
+ rootPath: repositoryAbsolutePath,
149
+ rootUri,
150
+ capabilities: buildKotlinCapabilities(),
151
+ initializationOptions: {
152
+ workspaceFolders: [rootUri],
153
+ storagePath: null,
154
+ codegen: { enabled: false },
155
+ compiler: { jvm: { target: 'default' } },
156
+ completion: { snippets: { enabled: true } },
157
+ diagnostics: { enabled: true, level: 4, debounceTime: 250 },
158
+ scripts: { enabled: true, buildScriptsEnabled: true },
159
+ indexing: { enabled: true },
160
+ formatting: { enabled: true },
161
+ references: { includeAllWorkspaceTargets: true },
162
+ singledir: false,
163
+ experimental: {
164
+ dali: { enabled: false }
165
+ },
166
+ telemetry: { enabled: false },
167
+ statistics: { enabled: false }
168
+ },
169
+ workspaceFolders: [
170
+ {
171
+ uri: rootUri,
172
+ name: path.basename(repositoryAbsolutePath)
173
+ }
174
+ ]
175
+ };
176
+ }
177
+ }
178
+ function ensureRuntimeDependencies(settings, logger) {
179
+ const runtimeRoot = path.join(settings.languageServersStaticDir, 'kotlin_language_server');
180
+ fs.mkdirSync(runtimeRoot, { recursive: true });
181
+ const kotlinExecutablePath = ensureKotlinExecutable(runtimeRoot, logger);
182
+ const { javaHomePath, javaPath } = ensureJavaRuntime(runtimeRoot, logger);
183
+ return { javaHomePath, javaPath, kotlinExecutablePath };
184
+ }
185
+ function ensureKotlinExecutable(runtimeRoot, logger) {
186
+ const scriptName = process.platform === 'win32' ? 'kotlin-lsp.cmd' : 'kotlin-lsp.sh';
187
+ const scriptPath = path.join(runtimeRoot, scriptName);
188
+ if (!fs.existsSync(scriptPath)) {
189
+ if (shouldSkipRuntimeInstall()) {
190
+ throw new Error(`Kotlin language server script not found at ${scriptPath}. Set SERENA_SKIP_RUNTIME_INSTALL=0 or install Kotlin LSP manually.`);
191
+ }
192
+ logger.info('Downloading Kotlin language server runtime dependency.');
193
+ const dependencies = new RuntimeDependencyCollection([KOTLIN_LSP_DEPENDENCY]);
194
+ dependencies.install(logger, runtimeRoot);
195
+ }
196
+ if (!fs.existsSync(scriptPath)) {
197
+ throw new Error(`Kotlin language server script not found at ${scriptPath} even after installation.`);
198
+ }
199
+ if (process.platform !== 'win32') {
200
+ try {
201
+ fs.chmodSync(scriptPath, 0o755);
202
+ }
203
+ catch {
204
+ // ignore chmod errors
205
+ }
206
+ }
207
+ return scriptPath;
208
+ }
209
+ function ensureJavaRuntime(runtimeRoot, logger) {
210
+ const javaDir = path.join(runtimeRoot, 'java');
211
+ fs.mkdirSync(javaDir, { recursive: true });
212
+ const platform = Platform.current();
213
+ const dependency = resolveJavaDependency(platform);
214
+ const javaHomePath = path.join(javaDir, dependency.javaHomePath);
215
+ const javaBinaryPath = path.join(javaDir, dependency.javaBinaryPath);
216
+ if (!fs.existsSync(javaBinaryPath)) {
217
+ if (shouldSkipRuntimeInstall()) {
218
+ throw new Error(`Kotlin language server requires a Java runtime. Expected executable at ${javaBinaryPath}. Allow runtime download or install manually.`);
219
+ }
220
+ logger.info(`Downloading Java runtime dependency for platform ${platform}.`);
221
+ const dependencies = new RuntimeDependencyCollection([dependency]);
222
+ dependencies.install(logger, javaDir);
223
+ }
224
+ if (!fs.existsSync(javaBinaryPath)) {
225
+ throw new Error(`Failed to provision Java runtime at ${javaBinaryPath}.`);
226
+ }
227
+ if (process.platform !== 'win32') {
228
+ try {
229
+ fs.chmodSync(javaBinaryPath, 0o755);
230
+ }
231
+ catch {
232
+ // ignore chmod errors
233
+ }
234
+ }
235
+ return { javaHomePath, javaPath: javaBinaryPath };
236
+ }
237
+ function resolveJavaDependency(platform) {
238
+ const direct = JAVA_DEPENDENCIES[platform];
239
+ if (direct) {
240
+ return direct;
241
+ }
242
+ const fallbackId = JAVA_DEPENDENCY_FALLBACKS[platform];
243
+ if (fallbackId) {
244
+ const fallback = JAVA_DEPENDENCIES[fallbackId];
245
+ if (fallback) {
246
+ return fallback;
247
+ }
248
+ }
249
+ throw new Error(`Unsupported platform for Kotlin language server Java runtime: ${platform}`);
250
+ }
251
+ function shouldSkipRuntimeInstall() {
252
+ return process.env.SERENA_SKIP_RUNTIME_INSTALL === '1';
253
+ }
254
+ function extractWindowMessage(payload) {
255
+ if (!payload || typeof payload !== 'object') {
256
+ return null;
257
+ }
258
+ const maybeMessage = payload.message;
259
+ return typeof maybeMessage === 'string' ? maybeMessage : null;
260
+ }
261
+ function buildKotlinCapabilities() {
262
+ const symbolKinds = rangeArray(1, 27);
263
+ const completionKinds = rangeArray(1, 26);
264
+ const tokenTypes = [
265
+ 'namespace',
266
+ 'type',
267
+ 'class',
268
+ 'enum',
269
+ 'interface',
270
+ 'struct',
271
+ 'typeParameter',
272
+ 'parameter',
273
+ 'variable',
274
+ 'property',
275
+ 'enumMember',
276
+ 'event',
277
+ 'function',
278
+ 'method',
279
+ 'macro',
280
+ 'keyword',
281
+ 'modifier',
282
+ 'comment',
283
+ 'string',
284
+ 'number',
285
+ 'regexp',
286
+ 'operator',
287
+ 'decorator'
288
+ ];
289
+ const tokenModifiers = [
290
+ 'declaration',
291
+ 'definition',
292
+ 'readonly',
293
+ 'static',
294
+ 'deprecated',
295
+ 'abstract',
296
+ 'async',
297
+ 'modification',
298
+ 'documentation',
299
+ 'defaultLibrary'
300
+ ];
301
+ return {
302
+ workspace: {
303
+ applyEdit: true,
304
+ workspaceEdit: {
305
+ documentChanges: true,
306
+ resourceOperations: ['create', 'rename', 'delete'],
307
+ failureHandling: 'textOnlyTransactional',
308
+ normalizesLineEndings: true,
309
+ changeAnnotationSupport: { groupsOnLabel: true }
310
+ },
311
+ didChangeConfiguration: { dynamicRegistration: true },
312
+ didChangeWatchedFiles: { dynamicRegistration: true, relativePatternSupport: true },
313
+ symbol: {
314
+ dynamicRegistration: true,
315
+ symbolKind: { valueSet: symbolKinds },
316
+ tagSupport: { valueSet: [1] },
317
+ resolveSupport: { properties: ['location.range'] }
318
+ },
319
+ codeLens: { refreshSupport: true },
320
+ executeCommand: { dynamicRegistration: true },
321
+ configuration: true,
322
+ workspaceFolders: true,
323
+ semanticTokens: { refreshSupport: true },
324
+ fileOperations: {
325
+ dynamicRegistration: true,
326
+ didCreate: true,
327
+ didRename: true,
328
+ didDelete: true,
329
+ willCreate: true,
330
+ willRename: true,
331
+ willDelete: true
332
+ },
333
+ inlineValue: { refreshSupport: true },
334
+ inlayHint: { refreshSupport: true },
335
+ diagnostics: { refreshSupport: true }
336
+ },
337
+ textDocument: {
338
+ publishDiagnostics: {
339
+ relatedInformation: true,
340
+ versionSupport: false,
341
+ tagSupport: { valueSet: [1, 2] },
342
+ codeDescriptionSupport: true,
343
+ dataSupport: true
344
+ },
345
+ synchronization: {
346
+ dynamicRegistration: true,
347
+ willSave: true,
348
+ willSaveWaitUntil: true,
349
+ didSave: true
350
+ },
351
+ completion: {
352
+ dynamicRegistration: true,
353
+ contextSupport: true,
354
+ completionItem: {
355
+ snippetSupport: false,
356
+ commitCharactersSupport: true,
357
+ documentationFormat: ['markdown', 'plaintext'],
358
+ deprecatedSupport: true,
359
+ preselectSupport: true,
360
+ tagSupport: { valueSet: [1] },
361
+ insertReplaceSupport: false,
362
+ resolveSupport: { properties: ['documentation', 'detail', 'additionalTextEdits'] },
363
+ insertTextModeSupport: { valueSet: [1, 2] },
364
+ labelDetailsSupport: true
365
+ },
366
+ insertTextMode: 2,
367
+ completionItemKind: { valueSet: completionKinds },
368
+ completionList: { itemDefaults: ['commitCharacters', 'editRange', 'insertTextFormat', 'insertTextMode'] }
369
+ },
370
+ hover: { dynamicRegistration: true, contentFormat: ['markdown', 'plaintext'] },
371
+ signatureHelp: {
372
+ dynamicRegistration: true,
373
+ signatureInformation: {
374
+ documentationFormat: ['markdown', 'plaintext'],
375
+ parameterInformation: { labelOffsetSupport: true },
376
+ activeParameterSupport: true
377
+ },
378
+ contextSupport: true
379
+ },
380
+ definition: { dynamicRegistration: true, linkSupport: true },
381
+ references: { dynamicRegistration: true },
382
+ documentHighlight: { dynamicRegistration: true },
383
+ documentSymbol: {
384
+ dynamicRegistration: true,
385
+ symbolKind: { valueSet: symbolKinds },
386
+ hierarchicalDocumentSymbolSupport: true,
387
+ tagSupport: { valueSet: [1] },
388
+ labelSupport: true
389
+ },
390
+ codeAction: {
391
+ dynamicRegistration: true,
392
+ isPreferredSupport: true,
393
+ disabledSupport: true,
394
+ dataSupport: true,
395
+ resolveSupport: { properties: ['edit'] },
396
+ codeActionLiteralSupport: {
397
+ codeActionKind: {
398
+ valueSet: ['', 'quickfix', 'refactor', 'refactor.extract', 'refactor.inline', 'refactor.rewrite', 'source', 'source.organizeImports']
399
+ }
400
+ },
401
+ honorsChangeAnnotations: false
402
+ },
403
+ codeLens: { dynamicRegistration: true },
404
+ documentLink: {
405
+ dynamicRegistration: true,
406
+ tooltipSupport: true
407
+ },
408
+ colorProvider: { dynamicRegistration: true },
409
+ formatting: { dynamicRegistration: true },
410
+ rangeFormatting: { dynamicRegistration: true },
411
+ onTypeFormatting: { dynamicRegistration: true },
412
+ rename: {
413
+ dynamicRegistration: true,
414
+ prepareSupport: true,
415
+ honorsChangeAnnotations: false
416
+ },
417
+ foldingRange: {
418
+ dynamicRegistration: true,
419
+ lineFoldingOnly: true,
420
+ },
421
+ selectionRange: { dynamicRegistration: true },
422
+ publishDecorations: { dynamicRegistration: true },
423
+ callHierarchy: { dynamicRegistration: true },
424
+ semanticTokens: {
425
+ dynamicRegistration: true,
426
+ tokenTypes,
427
+ tokenModifiers,
428
+ formats: ['relative'],
429
+ requests: { range: true, full: { delta: true } },
430
+ multilineTokenSupport: false,
431
+ overlappingTokenSupport: false,
432
+ serverCancelSupport: true,
433
+ augmentsSyntaxTokens: true
434
+ },
435
+ linkedEditingRange: { dynamicRegistration: true },
436
+ typeHierarchy: { dynamicRegistration: true },
437
+ inlineValue: { dynamicRegistration: true },
438
+ inlayHint: {
439
+ dynamicRegistration: true,
440
+ resolveSupport: { properties: ['tooltip', 'textEdits', 'label.tooltip', 'label.location', 'label.command'] }
441
+ },
442
+ diagnostic: { dynamicRegistration: true, relatedDocumentSupport: false }
443
+ },
444
+ window: {
445
+ showMessage: { messageActionItem: { additionalPropertiesSupport: true } },
446
+ showDocument: { support: true },
447
+ workDoneProgress: true
448
+ },
449
+ general: {
450
+ staleRequestSupport: {
451
+ cancel: true,
452
+ retryOnContentModified: [
453
+ 'textDocument/semanticTokens/full',
454
+ 'textDocument/semanticTokens/range',
455
+ 'textDocument/semanticTokens/full/delta'
456
+ ]
457
+ },
458
+ regularExpressions: { engine: 'ECMAScript', version: 'ES2020' },
459
+ markdown: { parser: 'marked', version: '1.1.0' },
460
+ positionEncodings: ['utf-16']
461
+ },
462
+ notebookDocument: {
463
+ synchronization: { dynamicRegistration: true, executionSummarySupport: true }
464
+ }
465
+ };
466
+ }
467
+ function rangeArray(start, end) {
468
+ const result = [];
469
+ for (let value = start; value < end; value += 1) {
470
+ result.push(value);
471
+ }
472
+ return result;
473
+ }
474
+ registerLanguageServer(Language.KOTLIN, KotlinLanguageServer);
@@ -0,0 +1,18 @@
1
+ import { type LogLevel } from '../../serena/util/logging.js';
2
+ import { SolidLanguageServer, type LanguageServerConfigLike, type SolidLspSettingsInit } from '../ls.js';
3
+ export declare class LuaLanguageServer extends SolidLanguageServer {
4
+ private readonly handlerInstance;
5
+ private initialized;
6
+ constructor(config: LanguageServerConfigLike, loggerLike: {
7
+ level?: number | LogLevel;
8
+ } | null, repositoryRootPath: string, options?: {
9
+ timeout?: number | null;
10
+ solidlspSettings?: SolidLspSettingsInit;
11
+ });
12
+ start(): this;
13
+ stop(shutdownTimeout?: number): void;
14
+ private registerHandlers;
15
+ private initializeLanguageServer;
16
+ private buildInitializeParams;
17
+ private verifyCapabilities;
18
+ }