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

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 +886 -483
  53. package/lib/documents/hydranium-text-documents.js.map +1 -1
  54. package/lib/documents/index.d.ts +10 -2
  55. package/lib/documents/index.d.ts.map +1 -1
  56. package/lib/documents/index.js +10 -2
  57. package/lib/documents/index.js.map +1 -1
  58. package/lib/documents/language-client-shadow.d.ts +234 -0
  59. package/lib/documents/language-client-shadow.d.ts.map +1 -0
  60. package/lib/documents/language-client-shadow.js +306 -0
  61. package/lib/documents/language-client-shadow.js.map +1 -0
  62. package/lib/documents/model-ledger.d.ts +47 -0
  63. package/lib/documents/model-ledger.d.ts.map +1 -0
  64. package/lib/documents/model-ledger.js +30 -0
  65. package/lib/documents/model-ledger.js.map +1 -0
  66. package/lib/documents/text-ledger.d.ts +64 -0
  67. package/lib/documents/text-ledger.d.ts.map +1 -0
  68. package/lib/documents/text-ledger.js +63 -0
  69. package/lib/documents/text-ledger.js.map +1 -0
  70. package/lib/documents/version-sync-service.d.ts +138 -0
  71. package/lib/documents/version-sync-service.d.ts.map +1 -0
  72. package/lib/documents/version-sync-service.js +173 -0
  73. package/lib/documents/version-sync-service.js.map +1 -0
  74. package/lib/index.d.ts +4 -0
  75. package/lib/index.d.ts.map +1 -1
  76. package/lib/index.js +7 -0
  77. package/lib/index.js.map +1 -1
  78. package/lib/langium/ast-extension/ast-extension-service.d.ts +42 -31
  79. package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
  80. package/lib/langium/ast-extension/ast-extension-service.js +45 -19
  81. package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
  82. package/lib/langium/ast-extension/ast-node-builder.d.ts +12 -7
  83. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  84. package/lib/langium/ast-extension/ast-node-builder.js +25 -9
  85. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  86. package/lib/langium/bootstrap.d.ts +49 -36
  87. package/lib/langium/bootstrap.d.ts.map +1 -1
  88. package/lib/langium/bootstrap.js +83 -44
  89. package/lib/langium/bootstrap.js.map +1 -1
  90. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +9 -9
  91. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
  92. package/lib/langium/build-phase-pass/build-phase-pass-service.js +25 -16
  93. package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
  94. package/lib/langium/build-phase-pass/build-phase-pass.d.ts +20 -8
  95. package/lib/langium/build-phase-pass/build-phase-pass.d.ts.map +1 -1
  96. package/lib/langium/build-phase-pass/build-phase-pass.js +20 -0
  97. package/lib/langium/build-phase-pass/build-phase-pass.js.map +1 -1
  98. package/lib/langium/composite-ast-reflection.d.ts +46 -0
  99. package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
  100. package/lib/langium/composite-ast-reflection.js +97 -0
  101. package/lib/langium/composite-ast-reflection.js.map +1 -0
  102. package/lib/langium/config/configuration-provider.d.ts +81 -0
  103. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  104. package/lib/langium/config/configuration-provider.js +112 -0
  105. package/lib/langium/config/configuration-provider.js.map +1 -0
  106. package/lib/langium/config/index.d.ts +1 -0
  107. package/lib/langium/config/index.d.ts.map +1 -1
  108. package/lib/langium/config/index.js +1 -0
  109. package/lib/langium/config/index.js.map +1 -1
  110. package/lib/langium/config/settings.js.map +1 -1
  111. package/lib/langium/diagnostics/console-tee.d.ts +27 -0
  112. package/lib/langium/diagnostics/console-tee.d.ts.map +1 -0
  113. package/lib/langium/diagnostics/console-tee.js +142 -0
  114. package/lib/langium/diagnostics/console-tee.js.map +1 -0
  115. package/lib/langium/diagnostics/format-log-arg.d.ts +18 -0
  116. package/lib/langium/diagnostics/format-log-arg.d.ts.map +1 -0
  117. package/lib/langium/diagnostics/format-log-arg.js +36 -0
  118. package/lib/langium/diagnostics/format-log-arg.js.map +1 -0
  119. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +9 -20
  120. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
  121. package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
  122. package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
  123. package/lib/langium/diagnostics/log-preamble.js +1 -1
  124. package/lib/langium/diagnostics/log-preamble.js.map +1 -1
  125. package/lib/langium/diagnostics/logger.d.ts +25 -6
  126. package/lib/langium/diagnostics/logger.d.ts.map +1 -1
  127. package/lib/langium/diagnostics/logger.js +49 -17
  128. package/lib/langium/diagnostics/logger.js.map +1 -1
  129. package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
  130. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  131. package/lib/langium/diagnostics/lsp-logger.js +68 -45
  132. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  133. package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
  134. package/lib/langium/diagnostics/server-tracer.js.map +1 -1
  135. package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
  136. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  137. package/lib/langium/document-builder/build-pipeline-integration.js +28 -30
  138. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  139. package/lib/langium/document-builder/build-session.d.ts +6 -5
  140. package/lib/langium/document-builder/build-session.d.ts.map +1 -1
  141. package/lib/langium/document-builder/build-session.js +5 -5
  142. package/lib/langium/document-builder/build-session.js.map +1 -1
  143. package/lib/langium/document-builder/document-builder.d.ts +283 -41
  144. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  145. package/lib/langium/document-builder/document-builder.js +448 -78
  146. package/lib/langium/document-builder/document-builder.js.map +1 -1
  147. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  148. package/lib/langium/documentation/comment-provider.js.map +1 -1
  149. package/lib/langium/integration-services.d.ts +40 -24
  150. package/lib/langium/integration-services.d.ts.map +1 -1
  151. package/lib/langium/integration-services.js +7 -4
  152. package/lib/langium/integration-services.js.map +1 -1
  153. package/lib/langium/integrity/integrity-rule.d.ts +17 -8
  154. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  155. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  156. package/lib/langium/integrity/integrity-service.d.ts +95 -27
  157. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  158. package/lib/langium/integrity/integrity-service.js +303 -63
  159. package/lib/langium/integrity/integrity-service.js.map +1 -1
  160. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  161. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  162. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  163. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  164. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  165. package/lib/langium/labeling/label-provider.js.map +1 -1
  166. package/lib/langium/language-module.d.ts +30 -5
  167. package/lib/langium/language-module.d.ts.map +1 -1
  168. package/lib/langium/language-module.js +18 -4
  169. package/lib/langium/language-module.js.map +1 -1
  170. package/lib/langium/model-service/client-session.d.ts +383 -0
  171. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  172. package/lib/langium/model-service/client-session.js +455 -0
  173. package/lib/langium/model-service/client-session.js.map +1 -0
  174. package/lib/langium/model-service/index.d.ts +2 -0
  175. package/lib/langium/model-service/index.d.ts.map +1 -1
  176. package/lib/langium/model-service/index.js +2 -0
  177. package/lib/langium/model-service/index.js.map +1 -1
  178. package/lib/langium/model-service/model-events.d.ts +66 -0
  179. package/lib/langium/model-service/model-events.d.ts.map +1 -0
  180. package/lib/langium/model-service/model-events.js +10 -0
  181. package/lib/langium/model-service/model-events.js.map +1 -0
  182. package/lib/langium/model-service/model-service.d.ts +456 -300
  183. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  184. package/lib/langium/model-service/model-service.js +571 -466
  185. package/lib/langium/model-service/model-service.js.map +1 -1
  186. package/lib/langium/module.d.ts +141 -40
  187. package/lib/langium/module.d.ts.map +1 -1
  188. package/lib/langium/module.js +52 -40
  189. package/lib/langium/module.js.map +1 -1
  190. package/lib/langium/naming/name-provider.d.ts +32 -7
  191. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  192. package/lib/langium/naming/name-provider.js +10 -4
  193. package/lib/langium/naming/name-provider.js.map +1 -1
  194. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  195. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  196. package/lib/langium/project/abstract-project-manager.js +13 -6
  197. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  198. package/lib/langium/project/project-change-event.d.ts +2 -2
  199. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  200. package/lib/langium/project/single-project-manager.js.map +1 -1
  201. package/lib/langium/residency/cst-residency-service.d.ts +38 -14
  202. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  203. package/lib/langium/residency/cst-residency-service.js +24 -58
  204. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  205. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  206. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  207. package/lib/langium/scope/fallback-scope.d.ts +27 -0
  208. package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
  209. package/lib/langium/scope/fallback-scope.js +35 -0
  210. package/lib/langium/scope/fallback-scope.js.map +1 -0
  211. package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
  212. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  213. package/lib/langium/scope/hydranium-scope-computation.js +38 -39
  214. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  215. package/lib/langium/scope/hydranium-scope-provider.d.ts +29 -11
  216. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  217. package/lib/langium/scope/hydranium-scope-provider.js +37 -15
  218. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  219. package/lib/langium/scope/index.d.ts +1 -0
  220. package/lib/langium/scope/index.d.ts.map +1 -1
  221. package/lib/langium/scope/index.js +1 -0
  222. package/lib/langium/scope/index.js.map +1 -1
  223. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  224. package/lib/langium/scope/reference-builder.js.map +1 -1
  225. package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
  226. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  227. package/lib/langium/scope/reference-candidate-provider.js +3 -2
  228. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  229. package/lib/langium/scope/scope-extension-service.d.ts +41 -37
  230. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  231. package/lib/langium/scope/scope-extension-service.js +57 -29
  232. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  233. package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
  234. package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
  235. package/lib/langium/scope/scoped-ast-node-description.js +1 -3
  236. package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
  237. package/lib/langium/serialization/abstract-serializer.d.ts +38 -27
  238. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  239. package/lib/langium/serialization/abstract-serializer.js +54 -30
  240. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  241. package/lib/langium/serialization/json-serializer.d.ts +8 -1
  242. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  243. package/lib/langium/serialization/json-serializer.js +13 -3
  244. package/lib/langium/serialization/json-serializer.js.map +1 -1
  245. package/lib/langium/serialization/serializer.d.ts +1 -1
  246. package/lib/langium/serialization/yaml-serializer.d.ts +4 -0
  247. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  248. package/lib/langium/serialization/yaml-serializer.js +4 -0
  249. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  250. package/lib/langium/service-registry.d.ts +29 -1
  251. package/lib/langium/service-registry.d.ts.map +1 -1
  252. package/lib/langium/service-registry.js +37 -0
  253. package/lib/langium/service-registry.js.map +1 -1
  254. package/lib/langium/shared-services.d.ts +13 -7
  255. package/lib/langium/shared-services.d.ts.map +1 -1
  256. package/lib/langium/shared-services.js.map +1 -1
  257. package/lib/langium/single-langium-copy.d.ts +22 -0
  258. package/lib/langium/single-langium-copy.d.ts.map +1 -0
  259. package/lib/langium/single-langium-copy.js +36 -0
  260. package/lib/langium/single-langium-copy.js.map +1 -0
  261. package/lib/langium/transfer/transfer-encoder.d.ts +86 -37
  262. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  263. package/lib/langium/transfer/transfer-encoder.js +36 -25
  264. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  265. package/lib/langium/trivia/comment-preserver.d.ts +471 -0
  266. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  267. package/lib/langium/trivia/comment-preserver.js +1026 -0
  268. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  269. package/lib/langium/trivia/document-ending-preserver.d.ts +51 -0
  270. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  271. package/lib/langium/trivia/document-ending-preserver.js +62 -0
  272. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  273. package/lib/langium/trivia/index.d.ts +14 -0
  274. package/lib/langium/trivia/index.d.ts.map +1 -0
  275. package/lib/langium/trivia/index.js +14 -0
  276. package/lib/langium/trivia/index.js.map +1 -0
  277. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  278. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  279. package/lib/langium/trivia/trivia-contribution.js +10 -0
  280. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  281. package/lib/langium/trivia/trivia-preserver.d.ts +52 -0
  282. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  283. package/lib/langium/trivia/trivia-preserver.js +10 -0
  284. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  285. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  286. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  287. package/lib/langium/trivia/trivia-service.js +56 -0
  288. package/lib/langium/trivia/trivia-service.js.map +1 -0
  289. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  290. package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
  291. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  292. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  293. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  294. package/lib/langium/validation/document-validator.d.ts +168 -23
  295. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  296. package/lib/langium/validation/document-validator.js +263 -25
  297. package/lib/langium/validation/document-validator.js.map +1 -1
  298. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  299. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  300. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  301. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  302. package/lib/langium/workspace/document-uri-policy.d.ts +24 -15
  303. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  304. package/lib/langium/workspace/document-uri-policy.js +22 -13
  305. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  306. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  307. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  308. package/lib/langium/workspace/file-not-found.js +31 -0
  309. package/lib/langium/workspace/file-not-found.js.map +1 -0
  310. package/lib/langium/workspace/file-system-provider.d.ts +167 -8
  311. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  312. package/lib/langium/workspace/file-system-provider.js +115 -13
  313. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  314. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +31 -1
  315. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  316. package/lib/langium/workspace/hydranium-langium-document-factory.js +54 -0
  317. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  318. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
  319. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  320. package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
  321. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  322. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +103 -21
  323. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  324. package/lib/langium/workspace/hydranium-workspace-manager.js +184 -31
  325. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  326. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
  327. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  328. package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
  329. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  330. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  331. package/lib/langium/workspace/index-manager.js.map +1 -1
  332. package/lib/langium/workspace/index.d.ts +1 -0
  333. package/lib/langium/workspace/index.d.ts.map +1 -1
  334. package/lib/langium/workspace/index.js +1 -0
  335. package/lib/langium/workspace/index.js.map +1 -1
  336. package/lib/langium/workspace/initialize-workspace.d.ts +40 -3
  337. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  338. package/lib/langium/workspace/initialize-workspace.js +68 -3
  339. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  340. package/lib/langium/workspace/langium-documents.d.ts +7 -0
  341. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  342. package/lib/langium/workspace/langium-documents.js +18 -1
  343. package/lib/langium/workspace/langium-documents.js.map +1 -1
  344. package/lib/langium/workspace/persistent-file-system-provider.d.ts +16 -10
  345. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  346. package/lib/langium/workspace/persistent-file-system-provider.js +25 -13
  347. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  348. package/lib/langium/workspace/self-save-registry.d.ts +84 -0
  349. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  350. package/lib/{documents → langium/workspace}/self-save-registry.js +33 -22
  351. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  352. package/lib/langium/workspace/virtual-document.d.ts +55 -21
  353. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  354. package/lib/langium/workspace/virtual-document.js +87 -24
  355. package/lib/langium/workspace/virtual-document.js.map +1 -1
  356. package/lib/langium/workspace/write-lock-scope.d.ts +22 -10
  357. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  358. package/lib/langium/workspace/write-lock-scope.js +15 -5
  359. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  360. package/lib/launcher/integrated-server.d.ts +3 -1
  361. package/lib/launcher/integrated-server.d.ts.map +1 -1
  362. package/lib/locale/server-locale.d.ts +19 -5
  363. package/lib/locale/server-locale.d.ts.map +1 -1
  364. package/lib/locale/server-locale.js +1 -1
  365. package/lib/locale/server-locale.js.map +1 -1
  366. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  367. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  368. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  369. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  370. package/lib/lsp/connection-features.d.ts +23 -0
  371. package/lib/lsp/connection-features.d.ts.map +1 -0
  372. package/lib/lsp/connection-features.js +60 -0
  373. package/lib/lsp/connection-features.js.map +1 -0
  374. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  375. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  376. package/lib/lsp/diagnostics-connection.js +53 -0
  377. package/lib/lsp/diagnostics-connection.js.map +1 -0
  378. package/lib/lsp/hydranium-document-update-handler.d.ts +126 -82
  379. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  380. package/lib/lsp/hydranium-document-update-handler.js +235 -102
  381. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  382. package/lib/lsp/index.d.ts +4 -1
  383. package/lib/lsp/index.d.ts.map +1 -1
  384. package/lib/lsp/index.js +4 -1
  385. package/lib/lsp/index.js.map +1 -1
  386. package/lib/lsp/lsp-latency.d.ts +39 -0
  387. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  388. package/lib/lsp/lsp-latency.js +58 -0
  389. package/lib/lsp/lsp-latency.js.map +1 -0
  390. package/lib/lsp/save-text-document.d.ts +31 -0
  391. package/lib/lsp/save-text-document.d.ts.map +1 -0
  392. package/lib/lsp/save-text-document.js +52 -0
  393. package/lib/lsp/save-text-document.js.map +1 -0
  394. package/lib/lsp/semantic-token-provider.d.ts +34 -1
  395. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  396. package/lib/lsp/semantic-token-provider.js +55 -8
  397. package/lib/lsp/semantic-token-provider.js.map +1 -1
  398. package/lib/lsp/shared-module.d.ts +4 -8
  399. package/lib/lsp/shared-module.d.ts.map +1 -1
  400. package/lib/lsp/shared-module.js.map +1 -1
  401. package/lib/lsp/start-language-server.d.ts +11 -7
  402. package/lib/lsp/start-language-server.d.ts.map +1 -1
  403. package/lib/lsp/start-language-server.js +18 -7
  404. package/lib/lsp/start-language-server.js.map +1 -1
  405. package/lib/messages/carriers.d.ts +3 -5
  406. package/lib/messages/carriers.d.ts.map +1 -1
  407. package/lib/messages/carriers.js +3 -5
  408. package/lib/messages/carriers.js.map +1 -1
  409. package/lib/messages/index.d.ts +2 -2
  410. package/lib/messages/index.d.ts.map +1 -1
  411. package/lib/messages/index.js +2 -2
  412. package/lib/messages/index.js.map +1 -1
  413. package/lib/messages/renderer.d.ts +32 -7
  414. package/lib/messages/renderer.d.ts.map +1 -1
  415. package/lib/messages/renderer.js +7 -1
  416. package/lib/messages/renderer.js.map +1 -1
  417. package/lib/node/event-loop-monitor.d.ts.map +1 -1
  418. package/lib/node/event-loop-monitor.js +2 -1
  419. package/lib/node/event-loop-monitor.js.map +1 -1
  420. package/lib/node/heap-ceiling.d.ts +61 -0
  421. package/lib/node/heap-ceiling.d.ts.map +1 -0
  422. package/lib/node/heap-ceiling.js +72 -0
  423. package/lib/node/heap-ceiling.js.map +1 -0
  424. package/lib/node/index.d.ts +1 -1
  425. package/lib/node/index.d.ts.map +1 -1
  426. package/lib/node/index.js +5 -1
  427. package/lib/node/index.js.map +1 -1
  428. package/lib/node/latency-from-env.d.ts +1 -1
  429. package/lib/node/latency-from-env.js +1 -1
  430. package/lib/node/lint-grammar.js.map +1 -1
  431. package/lib/node/log-file-sink.d.ts +3 -2
  432. package/lib/node/log-file-sink.d.ts.map +1 -1
  433. package/lib/node/log-file-sink.js +6 -2
  434. package/lib/node/log-file-sink.js.map +1 -1
  435. package/lib/node/log-preamble-node.d.ts +5 -3
  436. package/lib/node/log-preamble-node.d.ts.map +1 -1
  437. package/lib/node/log-preamble-node.js +13 -10
  438. package/lib/node/log-preamble-node.js.map +1 -1
  439. package/lib/node/measure-memory.d.ts.map +1 -1
  440. package/lib/node/measure-memory.js +5 -4
  441. package/lib/node/measure-memory.js.map +1 -1
  442. package/lib/node/memory-monitor.d.ts +2 -2
  443. package/lib/node/memory-monitor.d.ts.map +1 -1
  444. package/lib/node/memory-monitor.js +9 -10
  445. package/lib/node/memory-monitor.js.map +1 -1
  446. package/lib/node/node-file-system-provider.d.ts +67 -9
  447. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  448. package/lib/node/node-file-system-provider.js +198 -53
  449. package/lib/node/node-file-system-provider.js.map +1 -1
  450. package/lib/node/profile-capture.d.ts +12 -4
  451. package/lib/node/profile-capture.d.ts.map +1 -1
  452. package/lib/node/profile-capture.js +8 -6
  453. package/lib/node/profile-capture.js.map +1 -1
  454. package/lib/node/profile-digest.js.map +1 -1
  455. package/lib/node/profiling-run.d.ts +13 -3
  456. package/lib/node/profiling-run.d.ts.map +1 -1
  457. package/lib/node/profiling-run.js +17 -8
  458. package/lib/node/profiling-run.js.map +1 -1
  459. package/lib/node/rename-over-open-readers.d.ts +61 -0
  460. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  461. package/lib/node/rename-over-open-readers.js +80 -0
  462. package/lib/node/rename-over-open-readers.js.map +1 -0
  463. package/lib/node/server-diagnostics.js +1 -1
  464. package/lib/node/server-diagnostics.js.map +1 -1
  465. package/lib/node/server-state-snapshot.js +4 -4
  466. package/lib/node/server-state-snapshot.js.map +1 -1
  467. package/lib/node/socket-launcher.d.ts +43 -7
  468. package/lib/node/socket-launcher.d.ts.map +1 -1
  469. package/lib/node/socket-launcher.js +42 -7
  470. package/lib/node/socket-launcher.js.map +1 -1
  471. package/lib/node/startup-cpu-profile.d.ts +29 -0
  472. package/lib/node/startup-cpu-profile.d.ts.map +1 -0
  473. package/lib/node/startup-cpu-profile.js +91 -0
  474. package/lib/node/startup-cpu-profile.js.map +1 -0
  475. package/lib/node/stdio-launcher.d.ts +13 -13
  476. package/lib/node/stdio-launcher.d.ts.map +1 -1
  477. package/lib/node/stdio-launcher.js +21 -11
  478. package/lib/node/stdio-launcher.js.map +1 -1
  479. package/lib/testing/document-uri-policy-conformance.js +1 -1
  480. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  481. package/lib/testing/fake-description.js.map +1 -1
  482. package/lib/testing/fake-document.d.ts +2 -1
  483. package/lib/testing/fake-document.d.ts.map +1 -1
  484. package/lib/testing/fake-document.js.map +1 -1
  485. package/lib/testing/index.d.ts +1 -1
  486. package/lib/testing/index.d.ts.map +1 -1
  487. package/lib/testing/index.js +2 -1
  488. package/lib/testing/index.js.map +1 -1
  489. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  490. package/lib/testing/langium-test-helpers.js +1 -0
  491. package/lib/testing/langium-test-helpers.js.map +1 -1
  492. package/lib/testing/make-noop-language-services.js.map +1 -1
  493. package/lib/testing/make-noop-shared-services.d.ts +4 -4
  494. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  495. package/lib/testing/make-noop-shared-services.js +4 -4
  496. package/lib/testing/make-noop-shared-services.js.map +1 -1
  497. package/lib/testing/make-test-services.d.ts +51 -20
  498. package/lib/testing/make-test-services.d.ts.map +1 -1
  499. package/lib/testing/make-test-services.js +29 -13
  500. package/lib/testing/make-test-services.js.map +1 -1
  501. package/lib/testing/make-test-tracer.d.ts +12 -0
  502. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  503. package/lib/testing/make-test-tracer.js +13 -0
  504. package/lib/testing/make-test-tracer.js.map +1 -1
  505. package/lib/testing/node/applied-edit-capture.d.ts +29 -0
  506. package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
  507. package/lib/testing/node/applied-edit-capture.js +117 -0
  508. package/lib/testing/node/applied-edit-capture.js.map +1 -0
  509. package/lib/testing/node/golden-corpus.js.map +1 -1
  510. package/lib/testing/node/index.d.ts +1 -0
  511. package/lib/testing/node/index.d.ts.map +1 -1
  512. package/lib/testing/node/index.js +1 -0
  513. package/lib/testing/node/index.js.map +1 -1
  514. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  515. package/lib/testing/node/lsp-harness.js +2 -0
  516. package/lib/testing/node/lsp-harness.js.map +1 -1
  517. package/lib/testing/node/lsp-server-connection.d.ts +21 -6
  518. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  519. package/lib/testing/node/lsp-server-connection.js +49 -106
  520. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  521. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  522. package/lib/testing/node/scratch-workspace.js +10 -5
  523. package/lib/testing/node/scratch-workspace.js.map +1 -1
  524. package/lib/testing/node/spawned-server.d.ts +30 -1
  525. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  526. package/lib/testing/node/spawned-server.js +39 -2
  527. package/lib/testing/node/spawned-server.js.map +1 -1
  528. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  529. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  530. package/lib/testing/node/unhandled-rejections.js +32 -0
  531. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  532. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  533. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  534. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  535. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  536. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  537. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  538. package/lib/testing/playwright/index.d.ts +1 -0
  539. package/lib/testing/playwright/index.d.ts.map +1 -1
  540. package/lib/testing/playwright/index.js +1 -0
  541. package/lib/testing/playwright/index.js.map +1 -1
  542. package/lib/testing/playwright/server-log-capture.d.ts +46 -16
  543. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  544. package/lib/testing/playwright/server-log-capture.js +111 -40
  545. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  546. package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
  547. package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
  548. package/lib/testing/playwright/server-log-fixture.js +25 -6
  549. package/lib/testing/playwright/server-log-fixture.js.map +1 -1
  550. package/lib/testing/playwright/server-log-region.d.ts +15 -0
  551. package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
  552. package/lib/testing/playwright/server-log-region.js +30 -0
  553. package/lib/testing/playwright/server-log-region.js.map +1 -0
  554. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  555. package/lib/testing/playwright/server-log-rename-reporter.js +4 -3
  556. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  557. package/lib/testing/run-update-pipeline.d.ts +8 -5
  558. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  559. package/lib/testing/run-update-pipeline.js.map +1 -1
  560. package/lib/testing/stub-ast-document-manager.d.ts +11 -52
  561. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  562. package/lib/testing/stub-ast-document-manager.js +31 -62
  563. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  564. package/lib/testing/stub-document-builder.d.ts +33 -11
  565. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  566. package/lib/testing/stub-document-builder.js +103 -5
  567. package/lib/testing/stub-document-builder.js.map +1 -1
  568. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  569. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  570. package/lib/testing/stub-hydranium-text-documents.js +132 -16
  571. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  572. package/lib/testing/stub-index-manager.js.map +1 -1
  573. package/lib/testing/stub-langium-documents.d.ts +3 -2
  574. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  575. package/lib/testing/stub-langium-documents.js.map +1 -1
  576. package/lib/testing/stub-model-service.d.ts +9 -8
  577. package/lib/testing/stub-model-service.d.ts.map +1 -1
  578. package/lib/testing/stub-model-service.js +6 -6
  579. package/lib/testing/stub-model-service.js.map +1 -1
  580. package/lib/testing/stub-project-manager.js.map +1 -1
  581. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  582. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  583. package/lib/testing/stub-service-registry.d.ts +1 -1
  584. package/lib/testing/stub-service-registry.js.map +1 -1
  585. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  586. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  587. package/lib/testing/stub-writable-file-system.js +2 -1
  588. package/lib/testing/stub-writable-file-system.js.map +1 -1
  589. package/lib/util/connection-liveness.d.ts +22 -6
  590. package/lib/util/connection-liveness.d.ts.map +1 -1
  591. package/lib/util/connection-liveness.js +74 -15
  592. package/lib/util/connection-liveness.js.map +1 -1
  593. package/lib/util/environment.d.ts +7 -0
  594. package/lib/util/environment.d.ts.map +1 -1
  595. package/lib/util/environment.js +15 -1
  596. package/lib/util/environment.js.map +1 -1
  597. package/lib/util/registry.d.ts.map +1 -1
  598. package/package.json +39 -58
  599. package/src/browser/host-heads-in-worker.ts +218 -0
  600. package/src/browser/index.ts +17 -0
  601. package/src/browser/indexeddb-file-system-store.ts +192 -0
  602. package/src/browser/start-language-server-in-worker.ts +56 -0
  603. package/src/documents/ast-document-manager.ts +467 -233
  604. package/src/documents/client-ids.ts +5 -22
  605. package/src/documents/client-session-errors.ts +24 -0
  606. package/src/documents/client-session-registry.ts +262 -0
  607. package/src/documents/dirty-state-tracker.ts +167 -0
  608. package/src/documents/document-release-handler.ts +404 -0
  609. package/src/documents/document-release-scheduler.ts +121 -0
  610. package/src/documents/file-system-task-queue.ts +74 -0
  611. package/src/documents/hydranium-text-documents.ts +1011 -595
  612. package/src/documents/index.ts +10 -2
  613. package/src/documents/language-client-shadow.ts +501 -0
  614. package/src/documents/model-ledger.ts +66 -0
  615. package/src/documents/text-ledger.ts +112 -0
  616. package/src/documents/version-sync-service.ts +275 -0
  617. package/src/index.ts +7 -0
  618. package/src/langium/ast-extension/ast-extension-service.ts +77 -41
  619. package/src/langium/ast-extension/ast-node-builder.ts +35 -13
  620. package/src/langium/bootstrap.ts +87 -51
  621. package/src/langium/build-phase-pass/build-phase-pass-service.ts +29 -19
  622. package/src/langium/build-phase-pass/build-phase-pass.ts +37 -8
  623. package/src/langium/composite-ast-reflection.ts +112 -0
  624. package/src/langium/config/configuration-provider.ts +119 -0
  625. package/src/langium/config/index.ts +1 -0
  626. package/src/langium/diagnostics/console-tee.ts +151 -0
  627. package/src/langium/diagnostics/format-log-arg.ts +36 -0
  628. package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
  629. package/src/langium/diagnostics/log-preamble.ts +1 -1
  630. package/src/langium/diagnostics/logger.ts +51 -17
  631. package/src/langium/diagnostics/lsp-logger.ts +70 -44
  632. package/src/langium/document-builder/build-pipeline-integration.ts +46 -32
  633. package/src/langium/document-builder/build-session.ts +4 -3
  634. package/src/langium/document-builder/document-builder.ts +553 -78
  635. package/src/langium/integration-services.ts +59 -28
  636. package/src/langium/integrity/integrity-rule.ts +17 -8
  637. package/src/langium/integrity/integrity-service.ts +332 -69
  638. package/src/langium/language-module.ts +49 -8
  639. package/src/langium/model-service/client-session.ts +718 -0
  640. package/src/langium/model-service/index.ts +2 -0
  641. package/src/langium/model-service/model-events.ts +80 -0
  642. package/src/langium/model-service/model-service.ts +878 -494
  643. package/src/langium/module.ts +195 -72
  644. package/src/langium/naming/name-provider.ts +34 -8
  645. package/src/langium/project/abstract-project-manager.ts +13 -5
  646. package/src/langium/project/project-change-event.ts +2 -2
  647. package/src/langium/residency/cst-residency-service.ts +54 -19
  648. package/src/langium/scope/fallback-scope.ts +38 -0
  649. package/src/langium/scope/hydranium-scope-computation.ts +45 -44
  650. package/src/langium/scope/hydranium-scope-provider.ts +49 -16
  651. package/src/langium/scope/index.ts +1 -0
  652. package/src/langium/scope/reference-candidate-provider.ts +6 -5
  653. package/src/langium/scope/scope-extension-service.ts +74 -59
  654. package/src/langium/scope/scoped-ast-node-description.ts +1 -3
  655. package/src/langium/serialization/abstract-serializer.ts +57 -41
  656. package/src/langium/serialization/json-serializer.ts +14 -3
  657. package/src/langium/serialization/serializer.ts +1 -1
  658. package/src/langium/serialization/yaml-serializer.ts +4 -0
  659. package/src/langium/service-registry.ts +41 -2
  660. package/src/langium/shared-services.ts +16 -7
  661. package/src/langium/single-langium-copy.ts +42 -0
  662. package/src/langium/transfer/transfer-encoder.ts +104 -47
  663. package/src/langium/trivia/comment-preserver.ts +1241 -0
  664. package/src/langium/trivia/document-ending-preserver.ts +71 -0
  665. package/src/langium/trivia/index.ts +14 -0
  666. package/src/langium/trivia/trivia-contribution.ts +39 -0
  667. package/src/langium/trivia/trivia-preserver.ts +56 -0
  668. package/src/langium/trivia/trivia-service.ts +99 -0
  669. package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
  670. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  671. package/src/langium/validation/document-validator.ts +311 -30
  672. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  673. package/src/langium/workspace/document-uri-policy.ts +32 -18
  674. package/src/langium/workspace/file-not-found.ts +35 -0
  675. package/src/langium/workspace/file-system-provider.ts +258 -16
  676. package/src/langium/workspace/hydranium-langium-document-factory.ts +83 -0
  677. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
  678. package/src/langium/workspace/hydranium-workspace-manager.ts +212 -35
  679. package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
  680. package/src/langium/workspace/index.ts +1 -0
  681. package/src/langium/workspace/initialize-workspace.ts +96 -4
  682. package/src/langium/workspace/langium-documents.ts +19 -1
  683. package/src/langium/workspace/persistent-file-system-provider.ts +27 -15
  684. package/src/langium/workspace/self-save-registry.ts +118 -0
  685. package/src/langium/workspace/virtual-document.ts +106 -25
  686. package/src/langium/workspace/write-lock-scope.ts +27 -12
  687. package/src/launcher/integrated-server.ts +3 -1
  688. package/src/locale/server-locale.ts +20 -5
  689. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  690. package/src/lsp/connection-features.ts +67 -0
  691. package/src/lsp/diagnostics-connection.ts +56 -0
  692. package/src/lsp/hydranium-document-update-handler.ts +285 -111
  693. package/src/lsp/index.ts +4 -1
  694. package/src/lsp/lsp-latency.ts +62 -0
  695. package/src/lsp/save-text-document.ts +63 -0
  696. package/src/lsp/semantic-token-provider.ts +74 -7
  697. package/src/lsp/shared-module.ts +4 -8
  698. package/src/lsp/start-language-server.ts +18 -7
  699. package/src/messages/carriers.ts +3 -5
  700. package/src/messages/index.ts +11 -2
  701. package/src/messages/renderer.ts +34 -6
  702. package/src/node/event-loop-monitor.ts +2 -1
  703. package/src/node/heap-ceiling.ts +108 -0
  704. package/src/node/index.ts +5 -1
  705. package/src/node/latency-from-env.ts +1 -1
  706. package/src/node/log-file-sink.ts +6 -2
  707. package/src/node/log-preamble-node.ts +20 -10
  708. package/src/node/measure-memory.ts +5 -4
  709. package/src/node/memory-monitor.ts +10 -10
  710. package/src/node/node-file-system-provider.ts +214 -57
  711. package/src/node/profile-capture.ts +16 -15
  712. package/src/node/profiling-run.ts +30 -8
  713. package/src/node/rename-over-open-readers.ts +94 -0
  714. package/src/node/server-diagnostics.ts +1 -1
  715. package/src/node/server-state-snapshot.ts +5 -5
  716. package/src/node/socket-launcher.ts +78 -14
  717. package/src/node/startup-cpu-profile.ts +94 -0
  718. package/src/node/stdio-launcher.ts +29 -19
  719. package/src/testing/document-uri-policy-conformance.ts +1 -1
  720. package/src/testing/fake-document.ts +2 -1
  721. package/src/testing/index.ts +2 -1
  722. package/src/testing/langium-test-helpers.ts +1 -0
  723. package/src/testing/make-noop-shared-services.ts +6 -6
  724. package/src/testing/make-test-services.ts +93 -41
  725. package/src/testing/make-test-tracer.ts +26 -0
  726. package/src/testing/node/applied-edit-capture.ts +141 -0
  727. package/src/testing/node/index.ts +1 -0
  728. package/src/testing/node/lsp-harness.ts +2 -0
  729. package/src/testing/node/lsp-server-connection.ts +83 -119
  730. package/src/testing/node/scratch-workspace.ts +10 -5
  731. package/src/testing/node/spawned-server.ts +57 -3
  732. package/src/testing/node/unhandled-rejections.ts +31 -0
  733. package/src/testing/parse-semantic-root.ts +1 -1
  734. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  735. package/src/testing/playwright/index.ts +1 -0
  736. package/src/testing/playwright/server-log-capture.ts +137 -47
  737. package/src/testing/playwright/server-log-fixture.ts +46 -6
  738. package/src/testing/playwright/server-log-region.ts +32 -0
  739. package/src/testing/playwright/server-log-rename-reporter.ts +4 -3
  740. package/src/testing/run-update-pipeline.ts +8 -5
  741. package/src/testing/stub-ast-document-manager.ts +47 -128
  742. package/src/testing/stub-document-builder.ts +133 -18
  743. package/src/testing/stub-hydranium-text-documents.ts +184 -27
  744. package/src/testing/stub-langium-documents.ts +3 -2
  745. package/src/testing/stub-model-service.ts +11 -10
  746. package/src/testing/stub-self-save-registry.ts +1 -1
  747. package/src/testing/stub-service-registry.ts +1 -1
  748. package/src/testing/stub-writable-file-system.ts +3 -2
  749. package/src/util/connection-liveness.ts +80 -15
  750. package/src/util/environment.ts +24 -2
  751. package/lib/documents/language-client-text-shadow.d.ts +0 -101
  752. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  753. package/lib/documents/language-client-text-shadow.js +0 -156
  754. package/lib/documents/language-client-text-shadow.js.map +0 -1
  755. package/lib/documents/self-save-registry.d.ts +0 -55
  756. package/lib/documents/self-save-registry.d.ts.map +0 -1
  757. package/lib/documents/self-save-registry.js.map +0 -1
  758. package/lib/lsp/instrument-connection.d.ts +0 -36
  759. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  760. package/lib/lsp/instrument-connection.js +0 -62
  761. package/lib/lsp/instrument-connection.js.map +0 -1
  762. package/lib/node/process-memory.d.ts +0 -66
  763. package/lib/node/process-memory.d.ts.map +0 -1
  764. package/lib/node/process-memory.js +0 -252
  765. package/lib/node/process-memory.js.map +0 -1
  766. package/src/documents/language-client-text-shadow.ts +0 -175
  767. package/src/documents/self-save-registry.ts +0 -81
  768. package/src/lsp/instrument-connection.ts +0 -66
  769. package/src/node/process-memory.ts +0 -299
