@hydranium/core 1.0.0-next.33 → 1.0.0-next.331

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 (769) hide show
  1. package/README.md +78 -82
  2. package/lib/browser/host-heads-in-worker.d.ts +77 -0
  3. package/lib/browser/host-heads-in-worker.d.ts.map +1 -0
  4. package/lib/browser/host-heads-in-worker.js +169 -0
  5. package/lib/browser/host-heads-in-worker.js.map +1 -0
  6. package/lib/browser/index.d.ts +12 -0
  7. package/lib/browser/index.d.ts.map +1 -0
  8. package/lib/browser/index.js +17 -0
  9. package/lib/browser/index.js.map +1 -0
  10. package/lib/browser/indexeddb-file-system-store.d.ts +82 -0
  11. package/lib/browser/indexeddb-file-system-store.d.ts.map +1 -0
  12. package/lib/browser/indexeddb-file-system-store.js +181 -0
  13. package/lib/browser/indexeddb-file-system-store.js.map +1 -0
  14. package/lib/browser/start-language-server-in-worker.d.ts +32 -0
  15. package/lib/browser/start-language-server-in-worker.d.ts.map +1 -0
  16. package/lib/browser/start-language-server-in-worker.js +40 -0
  17. package/lib/browser/start-language-server-in-worker.js.map +1 -0
  18. package/lib/documents/ast-document-manager.d.ts +256 -124
  19. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  20. package/lib/documents/ast-document-manager.js +293 -132
  21. package/lib/documents/ast-document-manager.js.map +1 -1
  22. package/lib/documents/client-ids.d.ts +5 -19
  23. package/lib/documents/client-ids.d.ts.map +1 -1
  24. package/lib/documents/client-ids.js +5 -19
  25. package/lib/documents/client-ids.js.map +1 -1
  26. package/lib/documents/client-session-errors.d.ts +15 -0
  27. package/lib/documents/client-session-errors.d.ts.map +1 -0
  28. package/lib/documents/client-session-errors.js +15 -0
  29. package/lib/documents/client-session-errors.js.map +1 -0
  30. package/lib/documents/client-session-registry.d.ts +146 -0
  31. package/lib/documents/client-session-registry.d.ts.map +1 -0
  32. package/lib/documents/client-session-registry.js +207 -0
  33. package/lib/documents/client-session-registry.js.map +1 -0
  34. package/lib/documents/dirty-state-tracker.d.ts +101 -0
  35. package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
  36. package/lib/documents/dirty-state-tracker.js +85 -0
  37. package/lib/documents/dirty-state-tracker.js.map +1 -0
  38. package/lib/documents/document-release-handler.d.ts +204 -0
  39. package/lib/documents/document-release-handler.d.ts.map +1 -0
  40. package/lib/documents/document-release-handler.js +317 -0
  41. package/lib/documents/document-release-handler.js.map +1 -0
  42. package/lib/documents/document-release-scheduler.d.ts +67 -0
  43. package/lib/documents/document-release-scheduler.d.ts.map +1 -0
  44. package/lib/documents/document-release-scheduler.js +80 -0
  45. package/lib/documents/document-release-scheduler.js.map +1 -0
  46. package/lib/documents/file-system-task-queue.d.ts +52 -0
  47. package/lib/documents/file-system-task-queue.d.ts.map +1 -0
  48. package/lib/documents/file-system-task-queue.js +37 -0
  49. package/lib/documents/file-system-task-queue.js.map +1 -0
  50. package/lib/documents/hydranium-text-documents.d.ts +445 -282
  51. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  52. package/lib/documents/hydranium-text-documents.js +903 -483
  53. package/lib/documents/hydranium-text-documents.js.map +1 -1
  54. package/lib/documents/index.d.ts +10 -2
  55. package/lib/documents/index.d.ts.map +1 -1
  56. package/lib/documents/index.js +10 -2
  57. package/lib/documents/index.js.map +1 -1
  58. package/lib/documents/language-client-shadow.d.ts +234 -0
  59. package/lib/documents/language-client-shadow.d.ts.map +1 -0
  60. package/lib/documents/language-client-shadow.js +306 -0
  61. package/lib/documents/language-client-shadow.js.map +1 -0
  62. package/lib/documents/model-ledger.d.ts +47 -0
  63. package/lib/documents/model-ledger.d.ts.map +1 -0
  64. package/lib/documents/model-ledger.js +30 -0
  65. package/lib/documents/model-ledger.js.map +1 -0
  66. package/lib/documents/text-ledger.d.ts +64 -0
  67. package/lib/documents/text-ledger.d.ts.map +1 -0
  68. package/lib/documents/text-ledger.js +63 -0
  69. package/lib/documents/text-ledger.js.map +1 -0
  70. package/lib/documents/version-sync-service.d.ts +138 -0
  71. package/lib/documents/version-sync-service.d.ts.map +1 -0
  72. package/lib/documents/version-sync-service.js +173 -0
  73. package/lib/documents/version-sync-service.js.map +1 -0
  74. package/lib/index.d.ts +4 -0
  75. package/lib/index.d.ts.map +1 -1
  76. package/lib/index.js +7 -0
  77. package/lib/index.js.map +1 -1
  78. package/lib/langium/ast-extension/ast-extension-service.d.ts +42 -31
  79. package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
  80. package/lib/langium/ast-extension/ast-extension-service.js +45 -19
  81. package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
  82. package/lib/langium/ast-extension/ast-node-builder.d.ts +12 -7
  83. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  84. package/lib/langium/ast-extension/ast-node-builder.js +25 -9
  85. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  86. package/lib/langium/bootstrap.d.ts +49 -36
  87. package/lib/langium/bootstrap.d.ts.map +1 -1
  88. package/lib/langium/bootstrap.js +83 -44
  89. package/lib/langium/bootstrap.js.map +1 -1
  90. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +9 -9
  91. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
  92. package/lib/langium/build-phase-pass/build-phase-pass-service.js +25 -16
  93. package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
  94. package/lib/langium/build-phase-pass/build-phase-pass.d.ts +20 -8
  95. package/lib/langium/build-phase-pass/build-phase-pass.d.ts.map +1 -1
  96. package/lib/langium/build-phase-pass/build-phase-pass.js +20 -0
  97. package/lib/langium/build-phase-pass/build-phase-pass.js.map +1 -1
  98. package/lib/langium/composite-ast-reflection.d.ts +46 -0
  99. package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
  100. package/lib/langium/composite-ast-reflection.js +97 -0
  101. package/lib/langium/composite-ast-reflection.js.map +1 -0
  102. package/lib/langium/config/configuration-provider.d.ts +81 -0
  103. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  104. package/lib/langium/config/configuration-provider.js +112 -0
  105. package/lib/langium/config/configuration-provider.js.map +1 -0
  106. package/lib/langium/config/index.d.ts +1 -0
  107. package/lib/langium/config/index.d.ts.map +1 -1
  108. package/lib/langium/config/index.js +1 -0
  109. package/lib/langium/config/index.js.map +1 -1
  110. package/lib/langium/config/settings.js.map +1 -1
  111. package/lib/langium/diagnostics/console-tee.d.ts +27 -0
  112. package/lib/langium/diagnostics/console-tee.d.ts.map +1 -0
  113. package/lib/langium/diagnostics/console-tee.js +142 -0
  114. package/lib/langium/diagnostics/console-tee.js.map +1 -0
  115. package/lib/langium/diagnostics/format-log-arg.d.ts +18 -0
  116. package/lib/langium/diagnostics/format-log-arg.d.ts.map +1 -0
  117. package/lib/langium/diagnostics/format-log-arg.js +36 -0
  118. package/lib/langium/diagnostics/format-log-arg.js.map +1 -0
  119. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +9 -20
  120. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
  121. package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
  122. package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
  123. package/lib/langium/diagnostics/log-preamble.js +1 -1
  124. package/lib/langium/diagnostics/log-preamble.js.map +1 -1
  125. package/lib/langium/diagnostics/logger.d.ts +25 -6
  126. package/lib/langium/diagnostics/logger.d.ts.map +1 -1
  127. package/lib/langium/diagnostics/logger.js +49 -17
  128. package/lib/langium/diagnostics/logger.js.map +1 -1
  129. package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
  130. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  131. package/lib/langium/diagnostics/lsp-logger.js +68 -45
  132. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  133. package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
  134. package/lib/langium/diagnostics/server-tracer.js.map +1 -1
  135. package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
  136. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  137. package/lib/langium/document-builder/build-pipeline-integration.js +28 -30
  138. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  139. package/lib/langium/document-builder/build-session.d.ts +6 -5
  140. package/lib/langium/document-builder/build-session.d.ts.map +1 -1
  141. package/lib/langium/document-builder/build-session.js +5 -5
  142. package/lib/langium/document-builder/build-session.js.map +1 -1
  143. package/lib/langium/document-builder/document-builder.d.ts +283 -41
  144. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  145. package/lib/langium/document-builder/document-builder.js +448 -78
  146. package/lib/langium/document-builder/document-builder.js.map +1 -1
  147. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  148. package/lib/langium/documentation/comment-provider.js.map +1 -1
  149. package/lib/langium/integration-services.d.ts +40 -24
  150. package/lib/langium/integration-services.d.ts.map +1 -1
  151. package/lib/langium/integration-services.js +7 -4
  152. package/lib/langium/integration-services.js.map +1 -1
  153. package/lib/langium/integrity/integrity-rule.d.ts +17 -8
  154. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  155. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  156. package/lib/langium/integrity/integrity-service.d.ts +95 -27
  157. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  158. package/lib/langium/integrity/integrity-service.js +303 -63
  159. package/lib/langium/integrity/integrity-service.js.map +1 -1
  160. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  161. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  162. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  163. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  164. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  165. package/lib/langium/labeling/label-provider.js.map +1 -1
  166. package/lib/langium/language-module.d.ts +30 -5
  167. package/lib/langium/language-module.d.ts.map +1 -1
  168. package/lib/langium/language-module.js +18 -4
  169. package/lib/langium/language-module.js.map +1 -1
  170. package/lib/langium/model-service/client-session.d.ts +383 -0
  171. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  172. package/lib/langium/model-service/client-session.js +455 -0
  173. package/lib/langium/model-service/client-session.js.map +1 -0
  174. package/lib/langium/model-service/index.d.ts +2 -0
  175. package/lib/langium/model-service/index.d.ts.map +1 -1
  176. package/lib/langium/model-service/index.js +2 -0
  177. package/lib/langium/model-service/index.js.map +1 -1
  178. package/lib/langium/model-service/model-events.d.ts +66 -0
  179. package/lib/langium/model-service/model-events.d.ts.map +1 -0
  180. package/lib/langium/model-service/model-events.js +10 -0
  181. package/lib/langium/model-service/model-events.js.map +1 -0
  182. package/lib/langium/model-service/model-service.d.ts +456 -300
  183. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  184. package/lib/langium/model-service/model-service.js +571 -466
  185. package/lib/langium/model-service/model-service.js.map +1 -1
  186. package/lib/langium/module.d.ts +141 -40
  187. package/lib/langium/module.d.ts.map +1 -1
  188. package/lib/langium/module.js +52 -40
  189. package/lib/langium/module.js.map +1 -1
  190. package/lib/langium/naming/name-provider.d.ts +32 -7
  191. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  192. package/lib/langium/naming/name-provider.js +10 -4
  193. package/lib/langium/naming/name-provider.js.map +1 -1
  194. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  195. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  196. package/lib/langium/project/abstract-project-manager.js +13 -6
  197. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  198. package/lib/langium/project/project-change-event.d.ts +2 -2
  199. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  200. package/lib/langium/project/single-project-manager.js.map +1 -1
  201. package/lib/langium/residency/cst-residency-service.d.ts +38 -14
  202. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  203. package/lib/langium/residency/cst-residency-service.js +24 -58
  204. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  205. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  206. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  207. package/lib/langium/scope/fallback-scope.d.ts +27 -0
  208. package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
  209. package/lib/langium/scope/fallback-scope.js +35 -0
  210. package/lib/langium/scope/fallback-scope.js.map +1 -0
  211. package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
  212. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  213. package/lib/langium/scope/hydranium-scope-computation.js +38 -39
  214. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  215. package/lib/langium/scope/hydranium-scope-provider.d.ts +29 -11
  216. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  217. package/lib/langium/scope/hydranium-scope-provider.js +37 -15
  218. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  219. package/lib/langium/scope/index.d.ts +1 -0
  220. package/lib/langium/scope/index.d.ts.map +1 -1
  221. package/lib/langium/scope/index.js +1 -0
  222. package/lib/langium/scope/index.js.map +1 -1
  223. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  224. package/lib/langium/scope/reference-builder.js.map +1 -1
  225. package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
  226. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  227. package/lib/langium/scope/reference-candidate-provider.js +3 -2
  228. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  229. package/lib/langium/scope/scope-extension-service.d.ts +41 -37
  230. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  231. package/lib/langium/scope/scope-extension-service.js +57 -29
  232. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  233. package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
  234. package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
  235. package/lib/langium/scope/scoped-ast-node-description.js +1 -3
  236. package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
  237. package/lib/langium/serialization/abstract-serializer.d.ts +38 -27
  238. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  239. package/lib/langium/serialization/abstract-serializer.js +54 -30
  240. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  241. package/lib/langium/serialization/json-serializer.d.ts +8 -1
  242. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  243. package/lib/langium/serialization/json-serializer.js +13 -3
  244. package/lib/langium/serialization/json-serializer.js.map +1 -1
  245. package/lib/langium/serialization/serializer.d.ts +1 -1
  246. package/lib/langium/serialization/yaml-serializer.d.ts +4 -0
  247. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  248. package/lib/langium/serialization/yaml-serializer.js +4 -0
  249. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  250. package/lib/langium/service-registry.d.ts +29 -1
  251. package/lib/langium/service-registry.d.ts.map +1 -1
  252. package/lib/langium/service-registry.js +37 -0
  253. package/lib/langium/service-registry.js.map +1 -1
  254. package/lib/langium/shared-services.d.ts +13 -7
  255. package/lib/langium/shared-services.d.ts.map +1 -1
  256. package/lib/langium/shared-services.js.map +1 -1
  257. package/lib/langium/single-langium-copy.d.ts +22 -0
  258. package/lib/langium/single-langium-copy.d.ts.map +1 -0
  259. package/lib/langium/single-langium-copy.js +36 -0
  260. package/lib/langium/single-langium-copy.js.map +1 -0
  261. package/lib/langium/transfer/transfer-encoder.d.ts +86 -37
  262. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  263. package/lib/langium/transfer/transfer-encoder.js +36 -25
  264. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  265. package/lib/langium/trivia/comment-preserver.d.ts +471 -0
  266. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  267. package/lib/langium/trivia/comment-preserver.js +1026 -0
  268. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  269. package/lib/langium/trivia/document-ending-preserver.d.ts +51 -0
  270. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  271. package/lib/langium/trivia/document-ending-preserver.js +62 -0
  272. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  273. package/lib/langium/trivia/index.d.ts +14 -0
  274. package/lib/langium/trivia/index.d.ts.map +1 -0
  275. package/lib/langium/trivia/index.js +14 -0
  276. package/lib/langium/trivia/index.js.map +1 -0
  277. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  278. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  279. package/lib/langium/trivia/trivia-contribution.js +10 -0
  280. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  281. package/lib/langium/trivia/trivia-preserver.d.ts +52 -0
  282. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  283. package/lib/langium/trivia/trivia-preserver.js +10 -0
  284. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  285. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  286. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  287. package/lib/langium/trivia/trivia-service.js +56 -0
  288. package/lib/langium/trivia/trivia-service.js.map +1 -0
  289. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  290. package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
  291. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  292. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  293. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  294. package/lib/langium/validation/document-validator.d.ts +168 -23
  295. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  296. package/lib/langium/validation/document-validator.js +263 -25
  297. package/lib/langium/validation/document-validator.js.map +1 -1
  298. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  299. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  300. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  301. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  302. package/lib/langium/workspace/document-uri-policy.d.ts +24 -15
  303. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  304. package/lib/langium/workspace/document-uri-policy.js +22 -13
  305. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  306. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  307. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  308. package/lib/langium/workspace/file-not-found.js +31 -0
  309. package/lib/langium/workspace/file-not-found.js.map +1 -0
  310. package/lib/langium/workspace/file-system-provider.d.ts +167 -8
  311. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  312. package/lib/langium/workspace/file-system-provider.js +115 -13
  313. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  314. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +31 -1
  315. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  316. package/lib/langium/workspace/hydranium-langium-document-factory.js +54 -0
  317. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  318. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
  319. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  320. package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
  321. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  322. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +103 -21
  323. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  324. package/lib/langium/workspace/hydranium-workspace-manager.js +184 -31
  325. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  326. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
  327. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  328. package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
  329. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  330. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  331. package/lib/langium/workspace/index-manager.js.map +1 -1
  332. package/lib/langium/workspace/index.d.ts +1 -0
  333. package/lib/langium/workspace/index.d.ts.map +1 -1
  334. package/lib/langium/workspace/index.js +1 -0
  335. package/lib/langium/workspace/index.js.map +1 -1
  336. package/lib/langium/workspace/initialize-workspace.d.ts +40 -3
  337. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  338. package/lib/langium/workspace/initialize-workspace.js +68 -3
  339. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  340. package/lib/langium/workspace/langium-documents.d.ts +7 -0
  341. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  342. package/lib/langium/workspace/langium-documents.js +18 -1
  343. package/lib/langium/workspace/langium-documents.js.map +1 -1
  344. package/lib/langium/workspace/persistent-file-system-provider.d.ts +16 -10
  345. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  346. package/lib/langium/workspace/persistent-file-system-provider.js +25 -13
  347. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  348. package/lib/langium/workspace/self-save-registry.d.ts +84 -0
  349. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  350. package/lib/{documents → langium/workspace}/self-save-registry.js +33 -22
  351. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  352. package/lib/langium/workspace/virtual-document.d.ts +55 -21
  353. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  354. package/lib/langium/workspace/virtual-document.js +87 -24
  355. package/lib/langium/workspace/virtual-document.js.map +1 -1
  356. package/lib/langium/workspace/write-lock-scope.d.ts +22 -10
  357. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  358. package/lib/langium/workspace/write-lock-scope.js +15 -5
  359. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  360. package/lib/launcher/integrated-server.d.ts +3 -1
  361. package/lib/launcher/integrated-server.d.ts.map +1 -1
  362. package/lib/locale/server-locale.d.ts +19 -5
  363. package/lib/locale/server-locale.d.ts.map +1 -1
  364. package/lib/locale/server-locale.js +1 -1
  365. package/lib/locale/server-locale.js.map +1 -1
  366. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  367. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  368. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  369. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  370. package/lib/lsp/connection-features.d.ts +23 -0
  371. package/lib/lsp/connection-features.d.ts.map +1 -0
  372. package/lib/lsp/connection-features.js +60 -0
  373. package/lib/lsp/connection-features.js.map +1 -0
  374. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  375. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  376. package/lib/lsp/diagnostics-connection.js +53 -0
  377. package/lib/lsp/diagnostics-connection.js.map +1 -0
  378. package/lib/lsp/hydranium-document-update-handler.d.ts +126 -82
  379. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  380. package/lib/lsp/hydranium-document-update-handler.js +235 -102
  381. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  382. package/lib/lsp/index.d.ts +4 -1
  383. package/lib/lsp/index.d.ts.map +1 -1
  384. package/lib/lsp/index.js +4 -1
  385. package/lib/lsp/index.js.map +1 -1
  386. package/lib/lsp/lsp-latency.d.ts +39 -0
  387. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  388. package/lib/lsp/lsp-latency.js +58 -0
  389. package/lib/lsp/lsp-latency.js.map +1 -0
  390. package/lib/lsp/save-text-document.d.ts +31 -0
  391. package/lib/lsp/save-text-document.d.ts.map +1 -0
  392. package/lib/lsp/save-text-document.js +52 -0
  393. package/lib/lsp/save-text-document.js.map +1 -0
  394. package/lib/lsp/semantic-token-provider.d.ts +58 -2
  395. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  396. package/lib/lsp/semantic-token-provider.js +98 -9
  397. package/lib/lsp/semantic-token-provider.js.map +1 -1
  398. package/lib/lsp/shared-module.d.ts +4 -8
  399. package/lib/lsp/shared-module.d.ts.map +1 -1
  400. package/lib/lsp/shared-module.js.map +1 -1
  401. package/lib/lsp/start-language-server.d.ts +11 -7
  402. package/lib/lsp/start-language-server.d.ts.map +1 -1
  403. package/lib/lsp/start-language-server.js +18 -7
  404. package/lib/lsp/start-language-server.js.map +1 -1
  405. package/lib/messages/carriers.d.ts +3 -5
  406. package/lib/messages/carriers.d.ts.map +1 -1
  407. package/lib/messages/carriers.js +3 -5
  408. package/lib/messages/carriers.js.map +1 -1
  409. package/lib/messages/index.d.ts +2 -2
  410. package/lib/messages/index.d.ts.map +1 -1
  411. package/lib/messages/index.js +2 -2
  412. package/lib/messages/index.js.map +1 -1
  413. package/lib/messages/renderer.d.ts +32 -7
  414. package/lib/messages/renderer.d.ts.map +1 -1
  415. package/lib/messages/renderer.js +7 -1
  416. package/lib/messages/renderer.js.map +1 -1
  417. package/lib/node/event-loop-monitor.d.ts.map +1 -1
  418. package/lib/node/event-loop-monitor.js +2 -1
  419. package/lib/node/event-loop-monitor.js.map +1 -1
  420. package/lib/node/heap-ceiling.d.ts +61 -0
  421. package/lib/node/heap-ceiling.d.ts.map +1 -0
  422. package/lib/node/heap-ceiling.js +72 -0
  423. package/lib/node/heap-ceiling.js.map +1 -0
  424. package/lib/node/index.d.ts +1 -1
  425. package/lib/node/index.d.ts.map +1 -1
  426. package/lib/node/index.js +5 -1
  427. package/lib/node/index.js.map +1 -1
  428. package/lib/node/latency-from-env.d.ts +1 -1
  429. package/lib/node/latency-from-env.js +1 -1
  430. package/lib/node/lint-grammar.js.map +1 -1
  431. package/lib/node/log-file-sink.d.ts +3 -2
  432. package/lib/node/log-file-sink.d.ts.map +1 -1
  433. package/lib/node/log-file-sink.js +6 -2
  434. package/lib/node/log-file-sink.js.map +1 -1
  435. package/lib/node/log-preamble-node.d.ts +5 -3
  436. package/lib/node/log-preamble-node.d.ts.map +1 -1
  437. package/lib/node/log-preamble-node.js +13 -10
  438. package/lib/node/log-preamble-node.js.map +1 -1
  439. package/lib/node/measure-memory.d.ts.map +1 -1
  440. package/lib/node/measure-memory.js +5 -4
  441. package/lib/node/measure-memory.js.map +1 -1
  442. package/lib/node/memory-monitor.d.ts +2 -2
  443. package/lib/node/memory-monitor.d.ts.map +1 -1
  444. package/lib/node/memory-monitor.js +9 -10
  445. package/lib/node/memory-monitor.js.map +1 -1
  446. package/lib/node/node-file-system-provider.d.ts +67 -9
  447. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  448. package/lib/node/node-file-system-provider.js +198 -53
  449. package/lib/node/node-file-system-provider.js.map +1 -1
  450. package/lib/node/profile-capture.d.ts +12 -4
  451. package/lib/node/profile-capture.d.ts.map +1 -1
  452. package/lib/node/profile-capture.js +8 -6
  453. package/lib/node/profile-capture.js.map +1 -1
  454. package/lib/node/profile-digest.js.map +1 -1
  455. package/lib/node/profiling-run.d.ts +13 -3
  456. package/lib/node/profiling-run.d.ts.map +1 -1
  457. package/lib/node/profiling-run.js +17 -8
  458. package/lib/node/profiling-run.js.map +1 -1
  459. package/lib/node/rename-over-open-readers.d.ts +61 -0
  460. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  461. package/lib/node/rename-over-open-readers.js +80 -0
  462. package/lib/node/rename-over-open-readers.js.map +1 -0
  463. package/lib/node/server-diagnostics.js +1 -1
  464. package/lib/node/server-diagnostics.js.map +1 -1
  465. package/lib/node/server-state-snapshot.js +4 -4
  466. package/lib/node/server-state-snapshot.js.map +1 -1
  467. package/lib/node/socket-launcher.d.ts +43 -7
  468. package/lib/node/socket-launcher.d.ts.map +1 -1
  469. package/lib/node/socket-launcher.js +42 -7
  470. package/lib/node/socket-launcher.js.map +1 -1
  471. package/lib/node/startup-cpu-profile.d.ts +29 -0
  472. package/lib/node/startup-cpu-profile.d.ts.map +1 -0
  473. package/lib/node/startup-cpu-profile.js +91 -0
  474. package/lib/node/startup-cpu-profile.js.map +1 -0
  475. package/lib/node/stdio-launcher.d.ts +13 -13
  476. package/lib/node/stdio-launcher.d.ts.map +1 -1
  477. package/lib/node/stdio-launcher.js +21 -11
  478. package/lib/node/stdio-launcher.js.map +1 -1
  479. package/lib/testing/document-uri-policy-conformance.js +1 -1
  480. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  481. package/lib/testing/fake-description.js.map +1 -1
  482. package/lib/testing/fake-document.d.ts +2 -1
  483. package/lib/testing/fake-document.d.ts.map +1 -1
  484. package/lib/testing/fake-document.js.map +1 -1
  485. package/lib/testing/index.d.ts +1 -1
  486. package/lib/testing/index.d.ts.map +1 -1
  487. package/lib/testing/index.js +2 -1
  488. package/lib/testing/index.js.map +1 -1
  489. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  490. package/lib/testing/langium-test-helpers.js +1 -0
  491. package/lib/testing/langium-test-helpers.js.map +1 -1
  492. package/lib/testing/make-noop-language-services.js.map +1 -1
  493. package/lib/testing/make-noop-shared-services.d.ts +4 -4
  494. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  495. package/lib/testing/make-noop-shared-services.js +4 -4
  496. package/lib/testing/make-noop-shared-services.js.map +1 -1
  497. package/lib/testing/make-test-services.d.ts +51 -20
  498. package/lib/testing/make-test-services.d.ts.map +1 -1
  499. package/lib/testing/make-test-services.js +29 -13
  500. package/lib/testing/make-test-services.js.map +1 -1
  501. package/lib/testing/make-test-tracer.d.ts +12 -0
  502. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  503. package/lib/testing/make-test-tracer.js +13 -0
  504. package/lib/testing/make-test-tracer.js.map +1 -1
  505. package/lib/testing/node/applied-edit-capture.d.ts +29 -0
  506. package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
  507. package/lib/testing/node/applied-edit-capture.js +117 -0
  508. package/lib/testing/node/applied-edit-capture.js.map +1 -0
  509. package/lib/testing/node/golden-corpus.js.map +1 -1
  510. package/lib/testing/node/index.d.ts +1 -0
  511. package/lib/testing/node/index.d.ts.map +1 -1
  512. package/lib/testing/node/index.js +1 -0
  513. package/lib/testing/node/index.js.map +1 -1
  514. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  515. package/lib/testing/node/lsp-harness.js +2 -0
  516. package/lib/testing/node/lsp-harness.js.map +1 -1
  517. package/lib/testing/node/lsp-server-connection.d.ts +21 -6
  518. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  519. package/lib/testing/node/lsp-server-connection.js +49 -106
  520. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  521. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  522. package/lib/testing/node/scratch-workspace.js +10 -5
  523. package/lib/testing/node/scratch-workspace.js.map +1 -1
  524. package/lib/testing/node/spawned-server.d.ts +30 -1
  525. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  526. package/lib/testing/node/spawned-server.js +39 -2
  527. package/lib/testing/node/spawned-server.js.map +1 -1
  528. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  529. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  530. package/lib/testing/node/unhandled-rejections.js +32 -0
  531. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  532. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  533. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  534. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  535. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  536. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  537. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  538. package/lib/testing/playwright/index.d.ts +1 -0
  539. package/lib/testing/playwright/index.d.ts.map +1 -1
  540. package/lib/testing/playwright/index.js +1 -0
  541. package/lib/testing/playwright/index.js.map +1 -1
  542. package/lib/testing/playwright/server-log-capture.d.ts +46 -16
  543. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  544. package/lib/testing/playwright/server-log-capture.js +111 -40
  545. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  546. package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
  547. package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
  548. package/lib/testing/playwright/server-log-fixture.js +25 -6
  549. package/lib/testing/playwright/server-log-fixture.js.map +1 -1
  550. package/lib/testing/playwright/server-log-region.d.ts +15 -0
  551. package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
  552. package/lib/testing/playwright/server-log-region.js +30 -0
  553. package/lib/testing/playwright/server-log-region.js.map +1 -0
  554. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  555. package/lib/testing/playwright/server-log-rename-reporter.js +4 -3
  556. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  557. package/lib/testing/run-update-pipeline.d.ts +8 -5
  558. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  559. package/lib/testing/run-update-pipeline.js.map +1 -1
  560. package/lib/testing/stub-ast-document-manager.d.ts +11 -52
  561. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  562. package/lib/testing/stub-ast-document-manager.js +31 -62
  563. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  564. package/lib/testing/stub-document-builder.d.ts +33 -11
  565. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  566. package/lib/testing/stub-document-builder.js +103 -5
  567. package/lib/testing/stub-document-builder.js.map +1 -1
  568. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  569. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  570. package/lib/testing/stub-hydranium-text-documents.js +132 -16
  571. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  572. package/lib/testing/stub-index-manager.js.map +1 -1
  573. package/lib/testing/stub-langium-documents.d.ts +3 -2
  574. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  575. package/lib/testing/stub-langium-documents.js.map +1 -1
  576. package/lib/testing/stub-model-service.d.ts +9 -8
  577. package/lib/testing/stub-model-service.d.ts.map +1 -1
  578. package/lib/testing/stub-model-service.js +6 -6
  579. package/lib/testing/stub-model-service.js.map +1 -1
  580. package/lib/testing/stub-project-manager.js.map +1 -1
  581. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  582. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  583. package/lib/testing/stub-service-registry.d.ts +1 -1
  584. package/lib/testing/stub-service-registry.js.map +1 -1
  585. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  586. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  587. package/lib/testing/stub-writable-file-system.js +2 -1
  588. package/lib/testing/stub-writable-file-system.js.map +1 -1
  589. package/lib/util/connection-liveness.d.ts +22 -6
  590. package/lib/util/connection-liveness.d.ts.map +1 -1
  591. package/lib/util/connection-liveness.js +74 -15
  592. package/lib/util/connection-liveness.js.map +1 -1
  593. package/lib/util/environment.d.ts +7 -0
  594. package/lib/util/environment.d.ts.map +1 -1
  595. package/lib/util/environment.js +15 -1
  596. package/lib/util/environment.js.map +1 -1
  597. package/lib/util/registry.d.ts.map +1 -1
  598. package/package.json +39 -58
  599. package/src/browser/host-heads-in-worker.ts +218 -0
  600. package/src/browser/index.ts +17 -0
  601. package/src/browser/indexeddb-file-system-store.ts +192 -0
  602. package/src/browser/start-language-server-in-worker.ts +56 -0
  603. package/src/documents/ast-document-manager.ts +467 -233
  604. package/src/documents/client-ids.ts +5 -22
  605. package/src/documents/client-session-errors.ts +24 -0
  606. package/src/documents/client-session-registry.ts +262 -0
  607. package/src/documents/dirty-state-tracker.ts +167 -0
  608. package/src/documents/document-release-handler.ts +404 -0
  609. package/src/documents/document-release-scheduler.ts +121 -0
  610. package/src/documents/file-system-task-queue.ts +74 -0
  611. package/src/documents/hydranium-text-documents.ts +1029 -595
  612. package/src/documents/index.ts +10 -2
  613. package/src/documents/language-client-shadow.ts +501 -0
  614. package/src/documents/model-ledger.ts +66 -0
  615. package/src/documents/text-ledger.ts +112 -0
  616. package/src/documents/version-sync-service.ts +275 -0
  617. package/src/index.ts +7 -0
  618. package/src/langium/ast-extension/ast-extension-service.ts +77 -41
  619. package/src/langium/ast-extension/ast-node-builder.ts +35 -13
  620. package/src/langium/bootstrap.ts +87 -51
  621. package/src/langium/build-phase-pass/build-phase-pass-service.ts +29 -19
  622. package/src/langium/build-phase-pass/build-phase-pass.ts +37 -8
  623. package/src/langium/composite-ast-reflection.ts +112 -0
  624. package/src/langium/config/configuration-provider.ts +119 -0
  625. package/src/langium/config/index.ts +1 -0
  626. package/src/langium/diagnostics/console-tee.ts +151 -0
  627. package/src/langium/diagnostics/format-log-arg.ts +36 -0
  628. package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
  629. package/src/langium/diagnostics/log-preamble.ts +1 -1
  630. package/src/langium/diagnostics/logger.ts +51 -17
  631. package/src/langium/diagnostics/lsp-logger.ts +70 -44
  632. package/src/langium/document-builder/build-pipeline-integration.ts +46 -32
  633. package/src/langium/document-builder/build-session.ts +4 -3
  634. package/src/langium/document-builder/document-builder.ts +553 -78
  635. package/src/langium/integration-services.ts +59 -28
  636. package/src/langium/integrity/integrity-rule.ts +17 -8
  637. package/src/langium/integrity/integrity-service.ts +332 -69
  638. package/src/langium/language-module.ts +49 -8
  639. package/src/langium/model-service/client-session.ts +718 -0
  640. package/src/langium/model-service/index.ts +2 -0
  641. package/src/langium/model-service/model-events.ts +80 -0
  642. package/src/langium/model-service/model-service.ts +878 -494
  643. package/src/langium/module.ts +195 -72
  644. package/src/langium/naming/name-provider.ts +34 -8
  645. package/src/langium/project/abstract-project-manager.ts +13 -5
  646. package/src/langium/project/project-change-event.ts +2 -2
  647. package/src/langium/residency/cst-residency-service.ts +54 -19
  648. package/src/langium/scope/fallback-scope.ts +38 -0
  649. package/src/langium/scope/hydranium-scope-computation.ts +45 -44
  650. package/src/langium/scope/hydranium-scope-provider.ts +49 -16
  651. package/src/langium/scope/index.ts +1 -0
  652. package/src/langium/scope/reference-candidate-provider.ts +6 -5
  653. package/src/langium/scope/scope-extension-service.ts +74 -59
  654. package/src/langium/scope/scoped-ast-node-description.ts +1 -3
  655. package/src/langium/serialization/abstract-serializer.ts +57 -41
  656. package/src/langium/serialization/json-serializer.ts +14 -3
  657. package/src/langium/serialization/serializer.ts +1 -1
  658. package/src/langium/serialization/yaml-serializer.ts +4 -0
  659. package/src/langium/service-registry.ts +41 -2
  660. package/src/langium/shared-services.ts +16 -7
  661. package/src/langium/single-langium-copy.ts +42 -0
  662. package/src/langium/transfer/transfer-encoder.ts +104 -47
  663. package/src/langium/trivia/comment-preserver.ts +1241 -0
  664. package/src/langium/trivia/document-ending-preserver.ts +71 -0
  665. package/src/langium/trivia/index.ts +14 -0
  666. package/src/langium/trivia/trivia-contribution.ts +39 -0
  667. package/src/langium/trivia/trivia-preserver.ts +56 -0
  668. package/src/langium/trivia/trivia-service.ts +99 -0
  669. package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
  670. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  671. package/src/langium/validation/document-validator.ts +311 -30
  672. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  673. package/src/langium/workspace/document-uri-policy.ts +32 -18
  674. package/src/langium/workspace/file-not-found.ts +35 -0
  675. package/src/langium/workspace/file-system-provider.ts +258 -16
  676. package/src/langium/workspace/hydranium-langium-document-factory.ts +83 -0
  677. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
  678. package/src/langium/workspace/hydranium-workspace-manager.ts +212 -35
  679. package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
  680. package/src/langium/workspace/index.ts +1 -0
  681. package/src/langium/workspace/initialize-workspace.ts +96 -4
  682. package/src/langium/workspace/langium-documents.ts +19 -1
  683. package/src/langium/workspace/persistent-file-system-provider.ts +27 -15
  684. package/src/langium/workspace/self-save-registry.ts +118 -0
  685. package/src/langium/workspace/virtual-document.ts +106 -25
  686. package/src/langium/workspace/write-lock-scope.ts +27 -12
  687. package/src/launcher/integrated-server.ts +3 -1
  688. package/src/locale/server-locale.ts +20 -5
  689. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  690. package/src/lsp/connection-features.ts +67 -0
  691. package/src/lsp/diagnostics-connection.ts +56 -0
  692. package/src/lsp/hydranium-document-update-handler.ts +285 -111
  693. package/src/lsp/index.ts +4 -1
  694. package/src/lsp/lsp-latency.ts +62 -0
  695. package/src/lsp/save-text-document.ts +63 -0
  696. package/src/lsp/semantic-token-provider.ts +146 -8
  697. package/src/lsp/shared-module.ts +4 -8
  698. package/src/lsp/start-language-server.ts +18 -7
  699. package/src/messages/carriers.ts +3 -5
  700. package/src/messages/index.ts +11 -2
  701. package/src/messages/renderer.ts +34 -6
  702. package/src/node/event-loop-monitor.ts +2 -1
  703. package/src/node/heap-ceiling.ts +108 -0
  704. package/src/node/index.ts +5 -1
  705. package/src/node/latency-from-env.ts +1 -1
  706. package/src/node/log-file-sink.ts +6 -2
  707. package/src/node/log-preamble-node.ts +20 -10
  708. package/src/node/measure-memory.ts +5 -4
  709. package/src/node/memory-monitor.ts +10 -10
  710. package/src/node/node-file-system-provider.ts +214 -57
  711. package/src/node/profile-capture.ts +16 -15
  712. package/src/node/profiling-run.ts +30 -8
  713. package/src/node/rename-over-open-readers.ts +94 -0
  714. package/src/node/server-diagnostics.ts +1 -1
  715. package/src/node/server-state-snapshot.ts +5 -5
  716. package/src/node/socket-launcher.ts +78 -14
  717. package/src/node/startup-cpu-profile.ts +94 -0
  718. package/src/node/stdio-launcher.ts +29 -19
  719. package/src/testing/document-uri-policy-conformance.ts +1 -1
  720. package/src/testing/fake-document.ts +2 -1
  721. package/src/testing/index.ts +2 -1
  722. package/src/testing/langium-test-helpers.ts +1 -0
  723. package/src/testing/make-noop-shared-services.ts +6 -6
  724. package/src/testing/make-test-services.ts +93 -41
  725. package/src/testing/make-test-tracer.ts +26 -0
  726. package/src/testing/node/applied-edit-capture.ts +141 -0
  727. package/src/testing/node/index.ts +1 -0
  728. package/src/testing/node/lsp-harness.ts +2 -0
  729. package/src/testing/node/lsp-server-connection.ts +83 -119
  730. package/src/testing/node/scratch-workspace.ts +10 -5
  731. package/src/testing/node/spawned-server.ts +57 -3
  732. package/src/testing/node/unhandled-rejections.ts +31 -0
  733. package/src/testing/parse-semantic-root.ts +1 -1
  734. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  735. package/src/testing/playwright/index.ts +1 -0
  736. package/src/testing/playwright/server-log-capture.ts +137 -47
  737. package/src/testing/playwright/server-log-fixture.ts +46 -6
  738. package/src/testing/playwright/server-log-region.ts +32 -0
  739. package/src/testing/playwright/server-log-rename-reporter.ts +4 -3
  740. package/src/testing/run-update-pipeline.ts +8 -5
  741. package/src/testing/stub-ast-document-manager.ts +47 -128
  742. package/src/testing/stub-document-builder.ts +133 -18
  743. package/src/testing/stub-hydranium-text-documents.ts +184 -27
  744. package/src/testing/stub-langium-documents.ts +3 -2
  745. package/src/testing/stub-model-service.ts +11 -10
  746. package/src/testing/stub-self-save-registry.ts +1 -1
  747. package/src/testing/stub-service-registry.ts +1 -1
  748. package/src/testing/stub-writable-file-system.ts +3 -2
  749. package/src/util/connection-liveness.ts +80 -15
  750. package/src/util/environment.ts +24 -2
  751. package/lib/documents/language-client-text-shadow.d.ts +0 -101
  752. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  753. package/lib/documents/language-client-text-shadow.js +0 -156
  754. package/lib/documents/language-client-text-shadow.js.map +0 -1
  755. package/lib/documents/self-save-registry.d.ts +0 -55
  756. package/lib/documents/self-save-registry.d.ts.map +0 -1
  757. package/lib/documents/self-save-registry.js.map +0 -1
  758. package/lib/lsp/instrument-connection.d.ts +0 -36
  759. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  760. package/lib/lsp/instrument-connection.js +0 -62
  761. package/lib/lsp/instrument-connection.js.map +0 -1
  762. package/lib/node/process-memory.d.ts +0 -66
  763. package/lib/node/process-memory.d.ts.map +0 -1
  764. package/lib/node/process-memory.js +0 -252
  765. package/lib/node/process-memory.js.map +0 -1
  766. package/src/documents/language-client-text-shadow.ts +0 -175
  767. package/src/documents/self-save-registry.ts +0 -81
  768. package/src/lsp/instrument-connection.ts +0 -66
  769. package/src/node/process-memory.ts +0 -299
