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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (769) hide show
  1. package/README.md +78 -82
  2. package/lib/browser/host-heads-in-worker.d.ts +77 -0
  3. package/lib/browser/host-heads-in-worker.d.ts.map +1 -0
  4. package/lib/browser/host-heads-in-worker.js +169 -0
  5. package/lib/browser/host-heads-in-worker.js.map +1 -0
  6. package/lib/browser/index.d.ts +12 -0
  7. package/lib/browser/index.d.ts.map +1 -0
  8. package/lib/browser/index.js +17 -0
  9. package/lib/browser/index.js.map +1 -0
  10. package/lib/browser/indexeddb-file-system-store.d.ts +82 -0
  11. package/lib/browser/indexeddb-file-system-store.d.ts.map +1 -0
  12. package/lib/browser/indexeddb-file-system-store.js +181 -0
  13. package/lib/browser/indexeddb-file-system-store.js.map +1 -0
  14. package/lib/browser/start-language-server-in-worker.d.ts +32 -0
  15. package/lib/browser/start-language-server-in-worker.d.ts.map +1 -0
  16. package/lib/browser/start-language-server-in-worker.js +40 -0
  17. package/lib/browser/start-language-server-in-worker.js.map +1 -0
  18. package/lib/documents/ast-document-manager.d.ts +256 -124
  19. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  20. package/lib/documents/ast-document-manager.js +293 -132
  21. package/lib/documents/ast-document-manager.js.map +1 -1
  22. package/lib/documents/client-ids.d.ts +5 -19
  23. package/lib/documents/client-ids.d.ts.map +1 -1
  24. package/lib/documents/client-ids.js +5 -19
  25. package/lib/documents/client-ids.js.map +1 -1
  26. package/lib/documents/client-session-errors.d.ts +15 -0
  27. package/lib/documents/client-session-errors.d.ts.map +1 -0
  28. package/lib/documents/client-session-errors.js +15 -0
  29. package/lib/documents/client-session-errors.js.map +1 -0
  30. package/lib/documents/client-session-registry.d.ts +146 -0
  31. package/lib/documents/client-session-registry.d.ts.map +1 -0
  32. package/lib/documents/client-session-registry.js +207 -0
  33. package/lib/documents/client-session-registry.js.map +1 -0
  34. package/lib/documents/dirty-state-tracker.d.ts +101 -0
  35. package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
  36. package/lib/documents/dirty-state-tracker.js +85 -0
  37. package/lib/documents/dirty-state-tracker.js.map +1 -0
  38. package/lib/documents/document-release-handler.d.ts +204 -0
  39. package/lib/documents/document-release-handler.d.ts.map +1 -0
  40. package/lib/documents/document-release-handler.js +317 -0
  41. package/lib/documents/document-release-handler.js.map +1 -0
  42. package/lib/documents/document-release-scheduler.d.ts +67 -0
  43. package/lib/documents/document-release-scheduler.d.ts.map +1 -0
  44. package/lib/documents/document-release-scheduler.js +80 -0
  45. package/lib/documents/document-release-scheduler.js.map +1 -0
  46. package/lib/documents/file-system-task-queue.d.ts +52 -0
  47. package/lib/documents/file-system-task-queue.d.ts.map +1 -0
  48. package/lib/documents/file-system-task-queue.js +37 -0
  49. package/lib/documents/file-system-task-queue.js.map +1 -0
  50. package/lib/documents/hydranium-text-documents.d.ts +445 -282
  51. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  52. package/lib/documents/hydranium-text-documents.js +903 -483
  53. package/lib/documents/hydranium-text-documents.js.map +1 -1
  54. package/lib/documents/index.d.ts +10 -2
  55. package/lib/documents/index.d.ts.map +1 -1
  56. package/lib/documents/index.js +10 -2
  57. package/lib/documents/index.js.map +1 -1
  58. package/lib/documents/language-client-shadow.d.ts +234 -0
  59. package/lib/documents/language-client-shadow.d.ts.map +1 -0
  60. package/lib/documents/language-client-shadow.js +306 -0
  61. package/lib/documents/language-client-shadow.js.map +1 -0
  62. package/lib/documents/model-ledger.d.ts +47 -0
  63. package/lib/documents/model-ledger.d.ts.map +1 -0
  64. package/lib/documents/model-ledger.js +30 -0
  65. package/lib/documents/model-ledger.js.map +1 -0
  66. package/lib/documents/text-ledger.d.ts +64 -0
  67. package/lib/documents/text-ledger.d.ts.map +1 -0
  68. package/lib/documents/text-ledger.js +63 -0
  69. package/lib/documents/text-ledger.js.map +1 -0
  70. package/lib/documents/version-sync-service.d.ts +138 -0
  71. package/lib/documents/version-sync-service.d.ts.map +1 -0
  72. package/lib/documents/version-sync-service.js +173 -0
  73. package/lib/documents/version-sync-service.js.map +1 -0
  74. package/lib/index.d.ts +4 -0
  75. package/lib/index.d.ts.map +1 -1
  76. package/lib/index.js +7 -0
  77. package/lib/index.js.map +1 -1
  78. package/lib/langium/ast-extension/ast-extension-service.d.ts +42 -31
  79. package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
  80. package/lib/langium/ast-extension/ast-extension-service.js +45 -19
  81. package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
  82. package/lib/langium/ast-extension/ast-node-builder.d.ts +12 -7
  83. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  84. package/lib/langium/ast-extension/ast-node-builder.js +25 -9
  85. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  86. package/lib/langium/bootstrap.d.ts +49 -36
  87. package/lib/langium/bootstrap.d.ts.map +1 -1
  88. package/lib/langium/bootstrap.js +83 -44
  89. package/lib/langium/bootstrap.js.map +1 -1
  90. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +9 -9
  91. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
  92. package/lib/langium/build-phase-pass/build-phase-pass-service.js +25 -16
  93. package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
  94. package/lib/langium/build-phase-pass/build-phase-pass.d.ts +20 -8
  95. package/lib/langium/build-phase-pass/build-phase-pass.d.ts.map +1 -1
  96. package/lib/langium/build-phase-pass/build-phase-pass.js +20 -0
  97. package/lib/langium/build-phase-pass/build-phase-pass.js.map +1 -1
  98. package/lib/langium/composite-ast-reflection.d.ts +46 -0
  99. package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
  100. package/lib/langium/composite-ast-reflection.js +97 -0
  101. package/lib/langium/composite-ast-reflection.js.map +1 -0
  102. package/lib/langium/config/configuration-provider.d.ts +81 -0
  103. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  104. package/lib/langium/config/configuration-provider.js +112 -0
  105. package/lib/langium/config/configuration-provider.js.map +1 -0
  106. package/lib/langium/config/index.d.ts +1 -0
  107. package/lib/langium/config/index.d.ts.map +1 -1
  108. package/lib/langium/config/index.js +1 -0
  109. package/lib/langium/config/index.js.map +1 -1
  110. package/lib/langium/config/settings.js.map +1 -1
  111. package/lib/langium/diagnostics/console-tee.d.ts +27 -0
  112. package/lib/langium/diagnostics/console-tee.d.ts.map +1 -0
  113. package/lib/langium/diagnostics/console-tee.js +142 -0
  114. package/lib/langium/diagnostics/console-tee.js.map +1 -0
  115. package/lib/langium/diagnostics/format-log-arg.d.ts +18 -0
  116. package/lib/langium/diagnostics/format-log-arg.d.ts.map +1 -0
  117. package/lib/langium/diagnostics/format-log-arg.js +36 -0
  118. package/lib/langium/diagnostics/format-log-arg.js.map +1 -0
  119. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +9 -20
  120. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
  121. package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
  122. package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
  123. package/lib/langium/diagnostics/log-preamble.js +1 -1
  124. package/lib/langium/diagnostics/log-preamble.js.map +1 -1
  125. package/lib/langium/diagnostics/logger.d.ts +25 -6
  126. package/lib/langium/diagnostics/logger.d.ts.map +1 -1
  127. package/lib/langium/diagnostics/logger.js +49 -17
  128. package/lib/langium/diagnostics/logger.js.map +1 -1
  129. package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
  130. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  131. package/lib/langium/diagnostics/lsp-logger.js +68 -45
  132. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  133. package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
  134. package/lib/langium/diagnostics/server-tracer.js.map +1 -1
  135. package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
  136. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  137. package/lib/langium/document-builder/build-pipeline-integration.js +28 -30
  138. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  139. package/lib/langium/document-builder/build-session.d.ts +6 -5
  140. package/lib/langium/document-builder/build-session.d.ts.map +1 -1
  141. package/lib/langium/document-builder/build-session.js +5 -5
  142. package/lib/langium/document-builder/build-session.js.map +1 -1
  143. package/lib/langium/document-builder/document-builder.d.ts +283 -41
  144. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  145. package/lib/langium/document-builder/document-builder.js +448 -78
  146. package/lib/langium/document-builder/document-builder.js.map +1 -1
  147. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  148. package/lib/langium/documentation/comment-provider.js.map +1 -1
  149. package/lib/langium/integration-services.d.ts +40 -24
  150. package/lib/langium/integration-services.d.ts.map +1 -1
  151. package/lib/langium/integration-services.js +7 -4
  152. package/lib/langium/integration-services.js.map +1 -1
  153. package/lib/langium/integrity/integrity-rule.d.ts +17 -8
  154. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  155. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  156. package/lib/langium/integrity/integrity-service.d.ts +95 -27
  157. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  158. package/lib/langium/integrity/integrity-service.js +303 -63
  159. package/lib/langium/integrity/integrity-service.js.map +1 -1
  160. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  161. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  162. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  163. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  164. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  165. package/lib/langium/labeling/label-provider.js.map +1 -1
  166. package/lib/langium/language-module.d.ts +30 -5
  167. package/lib/langium/language-module.d.ts.map +1 -1
  168. package/lib/langium/language-module.js +18 -4
  169. package/lib/langium/language-module.js.map +1 -1
  170. package/lib/langium/model-service/client-session.d.ts +383 -0
  171. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  172. package/lib/langium/model-service/client-session.js +455 -0
  173. package/lib/langium/model-service/client-session.js.map +1 -0
  174. package/lib/langium/model-service/index.d.ts +2 -0
  175. package/lib/langium/model-service/index.d.ts.map +1 -1
  176. package/lib/langium/model-service/index.js +2 -0
  177. package/lib/langium/model-service/index.js.map +1 -1
  178. package/lib/langium/model-service/model-events.d.ts +66 -0
  179. package/lib/langium/model-service/model-events.d.ts.map +1 -0
  180. package/lib/langium/model-service/model-events.js +10 -0
  181. package/lib/langium/model-service/model-events.js.map +1 -0
  182. package/lib/langium/model-service/model-service.d.ts +456 -300
  183. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  184. package/lib/langium/model-service/model-service.js +571 -466
  185. package/lib/langium/model-service/model-service.js.map +1 -1
  186. package/lib/langium/module.d.ts +141 -40
  187. package/lib/langium/module.d.ts.map +1 -1
  188. package/lib/langium/module.js +52 -40
  189. package/lib/langium/module.js.map +1 -1
  190. package/lib/langium/naming/name-provider.d.ts +32 -7
  191. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  192. package/lib/langium/naming/name-provider.js +10 -4
  193. package/lib/langium/naming/name-provider.js.map +1 -1
  194. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  195. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  196. package/lib/langium/project/abstract-project-manager.js +13 -6
  197. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  198. package/lib/langium/project/project-change-event.d.ts +2 -2
  199. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  200. package/lib/langium/project/single-project-manager.js.map +1 -1
  201. package/lib/langium/residency/cst-residency-service.d.ts +38 -14
  202. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  203. package/lib/langium/residency/cst-residency-service.js +24 -58
  204. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  205. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  206. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  207. package/lib/langium/scope/fallback-scope.d.ts +27 -0
  208. package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
  209. package/lib/langium/scope/fallback-scope.js +35 -0
  210. package/lib/langium/scope/fallback-scope.js.map +1 -0
  211. package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
  212. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  213. package/lib/langium/scope/hydranium-scope-computation.js +38 -39
  214. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  215. package/lib/langium/scope/hydranium-scope-provider.d.ts +29 -11
  216. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  217. package/lib/langium/scope/hydranium-scope-provider.js +37 -15
  218. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  219. package/lib/langium/scope/index.d.ts +1 -0
  220. package/lib/langium/scope/index.d.ts.map +1 -1
  221. package/lib/langium/scope/index.js +1 -0
  222. package/lib/langium/scope/index.js.map +1 -1
  223. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  224. package/lib/langium/scope/reference-builder.js.map +1 -1
  225. package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
  226. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  227. package/lib/langium/scope/reference-candidate-provider.js +3 -2
  228. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  229. package/lib/langium/scope/scope-extension-service.d.ts +41 -37
  230. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  231. package/lib/langium/scope/scope-extension-service.js +57 -29
  232. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  233. package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
  234. package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
  235. package/lib/langium/scope/scoped-ast-node-description.js +1 -3
  236. package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
  237. package/lib/langium/serialization/abstract-serializer.d.ts +38 -27
  238. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  239. package/lib/langium/serialization/abstract-serializer.js +54 -30
  240. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  241. package/lib/langium/serialization/json-serializer.d.ts +8 -1
  242. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  243. package/lib/langium/serialization/json-serializer.js +13 -3
  244. package/lib/langium/serialization/json-serializer.js.map +1 -1
  245. package/lib/langium/serialization/serializer.d.ts +1 -1
  246. package/lib/langium/serialization/yaml-serializer.d.ts +4 -0
  247. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  248. package/lib/langium/serialization/yaml-serializer.js +4 -0
  249. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  250. package/lib/langium/service-registry.d.ts +29 -1
  251. package/lib/langium/service-registry.d.ts.map +1 -1
  252. package/lib/langium/service-registry.js +37 -0
  253. package/lib/langium/service-registry.js.map +1 -1
  254. package/lib/langium/shared-services.d.ts +13 -7
  255. package/lib/langium/shared-services.d.ts.map +1 -1
  256. package/lib/langium/shared-services.js.map +1 -1
  257. package/lib/langium/single-langium-copy.d.ts +22 -0
  258. package/lib/langium/single-langium-copy.d.ts.map +1 -0
  259. package/lib/langium/single-langium-copy.js +36 -0
  260. package/lib/langium/single-langium-copy.js.map +1 -0
  261. package/lib/langium/transfer/transfer-encoder.d.ts +86 -37
  262. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  263. package/lib/langium/transfer/transfer-encoder.js +36 -25
  264. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  265. package/lib/langium/trivia/comment-preserver.d.ts +471 -0
  266. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  267. package/lib/langium/trivia/comment-preserver.js +1026 -0
  268. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  269. package/lib/langium/trivia/document-ending-preserver.d.ts +51 -0
  270. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  271. package/lib/langium/trivia/document-ending-preserver.js +62 -0
  272. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  273. package/lib/langium/trivia/index.d.ts +14 -0
  274. package/lib/langium/trivia/index.d.ts.map +1 -0
  275. package/lib/langium/trivia/index.js +14 -0
  276. package/lib/langium/trivia/index.js.map +1 -0
  277. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  278. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  279. package/lib/langium/trivia/trivia-contribution.js +10 -0
  280. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  281. package/lib/langium/trivia/trivia-preserver.d.ts +52 -0
  282. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  283. package/lib/langium/trivia/trivia-preserver.js +10 -0
  284. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  285. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  286. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  287. package/lib/langium/trivia/trivia-service.js +56 -0
  288. package/lib/langium/trivia/trivia-service.js.map +1 -0
  289. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  290. package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
  291. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  292. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  293. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  294. package/lib/langium/validation/document-validator.d.ts +168 -23
  295. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  296. package/lib/langium/validation/document-validator.js +263 -25
  297. package/lib/langium/validation/document-validator.js.map +1 -1
  298. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  299. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  300. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  301. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  302. package/lib/langium/workspace/document-uri-policy.d.ts +24 -15
  303. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  304. package/lib/langium/workspace/document-uri-policy.js +22 -13
  305. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  306. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  307. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  308. package/lib/langium/workspace/file-not-found.js +31 -0
  309. package/lib/langium/workspace/file-not-found.js.map +1 -0
  310. package/lib/langium/workspace/file-system-provider.d.ts +167 -8
  311. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  312. package/lib/langium/workspace/file-system-provider.js +115 -13
  313. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  314. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +31 -1
  315. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  316. package/lib/langium/workspace/hydranium-langium-document-factory.js +54 -0
  317. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  318. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
  319. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  320. package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
  321. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  322. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +103 -21
  323. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  324. package/lib/langium/workspace/hydranium-workspace-manager.js +184 -31
  325. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  326. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
  327. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  328. package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
  329. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  330. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  331. package/lib/langium/workspace/index-manager.js.map +1 -1
  332. package/lib/langium/workspace/index.d.ts +1 -0
  333. package/lib/langium/workspace/index.d.ts.map +1 -1
  334. package/lib/langium/workspace/index.js +1 -0
  335. package/lib/langium/workspace/index.js.map +1 -1
  336. package/lib/langium/workspace/initialize-workspace.d.ts +40 -3
  337. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  338. package/lib/langium/workspace/initialize-workspace.js +68 -3
  339. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  340. package/lib/langium/workspace/langium-documents.d.ts +7 -0
  341. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  342. package/lib/langium/workspace/langium-documents.js +18 -1
  343. package/lib/langium/workspace/langium-documents.js.map +1 -1
  344. package/lib/langium/workspace/persistent-file-system-provider.d.ts +16 -10
  345. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  346. package/lib/langium/workspace/persistent-file-system-provider.js +25 -13
  347. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  348. package/lib/langium/workspace/self-save-registry.d.ts +84 -0
  349. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  350. package/lib/{documents → langium/workspace}/self-save-registry.js +33 -22
  351. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  352. package/lib/langium/workspace/virtual-document.d.ts +55 -21
  353. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  354. package/lib/langium/workspace/virtual-document.js +87 -24
  355. package/lib/langium/workspace/virtual-document.js.map +1 -1
  356. package/lib/langium/workspace/write-lock-scope.d.ts +22 -10
  357. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  358. package/lib/langium/workspace/write-lock-scope.js +15 -5
  359. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  360. package/lib/launcher/integrated-server.d.ts +3 -1
  361. package/lib/launcher/integrated-server.d.ts.map +1 -1
  362. package/lib/locale/server-locale.d.ts +19 -5
  363. package/lib/locale/server-locale.d.ts.map +1 -1
  364. package/lib/locale/server-locale.js +1 -1
  365. package/lib/locale/server-locale.js.map +1 -1
  366. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  367. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  368. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  369. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  370. package/lib/lsp/connection-features.d.ts +23 -0
  371. package/lib/lsp/connection-features.d.ts.map +1 -0
  372. package/lib/lsp/connection-features.js +60 -0
  373. package/lib/lsp/connection-features.js.map +1 -0
  374. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  375. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  376. package/lib/lsp/diagnostics-connection.js +53 -0
  377. package/lib/lsp/diagnostics-connection.js.map +1 -0
  378. package/lib/lsp/hydranium-document-update-handler.d.ts +126 -82
  379. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  380. package/lib/lsp/hydranium-document-update-handler.js +235 -102
  381. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  382. package/lib/lsp/index.d.ts +4 -1
  383. package/lib/lsp/index.d.ts.map +1 -1
  384. package/lib/lsp/index.js +4 -1
  385. package/lib/lsp/index.js.map +1 -1
  386. package/lib/lsp/lsp-latency.d.ts +39 -0
  387. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  388. package/lib/lsp/lsp-latency.js +58 -0
  389. package/lib/lsp/lsp-latency.js.map +1 -0
  390. package/lib/lsp/save-text-document.d.ts +31 -0
  391. package/lib/lsp/save-text-document.d.ts.map +1 -0
  392. package/lib/lsp/save-text-document.js +52 -0
  393. package/lib/lsp/save-text-document.js.map +1 -0
  394. package/lib/lsp/semantic-token-provider.d.ts +58 -2
  395. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  396. package/lib/lsp/semantic-token-provider.js +98 -9
  397. package/lib/lsp/semantic-token-provider.js.map +1 -1
  398. package/lib/lsp/shared-module.d.ts +4 -8
  399. package/lib/lsp/shared-module.d.ts.map +1 -1
  400. package/lib/lsp/shared-module.js.map +1 -1
  401. package/lib/lsp/start-language-server.d.ts +11 -7
  402. package/lib/lsp/start-language-server.d.ts.map +1 -1
  403. package/lib/lsp/start-language-server.js +18 -7
  404. package/lib/lsp/start-language-server.js.map +1 -1
  405. package/lib/messages/carriers.d.ts +3 -5
  406. package/lib/messages/carriers.d.ts.map +1 -1
  407. package/lib/messages/carriers.js +3 -5
  408. package/lib/messages/carriers.js.map +1 -1
  409. package/lib/messages/index.d.ts +2 -2
  410. package/lib/messages/index.d.ts.map +1 -1
  411. package/lib/messages/index.js +2 -2
  412. package/lib/messages/index.js.map +1 -1
  413. package/lib/messages/renderer.d.ts +32 -7
  414. package/lib/messages/renderer.d.ts.map +1 -1
  415. package/lib/messages/renderer.js +7 -1
  416. package/lib/messages/renderer.js.map +1 -1
  417. package/lib/node/event-loop-monitor.d.ts.map +1 -1
  418. package/lib/node/event-loop-monitor.js +2 -1
  419. package/lib/node/event-loop-monitor.js.map +1 -1
  420. package/lib/node/heap-ceiling.d.ts +61 -0
  421. package/lib/node/heap-ceiling.d.ts.map +1 -0
  422. package/lib/node/heap-ceiling.js +72 -0
  423. package/lib/node/heap-ceiling.js.map +1 -0
  424. package/lib/node/index.d.ts +1 -1
  425. package/lib/node/index.d.ts.map +1 -1
  426. package/lib/node/index.js +5 -1
  427. package/lib/node/index.js.map +1 -1
  428. package/lib/node/latency-from-env.d.ts +1 -1
  429. package/lib/node/latency-from-env.js +1 -1
  430. package/lib/node/lint-grammar.js.map +1 -1
  431. package/lib/node/log-file-sink.d.ts +3 -2
  432. package/lib/node/log-file-sink.d.ts.map +1 -1
  433. package/lib/node/log-file-sink.js +6 -2
  434. package/lib/node/log-file-sink.js.map +1 -1
  435. package/lib/node/log-preamble-node.d.ts +5 -3
  436. package/lib/node/log-preamble-node.d.ts.map +1 -1
  437. package/lib/node/log-preamble-node.js +13 -10
  438. package/lib/node/log-preamble-node.js.map +1 -1
  439. package/lib/node/measure-memory.d.ts.map +1 -1
  440. package/lib/node/measure-memory.js +5 -4
  441. package/lib/node/measure-memory.js.map +1 -1
  442. package/lib/node/memory-monitor.d.ts +2 -2
  443. package/lib/node/memory-monitor.d.ts.map +1 -1
  444. package/lib/node/memory-monitor.js +9 -10
  445. package/lib/node/memory-monitor.js.map +1 -1
  446. package/lib/node/node-file-system-provider.d.ts +67 -9
  447. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  448. package/lib/node/node-file-system-provider.js +198 -53
  449. package/lib/node/node-file-system-provider.js.map +1 -1
  450. package/lib/node/profile-capture.d.ts +12 -4
  451. package/lib/node/profile-capture.d.ts.map +1 -1
  452. package/lib/node/profile-capture.js +8 -6
  453. package/lib/node/profile-capture.js.map +1 -1
  454. package/lib/node/profile-digest.js.map +1 -1
  455. package/lib/node/profiling-run.d.ts +13 -3
  456. package/lib/node/profiling-run.d.ts.map +1 -1
  457. package/lib/node/profiling-run.js +17 -8
  458. package/lib/node/profiling-run.js.map +1 -1
  459. package/lib/node/rename-over-open-readers.d.ts +61 -0
  460. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  461. package/lib/node/rename-over-open-readers.js +80 -0
  462. package/lib/node/rename-over-open-readers.js.map +1 -0
  463. package/lib/node/server-diagnostics.js +1 -1
  464. package/lib/node/server-diagnostics.js.map +1 -1
  465. package/lib/node/server-state-snapshot.js +4 -4
  466. package/lib/node/server-state-snapshot.js.map +1 -1
  467. package/lib/node/socket-launcher.d.ts +43 -7
  468. package/lib/node/socket-launcher.d.ts.map +1 -1
  469. package/lib/node/socket-launcher.js +42 -7
  470. package/lib/node/socket-launcher.js.map +1 -1
  471. package/lib/node/startup-cpu-profile.d.ts +29 -0
  472. package/lib/node/startup-cpu-profile.d.ts.map +1 -0
  473. package/lib/node/startup-cpu-profile.js +91 -0
  474. package/lib/node/startup-cpu-profile.js.map +1 -0
  475. package/lib/node/stdio-launcher.d.ts +13 -13
  476. package/lib/node/stdio-launcher.d.ts.map +1 -1
  477. package/lib/node/stdio-launcher.js +21 -11
  478. package/lib/node/stdio-launcher.js.map +1 -1
  479. package/lib/testing/document-uri-policy-conformance.js +1 -1
  480. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  481. package/lib/testing/fake-description.js.map +1 -1
  482. package/lib/testing/fake-document.d.ts +2 -1
  483. package/lib/testing/fake-document.d.ts.map +1 -1
  484. package/lib/testing/fake-document.js.map +1 -1
  485. package/lib/testing/index.d.ts +1 -1
  486. package/lib/testing/index.d.ts.map +1 -1
  487. package/lib/testing/index.js +2 -1
  488. package/lib/testing/index.js.map +1 -1
  489. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  490. package/lib/testing/langium-test-helpers.js +1 -0
  491. package/lib/testing/langium-test-helpers.js.map +1 -1
  492. package/lib/testing/make-noop-language-services.js.map +1 -1
  493. package/lib/testing/make-noop-shared-services.d.ts +4 -4
  494. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  495. package/lib/testing/make-noop-shared-services.js +4 -4
  496. package/lib/testing/make-noop-shared-services.js.map +1 -1
  497. package/lib/testing/make-test-services.d.ts +51 -20
  498. package/lib/testing/make-test-services.d.ts.map +1 -1
  499. package/lib/testing/make-test-services.js +29 -13
  500. package/lib/testing/make-test-services.js.map +1 -1
  501. package/lib/testing/make-test-tracer.d.ts +12 -0
  502. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  503. package/lib/testing/make-test-tracer.js +13 -0
  504. package/lib/testing/make-test-tracer.js.map +1 -1
  505. package/lib/testing/node/applied-edit-capture.d.ts +29 -0
  506. package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
  507. package/lib/testing/node/applied-edit-capture.js +117 -0
  508. package/lib/testing/node/applied-edit-capture.js.map +1 -0
  509. package/lib/testing/node/golden-corpus.js.map +1 -1
  510. package/lib/testing/node/index.d.ts +1 -0
  511. package/lib/testing/node/index.d.ts.map +1 -1
  512. package/lib/testing/node/index.js +1 -0
  513. package/lib/testing/node/index.js.map +1 -1
  514. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  515. package/lib/testing/node/lsp-harness.js +2 -0
  516. package/lib/testing/node/lsp-harness.js.map +1 -1
  517. package/lib/testing/node/lsp-server-connection.d.ts +21 -6
  518. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  519. package/lib/testing/node/lsp-server-connection.js +49 -106
  520. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  521. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  522. package/lib/testing/node/scratch-workspace.js +10 -5
  523. package/lib/testing/node/scratch-workspace.js.map +1 -1
  524. package/lib/testing/node/spawned-server.d.ts +30 -1
  525. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  526. package/lib/testing/node/spawned-server.js +39 -2
  527. package/lib/testing/node/spawned-server.js.map +1 -1
  528. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  529. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  530. package/lib/testing/node/unhandled-rejections.js +32 -0
  531. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  532. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  533. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  534. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  535. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  536. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  537. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  538. package/lib/testing/playwright/index.d.ts +1 -0
  539. package/lib/testing/playwright/index.d.ts.map +1 -1
  540. package/lib/testing/playwright/index.js +1 -0
  541. package/lib/testing/playwright/index.js.map +1 -1
  542. package/lib/testing/playwright/server-log-capture.d.ts +46 -16
  543. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  544. package/lib/testing/playwright/server-log-capture.js +111 -40
  545. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  546. package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
  547. package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
  548. package/lib/testing/playwright/server-log-fixture.js +25 -6
  549. package/lib/testing/playwright/server-log-fixture.js.map +1 -1
  550. package/lib/testing/playwright/server-log-region.d.ts +15 -0
  551. package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
  552. package/lib/testing/playwright/server-log-region.js +30 -0
  553. package/lib/testing/playwright/server-log-region.js.map +1 -0
  554. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  555. package/lib/testing/playwright/server-log-rename-reporter.js +4 -3
  556. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  557. package/lib/testing/run-update-pipeline.d.ts +8 -5
  558. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  559. package/lib/testing/run-update-pipeline.js.map +1 -1
  560. package/lib/testing/stub-ast-document-manager.d.ts +11 -52
  561. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  562. package/lib/testing/stub-ast-document-manager.js +31 -62
  563. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  564. package/lib/testing/stub-document-builder.d.ts +33 -11
  565. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  566. package/lib/testing/stub-document-builder.js +103 -5
  567. package/lib/testing/stub-document-builder.js.map +1 -1
  568. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  569. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  570. package/lib/testing/stub-hydranium-text-documents.js +132 -16
  571. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  572. package/lib/testing/stub-index-manager.js.map +1 -1
  573. package/lib/testing/stub-langium-documents.d.ts +3 -2
  574. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  575. package/lib/testing/stub-langium-documents.js.map +1 -1
  576. package/lib/testing/stub-model-service.d.ts +9 -8
  577. package/lib/testing/stub-model-service.d.ts.map +1 -1
  578. package/lib/testing/stub-model-service.js +6 -6
  579. package/lib/testing/stub-model-service.js.map +1 -1
  580. package/lib/testing/stub-project-manager.js.map +1 -1
  581. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  582. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  583. package/lib/testing/stub-service-registry.d.ts +1 -1
  584. package/lib/testing/stub-service-registry.js.map +1 -1
  585. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  586. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  587. package/lib/testing/stub-writable-file-system.js +2 -1
  588. package/lib/testing/stub-writable-file-system.js.map +1 -1
  589. package/lib/util/connection-liveness.d.ts +22 -6
  590. package/lib/util/connection-liveness.d.ts.map +1 -1
  591. package/lib/util/connection-liveness.js +74 -15
  592. package/lib/util/connection-liveness.js.map +1 -1
  593. package/lib/util/environment.d.ts +7 -0
  594. package/lib/util/environment.d.ts.map +1 -1
  595. package/lib/util/environment.js +15 -1
  596. package/lib/util/environment.js.map +1 -1
  597. package/lib/util/registry.d.ts.map +1 -1
  598. package/package.json +39 -58
  599. package/src/browser/host-heads-in-worker.ts +218 -0
  600. package/src/browser/index.ts +17 -0
  601. package/src/browser/indexeddb-file-system-store.ts +192 -0
  602. package/src/browser/start-language-server-in-worker.ts +56 -0
  603. package/src/documents/ast-document-manager.ts +467 -233
  604. package/src/documents/client-ids.ts +5 -22
  605. package/src/documents/client-session-errors.ts +24 -0
  606. package/src/documents/client-session-registry.ts +262 -0
  607. package/src/documents/dirty-state-tracker.ts +167 -0
  608. package/src/documents/document-release-handler.ts +404 -0
  609. package/src/documents/document-release-scheduler.ts +121 -0
  610. package/src/documents/file-system-task-queue.ts +74 -0
  611. package/src/documents/hydranium-text-documents.ts +1029 -595
  612. package/src/documents/index.ts +10 -2
  613. package/src/documents/language-client-shadow.ts +501 -0
  614. package/src/documents/model-ledger.ts +66 -0
  615. package/src/documents/text-ledger.ts +112 -0
  616. package/src/documents/version-sync-service.ts +275 -0
  617. package/src/index.ts +7 -0
  618. package/src/langium/ast-extension/ast-extension-service.ts +77 -41
  619. package/src/langium/ast-extension/ast-node-builder.ts +35 -13
  620. package/src/langium/bootstrap.ts +87 -51
  621. package/src/langium/build-phase-pass/build-phase-pass-service.ts +29 -19
  622. package/src/langium/build-phase-pass/build-phase-pass.ts +37 -8
  623. package/src/langium/composite-ast-reflection.ts +112 -0
  624. package/src/langium/config/configuration-provider.ts +119 -0
  625. package/src/langium/config/index.ts +1 -0
  626. package/src/langium/diagnostics/console-tee.ts +151 -0
  627. package/src/langium/diagnostics/format-log-arg.ts +36 -0
  628. package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
  629. package/src/langium/diagnostics/log-preamble.ts +1 -1
  630. package/src/langium/diagnostics/logger.ts +51 -17
  631. package/src/langium/diagnostics/lsp-logger.ts +70 -44
  632. package/src/langium/document-builder/build-pipeline-integration.ts +46 -32
  633. package/src/langium/document-builder/build-session.ts +4 -3
  634. package/src/langium/document-builder/document-builder.ts +553 -78
  635. package/src/langium/integration-services.ts +59 -28
  636. package/src/langium/integrity/integrity-rule.ts +17 -8
  637. package/src/langium/integrity/integrity-service.ts +332 -69
  638. package/src/langium/language-module.ts +49 -8
  639. package/src/langium/model-service/client-session.ts +718 -0
  640. package/src/langium/model-service/index.ts +2 -0
  641. package/src/langium/model-service/model-events.ts +80 -0
  642. package/src/langium/model-service/model-service.ts +878 -494
  643. package/src/langium/module.ts +195 -72
  644. package/src/langium/naming/name-provider.ts +34 -8
  645. package/src/langium/project/abstract-project-manager.ts +13 -5
  646. package/src/langium/project/project-change-event.ts +2 -2
  647. package/src/langium/residency/cst-residency-service.ts +54 -19
  648. package/src/langium/scope/fallback-scope.ts +38 -0
  649. package/src/langium/scope/hydranium-scope-computation.ts +45 -44
  650. package/src/langium/scope/hydranium-scope-provider.ts +49 -16
  651. package/src/langium/scope/index.ts +1 -0
  652. package/src/langium/scope/reference-candidate-provider.ts +6 -5
  653. package/src/langium/scope/scope-extension-service.ts +74 -59
  654. package/src/langium/scope/scoped-ast-node-description.ts +1 -3
  655. package/src/langium/serialization/abstract-serializer.ts +57 -41
  656. package/src/langium/serialization/json-serializer.ts +14 -3
  657. package/src/langium/serialization/serializer.ts +1 -1
  658. package/src/langium/serialization/yaml-serializer.ts +4 -0
  659. package/src/langium/service-registry.ts +41 -2
  660. package/src/langium/shared-services.ts +16 -7
  661. package/src/langium/single-langium-copy.ts +42 -0
  662. package/src/langium/transfer/transfer-encoder.ts +104 -47
  663. package/src/langium/trivia/comment-preserver.ts +1241 -0
  664. package/src/langium/trivia/document-ending-preserver.ts +71 -0
  665. package/src/langium/trivia/index.ts +14 -0
  666. package/src/langium/trivia/trivia-contribution.ts +39 -0
  667. package/src/langium/trivia/trivia-preserver.ts +56 -0
  668. package/src/langium/trivia/trivia-service.ts +99 -0
  669. package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
  670. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  671. package/src/langium/validation/document-validator.ts +311 -30
  672. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  673. package/src/langium/workspace/document-uri-policy.ts +32 -18
  674. package/src/langium/workspace/file-not-found.ts +35 -0
  675. package/src/langium/workspace/file-system-provider.ts +258 -16
  676. package/src/langium/workspace/hydranium-langium-document-factory.ts +83 -0
  677. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
  678. package/src/langium/workspace/hydranium-workspace-manager.ts +212 -35
  679. package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
  680. package/src/langium/workspace/index.ts +1 -0
  681. package/src/langium/workspace/initialize-workspace.ts +96 -4
  682. package/src/langium/workspace/langium-documents.ts +19 -1
  683. package/src/langium/workspace/persistent-file-system-provider.ts +27 -15
  684. package/src/langium/workspace/self-save-registry.ts +118 -0
  685. package/src/langium/workspace/virtual-document.ts +106 -25
  686. package/src/langium/workspace/write-lock-scope.ts +27 -12
  687. package/src/launcher/integrated-server.ts +3 -1
  688. package/src/locale/server-locale.ts +20 -5
  689. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  690. package/src/lsp/connection-features.ts +67 -0
  691. package/src/lsp/diagnostics-connection.ts +56 -0
  692. package/src/lsp/hydranium-document-update-handler.ts +285 -111
  693. package/src/lsp/index.ts +4 -1
  694. package/src/lsp/lsp-latency.ts +62 -0
  695. package/src/lsp/save-text-document.ts +63 -0
  696. package/src/lsp/semantic-token-provider.ts +146 -8
  697. package/src/lsp/shared-module.ts +4 -8
  698. package/src/lsp/start-language-server.ts +18 -7
  699. package/src/messages/carriers.ts +3 -5
  700. package/src/messages/index.ts +11 -2
  701. package/src/messages/renderer.ts +34 -6
  702. package/src/node/event-loop-monitor.ts +2 -1
  703. package/src/node/heap-ceiling.ts +108 -0
  704. package/src/node/index.ts +5 -1
  705. package/src/node/latency-from-env.ts +1 -1
  706. package/src/node/log-file-sink.ts +6 -2
  707. package/src/node/log-preamble-node.ts +20 -10
  708. package/src/node/measure-memory.ts +5 -4
  709. package/src/node/memory-monitor.ts +10 -10
  710. package/src/node/node-file-system-provider.ts +214 -57
  711. package/src/node/profile-capture.ts +16 -15
  712. package/src/node/profiling-run.ts +30 -8
  713. package/src/node/rename-over-open-readers.ts +94 -0
  714. package/src/node/server-diagnostics.ts +1 -1
  715. package/src/node/server-state-snapshot.ts +5 -5
  716. package/src/node/socket-launcher.ts +78 -14
  717. package/src/node/startup-cpu-profile.ts +94 -0
  718. package/src/node/stdio-launcher.ts +29 -19
  719. package/src/testing/document-uri-policy-conformance.ts +1 -1
  720. package/src/testing/fake-document.ts +2 -1
  721. package/src/testing/index.ts +2 -1
  722. package/src/testing/langium-test-helpers.ts +1 -0
  723. package/src/testing/make-noop-shared-services.ts +6 -6
  724. package/src/testing/make-test-services.ts +93 -41
  725. package/src/testing/make-test-tracer.ts +26 -0
  726. package/src/testing/node/applied-edit-capture.ts +141 -0
  727. package/src/testing/node/index.ts +1 -0
  728. package/src/testing/node/lsp-harness.ts +2 -0
  729. package/src/testing/node/lsp-server-connection.ts +83 -119
  730. package/src/testing/node/scratch-workspace.ts +10 -5
  731. package/src/testing/node/spawned-server.ts +57 -3
  732. package/src/testing/node/unhandled-rejections.ts +31 -0
  733. package/src/testing/parse-semantic-root.ts +1 -1
  734. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  735. package/src/testing/playwright/index.ts +1 -0
  736. package/src/testing/playwright/server-log-capture.ts +137 -47
  737. package/src/testing/playwright/server-log-fixture.ts +46 -6
  738. package/src/testing/playwright/server-log-region.ts +32 -0
  739. package/src/testing/playwright/server-log-rename-reporter.ts +4 -3
  740. package/src/testing/run-update-pipeline.ts +8 -5
  741. package/src/testing/stub-ast-document-manager.ts +47 -128
  742. package/src/testing/stub-document-builder.ts +133 -18
  743. package/src/testing/stub-hydranium-text-documents.ts +184 -27
  744. package/src/testing/stub-langium-documents.ts +3 -2
  745. package/src/testing/stub-model-service.ts +11 -10
  746. package/src/testing/stub-self-save-registry.ts +1 -1
  747. package/src/testing/stub-service-registry.ts +1 -1
  748. package/src/testing/stub-writable-file-system.ts +3 -2
  749. package/src/util/connection-liveness.ts +80 -15
  750. package/src/util/environment.ts +24 -2
  751. package/lib/documents/language-client-text-shadow.d.ts +0 -101
  752. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  753. package/lib/documents/language-client-text-shadow.js +0 -156
  754. package/lib/documents/language-client-text-shadow.js.map +0 -1
  755. package/lib/documents/self-save-registry.d.ts +0 -55
  756. package/lib/documents/self-save-registry.d.ts.map +0 -1
  757. package/lib/documents/self-save-registry.js.map +0 -1
  758. package/lib/lsp/instrument-connection.d.ts +0 -36
  759. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  760. package/lib/lsp/instrument-connection.js +0 -62
  761. package/lib/lsp/instrument-connection.js.map +0 -1
  762. package/lib/node/process-memory.d.ts +0 -66
  763. package/lib/node/process-memory.d.ts.map +0 -1
  764. package/lib/node/process-memory.js +0 -252
  765. package/lib/node/process-memory.js.map +0 -1
  766. package/src/documents/language-client-text-shadow.ts +0 -175
  767. package/src/documents/self-save-registry.ts +0 -81
  768. package/src/lsp/instrument-connection.ts +0 -66
  769. package/src/node/process-memory.ts +0 -299
