@hydranium/core 1.0.0-next.37 → 1.0.0-next.371

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 (798) 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 +254 -140
  19. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  20. package/lib/documents/ast-document-manager.js +311 -127
  21. package/lib/documents/ast-document-manager.js.map +1 -1
  22. package/lib/documents/client-ids.d.ts +5 -19
  23. package/lib/documents/client-ids.d.ts.map +1 -1
  24. package/lib/documents/client-ids.js +5 -19
  25. package/lib/documents/client-ids.js.map +1 -1
  26. package/lib/documents/client-session-errors.d.ts +15 -0
  27. package/lib/documents/client-session-errors.d.ts.map +1 -0
  28. package/lib/documents/client-session-errors.js +15 -0
  29. package/lib/documents/client-session-errors.js.map +1 -0
  30. package/lib/documents/client-session-registry.d.ts +146 -0
  31. package/lib/documents/client-session-registry.d.ts.map +1 -0
  32. package/lib/documents/client-session-registry.js +207 -0
  33. package/lib/documents/client-session-registry.js.map +1 -0
  34. package/lib/documents/dirty-state-tracker.d.ts +101 -0
  35. package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
  36. package/lib/documents/dirty-state-tracker.js +85 -0
  37. package/lib/documents/dirty-state-tracker.js.map +1 -0
  38. package/lib/documents/document-release-handler.d.ts +204 -0
  39. package/lib/documents/document-release-handler.d.ts.map +1 -0
  40. package/lib/documents/document-release-handler.js +317 -0
  41. package/lib/documents/document-release-handler.js.map +1 -0
  42. package/lib/documents/document-release-scheduler.d.ts +67 -0
  43. package/lib/documents/document-release-scheduler.d.ts.map +1 -0
  44. package/lib/documents/document-release-scheduler.js +80 -0
  45. package/lib/documents/document-release-scheduler.js.map +1 -0
  46. package/lib/documents/file-system-task-queue.d.ts +52 -0
  47. package/lib/documents/file-system-task-queue.d.ts.map +1 -0
  48. package/lib/documents/file-system-task-queue.js +37 -0
  49. package/lib/documents/file-system-task-queue.js.map +1 -0
  50. package/lib/documents/hydranium-text-documents.d.ts +445 -282
  51. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  52. package/lib/documents/hydranium-text-documents.js +903 -483
  53. package/lib/documents/hydranium-text-documents.js.map +1 -1
  54. package/lib/documents/index.d.ts +10 -2
  55. package/lib/documents/index.d.ts.map +1 -1
  56. package/lib/documents/index.js +10 -2
  57. package/lib/documents/index.js.map +1 -1
  58. package/lib/documents/language-client-shadow.d.ts +234 -0
  59. package/lib/documents/language-client-shadow.d.ts.map +1 -0
  60. package/lib/documents/language-client-shadow.js +306 -0
  61. package/lib/documents/language-client-shadow.js.map +1 -0
  62. package/lib/documents/model-ledger.d.ts +47 -0
  63. package/lib/documents/model-ledger.d.ts.map +1 -0
  64. package/lib/documents/model-ledger.js +30 -0
  65. package/lib/documents/model-ledger.js.map +1 -0
  66. package/lib/documents/text-ledger.d.ts +64 -0
  67. package/lib/documents/text-ledger.d.ts.map +1 -0
  68. package/lib/documents/text-ledger.js +63 -0
  69. package/lib/documents/text-ledger.js.map +1 -0
  70. package/lib/documents/version-sync-service.d.ts +138 -0
  71. package/lib/documents/version-sync-service.d.ts.map +1 -0
  72. package/lib/documents/version-sync-service.js +173 -0
  73. package/lib/documents/version-sync-service.js.map +1 -0
  74. package/lib/index.d.ts +3 -0
  75. package/lib/index.d.ts.map +1 -1
  76. package/lib/index.js +3 -0
  77. package/lib/index.js.map +1 -1
  78. package/lib/langium/ast-extension/ast-extension-service.d.ts +42 -31
  79. package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
  80. package/lib/langium/ast-extension/ast-extension-service.js +45 -19
  81. package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
  82. package/lib/langium/ast-extension/ast-node-builder.d.ts +12 -7
  83. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  84. package/lib/langium/ast-extension/ast-node-builder.js +25 -9
  85. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  86. package/lib/langium/bootstrap.d.ts +49 -36
  87. package/lib/langium/bootstrap.d.ts.map +1 -1
  88. package/lib/langium/bootstrap.js +75 -36
  89. package/lib/langium/bootstrap.js.map +1 -1
  90. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +9 -9
  91. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
  92. package/lib/langium/build-phase-pass/build-phase-pass-service.js +25 -16
  93. package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
  94. package/lib/langium/build-phase-pass/build-phase-pass.d.ts +20 -8
  95. package/lib/langium/build-phase-pass/build-phase-pass.d.ts.map +1 -1
  96. package/lib/langium/build-phase-pass/build-phase-pass.js +20 -0
  97. package/lib/langium/build-phase-pass/build-phase-pass.js.map +1 -1
  98. package/lib/langium/composite-ast-reflection.d.ts +46 -0
  99. package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
  100. package/lib/langium/composite-ast-reflection.js +97 -0
  101. package/lib/langium/composite-ast-reflection.js.map +1 -0
  102. package/lib/langium/config/configuration-provider.d.ts +81 -0
  103. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  104. package/lib/langium/config/configuration-provider.js +112 -0
  105. package/lib/langium/config/configuration-provider.js.map +1 -0
  106. package/lib/langium/config/index.d.ts +1 -0
  107. package/lib/langium/config/index.d.ts.map +1 -1
  108. package/lib/langium/config/index.js +1 -0
  109. package/lib/langium/config/index.js.map +1 -1
  110. package/lib/langium/config/settings.js.map +1 -1
  111. package/lib/langium/diagnostics/console-tee.d.ts +27 -0
  112. package/lib/langium/diagnostics/console-tee.d.ts.map +1 -0
  113. package/lib/langium/diagnostics/console-tee.js +141 -0
  114. package/lib/langium/diagnostics/console-tee.js.map +1 -0
  115. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +9 -20
  116. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
  117. package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
  118. package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
  119. package/lib/langium/diagnostics/log-preamble.js +1 -1
  120. package/lib/langium/diagnostics/log-preamble.js.map +1 -1
  121. package/lib/langium/diagnostics/logger.d.ts +25 -6
  122. package/lib/langium/diagnostics/logger.d.ts.map +1 -1
  123. package/lib/langium/diagnostics/logger.js +49 -17
  124. package/lib/langium/diagnostics/logger.js.map +1 -1
  125. package/lib/langium/diagnostics/lsp-logger.d.ts +25 -0
  126. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  127. package/lib/langium/diagnostics/lsp-logger.js +81 -46
  128. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  129. package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
  130. package/lib/langium/diagnostics/server-tracer.js.map +1 -1
  131. package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
  132. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  133. package/lib/langium/document-builder/build-pipeline-integration.js +43 -30
  134. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  135. package/lib/langium/document-builder/build-session.d.ts +6 -5
  136. package/lib/langium/document-builder/build-session.d.ts.map +1 -1
  137. package/lib/langium/document-builder/build-session.js +5 -5
  138. package/lib/langium/document-builder/build-session.js.map +1 -1
  139. package/lib/langium/document-builder/document-builder.d.ts +340 -39
  140. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  141. package/lib/langium/document-builder/document-builder.js +550 -81
  142. package/lib/langium/document-builder/document-builder.js.map +1 -1
  143. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  144. package/lib/langium/documentation/comment-provider.js.map +1 -1
  145. package/lib/langium/integration-services.d.ts +39 -23
  146. package/lib/langium/integration-services.d.ts.map +1 -1
  147. package/lib/langium/integration-services.js +7 -4
  148. package/lib/langium/integration-services.js.map +1 -1
  149. package/lib/langium/integrity/integrity-rule.d.ts +17 -8
  150. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  151. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  152. package/lib/langium/integrity/integrity-service.d.ts +95 -27
  153. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  154. package/lib/langium/integrity/integrity-service.js +303 -63
  155. package/lib/langium/integrity/integrity-service.js.map +1 -1
  156. package/lib/langium/keys/containment.d.ts +3 -2
  157. package/lib/langium/keys/containment.d.ts.map +1 -1
  158. package/lib/langium/keys/containment.js.map +1 -1
  159. package/lib/langium/keys/name-based-key-provider.d.ts +17 -10
  160. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  161. package/lib/langium/keys/name-based-key-provider.js +24 -12
  162. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  163. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  164. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  165. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  166. package/lib/langium/labeling/label-provider.js.map +1 -1
  167. package/lib/langium/language-module.d.ts +30 -5
  168. package/lib/langium/language-module.d.ts.map +1 -1
  169. package/lib/langium/language-module.js +21 -5
  170. package/lib/langium/language-module.js.map +1 -1
  171. package/lib/langium/model-service/client-session.d.ts +383 -0
  172. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  173. package/lib/langium/model-service/client-session.js +455 -0
  174. package/lib/langium/model-service/client-session.js.map +1 -0
  175. package/lib/langium/model-service/index.d.ts +2 -0
  176. package/lib/langium/model-service/index.d.ts.map +1 -1
  177. package/lib/langium/model-service/index.js +2 -0
  178. package/lib/langium/model-service/index.js.map +1 -1
  179. package/lib/langium/model-service/model-events.d.ts +68 -0
  180. package/lib/langium/model-service/model-events.d.ts.map +1 -0
  181. package/lib/langium/model-service/model-events.js +10 -0
  182. package/lib/langium/model-service/model-events.js.map +1 -0
  183. package/lib/langium/model-service/model-service.d.ts +440 -323
  184. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  185. package/lib/langium/model-service/model-service.js +601 -397
  186. package/lib/langium/model-service/model-service.js.map +1 -1
  187. package/lib/langium/module.d.ts +89 -30
  188. package/lib/langium/module.d.ts.map +1 -1
  189. package/lib/langium/module.js +39 -27
  190. package/lib/langium/module.js.map +1 -1
  191. package/lib/langium/naming/name-provider.d.ts +32 -7
  192. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  193. package/lib/langium/naming/name-provider.js +10 -4
  194. package/lib/langium/naming/name-provider.js.map +1 -1
  195. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  196. package/lib/langium/project/abstract-project-manager.d.ts +184 -13
  197. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  198. package/lib/langium/project/abstract-project-manager.js +336 -16
  199. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  200. package/lib/langium/project/project-change-event.d.ts +22 -3
  201. package/lib/langium/project/project-change-event.d.ts.map +1 -1
  202. package/lib/langium/project/project-manager.d.ts +28 -2
  203. package/lib/langium/project/project-manager.d.ts.map +1 -1
  204. package/lib/langium/project/single-project-manager.d.ts +7 -1
  205. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  206. package/lib/langium/project/single-project-manager.js +12 -0
  207. package/lib/langium/project/single-project-manager.js.map +1 -1
  208. package/lib/langium/residency/cst-residency-service.d.ts +15 -11
  209. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  210. package/lib/langium/residency/cst-residency-service.js +15 -3
  211. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  212. package/lib/langium/scope/ast-node-description-provider.d.ts +46 -10
  213. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  214. package/lib/langium/scope/ast-node-description-provider.js +88 -15
  215. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  216. package/lib/langium/scope/built-local-symbols.d.ts +12 -0
  217. package/lib/langium/scope/built-local-symbols.d.ts.map +1 -0
  218. package/lib/langium/scope/built-local-symbols.js +11 -0
  219. package/lib/langium/scope/built-local-symbols.js.map +1 -0
  220. package/lib/langium/scope/fallback-scope.d.ts +27 -0
  221. package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
  222. package/lib/langium/scope/fallback-scope.js +35 -0
  223. package/lib/langium/scope/fallback-scope.js.map +1 -0
  224. package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
  225. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  226. package/lib/langium/scope/hydranium-scope-computation.js +38 -39
  227. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  228. package/lib/langium/scope/hydranium-scope-provider.d.ts +122 -32
  229. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  230. package/lib/langium/scope/hydranium-scope-provider.js +217 -39
  231. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  232. package/lib/langium/scope/index.d.ts +1 -0
  233. package/lib/langium/scope/index.d.ts.map +1 -1
  234. package/lib/langium/scope/index.js +1 -0
  235. package/lib/langium/scope/index.js.map +1 -1
  236. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  237. package/lib/langium/scope/reference-builder.js.map +1 -1
  238. package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
  239. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  240. package/lib/langium/scope/reference-candidate-provider.js +3 -2
  241. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  242. package/lib/langium/scope/scope-extension-service.d.ts +69 -37
  243. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  244. package/lib/langium/scope/scope-extension-service.js +102 -29
  245. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  246. package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
  247. package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
  248. package/lib/langium/scope/scoped-ast-node-description.js +1 -3
  249. package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
  250. package/lib/langium/serialization/abstract-serializer.d.ts +38 -27
  251. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  252. package/lib/langium/serialization/abstract-serializer.js +54 -30
  253. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  254. package/lib/langium/serialization/json-serializer.d.ts +8 -1
  255. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  256. package/lib/langium/serialization/json-serializer.js +13 -3
  257. package/lib/langium/serialization/json-serializer.js.map +1 -1
  258. package/lib/langium/serialization/serializer.d.ts +1 -1
  259. package/lib/langium/serialization/yaml-serializer.d.ts +12 -0
  260. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  261. package/lib/langium/serialization/yaml-serializer.js +24 -4
  262. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  263. package/lib/langium/service-registry.d.ts +29 -1
  264. package/lib/langium/service-registry.d.ts.map +1 -1
  265. package/lib/langium/service-registry.js +37 -0
  266. package/lib/langium/service-registry.js.map +1 -1
  267. package/lib/langium/shared-services.d.ts +10 -4
  268. package/lib/langium/shared-services.d.ts.map +1 -1
  269. package/lib/langium/shared-services.js.map +1 -1
  270. package/lib/langium/single-langium-copy.d.ts +22 -0
  271. package/lib/langium/single-langium-copy.d.ts.map +1 -0
  272. package/lib/langium/single-langium-copy.js +36 -0
  273. package/lib/langium/single-langium-copy.js.map +1 -0
  274. package/lib/langium/transfer/transfer-encoder.d.ts +60 -39
  275. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  276. package/lib/langium/transfer/transfer-encoder.js +35 -24
  277. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  278. package/lib/langium/trivia/comment-preserver.d.ts +543 -0
  279. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  280. package/lib/langium/trivia/comment-preserver.js +1164 -0
  281. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  282. package/lib/langium/trivia/document-ending-preserver.d.ts +51 -0
  283. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  284. package/lib/langium/trivia/document-ending-preserver.js +62 -0
  285. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  286. package/lib/langium/trivia/index.d.ts +14 -0
  287. package/lib/langium/trivia/index.d.ts.map +1 -0
  288. package/lib/langium/trivia/index.js +14 -0
  289. package/lib/langium/trivia/index.js.map +1 -0
  290. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  291. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  292. package/lib/langium/trivia/trivia-contribution.js +10 -0
  293. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  294. package/lib/langium/trivia/trivia-preserver.d.ts +52 -0
  295. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  296. package/lib/langium/trivia/trivia-preserver.js +10 -0
  297. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  298. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  299. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  300. package/lib/langium/trivia/trivia-service.js +56 -0
  301. package/lib/langium/trivia/trivia-service.js.map +1 -0
  302. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  303. package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
  304. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  305. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  306. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  307. package/lib/langium/validation/document-validator.d.ts +168 -23
  308. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  309. package/lib/langium/validation/document-validator.js +264 -26
  310. package/lib/langium/validation/document-validator.js.map +1 -1
  311. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  312. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  313. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  314. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  315. package/lib/langium/workspace/ast-node-locator.d.ts +24 -0
  316. package/lib/langium/workspace/ast-node-locator.d.ts.map +1 -0
  317. package/lib/langium/workspace/ast-node-locator.js +32 -0
  318. package/lib/langium/workspace/ast-node-locator.js.map +1 -0
  319. package/lib/langium/workspace/document-uri-policy.d.ts +24 -15
  320. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  321. package/lib/langium/workspace/document-uri-policy.js +22 -13
  322. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  323. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  324. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  325. package/lib/langium/workspace/file-not-found.js +31 -0
  326. package/lib/langium/workspace/file-not-found.js.map +1 -0
  327. package/lib/langium/workspace/file-system-provider.d.ts +167 -8
  328. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  329. package/lib/langium/workspace/file-system-provider.js +115 -13
  330. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  331. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +31 -1
  332. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  333. package/lib/langium/workspace/hydranium-langium-document-factory.js +54 -0
  334. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  335. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
  336. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  337. package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
  338. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  339. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +105 -21
  340. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  341. package/lib/langium/workspace/hydranium-workspace-manager.js +186 -31
  342. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  343. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
  344. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  345. package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
  346. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  347. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  348. package/lib/langium/workspace/index-manager.js.map +1 -1
  349. package/lib/langium/workspace/index.d.ts +2 -0
  350. package/lib/langium/workspace/index.d.ts.map +1 -1
  351. package/lib/langium/workspace/index.js +2 -0
  352. package/lib/langium/workspace/index.js.map +1 -1
  353. package/lib/langium/workspace/initialize-workspace.d.ts +40 -3
  354. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  355. package/lib/langium/workspace/initialize-workspace.js +68 -3
  356. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  357. package/lib/langium/workspace/langium-documents.d.ts +7 -0
  358. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  359. package/lib/langium/workspace/langium-documents.js +18 -1
  360. package/lib/langium/workspace/langium-documents.js.map +1 -1
  361. package/lib/langium/workspace/persistent-file-system-provider.d.ts +16 -10
  362. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  363. package/lib/langium/workspace/persistent-file-system-provider.js +25 -13
  364. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  365. package/lib/{documents → langium/workspace}/self-save-registry.d.ts +7 -9
  366. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  367. package/lib/{documents → langium/workspace}/self-save-registry.js +9 -11
  368. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  369. package/lib/langium/workspace/virtual-document.d.ts +55 -21
  370. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  371. package/lib/langium/workspace/virtual-document.js +87 -24
  372. package/lib/langium/workspace/virtual-document.js.map +1 -1
  373. package/lib/langium/workspace/write-lock-scope.d.ts +22 -10
  374. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  375. package/lib/langium/workspace/write-lock-scope.js +15 -5
  376. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  377. package/lib/launcher/integrated-server.d.ts +3 -1
  378. package/lib/launcher/integrated-server.d.ts.map +1 -1
  379. package/lib/locale/server-locale.d.ts +6 -6
  380. package/lib/locale/server-locale.d.ts.map +1 -1
  381. package/lib/locale/server-locale.js.map +1 -1
  382. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  383. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  384. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  385. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  386. package/lib/lsp/connection-features.d.ts +23 -0
  387. package/lib/lsp/connection-features.d.ts.map +1 -0
  388. package/lib/lsp/connection-features.js +60 -0
  389. package/lib/lsp/connection-features.js.map +1 -0
  390. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  391. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  392. package/lib/lsp/diagnostics-connection.js +53 -0
  393. package/lib/lsp/diagnostics-connection.js.map +1 -0
  394. package/lib/lsp/edit-requests-guard.d.ts +31 -0
  395. package/lib/lsp/edit-requests-guard.d.ts.map +1 -0
  396. package/lib/lsp/edit-requests-guard.js +125 -0
  397. package/lib/lsp/edit-requests-guard.js.map +1 -0
  398. package/lib/lsp/hydranium-document-update-handler.d.ts +126 -82
  399. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  400. package/lib/lsp/hydranium-document-update-handler.js +234 -101
  401. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  402. package/lib/lsp/index.d.ts +6 -2
  403. package/lib/lsp/index.d.ts.map +1 -1
  404. package/lib/lsp/index.js +6 -2
  405. package/lib/lsp/index.js.map +1 -1
  406. package/lib/lsp/lsp-latency.d.ts +39 -0
  407. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  408. package/lib/lsp/lsp-latency.js +58 -0
  409. package/lib/lsp/lsp-latency.js.map +1 -0
  410. package/lib/lsp/save-text-document.d.ts +31 -0
  411. package/lib/lsp/save-text-document.d.ts.map +1 -0
  412. package/lib/lsp/save-text-document.js +52 -0
  413. package/lib/lsp/save-text-document.js.map +1 -0
  414. package/lib/lsp/semantic-token-provider.d.ts +58 -2
  415. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  416. package/lib/lsp/semantic-token-provider.js +98 -9
  417. package/lib/lsp/semantic-token-provider.js.map +1 -1
  418. package/lib/lsp/shared-module.d.ts +4 -8
  419. package/lib/lsp/shared-module.d.ts.map +1 -1
  420. package/lib/lsp/shared-module.js.map +1 -1
  421. package/lib/lsp/start-language-server.d.ts +12 -7
  422. package/lib/lsp/start-language-server.d.ts.map +1 -1
  423. package/lib/lsp/start-language-server.js +21 -7
  424. package/lib/lsp/start-language-server.js.map +1 -1
  425. package/lib/messages/carriers.d.ts +4 -6
  426. package/lib/messages/carriers.d.ts.map +1 -1
  427. package/lib/messages/carriers.js +4 -6
  428. package/lib/messages/carriers.js.map +1 -1
  429. package/lib/messages/index.d.ts +2 -2
  430. package/lib/messages/index.d.ts.map +1 -1
  431. package/lib/messages/index.js +2 -2
  432. package/lib/messages/index.js.map +1 -1
  433. package/lib/messages/renderer.d.ts +10 -4
  434. package/lib/messages/renderer.d.ts.map +1 -1
  435. package/lib/messages/renderer.js +6 -0
  436. package/lib/messages/renderer.js.map +1 -1
  437. package/lib/node/event-loop-monitor.d.ts.map +1 -1
  438. package/lib/node/event-loop-monitor.js +2 -1
  439. package/lib/node/event-loop-monitor.js.map +1 -1
  440. package/lib/node/heap-ceiling.d.ts +61 -0
  441. package/lib/node/heap-ceiling.d.ts.map +1 -0
  442. package/lib/node/heap-ceiling.js +72 -0
  443. package/lib/node/heap-ceiling.js.map +1 -0
  444. package/lib/node/index.d.ts +1 -1
  445. package/lib/node/index.d.ts.map +1 -1
  446. package/lib/node/index.js +5 -1
  447. package/lib/node/index.js.map +1 -1
  448. package/lib/node/latency-from-env.d.ts +1 -1
  449. package/lib/node/latency-from-env.js +1 -1
  450. package/lib/node/lint-grammar.js.map +1 -1
  451. package/lib/node/log-file-sink.d.ts +3 -2
  452. package/lib/node/log-file-sink.d.ts.map +1 -1
  453. package/lib/node/log-file-sink.js +6 -2
  454. package/lib/node/log-file-sink.js.map +1 -1
  455. package/lib/node/log-preamble-node.d.ts +5 -3
  456. package/lib/node/log-preamble-node.d.ts.map +1 -1
  457. package/lib/node/log-preamble-node.js +13 -10
  458. package/lib/node/log-preamble-node.js.map +1 -1
  459. package/lib/node/measure-memory.d.ts.map +1 -1
  460. package/lib/node/measure-memory.js +5 -4
  461. package/lib/node/measure-memory.js.map +1 -1
  462. package/lib/node/memory-monitor.d.ts +2 -2
  463. package/lib/node/memory-monitor.d.ts.map +1 -1
  464. package/lib/node/memory-monitor.js +9 -10
  465. package/lib/node/memory-monitor.js.map +1 -1
  466. package/lib/node/node-file-system-provider.d.ts +67 -9
  467. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  468. package/lib/node/node-file-system-provider.js +198 -53
  469. package/lib/node/node-file-system-provider.js.map +1 -1
  470. package/lib/node/profile-capture.d.ts +12 -4
  471. package/lib/node/profile-capture.d.ts.map +1 -1
  472. package/lib/node/profile-capture.js +8 -6
  473. package/lib/node/profile-capture.js.map +1 -1
  474. package/lib/node/profile-digest.js.map +1 -1
  475. package/lib/node/profiling-run.d.ts +13 -3
  476. package/lib/node/profiling-run.d.ts.map +1 -1
  477. package/lib/node/profiling-run.js +17 -8
  478. package/lib/node/profiling-run.js.map +1 -1
  479. package/lib/node/rename-over-open-readers.d.ts +61 -0
  480. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  481. package/lib/node/rename-over-open-readers.js +80 -0
  482. package/lib/node/rename-over-open-readers.js.map +1 -0
  483. package/lib/node/server-diagnostics.js +1 -1
  484. package/lib/node/server-diagnostics.js.map +1 -1
  485. package/lib/node/server-state-snapshot.js +4 -4
  486. package/lib/node/server-state-snapshot.js.map +1 -1
  487. package/lib/node/socket-launcher.d.ts +43 -7
  488. package/lib/node/socket-launcher.d.ts.map +1 -1
  489. package/lib/node/socket-launcher.js +42 -7
  490. package/lib/node/socket-launcher.js.map +1 -1
  491. package/lib/node/startup-cpu-profile.d.ts +29 -0
  492. package/lib/node/startup-cpu-profile.d.ts.map +1 -0
  493. package/lib/node/startup-cpu-profile.js +91 -0
  494. package/lib/node/startup-cpu-profile.js.map +1 -0
  495. package/lib/node/stdio-launcher.d.ts +13 -13
  496. package/lib/node/stdio-launcher.d.ts.map +1 -1
  497. package/lib/node/stdio-launcher.js +21 -11
  498. package/lib/node/stdio-launcher.js.map +1 -1
  499. package/lib/node/validate-workspace.d.ts +1 -1
  500. package/lib/node/validate-workspace.d.ts.map +1 -1
  501. package/lib/node/validate-workspace.js +5 -1
  502. package/lib/node/validate-workspace.js.map +1 -1
  503. package/lib/testing/document-uri-policy-conformance.js +1 -1
  504. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  505. package/lib/testing/fake-description.js.map +1 -1
  506. package/lib/testing/fake-document.d.ts +2 -1
  507. package/lib/testing/fake-document.d.ts.map +1 -1
  508. package/lib/testing/fake-document.js.map +1 -1
  509. package/lib/testing/index.d.ts +1 -1
  510. package/lib/testing/index.d.ts.map +1 -1
  511. package/lib/testing/index.js +2 -1
  512. package/lib/testing/index.js.map +1 -1
  513. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  514. package/lib/testing/langium-test-helpers.js +1 -0
  515. package/lib/testing/langium-test-helpers.js.map +1 -1
  516. package/lib/testing/make-noop-language-services.js.map +1 -1
  517. package/lib/testing/make-noop-shared-services.js.map +1 -1
  518. package/lib/testing/make-test-services.d.ts +45 -14
  519. package/lib/testing/make-test-services.d.ts.map +1 -1
  520. package/lib/testing/make-test-services.js +23 -7
  521. package/lib/testing/make-test-services.js.map +1 -1
  522. package/lib/testing/make-test-tracer.d.ts +12 -0
  523. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  524. package/lib/testing/make-test-tracer.js +13 -0
  525. package/lib/testing/make-test-tracer.js.map +1 -1
  526. package/lib/testing/node/applied-edit-capture.d.ts +29 -0
  527. package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
  528. package/lib/testing/node/applied-edit-capture.js +117 -0
  529. package/lib/testing/node/applied-edit-capture.js.map +1 -0
  530. package/lib/testing/node/golden-corpus.js.map +1 -1
  531. package/lib/testing/node/index.d.ts +1 -0
  532. package/lib/testing/node/index.d.ts.map +1 -1
  533. package/lib/testing/node/index.js +1 -0
  534. package/lib/testing/node/index.js.map +1 -1
  535. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  536. package/lib/testing/node/lsp-harness.js +2 -0
  537. package/lib/testing/node/lsp-harness.js.map +1 -1
  538. package/lib/testing/node/lsp-server-connection.d.ts +21 -6
  539. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  540. package/lib/testing/node/lsp-server-connection.js +49 -106
  541. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  542. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  543. package/lib/testing/node/scratch-workspace.js +10 -5
  544. package/lib/testing/node/scratch-workspace.js.map +1 -1
  545. package/lib/testing/node/spawned-server.d.ts +30 -1
  546. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  547. package/lib/testing/node/spawned-server.js +39 -2
  548. package/lib/testing/node/spawned-server.js.map +1 -1
  549. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  550. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  551. package/lib/testing/node/unhandled-rejections.js +32 -0
  552. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  553. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  554. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  555. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  556. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  557. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  558. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  559. package/lib/testing/playwright/index.d.ts +1 -0
  560. package/lib/testing/playwright/index.d.ts.map +1 -1
  561. package/lib/testing/playwright/index.js +1 -0
  562. package/lib/testing/playwright/index.js.map +1 -1
  563. package/lib/testing/playwright/server-log-capture.d.ts +46 -16
  564. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  565. package/lib/testing/playwright/server-log-capture.js +111 -40
  566. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  567. package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
  568. package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
  569. package/lib/testing/playwright/server-log-fixture.js +25 -6
  570. package/lib/testing/playwright/server-log-fixture.js.map +1 -1
  571. package/lib/testing/playwright/server-log-region.d.ts +15 -0
  572. package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
  573. package/lib/testing/playwright/server-log-region.js +30 -0
  574. package/lib/testing/playwright/server-log-region.js.map +1 -0
  575. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  576. package/lib/testing/playwright/server-log-rename-reporter.js +4 -3
  577. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  578. package/lib/testing/run-update-pipeline.d.ts +8 -5
  579. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  580. package/lib/testing/run-update-pipeline.js.map +1 -1
  581. package/lib/testing/stub-ast-document-manager.d.ts +11 -51
  582. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  583. package/lib/testing/stub-ast-document-manager.js +31 -59
  584. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  585. package/lib/testing/stub-document-builder.d.ts +33 -11
  586. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  587. package/lib/testing/stub-document-builder.js +110 -5
  588. package/lib/testing/stub-document-builder.js.map +1 -1
  589. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  590. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  591. package/lib/testing/stub-hydranium-text-documents.js +132 -16
  592. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  593. package/lib/testing/stub-index-manager.js.map +1 -1
  594. package/lib/testing/stub-langium-documents.d.ts +3 -2
  595. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  596. package/lib/testing/stub-langium-documents.js.map +1 -1
  597. package/lib/testing/stub-model-service.d.ts +8 -7
  598. package/lib/testing/stub-model-service.d.ts.map +1 -1
  599. package/lib/testing/stub-model-service.js +4 -4
  600. package/lib/testing/stub-model-service.js.map +1 -1
  601. package/lib/testing/stub-project-manager.d.ts.map +1 -1
  602. package/lib/testing/stub-project-manager.js +10 -0
  603. package/lib/testing/stub-project-manager.js.map +1 -1
  604. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  605. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  606. package/lib/testing/stub-service-registry.d.ts +1 -1
  607. package/lib/testing/stub-service-registry.js.map +1 -1
  608. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  609. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  610. package/lib/testing/stub-writable-file-system.js +2 -1
  611. package/lib/testing/stub-writable-file-system.js.map +1 -1
  612. package/lib/util/connection-liveness.d.ts +22 -6
  613. package/lib/util/connection-liveness.d.ts.map +1 -1
  614. package/lib/util/connection-liveness.js +75 -15
  615. package/lib/util/connection-liveness.js.map +1 -1
  616. package/lib/util/environment.d.ts +7 -0
  617. package/lib/util/environment.d.ts.map +1 -1
  618. package/lib/util/environment.js +15 -1
  619. package/lib/util/environment.js.map +1 -1
  620. package/lib/util/registry.d.ts.map +1 -1
  621. package/package.json +41 -60
  622. package/src/browser/host-heads-in-worker.ts +218 -0
  623. package/src/browser/index.ts +17 -0
  624. package/src/browser/indexeddb-file-system-store.ts +192 -0
  625. package/src/browser/start-language-server-in-worker.ts +56 -0
  626. package/src/documents/ast-document-manager.ts +477 -249
  627. package/src/documents/client-ids.ts +5 -22
  628. package/src/documents/client-session-errors.ts +24 -0
  629. package/src/documents/client-session-registry.ts +262 -0
  630. package/src/documents/dirty-state-tracker.ts +167 -0
  631. package/src/documents/document-release-handler.ts +404 -0
  632. package/src/documents/document-release-scheduler.ts +121 -0
  633. package/src/documents/file-system-task-queue.ts +74 -0
  634. package/src/documents/hydranium-text-documents.ts +1029 -595
  635. package/src/documents/index.ts +10 -2
  636. package/src/documents/language-client-shadow.ts +501 -0
  637. package/src/documents/model-ledger.ts +66 -0
  638. package/src/documents/text-ledger.ts +112 -0
  639. package/src/documents/version-sync-service.ts +275 -0
  640. package/src/index.ts +3 -0
  641. package/src/langium/ast-extension/ast-extension-service.ts +77 -41
  642. package/src/langium/ast-extension/ast-node-builder.ts +35 -13
  643. package/src/langium/bootstrap.ts +79 -43
  644. package/src/langium/build-phase-pass/build-phase-pass-service.ts +29 -19
  645. package/src/langium/build-phase-pass/build-phase-pass.ts +37 -8
  646. package/src/langium/composite-ast-reflection.ts +112 -0
  647. package/src/langium/config/configuration-provider.ts +119 -0
  648. package/src/langium/config/index.ts +1 -0
  649. package/src/langium/diagnostics/console-tee.ts +150 -0
  650. package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
  651. package/src/langium/diagnostics/log-preamble.ts +1 -1
  652. package/src/langium/diagnostics/logger.ts +51 -17
  653. package/src/langium/diagnostics/lsp-logger.ts +83 -45
  654. package/src/langium/document-builder/build-pipeline-integration.ts +57 -32
  655. package/src/langium/document-builder/build-session.ts +4 -3
  656. package/src/langium/document-builder/document-builder.ts +679 -83
  657. package/src/langium/integration-services.ts +58 -27
  658. package/src/langium/integrity/integrity-rule.ts +17 -8
  659. package/src/langium/integrity/integrity-service.ts +332 -69
  660. package/src/langium/keys/containment.ts +3 -2
  661. package/src/langium/keys/name-based-key-provider.ts +24 -12
  662. package/src/langium/language-module.ts +52 -9
  663. package/src/langium/model-service/client-session.ts +726 -0
  664. package/src/langium/model-service/index.ts +2 -0
  665. package/src/langium/model-service/model-events.ts +82 -0
  666. package/src/langium/model-service/model-service.ts +887 -522
  667. package/src/langium/module.ts +132 -56
  668. package/src/langium/naming/name-provider.ts +34 -8
  669. package/src/langium/project/abstract-project-manager.ts +409 -20
  670. package/src/langium/project/project-change-event.ts +25 -3
  671. package/src/langium/project/project-manager.ts +31 -2
  672. package/src/langium/project/single-project-manager.ts +16 -1
  673. package/src/langium/residency/cst-residency-service.ts +30 -14
  674. package/src/langium/scope/ast-node-description-provider.ts +111 -16
  675. package/src/langium/scope/built-local-symbols.ts +13 -0
  676. package/src/langium/scope/fallback-scope.ts +38 -0
  677. package/src/langium/scope/hydranium-scope-computation.ts +45 -44
  678. package/src/langium/scope/hydranium-scope-provider.ts +245 -41
  679. package/src/langium/scope/index.ts +1 -0
  680. package/src/langium/scope/reference-candidate-provider.ts +6 -5
  681. package/src/langium/scope/scope-extension-service.ts +148 -56
  682. package/src/langium/scope/scoped-ast-node-description.ts +1 -3
  683. package/src/langium/serialization/abstract-serializer.ts +57 -41
  684. package/src/langium/serialization/json-serializer.ts +14 -3
  685. package/src/langium/serialization/serializer.ts +1 -1
  686. package/src/langium/serialization/yaml-serializer.ts +26 -4
  687. package/src/langium/service-registry.ts +41 -2
  688. package/src/langium/shared-services.ts +13 -4
  689. package/src/langium/single-langium-copy.ts +42 -0
  690. package/src/langium/transfer/transfer-encoder.ts +76 -50
  691. package/src/langium/trivia/comment-preserver.ts +1409 -0
  692. package/src/langium/trivia/document-ending-preserver.ts +71 -0
  693. package/src/langium/trivia/index.ts +14 -0
  694. package/src/langium/trivia/trivia-contribution.ts +39 -0
  695. package/src/langium/trivia/trivia-preserver.ts +56 -0
  696. package/src/langium/trivia/trivia-service.ts +99 -0
  697. package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
  698. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  699. package/src/langium/validation/document-validator.ts +312 -31
  700. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  701. package/src/langium/workspace/ast-node-locator.ts +33 -0
  702. package/src/langium/workspace/document-uri-policy.ts +32 -18
  703. package/src/langium/workspace/file-not-found.ts +35 -0
  704. package/src/langium/workspace/file-system-provider.ts +258 -16
  705. package/src/langium/workspace/hydranium-langium-document-factory.ts +83 -0
  706. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
  707. package/src/langium/workspace/hydranium-workspace-manager.ts +214 -35
  708. package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
  709. package/src/langium/workspace/index.ts +2 -0
  710. package/src/langium/workspace/initialize-workspace.ts +96 -4
  711. package/src/langium/workspace/langium-documents.ts +19 -1
  712. package/src/langium/workspace/persistent-file-system-provider.ts +27 -15
  713. package/src/{documents → langium/workspace}/self-save-registry.ts +12 -14
  714. package/src/langium/workspace/virtual-document.ts +106 -25
  715. package/src/langium/workspace/write-lock-scope.ts +27 -12
  716. package/src/launcher/integrated-server.ts +3 -1
  717. package/src/locale/server-locale.ts +6 -6
  718. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  719. package/src/lsp/connection-features.ts +67 -0
  720. package/src/lsp/diagnostics-connection.ts +56 -0
  721. package/src/lsp/edit-requests-guard.ts +152 -0
  722. package/src/lsp/hydranium-document-update-handler.ts +284 -110
  723. package/src/lsp/index.ts +6 -2
  724. package/src/lsp/lsp-latency.ts +62 -0
  725. package/src/lsp/save-text-document.ts +63 -0
  726. package/src/lsp/semantic-token-provider.ts +146 -8
  727. package/src/lsp/shared-module.ts +4 -8
  728. package/src/lsp/start-language-server.ts +21 -7
  729. package/src/messages/carriers.ts +4 -6
  730. package/src/messages/index.ts +11 -2
  731. package/src/messages/renderer.ts +11 -3
  732. package/src/node/event-loop-monitor.ts +2 -1
  733. package/src/node/heap-ceiling.ts +108 -0
  734. package/src/node/index.ts +5 -1
  735. package/src/node/latency-from-env.ts +1 -1
  736. package/src/node/log-file-sink.ts +6 -2
  737. package/src/node/log-preamble-node.ts +20 -10
  738. package/src/node/measure-memory.ts +5 -4
  739. package/src/node/memory-monitor.ts +10 -10
  740. package/src/node/node-file-system-provider.ts +214 -57
  741. package/src/node/profile-capture.ts +16 -15
  742. package/src/node/profiling-run.ts +30 -8
  743. package/src/node/rename-over-open-readers.ts +94 -0
  744. package/src/node/server-diagnostics.ts +1 -1
  745. package/src/node/server-state-snapshot.ts +5 -5
  746. package/src/node/socket-launcher.ts +78 -14
  747. package/src/node/startup-cpu-profile.ts +94 -0
  748. package/src/node/stdio-launcher.ts +29 -19
  749. package/src/node/validate-workspace.ts +8 -2
  750. package/src/testing/document-uri-policy-conformance.ts +1 -1
  751. package/src/testing/fake-document.ts +2 -1
  752. package/src/testing/index.ts +2 -1
  753. package/src/testing/langium-test-helpers.ts +1 -0
  754. package/src/testing/make-test-services.ts +83 -31
  755. package/src/testing/make-test-tracer.ts +26 -0
  756. package/src/testing/node/applied-edit-capture.ts +141 -0
  757. package/src/testing/node/index.ts +1 -0
  758. package/src/testing/node/lsp-harness.ts +2 -0
  759. package/src/testing/node/lsp-server-connection.ts +83 -119
  760. package/src/testing/node/scratch-workspace.ts +10 -5
  761. package/src/testing/node/spawned-server.ts +57 -3
  762. package/src/testing/node/unhandled-rejections.ts +31 -0
  763. package/src/testing/parse-semantic-root.ts +1 -1
  764. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  765. package/src/testing/playwright/index.ts +1 -0
  766. package/src/testing/playwright/server-log-capture.ts +137 -47
  767. package/src/testing/playwright/server-log-fixture.ts +46 -6
  768. package/src/testing/playwright/server-log-region.ts +32 -0
  769. package/src/testing/playwright/server-log-rename-reporter.ts +4 -3
  770. package/src/testing/run-update-pipeline.ts +8 -5
  771. package/src/testing/stub-ast-document-manager.ts +47 -123
  772. package/src/testing/stub-document-builder.ts +155 -18
  773. package/src/testing/stub-hydranium-text-documents.ts +184 -27
  774. package/src/testing/stub-langium-documents.ts +3 -2
  775. package/src/testing/stub-model-service.ts +9 -8
  776. package/src/testing/stub-project-manager.ts +10 -0
  777. package/src/testing/stub-self-save-registry.ts +1 -1
  778. package/src/testing/stub-service-registry.ts +1 -1
  779. package/src/testing/stub-writable-file-system.ts +3 -2
  780. package/src/util/connection-liveness.ts +81 -15
  781. package/src/util/environment.ts +24 -2
  782. package/lib/documents/language-client-text-shadow.d.ts +0 -101
  783. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  784. package/lib/documents/language-client-text-shadow.js +0 -156
  785. package/lib/documents/language-client-text-shadow.js.map +0 -1
  786. package/lib/documents/self-save-registry.d.ts.map +0 -1
  787. package/lib/documents/self-save-registry.js.map +0 -1
  788. package/lib/lsp/instrument-connection.d.ts +0 -36
  789. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  790. package/lib/lsp/instrument-connection.js +0 -62
  791. package/lib/lsp/instrument-connection.js.map +0 -1
  792. package/lib/node/process-memory.d.ts +0 -66
  793. package/lib/node/process-memory.d.ts.map +0 -1
  794. package/lib/node/process-memory.js +0 -252
  795. package/lib/node/process-memory.js.map +0 -1
  796. package/src/documents/language-client-text-shadow.ts +0 -175
  797. package/src/lsp/instrument-connection.ts +0 -66
  798. package/src/node/process-memory.ts +0 -299