@@ -17,16 +17,7 @@ export interface LangiumProfilerOptions extends LogNameOptions {
17
17
  * {@link DefaultLangiumProfiler}) to Langium's full set when omitted.
18
18
  */
19
19
  readonly activeCategories?: Set<ProfilingCategory>;
20
- /**
21
- * Priority of the per-build flush pass at the `Validated` phase. The flush is
22
- * normally the only pass at `Validated`, so order is immaterial; the option
23
- * exists for symmetry with the other framework passes. Default
24
- * {@link PROFILER_FLUSH_PASS_PRIORITY}.
25
- */
26
- readonly flushPriority?: number;
27
20
  }
28
- /** Default priority of the profiler's per-build flush pass (see {@link LangiumProfilerOptions.flushPriority}). */
29
- export declare const PROFILER_FLUSH_PASS_PRIORITY = 0;
30
21
  /**
31
22
  * Framework adapter over Langium's {@link DefaultLangiumProfiler} that is
32
23
  * **trace-gated** and emits a single **aggregated** per-category breakdown
@@ -40,9 +31,8 @@ export declare const PROFILER_FLUSH_PASS_PRIORITY = 0;
40
31
  * task identifier), so the per-document records carry no distinguishing
41
32
  * information anyway. We instead accumulate records in {@link records} and
42
33
  * {@link flush} one breakdown per category — self-time and invocation counts
43
- * summed per `$type` across the whole build — on the terminal `Validated`
44
- * build phase (self-registered in the constructor). One report per build, not
45
- * one per file.
34
+ * summed per `$type` across the whole build — when the build ends
35
+ * (subscribed in the constructor). One report per build, not one per file.
46
36
  * - **Transport safety.** The stock per-record dump uses `console.table`, which
47
37
  * is NOT in the set `patchConsole` reroutes; under `vscode-languageserver`'s
48
38
  * `--stdio` transport `process.stdout` *is* the JSON-RPC channel, so the
@@ -60,8 +50,8 @@ export declare const PROFILER_FLUSH_PASS_PRIORITY = 0;
60
50
  * restart. Langium's own `start`/`stop` category selection still applies *on
61
51
  * top of* the trace gate.
62
52
  *
63
- * Registered eagerly (see `DEFAULT_EAGER_SERVICES`) so its `Validated`-phase
64
- * flush pass is registered before the first build. Gives the per-grammar-rule /
53
+ * Registered eagerly (see `DEFAULT_EAGER_SERVICES`) so its flush is
54
+ * subscribed before the first build. Gives the per-grammar-rule /
65
55
  * per-`$type` parse/link/validate self-time the framework's own
66
56
  * `ServerTracer` / `ProfileSession` passes
67
57
  * cannot produce (those cover the framework's passes *outside* Langium's
@@ -95,14 +85,13 @@ export declare class HydraniumLangiumProfiler extends DefaultLangiumProfiler {
95
85
  /**
96
86
  * Emit one aggregated breakdown per category — self-time and invocation
97
87
  * counts summed per `<languageId>.<$type>` across every record collected
98
- * this build — then clear the window. Self-registered as a `Validated`-phase
99
- * build pass, so it fires once per build, not per document. Pass explicit
100
- * categories to flush a subset; defaults to all.
88
+ * this build — then clear the window. Called when a build ends, so it fires
89
+ * once per build, not per document. Pass explicit categories to flush a
90
+ * subset; defaults to all.
101
91
  *
102
92
  * `flush` is the sole reset point: because it clears each flushed category,
103
- * memory is bounded per completed build. A build cancelled before `Validated`
104
- * leaves its partial records to roll into the next build's flush (slightly
105
- * inflated counts, self-correcting) rather than accumulating without bound.
93
+ * memory is bounded per build. Builds that throw share one flush, once the
94
+ * lock has drained after them.
106
95
  */
