@hydranium/core 1.0.0-next.30 → 1.0.0-next.300

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 (770) hide show
  1. package/README.md +72 -82
  2. package/lib/browser/host-heads-in-worker.d.ts +58 -0
  3. package/lib/browser/host-heads-in-worker.d.ts.map +1 -0
  4. package/lib/browser/host-heads-in-worker.js +113 -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 +29 -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 +35 -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 +419 -282
  51. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  52. package/lib/documents/hydranium-text-documents.js +856 -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 +218 -0
  59. package/lib/documents/language-client-shadow.d.ts.map +1 -0
  60. package/lib/documents/language-client-shadow.js +284 -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 +5 -0
  75. package/lib/index.d.ts.map +1 -1
  76. package/lib/index.js +8 -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 +32 -9
  83. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  84. package/lib/langium/ast-extension/ast-node-builder.js +60 -22
  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 +91 -45
  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/hydranium-langium-profiler.d.ts +9 -20
  112. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
  113. package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
  114. package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
  115. package/lib/langium/diagnostics/log-preamble.js +1 -1
  116. package/lib/langium/diagnostics/log-preamble.js.map +1 -1
  117. package/lib/langium/diagnostics/logger.d.ts +19 -4
  118. package/lib/langium/diagnostics/logger.d.ts.map +1 -1
  119. package/lib/langium/diagnostics/logger.js +36 -11
  120. package/lib/langium/diagnostics/logger.js.map +1 -1
  121. package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
  122. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  123. package/lib/langium/diagnostics/lsp-logger.js +58 -17
  124. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  125. package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
  126. package/lib/langium/diagnostics/server-tracer.js.map +1 -1
  127. package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
  128. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  129. package/lib/langium/document-builder/build-pipeline-integration.js +28 -30
  130. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  131. package/lib/langium/document-builder/build-session.d.ts +6 -5
  132. package/lib/langium/document-builder/build-session.d.ts.map +1 -1
  133. package/lib/langium/document-builder/build-session.js +5 -5
  134. package/lib/langium/document-builder/build-session.js.map +1 -1
  135. package/lib/langium/document-builder/document-builder.d.ts +309 -35
  136. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  137. package/lib/langium/document-builder/document-builder.js +511 -75
  138. package/lib/langium/document-builder/document-builder.js.map +1 -1
  139. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  140. package/lib/langium/documentation/comment-provider.js.map +1 -1
  141. package/lib/langium/integration-services.d.ts +40 -24
  142. package/lib/langium/integration-services.d.ts.map +1 -1
  143. package/lib/langium/integration-services.js +7 -4
  144. package/lib/langium/integration-services.js.map +1 -1
  145. package/lib/langium/integrity/integrity-rule.d.ts +16 -8
  146. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  147. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  148. package/lib/langium/integrity/integrity-service.d.ts +83 -27
  149. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  150. package/lib/langium/integrity/integrity-service.js +273 -63
  151. package/lib/langium/integrity/integrity-service.js.map +1 -1
  152. package/lib/langium/keys/containment.d.ts +64 -0
  153. package/lib/langium/keys/containment.d.ts.map +1 -0
  154. package/lib/langium/keys/containment.js +53 -0
  155. package/lib/langium/keys/containment.js.map +1 -0
  156. package/lib/langium/keys/index.d.ts +1 -0
  157. package/lib/langium/keys/index.d.ts.map +1 -1
  158. package/lib/langium/keys/index.js +1 -0
  159. package/lib/langium/keys/index.js.map +1 -1
  160. package/lib/langium/keys/name-based-key-provider.d.ts +4 -0
  161. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  162. package/lib/langium/keys/name-based-key-provider.js +4 -0
  163. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  164. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  165. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  166. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  167. package/lib/langium/labeling/label-provider.js.map +1 -1
  168. package/lib/langium/language-module.d.ts +30 -5
  169. package/lib/langium/language-module.d.ts.map +1 -1
  170. package/lib/langium/language-module.js +18 -4
  171. package/lib/langium/language-module.js.map +1 -1
  172. package/lib/langium/model-service/client-session.d.ts +374 -0
  173. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  174. package/lib/langium/model-service/client-session.js +446 -0
  175. package/lib/langium/model-service/client-session.js.map +1 -0
  176. package/lib/langium/model-service/index.d.ts +2 -0
  177. package/lib/langium/model-service/index.d.ts.map +1 -1
  178. package/lib/langium/model-service/index.js +2 -0
  179. package/lib/langium/model-service/index.js.map +1 -1
  180. package/lib/langium/model-service/model-events.d.ts +66 -0
  181. package/lib/langium/model-service/model-events.d.ts.map +1 -0
  182. package/lib/langium/model-service/model-events.js +10 -0
  183. package/lib/langium/model-service/model-events.js.map +1 -0
  184. package/lib/langium/model-service/model-service.d.ts +480 -289
  185. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  186. package/lib/langium/model-service/model-service.js +597 -456
  187. package/lib/langium/model-service/model-service.js.map +1 -1
  188. package/lib/langium/module.d.ts +158 -37
  189. package/lib/langium/module.d.ts.map +1 -1
  190. package/lib/langium/module.js +52 -36
  191. package/lib/langium/module.js.map +1 -1
  192. package/lib/langium/naming/name-provider.d.ts +42 -7
  193. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  194. package/lib/langium/naming/name-provider.js +10 -4
  195. package/lib/langium/naming/name-provider.js.map +1 -1
  196. package/lib/langium/naming/name-separator-validation.d.ts +23 -1
  197. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  198. package/lib/langium/naming/name-separator-validation.js +22 -0
  199. package/lib/langium/naming/name-separator-validation.js.map +1 -1
  200. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  201. package/lib/langium/project/abstract-project-manager.js +13 -6
  202. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  203. package/lib/langium/project/project-change-event.d.ts +2 -2
  204. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  205. package/lib/langium/project/single-project-manager.js.map +1 -1
  206. package/lib/langium/residency/cst-residency-service.d.ts +35 -12
  207. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  208. package/lib/langium/residency/cst-residency-service.js +24 -58
  209. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  210. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  211. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  212. package/lib/langium/scope/fallback-scope.d.ts +27 -0
  213. package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
  214. package/lib/langium/scope/fallback-scope.js +35 -0
  215. package/lib/langium/scope/fallback-scope.js.map +1 -0
  216. package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
  217. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  218. package/lib/langium/scope/hydranium-scope-computation.js +38 -39
  219. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  220. package/lib/langium/scope/hydranium-scope-provider.d.ts +39 -17
  221. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  222. package/lib/langium/scope/hydranium-scope-provider.js +52 -26
  223. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  224. package/lib/langium/scope/index.d.ts +1 -0
  225. package/lib/langium/scope/index.d.ts.map +1 -1
  226. package/lib/langium/scope/index.js +1 -0
  227. package/lib/langium/scope/index.js.map +1 -1
  228. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  229. package/lib/langium/scope/reference-builder.js.map +1 -1
  230. package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
  231. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  232. package/lib/langium/scope/reference-candidate-provider.js +3 -2
  233. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  234. package/lib/langium/scope/scope-extension-service.d.ts +41 -37
  235. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  236. package/lib/langium/scope/scope-extension-service.js +57 -29
  237. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  238. package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
  239. package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
  240. package/lib/langium/scope/scoped-ast-node-description.js +1 -3
  241. package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
  242. package/lib/langium/serialization/abstract-serializer.d.ts +38 -27
  243. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  244. package/lib/langium/serialization/abstract-serializer.js +54 -30
  245. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  246. package/lib/langium/serialization/json-serializer.d.ts +8 -1
  247. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  248. package/lib/langium/serialization/json-serializer.js +13 -3
  249. package/lib/langium/serialization/json-serializer.js.map +1 -1
  250. package/lib/langium/serialization/serializer.d.ts +1 -1
  251. package/lib/langium/serialization/yaml-serializer.d.ts +4 -0
  252. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  253. package/lib/langium/serialization/yaml-serializer.js +4 -0
  254. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  255. package/lib/langium/service-registry.d.ts +29 -1
  256. package/lib/langium/service-registry.d.ts.map +1 -1
  257. package/lib/langium/service-registry.js +37 -0
  258. package/lib/langium/service-registry.js.map +1 -1
  259. package/lib/langium/shared-services.d.ts +23 -6
  260. package/lib/langium/shared-services.d.ts.map +1 -1
  261. package/lib/langium/shared-services.js.map +1 -1
  262. package/lib/langium/single-langium-copy.d.ts +22 -0
  263. package/lib/langium/single-langium-copy.d.ts.map +1 -0
  264. package/lib/langium/single-langium-copy.js +36 -0
  265. package/lib/langium/single-langium-copy.js.map +1 -0
  266. package/lib/langium/transfer/transfer-encoder.d.ts +84 -35
  267. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  268. package/lib/langium/transfer/transfer-encoder.js +34 -23
  269. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  270. package/lib/langium/trivia/comment-preserver.d.ts +423 -0
  271. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  272. package/lib/langium/trivia/comment-preserver.js +906 -0
  273. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  274. package/lib/langium/trivia/document-ending-preserver.d.ts +51 -0
  275. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  276. package/lib/langium/trivia/document-ending-preserver.js +62 -0
  277. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  278. package/lib/langium/trivia/index.d.ts +14 -0
  279. package/lib/langium/trivia/index.d.ts.map +1 -0
  280. package/lib/langium/trivia/index.js +14 -0
  281. package/lib/langium/trivia/index.js.map +1 -0
  282. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  283. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  284. package/lib/langium/trivia/trivia-contribution.js +10 -0
  285. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  286. package/lib/langium/trivia/trivia-preserver.d.ts +52 -0
  287. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  288. package/lib/langium/trivia/trivia-preserver.js +10 -0
  289. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  290. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  291. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  292. package/lib/langium/trivia/trivia-service.js +56 -0
  293. package/lib/langium/trivia/trivia-service.js.map +1 -0
  294. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  295. package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
  296. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  297. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  298. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  299. package/lib/langium/validation/document-validator.d.ts +280 -9
  300. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  301. package/lib/langium/validation/document-validator.js +453 -8
  302. package/lib/langium/validation/document-validator.js.map +1 -1
  303. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  304. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  305. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  306. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  307. package/lib/langium/workspace/document-uri-policy.d.ts +24 -15
  308. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  309. package/lib/langium/workspace/document-uri-policy.js +22 -13
  310. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  311. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  312. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  313. package/lib/langium/workspace/file-not-found.js +31 -0
  314. package/lib/langium/workspace/file-not-found.js.map +1 -0
  315. package/lib/langium/workspace/file-system-provider.d.ts +165 -8
  316. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  317. package/lib/langium/workspace/file-system-provider.js +111 -13
  318. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  319. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +31 -1
  320. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  321. package/lib/langium/workspace/hydranium-langium-document-factory.js +54 -0
  322. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  323. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
  324. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  325. package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
  326. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  327. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +124 -22
  328. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  329. package/lib/langium/workspace/hydranium-workspace-manager.js +212 -31
  330. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  331. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
  332. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  333. package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
  334. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  335. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  336. package/lib/langium/workspace/index-manager.js.map +1 -1
  337. package/lib/langium/workspace/index.d.ts +1 -0
  338. package/lib/langium/workspace/index.d.ts.map +1 -1
  339. package/lib/langium/workspace/index.js +1 -0
  340. package/lib/langium/workspace/index.js.map +1 -1
  341. package/lib/langium/workspace/initialize-workspace.d.ts +31 -2
  342. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  343. package/lib/langium/workspace/initialize-workspace.js +13 -5
  344. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  345. package/lib/langium/workspace/langium-documents.d.ts +7 -0
  346. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  347. package/lib/langium/workspace/langium-documents.js +18 -1
  348. package/lib/langium/workspace/langium-documents.js.map +1 -1
  349. package/lib/langium/workspace/persistent-file-system-provider.d.ts +15 -9
  350. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  351. package/lib/langium/workspace/persistent-file-system-provider.js +25 -13
  352. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  353. package/lib/langium/workspace/self-save-registry.d.ts +84 -0
  354. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  355. package/lib/{documents → langium/workspace}/self-save-registry.js +33 -22
  356. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  357. package/lib/langium/workspace/virtual-document.d.ts +55 -21
  358. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  359. package/lib/langium/workspace/virtual-document.js +87 -24
  360. package/lib/langium/workspace/virtual-document.js.map +1 -1
  361. package/lib/langium/workspace/write-lock-scope.d.ts +22 -10
  362. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  363. package/lib/langium/workspace/write-lock-scope.js +15 -5
  364. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  365. package/lib/launcher/integrated-server.d.ts +3 -1
  366. package/lib/launcher/integrated-server.d.ts.map +1 -1
  367. package/lib/locale/index.d.ts +10 -0
  368. package/lib/locale/index.d.ts.map +1 -0
  369. package/lib/locale/index.js +10 -0
  370. package/lib/locale/index.js.map +1 -0
  371. package/lib/locale/server-locale.d.ts +73 -0
  372. package/lib/locale/server-locale.d.ts.map +1 -0
  373. package/lib/locale/server-locale.js +61 -0
  374. package/lib/locale/server-locale.js.map +1 -0
  375. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  376. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  377. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  378. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  379. package/lib/lsp/connection-features.d.ts +23 -0
  380. package/lib/lsp/connection-features.d.ts.map +1 -0
  381. package/lib/lsp/connection-features.js +60 -0
  382. package/lib/lsp/connection-features.js.map +1 -0
  383. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  384. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  385. package/lib/lsp/diagnostics-connection.js +53 -0
  386. package/lib/lsp/diagnostics-connection.js.map +1 -0
  387. package/lib/lsp/hydranium-document-update-handler.d.ts +126 -82
  388. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  389. package/lib/lsp/hydranium-document-update-handler.js +235 -102
  390. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  391. package/lib/lsp/index.d.ts +3 -1
  392. package/lib/lsp/index.d.ts.map +1 -1
  393. package/lib/lsp/index.js +3 -1
  394. package/lib/lsp/index.js.map +1 -1
  395. package/lib/lsp/lsp-latency.d.ts +39 -0
  396. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  397. package/lib/lsp/lsp-latency.js +58 -0
  398. package/lib/lsp/lsp-latency.js.map +1 -0
  399. package/lib/lsp/semantic-token-provider.d.ts +34 -1
  400. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  401. package/lib/lsp/semantic-token-provider.js +55 -8
  402. package/lib/lsp/semantic-token-provider.js.map +1 -1
  403. package/lib/lsp/shared-module.d.ts +4 -8
  404. package/lib/lsp/shared-module.d.ts.map +1 -1
  405. package/lib/lsp/shared-module.js.map +1 -1
  406. package/lib/lsp/start-language-server.d.ts +8 -7
  407. package/lib/lsp/start-language-server.d.ts.map +1 -1
  408. package/lib/lsp/start-language-server.js +13 -7
  409. package/lib/lsp/start-language-server.js.map +1 -1
  410. package/lib/messages/carriers.d.ts +18 -12
  411. package/lib/messages/carriers.d.ts.map +1 -1
  412. package/lib/messages/carriers.js +22 -13
  413. package/lib/messages/carriers.js.map +1 -1
  414. package/lib/messages/index.d.ts +4 -1
  415. package/lib/messages/index.d.ts.map +1 -1
  416. package/lib/messages/index.js +4 -1
  417. package/lib/messages/index.js.map +1 -1
  418. package/lib/messages/renderer.d.ts +142 -0
  419. package/lib/messages/renderer.d.ts.map +1 -0
  420. package/lib/messages/renderer.js +165 -0
  421. package/lib/messages/renderer.js.map +1 -0
  422. package/lib/node/event-loop-monitor.d.ts.map +1 -1
  423. package/lib/node/event-loop-monitor.js +2 -1
  424. package/lib/node/event-loop-monitor.js.map +1 -1
  425. package/lib/node/heap-ceiling.d.ts +61 -0
  426. package/lib/node/heap-ceiling.d.ts.map +1 -0
  427. package/lib/node/heap-ceiling.js +72 -0
  428. package/lib/node/heap-ceiling.js.map +1 -0
  429. package/lib/node/index.d.ts +1 -1
  430. package/lib/node/index.d.ts.map +1 -1
  431. package/lib/node/index.js +5 -1
  432. package/lib/node/index.js.map +1 -1
  433. package/lib/node/latency-from-env.d.ts +1 -1
  434. package/lib/node/latency-from-env.js +1 -1
  435. package/lib/node/lint-grammar.js.map +1 -1
  436. package/lib/node/log-preamble-node.d.ts +5 -3
  437. package/lib/node/log-preamble-node.d.ts.map +1 -1
  438. package/lib/node/log-preamble-node.js +13 -10
  439. package/lib/node/log-preamble-node.js.map +1 -1
  440. package/lib/node/measure-memory.d.ts.map +1 -1
  441. package/lib/node/measure-memory.js +5 -4
  442. package/lib/node/measure-memory.js.map +1 -1
  443. package/lib/node/memory-monitor.d.ts +2 -2
  444. package/lib/node/memory-monitor.d.ts.map +1 -1
  445. package/lib/node/memory-monitor.js +9 -10
  446. package/lib/node/memory-monitor.js.map +1 -1
  447. package/lib/node/node-file-system-provider.d.ts +67 -9
  448. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  449. package/lib/node/node-file-system-provider.js +198 -53
  450. package/lib/node/node-file-system-provider.js.map +1 -1
  451. package/lib/node/profile-capture.d.ts +12 -4
  452. package/lib/node/profile-capture.d.ts.map +1 -1
  453. package/lib/node/profile-capture.js +8 -6
  454. package/lib/node/profile-capture.js.map +1 -1
  455. package/lib/node/profile-digest.js.map +1 -1
  456. package/lib/node/profiling-run.d.ts +13 -3
  457. package/lib/node/profiling-run.d.ts.map +1 -1
  458. package/lib/node/profiling-run.js +17 -8
  459. package/lib/node/profiling-run.js.map +1 -1
  460. package/lib/node/rename-over-open-readers.d.ts +61 -0
  461. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  462. package/lib/node/rename-over-open-readers.js +80 -0
  463. package/lib/node/rename-over-open-readers.js.map +1 -0
  464. package/lib/node/server-diagnostics.js +1 -1
  465. package/lib/node/server-diagnostics.js.map +1 -1
  466. package/lib/node/server-state-snapshot.js +4 -4
  467. package/lib/node/server-state-snapshot.js.map +1 -1
  468. package/lib/node/socket-launcher.d.ts +20 -4
  469. package/lib/node/socket-launcher.d.ts.map +1 -1
  470. package/lib/node/socket-launcher.js +8 -7
  471. package/lib/node/socket-launcher.js.map +1 -1
  472. package/lib/node/startup-cpu-profile.d.ts +29 -0
  473. package/lib/node/startup-cpu-profile.d.ts.map +1 -0
  474. package/lib/node/startup-cpu-profile.js +91 -0
  475. package/lib/node/startup-cpu-profile.js.map +1 -0
  476. package/lib/node/stdio-launcher.d.ts +10 -10
  477. package/lib/node/stdio-launcher.d.ts.map +1 -1
  478. package/lib/node/stdio-launcher.js +17 -9
  479. package/lib/node/stdio-launcher.js.map +1 -1
  480. package/lib/testing/document-uri-policy-conformance.js +1 -1
  481. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  482. package/lib/testing/fake-description.js.map +1 -1
  483. package/lib/testing/fake-document.d.ts +16 -4
  484. package/lib/testing/fake-document.d.ts.map +1 -1
  485. package/lib/testing/fake-document.js +18 -3
  486. package/lib/testing/fake-document.js.map +1 -1
  487. package/lib/testing/index.d.ts +1 -1
  488. package/lib/testing/index.d.ts.map +1 -1
  489. package/lib/testing/index.js +2 -1
  490. package/lib/testing/index.js.map +1 -1
  491. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  492. package/lib/testing/langium-test-helpers.js +1 -0
  493. package/lib/testing/langium-test-helpers.js.map +1 -1
  494. package/lib/testing/make-noop-language-services.js.map +1 -1
  495. package/lib/testing/make-noop-shared-services.d.ts +14 -0
  496. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  497. package/lib/testing/make-noop-shared-services.js +28 -2
  498. package/lib/testing/make-noop-shared-services.js.map +1 -1
  499. package/lib/testing/make-test-services.d.ts +72 -14
  500. package/lib/testing/make-test-services.d.ts.map +1 -1
  501. package/lib/testing/make-test-services.js +42 -10
  502. package/lib/testing/make-test-services.js.map +1 -1
  503. package/lib/testing/make-test-tracer.d.ts +12 -0
  504. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  505. package/lib/testing/make-test-tracer.js +13 -0
  506. package/lib/testing/make-test-tracer.js.map +1 -1
  507. package/lib/testing/node/applied-edit-capture.d.ts +29 -0
  508. package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
  509. package/lib/testing/node/applied-edit-capture.js +117 -0
  510. package/lib/testing/node/applied-edit-capture.js.map +1 -0
  511. package/lib/testing/node/golden-corpus.js.map +1 -1
  512. package/lib/testing/node/index.d.ts +1 -0
  513. package/lib/testing/node/index.d.ts.map +1 -1
  514. package/lib/testing/node/index.js +1 -0
  515. package/lib/testing/node/index.js.map +1 -1
  516. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  517. package/lib/testing/node/lsp-harness.js +2 -0
  518. package/lib/testing/node/lsp-harness.js.map +1 -1
  519. package/lib/testing/node/lsp-server-connection.d.ts +21 -6
  520. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  521. package/lib/testing/node/lsp-server-connection.js +49 -106
  522. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  523. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  524. package/lib/testing/node/scratch-workspace.js +10 -5
  525. package/lib/testing/node/scratch-workspace.js.map +1 -1
  526. package/lib/testing/node/spawned-server.d.ts +30 -1
  527. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  528. package/lib/testing/node/spawned-server.js +39 -2
  529. package/lib/testing/node/spawned-server.js.map +1 -1
  530. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  531. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  532. package/lib/testing/node/unhandled-rejections.js +32 -0
  533. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  534. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  535. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  536. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  537. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  538. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  539. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  540. package/lib/testing/playwright/index.d.ts +1 -0
  541. package/lib/testing/playwright/index.d.ts.map +1 -1
  542. package/lib/testing/playwright/index.js +1 -0
  543. package/lib/testing/playwright/index.js.map +1 -1
  544. package/lib/testing/playwright/server-log-capture.d.ts +46 -16
  545. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  546. package/lib/testing/playwright/server-log-capture.js +111 -40
  547. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  548. package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
  549. package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
  550. package/lib/testing/playwright/server-log-fixture.js +25 -6
  551. package/lib/testing/playwright/server-log-fixture.js.map +1 -1
  552. package/lib/testing/playwright/server-log-region.d.ts +15 -0
  553. package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
  554. package/lib/testing/playwright/server-log-region.js +30 -0
  555. package/lib/testing/playwright/server-log-region.js.map +1 -0
  556. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  557. package/lib/testing/playwright/server-log-rename-reporter.js +4 -3
  558. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  559. package/lib/testing/run-update-pipeline.d.ts +8 -5
  560. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  561. package/lib/testing/run-update-pipeline.js.map +1 -1
  562. package/lib/testing/stub-ast-document-manager.d.ts +11 -52
  563. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  564. package/lib/testing/stub-ast-document-manager.js +31 -62
  565. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  566. package/lib/testing/stub-document-builder.d.ts +33 -11
  567. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  568. package/lib/testing/stub-document-builder.js +103 -5
  569. package/lib/testing/stub-document-builder.js.map +1 -1
  570. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  571. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  572. package/lib/testing/stub-hydranium-text-documents.js +132 -16
  573. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  574. package/lib/testing/stub-index-manager.js.map +1 -1
  575. package/lib/testing/stub-langium-documents.d.ts +3 -2
  576. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  577. package/lib/testing/stub-langium-documents.js.map +1 -1
  578. package/lib/testing/stub-model-service.d.ts +9 -8
  579. package/lib/testing/stub-model-service.d.ts.map +1 -1
  580. package/lib/testing/stub-model-service.js +6 -6
  581. package/lib/testing/stub-model-service.js.map +1 -1
  582. package/lib/testing/stub-project-manager.js.map +1 -1
  583. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  584. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  585. package/lib/testing/stub-service-registry.d.ts +1 -1
  586. package/lib/testing/stub-service-registry.js.map +1 -1
  587. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  588. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  589. package/lib/testing/stub-writable-file-system.js +2 -1
  590. package/lib/testing/stub-writable-file-system.js.map +1 -1
  591. package/lib/util/connection-liveness.d.ts +19 -6
  592. package/lib/util/connection-liveness.d.ts.map +1 -1
  593. package/lib/util/connection-liveness.js +61 -15
  594. package/lib/util/connection-liveness.js.map +1 -1
  595. package/lib/util/environment.d.ts.map +1 -1
  596. package/lib/util/environment.js.map +1 -1
  597. package/lib/util/registry.d.ts.map +1 -1
  598. package/package.json +38 -57
  599. package/src/browser/host-heads-in-worker.ts +142 -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 +51 -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 +976 -595
  612. package/src/documents/index.ts +10 -2
  613. package/src/documents/language-client-shadow.ts +452 -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 +8 -0
  618. package/src/langium/ast-extension/ast-extension-service.ts +77 -41
  619. package/src/langium/ast-extension/ast-node-builder.ts +66 -22
  620. package/src/langium/bootstrap.ts +95 -52
  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/hydranium-langium-profiler.ts +15 -39
  627. package/src/langium/diagnostics/log-preamble.ts +1 -1
  628. package/src/langium/diagnostics/logger.ts +38 -11
  629. package/src/langium/diagnostics/lsp-logger.ts +61 -16
  630. package/src/langium/document-builder/build-pipeline-integration.ts +46 -32
  631. package/src/langium/document-builder/build-session.ts +4 -3
  632. package/src/langium/document-builder/document-builder.ts +616 -73
  633. package/src/langium/integration-services.ts +59 -28
  634. package/src/langium/integrity/integrity-rule.ts +16 -8
  635. package/src/langium/integrity/integrity-service.ts +296 -69
  636. package/src/langium/keys/containment.ts +87 -0
  637. package/src/langium/keys/index.ts +1 -0
  638. package/src/langium/keys/name-based-key-provider.ts +4 -0
  639. package/src/langium/language-module.ts +49 -8
  640. package/src/langium/model-service/client-session.ts +704 -0
  641. package/src/langium/model-service/index.ts +2 -0
  642. package/src/langium/model-service/model-events.ts +80 -0
  643. package/src/langium/model-service/model-service.ts +908 -485
  644. package/src/langium/module.ts +212 -67
  645. package/src/langium/naming/name-provider.ts +44 -8
  646. package/src/langium/naming/name-separator-validation.ts +25 -3
  647. package/src/langium/project/abstract-project-manager.ts +13 -5
  648. package/src/langium/project/project-change-event.ts +2 -2
  649. package/src/langium/residency/cst-residency-service.ts +51 -17
  650. package/src/langium/scope/fallback-scope.ts +38 -0
  651. package/src/langium/scope/hydranium-scope-computation.ts +45 -44
  652. package/src/langium/scope/hydranium-scope-provider.ts +64 -27
  653. package/src/langium/scope/index.ts +1 -0
  654. package/src/langium/scope/reference-candidate-provider.ts +6 -5
  655. package/src/langium/scope/scope-extension-service.ts +74 -59
  656. package/src/langium/scope/scoped-ast-node-description.ts +1 -3
  657. package/src/langium/serialization/abstract-serializer.ts +57 -41
  658. package/src/langium/serialization/json-serializer.ts +14 -3
  659. package/src/langium/serialization/serializer.ts +1 -1
  660. package/src/langium/serialization/yaml-serializer.ts +4 -0
  661. package/src/langium/service-registry.ts +41 -2
  662. package/src/langium/shared-services.ts +26 -6
  663. package/src/langium/single-langium-copy.ts +42 -0
  664. package/src/langium/transfer/transfer-encoder.ts +102 -45
  665. package/src/langium/trivia/comment-preserver.ts +1100 -0
  666. package/src/langium/trivia/document-ending-preserver.ts +71 -0
  667. package/src/langium/trivia/index.ts +14 -0
  668. package/src/langium/trivia/trivia-contribution.ts +39 -0
  669. package/src/langium/trivia/trivia-preserver.ts +56 -0
  670. package/src/langium/trivia/trivia-service.ts +99 -0
  671. package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
  672. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  673. package/src/langium/validation/document-validator.ts +528 -13
  674. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  675. package/src/langium/workspace/document-uri-policy.ts +32 -18
  676. package/src/langium/workspace/file-not-found.ts +35 -0
  677. package/src/langium/workspace/file-system-provider.ts +253 -16
  678. package/src/langium/workspace/hydranium-langium-document-factory.ts +83 -0
  679. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
  680. package/src/langium/workspace/hydranium-workspace-manager.ts +241 -35
  681. package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
  682. package/src/langium/workspace/index.ts +1 -0
  683. package/src/langium/workspace/initialize-workspace.ts +43 -5
  684. package/src/langium/workspace/langium-documents.ts +19 -1
  685. package/src/langium/workspace/persistent-file-system-provider.ts +26 -14
  686. package/src/langium/workspace/self-save-registry.ts +118 -0
  687. package/src/langium/workspace/virtual-document.ts +106 -25
  688. package/src/langium/workspace/write-lock-scope.ts +27 -12
  689. package/src/launcher/integrated-server.ts +3 -1
  690. package/src/locale/index.ts +10 -0
  691. package/src/locale/server-locale.ts +86 -0
  692. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  693. package/src/lsp/connection-features.ts +67 -0
  694. package/src/lsp/diagnostics-connection.ts +56 -0
  695. package/src/lsp/hydranium-document-update-handler.ts +285 -111
  696. package/src/lsp/index.ts +3 -1
  697. package/src/lsp/lsp-latency.ts +62 -0
  698. package/src/lsp/semantic-token-provider.ts +74 -7
  699. package/src/lsp/shared-module.ts +4 -8
  700. package/src/lsp/start-language-server.ts +13 -7
  701. package/src/messages/carriers.ts +23 -15
  702. package/src/messages/index.ts +13 -1
  703. package/src/messages/renderer.ts +212 -0
  704. package/src/node/event-loop-monitor.ts +2 -1
  705. package/src/node/heap-ceiling.ts +108 -0
  706. package/src/node/index.ts +5 -1
  707. package/src/node/latency-from-env.ts +1 -1
  708. package/src/node/log-preamble-node.ts +20 -10
  709. package/src/node/measure-memory.ts +5 -4
  710. package/src/node/memory-monitor.ts +10 -10
  711. package/src/node/node-file-system-provider.ts +214 -57
  712. package/src/node/profile-capture.ts +16 -15
  713. package/src/node/profiling-run.ts +30 -8
  714. package/src/node/rename-over-open-readers.ts +94 -0
  715. package/src/node/server-diagnostics.ts +1 -1
  716. package/src/node/server-state-snapshot.ts +5 -5
  717. package/src/node/socket-launcher.ts +27 -11
  718. package/src/node/startup-cpu-profile.ts +94 -0
  719. package/src/node/stdio-launcher.ts +22 -14
  720. package/src/testing/document-uri-policy-conformance.ts +1 -1
  721. package/src/testing/fake-document.ts +24 -5
  722. package/src/testing/index.ts +2 -1
  723. package/src/testing/langium-test-helpers.ts +1 -0
  724. package/src/testing/make-noop-shared-services.ts +50 -2
  725. package/src/testing/make-test-services.ts +125 -31
  726. package/src/testing/make-test-tracer.ts +26 -0
  727. package/src/testing/node/applied-edit-capture.ts +141 -0
  728. package/src/testing/node/index.ts +1 -0
  729. package/src/testing/node/lsp-harness.ts +2 -0
  730. package/src/testing/node/lsp-server-connection.ts +83 -119
  731. package/src/testing/node/scratch-workspace.ts +10 -5
  732. package/src/testing/node/spawned-server.ts +57 -3
  733. package/src/testing/node/unhandled-rejections.ts +31 -0
  734. package/src/testing/parse-semantic-root.ts +1 -1
  735. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  736. package/src/testing/playwright/index.ts +1 -0
  737. package/src/testing/playwright/server-log-capture.ts +137 -47
  738. package/src/testing/playwright/server-log-fixture.ts +46 -6
  739. package/src/testing/playwright/server-log-region.ts +32 -0
  740. package/src/testing/playwright/server-log-rename-reporter.ts +4 -3
  741. package/src/testing/run-update-pipeline.ts +8 -5
  742. package/src/testing/stub-ast-document-manager.ts +47 -128
  743. package/src/testing/stub-document-builder.ts +133 -18
  744. package/src/testing/stub-hydranium-text-documents.ts +184 -27
  745. package/src/testing/stub-langium-documents.ts +3 -2
  746. package/src/testing/stub-model-service.ts +11 -10
  747. package/src/testing/stub-self-save-registry.ts +1 -1
  748. package/src/testing/stub-service-registry.ts +1 -1
  749. package/src/testing/stub-writable-file-system.ts +3 -2
  750. package/src/util/connection-liveness.ts +67 -15
  751. package/src/util/environment.ts +9 -1
  752. package/lib/documents/language-client-text-shadow.d.ts +0 -101
  753. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  754. package/lib/documents/language-client-text-shadow.js +0 -156
  755. package/lib/documents/language-client-text-shadow.js.map +0 -1
  756. package/lib/documents/self-save-registry.d.ts +0 -55
  757. package/lib/documents/self-save-registry.d.ts.map +0 -1
  758. package/lib/documents/self-save-registry.js.map +0 -1
  759. package/lib/lsp/instrument-connection.d.ts +0 -36
  760. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  761. package/lib/lsp/instrument-connection.js +0 -62
  762. package/lib/lsp/instrument-connection.js.map +0 -1
  763. package/lib/node/process-memory.d.ts +0 -66
  764. package/lib/node/process-memory.d.ts.map +0 -1
  765. package/lib/node/process-memory.js +0 -252
  766. package/lib/node/process-memory.js.map +0 -1
  767. package/src/documents/language-client-text-shadow.ts +0 -175
  768. package/src/documents/self-save-registry.ts +0 -81
  769. package/src/lsp/instrument-connection.ts +0 -66
  770. package/src/node/process-memory.ts +0 -299