@@ -0,0 +1,119 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+
10
+ import { type ConfigurationInitializedParams, DefaultConfigurationProvider } from '@hydranium/langium';
11
+ import type { ConfigurationItem, DidChangeConfigurationRegistrationOptions } from 'vscode-languageserver';
12
+
13
+ /**
14
+ * Configuration provider that asks the client about a section the first time
15
+ * something reads it.
16
+ *
17
+ * Langium's base requests one section per registered language, named after the
18
+ * language id, and never asks again. A read of any other section — including
19
+ * whatever `lsp.configurationRoot` is bound to — then resolves `undefined` with
20
+ * no request on the wire, which is indistinguishable from a setting the user has
21
+ * not set.
22
+ *
23
+ * Asking on first read rather than from a list collected up front: a reader
24
+ * names its section during DI, after `initialized` has taken its one-shot pass,
25
+ * so a list would have to be complete before the server initialized.
26
+ */
27
+ export class HydraniumConfigurationProvider extends DefaultConfigurationProvider {
28
+ /**
29
+ * The client-facing hooks, captured because they arrive once as arguments to
30
+ * {@link initialized} and are needed on every later read. Absent in a
31
+ * headless composition, which has no connection to ask.
32
+ */
33
+ protected registerForSection?: (params: DidChangeConfigurationRegistrationOptions) => void;
34
+ protected fetchSections?: (items: ConfigurationItem[]) => Promise<unknown>;
35
+
36
+ /**
37
+ * Sections already dealt with, holding the in-flight work so concurrent
38
+ * readers share one round trip. Entries stay after they settle: they record
39
+ * that the section was HANDLED, and without that an unset section is
40
+ * re-requested on every read, "unset" and "not fetched" being the same
41
+ * absence in the store.
42
+ *
43
+ * A section the client's capabilities ruled out counts as handled, having
44
+ * been settled by asking nothing.
45
+ */
46
+ protected readonly requestedSections = new Map<string, Promise<void>>();
47
+
48
+ override async initialized(params: ConfigurationInitializedParams): Promise<void> {
49
+ this.registerForSection = params.register;
50
+ this.fetchSections = params.fetchConfiguration;
51
+ await super.initialized(params);
52
+ }
53
+
54
+ /**
55
+ * The `ready` await precedes the emptiness check: the base resolves it at the
56
+ * end of its own initial fetch, so testing the store first calls every
57
+ * language section missing and re-requests what is already on its way.
58
+ */
59
+ override async getConfiguration(language: string, configuration: string): Promise<unknown> {
60
+ await this.ready;
61
+ const section = this.toSectionName(language);
62
+ if (this.settings[section] === undefined) {
63
+ await this.requestSection(section);
64
+ }
65
+ return super.getConfiguration(language, configuration);
66
+ }
67
+
68
+ /** Ask about `section` once, sharing the request with any concurrent reader. */
69
+ protected requestSection(section: string): Promise<void> {
70
+ const existing = this.requestedSections.get(section);
71
+ if (existing) {
72
+ return existing;
73
+ }
74
+ const request = this.doRequestSection(section);
75
+ this.requestedSections.set(section, request);
76
+ return request;
77
+ }
78
+
79
+ /**
80
+ * The hooks are gated on the client having declared `workspace.configuration`.
81
+ * A connection binds them whatever the client said, so their presence is not
82
+ * consent: calling them sends a `client/registerCapability` and a
83
+ * `workspace/configuration` to a client that advertised support for neither,
84
+ * which is entitled to answer either with a method-not-found and may drop the
85
+ * connection.
86
+ *
87
+ * That flag is exact for the fetch and KNOWINGLY coarse for the registration,
88
+ * which the spec governs by
89
+ * `workspace.didChangeConfiguration.dynamicRegistration`. The base registers
90
+ * under `workspace.configuration` alone before any of this runs, so gating
91
+ * the registration on the narrower flag here would withhold a request whose
92
+ * twin has already gone out, sparing the client nothing. A client declaring
93
+ * `workspace.configuration` without dynamic registration is still registered
94
+ * for, by the base and by this; closing that means changing the base's pass,
95
+ * not this gate.
96
+ *
97
+ * Registering before fetching, so an edit landing between the two arrives as
98
+ * a notification instead of being lost; the reverse order drops it.
99
+ *
100
+ * A `null` result is left out of the store rather than written, so the
101
+ * section reads as unset, and no `onConfigurationSectionUpdate` fires — the
102
+ * value goes to the caller that asked for it, and an event would announce a
103
+ * change that is only this provider catching up.
104
+ */
105
+ protected async doRequestSection(section: string): Promise<void> {
106
+ if (!this.workspaceConfig) {
107
+ return;
108
+ }
109
+ this.registerForSection?.({ section });
110
+ if (!this.fetchSections) {
111
+ return;
112
+ }
113
+ const fetched = await this.fetchSections([{ section }]);
114
+ const value = Array.isArray(fetched) ? fetched[0] : fetched;
115
+ if (value !== null && value !== undefined) {
116
+ this.updateSectionConfiguration(section, value);
117
+ }
118
+ }
119
+ }
@@ -7,4 +7,5 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
+ export * from './configuration-provider.js';
10
11
  export * from './settings.js';