@@ -0,0 +1,62 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 CrossBreeze, EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+
10
+ import type { LatencyCollector } from '@hydranium/protocol';
11
+ import type { ConnectionOptions, Message } from 'vscode-jsonrpc';
12
+
13
+ /**
14
+ * Connection options that time every inbound LSP message into `latency` under
15
+ * its method name — the LSP analog of the data-server RPC chokepoint.
16
+ *
17
+ * Pass the result to `createConnection` where the head builds its connection:
18
+ * `createConnection(ProposedFeatures.all, lspLatencyOptions(latency))`. The
19
+ * transport is untouched, so a head keeps whatever `--stdio` / `--socket`
20
+ * selection its arguments make.
21
+ *
22
+ * **`messageStrategy` is the seam because it is the only one the handlers
23
+ * actually pass through.** `vscode-languageserver` builds its `Connection` as an
24
+ * object whose `onHover`, `onCompletion` and every other named helper register
25
+ * against the inner protocol connection captured in their closure — not against
26
+ * the returned object's own `onRequest`. Langium registers exclusively through
27
+ * those helpers, so decorating the `Connection` reaches none of them and reports
28
+ * an empty LSP half no matter how much traffic ran. `handleMessage` sits on the
29
+ * dispatch path itself, which every request and notification crosses, so it also
30
+ * catches `initialize` — special-cased into `onInitialize` and invisible to any
31
+ * `onRequest` decoration.
32
+ *
33
+ * What it measures is **dispatch plus handler**, not handler alone: the wait a
34
+ * client actually experiences, including time queued behind other work.
35
+ *
36
+ * When `latency` is `undefined` the seam is off and this returns `undefined`, so
37
+ * a head can pass the result of an env-gated factory (`latencyFromEnv()`)
38
+ * straight through and pay nothing when timing is not enabled.
39
+ */
40
+ export function lspLatencyOptions(latency: LatencyCollector | undefined): ConnectionOptions | undefined {
41
+ if (!latency) {
42
+ return undefined;
43
+ }
44
+ return {
45
+ messageStrategy: {
46
+ handleMessage: (message: Message, next: (message: Message) => void | Promise<void>) => {
47
+ // Responses to requests the SERVER sent carry no method and are not
48
+ // work this head performed; timing them would report the client's
49
+ // latency under a name this collector cannot supply.
50
+ if (!hasMethod(message)) {
51
+ return next(message);
52
+ }
53
+ return latency.time(message.method, () => next(message));
54
+ }
55
+ }
56
+ };
57
+ }
58
+
59
+ /** Narrow to the messages that name an operation — requests and notifications. */
60
+ function hasMethod(message: Message): message is Message & { method: string } {
61
+ return typeof (message as { method?: unknown }).method === 'string';
62
+ }
@@ -0,0 +1,63 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+
10
+ import { isResponseError, type SaveTextDocumentParams, SaveTextDocumentRequest } from '@hydranium/protocol';
11
+ import {
12
+ combineWorkspaceFeatures,
13
+ type Connection,
14
+ type Disposable,
15
+ type Features,
16
+ ResponseError,
17
+ type ServerCapabilities,
18
+ type WorkspaceFeature
19
+ } from 'vscode-languageserver';
20
+ import { LANGUAGE_CLIENT_ID } from '../documents/client-ids.js';
21
+ import type { ServerSharedServices } from '../langium/module.js';
22
+
23
+ /**
24
+ * Advertise {@link SaveTextDocumentRequest} in the `initialize` answer, as
25
+ * `experimental[SaveTextDocumentRequest.method]`, LSP's place for a server
26
+ * feature it does not define. Supply it where the connection is created, with
27
+ * {@link listenToSaveTextDocument} on that connection: only a host whose files
28
+ * the server holds answers the request, and a client takes the entry as the
29
+ * promise that it does.
30
+ */
31
+ export function withSaveTextDocumentCapability<T extends Features>(features: T): T {
32
+ const advertise: WorkspaceFeature<object> = Base =>
33
+ class extends Base {
34
+ override fillServerCapabilities(capabilities: ServerCapabilities): void {
35
+ super.fillServerCapabilities(capabilities);
36
+ capabilities.experimental = { ...capabilities.experimental, [SaveTextDocumentRequest.method]: true };
37
+ }
38
+ };
39
+ return { ...features, workspace: features.workspace ? combineWorkspaceFeatures(features.workspace, advertise) : advertise };
40
+ }
41
+
42
+ /**
43
+ * Answer {@link SaveTextDocumentRequest} on `connection`: persist the store's
44
+ * text once `TextDocuments.assertLanguageClientHolds` finds the editor's
45
+ * buffer holds it. The gate and the manager's taking of the text are one
46
+ * synchronous step, so no change can land between them.
47
+ *
48
+ * A refusal crosses the wire as the data head's do, its message rendered by
49
+ * `MessageRenderer` and rebuilt on the connection's copy of `vscode-jsonrpc`,
50
+ * which keeps the code only of its own copy's errors.
51
+ */
52
+ export function listenToSaveTextDocument(connection: Connection, shared: ServerSharedServices): Disposable {
53
+ return connection.onRequest(SaveTextDocumentRequest.method, async (params: SaveTextDocumentParams) => {
54
+ const { uri, version } = params.textDocument;
55
+ try {
56
+ shared.workspace.TextDocuments.assertLanguageClientHolds(uri, version);
57
+ await shared.workspace.AstDocumentManager.save(uri, LANGUAGE_CLIENT_ID);
58
+ } catch (error: unknown) {
59
+ throw isResponseError(error) ? new ResponseError(error.code, shared.MessageRenderer.renderError(error), error.data) : error;
60
+ }
61
+ return null;
62
+ });
63
+ }
@@ -14,11 +14,27 @@ import {
14
14
  CstUtils,
15
15
  GrammarAST,
16
16
  interruptAndCheck,
17
+ isLeafCstNode,
17
18
  type LangiumDocument,
19
+ type LeafCstNode,
18
20
  type ReferenceInfo
19
21
  } from '@hydranium/langium';
