@hydranium/core 1.0.0-next.28 → 1.0.0-next.280

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 (740) hide show
  1. package/README.md +64 -82
  2. package/lib/documents/ast-document-manager.d.ts +252 -122
  3. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  4. package/lib/documents/ast-document-manager.js +290 -130
  5. package/lib/documents/ast-document-manager.js.map +1 -1
  6. package/lib/documents/client-ids.d.ts +5 -19
  7. package/lib/documents/client-ids.d.ts.map +1 -1
  8. package/lib/documents/client-ids.js +5 -19
  9. package/lib/documents/client-ids.js.map +1 -1
  10. package/lib/documents/client-session-errors.d.ts +15 -0
  11. package/lib/documents/client-session-errors.d.ts.map +1 -0
  12. package/lib/documents/client-session-errors.js +15 -0
  13. package/lib/documents/client-session-errors.js.map +1 -0
  14. package/lib/documents/client-session-registry.d.ts +146 -0
  15. package/lib/documents/client-session-registry.d.ts.map +1 -0
  16. package/lib/documents/client-session-registry.js +207 -0
  17. package/lib/documents/client-session-registry.js.map +1 -0
  18. package/lib/documents/dirty-state-tracker.d.ts +101 -0
  19. package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
  20. package/lib/documents/dirty-state-tracker.js +85 -0
  21. package/lib/documents/dirty-state-tracker.js.map +1 -0
  22. package/lib/documents/document-release-handler.d.ts +204 -0
  23. package/lib/documents/document-release-handler.d.ts.map +1 -0
  24. package/lib/documents/document-release-handler.js +317 -0
  25. package/lib/documents/document-release-handler.js.map +1 -0
  26. package/lib/documents/document-release-scheduler.d.ts +67 -0
  27. package/lib/documents/document-release-scheduler.d.ts.map +1 -0
  28. package/lib/documents/document-release-scheduler.js +80 -0
  29. package/lib/documents/document-release-scheduler.js.map +1 -0
  30. package/lib/documents/file-system-task-queue.d.ts +49 -0
  31. package/lib/documents/file-system-task-queue.d.ts.map +1 -0
  32. package/lib/documents/file-system-task-queue.js +34 -0
  33. package/lib/documents/file-system-task-queue.js.map +1 -0
  34. package/lib/documents/hydranium-text-documents.d.ts +415 -282
  35. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  36. package/lib/documents/hydranium-text-documents.js +849 -483
  37. package/lib/documents/hydranium-text-documents.js.map +1 -1
  38. package/lib/documents/index.d.ts +10 -2
  39. package/lib/documents/index.d.ts.map +1 -1
  40. package/lib/documents/index.js +10 -2
  41. package/lib/documents/index.js.map +1 -1
  42. package/lib/documents/language-client-shadow.d.ts +218 -0
  43. package/lib/documents/language-client-shadow.d.ts.map +1 -0
  44. package/lib/documents/language-client-shadow.js +284 -0
  45. package/lib/documents/language-client-shadow.js.map +1 -0
  46. package/lib/documents/model-ledger.d.ts +47 -0
  47. package/lib/documents/model-ledger.d.ts.map +1 -0
  48. package/lib/documents/model-ledger.js +30 -0
  49. package/lib/documents/model-ledger.js.map +1 -0
  50. package/lib/documents/text-ledger.d.ts +64 -0
  51. package/lib/documents/text-ledger.d.ts.map +1 -0
  52. package/lib/documents/text-ledger.js +63 -0
  53. package/lib/documents/text-ledger.js.map +1 -0
  54. package/lib/documents/version-sync-service.d.ts +138 -0
  55. package/lib/documents/version-sync-service.d.ts.map +1 -0
  56. package/lib/documents/version-sync-service.js +173 -0
  57. package/lib/documents/version-sync-service.js.map +1 -0
  58. package/lib/index.d.ts +5 -0
  59. package/lib/index.d.ts.map +1 -1
  60. package/lib/index.js +8 -0
  61. package/lib/index.js.map +1 -1
  62. package/lib/langium/ast-extension/ast-extension-service.d.ts +3 -0
  63. package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
  64. package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
  65. package/lib/langium/ast-extension/ast-node-builder.d.ts +32 -9
  66. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  67. package/lib/langium/ast-extension/ast-node-builder.js +60 -22
  68. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  69. package/lib/langium/bootstrap.d.ts +49 -36
  70. package/lib/langium/bootstrap.d.ts.map +1 -1
  71. package/lib/langium/bootstrap.js +91 -45
  72. package/lib/langium/bootstrap.js.map +1 -1
  73. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +1 -1
  74. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
  75. package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
  76. package/lib/langium/build-phase-pass/build-phase-pass.d.ts +1 -1
  77. package/lib/langium/composite-ast-reflection.d.ts +46 -0
  78. package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
  79. package/lib/langium/composite-ast-reflection.js +97 -0
  80. package/lib/langium/composite-ast-reflection.js.map +1 -0
  81. package/lib/langium/config/configuration-provider.d.ts +81 -0
  82. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  83. package/lib/langium/config/configuration-provider.js +112 -0
  84. package/lib/langium/config/configuration-provider.js.map +1 -0
  85. package/lib/langium/config/index.d.ts +1 -0
  86. package/lib/langium/config/index.d.ts.map +1 -1
  87. package/lib/langium/config/index.js +1 -0
  88. package/lib/langium/config/index.js.map +1 -1
  89. package/lib/langium/config/settings.js.map +1 -1
  90. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +9 -20
  91. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
  92. package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
  93. package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
  94. package/lib/langium/diagnostics/log-preamble.js +1 -1
  95. package/lib/langium/diagnostics/log-preamble.js.map +1 -1
  96. package/lib/langium/diagnostics/logger.d.ts +10 -3
  97. package/lib/langium/diagnostics/logger.d.ts.map +1 -1
  98. package/lib/langium/diagnostics/logger.js +12 -5
  99. package/lib/langium/diagnostics/logger.js.map +1 -1
  100. package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
  101. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  102. package/lib/langium/diagnostics/lsp-logger.js +58 -17
  103. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  104. package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
  105. package/lib/langium/diagnostics/server-tracer.js.map +1 -1
  106. package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
  107. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  108. package/lib/langium/document-builder/build-pipeline-integration.js +32 -5
  109. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  110. package/lib/langium/document-builder/build-session.d.ts +6 -5
  111. package/lib/langium/document-builder/build-session.d.ts.map +1 -1
  112. package/lib/langium/document-builder/build-session.js +5 -5
  113. package/lib/langium/document-builder/build-session.js.map +1 -1
  114. package/lib/langium/document-builder/document-builder.d.ts +309 -35
  115. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  116. package/lib/langium/document-builder/document-builder.js +511 -75
  117. package/lib/langium/document-builder/document-builder.js.map +1 -1
  118. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  119. package/lib/langium/documentation/comment-provider.js.map +1 -1
  120. package/lib/langium/integration-services.d.ts +40 -24
  121. package/lib/langium/integration-services.d.ts.map +1 -1
  122. package/lib/langium/integration-services.js +7 -4
  123. package/lib/langium/integration-services.js.map +1 -1
  124. package/lib/langium/integrity/integrity-rule.d.ts +16 -8
  125. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  126. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  127. package/lib/langium/integrity/integrity-service.d.ts +83 -27
  128. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  129. package/lib/langium/integrity/integrity-service.js +273 -63
  130. package/lib/langium/integrity/integrity-service.js.map +1 -1
  131. package/lib/langium/keys/containment.d.ts +64 -0
  132. package/lib/langium/keys/containment.d.ts.map +1 -0
  133. package/lib/langium/keys/containment.js +53 -0
  134. package/lib/langium/keys/containment.js.map +1 -0
  135. package/lib/langium/keys/index.d.ts +1 -0
  136. package/lib/langium/keys/index.d.ts.map +1 -1
  137. package/lib/langium/keys/index.js +1 -0
  138. package/lib/langium/keys/index.js.map +1 -1
  139. package/lib/langium/keys/name-based-key-provider.d.ts +4 -0
  140. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  141. package/lib/langium/keys/name-based-key-provider.js +4 -0
  142. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  143. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  144. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  145. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  146. package/lib/langium/labeling/label-provider.js.map +1 -1
  147. package/lib/langium/language-module.d.ts +30 -5
  148. package/lib/langium/language-module.d.ts.map +1 -1
  149. package/lib/langium/language-module.js +18 -4
  150. package/lib/langium/language-module.js.map +1 -1
  151. package/lib/langium/model-service/client-session.d.ts +372 -0
  152. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  153. package/lib/langium/model-service/client-session.js +446 -0
  154. package/lib/langium/model-service/client-session.js.map +1 -0
  155. package/lib/langium/model-service/index.d.ts +2 -0
  156. package/lib/langium/model-service/index.d.ts.map +1 -1
  157. package/lib/langium/model-service/index.js +2 -0
  158. package/lib/langium/model-service/index.js.map +1 -1
  159. package/lib/langium/model-service/model-events.d.ts +66 -0
  160. package/lib/langium/model-service/model-events.d.ts.map +1 -0
  161. package/lib/langium/model-service/model-events.js +10 -0
  162. package/lib/langium/model-service/model-events.js.map +1 -0
  163. package/lib/langium/model-service/model-service.d.ts +440 -282
  164. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  165. package/lib/langium/model-service/model-service.js +542 -446
  166. package/lib/langium/model-service/model-service.js.map +1 -1
  167. package/lib/langium/module.d.ts +158 -37
  168. package/lib/langium/module.d.ts.map +1 -1
  169. package/lib/langium/module.js +52 -36
  170. package/lib/langium/module.js.map +1 -1
  171. package/lib/langium/naming/name-provider.d.ts +27 -6
  172. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  173. package/lib/langium/naming/name-provider.js +4 -3
  174. package/lib/langium/naming/name-provider.js.map +1 -1
  175. package/lib/langium/naming/name-separator-validation.d.ts +23 -1
  176. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  177. package/lib/langium/naming/name-separator-validation.js +22 -0
  178. package/lib/langium/naming/name-separator-validation.js.map +1 -1
  179. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  180. package/lib/langium/project/abstract-project-manager.js +13 -6
  181. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  182. package/lib/langium/project/project-change-event.d.ts +2 -2
  183. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  184. package/lib/langium/project/single-project-manager.js.map +1 -1
  185. package/lib/langium/residency/cst-residency-service.d.ts +35 -12
  186. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  187. package/lib/langium/residency/cst-residency-service.js +23 -57
  188. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  189. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  190. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  191. package/lib/langium/scope/fallback-scope.d.ts +27 -0
  192. package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
  193. package/lib/langium/scope/fallback-scope.js +35 -0
  194. package/lib/langium/scope/fallback-scope.js.map +1 -0
  195. package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
  196. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  197. package/lib/langium/scope/hydranium-scope-computation.js +38 -39
  198. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  199. package/lib/langium/scope/hydranium-scope-provider.d.ts +61 -24
  200. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  201. package/lib/langium/scope/hydranium-scope-provider.js +74 -35
  202. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  203. package/lib/langium/scope/index.d.ts +1 -0
  204. package/lib/langium/scope/index.d.ts.map +1 -1
  205. package/lib/langium/scope/index.js +1 -0
  206. package/lib/langium/scope/index.js.map +1 -1
  207. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  208. package/lib/langium/scope/reference-builder.js.map +1 -1
  209. package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
  210. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  211. package/lib/langium/scope/reference-candidate-provider.js +3 -2
  212. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  213. package/lib/langium/scope/scope-extension-service.d.ts +41 -37
  214. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  215. package/lib/langium/scope/scope-extension-service.js +57 -29
  216. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  217. package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
  218. package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
  219. package/lib/langium/scope/scoped-ast-node-description.js +1 -3
  220. package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
  221. package/lib/langium/serialization/abstract-serializer.d.ts +38 -27
  222. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  223. package/lib/langium/serialization/abstract-serializer.js +54 -30
  224. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  225. package/lib/langium/serialization/json-serializer.d.ts +8 -1
  226. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  227. package/lib/langium/serialization/json-serializer.js +13 -3
  228. package/lib/langium/serialization/json-serializer.js.map +1 -1
  229. package/lib/langium/serialization/serializer.d.ts +1 -1
  230. package/lib/langium/serialization/yaml-serializer.d.ts +4 -0
  231. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  232. package/lib/langium/serialization/yaml-serializer.js +4 -0
  233. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  234. package/lib/langium/service-registry.d.ts +29 -1
  235. package/lib/langium/service-registry.d.ts.map +1 -1
  236. package/lib/langium/service-registry.js +37 -0
  237. package/lib/langium/service-registry.js.map +1 -1
  238. package/lib/langium/shared-services.d.ts +23 -6
  239. package/lib/langium/shared-services.d.ts.map +1 -1
  240. package/lib/langium/shared-services.js.map +1 -1
  241. package/lib/langium/single-langium-copy.d.ts +22 -0
  242. package/lib/langium/single-langium-copy.d.ts.map +1 -0
  243. package/lib/langium/single-langium-copy.js +36 -0
  244. package/lib/langium/single-langium-copy.js.map +1 -0
  245. package/lib/langium/transfer/transfer-encoder.d.ts +84 -35
  246. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  247. package/lib/langium/transfer/transfer-encoder.js +34 -23
  248. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  249. package/lib/langium/trivia/comment-preserver.d.ts +423 -0
  250. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  251. package/lib/langium/trivia/comment-preserver.js +906 -0
  252. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  253. package/lib/langium/trivia/document-ending-preserver.d.ts +43 -0
  254. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  255. package/lib/langium/trivia/document-ending-preserver.js +48 -0
  256. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  257. package/lib/langium/trivia/index.d.ts +14 -0
  258. package/lib/langium/trivia/index.d.ts.map +1 -0
  259. package/lib/langium/trivia/index.js +14 -0
  260. package/lib/langium/trivia/index.js.map +1 -0
  261. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  262. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  263. package/lib/langium/trivia/trivia-contribution.js +10 -0
  264. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  265. package/lib/langium/trivia/trivia-preserver.d.ts +50 -0
  266. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  267. package/lib/langium/trivia/trivia-preserver.js +10 -0
  268. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  269. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  270. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  271. package/lib/langium/trivia/trivia-service.js +56 -0
  272. package/lib/langium/trivia/trivia-service.js.map +1 -0
  273. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  274. package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
  275. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  276. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  277. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  278. package/lib/langium/validation/document-validator.d.ts +280 -9
  279. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  280. package/lib/langium/validation/document-validator.js +453 -8
  281. package/lib/langium/validation/document-validator.js.map +1 -1
  282. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  283. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  284. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  285. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  286. package/lib/langium/workspace/document-uri-policy.d.ts +15 -10
  287. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  288. package/lib/langium/workspace/document-uri-policy.js +7 -5
  289. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  290. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  291. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  292. package/lib/langium/workspace/file-not-found.js +31 -0
  293. package/lib/langium/workspace/file-not-found.js.map +1 -0
  294. package/lib/langium/workspace/file-system-provider.d.ts +154 -8
  295. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  296. package/lib/langium/workspace/file-system-provider.js +102 -13
  297. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  298. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +56 -1
  299. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  300. package/lib/langium/workspace/hydranium-langium-document-factory.js +79 -0
  301. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  302. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
  303. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  304. package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
  305. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  306. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +109 -9
  307. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  308. package/lib/langium/workspace/hydranium-workspace-manager.js +192 -12
  309. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  310. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
  311. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  312. package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
  313. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  314. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  315. package/lib/langium/workspace/index-manager.js.map +1 -1
  316. package/lib/langium/workspace/index.d.ts +1 -0
  317. package/lib/langium/workspace/index.d.ts.map +1 -1
  318. package/lib/langium/workspace/index.js +1 -0
  319. package/lib/langium/workspace/index.js.map +1 -1
  320. package/lib/langium/workspace/initialize-workspace.d.ts +31 -2
  321. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  322. package/lib/langium/workspace/initialize-workspace.js +13 -5
  323. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  324. package/lib/langium/workspace/langium-documents.d.ts +37 -4
  325. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  326. package/lib/langium/workspace/langium-documents.js +49 -4
  327. package/lib/langium/workspace/langium-documents.js.map +1 -1
  328. package/lib/langium/workspace/persistent-file-system-provider.d.ts +7 -9
  329. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  330. package/lib/langium/workspace/persistent-file-system-provider.js +14 -13
  331. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  332. package/lib/langium/workspace/self-save-registry.d.ts +84 -0
  333. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  334. package/lib/{documents → langium/workspace}/self-save-registry.js +33 -22
  335. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  336. package/lib/langium/workspace/virtual-document.d.ts +49 -15
  337. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  338. package/lib/langium/workspace/virtual-document.js +81 -18
  339. package/lib/langium/workspace/virtual-document.js.map +1 -1
  340. package/lib/langium/workspace/write-lock-scope.d.ts +22 -10
  341. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  342. package/lib/langium/workspace/write-lock-scope.js +15 -5
  343. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  344. package/lib/launcher/integrated-server.d.ts +3 -1
  345. package/lib/launcher/integrated-server.d.ts.map +1 -1
  346. package/lib/locale/index.d.ts +10 -0
  347. package/lib/locale/index.d.ts.map +1 -0
  348. package/lib/locale/index.js +10 -0
  349. package/lib/locale/index.js.map +1 -0
  350. package/lib/locale/server-locale.d.ts +73 -0
  351. package/lib/locale/server-locale.d.ts.map +1 -0
  352. package/lib/locale/server-locale.js +61 -0
  353. package/lib/locale/server-locale.js.map +1 -0
  354. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  355. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  356. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  357. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  358. package/lib/lsp/connection-features.d.ts +23 -0
  359. package/lib/lsp/connection-features.d.ts.map +1 -0
  360. package/lib/lsp/connection-features.js +60 -0
  361. package/lib/lsp/connection-features.js.map +1 -0
  362. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  363. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  364. package/lib/lsp/diagnostics-connection.js +53 -0
  365. package/lib/lsp/diagnostics-connection.js.map +1 -0
  366. package/lib/lsp/hydranium-document-update-handler.d.ts +106 -82
  367. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  368. package/lib/lsp/hydranium-document-update-handler.js +182 -102
  369. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  370. package/lib/lsp/index.d.ts +3 -1
  371. package/lib/lsp/index.d.ts.map +1 -1
  372. package/lib/lsp/index.js +3 -1
  373. package/lib/lsp/index.js.map +1 -1
  374. package/lib/lsp/lsp-latency.d.ts +39 -0
  375. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  376. package/lib/lsp/lsp-latency.js +58 -0
  377. package/lib/lsp/lsp-latency.js.map +1 -0
  378. package/lib/lsp/semantic-token-provider.d.ts +34 -1
  379. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  380. package/lib/lsp/semantic-token-provider.js +55 -8
  381. package/lib/lsp/semantic-token-provider.js.map +1 -1
  382. package/lib/lsp/shared-module.d.ts +4 -8
  383. package/lib/lsp/shared-module.d.ts.map +1 -1
  384. package/lib/lsp/shared-module.js.map +1 -1
  385. package/lib/lsp/start-language-server.d.ts +8 -7
  386. package/lib/lsp/start-language-server.d.ts.map +1 -1
  387. package/lib/lsp/start-language-server.js +13 -7
  388. package/lib/lsp/start-language-server.js.map +1 -1
  389. package/lib/messages/carriers.d.ts +18 -12
  390. package/lib/messages/carriers.d.ts.map +1 -1
  391. package/lib/messages/carriers.js +22 -13
  392. package/lib/messages/carriers.js.map +1 -1
  393. package/lib/messages/index.d.ts +4 -1
  394. package/lib/messages/index.d.ts.map +1 -1
  395. package/lib/messages/index.js +4 -1
  396. package/lib/messages/index.js.map +1 -1
  397. package/lib/messages/renderer.d.ts +142 -0
  398. package/lib/messages/renderer.d.ts.map +1 -0
  399. package/lib/messages/renderer.js +165 -0
  400. package/lib/messages/renderer.js.map +1 -0
  401. package/lib/node/event-loop-monitor.d.ts.map +1 -1
  402. package/lib/node/event-loop-monitor.js +2 -1
  403. package/lib/node/event-loop-monitor.js.map +1 -1
  404. package/lib/node/heap-ceiling.d.ts +61 -0
  405. package/lib/node/heap-ceiling.d.ts.map +1 -0
  406. package/lib/node/heap-ceiling.js +72 -0
  407. package/lib/node/heap-ceiling.js.map +1 -0
  408. package/lib/node/index.d.ts +1 -1
  409. package/lib/node/index.d.ts.map +1 -1
  410. package/lib/node/index.js +1 -1
  411. package/lib/node/index.js.map +1 -1
  412. package/lib/node/latency-from-env.d.ts +1 -1
  413. package/lib/node/latency-from-env.js +1 -1
  414. package/lib/node/lint-grammar.js.map +1 -1
  415. package/lib/node/log-preamble-node.d.ts +5 -3
  416. package/lib/node/log-preamble-node.d.ts.map +1 -1
  417. package/lib/node/log-preamble-node.js +13 -10
  418. package/lib/node/log-preamble-node.js.map +1 -1
  419. package/lib/node/measure-memory.d.ts.map +1 -1
  420. package/lib/node/measure-memory.js +5 -4
  421. package/lib/node/measure-memory.js.map +1 -1
  422. package/lib/node/memory-monitor.d.ts +2 -2
  423. package/lib/node/memory-monitor.d.ts.map +1 -1
  424. package/lib/node/memory-monitor.js +9 -10
  425. package/lib/node/memory-monitor.js.map +1 -1
  426. package/lib/node/node-file-system-provider.d.ts +60 -9
  427. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  428. package/lib/node/node-file-system-provider.js +162 -52
  429. package/lib/node/node-file-system-provider.js.map +1 -1
  430. package/lib/node/profile-capture.d.ts +12 -4
  431. package/lib/node/profile-capture.d.ts.map +1 -1
  432. package/lib/node/profile-capture.js +8 -6
  433. package/lib/node/profile-capture.js.map +1 -1
  434. package/lib/node/profile-digest.js.map +1 -1
  435. package/lib/node/profiling-run.d.ts +13 -3
  436. package/lib/node/profiling-run.d.ts.map +1 -1
  437. package/lib/node/profiling-run.js +17 -8
  438. package/lib/node/profiling-run.js.map +1 -1
  439. package/lib/node/rename-over-open-readers.d.ts +61 -0
  440. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  441. package/lib/node/rename-over-open-readers.js +80 -0
  442. package/lib/node/rename-over-open-readers.js.map +1 -0
  443. package/lib/node/server-diagnostics.js +1 -1
  444. package/lib/node/server-diagnostics.js.map +1 -1
  445. package/lib/node/server-state-snapshot.js +4 -4
  446. package/lib/node/server-state-snapshot.js.map +1 -1
  447. package/lib/node/socket-launcher.d.ts +20 -4
  448. package/lib/node/socket-launcher.d.ts.map +1 -1
  449. package/lib/node/socket-launcher.js +8 -7
  450. package/lib/node/socket-launcher.js.map +1 -1
  451. package/lib/node/stdio-launcher.d.ts +10 -10
  452. package/lib/node/stdio-launcher.d.ts.map +1 -1
  453. package/lib/node/stdio-launcher.js +17 -9
  454. package/lib/node/stdio-launcher.js.map +1 -1
  455. package/lib/testing/document-uri-policy-conformance.js +1 -1
  456. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  457. package/lib/testing/fake-description.js.map +1 -1
  458. package/lib/testing/fake-document.d.ts +16 -4
  459. package/lib/testing/fake-document.d.ts.map +1 -1
  460. package/lib/testing/fake-document.js +18 -3
  461. package/lib/testing/fake-document.js.map +1 -1
  462. package/lib/testing/index.d.ts +1 -1
  463. package/lib/testing/index.d.ts.map +1 -1
  464. package/lib/testing/index.js +2 -1
  465. package/lib/testing/index.js.map +1 -1
  466. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  467. package/lib/testing/langium-test-helpers.js +1 -0
  468. package/lib/testing/langium-test-helpers.js.map +1 -1
  469. package/lib/testing/make-noop-language-services.js.map +1 -1
  470. package/lib/testing/make-noop-shared-services.d.ts +14 -0
  471. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  472. package/lib/testing/make-noop-shared-services.js +28 -2
  473. package/lib/testing/make-noop-shared-services.js.map +1 -1
  474. package/lib/testing/make-test-services.d.ts +72 -14
  475. package/lib/testing/make-test-services.d.ts.map +1 -1
  476. package/lib/testing/make-test-services.js +42 -10
  477. package/lib/testing/make-test-services.js.map +1 -1
  478. package/lib/testing/make-test-tracer.d.ts +12 -0
  479. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  480. package/lib/testing/make-test-tracer.js +13 -0
  481. package/lib/testing/make-test-tracer.js.map +1 -1
  482. package/lib/testing/node/applied-edit-capture.d.ts +29 -0
  483. package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
  484. package/lib/testing/node/applied-edit-capture.js +115 -0
  485. package/lib/testing/node/applied-edit-capture.js.map +1 -0
  486. package/lib/testing/node/golden-corpus.js.map +1 -1
  487. package/lib/testing/node/index.d.ts +1 -0
  488. package/lib/testing/node/index.d.ts.map +1 -1
  489. package/lib/testing/node/index.js +1 -0
  490. package/lib/testing/node/index.js.map +1 -1
  491. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  492. package/lib/testing/node/lsp-harness.js +2 -0
  493. package/lib/testing/node/lsp-harness.js.map +1 -1
  494. package/lib/testing/node/lsp-server-connection.d.ts +12 -4
  495. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  496. package/lib/testing/node/lsp-server-connection.js +45 -106
  497. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  498. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  499. package/lib/testing/node/scratch-workspace.js +10 -5
  500. package/lib/testing/node/scratch-workspace.js.map +1 -1
  501. package/lib/testing/node/spawned-server.d.ts +30 -1
  502. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  503. package/lib/testing/node/spawned-server.js +39 -2
  504. package/lib/testing/node/spawned-server.js.map +1 -1
  505. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  506. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  507. package/lib/testing/node/unhandled-rejections.js +32 -0
  508. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  509. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  510. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  511. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  512. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  513. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  514. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  515. package/lib/testing/playwright/index.d.ts +1 -0
  516. package/lib/testing/playwright/index.d.ts.map +1 -1
  517. package/lib/testing/playwright/index.js +1 -0
  518. package/lib/testing/playwright/index.js.map +1 -1
  519. package/lib/testing/playwright/server-log-capture.d.ts +35 -8
  520. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  521. package/lib/testing/playwright/server-log-capture.js +39 -6
  522. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  523. package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
  524. package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
  525. package/lib/testing/playwright/server-log-fixture.js +25 -6
  526. package/lib/testing/playwright/server-log-fixture.js.map +1 -1
  527. package/lib/testing/playwright/server-log-region.d.ts +15 -0
  528. package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
  529. package/lib/testing/playwright/server-log-region.js +30 -0
  530. package/lib/testing/playwright/server-log-region.js.map +1 -0
  531. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  532. package/lib/testing/playwright/server-log-rename-reporter.js +10 -1
  533. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  534. package/lib/testing/run-update-pipeline.d.ts +6 -5
  535. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  536. package/lib/testing/run-update-pipeline.js.map +1 -1
  537. package/lib/testing/stub-ast-document-manager.d.ts +11 -52
  538. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  539. package/lib/testing/stub-ast-document-manager.js +31 -62
  540. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  541. package/lib/testing/stub-document-builder.d.ts +33 -11
  542. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  543. package/lib/testing/stub-document-builder.js +103 -5
  544. package/lib/testing/stub-document-builder.js.map +1 -1
  545. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  546. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  547. package/lib/testing/stub-hydranium-text-documents.js +132 -16
  548. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  549. package/lib/testing/stub-index-manager.js.map +1 -1
  550. package/lib/testing/stub-langium-documents.d.ts +3 -2
  551. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  552. package/lib/testing/stub-langium-documents.js.map +1 -1
  553. package/lib/testing/stub-model-service.d.ts +9 -8
  554. package/lib/testing/stub-model-service.d.ts.map +1 -1
  555. package/lib/testing/stub-model-service.js +6 -6
  556. package/lib/testing/stub-model-service.js.map +1 -1
  557. package/lib/testing/stub-project-manager.js.map +1 -1
  558. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  559. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  560. package/lib/testing/stub-service-registry.d.ts +1 -1
  561. package/lib/testing/stub-service-registry.js.map +1 -1
  562. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  563. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  564. package/lib/testing/stub-writable-file-system.js +2 -1
  565. package/lib/testing/stub-writable-file-system.js.map +1 -1
  566. package/lib/util/connection-liveness.d.ts +19 -6
  567. package/lib/util/connection-liveness.d.ts.map +1 -1
  568. package/lib/util/connection-liveness.js +61 -15
  569. package/lib/util/connection-liveness.js.map +1 -1
  570. package/lib/util/environment.d.ts.map +1 -1
  571. package/lib/util/environment.js.map +1 -1
  572. package/lib/util/registry.d.ts.map +1 -1
  573. package/package.json +29 -53
  574. package/src/documents/ast-document-manager.ts +463 -231
  575. package/src/documents/client-ids.ts +5 -22
  576. package/src/documents/client-session-errors.ts +24 -0
  577. package/src/documents/client-session-registry.ts +262 -0
  578. package/src/documents/dirty-state-tracker.ts +167 -0
  579. package/src/documents/document-release-handler.ts +404 -0
  580. package/src/documents/document-release-scheduler.ts +121 -0
  581. package/src/documents/file-system-task-queue.ts +68 -0
  582. package/src/documents/hydranium-text-documents.ts +968 -595
  583. package/src/documents/index.ts +10 -2
  584. package/src/documents/language-client-shadow.ts +452 -0
  585. package/src/documents/model-ledger.ts +66 -0
  586. package/src/documents/text-ledger.ts +112 -0
  587. package/src/documents/version-sync-service.ts +275 -0
  588. package/src/index.ts +8 -0
  589. package/src/langium/ast-extension/ast-extension-service.ts +3 -0
  590. package/src/langium/ast-extension/ast-node-builder.ts +66 -22
  591. package/src/langium/bootstrap.ts +95 -52
  592. package/src/langium/build-phase-pass/build-phase-pass-service.ts +1 -1
  593. package/src/langium/build-phase-pass/build-phase-pass.ts +1 -1
  594. package/src/langium/composite-ast-reflection.ts +112 -0
  595. package/src/langium/config/configuration-provider.ts +119 -0
  596. package/src/langium/config/index.ts +1 -0
  597. package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
  598. package/src/langium/diagnostics/log-preamble.ts +1 -1
  599. package/src/langium/diagnostics/logger.ts +12 -5
  600. package/src/langium/diagnostics/lsp-logger.ts +61 -16
  601. package/src/langium/document-builder/build-pipeline-integration.ts +50 -5
  602. package/src/langium/document-builder/build-session.ts +4 -3
  603. package/src/langium/document-builder/document-builder.ts +616 -73
  604. package/src/langium/integration-services.ts +59 -28
  605. package/src/langium/integrity/integrity-rule.ts +16 -8
  606. package/src/langium/integrity/integrity-service.ts +296 -69
  607. package/src/langium/keys/containment.ts +87 -0
  608. package/src/langium/keys/index.ts +1 -0
  609. package/src/langium/keys/name-based-key-provider.ts +4 -0
  610. package/src/langium/language-module.ts +49 -8
  611. package/src/langium/model-service/client-session.ts +702 -0
  612. package/src/langium/model-service/index.ts +2 -0
  613. package/src/langium/model-service/model-events.ts +80 -0
  614. package/src/langium/model-service/model-service.ts +835 -475
  615. package/src/langium/module.ts +212 -67
  616. package/src/langium/naming/name-provider.ts +29 -7
  617. package/src/langium/naming/name-separator-validation.ts +25 -3
  618. package/src/langium/project/abstract-project-manager.ts +13 -5
  619. package/src/langium/project/project-change-event.ts +2 -2
  620. package/src/langium/residency/cst-residency-service.ts +50 -16
  621. package/src/langium/scope/fallback-scope.ts +38 -0
  622. package/src/langium/scope/hydranium-scope-computation.ts +45 -44
  623. package/src/langium/scope/hydranium-scope-provider.ts +89 -38
  624. package/src/langium/scope/index.ts +1 -0
  625. package/src/langium/scope/reference-candidate-provider.ts +6 -5
  626. package/src/langium/scope/scope-extension-service.ts +74 -59
  627. package/src/langium/scope/scoped-ast-node-description.ts +1 -3
  628. package/src/langium/serialization/abstract-serializer.ts +57 -41
  629. package/src/langium/serialization/json-serializer.ts +14 -3
  630. package/src/langium/serialization/serializer.ts +1 -1
  631. package/src/langium/serialization/yaml-serializer.ts +4 -0
  632. package/src/langium/service-registry.ts +41 -2
  633. package/src/langium/shared-services.ts +26 -6
  634. package/src/langium/single-langium-copy.ts +42 -0
  635. package/src/langium/transfer/transfer-encoder.ts +102 -45
  636. package/src/langium/trivia/comment-preserver.ts +1100 -0
  637. package/src/langium/trivia/document-ending-preserver.ts +55 -0
  638. package/src/langium/trivia/index.ts +14 -0
  639. package/src/langium/trivia/trivia-contribution.ts +39 -0
  640. package/src/langium/trivia/trivia-preserver.ts +54 -0
  641. package/src/langium/trivia/trivia-service.ts +99 -0
  642. package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
  643. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  644. package/src/langium/validation/document-validator.ts +528 -13
  645. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  646. package/src/langium/workspace/document-uri-policy.ts +15 -10
  647. package/src/langium/workspace/file-not-found.ts +35 -0
  648. package/src/langium/workspace/file-system-provider.ts +234 -16
  649. package/src/langium/workspace/hydranium-langium-document-factory.ts +117 -0
  650. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
  651. package/src/langium/workspace/hydranium-workspace-manager.ts +221 -16
  652. package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
  653. package/src/langium/workspace/index.ts +1 -0
  654. package/src/langium/workspace/initialize-workspace.ts +43 -5
  655. package/src/langium/workspace/langium-documents.ts +63 -5
  656. package/src/langium/workspace/persistent-file-system-provider.ts +15 -14
  657. package/src/langium/workspace/self-save-registry.ts +118 -0
  658. package/src/langium/workspace/virtual-document.ts +100 -19
  659. package/src/langium/workspace/write-lock-scope.ts +27 -12
  660. package/src/launcher/integrated-server.ts +3 -1
  661. package/src/locale/index.ts +10 -0
  662. package/src/locale/server-locale.ts +86 -0
  663. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  664. package/src/lsp/connection-features.ts +67 -0
  665. package/src/lsp/diagnostics-connection.ts +56 -0
  666. package/src/lsp/hydranium-document-update-handler.ts +227 -111
  667. package/src/lsp/index.ts +3 -1
  668. package/src/lsp/lsp-latency.ts +62 -0
  669. package/src/lsp/semantic-token-provider.ts +74 -7
  670. package/src/lsp/shared-module.ts +4 -8
  671. package/src/lsp/start-language-server.ts +13 -7
  672. package/src/messages/carriers.ts +23 -15
  673. package/src/messages/index.ts +13 -1
  674. package/src/messages/renderer.ts +212 -0
  675. package/src/node/event-loop-monitor.ts +2 -1
  676. package/src/node/heap-ceiling.ts +108 -0
  677. package/src/node/index.ts +1 -1
  678. package/src/node/latency-from-env.ts +1 -1
  679. package/src/node/log-preamble-node.ts +20 -10
  680. package/src/node/measure-memory.ts +5 -4
  681. package/src/node/memory-monitor.ts +10 -10
  682. package/src/node/node-file-system-provider.ts +178 -56
  683. package/src/node/profile-capture.ts +16 -15
  684. package/src/node/profiling-run.ts +30 -8
  685. package/src/node/rename-over-open-readers.ts +94 -0
  686. package/src/node/server-diagnostics.ts +1 -1
  687. package/src/node/server-state-snapshot.ts +5 -5
  688. package/src/node/socket-launcher.ts +27 -11
  689. package/src/node/stdio-launcher.ts +22 -14
  690. package/src/testing/document-uri-policy-conformance.ts +1 -1
  691. package/src/testing/fake-document.ts +24 -5
  692. package/src/testing/index.ts +2 -1
  693. package/src/testing/langium-test-helpers.ts +1 -0
  694. package/src/testing/make-noop-shared-services.ts +50 -2
  695. package/src/testing/make-test-services.ts +125 -31
  696. package/src/testing/make-test-tracer.ts +26 -0
  697. package/src/testing/node/applied-edit-capture.ts +139 -0
  698. package/src/testing/node/index.ts +1 -0
  699. package/src/testing/node/lsp-harness.ts +2 -0
  700. package/src/testing/node/lsp-server-connection.ts +74 -117
  701. package/src/testing/node/scratch-workspace.ts +10 -5
  702. package/src/testing/node/spawned-server.ts +57 -3
  703. package/src/testing/node/unhandled-rejections.ts +31 -0
  704. package/src/testing/parse-semantic-root.ts +1 -1
  705. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  706. package/src/testing/playwright/index.ts +1 -0
  707. package/src/testing/playwright/server-log-capture.ts +63 -11
  708. package/src/testing/playwright/server-log-fixture.ts +46 -6
  709. package/src/testing/playwright/server-log-region.ts +32 -0
  710. package/src/testing/playwright/server-log-rename-reporter.ts +12 -1
  711. package/src/testing/run-update-pipeline.ts +6 -5
  712. package/src/testing/stub-ast-document-manager.ts +47 -128
  713. package/src/testing/stub-document-builder.ts +133 -18
  714. package/src/testing/stub-hydranium-text-documents.ts +184 -27
  715. package/src/testing/stub-langium-documents.ts +3 -2
  716. package/src/testing/stub-model-service.ts +11 -10
  717. package/src/testing/stub-self-save-registry.ts +1 -1
  718. package/src/testing/stub-service-registry.ts +1 -1
  719. package/src/testing/stub-writable-file-system.ts +3 -2
  720. package/src/util/connection-liveness.ts +67 -15
  721. package/src/util/environment.ts +9 -1
  722. package/lib/documents/language-client-text-shadow.d.ts +0 -101
  723. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  724. package/lib/documents/language-client-text-shadow.js +0 -156
  725. package/lib/documents/language-client-text-shadow.js.map +0 -1
  726. package/lib/documents/self-save-registry.d.ts +0 -55
  727. package/lib/documents/self-save-registry.d.ts.map +0 -1
  728. package/lib/documents/self-save-registry.js.map +0 -1
  729. package/lib/lsp/instrument-connection.d.ts +0 -36
  730. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  731. package/lib/lsp/instrument-connection.js +0 -62
  732. package/lib/lsp/instrument-connection.js.map +0 -1
  733. package/lib/node/process-memory.d.ts +0 -66
  734. package/lib/node/process-memory.d.ts.map +0 -1
  735. package/lib/node/process-memory.js +0 -252
  736. package/lib/node/process-memory.js.map +0 -1
  737. package/src/documents/language-client-text-shadow.ts +0 -175
  738. package/src/documents/self-save-registry.ts +0 -81
  739. package/src/lsp/instrument-connection.ts +0 -66
  740. package/src/node/process-memory.ts +0 -299
