@hydranium/core 1.0.0-next.19 → 1.0.0-next.193

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 (588) hide show
  1. package/README.md +6 -2
  2. package/lib/documents/ast-document-manager.d.ts +222 -63
  3. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  4. package/lib/documents/ast-document-manager.js +250 -83
  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 +138 -0
  15. package/lib/documents/client-session-registry.d.ts.map +1 -0
  16. package/lib/documents/client-session-registry.js +187 -0
  17. package/lib/documents/client-session-registry.js.map +1 -0
  18. package/lib/documents/file-system-task-queue.d.ts +49 -0
  19. package/lib/documents/file-system-task-queue.d.ts.map +1 -0
  20. package/lib/documents/file-system-task-queue.js +34 -0
  21. package/lib/documents/file-system-task-queue.js.map +1 -0
  22. package/lib/documents/hydranium-text-documents.d.ts +523 -101
  23. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  24. package/lib/documents/hydranium-text-documents.js +961 -177
  25. package/lib/documents/hydranium-text-documents.js.map +1 -1
  26. package/lib/documents/index.d.ts +5 -0
  27. package/lib/documents/index.d.ts.map +1 -1
  28. package/lib/documents/index.js +5 -0
  29. package/lib/documents/index.js.map +1 -1
  30. package/lib/documents/language-client-text-shadow.d.ts +41 -9
  31. package/lib/documents/language-client-text-shadow.d.ts.map +1 -1
  32. package/lib/documents/language-client-text-shadow.js +56 -11
  33. package/lib/documents/language-client-text-shadow.js.map +1 -1
  34. package/lib/documents/model-ledger.d.ts +47 -0
  35. package/lib/documents/model-ledger.d.ts.map +1 -0
  36. package/lib/documents/model-ledger.js +30 -0
  37. package/lib/documents/model-ledger.js.map +1 -0
  38. package/lib/documents/self-save-registry.d.ts +37 -6
  39. package/lib/documents/self-save-registry.d.ts.map +1 -1
  40. package/lib/documents/self-save-registry.js +28 -15
  41. package/lib/documents/self-save-registry.js.map +1 -1
  42. package/lib/documents/version-sync-service.d.ts +134 -0
  43. package/lib/documents/version-sync-service.d.ts.map +1 -0
  44. package/lib/documents/version-sync-service.js +171 -0
  45. package/lib/documents/version-sync-service.js.map +1 -0
  46. package/lib/index.d.ts +3 -0
  47. package/lib/index.d.ts.map +1 -1
  48. package/lib/index.js +6 -0
  49. package/lib/index.js.map +1 -1
  50. package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
  51. package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
  52. package/lib/langium/ast-extension/ast-node-builder.d.ts +32 -9
  53. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  54. package/lib/langium/ast-extension/ast-node-builder.js +60 -22
  55. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  56. package/lib/langium/bootstrap.d.ts.map +1 -1
  57. package/lib/langium/bootstrap.js +32 -9
  58. package/lib/langium/bootstrap.js.map +1 -1
  59. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
  60. package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
  61. package/lib/langium/config/configuration-provider.d.ts +81 -0
  62. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  63. package/lib/langium/config/configuration-provider.js +112 -0
  64. package/lib/langium/config/configuration-provider.js.map +1 -0
  65. package/lib/langium/config/index.d.ts +1 -0
  66. package/lib/langium/config/index.d.ts.map +1 -1
  67. package/lib/langium/config/index.js +1 -0
  68. package/lib/langium/config/index.js.map +1 -1
  69. package/lib/langium/config/settings.js.map +1 -1
  70. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
  71. package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
  72. package/lib/langium/diagnostics/logger.d.ts +10 -3
  73. package/lib/langium/diagnostics/logger.d.ts.map +1 -1
  74. package/lib/langium/diagnostics/logger.js +12 -5
  75. package/lib/langium/diagnostics/logger.js.map +1 -1
  76. package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
  77. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  78. package/lib/langium/diagnostics/lsp-logger.js +56 -13
  79. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  80. package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
  81. package/lib/langium/diagnostics/server-tracer.js.map +1 -1
  82. package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
  83. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  84. package/lib/langium/document-builder/build-pipeline-integration.js +32 -5
  85. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  86. package/lib/langium/document-builder/build-session.d.ts +93 -0
  87. package/lib/langium/document-builder/build-session.d.ts.map +1 -0
  88. package/lib/langium/document-builder/build-session.js +72 -0
  89. package/lib/langium/document-builder/build-session.js.map +1 -0
  90. package/lib/langium/document-builder/document-builder.d.ts +382 -29
  91. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  92. package/lib/langium/document-builder/document-builder.js +659 -61
  93. package/lib/langium/document-builder/document-builder.js.map +1 -1
  94. package/lib/langium/document-builder/index.d.ts +1 -0
  95. package/lib/langium/document-builder/index.d.ts.map +1 -1
  96. package/lib/langium/document-builder/index.js +1 -0
  97. package/lib/langium/document-builder/index.js.map +1 -1
  98. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  99. package/lib/langium/documentation/comment-provider.js.map +1 -1
  100. package/lib/langium/integration-services.d.ts +45 -1
  101. package/lib/langium/integration-services.d.ts.map +1 -1
  102. package/lib/langium/integration-services.js +10 -5
  103. package/lib/langium/integration-services.js.map +1 -1
  104. package/lib/langium/integrity/integrity-rule.d.ts +13 -5
  105. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  106. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  107. package/lib/langium/integrity/integrity-service.d.ts +58 -13
  108. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  109. package/lib/langium/integrity/integrity-service.js +204 -29
  110. package/lib/langium/integrity/integrity-service.js.map +1 -1
  111. package/lib/langium/keys/containment.d.ts +64 -0
  112. package/lib/langium/keys/containment.d.ts.map +1 -0
  113. package/lib/langium/keys/containment.js +53 -0
  114. package/lib/langium/keys/containment.js.map +1 -0
  115. package/lib/langium/keys/index.d.ts +1 -0
  116. package/lib/langium/keys/index.d.ts.map +1 -1
  117. package/lib/langium/keys/index.js +1 -0
  118. package/lib/langium/keys/index.js.map +1 -1
  119. package/lib/langium/keys/name-based-key-provider.d.ts +4 -0
  120. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  121. package/lib/langium/keys/name-based-key-provider.js +4 -0
  122. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  123. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  124. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  125. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  126. package/lib/langium/labeling/label-provider.js.map +1 -1
  127. package/lib/langium/language-module.d.ts +27 -2
  128. package/lib/langium/language-module.d.ts.map +1 -1
  129. package/lib/langium/language-module.js +16 -2
  130. package/lib/langium/language-module.js.map +1 -1
  131. package/lib/langium/model-service/client-session.d.ts +330 -0
  132. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  133. package/lib/langium/model-service/client-session.js +418 -0
  134. package/lib/langium/model-service/client-session.js.map +1 -0
  135. package/lib/langium/model-service/index.d.ts +1 -0
  136. package/lib/langium/model-service/index.d.ts.map +1 -1
  137. package/lib/langium/model-service/index.js +1 -0
  138. package/lib/langium/model-service/index.js.map +1 -1
  139. package/lib/langium/model-service/model-service.d.ts +353 -253
  140. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  141. package/lib/langium/model-service/model-service.js +361 -408
  142. package/lib/langium/model-service/model-service.js.map +1 -1
  143. package/lib/langium/module.d.ts +150 -35
  144. package/lib/langium/module.d.ts.map +1 -1
  145. package/lib/langium/module.js +50 -35
  146. package/lib/langium/module.js.map +1 -1
  147. package/lib/langium/naming/name-provider.d.ts +25 -4
  148. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  149. package/lib/langium/naming/name-provider.js +2 -1
  150. package/lib/langium/naming/name-provider.js.map +1 -1
  151. package/lib/langium/naming/name-separator-validation.d.ts +23 -0
  152. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  153. package/lib/langium/naming/name-separator-validation.js +30 -1
  154. package/lib/langium/naming/name-separator-validation.js.map +1 -1
  155. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  156. package/lib/langium/project/abstract-project-manager.js +9 -2
  157. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  158. package/lib/langium/project/project-change-event.d.ts +2 -2
  159. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  160. package/lib/langium/project/single-project-manager.js.map +1 -1
  161. package/lib/langium/residency/cst-residency-service.d.ts +31 -11
  162. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  163. package/lib/langium/residency/cst-residency-service.js +23 -57
  164. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  165. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  166. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  167. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  168. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  169. package/lib/langium/scope/hydranium-scope-provider.d.ts +48 -13
  170. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  171. package/lib/langium/scope/hydranium-scope-provider.js +56 -20
  172. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  173. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  174. package/lib/langium/scope/reference-builder.js.map +1 -1
  175. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  176. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  177. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  178. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  179. package/lib/langium/serialization/abstract-serializer.d.ts +11 -20
  180. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  181. package/lib/langium/serialization/abstract-serializer.js +12 -21
  182. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  183. package/lib/langium/serialization/json-serializer.d.ts +1 -1
  184. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  185. package/lib/langium/serialization/json-serializer.js.map +1 -1
  186. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  187. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  188. package/lib/langium/service-registry.d.ts +15 -1
  189. package/lib/langium/service-registry.d.ts.map +1 -1
  190. package/lib/langium/service-registry.js +16 -0
  191. package/lib/langium/service-registry.js.map +1 -1
  192. package/lib/langium/shared-services.d.ts +21 -4
  193. package/lib/langium/shared-services.d.ts.map +1 -1
  194. package/lib/langium/shared-services.js.map +1 -1
  195. package/lib/langium/transfer/transfer-encoder.d.ts +75 -23
  196. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  197. package/lib/langium/transfer/transfer-encoder.js +44 -21
  198. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  199. package/lib/langium/trivia/comment-preserver.d.ts +423 -0
  200. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  201. package/lib/langium/trivia/comment-preserver.js +906 -0
  202. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  203. package/lib/langium/trivia/document-ending-preserver.d.ts +43 -0
  204. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  205. package/lib/langium/trivia/document-ending-preserver.js +48 -0
  206. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  207. package/lib/langium/trivia/index.d.ts +14 -0
  208. package/lib/langium/trivia/index.d.ts.map +1 -0
  209. package/lib/langium/trivia/index.js +14 -0
  210. package/lib/langium/trivia/index.js.map +1 -0
  211. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  212. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  213. package/lib/langium/trivia/trivia-contribution.js +10 -0
  214. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  215. package/lib/langium/trivia/trivia-preserver.d.ts +50 -0
  216. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  217. package/lib/langium/trivia/trivia-preserver.js +10 -0
  218. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  219. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  220. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  221. package/lib/langium/trivia/trivia-service.js +56 -0
  222. package/lib/langium/trivia/trivia-service.js.map +1 -0
  223. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  224. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  225. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  226. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  227. package/lib/langium/validation/document-validator.d.ts +294 -10
  228. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  229. package/lib/langium/validation/document-validator.js +448 -5
  230. package/lib/langium/validation/document-validator.js.map +1 -1
  231. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  232. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  233. package/lib/langium/workspace/document-uri-policy.d.ts +17 -12
  234. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  235. package/lib/langium/workspace/document-uri-policy.js +10 -9
  236. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  237. package/lib/langium/workspace/file-not-found.d.ts +17 -0
  238. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  239. package/lib/langium/workspace/file-not-found.js +20 -0
  240. package/lib/langium/workspace/file-not-found.js.map +1 -0
  241. package/lib/langium/workspace/file-system-provider.d.ts +84 -8
  242. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  243. package/lib/langium/workspace/file-system-provider.js +93 -14
  244. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  245. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +56 -1
  246. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  247. package/lib/langium/workspace/hydranium-langium-document-factory.js +79 -0
  248. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  249. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
  250. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  251. package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
  252. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  253. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +81 -8
  254. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  255. package/lib/langium/workspace/hydranium-workspace-manager.js +128 -10
  256. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  257. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +25 -2
  258. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  259. package/lib/langium/workspace/in-memory-file-system-provider.js +41 -15
  260. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  261. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  262. package/lib/langium/workspace/index-manager.js.map +1 -1
  263. package/lib/langium/workspace/initialize-workspace.d.ts +31 -2
  264. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  265. package/lib/langium/workspace/initialize-workspace.js +13 -5
  266. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  267. package/lib/langium/workspace/langium-documents.d.ts +86 -17
  268. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  269. package/lib/langium/workspace/langium-documents.js +101 -29
  270. package/lib/langium/workspace/langium-documents.js.map +1 -1
  271. package/lib/langium/workspace/persistent-file-system-provider.d.ts +0 -7
  272. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  273. package/lib/langium/workspace/persistent-file-system-provider.js +0 -7
  274. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  275. package/lib/langium/workspace/virtual-document.d.ts +48 -15
  276. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  277. package/lib/langium/workspace/virtual-document.js +78 -18
  278. package/lib/langium/workspace/virtual-document.js.map +1 -1
  279. package/lib/langium/workspace/write-lock-scope.d.ts +20 -10
  280. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  281. package/lib/langium/workspace/write-lock-scope.js +12 -4
  282. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  283. package/lib/locale/index.d.ts +10 -0
  284. package/lib/locale/index.d.ts.map +1 -0
  285. package/lib/locale/index.js +10 -0
  286. package/lib/locale/index.js.map +1 -0
  287. package/lib/locale/server-locale.d.ts +73 -0
  288. package/lib/locale/server-locale.d.ts.map +1 -0
  289. package/lib/locale/server-locale.js +61 -0
  290. package/lib/locale/server-locale.js.map +1 -0
  291. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  292. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  293. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  294. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  295. package/lib/lsp/connection-features.d.ts +23 -0
  296. package/lib/lsp/connection-features.d.ts.map +1 -0
  297. package/lib/lsp/connection-features.js +60 -0
  298. package/lib/lsp/connection-features.js.map +1 -0
  299. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  300. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  301. package/lib/lsp/diagnostics-connection.js +53 -0
  302. package/lib/lsp/diagnostics-connection.js.map +1 -0
  303. package/lib/lsp/hydranium-document-update-handler.d.ts +90 -79
  304. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  305. package/lib/lsp/hydranium-document-update-handler.js +153 -99
  306. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  307. package/lib/lsp/index.d.ts +3 -1
  308. package/lib/lsp/index.d.ts.map +1 -1
  309. package/lib/lsp/index.js +3 -1
  310. package/lib/lsp/index.js.map +1 -1
  311. package/lib/lsp/lsp-latency.d.ts +39 -0
  312. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  313. package/lib/lsp/lsp-latency.js +58 -0
  314. package/lib/lsp/lsp-latency.js.map +1 -0
  315. package/lib/lsp/semantic-token-provider.d.ts +34 -1
  316. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  317. package/lib/lsp/semantic-token-provider.js +55 -8
  318. package/lib/lsp/semantic-token-provider.js.map +1 -1
  319. package/lib/lsp/shared-module.d.ts +4 -8
  320. package/lib/lsp/shared-module.d.ts.map +1 -1
  321. package/lib/lsp/shared-module.js.map +1 -1
  322. package/lib/lsp/start-language-server.d.ts +8 -7
  323. package/lib/lsp/start-language-server.d.ts.map +1 -1
  324. package/lib/lsp/start-language-server.js +13 -7
  325. package/lib/lsp/start-language-server.js.map +1 -1
  326. package/lib/messages/carriers.d.ts +54 -0
  327. package/lib/messages/carriers.d.ts.map +1 -0
  328. package/lib/messages/carriers.js +62 -0
  329. package/lib/messages/carriers.js.map +1 -0
  330. package/lib/messages/index.d.ts +25 -0
  331. package/lib/messages/index.d.ts.map +1 -0
  332. package/lib/messages/index.js +25 -0
  333. package/lib/messages/index.js.map +1 -0
  334. package/lib/messages/renderer.d.ts +142 -0
  335. package/lib/messages/renderer.d.ts.map +1 -0
  336. package/lib/messages/renderer.js +165 -0
  337. package/lib/messages/renderer.js.map +1 -0
  338. package/lib/node/event-loop-monitor.js.map +1 -1
  339. package/lib/node/heap-ceiling.d.ts +61 -0
  340. package/lib/node/heap-ceiling.d.ts.map +1 -0
  341. package/lib/node/heap-ceiling.js +72 -0
  342. package/lib/node/heap-ceiling.js.map +1 -0
  343. package/lib/node/index.d.ts +1 -0
  344. package/lib/node/index.d.ts.map +1 -1
  345. package/lib/node/index.js +1 -0
  346. package/lib/node/index.js.map +1 -1
  347. package/lib/node/latency-from-env.d.ts +1 -1
  348. package/lib/node/latency-from-env.js +1 -1
  349. package/lib/node/lint-grammar.js.map +1 -1
  350. package/lib/node/measure-memory.d.ts.map +1 -1
  351. package/lib/node/measure-memory.js +1 -0
  352. package/lib/node/measure-memory.js.map +1 -1
  353. package/lib/node/memory-monitor.js.map +1 -1
  354. package/lib/node/node-file-system-provider.d.ts +39 -4
  355. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  356. package/lib/node/node-file-system-provider.js +109 -49
  357. package/lib/node/node-file-system-provider.js.map +1 -1
  358. package/lib/node/process-memory.js.map +1 -1
  359. package/lib/node/profile-capture.d.ts +8 -2
  360. package/lib/node/profile-capture.d.ts.map +1 -1
  361. package/lib/node/profile-capture.js.map +1 -1
  362. package/lib/node/profile-digest.js.map +1 -1
  363. package/lib/node/profiling-run.d.ts +13 -3
  364. package/lib/node/profiling-run.d.ts.map +1 -1
  365. package/lib/node/profiling-run.js +17 -8
  366. package/lib/node/profiling-run.js.map +1 -1
  367. package/lib/node/rename-over-open-readers.d.ts +52 -0
  368. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  369. package/lib/node/rename-over-open-readers.js +66 -0
  370. package/lib/node/rename-over-open-readers.js.map +1 -0
  371. package/lib/node/socket-launcher.d.ts +16 -1
  372. package/lib/node/socket-launcher.d.ts.map +1 -1
  373. package/lib/node/socket-launcher.js +4 -3
  374. package/lib/node/socket-launcher.js.map +1 -1
  375. package/lib/node/stdio-launcher.d.ts +1 -1
  376. package/lib/node/stdio-launcher.d.ts.map +1 -1
  377. package/lib/node/stdio-launcher.js +1 -1
  378. package/lib/node/stdio-launcher.js.map +1 -1
  379. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  380. package/lib/testing/fake-description.js.map +1 -1
  381. package/lib/testing/fake-document.d.ts +16 -4
  382. package/lib/testing/fake-document.d.ts.map +1 -1
  383. package/lib/testing/fake-document.js +18 -3
  384. package/lib/testing/fake-document.js.map +1 -1
  385. package/lib/testing/index.d.ts +1 -1
  386. package/lib/testing/index.d.ts.map +1 -1
  387. package/lib/testing/index.js +2 -1
  388. package/lib/testing/index.js.map +1 -1
  389. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  390. package/lib/testing/langium-test-helpers.js +1 -0
  391. package/lib/testing/langium-test-helpers.js.map +1 -1
  392. package/lib/testing/make-noop-language-services.js.map +1 -1
  393. package/lib/testing/make-noop-shared-services.d.ts +14 -0
  394. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  395. package/lib/testing/make-noop-shared-services.js +28 -2
  396. package/lib/testing/make-noop-shared-services.js.map +1 -1
  397. package/lib/testing/make-test-services.d.ts +69 -14
  398. package/lib/testing/make-test-services.d.ts.map +1 -1
  399. package/lib/testing/make-test-services.js +39 -10
  400. package/lib/testing/make-test-services.js.map +1 -1
  401. package/lib/testing/make-test-tracer.js.map +1 -1
  402. package/lib/testing/node/golden-corpus.js.map +1 -1
  403. package/lib/testing/node/index.d.ts +1 -0
  404. package/lib/testing/node/index.d.ts.map +1 -1
  405. package/lib/testing/node/index.js +1 -0
  406. package/lib/testing/node/index.js.map +1 -1
  407. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  408. package/lib/testing/node/lsp-harness.js +2 -0
  409. package/lib/testing/node/lsp-harness.js.map +1 -1
  410. package/lib/testing/node/lsp-server-connection.d.ts +11 -3
  411. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  412. package/lib/testing/node/lsp-server-connection.js +42 -9
  413. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  414. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  415. package/lib/testing/node/scratch-workspace.js +10 -5
  416. package/lib/testing/node/scratch-workspace.js.map +1 -1
  417. package/lib/testing/node/spawned-server.d.ts +14 -0
  418. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  419. package/lib/testing/node/spawned-server.js +33 -1
  420. package/lib/testing/node/spawned-server.js.map +1 -1
  421. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  422. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  423. package/lib/testing/node/unhandled-rejections.js +32 -0
  424. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  425. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  426. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  427. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  428. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  429. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  430. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  431. package/lib/testing/playwright/index.d.ts +1 -0
  432. package/lib/testing/playwright/index.d.ts.map +1 -1
  433. package/lib/testing/playwright/index.js +1 -0
  434. package/lib/testing/playwright/index.js.map +1 -1
  435. package/lib/testing/playwright/server-log-capture.d.ts +24 -8
  436. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  437. package/lib/testing/playwright/server-log-capture.js +27 -6
  438. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  439. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  440. package/lib/testing/playwright/server-log-rename-reporter.js +10 -1
  441. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  442. package/lib/testing/run-update-pipeline.d.ts +4 -4
  443. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  444. package/lib/testing/stub-ast-document-manager.d.ts +11 -9
  445. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  446. package/lib/testing/stub-ast-document-manager.js +25 -9
  447. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  448. package/lib/testing/stub-document-builder.d.ts +26 -11
  449. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  450. package/lib/testing/stub-document-builder.js +57 -4
  451. package/lib/testing/stub-document-builder.js.map +1 -1
  452. package/lib/testing/stub-hydranium-text-documents.d.ts +22 -7
  453. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  454. package/lib/testing/stub-hydranium-text-documents.js +97 -15
  455. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  456. package/lib/testing/stub-index-manager.js.map +1 -1
  457. package/lib/testing/stub-langium-documents.d.ts +3 -2
  458. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  459. package/lib/testing/stub-langium-documents.js.map +1 -1
  460. package/lib/testing/stub-model-service.d.ts +7 -6
  461. package/lib/testing/stub-model-service.d.ts.map +1 -1
  462. package/lib/testing/stub-model-service.js +4 -4
  463. package/lib/testing/stub-model-service.js.map +1 -1
  464. package/lib/testing/stub-project-manager.js.map +1 -1
  465. package/lib/testing/stub-service-registry.js.map +1 -1
  466. package/lib/util/connection-liveness.d.ts +7 -6
  467. package/lib/util/connection-liveness.d.ts.map +1 -1
  468. package/lib/util/connection-liveness.js +35 -14
  469. package/lib/util/connection-liveness.js.map +1 -1
  470. package/lib/util/environment.d.ts.map +1 -1
  471. package/lib/util/environment.js.map +1 -1
  472. package/lib/util/registry.d.ts.map +1 -1
  473. package/package.json +35 -26
  474. package/src/documents/ast-document-manager.ts +395 -126
  475. package/src/documents/client-ids.ts +5 -22
  476. package/src/documents/client-session-errors.ts +24 -0
  477. package/src/documents/client-session-registry.ts +240 -0
  478. package/src/documents/file-system-task-queue.ts +68 -0
  479. package/src/documents/hydranium-text-documents.ts +1175 -225
  480. package/src/documents/index.ts +5 -0
  481. package/src/documents/language-client-text-shadow.ts +59 -11
  482. package/src/documents/model-ledger.ts +66 -0
  483. package/src/documents/self-save-registry.ts +52 -13
  484. package/src/documents/version-sync-service.ts +267 -0
  485. package/src/index.ts +6 -0
  486. package/src/langium/ast-extension/ast-node-builder.ts +66 -22
  487. package/src/langium/bootstrap.ts +32 -9
  488. package/src/langium/config/configuration-provider.ts +119 -0
  489. package/src/langium/config/index.ts +1 -0
  490. package/src/langium/diagnostics/logger.ts +12 -5
  491. package/src/langium/diagnostics/lsp-logger.ts +58 -12
  492. package/src/langium/document-builder/build-pipeline-integration.ts +50 -5
  493. package/src/langium/document-builder/build-session.ts +87 -0
  494. package/src/langium/document-builder/document-builder.ts +776 -59
  495. package/src/langium/document-builder/index.ts +1 -0
  496. package/src/langium/integration-services.ts +67 -6
  497. package/src/langium/integrity/integrity-rule.ts +13 -5
  498. package/src/langium/integrity/integrity-service.ts +220 -30
  499. package/src/langium/keys/containment.ts +87 -0
  500. package/src/langium/keys/index.ts +1 -0
  501. package/src/langium/keys/name-based-key-provider.ts +4 -0
  502. package/src/langium/language-module.ts +42 -4
  503. package/src/langium/model-service/client-session.ts +649 -0
  504. package/src/langium/model-service/index.ts +1 -0
  505. package/src/langium/model-service/model-service.ts +570 -433
  506. package/src/langium/module.ts +201 -64
  507. package/src/langium/naming/name-provider.ts +27 -5
  508. package/src/langium/naming/name-separator-validation.ts +34 -5
  509. package/src/langium/project/abstract-project-manager.ts +9 -1
  510. package/src/langium/project/project-change-event.ts +2 -2
  511. package/src/langium/residency/cst-residency-service.ts +46 -15
  512. package/src/langium/scope/hydranium-scope-provider.ts +60 -22
  513. package/src/langium/serialization/abstract-serializer.ts +13 -32
  514. package/src/langium/service-registry.ts +19 -2
  515. package/src/langium/shared-services.ts +25 -4
  516. package/src/langium/transfer/transfer-encoder.ts +102 -34
  517. package/src/langium/trivia/comment-preserver.ts +1100 -0
  518. package/src/langium/trivia/document-ending-preserver.ts +55 -0
  519. package/src/langium/trivia/index.ts +14 -0
  520. package/src/langium/trivia/trivia-contribution.ts +39 -0
  521. package/src/langium/trivia/trivia-preserver.ts +54 -0
  522. package/src/langium/trivia/trivia-service.ts +99 -0
  523. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  524. package/src/langium/validation/document-validator.ts +537 -11
  525. package/src/langium/workspace/document-uri-policy.ts +17 -12
  526. package/src/langium/workspace/file-not-found.ts +23 -0
  527. package/src/langium/workspace/file-system-provider.ts +153 -16
  528. package/src/langium/workspace/hydranium-langium-document-factory.ts +117 -0
  529. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
  530. package/src/langium/workspace/hydranium-workspace-manager.ts +153 -13
  531. package/src/langium/workspace/in-memory-file-system-provider.ts +47 -16
  532. package/src/langium/workspace/initialize-workspace.ts +43 -5
  533. package/src/langium/workspace/langium-documents.ts +124 -33
  534. package/src/langium/workspace/persistent-file-system-provider.ts +0 -7
  535. package/src/langium/workspace/virtual-document.ts +96 -19
  536. package/src/langium/workspace/write-lock-scope.ts +24 -11
  537. package/src/locale/index.ts +10 -0
  538. package/src/locale/server-locale.ts +86 -0
  539. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  540. package/src/lsp/connection-features.ts +67 -0
  541. package/src/lsp/diagnostics-connection.ts +56 -0
  542. package/src/lsp/hydranium-document-update-handler.ts +185 -106
  543. package/src/lsp/index.ts +3 -1
  544. package/src/lsp/lsp-latency.ts +62 -0
  545. package/src/lsp/semantic-token-provider.ts +74 -7
  546. package/src/lsp/shared-module.ts +4 -8
  547. package/src/lsp/start-language-server.ts +13 -7
  548. package/src/messages/carriers.ts +78 -0
  549. package/src/messages/index.ts +36 -0
  550. package/src/messages/renderer.ts +212 -0
  551. package/src/node/heap-ceiling.ts +108 -0
  552. package/src/node/index.ts +1 -0
  553. package/src/node/latency-from-env.ts +1 -1
  554. package/src/node/measure-memory.ts +1 -0
  555. package/src/node/node-file-system-provider.ts +122 -51
  556. package/src/node/profile-capture.ts +8 -2
  557. package/src/node/profiling-run.ts +30 -8
  558. package/src/node/rename-over-open-readers.ts +78 -0
  559. package/src/node/socket-launcher.ts +19 -4
  560. package/src/node/stdio-launcher.ts +1 -2
  561. package/src/testing/fake-document.ts +24 -5
  562. package/src/testing/index.ts +2 -1
  563. package/src/testing/langium-test-helpers.ts +1 -0
  564. package/src/testing/make-noop-shared-services.ts +50 -2
  565. package/src/testing/make-test-services.ts +120 -31
  566. package/src/testing/node/index.ts +1 -0
  567. package/src/testing/node/lsp-harness.ts +2 -0
  568. package/src/testing/node/lsp-server-connection.ts +61 -11
  569. package/src/testing/node/scratch-workspace.ts +10 -5
  570. package/src/testing/node/spawned-server.ts +35 -1
  571. package/src/testing/node/unhandled-rejections.ts +31 -0
  572. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  573. package/src/testing/playwright/index.ts +1 -0
  574. package/src/testing/playwright/server-log-capture.ts +45 -11
  575. package/src/testing/playwright/server-log-rename-reporter.ts +12 -1
  576. package/src/testing/run-update-pipeline.ts +4 -4
  577. package/src/testing/stub-ast-document-manager.ts +40 -23
  578. package/src/testing/stub-document-builder.ts +83 -17
  579. package/src/testing/stub-hydranium-text-documents.ts +133 -23
  580. package/src/testing/stub-langium-documents.ts +3 -2
  581. package/src/testing/stub-model-service.ts +9 -8
  582. package/src/util/connection-liveness.ts +37 -14
  583. package/src/util/environment.ts +9 -1
  584. package/lib/lsp/instrument-connection.d.ts +0 -36
  585. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  586. package/lib/lsp/instrument-connection.js +0 -62
  587. package/lib/lsp/instrument-connection.js.map +0 -1
  588. package/src/lsp/instrument-connection.ts +0 -66
