@hydranium/core 1.0.0-next.35 → 1.0.0-next.351

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 (779) 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 +266 -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 +25 -0
  130. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  131. package/lib/langium/diagnostics/lsp-logger.js +81 -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 +310 -41
  144. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  145. package/lib/langium/document-builder/document-builder.js +490 -79
  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 +115 -32
  216. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  217. package/lib/langium/scope/hydranium-scope-provider.js +201 -39
  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 +69 -37
  230. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  231. package/lib/langium/scope/scope-extension-service.js +102 -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 +12 -0
  247. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  248. package/lib/langium/serialization/yaml-serializer.js +24 -4
  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 +543 -0
  266. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  267. package/lib/langium/trivia/comment-preserver.js +1164 -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 +264 -26
  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/edit-requests-guard.d.ts +31 -0
  379. package/lib/lsp/edit-requests-guard.d.ts.map +1 -0
  380. package/lib/lsp/edit-requests-guard.js +125 -0
  381. package/lib/lsp/edit-requests-guard.js.map +1 -0
  382. package/lib/lsp/hydranium-document-update-handler.d.ts +126 -82
  383. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  384. package/lib/lsp/hydranium-document-update-handler.js +235 -102
  385. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  386. package/lib/lsp/index.d.ts +6 -2
  387. package/lib/lsp/index.d.ts.map +1 -1
  388. package/lib/lsp/index.js +6 -2
  389. package/lib/lsp/index.js.map +1 -1
  390. package/lib/lsp/lsp-latency.d.ts +39 -0
  391. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  392. package/lib/lsp/lsp-latency.js +58 -0
  393. package/lib/lsp/lsp-latency.js.map +1 -0
  394. package/lib/lsp/save-text-document.d.ts +31 -0
  395. package/lib/lsp/save-text-document.d.ts.map +1 -0
  396. package/lib/lsp/save-text-document.js +52 -0
  397. package/lib/lsp/save-text-document.js.map +1 -0
  398. package/lib/lsp/semantic-token-provider.d.ts +58 -2
  399. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  400. package/lib/lsp/semantic-token-provider.js +98 -9
  401. package/lib/lsp/semantic-token-provider.js.map +1 -1
  402. package/lib/lsp/shared-module.d.ts +4 -8
  403. package/lib/lsp/shared-module.d.ts.map +1 -1
  404. package/lib/lsp/shared-module.js.map +1 -1
  405. package/lib/lsp/start-language-server.d.ts +12 -7
  406. package/lib/lsp/start-language-server.d.ts.map +1 -1
  407. package/lib/lsp/start-language-server.js +21 -7
  408. package/lib/lsp/start-language-server.js.map +1 -1
  409. package/lib/messages/carriers.d.ts +4 -6
  410. package/lib/messages/carriers.d.ts.map +1 -1
  411. package/lib/messages/carriers.js +4 -6
  412. package/lib/messages/carriers.js.map +1 -1
  413. package/lib/messages/index.d.ts +2 -2
  414. package/lib/messages/index.d.ts.map +1 -1
  415. package/lib/messages/index.js +2 -2
  416. package/lib/messages/index.js.map +1 -1
  417. package/lib/messages/renderer.d.ts +32 -7
  418. package/lib/messages/renderer.d.ts.map +1 -1
  419. package/lib/messages/renderer.js +7 -1
  420. package/lib/messages/renderer.js.map +1 -1
  421. package/lib/node/event-loop-monitor.d.ts.map +1 -1
  422. package/lib/node/event-loop-monitor.js +2 -1
  423. package/lib/node/event-loop-monitor.js.map +1 -1
  424. package/lib/node/heap-ceiling.d.ts +61 -0
  425. package/lib/node/heap-ceiling.d.ts.map +1 -0
  426. package/lib/node/heap-ceiling.js +72 -0
  427. package/lib/node/heap-ceiling.js.map +1 -0
  428. package/lib/node/index.d.ts +1 -1
  429. package/lib/node/index.d.ts.map +1 -1
  430. package/lib/node/index.js +5 -1
  431. package/lib/node/index.js.map +1 -1
  432. package/lib/node/latency-from-env.d.ts +1 -1
  433. package/lib/node/latency-from-env.js +1 -1
  434. package/lib/node/lint-grammar.js.map +1 -1
  435. package/lib/node/log-file-sink.d.ts +3 -2
  436. package/lib/node/log-file-sink.d.ts.map +1 -1
  437. package/lib/node/log-file-sink.js +6 -2
  438. package/lib/node/log-file-sink.js.map +1 -1
  439. package/lib/node/log-preamble-node.d.ts +5 -3
  440. package/lib/node/log-preamble-node.d.ts.map +1 -1
  441. package/lib/node/log-preamble-node.js +13 -10
  442. package/lib/node/log-preamble-node.js.map +1 -1
  443. package/lib/node/measure-memory.d.ts.map +1 -1
  444. package/lib/node/measure-memory.js +5 -4
  445. package/lib/node/measure-memory.js.map +1 -1
  446. package/lib/node/memory-monitor.d.ts +2 -2
  447. package/lib/node/memory-monitor.d.ts.map +1 -1
  448. package/lib/node/memory-monitor.js +9 -10
  449. package/lib/node/memory-monitor.js.map +1 -1
  450. package/lib/node/node-file-system-provider.d.ts +67 -9
  451. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  452. package/lib/node/node-file-system-provider.js +198 -53
  453. package/lib/node/node-file-system-provider.js.map +1 -1
  454. package/lib/node/profile-capture.d.ts +12 -4
  455. package/lib/node/profile-capture.d.ts.map +1 -1
  456. package/lib/node/profile-capture.js +8 -6
  457. package/lib/node/profile-capture.js.map +1 -1
  458. package/lib/node/profile-digest.js.map +1 -1
  459. package/lib/node/profiling-run.d.ts +13 -3
  460. package/lib/node/profiling-run.d.ts.map +1 -1
  461. package/lib/node/profiling-run.js +17 -8
  462. package/lib/node/profiling-run.js.map +1 -1
  463. package/lib/node/rename-over-open-readers.d.ts +61 -0
  464. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  465. package/lib/node/rename-over-open-readers.js +80 -0
  466. package/lib/node/rename-over-open-readers.js.map +1 -0
  467. package/lib/node/server-diagnostics.js +1 -1
  468. package/lib/node/server-diagnostics.js.map +1 -1
  469. package/lib/node/server-state-snapshot.js +4 -4
  470. package/lib/node/server-state-snapshot.js.map +1 -1
  471. package/lib/node/socket-launcher.d.ts +43 -7
  472. package/lib/node/socket-launcher.d.ts.map +1 -1
  473. package/lib/node/socket-launcher.js +42 -7
  474. package/lib/node/socket-launcher.js.map +1 -1
  475. package/lib/node/startup-cpu-profile.d.ts +29 -0
  476. package/lib/node/startup-cpu-profile.d.ts.map +1 -0
  477. package/lib/node/startup-cpu-profile.js +91 -0
  478. package/lib/node/startup-cpu-profile.js.map +1 -0
  479. package/lib/node/stdio-launcher.d.ts +13 -13
  480. package/lib/node/stdio-launcher.d.ts.map +1 -1
  481. package/lib/node/stdio-launcher.js +21 -11
  482. package/lib/node/stdio-launcher.js.map +1 -1
  483. package/lib/node/validate-workspace.d.ts +1 -1
  484. package/lib/node/validate-workspace.d.ts.map +1 -1
  485. package/lib/node/validate-workspace.js +5 -1
  486. package/lib/node/validate-workspace.js.map +1 -1
  487. package/lib/testing/document-uri-policy-conformance.js +1 -1
  488. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  489. package/lib/testing/fake-description.js.map +1 -1
  490. package/lib/testing/fake-document.d.ts +2 -1
  491. package/lib/testing/fake-document.d.ts.map +1 -1
  492. package/lib/testing/fake-document.js.map +1 -1
  493. package/lib/testing/index.d.ts +1 -1
  494. package/lib/testing/index.d.ts.map +1 -1
  495. package/lib/testing/index.js +2 -1
  496. package/lib/testing/index.js.map +1 -1
  497. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  498. package/lib/testing/langium-test-helpers.js +1 -0
  499. package/lib/testing/langium-test-helpers.js.map +1 -1
  500. package/lib/testing/make-noop-language-services.js.map +1 -1
  501. package/lib/testing/make-noop-shared-services.d.ts +4 -4
  502. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  503. package/lib/testing/make-noop-shared-services.js +4 -4
  504. package/lib/testing/make-noop-shared-services.js.map +1 -1
  505. package/lib/testing/make-test-services.d.ts +51 -20
  506. package/lib/testing/make-test-services.d.ts.map +1 -1
  507. package/lib/testing/make-test-services.js +29 -13
  508. package/lib/testing/make-test-services.js.map +1 -1
  509. package/lib/testing/make-test-tracer.d.ts +12 -0
  510. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  511. package/lib/testing/make-test-tracer.js +13 -0
  512. package/lib/testing/make-test-tracer.js.map +1 -1
  513. package/lib/testing/node/applied-edit-capture.d.ts +29 -0
  514. package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
  515. package/lib/testing/node/applied-edit-capture.js +117 -0
  516. package/lib/testing/node/applied-edit-capture.js.map +1 -0
  517. package/lib/testing/node/golden-corpus.js.map +1 -1
  518. package/lib/testing/node/index.d.ts +1 -0
  519. package/lib/testing/node/index.d.ts.map +1 -1
  520. package/lib/testing/node/index.js +1 -0
  521. package/lib/testing/node/index.js.map +1 -1
  522. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  523. package/lib/testing/node/lsp-harness.js +2 -0
  524. package/lib/testing/node/lsp-harness.js.map +1 -1
  525. package/lib/testing/node/lsp-server-connection.d.ts +21 -6
  526. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  527. package/lib/testing/node/lsp-server-connection.js +49 -106
  528. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  529. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  530. package/lib/testing/node/scratch-workspace.js +10 -5
  531. package/lib/testing/node/scratch-workspace.js.map +1 -1
  532. package/lib/testing/node/spawned-server.d.ts +30 -1
  533. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  534. package/lib/testing/node/spawned-server.js +39 -2
  535. package/lib/testing/node/spawned-server.js.map +1 -1
  536. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  537. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  538. package/lib/testing/node/unhandled-rejections.js +32 -0
  539. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  540. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  541. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  542. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  543. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  544. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  545. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  546. package/lib/testing/playwright/index.d.ts +1 -0
  547. package/lib/testing/playwright/index.d.ts.map +1 -1
  548. package/lib/testing/playwright/index.js +1 -0
  549. package/lib/testing/playwright/index.js.map +1 -1
  550. package/lib/testing/playwright/server-log-capture.d.ts +46 -16
  551. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  552. package/lib/testing/playwright/server-log-capture.js +111 -40
  553. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  554. package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
  555. package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
  556. package/lib/testing/playwright/server-log-fixture.js +25 -6
  557. package/lib/testing/playwright/server-log-fixture.js.map +1 -1
  558. package/lib/testing/playwright/server-log-region.d.ts +15 -0
  559. package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
  560. package/lib/testing/playwright/server-log-region.js +30 -0
  561. package/lib/testing/playwright/server-log-region.js.map +1 -0
  562. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  563. package/lib/testing/playwright/server-log-rename-reporter.js +4 -3
  564. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  565. package/lib/testing/run-update-pipeline.d.ts +8 -5
  566. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  567. package/lib/testing/run-update-pipeline.js.map +1 -1
  568. package/lib/testing/stub-ast-document-manager.d.ts +11 -52
  569. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  570. package/lib/testing/stub-ast-document-manager.js +31 -62
  571. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  572. package/lib/testing/stub-document-builder.d.ts +33 -11
  573. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  574. package/lib/testing/stub-document-builder.js +103 -5
  575. package/lib/testing/stub-document-builder.js.map +1 -1
  576. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  577. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  578. package/lib/testing/stub-hydranium-text-documents.js +132 -16
  579. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  580. package/lib/testing/stub-index-manager.js.map +1 -1
  581. package/lib/testing/stub-langium-documents.d.ts +3 -2
  582. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  583. package/lib/testing/stub-langium-documents.js.map +1 -1
  584. package/lib/testing/stub-model-service.d.ts +9 -8
  585. package/lib/testing/stub-model-service.d.ts.map +1 -1
  586. package/lib/testing/stub-model-service.js +6 -6
  587. package/lib/testing/stub-model-service.js.map +1 -1
  588. package/lib/testing/stub-project-manager.js.map +1 -1
  589. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  590. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  591. package/lib/testing/stub-service-registry.d.ts +1 -1
  592. package/lib/testing/stub-service-registry.js.map +1 -1
  593. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  594. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  595. package/lib/testing/stub-writable-file-system.js +2 -1
  596. package/lib/testing/stub-writable-file-system.js.map +1 -1
  597. package/lib/util/connection-liveness.d.ts +22 -6
  598. package/lib/util/connection-liveness.d.ts.map +1 -1
  599. package/lib/util/connection-liveness.js +74 -15
  600. package/lib/util/connection-liveness.js.map +1 -1
  601. package/lib/util/environment.d.ts +7 -0
  602. package/lib/util/environment.d.ts.map +1 -1
  603. package/lib/util/environment.js +15 -1
  604. package/lib/util/environment.js.map +1 -1
  605. package/lib/util/registry.d.ts.map +1 -1
  606. package/package.json +41 -60
  607. package/src/browser/host-heads-in-worker.ts +218 -0
  608. package/src/browser/index.ts +17 -0
  609. package/src/browser/indexeddb-file-system-store.ts +192 -0
  610. package/src/browser/start-language-server-in-worker.ts +56 -0
  611. package/src/documents/ast-document-manager.ts +479 -233
  612. package/src/documents/client-ids.ts +5 -22
  613. package/src/documents/client-session-errors.ts +24 -0
  614. package/src/documents/client-session-registry.ts +262 -0
  615. package/src/documents/dirty-state-tracker.ts +167 -0
  616. package/src/documents/document-release-handler.ts +404 -0
  617. package/src/documents/document-release-scheduler.ts +121 -0
  618. package/src/documents/file-system-task-queue.ts +74 -0
  619. package/src/documents/hydranium-text-documents.ts +1029 -595
  620. package/src/documents/index.ts +10 -2
  621. package/src/documents/language-client-shadow.ts +501 -0
  622. package/src/documents/model-ledger.ts +66 -0
  623. package/src/documents/text-ledger.ts +112 -0
  624. package/src/documents/version-sync-service.ts +275 -0
  625. package/src/index.ts +7 -0
  626. package/src/langium/ast-extension/ast-extension-service.ts +77 -41
  627. package/src/langium/ast-extension/ast-node-builder.ts +35 -13
  628. package/src/langium/bootstrap.ts +87 -51
  629. package/src/langium/build-phase-pass/build-phase-pass-service.ts +29 -19
  630. package/src/langium/build-phase-pass/build-phase-pass.ts +37 -8
  631. package/src/langium/composite-ast-reflection.ts +112 -0
  632. package/src/langium/config/configuration-provider.ts +119 -0
  633. package/src/langium/config/index.ts +1 -0
  634. package/src/langium/diagnostics/console-tee.ts +151 -0
  635. package/src/langium/diagnostics/format-log-arg.ts +36 -0
  636. package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
  637. package/src/langium/diagnostics/log-preamble.ts +1 -1
  638. package/src/langium/diagnostics/logger.ts +51 -17
  639. package/src/langium/diagnostics/lsp-logger.ts +83 -44
  640. package/src/langium/document-builder/build-pipeline-integration.ts +46 -32
  641. package/src/langium/document-builder/build-session.ts +4 -3
  642. package/src/langium/document-builder/document-builder.ts +615 -79
  643. package/src/langium/integration-services.ts +59 -28
  644. package/src/langium/integrity/integrity-rule.ts +17 -8
  645. package/src/langium/integrity/integrity-service.ts +332 -69
  646. package/src/langium/language-module.ts +49 -8
  647. package/src/langium/model-service/client-session.ts +726 -0
  648. package/src/langium/model-service/index.ts +2 -0
  649. package/src/langium/model-service/model-events.ts +80 -0
  650. package/src/langium/model-service/model-service.ts +878 -494
  651. package/src/langium/module.ts +195 -72
  652. package/src/langium/naming/name-provider.ts +34 -8
  653. package/src/langium/project/abstract-project-manager.ts +13 -5
  654. package/src/langium/project/project-change-event.ts +2 -2
  655. package/src/langium/residency/cst-residency-service.ts +54 -19
  656. package/src/langium/scope/fallback-scope.ts +38 -0
  657. package/src/langium/scope/hydranium-scope-computation.ts +45 -44
  658. package/src/langium/scope/hydranium-scope-provider.ts +228 -41
  659. package/src/langium/scope/index.ts +1 -0
  660. package/src/langium/scope/reference-candidate-provider.ts +6 -5
  661. package/src/langium/scope/scope-extension-service.ts +148 -56
  662. package/src/langium/scope/scoped-ast-node-description.ts +1 -3
  663. package/src/langium/serialization/abstract-serializer.ts +57 -41
  664. package/src/langium/serialization/json-serializer.ts +14 -3
  665. package/src/langium/serialization/serializer.ts +1 -1
  666. package/src/langium/serialization/yaml-serializer.ts +26 -4
  667. package/src/langium/service-registry.ts +41 -2
  668. package/src/langium/shared-services.ts +16 -7
  669. package/src/langium/single-langium-copy.ts +42 -0
  670. package/src/langium/transfer/transfer-encoder.ts +104 -47
  671. package/src/langium/trivia/comment-preserver.ts +1409 -0
  672. package/src/langium/trivia/document-ending-preserver.ts +71 -0
  673. package/src/langium/trivia/index.ts +14 -0
  674. package/src/langium/trivia/trivia-contribution.ts +39 -0
  675. package/src/langium/trivia/trivia-preserver.ts +56 -0
  676. package/src/langium/trivia/trivia-service.ts +99 -0
  677. package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
  678. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  679. package/src/langium/validation/document-validator.ts +312 -31
  680. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  681. package/src/langium/workspace/document-uri-policy.ts +32 -18
  682. package/src/langium/workspace/file-not-found.ts +35 -0
  683. package/src/langium/workspace/file-system-provider.ts +258 -16
  684. package/src/langium/workspace/hydranium-langium-document-factory.ts +83 -0
  685. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
  686. package/src/langium/workspace/hydranium-workspace-manager.ts +212 -35
  687. package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
  688. package/src/langium/workspace/index.ts +1 -0
  689. package/src/langium/workspace/initialize-workspace.ts +96 -4
  690. package/src/langium/workspace/langium-documents.ts +19 -1
  691. package/src/langium/workspace/persistent-file-system-provider.ts +27 -15
  692. package/src/langium/workspace/self-save-registry.ts +118 -0
  693. package/src/langium/workspace/virtual-document.ts +106 -25
  694. package/src/langium/workspace/write-lock-scope.ts +27 -12
  695. package/src/launcher/integrated-server.ts +3 -1
  696. package/src/locale/server-locale.ts +20 -5
  697. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  698. package/src/lsp/connection-features.ts +67 -0
  699. package/src/lsp/diagnostics-connection.ts +56 -0
  700. package/src/lsp/edit-requests-guard.ts +152 -0
  701. package/src/lsp/hydranium-document-update-handler.ts +285 -111
  702. package/src/lsp/index.ts +6 -2
  703. package/src/lsp/lsp-latency.ts +62 -0
  704. package/src/lsp/save-text-document.ts +63 -0
  705. package/src/lsp/semantic-token-provider.ts +146 -8
  706. package/src/lsp/shared-module.ts +4 -8
  707. package/src/lsp/start-language-server.ts +21 -7
  708. package/src/messages/carriers.ts +4 -6
  709. package/src/messages/index.ts +11 -2
  710. package/src/messages/renderer.ts +34 -6
  711. package/src/node/event-loop-monitor.ts +2 -1
  712. package/src/node/heap-ceiling.ts +108 -0
  713. package/src/node/index.ts +5 -1
  714. package/src/node/latency-from-env.ts +1 -1
  715. package/src/node/log-file-sink.ts +6 -2
  716. package/src/node/log-preamble-node.ts +20 -10
  717. package/src/node/measure-memory.ts +5 -4
  718. package/src/node/memory-monitor.ts +10 -10
  719. package/src/node/node-file-system-provider.ts +214 -57
  720. package/src/node/profile-capture.ts +16 -15
  721. package/src/node/profiling-run.ts +30 -8
  722. package/src/node/rename-over-open-readers.ts +94 -0
  723. package/src/node/server-diagnostics.ts +1 -1
  724. package/src/node/server-state-snapshot.ts +5 -5
  725. package/src/node/socket-launcher.ts +78 -14
  726. package/src/node/startup-cpu-profile.ts +94 -0
  727. package/src/node/stdio-launcher.ts +29 -19
  728. package/src/node/validate-workspace.ts +8 -2
  729. package/src/testing/document-uri-policy-conformance.ts +1 -1
  730. package/src/testing/fake-document.ts +2 -1
  731. package/src/testing/index.ts +2 -1
  732. package/src/testing/langium-test-helpers.ts +1 -0
  733. package/src/testing/make-noop-shared-services.ts +6 -6
  734. package/src/testing/make-test-services.ts +93 -41
  735. package/src/testing/make-test-tracer.ts +26 -0
  736. package/src/testing/node/applied-edit-capture.ts +141 -0
  737. package/src/testing/node/index.ts +1 -0
  738. package/src/testing/node/lsp-harness.ts +2 -0
  739. package/src/testing/node/lsp-server-connection.ts +83 -119
  740. package/src/testing/node/scratch-workspace.ts +10 -5
  741. package/src/testing/node/spawned-server.ts +57 -3
  742. package/src/testing/node/unhandled-rejections.ts +31 -0
  743. package/src/testing/parse-semantic-root.ts +1 -1
  744. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  745. package/src/testing/playwright/index.ts +1 -0
  746. package/src/testing/playwright/server-log-capture.ts +137 -47
  747. package/src/testing/playwright/server-log-fixture.ts +46 -6
  748. package/src/testing/playwright/server-log-region.ts +32 -0
  749. package/src/testing/playwright/server-log-rename-reporter.ts +4 -3
  750. package/src/testing/run-update-pipeline.ts +8 -5
  751. package/src/testing/stub-ast-document-manager.ts +47 -128
  752. package/src/testing/stub-document-builder.ts +138 -18
  753. package/src/testing/stub-hydranium-text-documents.ts +184 -27
  754. package/src/testing/stub-langium-documents.ts +3 -2
  755. package/src/testing/stub-model-service.ts +11 -10
  756. package/src/testing/stub-self-save-registry.ts +1 -1
  757. package/src/testing/stub-service-registry.ts +1 -1
  758. package/src/testing/stub-writable-file-system.ts +3 -2
  759. package/src/util/connection-liveness.ts +80 -15
  760. package/src/util/environment.ts +24 -2
  761. package/lib/documents/language-client-text-shadow.d.ts +0 -101
  762. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  763. package/lib/documents/language-client-text-shadow.js +0 -156
  764. package/lib/documents/language-client-text-shadow.js.map +0 -1
  765. package/lib/documents/self-save-registry.d.ts +0 -55
  766. package/lib/documents/self-save-registry.d.ts.map +0 -1
  767. package/lib/documents/self-save-registry.js.map +0 -1
  768. package/lib/lsp/instrument-connection.d.ts +0 -36
  769. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  770. package/lib/lsp/instrument-connection.js +0 -62
  771. package/lib/lsp/instrument-connection.js.map +0 -1
  772. package/lib/node/process-memory.d.ts +0 -66
  773. package/lib/node/process-memory.d.ts.map +0 -1
  774. package/lib/node/process-memory.js +0 -252
  775. package/lib/node/process-memory.js.map +0 -1
  776. package/src/documents/language-client-text-shadow.ts +0 -175
  777. package/src/documents/self-save-registry.ts +0 -81
  778. package/src/lsp/instrument-connection.ts +0 -66
  779. package/src/node/process-memory.ts +0 -299
