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

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 +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 +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 +58 -2
  395. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  396. package/lib/lsp/semantic-token-provider.js +98 -9
  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 +1029 -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 +146 -8
  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
@@ -6,57 +6,57 @@
6
6
  *
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
- import { Debouncer, ObservableValue } from '@hydranium/protocol';
9
+ import { Debouncer, Deferred, ObservableValue, TIMED_OUT, describeErrorWithStack } from '@hydranium/protocol';
10
10
  import { URI, UriUtils } from '@hydranium/langium';
11
11
  import { DefaultDocumentUpdateHandler } from '@hydranium/langium/lsp';
12
+ import { HYDRANIUM_BUILD_REASONS } from '../langium/document-builder/document-builder.js';
12
13
  import { LANGUAGE_CLIENT_ID } from '../documents/client-ids.js';
14
+ import { isConnectionGoneError } from '../util/connection-liveness.js';
13
15
  import { FileChangeType } from 'vscode-languageserver';
14
- /**
15
- * Default LSP-event reasons stamped by {@link HydraniumDocumentUpdateHandler}
16
- * onto the next `documentBuilder.update` call via `markNextReason`. Exposed
17
- * so adopters subclassing the handler can layer additional reasons or rename
18
- * existing ones without losing the canonical names the framework emits.
19
- */
20
- export const HYDRANIUM_BUILD_REASONS = Object.freeze({
21
- didOpen: 'didOpen',
22
- didChangeContent: 'didChangeContent',
23
- didChangeWatchedFiles: 'didChangeWatchedFiles',
24
- didClose: 'didClose'
25
- });
16
+ export { HYDRANIUM_BUILD_REASONS };
26
17
  /**
27
18
  * Framework `DocumentUpdateHandler` adding these behaviours over Langium's
28
19
  * default:
29
20
  *
30
21
  * 1. **Self-save filter** ({@link filterSelfSaves}) — drops
31
22
  * watched-file-change echoes for the server's own writes via
32
- * {@link SelfSaveRegistry}, keyed by `fsPath` + mtime.
23
+ * {@link SelfSaveRegistry}, keyed by `fsPath` + mtime, and
24
+ * ({@link filterStaleDeletions}) deletions the disk contradicts.
33
25
  * 2. **Trailing-edge debouncing** — collapses rapid
34
26
  * `didChangeContent` calls into one rebuild on the trailing
35
27
  * edge of the configured window. Non-language-client author
36
28
  * changes and watched-file changes bypass the debounce (their
37
29
  * producers are already coalesced).
38
30
  * 3. **Build-reason stamping** — the LSP event overrides
39
- * (`didOpenDocument`, `didChangeContent`, `didChangeWatchedFiles`,
40
- * `didCloseDocument`) populate {@link nextReason} with a canonical
41
- * reason string. {@link fireDocumentUpdate} captures the reason;
42
- * {@link dispatch} stages it on the builder via
43
- * {@link HydraniumDocumentBuilder.markNextReason}, so a subclass that
44
- * formats build logs can tag its line with the event that caused the
45
- * build without per-adopter wiring to capture it.
46
- * 4. **Last-client-close rebuild trigger** ({@link didCloseDocument}) —
47
- * when the final client closes a document, dispatch a build so the
48
- * LangiumDocument's `textDocument` is refreshed (from disk for `file:`
49
- * URIs, or removed from the index for ephemeral URIs). Langium's
50
- * default handler does not implement `didCloseDocument`, so the
51
- * in-memory text of the last writer would otherwise persist.
31
+ * (`didOpenDocument`, `didChangeContent`, `didChangeWatchedFiles`)
32
+ * populate {@link nextReason} with a canonical reason string.
33
+ * {@link fireDocumentUpdate} captures the reason; {@link dispatch} hands
34
+ * it to {@link HydraniumDocumentBuilder.scheduleUpdate}, which stages it
35
+ * through {@link HydraniumDocumentBuilder.markNextReason} when the build
36
+ * runs, so a subclass that formats build logs can tag its line with the
37
+ * event that caused the build without per-adopter wiring to capture it.
38
+ * 4. **Editor save gate** ({@link willSaveDocumentWaitUntil}) — the editor
39
+ * writes the file itself, so its save waits for the language client to
40
+ * answer the push of the server's newer text, and the server's disk
41
+ * writes of that document are ordered around it: the editor's save waits
42
+ * for the ones already queued, and the ones queued during its save wait
43
+ * for its `didSave`. The answer and the hold are each capped by
44
+ * {@link HydraniumDocumentUpdateHandlerOptions.willSaveGateMs}.
45
+ *
46
+ * What the build keeps after a document's last close is not dispatched here:
47
+ * the store hands the released document to the `DocumentReleaseHandler` for
48
+ * every head, the LSP head included, so a `didCloseDocument` added in a
49
+ * subclass would build the document twice. A change still debounced for the
50
+ * document is dropped when the store releases it: the release handler rebuilds
51
+ * the document from the file system provider or removes it.
52
52
  *
53
53
  * Adopters with their own handler subclass should extend this class
54
54
  * (not Langium's `DefaultDocumentUpdateHandler`) so all of them are
55
55
  * preserved. The {@link dispatch} hook is the canonical override
56
- * point for adopters that need to stamp additional per-build metadata
57
- * inside the workspace-lock callback.
56
+ * point for adopters that need to stamp additional per-build metadata.
58
57
  */