@@ -8,30 +8,43 @@
8
8
  ********************************************************************************/
9
9
 
10
10
  import { type Clock, type Logger, type Project, type Tracer, type TransferDiagnostic, NoopLogger, SystemClock } from '@hydranium/protocol';
11
+ import { DefaultServerLocale, type ServerLocale } from '../locale/server-locale.js';
12
+ import { DefaultMessageRenderer, type MessageRenderer } from '../messages/renderer.js';
11
13
  import { ServerTracer } from './diagnostics/server-tracer.js';
12
14
  import { HydraniumLangiumProfiler } from './diagnostics/hydranium-langium-profiler.js';
13
15
  import { type AstNode, type Module } from '@hydranium/langium';
14
16
  import { type DefaultSharedModuleContext, type LangiumSharedServices, type PartialLangiumSharedServices } from '@hydranium/langium/lsp';
15
17
  import { type TextDocument } from 'vscode-languageserver-textdocument';
16
- import { ModelService } from './model-service/model-service.js';
18
+ import { type ClientSessionFactory, DefaultClientSessionFactory } from './model-service/client-session.js';
19
+ import { DefaultModelService, type ModelService } from './model-service/model-service.js';
17
20
  import { type ProjectManager } from './project/project-manager.js';
18
21
  import { SingleProjectManager } from './project/single-project-manager.js';
