@hydranium/core 1.0.0-next.24 → 1.0.0-next.241

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 (649) hide show
  1. package/README.md +22 -17
  2. package/lib/documents/ast-document-manager.d.ts +219 -122
  3. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  4. package/lib/documents/ast-document-manager.js +241 -130
  5. package/lib/documents/ast-document-manager.js.map +1 -1
  6. package/lib/documents/client-ids.d.ts +5 -19
  7. package/lib/documents/client-ids.d.ts.map +1 -1
  8. package/lib/documents/client-ids.js +5 -19
  9. package/lib/documents/client-ids.js.map +1 -1
  10. package/lib/documents/client-session-errors.d.ts +15 -0
  11. package/lib/documents/client-session-errors.d.ts.map +1 -0
  12. package/lib/documents/client-session-errors.js +15 -0
  13. package/lib/documents/client-session-errors.js.map +1 -0
  14. package/lib/documents/client-session-registry.d.ts +146 -0
  15. package/lib/documents/client-session-registry.d.ts.map +1 -0
  16. package/lib/documents/client-session-registry.js +207 -0
  17. package/lib/documents/client-session-registry.js.map +1 -0
  18. package/lib/documents/dirty-state-tracker.d.ts +79 -0
  19. package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
  20. package/lib/documents/dirty-state-tracker.js +69 -0
  21. package/lib/documents/dirty-state-tracker.js.map +1 -0
  22. package/lib/documents/document-release-handler.d.ts +179 -0
  23. package/lib/documents/document-release-handler.d.ts.map +1 -0
  24. package/lib/documents/document-release-handler.js +283 -0
  25. package/lib/documents/document-release-handler.js.map +1 -0
  26. package/lib/documents/document-release-scheduler.d.ts +67 -0
  27. package/lib/documents/document-release-scheduler.d.ts.map +1 -0
  28. package/lib/documents/document-release-scheduler.js +80 -0
  29. package/lib/documents/document-release-scheduler.js.map +1 -0
  30. package/lib/documents/file-system-task-queue.d.ts +49 -0
  31. package/lib/documents/file-system-task-queue.d.ts.map +1 -0
  32. package/lib/documents/file-system-task-queue.js +34 -0
  33. package/lib/documents/file-system-task-queue.js.map +1 -0
  34. package/lib/documents/hydranium-text-documents.d.ts +399 -282
  35. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  36. package/lib/documents/hydranium-text-documents.js +816 -483
  37. package/lib/documents/hydranium-text-documents.js.map +1 -1
  38. package/lib/documents/index.d.ts +10 -2
  39. package/lib/documents/index.d.ts.map +1 -1
  40. package/lib/documents/index.js +10 -2
  41. package/lib/documents/index.js.map +1 -1
  42. package/lib/documents/language-client-shadow.d.ts +218 -0
  43. package/lib/documents/language-client-shadow.d.ts.map +1 -0
  44. package/lib/documents/language-client-shadow.js +283 -0
  45. package/lib/documents/language-client-shadow.js.map +1 -0
  46. package/lib/documents/model-ledger.d.ts +47 -0
  47. package/lib/documents/model-ledger.d.ts.map +1 -0
  48. package/lib/documents/model-ledger.js +30 -0
  49. package/lib/documents/model-ledger.js.map +1 -0
  50. package/lib/documents/text-ledger.d.ts +64 -0
  51. package/lib/documents/text-ledger.d.ts.map +1 -0
  52. package/lib/documents/text-ledger.js +63 -0
  53. package/lib/documents/text-ledger.js.map +1 -0
  54. package/lib/documents/version-sync-service.d.ts +134 -0
  55. package/lib/documents/version-sync-service.d.ts.map +1 -0
  56. package/lib/documents/version-sync-service.js +171 -0
  57. package/lib/documents/version-sync-service.js.map +1 -0
  58. package/lib/index.d.ts +5 -0
  59. package/lib/index.d.ts.map +1 -1
  60. package/lib/index.js +8 -0
  61. package/lib/index.js.map +1 -1
  62. package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
  63. package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
  64. package/lib/langium/ast-extension/ast-node-builder.d.ts +32 -9
  65. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  66. package/lib/langium/ast-extension/ast-node-builder.js +60 -22
  67. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  68. package/lib/langium/bootstrap.d.ts +23 -16
  69. package/lib/langium/bootstrap.d.ts.map +1 -1
  70. package/lib/langium/bootstrap.js +66 -28
  71. package/lib/langium/bootstrap.js.map +1 -1
  72. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
  73. package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
  74. package/lib/langium/composite-ast-reflection.d.ts +46 -0
  75. package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
  76. package/lib/langium/composite-ast-reflection.js +97 -0
  77. package/lib/langium/composite-ast-reflection.js.map +1 -0
  78. package/lib/langium/config/configuration-provider.d.ts +81 -0
  79. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  80. package/lib/langium/config/configuration-provider.js +112 -0
  81. package/lib/langium/config/configuration-provider.js.map +1 -0
  82. package/lib/langium/config/index.d.ts +1 -0
  83. package/lib/langium/config/index.d.ts.map +1 -1
  84. package/lib/langium/config/index.js +1 -0
  85. package/lib/langium/config/index.js.map +1 -1
  86. package/lib/langium/config/settings.js.map +1 -1
  87. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
  88. package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
  89. package/lib/langium/diagnostics/logger.d.ts +10 -3
  90. package/lib/langium/diagnostics/logger.d.ts.map +1 -1
  91. package/lib/langium/diagnostics/logger.js +12 -5
  92. package/lib/langium/diagnostics/logger.js.map +1 -1
  93. package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
  94. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  95. package/lib/langium/diagnostics/lsp-logger.js +57 -16
  96. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  97. package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
  98. package/lib/langium/diagnostics/server-tracer.js.map +1 -1
  99. package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
  100. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  101. package/lib/langium/document-builder/build-pipeline-integration.js +32 -5
  102. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  103. package/lib/langium/document-builder/build-session.d.ts.map +1 -1
  104. package/lib/langium/document-builder/build-session.js.map +1 -1
  105. package/lib/langium/document-builder/document-builder.d.ts +294 -33
  106. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  107. package/lib/langium/document-builder/document-builder.js +477 -61
  108. package/lib/langium/document-builder/document-builder.js.map +1 -1
  109. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  110. package/lib/langium/documentation/comment-provider.js.map +1 -1
  111. package/lib/langium/integration-services.d.ts +61 -19
  112. package/lib/langium/integration-services.d.ts.map +1 -1
  113. package/lib/langium/integration-services.js +10 -5
  114. package/lib/langium/integration-services.js.map +1 -1
  115. package/lib/langium/integrity/integrity-rule.d.ts +16 -8
  116. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  117. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  118. package/lib/langium/integrity/integrity-service.d.ts +81 -24
  119. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  120. package/lib/langium/integrity/integrity-service.js +264 -57
  121. package/lib/langium/integrity/integrity-service.js.map +1 -1
  122. package/lib/langium/keys/containment.d.ts +64 -0
  123. package/lib/langium/keys/containment.d.ts.map +1 -0
  124. package/lib/langium/keys/containment.js +53 -0
  125. package/lib/langium/keys/containment.js.map +1 -0
  126. package/lib/langium/keys/index.d.ts +1 -0
  127. package/lib/langium/keys/index.d.ts.map +1 -1
  128. package/lib/langium/keys/index.js +1 -0
  129. package/lib/langium/keys/index.js.map +1 -1
  130. package/lib/langium/keys/name-based-key-provider.d.ts +4 -0
  131. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  132. package/lib/langium/keys/name-based-key-provider.js +4 -0
  133. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  134. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  135. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  136. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  137. package/lib/langium/labeling/label-provider.js.map +1 -1
  138. package/lib/langium/language-module.d.ts +29 -4
  139. package/lib/langium/language-module.d.ts.map +1 -1
  140. package/lib/langium/language-module.js +18 -4
  141. package/lib/langium/language-module.js.map +1 -1
  142. package/lib/langium/model-service/client-session.d.ts +343 -0
  143. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  144. package/lib/langium/model-service/client-session.js +411 -0
  145. package/lib/langium/model-service/client-session.js.map +1 -0
  146. package/lib/langium/model-service/index.d.ts +2 -0
  147. package/lib/langium/model-service/index.d.ts.map +1 -1
  148. package/lib/langium/model-service/index.js +2 -0
  149. package/lib/langium/model-service/index.js.map +1 -1
  150. package/lib/langium/model-service/model-events.d.ts +61 -0
  151. package/lib/langium/model-service/model-events.d.ts.map +1 -0
  152. package/lib/langium/model-service/model-events.js +10 -0
  153. package/lib/langium/model-service/model-events.js.map +1 -0
  154. package/lib/langium/model-service/model-service.d.ts +432 -282
  155. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  156. package/lib/langium/model-service/model-service.js +504 -438
  157. package/lib/langium/model-service/model-service.js.map +1 -1
  158. package/lib/langium/module.d.ts +150 -35
  159. package/lib/langium/module.d.ts.map +1 -1
  160. package/lib/langium/module.js +47 -35
  161. package/lib/langium/module.js.map +1 -1
  162. package/lib/langium/naming/name-provider.d.ts +25 -4
  163. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  164. package/lib/langium/naming/name-provider.js +2 -1
  165. package/lib/langium/naming/name-provider.js.map +1 -1
  166. package/lib/langium/naming/name-separator-validation.d.ts +23 -0
  167. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  168. package/lib/langium/naming/name-separator-validation.js +30 -1
  169. package/lib/langium/naming/name-separator-validation.js.map +1 -1
  170. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  171. package/lib/langium/project/abstract-project-manager.js +9 -2
  172. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  173. package/lib/langium/project/project-change-event.d.ts +2 -2
  174. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  175. package/lib/langium/project/single-project-manager.js.map +1 -1
  176. package/lib/langium/residency/cst-residency-service.d.ts +30 -10
  177. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  178. package/lib/langium/residency/cst-residency-service.js +23 -57
  179. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  180. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  181. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  182. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  183. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  184. package/lib/langium/scope/hydranium-scope-provider.d.ts +48 -13
  185. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  186. package/lib/langium/scope/hydranium-scope-provider.js +56 -20
  187. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  188. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  189. package/lib/langium/scope/reference-builder.js.map +1 -1
  190. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  191. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  192. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  193. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  194. package/lib/langium/serialization/abstract-serializer.d.ts +11 -20
  195. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  196. package/lib/langium/serialization/abstract-serializer.js +12 -21
  197. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  198. package/lib/langium/serialization/json-serializer.d.ts +1 -1
  199. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  200. package/lib/langium/serialization/json-serializer.js.map +1 -1
  201. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  202. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  203. package/lib/langium/service-registry.d.ts +29 -1
  204. package/lib/langium/service-registry.d.ts.map +1 -1
  205. package/lib/langium/service-registry.js +37 -0
  206. package/lib/langium/service-registry.js.map +1 -1
  207. package/lib/langium/shared-services.d.ts +21 -6
  208. package/lib/langium/shared-services.d.ts.map +1 -1
  209. package/lib/langium/shared-services.js.map +1 -1
  210. package/lib/langium/single-langium-copy.d.ts +22 -0
  211. package/lib/langium/single-langium-copy.d.ts.map +1 -0
  212. package/lib/langium/single-langium-copy.js +36 -0
  213. package/lib/langium/single-langium-copy.js.map +1 -0
  214. package/lib/langium/transfer/transfer-encoder.d.ts +77 -26
  215. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  216. package/lib/langium/transfer/transfer-encoder.js +46 -24
  217. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  218. package/lib/langium/trivia/comment-preserver.d.ts +423 -0
  219. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  220. package/lib/langium/trivia/comment-preserver.js +906 -0
  221. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  222. package/lib/langium/trivia/document-ending-preserver.d.ts +43 -0
  223. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  224. package/lib/langium/trivia/document-ending-preserver.js +48 -0
  225. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  226. package/lib/langium/trivia/index.d.ts +14 -0
  227. package/lib/langium/trivia/index.d.ts.map +1 -0
  228. package/lib/langium/trivia/index.js +14 -0
  229. package/lib/langium/trivia/index.js.map +1 -0
  230. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  231. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  232. package/lib/langium/trivia/trivia-contribution.js +10 -0
  233. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  234. package/lib/langium/trivia/trivia-preserver.d.ts +50 -0
  235. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  236. package/lib/langium/trivia/trivia-preserver.js +10 -0
  237. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  238. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  239. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  240. package/lib/langium/trivia/trivia-service.js +56 -0
  241. package/lib/langium/trivia/trivia-service.js.map +1 -0
  242. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  243. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  244. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  245. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  246. package/lib/langium/validation/document-validator.d.ts +280 -9
  247. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  248. package/lib/langium/validation/document-validator.js +448 -5
  249. package/lib/langium/validation/document-validator.js.map +1 -1
  250. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  251. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  252. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  253. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  254. package/lib/langium/workspace/document-uri-policy.d.ts +15 -10
  255. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  256. package/lib/langium/workspace/document-uri-policy.js +7 -5
  257. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  258. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  259. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  260. package/lib/langium/workspace/file-not-found.js +31 -0
  261. package/lib/langium/workspace/file-not-found.js.map +1 -0
  262. package/lib/langium/workspace/file-system-provider.d.ts +135 -9
  263. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  264. package/lib/langium/workspace/file-system-provider.js +93 -14
  265. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  266. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +56 -1
  267. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  268. package/lib/langium/workspace/hydranium-langium-document-factory.js +79 -0
  269. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  270. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
  271. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  272. package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
  273. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  274. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +82 -9
  275. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  276. package/lib/langium/workspace/hydranium-workspace-manager.js +128 -10
  277. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  278. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -3
  279. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  280. package/lib/langium/workspace/in-memory-file-system-provider.js +41 -15
  281. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  282. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  283. package/lib/langium/workspace/index-manager.js.map +1 -1
  284. package/lib/langium/workspace/index.d.ts +1 -0
  285. package/lib/langium/workspace/index.d.ts.map +1 -1
  286. package/lib/langium/workspace/index.js +1 -0
  287. package/lib/langium/workspace/index.js.map +1 -1
  288. package/lib/langium/workspace/initialize-workspace.d.ts +31 -2
  289. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  290. package/lib/langium/workspace/initialize-workspace.js +13 -5
  291. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  292. package/lib/langium/workspace/langium-documents.d.ts +46 -4
  293. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  294. package/lib/langium/workspace/langium-documents.js +60 -5
  295. package/lib/langium/workspace/langium-documents.js.map +1 -1
  296. package/lib/langium/workspace/persistent-file-system-provider.d.ts +1 -8
  297. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  298. package/lib/langium/workspace/persistent-file-system-provider.js +0 -7
  299. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  300. package/lib/{documents → langium/workspace}/self-save-registry.d.ts +38 -7
  301. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  302. package/lib/{documents → langium/workspace}/self-save-registry.js +29 -16
  303. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  304. package/lib/langium/workspace/virtual-document.d.ts +48 -15
  305. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  306. package/lib/langium/workspace/virtual-document.js +78 -18
  307. package/lib/langium/workspace/virtual-document.js.map +1 -1
  308. package/lib/langium/workspace/write-lock-scope.d.ts +20 -10
  309. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  310. package/lib/langium/workspace/write-lock-scope.js +12 -4
  311. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  312. package/lib/locale/index.d.ts +10 -0
  313. package/lib/locale/index.d.ts.map +1 -0
  314. package/lib/locale/index.js +10 -0
  315. package/lib/locale/index.js.map +1 -0
  316. package/lib/locale/server-locale.d.ts +73 -0
  317. package/lib/locale/server-locale.d.ts.map +1 -0
  318. package/lib/locale/server-locale.js +61 -0
  319. package/lib/locale/server-locale.js.map +1 -0
  320. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  321. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  322. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  323. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  324. package/lib/lsp/connection-features.d.ts +23 -0
  325. package/lib/lsp/connection-features.d.ts.map +1 -0
  326. package/lib/lsp/connection-features.js +60 -0
  327. package/lib/lsp/connection-features.js.map +1 -0
  328. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  329. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  330. package/lib/lsp/diagnostics-connection.js +53 -0
  331. package/lib/lsp/diagnostics-connection.js.map +1 -0
  332. package/lib/lsp/hydranium-document-update-handler.d.ts +92 -81
  333. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  334. package/lib/lsp/hydranium-document-update-handler.js +153 -99
  335. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  336. package/lib/lsp/index.d.ts +3 -1
  337. package/lib/lsp/index.d.ts.map +1 -1
  338. package/lib/lsp/index.js +3 -1
  339. package/lib/lsp/index.js.map +1 -1
  340. package/lib/lsp/lsp-latency.d.ts +39 -0
  341. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  342. package/lib/lsp/lsp-latency.js +58 -0
  343. package/lib/lsp/lsp-latency.js.map +1 -0
  344. package/lib/lsp/semantic-token-provider.d.ts +34 -1
  345. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  346. package/lib/lsp/semantic-token-provider.js +55 -8
  347. package/lib/lsp/semantic-token-provider.js.map +1 -1
  348. package/lib/lsp/shared-module.d.ts +4 -8
  349. package/lib/lsp/shared-module.d.ts.map +1 -1
  350. package/lib/lsp/shared-module.js.map +1 -1
  351. package/lib/lsp/start-language-server.d.ts +8 -7
  352. package/lib/lsp/start-language-server.d.ts.map +1 -1
  353. package/lib/lsp/start-language-server.js +13 -7
  354. package/lib/lsp/start-language-server.js.map +1 -1
  355. package/lib/messages/carriers.d.ts +54 -0
  356. package/lib/messages/carriers.d.ts.map +1 -0
  357. package/lib/messages/carriers.js +62 -0
  358. package/lib/messages/carriers.js.map +1 -0
  359. package/lib/messages/index.d.ts +25 -0
  360. package/lib/messages/index.d.ts.map +1 -0
  361. package/lib/messages/index.js +25 -0
  362. package/lib/messages/index.js.map +1 -0
  363. package/lib/messages/renderer.d.ts +142 -0
  364. package/lib/messages/renderer.d.ts.map +1 -0
  365. package/lib/messages/renderer.js +165 -0
  366. package/lib/messages/renderer.js.map +1 -0
  367. package/lib/node/event-loop-monitor.js.map +1 -1
  368. package/lib/node/heap-ceiling.d.ts +61 -0
  369. package/lib/node/heap-ceiling.d.ts.map +1 -0
  370. package/lib/node/heap-ceiling.js +72 -0
  371. package/lib/node/heap-ceiling.js.map +1 -0
  372. package/lib/node/index.d.ts +1 -1
  373. package/lib/node/index.d.ts.map +1 -1
  374. package/lib/node/index.js +1 -1
  375. package/lib/node/index.js.map +1 -1
  376. package/lib/node/latency-from-env.d.ts +1 -1
  377. package/lib/node/latency-from-env.js +1 -1
  378. package/lib/node/lint-grammar.js.map +1 -1
  379. package/lib/node/measure-memory.d.ts.map +1 -1
  380. package/lib/node/measure-memory.js +1 -0
  381. package/lib/node/measure-memory.js.map +1 -1
  382. package/lib/node/memory-monitor.js.map +1 -1
  383. package/lib/node/node-file-system-provider.d.ts +41 -6
  384. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  385. package/lib/node/node-file-system-provider.js +109 -49
  386. package/lib/node/node-file-system-provider.js.map +1 -1
  387. package/lib/node/profile-capture.d.ts +8 -2
  388. package/lib/node/profile-capture.d.ts.map +1 -1
  389. package/lib/node/profile-capture.js +1 -1
  390. package/lib/node/profile-capture.js.map +1 -1
  391. package/lib/node/profile-digest.js.map +1 -1
  392. package/lib/node/profiling-run.d.ts +13 -3
  393. package/lib/node/profiling-run.d.ts.map +1 -1
  394. package/lib/node/profiling-run.js +17 -8
  395. package/lib/node/profiling-run.js.map +1 -1
  396. package/lib/node/rename-over-open-readers.d.ts +52 -0
  397. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  398. package/lib/node/rename-over-open-readers.js +66 -0
  399. package/lib/node/rename-over-open-readers.js.map +1 -0
  400. package/lib/node/socket-launcher.d.ts +20 -4
  401. package/lib/node/socket-launcher.d.ts.map +1 -1
  402. package/lib/node/socket-launcher.js +5 -4
  403. package/lib/node/socket-launcher.js.map +1 -1
  404. package/lib/node/stdio-launcher.d.ts +6 -5
  405. package/lib/node/stdio-launcher.d.ts.map +1 -1
  406. package/lib/node/stdio-launcher.js +2 -2
  407. package/lib/node/stdio-launcher.js.map +1 -1
  408. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  409. package/lib/testing/fake-description.js.map +1 -1
  410. package/lib/testing/fake-document.d.ts +16 -4
  411. package/lib/testing/fake-document.d.ts.map +1 -1
  412. package/lib/testing/fake-document.js +18 -3
  413. package/lib/testing/fake-document.js.map +1 -1
  414. package/lib/testing/index.d.ts +1 -1
  415. package/lib/testing/index.d.ts.map +1 -1
  416. package/lib/testing/index.js +2 -1
  417. package/lib/testing/index.js.map +1 -1
  418. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  419. package/lib/testing/langium-test-helpers.js +1 -0
  420. package/lib/testing/langium-test-helpers.js.map +1 -1
  421. package/lib/testing/make-noop-language-services.js.map +1 -1
  422. package/lib/testing/make-noop-shared-services.d.ts +14 -0
  423. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  424. package/lib/testing/make-noop-shared-services.js +28 -2
  425. package/lib/testing/make-noop-shared-services.js.map +1 -1
  426. package/lib/testing/make-test-services.d.ts +72 -14
  427. package/lib/testing/make-test-services.d.ts.map +1 -1
  428. package/lib/testing/make-test-services.js +42 -10
  429. package/lib/testing/make-test-services.js.map +1 -1
  430. package/lib/testing/make-test-tracer.d.ts +12 -0
  431. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  432. package/lib/testing/make-test-tracer.js +13 -0
  433. package/lib/testing/make-test-tracer.js.map +1 -1
  434. package/lib/testing/node/golden-corpus.js.map +1 -1
  435. package/lib/testing/node/index.d.ts +1 -0
  436. package/lib/testing/node/index.d.ts.map +1 -1
  437. package/lib/testing/node/index.js +1 -0
  438. package/lib/testing/node/index.js.map +1 -1
  439. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  440. package/lib/testing/node/lsp-harness.js +2 -0
  441. package/lib/testing/node/lsp-harness.js.map +1 -1
  442. package/lib/testing/node/lsp-server-connection.d.ts +11 -3
  443. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  444. package/lib/testing/node/lsp-server-connection.js +43 -10
  445. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  446. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  447. package/lib/testing/node/scratch-workspace.js +10 -5
  448. package/lib/testing/node/scratch-workspace.js.map +1 -1
  449. package/lib/testing/node/spawned-server.d.ts +14 -0
  450. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  451. package/lib/testing/node/spawned-server.js +34 -2
  452. package/lib/testing/node/spawned-server.js.map +1 -1
  453. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  454. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  455. package/lib/testing/node/unhandled-rejections.js +32 -0
  456. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  457. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  458. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  459. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  460. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  461. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  462. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  463. package/lib/testing/playwright/index.d.ts +1 -0
  464. package/lib/testing/playwright/index.d.ts.map +1 -1
  465. package/lib/testing/playwright/index.js +1 -0
  466. package/lib/testing/playwright/index.js.map +1 -1
  467. package/lib/testing/playwright/server-log-capture.d.ts +24 -8
  468. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  469. package/lib/testing/playwright/server-log-capture.js +27 -6
  470. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  471. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  472. package/lib/testing/playwright/server-log-rename-reporter.js +10 -1
  473. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  474. package/lib/testing/run-update-pipeline.d.ts +4 -4
  475. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  476. package/lib/testing/stub-ast-document-manager.d.ts +11 -52
  477. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  478. package/lib/testing/stub-ast-document-manager.js +24 -65
  479. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  480. package/lib/testing/stub-document-builder.d.ts +26 -11
  481. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  482. package/lib/testing/stub-document-builder.js +78 -5
  483. package/lib/testing/stub-document-builder.js.map +1 -1
  484. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  485. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  486. package/lib/testing/stub-hydranium-text-documents.js +115 -16
  487. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  488. package/lib/testing/stub-index-manager.js.map +1 -1
  489. package/lib/testing/stub-langium-documents.d.ts +3 -2
  490. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  491. package/lib/testing/stub-langium-documents.js.map +1 -1
  492. package/lib/testing/stub-model-service.d.ts +7 -6
  493. package/lib/testing/stub-model-service.d.ts.map +1 -1
  494. package/lib/testing/stub-model-service.js +4 -4
  495. package/lib/testing/stub-model-service.js.map +1 -1
  496. package/lib/testing/stub-project-manager.js.map +1 -1
  497. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  498. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  499. package/lib/testing/stub-service-registry.d.ts +1 -1
  500. package/lib/testing/stub-service-registry.js.map +1 -1
  501. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  502. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  503. package/lib/util/connection-liveness.d.ts +7 -6
  504. package/lib/util/connection-liveness.d.ts.map +1 -1
  505. package/lib/util/connection-liveness.js +35 -14
  506. package/lib/util/connection-liveness.js.map +1 -1
  507. package/lib/util/environment.d.ts.map +1 -1
  508. package/lib/util/environment.js.map +1 -1
  509. package/lib/util/registry.d.ts.map +1 -1
  510. package/package.json +32 -48
  511. package/src/documents/ast-document-manager.ts +379 -231
  512. package/src/documents/client-ids.ts +5 -22
  513. package/src/documents/client-session-errors.ts +24 -0
  514. package/src/documents/client-session-registry.ts +262 -0
  515. package/src/documents/dirty-state-tracker.ts +130 -0
  516. package/src/documents/document-release-handler.ts +365 -0
  517. package/src/documents/document-release-scheduler.ts +121 -0
  518. package/src/documents/file-system-task-queue.ts +68 -0
  519. package/src/documents/hydranium-text-documents.ts +931 -595
  520. package/src/documents/index.ts +10 -2
  521. package/src/documents/language-client-shadow.ts +451 -0
  522. package/src/documents/model-ledger.ts +66 -0
  523. package/src/documents/text-ledger.ts +112 -0
  524. package/src/documents/version-sync-service.ts +267 -0
  525. package/src/index.ts +8 -0
  526. package/src/langium/ast-extension/ast-node-builder.ts +66 -22
  527. package/src/langium/bootstrap.ts +66 -28
  528. package/src/langium/composite-ast-reflection.ts +112 -0
  529. package/src/langium/config/configuration-provider.ts +119 -0
  530. package/src/langium/config/index.ts +1 -0
  531. package/src/langium/diagnostics/logger.ts +12 -5
  532. package/src/langium/diagnostics/lsp-logger.ts +59 -15
  533. package/src/langium/document-builder/build-pipeline-integration.ts +50 -5
  534. package/src/langium/document-builder/document-builder.ts +565 -59
  535. package/src/langium/integration-services.ts +83 -24
  536. package/src/langium/integrity/integrity-rule.ts +16 -8
  537. package/src/langium/integrity/integrity-service.ts +287 -62
  538. package/src/langium/keys/containment.ts +87 -0
  539. package/src/langium/keys/index.ts +1 -0
  540. package/src/langium/keys/name-based-key-provider.ts +4 -0
  541. package/src/langium/language-module.ts +48 -7
  542. package/src/langium/model-service/client-session.ts +644 -0
  543. package/src/langium/model-service/index.ts +2 -0
  544. package/src/langium/model-service/model-events.ts +75 -0
  545. package/src/langium/model-service/model-service.ts +790 -468
  546. package/src/langium/module.ts +199 -64
  547. package/src/langium/naming/name-provider.ts +27 -5
  548. package/src/langium/naming/name-separator-validation.ts +34 -5
  549. package/src/langium/project/abstract-project-manager.ts +9 -1
  550. package/src/langium/project/project-change-event.ts +2 -2
  551. package/src/langium/residency/cst-residency-service.ts +45 -14
  552. package/src/langium/scope/hydranium-scope-provider.ts +60 -22
  553. package/src/langium/serialization/abstract-serializer.ts +13 -32
  554. package/src/langium/service-registry.ts +41 -2
  555. package/src/langium/shared-services.ts +21 -6
  556. package/src/langium/single-langium-copy.ts +42 -0
  557. package/src/langium/transfer/transfer-encoder.ts +104 -37
  558. package/src/langium/trivia/comment-preserver.ts +1100 -0
  559. package/src/langium/trivia/document-ending-preserver.ts +55 -0
  560. package/src/langium/trivia/index.ts +14 -0
  561. package/src/langium/trivia/trivia-contribution.ts +39 -0
  562. package/src/langium/trivia/trivia-preserver.ts +54 -0
  563. package/src/langium/trivia/trivia-service.ts +99 -0
  564. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  565. package/src/langium/validation/document-validator.ts +523 -10
  566. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  567. package/src/langium/workspace/document-uri-policy.ts +15 -10
  568. package/src/langium/workspace/file-not-found.ts +35 -0
  569. package/src/langium/workspace/file-system-provider.ts +205 -17
  570. package/src/langium/workspace/hydranium-langium-document-factory.ts +117 -0
  571. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
  572. package/src/langium/workspace/hydranium-workspace-manager.ts +154 -14
  573. package/src/langium/workspace/in-memory-file-system-provider.ts +48 -17
  574. package/src/langium/workspace/index.ts +1 -0
  575. package/src/langium/workspace/initialize-workspace.ts +43 -5
  576. package/src/langium/workspace/langium-documents.ts +75 -6
  577. package/src/langium/workspace/persistent-file-system-provider.ts +1 -8
  578. package/src/{documents → langium/workspace}/self-save-registry.ts +54 -15
  579. package/src/langium/workspace/virtual-document.ts +96 -19
  580. package/src/langium/workspace/write-lock-scope.ts +24 -11
  581. package/src/locale/index.ts +10 -0
  582. package/src/locale/server-locale.ts +86 -0
  583. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  584. package/src/lsp/connection-features.ts +67 -0
  585. package/src/lsp/diagnostics-connection.ts +56 -0
  586. package/src/lsp/hydranium-document-update-handler.ts +187 -108
  587. package/src/lsp/index.ts +3 -1
  588. package/src/lsp/lsp-latency.ts +62 -0
  589. package/src/lsp/semantic-token-provider.ts +74 -7
  590. package/src/lsp/shared-module.ts +4 -8
  591. package/src/lsp/start-language-server.ts +13 -7
  592. package/src/messages/carriers.ts +78 -0
  593. package/src/messages/index.ts +36 -0
  594. package/src/messages/renderer.ts +212 -0
  595. package/src/node/heap-ceiling.ts +108 -0
  596. package/src/node/index.ts +1 -1
  597. package/src/node/latency-from-env.ts +1 -1
  598. package/src/node/measure-memory.ts +1 -0
  599. package/src/node/node-file-system-provider.ts +124 -53
  600. package/src/node/profile-capture.ts +9 -3
  601. package/src/node/profiling-run.ts +30 -8
  602. package/src/node/rename-over-open-readers.ts +78 -0
  603. package/src/node/socket-launcher.ts +24 -8
  604. package/src/node/stdio-launcher.ts +8 -7
  605. package/src/testing/fake-document.ts +24 -5
  606. package/src/testing/index.ts +2 -1
  607. package/src/testing/langium-test-helpers.ts +1 -0
  608. package/src/testing/make-noop-shared-services.ts +50 -2
  609. package/src/testing/make-test-services.ts +125 -31
  610. package/src/testing/make-test-tracer.ts +26 -0
  611. package/src/testing/node/index.ts +1 -0
  612. package/src/testing/node/lsp-harness.ts +2 -0
  613. package/src/testing/node/lsp-server-connection.ts +66 -12
  614. package/src/testing/node/scratch-workspace.ts +10 -5
  615. package/src/testing/node/spawned-server.ts +36 -2
  616. package/src/testing/node/unhandled-rejections.ts +31 -0
  617. package/src/testing/parse-semantic-root.ts +1 -1
  618. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  619. package/src/testing/playwright/index.ts +1 -0
  620. package/src/testing/playwright/server-log-capture.ts +45 -11
  621. package/src/testing/playwright/server-log-rename-reporter.ts +12 -1
  622. package/src/testing/run-update-pipeline.ts +4 -4
  623. package/src/testing/stub-ast-document-manager.ts +36 -138
  624. package/src/testing/stub-document-builder.ts +102 -18
  625. package/src/testing/stub-hydranium-text-documents.ts +165 -27
  626. package/src/testing/stub-langium-documents.ts +3 -2
  627. package/src/testing/stub-model-service.ts +9 -8
  628. package/src/testing/stub-self-save-registry.ts +1 -1
  629. package/src/testing/stub-service-registry.ts +1 -1
  630. package/src/testing/stub-writable-file-system.ts +1 -1
  631. package/src/util/connection-liveness.ts +37 -14
  632. package/src/util/environment.ts +9 -1
  633. package/lib/documents/language-client-text-shadow.d.ts +0 -101
  634. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  635. package/lib/documents/language-client-text-shadow.js +0 -156
  636. package/lib/documents/language-client-text-shadow.js.map +0 -1
  637. package/lib/documents/self-save-registry.d.ts.map +0 -1
  638. package/lib/documents/self-save-registry.js.map +0 -1
  639. package/lib/lsp/instrument-connection.d.ts +0 -36
  640. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  641. package/lib/lsp/instrument-connection.js +0 -62
  642. package/lib/lsp/instrument-connection.js.map +0 -1
  643. package/lib/node/process-memory.d.ts +0 -66
  644. package/lib/node/process-memory.d.ts.map +0 -1
  645. package/lib/node/process-memory.js +0 -252
  646. package/lib/node/process-memory.js.map +0 -1
  647. package/src/documents/language-client-text-shadow.ts +0 -175
  648. package/src/lsp/instrument-connection.ts +0 -66
  649. package/src/node/process-memory.ts +0 -299