59
58
  export class HydraniumDocumentUpdateHandler extends DefaultDocumentUpdateHandler {
59
+ services;
60
60
  logger;
61
61
  selfSaveRegistry;
62
62
  fileSystemProvider;
@@ -81,13 +81,24 @@ export class HydraniumDocumentUpdateHandler extends DefaultDocumentUpdateHandler
81
81
  nextReason;
82
82
  /**
83
83
  * Build-reason captured at `fireDocumentUpdate` time, drained by
84
- * {@link dispatch} into `markNextReason`. Survives across debounced
85
- * batches (`?? pendingReason` in `fireDocumentUpdate` retains the
86
- * first reason in a coalesced burst).
84
+ * {@link dispatch} into the scheduled build. Survives across debounced
85
+ * batches: `fireDocumentUpdate` replaces it with each event's reason, so a
86
+ * coalesced burst carries its latest.
87
87
  */
88
88
  pendingReason;
89
+ willSaveGateMs;
90
+ /**
91
+ * Per document URI, the release of the hold an editor's save in progress
92
+ * keeps on the document's disk queue. A second save of the document
93
+ * releases the first: its hold would otherwise keep the second's answer
94
+ * waiting until the cap. The key is the document, not the save, so for a
95
+ * client that sends its next `willSaveWaitUntil` before the previous
96
+ * `didSave`, that late `didSave` releases the next save's hold.
97
+ */
98
+ editorSaves = new Map();
89
99
  constructor(services, options = {}) {
90
100
  super(services);
101
+ this.services = services;
91
102
  this.logger = services.Logger;
92
103
  this.selfSaveRegistry = services.workspace.SelfSaveRegistry;
93
104
  this.fileSystemProvider = services.workspace.FileSystemProvider;
@@ -95,6 +106,19 @@ export class HydraniumDocumentUpdateHandler extends DefaultDocumentUpdateHandler
95
106
  this.debounce = ObservableValue.from(options.debounceMs ?? 0);
96
107
  this.flushDebouncer = new Debouncer(services.Clock, () => this.flushPending(), { delayMs: this.debounce });
97
108
  this.bypassNonLanguageClientChanges = options.bypassNonLanguageClientChanges ?? true;
109
+ this.willSaveGateMs = options.willSaveGateMs ?? 1000;
110
+ this.textDocuments.onDidSaveInLanguageClient(event => this.editorSaves.get(event.uri)?.());
111
+ services.workspace.VersionSyncService.registerDeferredBuilds(uri => this.pendingChanged.has(uri.toString()) || this.pendingDeleted.has(uri.toString()));
112
+ // A change still debounced for a document the store has released would
113
+ // build it once more after the release handler's build: from the
114
+ // provider again, or, for a document the release removed, by reading a
115
+ // file that is not there.
116
+ this.textDocuments.onDidReleaseDocument(event => {
117
+ this.pendingChanged.delete(URI.parse(event.uri).toString());
118
+ if (this.pendingChanged.size === 0 && this.pendingDeleted.size === 0) {
119
+ this.pendingReason = undefined;
120
+ }
121
+ });
98
122
  }
99
123
  didOpenDocument(_change) {
100
124
  // Langium also fires `didChangeContent` on open, which is what triggers
@@ -116,60 +140,22 @@ export class HydraniumDocumentUpdateHandler extends DefaultDocumentUpdateHandler
116
140
  }
117
141
  super.didChangeContent(change);
118
142
  }