@@ -10,17 +10,20 @@
10
10
  import { type Logger } from '@hydranium/protocol';
11
11
  import { type LangiumSharedCoreServices } from '@hydranium/langium';
12
12
  import { type LangiumServices, type LangiumSharedServices } from '@hydranium/langium/lsp';
13
- import type { ServerSharedServicesMinimal } from './shared-services.js';
13
+ import type { ServerSharedServices } from './module.js';
14
14
  import { collectProducibleTypes } from './language-types.js';
15
- import { AstDocumentManager } from '../documents/ast-document-manager.js';
15
+ import { assertSingleLangiumCopy } from './single-langium-copy.js';
16
+ import { DefaultAstDocumentManager } from '../documents/ast-document-manager.js';
16
17
  import { HydraniumTextDocuments } from '../documents/hydranium-text-documents.js';
17
- import { BuildPipelineIntegration } from './document-builder/build-pipeline-integration.js';
18
+ import { DefaultBuildPipelineIntegration } from './document-builder/build-pipeline-integration.js';
18
19
  import { HydraniumDocumentBuilder } from './document-builder/document-builder.js';
19
- import { ModelService } from './model-service/model-service.js';
20
+ import { DefaultModelService } from './model-service/model-service.js';
20
21
  import { HydraniumScopeComputation } from './scope/hydranium-scope-computation.js';