@@ -203,6 +203,37 @@ export interface SpawnedServer extends Harness {
203
203
  dispose(): Promise<number | null>;
204
204
  }
205
205
 
206
+ /**
207
+ * Every server started and not yet disposed, so {@link disposeSpawnedServers}
208
+ * can reach one a test forgot.
209
+ *
210
+ * Holds the server — and through it the `ChildProcess` — rather than a pid. A
211
+ * pid identifies a process only while that process is alive: once it exits the
212
+ * OS may reissue the number, and Windows does so within seconds. A teardown
213
+ * that signalled a recorded pid would therefore reach whatever holds it now,
214
+ * which on a concurrent build is another task's compiler or test runner.
215
+ */
216
+ const liveServers = new Set<SpawnedServer>();
217
+
218
+ /**
219
+ * Terminate every server this module started that has not been disposed, and
220
+ * forget them.
221
+ *
222
+ * Safe to call when none are outstanding, and safe to call twice. Nothing here
223
+ * can reach a process this module did not spawn, because every kill goes
224
+ * through the `ChildProcess` handle libuv holds and libuv will not signal a
225
+ * child it has already reaped.
226
+ *
227
+ * A suite that disposes each server as it finishes needs this only as a net; a
228
+ * suite that does not needs it, because an orphan holding a port or a pipe
229
+ * makes the NEXT run's verdict meaningless.
230
+ */
231
+ export async function disposeSpawnedServers(): Promise<void> {
232
+ const outstanding = [...liveServers];
233
+ liveServers.clear();
234
+ await Promise.all(outstanding.map(server => server.dispose()));
235
+ }
236
+
206
237
  /** The captured streams, quoted into a boot-failure message. */