119
- /**
120
- * Last-client close is the missing rebuild trigger in Langium's
121
- * `DefaultDocumentUpdateHandler`: `documents.onDidClose` fires on every
122
- * per-client close, but the default handler ignores the event entirely.
123
- * For multi-client servers this leaves the LangiumDocument carrying the
124
- * unsaved in-memory `textDocument` of the last writer until something
125
- * else triggers a rebuild — integrity rules walking `langiumDocuments.all`
126
- * then see stale text long after the user discarded their edits.
127
- *
128
- * We funnel the last-client transition through the same dispatch path
129
- * the other LSP events use, so the rebuild gets debouncing, workspace
130
- * locking, build-reason stamping, and `markNextReason` for free. The
131
- * scheme split governs the `DocumentBuilder.update` shape:
132
- *
133
- * - **`file:` URI** → `update([uri], [])`. Routes through
134
- * `LangiumDocuments.invalidateDocument` (doc stays in the trie) and
135
- * `LangiumDocumentFactory.update`, which consults the LSP-tracked
136
- * open-documents map first. That map is cleared LATER in the same
137
- * synchronous `notifyDidCloseTextDocument` call that fires this event,
138
- * and {@link dispatch} defers the build behind `workspaceManager.ready`
139
- * — so by the time the factory looks, the URI is gone: it falls back to
140
- * `FileSystemProvider.readFile` and the doc rebuilds from disk,
141
- * Langium's canonical close-without-save semantic. A dispatch made
142
- * synchronously here would still see the open document and re-read the
143
- * in-memory text instead.
144
- * - **non-`file:` URI** (`builtin:`, `untitled:`) → no dispatch.
145
- * Adopter-loaded schemes — documents pulled in via
146
- * `loadAdditionalDocuments` — need to stay in the workspace index;
147
- * dropping them on close would break every cross-reference that
148
- * targets them. The framework cannot enumerate adopter schemes, so the
149
- * safe default is "leave alone unless it's a file." Adopters that need
150
- * ephemeral-URI cleanup handle it explicitly.
151
- *
152
- * Per-client closes (where other clients still hold the URI) are
153
- * suppressed via {@link HydraniumTextDocuments.isOpenInAnyClient}.
154
- */
155
- didCloseDocument(change) {
156
- if (this.textDocuments.isOpenInAnyClient(change.document.uri)) {
157
- return;
158
- }
159
- const uri = URI.parse(change.document.uri);
160
- if (uri.scheme !== 'file') {
161
- return;
162
- }
163
- this.nextReason = HYDRANIUM_BUILD_REASONS.didClose;
164
- this.immediateFlush = true;
165
- this.fireDocumentUpdate([uri], []);
166
- }
167
143
  didChangeWatchedFiles(params) {
168
144
  void this.filterSelfSaves(params)
145
+ .then(unsaved => this.filterStaleDeletions(unsaved))
169
146
  .then(filtered => {
170
147
  if (filtered.changes.length === 0) {
171
148
  return;
172
149
  }
150
+ // Only an open document keeps the file's text as its disk
151
+ // baseline; the store ignores the rest. The self-save filter has
152
+ // dropped the server's own writes, which set the baseline when
153
+ // they wrote.
154
+ for (const change of filtered.changes) {
155
+ this.textDocuments
156
+ .reloadDiskBaseline(change.uri)
157
+ .catch((err) => this.logger.error(`Disk baseline not reloaded for ${change.uri}. ${describeErrorWithStack(err)}`));
158
+ }
173
159
  // External file-system changes are authoritative — overwrite any
174
160
  // pending reason (typically empty here; could be `didChangeContent`
175
161
  // if a watcher event raced an in-flight Monaco edit, in which case
@@ -185,11 +171,127 @@ export class HydraniumDocumentUpdateHandler extends DefaultDocumentUpdateHandler
185
171
  // `unhandledRejection` listener, which reports neither the URIs nor
186
172
  // the fact that a watched-file rebuild was dropped — leaving the
187
173
  // workspace diverged from disk with no diagnostic and no retry.
188
- const detail = err instanceof Error ? (err.stack ?? err.message) : String(err);
174
+ const detail = describeErrorWithStack(err);
189
175
  const uris = params.changes.map(change => change.uri).join(', ');
190
176
  this.logger.error(`Watched-file update dropped for ${uris}. ${detail}`);
191
177
  });
192
178
  }
