@hydranium/core 1.0.0-next.22 → 1.0.0-next.220

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 (652) hide show
  1. package/README.md +14 -8
  2. package/lib/documents/ast-document-manager.d.ts +219 -122
  3. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  4. package/lib/documents/ast-document-manager.js +241 -130
  5. package/lib/documents/ast-document-manager.js.map +1 -1
  6. package/lib/documents/client-ids.d.ts +5 -19
  7. package/lib/documents/client-ids.d.ts.map +1 -1
  8. package/lib/documents/client-ids.js +5 -19
  9. package/lib/documents/client-ids.js.map +1 -1
  10. package/lib/documents/client-session-errors.d.ts +15 -0
  11. package/lib/documents/client-session-errors.d.ts.map +1 -0
  12. package/lib/documents/client-session-errors.js +15 -0
  13. package/lib/documents/client-session-errors.js.map +1 -0
  14. package/lib/documents/client-session-registry.d.ts +146 -0
  15. package/lib/documents/client-session-registry.d.ts.map +1 -0
  16. package/lib/documents/client-session-registry.js +207 -0
  17. package/lib/documents/client-session-registry.js.map +1 -0
  18. package/lib/documents/dirty-state-tracker.d.ts +79 -0
  19. package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
  20. package/lib/documents/dirty-state-tracker.js +69 -0
  21. package/lib/documents/dirty-state-tracker.js.map +1 -0
  22. package/lib/documents/document-release-handler.d.ts +179 -0
  23. package/lib/documents/document-release-handler.d.ts.map +1 -0
  24. package/lib/documents/document-release-handler.js +283 -0
  25. package/lib/documents/document-release-handler.js.map +1 -0
  26. package/lib/documents/document-release-scheduler.d.ts +67 -0
  27. package/lib/documents/document-release-scheduler.d.ts.map +1 -0
  28. package/lib/documents/document-release-scheduler.js +80 -0
  29. package/lib/documents/document-release-scheduler.js.map +1 -0
  30. package/lib/documents/file-system-task-queue.d.ts +49 -0
  31. package/lib/documents/file-system-task-queue.d.ts.map +1 -0
  32. package/lib/documents/file-system-task-queue.js +34 -0
  33. package/lib/documents/file-system-task-queue.js.map +1 -0
  34. package/lib/documents/hydranium-text-documents.d.ts +399 -282
  35. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  36. package/lib/documents/hydranium-text-documents.js +816 -483
  37. package/lib/documents/hydranium-text-documents.js.map +1 -1
  38. package/lib/documents/index.d.ts +10 -2
  39. package/lib/documents/index.d.ts.map +1 -1
  40. package/lib/documents/index.js +10 -2
  41. package/lib/documents/index.js.map +1 -1
  42. package/lib/documents/language-client-shadow.d.ts +218 -0
  43. package/lib/documents/language-client-shadow.d.ts.map +1 -0
  44. package/lib/documents/language-client-shadow.js +283 -0
  45. package/lib/documents/language-client-shadow.js.map +1 -0
  46. package/lib/documents/model-ledger.d.ts +47 -0
  47. package/lib/documents/model-ledger.d.ts.map +1 -0
  48. package/lib/documents/model-ledger.js +30 -0
  49. package/lib/documents/model-ledger.js.map +1 -0
  50. package/lib/documents/text-ledger.d.ts +64 -0
  51. package/lib/documents/text-ledger.d.ts.map +1 -0
  52. package/lib/documents/text-ledger.js +63 -0
  53. package/lib/documents/text-ledger.js.map +1 -0
  54. package/lib/documents/version-sync-service.d.ts +134 -0
  55. package/lib/documents/version-sync-service.d.ts.map +1 -0
  56. package/lib/documents/version-sync-service.js +171 -0
  57. package/lib/documents/version-sync-service.js.map +1 -0
  58. package/lib/index.d.ts +4 -0
  59. package/lib/index.d.ts.map +1 -1
  60. package/lib/index.js +7 -0
  61. package/lib/index.js.map +1 -1
  62. package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
  63. package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
  64. package/lib/langium/ast-extension/ast-node-builder.d.ts +32 -9
  65. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  66. package/lib/langium/ast-extension/ast-node-builder.js +60 -22
  67. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  68. package/lib/langium/bootstrap.d.ts +5 -5
  69. package/lib/langium/bootstrap.d.ts.map +1 -1
  70. package/lib/langium/bootstrap.js +42 -17
  71. package/lib/langium/bootstrap.js.map +1 -1
  72. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
  73. package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
  74. package/lib/langium/composite-ast-reflection.d.ts +43 -0
  75. package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
  76. package/lib/langium/composite-ast-reflection.js +92 -0
  77. package/lib/langium/composite-ast-reflection.js.map +1 -0
  78. package/lib/langium/config/configuration-provider.d.ts +81 -0
  79. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  80. package/lib/langium/config/configuration-provider.js +112 -0
  81. package/lib/langium/config/configuration-provider.js.map +1 -0
  82. package/lib/langium/config/index.d.ts +1 -0
  83. package/lib/langium/config/index.d.ts.map +1 -1
  84. package/lib/langium/config/index.js +1 -0
  85. package/lib/langium/config/index.js.map +1 -1
  86. package/lib/langium/config/settings.js.map +1 -1
  87. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
  88. package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
  89. package/lib/langium/diagnostics/logger.d.ts +10 -3
  90. package/lib/langium/diagnostics/logger.d.ts.map +1 -1
  91. package/lib/langium/diagnostics/logger.js +12 -5
  92. package/lib/langium/diagnostics/logger.js.map +1 -1
  93. package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
  94. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  95. package/lib/langium/diagnostics/lsp-logger.js +57 -16
  96. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  97. package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
  98. package/lib/langium/diagnostics/server-tracer.js.map +1 -1
  99. package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
  100. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  101. package/lib/langium/document-builder/build-pipeline-integration.js +32 -5
  102. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  103. package/lib/langium/document-builder/build-session.d.ts +93 -0
  104. package/lib/langium/document-builder/build-session.d.ts.map +1 -0
  105. package/lib/langium/document-builder/build-session.js +72 -0
  106. package/lib/langium/document-builder/build-session.js.map +1 -0
  107. package/lib/langium/document-builder/document-builder.d.ts +401 -29
  108. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  109. package/lib/langium/document-builder/document-builder.js +698 -61
  110. package/lib/langium/document-builder/document-builder.js.map +1 -1
  111. package/lib/langium/document-builder/index.d.ts +1 -0
  112. package/lib/langium/document-builder/index.d.ts.map +1 -1
  113. package/lib/langium/document-builder/index.js +1 -0
  114. package/lib/langium/document-builder/index.js.map +1 -1
  115. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  116. package/lib/langium/documentation/comment-provider.js.map +1 -1
  117. package/lib/langium/integration-services.d.ts +61 -19
  118. package/lib/langium/integration-services.d.ts.map +1 -1
  119. package/lib/langium/integration-services.js +10 -5
  120. package/lib/langium/integration-services.js.map +1 -1
  121. package/lib/langium/integrity/integrity-rule.d.ts +16 -8
  122. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  123. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  124. package/lib/langium/integrity/integrity-service.d.ts +81 -24
  125. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  126. package/lib/langium/integrity/integrity-service.js +264 -57
  127. package/lib/langium/integrity/integrity-service.js.map +1 -1
  128. package/lib/langium/keys/containment.d.ts +64 -0
  129. package/lib/langium/keys/containment.d.ts.map +1 -0
  130. package/lib/langium/keys/containment.js +53 -0
  131. package/lib/langium/keys/containment.js.map +1 -0
  132. package/lib/langium/keys/index.d.ts +1 -0
  133. package/lib/langium/keys/index.d.ts.map +1 -1
  134. package/lib/langium/keys/index.js +1 -0
  135. package/lib/langium/keys/index.js.map +1 -1
  136. package/lib/langium/keys/name-based-key-provider.d.ts +4 -0
  137. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  138. package/lib/langium/keys/name-based-key-provider.js +4 -0
  139. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  140. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  141. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  142. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  143. package/lib/langium/labeling/label-provider.js.map +1 -1
  144. package/lib/langium/language-module.d.ts +29 -4
  145. package/lib/langium/language-module.d.ts.map +1 -1
  146. package/lib/langium/language-module.js +18 -4
  147. package/lib/langium/language-module.js.map +1 -1
  148. package/lib/langium/model-service/client-session.d.ts +343 -0
  149. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  150. package/lib/langium/model-service/client-session.js +411 -0
  151. package/lib/langium/model-service/client-session.js.map +1 -0
  152. package/lib/langium/model-service/index.d.ts +2 -0
  153. package/lib/langium/model-service/index.d.ts.map +1 -1
  154. package/lib/langium/model-service/index.js +2 -0
  155. package/lib/langium/model-service/index.js.map +1 -1
  156. package/lib/langium/model-service/model-events.d.ts +61 -0
  157. package/lib/langium/model-service/model-events.d.ts.map +1 -0
  158. package/lib/langium/model-service/model-events.js +10 -0
  159. package/lib/langium/model-service/model-events.js.map +1 -0
  160. package/lib/langium/model-service/model-service.d.ts +432 -282
  161. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  162. package/lib/langium/model-service/model-service.js +504 -438
  163. package/lib/langium/model-service/model-service.js.map +1 -1
  164. package/lib/langium/module.d.ts +157 -35
  165. package/lib/langium/module.d.ts.map +1 -1
  166. package/lib/langium/module.js +52 -35
  167. package/lib/langium/module.js.map +1 -1
  168. package/lib/langium/naming/name-provider.d.ts +25 -4
  169. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  170. package/lib/langium/naming/name-provider.js +2 -1
  171. package/lib/langium/naming/name-provider.js.map +1 -1
  172. package/lib/langium/naming/name-separator-validation.d.ts +23 -0
  173. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  174. package/lib/langium/naming/name-separator-validation.js +30 -1
  175. package/lib/langium/naming/name-separator-validation.js.map +1 -1
  176. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  177. package/lib/langium/project/abstract-project-manager.js +9 -2
  178. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  179. package/lib/langium/project/project-change-event.d.ts +2 -2
  180. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  181. package/lib/langium/project/single-project-manager.js.map +1 -1
  182. package/lib/langium/residency/cst-residency-service.d.ts +31 -11
  183. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  184. package/lib/langium/residency/cst-residency-service.js +23 -57
  185. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  186. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  187. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  188. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  189. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  190. package/lib/langium/scope/hydranium-scope-provider.d.ts +48 -13
  191. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  192. package/lib/langium/scope/hydranium-scope-provider.js +56 -20
  193. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  194. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  195. package/lib/langium/scope/reference-builder.js.map +1 -1
  196. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  197. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  198. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  199. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  200. package/lib/langium/serialization/abstract-serializer.d.ts +11 -20
  201. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  202. package/lib/langium/serialization/abstract-serializer.js +12 -21
  203. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  204. package/lib/langium/serialization/json-serializer.d.ts +1 -1
  205. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  206. package/lib/langium/serialization/json-serializer.js.map +1 -1
  207. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  208. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  209. package/lib/langium/service-registry.d.ts +29 -1
  210. package/lib/langium/service-registry.d.ts.map +1 -1
  211. package/lib/langium/service-registry.js +37 -0
  212. package/lib/langium/service-registry.js.map +1 -1
  213. package/lib/langium/shared-services.d.ts +23 -6
  214. package/lib/langium/shared-services.d.ts.map +1 -1
  215. package/lib/langium/shared-services.js.map +1 -1
  216. package/lib/langium/transfer/transfer-encoder.d.ts +77 -26
  217. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  218. package/lib/langium/transfer/transfer-encoder.js +46 -24
  219. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  220. package/lib/langium/trivia/comment-preserver.d.ts +423 -0
  221. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  222. package/lib/langium/trivia/comment-preserver.js +906 -0
  223. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  224. package/lib/langium/trivia/document-ending-preserver.d.ts +43 -0
  225. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  226. package/lib/langium/trivia/document-ending-preserver.js +48 -0
  227. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  228. package/lib/langium/trivia/index.d.ts +14 -0
  229. package/lib/langium/trivia/index.d.ts.map +1 -0
  230. package/lib/langium/trivia/index.js +14 -0
  231. package/lib/langium/trivia/index.js.map +1 -0
  232. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  233. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  234. package/lib/langium/trivia/trivia-contribution.js +10 -0
  235. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  236. package/lib/langium/trivia/trivia-preserver.d.ts +50 -0
  237. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  238. package/lib/langium/trivia/trivia-preserver.js +10 -0
  239. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  240. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  241. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  242. package/lib/langium/trivia/trivia-service.js +56 -0
  243. package/lib/langium/trivia/trivia-service.js.map +1 -0
  244. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  245. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  246. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  247. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  248. package/lib/langium/validation/document-validator.d.ts +294 -10
  249. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  250. package/lib/langium/validation/document-validator.js +448 -5
  251. package/lib/langium/validation/document-validator.js.map +1 -1
  252. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  253. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  254. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  255. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  256. package/lib/langium/workspace/document-uri-policy.d.ts +18 -14
  257. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  258. package/lib/langium/workspace/document-uri-policy.js +10 -9
  259. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  260. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  261. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  262. package/lib/langium/workspace/file-not-found.js +31 -0
  263. package/lib/langium/workspace/file-not-found.js.map +1 -0
  264. package/lib/langium/workspace/file-system-provider.d.ts +135 -9
  265. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  266. package/lib/langium/workspace/file-system-provider.js +93 -14
  267. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  268. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +56 -1
  269. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  270. package/lib/langium/workspace/hydranium-langium-document-factory.js +79 -0
  271. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  272. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
  273. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  274. package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
  275. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  276. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +82 -9
  277. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  278. package/lib/langium/workspace/hydranium-workspace-manager.js +128 -10
  279. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  280. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -3
  281. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  282. package/lib/langium/workspace/in-memory-file-system-provider.js +41 -15
  283. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  284. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  285. package/lib/langium/workspace/index-manager.js.map +1 -1
  286. package/lib/langium/workspace/index.d.ts +1 -0
  287. package/lib/langium/workspace/index.d.ts.map +1 -1
  288. package/lib/langium/workspace/index.js +1 -0
  289. package/lib/langium/workspace/index.js.map +1 -1
  290. package/lib/langium/workspace/initialize-workspace.d.ts +31 -2
  291. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  292. package/lib/langium/workspace/initialize-workspace.js +13 -5
  293. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  294. package/lib/langium/workspace/langium-documents.d.ts +86 -17
  295. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  296. package/lib/langium/workspace/langium-documents.js +101 -29
  297. package/lib/langium/workspace/langium-documents.js.map +1 -1
  298. package/lib/langium/workspace/persistent-file-system-provider.d.ts +1 -8
  299. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  300. package/lib/langium/workspace/persistent-file-system-provider.js +0 -7
  301. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  302. package/lib/{documents → langium/workspace}/self-save-registry.d.ts +38 -7
  303. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  304. package/lib/{documents → langium/workspace}/self-save-registry.js +29 -16
  305. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  306. package/lib/langium/workspace/virtual-document.d.ts +48 -15
  307. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  308. package/lib/langium/workspace/virtual-document.js +78 -18
  309. package/lib/langium/workspace/virtual-document.js.map +1 -1
  310. package/lib/langium/workspace/write-lock-scope.d.ts +20 -10
  311. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  312. package/lib/langium/workspace/write-lock-scope.js +12 -4
  313. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  314. package/lib/locale/index.d.ts +10 -0
  315. package/lib/locale/index.d.ts.map +1 -0
  316. package/lib/locale/index.js +10 -0
  317. package/lib/locale/index.js.map +1 -0
  318. package/lib/locale/server-locale.d.ts +73 -0
  319. package/lib/locale/server-locale.d.ts.map +1 -0
  320. package/lib/locale/server-locale.js +61 -0
  321. package/lib/locale/server-locale.js.map +1 -0
  322. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  323. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  324. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  325. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  326. package/lib/lsp/connection-features.d.ts +23 -0
  327. package/lib/lsp/connection-features.d.ts.map +1 -0
  328. package/lib/lsp/connection-features.js +60 -0
  329. package/lib/lsp/connection-features.js.map +1 -0
  330. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  331. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  332. package/lib/lsp/diagnostics-connection.js +53 -0
  333. package/lib/lsp/diagnostics-connection.js.map +1 -0
  334. package/lib/lsp/hydranium-document-update-handler.d.ts +92 -81
  335. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  336. package/lib/lsp/hydranium-document-update-handler.js +153 -99
  337. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  338. package/lib/lsp/index.d.ts +3 -1
  339. package/lib/lsp/index.d.ts.map +1 -1
  340. package/lib/lsp/index.js +3 -1
  341. package/lib/lsp/index.js.map +1 -1
  342. package/lib/lsp/lsp-latency.d.ts +39 -0
  343. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  344. package/lib/lsp/lsp-latency.js +58 -0
  345. package/lib/lsp/lsp-latency.js.map +1 -0
  346. package/lib/lsp/semantic-token-provider.d.ts +34 -1
  347. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  348. package/lib/lsp/semantic-token-provider.js +55 -8
  349. package/lib/lsp/semantic-token-provider.js.map +1 -1
  350. package/lib/lsp/shared-module.d.ts +4 -8
  351. package/lib/lsp/shared-module.d.ts.map +1 -1
  352. package/lib/lsp/shared-module.js.map +1 -1
  353. package/lib/lsp/start-language-server.d.ts +8 -7
  354. package/lib/lsp/start-language-server.d.ts.map +1 -1
  355. package/lib/lsp/start-language-server.js +13 -7
  356. package/lib/lsp/start-language-server.js.map +1 -1
  357. package/lib/messages/carriers.d.ts +54 -0
  358. package/lib/messages/carriers.d.ts.map +1 -0
  359. package/lib/messages/carriers.js +62 -0
  360. package/lib/messages/carriers.js.map +1 -0
  361. package/lib/messages/index.d.ts +25 -0
  362. package/lib/messages/index.d.ts.map +1 -0
  363. package/lib/messages/index.js +25 -0
  364. package/lib/messages/index.js.map +1 -0
  365. package/lib/messages/renderer.d.ts +142 -0
  366. package/lib/messages/renderer.d.ts.map +1 -0
  367. package/lib/messages/renderer.js +165 -0
  368. package/lib/messages/renderer.js.map +1 -0
  369. package/lib/node/event-loop-monitor.js.map +1 -1
  370. package/lib/node/heap-ceiling.d.ts +61 -0
  371. package/lib/node/heap-ceiling.d.ts.map +1 -0
  372. package/lib/node/heap-ceiling.js +72 -0
  373. package/lib/node/heap-ceiling.js.map +1 -0
  374. package/lib/node/index.d.ts +1 -1
  375. package/lib/node/index.d.ts.map +1 -1
  376. package/lib/node/index.js +1 -1
  377. package/lib/node/index.js.map +1 -1
  378. package/lib/node/latency-from-env.d.ts +1 -1
  379. package/lib/node/latency-from-env.js +1 -1
  380. package/lib/node/lint-grammar.js.map +1 -1
  381. package/lib/node/measure-memory.d.ts.map +1 -1
  382. package/lib/node/measure-memory.js +1 -0
  383. package/lib/node/measure-memory.js.map +1 -1
  384. package/lib/node/memory-monitor.js.map +1 -1
  385. package/lib/node/node-file-system-provider.d.ts +41 -6
  386. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  387. package/lib/node/node-file-system-provider.js +109 -49
  388. package/lib/node/node-file-system-provider.js.map +1 -1
  389. package/lib/node/profile-capture.d.ts +8 -2
  390. package/lib/node/profile-capture.d.ts.map +1 -1
  391. package/lib/node/profile-capture.js +1 -1
  392. package/lib/node/profile-capture.js.map +1 -1
  393. package/lib/node/profile-digest.js.map +1 -1
  394. package/lib/node/profiling-run.d.ts +13 -3
  395. package/lib/node/profiling-run.d.ts.map +1 -1
  396. package/lib/node/profiling-run.js +17 -8
  397. package/lib/node/profiling-run.js.map +1 -1
  398. package/lib/node/rename-over-open-readers.d.ts +52 -0
  399. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  400. package/lib/node/rename-over-open-readers.js +66 -0
  401. package/lib/node/rename-over-open-readers.js.map +1 -0
  402. package/lib/node/socket-launcher.d.ts +20 -4
  403. package/lib/node/socket-launcher.d.ts.map +1 -1
  404. package/lib/node/socket-launcher.js +5 -4
  405. package/lib/node/socket-launcher.js.map +1 -1
  406. package/lib/node/stdio-launcher.d.ts +6 -5
  407. package/lib/node/stdio-launcher.d.ts.map +1 -1
  408. package/lib/node/stdio-launcher.js +2 -2
  409. package/lib/node/stdio-launcher.js.map +1 -1
  410. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  411. package/lib/testing/fake-description.js.map +1 -1
  412. package/lib/testing/fake-document.d.ts +16 -4
  413. package/lib/testing/fake-document.d.ts.map +1 -1
  414. package/lib/testing/fake-document.js +18 -3
  415. package/lib/testing/fake-document.js.map +1 -1
  416. package/lib/testing/index.d.ts +1 -1
  417. package/lib/testing/index.d.ts.map +1 -1
  418. package/lib/testing/index.js +2 -1
  419. package/lib/testing/index.js.map +1 -1
  420. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  421. package/lib/testing/langium-test-helpers.js +1 -0
  422. package/lib/testing/langium-test-helpers.js.map +1 -1
  423. package/lib/testing/make-noop-language-services.js.map +1 -1
  424. package/lib/testing/make-noop-shared-services.d.ts +14 -0
  425. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  426. package/lib/testing/make-noop-shared-services.js +28 -2
  427. package/lib/testing/make-noop-shared-services.js.map +1 -1
  428. package/lib/testing/make-test-services.d.ts +72 -14
  429. package/lib/testing/make-test-services.d.ts.map +1 -1
  430. package/lib/testing/make-test-services.js +42 -10
  431. package/lib/testing/make-test-services.js.map +1 -1
  432. package/lib/testing/make-test-tracer.d.ts +12 -0
  433. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  434. package/lib/testing/make-test-tracer.js +13 -0
  435. package/lib/testing/make-test-tracer.js.map +1 -1
  436. package/lib/testing/node/golden-corpus.js.map +1 -1
  437. package/lib/testing/node/index.d.ts +1 -0
  438. package/lib/testing/node/index.d.ts.map +1 -1
  439. package/lib/testing/node/index.js +1 -0
  440. package/lib/testing/node/index.js.map +1 -1
  441. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  442. package/lib/testing/node/lsp-harness.js +2 -0
  443. package/lib/testing/node/lsp-harness.js.map +1 -1
  444. package/lib/testing/node/lsp-server-connection.d.ts +11 -3
  445. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  446. package/lib/testing/node/lsp-server-connection.js +43 -10
  447. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  448. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  449. package/lib/testing/node/scratch-workspace.js +10 -5
  450. package/lib/testing/node/scratch-workspace.js.map +1 -1
  451. package/lib/testing/node/spawned-server.d.ts +14 -0
  452. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  453. package/lib/testing/node/spawned-server.js +34 -2
  454. package/lib/testing/node/spawned-server.js.map +1 -1
  455. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  456. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  457. package/lib/testing/node/unhandled-rejections.js +32 -0
  458. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  459. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  460. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  461. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  462. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  463. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  464. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  465. package/lib/testing/playwright/index.d.ts +1 -0
  466. package/lib/testing/playwright/index.d.ts.map +1 -1
  467. package/lib/testing/playwright/index.js +1 -0
  468. package/lib/testing/playwright/index.js.map +1 -1
  469. package/lib/testing/playwright/server-log-capture.d.ts +24 -8
  470. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  471. package/lib/testing/playwright/server-log-capture.js +27 -6
  472. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  473. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  474. package/lib/testing/playwright/server-log-rename-reporter.js +10 -1
  475. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  476. package/lib/testing/run-update-pipeline.d.ts +4 -4
  477. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  478. package/lib/testing/stub-ast-document-manager.d.ts +11 -52
  479. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  480. package/lib/testing/stub-ast-document-manager.js +24 -65
  481. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  482. package/lib/testing/stub-document-builder.d.ts +26 -11
  483. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  484. package/lib/testing/stub-document-builder.js +78 -5
  485. package/lib/testing/stub-document-builder.js.map +1 -1
  486. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  487. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  488. package/lib/testing/stub-hydranium-text-documents.js +115 -16
  489. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  490. package/lib/testing/stub-index-manager.js.map +1 -1
  491. package/lib/testing/stub-langium-documents.d.ts +3 -2
  492. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  493. package/lib/testing/stub-langium-documents.js.map +1 -1
  494. package/lib/testing/stub-model-service.d.ts +7 -6
  495. package/lib/testing/stub-model-service.d.ts.map +1 -1
  496. package/lib/testing/stub-model-service.js +4 -4
  497. package/lib/testing/stub-model-service.js.map +1 -1
  498. package/lib/testing/stub-project-manager.js.map +1 -1
  499. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  500. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  501. package/lib/testing/stub-service-registry.d.ts +1 -1
  502. package/lib/testing/stub-service-registry.js.map +1 -1
  503. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  504. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  505. package/lib/util/connection-liveness.d.ts +7 -6
  506. package/lib/util/connection-liveness.d.ts.map +1 -1
  507. package/lib/util/connection-liveness.js +35 -14
  508. package/lib/util/connection-liveness.js.map +1 -1
  509. package/lib/util/environment.d.ts.map +1 -1
  510. package/lib/util/environment.js.map +1 -1
  511. package/lib/util/registry.d.ts.map +1 -1
  512. package/package.json +32 -48
  513. package/src/documents/ast-document-manager.ts +379 -231
  514. package/src/documents/client-ids.ts +5 -22
  515. package/src/documents/client-session-errors.ts +24 -0
  516. package/src/documents/client-session-registry.ts +262 -0
  517. package/src/documents/dirty-state-tracker.ts +130 -0
  518. package/src/documents/document-release-handler.ts +365 -0
  519. package/src/documents/document-release-scheduler.ts +121 -0
  520. package/src/documents/file-system-task-queue.ts +68 -0
  521. package/src/documents/hydranium-text-documents.ts +931 -595
  522. package/src/documents/index.ts +10 -2
  523. package/src/documents/language-client-shadow.ts +451 -0
  524. package/src/documents/model-ledger.ts +66 -0
  525. package/src/documents/text-ledger.ts +112 -0
  526. package/src/documents/version-sync-service.ts +267 -0
  527. package/src/index.ts +7 -0
  528. package/src/langium/ast-extension/ast-node-builder.ts +66 -22
  529. package/src/langium/bootstrap.ts +42 -17
  530. package/src/langium/composite-ast-reflection.ts +107 -0
  531. package/src/langium/config/configuration-provider.ts +119 -0
  532. package/src/langium/config/index.ts +1 -0
  533. package/src/langium/diagnostics/logger.ts +12 -5
  534. package/src/langium/diagnostics/lsp-logger.ts +59 -15
  535. package/src/langium/document-builder/build-pipeline-integration.ts +50 -5
  536. package/src/langium/document-builder/build-session.ts +87 -0
  537. package/src/langium/document-builder/document-builder.ts +825 -59
  538. package/src/langium/document-builder/index.ts +1 -0
  539. package/src/langium/integration-services.ts +83 -24
  540. package/src/langium/integrity/integrity-rule.ts +16 -8
  541. package/src/langium/integrity/integrity-service.ts +287 -62
  542. package/src/langium/keys/containment.ts +87 -0
  543. package/src/langium/keys/index.ts +1 -0
  544. package/src/langium/keys/name-based-key-provider.ts +4 -0
  545. package/src/langium/language-module.ts +48 -7
  546. package/src/langium/model-service/client-session.ts +644 -0
  547. package/src/langium/model-service/index.ts +2 -0
  548. package/src/langium/model-service/model-events.ts +75 -0
  549. package/src/langium/model-service/model-service.ts +790 -468
  550. package/src/langium/module.ts +210 -64
  551. package/src/langium/naming/name-provider.ts +27 -5
  552. package/src/langium/naming/name-separator-validation.ts +34 -5
  553. package/src/langium/project/abstract-project-manager.ts +9 -1
  554. package/src/langium/project/project-change-event.ts +2 -2
  555. package/src/langium/residency/cst-residency-service.ts +46 -15
  556. package/src/langium/scope/hydranium-scope-provider.ts +60 -22
  557. package/src/langium/serialization/abstract-serializer.ts +13 -32
  558. package/src/langium/service-registry.ts +41 -2
  559. package/src/langium/shared-services.ts +27 -6
  560. package/src/langium/transfer/transfer-encoder.ts +104 -37
  561. package/src/langium/trivia/comment-preserver.ts +1100 -0
  562. package/src/langium/trivia/document-ending-preserver.ts +55 -0
  563. package/src/langium/trivia/index.ts +14 -0
  564. package/src/langium/trivia/trivia-contribution.ts +39 -0
  565. package/src/langium/trivia/trivia-preserver.ts +54 -0
  566. package/src/langium/trivia/trivia-service.ts +99 -0
  567. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  568. package/src/langium/validation/document-validator.ts +537 -11
  569. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  570. package/src/langium/workspace/document-uri-policy.ts +18 -14
  571. package/src/langium/workspace/file-not-found.ts +35 -0
  572. package/src/langium/workspace/file-system-provider.ts +205 -17
  573. package/src/langium/workspace/hydranium-langium-document-factory.ts +117 -0
  574. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
  575. package/src/langium/workspace/hydranium-workspace-manager.ts +154 -14
  576. package/src/langium/workspace/in-memory-file-system-provider.ts +48 -17
  577. package/src/langium/workspace/index.ts +1 -0
  578. package/src/langium/workspace/initialize-workspace.ts +43 -5
  579. package/src/langium/workspace/langium-documents.ts +124 -33
  580. package/src/langium/workspace/persistent-file-system-provider.ts +1 -8
  581. package/src/{documents → langium/workspace}/self-save-registry.ts +54 -15
  582. package/src/langium/workspace/virtual-document.ts +96 -19
  583. package/src/langium/workspace/write-lock-scope.ts +24 -11
  584. package/src/locale/index.ts +10 -0
  585. package/src/locale/server-locale.ts +86 -0
  586. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  587. package/src/lsp/connection-features.ts +67 -0
  588. package/src/lsp/diagnostics-connection.ts +56 -0
  589. package/src/lsp/hydranium-document-update-handler.ts +187 -108
  590. package/src/lsp/index.ts +3 -1
  591. package/src/lsp/lsp-latency.ts +62 -0
  592. package/src/lsp/semantic-token-provider.ts +74 -7
  593. package/src/lsp/shared-module.ts +4 -8
  594. package/src/lsp/start-language-server.ts +13 -7
  595. package/src/messages/carriers.ts +78 -0
  596. package/src/messages/index.ts +36 -0
  597. package/src/messages/renderer.ts +212 -0
  598. package/src/node/heap-ceiling.ts +108 -0
  599. package/src/node/index.ts +1 -1
  600. package/src/node/latency-from-env.ts +1 -1
  601. package/src/node/measure-memory.ts +1 -0
  602. package/src/node/node-file-system-provider.ts +124 -53
  603. package/src/node/profile-capture.ts +9 -3
  604. package/src/node/profiling-run.ts +30 -8
  605. package/src/node/rename-over-open-readers.ts +78 -0
  606. package/src/node/socket-launcher.ts +24 -8
  607. package/src/node/stdio-launcher.ts +8 -7
  608. package/src/testing/fake-document.ts +24 -5
  609. package/src/testing/index.ts +2 -1
  610. package/src/testing/langium-test-helpers.ts +1 -0
  611. package/src/testing/make-noop-shared-services.ts +50 -2
  612. package/src/testing/make-test-services.ts +125 -31
  613. package/src/testing/make-test-tracer.ts +26 -0
  614. package/src/testing/node/index.ts +1 -0
  615. package/src/testing/node/lsp-harness.ts +2 -0
  616. package/src/testing/node/lsp-server-connection.ts +66 -12
  617. package/src/testing/node/scratch-workspace.ts +10 -5
  618. package/src/testing/node/spawned-server.ts +36 -2
  619. package/src/testing/node/unhandled-rejections.ts +31 -0
  620. package/src/testing/parse-semantic-root.ts +1 -1
  621. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  622. package/src/testing/playwright/index.ts +1 -0
  623. package/src/testing/playwright/server-log-capture.ts +45 -11
  624. package/src/testing/playwright/server-log-rename-reporter.ts +12 -1
  625. package/src/testing/run-update-pipeline.ts +4 -4
  626. package/src/testing/stub-ast-document-manager.ts +36 -138
  627. package/src/testing/stub-document-builder.ts +102 -18
  628. package/src/testing/stub-hydranium-text-documents.ts +165 -27
  629. package/src/testing/stub-langium-documents.ts +3 -2
  630. package/src/testing/stub-model-service.ts +9 -8
  631. package/src/testing/stub-self-save-registry.ts +1 -1
  632. package/src/testing/stub-service-registry.ts +1 -1
  633. package/src/testing/stub-writable-file-system.ts +1 -1
  634. package/src/util/connection-liveness.ts +37 -14
  635. package/src/util/environment.ts +9 -1
  636. package/lib/documents/language-client-text-shadow.d.ts +0 -101
  637. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  638. package/lib/documents/language-client-text-shadow.js +0 -156
  639. package/lib/documents/language-client-text-shadow.js.map +0 -1
  640. package/lib/documents/self-save-registry.d.ts.map +0 -1
  641. package/lib/documents/self-save-registry.js.map +0 -1
  642. package/lib/lsp/instrument-connection.d.ts +0 -36
  643. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  644. package/lib/lsp/instrument-connection.js +0 -62
  645. package/lib/lsp/instrument-connection.js.map +0 -1
  646. package/lib/node/process-memory.d.ts +0 -66
  647. package/lib/node/process-memory.d.ts.map +0 -1
  648. package/lib/node/process-memory.js +0 -252
  649. package/lib/node/process-memory.js.map +0 -1
  650. package/src/documents/language-client-text-shadow.ts +0 -175
  651. package/src/lsp/instrument-connection.ts +0 -66
  652. package/src/node/process-memory.ts +0 -299