19
- import { TransferEncoder } from './transfer/transfer-encoder.js';
22
+ import { DefaultTransferEncoder, type TransferEncoder } from './transfer/transfer-encoder.js';
20
23
  import { HydraniumDocumentBuilder } from './document-builder/document-builder.js';
21
- import { BuildPipelineIntegration } from './document-builder/build-pipeline-integration.js';
24
+ import { DefaultBuildPipelineIntegration, type BuildPipelineIntegration } from './document-builder/build-pipeline-integration.js';
22
25
  import { type BuildPhasePassContribution } from './build-phase-pass/build-phase-pass.js';
23
26
  import { type BuildPhasePassService, DefaultBuildPhasePassService } from './build-phase-pass/build-phase-pass-service.js';
24
- import { CstResidencyService } from './residency/index.js';
27
+ import { DefaultCstResidencyService, type CstResidencyService } from './residency/index.js';
28
+ import { HydraniumConfigurationProvider } from './config/configuration-provider.js';
25
29
  import { HydraniumIndexManager } from './workspace/index-manager.js';
26
30
  import { HydraniumWorkspaceManager } from './workspace/hydranium-workspace-manager.js';
27
31
  import { HydraniumWorkspaceLock } from './workspace/hydranium-workspace-lock.js';
28
32
  import { HydraniumLangiumDocumentFactory } from './workspace/hydranium-langium-document-factory.js';