179
+ /**
180
+ * Answer an editor's `willSaveWaitUntil` with no edits once
181
+ * {@link settleBeforeSave} has resolved and then the server's disk writes
182
+ * of the document already queued have landed, or after
183
+ * {@link willSaveGateMs} for both together, whichever is first. From the
184
+ * moment the queue reaches this save, disk tasks of the document queued
185
+ * behind it wait for the editor's `didSave`, reported through
186
+ * `HydraniumTextDocuments.onDidSaveInLanguageClient`, or for
187
+ * {@link willSaveGateMs} more.
188
+ *
189
+ * The hold is a disk task that waits only for that signal or its timer:
190
+ * waiting on a build, a save or anything else queued for the document would
191
+ * wedge its queue, so the settle runs before it is queued. Past the cap the
192
+ * hold is queued while the settle still runs, so a write that build queues,
193
+ * such as an integrity repair, waits behind the hold. A settle that fails is
194
+ * logged and the save goes on. Resolves in every case, since a
195
+ * failed request counts against the listener in VS Code; Langium drops the
196
+ * request's cancellation, so an abandoned request still runs to the cap. A
197
+ * hold that runs out is logged at debug only: an editor skips `didSave` for
198
+ * a save it cancels or that changed nothing.
199
+ */
200
+ async willSaveDocumentWaitUntil(event) {
201
+ const uri = event.document.uri;
202
+ this.editorSaves.get(uri)?.();
203
+ const hold = new Deferred();
204
+ const release = () => {
205
+ if (this.editorSaves.get(uri) === release) {
206
+ this.editorSaves.delete(uri);
207
+ }
208
+ hold.resolve();
209
+ };
210
+ this.editorSaves.set(uri, release);
211
+ const clock = this.services.Clock;
212
+ const answer = new Deferred();
213
+ let settling = true;
214
+ const cap = clock.setTimer(() => {
215
+ if (settling) {
216
+ // A push unanswered past the cap is the stale-save case, and server
217
+ // writes queued ahead of the hold race the save; a build past the
218
+ // cap alone is routine on a large model.
219
+ if (this.services.model.ModelService.isLanguageClientPushPending(uri)) {
220
+ this.logger.warn(`willSaveWaitUntil for ${uri} answered after ${this.willSaveGateMs} ms with the language client's answer to a push of it still pending; the editor may save text older than the server's.`);
221
+ }
222
+ else if (!this.services.workspace.FileSystemTaskQueue.isIdle(uri)) {
223
+ this.logger.warn(`willSaveWaitUntil for ${uri} answered after ${this.willSaveGateMs} ms with its settle still pending and server writes of it queued; the editor's save may race them.`);
224
+ }
225
+ else {
226
+ this.logger.debug(`willSaveWaitUntil for ${uri} answered after ${this.willSaveGateMs} ms with its settle still pending, on its build or on a push a settle already timed out on.`);
227
+ }
228
+ }
229
+ else {
230
+ this.logger.warn(`willSaveWaitUntil for ${uri} answered after ${this.willSaveGateMs} ms with server writes of it still queued; the editor's save may race them.`);
231
+ }
232
+ answer.resolve([]);
233
+ }, this.willSaveGateMs);
234
+ // Caught on the settle itself, since a race that the cap has won drops a
235
+ // later rejection without a trace.
236
+ const settled = (async () => {
237
+ try {
238
+ await this.settleBeforeSave(uri);
239
+ }
240
+ catch (err) {
241
+ this.logger.error(`The settle before an editor save of ${uri} failed. ${describeErrorWithStack(err)}`);
242
+ }
243
+ })();
244
+ await Promise.race([settled, answer.promise]);
245
+ settling = false;
246
+ try {
247
+ void this.services.workspace.FileSystemTaskQueue.enqueue(uri, async () => {
248
+ cap.dispose();
249
+ answer.resolve([]);
250
+ if ((await clock.raceTimer(hold.promise, this.willSaveGateMs)) === TIMED_OUT) {
251
+ this.logger.debug(`No didSave for ${uri} within ${this.willSaveGateMs} ms; server writes of it no longer wait for the editor's save.`);
252
+ release();
253
+ }
254
+ });
255
+ }
256
+ catch (err) {
257
+ cap.dispose();
258
+ this.logger.error(`willSaveWaitUntil for ${uri} answered without waiting for server writes. ${describeErrorWithStack(err)}`);
259
+ release();
260
+ answer.resolve([]);
261
+ }
262
+ return answer.promise;
263
+ }
264
+ /**
265
+ * What an editor's save of `uri` waits for before it joins the document's
266
+ * disk queue: the language client's answer to the push of the server's
267
+ * newer text, applied or refused and logged
268
+ * (`ModelService.settleLanguageClient`). The editor saves its own buffer,
269
+ * so without it the editor can save text older than the server's. The
270
+ * settle waits for a build of the document's latest text, so a change of it
271
+ * still debounced is flushed first, along with every other debounced
272
+ * change. Runs outside the disk queue, under the save's cap; an override
273
+ * must not wait on a disk task of the document, which past the cap queues
274
+ * behind the save's hold.
275
+ */
276
+ async settleBeforeSave(uri) {
277
+ const key = URI.parse(uri).toString();
278
+ if (this.pendingChanged.has(key) || this.pendingDeleted.has(key)) {
279
+ this.flushPending();
280
+ }
281
+ await this.services.model.ModelService.settleLanguageClient(uri);
282
+ }
283
+ /**
284
+ * Present so that Langium advertises `save` and editors send `didSave`;
285
+ * without it every hold of {@link willSaveDocumentWaitUntil} waits out its
286
+ * cap. The hold is released on
287
+ * `HydraniumTextDocuments.onDidSaveInLanguageClient` instead: it fires as
288
+ * soon as the editor reports the save, while `onDidSave`, and so this
289
+ * method, follows only once the file has been read back, and not at all
290
+ * when the file does not hold the store's text.
291
+ */
292
+ didSaveDocument(_event) {
293
+ // Nothing to do; see the doc comment.
294
+ }
193
295
  /**
194
296
  * Drop watched-file changes whose path + mtime match a recent self-save
195
297
  * record. Deletions always pass (no mtime); stat failures pass (the
@@ -205,27 +307,49 @@ export class HydraniumDocumentUpdateHandler extends DefaultDocumentUpdateHandler
205
307
  }
206
308
  const uri = UriUtils.toUri(change.uri);
207
309
  const mtimeMs = await this.fileSystemProvider.mtimeMs?.(uri);
208
- if (mtimeMs !== undefined && this.selfSaveRegistry.matches(uri.fsPath, mtimeMs)) {
310
+ if (mtimeMs !== undefined && this.selfSaveRegistry.isRegistered(uri.fsPath, mtimeMs)) {
209
311
  return undefined;
210
312
  }
211
313
  return change;
212
314
  }));
213
315
  return { changes: kept.filter((change) => change !== undefined) };
214
316
  }
317
+ /**
318
+ * Drop a deletion the disk contradicts: the file is there, or the document
319
+ * at the URI was created from a session's text and its file not seen since,
320
+ * as one created again after a delete. A watcher reports a delete late, the
321
+ * server's own included, and applied to a document created again since, it
322
+ * would close every open of it. A missing disk baseline cannot stand in for
323
+ * the creation: a report that finds the file gone clears it too. A record
324
+ * of the server's own unlinks could not tell its echo from a later real
325
+ * delete, since a delete leaves no mtime to match. A miss the provider
326
+ * reports in error keeps the deletion.
327
+ */
328
+ async filterStaleDeletions(params) {
329
+ const kept = await Promise.all(params.changes.map(async (change) => {
330
+ if (change.type !== FileChangeType.Deleted) {
331
+ return change;
332
+ }
333
+ if (this.textDocuments.isUnsavedCreation(change.uri)) {
334
+ return undefined;
335
+ }
336
+ const exists = await this.fileSystemProvider.exists(UriUtils.toUri(change.uri)).catch(() => false);
337
+ return exists ? undefined : change;
338
+ }));
339
+ return { changes: kept.filter((change) => change !== undefined) };
340
+ }
215
341
  /**
216
342
  * Coalesce `changed` / `deleted` into the pending sets, then either
217
343
  * flush immediately (`immediateFlush` or `debounceMs <= 0`) or restart
218
344
  * the trailing-edge timer. Subclasses that need to stamp per-build
219
345
  * metadata can override and inspect the merged sets — but the canonical
220
- * override point for the workspace-lock callback is {@link dispatch},
221
- * not this method.
346
+ * override point for the build is {@link dispatch}, not this method.
222
347
  */