@@ -0,0 +1,119 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+
10
+ import { type ConfigurationInitializedParams, DefaultConfigurationProvider } from '@hydranium/langium';
11
+ import type { ConfigurationItem, DidChangeConfigurationRegistrationOptions } from 'vscode-languageserver';
12
+
13
+ /**
14
+ * Configuration provider that asks the client about a section the first time
15
+ * something reads it.
16
+ *
17
+ * Langium's base requests one section per registered language, named after the
18
+ * language id, and never asks again. A read of any other section — including
19
+ * whatever `lsp.configurationRoot` is bound to — then resolves `undefined` with
20
+ * no request on the wire, which is indistinguishable from a setting the user has
21
+ * not set.
22
+ *
23
+ * Asking on first read rather than from a list collected up front: a reader
24
+ * names its section during DI, after `initialized` has taken its one-shot pass,
25
+ * so a list would have to be complete before the server initialized.
26
+ */
27
+ export class HydraniumConfigurationProvider extends DefaultConfigurationProvider {
28
+ /**
29
+ * The client-facing hooks, captured because they arrive once as arguments to
30
+ * {@link initialized} and are needed on every later read. Absent in a
31
+ * headless composition, which has no connection to ask.
32
+ */
33
+ protected registerForSection?: (params: DidChangeConfigurationRegistrationOptions) => void;
34
+ protected fetchSections?: (items: ConfigurationItem[]) => Promise<unknown>;
35
+
36
+ /**
37
+ * Sections already dealt with, holding the in-flight work so concurrent
38
+ * readers share one round trip. Entries stay after they settle: they record
39
+ * that the section was HANDLED, and without that an unset section is
40
+ * re-requested on every read, "unset" and "not fetched" being the same
41
+ * absence in the store.
42
+ *
43
+ * A section the client's capabilities ruled out counts as handled, having
44
+ * been settled by asking nothing.
45
+ */
46
+ protected readonly requestedSections = new Map<string, Promise<void>>();
47
+
48
+ override async initialized(params: ConfigurationInitializedParams): Promise<void> {
49
+ this.registerForSection = params.register;
50
+ this.fetchSections = params.fetchConfiguration;
51
+ await super.initialized(params);
52
+ }
53
+
54
+ /**
55
+ * The `ready` await precedes the emptiness check: the base resolves it at the
56
+ * end of its own initial fetch, so testing the store first calls every
57
+ * language section missing and re-requests what is already on its way.
58
+ */
59
+ override async getConfiguration(language: string, configuration: string): Promise<unknown> {
60
+ await this.ready;
61
+ const section = this.toSectionName(language);
62
+ if (this.settings[section] === undefined) {
63
+ await this.requestSection(section);
64
+ }
65
+ return super.getConfiguration(language, configuration);
66
+ }
67
+
68
+ /** Ask about `section` once, sharing the request with any concurrent reader. */
69
+ protected requestSection(section: string): Promise<void> {
70
+ const existing = this.requestedSections.get(section);
71
+ if (existing) {
72
+ return existing;
73
+ }
74
+ const request = this.doRequestSection(section);
75
+ this.requestedSections.set(section, request);
76
+ return request;
77
+ }
78
+
79
+ /**
80
+ * The hooks are gated on the client having declared `workspace.configuration`.
81
+ * A connection binds them whatever the client said, so their presence is not
82
+ * consent: calling them sends a `client/registerCapability` and a
83
+ * `workspace/configuration` to a client that advertised support for neither,
84
+ * which is entitled to answer either with a method-not-found and may drop the
85
+ * connection.
86
+ *
87
+ * That flag is exact for the fetch and KNOWINGLY coarse for the registration,
88
+ * which the spec governs by
89
+ * `workspace.didChangeConfiguration.dynamicRegistration`. The base registers
90
+ * under `workspace.configuration` alone before any of this runs, so gating
91
+ * the registration on the narrower flag here would withhold a request whose
92
+ * twin has already gone out, sparing the client nothing. A client declaring
93
+ * `workspace.configuration` without dynamic registration is still registered
94
+ * for, by the base and by this; closing that means changing the base's pass,
95
+ * not this gate.
96
+ *
97
+ * Registering before fetching, so an edit landing between the two arrives as
98
+ * a notification instead of being lost; the reverse order drops it.
99
+ *
100
+ * A `null` result is left out of the store rather than written, so the
101
+ * section reads as unset, and no `onConfigurationSectionUpdate` fires — the
102
+ * value goes to the caller that asked for it, and an event would announce a
103
+ * change that is only this provider catching up.
104
+ */
105
+ protected async doRequestSection(section: string): Promise<void> {
106
+ if (!this.workspaceConfig) {
107
+ return;
108
+ }
109
+ this.registerForSection?.({ section });
110
+ if (!this.fetchSections) {
111
+ return;
112
+ }
113
+ const fetched = await this.fetchSections([{ section }]);
114
+ const value = Array.isArray(fetched) ? fetched[0] : fetched;
115
+ if (value !== null && value !== undefined) {
116
+ this.updateSectionConfiguration(section, value);
117
+ }
118
+ }
119
+ }
@@ -7,4 +7,5 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
+ export * from './configuration-provider.js';
10
11
  export * from './settings.js';