@@ -0,0 +1,150 @@
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 { Format, formatLogArg, LEVEL_LABELS, type LogLevel, SystemClock } from '@hydranium/protocol';
11
+ import { teeLogLine } from './logger.js';
12
+ import { hasProcessStderr } from '../../util/environment.js';
13
+ import { isConnectionGoneError } from '../../util/connection-liveness.js';
14
+
15
+ /** The `console` methods {@link installConsoleTee} wraps, with the level and label each line is written at. */
16
+ const CONSOLE_TEE: ReadonlyArray<readonly ['error' | 'warn' | 'info' | 'log' | 'debug', LogLevel, string]> = [
17
+ ['error', 'error', LEVEL_LABELS.error],
18
+ ['warn', 'warn', LEVEL_LABELS.warn],
19
+ ['info', 'info', LEVEL_LABELS.info],
20
+ ['log', 'info', 'Log'],
21
+ ['debug', 'debug', LEVEL_LABELS.debug]
22
+ ];
23
+
24
+ /** The wrappers this copy installed, so installing again wraps only a method that is none of them. */
25
+ const tees = new WeakSet<object>();
26
+ /**
27
+ * Whether a line is being written or handed on: a console call made meanwhile,
28
+ * by a sink or a library wrapper between two installs, is only handed on.
29
+ */
30
+ let handling = false;
31
+ /**
32
+ * What a line is stamped with: not a logger's injected clock, whose service a
33
+ * console call made while another service is built could resolve into a cycle.
34
+ */
35
+ const systemClock = new SystemClock();
36
+ /**
37
+ * How a line's arguments are rendered, Node's `util.format` where the `./node`
38
+ * entry set it: unlike JSON, it runs no ordinary getter and no proxy trap of an
39
+ * argument it inspects, the traps a services container builds a service in.
40
+ */
41
+ let format: ((...args: unknown[]) => string) | undefined;
42
+
43
+ /** Render console lines with `render`, as `installNodeLogFileSink` does with Node's `util.format`. */
44
+ export function setConsoleFormat(render: (...args: unknown[]) => string): void {
45
+ format = render;
46
+ }
47
+
48
+ /**
49
+ * Write each line sent through a {@link CONSOLE_TEE} method, as Langium
50
+ * reports a linker or validator failure, to this copy's log file under a
51
+ * `console` component, then hand it to the method it replaced, even when
52
+ * writing the file fails. The file goes first because the method a stdio
53
+ * connection installs throws once the connection is closed, unless its remote
54
+ * console catches that, as `withHydraniumLspFeatures`'s does.
55
+ *
56
+ * Node only: in a browser no file is written, and a wrapper would only stand
57
+ * between devtools and the call site. Called by the first `LspLogger`, and by
58
+ * `startLanguageServer`, which wraps again where a logger existed before a
59
+ * stdio connection replaced `error`, `warn`, `log` and `debug`. A console
60
+ * replaced after that is not wrapped again, and each copy of this package
61
+ * wraps the console itself, so a file two copies share gets a line twice.
62
+ */
63
+ export function installConsoleTee(): void {
64
+ if (!hasProcessStderr()) {
65
+ return;
66
+ }
67
+ for (const [method, level, label] of CONSOLE_TEE) {
68
+ try {
69
+ wrap(method, level, label);
70
+ } catch {
71
+ // A host whose console is read-only, or throws when read, keeps its methods, unwritten.
72
+ }
73
+ }
74
+ }
75
+
76
+ /** Replace `console[method]` by a tee writing its lines at `level` under `label`, unless it is already one of this copy's tees. */
77
+ function wrap(method: (typeof CONSOLE_TEE)[number][0], level: LogLevel, label: string): void {
78
+ const passOn = console[method];
79
+ if (tees.has(passOn)) {
80
+ return;
81
+ }
82
+ const tee = (...args: unknown[]): void => {
83
+ if (handling) {
84
+ Reflect.apply(passOn, console, args);
85
+ return;
86
+ }
87
+ handling = true;
88
+ try {
89
+ try {
90
+ const [lineLevel, lineLabel] = isDebugLine(args)
91
+ ? (['debug', LEVEL_LABELS.debug] as const)
92
+ : level === 'error' && isNodeWarning(args)
93
+ ? (['warn', LEVEL_LABELS.warn] as const)
94
+ : [level, label];
95
+ // As `AbstractLogger.formatLinePrefix` starts a line.
96
+ teeLogLine(
97
+ lineLevel,
98
+ () => `[${lineLabel.padEnd(5)} - ${Format.timestamp(new Date(systemClock.now()))}] [console] ${formatArgs(args)}`
99
+ );
100
+ } catch {
101
+ // A failing log sink must not propagate, nor keep the line from `passOn`.
102
+ }
103
+ Reflect.apply(passOn, console, args);
104
+ } finally {
105
+ handling = false;
106
+ }
107
+ };
108
+ console[method] = tee;
109
+ tees.add(tee);
110
+ }
111
+
112
+ /** `args` as the console prints them, or by {@link formatLogArg} where that throws, as for an error whose stack throws when read. */
113
+ function formatArgs(args: unknown[]): string {
114
+ if (format) {
115
+ try {
116
+ return format(...args);
117
+ } catch {
118
+ // Described below instead.
119
+ }
120
+ }
121
+ return args.map(arg => formatLogArg(arg)).join(' ');
122
+ }
123
+
124
+ /**
125
+ * How Node's default warning handler starts what it prints through
126
+ * `console.error`: the runtime's release name and pid, the warning's code if
127
+ * it has one, and its type, as `(node:42) [DEP0005] DeprecationWarning: `.
128
+ */
129
+ const NODE_WARNING = /^\([\w-]+:\d+\) (\[\w+\] )?\w*Warning: /;
130
+
131
+ /** Whether `args` is a Node process warning, a deprecation say, which is written at `warn`. */
132
+ function isNodeWarning(args: readonly unknown[]): boolean {
133
+ return args.length === 1 && typeof args[0] === 'string' && NODE_WARNING.test(args[0]);
134
+ }
135
+
136
+ /** What Langium's `initialized` handler logs when a service's start rejects. */
137
+ const LANGIUM_START_FAILURES = new Set<unknown>([
138
+ 'Error in ConfigurationProvider initialization:',
139
+ 'Error in WorkspaceManager initialization:'
140
+ ]);
141
+
142
+ /**
143
+ * Whether `args` reports routine teardown, which is written at `debug`:
144
+ * Langium's failed configuration or workspace start whose connection has gone.
145
+ * `vscode-languageserver`'s `Sending log message failed` is not, since it
146
+ * carries no reason; `withHydraniumLspFeatures` keeps teardown from printing it.
147
+ */
148
+ function isDebugLine(args: readonly unknown[]): boolean {
149
+ return args.length === 2 && LANGIUM_START_FAILURES.has(args[0]) && isConnectionGoneError(args[1]);
150
+ }
@@ -8,14 +8,7 @@
8
8
  ********************************************************************************/