207
238
  function bootDiagnosis(stdoutPrefix: string, stderr: string): string {
208
239
  return (
@@ -253,7 +284,7 @@ export async function startSpawnedServer(options: SpawnedServerOptions): Promise
253
284
  }
254
285
  });
255
286
 
256
- const connection = createProtocolConnection(child.stdout, child.stdin);
287
+ const connection = createProtocolConnection(child.stdout, child.stdin, console);
257
288
  const diagnostics: PublishDiagnosticsParams[] = [];
258
289
  /**
259
290
  * Waiters armed by {@link SpawnedServer.nextDiagnostics}, fanned out to from
@@ -390,7 +421,7 @@ export async function startSpawnedServer(options: SpawnedServerOptions): Promise
390
421
  return exitCode;
391
422
  }
392
423
 
393
- return {
424
+ const server: SpawnedServer = {
394
425
  connection,
395
426
  pid: child.pid,
396
427
  initializeResult,
@@ -440,8 +471,11 @@ export async function startSpawnedServer(options: SpawnedServerOptions): Promise
440
471
  });
441
472
  },
442
473
  dispose(): Promise<number | null> {
474
+ liveServers.delete(server);
443
475
  disposal ??= terminate();
444
476
  return disposal;
445
477
  }
446
478
  };
479
+ liveServers.add(server);
480
+ return server;
447
481
  }
@@ -0,0 +1,31 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 CrossBreeze, EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+
10
+ /**
11
+ * Run a Node-only assertion while collecting process-level unhandled rejection
12
+ * events. The callback owns the event-loop drain and can therefore choose the
13
+ * right observation window for the operation under test.
14
+ *
15
+ * Inside the window a rejection reaches only the array: while any listener is
16
+ * registered, Node hands none to its default handler and Vitest reports none as
17
+ * an error. A callback that never asserts on the array therefore hides every
18
+ * rejection it provokes.
19
+ */
20
+ export async function captureUnhandledRejections<T>(callback: (rejections: unknown[]) => Promise<T>): Promise<T> {
21
+ const rejections: unknown[] = [];
22
+ const listener = (reason: unknown): void => {
23
+ rejections.push(reason);
24
+ };
25
+ process.on('unhandledRejection', listener);
26
+ try {
27
+ return await callback(rejections);
28
+ } finally {
29
+ process.off('unhandledRejection', listener);
30
+ }
31
+ }
@@ -55,7 +55,7 @@
55
55
 
