@hydranium/core 1.0.0-next.31 → 1.0.0-next.313

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (769) hide show
  1. package/README.md +78 -82
  2. package/lib/browser/host-heads-in-worker.d.ts +77 -0
  3. package/lib/browser/host-heads-in-worker.d.ts.map +1 -0
  4. package/lib/browser/host-heads-in-worker.js +169 -0
  5. package/lib/browser/host-heads-in-worker.js.map +1 -0
  6. package/lib/browser/index.d.ts +12 -0
  7. package/lib/browser/index.d.ts.map +1 -0
  8. package/lib/browser/index.js +17 -0
  9. package/lib/browser/index.js.map +1 -0
  10. package/lib/browser/indexeddb-file-system-store.d.ts +82 -0
  11. package/lib/browser/indexeddb-file-system-store.d.ts.map +1 -0
  12. package/lib/browser/indexeddb-file-system-store.js +181 -0
  13. package/lib/browser/indexeddb-file-system-store.js.map +1 -0
  14. package/lib/browser/start-language-server-in-worker.d.ts +32 -0
  15. package/lib/browser/start-language-server-in-worker.d.ts.map +1 -0
  16. package/lib/browser/start-language-server-in-worker.js +40 -0
  17. package/lib/browser/start-language-server-in-worker.js.map +1 -0
  18. package/lib/documents/ast-document-manager.d.ts +256 -124
  19. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  20. package/lib/documents/ast-document-manager.js +293 -132
  21. package/lib/documents/ast-document-manager.js.map +1 -1
  22. package/lib/documents/client-ids.d.ts +5 -19
  23. package/lib/documents/client-ids.d.ts.map +1 -1
  24. package/lib/documents/client-ids.js +5 -19
  25. package/lib/documents/client-ids.js.map +1 -1
  26. package/lib/documents/client-session-errors.d.ts +15 -0
  27. package/lib/documents/client-session-errors.d.ts.map +1 -0
  28. package/lib/documents/client-session-errors.js +15 -0
  29. package/lib/documents/client-session-errors.js.map +1 -0
  30. package/lib/documents/client-session-registry.d.ts +146 -0
  31. package/lib/documents/client-session-registry.d.ts.map +1 -0
  32. package/lib/documents/client-session-registry.js +207 -0
  33. package/lib/documents/client-session-registry.js.map +1 -0
  34. package/lib/documents/dirty-state-tracker.d.ts +101 -0
  35. package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
  36. package/lib/documents/dirty-state-tracker.js +85 -0
  37. package/lib/documents/dirty-state-tracker.js.map +1 -0
  38. package/lib/documents/document-release-handler.d.ts +204 -0
  39. package/lib/documents/document-release-handler.d.ts.map +1 -0
  40. package/lib/documents/document-release-handler.js +317 -0
  41. package/lib/documents/document-release-handler.js.map +1 -0
  42. package/lib/documents/document-release-scheduler.d.ts +67 -0
  43. package/lib/documents/document-release-scheduler.d.ts.map +1 -0
  44. package/lib/documents/document-release-scheduler.js +80 -0
  45. package/lib/documents/document-release-scheduler.js.map +1 -0
  46. package/lib/documents/file-system-task-queue.d.ts +52 -0
  47. package/lib/documents/file-system-task-queue.d.ts.map +1 -0
  48. package/lib/documents/file-system-task-queue.js +37 -0
  49. package/lib/documents/file-system-task-queue.js.map +1 -0
  50. package/lib/documents/hydranium-text-documents.d.ts +436 -282
  51. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  52. package/lib/documents/hydranium-text-documents.js +897 -483
  53. package/lib/documents/hydranium-text-documents.js.map +1 -1
  54. package/lib/documents/index.d.ts +10 -2
  55. package/lib/documents/index.d.ts.map +1 -1
  56. package/lib/documents/index.js +10 -2
  57. package/lib/documents/index.js.map +1 -1
  58. package/lib/documents/language-client-shadow.d.ts +234 -0
  59. package/lib/documents/language-client-shadow.d.ts.map +1 -0
  60. package/lib/documents/language-client-shadow.js +306 -0
  61. package/lib/documents/language-client-shadow.js.map +1 -0
  62. package/lib/documents/model-ledger.d.ts +47 -0
  63. package/lib/documents/model-ledger.d.ts.map +1 -0
  64. package/lib/documents/model-ledger.js +30 -0
  65. package/lib/documents/model-ledger.js.map +1 -0
  66. package/lib/documents/text-ledger.d.ts +64 -0
  67. package/lib/documents/text-ledger.d.ts.map +1 -0
  68. package/lib/documents/text-ledger.js +63 -0
  69. package/lib/documents/text-ledger.js.map +1 -0
  70. package/lib/documents/version-sync-service.d.ts +138 -0
  71. package/lib/documents/version-sync-service.d.ts.map +1 -0
  72. package/lib/documents/version-sync-service.js +173 -0
  73. package/lib/documents/version-sync-service.js.map +1 -0
  74. package/lib/index.d.ts +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/bootstrap.d.ts +49 -36
  83. package/lib/langium/bootstrap.d.ts.map +1 -1
  84. package/lib/langium/bootstrap.js +91 -45
  85. package/lib/langium/bootstrap.js.map +1 -1
  86. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +9 -9
  87. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
  88. package/lib/langium/build-phase-pass/build-phase-pass-service.js +25 -16
  89. package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
  90. package/lib/langium/build-phase-pass/build-phase-pass.d.ts +20 -8
  91. package/lib/langium/build-phase-pass/build-phase-pass.d.ts.map +1 -1
  92. package/lib/langium/build-phase-pass/build-phase-pass.js +20 -0
  93. package/lib/langium/build-phase-pass/build-phase-pass.js.map +1 -1
  94. package/lib/langium/composite-ast-reflection.d.ts +46 -0
  95. package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
  96. package/lib/langium/composite-ast-reflection.js +97 -0
  97. package/lib/langium/composite-ast-reflection.js.map +1 -0
  98. package/lib/langium/config/configuration-provider.d.ts +81 -0
  99. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  100. package/lib/langium/config/configuration-provider.js +112 -0
  101. package/lib/langium/config/configuration-provider.js.map +1 -0
  102. package/lib/langium/config/index.d.ts +1 -0
  103. package/lib/langium/config/index.d.ts.map +1 -1
  104. package/lib/langium/config/index.js +1 -0
  105. package/lib/langium/config/index.js.map +1 -1
  106. package/lib/langium/config/settings.js.map +1 -1
  107. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +9 -20
  108. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
  109. package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
  110. package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
  111. package/lib/langium/diagnostics/log-preamble.js +1 -1
  112. package/lib/langium/diagnostics/log-preamble.js.map +1 -1
  113. package/lib/langium/diagnostics/logger.d.ts +19 -4
  114. package/lib/langium/diagnostics/logger.d.ts.map +1 -1
  115. package/lib/langium/diagnostics/logger.js +36 -11
  116. package/lib/langium/diagnostics/logger.js.map +1 -1
  117. package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
  118. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  119. package/lib/langium/diagnostics/lsp-logger.js +58 -17
  120. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  121. package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
  122. package/lib/langium/diagnostics/server-tracer.js.map +1 -1
  123. package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
  124. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  125. package/lib/langium/document-builder/build-pipeline-integration.js +28 -30
  126. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  127. package/lib/langium/document-builder/build-session.d.ts +6 -5
  128. package/lib/langium/document-builder/build-session.d.ts.map +1 -1
  129. package/lib/langium/document-builder/build-session.js +5 -5
  130. package/lib/langium/document-builder/build-session.js.map +1 -1
  131. package/lib/langium/document-builder/document-builder.d.ts +309 -35
  132. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  133. package/lib/langium/document-builder/document-builder.js +511 -75
  134. package/lib/langium/document-builder/document-builder.js.map +1 -1
  135. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  136. package/lib/langium/documentation/comment-provider.js.map +1 -1
  137. package/lib/langium/integration-services.d.ts +40 -24
  138. package/lib/langium/integration-services.d.ts.map +1 -1
  139. package/lib/langium/integration-services.js +7 -4
  140. package/lib/langium/integration-services.js.map +1 -1
  141. package/lib/langium/integrity/integrity-rule.d.ts +16 -8
  142. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  143. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  144. package/lib/langium/integrity/integrity-service.d.ts +83 -27
  145. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  146. package/lib/langium/integrity/integrity-service.js +273 -63
  147. package/lib/langium/integrity/integrity-service.js.map +1 -1
  148. package/lib/langium/keys/containment.d.ts +64 -0
  149. package/lib/langium/keys/containment.d.ts.map +1 -0
  150. package/lib/langium/keys/containment.js +53 -0
  151. package/lib/langium/keys/containment.js.map +1 -0
  152. package/lib/langium/keys/index.d.ts +1 -0
  153. package/lib/langium/keys/index.d.ts.map +1 -1
  154. package/lib/langium/keys/index.js +1 -0
  155. package/lib/langium/keys/index.js.map +1 -1
  156. package/lib/langium/keys/name-based-key-provider.d.ts +4 -0
  157. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  158. package/lib/langium/keys/name-based-key-provider.js +4 -0
  159. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  160. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  161. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  162. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  163. package/lib/langium/labeling/label-provider.js.map +1 -1
  164. package/lib/langium/language-module.d.ts +30 -5
  165. package/lib/langium/language-module.d.ts.map +1 -1
  166. package/lib/langium/language-module.js +18 -4
  167. package/lib/langium/language-module.js.map +1 -1
  168. package/lib/langium/model-service/client-session.d.ts +383 -0
  169. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  170. package/lib/langium/model-service/client-session.js +455 -0
  171. package/lib/langium/model-service/client-session.js.map +1 -0
  172. package/lib/langium/model-service/index.d.ts +2 -0
  173. package/lib/langium/model-service/index.d.ts.map +1 -1
  174. package/lib/langium/model-service/index.js +2 -0
  175. package/lib/langium/model-service/index.js.map +1 -1
  176. package/lib/langium/model-service/model-events.d.ts +66 -0
  177. package/lib/langium/model-service/model-events.d.ts.map +1 -0
  178. package/lib/langium/model-service/model-events.js +10 -0
  179. package/lib/langium/model-service/model-events.js.map +1 -0
  180. package/lib/langium/model-service/model-service.d.ts +480 -289
  181. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  182. package/lib/langium/model-service/model-service.js +597 -456
  183. package/lib/langium/model-service/model-service.js.map +1 -1
  184. package/lib/langium/module.d.ts +158 -37
  185. package/lib/langium/module.d.ts.map +1 -1
  186. package/lib/langium/module.js +52 -36
  187. package/lib/langium/module.js.map +1 -1
  188. package/lib/langium/naming/name-provider.d.ts +42 -7
  189. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  190. package/lib/langium/naming/name-provider.js +10 -4
  191. package/lib/langium/naming/name-provider.js.map +1 -1
  192. package/lib/langium/naming/name-separator-validation.d.ts +23 -1
  193. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  194. package/lib/langium/naming/name-separator-validation.js +22 -0
  195. package/lib/langium/naming/name-separator-validation.js.map +1 -1
  196. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  197. package/lib/langium/project/abstract-project-manager.js +13 -6
  198. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  199. package/lib/langium/project/project-change-event.d.ts +2 -2
  200. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  201. package/lib/langium/project/single-project-manager.js.map +1 -1
  202. package/lib/langium/residency/cst-residency-service.d.ts +38 -14
  203. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  204. package/lib/langium/residency/cst-residency-service.js +24 -58
  205. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  206. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  207. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  208. package/lib/langium/scope/fallback-scope.d.ts +27 -0
  209. package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
  210. package/lib/langium/scope/fallback-scope.js +35 -0
  211. package/lib/langium/scope/fallback-scope.js.map +1 -0
  212. package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
  213. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  214. package/lib/langium/scope/hydranium-scope-computation.js +38 -39
  215. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  216. package/lib/langium/scope/hydranium-scope-provider.d.ts +29 -11
  217. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  218. package/lib/langium/scope/hydranium-scope-provider.js +37 -15
  219. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  220. package/lib/langium/scope/index.d.ts +1 -0
  221. package/lib/langium/scope/index.d.ts.map +1 -1
  222. package/lib/langium/scope/index.js +1 -0
  223. package/lib/langium/scope/index.js.map +1 -1
  224. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  225. package/lib/langium/scope/reference-builder.js.map +1 -1
  226. package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
  227. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  228. package/lib/langium/scope/reference-candidate-provider.js +3 -2
  229. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  230. package/lib/langium/scope/scope-extension-service.d.ts +41 -37
  231. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  232. package/lib/langium/scope/scope-extension-service.js +57 -29
  233. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  234. package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
  235. package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
  236. package/lib/langium/scope/scoped-ast-node-description.js +1 -3
  237. package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
  238. package/lib/langium/serialization/abstract-serializer.d.ts +38 -27
  239. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  240. package/lib/langium/serialization/abstract-serializer.js +54 -30
  241. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  242. package/lib/langium/serialization/json-serializer.d.ts +8 -1
  243. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  244. package/lib/langium/serialization/json-serializer.js +13 -3
  245. package/lib/langium/serialization/json-serializer.js.map +1 -1
  246. package/lib/langium/serialization/serializer.d.ts +1 -1
  247. package/lib/langium/serialization/yaml-serializer.d.ts +4 -0
  248. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  249. package/lib/langium/serialization/yaml-serializer.js +4 -0
  250. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  251. package/lib/langium/service-registry.d.ts +29 -1
  252. package/lib/langium/service-registry.d.ts.map +1 -1
  253. package/lib/langium/service-registry.js +37 -0
  254. package/lib/langium/service-registry.js.map +1 -1
  255. package/lib/langium/shared-services.d.ts +23 -6
  256. package/lib/langium/shared-services.d.ts.map +1 -1
  257. package/lib/langium/shared-services.js.map +1 -1
  258. package/lib/langium/single-langium-copy.d.ts +22 -0
  259. package/lib/langium/single-langium-copy.d.ts.map +1 -0
  260. package/lib/langium/single-langium-copy.js +36 -0
  261. package/lib/langium/single-langium-copy.js.map +1 -0
  262. package/lib/langium/transfer/transfer-encoder.d.ts +84 -35
  263. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  264. package/lib/langium/transfer/transfer-encoder.js +34 -23
  265. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  266. package/lib/langium/trivia/comment-preserver.d.ts +423 -0
  267. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  268. package/lib/langium/trivia/comment-preserver.js +906 -0
  269. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  270. package/lib/langium/trivia/document-ending-preserver.d.ts +51 -0
  271. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  272. package/lib/langium/trivia/document-ending-preserver.js +62 -0
  273. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  274. package/lib/langium/trivia/index.d.ts +14 -0
  275. package/lib/langium/trivia/index.d.ts.map +1 -0
  276. package/lib/langium/trivia/index.js +14 -0
  277. package/lib/langium/trivia/index.js.map +1 -0
  278. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  279. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  280. package/lib/langium/trivia/trivia-contribution.js +10 -0
  281. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  282. package/lib/langium/trivia/trivia-preserver.d.ts +52 -0
  283. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  284. package/lib/langium/trivia/trivia-preserver.js +10 -0
  285. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  286. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  287. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  288. package/lib/langium/trivia/trivia-service.js +56 -0
  289. package/lib/langium/trivia/trivia-service.js.map +1 -0
  290. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  291. package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
  292. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  293. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  294. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  295. package/lib/langium/validation/document-validator.d.ts +280 -9
  296. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  297. package/lib/langium/validation/document-validator.js +453 -8
  298. package/lib/langium/validation/document-validator.js.map +1 -1
  299. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  300. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  301. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  302. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  303. package/lib/langium/workspace/document-uri-policy.d.ts +24 -15
  304. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  305. package/lib/langium/workspace/document-uri-policy.js +22 -13
  306. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  307. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  308. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  309. package/lib/langium/workspace/file-not-found.js +31 -0
  310. package/lib/langium/workspace/file-not-found.js.map +1 -0
  311. package/lib/langium/workspace/file-system-provider.d.ts +167 -8
  312. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  313. package/lib/langium/workspace/file-system-provider.js +115 -13
  314. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  315. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +31 -1
  316. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  317. package/lib/langium/workspace/hydranium-langium-document-factory.js +54 -0
  318. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  319. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
  320. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  321. package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
  322. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  323. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +124 -22
  324. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  325. package/lib/langium/workspace/hydranium-workspace-manager.js +212 -31
  326. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  327. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
  328. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  329. package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
  330. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  331. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  332. package/lib/langium/workspace/index-manager.js.map +1 -1
  333. package/lib/langium/workspace/index.d.ts +1 -0
  334. package/lib/langium/workspace/index.d.ts.map +1 -1
  335. package/lib/langium/workspace/index.js +1 -0
  336. package/lib/langium/workspace/index.js.map +1 -1
  337. package/lib/langium/workspace/initialize-workspace.d.ts +61 -4
  338. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  339. package/lib/langium/workspace/initialize-workspace.js +80 -7
  340. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  341. package/lib/langium/workspace/langium-documents.d.ts +7 -0
  342. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  343. package/lib/langium/workspace/langium-documents.js +18 -1
  344. package/lib/langium/workspace/langium-documents.js.map +1 -1
  345. package/lib/langium/workspace/persistent-file-system-provider.d.ts +16 -10
  346. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  347. package/lib/langium/workspace/persistent-file-system-provider.js +25 -13
  348. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  349. package/lib/langium/workspace/self-save-registry.d.ts +84 -0
  350. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  351. package/lib/{documents → langium/workspace}/self-save-registry.js +33 -22
  352. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  353. package/lib/langium/workspace/virtual-document.d.ts +55 -21
  354. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  355. package/lib/langium/workspace/virtual-document.js +87 -24
  356. package/lib/langium/workspace/virtual-document.js.map +1 -1
  357. package/lib/langium/workspace/write-lock-scope.d.ts +22 -10
  358. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  359. package/lib/langium/workspace/write-lock-scope.js +15 -5
  360. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  361. package/lib/launcher/integrated-server.d.ts +3 -1
  362. package/lib/launcher/integrated-server.d.ts.map +1 -1
  363. package/lib/locale/index.d.ts +10 -0
  364. package/lib/locale/index.d.ts.map +1 -0
  365. package/lib/locale/index.js +10 -0
  366. package/lib/locale/index.js.map +1 -0
  367. package/lib/locale/server-locale.d.ts +73 -0
  368. package/lib/locale/server-locale.d.ts.map +1 -0
  369. package/lib/locale/server-locale.js +61 -0
  370. package/lib/locale/server-locale.js.map +1 -0
  371. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  372. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  373. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  374. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  375. package/lib/lsp/connection-features.d.ts +23 -0
  376. package/lib/lsp/connection-features.d.ts.map +1 -0
  377. package/lib/lsp/connection-features.js +60 -0
  378. package/lib/lsp/connection-features.js.map +1 -0
  379. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  380. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  381. package/lib/lsp/diagnostics-connection.js +53 -0
  382. package/lib/lsp/diagnostics-connection.js.map +1 -0
  383. package/lib/lsp/hydranium-document-update-handler.d.ts +126 -82
  384. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  385. package/lib/lsp/hydranium-document-update-handler.js +235 -102
  386. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  387. package/lib/lsp/index.d.ts +4 -1
  388. package/lib/lsp/index.d.ts.map +1 -1
  389. package/lib/lsp/index.js +4 -1
  390. package/lib/lsp/index.js.map +1 -1
  391. package/lib/lsp/lsp-latency.d.ts +39 -0
  392. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  393. package/lib/lsp/lsp-latency.js +58 -0
  394. package/lib/lsp/lsp-latency.js.map +1 -0
  395. package/lib/lsp/save-text-document.d.ts +31 -0
  396. package/lib/lsp/save-text-document.d.ts.map +1 -0
  397. package/lib/lsp/save-text-document.js +52 -0
  398. package/lib/lsp/save-text-document.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 +43 -7
  469. package/lib/node/socket-launcher.d.ts.map +1 -1
  470. package/lib/node/socket-launcher.js +42 -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 +13 -13
  477. package/lib/node/stdio-launcher.d.ts.map +1 -1
  478. package/lib/node/stdio-launcher.js +21 -11
  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 +2 -1
  484. package/lib/testing/fake-document.d.ts.map +1 -1
  485. package/lib/testing/fake-document.js.map +1 -1
  486. package/lib/testing/index.d.ts +1 -1
  487. package/lib/testing/index.d.ts.map +1 -1
  488. package/lib/testing/index.js +2 -1
  489. package/lib/testing/index.js.map +1 -1
  490. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  491. package/lib/testing/langium-test-helpers.js +1 -0
  492. package/lib/testing/langium-test-helpers.js.map +1 -1
  493. package/lib/testing/make-noop-language-services.js.map +1 -1
  494. package/lib/testing/make-noop-shared-services.d.ts +14 -0
  495. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  496. package/lib/testing/make-noop-shared-services.js +28 -2
  497. package/lib/testing/make-noop-shared-services.js.map +1 -1
  498. package/lib/testing/make-test-services.d.ts +72 -14
  499. package/lib/testing/make-test-services.d.ts.map +1 -1
  500. package/lib/testing/make-test-services.js +42 -10
  501. package/lib/testing/make-test-services.js.map +1 -1
  502. package/lib/testing/make-test-tracer.d.ts +12 -0
  503. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  504. package/lib/testing/make-test-tracer.js +13 -0
  505. package/lib/testing/make-test-tracer.js.map +1 -1
  506. package/lib/testing/node/applied-edit-capture.d.ts +29 -0
  507. package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
  508. package/lib/testing/node/applied-edit-capture.js +117 -0
  509. package/lib/testing/node/applied-edit-capture.js.map +1 -0
  510. package/lib/testing/node/golden-corpus.js.map +1 -1
  511. package/lib/testing/node/index.d.ts +1 -0
  512. package/lib/testing/node/index.d.ts.map +1 -1
  513. package/lib/testing/node/index.js +1 -0
  514. package/lib/testing/node/index.js.map +1 -1
  515. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  516. package/lib/testing/node/lsp-harness.js +2 -0
  517. package/lib/testing/node/lsp-harness.js.map +1 -1
  518. package/lib/testing/node/lsp-server-connection.d.ts +21 -6
  519. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  520. package/lib/testing/node/lsp-server-connection.js +49 -106
  521. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  522. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  523. package/lib/testing/node/scratch-workspace.js +10 -5
  524. package/lib/testing/node/scratch-workspace.js.map +1 -1
  525. package/lib/testing/node/spawned-server.d.ts +30 -1
  526. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  527. package/lib/testing/node/spawned-server.js +39 -2
  528. package/lib/testing/node/spawned-server.js.map +1 -1
  529. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  530. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  531. package/lib/testing/node/unhandled-rejections.js +32 -0
  532. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  533. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  534. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  535. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  536. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  537. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  538. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  539. package/lib/testing/playwright/index.d.ts +1 -0
  540. package/lib/testing/playwright/index.d.ts.map +1 -1
  541. package/lib/testing/playwright/index.js +1 -0
  542. package/lib/testing/playwright/index.js.map +1 -1
  543. package/lib/testing/playwright/server-log-capture.d.ts +46 -16
  544. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  545. package/lib/testing/playwright/server-log-capture.js +111 -40
  546. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  547. package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
  548. package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
  549. package/lib/testing/playwright/server-log-fixture.js +25 -6
  550. package/lib/testing/playwright/server-log-fixture.js.map +1 -1
  551. package/lib/testing/playwright/server-log-region.d.ts +15 -0
  552. package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
  553. package/lib/testing/playwright/server-log-region.js +30 -0
  554. package/lib/testing/playwright/server-log-region.js.map +1 -0
  555. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  556. package/lib/testing/playwright/server-log-rename-reporter.js +4 -3
  557. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  558. package/lib/testing/run-update-pipeline.d.ts +8 -5
  559. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  560. package/lib/testing/run-update-pipeline.js.map +1 -1
  561. package/lib/testing/stub-ast-document-manager.d.ts +11 -52
  562. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  563. package/lib/testing/stub-ast-document-manager.js +31 -62
  564. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  565. package/lib/testing/stub-document-builder.d.ts +33 -11
  566. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  567. package/lib/testing/stub-document-builder.js +103 -5
  568. package/lib/testing/stub-document-builder.js.map +1 -1
  569. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  570. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  571. package/lib/testing/stub-hydranium-text-documents.js +132 -16
  572. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  573. package/lib/testing/stub-index-manager.js.map +1 -1
  574. package/lib/testing/stub-langium-documents.d.ts +3 -2
  575. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  576. package/lib/testing/stub-langium-documents.js.map +1 -1
  577. package/lib/testing/stub-model-service.d.ts +9 -8
  578. package/lib/testing/stub-model-service.d.ts.map +1 -1
  579. package/lib/testing/stub-model-service.js +6 -6
  580. package/lib/testing/stub-model-service.js.map +1 -1
  581. package/lib/testing/stub-project-manager.js.map +1 -1
  582. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  583. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  584. package/lib/testing/stub-service-registry.d.ts +1 -1
  585. package/lib/testing/stub-service-registry.js.map +1 -1
  586. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  587. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  588. package/lib/testing/stub-writable-file-system.js +2 -1
  589. package/lib/testing/stub-writable-file-system.js.map +1 -1
  590. package/lib/util/connection-liveness.d.ts +19 -6
  591. package/lib/util/connection-liveness.d.ts.map +1 -1
  592. package/lib/util/connection-liveness.js +61 -15
  593. package/lib/util/connection-liveness.js.map +1 -1
  594. package/lib/util/environment.d.ts.map +1 -1
  595. package/lib/util/environment.js.map +1 -1
  596. package/lib/util/registry.d.ts.map +1 -1
  597. package/package.json +38 -57
  598. package/src/browser/host-heads-in-worker.ts +218 -0
  599. package/src/browser/index.ts +17 -0
  600. package/src/browser/indexeddb-file-system-store.ts +192 -0
  601. package/src/browser/start-language-server-in-worker.ts +56 -0
  602. package/src/documents/ast-document-manager.ts +467 -233
  603. package/src/documents/client-ids.ts +5 -22
  604. package/src/documents/client-session-errors.ts +24 -0
  605. package/src/documents/client-session-registry.ts +262 -0
  606. package/src/documents/dirty-state-tracker.ts +167 -0
  607. package/src/documents/document-release-handler.ts +404 -0
  608. package/src/documents/document-release-scheduler.ts +121 -0
  609. package/src/documents/file-system-task-queue.ts +74 -0
  610. package/src/documents/hydranium-text-documents.ts +1022 -595
  611. package/src/documents/index.ts +10 -2
  612. package/src/documents/language-client-shadow.ts +501 -0
  613. package/src/documents/model-ledger.ts +66 -0
  614. package/src/documents/text-ledger.ts +112 -0
  615. package/src/documents/version-sync-service.ts +275 -0
  616. package/src/index.ts +8 -0
  617. package/src/langium/ast-extension/ast-extension-service.ts +77 -41
  618. package/src/langium/bootstrap.ts +95 -52
  619. package/src/langium/build-phase-pass/build-phase-pass-service.ts +29 -19
  620. package/src/langium/build-phase-pass/build-phase-pass.ts +37 -8
  621. package/src/langium/composite-ast-reflection.ts +112 -0
  622. package/src/langium/config/configuration-provider.ts +119 -0
  623. package/src/langium/config/index.ts +1 -0
  624. package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
  625. package/src/langium/diagnostics/log-preamble.ts +1 -1
  626. package/src/langium/diagnostics/logger.ts +38 -11
  627. package/src/langium/diagnostics/lsp-logger.ts +61 -16
  628. package/src/langium/document-builder/build-pipeline-integration.ts +46 -32
  629. package/src/langium/document-builder/build-session.ts +4 -3
  630. package/src/langium/document-builder/document-builder.ts +616 -73
  631. package/src/langium/integration-services.ts +59 -28
  632. package/src/langium/integrity/integrity-rule.ts +16 -8
  633. package/src/langium/integrity/integrity-service.ts +296 -69
  634. package/src/langium/keys/containment.ts +87 -0
  635. package/src/langium/keys/index.ts +1 -0
  636. package/src/langium/keys/name-based-key-provider.ts +4 -0
  637. package/src/langium/language-module.ts +49 -8
  638. package/src/langium/model-service/client-session.ts +718 -0
  639. package/src/langium/model-service/index.ts +2 -0
  640. package/src/langium/model-service/model-events.ts +80 -0
  641. package/src/langium/model-service/model-service.ts +908 -485
  642. package/src/langium/module.ts +212 -67
  643. package/src/langium/naming/name-provider.ts +44 -8
  644. package/src/langium/naming/name-separator-validation.ts +25 -3
  645. package/src/langium/project/abstract-project-manager.ts +13 -5
  646. package/src/langium/project/project-change-event.ts +2 -2
  647. package/src/langium/residency/cst-residency-service.ts +54 -19
  648. package/src/langium/scope/fallback-scope.ts +38 -0
  649. package/src/langium/scope/hydranium-scope-computation.ts +45 -44
  650. package/src/langium/scope/hydranium-scope-provider.ts +49 -16
  651. package/src/langium/scope/index.ts +1 -0
  652. package/src/langium/scope/reference-candidate-provider.ts +6 -5
  653. package/src/langium/scope/scope-extension-service.ts +74 -59
  654. package/src/langium/scope/scoped-ast-node-description.ts +1 -3
  655. package/src/langium/serialization/abstract-serializer.ts +57 -41
  656. package/src/langium/serialization/json-serializer.ts +14 -3
  657. package/src/langium/serialization/serializer.ts +1 -1
  658. package/src/langium/serialization/yaml-serializer.ts +4 -0
  659. package/src/langium/service-registry.ts +41 -2
  660. package/src/langium/shared-services.ts +26 -6
  661. package/src/langium/single-langium-copy.ts +42 -0
  662. package/src/langium/transfer/transfer-encoder.ts +102 -45
  663. package/src/langium/trivia/comment-preserver.ts +1100 -0
  664. package/src/langium/trivia/document-ending-preserver.ts +71 -0
  665. package/src/langium/trivia/index.ts +14 -0
  666. package/src/langium/trivia/trivia-contribution.ts +39 -0
  667. package/src/langium/trivia/trivia-preserver.ts +56 -0
  668. package/src/langium/trivia/trivia-service.ts +99 -0
  669. package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
  670. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  671. package/src/langium/validation/document-validator.ts +528 -13
  672. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  673. package/src/langium/workspace/document-uri-policy.ts +32 -18
  674. package/src/langium/workspace/file-not-found.ts +35 -0
  675. package/src/langium/workspace/file-system-provider.ts +258 -16
  676. package/src/langium/workspace/hydranium-langium-document-factory.ts +83 -0
  677. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
  678. package/src/langium/workspace/hydranium-workspace-manager.ts +241 -35
  679. package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
  680. package/src/langium/workspace/index.ts +1 -0
  681. package/src/langium/workspace/initialize-workspace.ts +129 -8
  682. package/src/langium/workspace/langium-documents.ts +19 -1
  683. package/src/langium/workspace/persistent-file-system-provider.ts +27 -15
  684. package/src/langium/workspace/self-save-registry.ts +118 -0
  685. package/src/langium/workspace/virtual-document.ts +106 -25
  686. package/src/langium/workspace/write-lock-scope.ts +27 -12
  687. package/src/launcher/integrated-server.ts +3 -1
  688. package/src/locale/index.ts +10 -0
  689. package/src/locale/server-locale.ts +86 -0
  690. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  691. package/src/lsp/connection-features.ts +67 -0
  692. package/src/lsp/diagnostics-connection.ts +56 -0
  693. package/src/lsp/hydranium-document-update-handler.ts +285 -111
  694. package/src/lsp/index.ts +4 -1
  695. package/src/lsp/lsp-latency.ts +62 -0
  696. package/src/lsp/save-text-document.ts +63 -0
  697. package/src/lsp/semantic-token-provider.ts +74 -7
  698. package/src/lsp/shared-module.ts +4 -8
  699. package/src/lsp/start-language-server.ts +13 -7
  700. package/src/messages/carriers.ts +23 -15
  701. package/src/messages/index.ts +13 -1
  702. package/src/messages/renderer.ts +212 -0
  703. package/src/node/event-loop-monitor.ts +2 -1
  704. package/src/node/heap-ceiling.ts +108 -0
  705. package/src/node/index.ts +5 -1
  706. package/src/node/latency-from-env.ts +1 -1
  707. package/src/node/log-preamble-node.ts +20 -10
  708. package/src/node/measure-memory.ts +5 -4
  709. package/src/node/memory-monitor.ts +10 -10
  710. package/src/node/node-file-system-provider.ts +214 -57
  711. package/src/node/profile-capture.ts +16 -15
  712. package/src/node/profiling-run.ts +30 -8
  713. package/src/node/rename-over-open-readers.ts +94 -0
  714. package/src/node/server-diagnostics.ts +1 -1
  715. package/src/node/server-state-snapshot.ts +5 -5
  716. package/src/node/socket-launcher.ts +78 -14
  717. package/src/node/startup-cpu-profile.ts +94 -0
  718. package/src/node/stdio-launcher.ts +29 -19
  719. package/src/testing/document-uri-policy-conformance.ts +1 -1
  720. package/src/testing/fake-document.ts +2 -1
  721. package/src/testing/index.ts +2 -1
  722. package/src/testing/langium-test-helpers.ts +1 -0
  723. package/src/testing/make-noop-shared-services.ts +50 -2
  724. package/src/testing/make-test-services.ts +125 -31
  725. package/src/testing/make-test-tracer.ts +26 -0
  726. package/src/testing/node/applied-edit-capture.ts +141 -0
  727. package/src/testing/node/index.ts +1 -0
  728. package/src/testing/node/lsp-harness.ts +2 -0
  729. package/src/testing/node/lsp-server-connection.ts +83 -119
  730. package/src/testing/node/scratch-workspace.ts +10 -5
  731. package/src/testing/node/spawned-server.ts +57 -3
  732. package/src/testing/node/unhandled-rejections.ts +31 -0
  733. package/src/testing/parse-semantic-root.ts +1 -1
  734. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  735. package/src/testing/playwright/index.ts +1 -0
  736. package/src/testing/playwright/server-log-capture.ts +137 -47
  737. package/src/testing/playwright/server-log-fixture.ts +46 -6
  738. package/src/testing/playwright/server-log-region.ts +32 -0
  739. package/src/testing/playwright/server-log-rename-reporter.ts +4 -3
  740. package/src/testing/run-update-pipeline.ts +8 -5
  741. package/src/testing/stub-ast-document-manager.ts +47 -128
  742. package/src/testing/stub-document-builder.ts +133 -18
  743. package/src/testing/stub-hydranium-text-documents.ts +184 -27
  744. package/src/testing/stub-langium-documents.ts +3 -2
  745. package/src/testing/stub-model-service.ts +11 -10
  746. package/src/testing/stub-self-save-registry.ts +1 -1
  747. package/src/testing/stub-service-registry.ts +1 -1
  748. package/src/testing/stub-writable-file-system.ts +3 -2
  749. package/src/util/connection-liveness.ts +67 -15
  750. package/src/util/environment.ts +9 -1
  751. package/lib/documents/language-client-text-shadow.d.ts +0 -101
  752. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  753. package/lib/documents/language-client-text-shadow.js +0 -156
  754. package/lib/documents/language-client-text-shadow.js.map +0 -1
  755. package/lib/documents/self-save-registry.d.ts +0 -55
  756. package/lib/documents/self-save-registry.d.ts.map +0 -1
  757. package/lib/documents/self-save-registry.js.map +0 -1
  758. package/lib/lsp/instrument-connection.d.ts +0 -36
  759. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  760. package/lib/lsp/instrument-connection.js +0 -62
  761. package/lib/lsp/instrument-connection.js.map +0 -1
  762. package/lib/node/process-memory.d.ts +0 -66
  763. package/lib/node/process-memory.d.ts.map +0 -1
  764. package/lib/node/process-memory.js +0 -252
  765. package/lib/node/process-memory.js.map +0 -1
  766. package/src/documents/language-client-text-shadow.ts +0 -175
  767. package/src/documents/self-save-registry.ts +0 -81
  768. package/src/lsp/instrument-connection.ts +0 -66
  769. package/src/node/process-memory.ts +0 -299