9
9
 
10
10
  import { Format, Logger, type Tracer } from '@hydranium/protocol';
11
- import {
12
- DefaultLangiumProfiler,
13
- DocumentState,
14
- MultiMap,
15
- type ProfilingCategory,
16
- type ProfilingRecord,
17
- ProfilingTask
18
- } from '@hydranium/langium';
11
+ import { DefaultLangiumProfiler, MultiMap, type ProfilingCategory, type ProfilingRecord, ProfilingTask } from '@hydranium/langium';
19
12
  import { type LogNameOptions } from './logger.js';
20
13
  import { type ServerSharedServicesMinimal } from '../shared-services.js';
21
14
 
@@ -29,18 +22,8 @@ export interface LangiumProfilerOptions extends LogNameOptions {
29
22
  * {@link DefaultLangiumProfiler}) to Langium's full set when omitted.
30
23
  */
31
24
  readonly activeCategories?: Set<ProfilingCategory>;
32
- /**
33
- * Priority of the per-build flush pass at the `Validated` phase. The flush is
34
- * normally the only pass at `Validated`, so order is immaterial; the option
35
- * exists for symmetry with the other framework passes. Default
36
- * {@link PROFILER_FLUSH_PASS_PRIORITY}.
37
- */
38
- readonly flushPriority?: number;
39
25
  }