33
+ import { type HydraniumDocumentRegistry, HydraniumLangiumDocuments } from './workspace/langium-documents.js';
29
34
  import { type AdditionalDocumentContribution } from './workspace/additional-document-contribution.js';
30
35
  import { DefaultDocumentUriPolicy, type DocumentUriPolicy } from './workspace/document-uri-policy.js';
31
36
  import { HydraniumTextDocuments } from '../documents/hydranium-text-documents.js';
32
- import { AstDocumentManager, type WritableFileSystemProvider } from '../documents/ast-document-manager.js';
33
- import { SelfSaveRegistry } from '../documents/self-save-registry.js';
34
- import { DefaultEmptyFileSystemProvider } from './workspace/file-system-provider.js';
37
+ import { DefaultAstDocumentManager, type AstDocumentManager, type WritableFileSystemProvider } from '../documents/ast-document-manager.js';
38
+ import { DefaultSelfSaveRegistry, type SelfSaveRegistry } from '../documents/self-save-registry.js';
39
+ import { DefaultFileSystemTaskQueue, type FileSystemTaskQueue } from '../documents/file-system-task-queue.js';
40
+ import { DefaultModelLedger, type ModelLedger } from '../documents/model-ledger.js';
41
+ import { DefaultVersionSyncService, type VersionSyncService } from '../documents/version-sync-service.js';
42
+ import {
43
+ DefaultEmptyFileSystemProvider,
44
+ DefaultFileSystemProviderRegistry,
45
+ type FileSystemProviderRegistry
46
+ } from './workspace/file-system-provider.js';
47
+ import { VIRTUAL_SCHEME, VirtualFileSystemProvider } from './workspace/virtual-document.js';
35
48
  import { type ServerLanguageServices } from './language-module.js';