@@ -0,0 +1,94 @@
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 { type Clock, SystemClock } from '@hydranium/protocol';
11
+ import * as fsp from 'node:fs/promises';
12
+
13
+ /**
14
+ * Errnos Windows raises when a replacing `rename` meets a handle already on the
15
+ * destination open. POSIX renames are unaffected by open handles, so these
16
+ * cannot fire there and the retry below costs nothing.
17
+ */
18
+ export const RENAME_CONTENTION_CODES = new Set(['EPERM', 'EACCES', 'EBUSY']);
19
+
20
+ /**
21
+ * How long a replacing rename may keep retrying before it gives up.
22
+ *
23
+ * BOUNDED, not open-ended: a genuine permission fault raises the same errno as
24
+ * contention and is distinguishable from it only by never clearing, so an
25
+ * unbounded wait would convert a hard error into a hang.
26
+ *
27
+ * The figure is a judgement, not a measurement, and the honest bound on it is
28
+ * that the previous 2s was observed EXHAUSTED on a loaded Windows CI runner
29
+ * while no upper bound has been established. What would settle it is recording
30
+ * how long a real contended rename takes to clear. graceful-fs tolerates 60s
31
+ * for Windows rename contention, but that is weaker support than it looks: it
32
+ * retries only where the destination has GONE, which is the opposite of
33
+ * replacing one a reader holds open.
34
+ */
35
+ export const RENAME_BUDGET_MS = 10_000;
36
+
37
+ /**
38
+ * How long a miss is waited out on Windows before it counts as an absence,
39
+ * since a replacing rename there can hide the name from a reader for a while.
40
+ * Bounded: a real deletion differs only by never ending, so it pays the whole
41
+ * budget. The figure is a judgement, not an established bound.
42
+ */
43
+ export const RENAME_GAP_BUDGET_MS = 2_000;
44
+
45
+ /** Seams for the test, which cannot make a real rename fail on demand. */
46
+ export interface RenameOverOpenReadersOptions {
47
+ readonly rename?: (from: string, to: string) => Promise<void>;
48
+ readonly budgetMs?: number;
49
+ readonly clock?: Clock;
50
+ }
51
+
52
+ /**
53
+ * `rename` the staged content over `destination`, retrying while Windows
54
+ * reports the destination as held open.
55
+ *
56
+ * The staging file exists so a reader never sees a half-written file, and on
57
+ * Windows the very presence of that reader is what makes the replacing rename
58
+ * fail — so the indivisible write breaks under exactly the contention it was
59
+ * built for, and it breaks intermittently, which is worse than never working.
60
+ * A reader's handle is released in milliseconds, so waiting turns a spurious
61
+ * failure into a slightly later success.
62
+ *
63
+ * Exhausting the budget rethrows the last failure, leaving the caller's cleanup
64
+ * and error contract unchanged. An errno OUTSIDE the contention set is rethrown
65
+ * without waiting at all: retrying a fault that will not clear only delays it.
66
+ */
67
+ export async function renameOverOpenReaders(
68
+ staging: string,
69
+ destination: string,
70
+ options: RenameOverOpenReadersOptions = {}
71
+ ): Promise<void> {
72
+ const rename = options.rename ?? fsp.rename;
73
+ const clock = options.clock ?? new SystemClock();
74
+ const budgetMs = options.budgetMs ?? RENAME_BUDGET_MS;
75
+ // A stopwatch, not two `now()` readings: a wall-clock jump would end the
76
+ // budget early or stretch it.
77
+ const waited = clock.stopwatch();
78
+ for (let attempt = 0; ; attempt++) {
79
+ try {
80
+ await rename(staging, destination);
81
+ return;
82
+ } catch (err: unknown) {
83
+ const code = err instanceof Error && 'code' in err ? String((err as NodeJS.ErrnoException).code) : undefined;
84
+ if (code === undefined || !RENAME_CONTENTION_CODES.has(code) || waited.elapsedMs >= budgetMs) {
85
+ throw err;
86
+ }
87
+ // Backs off to keep a long contention window from spinning, capped so
88
+ // a late attempt still lands promptly once the handle is released.
89
+ // Not `clock.setTimer`: it unrefs its timer, so a process with only
90
+ // this write pending could exit mid-backoff.
91
+ await new Promise(resolve => setTimeout(resolve, Math.min(2 ** attempt, 50)));
92
+ }
93
+ }
94
+ }
@@ -49,7 +49,7 @@ export function startServerDiagnostics(shared: ServerSharedServicesMinimal, opti
49
49
  productName,
50
50
  version,
51
51
  phaseDetailThresholdMs,
52
- ...nodeLogPreambleSections(phaseDetailThresholdMs)
52
+ ...nodeLogPreambleSections(phaseDetailThresholdMs, options)
53
53
  });