21
22
  import { HydraniumScopeProvider } from './scope/hydranium-scope-provider.js';
22
23
  import { processEnv } from '../util/environment.js';
23
- import { TransferEncoder } from './transfer/transfer-encoder.js';
24
+ import { DefaultTransferEncoder } from './transfer/transfer-encoder.js';
25
+ import { HydraniumLangiumDocumentFactory } from './workspace/hydranium-langium-document-factory.js';
26
+ import { HydraniumLangiumDocuments } from './workspace/langium-documents.js';
24
27
  import { HydraniumWorkspaceManager } from './workspace/hydranium-workspace-manager.js';
25
28
 
26
29
  /**
@@ -73,7 +76,14 @@ const EXPECTED_SHARED_SLOTS: readonly ExpectedSlot[] = [
73
76
  side: 'shared',
74
77
  path: 'workspace.BuildPipelineIntegration',
75
78
  get: services => nested(services, 'workspace', 'BuildPipelineIntegration')
76
- }
79
+ },
80
+ // Unbound, this fails where the cause is least visible: the render pass runs
81
+ // inside the `Validated` phase, so a `TypeError` there propagates out of
82
+ // `notifyDocumentPhase` and the document reaches `Validated` with Langium's
83
+ // publisher never invoked — the client receives no diagnostics for the file
84
+ // and the stack names the document builder.
85
+ { side: 'shared', path: 'MessageRenderer', get: services => nested(services, 'MessageRenderer') },
86
+ { side: 'shared', path: 'ServerLocale', get: services => nested(services, 'ServerLocale') }
77
87
  ];
78
88
 
79
89
  /**
@@ -184,6 +194,20 @@ interface StrictSlot {
184
194
 
185
195
  const STRICT_SHARED_SLOTS: readonly StrictSlot[] = [
186
196
  { side: 'shared', path: 'workspace.TextDocuments', base: HydraniumTextDocuments, get: s => nested(s, 'workspace', 'TextDocuments') },
197
+ // Every root it builds records no version, so every write gated on one conflicts.
198
+ {
199
+ side: 'shared',
200
+ path: 'workspace.LangiumDocumentFactory',
201
+ base: HydraniumLangiumDocumentFactory,
202
+ get: s => nested(s, 'workspace', 'LangiumDocumentFactory')
203
+ },
204
+ // It reports no registered root, so none is reconciled with the text store or announced.
205
+ {
206
+ side: 'shared',
207
+ path: 'workspace.LangiumDocuments',
208
+ base: HydraniumLangiumDocuments,
209
+ get: s => nested(s, 'workspace', 'LangiumDocuments')
210
+ },
187
211
  {
188
212
  side: 'shared',
189
213
  path: 'workspace.WorkspaceManager',
@@ -199,17 +223,17 @@ const STRICT_SHARED_SLOTS: readonly StrictSlot[] = [
199
223
  {
200
224
  side: 'shared',
201
225
  path: 'workspace.AstDocumentManager',
202
- base: AstDocumentManager,
226
+ base: DefaultAstDocumentManager,
203
227
  get: s => nested(s, 'workspace', 'AstDocumentManager')
204
228
  },
205
229
  {
206
230
  side: 'shared',
207
231
  path: 'workspace.BuildPipelineIntegration',
208
- base: BuildPipelineIntegration,
232
+ base: DefaultBuildPipelineIntegration,
209
233
  get: s => nested(s, 'workspace', 'BuildPipelineIntegration')
210
234
  },
211
- { side: 'shared', path: 'model.TransferEncoder', base: TransferEncoder, get: s => nested(s, 'model', 'TransferEncoder') },
212
- { side: 'shared', path: 'model.ModelService', base: ModelService, get: s => nested(s, 'model', 'ModelService') }
235
+ { side: 'shared', path: 'model.TransferEncoder', base: DefaultTransferEncoder, get: s => nested(s, 'model', 'TransferEncoder') },
236
+ { side: 'shared', path: 'model.ModelService', base: DefaultModelService, get: s => nested(s, 'model', 'ModelService') }
213
237
  ];
214
238
 
215
239
  const STRICT_LANGUAGE_SLOTS: readonly StrictSlot[] = [
@@ -287,31 +311,40 @@ export function warnOnUnexpectedBindings(shared: LangiumSharedServices, language
287
311
  * dispatch every build-phase pass and drive AST enrichment, and
288
312
  * registers the framework integrity passes itself. The per-language
289
313
  * feature services it routes to (`ast.AstExtensionService` +
290
- * `integrity.IntegrityService`, plus `references.ScopeExtensionService`
291
- * read by the scope provider) hold the registries and the logic but own
314
+ * `integrity.IntegrityService`) hold the registries and the logic but own
292
315
  * no listeners, so they need not be eager: each language's services
293
- * construct lazily when the orchestrator (or scope provider) first
294
- * reaches them, and their constructors register that language's rules /
295
- * extensions just-in-time.
296
- * - **`profilers.LangiumProfiler`** — self-registers a `Validated`
297
- * BuildPhasePass that flushes the aggregated parse/link/validate profile
298
- * once per build. No production cost (the profiler is trace-gated), but
299
- * the pass must be registered up front.
316
+ * construct lazily when the orchestrator first reaches them, and their
317
+ * constructors register that language's rules / extensions just-in-time.
318
+ * `references.ScopeExtensionService`, read by the scope provider, does
319
+ * subscribe to the builder, but only to report its own calls, so
320
+ * constructing it at its first call misses none.
321
+ * - **`profilers.LangiumProfiler`** — subscribes to
322
+ * `documentBuilder.onBuildEnded` to flush the aggregated
323
+ * parse/link/validate profile once per build. No production cost (the
324
+ * profiler is trace-gated), but the listener must be attached before the
325
+ * first build ends.
300
326
  * - **`workspace.CstResidencyService`** — self-registers a `Validated`
301
327
  * BuildPhasePass that sheds the CST of closed documents. The framework
302
328
  * default strategy is `always-keep`, so the pass runs but sheds nothing
303
329
  * until an adopter configures a shedding strategy.
330
+ * - **`workspace.AstDocumentManager`** — subscribes to the build pipeline
331
+ * and the text store to track opens, deletions and each build's causes.
332
+ * - **`model.ModelService`** — subscribes to the settled document phase to
333
+ * bring the language client up to date. A tree without an LSP `initialize`,
334
+ * such as a headless init, may not resolve it before the first build.
304
335
  *
305
336
  * Consumers with no additional eager targets can omit the third argument
306
337
  * to {@link bootstrapLangium} — the parameter default is this exact set.
307
338
  * Adopters needing extra eager targets spread this constant into their own
308
339
  * array and append their accessors.
309
340
  */