36
49
  import { ExtendedServiceRegistry } from './service-registry.js';
37
50
 
@@ -43,7 +56,10 @@ import { ExtendedServiceRegistry } from './service-registry.js';
43
56
  * these shared services; per-head shared bindings, if any, are
44
57
  * contributed by additional modules layered after this one.
45
58
  */
46
- export interface ServerAddedSharedServices<TProject extends Project = Project> {
59
+ export interface ServerAddedSharedServices<
60
+ TProject extends Project = Project,
61
+ TDiagnostic extends TransferDiagnostic = TransferDiagnostic
62
+ > {
47
63
  /**
48
64
  * Injectable time source. Framework default is {@link SystemClock} (real
49
65
  * `Date.now` / `performance.now` / `setTimeout`); tests bind a fake to
@@ -91,6 +107,24 @@ export interface ServerAddedSharedServices<TProject extends Project = Project> {
91
107
  * plain `DefaultTracer` with their own `MemoryReader`.
92
108
  */
93
109
  Tracer: Tracer;
110
+ /**
111
+ * Renders each user-facing message once, before the server sends it — so
112
+ * every message is rendered by the side that knows the reading user's
113
+ * language. All three heads inherit one diagnostics pass, which is what
114
+ * makes this the single slot an adopter with i18n rebinds; the same binding
115
+ * serves framework codes and their own `defineMessage` codes alike.
116
+ *
117
+ * The framework ships English only and selects no locale, so the default
118
+ * returns every sentence unchanged. Adopters subclass and override
119
+ * `translationsFor`.
120
+ */
121
+ MessageRenderer: MessageRenderer;
122
+ /**
123
+ * The locale an init handed the server, for whoever renders in it. Held
124
+ * apart from the renderer so replacing the renderer cannot drop locale
125
+ * handling.
126
+ */
127
+ ServerLocale: ServerLocale;
94
128
  /**
95
129
  * LSP-bound slots layered on top of Langium's `LangiumSharedLSPServices`.
96
130
  * The framework contributes a single string slot here —
@@ -113,6 +147,12 @@ export interface ServerAddedSharedServices<TProject extends Project = Project> {
113
147
  workspace: {
114
148
  /* override */ TextDocuments: HydraniumTextDocuments<TextDocument>;
115
149
  /* override */ WorkspaceManager: HydraniumWorkspaceManager;
150
+ /**
151
+ * Narrow Langium's registry slot to the framework surface, which adds
152
+ * `createEmptyDocument` — reachable only through this narrowing, and
153
+ * wanted by a scope provider querying a URI before the file exists.
154
+ */
155
+ /* override */ LangiumDocuments: HydraniumDocumentRegistry;
116
156
  /**
117
157
  * Narrow Langium's `IndexManager` slot to the framework subclass, which
118
158
  * layers an `elementsByName` map over Langium's index and exposes
@@ -127,12 +167,11 @@ export interface ServerAddedSharedServices<TProject extends Project = Project> {
127
167
  * the `awaitDocumentState` bug-fix, framework-wired phase logs,
128
168
  * and the `markNextReason` observability primitive without
129
169
  * binding the slot explicitly. The
130
- * `HydraniumDocumentUpdateHandler`'s `dispatch` calls this
131
- * slot's `markNextReason` to stage the LSP event that triggered
132
- * the build, for a subclass's build logging to tag its line with,
133
- * so narrowing here is a load-bearing type contract — adopters who
134
- * explicitly downgrade to Langium's default lose that call site's
135
- * compile-time target.
170
+ * `HydraniumDocumentUpdateHandler`'s `dispatch` and
171
+ * `ModelService.rebuild` build through this slot's
172
+ * `scheduleUpdate`, so narrowing here is a load-bearing contract:
173
+ * a builder without it fails every LSP-driven build, and every
174
+ * session write that takes the lock, at run time.
136
175
  */
137
176
  /* override */ DocumentBuilder: HydraniumDocumentBuilder;
138
177
  /**
@@ -146,20 +185,36 @@ export interface ServerAddedSharedServices<TProject extends Project = Project> {
146
185
  */
147
186
  /* override */ WorkspaceLock: HydraniumWorkspaceLock;
148
187
  /**
149
- * Tighten Langium's read-only `FileSystemProvider` slot to
150
- * {@link WritableFileSystemProvider}. The framework's save path
151
- * ({@link AstDocumentManager.save}, integrity corrections,
152
- * `ModelService.save`) requires write semantics — a read-only slot
153
- * type forces an `as WritableFileSystemProvider` cast at the binding
154
- * line and defers the failure of a read-only implementation to the
155
- * first save. The `.`-entry default is
156
- * {@link DefaultEmptyFileSystemProvider}, which is what keeps the core
157
- * barrel free of `node:fs` and therefore browser-bundleable; a Node host
158
- * binds `@hydranium/core/node`'s Node-backed provider (wired to
159
- * {@link SelfSaveRegistry}) instead, and adopters override with their own
188
+ * Tighten Langium's read-only `FileSystemProvider` slot to a
189
+ * {@link FileSystemProviderRegistry}, which is writable: the
190
+ * framework's save path ({@link AstDocumentManager.save}, integrity
191
+ * corrections, a session's `save`) requires write semantics, and a
192
+ * read-only slot type defers the failure of a read-only
193
+ * implementation to the first save.
194
+ *
195
+ * Bound to {@link DefaultFileSystemProviderRegistry}, which dispatches
196
+ * by scheme to the {@link ServerAddedSharedServices.fileSystemProviders}
197
+ * group and sends every other scheme to its `host`: the provider
198
+ * `context.fileSystemProvider` returns when it is writable, or else
199
+ * `DefaultEmptyFileSystemProvider`, which is what keeps the core
200
+ * barrel free of `node:fs` and therefore browser-bundleable. A Node
201
+ * host passes `@hydranium/core/node`'s Node-backed provider (wired to
202
+ * {@link SelfSaveRegistry}) instead, and adopters pass their own
160
203
  * writable implementation when neither fits.
204
+ *
205
+ * To reach the members of its own provider, an adopter declares this
206
+ * slot as `FileSystemProviderRegistry<MyProvider>` through
207
+ * {@link WithServiceOverrides}, binds a
208
+ * `DefaultFileSystemProviderRegistry` with that host from a factory
209
+ * whose return type names the narrowed slot (a module's `DeepPartial`
210
+ * checks no host member otherwise), and reads
211
+ * `FileSystemProvider.host`. A
212
+ * registry that serves a seeded document under none of its providers
213
+ * loses the document at its last close, which
214
+ * {@link HydraniumWorkspaceManager.warnIfDocumentsUnserved} reports
215
+ * once at startup.
161
216
  */
162
- /* override */ FileSystemProvider: WritableFileSystemProvider;
217
+ /* override */ FileSystemProvider: FileSystemProviderRegistry;
163
218
  ProjectManager: ProjectManager<TProject>;
164
219
  SelfSaveRegistry: SelfSaveRegistry;
165
220
  /**
@@ -188,7 +243,13 @@ export interface ServerAddedSharedServices<TProject extends Project = Project> {
188
243
  * that need to narrow the diagnostic type or override lifecycle
189
244
  * behaviour rebind this slot with a subclass.
190
245
  */
191
- AstDocumentManager: AstDocumentManager<AstNode, unknown>;
246
+ AstDocumentManager: AstDocumentManager<AstNode>;
247
+ /**
248
+ * Orders the server's disk accesses of each file. One slot for every
249
+ * reader and writer: a service given a queue of its own does not order
250
+ * against the others.
251
+ */
252
+ FileSystemTaskQueue: FileSystemTaskQueue;
192
253
  /**
193
254
  * Wires the framework's build-time features (integrity, AST
194
255
  * enrichment) into Langium's build pipeline: owns the build-phase
@@ -220,6 +281,10 @@ export interface ServerAddedSharedServices<TProject extends Project = Project> {
220
281
  * strategy (`shed-closed-when-idle`) to enable shedding.
221
282
  */
222
283
  CstResidencyService: CstResidencyService;
284
+ /** The version of the text each root was parsed from. */
285
+ ModelLedger: ModelLedger;
286
+ /** Reconciles each produced root with the store, and owns every build that syncs a root to its text or recovers one. */
287
+ VersionSyncService: VersionSyncService;
223
288
  };
224
289
  /**
225
290
  * In-process workspace facade ({@link ModelService}) + AST→transfer
@@ -228,15 +293,25 @@ export interface ServerAddedSharedServices<TProject extends Project = Project> {
228
293
  * heads read both slots from shared services rather than constructor
229
294
  * arguments.
230
295
  *
231
- * Slot types use the upper bounds (`unknown` for encoder map / facade
232
- * generics, {@link TransferDiagnostic} for the encoder's wire-diagnostic
233
- * shape) so adopter subclasses with narrower typed overlays satisfy
234
- * the slot via output-position covariance — `TDiagnostic` appears
235
- * only in encoder return positions.
296
+ * `TransferEncoder` is the INTERFACE, not `DefaultTransferEncoder` — an
297
+ * adopter can therefore REPLACE this declaration (see
298
+ * {@link WithServiceOverrides}) rather than intersect with it, which is what
299
+ * keeps slot resolution independent of the order a services type is written
300
+ * in. `ModelService` is an interface for the same reason.
301
+ *
302
+ * A class in a slot costs two things, both measured. Its `protected` members
303
+ * join every assignability check and are compared NOMINALLY, so a subclass
304
+ * declared against a second physical copy of this package cannot satisfy it.
305
+ * And where the class is generic over a map reached through `keyof`, that
306
+ * parameter is measured INVARIANT — instantiations then relate only when
307
+ * their arguments are mutually assignable, which no adopter map is with the
308
+ * framework's. Neither survives on an interface.
236
309
  */
237
310
  model: {
238
- TransferEncoder: TransferEncoder<unknown, TransferDiagnostic>;
239
- ModelService: ModelService<AstNode, unknown>;
311
+ TransferEncoder: TransferEncoder<TDiagnostic>;
312
+ ModelService: ModelService<AstNode>;
313
+ /** Builds the handle of every session `ModelService.createSession` starts. */
314
+ ClientSessionFactory: ClientSessionFactory;
240
315
  };
241
316
  /**
242
317
  * Shared contribution group for batch-level build-phase passes (see
@@ -259,6 +334,15 @@ export interface ServerAddedSharedServices<TProject extends Project = Project> {
259
334
  * contribute none never touch it.
260
335
  */
261
336
  additionalDocuments: Record<string, AdditionalDocumentContribution>;
337
+ /**
338
+ * Shared contribution group of file system providers keyed by the URI
339
+ * scheme each answers for, which {@link FileSystemProviderRegistry}
340
+ * dispatches to. The framework registers {@link VirtualFileSystemProvider}
341
+ * under `virtual`; an adopter deep-merges a provider for a scheme of its
342
+ * own, and an entry under `virtual` replaces the framework's. A scheme with
343
+ * no entry goes to the registry's `host`.
344
+ */
345
+ fileSystemProviders: Record<string, WritableFileSystemProvider>;
262
346
  }