@@ -7,9 +7,9 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
- import { type AstNode, AstUtils, type LangiumDocument, MapScope, type Scope, StreamScope, stream } from '@hydranium/langium';
10
+ import { type AstNode, AstUtils, type LangiumDocument } from '@hydranium/langium';
11
11
  import { type Disposable } from 'vscode-languageserver';
12
- import { type Tracer } from '@hydranium/protocol';
12
+ import { Format, Logger, type ProfileRecord, type ProfileSession, type Tracer } from '@hydranium/protocol';
13
13
  import { type LogNameOptions } from '../diagnostics/logger.js';
14
14
  import { type ServerLanguageServices } from '../language-module.js';
15
15
  import { Registry, type RegistryItem } from '../../util/registry.js';
@@ -49,8 +49,7 @@ export interface ScopeDescriptionAcceptor {
49
49
  * descriptions are constructed ahead of time, to avoid per-query
50
50
  * allocation. The pushed description's `tier` must be `'local'` or
51
51
  * `'universal'`; a description of any other tier is silently dropped,
52
- * because the per-tier query methods only return descriptions matching
53
- * the tier they were asked for.
52
+ * because {@link ScopeExtensionDescriptions} holds only those two.
54
53
  */
55
54
  push(description: TieredAstNodeDescription): void;
56
55
  }
