better-dsh 0.2.3-e → 0.2.3-g

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 (270) hide show
  1. package/docs/50_test-reports/2026-09-13-preact-ui-shell/345/256/236/346/265/213/346/212/245/345/221/212.md +1 -1
  2. package/docs/50_test-reports/2026-09-14-4999-skill/346/270/205/345/215/225/344/270/216lsp-gate/345/256/236/346/265/213/346/212/245/345/221/212.md +54 -0
  3. package/docs/specs/agent/spec.md +54 -0
  4. package/docs/specs/ast/spec.md +34 -0
  5. package/docs/specs/compaction-recall/spec.md +46 -0
  6. package/docs/specs/ctx/spec.md +107 -0
  7. package/docs/specs/dsh/spec.md +47 -0
  8. package/docs/specs/dvc/spec.md +87 -0
  9. package/docs/specs/escalation-guidance/spec.md +44 -0
  10. package/docs/specs/fs-scheme-resolution/spec.md +37 -0
  11. package/docs/specs/hash-edit/spec.md +41 -0
  12. package/docs/specs/http-read/spec.md +73 -0
  13. package/docs/specs/kernel-provisioning/spec.md +53 -0
  14. package/docs/specs/lsp/spec.md +121 -0
  15. package/docs/specs/mobile-layout/spec.md +108 -0
  16. package/docs/specs/model-failover/spec.md +20 -0
  17. package/docs/specs/preact-ui-shell/spec.md +22 -0
  18. package/docs/specs/repl-dispatch-resilience/spec.md +21 -0
  19. package/docs/specs/skill/spec.md +58 -0
  20. package/docs/specs/tool-surface/spec.md +222 -0
  21. package/docs/specs/url-schema/spec.md +148 -0
  22. package/docs/specs/web-trust-fence/spec.md +43 -0
  23. package/dsh-docs/AGENTS.md +75 -0
  24. package/dsh-docs/agent-lifecycle.md +84 -0
  25. package/dsh-docs/agent-lifecycle.zh.md +86 -0
  26. package/dsh-docs/api-gateway.md +164 -0
  27. package/dsh-docs/api-gateway.zh.md +164 -0
  28. package/dsh-docs/architecture.md +150 -0
  29. package/dsh-docs/architecture.zh.md +154 -0
  30. package/dsh-docs/capability-seams.md +543 -0
  31. package/dsh-docs/capability-seams.zh.md +545 -0
  32. package/dsh-docs/config-catalog.md +3473 -0
  33. package/dsh-docs/config-catalog.zh.md +3474 -0
  34. package/dsh-docs/cookbook/adding-a-package.md +117 -0
  35. package/dsh-docs/cookbook/adding-a-package.zh.md +119 -0
  36. package/dsh-docs/cookbook/adding-a-remote-api.md +197 -0
  37. package/dsh-docs/cookbook/adding-a-remote-api.zh.md +197 -0
  38. package/dsh-docs/cookbook/adding-a-settings-card.md +102 -0
  39. package/dsh-docs/cookbook/adding-a-settings-card.zh.md +102 -0
  40. package/dsh-docs/cookbook/adding-a-tool.md +101 -0
  41. package/dsh-docs/cookbook/adding-a-tool.zh.md +103 -0
  42. package/dsh-docs/cookbook/adding-a-vendored-package.md +59 -0
  43. package/dsh-docs/cookbook/adding-a-vendored-package.zh.md +59 -0
  44. package/dsh-docs/cookbook/adding-an-llm-adapter.md +43 -0
  45. package/dsh-docs/cookbook/adding-an-llm-adapter.zh.md +43 -0
  46. package/dsh-docs/cookbook/extension-cookbook.md +132 -0
  47. package/dsh-docs/cookbook/extension-cookbook.zh.md +136 -0
  48. package/dsh-docs/cookbook/maintaining-dsh-code-review.md +64 -0
  49. package/dsh-docs/cookbook/maintaining-dsh-code-review.zh.md +64 -0
  50. package/dsh-docs/cookbook/responding-to-pr-review-on-a-stack.md +32 -0
  51. package/dsh-docs/cookbook/responding-to-pr-review-on-a-stack.zh.md +32 -0
  52. package/dsh-docs/cordis-api/context.md +364 -0
  53. package/dsh-docs/cordis-api/context.zh.md +366 -0
  54. package/dsh-docs/cordis-api/events.md +207 -0
  55. package/dsh-docs/cordis-api/events.zh.md +209 -0
  56. package/dsh-docs/cordis-api/fiber.md +375 -0
  57. package/dsh-docs/cordis-api/fiber.zh.md +377 -0
  58. package/dsh-docs/cordis-api/inherited.md +39 -0
  59. package/dsh-docs/cordis-api/registry.md +152 -0
  60. package/dsh-docs/cordis-api/registry.zh.md +154 -0
  61. package/dsh-docs/cordis-api/service.md +102 -0
  62. package/dsh-docs/cordis-api/service.zh.md +104 -0
  63. package/dsh-docs/cordis-primer.md +45 -0
  64. package/dsh-docs/cordis-primer.zh.md +51 -0
  65. package/dsh-docs/cordis-tutorial/01-first-plugin.md +95 -0
  66. package/dsh-docs/cordis-tutorial/01-first-plugin.zh.md +95 -0
  67. package/dsh-docs/cordis-tutorial/02-lifecycle-and-effects.md +98 -0
  68. package/dsh-docs/cordis-tutorial/02-lifecycle-and-effects.zh.md +98 -0
  69. package/dsh-docs/cordis-tutorial/03-services.md +98 -0
  70. package/dsh-docs/cordis-tutorial/03-services.zh.md +98 -0
  71. package/dsh-docs/cordis-tutorial/04-events.md +144 -0
  72. package/dsh-docs/cordis-tutorial/04-events.zh.md +144 -0
  73. package/dsh-docs/cordis-tutorial/05-config.md +84 -0
  74. package/dsh-docs/cordis-tutorial/05-config.zh.md +84 -0
  75. package/dsh-docs/cordis-tutorial/06-composition-and-hmr.md +113 -0
  76. package/dsh-docs/cordis-tutorial/06-composition-and-hmr.zh.md +113 -0
  77. package/dsh-docs/cordis-tutorial/07-into-the-harness.md +108 -0
  78. package/dsh-docs/cordis-tutorial/07-into-the-harness.zh.md +108 -0
  79. package/dsh-docs/cordis-tutorial/index.md +60 -0
  80. package/dsh-docs/cordis-tutorial/index.zh.md +62 -0
  81. package/dsh-docs/deepseek-llm-api-wire-extensions.md +163 -0
  82. package/dsh-docs/deepseek-llm-api-wire-extensions.zh.md +163 -0
  83. package/dsh-docs/defensive-patterns.md +33 -0
  84. package/dsh-docs/defensive-patterns.zh.md +35 -0
  85. package/dsh-docs/development.md +167 -0
  86. package/dsh-docs/development.zh.md +173 -0
  87. package/dsh-docs/event-producer-consumer.md +86 -0
  88. package/dsh-docs/event-producer-consumer.zh.md +88 -0
  89. package/dsh-docs/glossary.md +45 -0
  90. package/dsh-docs/glossary.zh.md +45 -0
  91. package/dsh-docs/graph-atlas.md +22 -0
  92. package/dsh-docs/graph-atlas.zh.md +24 -0
  93. package/dsh-docs/i18n/README.md +60 -0
  94. package/dsh-docs/i18n/README.zh.md +62 -0
  95. package/dsh-docs/i18n/style-samples.md +87 -0
  96. package/dsh-docs/i18n/terminology.md +214 -0
  97. package/dsh-docs/i18n/translation-prompt.md +263 -0
  98. package/dsh-docs/i18n/translation-rules.md +69 -0
  99. package/dsh-docs/i18n/translation-rules.zh.md +69 -0
  100. package/dsh-docs/module-graph.md +1411 -0
  101. package/dsh-docs/module-graph.zh.md +1413 -0
  102. package/dsh-docs/persistence-catalog.md +1075 -0
  103. package/dsh-docs/persistence-catalog.zh.md +1077 -0
  104. package/dsh-docs/postmortem/0001-acp-default-export-drops-inject.md +113 -0
  105. package/dsh-docs/postmortem/0001-acp-default-export-drops-inject.zh.md +113 -0
  106. package/dsh-docs/postmortem/0002-js-expression-disabled-filesystem-tools.md +47 -0
  107. package/dsh-docs/postmortem/0002-js-expression-disabled-filesystem-tools.zh.md +47 -0
  108. package/dsh-docs/postmortem/0003-web-agent-gui-feedback-loop.md +53 -0
  109. package/dsh-docs/postmortem/0003-web-agent-gui-feedback-loop.zh.md +53 -0
  110. package/dsh-docs/postmortem/0004-landlock-partial-notice-misclassified-child-failures.md +55 -0
  111. package/dsh-docs/postmortem/0004-landlock-partial-notice-misclassified-child-failures.zh.md +55 -0
  112. package/dsh-docs/postmortem/README.md +18 -0
  113. package/dsh-docs/postmortem/README.zh.md +18 -0
  114. package/dsh-docs/rescope.md +53 -0
  115. package/dsh-docs/rescope.zh.md +53 -0
  116. package/dsh-docs/subsystems/README.md +61 -0
  117. package/dsh-docs/subsystems/README.zh.md +61 -0
  118. package/dsh-docs/subsystems/agent-team.md +207 -0
  119. package/dsh-docs/subsystems/agent-team.zh.md +207 -0
  120. package/dsh-docs/subsystems/approval.md +170 -0
  121. package/dsh-docs/subsystems/approval.zh.md +170 -0
  122. package/dsh-docs/subsystems/attachment.md +351 -0
  123. package/dsh-docs/subsystems/attachment.zh.md +351 -0
  124. package/dsh-docs/subsystems/client-modules.md +168 -0
  125. package/dsh-docs/subsystems/client-modules.zh.md +168 -0
  126. package/dsh-docs/subsystems/code-runtime.md +195 -0
  127. package/dsh-docs/subsystems/code-runtime.zh.md +195 -0
  128. package/dsh-docs/subsystems/commands.md +219 -0
  129. package/dsh-docs/subsystems/commands.zh.md +219 -0
  130. package/dsh-docs/subsystems/compaction.md +238 -0
  131. package/dsh-docs/subsystems/compaction.zh.md +238 -0
  132. package/dsh-docs/subsystems/conversation.md +258 -0
  133. package/dsh-docs/subsystems/conversation.zh.md +258 -0
  134. package/dsh-docs/subsystems/core.md +1209 -0
  135. package/dsh-docs/subsystems/core.zh.md +1219 -0
  136. package/dsh-docs/subsystems/credentials.md +329 -0
  137. package/dsh-docs/subsystems/credentials.zh.md +329 -0
  138. package/dsh-docs/subsystems/extensions.md +382 -0
  139. package/dsh-docs/subsystems/extensions.zh.md +382 -0
  140. package/dsh-docs/subsystems/feedback.md +266 -0
  141. package/dsh-docs/subsystems/feedback.zh.md +266 -0
  142. package/dsh-docs/subsystems/filesystem.md +505 -0
  143. package/dsh-docs/subsystems/filesystem.zh.md +505 -0
  144. package/dsh-docs/subsystems/goal.md +277 -0
  145. package/dsh-docs/subsystems/goal.zh.md +277 -0
  146. package/dsh-docs/subsystems/invariants.md +88 -0
  147. package/dsh-docs/subsystems/invariants.zh.md +88 -0
  148. package/dsh-docs/subsystems/jobs.md +290 -0
  149. package/dsh-docs/subsystems/jobs.zh.md +290 -0
  150. package/dsh-docs/subsystems/llm-streaming.md +1080 -0
  151. package/dsh-docs/subsystems/llm-streaming.zh.md +1086 -0
  152. package/dsh-docs/subsystems/lsp.md +202 -0
  153. package/dsh-docs/subsystems/lsp.zh.md +202 -0
  154. package/dsh-docs/subsystems/permission-presets.md +131 -0
  155. package/dsh-docs/subsystems/permission-presets.zh.md +131 -0
  156. package/dsh-docs/subsystems/persistence.md +395 -0
  157. package/dsh-docs/subsystems/persistence.zh.md +395 -0
  158. package/dsh-docs/subsystems/plan.md +87 -0
  159. package/dsh-docs/subsystems/plan.zh.md +87 -0
  160. package/dsh-docs/subsystems/sandbox.md +220 -0
  161. package/dsh-docs/subsystems/sandbox.zh.md +220 -0
  162. package/dsh-docs/subsystems/schedule.md +192 -0
  163. package/dsh-docs/subsystems/schedule.zh.md +192 -0
  164. package/dsh-docs/subsystems/scope.md +59 -0
  165. package/dsh-docs/subsystems/scope.zh.md +59 -0
  166. package/dsh-docs/subsystems/session-projection.md +354 -0
  167. package/dsh-docs/subsystems/session-projection.zh.md +354 -0
  168. package/dsh-docs/subsystems/session-query.md +509 -0
  169. package/dsh-docs/subsystems/session-query.zh.md +509 -0
  170. package/dsh-docs/subsystems/session-reference.md +219 -0
  171. package/dsh-docs/subsystems/session-reference.zh.md +219 -0
  172. package/dsh-docs/subsystems/session-telemetry.md +194 -0
  173. package/dsh-docs/subsystems/session-telemetry.zh.md +194 -0
  174. package/dsh-docs/subsystems/session-title.md +204 -0
  175. package/dsh-docs/subsystems/session-title.zh.md +204 -0
  176. package/dsh-docs/subsystems/session.md +1155 -0
  177. package/dsh-docs/subsystems/session.zh.md +1159 -0
  178. package/dsh-docs/subsystems/settings.md +405 -0
  179. package/dsh-docs/subsystems/settings.zh.md +405 -0
  180. package/dsh-docs/subsystems/shell.md +303 -0
  181. package/dsh-docs/subsystems/shell.zh.md +303 -0
  182. package/dsh-docs/subsystems/skills.md +354 -0
  183. package/dsh-docs/subsystems/skills.zh.md +354 -0
  184. package/dsh-docs/subsystems/slots.md +175 -0
  185. package/dsh-docs/subsystems/slots.zh.md +175 -0
  186. package/dsh-docs/subsystems/spill.md +117 -0
  187. package/dsh-docs/subsystems/spill.zh.md +117 -0
  188. package/dsh-docs/subsystems/storage.md +260 -0
  189. package/dsh-docs/subsystems/storage.zh.md +260 -0
  190. package/dsh-docs/subsystems/subagent.md +766 -0
  191. package/dsh-docs/subsystems/subagent.zh.md +770 -0
  192. package/dsh-docs/subsystems/subprocess.md +324 -0
  193. package/dsh-docs/subsystems/subprocess.zh.md +324 -0
  194. package/dsh-docs/subsystems/system-prompt.md +220 -0
  195. package/dsh-docs/subsystems/system-prompt.zh.md +220 -0
  196. package/dsh-docs/subsystems/terminal.md +184 -0
  197. package/dsh-docs/subsystems/terminal.zh.md +184 -0
  198. package/dsh-docs/subsystems/todo.md +32 -0
  199. package/dsh-docs/subsystems/todo.zh.md +32 -0
  200. package/dsh-docs/subsystems/token-meter.md +105 -0
  201. package/dsh-docs/subsystems/token-meter.zh.md +105 -0
  202. package/dsh-docs/subsystems/tools.md +720 -0
  203. package/dsh-docs/subsystems/tools.zh.md +720 -0
  204. package/dsh-docs/subsystems/typert.md +343 -0
  205. package/dsh-docs/subsystems/typert.zh.md +343 -0
  206. package/dsh-docs/subsystems/user-questions.md +178 -0
  207. package/dsh-docs/subsystems/user-questions.zh.md +178 -0
  208. package/dsh-docs/subsystems/web-client.md +95 -0
  209. package/dsh-docs/subsystems/web-client.zh.md +95 -0
  210. package/dsh-docs/subsystems/web-server.md +154 -0
  211. package/dsh-docs/subsystems/web-server.zh.md +154 -0
  212. package/dsh-docs/subsystems/web.md +206 -0
  213. package/dsh-docs/subsystems/web.zh.md +206 -0
  214. package/dsh-docs/subsystems/webhook.md +70 -0
  215. package/dsh-docs/subsystems/webhook.zh.md +70 -0
  216. package/dsh-docs/subsystems/workflow.md +278 -0
  217. package/dsh-docs/subsystems/workflow.zh.md +278 -0
  218. package/dsh-docs/subsystems/workspace.md +321 -0
  219. package/dsh-docs/subsystems/workspace.zh.md +321 -0
  220. package/dsh-docs/testing.md +54 -0
  221. package/dsh-docs/testing.zh.md +54 -0
  222. package/dsh-docs/tool-catalog.md +2225 -0
  223. package/dsh-docs/tool-catalog.zh.md +2233 -0
  224. package/dsh-docs/tool-execution-pipeline.md +62 -0
  225. package/dsh-docs/tool-execution-pipeline.zh.md +64 -0
  226. package/dsh-docs/user/develop/basic/config.md +106 -0
  227. package/dsh-docs/user/develop/basic/config.zh.md +106 -0
  228. package/dsh-docs/user/develop/basic/index.md +144 -0
  229. package/dsh-docs/user/develop/basic/index.zh.md +144 -0
  230. package/dsh-docs/user/develop/basic/publish.md +183 -0
  231. package/dsh-docs/user/develop/basic/publish.zh.md +183 -0
  232. package/dsh-docs/user/develop/basic/tool.md +52 -0
  233. package/dsh-docs/user/develop/basic/tool.zh.md +52 -0
  234. package/dsh-docs/user/develop/framework/events.md +143 -0
  235. package/dsh-docs/user/develop/framework/events.zh.md +143 -0
  236. package/dsh-docs/user/develop/framework/index.md +137 -0
  237. package/dsh-docs/user/develop/framework/index.zh.md +137 -0
  238. package/dsh-docs/user/develop/framework/service.md +148 -0
  239. package/dsh-docs/user/develop/framework/service.zh.md +150 -0
  240. package/dsh-docs/user/develop/practice/dynamic-cordis.md +15 -0
  241. package/dsh-docs/user/develop/practice/dynamic-cordis.zh.md +15 -0
  242. package/dsh-docs/user/develop/practice/index.md +155 -0
  243. package/dsh-docs/user/develop/practice/index.zh.md +155 -0
  244. package/dsh-docs/user/develop/practice/llm-adapter.md +189 -0
  245. package/dsh-docs/user/develop/practice/llm-adapter.zh.md +189 -0
  246. package/dsh-docs/user/guide/github-review.md +102 -0
  247. package/dsh-docs/user/guide/github-review.zh.md +102 -0
  248. package/dsh-docs/user/guide/index.md +30 -0
  249. package/dsh-docs/user/guide/index.zh.md +30 -0
  250. package/dsh-docs/user/guide/mcp-memory.md +101 -0
  251. package/dsh-docs/user/guide/mcp-memory.zh.md +101 -0
  252. package/dsh-docs/user/guide/network-proxy.md +85 -0
  253. package/dsh-docs/user/guide/network-proxy.zh.md +85 -0
  254. package/dsh-docs/user/guide/providers.md +190 -0
  255. package/dsh-docs/user/guide/providers.zh.md +190 -0
  256. package/dsh-docs/user/guide/python-sdk.md +150 -0
  257. package/dsh-docs/user/guide/python-sdk.zh.md +150 -0
  258. package/dsh-docs/user/guide/schedule.md +21 -0
  259. package/dsh-docs/user/guide/schedule.zh.md +21 -0
  260. package/dsh-docs/user/index.md +11 -0
  261. package/dsh-docs/user/index.zh.md +11 -0
  262. package/dsh-docs/web-styling.md +29 -0
  263. package/dsh-docs/web-styling.zh.md +29 -0
  264. package/lib/client/index.js +268 -38
  265. package/lib/fs-aware/sandbox-plugin.js +1 -1
  266. package/lib/index.js +1112 -1261
  267. package/lib/lsp-server-registry-B8DNonhS.js +3 -0
  268. package/lib/lsp-server-registry-BexQagaK.js +943 -0
  269. package/lib/{wrap-DC8O3SYz.js → wrap-JFjcWwZf.js} +42 -16
  270. package/package.json +2 -1