263
347
 
264
348
  /**
@@ -274,10 +358,57 @@ export interface ServerAddedSharedServices<TProject extends Project = Project> {
274
358
  * `ClientTextDocumentChangeEvent` payload (with `clientId`);
275
359
  * `ServiceRegistry.getServices(uri)` keeps the
276
360
  * {@link ServerLanguageServices} return shape.
361
+ *
362
+ * `TDiagnostic` is the diagnostic the bound `model.TransferEncoder` emits. A
363
+ * head that sends a narrower diagnostic than `TransferDiagnostic` takes
364
+ * services typed with it, so none of its envelopes claims a shape the encoder
365
+ * does not produce.
277
366
  */
278
- export type ServerSharedServices<TProject extends Project = Project> = Omit<LangiumSharedServices, 'workspace' | 'ServiceRegistry'> & {
367
+ export type ServerSharedServices<TProject extends Project = Project, TDiagnostic extends TransferDiagnostic = TransferDiagnostic> = Omit<
368
+ LangiumSharedServices,
369
+ 'workspace' | 'ServiceRegistry'
370
+ > & {
279
371
  workspace: Omit<LangiumSharedServices['workspace'], 'TextDocuments' | 'DocumentBuilder'>;
280
- } & ServerAddedSharedServices<TProject>;
372
+ } & ServerAddedSharedServices<TProject, TDiagnostic>;
373
+
374
+ /**
375
+ * The service-tree namespaces — the keys whose value groups further slots
376
+ * rather than being a slot itself.
377
+ *
378
+ * Consumed by {@link WithServiceOverrides} to know where to merge one level
379
+ * deeper. **Add a namespace to {@link ServerAddedSharedServices} and you must
380
+ * add it here**, and the failure of forgetting is silent in the direction that
381
+ * matters: an unlisted namespace is treated as a leaf, so an adopter overriding
382
+ * one slot inside it replaces the WHOLE namespace and loses the sibling slots
383
+ * with no diagnostic. The reverse mistake — listing a leaf — fails loudly.
384
+ */
385
+ type ServiceNamespace = 'lsp' | 'workspace' | 'model';
386
+
387
+ /**
388
+ * Compose an adopter's service tree so its declarations REPLACE the framework's
389
+ * rather than intersecting with them.
390
+ *
391
+ * Langium composes services by intersection, which accumulates: two
392
+ * declarations of one slot survive as an overload set, and which one a call
393
+ * resolves to depends on the order the intersection was written in — silently,
394
+ * with no diagnostic at the point a reorder changes it. There is no override
395
+ * operator for intersections, so the framework's declaration has to be removed
396
+ * before the adopter's is added. This does that, one level deep for each
397
+ * {@link ServiceNamespace}, so a narrowed slot replaces its framework twin
398
+ * while its siblings survive.
399
+ *
400
+ * Only slots typed as INTERFACES can be replaced this way. A class-typed slot
401
+ * drags its `protected` members into the assignability check — compared
402
+ * nominally — so an adopter subclass does not satisfy it and the framework's
403
+ * declaration cannot be dropped.
404
+ */
405
+ export type WithServiceOverrides<TBase, TOverrides> = Omit<TBase, keyof TOverrides> & {
406
+ [K in keyof TOverrides]: K extends ServiceNamespace
407
+ ? K extends keyof TBase
408
+ ? Omit<TBase[K], keyof TOverrides[K]> & TOverrides[K]
409
+ : TOverrides[K]
410
+ : TOverrides[K];
411
+ };
281
412
 