@@ -87,38 +86,32 @@ export interface ScopeExtension extends RegistryItem {
87
86
  addDescriptions(context: AstNode, referenceType: string, document: LangiumDocument, accept: ScopeDescriptionAcceptor): void;
88
87
  }
89
88
 
89
+ /** The scope-extension descriptions for one reference, split by tier. */
90
+ export interface ScopeExtensionDescriptions {
91
+ readonly local: readonly TieredAstNodeDescription[];
92
+ readonly universal: readonly TieredAstNodeDescription[];
93
+ }
94
+
90
95
  /**
91
96
  * Public contract for the per-language scope-extension service. Extends
92
97
  * the {@link ScopeExtensionRegistry} (the imperative `register` surface
93
- * contributions use) with the per-tier query methods called cross-class
94
- * from `HydraniumScopeProvider`'s `layerLocalExtension` /
95
- * `layerUniversalExtension` helpers, which layer scope-extension
96
- * contributions around the cached project chain.
97
- *
98
- * Adopter overrides go through {@link DefaultScopeExtensionService}; the
99
- * interface keeps the public API stable while internals
100
- * (`collectExtensionDescriptions` walk) stay `protected` on the default
101
- * class.
98
+ * contributions use) with the query `HydraniumScopeProvider` builds its
99
+ * extension tiers from.
102
100
  */