@@ -8,14 +8,7 @@
8
8
  ********************************************************************************/
9
9
 
10
10
  import { Format, Logger, type Tracer } from '@hydranium/protocol';
11
- import {
12
- DefaultLangiumProfiler,
13
- DocumentState,
14
- MultiMap,
15
- type ProfilingCategory,
16
- type ProfilingRecord,
17
- ProfilingTask
18
- } from '@hydranium/langium';
11
+ import { DefaultLangiumProfiler, MultiMap, type ProfilingCategory, type ProfilingRecord, ProfilingTask } from '@hydranium/langium';
19
12
  import { type LogNameOptions } from './logger.js';
20
13
  import { type ServerSharedServicesMinimal } from '../shared-services.js';
21
14
 
@@ -29,18 +22,8 @@ export interface LangiumProfilerOptions extends LogNameOptions {
29
22
  * {@link DefaultLangiumProfiler}) to Langium's full set when omitted.
30
23
  */
31
24
  readonly activeCategories?: Set<ProfilingCategory>;
32
- /**
33
- * Priority of the per-build flush pass at the `Validated` phase. The flush is
34
- * normally the only pass at `Validated`, so order is immaterial; the option
35
- * exists for symmetry with the other framework passes. Default
36
- * {@link PROFILER_FLUSH_PASS_PRIORITY}.
37
- */
38
- readonly flushPriority?: number;
39
25
  }