310
- export const DEFAULT_EAGER_SERVICES: ReadonlyArray<(services: ServerSharedServicesMinimal) => unknown> = [
341
+ export const DEFAULT_EAGER_SERVICES: ReadonlyArray<(services: ServerSharedServices) => unknown> = [
311
342
  services => services.workspace.ProjectManager,
312
343
  services => services.workspace.BuildPipelineIntegration,
313
344
  services => services.profilers.LangiumProfiler,
314
- services => services.workspace.CstResidencyService
345
+ services => services.workspace.CstResidencyService,
346
+ services => services.workspace.AstDocumentManager,
347
+ services => services.model.ModelService
315
348
  ];
316
349
 
317
350
  /**
@@ -329,36 +362,39 @@ export const DEFAULT_EAGER_SERVICES: ReadonlyArray<(services: ServerSharedServic
329
362
  * discarded.
330
363
  *
331
364
  * Bootstrap responsibilities, in order:
332
- * 1. Hand the shared services to `shared.ServiceRegistry` if it accepts
365
+ * 1. {@link assertSingleLangiumCopy} — fail fast when the shared
366
+ * `AstReflection` is built on a second copy of `langium`, before any
367
+ * later check can fail first and name the wrong cause.
368
+ * 2. Hand the shared services to `shared.ServiceRegistry` if it accepts
333
369
  * them after construction, so Langium's declared-languageId lookup
334
370
  * rung works however the adopter's registry binding was built.
335
- * 2. {@link assertDistinctFileRouting} — before registration, because
371
+ * 3. {@link assertDistinctFileRouting} — before registration, because
336
372
  * `register` resolves a routing collision by last-wins and afterwards
337
373
  * the evidence is gone.
338
- * 3. Register `language` against `shared.ServiceRegistry`, the
374
+ * 4. Register `language` against `shared.ServiceRegistry`, the
339
375
  * required final step of any Langium DI bootstrap. Done before slot
340
376
  * validation so subclassed registries (typed-accessor extensions)
341
377
  * populate any side state before validation walks construct services
342
378
  * that read from the registry.
343
- * 4. {@link assertCoreSlotsBound} — fail fast if the consumer's
379
+ * 5. {@link assertCoreSlotsBound} — fail fast if the consumer's
344
380
  * `inject(...)` composition is missing a `@hydranium/core` module. May
345
381
  * trigger lazy service construction as side effect of walking the
346
382
  * slots; that construction expects a populated `ServiceRegistry`,
347
383
  * hence the order.
348
- * 5. {@link warnOnUnexpectedBindings} — opt-in (gated by
384
+ * 6. {@link warnOnUnexpectedBindings} — opt-in (gated by
349
385
  * {@link STRICT_BINDINGS_ENV}); warns when a framework slot is bound
350
386
  * to a non-subclass of its framework base. No-op unless the env is set.
351
- * 6. {@link assertReflectionCoversLanguages} — catch a clobbered shared
387
+ * 7. {@link assertReflectionCoversLanguages} — catch a clobbered shared
352
388
  * `AstReflection` before it starts silently answering `isSubtype`
353
389
  * false for a registered language's types. Skipped here, since a lone
354
390
  * language has no sibling that could clobber it.
355
- * 7. Invoke eager-construction accessors in array order.
391
+ * 8. Invoke eager-construction accessors in array order.
356
392
  *
357
393
  * Multi-grammar adopters use {@link bootstrapLangiumLanguages}, which
358
394
  * registers every language before validating slots or constructing the
359
395
  * eager set.
360
396
  */
361
- export function bootstrapLangium<TShared extends LangiumSharedServices & ServerSharedServicesMinimal, TLang extends LangiumServices>(
397
+ export function bootstrapLangium<TShared extends LangiumSharedServices & ServerSharedServices, TLang extends LangiumServices>(
362
398
  shared: TShared,
363
399
  language: TLang,
364
400
  eagerlyConstructedServices: ReadonlyArray<(services: TShared) => unknown> = DEFAULT_EAGER_SERVICES
@@ -377,32 +413,32 @@ export function bootstrapLangium<TShared extends LangiumSharedServices & ServerS
377
413
  * ORDER across languages is what makes this a distinct function rather
378
414
  * than a loop the caller could write:
379
415
  *
380
- * 1. **Every** language is registered against `shared.ServiceRegistry`
381
- * first. Slot validation and eager construction both build services
416
+ * 1. {@link assertSingleLangiumCopy} runs **once**, before anything else,
417
+ * since every language shares the one `AstReflection`.
418
+ * 2. **Every** language is registered against `shared.ServiceRegistry`
419
+ * next. Slot validation and eager construction both build services
382
420
  * that read the registry — a per-language
383
421
  * register-then-validate-then-eager loop would run them while later
384
422
  * languages were still missing, so a shared service that walks
385
423
  * `ServiceRegistry.all` (or resolves by extension) would see a
386
424
  * half-populated registry and cache the wrong answer.
387
- * 2. `assertCoreSlotsBound` / `warnOnUnexpectedBindings` per language —
425
+ * 3. `assertCoreSlotsBound` / `warnOnUnexpectedBindings` per language —
388
426
  * each language composes its own module chain, so each is checked.
389
- * 3. Eager accessors run **once**, after all registrations. They take
390
- * the shared tier, and the framework's eager set is shared-tier only
391
- * (`ProjectManager`, `BuildPipelineIntegration`, `LangiumProfiler`,
392
- * `CstResidencyService`) — `BuildPipelineIntegration` in particular
393
- * routes per document URI to each language's `IntegrityService` /
394
- * `AstExtensionService`, so it must be constructed knowing all of
395
- * them. Running the set per language would attach its
396
- * `documentBuilder` listeners N times and enforce each phase N times.
427
+ * 4. {@link assertReflectionCoversLanguages} runs **once**, on the one
428
+ * shared `AstReflection`.
429
+ * 5. Eager accessors run **once**, after all registrations. They take
430
+ * the shared tier, and the framework's eager set is shared-tier only —
431
+ * `BuildPipelineIntegration` in particular routes per document URI to
432
+ * each language's `IntegrityService` / `AstExtensionService`, so it
433
+ * must be constructed knowing all of them. Running the set per language
434
+ * would attach its `documentBuilder` listeners N times and enforce each
435
+ * phase N times.
397
436
  *
398
437
  * Throws when `languages` is empty: a shared tier with no registered
399
438
  * language never validates its slots, which silently defers a
400
439
  * composition error to the first build.
401
440
  */
402
- export function bootstrapLangiumLanguages<
403
- TShared extends LangiumSharedServices & ServerSharedServicesMinimal,
404
- TLang extends LangiumServices
405
- >(
441
+ export function bootstrapLangiumLanguages<TShared extends LangiumSharedServices & ServerSharedServices, TLang extends LangiumServices>(
406
442
  shared: TShared,
407
443
  languages: ReadonlyArray<TLang>,
408
444
  eagerlyConstructedServices: ReadonlyArray<(services: TShared) => unknown> = DEFAULT_EAGER_SERVICES
@@ -414,6 +450,11 @@ export function bootstrapLangiumLanguages<
414
450
  '`inject(...)` composition.'
415
451
  );
416
452
  }
453
+ // First, because a second copy of `langium` can make a later check fail
454
+ // first and name the wrong cause.
455
+ if (shared.AstReflection) {
456
+ assertSingleLangiumCopy(shared.AstReflection);
457
+ }
417
458
  // Back-fill the shared services onto a registry that was constructed
418
459
  // without them, so Langium's declared-languageId lookup rung works no
419
460
  // matter how the adopter's `ServiceRegistry` binding built it. An adopter
@@ -521,11 +562,11 @@ export function assertDistinctFileRouting(languages: ReadonlyArray<LangiumServic
521
562
  *
522
563
  * The check is per language, on the types its grammar can produce, and costs
523
564
  * one grammar walk per language at boot; a single-language composition, which
524
- * nothing can clobber, is skipped entirely. It cannot repair the situation — a
525
- * reflection that spans independently generated grammars is a real design piece
526
- * (a composite reflection dispatching per owning language) and is not attempted
527
- * here; the point is to turn a silent runtime misbehaviour into a boot failure
528
- * that names the language and the mistake.
565
+ * nothing can clobber, is skipped entirely. It cannot repair the situation, since
566
+ * the losing reflection is already gone; the point is to turn a silent runtime
567
+ * misbehaviour into a boot failure that names the language and the mistake. The
568
+ * repair is the adopter's: bind a `CompositeAstReflection` over every package's
569
+ * generated reflection, or generate all grammars in one `langium-cli` run.
529
570
  *
530
571
  * **Two severities, because a clobber is not always total.** Throwing only when
531
572
  * NONE of a language's types are known misses the realistic case: two grammars
@@ -567,8 +608,9 @@ export function assertReflectionCoversLanguages(shared: LangiumSharedServices, l
567
608
  `[hydranium] the shared AstReflection knows NONE of the ${produced.size} types the language ` +
568
609
  `'${languageId}' can produce (e.g. ${missing.slice(0, 3).join(', ')}). ` +
569
610
  'AstReflection is a single shared slot, so composing two independently generated language ' +
570
- 'packages leaves only the last one bound. Generate all grammars in ONE langium-cli run (one ' +
571
- 'langium-config with several entry grammars) so a single combined reflection covers them all.'
611
+ "packages leaves only the last one bound. Bind a CompositeAstReflection over every package's " +
612
+ 'generated reflection, or generate all grammars in ONE langium-cli run (one langium-config with ' +
613
+ 'several entry grammars) so a single combined reflection covers them all.'
572
614
  );
573
615
  }
574
616
  }
@@ -590,7 +632,8 @@ function warnPartialReflectionCoverage(
590
632
  'For those types `isSubtype` answers false and `getTypeMetaData` is empty, so `IndexManager.allElements` ' +
591
633
  'finds nothing, reference routing misses, and the encoder emits nothing. Most likely two independently ' +
592
634
  'generated language packages each bound the single shared AstReflection slot and the last one won — ' +
593
- 'generate all grammars in ONE langium-cli run so a single combined reflection covers them. If instead ' +
635
+ "bind a CompositeAstReflection over every package's generated reflection, or generate all grammars in " +
636
+ 'ONE langium-cli run so a single combined reflection covers them. If instead ' +
594
637
  'these are rules your generator legitimately folded away, this warning is expected.';
595
638
  if (logger) {
596
639
  logger.warn(message);
@@ -27,7 +27,7 @@ import { type BuildPhasePass, type BuildPhasePassRegistry } from './build-phase-
27
27
  * per-language work (integrity) fans out by language *inside* its pass. This
28
28
  * also keeps one priority space per phase across framework and adopter passes,
29
29
  * which is the point — `runPasses` orders the framework's integrity and
30
- * profiler-flush passes against adopter passes deterministically.
30
+ * CST-residency passes against adopter passes deterministically.
31
31
  */
32
32
  export interface BuildPhasePassService extends BuildPhasePassRegistry {
33
33
  /**
@@ -102,7 +102,7 @@ export function groupDocumentsByLanguage<TLanguage extends LangiumCoreServices>(
102
102
  * Registry handed to a {@link BuildPhasePassContribution}. Implemented by the
103
103
  * `BuildPhasePassService`; doubles
104
104
  * as the low-level imperative API the framework uses to self-register its own
105
- * passes (integrity, the Langium profiler flush).
105
+ * passes (integrity, CST residency).
106
106
  */
107
107
  export interface BuildPhasePassRegistry {
108
108
  register(pass: BuildPhasePass): Disposable;
@@ -0,0 +1,112 @@
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 { AbstractAstReflection, type AstMetaData, type AstReflection, type PropertyMetaData, type TypeMetaData } from '@hydranium/langium';
11
+ import { assertSingleLangiumCopy } from './single-langium-copy.js';
12
+
13
+ /**
14
+ * One `AstReflection` over the reflections of separately generated language
15
+ * packages. The shared `AstReflection` slot holds a single reflection, so
16
+ * binding each package's generated shared module keeps only the last one's
17
+ * types; bind this over all of them instead.
18
+ *
19
+ * A name several reflections share is taken to be one type, reached through a
20
+ * shared imported grammar, and keeps every super type any of them gives it:
21
+ * each grammar may declare its own union over the type. Only properties that
22
+ * differ in name, reference type or default value throw; two unrelated unions,
23
+ * or same-shaped interfaces, that share a name merge silently, so keep other
24
+ * type names distinct across packages.
25
+ *
26
+ * Only each reflection's `types` is read, so behaviour a reflection overrides
27
+ * is lost. Each package's generated `isX` guards keep using that package's own
28
+ * reflection and answer false for subtypes only another package declares.
29
+ *
30
+ * Each reflection is checked with {@link assertSingleLangiumCopy}, because the
31
+ * composite itself extends the framework copy's base whichever copy they use.
32
+ *
33
+ * The protected merge methods run from the constructor, so an override cannot
34
+ * read its own class's fields.
35
+ */
36
+ export class CompositeAstReflection extends AbstractAstReflection {
37
+ override readonly types: AstMetaData = {};
38
+
39
+ constructor(reflections: readonly AstReflection[]) {
40
+ super();
41
+ const firstDefinedAt = new Map<string, number>();
42
+ reflections.forEach((reflection, index) => {
43
+ assertSingleLangiumCopy(reflection, () => this.formatReflection(reflections, index));
44
+ for (const [type, metaData] of Object.entries(reflection.types)) {
45
+ const ownerIndex = firstDefinedAt.get(type);
46
+ if (ownerIndex === undefined) {
47
+ this.types[type] = metaData;
48
+ firstDefinedAt.set(type, index);
49
+ } else {
50
+ this.types[type] = this.mergeTypeMetaData(
51
+ this.types[type],
52
+ metaData,
53
+ this.formatReflection(reflections, ownerIndex),
54
+ this.formatReflection(reflections, index)
55
+ );
56
+ }
57
+ }
58
+ });
59
+ }
60
+
61
+ protected mergeTypeMetaData(known: TypeMetaData, added: TypeMetaData, knownFrom: string, addedFrom: string): TypeMetaData {
62
+ const properties: TypeMetaData['properties'] = {};
63
+ const propertyNames = new Set([...Object.keys(known.properties), ...Object.keys(added.properties)]);
64
+ for (const property of propertyNames) {
65
+ const knownProperty = known.properties[property];
66
+ const addedProperty = added.properties[property];
67
+ if (!knownProperty || !addedProperty || !this.sameProperty(knownProperty, addedProperty)) {
68
+ throw new Error(
69
+ `[hydranium] ${knownFrom} and ${addedFrom} define the type ` +
70
+ `'${known.name}' differently (property '${property}'). A name the composed reflections share must ` +
71
+ 'denote one type, so rename one of them, or have every grammar take the type unchanged from one ' +
72
+ 'shared imported grammar.'
73
+ );
74
+ }
75
+ properties[property] = addedProperty.optional && !knownProperty.optional ? addedProperty : knownProperty;
76
+ }
77
+ // `Required` so a field Langium adds fails compilation until this merge decides on it.
78
+ const merged: Required<TypeMetaData> = {
79
+ name: known.name,
80
+ properties,
81
+ superTypes: [...new Set([...known.superTypes, ...added.superTypes])]
82
+ };
83
+ return merged;
84
+ }
85
+
86
+ protected sameProperty(left: PropertyMetaData, right: PropertyMetaData): boolean {
87
+ return COMPARED_PROPERTY_FIELDS.every(field => JSON.stringify(left[field]) === JSON.stringify(right[field]));
88
+ }
89
+
90
+ /**
91
+ * Names `reflections[index]` for the composite's errors: its position and
92
+ * class name. The position is needed because minified bundles and scaffolds
93
+ * sharing a project name leave class names that do not tell reflections
94
+ * apart. An override can name the package each reflection came from.
95
+ */
96
+ protected formatReflection(reflections: readonly AstReflection[], index: number): string {
97
+ return `reflections[${index}] (${reflections[index].constructor?.name ?? 'no constructor'})`;
98
+ }
99
+ }
100
+
101
+ /** How the merge treats each property field; a field Langium adds fails compilation here until decided. */
102
+ const PROPERTY_FIELDS = {
103
+ name: 'compared',
104
+ referenceType: 'compared',
105
+ defaultValue: 'compared',
106
+ // Older generators emit no `optional`, so its absence proves nothing.
107
+ optional: 'merged'
108
+ } as const satisfies Record<keyof PropertyMetaData, 'compared' | 'merged'>;
109
+
110
+ const COMPARED_PROPERTY_FIELDS = (Object.keys(PROPERTY_FIELDS) as Array<keyof PropertyMetaData>).filter(
111
+ field => PROPERTY_FIELDS[field] === 'compared'
112
+ );
@@ -0,0 +1,119 @@
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 { type ConfigurationInitializedParams, DefaultConfigurationProvider } from '@hydranium/langium';
11
+ import type { ConfigurationItem, DidChangeConfigurationRegistrationOptions } from 'vscode-languageserver';
12
+
13
+ /**
14
+ * Configuration provider that asks the client about a section the first time
15
+ * something reads it.
16
+ *
17
+ * Langium's base requests one section per registered language, named after the
18
+ * language id, and never asks again. A read of any other section — including
19
+ * whatever `lsp.configurationRoot` is bound to — then resolves `undefined` with
20
+ * no request on the wire, which is indistinguishable from a setting the user has
21
+ * not set.
22
+ *
23
+ * Asking on first read rather than from a list collected up front: a reader
24
+ * names its section during DI, after `initialized` has taken its one-shot pass,
25
+ * so a list would have to be complete before the server initialized.
26
+ */
27
+ export class HydraniumConfigurationProvider extends DefaultConfigurationProvider {
28
+ /**
29
+ * The client-facing hooks, captured because they arrive once as arguments to
30
+ * {@link initialized} and are needed on every later read. Absent in a
31
+ * headless composition, which has no connection to ask.
32
+ */
33
+ protected registerForSection?: (params: DidChangeConfigurationRegistrationOptions) => void;
34
+ protected fetchSections?: (items: ConfigurationItem[]) => Promise<unknown>;
35
+
36
+ /**
37
+ * Sections already dealt with, holding the in-flight work so concurrent
38
+ * readers share one round trip. Entries stay after they settle: they record
39
+ * that the section was HANDLED, and without that an unset section is
40
+ * re-requested on every read, "unset" and "not fetched" being the same
41
+ * absence in the store.
42
+ *
43
+ * A section the client's capabilities ruled out counts as handled, having
44
+ * been settled by asking nothing.
45
+ */
46
+ protected readonly requestedSections = new Map<string, Promise<void>>();
47
+
48
+ override async initialized(params: ConfigurationInitializedParams): Promise<void> {
49
+ this.registerForSection = params.register;
50
+ this.fetchSections = params.fetchConfiguration;
51
+ await super.initialized(params);
52
+ }
53
+
54
+ /**
55
+ * The `ready` await precedes the emptiness check: the base resolves it at the
56
+ * end of its own initial fetch, so testing the store first calls every
57
+ * language section missing and re-requests what is already on its way.
58
+ */
59
+ override async getConfiguration(language: string, configuration: string): Promise<unknown> {
60
+ await this.ready;
61
+ const section = this.toSectionName(language);
62
+ if (this.settings[section] === undefined) {
63
+ await this.requestSection(section);
64
+ }
65
+ return super.getConfiguration(language, configuration);
66
+ }
67
+
68
+ /** Ask about `section` once, sharing the request with any concurrent reader. */
69
+ protected requestSection(section: string): Promise<void> {
70
+ const existing = this.requestedSections.get(section);
71
+ if (existing) {
72
+ return existing;
73
+ }
74
+ const request = this.doRequestSection(section);
75
+ this.requestedSections.set(section, request);
76
+ return request;
77
+ }
78
+
79
+ /**
80
+ * The hooks are gated on the client having declared `workspace.configuration`.
81
+ * A connection binds them whatever the client said, so their presence is not
82
+ * consent: calling them sends a `client/registerCapability` and a
83
+ * `workspace/configuration` to a client that advertised support for neither,
84
+ * which is entitled to answer either with a method-not-found and may drop the
85
+ * connection.
86
+ *
87
+ * That flag is exact for the fetch and KNOWINGLY coarse for the registration,
88
+ * which the spec governs by
89
+ * `workspace.didChangeConfiguration.dynamicRegistration`. The base registers
90
+ * under `workspace.configuration` alone before any of this runs, so gating
91
+ * the registration on the narrower flag here would withhold a request whose
92
+ * twin has already gone out, sparing the client nothing. A client declaring
93
+ * `workspace.configuration` without dynamic registration is still registered
94
+ * for, by the base and by this; closing that means changing the base's pass,
95
+ * not this gate.
96
+ *
97
+ * Registering before fetching, so an edit landing between the two arrives as
98
+ * a notification instead of being lost; the reverse order drops it.
99
+ *
100
+ * A `null` result is left out of the store rather than written, so the
101
+ * section reads as unset, and no `onConfigurationSectionUpdate` fires — the
102
+ * value goes to the caller that asked for it, and an event would announce a
103
+ * change that is only this provider catching up.
104
+ */
105
+ protected async doRequestSection(section: string): Promise<void> {
106
+ if (!this.workspaceConfig) {
107
+ return;
108
+ }
109
+ this.registerForSection?.({ section });
110
+ if (!this.fetchSections) {
111
+ return;
112
+ }
113
+ const fetched = await this.fetchSections([{ section }]);
114
+ const value = Array.isArray(fetched) ? fetched[0] : fetched;
115
+ if (value !== null && value !== undefined) {
116
+ this.updateSectionConfiguration(section, value);
117
+ }
118
+ }
119
+ }
@@ -7,4 +7,5 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
+ export * from './configuration-provider.js';
10
11
  export * from './settings.js';
@@ -8,14 +8,7 @@
8
8
  ********************************************************************************/
9
9
 
10
10
  import { Format, Logger, type Tracer } from '@hydranium/protocol';
11
- import {
12
- DefaultLangiumProfiler,
13
- DocumentState,
14
- MultiMap,
15
- type ProfilingCategory,
16
- type ProfilingRecord,
17
- ProfilingTask
18
- } from '@hydranium/langium';
11
+ import { DefaultLangiumProfiler, MultiMap, type ProfilingCategory, type ProfilingRecord, ProfilingTask } from '@hydranium/langium';
19
12
  import { type LogNameOptions } from './logger.js';
20
13
  import { type ServerSharedServicesMinimal } from '../shared-services.js';
21
14
 
@@ -29,18 +22,8 @@ export interface LangiumProfilerOptions extends LogNameOptions {
29
22
  * {@link DefaultLangiumProfiler}) to Langium's full set when omitted.
30
23
  */
31
24
  readonly activeCategories?: Set<ProfilingCategory>;
32
- /**
33
- * Priority of the per-build flush pass at the `Validated` phase. The flush is
34
- * normally the only pass at `Validated`, so order is immaterial; the option
35
- * exists for symmetry with the other framework passes. Default
36
- * {@link PROFILER_FLUSH_PASS_PRIORITY}.
37
- */
38
- readonly flushPriority?: number;
39
25
  }
40
26
 
41
- /** Default priority of the profiler's per-build flush pass (see {@link LangiumProfilerOptions.flushPriority}). */
42
- export const PROFILER_FLUSH_PASS_PRIORITY = 0;
43
-
44
27
  /**
45
28
  * Framework adapter over Langium's {@link DefaultLangiumProfiler} that is
46
29
  * **trace-gated** and emits a single **aggregated** per-category breakdown
@@ -54,9 +37,8 @@ export const PROFILER_FLUSH_PASS_PRIORITY = 0;
54
37
  * task identifier), so the per-document records carry no distinguishing
55
38
  * information anyway. We instead accumulate records in {@link records} and
56
39
  * {@link flush} one breakdown per category — self-time and invocation counts
57
- * summed per `$type` across the whole build — on the terminal `Validated`
58
- * build phase (self-registered in the constructor). One report per build, not
59
- * one per file.
40
+ * summed per `$type` across the whole build — when the build ends
41
+ * (subscribed in the constructor). One report per build, not one per file.
60
42
  * - **Transport safety.** The stock per-record dump uses `console.table`, which
61
43
  * is NOT in the set `patchConsole` reroutes; under `vscode-languageserver`'s
62
44
  * `--stdio` transport `process.stdout` *is* the JSON-RPC channel, so the
@@ -74,8 +56,8 @@ export const PROFILER_FLUSH_PASS_PRIORITY = 0;
74
56
  * restart. Langium's own `start`/`stop` category selection still applies *on
75
57
  * top of* the trace gate.
76
58
  *
77
- * Registered eagerly (see `DEFAULT_EAGER_SERVICES`) so its `Validated`-phase
78
- * flush pass is registered before the first build. Gives the per-grammar-rule /
59
+ * Registered eagerly (see `DEFAULT_EAGER_SERVICES`) so its flush is
60
+ * subscribed before the first build. Gives the per-grammar-rule /
79
61
  * per-`$type` parse/link/validate self-time the framework's own
80
62
  * `ServerTracer` / `ProfileSession` passes
81
63
  * cannot produce (those cover the framework's passes *outside* Langium's
@@ -88,16 +70,11 @@ export class HydraniumLangiumProfiler extends DefaultLangiumProfiler {
88
70
  constructor(services: ServerSharedServicesMinimal, options: LangiumProfilerOptions = {}) {
89
71
  super(options.activeCategories);
90
72
  this.tracer = services.Tracer.for(options.logName ?? 'LangiumProfiler').trace('instantiated');
91
- // Flush once per build on the terminal phase rather than once per document.
92
- // By `Validated`, every parse/link/validate record for the batch is in.
93
- // Registered as a build-phase pass (not a direct onBuildPhase listener) so
94
- // every framework + adopter build-phase reaction shares one dispatcher.
95
- services.workspace.BuildPhasePassService.register({
96
- id: 'framework:langium-profiler:flush',
97
- state: DocumentState.Validated,
98
- priority: options.flushPriority ?? PROFILER_FLUSH_PASS_PRIORITY,
99
- run: () => this.flush()
100
- });
73
+ // Flush once per build when it ends rather than once per document. Not at
74
+ // a `Validated` pass: that phase stays silent for a build that validates
75
+ // nothing, the workspace's initial one among them, and the records would
76
+ // then wait for a build that does.
77
+ services.workspace.DocumentBuilder.onBuildEnded(() => this.flush());
101
78
  }
102
79
 
103
80
  /**
@@ -142,14 +119,13 @@ export class HydraniumLangiumProfiler extends DefaultLangiumProfiler {
142
119
  /**
143
120
  * Emit one aggregated breakdown per category — self-time and invocation
144
121
  * counts summed per `<languageId>.<$type>` across every record collected
145
- * this build — then clear the window. Self-registered as a `Validated`-phase
146
- * build pass, so it fires once per build, not per document. Pass explicit
147
- * categories to flush a subset; defaults to all.
122
+ * this build — then clear the window. Called when a build ends, so it fires
123
+ * once per build, not per document. Pass explicit categories to flush a
124
+ * subset; defaults to all.
148
125
  *
149
126
  * `flush` is the sole reset point: because it clears each flushed category,
150
- * memory is bounded per completed build. A build cancelled before `Validated`
151
- * leaves its partial records to roll into the next build's flush (slightly
152
- * inflated counts, self-correcting) rather than accumulating without bound.
127
+ * memory is bounded per build. Builds that throw share one flush, once the
128
+ * lock has drained after them.
153
129
  */
154
130
  flush(...categories: ProfilingCategory[]): void {
155
131
  const toFlush = categories.length > 0 ? categories : ALL_CATEGORIES;