103
101
  export interface ScopeExtensionService extends ScopeExtensionRegistry {
104
102
  /**
105
- * Layer this language's `local`-tier scope-extension descriptions on
106
- * top of `outerScope` for the given reference type. Returns
107
- * `outerScope` unchanged when no extension contributes a `local`-tier
108
- * description for the type (zero-cost common path).
103
+ * Run every extension registered for `referenceType` once against
104
+ * `context`, and answer its descriptions by tier. A caller that needs
105
+ * both tiers takes them from one call: a call per tier runs every
106
+ * extension twice.
109
107
  */
110
- getLocalExtensionScope(referenceType: string, context: AstNode, outerScope: Scope): Scope;
111
- /**
112
- * Layer this language's `universal`-tier scope-extension descriptions
113
- * BELOW `outerScope` for the given reference type. Returns `outerScope`
114
- * unchanged when no extension contributes a `universal`-tier
115
- * description for the type.
116
- */
117
- getUniversalExtensionScope(referenceType: string, context: AstNode, outerScope: Scope): Scope;
108
+ getDescriptions(referenceType: string, context: AstNode): ScopeExtensionDescriptions;
118
109
  }
119
110
 
120
111
  export type ScopeExtensionServiceOptions = LogNameOptions;
121
112
 
113
+ const NO_DESCRIPTIONS: ScopeExtensionDescriptions = { local: [], universal: [] };
114
+
122
115
  /**
123
116
  * Default {@link ScopeExtensionService} implementation. Per-language
124
117
  * registry for dynamic scope contributions: extra resolvable descriptions
@@ -128,13 +121,19 @@ export type ScopeExtensionServiceOptions = LogNameOptions;
128
121
  * separate from the query-time scope-resolution concern (which only reads).
129
122
  *
130
123
  * Lives in the per-language `references` group alongside `ScopeProvider`,
131
- * which consumes the per-tier query methods ({@link getLocalExtensionScope}
132
- * / {@link getUniversalExtensionScope}). Designed as a base class; adopters
124
+ * which consumes {@link getDescriptions}. Designed as a base class; adopters
133
125
  * extend it and call `register` in their constructor.
126
+ *
127
+ * At `debug`, each extension's calls and self-time go into one profile
128
+ * session, reported when a build starts and when it ends. A report thus
129
+ * covers one build, validation included, or the calls made between two
130
+ * builds, such as a reference picker's.
134
131
  */