@@ -0,0 +1,943 @@
1
+ import { accessSync, constants, existsSync, readdirSync } from "node:fs";
2
+ import * as path from "node:path";
3
+
4
+ //#region src/devices/lsp/defaults.json
5
+ var defaults_default = {
6
+ "rust-analyzer": {
7
+ "command": "rust-analyzer",
8
+ "args": [],
9
+ "fileTypes": [".rs"],
10
+ "rootMarkers": ["Cargo.toml", "rust-analyzer.toml"],
11
+ "initOptions": {},
12
+ "settings": { "rust-analyzer": { "checkOnSave": false } },
13
+ "capabilities": {
14
+ "flycheck": true,
15
+ "ssr": true,
16
+ "expandMacro": true,
17
+ "runnables": true,
18
+ "relatedTests": true
19
+ }
20
+ },
21
+ tlaplus: {
22
+ "command": "tlapm_lsp",
23
+ "args": ["--stdio"],
24
+ "fileTypes": [".tla", ".tlaplus"],
25
+ "rootMarkers": ["*.tla"]
26
+ },
27
+ clangd: {
28
+ "command": "clangd",
29
+ "args": [
30
+ "--background-index",
31
+ "--clang-tidy",
32
+ "--header-insertion=iwyu"
33
+ ],
34
+ "fileTypes": [
35
+ ".c",
36
+ ".cpp",
37
+ ".cc",
38
+ ".cxx",
39
+ ".h",
40
+ ".hpp",
41
+ ".hxx",
42
+ ".m",
43
+ ".mm"
44
+ ],
45
+ "rootMarkers": [
46
+ "compile_commands.json",
47
+ "CMakeLists.txt",
48
+ ".clangd",
49
+ ".clang-format",
50
+ "Makefile"
51
+ ]
52
+ },
53
+ zls: {
54
+ "command": "zls",
55
+ "args": [],
56
+ "fileTypes": [".zig"],
57
+ "rootMarkers": [
58
+ "build.zig",
59
+ "build.zig.zon",
60
+ "zls.json"
61
+ ]
62
+ },
63
+ gopls: {
64
+ "command": "gopls",
65
+ "args": ["serve"],
66
+ "fileTypes": [
67
+ ".go",
68
+ ".mod",
69
+ ".sum"
70
+ ],
71
+ "rootMarkers": [
72
+ "go.mod",
73
+ "go.work",
74
+ "go.sum"
75
+ ],
76
+ "settings": { "gopls": {
77
+ "analyses": {
78
+ "unusedparams": true,
79
+ "shadow": true
80
+ },
81
+ "staticcheck": true,
82
+ "gofumpt": true
83
+ } }
84
+ },
85
+ "typescript-language-server": {
86
+ "command": "typescript-language-server",
87
+ "args": ["--stdio"],
88
+ "fileTypes": [
89
+ ".ts",
90
+ ".tsx",
91
+ ".js",
92
+ ".jsx",
93
+ ".mjs",
94
+ ".cjs"
95
+ ],
96
+ "rootMarkers": [
97
+ "package.json",
98
+ "tsconfig.json",
99
+ "jsconfig.json"
100
+ ],
101
+ "initOptions": {
102
+ "hostInfo": "omp-coding-agent",
103
+ "preferences": {
104
+ "includeInlayParameterNameHints": "all",
105
+ "includeInlayVariableTypeHints": true,
106
+ "includeInlayFunctionParameterTypeHints": true
107
+ }
108
+ }
109
+ },
110
+ biome: {
111
+ "command": "biome",
112
+ "args": ["lsp-proxy"],
113
+ "fileTypes": [
114
+ ".ts",
115
+ ".tsx",
116
+ ".js",
117
+ ".jsx",
118
+ ".mjs",
119
+ ".cjs",
120
+ ".json",
121
+ ".jsonc",
122
+ ".css"
123
+ ],
124
+ "rootMarkers": ["biome.json", "biome.jsonc"],
125
+ "isLinter": true
126
+ },
127
+ eslint: {
128
+ "command": "vscode-eslint-language-server",
129
+ "args": ["--stdio"],
130
+ "fileTypes": [
131
+ ".ts",
132
+ ".tsx",
133
+ ".js",
134
+ ".jsx",
135
+ ".mjs",
136
+ ".cjs",
137
+ ".vue",
138
+ ".svelte"
139
+ ],
140
+ "rootMarkers": [
141
+ ".eslintrc",
142
+ ".eslintrc.js",
143
+ ".eslintrc.json",
144
+ ".eslintrc.yml",
145
+ "eslint.config.js",
146
+ "eslint.config.mjs"
147
+ ],
148
+ "isLinter": true,
149
+ "settings": {
150
+ "validate": "on",
151
+ "run": "onType"
152
+ }
153
+ },
154
+ denols: {
155
+ "command": "deno",
156
+ "args": ["lsp"],
157
+ "fileTypes": [
158
+ ".ts",
159
+ ".tsx",
160
+ ".js",
161
+ ".jsx"
162
+ ],
163
+ "rootMarkers": [
164
+ "deno.json",
165
+ "deno.jsonc",
166
+ "deno.lock"
167
+ ],
168
+ "initOptions": {
169
+ "enable": true,
170
+ "lint": true,
171
+ "unstable": true
172
+ }
173
+ },
174
+ "vscode-html-language-server": {
175
+ "command": "vscode-html-language-server",
176
+ "args": ["--stdio"],
177
+ "fileTypes": [".html", ".htm"],
178
+ "rootMarkers": ["package.json", ".git"],
179
+ "initOptions": { "provideFormatter": true }
180
+ },
181
+ "vscode-css-language-server": {
182
+ "command": "vscode-css-language-server",
183
+ "args": ["--stdio"],
184
+ "fileTypes": [
185
+ ".css",
186
+ ".scss",
187
+ ".sass",
188
+ ".less"
189
+ ],
190
+ "rootMarkers": ["package.json", ".git"],
191
+ "initOptions": { "provideFormatter": true }
192
+ },
193
+ "vscode-json-language-server": {
194
+ "command": "vscode-json-language-server",
195
+ "args": ["--stdio"],
196
+ "fileTypes": [".json", ".jsonc"],
197
+ "rootMarkers": ["package.json", ".git"],
198
+ "initOptions": { "provideFormatter": true }
199
+ },
200
+ tailwindcss: {
201
+ "command": "tailwindcss-language-server",
202
+ "args": ["--stdio"],
203
+ "fileTypes": [
204
+ ".html",
205
+ ".css",
206
+ ".scss",
207
+ ".js",
208
+ ".jsx",
209
+ ".ts",
210
+ ".tsx",
211
+ ".vue",
212
+ ".svelte"
213
+ ],
214
+ "rootMarkers": [
215
+ "tailwind.config.js",
216
+ "tailwind.config.ts",
217
+ "tailwind.config.mjs",
218
+ "tailwind.config.cjs"
219
+ ]
220
+ },
221
+ svelte: {
222
+ "command": "svelteserver",
223
+ "args": ["--stdio"],
224
+ "fileTypes": [".svelte"],
225
+ "rootMarkers": [
226
+ "svelte.config.js",
227
+ "svelte.config.mjs",
228
+ "package.json"
229
+ ]
230
+ },
231
+ "vue-language-server": {
232
+ "command": "vue-language-server",
233
+ "args": ["--stdio"],
234
+ "fileTypes": [".vue"],
235
+ "rootMarkers": [
236
+ "vue.config.js",
237
+ "nuxt.config.js",
238
+ "nuxt.config.ts",
239
+ "package.json"
240
+ ]
241
+ },
242
+ astro: {
243
+ "command": "astro-ls",
244
+ "args": ["--stdio"],
245
+ "fileTypes": [".astro"],
246
+ "rootMarkers": [
247
+ "astro.config.mjs",
248
+ "astro.config.js",
249
+ "astro.config.ts"
250
+ ]
251
+ },
252
+ pyright: {
253
+ "command": "pyright-langserver",
254
+ "args": ["--stdio"],
255
+ "fileTypes": [".py", ".pyi"],
256
+ "rootMarkers": [
257
+ "pyproject.toml",
258
+ "pyrightconfig.json",
259
+ "setup.py",
260
+ "setup.cfg",
261
+ "requirements.txt",
262
+ "Pipfile"
263
+ ],
264
+ "settings": { "python": { "analysis": {
265
+ "autoSearchPaths": true,
266
+ "diagnosticMode": "openFilesOnly",
267
+ "useLibraryCodeForTypes": true
268
+ } } }
269
+ },
270
+ basedpyright: {
271
+ "command": "basedpyright-langserver",
272
+ "args": ["--stdio"],
273
+ "fileTypes": [".py", ".pyi"],
274
+ "rootMarkers": [
275
+ "pyproject.toml",
276
+ "pyrightconfig.json",
277
+ "setup.py",
278
+ "requirements.txt"
279
+ ],
280
+ "settings": { "basedpyright": { "analysis": {
281
+ "autoSearchPaths": true,
282
+ "diagnosticMode": "openFilesOnly",
283
+ "useLibraryCodeForTypes": true
284
+ } } }
285
+ },
286
+ pylsp: {
287
+ "command": "pylsp",
288
+ "args": [],
289
+ "fileTypes": [".py"],
290
+ "rootMarkers": [
291
+ "pyproject.toml",
292
+ "setup.py",
293
+ "setup.cfg",
294
+ "requirements.txt",
295
+ "Pipfile"
296
+ ]
297
+ },
298
+ ty: {
299
+ "command": "ty",
300
+ "args": ["server"],
301
+ "fileTypes": [".py", ".pyi"],
302
+ "rootMarkers": [
303
+ "pyproject.toml",
304
+ "ty.toml",
305
+ "setup.py",
306
+ "setup.cfg",
307
+ "requirements.txt",
308
+ "Pipfile"
309
+ ]
310
+ },
311
+ ruff: {
312
+ "command": "ruff",
313
+ "args": ["server"],
314
+ "fileTypes": [".py", ".pyi"],
315
+ "rootMarkers": [
316
+ "pyproject.toml",
317
+ "ruff.toml",
318
+ ".ruff.toml"
319
+ ],
320
+ "isLinter": true
321
+ },
322
+ jdtls: {
323
+ "command": "jdtls",
324
+ "args": [],
325
+ "fileTypes": [".java"],
326
+ "rootMarkers": [
327
+ "pom.xml",
328
+ "build.gradle",
329
+ "build.gradle.kts",
330
+ "settings.gradle",
331
+ ".project"
332
+ ]
333
+ },
334
+ "kotlin-lsp": {
335
+ "command": "kotlin-lsp",
336
+ "args": ["--stdio"],
337
+ "fileTypes": [".kt", ".kts"],
338
+ "rootMarkers": [
339
+ "build.gradle",
340
+ "build.gradle.kts",
341
+ "pom.xml",
342
+ "settings.gradle",
343
+ "settings.gradle.kts"
344
+ ]
345
+ },
346
+ metals: {
347
+ "command": "metals",
348
+ "args": [],
349
+ "fileTypes": [
350
+ ".scala",
351
+ ".sbt",
352
+ ".sc"
353
+ ],
354
+ "rootMarkers": [
355
+ "build.sbt",
356
+ "build.sc",
357
+ "build.gradle",
358
+ "pom.xml"
359
+ ],
360
+ "initOptions": {
361
+ "statusBarProvider": "show-message",
362
+ "isHttpEnabled": true
363
+ }
364
+ },
365
+ hls: {
366
+ "command": "haskell-language-server-wrapper",
367
+ "args": ["--lsp"],
368
+ "fileTypes": [".hs", ".lhs"],
369
+ "rootMarkers": [
370
+ "stack.yaml",
371
+ "cabal.project",
372
+ "hie.yaml",
373
+ "package.yaml",
374
+ "*.cabal"
375
+ ],
376
+ "settings": { "haskell": {
377
+ "formattingProvider": "ormolu",
378
+ "checkProject": true
379
+ } }
380
+ },
381
+ ocamllsp: {
382
+ "command": "ocamllsp",
383
+ "args": [],
384
+ "fileTypes": [
385
+ ".ml",
386
+ ".mli",
387
+ ".mll",
388
+ ".mly"
389
+ ],
390
+ "rootMarkers": [
391
+ "dune-project",
392
+ "dune-workspace",
393
+ "*.opam",
394
+ ".ocamlformat"
395
+ ]
396
+ },
397
+ elixirls: {
398
+ "command": "elixir-ls",
399
+ "args": [],
400
+ "fileTypes": [
401
+ ".ex",
402
+ ".exs",
403
+ ".heex",
404
+ ".eex"
405
+ ],
406
+ "rootMarkers": ["mix.exs", "mix.lock"],
407
+ "settings": { "elixirLS": {
408
+ "dialyzerEnabled": true,
409
+ "fetchDeps": false
410
+ } }
411
+ },
412
+ expert: {
413
+ "command": "expert",
414
+ "args": ["--stdio"],
415
+ "fileTypes": [
416
+ ".ex",
417
+ ".exs",
418
+ ".heex",
419
+ ".eex"
420
+ ],
421
+ "rootMarkers": ["mix.exs", "mix.lock"]
422
+ },
423
+ erlangls: {
424
+ "command": "erlang_ls",
425
+ "args": [],
426
+ "fileTypes": [".erl", ".hrl"],
427
+ "rootMarkers": [
428
+ "rebar.config",
429
+ "erlang.mk",
430
+ "rebar.lock"
431
+ ]
432
+ },
433
+ gleam: {
434
+ "command": "gleam",
435
+ "args": ["lsp"],
436
+ "fileTypes": [".gleam"],
437
+ "rootMarkers": ["gleam.toml"]
438
+ },
439
+ solargraph: {
440
+ "command": "solargraph",
441
+ "args": ["stdio"],
442
+ "fileTypes": [
443
+ ".rb",
444
+ ".rake",
445
+ ".gemspec"
446
+ ],
447
+ "rootMarkers": [
448
+ "Gemfile",
449
+ ".solargraph.yml",
450
+ "Rakefile"
451
+ ],
452
+ "initOptions": { "formatting": true },
453
+ "settings": { "solargraph": {
454
+ "diagnostics": true,
455
+ "completion": true,
456
+ "hover": true,
457
+ "formatting": true,
458
+ "references": true,
459
+ "rename": true,
460
+ "symbols": true
461
+ } }
462
+ },
463
+ "ruby-lsp": {
464
+ "command": "ruby-lsp",
465
+ "args": [],
466
+ "fileTypes": [
467
+ ".rb",
468
+ ".rake",
469
+ ".gemspec",
470
+ ".erb"
471
+ ],
472
+ "rootMarkers": [
473
+ "Gemfile",
474
+ ".ruby-version",
475
+ ".ruby-gemset"
476
+ ],
477
+ "initOptions": { "formatter": "auto" }
478
+ },
479
+ rubocop: {
480
+ "command": "rubocop",
481
+ "args": ["--lsp"],
482
+ "fileTypes": [".rb", ".rake"],
483
+ "rootMarkers": [".rubocop.yml", "Gemfile"],
484
+ "isLinter": true
485
+ },
486
+ bashls: {
487
+ "command": "bash-language-server",
488
+ "args": ["start"],
489
+ "fileTypes": [
490
+ ".sh",
491
+ ".bash",
492
+ ".zsh"
493
+ ],
494
+ "rootMarkers": [".git"],
495
+ "settings": { "bashIde": { "globPattern": "*@(.sh|.inc|.bash|.command)" } }
496
+ },
497
+ "lua-language-server": {
498
+ "command": "lua-language-server",
499
+ "args": [],
500
+ "fileTypes": [".lua"],
501
+ "rootMarkers": [
502
+ ".luarc.json",
503
+ ".luarc.jsonc",
504
+ ".luacheckrc",
505
+ ".stylua.toml",
506
+ "stylua.toml"
507
+ ],
508
+ "settings": { "Lua": {
509
+ "runtime": { "version": "LuaJIT" },
510
+ "diagnostics": { "globals": ["vim"] },
511
+ "workspace": { "checkThirdParty": false },
512
+ "telemetry": { "enable": false }
513
+ } }
514
+ },
515
+ intelephense: {
516
+ "command": "intelephense",
517
+ "args": ["--stdio"],
518
+ "fileTypes": [".php", ".phtml"],
519
+ "rootMarkers": [
520
+ "composer.json",
521
+ "composer.lock",
522
+ ".git"
523
+ ]
524
+ },
525
+ phpactor: {
526
+ "command": "phpactor",
527
+ "args": ["language-server"],
528
+ "fileTypes": [".php"],
529
+ "rootMarkers": [
530
+ "composer.json",
531
+ ".phpactor.json",
532
+ ".phpactor.yml"
533
+ ]
534
+ },
535
+ omnisharp: {
536
+ "command": "omnisharp",
537
+ "args": [
538
+ "-z",
539
+ "--hostPID",
540
+ "$PID",
541
+ "--encoding",
542
+ "utf-8",
543
+ "--languageserver"
544
+ ],
545
+ "fileTypes": [".cs", ".csx"],
546
+ "rootMarkers": [
547
+ "*.sln",
548
+ "*.csproj",
549
+ "omnisharp.json",
550
+ ".git"
551
+ ],
552
+ "settings": {
553
+ "FormattingOptions": { "EnableEditorConfigSupport": true },
554
+ "RoslynExtensionsOptions": { "EnableAnalyzersSupport": true }
555
+ }
556
+ },
557
+ yamlls: {
558
+ "command": "yaml-language-server",
559
+ "args": ["--stdio"],
560
+ "fileTypes": [".yaml", ".yml"],
561
+ "rootMarkers": [".git"],
562
+ "settings": {
563
+ "yaml": {
564
+ "validate": true,
565
+ "format": { "enable": true },
566
+ "hover": true,
567
+ "completion": true
568
+ },
569
+ "redhat": { "telemetry": { "enabled": false } }
570
+ }
571
+ },
572
+ terraformls: {
573
+ "command": "terraform-ls",
574
+ "args": ["serve"],
575
+ "fileTypes": [".tf", ".tfvars"],
576
+ "rootMarkers": [
577
+ ".terraform",
578
+ "terraform.tfstate",
579
+ "*.tf"
580
+ ]
581
+ },
582
+ dockerls: {
583
+ "command": "docker-langserver",
584
+ "args": ["--stdio"],
585
+ "fileTypes": [".dockerfile", "Dockerfile"],
586
+ "rootMarkers": [
587
+ "Dockerfile",
588
+ "docker-compose.yml",
589
+ "docker-compose.yaml",
590
+ ".dockerignore"
591
+ ]
592
+ },
593
+ "helm-ls": {
594
+ "command": "helm_ls",
595
+ "args": ["serve"],
596
+ "fileTypes": [
597
+ ".yaml",
598
+ ".yml",
599
+ ".tpl"
600
+ ],
601
+ "rootMarkers": ["Chart.yaml", "Chart.yml"]
602
+ },
603
+ nixd: {
604
+ "command": "nixd",
605
+ "args": [],
606
+ "fileTypes": [".nix"],
607
+ "rootMarkers": [
608
+ "flake.nix",
609
+ "default.nix",
610
+ "shell.nix"
611
+ ]
612
+ },
613
+ nil: {
614
+ "command": "nil",
615
+ "args": [],
616
+ "fileTypes": [".nix"],
617
+ "rootMarkers": [
618
+ "flake.nix",
619
+ "default.nix",
620
+ "shell.nix"
621
+ ]
622
+ },
623
+ ols: {
624
+ "command": "ols",
625
+ "args": [],
626
+ "fileTypes": [".odin"],
627
+ "rootMarkers": ["ols.json", ".git"]
628
+ },
629
+ dartls: {
630
+ "command": "dart",
631
+ "args": ["language-server", "--protocol=lsp"],
632
+ "fileTypes": [".dart"],
633
+ "rootMarkers": ["pubspec.yaml", "pubspec.lock"],
634
+ "initOptions": {
635
+ "closingLabels": true,
636
+ "flutterOutline": true,
637
+ "outline": true
638
+ }
639
+ },
640
+ marksman: {
641
+ "command": "marksman",
642
+ "args": ["server"],
643
+ "fileTypes": [".md", ".markdown"],
644
+ "rootMarkers": [".marksman.toml", ".git"],
645
+ "warmupTimeoutMs": 2e3
646
+ },
647
+ texlab: {
648
+ "command": "texlab",
649
+ "args": [],
650
+ "fileTypes": [
651
+ ".tex",
652
+ ".bib",
653
+ ".sty",
654
+ ".cls"
655
+ ],
656
+ "rootMarkers": [
657
+ ".latexmkrc",
658
+ "latexmkrc",
659
+ ".texlabroot",
660
+ "texlabroot",
661
+ "Tectonic.toml"
662
+ ],
663
+ "settings": { "texlab": {
664
+ "build": {
665
+ "executable": "latexmk",
666
+ "args": [
667
+ "-pdf",
668
+ "-interaction=nonstopmode",
669
+ "-synctex=1",
670
+ "%f"
671
+ ]
672
+ },
673
+ "chktex": { "onOpenAndSave": true }
674
+ } }
675
+ },
676
+ graphql: {
677
+ "command": "graphql-lsp",
678
+ "args": [
679
+ "server",
680
+ "-m",
681
+ "stream"
682
+ ],
683
+ "fileTypes": [".graphql", ".gql"],
684
+ "rootMarkers": [
685
+ ".graphqlrc",
686
+ ".graphqlrc.json",
687
+ ".graphqlrc.yml",
688
+ ".graphqlrc.yaml",
689
+ "graphql.config.js"
690
+ ]
691
+ },
692
+ prismals: {
693
+ "command": "prisma-language-server",
694
+ "args": ["--stdio"],
695
+ "fileTypes": [".prisma"],
696
+ "rootMarkers": ["schema.prisma", "prisma/schema.prisma"]
697
+ },
698
+ vimls: {
699
+ "command": "vim-language-server",
700
+ "args": ["--stdio"],
701
+ "fileTypes": [".vim", ".vimrc"],
702
+ "rootMarkers": [".git"],
703
+ "initOptions": {
704
+ "isNeovim": true,
705
+ "diagnostic": { "enable": true }
706
+ }
707
+ },
708
+ "emmet-language-server": {
709
+ "command": "emmet-language-server",
710
+ "args": ["--stdio"],
711
+ "fileTypes": [
712
+ ".html",
713
+ ".css",
714
+ ".scss",
715
+ ".less",
716
+ ".jsx",
717
+ ".tsx",
718
+ ".vue",
719
+ ".svelte"
720
+ ],
721
+ "rootMarkers": [".git"]
722
+ },
723
+ "sourcekit-lsp": {
724
+ "command": "sourcekit-lsp",
725
+ "args": [],
726
+ "fileTypes": [".swift"],
727
+ "rootMarkers": [
728
+ "Package.swift",
729
+ "*.xcodeproj",
730
+ "*.xcworkspace",
731
+ "project.yml",
732
+ ".swiftpm"
733
+ ]
734
+ },
735
+ swiftlint: {
736
+ "command": "swiftlint",
737
+ "args": [
738
+ "lint",
739
+ "--quiet",
740
+ "--reporter",
741
+ "json"
742
+ ],
743
+ "fileTypes": [".swift"],
744
+ "rootMarkers": [
745
+ ".swiftlint.yml",
746
+ ".swiftlint.yaml",
747
+ "Package.swift",
748
+ "*.xcodeproj"
749
+ ],
750
+ "isLinter": true
751
+ }
752
+ };
753
+
754
+ //#endregion
755
+ //#region src/devices/lsp/lsp-server-registry.ts
756
+ /** The verbatim upstream registry (54 servers), keyed by server name. */
757
+ const REGISTRY = defaults_default;
758
+ /** Server names in registry (insertion) order — deterministic selection. */
759
+ const REGISTRY_NAMES = Object.keys(REGISTRY);
760
+ /** Cache resolved-command probes: command → absolute path or null (missing). */
761
+ const commandProbeCache = /* @__PURE__ */ new Map();
762
+ /**
763
+ * Find servers whose `fileTypes` cover `filePath` (upstream getServersForFile,
764
+ * extension match plus the basename entries defaults.json uses for Dockerfiles).
765
+ */
766
+ function serversForFile(filePath) {
767
+ const lower = filePath.toLowerCase();
768
+ const baseName = path.posix.basename(lower.replaceAll("\\", "/"));
769
+ const extension = path.extname(lower);
770
+ const matches = [];
771
+ for (const name of REGISTRY_NAMES) {
772
+ const config = REGISTRY[name];
773
+ if (config === void 0) continue;
774
+ if (config.fileTypes.some((fileType) => fileType === extension || fileType !== "" && !fileType.startsWith(".") && fileType === baseName)) matches.push([name, config]);
775
+ }
776
+ return matches;
777
+ }
778
+ /**
779
+ * The primary server for a file: first non-linter match in registry order,
780
+ * falling back to the first linter (upstream getServerForFile preference —
781
+ * type intelligence over linting).
782
+ */
783
+ function primaryServerForFile(filePath) {
784
+ const matches = serversForFile(filePath);
785
+ return matches.find(([, config]) => config.isLinter !== true) ?? matches[0] ?? null;
786
+ }
787
+ /** Look up a named registry entry (device `server` arg). */
788
+ function serverByName(name) {
789
+ return REGISTRY[name];
790
+ }
791
+ /** One-level wildcard marker match: `*` crosses everything but `/` (upstream glob markers). */
792
+ function markerMatchesEntry(marker, entry) {
793
+ const star = marker.indexOf("*");
794
+ if (star === -1) return marker === entry;
795
+ const prefix = marker.slice(0, star);
796
+ const suffix = marker.slice(star + 1);
797
+ return entry.length >= prefix.length + suffix.length && entry.startsWith(prefix) && entry.endsWith(suffix) && !entry.slice(prefix.length, entry.length - suffix.length).includes("/");
798
+ }
799
+ /** Whether any root marker exists directly in `dir` (upstream hasRootMarkers). */
800
+ function hasRootMarkers(dir, markers) {
801
+ let entries = null;
802
+ for (const marker of markers) {
803
+ if (marker.includes("*")) {
804
+ if (entries === null) try {
805
+ entries = readdirSync(dir);
806
+ } catch {
807
+ return false;
808
+ }
809
+ if (entries.some((entry) => markerMatchesEntry(marker, entry))) return true;
810
+ continue;
811
+ }
812
+ if (existsSync(path.join(dir, marker))) return true;
813
+ }
814
+ return false;
815
+ }
816
+ /**
817
+ * Nearest ancestor of `filePath` holding a root marker, stopping at the
818
+ * filesystem root; `null` when no ancestor matches (upstream
819
+ * hasRootMarkerAncestor walk, returning the dir instead of a boolean).
820
+ */
821
+ function findWorkspaceRoot(filePath, markers) {
822
+ if (markers.length === 0) return null;
823
+ let dir = path.dirname(path.resolve(filePath));
824
+ for (;;) {
825
+ if (hasRootMarkers(dir, markers)) return dir;
826
+ const parent = path.dirname(dir);
827
+ if (parent === dir) return null;
828
+ dir = parent;
829
+ }
830
+ }
831
+ function isExecutableFile(candidate) {
832
+ try {
833
+ accessSync(candidate, constants.X_OK);
834
+ return true;
835
+ } catch {
836
+ return false;
837
+ }
838
+ }
839
+ /**
840
+ * Resolve `command` to an absolute executable: the project's
841
+ * `node_modules/.bin`, then every `$PATH` directory (upstream
842
+ * resolveCommandFromLocalRoot + PATH scan). Absolute overrides (device
843
+ * `command` args, fake-server fixtures) are probed directly. Result cached
844
+ * per command; returns `null` when the binary is missing.
845
+ */
846
+ function resolveCommandPath(command, cwd) {
847
+ const cacheKey = `${command}\0${cwd}`;
848
+ const cached = commandProbeCache.get(cacheKey);
849
+ if (cached !== void 0) return cached;
850
+ const resolved = (path.isAbsolute(command) ? [command] : [path.join(cwd, "node_modules", ".bin", command), ...(process.env.PATH ?? "").split(path.delimiter).filter((dir) => dir !== "").map((dir) => path.join(dir, command))]).find((candidate) => isExecutableFile(candidate)) ?? null;
851
+ commandProbeCache.set(cacheKey, resolved);
852
+ return resolved;
853
+ }
854
+ /** Per-command install hints for the common servers (device-side aid; upstream only names the command). */
855
+ const INSTALL_HINTS = {
856
+ "typescript-language-server": "npm install -g typescript-language-server typescript",
857
+ "vscode-eslint-language-server": "npm install -g vscode-languageserver-types eslint vscode-eslint-language-server",
858
+ "pyright-langserver": "npm install -g pyright",
859
+ pylsp: "pip install \"python-lsp-server[all]\"",
860
+ gopls: "go install golang.org/x/tools/gopls@latest",
861
+ "rust-analyzer": "rustup component add rust-analyzer",
862
+ clangd: "apt install clangd (or brew install llvm)",
863
+ biome: "npm install -g @biomejs/biome",
864
+ ruff: "pip install ruff",
865
+ "bash-language-server": "npm install -g bash-language-server",
866
+ "lua-language-server": "install from https://github.com/LuaLS/lua-language-server/releases",
867
+ marksman: "install from https://github.com/artempyanykh/marksman/releases"
868
+ };
869
+ /** Real installer commands (stage 5): only package-manager installables. */
870
+ const INSTALL_COMMANDS = {
871
+ "typescript-language-server": [
872
+ "npm",
873
+ "install",
874
+ "-g",
875
+ "typescript-language-server",
876
+ "typescript"
877
+ ],
878
+ "pyright-langserver": [
879
+ "npm",
880
+ "install",
881
+ "-g",
882
+ "pyright"
883
+ ],
884
+ pylsp: [
885
+ "pip",
886
+ "install",
887
+ "python-lsp-server[all]"
888
+ ],
889
+ ruff: [
890
+ "pip",
891
+ "install",
892
+ "ruff"
893
+ ],
894
+ gopls: [
895
+ "go",
896
+ "install",
897
+ "golang.org/x/tools/gopls@latest"
898
+ ],
899
+ "rust-analyzer": [
900
+ "rustup",
901
+ "component",
902
+ "add",
903
+ "rust-analyzer"
904
+ ],
905
+ biome: [
906
+ "npm",
907
+ "install",
908
+ "-g",
909
+ "@biomejs/biome"
910
+ ],
911
+ "bash-language-server": [
912
+ "npm",
913
+ "install",
914
+ "-g",
915
+ "bash-language-server"
916
+ ]
917
+ };
918
+ /**
919
+ * Run the server's package-manager install, fail-soft (stage 5). A missing
920
+ * installer tool or a non-zero exit resolves false — never throws; the
921
+ * caller keeps its structured LSP_SERVER_MISSING path either way.
922
+ */
923
+ async function installServer(command, timeoutMs = 3e5) {
924
+ const argv = INSTALL_COMMANDS[command];
925
+ if (argv === void 0) return false;
926
+ try {
927
+ const { execFile } = await import("node:child_process");
928
+ return await new Promise((resolve$1) => {
929
+ execFile(argv[0] ?? command, argv.slice(1), { timeout: timeoutMs }, (error) => resolve$1(error === null || error === void 0));
930
+ });
931
+ } catch {
932
+ return false;
933
+ }
934
+ }
935
+ /** Install hint for a missing server binary; generic fallback otherwise. */
936
+ function installHintFor(command) {
937
+ const hint = INSTALL_HINTS[command];
938
+ if (hint !== void 0) return hint;
939
+ return `install the "${command}" language server and make sure it is on $PATH`;
940
+ }
941
+
942
+ //#endregion
943
+ export { resolveCommandPath as a, primaryServerForFile as i, installHintFor as n, serverByName as o, installServer as r, serversForFile as s, findWorkspaceRoot as t };