40
26
 
41
- /** Default priority of the profiler's per-build flush pass (see {@link LangiumProfilerOptions.flushPriority}). */
42
- export const PROFILER_FLUSH_PASS_PRIORITY = 0;
43
-
44
27
  /**
45
28
  * Framework adapter over Langium's {@link DefaultLangiumProfiler} that is
46
29
  * **trace-gated** and emits a single **aggregated** per-category breakdown
@@ -54,9 +37,8 @@ export const PROFILER_FLUSH_PASS_PRIORITY = 0;
54
37
  * task identifier), so the per-document records carry no distinguishing
55
38
  * information anyway. We instead accumulate records in {@link records} and
56
39
  * {@link flush} one breakdown per category — self-time and invocation counts
57
- * summed per `$type` across the whole build — on the terminal `Validated`
58
- * build phase (self-registered in the constructor). One report per build, not
59
- * one per file.
40
+ * summed per `$type` across the whole build — when the build ends
41
+ * (subscribed in the constructor). One report per build, not one per file.
60
42
  * - **Transport safety.** The stock per-record dump uses `console.table`, which
61
43
  * is NOT in the set `patchConsole` reroutes; under `vscode-languageserver`'s
62
44
  * `--stdio` transport `process.stdout` *is* the JSON-RPC channel, so the
@@ -74,8 +56,8 @@ export const PROFILER_FLUSH_PASS_PRIORITY = 0;
74
56
  * restart. Langium's own `start`/`stop` category selection still applies *on
75
57
  * top of* the trace gate.
76
58
  *
77
- * Registered eagerly (see `DEFAULT_EAGER_SERVICES`) so its `Validated`-phase
78
- * flush pass is registered before the first build. Gives the per-grammar-rule /
59
+ * Registered eagerly (see `DEFAULT_EAGER_SERVICES`) so its flush is
60
+ * subscribed before the first build. Gives the per-grammar-rule /
79
61
  * per-`$type` parse/link/validate self-time the framework's own
80
62
  * `ServerTracer` / `ProfileSession` passes
81
63
  * cannot produce (those cover the framework's passes *outside* Langium's
@@ -88,16 +70,11 @@ export class HydraniumLangiumProfiler extends DefaultLangiumProfiler {
88
70
  constructor(services: ServerSharedServicesMinimal, options: LangiumProfilerOptions = {}) {
89
71
  super(options.activeCategories);
90
72
  this.tracer = services.Tracer.for(options.logName ?? 'LangiumProfiler').trace('instantiated');
91
- // Flush once per build on the terminal phase rather than once per document.
92
- // By `Validated`, every parse/link/validate record for the batch is in.
93
- // Registered as a build-phase pass (not a direct onBuildPhase listener) so
94
- // every framework + adopter build-phase reaction shares one dispatcher.
95
- services.workspace.BuildPhasePassService.register({
96
- id: 'framework:langium-profiler:flush',
97
- state: DocumentState.Validated,
98
- priority: options.flushPriority ?? PROFILER_FLUSH_PASS_PRIORITY,
99
- run: () => this.flush()
100
- });
73
+ // Flush once per build when it ends rather than once per document. Not at
74
+ // a `Validated` pass: that phase stays silent for a build that validates
75
+ // nothing, the workspace's initial one among them, and the records would
76
+ // then wait for a build that does.
77
+ services.workspace.DocumentBuilder.onBuildEnded(() => this.flush());
101
78
  }
102
79
 
103
80
  /**
@@ -142,14 +119,13 @@ export class HydraniumLangiumProfiler extends DefaultLangiumProfiler {
142
119
  /**
143
120
  * Emit one aggregated breakdown per category — self-time and invocation
144
121
  * counts summed per `<languageId>.<$type>` across every record collected
145
- * this build — then clear the window. Self-registered as a `Validated`-phase
146
- * build pass, so it fires once per build, not per document. Pass explicit
147
- * categories to flush a subset; defaults to all.
122
+ * this build — then clear the window. Called when a build ends, so it fires
123
+ * once per build, not per document. Pass explicit categories to flush a
124
+ * subset; defaults to all.
148
125
  *
149
126
  * `flush` is the sole reset point: because it clears each flushed category,
150
- * memory is bounded per completed build. A build cancelled before `Validated`
151
- * leaves its partial records to roll into the next build's flush (slightly
152
- * inflated counts, self-correcting) rather than accumulating without bound.
127
+ * memory is bounded per build. Builds that throw share one flush, once the
128
+ * lock has drained after them.
153
129
  */