282
413
  /**
283
414
  * Construction context for {@link createServerSharedModule}.
@@ -327,6 +458,8 @@ export function createServerSharedModule(
327
458
  ServiceRegistry: services => new ExtendedServiceRegistry<ServerLanguageServices>(services),
328
459
  Logger: () => new NoopLogger(),
329
460
  Tracer: services => new ServerTracer(services.Logger, services.Clock),
461
+ ServerLocale: services => new DefaultServerLocale(services),
462
+ MessageRenderer: services => new DefaultMessageRenderer(services),
330
463
  // Bind Langium's per-grammar-rule / per-`$type` parse/link/validate
331
464
  // profiler (the data the framework's own `Tracer`/`ProfileSession` passes
332
465
  // cannot produce), routed through our `Logger` and debug-gated. At the
@@ -388,59 +521,63 @@ export function createServerSharedModule(
388
521
  TextDocuments: services => new HydraniumTextDocuments(services),
389
522
  WorkspaceManager: services => new HydraniumWorkspaceManager(services),
390
523
  IndexManager: services => new HydraniumIndexManager(services),
524
+ // Langium's default asks only about sections named after registered
525
+ // language ids, so a section `lsp.configurationRoot` is bound to reads
526
+ // `undefined` forever with no request on the wire.
527
+ ConfigurationProvider: services => new HydraniumConfigurationProvider(services),
391
528
  // Override Langium's factory so a `fromModel` (code-built) virtual
392
529
  // document retains serialized text via the per-language Serializer,
393
- // making it re-read-safe through the virtual-aware FileSystemProvider.
530
+ // making it re-read-safe through `VirtualFileSystemProvider`.
394
531
  LangiumDocumentFactory: services => new HydraniumLangiumDocumentFactory(services),
532
+ // Langium's default routes through no identity seam and treats every
533
+ // failed load alike, so leaving this unbound opts a server out of both
534
+ // with nothing to signal it.
535
+ LangiumDocuments: services => new HydraniumLangiumDocuments(services),
395
536
  DocumentBuilder: services => new HydraniumDocumentBuilder(services),
396
537
  // The write-lock scope this marks is inert unless a host installs a
397
538
  // scope tracker — `@hydranium/core/node` does.
398
- WorkspaceLock: () => new HydraniumWorkspaceLock(),
539
+ WorkspaceLock: services => new HydraniumWorkspaceLock(services),
399
540
  ProjectManager: services => new SingleProjectManager(services),
400
- SelfSaveRegistry: services => new SelfSaveRegistry(services),
541
+ SelfSaveRegistry: services => new DefaultSelfSaveRegistry(services),
401
542
  DocumentUriPolicy: () => new DefaultDocumentUriPolicy(),
402
- // Writable filesystem with two paths:
403
- // - Adopter passed `context.fileSystemProvider` and it returned a
404
- // writable implementation (has `writeFile`) — use it. Honours the
405
- // Langium-conventional context channel for passing a custom backing
406
- // (in-memory, browser, test stub like `DefaultEmptyFileSystemProvider`).
407
- // - Otherwise — the portable default `DefaultEmptyFileSystemProvider`
408
- // (no-op writes, no disk access). Node hosts opt into real disk I/O
409
- // by binding `@hydranium/core/node`'s `DefaultFileSystemProvider`
410
- // (Node-backed, wired to `SelfSaveRegistry` so framework `writeFile`
411
- // calls register their mtime and adopters can suppress the
412
- // `didChangeWatchedFiles` echo) — typically via this same
413
- // `context.fileSystemProvider` channel or by rebinding
414
- // the slot. Keeping the `.`-entry default empty is what lets the
415
- // core barrel stay free of `node:fs` (browser-bundleable); see the
416
- // `@hydranium/core/node` carve.
543
+ // The host is the provider `context.fileSystemProvider` returns
544
+ // when it is writable (has `writeFile`); anything narrower gets the
545
+ // empty provider, which is what keeps the core barrel free of
546
+ // `node:fs`.
417
547
  FileSystemProvider: services => {
418
548
  const fromContext = context.fileSystemProvider?.(services);
419
- if (fromContext && typeof (fromContext as Partial<WritableFileSystemProvider>).writeFile === 'function') {
420
- return fromContext as WritableFileSystemProvider;
421
- }
422
- return new DefaultEmptyFileSystemProvider(services);
549
+ const writable = typeof (fromContext as Partial<WritableFileSystemProvider> | undefined)?.writeFile === 'function';
550
+ return new DefaultFileSystemProviderRegistry(services, {
551
+ host: writable ? (fromContext as WritableFileSystemProvider) : new DefaultEmptyFileSystemProvider(services)
552
+ });
423
553
  },
424
- AstDocumentManager: services => new AstDocumentManager(services),
554
+ AstDocumentManager: services => new DefaultAstDocumentManager(services),
555
+ FileSystemTaskQueue: services => new DefaultFileSystemTaskQueue(services),
425
556
  // Eagerly constructed, so its build-phase listeners attach before the
426
557
  // first build.
427
- BuildPipelineIntegration: services => new BuildPipelineIntegration(services),
558
+ BuildPipelineIntegration: services => new DefaultBuildPipelineIntegration(services),
428
559
  BuildPhasePassService: services => new DefaultBuildPhasePassService(services),
429
560
  // Eagerly constructed, so its `Validated` pass registers before the
430
561
  // first build.
431
- CstResidencyService: services => new CstResidencyService(services)
562
+ CstResidencyService: services => new DefaultCstResidencyService(services),
563
+ ModelLedger: () => new DefaultModelLedger(),
564
+ VersionSyncService: services => new DefaultVersionSyncService(services)
432
565
  },
433
566
  model: {
434
567
  // Generic walker — adopters with a typed `$type → wire shape` overlay
435
568
  // rebind this slot with a subclass.
436
- TransferEncoder: services => new TransferEncoder(services),
437
- ModelService: services => new ModelService(services)
569
+ TransferEncoder: services => new DefaultTransferEncoder(services),
570
+ ModelService: services => new DefaultModelService(services),
571
+ ClientSessionFactory: services => new DefaultClientSessionFactory(services)
438
572
  },
439
573
  // Empty default so `services.buildPhasePasses` always resolves (Langium
440
574
  // throws on access to an unbound slot). The framework's own integrity /
441
575
  // profiler passes self-register imperatively, not here.
442
576
  buildPhasePasses: {},
443
577
  // Empty default so `services.additionalDocuments` always resolves.
444
- additionalDocuments: {}
578
+ additionalDocuments: {},
579
+ fileSystemProviders: {
580
+ [VIRTUAL_SCHEME]: services => new VirtualFileSystemProvider(services)
581
+ }
445
582
  };
446
583
  }
@@ -59,6 +59,16 @@ export interface NameProviderOptions {
59
59
  * an `id` field) override explicitly; the explicit override at
60
60
  * the adopter side documents the grammar's convention rather than
61
61
  * burying it in a framework default.
62
+ *
63
+ * **The override is not optional where `name` is a display LABEL rather
64
+ * than an identifier**, and getting it wrong is quiet at first and then
65
+ * loud. A `name=STRING` holding `"Order.Line"` is legitimate content, but
66
+ * the default reads it as the identifier: `getName` composes a qualified
67
+ * name whose segments cannot be told apart from the label's own dots, and
68
+ * `nameSeparatorCheck` reports `hydranium/core/separator-in-name` on every
69
+ * such node. That diagnostic then names the wrong remedy — it asks for a
70
+ * different character, when the fix is to point this option at the property
71
+ * that really is the identifier.
62
72
  */