@@ -0,0 +1,365 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+
10
+ import { type URI, UriUtils } from '@hydranium/langium';
11
+ import { type CanonicalUri, type Tracer } from '@hydranium/protocol';
12
+ import { type CancellationToken, type Disposable } from 'vscode-languageserver';
13
+ import { type LogNameOptions } from '../langium/diagnostics/logger.js';
14
+ import { HYDRANIUM_BUILD_REASONS } from '../langium/document-builder/document-builder.js';
15
+ import { type ServerSharedServices } from '../langium/module.js';
16
+ import { isFileNotFound } from '../langium/workspace/file-not-found.js';
17
+ import { isConnectionGoneError } from '../util/connection-liveness.js';
18
+
19
+ /**
20
+ * A document the store has released: no client holds its text any more. Its
21
+ * queries read the store live, not a snapshot taken at the release.
22
+ */
23
+ export interface ReleasedDocument {
24
+ readonly uri: CanonicalUri;
25
+ /** Whether `uri` names this document, under the store's own keying. */
26
+ isFor(uri: string): boolean;
27
+ /**
28
+ * Whether a client took the document back: it holds it again, or it waits
29
+ * out a new grace. Either way it is that client's, and the build keeps its text.
30
+ */
31
+ isReclaimed(): boolean;
32
+ }
33
+
34
+ /**
35
+ * The rejection of a release skipped because the connection or the workspace
36
+ * went away, with the error that showed it as `cause`. The store logs it at
37
+ * debug, as routine at teardown, and any other rejection as an error.
38
+ */
39
+ export class DocumentReleaseSkippedError extends Error {
40
+ constructor(cause: unknown) {
41
+ super(`Release skipped: the connection or the workspace went away. ${cause instanceof Error ? cause.message : String(cause)}`, {
42
+ cause
43
+ });
44
+ this.name = 'DocumentReleaseSkippedError';
45
+ }
46
+ }
47
+
48
+ /**
49
+ * Whether `error` is a {@link DocumentReleaseSkippedError}, by name, so one
50
+ * thrown by another installed copy of this package counts too.
51
+ */
52
+ export function isDocumentReleaseSkippedError(error: unknown): error is DocumentReleaseSkippedError {
53
+ return error instanceof Error && error.name === 'DocumentReleaseSkippedError';
54
+ }
55
+
56
+ /**
57
+ * Decides what the build keeps for a document the store has released. Called
58
+ * by the store at each release, for every head, after its release event.
59
+ *
60
+ * The returned promise settles the release: it resolves once the build holds
61
+ * what it keeps for the document, and rejects when that build failed and may
62
+ * still hold the released text. Until then, watchers keep a document released
63
+ * dirty marked dirty. On a resolve the store announces it clean, naming the
64
+ * store's last text while the build still has the document, and no text once
65
+ * it has none; on a rejection, no text. The store logs a throw or rejection; reject with a
66
+ * {@link DocumentReleaseSkippedError} for a release skipped at teardown.
67
+ *
68
+ * The data server announces the first build of a released document as the
69
+ * release, so a handler that builds nothing leaves that to whichever build
70
+ * comes next; one that carries a client's write keeps that client's name.
71
+ *
72
+ * Extend {@link DefaultDocumentReleaseHandler} to change only the policy: it
73
+ * keeps the locking and the wait for the build. An implementation written
74
+ * from scratch has to wait for that build itself before it resolves.
75
+ */
76
+ export interface DocumentReleaseHandler {
77
+ didReleaseDocument(released: ReleasedDocument): Promise<void>;
78
+ }
79
+
80
+ /** What the build does with a released document: rebuild it from its file, or remove it. */
81
+ export type DocumentReleaseDecision = 'rebuild' | 'remove';
82
+
83
+ /** How {@link DefaultDocumentReleaseHandler.runRelease} went. */
84
+ export type DocumentReleaseOutcome =
85
+ /** A client took the document back: what the build keeps is that client's. */
86
+ | { readonly kind: 'reclaimed' }
87
+ /**
88
+ * The lock resolved the write without running it, and the write that
89
+ * cancelled it does not build this document. The framework's lock always
90
+ * runs a cancelled write; a rebound `WorkspaceLock` may not.
91
+ */
92
+ | { readonly kind: 'discarded'; readonly decision: DocumentReleaseDecision }
93
+ /** The build started and was cancelled; `parsed` when it parsed the document first. */
94
+ | { readonly kind: 'cancelled'; readonly decision: DocumentReleaseDecision; readonly parsed: boolean }
95
+ /** The decision was carried out. */
96
+ | { readonly kind: 'completed'; readonly decision: DocumentReleaseDecision; readonly parsed: boolean }
97
+ /** The decision or the build threw; `decision` is unset when deciding did. */
98
+ | { readonly kind: 'failed'; readonly decision: DocumentReleaseDecision | undefined; readonly parsed: boolean; readonly error: unknown }
99
+ /** The connection or the workspace went away: nothing more is built. `parsed` when the build parsed the document first. */
100
+ | { readonly kind: 'skipped'; readonly parsed: boolean; readonly error: unknown };
101
+
102
+ /**
103
+ * Rebuilds a released document from the file system provider, so the build
104
+ * stops carrying the unsaved text of its last client. Override
105
+ * `decideRelease` or `applyReleaseDecision` to change the policy and keep the
106
+ * locking and the wait for the build.
107
+ *
108
+ * The provider decides, for every scheme, by `exists`: a document it can
109
+ * serve is rebuilt from its text, and any other — an editor's `untitled:`
110
+ * buffer, a file never saved, or one deleted meanwhile — is removed
111
+ * from the workspace. A `virtual:` document survives, since the framework's
112
+ * provider for that scheme serves it from the index, whatever provider the
113
+ * host passes as `context.fileSystemProvider`; an edited one therefore keeps
114
+ * its last client's text, and keeping it read-only is the client's job.
115
+ *
116
+ * The answer is read in the document's disk queue, so the rebuild follows
117
+ * any save still queued rather than reverting past it; a file that goes
118
+ * after that read is removed when its rebuild finds none.
119
+ *
120
+ * Whether the document is still released is checked again inside the write
121
+ * lock, as its holder: checked only before waiting for the lock, a client that
122
+ * opens or re-creates the document meanwhile would have its text rebuilt over,
123
+ * or the document removed. A document some client has open again, or that
124
+ * waits out a new grace, is left to that client.
125
+ *
126
+ * The promise resolves once the revert has parsed the file, even if it is
127
+ * then cancelled, or else once the build it requests in its place has parsed
128
+ * it or removed the document. It rejects when that build fails, and when the
129
+ * revert is skipped because the connection or the workspace went away before
130
+ * it parsed the file, with a {@link DocumentReleaseSkippedError}.
131
+ */
132
+ export class DefaultDocumentReleaseHandler implements DocumentReleaseHandler {
133
+ protected readonly tracer: Tracer;
134
+
135
+ constructor(
136
+ protected readonly services: ServerSharedServices,
137
+ options: LogNameOptions = {}
138
+ ) {
139
+ this.tracer = services.Tracer.for(options.logName ?? this.constructor.name).trace('instantiated');
140
+ }
141
+
142
+ async didReleaseDocument(released: ReleasedDocument): Promise<void> {
143
+ const target = UriUtils.toUri(released.uri);
144
+ const outcome = await this.runRelease(released, target);
145
+ this.tracer.with(released.uri).debug(`Release outcome: ${this.formatReleaseOutcome(outcome)}`);
146
+ if (outcome.kind === 'skipped') {
147
+ if (!outcome.parsed) {
148
+ throw new DocumentReleaseSkippedError(outcome.error);
149
+ }
150
+ // The build holds the file's text: only what followed its parse, such as the diagnostics publish, was lost.
151
+ const { error } = outcome;
152
+ this.tracer
153
+ .with(released.uri)
154
+ .debug(`Revert on release skipped after its parse: ${error instanceof Error ? error.message : String(error)}`);
155
+ return;
156
+ }
157
+ if (outcome.kind === 'failed') {
158
+ const { error } = outcome;
159
+ this.tracer
160
+ .with(released.uri)
161
+ .error(`Revert on release dropped. ${error instanceof Error ? (error.stack ?? error.message) : String(error)}`);
162
+ }
163
+ const parsed = 'parsed' in outcome && outcome.parsed;
164
+ // Without it, a revert stopped short, or an override that built nothing,
165
+ // leaves the root on the released text. A failed one also lost the change
166
+ // the update handler held back at the release; a document known to have
167
+ // no file is removed, as the revert would have.
168
+ const stoppedShort =
169
+ ((outcome.kind === 'discarded' || outcome.kind === 'cancelled' || outcome.kind === 'completed') &&
170
+ !parsed &&
171
+ this.services.workspace.LangiumDocuments.getDocument(target) !== undefined) ||
172
+ outcome.kind === 'failed';
173
+ const recover = async (): Promise<void> => {
174
+ const failure = 'Build after a revert that stopped short failed; the build keeps the released text';
175
+ let built: boolean;
176
+ try {
177
+ built = await this.requestRecoveryBuild(released, target, 'decision' in outcome && outcome.decision === 'remove');
178
+ } catch (err: unknown) {
179
+ throw new Error(`${failure}. ${err instanceof Error ? err.message : String(err)}`, { cause: err });
180
+ }
181
+ if (!built) {
182
+ throw new Error(failure);
183
+ }
184
+ };
185
+ await this.waitForReleaseBuild(released, target, parsed, stoppedShort && !released.isReclaimed() ? recover : undefined);
186
+ }
187
+
188
+ /**
189
+ * Decide, then carry the decision out under the write lock unless a client
190
+ * holds the document again. Answers how that went; a parse of the document
191
+ * seen meanwhile counts even when the build was cancelled after it, since
192
+ * the build it yields to does not parse again.
193
+ */
194
+ protected async runRelease(released: ReleasedDocument, target: URI): Promise<DocumentReleaseOutcome> {
195
+ const workspace = this.services.workspace;
196
+ let decision: DocumentReleaseDecision | undefined;
197
+ let parsed = false;
198
+ let parses: Disposable | undefined;
199
+ // Typed by assertion: the write's callback moves it, which narrowing does not see.
200
+ let progress = 'queued' as 'queued' | 'reclaimed' | 'building' | 'built';
201
+ try {
202
+ // Decided before the lock: every build and read waits while the lock
203
+ // is held, and the default decision waits on the file's save I/O.
204
+ const decided = await this.decideRelease(released, target);
205
+ decision = decided;
206
+ await workspace.WorkspaceManager?.ready;
207
+ // Queuing the write cancels the running build, even when it then reverts nothing.
208
+ if (released.isReclaimed()) {
209
+ return { kind: 'reclaimed' };
210
+ }
211
+ await workspace.WorkspaceLock.write(async token => {
212
+ if (released.isReclaimed()) {
213
+ progress = 'reclaimed';
214
+ return;
215
+ }
216
+ parses = workspace.VersionSyncService.onDidRecordModel(document => {
217
+ parsed ||= released.isFor(document.uri.toString());
218
+ });
219
+ progress = 'building';
220
+ await this.applyReleaseDecision(target, decided, token);
221
+ progress = 'built';
222
+ });
223
+ // A cancelled build throws inside the write, and the lock resolves.
224
+ if (progress === 'reclaimed') {
225
+ return { kind: 'reclaimed' };
226
+ }
227
+ if (progress === 'queued') {
228
+ return { kind: 'discarded', decision: decided };
229
+ }
230
+ if (progress === 'building') {
231
+ return { kind: 'cancelled', decision: decided, parsed };
232
+ }
233
+ return { kind: 'completed', decision: decided, parsed };
234
+ } catch (error: unknown) {
235
+ // A revert that finishes after the LSP peer went away fails its
236
+ // diagnostics publish, and one that runs after its workspace was torn
237
+ // down finds no file: teardown races, not failed reverts.
238
+ if (isConnectionGoneError(error) || isFileNotFound(error, target)) {
239
+ return { kind: 'skipped', parsed, error };
240
+ }
241
+ return { kind: 'failed', decision, parsed, error };
242
+ } finally {
243
+ parses?.dispose();
244
+ }
245
+ }
246
+
247
+ /**
248
+ * `outcome` for the line each release logs at debug: its kind, the
249
+ * decision and whether the document was parsed.
250
+ */
251
+ protected formatReleaseOutcome(outcome: DocumentReleaseOutcome): string {
252
+ if (outcome.kind === 'reclaimed') {
253
+ return 'reclaimed by a client, built nothing';
254
+ }
255
+ const decision = 'decision' in outcome && outcome.decision !== undefined ? ` ${outcome.decision}` : '';
256
+ const parsed = 'parsed' in outcome ? (outcome.parsed ? ', parsed' : ', not parsed') : '';
257
+ return `${outcome.kind}${decision}${parsed}`;
258
+ }
259
+
260
+ /**
261
+ * The policy: rebuild a document the file system provider can serve, and
262
+ * remove any other. Read in the document's disk queue, so it follows any
263
+ * save still queued rather than deciding past it.
264
+ */
265
+ protected decideRelease(released: ReleasedDocument, target: URI): Promise<DocumentReleaseDecision> {
266
+ const workspace = this.services.workspace;
267
+ return workspace.FileSystemTaskQueue.enqueue(released.uri, async () =>
268
+ (await workspace.FileSystemProvider.exists(target)) ? 'rebuild' : 'remove'
269
+ );
270
+ }
271
+
272
+ /**
273
+ * Carry `decision` out under the write lock; a file gone since the decision
274
+ * is removed instead. An override must rebuild or remove the document:
275
+ * release settlement waits for its parse or removal, and one that does
276
+ * neither is followed by a recovery build that rebuilds it.
277
+ */
278
+ protected async applyReleaseDecision(target: URI, decision: DocumentReleaseDecision, token: CancellationToken): Promise<void> {
279
+ const builder = this.services.workspace.DocumentBuilder;
280
+ builder.markNextReason(HYDRANIUM_BUILD_REASONS.didRelease);
281
+ try {
282
+ await (decision === 'rebuild' ? builder.update([target], [], token) : builder.update([], [target], token));
283
+ } catch (err: unknown) {
284
+ if (decision !== 'rebuild' || !isFileNotFound(err, target)) {
285
+ throw err;
286
+ }
287
+ this.tracer.with(target.toString()).debug('Revert found no file; removing the document instead');
288
+ builder.markNextReason(HYDRANIUM_BUILD_REASONS.didRelease);
289
+ await builder.update([], [target], token);
290
+ }
291
+ }
292
+
293
+ /** The build in place of a release that stopped short; answers whether it ran. */
294
+ protected requestRecoveryBuild(released: ReleasedDocument, target: URI, deleted: boolean): Promise<boolean> {
295
+ return this.services.workspace.VersionSyncService.requestRecoveryBuild(target, {
296
+ deleted,
297
+ reason: HYDRANIUM_BUILD_REASONS.didRelease,
298
+ // The update handler dropped the change it held back at the release.
299
+ ignoreDeferred: true,
300
+ stillNeeded: () => !released.isReclaimed()
301
+ });
302
+ }
303
+
304
+ /**
305
+ * Resolve now when the build holds the file's text of `target` or no longer
306
+ * has it, else once a parse or removal of `target` reaches the store:
307
+ * settled with the released text still in the build, the release would name
308
+ * that text. `startRecovery` requests the build in place of a revert that
309
+ * stopped short, started only once the parse and removal are watched, so a
310
+ * build that records the document at once is not missed. Rejects when that
311
+ * build fails, since no parse or removal is coming then.
312
+ */
313
+ protected waitForReleaseBuild(
314
+ released: ReleasedDocument,
315
+ target: URI,
316
+ parsed: boolean,
317
+ startRecovery: (() => Promise<void>) | undefined
318
+ ): Promise<void> {
319
+ const workspace = this.services.workspace;
320
+ // A client holding the document again keeps what the build holds for it.
321
+ if (parsed || workspace.LangiumDocuments.getDocument(target) === undefined || released.isReclaimed()) {
322
+ // Settled now, so a failed recovery build is only logged.
323
+ startRecovery?.().catch((err: unknown) => this.tracer.with(released.uri).error(err instanceof Error ? err.message : String(err)));
324
+ return Promise.resolve();
325
+ }
326
+ return new Promise<void>((resolve, reject) => {
327
+ let ended = false;
328
+ const finish = (end: () => void): void => {
329
+ if (ended) {
330
+ return;
331
+ }
332
+ ended = true;
333
+ parses.dispose();
334
+ removals.dispose();
335
+ end();
336
+ };
337
+ const parses = workspace.VersionSyncService.onDidRecordModel(document => {
338
+ if (released.isFor(document.uri.toString())) {
339
+ finish(resolve);
340
+ }
341
+ });
342
+ const removals = workspace.DocumentBuilder.onUpdate((_changed, deleted) => {
343
+ if (deleted.some(uri => released.isFor(uri.toString()))) {
344
+ finish(resolve);
345
+ }
346
+ });
347
+ startRecovery?.().then(
348
+ // A recovery build no longer needed, for a reclaimed document, builds nothing.
349
+ () => {
350
+ if (released.isReclaimed()) {
351
+ finish(resolve);
352
+ }
353
+ },
354
+ (err: unknown) => {
355
+ // Settled by a parse that came first, so only logged.
356
+ if (ended) {
357
+ this.tracer.with(released.uri).error(err instanceof Error ? err.message : String(err));
358
+ } else {
359
+ finish(() => reject(err));
360
+ }
361
+ }
362
+ );
363
+ });
364
+ }
365
+ }
@@ -0,0 +1,121 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+
10
+ import { type CanonicalUri, type Clock, type Stopwatch } from '@hydranium/protocol';
11
+ import { type Disposable } from 'vscode-languageserver';
12
+
13
+ /** What an open of a document whose release is deferred means for it, as {@link DocumentReleaseScheduler.resolveOpen} decides. */
14
+ export type DeferredReleaseOpenDecision =
15
+ /** The opener was lost from the document within its grace: it keeps the unsaved text. */
16
+ | 'keep'
17
+ /** Any other opener: the document is released first, and opens as a first open does. */
18
+ | 'release'
19
+ /** No release was deferred. */
20
+ | 'none';
21
+
22
+ /**
23
+ * Decides when the store releases a document no client holds: at once, or,
24
+ * when its last client's connection was lost, once a grace has passed, so a
25
+ * client that reconnects in time finds its unsaved text.
26
+ */
27
+ export interface DocumentReleaseScheduler {
28
+ /** How long a deferred release waits; `0` releases at once. */
29
+ readonly graceMs: number;
30
+ /** `clientId` closed `key` because its connection was lost. */
31
+ recordLoss(key: CanonicalUri, clientId: string): void;
32
+ /** No client holds `key` after a loss: run `release` once the grace has passed, or now when there is none. */
33
+ defer(key: CanonicalUri, release: () => void): void;
34
+ isDeferred(key: CanonicalUri): boolean;
35
+ /** `clientId` opens `key`; a deferred release ends either way. */
36
+ resolveOpen(key: CanonicalUri, clientId: string): DeferredReleaseOpenDecision;
37
+ /** End a deferred release of `key` without running it. */
38
+ cancel(key: CanonicalUri): void;
39
+ /** `key` was released: drop the losses recorded for it. */
40
+ clearLosses(key: CanonicalUri): void;
41
+ }
42
+
43
+ export class DefaultDocumentReleaseScheduler implements DocumentReleaseScheduler {
44
+ protected readonly deferred = new Map<CanonicalUri, Disposable>();
45
+ /**
46
+ * Per document, the clients whose close of it was caused by a lost
47
+ * connection and that have not opened it again, each with a stopwatch
48
+ * started at its loss. Every such client counts, not only the last to
49
+ * close: one connection's sessions all end lost together, and any of them
50
+ * may reopen first. A stopwatch rather than a `now()` reading, because a
51
+ * wall-clock step would otherwise expire a claim early or revive one past
52
+ * its grace, against a grace timer that the step leaves alone.
53
+ */
54
+ protected readonly lostClients = new Map<CanonicalUri, Map<string, Stopwatch>>();
55
+
56
+ constructor(
57
+ protected readonly clock: Clock,
58
+ readonly graceMs: number
59
+ ) {}
60
+
61
+ recordLoss(key: CanonicalUri, clientId: string): void {
62
+ let lost = this.lostClients.get(key);
63
+ if (!lost) {
64
+ lost = new Map();
65
+ this.lostClients.set(key, lost);
66
+ }
67
+ lost.set(clientId, this.clock.stopwatch());
68
+ }
69
+
70
+ defer(key: CanonicalUri, release: () => void): void {
71
+ this.cancel(key);
72
+ if (this.graceMs <= 0) {
73
+ release();
74
+ return;
75
+ }
76
+ this.deferred.set(
77
+ key,
78
+ this.clock.setTimer(() => {
79
+ this.deferred.delete(key);
80
+ release();
81
+ }, this.graceMs)
82
+ );
83
+ }
84
+
85
+ isDeferred(key: CanonicalUri): boolean {
86
+ return this.deferred.has(key);
87
+ }
88
+
89
+ /**
90
+ * A claim past its grace counts as any other client's: without the limit,
91
+ * a client that returns late inherits the unsaved text of a holder lost
92
+ * after it. Cancelling for every open instead hands a lost client's unsaved
93
+ * text to whoever opens next, with nothing marking it unsaved.
94
+ */
95
+ resolveOpen(key: CanonicalUri, clientId: string): DeferredReleaseOpenDecision {
96
+ const lost = this.lostClients.get(key);
97
+ for (const [lostId, sinceLoss] of lost ?? []) {
98
+ if (sinceLoss.elapsedMs >= this.graceMs) {
99
+ lost?.delete(lostId);
100
+ }
101
+ }
102
+ const returning = lost?.delete(clientId) ?? false;
103
+ if (lost?.size === 0) {
104
+ this.lostClients.delete(key);
105
+ }
106
+ if (!this.deferred.has(key)) {
107
+ return 'none';
108
+ }
109
+ this.cancel(key);
110
+ return returning ? 'keep' : 'release';
111
+ }
112
+
113
+ cancel(key: CanonicalUri): void {
114
+ this.deferred.get(key)?.dispose();
115
+ this.deferred.delete(key);
116
+ }
117
+
118
+ clearLosses(key: CanonicalUri): void {
119
+ this.lostClients.delete(key);
120
+ }
121
+ }
@@ -0,0 +1,68 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 CrossBreeze, EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+
10
+ import { type CanonicalUri } from '@hydranium/protocol';
11
+ import { type ServerSharedServices } from '../langium/module.js';
12
+ import { type DocumentUriPolicy } from '../langium/workspace/document-uri-policy.js';
13
+
14
+ /**
15
+ * One queue of file-system tasks per file, shared by every server-side reader
16
+ * and writer of a file whose accesses must not interleave with its saves.
17
+ *
18
+ * Two writes of one file that bypass the queue can land in either order, and
19
+ * the older text then stays on disk. Tasks of different files run in
20
+ * parallel.
21
+ */
22
+ export interface FileSystemTaskQueue {
23
+ /**
24
+ * Run `task` once every task already enqueued for `uri` has settled, and
25
+ * before any enqueued after it. `uri` is keyed by its canonical identity, so
26
+ * every spelling of one file shares a queue. A task that has nothing to do
27
+ * still resolves once the tasks before it have settled.
28
+ *
29
+ * A task must not await a build, nor a save, another task or an open of a
30
+ * document no client has open, all of the same file: a build's integrity
31
+ * repair enqueues its own write and the build waits for it, and such an
32
+ * open reads the file here, so a task waiting on either never resolves,
33
+ * which wedges the file's queue for good.
34
+ */
35
+ enqueue<T>(uri: string, task: () => Promise<T>): Promise<T>;
36
+ }
37
+
38
+ export class DefaultFileSystemTaskQueue implements FileSystemTaskQueue {
39
+ /**
40
+ * Per canonical URI, the settling of the last task enqueued for it; the next
41
+ * task chains behind it. An entry leaves once its file's queue is idle. Kept
42
+ * outside the workspace lock, whose `write` cancels the write before it: a
43
+ * save cancelled that way reports success for text it never wrote.
44
+ */
45
+ protected readonly queues = new Map<CanonicalUri, Promise<void>>();
46
+
47
+ protected readonly uriPolicy: DocumentUriPolicy;
48
+
49
+ constructor(services: { readonly workspace: Pick<ServerSharedServices['workspace'], 'DocumentUriPolicy'> }) {
50
+ this.uriPolicy = services.workspace.DocumentUriPolicy;
51
+ }
52
+
53
+ enqueue<T>(uri: string, task: () => Promise<T>): Promise<T> {
54
+ const key = this.uriPolicy.canonicalUri(uri);
55
+ const result = (this.queues.get(key) ?? Promise.resolve()).then(task);
56
+ const settled = result.then(
57
+ () => undefined,
58
+ () => undefined
59
+ );
60
+ this.queues.set(key, settled);
61
+ void settled.then(() => {
62
+ if (this.queues.get(key) === settled) {
63
+ this.queues.delete(key);
64
+ }
65
+ });
66
+ return result;
67
+ }
68
+ }