107
96
  flush(...categories: ProfilingCategory[]): void;
108
97
  }
@@ -1 +1 @@
1
- {"version":3,"file":"hydranium-langium-profiler.d.ts","sourceRoot":"","sources":["../../../src/langium/diagnostics/hydranium-langium-profiler.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAkB,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EACJ,sBAAsB,EAGtB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,aAAa,EACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,KAAK,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAKzE,iEAAiE;AACjE,MAAM,WAAW,sBAAuB,SAAQ,cAAc;IAC3D;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnD;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,kHAAkH;AAClH,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,qBAAa,wBAAyB,SAAQ,sBAAsB;IACjE,4FAA4F;IAC5F,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEtB,QAAQ,EAAE,2BAA2B,EAAE,OAAO,GAAE,sBAA2B;IAevF;;;;OAIG;IACM,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO;IAIvD;;;;;OAKG;IACM,UAAU,CAAC,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa;IAO/E;;;;;;OAMG;IACH,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe;IAUjE;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,GAAG,UAAU,EAAE,iBAAiB,EAAE,GAAG,IAAI;CAiCjD"}
1
+ {"version":3,"file":"hydranium-langium-profiler.d.ts","sourceRoot":"","sources":["../../../src/langium/diagnostics/hydranium-langium-profiler.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAkB,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAY,KAAK,iBAAiB,EAAE,KAAK,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnI,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,KAAK,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAKzE,iEAAiE;AACjE,MAAM,WAAW,sBAAuB,SAAQ,cAAc;IAC3D;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC;CACrD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,qBAAa,wBAAyB,SAAQ,sBAAsB;IACjE,4FAA4F;IAC5F,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAElC,YAAY,QAAQ,EAAE,2BAA2B,EAAE,OAAO,GAAE,sBAA2B,EAQtF;IAED;;;;OAIG;IACM,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAEtD;IAED;;;;;OAKG;IACM,UAAU,CAAC,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAK9E;IAED;;;;;;OAMG;IACH,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAQhE;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,GAAG,UAAU,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAgC9C;CACH"}
@@ -7,11 +7,9 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
  import { Format, Logger } from '@hydranium/protocol';
10
- import { DefaultLangiumProfiler, DocumentState, MultiMap, ProfilingTask } from '@hydranium/langium';
10
+ import { DefaultLangiumProfiler, MultiMap, ProfilingTask } from '@hydranium/langium';
11
11
  /** Langium's full profiling-category set — the default window {@link HydraniumLangiumProfiler.flush} aggregates. */
12
12
  const ALL_CATEGORIES = ['parsing', 'linking', 'validating'];
13
- /** Default priority of the profiler's per-build flush pass (see {@link LangiumProfilerOptions.flushPriority}). */
14
- export const PROFILER_FLUSH_PASS_PRIORITY = 0;
15
13
  /**
16
14
  * Framework adapter over Langium's {@link DefaultLangiumProfiler} that is
17
15
  * **trace-gated** and emits a single **aggregated** per-category breakdown
@@ -25,9 +23,8 @@ export const PROFILER_FLUSH_PASS_PRIORITY = 0;
25
23
  * task identifier), so the per-document records carry no distinguishing
26
24
  * information anyway. We instead accumulate records in {@link records} and
27
25
  * {@link flush} one breakdown per category — self-time and invocation counts
28
- * summed per `$type` across the whole build — on the terminal `Validated`
29
- * build phase (self-registered in the constructor). One report per build, not
30
- * one per file.
26
+ * summed per `$type` across the whole build — when the build ends
27
+ * (subscribed in the constructor). One report per build, not one per file.
31
28
  * - **Transport safety.** The stock per-record dump uses `console.table`, which
32
29
  * is NOT in the set `patchConsole` reroutes; under `vscode-languageserver`'s
33
30
  * `--stdio` transport `process.stdout` *is* the JSON-RPC channel, so the
@@ -45,8 +42,8 @@ export const PROFILER_FLUSH_PASS_PRIORITY = 0;
45
42
  * restart. Langium's own `start`/`stop` category selection still applies *on
46
43
  * top of* the trace gate.
47
44
  *
48
- * Registered eagerly (see `DEFAULT_EAGER_SERVICES`) so its `Validated`-phase
49
- * flush pass is registered before the first build. Gives the per-grammar-rule /
45
+ * Registered eagerly (see `DEFAULT_EAGER_SERVICES`) so its flush is
46
+ * subscribed before the first build. Gives the per-grammar-rule /
50
47
  * per-`$type` parse/link/validate self-time the framework's own
51
48
  * `ServerTracer` / `ProfileSession` passes
52
49
  * cannot produce (those cover the framework's passes *outside* Langium's
@@ -58,16 +55,11 @@ export class HydraniumLangiumProfiler extends DefaultLangiumProfiler {
58
55
  constructor(services, options = {}) {
59
56
  super(options.activeCategories);
60
57
  this.tracer = services.Tracer.for(options.logName ?? 'LangiumProfiler').trace('instantiated');
61
- // Flush once per build on the terminal phase rather than once per document.
62
- // By `Validated`, every parse/link/validate record for the batch is in.
63
- // Registered as a build-phase pass (not a direct onBuildPhase listener) so
64
- // every framework + adopter build-phase reaction shares one dispatcher.
65
- services.workspace.BuildPhasePassService.register({
66
- id: 'framework:langium-profiler:flush',
67
- state: DocumentState.Validated,
68
- priority: options.flushPriority ?? PROFILER_FLUSH_PASS_PRIORITY,
69
- run: () => this.flush()
70
- });
58
+ // Flush once per build when it ends rather than once per document. Not at
59
+ // a `Validated` pass: that phase stays silent for a build that validates
60
+ // nothing, the workspace's initial one among them, and the records would
61
+ // then wait for a build that does.
62
+ services.workspace.DocumentBuilder.onBuildEnded(() => this.flush());
71
63
  }
72
64
  /**
73
65
  * A category profiles only while the global threshold admits `trace` *and*
@@ -108,14 +100,13 @@ export class HydraniumLangiumProfiler extends DefaultLangiumProfiler {
108
100
  /**
109
101
  * Emit one aggregated breakdown per category — self-time and invocation
110
102
  * counts summed per `<languageId>.<$type>` across every record collected
111
- * this build — then clear the window. Self-registered as a `Validated`-phase
112
- * build pass, so it fires once per build, not per document. Pass explicit
113
- * categories to flush a subset; defaults to all.
103
+ * this build — then clear the window. Called when a build ends, so it fires
104
+ * once per build, not per document. Pass explicit categories to flush a
105
+ * subset; defaults to all.
114
106
  *
115
107
  * `flush` is the sole reset point: because it clears each flushed category,
116
- * memory is bounded per completed build. A build cancelled before `Validated`
117
- * leaves its partial records to roll into the next build's flush (slightly
118
- * inflated counts, self-correcting) rather than accumulating without bound.
108
+ * memory is bounded per build. Builds that throw share one flush, once the
109
+ * lock has drained after them.
119
110
  */
120
111
  flush(...categories) {
121
112
  const toFlush = categories.length > 0 ? categories : ALL_CATEGORIES;
@@ -1 +1 @@
1
- {"version":3,"file":"hydranium-langium-profiler.js","sourceRoot":"","sources":["../../../src/langium/diagnostics/hydranium-langium-profiler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hydranium-langium-profiler.js","sourceRoot":"","sources":["../../../src/langium/diagnostics/hydranium-langium-profiler.ts"],"names":[],"mappings":"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"}
@@ -20,7 +20,7 @@ export function logPreamble(logger, options) {
20
20
  }
21
21
  function logSessionInfo(logger, productName, version, systemInfoLines) {
22
22
  const now = new Date();
23
- const dateStr = now.toISOString().slice(0, 10); // YYYY-MM-DD, unambiguous across midnight
23
+ const dateStr = now.toISOString().slice(0, 10); // YYYY-MM-DD in UTC, which can differ from the reader's local date
24
24
  const lines = [
25
25
  DIVIDER,
26
26
  `${productName} server session`,
@@ -1 +1 @@
1
- {"version":3,"file":"log-preamble.js","sourceRoot":"","sources":["../../../src/langium/diagnostics/log-preamble.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,cAAc,EAAe,MAAM,qBAAqB,CAAC;AAElE,MAAM,OAAO,GAAG,qEAAqE,CAAC;AA4BtF;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,OAA2B;IACpE,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;IAC5F,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,sBAAsB,IAAI,EAAE,EAAE,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;AACrG,CAAC;AAED,SAAS,cAAc,CAAC,MAAc,EAAE,WAAmB,EAAE,OAAe,EAAE,eAAkC;IAC7G,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,0CAA0C;IAC1F,MAAM,KAAK,GAAG;QACX,OAAO;QACP,GAAG,WAAW,iBAAiB;QAC/B,OAAO;QACP,eAAe,OAAO,EAAE;QACxB,eAAe,OAAO,EAAE;QACxB,GAAG,eAAe;QAClB,OAAO;KACT,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAc,EAAE,sBAA8B,EAAE,eAAkC;IAC7G,MAAM,KAAK,GAAG;QACX,wBAAwB;QACxB,OAAO;QACP,iFAAiF;QACjF,8EAA8E;QAC9E,qEAAqE;QACrE,sCAAsC,cAAc,sDAAsD;QAC1G,yFAAyF;QACzF,4FAA4F;QAC5F,8DAA8D;QAC9D,mFAAmF,sBAAsB,KAAK;QAC9G,oEAAoE;QACpE,GAAG,eAAe;QAClB,OAAO;KACT,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"log-preamble.js","sourceRoot":"","sources":["../../../src/langium/diagnostics/log-preamble.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,cAAc,EAAe,MAAM,qBAAqB,CAAC;AAElE,MAAM,OAAO,GAAG,qEAAqE,CAAC;AA4BtF;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,OAA2B;IACpE,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;IAC5F,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,sBAAsB,IAAI,EAAE,EAAE,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;AACrG,CAAC;AAED,SAAS,cAAc,CAAC,MAAc,EAAE,WAAmB,EAAE,OAAe,EAAE,eAAkC;IAC7G,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,mEAAmE;IACnH,MAAM,KAAK,GAAG;QACX,OAAO;QACP,GAAG,WAAW,iBAAiB;QAC/B,OAAO;QACP,eAAe,OAAO,EAAE;QACxB,eAAe,OAAO,EAAE;QACxB,GAAG,eAAe;QAClB,OAAO;KACT,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAc,EAAE,sBAA8B,EAAE,eAAkC;IAC7G,MAAM,KAAK,GAAG;QACX,wBAAwB;QACxB,OAAO;QACP,iFAAiF;QACjF,8EAA8E;QAC9E,qEAAqE;QACrE,sCAAsC,cAAc,sDAAsD;QAC1G,yFAAyF;QACzF,4FAA4F;QAC5F,8DAA8D;QAC9D,mFAAmF,sBAAsB,KAAK;QAC9G,oEAAoE;QACpE,GAAG,eAAe;QAClB,OAAO;KACT,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;AACJ,CAAC"}
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
+ import { type LogLevel, type LogThreshold } from '@hydranium/protocol';
9
10
  /** Only append a memory suffix when the heap has moved by at least this much since the last log line. */
10
11
  export declare const MEMORY_DELTA_BYTES: number;
11
12
  /**
@@ -27,14 +28,27 @@ export interface LogFileSink {
27
28
  }
28
29
  /** Install (or clear, with `undefined`) the file-tee sink. Idempotent. */
29
30
  export declare function setLogFileSink(sink: LogFileSink | undefined): void;
31
+ /**
32
+ * Expand `template` the way the file-tee names its file: `{pid}` and each
33
+ * supplied placeholder by its value, each one still missing by
34
+ * `_startup-<pid>`. A file written beside the log, such as the CPU profile,
35
+ * names itself through this so both carry the same workspace token.
36
+ */
37
+ export declare function expandLogFilePlaceholders(template: string): string;
30
38
  /**
31
39
  * Set the file-tee target programmatically. Pass `undefined` to disable. The
32
40
  * path may contain `{placeholder}` tokens (e.g. `{workspace}`); lines buffer
33
- * until every token is supplied via {@link resolveLogFilePlaceholder}.
41
+ * until every token is supplied via {@link resolveLogFilePlaceholder}, except
42
+ * `{pid}`, which is the process id from the start.
34
43
  * Called by the `LspLogger` constructor's
35
44
  * one-time `HYDRANIUM_LOG_FILE` env baseline (and by tests).
45
+ *
46
+ * `level` becomes `Logger.setFileLevel`, cleared with the target and when
47
+ * omitted. Setting the file level apart from the target lets it outlive the
48
+ * file, and every sender keeps building lines above the process threshold
49
+ * that nothing writes.
36
50
  */
37
- export declare function setLogFilePath(path: string | undefined): void;
51
+ export declare function setLogFilePath(path: string | undefined, level?: LogThreshold): void;
38
52
  /**
39
53
  * Supply a value for a `{name}` placeholder in the configured target. Once the
40
54
  * last placeholder is supplied the target resolves and any lines buffered while
@@ -54,12 +68,17 @@ export declare function flushLogFileFallback(): void;
54
68
  export declare function getLogFilePath(): string | undefined;
55
69
  /**
56
70
  * Fan a single already-formatted log line out to the file-tee target, if one is
57
- * configured. Called by `LspLogger`'s emit in
58
- * addition to the LSP/console sink — log sinks fan out, they don't replace.
71
+ * configured and `level` is within the file's threshold
72
+ * (`Logger.getFileLevel() ?? Logger.getLevel()`). Called by `LspLogger`'s emit in
73
+ * addition to the LSP/console sink, and by the console tee before the console
74
+ * method it wraps — log sinks fan out, they don't replace.
59
75
  * While the target is still pending (unresolved `{placeholder}`), the line is
60
- * buffered instead of dropped.
76
+ * buffered instead of dropped. Where no sink is installed, as in a process
77
+ * that never loaded `@hydranium/core/node`, nothing is built or buffered,
78
+ * since nothing will write it. A caller whose line is costly to build passes
79
+ * a function, called only when the file takes the line.
61
80
  */
62
- export declare function teeLogLine(formatted: string): void;
81
+ export declare function teeLogLine(level: LogLevel, formatted: string | (() => string)): void;
63
82
  export { toLogFileWorkspaceToken } from './log-file-token.js';
64
83
  /**
65
84
  * Shared options-base for every framework-bound service that derives a
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/langium/diagnostics/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAKlF,yGAAyG;AACzG,eAAO,MAAM,kBAAkB,QAAkB,CAAC;AAElD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,WAAW;IACzB,2EAA2E;IAC3E,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,6EAA6E;IAC7E,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAID,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAElE;AA6ED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAM7D;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAG3E;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAO3C;AAaD,oFAAoF;AACpF,wBAAgB,cAAc,IAAI,MAAM,GAAG,SAAS,CAEnD;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAYlD;AAKD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,cAAc;IAC5B;;;;;;;;OAQG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAMrC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/langium/diagnostics/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAuB,KAAK,QAAQ,EAAU,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGpG,yGAAyG;AACzG,eAAO,MAAM,kBAAkB,QAAkB,CAAC;AAElD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,WAAW;IACzB,2EAA2E;IAC3E,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,6EAA6E;IAC7E,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAID,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAElE;AA6CD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAElE;AA2CD;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,CAAC,EAAE,YAAY,GAAG,IAAI,CAOnF;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAG3E;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAO3C;AAaD,oFAAoF;AACpF,wBAAgB,cAAc,IAAI,MAAM,GAAG,SAAS,CAEnD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,IAAI,CAepF;AAKD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,cAAc;IAC5B;;;;;;;;OAQG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAMrC"}
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
- import { Format } from '@hydranium/protocol';
9
+ import { Format, LEVEL_ORDER, Logger } from '@hydranium/protocol';
10
10
  import { currentMemoryUsage, onProcessEvent, processPid } from '../../util/environment.js';
11
11
  /** Only append a memory suffix when the heap has moved by at least this much since the last log line. */
12
12
  export const MEMORY_DELTA_BYTES = 5 * 1024 * 1024;
@@ -16,7 +16,7 @@ export function setLogFileSink(sink) {
16
16
  fileSink = sink;
17
17
  }
18
18
  /**
19
- * File-tee state for `LspLogger`'s emit. When
19
+ * File-tee state for `LspLogger`'s emit and the console tee. When
20
20
  * non-empty, every formatted log line is appended to the path in addition to
21
21
  * its LSP `window/logMessage` / console destination (see {@link teeLogLine}).
22
22
  * Diagnostic surface only — once the LSP connection binds, server logs route
@@ -44,6 +44,26 @@ const logFilePlaceholders = new Map();
44
44
  const pendingLogLines = [];
45
45
  /** Matches any remaining `{name}` placeholder token. */
46
46
  const PLACEHOLDER_PATTERN = /\{[^}]+\}/;
47
+ /**
48
+ * `template` with `{pid}` replaced by the process id, known from the start, and
49
+ * each placeholder supplied so far by its value.
50
+ */
51
+ function substituteLogFilePlaceholders(template) {
52
+ let path = template.split('{pid}').join(String(processPid() ?? 'unknown'));
53
+ for (const [name, value] of logFilePlaceholders) {
54
+ path = path.split(`{${name}}`).join(value);
55
+ }
56
+ return path;
57
+ }
58
+ /**
59
+ * Expand `template` the way the file-tee names its file: `{pid}` and each
60
+ * supplied placeholder by its value, each one still missing by
61
+ * `_startup-<pid>`. A file written beside the log, such as the CPU profile,
62
+ * names itself through this so both carry the same workspace token.
63
+ */
64
+ export function expandLogFilePlaceholders(template) {
65
+ return substituteLogFilePlaceholders(template).replace(new RegExp(PLACEHOLDER_PATTERN, 'g'), `_startup-${processPid() ?? 'unknown'}`);
66
+ }
47
67
  /**
48
68
  * Recompute {@link resolvedLogFilePath} from the template + known placeholders.
49
69
  * Resolves (and flushes the pending buffer) only once no `{...}` token remains.
@@ -53,10 +73,7 @@ function tryResolveLogFilePath() {
53
73
  resolvedLogFilePath = undefined;
54
74
  return;
55
75
  }
56
- let path = logFileTemplate;
57
- for (const [name, value] of logFilePlaceholders) {
58
- path = path.split(`{${name}}`).join(value);
59
- }
76
+ const path = substituteLogFilePlaceholders(logFileTemplate);
60
77
  if (PLACEHOLDER_PATTERN.test(path)) {
61
78
  resolvedLogFilePath = undefined;
62
79
  // Target is pending — guarantee the buffer is flushed even if the process
@@ -88,12 +105,19 @@ function flushPendingLogLines() {
88
105
  /**
89
106
  * Set the file-tee target programmatically. Pass `undefined` to disable. The
90
107
  * path may contain `{placeholder}` tokens (e.g. `{workspace}`); lines buffer
91
- * until every token is supplied via {@link resolveLogFilePlaceholder}.
108
+ * until every token is supplied via {@link resolveLogFilePlaceholder}, except
109
+ * `{pid}`, which is the process id from the start.
92
110
  * Called by the `LspLogger` constructor's
93
111
  * one-time `HYDRANIUM_LOG_FILE` env baseline (and by tests).
112
+ *
113
+ * `level` becomes `Logger.setFileLevel`, cleared with the target and when
114
+ * omitted. Setting the file level apart from the target lets it outlive the
115
+ * file, and every sender keeps building lines above the process threshold
116
+ * that nothing writes.
94
117
  */
95
- export function setLogFilePath(path) {
118
+ export function setLogFilePath(path, level) {
96
119
  logFileTemplate = path && path.length > 0 ? path : undefined;
120
+ Logger.setFileLevel(logFileTemplate ? level : undefined);
97
121
  logFilePlaceholders.clear();
98
122
  pendingLogLines.length = 0;
99
123
  resolvedLogFilePath = undefined;
@@ -120,7 +144,7 @@ export function flushLogFileFallback() {
120
144
  if (!logFileTemplate || resolvedLogFilePath || pendingLogLines.length === 0) {
121
145
  return;
122
146
  }
123
- resolvedLogFilePath = logFileTemplate.replace(/\{[^}]+\}/g, `_startup-${processPid() ?? 'unknown'}`);
147
+ resolvedLogFilePath = expandLogFilePlaceholders(logFileTemplate);
124
148
  ensureLogDir(resolvedLogFilePath);
125
149
  flushPendingLogLines();
126
150
  }
@@ -140,20 +164,28 @@ export function getLogFilePath() {
140
164
  }
141
165
  /**
142
166
  * Fan a single already-formatted log line out to the file-tee target, if one is
143
- * configured. Called by `LspLogger`'s emit in
144
- * addition to the LSP/console sink — log sinks fan out, they don't replace.
167
+ * configured and `level` is within the file's threshold
168
+ * (`Logger.getFileLevel() ?? Logger.getLevel()`). Called by `LspLogger`'s emit in
169
+ * addition to the LSP/console sink, and by the console tee before the console
170
+ * method it wraps — log sinks fan out, they don't replace.
145
171
  * While the target is still pending (unresolved `{placeholder}`), the line is
146
- * buffered instead of dropped.
172
+ * buffered instead of dropped. Where no sink is installed, as in a process
173
+ * that never loaded `@hydranium/core/node`, nothing is built or buffered,
174
+ * since nothing will write it. A caller whose line is costly to build passes
175
+ * a function, called only when the file takes the line.
147
176
  */
148
- export function teeLogLine(formatted) {
149
- if (!logFileTemplate) {
177
+ export function teeLogLine(level, formatted) {
178
+ if (!logFileTemplate || LEVEL_ORDER[level] > LEVEL_ORDER[Logger.getFileLevel() ?? Logger.getLevel()]) {
179
+ return;
180
+ }
181
+ if (!fileSink) {
150
182
  return;
151
183
  }
152
- const line = `${formatted}\n`;
184
+ const line = `${typeof formatted === 'string' ? formatted : formatted()}\n`;
153
185
  if (resolvedLogFilePath) {
154
186
  // The sink swallows its own errors; recursing into the logger here would
155
- // re-enter emit and loop. The LSP/console sink already delivered the line.
156
- fileSink?.append(resolvedLogFilePath, line);
187
+ // re-enter emit and loop. The caller delivers the line to its other sink.
188
+ fileSink.append(resolvedLogFilePath, line);
157
189
  }
158
190
  else {
159
191
  pendingLogLines.push(line);
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/langium/diagnostics/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/langium/diagnostics/logger.ts"],"names":[],"mappings":"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"}
@@ -51,6 +51,23 @@ export interface LspLoggerOptions {
51
51
  export declare class LspLogger extends AbstractLogger implements Logger {
52
52
  protected readonly services: ServerSharedServices;
53
53
  constructor(services: ServerSharedServices, options?: LspLoggerOptions);
54
+ /**
55
+ * Set the process-wide threshold and announce the transition under whichever
56
+ * of the two thresholds can carry the notice, so a reader sees every change
57
+ * and its absence means the threshold never moved.
58
+ *
59
+ * `error` and `off` admit no notice of their own — `off` nothing at all, and
60
+ * an error-severity line is read as a fault, which a client that marks its
61
+ * log as having seen an error keeps for the session. Entering either is
62
+ * therefore announced BEFORE the switch, under the outgoing threshold; every
63
+ * other change is announced after it, at the level being entered. Leaving
64
+ * `error` or `off` for one of those two says nothing, both thresholds being
65
+ * unable to carry it.
66
+ *
67
+ * Only on a real transition: the bound setting re-fires for configuration
68
+ * changes that leave the value alone.
69
+ */
70
+ protected applyLevel(next: LogThreshold, source: string): void;
54
71
  /**
55
72
  * Route logger timing and timestamps through the injected framework
56
73
  * {@link Clock} (the dedicated `shared.Clock` slot) so server-side log time
@@ -1 +1 @@
1
- {"version":3,"file":"lsp-logger.d.ts","sourceRoot":"","sources":["../../../src/langium/diagnostics/lsp-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EACJ,cAAc,EACd,KAAK,KAAK,EAGV,MAAM,EACN,KAAK,QAAQ,EACb,KAAK,YAAY,EAEjB,KAAK,oBAAoB,EAE3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAYzD;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC9B,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,oBAAoB,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC;CACzE;AAED;;;;;;;;;;GAUG;AACH,qBAAa,SAAU,SAAQ,cAAe,YAAW,MAAM;IAEzD,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB;gBAA9B,QAAQ,EAAE,oBAAoB,EACjD,OAAO,GAAE,gBAAqB;IA2CjC;;;;;;;OAOG;cACgB,KAAK,IAAI,KAAK;IAIjC;;;;;;;;OAQG;IACM,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI;IAIzC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI;IAuC/F,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAM3C"}
1
+ {"version":3,"file":"lsp-logger.d.ts","sourceRoot":"","sources":["../../../src/langium/diagnostics/lsp-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EACJ,cAAc,EACd,KAAK,KAAK,EAKV,MAAM,EACN,KAAK,QAAQ,EACb,KAAK,YAAY,EAEjB,KAAK,oBAAoB,EAE3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAgBzD;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC9B,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,oBAAoB,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC;CACzE;AAED;;;;;;;;;;GAUG;AACH,qBAAa,SAAU,SAAQ,cAAe,YAAW,MAAM;IAEzD,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB;IADpD,YACsB,QAAQ,EAAE,oBAAoB,EACjD,OAAO,GAAE,gBAAqB,EAwDhC;IAED;;;;;;;;;;;;;;;OAeG;IACH,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAc7D;IAED;;;;;;;OAOG;IACH,UAAmB,KAAK,IAAI,KAAK,CAEhC;IAED;;;;;;;;OAQG;IACM,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,CAExC;IAED,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CAuC9F;IAED,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAGxC;CAGH"}
@@ -6,7 +6,9 @@
6
6
  *
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
- import { AbstractLogger, DEFAULT_LOG_FILE_ENV, DEFAULT_LOG_LEVEL_ENV, Logger, ObservableValue, parseLogLevel } from '@hydranium/protocol';
9
+ import { AbstractLogger, DEFAULT_LOG_FILE_ENV, DEFAULT_LOG_FILE_LEVEL_ENV, DEFAULT_LOG_LEVEL_ENV, LEVEL_ORDER, Logger, ObservableValue, parseLogLevel } from '@hydranium/protocol';
10
+ import { installConsoleTee } from './console-tee.js';
11
+ import { formatLogArg } from './format-log-arg.js';
10
12
  import { setLogFilePath, teeLogLine } from './logger.js';
11
13
  import { processEnv, writeStderr } from '../../util/environment.js';
12
14
  /**
@@ -16,6 +18,8 @@ import { processEnv, writeStderr } from '../../util/environment.js';
16
18
  * live setting.
17
19
  */
18
20
  let envBaselineApplied = false;
21
+ /** Whether the first logger has run the console tee's install, which does nothing in a browser. */
22
+ let consoleTeeInstalled = false;
19
23
  /**
20
24
  * LSP-bound implementation of {@link Logger}. Forwards messages to the
21
25
  * language client via the connection bound in {@link ServerSharedServices}.
@@ -32,9 +36,10 @@ export class LspLogger extends AbstractLogger {
32
36
  constructor(services, options = {}) {
33
37
  super(options.component);
34
38
  this.services = services;
35
- // Apply the framework env baselines (`HYDRANIUM_LOG_LEVEL` and
36
- // `HYDRANIUM_LOG_FILE`) exactly once, on the first logger construction,
37
- // before any setting is read. Unconditional and process-global, so it
39
+ // Apply the framework env baselines (`HYDRANIUM_LOG_LEVEL`,
40
+ // `HYDRANIUM_LOG_FILE` and `HYDRANIUM_LOG_FILE_LEVEL`) exactly once, on
41
+ // the first logger construction, before any setting is read.
42
+ // Unconditional and process-global, so it
38
43
  // needs no root detection and is never re-applied by derived children —
39
44
  // which would otherwise clobber a live setting. These are the single env
40
45
  // vars for level / file-tee (an adopter brands them by renaming the
@@ -45,16 +50,30 @@ export class LspLogger extends AbstractLogger {
45
50
  // a Node concern; skip it cleanly there.
46
51
  const env = processEnv();
47
52
  if (env) {
48
- const envLevel = parseLogLevel(env[DEFAULT_LOG_LEVEL_ENV]);
49
- if (envLevel) {
50
- Logger.setLevel(envLevel);
51
- }
53
+ // The file-tee target FIRST: the other order writes the level
54
+ // announcement before the sink exists, losing the one line that says
55
+ // which threshold the rest of the file was written at.
52
56
  const envLogFile = env[DEFAULT_LOG_FILE_ENV];
53
57
  if (envLogFile) {
54
- setLogFilePath(envLogFile);
58
+ const fileLevel = parseLogLevel(env[DEFAULT_LOG_FILE_LEVEL_ENV]);
59
+ setLogFilePath(envLogFile, fileLevel);
60
+ if (fileLevel) {
61
+ this.logAt(fileLevel, `Log file level ${fileLevel} (${DEFAULT_LOG_FILE_LEVEL_ENV})`);
62
+ }
63
+ }
64
+ const envLevel = parseLogLevel(env[DEFAULT_LOG_LEVEL_ENV]);
65
+ if (envLevel) {
66
+ this.applyLevel(envLevel, DEFAULT_LOG_LEVEL_ENV);
55
67
  }
56
68
  }
57
69
  }
70
+ // Once, so a server without an LSP head writes console lines to the file
71
+ // too; `startLanguageServer` wraps again where a stdio connection created
72
+ // after this logger replaced them.
73
+ if (!consoleTeeInstalled) {
74
+ consoleTeeInstalled = true;
75
+ installConsoleTee();
76
+ }
58
77
  // Apply the configured threshold from the root logger only — `derive`
59
78
  // passes just `component`, so children never carry `logThreshold`. The
60
79
  // setting overrides the env baseline above and re-applies on every change;
@@ -62,15 +81,46 @@ export class LspLogger extends AbstractLogger {
62
81
  if (options.logThreshold !== undefined) {
63
82
  const level = ObservableValue.from(options.logThreshold);
64
83
  if (level.value) {
65
- Logger.setLevel(level.value);
84
+ this.applyLevel(level.value, 'setting');
66
85
  }
67
86
  level.onChange(next => {
68
87
  if (next) {
69
- Logger.setLevel(next);
88
+ this.applyLevel(next, 'setting');
70
89
  }
71
90
  });
72
91
  }
73
92
  }
93
+ /**
94
+ * Set the process-wide threshold and announce the transition under whichever
95
+ * of the two thresholds can carry the notice, so a reader sees every change
96
+ * and its absence means the threshold never moved.
97
+ *
98
+ * `error` and `off` admit no notice of their own — `off` nothing at all, and
99
+ * an error-severity line is read as a fault, which a client that marks its
100
+ * log as having seen an error keeps for the session. Entering either is
101
+ * therefore announced BEFORE the switch, under the outgoing threshold; every
102
+ * other change is announced after it, at the level being entered. Leaving
103
+ * `error` or `off` for one of those two says nothing, both thresholds being
104
+ * unable to carry it.
105
+ *
106
+ * Only on a real transition: the bound setting re-fires for configuration
107
+ * changes that leave the value alone.
108
+ */
109
+ applyLevel(next, source) {
110
+ const previous = Logger.getLevel();
111
+ if (previous === next) {
112
+ return;
113
+ }
114
+ const message = `Log level ${previous} → ${next} (${source})`;
115
+ const announceFirst = next === 'error' || next === 'off';
116
+ if (announceFirst && previous !== 'error') {
117
+ this.logAt(previous, message);
118
+ }
119
+ Logger.setLevel(next);
120
+ if (!announceFirst) {
121
+ this.logAt(next, message);
122
+ }
123
+ }
74
124
  /**
75
125
  * Route logger timing and timestamps through the injected framework
76
126
  * {@link Clock} (the dedicated `shared.Clock` slot) so server-side log time
@@ -95,9 +145,7 @@ export class LspLogger extends AbstractLogger {
95
145
  return this.with(this.services.workspace.WorkspaceManager.wsRelativePath(uri));
96
146
  }
97
147
  emit(level, label, message, args) {
98
- const component = this.component ? ` [${this.component}]` : '';
99
- // Pad to the widest label (5 chars — 'Error'/'Debug'/'Trace') so timestamps line up.
100
- const prefix = `[${label.padEnd(5)} - ${this.timestamp()}]${component}`;
148
+ const prefix = this.formatLinePrefix(label);
101
149
  const combined = args.length === 0 ? message : `${message} ${args.map(formatLogArg).join(' ')}`;
102
150
  const formatted = `${prefix} ${combined}`;
103
151
  const connection = this.services.lsp.Connection;
@@ -115,7 +163,11 @@ export class LspLogger extends AbstractLogger {
115
163
  // shutdown diagnostics and the workspace manager's own
116
164
  // unhandled-rejection handler. A log sink that throws turns a diagnostic
117
165
  // into a crash, so a dead channel degrades to stderr instead.
118
- if (!connection || !sendViaConnection(connection, level, formatted)) {
166
+ //
167
+ // `send` admits a line either threshold takes, so the client sink checks
168
+ // its own; the file-tee filters for itself.
169
+ const toClient = LEVEL_ORDER[level] <= LEVEL_ORDER[Logger.getLevel()];
170
+ if (toClient && (!connection || !sendViaConnection(connection, level, formatted))) {
119
171
  if (!writeStderr(`${formatted}\n`)) {
120
172
  // Browser only. In Node every level goes to STDERR, including the
121
173
  // three that `console.*` would put on stdout (`info` / `debug` /
@@ -130,7 +182,7 @@ export class LspLogger extends AbstractLogger {
130
182
  }
131
183
  // File-tee fan-out for headless capture (see `setLogFilePath`). Always runs
132
184
  // in addition to the LSP/console sink — log sinks fan out, they don't replace.
133
- teeLogLine(formatted);
185
+ teeLogLine(level, formatted);
134
186
  }
135
187
  derive(component) {
136
188
  const Subclass = this.constructor;
@@ -191,33 +243,4 @@ const LSP_CONSOLE = {
191
243
  debug: c => c.console.debug.bind(c.console),
192
244
  trace: c => c.console.log.bind(c.console)
193
245
  };
194
- /**
195
- * Render a logger-argument value into the single combined string the LSP
196
- * `window/logMessage` channel takes. Mirrors how raw `console.*` would
197
- * format multiple args, but with explicit handling for Errors (stack) and
198
- * objects (JSON).
199
- */
200
- function formatLogArg(value) {
201
- if (value === undefined) {
202
- return 'undefined';
203
- }
204
- if (value === null) {
205
- return 'null';
206
- }
207
- if (typeof value === 'string') {
208
- return value;
209
- }
210
- if (value instanceof Error) {
211
- return value.stack ?? value.message;
212
- }
213
- if (typeof value === 'object') {
214
- try {
215
- return JSON.stringify(value);
216
- }
217
- catch {
218
- return String(value);
219
- }
220
- }
221
- return String(value);
222
- }
223
246
  //# sourceMappingURL=lsp-logger.js.map