63
73
  readonly nameProperties?: readonly string[];
64
74
  }
@@ -244,10 +254,21 @@ export interface NameProvider extends LangiumNameProvider {
244
254
  /**
245
255
  * Find a unique name for a new node within `container`, using `base`
246
256
  * as a stem. Walks the AST subtree rooted at `container` and avoids
247
- * names already used by `$type === type` nodes there. Default
248
- * generates `${base}1`, `${base}2`, ... until an unused value is
249
- * found. Used by create-element operation handlers when the
250
- * uniqueness scope is one AST subtree.
257
+ * names already held there by nodes of `type` or of any subtype of it,
258
+ * as `AstReflection.isSubtype` reports. Default generates `${base}1`,
259
+ * `${base}2`, ... until an unused value is found. Used by create-element
260
+ * operation handlers when the uniqueness scope is one AST subtree.
261
+ *
262
+ * Subtype-closed rather than `$type`-exact, because a name space shared by
263
+ * several concrete types is named by their common supertype and by no
264
+ * concrete type at all — the shape a cross-reference whose target type is
265
+ * that supertype produces. An exact filter finds no collisions for such a
266
+ * call and returns the proposal unchanged, which a caller cannot tell from
267
+ * a name that was genuinely free.
268
+ * {@link NameProvider.findNextDocumentQualifiedName} and
269
+ * {@link NameProvider.findNextProjectQualifiedName} resolve `type` the same
270
+ * way, through `IndexManager.allElements`, so one type argument does not
271
+ * mean different sets at different tiers.
251
272
  */
252
273
  findNextName(type: string, base: string, container: AstNode): string;
253
274
 
@@ -486,8 +507,9 @@ export class DefaultNameProvider implements NameProvider {
486
507
 
487
508
  findNextName(type: string, base: string, container: AstNode): string {
488
509
  const proposal = base.replaceAll(this.nameSeparator, '_');
510
+ const reflection = this.services.shared.AstReflection;
489
511
  const knownNames = AstUtils.streamAst(container)
490
- .filter(node => node.$type === type)
512
+ .filter(node => reflection.isSubtype(node.$type, type))
491
513
  .map(node => this.getOwnName(node))
492
514
  .nonNullable()
493
515
  .toArray();
@@ -8,10 +8,39 @@
8
8
  ********************************************************************************/
9
9
 
10
10
  import { type AstNode, type ValidationAcceptor, type ValidationChecks } from '@hydranium/langium';
11
+ import { defineMessage } from '@hydranium/protocol';
12
+ import { acceptMessage } from '../../messages/carriers.js';
11
13
  import { type ServerLanguageServices } from '../language-module.js';
12
14
  import { type ValidationCheckContribution, type ValidationCheckRegistry } from '../validation/validation-contribution.js';
13
15
  import type { NameProvider } from './name-provider.js';
14
16
 
17
+ /**
18
+ * A name value that collides with the qualified-name separator.
19
+ *
20
+ * **The sentence addresses a MODELLER, and the remedy it names is theirs**:
21
+ * where `name` really is the identifier, a different character is the fix and
22
+ * the only one available to whoever is typing.
23
+ *
24
+ * **The adopter-facing failure is a different one, and this message cannot
25
+ * carry it.** With `nameProperties` left at its default `['name']` over a
26
+ * grammar where `name` is a display LABEL — a `STRING` legitimately holding
27
+ * `"Order.Line"` — this fires on every dotted label at once, and "use a
28
+ * different character" is then advice nobody can act on: the content is
29
+ * correct and the configuration is not. A burst of this diagnostic across
30
+ * unrelated nodes is that misconfiguration, not a naming problem, and the fix
31
+ * is `nameProperties`. Widening the sentence to say both was rejected: a
32
+ * modeller cannot act on a DI option, and naming one in an editor squiggle
33
+ * teaches the wrong audience.
34
+ *
35
+ * Unreachable from a grammar whose identifier charset excludes the separator,
36
+ * which is every example here and the reference adopter — so it reads as dead
37
+ * and is not: it guards the configuration, not the content.
38
+ */
39
+ export const SEPARATOR_IN_NAME = defineMessage(
40
+ 'hydranium/core/separator-in-name',
41
+ "Name '{name}' contains the configured name separator '{separator}', which is reserved for qualified-name composition — use a different character."
42
+ );
43
+
15
44
  /**
16
45
  * Per-node validation check: flag name-bearing AST nodes whose name
17
46
  * value contains the configured name separator. Such values produce
@@ -38,11 +67,11 @@ export function nameSeparatorCheck(nameProvider: NameProvider): (node: AstNode,
38
67
  }
39
68
  const separator = nameProvider.nameSeparator;
40
69
  if (ownName.includes(separator)) {
41
- accept(
42
- 'error',
43
- `Name '${ownName}' contains the configured name separator '${separator}', which is reserved for qualified-name composition — use a different character.`,
44
- { node }
45
- );
70
+ // `{ node }` rather than `{ node, property: 'name' }`: moving the
71
+ // squiggle onto the name property is a behaviour change to the one
72
+ // diagnostic every adopter receives by default, so it is decided on its
73
+ // own merits rather than carried in by a mechanical migration.
74
+ acceptMessage(accept, 'error', SEPARATOR_IN_NAME, { node }, { name: ownName, separator });
46
75
  }
47
76
  };
48
77
  }
@@ -12,13 +12,14 @@ import {
12
12
  type AstNode,
13
13
  AstUtils,
14
14
  type DocumentBuilder,
15
+ DocumentState,
15
16
  type FileSystemProvider,
16
17
  type LangiumDocument,
17
18
  type LangiumDocuments,
18
19
  type URI,
19
20
  UriUtils
20
21
  } from '@hydranium/langium';
21
- import { Disposable } from 'vscode-languageserver';
22
+ import { CancellationToken, Disposable } from 'vscode-languageserver';
22
23
  import type { WorkspaceFolder } from 'vscode-languageserver-types';
23
24
  import type { LogNameOptions } from '../diagnostics/logger.js';
24
25
  import { type ServerSharedServicesMinimal } from '../shared-services.js';
@@ -377,6 +378,13 @@ export abstract class AbstractProjectManager<TProject extends Project = Project>
377
378
  protected async loadDescriptor(uri: URI): Promise<TProject | undefined> {
378
379
  try {
379
380
  const document = await this.langiumDocuments.getOrCreateDocument(uri);
381
+ if (document.state < DocumentState.Parsed) {
382
+ // `onUpdate` fires before the build parses, so the AST is still the previous edit's.
383
+ // The state is restored so the build still runs, and notifies, its own parse phase.
384
+ const state = document.state;
385
+ await this.services.workspace.LangiumDocumentFactory.update(document, CancellationToken.None);
386
+ document.state = state;
387
+ }
380
388
  const project = await this.parseProjectDescriptor(uri, document);
381
389
  if (project) {
382
390
  this.projects.set(project.id, project);
@@ -28,8 +28,8 @@ import type { URI } from '@hydranium/langium';
28
28
  * - {@link affectedDocuments} lists URIs whose reachable scope changed. The
29
29
  * default cascade plumbing in `HydraniumWorkspaceManager` subscribes to
30
30
  * this event and re-runs `DocumentBuilder.resetToState` for each entry,
31
- * which the next build cycle picks up. Consumers can subscribe
32
- * independently for other reactions.
31
+ * which the build of the update that changed the descriptor picks up.
32
+ * Consumers can subscribe independently for other reactions.
33
33
  */
34
34
  export interface ProjectChangeEvent<TProject extends Project = Project> {
35
35
  /** Ids of projects newly registered since the last event. */