56
56
  import { type AstNode, AstUtils, type LangiumCoreServices, URI } from '@hydranium/langium';
57
57
  import { type ParseHelperOptions, parseHelper } from '@hydranium/langium/test';
58
- import type { WritableFileSystemProvider } from '../documents/ast-document-manager.js';
58
+ import type { WritableFileSystemProvider } from '../langium/workspace/file-system-provider.js';
59
59
 
60
60
  /** The one field this module reads off a lexer or parser error. */
61
61
  interface ParseErrorMessage {
@@ -0,0 +1,240 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 CrossBreeze, EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+
10
+ import { createServer as createHttpServer, type Server as HttpServer } from 'node:http';
11
+ import { connect, createServer as createTcpServer, type Server as TcpServer, type Socket } from 'node:net';
12
+
13
+ /**
14
+ * A TCP proxy that can half-close a connection, so an e2e suite can reproduce a
15
+ * flaky network against a real browser session.
16
+ *
17
+ * Toggling the browser offline is not enough. On localhost the server sees the
18
+ * close immediately and reaps the socket before the browser reconnects, so the
19
+ * window where both sides disagree about the session — the one where reconnect
20
+ * defects live — never opens. Reaching it needs the browser's socket to die
21
+ * while the server still believes it is alive, and nothing inside the app or in
22
+ * Playwright's offline emulation can produce that asymmetry: both close cleanly
23
+ * at both ends.
24
+ *
25
+ * The proxy holds both halves of every connection and lets a test kill them
26
+ * independently:
27
+ *
28
+ * `break` destroy the BROWSER-side sockets, keep the server-side ones open.
29
+ * The browser reconnects through a fresh pair while the server
30
+ * still holds the old one.
31
+ * `release` destroy the orphaned server-side sockets `break` left. The
32
+ * server's disconnect handler fires at once, rather than whenever
33
+ * its next heartbeat write would have failed.
34
+ */
35
+
36
+ /** Where the proxy listens, and the application it fronts. */
37
+ export interface FlakyNetworkProxyOptions {
38
+ /** Port the browser connects to. */
39
+ readonly listenPort: number;
40
+ /** Port of the application being proxied. */
41
+ readonly targetPort: number;
42
+ /** Host of the application being proxied. Defaults to loopback. */
43
+ readonly targetHost?: string;
44
+ /** Port the HTTP control channel listens on. Defaults to `listenPort + 1000`. */
45
+ readonly controlPort?: number;
46
+ }
47
+
48
+ /** The commands the control channel accepts, and the proxy's own vocabulary. */
49
+ export type FlakyNetworkCommand = 'break' | 'release' | 'status';
50
+
51
+ /** Drives a running proxy. Implemented both in-process and over HTTP. */
52
+ export interface FlakyNetworkControl {
53
+ /** Kill the browser side of every live connection; leave the server side up. */
54
+ break(): Promise<string>;
55
+ /** Kill the server side of every connection `break` orphaned. */
56
+ release(): Promise<string>;
57
+ /** How many connections are live and how many are orphaned. */
58
+ status(): Promise<string>;
59
+ }
60
+
61
+ export interface FlakyNetworkProxy extends FlakyNetworkControl {
62
+ /** Base URL a browser should be pointed at, i.e. Playwright's `baseURL`. */
63
+ readonly url: string;
64
+ /** Control channel, for workers that cannot reach this object directly. */
65
+ readonly controlUrl: string;
66
+ close(): Promise<void>;
67
+ }
68
+
69
+ interface ConnectionPair {
70
+ readonly id: number;
71
+ readonly browserSocket: Socket;
72
+ readonly targetSocket: Socket;
73
+ orphaned: boolean;
74
+ }
75
+
76
+ /**
77
+ * Starts the proxy in the calling process.
78
+ *
79
+ * Call it from a Playwright config, which runs in the main process before any
80
+ * worker forks. Workers are separate processes and cannot reach the returned
81
+ * object, which is what {@link controlUrl} and {@link flakyNetworkControlClient}
82
+ * are for.
83
+ */
84
+ export async function startFlakyNetworkProxy(options: FlakyNetworkProxyOptions): Promise<FlakyNetworkProxy> {
85
+ const targetHost = options.targetHost ?? '127.0.0.1';
86
+ const controlPort = options.controlPort ?? options.listenPort + 1000;
87
+ const pairs = new Set<ConnectionPair>();
88
+ let sequence = 0;
89
+ let transcript: string[] = [];
90
+
91
+ const log = (message: string): void => {
92
+ transcript.push(message);
93
+ console.log(`[flaky-network] ${message}`);
94
+ };
95
+
96
+ const proxyServer: TcpServer = createTcpServer(browserSocket => {
97
+ const id = ++sequence;
98
+ const targetSocket = connect(options.targetPort, targetHost);
99
+ const pair: ConnectionPair = { id, browserSocket, targetSocket, orphaned: false };
100
+ pairs.add(pair);
101
+
102
+ // Forwarded by hand rather than with `pipe()`, so killing one side does not
103
+ // tear the other down — which is the entire point of the proxy.
104
+ browserSocket.on('data', chunk => {
105
+ if (!targetSocket.destroyed) {
106
+ targetSocket.write(chunk);
107
+ }
108
+ });
109
+ targetSocket.on('data', chunk => {
110
+ if (!pair.orphaned && !browserSocket.destroyed) {
111
+ browserSocket.write(chunk);
112
+ }
113
+ });
114
+
115
+ const teardown = (origin: 'browser' | 'target'): void => {
116
+ if (pair.orphaned && origin === 'browser') {
117
+ // Expected: `break` killed this side deliberately. The server side
118
+ // stays up until `release`.
119
+ return;
120
+ }
121
+ pairs.delete(pair);
122
+ browserSocket.destroy();
123
+ targetSocket.destroy();
124
+ };
125
+
126
+ browserSocket.on('close', () => teardown('browser'));
127
+ targetSocket.on('close', () => teardown('target'));
128
+ // A half-killed pair reliably raises ECONNRESET on the surviving side; an
129
+ // unhandled 'error' would take the whole runner down with it.
130
+ browserSocket.on('error', () => undefined);
131
+ targetSocket.on('error', () => undefined);
132
+ });
133
+
134
+ const commands: Record<FlakyNetworkCommand, () => void> = {
135
+ break: () => {
136
+ const live = [...pairs].filter(pair => !pair.orphaned);
137
+ if (live.length === 0) {
138
+ log('nothing to break');
139
+ return;
140
+ }
141
+ for (const pair of live) {
142
+ pair.orphaned = true;
143
+ pair.browserSocket.destroy();
144
+ }
145
+ log(`${live.length} connection(s) broken; the browser should reconnect shortly`);
146
+ },
147
+ release: () => {
148
+ const orphans = [...pairs].filter(pair => pair.orphaned);
149
+ if (orphans.length === 0) {
150
+ log('no orphaned connections; run `break` first');
151
+ return;
152
+ }
153
+ for (const pair of orphans) {
154
+ pairs.delete(pair);
155
+ pair.targetSocket.destroy();
156
+ }
157
+ log(`${orphans.length} orphaned connection(s) destroyed; their late disconnect fires now`);
158
+ },
159
+ status: () => {
160
+ const live = [...pairs].filter(pair => !pair.orphaned).length;
161
+ const orphaned = pairs.size - live;
162
+ log(`${live} live, ${orphaned} orphaned`);
163
+ }
164
+ };
165
+
166
+ const run = (name: string): string => {
167
+ transcript = [];
168
+ const command = commands[name as FlakyNetworkCommand];
169
+ if (command) {
170
+ command();
171
+ } else {
172
+ log(`unknown command '${name}'; use: ${Object.keys(commands).join(' | ')}`);
173
+ }
174
+ return transcript.join('\n');
175
+ };
176
+
177
+ const controlServer: HttpServer = createHttpServer((request, response) => {
178
+ const output = run((request.url ?? '').replace(/^\//, '').split('?')[0]);
179
+ response.writeHead(200, { 'content-type': 'text/plain' });
180
+ response.end(`${output}\n`);
181
+ });
182
+
183
+ await Promise.all([listen(proxyServer, options.listenPort), listen(controlServer, controlPort)]);
184
+ // Neither server keeps the process alive, so a runner that starts one from a
185
+ // config does not need a teardown hook to exit — and a caller that wants a
186
+ // deterministic shutdown still has `close()`.
187
+ proxyServer.unref();
188
+ controlServer.unref();
189
+
190
+ return {
191
+ url: `http://localhost:${options.listenPort}`,
192
+ controlUrl: `http://localhost:${controlPort}`,
193
+ break: async () => run('break'),
194
+ release: async () => run('release'),
195
+ status: async () => run('status'),
196
+ close: async () => {
197
+ for (const pair of pairs) {
198
+ pair.browserSocket.destroy();
199
+ pair.targetSocket.destroy();
200
+ }
201
+ pairs.clear();
202
+ await Promise.all([close(proxyServer), close(controlServer)]);
203
+ }
204
+ };
205
+ }
206
+
207
+ /**
208
+ * Drives a proxy running in another process, over its control channel.
209
+ *
210
+ * This is what a spec uses: Playwright workers are separate processes from the
211
+ * config that started the proxy.
212
+ */
213
+ export function flakyNetworkControlClient(controlUrl: string): FlakyNetworkControl {
214
+ const send = async (command: FlakyNetworkCommand): Promise<string> => {
215
+ const response = await fetch(`${controlUrl}/${command}`);
216
+ if (!response.ok) {
217
+ throw new Error(`flaky-network proxy rejected '${command}': ${response.status}`);
218
+ }
219
+ return (await response.text()).trim();
220
+ };
221
+ return {
222
+ break: () => send('break'),
223
+ release: () => send('release'),
224
+ status: () => send('status')
225
+ };
226
+ }
227
+
228
+ function listen(server: TcpServer | HttpServer, port: number): Promise<void> {
229
+ return new Promise((resolve, reject) => {
230
+ server.once('error', reject);
231
+ server.listen(port, () => {
232
+ server.off('error', reject);
233
+ resolve();
234
+ });
235
+ });
236
+ }
237
+
238
+ function close(server: TcpServer | HttpServer): Promise<void> {
239
+ return new Promise(resolve => server.close(() => resolve()));
240
+ }
@@ -11,6 +11,7 @@
11
11
  // `@hydranium/core/testing` barrel) so importing the framework's unit-test
12
12
  // helpers never pulls in `@playwright/test` — which is an OPTIONAL peer here.
13
13
  export * from './e2e-profiling.js';
14
+ export * from './flaky-network-proxy.js';
14
15
  export * from './browser-capture-bridge.js';
15
16
  export * from './server-log-capture.js';
16
17
  export * from './server-log-fixture.js';
@@ -10,7 +10,13 @@
10
10
  import { appendFileSync, existsSync, readdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from 'node:fs';
11
11
  import { join } from 'node:path';
12
12
  import { fileURLToPath } from 'node:url';
13
- import { DEFAULT_LOG_FILE_ENV, DEFAULT_LOG_LEVEL_ENV } from '@hydranium/protocol';
13
+ import {
14
+ DEFAULT_LOG_FILE_ENV,
15
+ DEFAULT_LOG_FILE_LEVEL_ENV,
16
+ DEFAULT_LOG_LEVEL_ENV,
17
+ type LogThreshold,
18
+ parseLogLevel
19
+ } from '@hydranium/protocol';
14
20
  import { toLogFileWorkspaceToken } from '../../langium/diagnostics/log-file-token.js';
15
21
 
16
22
  /**
@@ -69,11 +75,16 @@ export interface CaptureServerLogOptions {
69
75
  */
70
76
  dir?: string;
71
77
  /**
72
- * Server log level set on `HYDRANIUM_LOG_LEVEL`. When omitted, respects a
73
- * pre-set `HYDRANIUM_LOG_LEVEL` env (so a run can pick the level without editing
74
- * the config), then falls back to `'debug'` (a capture at `'info'` is too thin).
78
+ * Threshold the log file is written at, set on `HYDRANIUM_LOG_FILE_LEVEL`;
79
+ * the client's log-level setting does not change it. When omitted, respects a
80
+ * pre-set `HYDRANIUM_LOG_FILE_LEVEL`, then `HYDRANIUM_LOG_LEVEL` env (so a run
81
+ * can pick the level without editing the config), then falls back to `'debug'`
82
+ * (a capture at `'info'` is too thin).
83
+ *
84
+ * The server's own threshold is left alone: it governs what the client sees,
85
+ * not the file, and the setting replaces it within moments of startup.
75
86
  */
76
- level?: string;
87
+ level?: LogThreshold;
77
88
  }
78
89
 
79
90
  /** A Playwright `reporter` config entry: `[modulePath, options]`. */
@@ -119,7 +130,11 @@ export function captureServerLog(options: CaptureServerLogOptions = {}): Capture
119
130
  const env: Record<string, string> = {
120
131
  [DEFAULT_LOG_FILE_ENV]: join(dir, `${WORKSPACE_PLACEHOLDER}.log`)
121
132
  };
122
- env[DEFAULT_LOG_LEVEL_ENV] = options.level ?? process.env[DEFAULT_LOG_LEVEL_ENV] ?? 'debug';
133
+ env[DEFAULT_LOG_FILE_LEVEL_ENV] =
134
+ options.level ??
135
+ parseLogLevel(process.env[DEFAULT_LOG_FILE_LEVEL_ENV]) ??
136
+ parseLogLevel(process.env[DEFAULT_LOG_LEVEL_ENV]) ??
137
+ 'debug';
123
138
  const reporterModule = fileURLToPath(new URL('./server-log-rename-reporter.js', import.meta.url));
124
139
  return { env, reporter: [reporterModule, { dir }] };
125
140
  }
@@ -160,16 +175,28 @@ export function serverLogSpecName(file: string): string {
160
175
  * Rename each `<token>.log` (backend) and `<token>.browser.log` (forwarded
161
176
  * browser console) to the spec name recorded in its `<token>.spec` sidecar
162
177
  * (written by {@link markServerLog}), then delete the sidecar. Colliding names —
163
- * a spec that opened more than one workspace — get a `-2`, `-3`, … suffix. Token
164
- * logs without a sidecar are left untouched. Run once, after all server processes
165
- * have exited (e.g. a reporter's `onEnd`). Best-effort.
178
+ * a spec that opened more than one workspace — get a `-2`, `-3`, … suffix. Run
179
+ * once, after all server processes have exited (e.g. a reporter's `onEnd`).
180
+ * Best-effort.
181
+ *
182
+ * Returns the workspace tokens left UNATTRIBUTED — a log the capture wrote that
183
+ * no test claimed, because that spec never reached
184
+ * {@link markServerLog} (no `serverLog` fixture, no `beforeEach` call).
185
+ *
186
+ * **Returned rather than ignored, because the unattributed state is the
187
+ * misleading one.** Such a log still exists, still has content, and is named by
188
+ * an opaque token with no test boundaries in it — so a capture run that covered
189
+ * nothing looks exactly like one that covered everything, and the logs are
190
+ * there to be read. A caller that can warn should warn.
166
191
  */
167
- export function renameServerLogs(dir: string): void {
192
+ export function renameServerLogs(dir: string): string[] {
168
193
  let entries: string[];
169
194
  try {
170
195
  entries = readdirSync(dir);
171
196
  } catch {
172
- return;
197
+ // An unreadable capture dir has nothing to report — including nothing
198
+ // unattributed, since no log was observed at all.
199
+ return [];
173
200
  }
174
201
  // Per suffix (`.log`, `.browser.log`) a `taken` set guards collisions, so the
175
202
  // backend and browser logs for one spec share the same friendly base name.
@@ -190,6 +217,11 @@ export function renameServerLogs(dir: string): void {
190
217
  // ignore
191
218
  }
192
219
  };
220
+ // Every token the capture produced a backend log for, so the ones no sidecar
221
+ // claims can be reported rather than silently left behind.
222
+ const unattributed = new Set(
223
+ entries.filter(entry => entry.endsWith('.log') && !entry.endsWith('.browser.log')).map(entry => entry.slice(0, -'.log'.length))
224
+ );
193
225
  for (const entry of entries) {
194
226
  if (!entry.endsWith('.spec')) {
195
227
  continue;
@@ -210,9 +242,11 @@ export function renameServerLogs(dir: string): void {
210
242
  if (!name) {
211
243
  continue;
212
244
  }
245
+ unattributed.delete(token);
213
246
  rename(token, name, '.log');
214
247
  rename(token, name, '.browser.log');
215
248
  }
249
+ return [...unattributed];
216
250
  }
217
251
 
218
252
  /**
@@ -24,6 +24,17 @@ export default class ServerLogRenameReporter {
24
24
  }
25
25
 
26
26
  onEnd(): void {
27
- renameServerLogs(this.dir);
27
+ const unattributed = renameServerLogs(this.dir);
28
+ if (unattributed.length > 0) {
29
+ // Loud, because the alternative is a capture run that reads as
30
+ // complete: these logs exist and have content, but are named by an
31
+ // opaque workspace token and carry no test boundaries, so nothing
32
+ // about them says which spec they belong to.
33
+ console.warn(
34
+ `[server-log] ${unattributed.length} captured log(s) belong to no test: ${unattributed.join(', ')}.\n` +
35
+ '[server-log] Those specs never marked a boundary — apply the `serverLog` fixture, ' +
36
+ 'or call `markServerLog`/`attachServerLog` from the suite, or their logs cannot be read per test.'
37
+ );
38
+ }
28
39
  }
29
40
  }
@@ -9,7 +9,7 @@
9
9
 
10
10
  /**
11
11
  * Driver for the structured-write transform chain — the rewrite registry plus
12
- * the serializer — run the way `ModelService.update` runs it.
12
+ * the serializer — run the way a session's `update` runs it.
13
13
  *
14
14
  * # Why a driver and not a documented recipe
15
15
  *
@@ -38,7 +38,7 @@
38
38
  * This runs rewrite → serialize and stops. It does NOT open the document, push
39
39
  * text into the multi-client store, drive a build or return an
40
40
  * {@link AstDocument}: those need a live workspace, and a test that wants them
41
- * should call `ModelService.update` itself rather than a driver standing in for
41
+ * should call a session's `update` itself rather than a driver standing in for
42
42
  * it. What is left is the part with no observable of its own — the text and the
43
43
  * rewritten model — which is why it needed lifting.
44
44
  *
@@ -61,7 +61,7 @@ export interface UpdatePipelineArgs<TTransfer extends TransferElement = Transfer
61
61
  * rather than merely labelling it.
62
62
  */
63
63
  readonly uri: string;
64
- /** Transfer-model payload, as an adopter caller would hand it to `ModelService.update`. */
64
+ /** Transfer-model payload, as an adopter caller would hand it to a session's `update`. */
65
65
  readonly model: TTransfer;
66
66
  /**
67
67
  * Previous AST root threaded into every rewrite, so a diff-based rewrite can
@@ -90,7 +90,7 @@ export interface UpdatePipelineResult<TTransfer extends TransferElement = Transf
90
90
  * surface but it makes the precise assertion unavailable.
91
91
  */
92
92
  readonly rewritten: TTransfer;
93
- /** The serialized text, which is what `ModelService.update` applies to the store. */
93
+ /** The serialized text, which is what a session's `update` applies to the store. */
94
94
  readonly text: string;
95
95
  }
96
96