40
26
 
41
- /** Default priority of the profiler's per-build flush pass (see {@link LangiumProfilerOptions.flushPriority}). */
42
- export const PROFILER_FLUSH_PASS_PRIORITY = 0;
43
-
44
27
  /**
45
28
  * Framework adapter over Langium's {@link DefaultLangiumProfiler} that is
46
29
  * **trace-gated** and emits a single **aggregated** per-category breakdown
@@ -54,9 +37,8 @@ export const PROFILER_FLUSH_PASS_PRIORITY = 0;
54
37
  * task identifier), so the per-document records carry no distinguishing
55
38
  * information anyway. We instead accumulate records in {@link records} and
56
39
  * {@link flush} one breakdown per category — self-time and invocation counts
57
- * summed per `$type` across the whole build — on the terminal `Validated`
58
- * build phase (self-registered in the constructor). One report per build, not
59
- * one per file.
40
+ * summed per `$type` across the whole build — when the build ends
41
+ * (subscribed in the constructor). One report per build, not one per file.
60
42
  * - **Transport safety.** The stock per-record dump uses `console.table`, which
61
43
  * is NOT in the set `patchConsole` reroutes; under `vscode-languageserver`'s
62
44
  * `--stdio` transport `process.stdout` *is* the JSON-RPC channel, so the
@@ -74,8 +56,8 @@ export const PROFILER_FLUSH_PASS_PRIORITY = 0;
74
56
  * restart. Langium's own `start`/`stop` category selection still applies *on
75
57
  * top of* the trace gate.
76
58
  *
77
- * Registered eagerly (see `DEFAULT_EAGER_SERVICES`) so its `Validated`-phase
78
- * flush pass is registered before the first build. Gives the per-grammar-rule /
59
+ * Registered eagerly (see `DEFAULT_EAGER_SERVICES`) so its flush is
60
+ * subscribed before the first build. Gives the per-grammar-rule /
79
61
  * per-`$type` parse/link/validate self-time the framework's own
80
62
  * `ServerTracer` / `ProfileSession` passes
81
63
  * cannot produce (those cover the framework's passes *outside* Langium's
@@ -88,16 +70,11 @@ export class HydraniumLangiumProfiler extends DefaultLangiumProfiler {
88
70
  constructor(services: ServerSharedServicesMinimal, options: LangiumProfilerOptions = {}) {
89
71
  super(options.activeCategories);
90
72
  this.tracer = services.Tracer.for(options.logName ?? 'LangiumProfiler').trace('instantiated');
91
- // Flush once per build on the terminal phase rather than once per document.
92
- // By `Validated`, every parse/link/validate record for the batch is in.
93
- // Registered as a build-phase pass (not a direct onBuildPhase listener) so
94
- // every framework + adopter build-phase reaction shares one dispatcher.
95
- services.workspace.BuildPhasePassService.register({
96
- id: 'framework:langium-profiler:flush',
97
- state: DocumentState.Validated,
98
- priority: options.flushPriority ?? PROFILER_FLUSH_PASS_PRIORITY,
99
- run: () => this.flush()
100
- });
73
+ // Flush once per build when it ends rather than once per document. Not at
74
+ // a `Validated` pass: that phase stays silent for a build that validates
75
+ // nothing, the workspace's initial one among them, and the records would
76
+ // then wait for a build that does.
77
+ services.workspace.DocumentBuilder.onBuildEnded(() => this.flush());
101
78
  }
102
79
 
103
80
  /**
@@ -142,14 +119,13 @@ export class HydraniumLangiumProfiler extends DefaultLangiumProfiler {
142
119
  /**
143
120
  * Emit one aggregated breakdown per category — self-time and invocation
144
121
  * counts summed per `<languageId>.<$type>` across every record collected
145
- * this build — then clear the window. Self-registered as a `Validated`-phase
146
- * build pass, so it fires once per build, not per document. Pass explicit
147
- * categories to flush a subset; defaults to all.
122
+ * this build — then clear the window. Called when a build ends, so it fires
123
+ * once per build, not per document. Pass explicit categories to flush a
124
+ * subset; defaults to all.
148
125
  *
149
126
  * `flush` is the sole reset point: because it clears each flushed category,
150
- * memory is bounded per completed build. A build cancelled before `Validated`
151
- * leaves its partial records to roll into the next build's flush (slightly
152
- * inflated counts, self-correcting) rather than accumulating without bound.
127
+ * memory is bounded per build. Builds that throw share one flush, once the
128
+ * lock has drained after them.
153
129
  */