@@ -0,0 +1,204 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+ import { type URI } from '@hydranium/langium';
10
+ import { type CanonicalUri, type Tracer } from '@hydranium/protocol';
11
+ import { type CancellationToken } from 'vscode-languageserver';
12
+ import { type LogNameOptions } from '../langium/diagnostics/logger.js';
13
+ import { type ServerSharedServices } from '../langium/module.js';
14
+ /**
15
+ * A document the store has released: no client holds its text any more. Its
16
+ * queries read the store live, not a snapshot taken at the release.
17
+ */
18
+ export interface ReleasedDocument {
19
+ readonly uri: CanonicalUri;
20
+ /**
21
+ * Whether the store last knew a file behind the document: `false` for one
22
+ * created from a session's text and never saved, or whose file a reload
23
+ * found gone; any other open counts as on disk. Unlike the queries, a
24
+ * snapshot taken at the release, since the store forgets it there.
25
+ */
26
+ readonly wasOnDisk: boolean;
27
+ /** Whether `uri` names this document, under the store's own keying. */
28
+ isFor(uri: string): boolean;
29
+ /**
30
+ * Whether a client took the document back: it holds it again, or it waits
31
+ * out a new grace. Either way it is that client's, and the build keeps its text.
32
+ */
33
+ isReclaimed(): boolean;
34
+ }
35
+ /**
36
+ * The rejection of a release skipped because the connection or the workspace
37
+ * went away, with the error that showed it as `cause`. The store logs it at
38
+ * debug, as routine at teardown, and any other rejection as an error.
39
+ */
40
+ export declare class DocumentReleaseSkippedError extends Error {
41
+ constructor(cause: unknown);
42
+ }
43
+ /**
44
+ * Whether `error` is a {@link DocumentReleaseSkippedError}, by name, so one
45
+ * thrown by another installed copy of this package counts too.
46
+ */
47
+ export declare function isDocumentReleaseSkippedError(error: unknown): error is DocumentReleaseSkippedError;
48
+ /**
49
+ * Decides what the build keeps for a document the store has released. Called
50
+ * by the store at each release, for every head, after its release event.
51
+ *
52
+ * The returned promise settles the release: it resolves once the build holds
53
+ * what it keeps for the document, and rejects when that build failed and may
54
+ * still hold the released text. Until then, watchers keep a document released
55
+ * dirty marked dirty. On a resolve the store announces it clean, naming the
56
+ * store's last text while the build still has the document, and no text once
57
+ * it has none; on a rejection, no text. The store logs a throw or rejection; reject with a
58
+ * {@link DocumentReleaseSkippedError} for a release skipped at teardown.
59
+ *
60
+ * The data server announces the first build of a released document as the
61
+ * release, so a handler that builds nothing leaves that to whichever build
62
+ * comes next; one that carries a client's write keeps that client's name.
63
+ *
64
+ * Extend {@link DefaultDocumentReleaseHandler} to change only the policy: it
65
+ * keeps the locking and the wait for the build. An implementation written
66
+ * from scratch has to wait for that build itself before it resolves.
67
+ */
68
+ export interface DocumentReleaseHandler {
69
+ didReleaseDocument(released: ReleasedDocument): Promise<void>;
70
+ }
71
+ /** What the build does with a released document: rebuild it from its file, or remove it. */
72
+ export type DocumentReleaseDecision = 'rebuild' | 'remove';
73
+ /** How {@link DefaultDocumentReleaseHandler.runRelease} went. */
74
+ export type DocumentReleaseOutcome =
75
+ /** A client took the document back: what the build keeps is that client's. */
76
+ {
77
+ readonly kind: 'reclaimed';
78
+ }
79
+ /**
80
+ * The lock resolved the write without running it, and the write that
81
+ * cancelled it does not build this document. The framework's lock always
82
+ * runs a cancelled write; a rebound `WorkspaceLock` may not.
83
+ */
84
+ | {
85
+ readonly kind: 'discarded';
86
+ readonly decision: DocumentReleaseDecision;
87
+ }
88
+ /** The build started and was cancelled; `parsed` when it parsed the document first. */
89
+ | {
90
+ readonly kind: 'cancelled';
91
+ readonly decision: DocumentReleaseDecision;
92
+ readonly parsed: boolean;
93
+ }
94
+ /** The decision was carried out. */
95
+ | {
96
+ readonly kind: 'completed';
97
+ readonly decision: DocumentReleaseDecision;
98
+ readonly parsed: boolean;
99
+ }
100
+ /** The decision or the build threw; `decision` is unset when deciding did. */
101
+ | {
102
+ readonly kind: 'failed';
103
+ readonly decision: DocumentReleaseDecision | undefined;
104
+ readonly parsed: boolean;
105
+ readonly error: unknown;
106
+ }
107
+ /** The connection or the workspace went away: nothing more is built. `parsed` when the build parsed the document first. */
108
+ | {
109
+ readonly kind: 'skipped';
110
+ readonly parsed: boolean;
111
+ readonly error: unknown;
112
+ };
113
+ /**
114
+ * Rebuilds a released document from the file system provider, so the build
115
+ * stops carrying the unsaved text of its last client. Override
116
+ * `decideRelease`, `redecideRelease` or `applyReleaseDecision` to change the
117
+ * policy and keep the locking and the wait for the build.
118
+ *
119
+ * The provider decides, for every scheme, by `exists`, with a miss confirmed
120
+ * by `existsSettled`: a document it can serve is rebuilt from its text, and
121
+ * any other — an editor's `untitled:` buffer, a file never saved, or one
122
+ * deleted meanwhile — is removed from the workspace. A `virtual:` document
123
+ * survives, since the framework's provider for that scheme serves it from the
124
+ * index, whatever provider the host passes as `context.fileSystemProvider`;
125
+ * an edited one therefore keeps its last client's text, and keeping it
126
+ * read-only is the client's job.
127
+ *
128
+ * The answer is read in the document's disk queue, so the rebuild follows
129
+ * any save still queued rather than reverting past it; a file that goes
130
+ * after that read is removed when its rebuild finds none and the provider
131
+ * confirms it gone.
132
+ *
133
+ * Whether the document is still released is checked again inside the write
134
+ * lock, as its holder: checked only before waiting for the lock, a client that
135
+ * opens or re-creates the document meanwhile would have its text rebuilt over,
136
+ * or the document removed. A document some client has open again, or that
137
+ * waits out a new grace, is left to that client.
138
+ *
139
+ * The promise resolves once the revert has parsed the file, even if it is
140
+ * then cancelled, or else once the build it requests in its place has parsed
141
+ * it or removed the document. It rejects when that build fails, and when the
142
+ * revert is skipped because the connection or the workspace went away before
143
+ * it parsed the file, with a {@link DocumentReleaseSkippedError}.
144
+ */
145
+ export declare class DefaultDocumentReleaseHandler implements DocumentReleaseHandler {
146
+ protected readonly services: ServerSharedServices;
147
+ protected readonly tracer: Tracer;
148
+ constructor(services: ServerSharedServices, options?: LogNameOptions);
149
+ didReleaseDocument(released: ReleasedDocument): Promise<void>;
150
+ /**
151
+ * Decide, then carry the decision out under the write lock unless a client
152
+ * holds the document again. A rebuild that finds no file is redecided by
153
+ * {@link redecideRelease} within the same lock section: the build has
154
+ * already reset the document, so a build let in meanwhile would read the
155
+ * missing file and fail. Its answer is carried out unless a client
156
+ * reclaimed the document meanwhile. Answers how that went; a parse of the
157
+ * document seen meanwhile counts even when the build was cancelled after
158
+ * it, since the build it yields to does not parse again.
159
+ */
160
+ protected runRelease(released: ReleasedDocument, target: URI): Promise<DocumentReleaseOutcome>;
161
+ /**
162
+ * `outcome` for the line each release logs at debug: its kind, the
163
+ * decision and whether the document was parsed.
164
+ */
165
+ protected formatReleaseOutcome(outcome: DocumentReleaseOutcome): string;
166
+ /**
167
+ * The policy: rebuild a document the file system provider can serve, and
168
+ * remove any other. Read in the document's disk queue, so it follows any
169
+ * save still queued rather than deciding past it. A miss is settled outside
170
+ * the queue, so waiting it out holds up no write to the file, and only for
171
+ * a document the store knew on disk: one with no file has none to replace.
172
+ */
173
+ protected decideRelease(released: ReleasedDocument, target: URI): Promise<DocumentReleaseDecision>;
174
+ /**
175
+ * The policy for a rebuild that found no file, the `misses`-th of this
176
+ * release: what to carry out instead. Runs inside the release's write, so
177
+ * every build waits on it. The default settles the first miss through the
178
+ * provider's `existsSettled`, rebuilding again when the file is back, and
179
+ * removes the document on any later one. An override answering `rebuild`
180
+ * on every miss rebuilds for as long as the file stays missing.
181
+ */
182
+ protected redecideRelease(_released: ReleasedDocument, target: URI, misses: number): Promise<DocumentReleaseDecision>;
183
+ /**
184
+ * Carry `decision` out under the write lock. A rebuild that finds no file
185
+ * rejects with that error, and {@link redecideRelease} answers what to
186
+ * carry out instead. An override must rebuild or remove the document: release settlement
187
+ * waits for its parse or removal, and one that does neither is followed by a
188
+ * recovery build that rebuilds it.
189
+ */
190
+ protected applyReleaseDecision(target: URI, decision: DocumentReleaseDecision, token: CancellationToken): Promise<void>;
191
+ /** The build in place of a release that stopped short; rejects with its error when it was given up. */
192
+ protected requestRecoveryBuild(released: ReleasedDocument, target: URI, deleted: boolean): Promise<void>;
193
+ /**
194
+ * Resolve now when the build holds the file's text of `target` or no longer
195
+ * has it, else once a parse or removal of `target` reaches the store:
196
+ * settled with the released text still in the build, the release would name
197
+ * that text. `startRecovery` requests the build in place of a revert that
198
+ * stopped short, started only once the parse and removal are watched, so a
199
+ * build that records the document at once is not missed. Rejects when that
200
+ * build fails, since no parse or removal is coming then.
201
+ */
202
+ protected waitForReleaseBuild(released: ReleasedDocument, target: URI, parsed: boolean, startRecovery: (() => Promise<void>) | undefined): Promise<void>;
203
+ }
204
+ //# sourceMappingURL=document-release-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-release-handler.d.ts","sourceRoot":"","sources":["../../src/documents/document-release-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,317 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+ import { UriUtils } from '@hydranium/langium';
10
+ import { describeError, describeErrorWithStack } from '@hydranium/protocol';
11
+ import { HYDRANIUM_BUILD_REASONS } from '../langium/document-builder/document-builder.js';
12
+ import { isFileNotFound } from '../langium/workspace/file-not-found.js';
13
+ import { isConnectionGoneError } from '../util/connection-liveness.js';
14
+ /**
15
+ * The rejection of a release skipped because the connection or the workspace
16
+ * went away, with the error that showed it as `cause`. The store logs it at
17
+ * debug, as routine at teardown, and any other rejection as an error.
18
+ */
19
+ export class DocumentReleaseSkippedError extends Error {
20
+ constructor(cause) {
21
+ super(`Release skipped: the connection or the workspace went away. ${describeError(cause)}`, {
22
+ cause
23
+ });
24
+ this.name = 'DocumentReleaseSkippedError';
25
+ }
26
+ }
27
+ /**
28
+ * Whether `error` is a {@link DocumentReleaseSkippedError}, by name, so one
29
+ * thrown by another installed copy of this package counts too.
30
+ */
31
+ export function isDocumentReleaseSkippedError(error) {
32
+ return error instanceof Error && error.name === 'DocumentReleaseSkippedError';
33
+ }
34
+ /**
35
+ * Rebuilds a released document from the file system provider, so the build
36
+ * stops carrying the unsaved text of its last client. Override
37
+ * `decideRelease`, `redecideRelease` or `applyReleaseDecision` to change the
38
+ * policy and keep the locking and the wait for the build.
39
+ *
40
+ * The provider decides, for every scheme, by `exists`, with a miss confirmed
41
+ * by `existsSettled`: a document it can serve is rebuilt from its text, and
42
+ * any other — an editor's `untitled:` buffer, a file never saved, or one
43
+ * deleted meanwhile — is removed from the workspace. A `virtual:` document
44
+ * survives, since the framework's provider for that scheme serves it from the
45
+ * index, whatever provider the host passes as `context.fileSystemProvider`;
46
+ * an edited one therefore keeps its last client's text, and keeping it
47
+ * read-only is the client's job.
48
+ *
49
+ * The answer is read in the document's disk queue, so the rebuild follows
50
+ * any save still queued rather than reverting past it; a file that goes
51
+ * after that read is removed when its rebuild finds none and the provider
52
+ * confirms it gone.
53
+ *
54
+ * Whether the document is still released is checked again inside the write
55
+ * lock, as its holder: checked only before waiting for the lock, a client that
56
+ * opens or re-creates the document meanwhile would have its text rebuilt over,
57
+ * or the document removed. A document some client has open again, or that
58
+ * waits out a new grace, is left to that client.
59
+ *
60
+ * The promise resolves once the revert has parsed the file, even if it is
61
+ * then cancelled, or else once the build it requests in its place has parsed
62
+ * it or removed the document. It rejects when that build fails, and when the
63
+ * revert is skipped because the connection or the workspace went away before
64
+ * it parsed the file, with a {@link DocumentReleaseSkippedError}.
65
+ */
66
+ export class DefaultDocumentReleaseHandler {
67
+ services;
68
+ tracer;
69
+ constructor(services, options = {}) {
70
+ this.services = services;
71
+ this.tracer = services.Tracer.for(options.logName ?? this.constructor.name).trace('instantiated');
72
+ }
73
+ async didReleaseDocument(released) {
74
+ const target = UriUtils.toUri(released.uri);
75
+ const outcome = await this.runRelease(released, target);
76
+ this.tracer.with(released.uri).debug(`Release outcome: ${this.formatReleaseOutcome(outcome)}`);
77
+ if (outcome.kind === 'skipped') {
78
+ if (!outcome.parsed) {
79
+ throw new DocumentReleaseSkippedError(outcome.error);
80
+ }
81
+ // The build holds the file's text: only what followed its parse, such as the diagnostics publish, was lost.
82
+ const { error } = outcome;
83
+ this.tracer.with(released.uri).debug(`Revert on release skipped after its parse: ${describeError(error)}`);
84
+ return;
85
+ }
86
+ if (outcome.kind === 'failed') {
87
+ // Handled below, by a recovery build or the client holding the document again; one that fails rejects on its own.
88
+ const { error } = outcome;
89
+ this.tracer.with(released.uri).warn(`Revert on release failed; building in its place. ${describeErrorWithStack(error)}`);
90
+ }
91
+ const parsed = 'parsed' in outcome && outcome.parsed;
92
+ // Without it, a revert stopped short, or an override that built nothing,
93
+ // leaves the root on the released text. A failed one also lost the change
94
+ // the update handler held back at the release; a document known to have
95
+ // no file is removed, as the revert would have.
96
+ const stoppedShort = ((outcome.kind === 'discarded' || outcome.kind === 'cancelled' || outcome.kind === 'completed') &&
97
+ !parsed &&
98
+ this.services.workspace.LangiumDocuments.getDocument(target) !== undefined) ||
99
+ outcome.kind === 'failed';
100
+ const recover = async () => {
101
+ try {
102
+ await this.requestRecoveryBuild(released, target, 'decision' in outcome && outcome.decision === 'remove');
103
+ }
104
+ catch (err) {
105
+ throw new Error(`Build after a revert that stopped short failed; the build keeps the released text. ${describeError(err)}`, {
106
+ cause: err
107
+ });
108
+ }
109
+ };
110
+ await this.waitForReleaseBuild(released, target, parsed, stoppedShort && !released.isReclaimed() ? recover : undefined);
111
+ }
112
+ /**
113
+ * Decide, then carry the decision out under the write lock unless a client
114
+ * holds the document again. A rebuild that finds no file is redecided by
115
+ * {@link redecideRelease} within the same lock section: the build has
116
+ * already reset the document, so a build let in meanwhile would read the
117
+ * missing file and fail. Its answer is carried out unless a client
118
+ * reclaimed the document meanwhile. Answers how that went; a parse of the
119
+ * document seen meanwhile counts even when the build was cancelled after
120
+ * it, since the build it yields to does not parse again.
121
+ */
122
+ async runRelease(released, target) {
123
+ const workspace = this.services.workspace;
124
+ let decision;
125
+ let parsed = false;
126
+ let parses;
127
+ // Typed by assertion: the write's callback moves it, which narrowing does not see.
128
+ let progress = 'queued';
129
+ try {
130
+ // Decided before the lock: every build and read waits while the lock
131
+ // is held, and the default decision waits on the file's save I/O.
132
+ const decided = await this.decideRelease(released, target);
133
+ decision = decided;
134
+ await workspace.WorkspaceManager?.ready;
135
+ // Queuing the write cancels the running build, even when it then reverts nothing.
136
+ if (released.isReclaimed()) {
137
+ return { kind: 'reclaimed' };
138
+ }
139
+ await workspace.WorkspaceLock.write(async (token) => {
140
+ if (released.isReclaimed()) {
141
+ progress = 'reclaimed';
142
+ return;
143
+ }
144
+ parses = workspace.VersionSyncService.onDidRecordModel(document => {
145
+ parsed ||= released.isFor(document.uri.toString());
146
+ });
147
+ progress = 'building';
148
+ let applied = decided;
149
+ for (let misses = 1;; misses++) {
150
+ try {
151
+ await this.applyReleaseDecision(target, applied, token);
152
+ break;
153
+ }
154
+ catch (err) {
155
+ if (applied !== 'rebuild' || !isFileNotFound(err, target)) {
156
+ throw err;
157
+ }
158
+ applied = await this.redecideRelease(released, target, misses);
159
+ if (released.isReclaimed()) {
160
+ progress = 'reclaimed';
161
+ return;
162
+ }
163
+ decision = applied;
164
+ this.tracer
165
+ .with(released.uri)
166
+ .debug(`Revert found no file; ${applied === 'rebuild' ? 'rebuilding again' : 'removing the document instead'}`);
167
+ }
168
+ }
169
+ progress = 'built';
170
+ });
171
+ // A cancelled build throws inside the write, and the lock resolves.
172
+ if (progress === 'reclaimed') {
173
+ return { kind: 'reclaimed' };
174
+ }
175
+ if (progress === 'queued') {
176
+ return { kind: 'discarded', decision };
177
+ }
178
+ if (progress === 'building') {
179
+ return { kind: 'cancelled', decision, parsed };
180
+ }
181
+ return { kind: 'completed', decision, parsed };
182
+ }
183
+ catch (error) {
184
+ // A revert that finishes after the LSP peer went away fails its
185
+ // diagnostics publish, and one that runs after its workspace was torn
186
+ // down finds no file: teardown races, not failed reverts.
187
+ if (isConnectionGoneError(error) || isFileNotFound(error, target)) {
188
+ return { kind: 'skipped', parsed, error };
189
+ }
190
+ return { kind: 'failed', decision, parsed, error };
191
+ }
192
+ finally {
193
+ parses?.dispose();
194
+ }
195
+ }
196
+ /**
197
+ * `outcome` for the line each release logs at debug: its kind, the
198
+ * decision and whether the document was parsed.
199
+ */
200
+ formatReleaseOutcome(outcome) {
201
+ if (outcome.kind === 'reclaimed') {
202
+ return 'reclaimed by a client, built nothing';
203
+ }
204
+ const decision = 'decision' in outcome && outcome.decision !== undefined ? ` ${outcome.decision}` : '';
205
+ const parsed = 'parsed' in outcome ? (outcome.parsed ? ', parsed' : ', not parsed') : '';
206
+ return `${outcome.kind}${decision}${parsed}`;
207
+ }
208
+ /**
209
+ * The policy: rebuild a document the file system provider can serve, and
210
+ * remove any other. Read in the document's disk queue, so it follows any
211
+ * save still queued rather than deciding past it. A miss is settled outside
212
+ * the queue, so waiting it out holds up no write to the file, and only for
213
+ * a document the store knew on disk: one with no file has none to replace.
214
+ */
215
+ async decideRelease(released, target) {
216
+ const workspace = this.services.workspace;
217
+ const fileSystem = workspace.FileSystemProvider;
218
+ const served = await workspace.FileSystemTaskQueue.enqueue(released.uri, () => fileSystem.exists(target));
219
+ if (served || !released.wasOnDisk) {
220
+ return served ? 'rebuild' : 'remove';
221
+ }
222
+ return ((await fileSystem.existsSettled?.(target)) ?? false) ? 'rebuild' : 'remove';
223
+ }
224
+ /**
225
+ * The policy for a rebuild that found no file, the `misses`-th of this
226
+ * release: what to carry out instead. Runs inside the release's write, so
227
+ * every build waits on it. The default settles the first miss through the
228
+ * provider's `existsSettled`, rebuilding again when the file is back, and
229
+ * removes the document on any later one. An override answering `rebuild`
230
+ * on every miss rebuilds for as long as the file stays missing.
231
+ */
232
+ async redecideRelease(_released, target, misses) {
233
+ if (misses > 1) {
234
+ return 'remove';
235
+ }
236
+ const fileSystem = this.services.workspace.FileSystemProvider;
237
+ return (await (fileSystem.existsSettled?.(target) ?? fileSystem.exists(target))) ? 'rebuild' : 'remove';
238
+ }
239
+ /**
240
+ * Carry `decision` out under the write lock. A rebuild that finds no file
241
+ * rejects with that error, and {@link redecideRelease} answers what to
242
+ * carry out instead. An override must rebuild or remove the document: release settlement
243
+ * waits for its parse or removal, and one that does neither is followed by a
244
+ * recovery build that rebuilds it.
245
+ */
246
+ async applyReleaseDecision(target, decision, token) {
247
+ const builder = this.services.workspace.DocumentBuilder;
248
+ builder.markNextReason(HYDRANIUM_BUILD_REASONS.didRelease);
249
+ await (decision === 'rebuild' ? builder.update([target], [], token) : builder.update([], [target], token));
250
+ }
251
+ /** The build in place of a release that stopped short; rejects with its error when it was given up. */
252
+ requestRecoveryBuild(released, target, deleted) {
253
+ return this.services.workspace.VersionSyncService.requestRecoveryBuild(target, {
254
+ deleted,
255
+ reason: HYDRANIUM_BUILD_REASONS.didRelease,
256
+ // The update handler dropped the change it held back at the release.
257
+ ignoreDeferred: true,
258
+ stillNeeded: () => !released.isReclaimed()
259
+ });
260
+ }
261
+ /**
262
+ * Resolve now when the build holds the file's text of `target` or no longer
263
+ * has it, else once a parse or removal of `target` reaches the store:
264
+ * settled with the released text still in the build, the release would name
265
+ * that text. `startRecovery` requests the build in place of a revert that
266
+ * stopped short, started only once the parse and removal are watched, so a
267
+ * build that records the document at once is not missed. Rejects when that
268
+ * build fails, since no parse or removal is coming then.
269
+ */
270
+ waitForReleaseBuild(released, target, parsed, startRecovery) {
271
+ const workspace = this.services.workspace;
272
+ // A client holding the document again keeps what the build holds for it.
273
+ if (parsed || workspace.LangiumDocuments.getDocument(target) === undefined || released.isReclaimed()) {
274
+ // The release got what it waits for, so a failed recovery build is diagnosis; its retry warned.
275
+ startRecovery?.().catch((err) => this.tracer.with(released.uri).debug(describeErrorWithStack(err)));
276
+ return Promise.resolve();
277
+ }
278
+ return new Promise((resolve, reject) => {
279
+ let ended = false;
280
+ const finish = (end) => {
281
+ if (ended) {
282
+ return;
283
+ }
284
+ ended = true;
285
+ parses.dispose();
286
+ removals.dispose();
287
+ end();
288
+ };
289
+ const parses = workspace.VersionSyncService.onDidRecordModel(document => {
290
+ if (released.isFor(document.uri.toString())) {
291
+ finish(resolve);
292
+ }
293
+ });
294
+ const removals = workspace.DocumentBuilder.onUpdate((_changed, deleted) => {
295
+ if (deleted.some(uri => released.isFor(uri.toString()))) {
296
+ finish(resolve);
297
+ }
298
+ });
299
+ startRecovery?.().then(
300
+ // A recovery build no longer needed, for a reclaimed document, builds nothing.
301
+ () => {
302
+ if (released.isReclaimed()) {
303
+ finish(resolve);
304
+ }
305
+ }, (err) => {
306
+ // Settled by a parse or removal that came first, so diagnosis; its retry warned.
307
+ if (ended) {
308
+ this.tracer.with(released.uri).debug(describeErrorWithStack(err));
309
+ }
310
+ else {
311
+ finish(() => reject(err));
312
+ }
313
+ });
314
+ });
315
+ }
316
+ }
317
+ //# sourceMappingURL=document-release-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-release-handler.js","sourceRoot":"","sources":["../../src/documents/document-release-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+ import { type CanonicalUri, type Clock, type Stopwatch } from '@hydranium/protocol';
10
+ import { type Disposable } from 'vscode-languageserver';
11
+ /** What an open of a document whose release is deferred means for it, as {@link DocumentReleaseScheduler.resolveOpen} decides. */
12
+ export type DeferredReleaseOpenDecision =
13
+ /** The opener was lost from the document within its grace: it keeps the unsaved text. */
14
+ 'keep'
15
+ /** Any other opener: the document is released first, and opens as a first open does. */
16
+ | 'release'
17
+ /** No release was deferred. */
18
+ | 'none';
19
+ /**
20
+ * Decides when the store releases a document no client holds: at once, or,
21
+ * when its last client's connection was lost, once a grace has passed, so a
22
+ * client that reconnects in time finds its unsaved text.
23
+ */
24
+ export interface DocumentReleaseScheduler {
25
+ /** How long a deferred release waits; `0` releases at once. */
26
+ readonly graceMs: number;
27
+ /** `clientId` closed `key` because its connection was lost. */
28
+ recordLoss(key: CanonicalUri, clientId: string): void;
29
+ /** No client holds `key` after a loss: run `release` once the grace has passed, or now when there is none. */
30
+ defer(key: CanonicalUri, release: () => void): void;
31
+ isDeferred(key: CanonicalUri): boolean;
32
+ /** `clientId` opens `key`; a deferred release ends either way. */
33
+ resolveOpen(key: CanonicalUri, clientId: string): DeferredReleaseOpenDecision;
34
+ /** End a deferred release of `key` without running it. */
35
+ cancel(key: CanonicalUri): void;
36
+ /** `key` was released: drop the losses recorded for it. */
37
+ clearLosses(key: CanonicalUri): void;
38
+ }
39
+ export declare class DefaultDocumentReleaseScheduler implements DocumentReleaseScheduler {
40
+ protected readonly clock: Clock;
41
+ readonly graceMs: number;
42
+ protected readonly deferred: Map<CanonicalUri, Disposable>;
43
+ /**
44
+ * Per document, the clients whose close of it was caused by a lost
45
+ * connection and that have not opened it again, each with a stopwatch
46
+ * started at its loss. Every such client counts, not only the last to
47
+ * close: one connection's sessions all end lost together, and any of them
48
+ * may reopen first. A stopwatch rather than a `now()` reading, because a
49
+ * wall-clock step would otherwise expire a claim early or revive one past
50
+ * its grace, against a grace timer that the step leaves alone.
51
+ */
52
+ protected readonly lostClients: Map<CanonicalUri, Map<string, Stopwatch>>;
53
+ constructor(clock: Clock, graceMs: number);
54
+ recordLoss(key: CanonicalUri, clientId: string): void;
55
+ defer(key: CanonicalUri, release: () => void): void;
56
+ isDeferred(key: CanonicalUri): boolean;
57
+ /**
58
+ * A claim past its grace counts as any other client's: without the limit,
59
+ * a client that returns late inherits the unsaved text of a holder lost
60
+ * after it. Cancelling for every open instead hands a lost client's unsaved
61
+ * text to whoever opens next, with nothing marking it unsaved.
62
+ */
63
+ resolveOpen(key: CanonicalUri, clientId: string): DeferredReleaseOpenDecision;
64
+ cancel(key: CanonicalUri): void;
65
+ clearLosses(key: CanonicalUri): void;
66
+ }
67
+ //# sourceMappingURL=document-release-scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-release-scheduler.d.ts","sourceRoot":"","sources":["../../src/documents/document-release-scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,kIAAkI;AAClI,MAAM,MAAM,2BAA2B;AACpC,yFAAyF;AACvF,MAAM;AACR,wFAAwF;GACtF,SAAS;AACX,+BAA+B;GAC7B,MAAM,CAAC;AAEZ;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACtC,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,+DAA+D;IAC/D,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACtD,8GAA8G;IAC9G,KAAK,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACpD,UAAU,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC;IACvC,kEAAkE;IAClE,WAAW,CAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,2BAA2B,CAAC;IAC9E,0DAA0D;IAC1D,MAAM,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC;IAChC,2DAA2D;IAC3D,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC;CACvC;AAED,qBAAa,+BAAgC,YAAW,wBAAwB;IAc1E,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM;IAd3B,SAAS,CAAC,QAAQ,CAAC,QAAQ,gCAAuC;IAClE;;;;;;;;OAQG;IACH,SAAS,CAAC,QAAQ,CAAC,WAAW,4CAAmD;IAEjF,YACsB,KAAK,EAAE,KAAK,EACtB,OAAO,EAAE,MAAM,EACvB;IAEJ,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAOpD;IAED,KAAK,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAalD;IAED,UAAU,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAErC;IAED;;;;;OAKG;IACH,WAAW,CAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,2BAA2B,CAgB5E;IAED,MAAM,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAG9B;IAED,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAEnC;CACH"}