22
+ import { STALE_VERSION, UNRECORDED_VERSION } from '@hydranium/protocol';
20
23
  import { AbstractSemanticTokenProvider, type SemanticTokenAcceptor } from '@hydranium/langium/lsp';
21
- import { type CancellationToken, SemanticTokenModifiers, SemanticTokenTypes } from 'vscode-languageserver';
24
+ import {
25
+ type CancellationToken,
26
+ LSPErrorCodes,
27
+ ResponseError,
28
+ SemanticTokenModifiers,
29
+ type SemanticTokens,
30
+ type SemanticTokensDelta,
31
+ type SemanticTokensDeltaParams,
32
+ type SemanticTokensParams,
33
+ type SemanticTokensRangeParams,
34
+ SemanticTokenTypes
35
+ } from 'vscode-languageserver';
36
+ import { type HydraniumTextDocuments } from '../documents/hydranium-text-documents.js';
37
+ import { type ModelLedger } from '../documents/model-ledger.js';
22
38
  import { type NameProvider } from '../langium/naming/name-provider.js';
23
39
  import { type ServerLanguageServices } from '../langium/language-module.js';
24
40
 
@@ -54,6 +70,23 @@ export interface HydraniumSemanticTokenProviderOptions {
54
70
  * render in the editor's default foreground.
55
71
  */
56
72
  readonly highlightKeywords?: boolean;
73
+
74
+ /**
75
+ * Also emit a `comment` token for every comment leaf of the CST.
76
+ *
77
+ * OFF by default for the same reason as {@link highlightKeywords}, and the
78
+ * loss is larger: a TextMate grammar distinguishes `comment.line` from
79
+ * `comment.block` and scopes the delimiters separately, where a semantic
80
+ * token carries one flat `comment` that overrides all of them. It exists
81
+ * for the host that ships no client-side grammar, where a comment otherwise
82
+ * renders in the editor's default foreground.
83
+ *
84
+ * What counts as a comment is every hidden terminal the lexer retains,
85
+ * which is every hidden terminal whose pattern is not whitespace. A grammar
86
+ * whose hidden non-whitespace terminal means something other than a comment
87
+ * is miscoloured, and this option is the place to say no.
88
+ */
89
+ readonly highlightComments?: boolean;
57
90
  }