154
130
  flush(...categories: ProfilingCategory[]): void {
155
131
  const toFlush = categories.length > 0 ? categories : ALL_CATEGORIES;
@@ -50,7 +50,7 @@ export function logPreamble(logger: Logger, options: LogPreambleOptions): void {
50
50
 
51
51
  function logSessionInfo(logger: Logger, productName: string, version: string, systemInfoLines: readonly string[]): void {
52
52
  const now = new Date();
53
- const dateStr = now.toISOString().slice(0, 10); // YYYY-MM-DD, unambiguous across midnight
53
+ const dateStr = now.toISOString().slice(0, 10); // YYYY-MM-DD in UTC, which can differ from the reader's local date
54
54
  const lines = [
55
55
  DIVIDER,
56
56
  `${productName} server session`,
@@ -7,7 +7,7 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
- import { Format } from '@hydranium/protocol';
10
+ import { Format, LEVEL_ORDER, type LogLevel, Logger, type LogThreshold } from '@hydranium/protocol';
11
11
  import { currentMemoryUsage, onProcessEvent, processPid } from '../../util/environment.js';
12
12
 
13
13
  /** Only append a memory suffix when the heap has moved by at least this much since the last log line. */
@@ -39,7 +39,7 @@ export function setLogFileSink(sink: LogFileSink | undefined): void {
39
39
  }
40
40
 
41
41
  /**
42
- * File-tee state for `LspLogger`'s emit. When
42
+ * File-tee state for `LspLogger`'s emit and the console tee. When
43
43
  * non-empty, every formatted log line is appended to the path in addition to
44
44
  * its LSP `window/logMessage` / console destination (see {@link teeLogLine}).
45
45
  * Diagnostic surface only — once the LSP connection binds, server logs route
@@ -69,6 +69,28 @@ const pendingLogLines: string[] = [];
69
69
  /** Matches any remaining `{name}` placeholder token. */
70
70
  const PLACEHOLDER_PATTERN = /\{[^}]+\}/;
71
71
 
72
+ /**
73
+ * `template` with `{pid}` replaced by the process id, known from the start, and
74
+ * each placeholder supplied so far by its value.
75
+ */
76
+ function substituteLogFilePlaceholders(template: string): string {
77
+ let path = template.split('{pid}').join(String(processPid() ?? 'unknown'));
78
+ for (const [name, value] of logFilePlaceholders) {
79
+ path = path.split(`{${name}}`).join(value);
80
+ }
81
+ return path;
82
+ }
83
+
84
+ /**
85
+ * Expand `template` the way the file-tee names its file: `{pid}` and each
86
+ * supplied placeholder by its value, each one still missing by
87
+ * `_startup-<pid>`. A file written beside the log, such as the CPU profile,
88
+ * names itself through this so both carry the same workspace token.
89
+ */
90
+ export function expandLogFilePlaceholders(template: string): string {
91
+ return substituteLogFilePlaceholders(template).replace(new RegExp(PLACEHOLDER_PATTERN, 'g'), `_startup-${processPid() ?? 'unknown'}`);
92
+ }
93
+
72
94
  /**
73
95
  * Recompute {@link resolvedLogFilePath} from the template + known placeholders.
74
96
  * Resolves (and flushes the pending buffer) only once no `{...}` token remains.
@@ -78,10 +100,7 @@ function tryResolveLogFilePath(): void {
78
100
  resolvedLogFilePath = undefined;
79
101
  return;
80
102
  }
81
- let path = logFileTemplate;
82
- for (const [name, value] of logFilePlaceholders) {
83
- path = path.split(`{${name}}`).join(value);
84
- }
103
+ const path = substituteLogFilePlaceholders(logFileTemplate);
85
104
  if (PLACEHOLDER_PATTERN.test(path)) {
86
105
  resolvedLogFilePath = undefined;
87
106
  // Target is pending — guarantee the buffer is flushed even if the process
@@ -116,12 +135,19 @@ function flushPendingLogLines(): void {
116
135
  /**
117
136
  * Set the file-tee target programmatically. Pass `undefined` to disable. The
118
137
  * path may contain `{placeholder}` tokens (e.g. `{workspace}`); lines buffer
119
- * until every token is supplied via {@link resolveLogFilePlaceholder}.
138
+ * until every token is supplied via {@link resolveLogFilePlaceholder}, except
139
+ * `{pid}`, which is the process id from the start.
120
140
  * Called by the `LspLogger` constructor's
121
141
  * one-time `HYDRANIUM_LOG_FILE` env baseline (and by tests).
142
+ *
143
+ * `level` becomes `Logger.setFileLevel`, cleared with the target and when
144
+ * omitted. Setting the file level apart from the target lets it outlive the
145
+ * file, and every sender keeps building lines above the process threshold
146
+ * that nothing writes.
122
147
  */
123
- export function setLogFilePath(path: string | undefined): void {
148
+ export function setLogFilePath(path: string | undefined, level?: LogThreshold): void {
124
149
  logFileTemplate = path && path.length > 0 ? path : undefined;
150
+ Logger.setFileLevel(logFileTemplate ? level : undefined);
125
151
  logFilePlaceholders.clear();
126
152
  pendingLogLines.length = 0;
127
153
  resolvedLogFilePath = undefined;
@@ -150,7 +176,7 @@ export function flushLogFileFallback(): void {
150
176
  if (!logFileTemplate || resolvedLogFilePath || pendingLogLines.length === 0) {
151
177
  return;
152
178
  }
153
- resolvedLogFilePath = logFileTemplate.replace(/\{[^}]+\}/g, `_startup-${processPid() ?? 'unknown'}`);
179
+ resolvedLogFilePath = expandLogFilePlaceholders(logFileTemplate);
154
180
  ensureLogDir(resolvedLogFilePath);
155
181
  flushPendingLogLines();
156
182
  }
@@ -173,20 +199,28 @@ export function getLogFilePath(): string | undefined {
173
199
 
174
200
  /**
175
201
  * Fan a single already-formatted log line out to the file-tee target, if one is
176
- * configured. Called by `LspLogger`'s emit in
177
- * addition to the LSP/console sink — log sinks fan out, they don't replace.
202
+ * configured and `level` is within the file's threshold
203
+ * (`Logger.getFileLevel() ?? Logger.getLevel()`). Called by `LspLogger`'s emit in
204
+ * addition to the LSP/console sink, and by the console tee before the console
205
+ * method it wraps — log sinks fan out, they don't replace.
178
206
  * While the target is still pending (unresolved `{placeholder}`), the line is
179
- * buffered instead of dropped.
207
+ * buffered instead of dropped. Where no sink is installed, as in a process
208
+ * that never loaded `@hydranium/core/node`, nothing is built or buffered,
209
+ * since nothing will write it. A caller whose line is costly to build passes
210
+ * a function, called only when the file takes the line.
180
211
  */
181
- export function teeLogLine(formatted: string): void {
182
- if (!logFileTemplate) {
212
+ export function teeLogLine(level: LogLevel, formatted: string | (() => string)): void {
213
+ if (!logFileTemplate || LEVEL_ORDER[level] > LEVEL_ORDER[Logger.getFileLevel() ?? Logger.getLevel()]) {
214
+ return;
215
+ }
216
+ if (!fileSink) {
183
217
  return;
184
218
  }
185
- const line = `${formatted}\n`;
219
+ const line = `${typeof formatted === 'string' ? formatted : formatted()}\n`;
186
220
  if (resolvedLogFilePath) {
187
221
  // The sink swallows its own errors; recursing into the logger here would
188
- // re-enter emit and loop. The LSP/console sink already delivered the line.
189
- fileSink?.append(resolvedLogFilePath, line);
222
+ // re-enter emit and loop. The caller delivers the line to its other sink.
223
+ fileSink.append(resolvedLogFilePath, line);
190
224
  } else {
191
225
  pendingLogLines.push(line);
192
226
  }