223
348
  fireDocumentUpdate(changed, deleted) {
224
349
  // Capture the reason set by the LSP event handler immediately before
225
- // we merge into the pending sets. `?? pendingReason` keeps the
226
- // first reason in a coalesced burst (LSP events arriving inside an
227
- // active debounce window all stamp the same `pendingReason` once,
228
- // because subsequent stamps see the field already non-undefined).
350
+ // we merge into the pending sets. Each event stamps its own reason, so
351
+ // a coalesced burst carries its latest; `?? pendingReason` keeps the
352
+ // earlier one only for a call no event stamped.
229
353
  this.pendingReason = this.nextReason ?? this.pendingReason;
230
354
  this.nextReason = undefined;
231
355
  for (const uri of changed) {
@@ -261,26 +385,35 @@ export class HydraniumDocumentUpdateHandler extends DefaultDocumentUpdateHandler
261
385
  this.dispatch(changed, deleted);
262
386
  }
263
387
  /**
264
- * Workspace-lock + `documentBuilder.update` call for the merged sets.
265
- * Mirrors Langium's `super.fireDocumentUpdate` body plus
266
- * `markNextReason(pendingReason)` inside the write-lock callback, so the
267
- * build the lock is about to run carries the LSP event that triggered it.
268
- * Adopters override to stamp additional per-build metadata — the canonical
269
- * pattern is to read the reason via `this.pendingReason`, call
270
- * `super.dispatch(...)` or replicate the
271
- * `workspaceManager.ready -> workspaceLock.write` block, and add
272
- * adopter-specific behaviour inside the write callback.
388
+ * Build the merged sets once the workspace is ready, through
389
+ * {@link HydraniumDocumentBuilder.scheduleUpdate} with the pending reason,
390
+ * so the build carries the LSP event that triggered it. A session's write
391
+ * fires the store's change event before the session rebuilds the document
392
+ * itself, and the scheduled build is what the two share.
393
+ *
394
+ * Adopters override to stamp additional per-build metadata: read the reason
395
+ * via `this.pendingReason` and call `super.dispatch(...)`; the build may
396
+ * be shared with other requests, so metadata stamped for it describes
397
+ * theirs too. An override that needs code inside the write action takes
398
+ * `workspaceLock.write` itself, as Langium's `fireDocumentUpdate` does, and
399
+ * stages the reason through `markNextReason` there; its build then cancels
400
+ * a scheduled one it coincides with rather than sharing it.
273
401
  */
274
402
  dispatch(changed, deleted) {
275
403
  const reason = this.pendingReason;
276
404
  this.pendingReason = undefined;
277
405
  this.workspaceManager.ready
278
- .then(() => this.workspaceLock.write(token => {
279
- this.documentBuilder.markNextReason(reason);
280
- return this.documentBuilder.update(changed, deleted, token);
281
- }))
406
+ .then(() => this.documentBuilder.scheduleUpdate(changed, deleted, reason))
282
407
  .catch(err => {
283
- const detail = err instanceof Error ? (err.stack ?? err.message) : String(err);
408
+ // A deferred rebuild can finish after the LSP peer has gone away.
409
+ // Unless the head was started through `startLanguageServer`, whose
410
+ // guard absorbs it, the diagnostics publish then fails this build:
411
+ // a routine teardown race, not a failed workspace update. Keep
412
+ // genuine update failures visible.
413
+ if (isConnectionGoneError(err)) {
414
+ return;
415
+ }
416
+ const detail = describeErrorWithStack(err);
284
417
  this.logger.error(`Workspace initialization failed. Could not perform document update. ${detail}`);
285
418
  });
286
419
  }
@@ -1 +1 @@
1
- {"version":3,"file":"hydranium-document-update-handler.js","sourceRoot":"","sources":["../../src/lsp/hydranium-document-update-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,SAAS,EAAe,eAAe,EAA6B,MAAM,qBAAqB,CAAC;AACzG,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAGtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAIhE,OAAO,EAAoD,cAAc,EAAgC,MAAM,uBAAuB,CAAC;AAGvI;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,CAAC;IAClD,OAAO,EAAE,SAAS;IAClB,gBAAgB,EAAE,kBAAkB;IACpC,qBAAqB,EAAE,uBAAuB;IAC9C,QAAQ,EAAE,UAAU;CACb,CAAC,CAAC;AA4BZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,OAAO,8BAA+B,SAAQ,4BAA4B;IAQ1D,MAAM,CAAS;IACf,gBAAgB,CAAmB;IACnC,kBAAkB,CAA6B;IAC/C,aAAa,CAAuC;IAEvE,0FAA0F;IACvE,QAAQ,CAA0B;IAClC,8BAA8B,CAAU;IAE3D,qHAAqH;IAC3G,cAAc,GAAG,IAAI,GAAG,EAAe,CAAC;IACxC,cAAc,GAAG,IAAI,GAAG,EAAe,CAAC;IAClD,sGAAsG;IACnF,cAAc,CAAY;IAC7C,iIAAiI;IACvH,cAAc,GAAG,KAAK,CAAC;IAEjC;;;;;;OAMG;IACO,UAAU,CAAU;IAC9B;;;;;OAKG;IACO,aAAa,CAAU;IAEjC,YAAY,QAA8B,EAAE,UAAiD,EAAE;QAC5F,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChB,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,SAAS,CAAC,gBAAgB,CAAC;QAC5D,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC,SAAS,CAAC,kBAAkB,CAAC;QAChE,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC;QACtD,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,cAAc,GAAG,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3G,IAAI,CAAC,8BAA8B,GAAG,OAAO,CAAC,8BAA8B,IAAI,IAAI,CAAC;IACxF,CAAC;IAED,eAAe,CAAC,OAA8C;QAC3D,wEAAwE;QACxE,8DAA8D;QAC9D,sEAAsE;QACtE,mEAAmE;QACnE,qCAAqC;QACrC,IAAI,CAAC,UAAU,GAAG,uBAAuB,CAAC,OAAO,CAAC;QAClD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC9B,CAAC;IAEQ,gBAAgB,CAAC,MAA6C;QACpE,mEAAmE;QACnE,yDAAyD;QACzD,IAAI,CAAC,UAAU,KAAK,uBAAuB,CAAC,gBAAgB,CAAC;QAC7D,gFAAgF;QAChF,gFAAgF;QAChF,IAAI,IAAI,CAAC,8BAA8B,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,kBAAkB,EAAE,CAAC;YACnH,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC9B,CAAC;QACD,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCG;IACH,gBAAgB,CAAC,MAA6C;QAC3D,IAAI,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7D,OAAO;QACV,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACzB,OAAO;QACV,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,uBAAuB,CAAC,QAAQ,CAAC;QACnD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC;IAEQ,qBAAqB,CAAC,MAAmC;QAC/D,KAAK,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;aAC7B,IAAI,CAAC,QAAQ,CAAC,EAAE;YACd,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,OAAO;YACV,CAAC;YACD,iEAAiE;YACjE,oEAAoE;YACpE,mEAAmE;YACnE,6DAA6D;YAC7D,IAAI,CAAC,UAAU,GAAG,uBAAuB,CAAC,qBAAqB,CAAC;YAChE,uEAAuE;YACvE,uDAAuD;YACvD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,KAAK,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,CAAC,EAAE;YACV,wDAAwD;YACxD,oEAAoE;YACpE,iEAAiE;YACjE,gEAAgE;YAChE,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/E,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;IACT,CAAC;IAED;;;;;;;OAOG;IACO,KAAK,CAAC,eAAe,CAAC,MAAmC;QAChE,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAC3B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAC,MAAM,EAAC,EAAE;YAC/B,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO,EAAE,CAAC;gBAC1C,OAAO,MAAM,CAAC;YACjB,CAAC;YACD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;YAC7D,IAAI,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC/E,OAAO,SAAS,CAAC;YACpB,CAAC;YACD,OAAO,MAAM,CAAC;QACjB,CAAC,CAAC,CACJ,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAuB,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,EAAE,CAAC;IAC1F,CAAC;IAED;;;;;;;OAOG;IACgB,kBAAkB,CAAC,OAAc,EAAE,OAAc;QACjE,qEAAqE;QACrE,+DAA+D;QAC/D,mEAAmE;QACnE,kEAAkE;QAClE,kEAAkE;QAClE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa,CAAC;QAC3D,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC3B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,uCAAuC;YAC5D,OAAO;QACV,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;IAClC,CAAC;IAED;;;;;OAKG;IACI,YAAY;QAChB,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChD,OAAO;QACV,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IAED;;;;;;;;;;OAUG;IACO,QAAQ,CAAC,OAAc,EAAE,OAAc;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;QAClC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,IAAI,CAAC,gBAAgB,CAAC,KAAK;aACvB,IAAI,CAAC,GAAG,EAAE,CACR,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YAC9B,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC5C,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC/D,CAAC,CAAC,CACJ;aACA,KAAK,CAAC,GAAG,CAAC,EAAE;YACV,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uEAAuE,MAAM,EAAE,CAAC,CAAC;QACtG,CAAC,CAAC,CAAC;IACT,CAAC;CACH"}
1
+ {"version":3,"file":"hydranium-document-update-handler.js","sourceRoot":"","sources":["../../src/lsp/hydranium-document-update-handler.ts"],"names":[],"mappings":"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"}
@@ -7,11 +7,14 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
  export * from './completion/hydranium-completion-provider.js';
10
- export * from './instrument-connection.js';
10
+ export * from './lsp-latency.js';
11
+ export * from './connection-features.js';
12
+ export * from './diagnostics-connection.js';
11
13
  export * from './semantic-token-provider.js';
12
14
  export * from './language-module.js';
13
15
  export * from './shared-module.js';
14
16
  export * from './hydranium-document-update-handler.js';
17
+ export * from './save-text-document.js';
15
18
  /**
16
19
  * The LSP server entry point, so adopters get a unified import surface for the
17
20
  * head: framework overrides + the start function live behind one
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lsp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,cAAc,+CAA+C,CAAC;AAC9D,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wCAAwC,CAAC;AAEvD;;;;;;GAMG;AACH,cAAc,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lsp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,cAAc,+CAA+C,CAAC;AAC9D,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wCAAwC,CAAC;AACvD,cAAc,yBAAyB,CAAC;AAExC;;;;;;GAMG;AACH,cAAc,4BAA4B,CAAC"}
package/lib/lsp/index.js CHANGED
@@ -7,11 +7,14 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
  export * from './completion/hydranium-completion-provider.js';
10
- export * from './instrument-connection.js';
10
+ export * from './lsp-latency.js';
11
+ export * from './connection-features.js';
12
+ export * from './diagnostics-connection.js';
11
13
  export * from './semantic-token-provider.js';
12
14
  export * from './language-module.js';
13
15
  export * from './shared-module.js';
14
16
  export * from './hydranium-document-update-handler.js';
17
+ export * from './save-text-document.js';
15
18
  /**
16
19
  * The LSP server entry point, so adopters get a unified import surface for the
17
20
  * head: framework overrides + the start function live behind one
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lsp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,cAAc,+CAA+C,CAAC;AAC9D,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wCAAwC,CAAC;AAEvD;;;;;;GAMG;AACH,cAAc,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lsp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,cAAc,+CAA+C,CAAC;AAC9D,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wCAAwC,CAAC;AACvD,cAAc,yBAAyB,CAAC;AAExC;;;;;;GAMG;AACH,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,39 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 CrossBreeze, EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+ import type { LatencyCollector } from '@hydranium/protocol';
10
+ import type { ConnectionOptions } from 'vscode-jsonrpc';
11
+ /**
12
+ * Connection options that time every inbound LSP message into `latency` under
13
+ * its method name — the LSP analog of the data-server RPC chokepoint.
14
+ *
15
+ * Pass the result to `createConnection` where the head builds its connection:
16
+ * `createConnection(ProposedFeatures.all, lspLatencyOptions(latency))`. The
17
+ * transport is untouched, so a head keeps whatever `--stdio` / `--socket`
18
+ * selection its arguments make.
19
+ *
20
+ * **`messageStrategy` is the seam because it is the only one the handlers
21
+ * actually pass through.** `vscode-languageserver` builds its `Connection` as an
22
+ * object whose `onHover`, `onCompletion` and every other named helper register
23
+ * against the inner protocol connection captured in their closure — not against
24
+ * the returned object's own `onRequest`. Langium registers exclusively through
25
+ * those helpers, so decorating the `Connection` reaches none of them and reports
26
+ * an empty LSP half no matter how much traffic ran. `handleMessage` sits on the
27
+ * dispatch path itself, which every request and notification crosses, so it also
28
+ * catches `initialize` — special-cased into `onInitialize` and invisible to any
29
+ * `onRequest` decoration.
30
+ *
31
+ * What it measures is **dispatch plus handler**, not handler alone: the wait a
32
+ * client actually experiences, including time queued behind other work.
33
+ *
34
+ * When `latency` is `undefined` the seam is off and this returns `undefined`, so
35
+ * a head can pass the result of an env-gated factory (`latencyFromEnv()`)
36
+ * straight through and pay nothing when timing is not enabled.
37
+ */
38
+ export declare function lspLatencyOptions(latency: LatencyCollector | undefined): ConnectionOptions | undefined;
39
+ //# sourceMappingURL=lsp-latency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lsp-latency.d.ts","sourceRoot":"","sources":["../../src/lsp/lsp-latency.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAW,MAAM,gBAAgB,CAAC;AAEjE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAiBtG"}
@@ -0,0 +1,58 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 CrossBreeze, EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+ /**
10
+ * Connection options that time every inbound LSP message into `latency` under
11
+ * its method name — the LSP analog of the data-server RPC chokepoint.
12
+ *
13
+ * Pass the result to `createConnection` where the head builds its connection:
14
+ * `createConnection(ProposedFeatures.all, lspLatencyOptions(latency))`. The
15
+ * transport is untouched, so a head keeps whatever `--stdio` / `--socket`
16
+ * selection its arguments make.
17
+ *
18
+ * **`messageStrategy` is the seam because it is the only one the handlers
19
+ * actually pass through.** `vscode-languageserver` builds its `Connection` as an
20
+ * object whose `onHover`, `onCompletion` and every other named helper register
21
+ * against the inner protocol connection captured in their closure — not against
22
+ * the returned object's own `onRequest`. Langium registers exclusively through
23
+ * those helpers, so decorating the `Connection` reaches none of them and reports
24
+ * an empty LSP half no matter how much traffic ran. `handleMessage` sits on the
25
+ * dispatch path itself, which every request and notification crosses, so it also
26
+ * catches `initialize` — special-cased into `onInitialize` and invisible to any
27
+ * `onRequest` decoration.
28
+ *
29
+ * What it measures is **dispatch plus handler**, not handler alone: the wait a
30
+ * client actually experiences, including time queued behind other work.
31
+ *
32
+ * When `latency` is `undefined` the seam is off and this returns `undefined`, so
33
+ * a head can pass the result of an env-gated factory (`latencyFromEnv()`)
34
+ * straight through and pay nothing when timing is not enabled.
35
+ */
36
+ export function lspLatencyOptions(latency) {
37
+ if (!latency) {
38
+ return undefined;
39
+ }
40
+ return {
41
+ messageStrategy: {
42
+ handleMessage: (message, next) => {
43
+ // Responses to requests the SERVER sent carry no method and are not
44
+ // work this head performed; timing them would report the client's
45
+ // latency under a name this collector cannot supply.
46
+ if (!hasMethod(message)) {
47
+ return next(message);
48
+ }
49
+ return latency.time(message.method, () => next(message));
50
+ }
51
+ }
52
+ };
53
+ }
54
+ /** Narrow to the messages that name an operation — requests and notifications. */
55
+ function hasMethod(message) {
56
+ return typeof message.method === 'string';
57
+ }
58
+ //# sourceMappingURL=lsp-latency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lsp-latency.js","sourceRoot":"","sources":["../../src/lsp/lsp-latency.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAKlF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAqC;IACpE,IAAI,CAAC,OAAO,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC;IACpB,CAAC;IACD,OAAO;QACJ,eAAe,EAAE;YACd,aAAa,EAAE,CAAC,OAAgB,EAAE,IAAgD,EAAE,EAAE;gBACnF,oEAAoE;gBACpE,kEAAkE;gBAClE,qDAAqD;gBACrD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;oBACvB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;gBACxB,CAAC;gBACD,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5D,CAAC;SACH;KACH,CAAC;AACL,CAAC;AAED,kFAAkF;AAClF,SAAS,SAAS,CAAC,OAAgB;IAChC,OAAO,OAAQ,OAAgC,CAAC,MAAM,KAAK,QAAQ,CAAC;AACvE,CAAC"}