58
91
 
59
92
  /**
@@ -96,6 +129,8 @@ export abstract class AbstractHydraniumSemanticTokenProvider extends AbstractSem
96
129
  protected readonly nameProvider: NameProvider;
97
130
  protected readonly reflection: AstReflection;
98
131
  protected readonly options: HydraniumSemanticTokenProviderOptions;
132
+ protected readonly textDocuments: HydraniumTextDocuments;
133
+ protected readonly modelLedger: ModelLedger;
99
134
 
100
135
  /**
101
136
  * Modifier added to every declaration token. `declaration` is what themes
@@ -109,6 +144,61 @@ export abstract class AbstractHydraniumSemanticTokenProvider extends AbstractSem
109
144
  this.nameProvider = services.references.NameProvider;
110
145
  this.reflection = services.shared.AstReflection;
111
146
  this.options = options;
147
+ this.textDocuments = services.shared.workspace.TextDocuments;
148
+ this.modelLedger = services.shared.workspace.ModelLedger;
149
+ }
150
+
151
+ override async semanticHighlight(
152
+ document: LangiumDocument,
153
+ params: SemanticTokensParams,
154
+ cancelToken?: CancellationToken
155
+ ): Promise<SemanticTokens> {
156
+ this.assertEditorHoldsParse(document, params.textDocument.uri);
157
+ return super.semanticHighlight(document, params, cancelToken);
158
+ }
159
+
160
+ override async semanticHighlightRange(
161
+ document: LangiumDocument,
162
+ params: SemanticTokensRangeParams,
163
+ cancelToken?: CancellationToken
164
+ ): Promise<SemanticTokens> {
165
+ this.assertEditorHoldsParse(document, params.textDocument.uri);
166
+ return super.semanticHighlightRange(document, params, cancelToken);
167
+ }
168
+
169
+ override async semanticHighlightDelta(
170
+ document: LangiumDocument,
171
+ params: SemanticTokensDeltaParams,
172
+ cancelToken?: CancellationToken
173
+ ): Promise<SemanticTokens | SemanticTokensDelta> {
174
+ this.assertEditorHoldsParse(document, params.textDocument.uri);
175
+ return super.semanticHighlightDelta(document, params, cancelToken);
176
+ }
177
+
178
+ /**
179
+ * Refuse with `ContentModified` while the editor of `uri` holds text older
180
+ * than the parse the tokens are computed from, e.g. while the push of
181
+ * another client's write is still in flight. Tokens carry no text version,
182
+ * so the editor applies them to the text it holds, and Monaco rejects them
183
+ * as invalid or colours the wrong ranges. Once the push changes the
184
+ * editor's text, the editor requests the tokens again. Encoding the text
185
+ * version in `resultId` instead would require every client to compare it.
186
+ *
187
+ * An editor ahead of the parse, as after a keystroke that waits for a
188
+ * debounced build, still gets its tokens. It maps them over its own changes
189
+ * since the request, and LSP leaves a result on an older state to the
190
+ * client. The check runs before the token walk, so a refused delta request
191
+ * keeps the result named by `previousResultId` as the base of the next one.
192
+ */
193
+ protected assertEditorHoldsParse(document: LangiumDocument, uri: string): void {
194
+ const parsedFrom = this.modelLedger.versionOf(document.parseResult.value);
195
+ // Neither is a version of the store's text, so there is nothing to compare.
196
+ if (parsedFrom === UNRECORDED_VERSION || parsedFrom === STALE_VERSION) {
197
+ return;
198
+ }
199
+ if (this.textDocuments.isLanguageClientBehind(uri, parsedFrom)) {
200
+ throw new ResponseError(LSPErrorCodes.ContentModified, 'The editor does not have the parsed text yet');
201
+ }
112
202
  }