154
130
  flush(...categories: ProfilingCategory[]): void {
155
131
  const toFlush = categories.length > 0 ? categories : ALL_CATEGORIES;
@@ -50,7 +50,7 @@ export function logPreamble(logger: Logger, options: LogPreambleOptions): void {
50
50
 
51
51
  function logSessionInfo(logger: Logger, productName: string, version: string, systemInfoLines: readonly string[]): void {
52
52
  const now = new Date();
53
- const dateStr = now.toISOString().slice(0, 10); // YYYY-MM-DD, unambiguous across midnight
53
+ const dateStr = now.toISOString().slice(0, 10); // YYYY-MM-DD in UTC, which can differ from the reader's local date
54
54
  const lines = [
55
55
  DIVIDER,
56
56
  `${productName} server session`,
@@ -7,7 +7,7 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
- import { Format } from '@hydranium/protocol';
10
+ import { Format, LEVEL_ORDER, type LogLevel, Logger, type LogThreshold } from '@hydranium/protocol';
11
11
  import { currentMemoryUsage, onProcessEvent, processPid } from '../../util/environment.js';
12
12
 
13
13
  /** Only append a memory suffix when the heap has moved by at least this much since the last log line. */
@@ -69,6 +69,28 @@ const pendingLogLines: string[] = [];
69
69
  /** Matches any remaining `{name}` placeholder token. */
70
70
  const PLACEHOLDER_PATTERN = /\{[^}]+\}/;
71
71
 
72
+ /**
73
+ * `template` with `{pid}` replaced by the process id, known from the start, and
74
+ * each placeholder supplied so far by its value.
75
+ */
76
+ function substituteLogFilePlaceholders(template: string): string {
77
+ let path = template.split('{pid}').join(String(processPid() ?? 'unknown'));
78
+ for (const [name, value] of logFilePlaceholders) {
79
+ path = path.split(`{${name}}`).join(value);
80
+ }
81
+ return path;
82
+ }
83
+
84
+ /**
85
+ * Expand `template` the way the file-tee names its file: `{pid}` and each
86
+ * supplied placeholder by its value, each one still missing by
87
+ * `_startup-<pid>`. A file written beside the log, such as the CPU profile,
88
+ * names itself through this so both carry the same workspace token.
89
+ */
90
+ export function expandLogFilePlaceholders(template: string): string {
91
+ return substituteLogFilePlaceholders(template).replace(new RegExp(PLACEHOLDER_PATTERN, 'g'), `_startup-${processPid() ?? 'unknown'}`);
92
+ }
93
+
72
94
  /**
73
95
  * Recompute {@link resolvedLogFilePath} from the template + known placeholders.
74
96
  * Resolves (and flushes the pending buffer) only once no `{...}` token remains.
@@ -78,10 +100,7 @@ function tryResolveLogFilePath(): void {
78
100
  resolvedLogFilePath = undefined;
79
101
  return;
80
102
  }
81
- let path = logFileTemplate;
82
- for (const [name, value] of logFilePlaceholders) {
83
- path = path.split(`{${name}}`).join(value);
84
- }
103
+ const path = substituteLogFilePlaceholders(logFileTemplate);
85
104
  if (PLACEHOLDER_PATTERN.test(path)) {
86
105
  resolvedLogFilePath = undefined;
87
106
  // Target is pending — guarantee the buffer is flushed even if the process
@@ -116,12 +135,19 @@ function flushPendingLogLines(): void {
116
135
  /**
117
136
  * Set the file-tee target programmatically. Pass `undefined` to disable. The
118
137
  * path may contain `{placeholder}` tokens (e.g. `{workspace}`); lines buffer
119
- * until every token is supplied via {@link resolveLogFilePlaceholder}.
138
+ * until every token is supplied via {@link resolveLogFilePlaceholder}, except
139
+ * `{pid}`, which is the process id from the start.
120
140
  * Called by the `LspLogger` constructor's
121
141
  * one-time `HYDRANIUM_LOG_FILE` env baseline (and by tests).
142
+ *
143
+ * `level` becomes `Logger.setFileLevel`, cleared with the target and when
144
+ * omitted. Setting the file level apart from the target lets it outlive the
145
+ * file, and every sender keeps building lines above the process threshold
146
+ * that nothing writes.
122
147
  */
123
- export function setLogFilePath(path: string | undefined): void {
148
+ export function setLogFilePath(path: string | undefined, level?: LogThreshold): void {
124
149
  logFileTemplate = path && path.length > 0 ? path : undefined;
150
+ Logger.setFileLevel(logFileTemplate ? level : undefined);
125
151
  logFilePlaceholders.clear();
126
152
  pendingLogLines.length = 0;
127
153
  resolvedLogFilePath = undefined;
@@ -150,7 +176,7 @@ export function flushLogFileFallback(): void {
150
176
  if (!logFileTemplate || resolvedLogFilePath || pendingLogLines.length === 0) {
151
177
  return;
152
178
  }
153
- resolvedLogFilePath = logFileTemplate.replace(/\{[^}]+\}/g, `_startup-${processPid() ?? 'unknown'}`);
179
+ resolvedLogFilePath = expandLogFilePlaceholders(logFileTemplate);
154
180
  ensureLogDir(resolvedLogFilePath);
155
181
  flushPendingLogLines();
156
182
  }
@@ -173,13 +199,14 @@ export function getLogFilePath(): string | undefined {
173
199
 
174
200
  /**
175
201
  * Fan a single already-formatted log line out to the file-tee target, if one is
176
- * configured. Called by `LspLogger`'s emit in
202
+ * configured and `level` is within the file's threshold
203
+ * (`Logger.getFileLevel() ?? Logger.getLevel()`). Called by `LspLogger`'s emit in
177
204
  * addition to the LSP/console sink — log sinks fan out, they don't replace.
178
205
  * While the target is still pending (unresolved `{placeholder}`), the line is
179
206
  * buffered instead of dropped.
180
207
  */
181
- export function teeLogLine(formatted: string): void {
182
- if (!logFileTemplate) {
208
+ export function teeLogLine(level: LogLevel, formatted: string): void {
209
+ if (!logFileTemplate || LEVEL_ORDER[level] > LEVEL_ORDER[Logger.getFileLevel() ?? Logger.getLevel()]) {
183
210
  return;
184
211
  }
185
212
  const line = `${formatted}\n`;
@@ -11,12 +11,15 @@ import {
11
11
  AbstractLogger,
12
12
  type Clock,
13
13
  DEFAULT_LOG_FILE_ENV,
14
+ DEFAULT_LOG_FILE_LEVEL_ENV,
14
15
  DEFAULT_LOG_LEVEL_ENV,
16
+ LEVEL_ORDER,
15
17
  Logger,
16
18
  type LogLevel,
17
19
  type LogThreshold,
18
20
  ObservableValue,
19
21
  type MaybeObservableValue,
22
+ describeErrorWithStack,
20
23
  parseLogLevel
21
24
  } from '@hydranium/protocol';
22
25
  import { type URI } from '@hydranium/langium';
@@ -79,9 +82,10 @@ export class LspLogger extends AbstractLogger implements Logger {
79
82
  options: LspLoggerOptions = {}
80
83
  ) {
81
84
  super(options.component);
82
- // Apply the framework env baselines (`HYDRANIUM_LOG_LEVEL` and
83
- // `HYDRANIUM_LOG_FILE`) exactly once, on the first logger construction,
84
- // before any setting is read. Unconditional and process-global, so it
85
+ // Apply the framework env baselines (`HYDRANIUM_LOG_LEVEL`,
86
+ // `HYDRANIUM_LOG_FILE` and `HYDRANIUM_LOG_FILE_LEVEL`) exactly once, on
87
+ // the first logger construction, before any setting is read.
88
+ // Unconditional and process-global, so it
85
89
  // needs no root detection and is never re-applied by derived children —
86
90
  // which would otherwise clobber a live setting. These are the single env
87
91
  // vars for level / file-tee (an adopter brands them by renaming the
@@ -92,13 +96,20 @@ export class LspLogger extends AbstractLogger implements Logger {
92
96
  // a Node concern; skip it cleanly there.
93
97
  const env = processEnv();
94
98
  if (env) {
95
- const envLevel = parseLogLevel(env[DEFAULT_LOG_LEVEL_ENV]);
96
- if (envLevel) {
97
- Logger.setLevel(envLevel);
98
- }
99
+ // The file-tee target FIRST: the other order writes the level
100
+ // announcement before the sink exists, losing the one line that says
101
+ // which threshold the rest of the file was written at.
99
102
  const envLogFile = env[DEFAULT_LOG_FILE_ENV];
100
103
  if (envLogFile) {
101
- setLogFilePath(envLogFile);
104
+ const fileLevel = parseLogLevel(env[DEFAULT_LOG_FILE_LEVEL_ENV]);
105
+ setLogFilePath(envLogFile, fileLevel);
106
+ if (fileLevel) {
107
+ this.logAt(fileLevel, `Log file level ${fileLevel} (${DEFAULT_LOG_FILE_LEVEL_ENV})`);
108
+ }
109
+ }
110
+ const envLevel = parseLogLevel(env[DEFAULT_LOG_LEVEL_ENV]);
111
+ if (envLevel) {
112
+ this.applyLevel(envLevel, DEFAULT_LOG_LEVEL_ENV);
102
113
  }
103
114
  }
104
115
  }
@@ -109,16 +120,48 @@ export class LspLogger extends AbstractLogger implements Logger {
109
120
  if (options.logThreshold !== undefined) {
110
121
  const level = ObservableValue.from(options.logThreshold);
111
122
  if (level.value) {
112
- Logger.setLevel(level.value);
123
+ this.applyLevel(level.value, 'setting');
113
124
  }
114
125
  level.onChange(next => {
115
126
  if (next) {
116
- Logger.setLevel(next);
127
+ this.applyLevel(next, 'setting');
117
128
  }
118
129
  });
119
130
  }
120
131
  }
121
132
 
133
+ /**
134
+ * Set the process-wide threshold and announce the transition under whichever
135
+ * of the two thresholds can carry the notice, so a reader sees every change
136
+ * and its absence means the threshold never moved.
137
+ *
138
+ * `error` and `off` admit no notice of their own — `off` nothing at all, and
139
+ * an error-severity line is read as a fault, which a client that marks its
140
+ * log as having seen an error keeps for the session. Entering either is
141
+ * therefore announced BEFORE the switch, under the outgoing threshold; every
142
+ * other change is announced after it, at the level being entered. Leaving
143
+ * `error` or `off` for one of those two says nothing, both thresholds being
144
+ * unable to carry it.
145
+ *
146
+ * Only on a real transition: the bound setting re-fires for configuration
147
+ * changes that leave the value alone.
148
+ */
149
+ protected applyLevel(next: LogThreshold, source: string): void {
150
+ const previous = Logger.getLevel();
151
+ if (previous === next) {
152
+ return;
153
+ }
154
+ const message = `Log level ${previous} → ${next} (${source})`;
155
+ const announceFirst = next === 'error' || next === 'off';
156
+ if (announceFirst && previous !== 'error') {
157
+ this.logAt(previous, message);
158
+ }
159
+ Logger.setLevel(next);
160
+ if (!announceFirst) {
161
+ this.logAt(next, message);
162
+ }
163
+ }
164
+
122
165
  /**
123
166
  * Route logger timing and timestamps through the injected framework
124
167
  * {@link Clock} (the dedicated `shared.Clock` slot) so server-side log time
@@ -145,9 +188,7 @@ export class LspLogger extends AbstractLogger implements Logger {
145
188
  }
146
189
 
147
190
  protected emit(level: LogLevel, label: string, message: string, args: readonly unknown[]): void {
148
- const component = this.component ? ` [${this.component}]` : '';
149
- // Pad to the widest label (5 chars — 'Error'/'Debug'/'Trace') so timestamps line up.
150
- const prefix = `[${label.padEnd(5)} - ${this.timestamp()}]${component}`;
191
+ const prefix = this.formatLinePrefix(label);
151
192
  const combined = args.length === 0 ? message : `${message} ${args.map(formatLogArg).join(' ')}`;
152
193
  const formatted = `${prefix} ${combined}`;
153
194
  const connection = this.services.lsp.Connection;
@@ -165,7 +206,11 @@ export class LspLogger extends AbstractLogger implements Logger {
165
206
  // shutdown diagnostics and the workspace manager's own
166
207
  // unhandled-rejection handler. A log sink that throws turns a diagnostic
167
208
  // into a crash, so a dead channel degrades to stderr instead.
168
- if (!connection || !sendViaConnection(connection, level, formatted)) {
209
+ //
210
+ // `send` admits a line either threshold takes, so the client sink checks
211
+ // its own; the file-tee filters for itself.
212
+ const toClient = LEVEL_ORDER[level] <= LEVEL_ORDER[Logger.getLevel()];
213
+ if (toClient && (!connection || !sendViaConnection(connection, level, formatted))) {
169
214
  if (!writeStderr(`${formatted}\n`)) {
170
215
  // Browser only. In Node every level goes to STDERR, including the
171
216
  // three that `console.*` would put on stdout (`info` / `debug` /
@@ -180,7 +225,7 @@ export class LspLogger extends AbstractLogger implements Logger {
180
225
  }
181
226
  // File-tee fan-out for headless capture (see `setLogFilePath`). Always runs
182
227
  // in addition to the LSP/console sink — log sinks fan out, they don't replace.
183
- teeLogLine(formatted);
228
+ teeLogLine(level, formatted);
184
229
  }
185
230
 
186
231
  protected derive(component: string): this {
@@ -264,7 +309,7 @@ function formatLogArg(value: unknown): string {
264
309
  return value;
265
310
  }
266
311
  if (value instanceof Error) {
267
- return value.stack ?? value.message;
312
+ return describeErrorWithStack(value);
268
313
  }
269
314
  if (typeof value === 'object') {
270
315
  try {
@@ -10,35 +10,11 @@
10
10
  import { type LangiumDocument, DocumentState } from '@hydranium/langium';
11
11
  import { type CancellationToken } from 'vscode-languageserver';
12
12
  import { IntegrityPhase } from '../integrity/integrity-rule.js';
13
- import { groupDocumentsByLanguage } from '../build-phase-pass/build-phase-pass.js';
13
+ import { AstExtensionPhase } from '../ast-extension/ast-extension-service.js';
14
+ import { BuildPassPhase, groupDocumentsByLanguage } from '../build-phase-pass/build-phase-pass.js';
14
15
  import { type ServerSharedServices } from '../module.js';
15
16
  import { labelPhaseListener } from './labeled-phase-listener.js';
16
17
 
17
- /**
18
- * AST extension wiring covers every "useful" `DocumentState` an extension can
19
- * target. `Changed` has no AST yet; `IndexedContent` carries the same
20
- * per-document information as `Parsed`. No-op fires for documents with no
21
- * extension at a given state are negligible (`notifyDocumentPhase` is a plain
22
- * listener loop), so the framework wires the full set unconditionally rather
23
- * than collecting declared states from per-language registrations.
24
- */
25
- const AST_EXTENSION_PHASES: readonly DocumentState[] = [
26
- DocumentState.Parsed,
27
- DocumentState.ComputedScopes,
28
- DocumentState.Linked,
29
- DocumentState.IndexedReferences,
30
- DocumentState.Validated
31
- ];
32
-
33
- /**
34
- * Build phases at which the `BuildPhasePassService` is driven. Same useful
35
- * set as {@link AST_EXTENSION_PHASES}: a pass registered at any other state
36
- * never fires (the listener is not wired), mirroring the AST-extension contract.
37
- * `runPasses` no-ops at a phase with no registered pass, so wiring the full set
38
- * unconditionally costs only an empty-bucket check per phase.
39
- */
40
- const BUILD_PHASE_PASS_STATES: readonly DocumentState[] = AST_EXTENSION_PHASES;
41
-
42
18
  /**
43
19
  * Default priority of the framework integrity passes. Integrity mutates / cleans
44
20
  * the AST that every derived-state pass reads, so it is *foundational* and must
@@ -65,6 +41,19 @@ export interface BuildPipelineIntegrationOptions {
65
41
  readonly integrityPriority?: number;
66
42
  }
67
43
 
44
+ /**
45
+ * The build-pipeline slot. Empty because nothing calls this service — it wires
46
+ * itself in its constructor and every seam it offers is `protected`.
47
+ *
48
+ * Typing the slot by the class instead would stop an adopter's subclass
49
+ * satisfying it, since a class carries its `protected` members into the check
50
+ * and they compare by declaration rather than by shape. The cost of the empty
51
+ * shape is that any non-null value satisfies it, so a mis-bound slot compiles
52
+ * and the framework's phase listeners are then never attached.
53
+ */
54
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- the slot has no public member to name
55
+ export interface BuildPipelineIntegration {}
56
+
68
57
  /**
69
58
  * Wires the framework's build-time features (integrity rules, AST
70
59
  * enrichment) into Langium's document-build pipeline. The single shared
@@ -90,7 +79,7 @@ export interface BuildPipelineIntegrationOptions {
90
79
  * Eagerly constructed (via `DEFAULT_EAGER_SERVICES`) so the listeners are
91
80
  * attached before the first build cycle.
92
81
  */
93
- export class BuildPipelineIntegration {
82
+ export class DefaultBuildPipelineIntegration implements BuildPipelineIntegration {
94
83
  constructor(
95
84
  protected readonly services: ServerSharedServices,
96
85
  options: BuildPipelineIntegrationOptions = {}
@@ -108,17 +97,19 @@ export class BuildPipelineIntegration {
108
97
  for (const phase of IntegrityPhase.all()) {
109
98
  passes.register({
110
99
  id: `framework:integrity:${IntegrityPhase.toString(phase).toLowerCase()}`,
111
- state: phase,
100
+ phase,
112
101
  priority: integrityPriority,
113
102
  run: (documents, cancelToken) => this.callIntegrity(documents, phase, cancelToken)
114
103
  });
115
104
  }
116
105
 
117
- // One onBuildPhase listener per pass state, routed through the overridable
106
+ // One onBuildPhase listener per pass phase, routed through the overridable
118
107
  // `runBuildPhase` seam → priority-ordered, sequential, cancel-aware pass
119
108
  // dispatch. The returned promise is awaited by the build pipeline, so a
120
- // mutating pass (integrity) reparses before the build advances.
121
- for (const phase of BUILD_PHASE_PASS_STATES) {
109
+ // mutating pass (integrity) reparses before the build advances. The full
110
+ // set is wired unconditionally: `runPasses` no-ops at a phase with no
111
+ // pass, so an unused listener costs one empty-bucket check.
112
+ for (const phase of BuildPassPhase.all()) {
122
113
  builder.onBuildPhase(
123
114
  phase,
124
115
  labelPhaseListener(
@@ -128,11 +119,21 @@ export class BuildPipelineIntegration {
128
119
  );
129
120
  }
130
121
 
122
+ // Per DOCUMENT as well: `reparseAndRelink` re-indexes one document from
123
+ // inside the `Linked` phase and fires no build-phase notification, so a
124
+ // batch-level listener cannot see the AST it replaced.
125
+ builder.onDocumentPhase(
126
+ DocumentState.IndexedContent,
127
+ labelPhaseListener(() => this.clearScopeCaches(), 'BuildPipeline.clearScopeCaches')
128
+ );
129
+
131
130
  // AST enrichment stays per-document (onDocumentPhase) and node-granular —
132
131
  // unchanged by the build-phase-pass registry, which is batch-granular. The
133
132
  // listener calls the `extendAst` seam directly (the document-phase analog of
134
133
  // `runBuildPhase`); there is no per-phase handler tier — one parameterized seam.
135
- for (const phase of AST_EXTENSION_PHASES) {
134
+ // Wired for every phase unconditionally rather than for the phases the
135
+ // per-language registrations declare: a no-op fire is a plain listener loop.
136
+ for (const phase of AstExtensionPhase.all()) {
136
137
  builder.onDocumentPhase(
137
138
  phase,
138
139
  labelPhaseListener(
@@ -174,6 +175,19 @@ export class BuildPipelineIntegration {
174
175
  }
175
176
  }
176
177
 
178
+ /**
179
+ * Drop the cached scopes of every REGISTERED language, not of those owning a
180
+ * document in the batch. The index a scope is built from is
181
+ * workspace-global, so narrowing to the batch with
182
+ * {@link groupDocumentsByLanguage}, the way {@link callIntegrity} does,
183
+ * leaves a cross-grammar reference resolving against a mid-rebuild scope.
184
+ */
185
+ protected clearScopeCaches(): void {
186
+ for (const languageServices of this.services.ServiceRegistry.all) {
187
+ languageServices.references.ScopeProvider.clearScopeCaches();
188
+ }
189
+ }
190
+
177
191
  /** Run AST enrichment for a single document at `phase` via its language service. */
178
192
  protected extendAst(document: LangiumDocument, phase: DocumentState, cancelToken: CancellationToken): void {
179
193
  this.services.ServiceRegistry.getServices(document.uri).ast.AstExtensionService.extendDocument(document, phase, cancelToken);
@@ -8,6 +8,7 @@
8
8
  ********************************************************************************/
9
9
 
10
10
  import { type URI } from '@hydranium/langium';
11
+ import { type Stopwatch } from '@hydranium/protocol';
11
12
 
12
13
  /** What a build is about, handed to `HydraniumDocumentBuilder.createBuildSession`. */
13
14
  export interface BuildSessionContext {
@@ -59,14 +60,14 @@ export class BuildSession {
59
60
  traceId?: number;
60
61
  /** Set when the build ended in `OperationCancelled`, so the successor can tag itself "cancels #N". */
61
62
  cancelled = false;
62
- /** Phase-reached lines produced so far; the first one measures from {@link startMs} rather than from the previous phase. */
63
+ /** Phase-reached lines produced so far; the first one measures from {@link sinceStart} rather than from the previous phase. */
63
64
  phasesLogged = 0;
64
65
  /** Lines held back by {@link detailThresholdMs}; flushed or dropped when the build ends. */
65
66
  readonly bufferedLines: string[] = [];
66
67
 
67
68
  constructor(
68
- /** Millisecond timestamp the build started at, on the same clock as `performance.now()`. */
69
- readonly startMs: number,
69
+ /** Running since the build started. */
70
+ readonly sinceStart: Stopwatch,
70
71
  /** What caused this build — a formatted URI, a count summary, or an adopter label. */
71
72
  readonly trigger: string,
72
73
  /** True when {@link trigger} already states the document count, so a phase line must not repeat it. */