54
54
  if (options.logInitialMemory ?? true) {
55
55
  shared.Tracer.for('Process').memory('Initial Memory');
@@ -7,7 +7,7 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
- import { Format } from '@hydranium/protocol';
10
+ import { Format, type Stopwatch, SystemClock } from '@hydranium/protocol';
11
11
  import { DocumentState, type LangiumDocuments } from '@hydranium/langium';
12
12
  import { isCstShed } from '../langium/residency/cst-residency-service.js';
13
13
  import { performance } from 'node:perf_hooks';
@@ -15,7 +15,7 @@ import * as v8 from 'node:v8';
15
15
 
16
16
  /** Cumulative samples kept across calls so each snapshot can report deltas. */
17
17
  interface DeltaState {
18
- atMs: number;
18
+ sinceSample: Stopwatch;
19
19
  cpu: NodeJS.CpuUsage;
20
20
  elu: { idle: number; active: number };
21
21
  }
@@ -62,7 +62,7 @@ export interface ServerStateSnapshotOptions {
62
62
  * requested via `options` ({@link ServerStateSnapshotOptions}).
63
63
  */
64
64
  export function formatServerState(documents?: LangiumDocuments, label?: string, options?: ServerStateSnapshotOptions): string {
65
- const now = performance.now();
65
+ const sinceSample = new SystemClock().stopwatch();
66
66
  const mem = process.memoryUsage();
67
67
  const heap = v8.getHeapStatistics();
68
68
  const cpu = process.cpuUsage();
@@ -87,7 +87,7 @@ export function formatServerState(documents?: LangiumDocuments, label?: string,
87
87
  `native contexts ${heap.number_of_native_contexts}, detached contexts ${heap.number_of_detached_contexts}`
88
88
  );
89
89
  if (lastSample) {
90
- const wallMs = now - lastSample.atMs;
90
+ const wallMs = lastSample.sinceSample.elapsedMs;
91
91
  const userMs = (cpu.user - lastSample.cpu.user) / 1000;
92
92
  const systemMs = (cpu.system - lastSample.cpu.system) / 1000;
93
93
  const cpuPct = wallMs > 0 ? Math.round(((userMs + systemMs) / wallMs) * 100) : 0;
@@ -138,7 +138,7 @@ export function formatServerState(documents?: LangiumDocuments, label?: string,
138
138
  }
139
139
  }
140
140
 
141
- lastSample = { atMs: now, cpu, elu };
141
+ lastSample = { sinceSample, cpu, elu };
142
142
  return lines.join('\n');
143
143
  }
144
144
 
@@ -7,17 +7,30 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
- import { Deferred } from '@hydranium/langium';
11
10
  import * as net from 'node:net';
12
- import type { Disposable, Logger } from '@hydranium/protocol';
11
+ import { Deferred, describeError, describeErrorWithStack, type Disposable, type Logger } from '@hydranium/protocol';
13
12
  import { createMessageConnection, SocketMessageReader, SocketMessageWriter } from 'vscode-jsonrpc/node';
14
13
  import type { MessageConnection } from 'vscode-jsonrpc';
15
14
  import type { IntegratedServer } from '../launcher/integrated-server.js';
15
+ import type { ServerSharedServicesMinimal } from '../langium/shared-services.js';
16
+ import { initializeWorkspaceWithoutLsp, type WorkspaceFolderInput } from '../langium/workspace/initialize-workspace.js';
16
17
 
17
18
  /**
18
19
  * Construction-time options for {@link startSocketServer}.
19
20
  */
20
21
  export interface SocketServerOptions {
22
+ /**
23
+ * Shared services tree the head serves from. Without an LSP head the
24
+ * launcher brings its workspace up before listening, so a client never
25
+ * reaches a workspace that is not up.
26
+ */
27
+ readonly shared: ServerSharedServicesMinimal;
28
+ /**
29
+ * Workspace root(s) to initialize — a filesystem path or a `URI`. Required
30
+ * when no LSP head is composed, refused beside one: see
31
+ * {@link initializeWorkspaceWithoutLsp}.
32
+ */
33
+ readonly workspace?: WorkspaceFolderInput | ReadonlyArray<WorkspaceFolderInput>;
21
34
  /**
22
35
  * Port to bind. Default `0` — OS-assigned ephemeral. Resolve the
23
36
  * actual port off {@link StartedSocketServer.port} once `started`
@@ -25,9 +38,25 @@ export interface SocketServerOptions {
25
38
  */
26
39
  readonly port?: number;
27
40
  /**
28
- * Optional logger. If omitted, the launcher runs silently — the
29
- * adopter is expected to surface lifecycle events through their own
30
- * logging in {@link OnClientConnection} if needed.
41
+ * Interface to bind. Default `'127.0.0.1'` (LOCAL ONLY) — a head whose
42
+ * port is OS-assigned and announced over the LSP connection is
43
+ * reachable only by a client on the same machine anyway, so a wider
44
+ * binding exposes a port nothing off-box can address. Matches
45
+ * `startGlspServer`'s default, so the two socket heads agree.
46
+ *
47
+ * Pass `'::'` for every interface: that is the dual-stack any-address,
48
+ * so both IPv4 and IPv6 clients connect. `'0.0.0.0'` is NOT the same —
49
+ * it takes IPv4 only and refuses `::1`.
50
+ *
51
+ * An address no local interface holds fails the bind, so `started`
52
+ * rejects with `EADDRNOTAVAIL` rather than falling back to a wider one.
53
+ */
54
+ readonly host?: string;
55
+ /**
56
+ * Optional logger for lifecycle lines and each connection's protocol
57
+ * faults. If omitted, the launcher runs silently — the adopter is expected
58
+ * to surface lifecycle events through their own logging in
59
+ * {@link OnClientConnection} if needed.
31
60
  */
32
61
  readonly logger?: Logger;
33
62
  /** Tag included in lifecycle log lines. Default `"SocketServer"`. */
@@ -56,10 +85,12 @@ export type OnClientConnection = (connection: MessageConnection) => Disposable;
56
85
  /**
57
86
  * Live socket server handle returned by {@link startSocketServer}.
58
87
  *
59
- * - {@link IntegratedServer.started} resolves once `listen` resolves
60
- * AND `port` is populated.
88
+ * - {@link IntegratedServer.started} resolves once the workspace is up,
89
+ * where the launcher brings it up, AND `listen` resolves AND `port` is
90
+ * populated. It rejects, and nothing listens, when the bring-up fails.
61
91
  * - {@link IntegratedServer.stopped} resolves when the underlying
62
- * `net.Server` emits `close`.
92
+ * `net.Server` emits `close`, or once a failed bring-up has rejected
93
+ * `started`.
63
94
  * - {@link port} is undefined until `started` resolves.
64
95
  * - {@link close} triggers shutdown: disposes all active client
65
96
  * connections and closes the underlying `net.Server`.
@@ -82,12 +113,17 @@ export interface StartedSocketServer extends IntegratedServer {
82
113
  * close / server shutdown. Adopters keep per-client instance creation
83
114
  * (their server objects) but don't re-implement the tracking machinery.
84
115
  *
116
+ * **Without an LSP head the launcher brings the workspace up, then
117
+ * listens**, as `startStdioServer` does: a request served before the
118
+ * bring-up starts keeps its cross-file references unresolved for good.
119
+ *
85
120
  * The port is only known once {@link StartedSocketServer.started} has
86
121
  * resolved, so announcing it — via {@link publishPortOnLspConnection} —
87
122
  * belongs after that await, not beside the call.
88
123
  */
89
124
  export function startSocketServer(options: SocketServerOptions, onClientConnection: OnClientConnection): StartedSocketServer {
90
125
  const port = options.port ?? 0;
126
+ const host = options.host ?? '127.0.0.1';
91
127
  const logger = options.logger;
92
128
  const tag = options.logTag ?? 'SocketServer';
93
129
  const started = new Deferred<void>();
@@ -100,7 +136,7 @@ export function startSocketServer(options: SocketServerOptions, onClientConnecti
100
136
  const activeConnections: Array<{ connection: MessageConnection; adopterDisposable: Disposable }> = [];
101
137
 
102
138
  const netServer = net.createServer(socket => {
103
- const connection = createMessageConnection(new SocketMessageReader(socket), new SocketMessageWriter(socket));
139
+ const connection = createMessageConnection(new SocketMessageReader(socket), new SocketMessageWriter(socket), logger?.with(tag));
104
140
  const adopterDisposable = onClientConnection(connection);
105
141
  const entry = { connection, adopterDisposable };
106
142
  activeConnections.push(entry);
@@ -115,7 +151,7 @@ export function startSocketServer(options: SocketServerOptions, onClientConnecti
115
151
  try {
116
152
  adopterDisposable.dispose();
117
153
  } catch (err) {
118
- logger?.warn(`[${tag}] Adopter disposable threw on cleanup: ${(err as Error)?.message ?? err}`);
154
+ logger?.warn(`[${tag}] Adopter disposable threw on cleanup: ${describeErrorWithStack(err)}`);
119
155
  }
120
156
  connection.dispose();
121
157
  const idx = activeConnections.indexOf(entry);
@@ -128,7 +164,34 @@ export function startSocketServer(options: SocketServerOptions, onClientConnecti
128
164
  connection.listen();
129
165
  });
130
166
 
131
- netServer.listen(port);
167
+ // The workspace manager logs a failed initialization itself; a refused
168
+ // `workspace` throws before `initializing` is set.
169
+ let initializing = false;
170
+ let closed = false;
171
+ const begin = async (): Promise<void> => {
172
+ const initialization = initializeWorkspaceWithoutLsp(options.shared, options.workspace);
173
+ initializing = true;
174
+ await initialization;
175
+ initializing = false;
176
+ // A `close` during the bring-up has resolved `stopped` already.
177
+ if (closed) {
178
+ started.reject(new Error(`${tag} was closed before it listened`));
179
+ return;
180
+ }
181
+ netServer.listen(port, host);
182
+ };
183
+ begin().catch((err: unknown) => {
184
+ if (initializing) {
185
+ logger?.debug(`[${tag}] Startup failed: the workspace did not initialize. ${describeError(err)}`);
186
+ } else {
187
+ logger?.error(`[${tag}] Startup failed: ${describeErrorWithStack(err)}`);
188
+ }
189
+ started.reject(err);
190
+ stopped.resolve();
191
+ });
192
+ // `started` is always observed internally, as `startStdioServer`'s is, so a
193
+ // caller that closes early and ignores it cannot crash the process.
194
+ void started.promise.catch(() => undefined);
132
195
  netServer.on('listening', () => {
133
196
  const addressInfo = netServer.address();
134
197
  if (!addressInfo) {
@@ -144,11 +207,11 @@ export function startSocketServer(options: SocketServerOptions, onClientConnecti
144
207
  return;
145
208
  }
146
209
  handle.port = addressInfo.port;
147
- logger?.info(`[${tag}] Ready to accept new client requests on port: ${addressInfo.port}`);
210
+ logger?.info(`[${tag}] Ready to accept new client requests on ${addressInfo.address} port: ${addressInfo.port}`);
148
211
  started.resolve();
149
212
  });
150
213
  netServer.on('error', err => {
151
- logger?.error(`[${tag}] Error: ${err.message}`);
214
+ logger?.error(`[${tag}] Error: ${describeErrorWithStack(err)}`);
152
215
  started.reject(err);
153
216
  });
154
217
  netServer.on('close', () => {
@@ -158,7 +221,7 @@ export function startSocketServer(options: SocketServerOptions, onClientConnecti
158
221
  try {
159
222
  entry.adopterDisposable.dispose();
160
223
  } catch (err) {
161
- logger?.warn(`[${tag}] Adopter disposable threw on shutdown: ${(err as Error)?.message ?? err}`);
224
+ logger?.warn(`[${tag}] Adopter disposable threw on shutdown: ${describeErrorWithStack(err)}`);
162
225
  }
163
226
  entry.connection.dispose();
164
227
  }
@@ -173,6 +236,7 @@ export function startSocketServer(options: SocketServerOptions, onClientConnecti
173
236
  started: started.promise,
174
237
  stopped: stopped.promise,
175
238
  close(): void {
239
+ closed = true;
176
240
  netServer.close();
177
241
  }
178
242
  };
@@ -0,0 +1,94 @@
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 { DEFAULT_CPU_PROFILE_FILE_ENV } from '@hydranium/protocol';
11
+ import { mkdirSync, writeFileSync } from 'node:fs';
12
+ import { Session } from 'node:inspector';
13
+ import { dirname } from 'node:path';
14
+ import { isMainThread } from 'node:worker_threads';
15
+ import { expandLogFilePlaceholders } from '../langium/diagnostics/logger.js';
16
+
17
+ /**
18
+ * Marks the profile started on `globalThis` rather than in this module, since
19
+ * a second installed copy of the package loads its own module and would start
20
+ * a second session writing a profile of its own.
21
+ */
22
+ const CPU_PROFILE_STARTED: unique symbol = Symbol.for('@hydranium/core#startupCpuProfileStarted');
23
+ const processGlobal = globalThis as typeof globalThis & { [CPU_PROFILE_STARTED]?: true };
24
+
25
+ /**
26
+ * Start profiling this process when {@link DEFAULT_CPU_PROFILE_FILE_ENV} is
27
+ * set, and write the profile once, on `exit` or on SIGTERM. Called when
28
+ * `@hydranium/core/node` loads, so every Node head is profiled from before its
29
+ * workspace load; a no-op on a second call, from any copy of the package, and
30
+ * in a `worker_threads` worker.
31
+ *
32
+ * `--cpu-prof` is no substitute: it writes only on a normal exit, and SIGTERM
33
+ * ends a process without one. The SIGTERM listener re-raises the signal when it
34
+ * is the only one, so the process still ends by it; another listener keeps
35
+ * control of the ending. Samples accumulate for the life of the process, so
36
+ * this is for test runs, not a production server.
37
+ *
38
+ * A head in a worker is not profiled: a worker's session would write the main
39
+ * thread's file, since threads share the pid, no signal reaches it, and its
40
+ * `exit` listeners run neither when it is terminated nor when the process ends.
41
+ *
42
+ * A `ProfileCapture` window runs beside it in its own inspector session.
43
+ */
44
+ export function startCpuProfileFromEnv(): void {
45
+ const template = process.env[DEFAULT_CPU_PROFILE_FILE_ENV];
46
+ if (!template || !isMainThread || processGlobal[CPU_PROFILE_STARTED]) {
47
+ return;
48
+ }
49
+ processGlobal[CPU_PROFILE_STARTED] = true;
50
+ const session = new Session();
51
+ session.connect();
52
+ session.post('Profiler.enable');
53
+ session.post('Profiler.start');
54
+ let written = false;
55
+ // Synchronous throughout: an in-process session answers `post` before it
56
+ // returns, and nothing asynchronous runs after `exit`. The session is
57
+ // disconnected from the answer, so nothing here depends on that order.
58
+ const write = (): void => {
59
+ if (written) {
60
+ return;
61
+ }
62
+ written = true;
63
+ const file = expandLogFilePlaceholders(template);
64
+ session.post('Profiler.stop', (error, result) => {
65
+ try {
66
+ if (error) {
67
+ throw error;
68
+ }
69
+ mkdirSync(dirname(file), { recursive: true });
70
+ writeFileSync(file, JSON.stringify(result.profile));
71
+ } catch (err: unknown) {
72
+ process.stderr.write(
73
+ `[hydranium] Could not write the CPU profile to ${file}: ${err instanceof Error ? err.message : String(err)}\n`
74
+ );
75
+ }
76
+ session.disconnect();
77
+ });
78
+ };
79
+ process.once('exit', write);
80
+ // Registered until the write is done, not `once`: a `once` listener is gone
81
+ // before it runs, and with no listener left the default action ends the
82
+ // process on a second SIGTERM, which a host ending its process tree sends
83
+ // while the write is still running. Prepended: a `once` listener ahead of
84
+ // this one has removed itself by the time this counts, which would re-raise
85
+ // into its unfinished shutdown.
86
+ const writeOnSigterm = (): void => {
87
+ write();
88
+ process.removeListener('SIGTERM', writeOnSigterm);
89
+ if (process.listenerCount('SIGTERM') === 0) {
90
+ process.kill(process.pid, 'SIGTERM');
91
+ }
92
+ };
93
+ process.prependListener('SIGTERM', writeOnSigterm);
94
+ }
@@ -7,13 +7,12 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
- import { Deferred } from '@hydranium/langium';
11
- import type { Disposable, Logger } from '@hydranium/protocol';
10
+ import { Deferred, type Disposable, type Logger, describeError, describeErrorWithStack } from '@hydranium/protocol';
12
11
  import type { MessageConnection } from 'vscode-jsonrpc';
13
12
  import { createMessageConnection, StreamMessageReader, StreamMessageWriter } from 'vscode-jsonrpc/node';
14
13
  import type { IntegratedServer } from '../launcher/integrated-server.js';
15
14
  import type { ServerSharedServicesMinimal } from '../langium/shared-services.js';
16
- import { initializeWorkspaceProgrammatically, type WorkspaceFolderInput } from '../langium/workspace/initialize-workspace.js';
15
+ import { initializeWorkspaceWithoutLsp, type WorkspaceFolderInput } from '../langium/workspace/initialize-workspace.js';
17
16
 
18
17
  /** Construction-time options for {@link startStdioServer}. */
19
18
  export interface StdioServerOptions {
@@ -24,16 +23,17 @@ export interface StdioServerOptions {
24
23
  */
25
24
  readonly shared: ServerSharedServicesMinimal;
26
25
  /**
27
- * Workspace root(s) to initialize — a filesystem path or a `URI`. Omit when
28
- * the caller has already initialized the workspace itself, in which case the
29
- * launcher only wires the transport.
26
+ * Workspace root(s) to initialize — a filesystem path or a `URI`. Required
27
+ * when no LSP head is composed, refused beside one: see
28
+ * {@link initializeWorkspaceWithoutLsp}.
30
29
  */
31
30
  readonly workspace?: WorkspaceFolderInput | ReadonlyArray<WorkspaceFolderInput>;
32
31
  /**
33
- * Optional logger for lifecycle lines. Omitted means silent — note that a
34
- * logger writing to **stdout** would corrupt this head's protocol stream, so
35
- * anything passed here must sink elsewhere. The framework's own `LspLogger`
36
- * writes to stderr when no LSP connection is bound, which is correct here.
32
+ * Optional logger for lifecycle lines and the connection's protocol
33
+ * faults. Omitted means silent — note that a logger writing to **stdout**
34
+ * would corrupt this head's protocol stream, so anything passed here must
35
+ * sink elsewhere. The framework's own `LspLogger` writes to stderr when no
36
+ * LSP connection is bound, which is correct here.
37
37
  */
38
38
  readonly logger?: Logger;
39
39
  /** Tag included in lifecycle log lines. Default `"StdioServer"`. */
@@ -66,11 +66,10 @@ export interface StartedStdioServer extends IntegratedServer {
66
66
 
67
67
  /**
68
68
  * Start a **stdio**-based protocol head — the transport `hydranium-cli` speaks,
69
- * since `query` / `save` / `projects` / `watch` all spawn a server command and
70
- * drive JSON-RPC over its stdin/stdout. The socket counterpart is
71
- * `startSocketServer`; the two differ more
72
- * than the transport swap suggests, and the differences are the reason this is
73
- * a launcher rather than four lines in each adopter's entry.
69
+ * since its data-server subcommands spawn a server command and drive JSON-RPC
70
+ * over its stdin/stdout. The socket counterpart is `startSocketServer`; the two
71
+ * differ more than the transport swap suggests, and the differences are the
72
+ * reason this is a launcher rather than four lines in each adopter's entry.
74
73
  *
75
74
  * **One client, not N.** A socket head accepts arbitrarily many connections and
76
75
  * tracks them; a stdio head has exactly one peer — the process that spawned it
@@ -101,7 +100,8 @@ export function startStdioServer(
101
100
 
102
101
  const connection = createMessageConnection(
103
102
  new StreamMessageReader(options.input ?? process.stdin),
104
- new StreamMessageWriter(options.output ?? process.stdout)
103
+ new StreamMessageWriter(options.output ?? process.stdout),
104
+ logger?.with(tag)
105
105
  );
106
106
  const adopterDisposable = onConnection(connection);
107
107
 
@@ -114,18 +114,24 @@ export function startStdioServer(
114
114
  try {
115
115
  adopterDisposable.dispose();
116
116
  } catch (err: unknown) {
117
- logger?.warn(`[${tag}] Adopter disposable threw on cleanup: ${err instanceof Error ? err.message : String(err)}`);
117
+ logger?.warn(`[${tag}] Adopter disposable threw on cleanup: ${describeErrorWithStack(err)}`);
118
118
  }
119
119
  connection.dispose();
120
120
  stopped.resolve();
121
121
  };
122
122
  connection.onClose(() => close());
123
123
 
124
+ // The workspace manager logs a failed initialization itself; a refused
125
+ // `workspace` throws before `initializing` is set.
126
+ let initializing = false;
124
127
  const begin = async (): Promise<void> => {
128
+ const initialization = initializeWorkspaceWithoutLsp(options.shared, options.workspace);
129
+ initializing = true;
125
130
  if (options.workspace !== undefined) {
126
131
  logger?.info(`[${tag}] Initializing workspace`);
127
- await initializeWorkspaceProgrammatically(options.shared, options.workspace);
128
132
  }
133
+ await initialization;
134
+ initializing = false;
129
135
  // Only now attach the reader — see the ordering note in the doc above.
130
136
  connection.listen();
131
137
  logger?.info(`[${tag}] Listening on stdio`);
@@ -137,7 +143,11 @@ export function startStdioServer(
137
143
  // A failed startup must not leave a half-live head: report it on
138
144
  // `started` and tear the connection down rather than listening over an
139
145
  // uninitialized workspace.
140
- logger?.error(`[${tag}] Startup failed: ${err instanceof Error ? err.message : String(err)}`);
146
+ if (initializing) {
147
+ logger?.debug(`[${tag}] Startup failed: the workspace did not initialize. ${describeError(err)}`);
148
+ } else {
149
+ logger?.error(`[${tag}] Startup failed: ${describeErrorWithStack(err)}`);
150
+ }
141
151
  started.reject(err);
142
152
  close();
143
153
  }
@@ -96,7 +96,7 @@ export function documentUriPolicyConformance(
96
96
  // Computed here rather than tallied from the assertions above, so the
97
97
  // guard does not depend on the runner executing tests in declaration
98
98
  // order (a `--shuffle` run would otherwise read it as zero).
99
- it(`at least one sample URI is loadable (checked: ${sampleUris.join(', ')})`, () => {
99
+ it(`at least one sample URI is loadable among ${sampleUris.join(', ')}`, () => {
100
100
  const loadable = sampleUris.filter(uri => makePolicy().loadUri(uri) !== undefined);
101
101
  expect(loadable.length > 0).toBe(true);
102
102
  });
@@ -9,6 +9,7 @@
9
9
 
10
10
  import { DocumentState, type AstNode, type AstReflection, type LangiumDocument, UriUtils, type URI } from '@hydranium/langium';
11
11
  import { buildAstNode } from '../langium/ast-extension/ast-node-builder.js';
12
+ import { type AstDiagnostic } from '../langium/validation/document-validator.js';
12
13
 
13
14
  /**
14
15
  * Build a typed AST-node fixture for unit tests.
@@ -104,7 +105,7 @@ function stringifyFakeRoot(root: unknown): string {
104
105
  * staging. Override via `options.state` for tests that gate on earlier
105
106
  * phases.
106
107
  */
107
- export function makeFakeDocument<TAst extends AstNode = AstNode, TDiagnostic = unknown>(
108
+ export function makeFakeDocument<TAst extends AstNode = AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic>(
108
109
  uri: string | URI,
109
110
  root: TAst,
110
111
  options: FakeDocumentOptions<TAst, TDiagnostic> = {}
@@ -14,7 +14,7 @@
14
14
  * builders, the snapshot and URI-policy conformance primitives, the
15
15
  * structured-write pipeline driver, and a re-export of `langium/test`.
16
16
  *
17
- * Neutrality is gated (`scripts/check-neutral-bundles.mjs`). The test support
17
+ * Neutrality is gated (`scripts/check-neutral-bundles.mts`). The test support
18
18
  * that needs a real filesystem or a Node stream transport — the scratch
19
19
  * workspace, the golden corpus, the LSP transport and its harness — lives at
20
20
  * `@hydranium/core/testing/node`, on the same rule the package surface uses:
@@ -26,6 +26,7 @@ export * from './document-uri-policy-conformance.js';
26
26
  export * from './fake-description.js';
27
27
  export * from './fake-document.js';
28
28
  export * from './fake-reflection.js';
29
+ // oxlint-disable-next-line import/export -- misreads export * from an npm package: https://github.com/oxc-project/oxc/pull/26872
29
30
  export * from './langium-test-helpers.js';
30
31
  export * from './make-noop-language-services.js';
31
32
  export * from './make-noop-shared-services.js';
@@ -23,4 +23,5 @@
23
23
  * contracts stays Langium upstream, so a rename there surfaces here rather than
24
24
  * being absorbed by a hand-maintained list.
25
25
  */
26
+ // oxlint-disable-next-line import/export -- misreads export * from an npm package: https://github.com/oxc-project/oxc/pull/26872
26
27
  export * from '@hydranium/langium/test';
@@ -9,6 +9,8 @@
9
9
 
10
10
  import { type Clock, DefaultTracer, type Logger, NoopLogger, SystemClock, type Tracer } from '@hydranium/protocol';
11
11
  import type { ServerSharedServicesMinimal } from '../langium/shared-services.js';
12
+ import { DefaultServerLocale, type ServerLocale } from '../locale/server-locale.js';
13
+ import { DefaultMessageRenderer, type MessageRenderer } from '../messages/renderer.js';
12
14
 
13
15
  /**
14
16
  * Overrides for {@link makeNoopSharedServices}. The three observability slots
@@ -29,6 +31,18 @@ export interface NoopSharedServicesOverrides {
29
31
  Logger?: Logger;
30
32
  /** Bound on the top-level `Tracer` slot. Default: a `DefaultTracer` over `Logger` + `Clock`. */
31
33
  Tracer?: Tracer;
34
+ /** Factory for the `ServerLocale` slot. Default: a real one, reporting no locale. */
35
+ ServerLocale?: (services: ServerSharedServicesMinimal) => ServerLocale;
36
+ /**
37
+ * Factory for the `MessageRenderer` slot. Default: the real
38
+ * {@link DefaultMessageRenderer}, whose no-catalogue behaviour is a
39
+ * pass-through — so the default is the framework's own behaviour, not a stub.
40
+ *
41
+ * A factory rather than an instance, because a renderer reads the tree it is
42
+ * bound into. Both slots are resolved lazily, so an override is honoured
43
+ * however late the caller reads them.
44
+ */
45
+ MessageRenderer?: (services: ServerSharedServicesMinimal) => MessageRenderer;
32
46
  /** Per-slot `workspace` overrides. Slots left out resolve to `undefined`. */
33
47
  workspace?: Record<string, unknown>;
34
48
  /** Any other minimal slot (`ServiceRegistry`, `AstReflection`, `additionalDocuments`, …). */
@@ -63,11 +77,21 @@ export interface NoopSharedServicesOverrides {
63
77
  export function makeNoopSharedServices<T extends ServerSharedServicesMinimal = ServerSharedServicesMinimal>(
64
78
  overrides: NoopSharedServicesOverrides = {}
65
79
  ): T {
66
- const { Clock: clock, Logger: logger, Tracer: tracer, workspace, additionalDocuments, ...restTop } = overrides;
80
+ const {
81
+ Clock: clock,
82
+ Logger: logger,
83
+ Tracer: tracer,
84
+ ServerLocale: serverLocale,
85
+ MessageRenderer: messageRenderer,
86
+ workspace,
87
+ additionalDocuments,
88
+ ...restTop
89
+ } = overrides;
67
90
  const resolvedClock = clock ?? new SystemClock();
68
91
  const resolvedLogger = logger ?? new NoopLogger();
69
92
  const resolvedTracer = tracer ?? new DefaultTracer(resolvedLogger, resolvedClock);
70
- return {
93
+ // Assembled in two steps, because both defaults read the tree they belong to.
94
+ const services = {
71
95
  Clock: resolvedClock,
72
96
  Logger: resolvedLogger,
73
97
  Tracer: resolvedTracer,
@@ -75,4 +99,28 @@ export function makeNoopSharedServices<T extends ServerSharedServicesMinimal = S
75
99
  ...restTop,
76
100
  workspace: { ...(workspace ?? {}) }
77
101
  } as unknown as T;
102
+ // Lazy, like Langium's own per-slot construction — and load-bearing here:
103
+ // both services emit an `instantiated` trace, so building them eagerly puts
104
+ // two lines into the capture of every test that passes a capturing logger
105
+ // and asserts on emptiness.
106
+ defineLazySlot(services, 'ServerLocale', () => serverLocale?.(services) ?? new DefaultServerLocale(services));
107
+ defineLazySlot(services, 'MessageRenderer', () => messageRenderer?.(services) ?? new DefaultMessageRenderer(services));
108
+ return services;
109
+ }
110
+
111
+ /** Install `name` as a memoized getter, so nothing is constructed until it is read. */
112
+ function defineLazySlot(target: object, name: string, create: () => unknown): void {
113
+ let resolved: unknown;
114
+ let built = false;
115
+ Object.defineProperty(target, name, {
116
+ configurable: true,
117
+ enumerable: true,
118
+ get: () => {
119
+ if (!built) {
120
+ resolved = create();
121
+ built = true;
122
+ }
123
+ return resolved;
124
+ }
125
+ });
78
126
  }