135
132
  export class DefaultScopeExtensionService implements ScopeExtensionService {
136
133
  protected readonly scopeExtensions = new Registry<ScopeExtension>();
137
134
  protected readonly tracer: Tracer;
135
+ /** Open from the first profiled call until {@link reportProfile}. */
136
+ protected profileSession?: ProfileSession;
138
137
 
139
138
  constructor(
140
139
  protected readonly services: ServerLanguageServices,
@@ -150,6 +149,10 @@ export class DefaultScopeExtensionService implements ScopeExtensionService {
150
149
  for (const contribution of Object.values(contributions)) {
151
150
  contribution.registerScopeExtensions(this);
152
151
  }
152
+ // Optional for the same reason: a stub tree may carry no builder.
153
+ const builder = services.shared.workspace.DocumentBuilder;
154
+ builder?.onUpdate(() => this.reportProfile());
155
+ builder?.onBuildEnded(() => this.reportProfile());
153
156
  }
154
157
 
155
158
  /**
@@ -162,46 +165,58 @@ export class DefaultScopeExtensionService implements ScopeExtensionService {
162
165
  return this.scopeExtensions.register(extension);
163
166
  }
164
167
 
165
- getLocalExtensionScope(referenceType: string, context: AstNode, outerScope: Scope): Scope {
166
- const local = this.collectExtensionDescriptions(referenceType, context, 'local');
167
- if (local.length === 0) {
168
- return outerScope;
169
- }
170
- return new StreamScope(stream(local), outerScope);
171
- }
172
-
173
- getUniversalExtensionScope(referenceType: string, context: AstNode, outerScope: Scope): Scope {
174
- const universal = this.collectExtensionDescriptions(referenceType, context, 'universal');
175
- if (universal.length === 0) {
176
- return outerScope;
177
- }
178
- return new StreamScope(outerScope.getAllElements(), new MapScope(universal));
179
- }
180
-
181
168
  /**
182
- * Walk this language's registered scope extensions matching
183
- * `referenceType` and collect descriptions of the requested `tier`.
184
- * `push`-ed descriptions of other tiers are silently dropped here —
185
- * the per-tier query methods only return descriptions matching their
186
- * tier. (`local` and `universal` are the only acceptor entry points;
187
- * `push` is the escape hatch for pre-built descriptions and is the
188
- * only path that could carry other tiers.)
169
+ * Holds the profile wrap, which an override would have to copy; to change
170
+ * which extensions run, override {@link extensionsFor}.
189
171
  */
190
- protected collectExtensionDescriptions(
191
- referenceType: string,
192
- context: AstNode,
193
- tier: 'local' | 'universal'
194
- ): TieredAstNodeDescription[] {
195
- const extensionsForType = this.scopeExtensions.all().filter(extension => extension.referenceTypes.includes(referenceType));
172
+ getDescriptions(referenceType: string, context: AstNode): ScopeExtensionDescriptions {
173
+ const extensionsForType = this.extensionsFor(referenceType, context);
196
174
  if (extensionsForType.length === 0) {
197
- return [];
175
+ return NO_DESCRIPTIONS;
198
176
  }
199
177
  const document = AstUtils.getDocument(context);
200
178
  const collected: TieredAstNodeDescription[] = [];
201
179
  const accept = createScopeDescriptionAcceptor(collected, this.services.workspace.AstNodeDescriptionProvider);
180
+ const session = Logger.isLevelEnabled('debug') ? (this.profileSession ??= this.tracer.profile('scope-extension')) : undefined;
202
181
  for (const extension of extensionsForType) {
203
- extension.addDescriptions(context, referenceType, document, accept);
182
+ if (session) {
183
+ session.scope(extension.id, () => extension.addDescriptions(context, referenceType, document, accept));
184
+ } else {
185
+ extension.addDescriptions(context, referenceType, document, accept);
186
+ }
187
+ }
188
+ return {
189
+ local: collected.filter(description => description.tier === 'local'),
190
+ universal: collected.filter(description => description.tier === 'universal')
191
+ };
192
+ }
193
+
194
+ /** The extensions that run for one reference: by default, those registered for `referenceType`. */
195
+ protected extensionsFor(referenceType: string, _context: AstNode): ScopeExtension[] {
196
+ return this.scopeExtensions.all().filter(extension => extension.referenceTypes.includes(referenceType));
197
+ }
198
+
199
+ /**
200
+ * Report the profile session, if one is open, and start the next one fresh:
201
+ * one line per extension, its calls and self-time. Not a share of the
202
+ * session's time, which runs from the first call to the report and so takes
203
+ * in whatever happened between the calls.
204
+ */
205
+ protected reportProfile(): void {
206
+ const session = this.profileSession;
207
+ this.profileSession = undefined;
208
+ for (const record of session?.records() ?? []) {
209
+ this.tracer.debug(this.formatProfileRecord(record));
204
210
  }
205
- return collected.filter(description => description.tier === tier);
211
+ }
212
+
213
+ /**
214
+ * The log line of one extension's {@link reportProfile} entry. It names the
215
+ * language: each has its own session, and an extension id is unique only
216
+ * within its language.
217
+ */
218
+ protected formatProfileRecord(record: ProfileRecord): string {
219
+ const language = this.services.LanguageMetaData.languageId;
220
+ return `[profile scope-extension ${language}] ${record.id} ×${record.count} ${Format.elapsed(record.selfMs)}`;
206
221
  }
207
222
  }
@@ -157,9 +157,7 @@ export function isUniversalTier(description: AstNodeDescription): description is
157
157
  * URI's project, the public-tier sibling belonging to that
158
158
  * same project is redundant (the project-tier sibling under a shorter
159
159
  * name is already in scope) and should be hidden from completion /
160
- * linking. The framework's
161
- * `HydraniumScopeProvider.bucketFor` uses this
162
- * predicate to enforce the own-project canonical filter on the typed scope path.
160
+ * linking.
163
161
  *
164
162
  * `projectId` accepts `string | undefined` for adopter-call-site
165
163
  * ergonomics: when the source has no resolvable project (standalone
@@ -7,7 +7,7 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
- import { isPromiseLike, type MaybePromise, type Tracer, type TransferElement } from '@hydranium/protocol';
10
+ import { type MaybePromise, type Tracer, type TransferElement } from '@hydranium/protocol';
11
11
  import { type AstNode, type AstReflection, type GenericAstNode, isAstNode } from '@hydranium/langium';
12
12
  import { type LogNameOptions } from '../diagnostics/logger.js';
13
13
  import { type HydraniumLanguageServices } from '../language-module.js';
@@ -66,16 +66,6 @@ export interface AbstractSerializerOptions extends LogNameOptions {
66
66
  * the extra property carries a value.
67
67
  */
68
68
  readonly referenceWrapperTypes?: ReadonlyMap<string, string>;
69
- /**
70
- * Whether {@link AbstractSerializer.serializeAst} trims trailing whitespace
71
- * from the final output (leading whitespace is always trimmed). Defaults to
72
- * `true` — the conventional "no trailing blank lines" document shape. Set to
73
- * `false` for grammars whose values may legitimately END the document with
74
- * blank lines that must survive a round-trip — e.g. a multi-line block-scalar
75
- * property (see `YamlSerializerOptions.blockScalarProperties`),
76
- * where a trailing-trim would silently eat user-typed blank lines.
77
- */
78
- readonly trimTrailingWhitespace?: boolean;
79
69
  }
80
70
 
81
71
  /**
@@ -110,8 +100,11 @@ export interface AbstractSerializerOptions extends LogNameOptions {
110
100
  * **Extension points** (override in a subclass):
111
101
  * - {@link serializeReferenceText} — extract the textual form of a
112
102
  * cross-reference; defaults to the value's `$refText`.
103
+ * - {@link formatString} — quote a string, as a primitive or a reference, for
104
+ * the grammar's string terminal; the one override for a grammar whose
105
+ * terminal or value converter differs from Langium's default.
113
106
  * - {@link formatReferenceValue} — format a cross-reference value for emission;
114
- * defaults to `JSON.stringify`.
107
+ * defaults to {@link formatString}.
115
108
  * - {@link serializeCustomValue} — type-specific serialization for values
116
109
  * that don't fit the generic paths. Runs after all reference detection, so
117
110
  * references never reach this hook. Returns `undefined` to fall through to
@@ -124,6 +117,25 @@ export abstract class AbstractSerializer<
124
117
  TAst extends AstNode = AstNode,
125
118
  TTransfer extends TransferElement = TransferElement
126
119
  > implements Serializer<TAst, TTransfer> {
120
+ /**
121
+ * The escapes {@link formatString} writes, read through the subclass, so a
122
+ * grammar adding one overrides this table alone. Langium's
123
+ * `ValueConverter.convertString` decodes the short escapes here and reads
124
+ * any other escaped character as itself, which is how `\\` and `\"` read
125
+ * back, and why a `\u` escape would read back as `u`.
126
+ */
127
+ protected static readonly STRING_ESCAPES: ReadonlyMap<string, string> = new Map([
128
+ ['\\', '\\\\'],
129
+ ['"', '\\"'],
130
+ ['\b', '\\b'],
131
+ ['\f', '\\f'],
132
+ ['\n', '\\n'],
133
+ ['\r', '\\r'],
134
+ ['\t', '\\t'],
135
+ ['\v', '\\v'],
136
+ ['\0', '\\0']
137
+ ]);
138
+
127
139
  protected readonly reflection: AstReflection;
128
140
  protected readonly tracer: Tracer;
129
141
 
@@ -139,29 +151,20 @@ export abstract class AbstractSerializer<
139
151
  * Entry point for AST-shape inputs. Typically the grammar root, but any
140
152
  * AST node works — the walker is recursive and shape-agnostic.
141
153
  *
142
- * Preserves the sync fast path: when every subclass override and every
143
- * adopter hook is sync, the return is a bare `string` (no Promise
144
- * allocation, no microtask). The async branch fires only if at least one
145
- * recursive `serializeNode` call resolved to a Promise.
154
+ * **Emits the model and nothing else — do not trim here.** Trailing
155
+ * whitespace belongs to the author, and a write path holding the prior
156
+ * document restores it from there; trimming at this end deletes it before
157
+ * that restore sees it. A serializer has no prior document to consult, so it
158
+ * cannot tell a deliberate blank line from an accidental one.
159
+ *
160
+ * **Nothing trims what a subclass emits**, at either end. Emitting leading
161
+ * whitespace therefore puts it in the file, where no write path removes it.
162
+ *
163
+ * Returns whatever `serializeNode` returns, so a fully sync subclass keeps a
164
+ * bare `string` with no promise allocation.
146
165
  */
147
166
  serializeAst(model: TAst): MaybePromise<string> {
148
- const result = this.serializeNode(model, 0);
149
- if (isPromiseLike(result)) {
150
- return result.then(text => this.trimSerialized(text));
151
- }
152
- return this.trimSerialized(result);
153
- }
154
-
155
- /**
156
- * Trim the final serialized output. Leading whitespace is always removed;
157
- * trailing whitespace is removed unless {@link AbstractSerializerOptions.trimTrailingWhitespace}
158
- * is `false` (which preserves document-ending blank lines, e.g. inside a block scalar).
159
- */
160
- protected trimSerialized(text: string | undefined): string {
161
- if (text === undefined) {
162
- return '';
163
- }
164
- return this.options.trimTrailingWhitespace === false ? text.trimStart() : text.trim();
167
+ return this.serializeNode(model, 0);
165
168
  }
166
169
 
167
170
  /**
@@ -426,29 +429,42 @@ export abstract class AbstractSerializer<
426
429
  }
427
430
 
428
431
  /**
429
- * Format a cross-reference value for emission. Defaults to `JSON.stringify`.
430
- * Override to apply language-specific reference quoting — e.g. an
431
- * id-reference formatter that mirrors the grammar's id convention.
432
+ * Format a cross-reference value for emission. Defaults to
433
+ * {@link formatString}. Override to apply language-specific reference
434
+ * quoting — e.g. an id-reference formatter that mirrors the grammar's id
435
+ * convention.
432
436
  *
433
437
  * Returns {@link MaybePromise} so adopters with async formatting needs
434
438
  * (remote schema lookup, external canonical-id resolution) can return a
435
439
  * `Promise<string>`. Sync overrides remain valid.
436
440
  */
437
441
  protected formatReferenceValue(value: string): MaybePromise<string> {
438
- return JSON.stringify(value);
442
+ return this.formatString(value);
439
443
  }
440
444
 
441
445
  /**
442
- * Format a primitive value (string, number, boolean) for emission. Defaults
443
- * to `JSON.stringify`, which quotes strings, formats numbers/booleans, and
444
- * is valid both as a YAML scalar and a JSON value.
446
+ * Format a primitive value (string, number, boolean) for emission. A string
447
+ * goes through {@link formatString}, any other value through
448
+ * `JSON.stringify`.
445
449
  *
446
450
  * Returns {@link MaybePromise} so adopters with async formatting needs
447
451
  * (e.g. delegating to `prettier.format` for a specific value class) can
448
452
  * return a `Promise<string>`.
449
453
  */
450
454
  protected formatPrimitive(value: unknown): MaybePromise<string> {
451
- return JSON.stringify(value);
455
+ return typeof value === 'string' ? this.formatString(value) : JSON.stringify(value);
456
+ }
457
+
458
+ /**
459
+ * Quote a string, as a primitive or a reference, for its reader: the
460
+ * grammar's string terminal and value converter. Defaults to the inverse of
461
+ * Langium's default `STRING` terminal and converter: double quotes, `\` and
462
+ * `"` escaped, the converter's short escapes, every other character as it
463
+ * is. A grammar with another terminal or converter overrides this.
464
+ */
465
+ protected formatString(value: string): string {
466
+ const escapes = (this.constructor as typeof AbstractSerializer).STRING_ESCAPES;
467
+ return `"${Array.from(value, char => escapes.get(char) ?? char).join('')}"`;
452
468
  }
453
469
 
454
470
  /**
@@ -224,13 +224,24 @@ export class JsonSerializer<TAst extends AstNode = AstNode, TTransfer extends Tr
224
224
  * encodings.
225
225
  */
226
226
  protected override formatReferenceValue(value: string): MaybePromise<string> {
227
+ const quoted = this.formatString(value);
227
228
  if (this.referenceEncoding === 'string') {
228
- return JSON.stringify(value);
229
+ return quoted;
229
230
  }
230
231
  if (this.compact) {
231
- return `{${JSON.stringify('$ref')}:${JSON.stringify(value)}}`;
232
+ return `{${JSON.stringify('$ref')}:${quoted}}`;
232
233
  }
233
- return `{ ${JSON.stringify('$ref')}: ${JSON.stringify(value)} }`;
234
+ return `{ ${JSON.stringify('$ref')}: ${quoted} }`;
235
+ }
236
+
237
+ /**
238
+ * `JSON.stringify`, so the output stays valid JSON for other tools. The
239
+ * grammar reading it back needs a terminal and value converter that decode
240
+ * the `\u` escape JSON writes for a control character without a short
241
+ * escape; Langium's default converter reads `\u0001` as `u0001`.
242
+ */
243
+ protected override formatString(value: string): string {
244
+ return JSON.stringify(value);
234
245
  }
235
246
 
236
247
  protected composeObject(entries: readonly (readonly [string, string])[], indentationLevel: number): string {
@@ -34,7 +34,7 @@ import type { AstNode } from '@hydranium/langium';
34
34
  * Neither method requires the input to be the grammar root — the walker is
35
35
  * recursive and shape-agnostic, so any element from either tree serializes
36
36
  * correctly. Callers typically pass a root (that's what
37
- * `ModelService.serialize`
37
+ * `DefaultModelService.serialize`
38
38
  * and the GLSP source-model flows hand in), but sub-tree serialization works
39
39
  * for unit tests, snippet rendering, and tooling.
40
40
  */
@@ -87,6 +87,10 @@ export interface YamlSerializerOptions extends AbstractSerializerOptions {
87
87
  * points. YAML's one addition is unquoted-terminal emission, handled by its
88
88
  * {@link serializeCustomValue} override driven by
89
89
  * {@link YamlSerializerOptions.unquotedProperties}.
90
+ *
91
+ * The grammar, not a YAML parser, reads its quoted strings back, so a control
92
+ * character without a short escape is written raw, which a strict YAML parser
93
+ * such as js-yaml refuses.
90
94
  */
91
95
  export class YamlSerializer<TAst extends AstNode = AstNode, TTransfer extends TransferElement = TransferElement> extends AbstractSerializer<
92
96
  TAst,
@@ -209,6 +209,19 @@ export class ExtendedServiceRegistry<
209
209
  return super.getServices(arg);
210
210
  }
211
211
 
212
+ /**
213
+ * Every registered language's services, typed as `TServices` like the
214
+ * lookups here rather than as Langium's base shape, so a sweep of the whole
215
+ * set reaches what a URI or a typed handle would have given it.
216
+ *
217
+ * The cast is sound because {@link register} is the only way a language
218
+ * enters and takes `TServices`; the inherited accessor is typed to Langium's
219
+ * base, which is the only reason one is needed.
220
+ */
221
+ override get all(): readonly TServices[] {
222
+ return super.all as readonly TServices[];
223
+ }
224
+
212
225
  /**
213
226
  * Lookup by anything that identifies a document — an AST node (routed by
214
227
  * the document it lives in), a `URI`, or a URI string. `undefined` when the
@@ -255,9 +268,13 @@ export class ExtendedServiceRegistry<
255
268
  * inherited Langium semantics, which throws on miss). Used for
256
269
  * dynamically-routed lookups where the language id comes from
257
270
  * external input.
271
+ *
272
+ * The cast is sound because {@link register} is the only way a language
273
+ * enters and takes `TServices`; `languageIdMap` is inherited and typed to
274
+ * Langium's base, which is the only reason one is needed.
258
275
  */
259
- getServicesById(languageId: string): LangiumCoreServices | undefined {
260
- return this.languageIdMap.get(languageId);
276
+ getServicesById(languageId: string): TServices | undefined {
277
+ return this.languageIdMap.get(languageId) as TServices | undefined;
261
278
  }
262
279
 
263
280
  /**
@@ -299,6 +316,28 @@ export class ExtendedServiceRegistry<
299
316
  return owners.length === 1 ? owners[0] : undefined;
300
317
  }
301
318
 
319
+ /**
320
+ * The language the strongest signal given names: a declared `languageId`,
321
+ * then `target`'s document, then the only registered language, then the sole
322
+ * producer of `type`. `undefined` when none answers, which leaves the
323
+ * fallback to the caller, since it differs per caller.
324
+ *
325
+ * A declared id comes first because every later signal is inferred, and an
326
+ * inference must not override a caller that said which grammar it means.
327
+ */
328
+ getLanguageFor(hint: { readonly languageId?: string; readonly target?: LanguageTarget; readonly type?: string }): TServices | undefined {
329
+ const declared = hint.languageId === undefined ? undefined : this.getServicesById(hint.languageId);
330
+ const located = declared ?? this.getServicesFor(hint.target);
331
+ if (located) {
332
+ return located;
333
+ }
334
+ const all = this.all;
335
+ if (all.length === 1) {
336
+ return all[0];
337
+ }
338
+ return hint.type === undefined ? undefined : this.soleServicesByType(hint.type);
339
+ }
340
+
302
341
  /**
303
342
  * Drop the memoised type index, so a language registered after the first
304
343
  * type lookup is accounted for. The reason this index belongs on the
@@ -10,9 +10,11 @@
10
10
  import type { Clock, Logger, Project, Tracer } from '@hydranium/protocol';
11
11
  import type { LangiumSharedCoreServices } from '@hydranium/langium';
12
12
  import type { ServerLocale } from '../locale/server-locale.js';
13
- import type { ServerMessageRenderer } from '../messages/renderer.js';
14
- import type { SelfSaveRegistry } from '../documents/self-save-registry.js';
15
- import type { WritableFileSystemProvider } from '../documents/ast-document-manager.js';
13
+ import type { MessageRenderer } from '../messages/renderer.js';
14
+ import type { SelfSaveRegistry } from './workspace/self-save-registry.js';
15
+ import type { ModelLedger } from '../documents/model-ledger.js';
16
+ import type { VersionSyncService } from '../documents/version-sync-service.js';
17
+ import type { WritableFileSystemProvider } from './workspace/file-system-provider.js';
16
18
  import type { HydraniumDocumentRegistry } from './workspace/langium-documents.js';
17
19
  import type { BuildPhasePassService } from './build-phase-pass/build-phase-pass-service.js';
18
20
  import type { CstResidencyService } from './residency/cst-residency-service.js';
@@ -21,6 +23,7 @@ import type { ProjectManager } from './project/project-manager.js';
21
23
  import type { ExtendedServiceRegistry } from './service-registry.js';
22
24
  import type { DocumentUriPolicy } from './workspace/document-uri-policy.js';
23
25
  import type { HydraniumWorkspaceManager } from './workspace/hydranium-workspace-manager.js';
26
+ import type { HydraniumDocumentBuilder } from './document-builder/document-builder.js';
24
27
  import type { AdditionalDocumentContribution } from './workspace/additional-document-contribution.js';
25
28
 
26
29
  /**
@@ -31,12 +34,12 @@ import type { AdditionalDocumentContribution } from './workspace/additional-docu
31
34
  * {@link Clock}, {@link Logger} and {@link Tracer} top-level slots (injectable
32
35
  * time source, emission-only logger, and the measure-and-emit tracer composed
33
36
  * from the other two), the {@link AdditionalDocumentContribution} group, the
34
- * {@link ServerMessageRenderer} and the {@link ServerLocale} it renders in,
37
+ * {@link MessageRenderer} and the {@link ServerLocale} it renders in,
35
38
  * an {@link ExtendedServiceRegistry}, and on `workspace` a writable file-system
36
39
  * provider plus {@link HydraniumWorkspaceManager}, {@link ProjectManager},
37
40
  * {@link SelfSaveRegistry}, {@link BuildPipelineIntegration},
38
- * {@link BuildPhasePassService}, {@link CstResidencyService} and
39
- * {@link DocumentUriPolicy}.
41
+ * {@link BuildPhasePassService}, {@link CstResidencyService},
42
+ * {@link DocumentUriPolicy}, {@link ModelLedger} and {@link VersionSyncService}.
40
43
  *
41
44
  * Declared structurally (interface extends + intersection on nested slots)
42
45
  * so the full `ServerSharedServices` and any consumer-extended variant
@@ -66,7 +69,7 @@ export interface ServerSharedServicesMinimal<TProject extends Project = Project>
66
69
  * shared tier with no workspace dependency, because all three heads'
67
70
  * messages pass through it.
68
71
  */
69
- MessageRenderer: ServerMessageRenderer;
72
+ MessageRenderer: MessageRenderer;
70
73
  /** The locale an init handed the server, for whoever renders in it. */
71
74
  ServerLocale: ServerLocale;
72
75
  /**
@@ -92,12 +95,18 @@ export interface ServerSharedServicesMinimal<TProject extends Project = Project>
92
95
  // only through this narrowing — a scope provider querying a URI before
93
96
  // the file exists is the caller that needs it.
94
97
  /* override */ LangiumDocuments: HydraniumDocumentRegistry;
98
+ // Same, for the builder: only the framework's has `onBuildEnded`, which a
99
+ // per-build report needs because Langium's phases stay silent for a
100
+ // build that validates nothing.
101
+ /* override */ DocumentBuilder: HydraniumDocumentBuilder;
95
102
  ProjectManager: ProjectManager<TProject>;
96
103
  SelfSaveRegistry: SelfSaveRegistry;
97
104
  BuildPipelineIntegration: BuildPipelineIntegration;
98
105
  BuildPhasePassService: BuildPhasePassService;
99
106
  CstResidencyService: CstResidencyService;
100
107
  DocumentUriPolicy: DocumentUriPolicy;
108
+ ModelLedger: ModelLedger;
109
+ VersionSyncService: VersionSyncService;
101
110
  };
102
111
  }
103
112
 
@@ -0,0 +1,42 @@
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 AstReflection } from '@hydranium/langium';
11
+
12
+ /**
13
+ * Fail fast when `reflection` extends `AbstractAstReflection` from a second
14
+ * copy of `langium`, which the files `langium-cli` generates run on: a second
15
+ * install, or one install a bundler or test runner loads twice.
16
+ *
17
+ * A reflection whose prototype chain misses this copy's base is taken to come
18
+ * from another copy when it carries the `subtypes` and `allSubtypes` fields that
19
+ * base creates, which `AstReflection` does not declare. Fields rather than the
20
+ * class name, because bundlers and minifiers rename classes; a hand-written
21
+ * reflection passes unless it declares both fields itself.
22
+ */
23
+ export function assertSingleLangiumCopy(
24
+ reflection: AstReflection,
25
+ subject: () => string = () => `the shared AstReflection (${reflection.constructor?.name ?? 'no constructor'})`
26
+ ): void {
27
+ if (reflection instanceof AbstractAstReflection) {
28
+ return;
29
+ }
30
+ if (Object.hasOwn(reflection, 'subtypes') && Object.hasOwn(reflection, 'allSubtypes')) {
31
+ throw new Error(
32
+ `[hydranium] ${subject()} extends \`AbstractAstReflection\` from another instance of \`langium\` than ` +
33
+ 'the one `@hydranium/langium` loads, a second physical copy or one install loaded twice, so the generated ' +
34
+ 'code runs on one and the framework on the other. Values Langium compares by identity, such as its ' +
35
+ 'cancellation signal, are not recognised across the two. `npm explain langium` lists each installed copy ' +
36
+ 'and what requires it. If your package resolves another version, declare `langium` at the version ' +
37
+ '`@hydranium/langium` pins and reinstall from scratch, without the lockfile; in a workspace, declare the ' +
38
+ 'same pins in the root as well. If a test runner or bundler inlines `langium` but not `@hydranium/*`, ' +
39
+ 'load both the same way.'
40
+ );
41
+ }
42
+ }