113
203
 
114
204
  /**
@@ -133,7 +223,9 @@ export abstract class AbstractHydraniumSemanticTokenProvider extends AbstractSem
133
223
  cancelToken: CancellationToken
134
224
  ): Promise<void> {
135
225
  await super.computeHighlighting(document, acceptor, cancelToken);
136
- if (this.options.highlightKeywords !== true) {
226
+ const keywords = this.options.highlightKeywords === true;
227
+ const comments = this.options.highlightComments === true;
228
+ if (!keywords && !comments) {
137
229
  return;
138
230
  }
139
231
  const root = document.parseResult.value.$cstNode;
@@ -142,14 +234,60 @@ export abstract class AbstractHydraniumSemanticTokenProvider extends AbstractSem
142
234
  }
143
235
  for (const cst of CstUtils.streamCst(root)) {
144
236
  await interruptAndCheck(cancelToken);
145
- // The grammar source is the whole filter. A keyword is always a leaf,
146
- // and the hidden leaves a comment or a run of whitespace contributes
147
- // are sourced from a terminal rule rather than a `Keyword` — so
148
- // neither a composite-node check nor a hidden-token check adds
149
- // anything here.
150
- if (GrammarAST.isKeyword(cst.grammarSource)) {
237
+ // A keyword is always a leaf with a `Keyword` grammar source, so that
238
+ // check alone separates it from everything else in the walk.
239
+ if (keywords && GrammarAST.isKeyword(cst.grammarSource)) {
151
240
  acceptor({ cst, type: SemanticTokenTypes.keyword });
152
241
  }
242
+ // A comment leaf cannot be recognised the same way — the CST builder
243
+ // adds hidden nodes from the token alone, so `grammarSource` is
244
+ // undefined, which is also why the keyword filter never matches one.
245
+ //
246
+ // `hidden` alone IS the comment test, and nothing narrower is needed:
247
+ // the token builder groups a hidden terminal as `Lexer.SKIPPED` when
248
+ // its pattern matches whitespace and as `hidden` otherwise, so the
249
+ // lexer discards whitespace before a CST node is ever built and every
250
+ // hidden leaf that survives is a comment. Classifying the terminal
251
+ // again here would be a second guard for the same property, which no
252
+ // test could then distinguish. An adopter whose token builder RETAINS
253
+ // whitespace breaks that equivalence and would colour its gaps.
254
+ if (comments && isLeafCstNode(cst) && cst.hidden) {
255
+ this.acceptComment(cst, acceptor);
256
+ }
257
+ }
258
+ }
259
+
260
+ /**
261
+ * Emit a comment as ONE TOKEN PER LINE, never as one multi-line range.
262
+ *
263
+ * A block comment is the first token this provider emits that can span
264
+ * lines, and the upstream encoder mishandles that for a client which does
265
+ * not advertise `multilineTokenSupport` — the split path computes the first
266
+ * line's length as `nextLineOffset - range.start.character - 1`, subtracting
267
+ * a COLUMN from a document OFFSET, so the length is right only for a token
268
+ * starting on line 0 and overruns its line everywhere else. No client in
269
+ * this repository advertises that capability, so the broken path is the one
270
+ * taken. Splitting here means every range handed over starts and ends on one
271
+ * line and the arithmetic is never reached.
272
+ *
273
+ * Lines come from the leaf's own text rather than from the document, so
274
+ * nothing has to re-derive where the comment ends.
275
+ */
276
+ protected acceptComment(cst: LeafCstNode, acceptor: SemanticTokenAcceptor): void {
277
+ const lines = cst.text.split('\n');
278
+ for (let index = 0; index < lines.length; index++) {
279
+ // A `\r\n` document leaves the carriage return on the line's end;
280
+ // colouring it would extend the token past the visible text.
281
+ const length = lines[index].replace(/\r$/, '').length;
282
+ const character = index === 0 ? cst.range.start.character : 0;
283
+ if (length === 0) {
284
+ continue;
285
+ }
286
+ const line = cst.range.start.line + index;
287
+ acceptor({
288
+ range: { start: { line, character }, end: { line, character: character + length } },
289
+ type: SemanticTokenTypes.comment
290
+ });
153
291
  }
154
292
  }
155
293
 
@@ -28,14 +28,10 @@ import { HydraniumDocumentUpdateHandler } from './hydranium-document-update-hand
28
28
  * (an output channel, a structured logger) override the slot after this
29
29
  * module.
30
30
  *
31
- * - {@link HydraniumDocumentUpdateHandler} wraps `didChangeWatchedFiles` to
32
- * suppress echo events for the server's own writes via the shared
33
- * `SelfSaveRegistry` slot, debounces `didChangeContent`, stamps build
34
- * reasons through `markNextReason`, and dispatches a rebuild when the last
35
- * client closes a document.
36
- * Adopters with their own update-handler subclass should extend
37
- * `HydraniumDocumentUpdateHandler` (not Langium's
38
- * `DefaultDocumentUpdateHandler`) to preserve those behaviours.
31
+ * - {@link HydraniumDocumentUpdateHandler} carries the framework's handling of
32
+ * the LSP document events. Adopters with their own update-handler subclass
33
+ * should extend it (not Langium's `DefaultDocumentUpdateHandler`) to keep
34
+ * that handling.
39
35
  *
40
36
  * **Why this is a shared slot and not a per-language one.** Langium declares
41
37
  * `DocumentUpdateHandler` in `LangiumSharedLSPServices` — there is exactly one
@@ -13,6 +13,8 @@ import {
13
13
  type ServiceRequirements
14
14
  } from '@hydranium/langium/lsp';
15
15
  import { HydraniumDocumentUpdateHandler } from './hydranium-document-update-handler.js';
16
+ import { guardDiagnosticsConnection } from './diagnostics-connection.js';
17
+ import { installConsoleTee } from '../langium/diagnostics/console-tee.js';
16
18
 
17
19
  /**
18
20
  * Fail the LSP head's start when its shared module was never composed.
@@ -21,10 +23,9 @@ import { HydraniumDocumentUpdateHandler } from './hydranium-document-update-hand
21
23
  * SHARED slot, so the head binds it in `createLspServerSharedModule` — a
22
24
  * separate module from `createLspServerLanguageModule`. An adopter who adds
23
25
  * only the language module gets a server that boots, links and serves
24
- * completion, and quietly runs Langium's `DefaultDocumentUpdateHandler`: echo
25
- * suppression for the server's own writes, the `didChangeContent` debounce,
26
- * `markNextReason` stamping and the last-client-close rebuild are all absent,
27
- * with nothing in the log to say so.
26
+ * completion, and quietly runs Langium's `DefaultDocumentUpdateHandler`: every
27
+ * behaviour `HydraniumDocumentUpdateHandler` adds, the editor save gate
28
+ * included, is absent, with nothing in the log to say so.
28
29
  *
29
30
  * The type system does not catch it. `createIntegrationServices` returns
30
31
  * `inject(...) as unknown as TShared`, so widening `TShared` with
@@ -58,11 +59,21 @@ export function assertLspHeadComposed(services: LangiumSharedServices): void {
58
59
 
59
60
  /**
60
61
  * The framework's LSP server entry point: {@link assertLspHeadComposed}, then
61
- * Langium's `startLanguageServer` unchanged. Signature-compatible with
62
- * Langium's, so it is a drop-in for adopters importing from
63
- * `@hydranium/core/lsp`.
62
+ * {@link guardDiagnosticsConnection} on the tree's connection, then the
63
+ * console's wrapping for the log file, then Langium's `startLanguageServer`.
64
+ * Signature-compatible with Langium's, so it is a drop-in for adopters
65
+ * importing from `@hydranium/core/lsp`. Calling Langium's directly skips the
66
+ * composition check, the guard without which a publish racing teardown fails
67
+ * the build that validated the document, and the wrapping, which a stdio
68
+ * connection discards where a logger was built before it (see
69
+ * `installConsoleTee`).
64
70
  */
65
71
  export function startLanguageServer(services: LangiumSharedServices, serviceRequirements: Partial<ServiceRequirements> = {}): void {
66
72
  assertLspHeadComposed(services);
73
+ const connection = services.lsp.Connection;
74
+ if (connection) {
75
+ guardDiagnosticsConnection(connection);
76
+ }
77
+ installConsoleTee();
67
78
  startLangiumLanguageServer(services, serviceRequirements);
68
79
  }
@@ -36,11 +36,9 @@ import { Diagnostic } from 'vscode-languageserver-protocol';
36
36
  * put it: an encoder projecting that payload reads `diagnostic.data`, so the
37
37
  * narrower type made the identity and the companion mutually exclusive.
38
38
  *
39
- * The identity lands in both `code` and `data.hydranium` on purpose. `code` is
40
- * what survives to the editor surface; Theia's converter drops `data` before the
41
- * squiggle, so a parameterised diagnostic falls back to the server's English
42
- * there while any adopter-owned surface can still render the parameterised form
43
- * from the marker store.
39
+ * The identity lands in both `code` and `data.hydranium` on purpose: Theia's
40
+ * converter drops `data` before the squiggle, so `code` is what survives to the
41
+ * editor surface.
44
42
  *
45
43
  * `DiagnosticInfo` must be Langium's own type: a `Parameters<ValidationAcceptor>[2]`
46
44
  * shortcut compiles but loses the `property?: Properties<N>` relation. The `data`
@@ -22,6 +22,15 @@ export * from './renderer.js';
22
22
 
23
23
  export { MODEL_UPDATE_EDIT } from '../langium/model-service/model-service.js';
24
24
  export { SEPARATOR_IN_NAME } from '../langium/naming/name-separator-validation.js';
25
- export { LEXING_ERROR, UNRESOLVED_REFERENCE } from '../langium/validation/document-validator.js';
25
+ export {
26
+ INVALID_DEDENT,
27
+ UNEXPECTED_CHARACTER,
28
+ MISSING_ITERATION,
29
+ NO_VIABLE_ALTERNATIVE,
30
+ TRAILING_INPUT,
31
+ UNEXPECTED_TOKEN,
32
+ UNPOPPABLE_LEXER_MODE,
33
+ UNRESOLVED_REFERENCE
34
+ } from '../langium/validation/document-validator.js';
26
35
  export { NO_LOADABLE_CONTENT } from '../langium/workspace/langium-documents.js';
27
- export { NO_SUCH_FILE, NO_SUCH_PATH } from '../langium/workspace/in-memory-file-system-provider.js';
36
+ export { NO_SUCH_FILE, NO_SUCH_PATH, UNSUPPORTED_DELETE, UNSUPPORTED_WRITE } from '../langium/workspace/in-memory-file-system-provider.js';
@@ -12,6 +12,8 @@ import {
12
12
  renderFrameworkMessage,
13
13
  resolve,
14
14
  resolvedFromResponseError,
15
+ type Locale,
16
+ type MessageCatalogue,
15
17
  type MessageDefinition,
16
18
  type ParamsArg,
17
19
  type ResolvedMessage,
@@ -25,8 +27,28 @@ import type { ServerSharedServicesMinimal } from '../langium/shared-services.js'
25
27
  import type { ServerLocale } from '../locale/server-locale.js';
26
28
  import { resolvedFromDiagnostic } from './carriers.js';
27
29
 
28
- /** Construction options for {@link ServerMessageRenderer}. */
29
- export type ServerMessageRendererOptions = LogNameOptions;
30
+ /** Construction options for {@link DefaultMessageRenderer}. */
31
+ export type MessageRendererOptions = LogNameOptions;
32
+
33
+ /**
34
+ * The render contract the `MessageRenderer` slot holds, implemented by
35
+ * {@link DefaultMessageRenderer}.
36
+ *
37
+ * An interface rather than the class, so the slot is compared STRUCTURALLY. A
38
+ * class-typed slot carries its `protected` members into every assignability
39
+ * check and TypeScript compares those nominally — which makes the slot
40
+ * unsatisfiable by a subclass declared against a second physical copy of this
41
+ * package, which any duplicated install produces. It also
42
+ * lets an adopter REPLACE this declaration rather than intersect with it, so
43
+ * slot resolution does not depend on the order a services type is written in.
44
+ *
45
+ * Every method carries a no-throw contract; see the implementation.
46
+ */
47
+ export interface MessageRenderer {
48
+ renderDiagnostic(diagnostic: Diagnostic): string;
49
+ renderError(error: ResponseError<unknown>): string;
50
+ renderMessage<S extends string>(message: MessageDefinition<S>, ...params: ParamsArg<S>): string;
51
+ }
30
52
 
31
53
  /**
32
54
  * Renders every user-facing message the server sends, in the locale the server
@@ -41,7 +63,7 @@ export type ServerMessageRendererOptions = LogNameOptions;
41
63
  * single `render(text)` would force an adopter to match English prose, which
42
64
  * breaks on the first Langium reword.
43
65
  */
44
- export class ServerMessageRenderer {
66
+ export class DefaultMessageRenderer implements MessageRenderer {
45
67
  protected readonly tracer: Tracer;
46
68
  protected readonly serverLocale: ServerLocale;
47
69
  /**
@@ -56,9 +78,9 @@ export class ServerMessageRenderer {
56
78
  * locale arrives once per process. A subclass whose catalogue can change
57
79
  * clears it.
58
80
  */
59
- protected readonly catalogues = new SimpleCache<string | undefined, Record<string, string> | undefined>();
81
+ protected readonly catalogues = new SimpleCache<Locale | undefined, MessageCatalogue | undefined>();
60
82
 
61
- constructor(services: ServerSharedServicesMinimal, options: ServerMessageRendererOptions = {}) {
83
+ constructor(services: ServerSharedServicesMinimal, options: MessageRendererOptions = {}) {
62
84
  this.serverLocale = services.ServerLocale;
63
85
  this.tracer = services.Tracer.for(options.logName ?? 'MessageRenderer').trace('instantiated');
64
86
  }
@@ -141,11 +163,17 @@ export class ServerMessageRenderer {
141
163
  * corollary is that a catalogue mutated in place afterwards is not seen;
142
164
  * clear {@link catalogues} to invalidate.
143
165
  *
166
+ * **An override merges its entries over the inherited answer rather than
167
+ * replacing it.** Returning only its own map shadows every entry a base
168
+ * class supplies, and a shadowed entry renders the English — byte-identical
169
+ * to a code deliberately left untranslated, so neither the render path nor a
170
+ * catalogue audit can report it.
171
+ *
144
172
  * An adopter wanting Langium's own uncoded sentences instead matches
145
173
  * `Diagnostic.data.code` from an overridden {@link renderDiagnostic}, never
146
174
  * the sentence.
147
175
  */
148
- protected translationsFor(_locale: string | undefined): Record<string, string> | undefined {
176
+ protected translationsFor(_locale: Locale | undefined): MessageCatalogue | undefined {
149
177
  return undefined;
150
178
  }
151
179
 
@@ -8,6 +8,7 @@
8
8
  ********************************************************************************/
9
9
 
10
10
  import { monitorEventLoopDelay } from 'node:perf_hooks';
11
+ import { describeErrorWithStack } from '@hydranium/protocol';
11
12
  import { formatMemory } from '../langium/diagnostics/logger.js';
12
13
  import { type ServerSharedServicesMinimal } from '../langium/shared-services.js';
13
14
  import { formatServerState } from './server-state-snapshot.js';
@@ -74,7 +75,7 @@ export function startEventLoopMonitor(shared: ServerSharedServicesMinimal, optio
74
75
  try {
75
76
  onStallSnapshot(maxMs);
76
77
  } catch (error) {
77
- logger.warn(`Stall snapshot failed: ${error instanceof Error ? error.message : String(error)}`);
78
+ logger.warn(`Stall snapshot failed: ${describeErrorWithStack(error)}`);
78
79
  }
79
80
  }
80
81
  }
@@ -0,0 +1,108 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 CrossBreeze, EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+
10
+ /*
11
+ * Choosing `--max-old-space-size` for a child process, which is a decision no
12
+ * caller gets right by picking a number.
13
+ *
14
+ * A fixed ceiling is sized for the machine the author had. Pass 8192 to a
15
+ * process under a 2 GiB cgroup limit and V8 lets old space grow past the limit
16
+ * without ever collecting hard, so the kernel OOM-kills the whole container
17
+ * before V8 has any reason to act — the parent sees a signal, not a heap error,
18
+ * and everything sharing the cgroup dies with it. Pass nothing on a large
19
+ * desktop and V8 sizes from physical RAM, which for a memory-heavy tool is well
20
+ * under what it needs.
21
+ *
22
+ * Both are the same mistake: a ceiling stated without reference to the limit
23
+ * that is actually in force. The rule here is to name the desktop default
24
+ * explicitly and step aside inside a container, where Node derives its own
25
+ * ceiling from the cgroup limit and a runaway heap therefore fails INSIDE the
26
+ * child — attributable, and reported as a heap error against one process rather
27
+ * than as a kill against every process in the cgroup.
28
+ */
29
+
30
+ import * as os from 'node:os';
31
+
32
+ /** Options for {@link heapCeilingArgs}. */
33
+ export interface HeapCeilingOptions {
34
+ /**
35
+ * Ceiling in MiB to pass when no cgroup limit is in force. Name the value a
36
+ * memory-heavy run on a workstation needs; it is ignored inside a container.
37
+ */
38
+ readonly desktopDefaultMb: number;
39
+ /**
40
+ * Caller-supplied override, typically an environment variable, and typically
41
+ * `undefined`. A finite value at or above {@link minMb} wins everywhere,
42
+ * container or not — an operator who states a number has decided. An explicit
43
+ * `0` means "let Node decide" and emits no flag. Anything unparseable is
44
+ * REPORTED through {@link warn} rather than ignored: `8G` is a natural thing
45
+ * to type into a variable measured in MiB, and silently dropping it leaves
46
+ * the operator believing a ceiling is in force.
47
+ */
48
+ readonly envValue?: string;
49
+ /**
50
+ * Smallest override to pass on. Below it, {@link warn} is called and NO flag
51
+ * is emitted: a value that small can only be a misconfiguration — GiB typed
52
+ * where MiB was meant — and V8 fatals at startup once it is small enough.
53
+ * Deliberately not clamped UP: running with a different number than the one
54
+ * configured hides the mistake instead of surfacing it. Omitted means no floor.
55
+ */
56
+ readonly minMb?: number;
57
+ /** Where a rejected override is reported. Defaults to `console.warn`. */
58
+ readonly warn?: (message: string) => void;
59
+ /** Cgroup limit in bytes; defaults to this process's. Injectable for tests. */
60
+ readonly constrained?: number;
61
+ /** Host physical memory in bytes; defaults to `os.totalmem()`. Injectable for tests. */
62
+ readonly total?: number;
63
+ }
64
+
65
+ /**
66
+ * Whether a cgroup memory limit is in force — i.e. whether the OOM killer is
67
+ * watching a ceiling lower than (or equal to) the machine's own.
68
+ *
69
+ * **`constrained > 0` is not the test, and that is the whole reason this is a
70
+ * named function.** With no limit set, cgroup v2 reports 2^64 and v1 reports
71
+ * ~2^63 rather than 0, so the naive test reads every desktop as a container.
72
+ * Neither sentinel can equal `os.totalmem()`, so comparing against the host
73
+ * total costs nothing and rules both out. The comparison is `<=` rather than
74
+ * `<` so a limit set to exactly the host's RAM still counts as a limit.
75
+ */
76
+ export function isMemoryConstrained(constrained = process.constrainedMemory?.() ?? 0, total = os.totalmem()): boolean {
77
+ return constrained > 0 && constrained <= total;
78
+ }
79
+
80
+ /**
81
+ * The `execArgv` entries that set a child's heap ceiling: `[]` to let Node size
82
+ * the heap itself, or a single `--max-old-space-size=<mb>`.
83
+ *
84
+ * Returns an array rather than a string so a caller can spread it
85
+ * unconditionally into an argv it is building.
86
+ */
87
+ export function heapCeilingArgs(options: HeapCeilingOptions): string[] {
88
+ const { desktopDefaultMb, envValue, minMb, warn = (message: string) => console.warn(message) } = options;
89
+ if (envValue !== undefined) {
90
+ const mb = Number(envValue);
91
+ // An explicit 0 is a decision — "let Node decide" — so it passes quietly.
92
+ // Anything else that is not a positive number is a typo, and the operator
93
+ // who typed it is the one person who cannot tell it was dropped.
94
+ if (!Number.isFinite(mb) || mb < 0) {
95
+ warn(`Ignoring the heap ceiling '${envValue}': expected a whole number of MiB. Node will size the heap instead.`);
96
+ return [];
97
+ }
98
+ if (mb === 0) {
99
+ return [];
100
+ }
101
+ if (minMb !== undefined && mb < minMb) {
102
+ warn(`Ignoring a heap ceiling of ${envValue} MiB: below the ${minMb} MiB minimum. Node will size the heap instead.`);
103
+ return [];
104
+ }
105
+ return [`--max-old-space-size=${Math.floor(mb)}`];
106
+ }
107
+ return isMemoryConstrained(options.constrained, options.total) ? [] : [`--max-old-space-size=${desktopDefaultMb}`];
108
+ }