@hydranium/core 1.0.0-next.24 → 1.0.0-next.241

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 (649) hide show
  1. package/README.md +22 -17
  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 +5 -0
  59. package/lib/index.d.ts.map +1 -1
  60. package/lib/index.js +8 -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 +23 -16
  69. package/lib/langium/bootstrap.d.ts.map +1 -1
  70. package/lib/langium/bootstrap.js +66 -28
  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 +46 -0
  75. package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
  76. package/lib/langium/composite-ast-reflection.js +97 -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.map +1 -1
  104. package/lib/langium/document-builder/build-session.js.map +1 -1
  105. package/lib/langium/document-builder/document-builder.d.ts +294 -33
  106. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  107. package/lib/langium/document-builder/document-builder.js +477 -61
  108. package/lib/langium/document-builder/document-builder.js.map +1 -1
  109. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  110. package/lib/langium/documentation/comment-provider.js.map +1 -1
  111. package/lib/langium/integration-services.d.ts +61 -19
  112. package/lib/langium/integration-services.d.ts.map +1 -1
  113. package/lib/langium/integration-services.js +10 -5
  114. package/lib/langium/integration-services.js.map +1 -1
  115. package/lib/langium/integrity/integrity-rule.d.ts +16 -8
  116. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  117. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  118. package/lib/langium/integrity/integrity-service.d.ts +81 -24
  119. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  120. package/lib/langium/integrity/integrity-service.js +264 -57
  121. package/lib/langium/integrity/integrity-service.js.map +1 -1
  122. package/lib/langium/keys/containment.d.ts +64 -0
  123. package/lib/langium/keys/containment.d.ts.map +1 -0
  124. package/lib/langium/keys/containment.js +53 -0
  125. package/lib/langium/keys/containment.js.map +1 -0
  126. package/lib/langium/keys/index.d.ts +1 -0
  127. package/lib/langium/keys/index.d.ts.map +1 -1
  128. package/lib/langium/keys/index.js +1 -0
  129. package/lib/langium/keys/index.js.map +1 -1
  130. package/lib/langium/keys/name-based-key-provider.d.ts +4 -0
  131. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  132. package/lib/langium/keys/name-based-key-provider.js +4 -0
  133. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  134. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  135. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  136. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  137. package/lib/langium/labeling/label-provider.js.map +1 -1
  138. package/lib/langium/language-module.d.ts +29 -4
  139. package/lib/langium/language-module.d.ts.map +1 -1
  140. package/lib/langium/language-module.js +18 -4
  141. package/lib/langium/language-module.js.map +1 -1
  142. package/lib/langium/model-service/client-session.d.ts +343 -0
  143. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  144. package/lib/langium/model-service/client-session.js +411 -0
  145. package/lib/langium/model-service/client-session.js.map +1 -0
  146. package/lib/langium/model-service/index.d.ts +2 -0
  147. package/lib/langium/model-service/index.d.ts.map +1 -1
  148. package/lib/langium/model-service/index.js +2 -0
  149. package/lib/langium/model-service/index.js.map +1 -1
  150. package/lib/langium/model-service/model-events.d.ts +61 -0
  151. package/lib/langium/model-service/model-events.d.ts.map +1 -0
  152. package/lib/langium/model-service/model-events.js +10 -0
  153. package/lib/langium/model-service/model-events.js.map +1 -0
  154. package/lib/langium/model-service/model-service.d.ts +432 -282
  155. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  156. package/lib/langium/model-service/model-service.js +504 -438
  157. package/lib/langium/model-service/model-service.js.map +1 -1
  158. package/lib/langium/module.d.ts +150 -35
  159. package/lib/langium/module.d.ts.map +1 -1
  160. package/lib/langium/module.js +47 -35
  161. package/lib/langium/module.js.map +1 -1
  162. package/lib/langium/naming/name-provider.d.ts +25 -4
  163. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  164. package/lib/langium/naming/name-provider.js +2 -1
  165. package/lib/langium/naming/name-provider.js.map +1 -1
  166. package/lib/langium/naming/name-separator-validation.d.ts +23 -0
  167. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  168. package/lib/langium/naming/name-separator-validation.js +30 -1
  169. package/lib/langium/naming/name-separator-validation.js.map +1 -1
  170. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  171. package/lib/langium/project/abstract-project-manager.js +9 -2
  172. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  173. package/lib/langium/project/project-change-event.d.ts +2 -2
  174. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  175. package/lib/langium/project/single-project-manager.js.map +1 -1
  176. package/lib/langium/residency/cst-residency-service.d.ts +30 -10
  177. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  178. package/lib/langium/residency/cst-residency-service.js +23 -57
  179. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  180. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  181. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  182. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  183. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  184. package/lib/langium/scope/hydranium-scope-provider.d.ts +48 -13
  185. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  186. package/lib/langium/scope/hydranium-scope-provider.js +56 -20
  187. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  188. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  189. package/lib/langium/scope/reference-builder.js.map +1 -1
  190. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  191. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  192. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  193. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  194. package/lib/langium/serialization/abstract-serializer.d.ts +11 -20
  195. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  196. package/lib/langium/serialization/abstract-serializer.js +12 -21
  197. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  198. package/lib/langium/serialization/json-serializer.d.ts +1 -1
  199. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  200. package/lib/langium/serialization/json-serializer.js.map +1 -1
  201. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  202. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  203. package/lib/langium/service-registry.d.ts +29 -1
  204. package/lib/langium/service-registry.d.ts.map +1 -1
  205. package/lib/langium/service-registry.js +37 -0
  206. package/lib/langium/service-registry.js.map +1 -1
  207. package/lib/langium/shared-services.d.ts +21 -6
  208. package/lib/langium/shared-services.d.ts.map +1 -1
  209. package/lib/langium/shared-services.js.map +1 -1
  210. package/lib/langium/single-langium-copy.d.ts +22 -0
  211. package/lib/langium/single-langium-copy.d.ts.map +1 -0
  212. package/lib/langium/single-langium-copy.js +36 -0
  213. package/lib/langium/single-langium-copy.js.map +1 -0
  214. package/lib/langium/transfer/transfer-encoder.d.ts +77 -26
  215. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  216. package/lib/langium/transfer/transfer-encoder.js +46 -24
  217. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  218. package/lib/langium/trivia/comment-preserver.d.ts +423 -0
  219. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  220. package/lib/langium/trivia/comment-preserver.js +906 -0
  221. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  222. package/lib/langium/trivia/document-ending-preserver.d.ts +43 -0
  223. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  224. package/lib/langium/trivia/document-ending-preserver.js +48 -0
  225. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  226. package/lib/langium/trivia/index.d.ts +14 -0
  227. package/lib/langium/trivia/index.d.ts.map +1 -0
  228. package/lib/langium/trivia/index.js +14 -0
  229. package/lib/langium/trivia/index.js.map +1 -0
  230. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  231. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  232. package/lib/langium/trivia/trivia-contribution.js +10 -0
  233. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  234. package/lib/langium/trivia/trivia-preserver.d.ts +50 -0
  235. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  236. package/lib/langium/trivia/trivia-preserver.js +10 -0
  237. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  238. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  239. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  240. package/lib/langium/trivia/trivia-service.js +56 -0
  241. package/lib/langium/trivia/trivia-service.js.map +1 -0
  242. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  243. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  244. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  245. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  246. package/lib/langium/validation/document-validator.d.ts +280 -9
  247. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  248. package/lib/langium/validation/document-validator.js +448 -5
  249. package/lib/langium/validation/document-validator.js.map +1 -1
  250. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  251. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  252. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  253. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  254. package/lib/langium/workspace/document-uri-policy.d.ts +15 -10
  255. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  256. package/lib/langium/workspace/document-uri-policy.js +7 -5
  257. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  258. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  259. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  260. package/lib/langium/workspace/file-not-found.js +31 -0
  261. package/lib/langium/workspace/file-not-found.js.map +1 -0
  262. package/lib/langium/workspace/file-system-provider.d.ts +135 -9
  263. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  264. package/lib/langium/workspace/file-system-provider.js +93 -14
  265. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  266. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +56 -1
  267. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  268. package/lib/langium/workspace/hydranium-langium-document-factory.js +79 -0
  269. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  270. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
  271. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  272. package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
  273. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  274. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +82 -9
  275. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  276. package/lib/langium/workspace/hydranium-workspace-manager.js +128 -10
  277. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  278. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -3
  279. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  280. package/lib/langium/workspace/in-memory-file-system-provider.js +41 -15
  281. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  282. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  283. package/lib/langium/workspace/index-manager.js.map +1 -1
  284. package/lib/langium/workspace/index.d.ts +1 -0
  285. package/lib/langium/workspace/index.d.ts.map +1 -1
  286. package/lib/langium/workspace/index.js +1 -0
  287. package/lib/langium/workspace/index.js.map +1 -1
  288. package/lib/langium/workspace/initialize-workspace.d.ts +31 -2
  289. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  290. package/lib/langium/workspace/initialize-workspace.js +13 -5
  291. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  292. package/lib/langium/workspace/langium-documents.d.ts +46 -4
  293. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  294. package/lib/langium/workspace/langium-documents.js +60 -5
  295. package/lib/langium/workspace/langium-documents.js.map +1 -1
  296. package/lib/langium/workspace/persistent-file-system-provider.d.ts +1 -8
  297. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  298. package/lib/langium/workspace/persistent-file-system-provider.js +0 -7
  299. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  300. package/lib/{documents → langium/workspace}/self-save-registry.d.ts +38 -7
  301. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  302. package/lib/{documents → langium/workspace}/self-save-registry.js +29 -16
  303. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  304. package/lib/langium/workspace/virtual-document.d.ts +48 -15
  305. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  306. package/lib/langium/workspace/virtual-document.js +78 -18
  307. package/lib/langium/workspace/virtual-document.js.map +1 -1
  308. package/lib/langium/workspace/write-lock-scope.d.ts +20 -10
  309. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  310. package/lib/langium/workspace/write-lock-scope.js +12 -4
  311. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  312. package/lib/locale/index.d.ts +10 -0
  313. package/lib/locale/index.d.ts.map +1 -0
  314. package/lib/locale/index.js +10 -0
  315. package/lib/locale/index.js.map +1 -0
  316. package/lib/locale/server-locale.d.ts +73 -0
  317. package/lib/locale/server-locale.d.ts.map +1 -0
  318. package/lib/locale/server-locale.js +61 -0
  319. package/lib/locale/server-locale.js.map +1 -0
  320. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  321. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  322. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  323. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  324. package/lib/lsp/connection-features.d.ts +23 -0
  325. package/lib/lsp/connection-features.d.ts.map +1 -0
  326. package/lib/lsp/connection-features.js +60 -0
  327. package/lib/lsp/connection-features.js.map +1 -0
  328. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  329. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  330. package/lib/lsp/diagnostics-connection.js +53 -0
  331. package/lib/lsp/diagnostics-connection.js.map +1 -0
  332. package/lib/lsp/hydranium-document-update-handler.d.ts +92 -81
  333. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  334. package/lib/lsp/hydranium-document-update-handler.js +153 -99
  335. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  336. package/lib/lsp/index.d.ts +3 -1
  337. package/lib/lsp/index.d.ts.map +1 -1
  338. package/lib/lsp/index.js +3 -1
  339. package/lib/lsp/index.js.map +1 -1
  340. package/lib/lsp/lsp-latency.d.ts +39 -0
  341. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  342. package/lib/lsp/lsp-latency.js +58 -0
  343. package/lib/lsp/lsp-latency.js.map +1 -0
  344. package/lib/lsp/semantic-token-provider.d.ts +34 -1
  345. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  346. package/lib/lsp/semantic-token-provider.js +55 -8
  347. package/lib/lsp/semantic-token-provider.js.map +1 -1
  348. package/lib/lsp/shared-module.d.ts +4 -8
  349. package/lib/lsp/shared-module.d.ts.map +1 -1
  350. package/lib/lsp/shared-module.js.map +1 -1
  351. package/lib/lsp/start-language-server.d.ts +8 -7
  352. package/lib/lsp/start-language-server.d.ts.map +1 -1
  353. package/lib/lsp/start-language-server.js +13 -7
  354. package/lib/lsp/start-language-server.js.map +1 -1
  355. package/lib/messages/carriers.d.ts +54 -0
  356. package/lib/messages/carriers.d.ts.map +1 -0
  357. package/lib/messages/carriers.js +62 -0
  358. package/lib/messages/carriers.js.map +1 -0
  359. package/lib/messages/index.d.ts +25 -0
  360. package/lib/messages/index.d.ts.map +1 -0
  361. package/lib/messages/index.js +25 -0
  362. package/lib/messages/index.js.map +1 -0
  363. package/lib/messages/renderer.d.ts +142 -0
  364. package/lib/messages/renderer.d.ts.map +1 -0
  365. package/lib/messages/renderer.js +165 -0
  366. package/lib/messages/renderer.js.map +1 -0
  367. package/lib/node/event-loop-monitor.js.map +1 -1
  368. package/lib/node/heap-ceiling.d.ts +61 -0
  369. package/lib/node/heap-ceiling.d.ts.map +1 -0
  370. package/lib/node/heap-ceiling.js +72 -0
  371. package/lib/node/heap-ceiling.js.map +1 -0
  372. package/lib/node/index.d.ts +1 -1
  373. package/lib/node/index.d.ts.map +1 -1
  374. package/lib/node/index.js +1 -1
  375. package/lib/node/index.js.map +1 -1
  376. package/lib/node/latency-from-env.d.ts +1 -1
  377. package/lib/node/latency-from-env.js +1 -1
  378. package/lib/node/lint-grammar.js.map +1 -1
  379. package/lib/node/measure-memory.d.ts.map +1 -1
  380. package/lib/node/measure-memory.js +1 -0
  381. package/lib/node/measure-memory.js.map +1 -1
  382. package/lib/node/memory-monitor.js.map +1 -1
  383. package/lib/node/node-file-system-provider.d.ts +41 -6
  384. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  385. package/lib/node/node-file-system-provider.js +109 -49
  386. package/lib/node/node-file-system-provider.js.map +1 -1
  387. package/lib/node/profile-capture.d.ts +8 -2
  388. package/lib/node/profile-capture.d.ts.map +1 -1
  389. package/lib/node/profile-capture.js +1 -1
  390. package/lib/node/profile-capture.js.map +1 -1
  391. package/lib/node/profile-digest.js.map +1 -1
  392. package/lib/node/profiling-run.d.ts +13 -3
  393. package/lib/node/profiling-run.d.ts.map +1 -1
  394. package/lib/node/profiling-run.js +17 -8
  395. package/lib/node/profiling-run.js.map +1 -1
  396. package/lib/node/rename-over-open-readers.d.ts +52 -0
  397. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  398. package/lib/node/rename-over-open-readers.js +66 -0
  399. package/lib/node/rename-over-open-readers.js.map +1 -0
  400. package/lib/node/socket-launcher.d.ts +20 -4
  401. package/lib/node/socket-launcher.d.ts.map +1 -1
  402. package/lib/node/socket-launcher.js +5 -4
  403. package/lib/node/socket-launcher.js.map +1 -1
  404. package/lib/node/stdio-launcher.d.ts +6 -5
  405. package/lib/node/stdio-launcher.d.ts.map +1 -1
  406. package/lib/node/stdio-launcher.js +2 -2
  407. package/lib/node/stdio-launcher.js.map +1 -1
  408. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  409. package/lib/testing/fake-description.js.map +1 -1
  410. package/lib/testing/fake-document.d.ts +16 -4
  411. package/lib/testing/fake-document.d.ts.map +1 -1
  412. package/lib/testing/fake-document.js +18 -3
  413. package/lib/testing/fake-document.js.map +1 -1
  414. package/lib/testing/index.d.ts +1 -1
  415. package/lib/testing/index.d.ts.map +1 -1
  416. package/lib/testing/index.js +2 -1
  417. package/lib/testing/index.js.map +1 -1
  418. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  419. package/lib/testing/langium-test-helpers.js +1 -0
  420. package/lib/testing/langium-test-helpers.js.map +1 -1
  421. package/lib/testing/make-noop-language-services.js.map +1 -1
  422. package/lib/testing/make-noop-shared-services.d.ts +14 -0
  423. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  424. package/lib/testing/make-noop-shared-services.js +28 -2
  425. package/lib/testing/make-noop-shared-services.js.map +1 -1
  426. package/lib/testing/make-test-services.d.ts +72 -14
  427. package/lib/testing/make-test-services.d.ts.map +1 -1
  428. package/lib/testing/make-test-services.js +42 -10
  429. package/lib/testing/make-test-services.js.map +1 -1
  430. package/lib/testing/make-test-tracer.d.ts +12 -0
  431. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  432. package/lib/testing/make-test-tracer.js +13 -0
  433. package/lib/testing/make-test-tracer.js.map +1 -1
  434. package/lib/testing/node/golden-corpus.js.map +1 -1
  435. package/lib/testing/node/index.d.ts +1 -0
  436. package/lib/testing/node/index.d.ts.map +1 -1
  437. package/lib/testing/node/index.js +1 -0
  438. package/lib/testing/node/index.js.map +1 -1
  439. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  440. package/lib/testing/node/lsp-harness.js +2 -0
  441. package/lib/testing/node/lsp-harness.js.map +1 -1
  442. package/lib/testing/node/lsp-server-connection.d.ts +11 -3
  443. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  444. package/lib/testing/node/lsp-server-connection.js +43 -10
  445. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  446. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  447. package/lib/testing/node/scratch-workspace.js +10 -5
  448. package/lib/testing/node/scratch-workspace.js.map +1 -1
  449. package/lib/testing/node/spawned-server.d.ts +14 -0
  450. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  451. package/lib/testing/node/spawned-server.js +34 -2
  452. package/lib/testing/node/spawned-server.js.map +1 -1
  453. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  454. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  455. package/lib/testing/node/unhandled-rejections.js +32 -0
  456. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  457. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  458. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  459. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  460. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  461. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  462. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  463. package/lib/testing/playwright/index.d.ts +1 -0
  464. package/lib/testing/playwright/index.d.ts.map +1 -1
  465. package/lib/testing/playwright/index.js +1 -0
  466. package/lib/testing/playwright/index.js.map +1 -1
  467. package/lib/testing/playwright/server-log-capture.d.ts +24 -8
  468. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  469. package/lib/testing/playwright/server-log-capture.js +27 -6
  470. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  471. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  472. package/lib/testing/playwright/server-log-rename-reporter.js +10 -1
  473. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  474. package/lib/testing/run-update-pipeline.d.ts +4 -4
  475. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  476. package/lib/testing/stub-ast-document-manager.d.ts +11 -52
  477. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  478. package/lib/testing/stub-ast-document-manager.js +24 -65
  479. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  480. package/lib/testing/stub-document-builder.d.ts +26 -11
  481. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  482. package/lib/testing/stub-document-builder.js +78 -5
  483. package/lib/testing/stub-document-builder.js.map +1 -1
  484. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  485. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  486. package/lib/testing/stub-hydranium-text-documents.js +115 -16
  487. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  488. package/lib/testing/stub-index-manager.js.map +1 -1
  489. package/lib/testing/stub-langium-documents.d.ts +3 -2
  490. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  491. package/lib/testing/stub-langium-documents.js.map +1 -1
  492. package/lib/testing/stub-model-service.d.ts +7 -6
  493. package/lib/testing/stub-model-service.d.ts.map +1 -1
  494. package/lib/testing/stub-model-service.js +4 -4
  495. package/lib/testing/stub-model-service.js.map +1 -1
  496. package/lib/testing/stub-project-manager.js.map +1 -1
  497. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  498. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  499. package/lib/testing/stub-service-registry.d.ts +1 -1
  500. package/lib/testing/stub-service-registry.js.map +1 -1
  501. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  502. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  503. package/lib/util/connection-liveness.d.ts +7 -6
  504. package/lib/util/connection-liveness.d.ts.map +1 -1
  505. package/lib/util/connection-liveness.js +35 -14
  506. package/lib/util/connection-liveness.js.map +1 -1
  507. package/lib/util/environment.d.ts.map +1 -1
  508. package/lib/util/environment.js.map +1 -1
  509. package/lib/util/registry.d.ts.map +1 -1
  510. package/package.json +32 -48
  511. package/src/documents/ast-document-manager.ts +379 -231
  512. package/src/documents/client-ids.ts +5 -22
  513. package/src/documents/client-session-errors.ts +24 -0
  514. package/src/documents/client-session-registry.ts +262 -0
  515. package/src/documents/dirty-state-tracker.ts +130 -0
  516. package/src/documents/document-release-handler.ts +365 -0
  517. package/src/documents/document-release-scheduler.ts +121 -0
  518. package/src/documents/file-system-task-queue.ts +68 -0
  519. package/src/documents/hydranium-text-documents.ts +931 -595
  520. package/src/documents/index.ts +10 -2
  521. package/src/documents/language-client-shadow.ts +451 -0
  522. package/src/documents/model-ledger.ts +66 -0
  523. package/src/documents/text-ledger.ts +112 -0
  524. package/src/documents/version-sync-service.ts +267 -0
  525. package/src/index.ts +8 -0
  526. package/src/langium/ast-extension/ast-node-builder.ts +66 -22
  527. package/src/langium/bootstrap.ts +66 -28
  528. package/src/langium/composite-ast-reflection.ts +112 -0
  529. package/src/langium/config/configuration-provider.ts +119 -0
  530. package/src/langium/config/index.ts +1 -0
  531. package/src/langium/diagnostics/logger.ts +12 -5
  532. package/src/langium/diagnostics/lsp-logger.ts +59 -15
  533. package/src/langium/document-builder/build-pipeline-integration.ts +50 -5
  534. package/src/langium/document-builder/document-builder.ts +565 -59
  535. package/src/langium/integration-services.ts +83 -24
  536. package/src/langium/integrity/integrity-rule.ts +16 -8
  537. package/src/langium/integrity/integrity-service.ts +287 -62
  538. package/src/langium/keys/containment.ts +87 -0
  539. package/src/langium/keys/index.ts +1 -0
  540. package/src/langium/keys/name-based-key-provider.ts +4 -0
  541. package/src/langium/language-module.ts +48 -7
  542. package/src/langium/model-service/client-session.ts +644 -0
  543. package/src/langium/model-service/index.ts +2 -0
  544. package/src/langium/model-service/model-events.ts +75 -0
  545. package/src/langium/model-service/model-service.ts +790 -468
  546. package/src/langium/module.ts +199 -64
  547. package/src/langium/naming/name-provider.ts +27 -5
  548. package/src/langium/naming/name-separator-validation.ts +34 -5
  549. package/src/langium/project/abstract-project-manager.ts +9 -1
  550. package/src/langium/project/project-change-event.ts +2 -2
  551. package/src/langium/residency/cst-residency-service.ts +45 -14
  552. package/src/langium/scope/hydranium-scope-provider.ts +60 -22
  553. package/src/langium/serialization/abstract-serializer.ts +13 -32
  554. package/src/langium/service-registry.ts +41 -2
  555. package/src/langium/shared-services.ts +21 -6
  556. package/src/langium/single-langium-copy.ts +42 -0
  557. package/src/langium/transfer/transfer-encoder.ts +104 -37
  558. package/src/langium/trivia/comment-preserver.ts +1100 -0
  559. package/src/langium/trivia/document-ending-preserver.ts +55 -0
  560. package/src/langium/trivia/index.ts +14 -0
  561. package/src/langium/trivia/trivia-contribution.ts +39 -0
  562. package/src/langium/trivia/trivia-preserver.ts +54 -0
  563. package/src/langium/trivia/trivia-service.ts +99 -0
  564. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  565. package/src/langium/validation/document-validator.ts +523 -10
  566. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  567. package/src/langium/workspace/document-uri-policy.ts +15 -10
  568. package/src/langium/workspace/file-not-found.ts +35 -0
  569. package/src/langium/workspace/file-system-provider.ts +205 -17
  570. package/src/langium/workspace/hydranium-langium-document-factory.ts +117 -0
  571. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
  572. package/src/langium/workspace/hydranium-workspace-manager.ts +154 -14
  573. package/src/langium/workspace/in-memory-file-system-provider.ts +48 -17
  574. package/src/langium/workspace/index.ts +1 -0
  575. package/src/langium/workspace/initialize-workspace.ts +43 -5
  576. package/src/langium/workspace/langium-documents.ts +75 -6
  577. package/src/langium/workspace/persistent-file-system-provider.ts +1 -8
  578. package/src/{documents → langium/workspace}/self-save-registry.ts +54 -15
  579. package/src/langium/workspace/virtual-document.ts +96 -19
  580. package/src/langium/workspace/write-lock-scope.ts +24 -11
  581. package/src/locale/index.ts +10 -0
  582. package/src/locale/server-locale.ts +86 -0
  583. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  584. package/src/lsp/connection-features.ts +67 -0
  585. package/src/lsp/diagnostics-connection.ts +56 -0
  586. package/src/lsp/hydranium-document-update-handler.ts +187 -108
  587. package/src/lsp/index.ts +3 -1
  588. package/src/lsp/lsp-latency.ts +62 -0
  589. package/src/lsp/semantic-token-provider.ts +74 -7
  590. package/src/lsp/shared-module.ts +4 -8
  591. package/src/lsp/start-language-server.ts +13 -7
  592. package/src/messages/carriers.ts +78 -0
  593. package/src/messages/index.ts +36 -0
  594. package/src/messages/renderer.ts +212 -0
  595. package/src/node/heap-ceiling.ts +108 -0
  596. package/src/node/index.ts +1 -1
  597. package/src/node/latency-from-env.ts +1 -1
  598. package/src/node/measure-memory.ts +1 -0
  599. package/src/node/node-file-system-provider.ts +124 -53
  600. package/src/node/profile-capture.ts +9 -3
  601. package/src/node/profiling-run.ts +30 -8
  602. package/src/node/rename-over-open-readers.ts +78 -0
  603. package/src/node/socket-launcher.ts +24 -8
  604. package/src/node/stdio-launcher.ts +8 -7
  605. package/src/testing/fake-document.ts +24 -5
  606. package/src/testing/index.ts +2 -1
  607. package/src/testing/langium-test-helpers.ts +1 -0
  608. package/src/testing/make-noop-shared-services.ts +50 -2
  609. package/src/testing/make-test-services.ts +125 -31
  610. package/src/testing/make-test-tracer.ts +26 -0
  611. package/src/testing/node/index.ts +1 -0
  612. package/src/testing/node/lsp-harness.ts +2 -0
  613. package/src/testing/node/lsp-server-connection.ts +66 -12
  614. package/src/testing/node/scratch-workspace.ts +10 -5
  615. package/src/testing/node/spawned-server.ts +36 -2
  616. package/src/testing/node/unhandled-rejections.ts +31 -0
  617. package/src/testing/parse-semantic-root.ts +1 -1
  618. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  619. package/src/testing/playwright/index.ts +1 -0
  620. package/src/testing/playwright/server-log-capture.ts +45 -11
  621. package/src/testing/playwright/server-log-rename-reporter.ts +12 -1
  622. package/src/testing/run-update-pipeline.ts +4 -4
  623. package/src/testing/stub-ast-document-manager.ts +36 -138
  624. package/src/testing/stub-document-builder.ts +102 -18
  625. package/src/testing/stub-hydranium-text-documents.ts +165 -27
  626. package/src/testing/stub-langium-documents.ts +3 -2
  627. package/src/testing/stub-model-service.ts +9 -8
  628. package/src/testing/stub-self-save-registry.ts +1 -1
  629. package/src/testing/stub-service-registry.ts +1 -1
  630. package/src/testing/stub-writable-file-system.ts +1 -1
  631. package/src/util/connection-liveness.ts +37 -14
  632. package/src/util/environment.ts +9 -1
  633. package/lib/documents/language-client-text-shadow.d.ts +0 -101
  634. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  635. package/lib/documents/language-client-text-shadow.js +0 -156
  636. package/lib/documents/language-client-text-shadow.js.map +0 -1
  637. package/lib/documents/self-save-registry.d.ts.map +0 -1
  638. package/lib/documents/self-save-registry.js.map +0 -1
  639. package/lib/lsp/instrument-connection.d.ts +0 -36
  640. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  641. package/lib/lsp/instrument-connection.js +0 -62
  642. package/lib/lsp/instrument-connection.js.map +0 -1
  643. package/lib/node/process-memory.d.ts +0 -66
  644. package/lib/node/process-memory.d.ts.map +0 -1
  645. package/lib/node/process-memory.js +0 -252
  646. package/lib/node/process-memory.js.map +0 -1
  647. package/src/documents/language-client-text-shadow.ts +0 -175
  648. package/src/lsp/instrument-connection.ts +0 -66
  649. package/src/node/process-memory.ts +0 -299
@@ -8,12 +8,18 @@
8
8
  * SPDX-License-Identifier: MIT
9
9
  ********************************************************************************/
10
10
  import { NormalizedTextDocuments } from '@hydranium/langium/lsp';
11
+ import { type URI } from '@hydranium/langium';
11
12
  import { type ServerSharedServices } from '../langium/module.js';
12
- import { type ApplyWorkspaceEditResult, type CancellationToken, type Connection, type DidChangeTextDocumentParams, type DidCloseTextDocumentParams, type DidOpenTextDocumentParams, type DidSaveTextDocumentParams, type Disposable, type Emitter, type Event, type HandlerResult, type RequestHandler, type TextDocumentChangeEvent, type TextDocumentWillSaveEvent, type TextDocumentsConfiguration, type TextEdit, type WillSaveTextDocumentParams } from 'vscode-languageserver';
13
+ import { type ApplyWorkspaceEditResult, type CancellationToken, type Connection, type DidChangeTextDocumentParams, type DidCloseTextDocumentParams, type DidOpenTextDocumentParams, type DidSaveTextDocumentParams, type Disposable, Emitter, type Event, type HandlerResult, type RequestHandler, type TextDocumentChangeEvent, type TextDocumentWillSaveEvent, type TextDocumentsConfiguration, type TextEdit, type WillSaveTextDocumentParams } from 'vscode-languageserver';
13
14
  import { type DocumentUri, TextDocument, type TextDocumentContentChangeEvent } from 'vscode-languageserver-textdocument';
14
- import { type CanonicalUri, type LanguageClientUri, type Tracer } from '@hydranium/protocol';
15
+ import { type CanonicalUri, type LanguageClientUri, type TextState, type TextVersion, type Tracer } from '@hydranium/protocol';
15
16
  import { type LogNameOptions } from '../langium/diagnostics/logger.js';
16
- import { LanguageClientTextShadow } from './language-client-text-shadow.js';
17
+ import { type ClientSessionClosedEvent, ClientSessionRegistry, type SessionEndCause } from './client-session-registry.js';
18
+ import { type LanguageClientShadow } from './language-client-shadow.js';
19
+ import { type TextLedger } from './text-ledger.js';
20
+ import { type ReleasedDocument } from './document-release-handler.js';
21
+ import { type DocumentReleaseScheduler } from './document-release-scheduler.js';
22
+ import { type CleanAnnouncement, type DirtyStateTracker, type DocumentDirtyChangedEvent } from './dirty-state-tracker.js';
17
23
  export interface ClientTextDocumentChangeEvent<T> extends TextDocumentChangeEvent<T> {
18
24
  clientId: string;
19
25
  }
@@ -28,46 +34,30 @@ export interface HydraniumTextDocumentsOptions<T extends TextDocument = TextDocu
28
34
  * Adopters with a custom text-document type (rare) pass their factory.
29
35
  */
30
36
  readonly configuration?: TextDocumentsConfiguration<T>;
37
+ /**
38
+ * How long a document whose last open closed because its client's
39
+ * connection was lost keeps its text before the store releases it. An open
40
+ * by a client lost from the document, within this time of its own loss,
41
+ * cancels the release, so a client that registers again under its id after
42
+ * a dropped connection finds its unsaved edits. Any other open releases the
43
+ * document first and then opens it as a first open does, from the text the
44
+ * opener supplies (an editor's own) or else from the file. Meanwhile the
45
+ * document counts as open for the integrity service, which therefore writes
46
+ * none of its unsaved text to disk. A close the client makes itself, or
47
+ * ending its session, releases at once whatever this is.
48
+ *
49
+ * Defaults to 10 s. `0` releases such a document at once as well, in the
50
+ * close itself rather than on a timer.
51
+ */
52
+ readonly releaseGraceMs?: number;
31
53
  }
32
- /**
33
- * All per-URI client-facing tracking the manager keys by normalized URI,
34
- * collapsed into one record so a URI's full state lives in one place and the
35
- * last-client close clears every axis in a single delete. (Parallel per-axis
36
- * maps are the substrate of a close-on-stale-state desync — one map can be
37
- * cleared while another lingers.)
38
- *
39
- * Two neighbours deliberately stay separate:
40
- * - The inherited `__syncedDocuments` (Langium's parsed `TextDocument` store).
41
- * - {@link LanguageClientTextShadow} (`__shadow`), a self-contained,
42
- * separately-tested diff/apply-verify abstraction that owns its own baseline
43
- * text; folding its storage here would couple a clean utility to this record
44
- * for no real gain.
45
- */
46
- interface DocumentTracking {
47
- /** Client ids currently holding this document open (multi-client membership). */
48
- readonly clients: Set<string>;
49
- /** Author of each version, sparse-indexed by the SHARED (server-assigned) version number. */
50
- readonly versionAuthors: string[];
51
- /**
52
- * Last version id each client declared for this document (didOpen baseline,
53
- * advanced by every accepted didChange). Client version ids are CLIENT-owned
54
- * per LSP (Monaco numbers its own buffer) and are used ONLY for this
55
- * per-client staleness guard — they never leak into the shared version
56
- * sequence, which the server assigns (see {@link HydraniumTextDocuments.__versionSequences}).
57
- */
58
- readonly clientVersions: Map<string, number>;
59
- /** Content staged by integrity rules for a closed document. Consumed on next open. */
60
- pendingContent?: string;
61
- /**
62
- * The URI(s) the LSP textual language client opened this (canonically-keyed)
63
- * document under. Usually one; a set because the same physical file can be
64
- * opened under more than one URI (a symlink path and its real path). This is
65
- * the egress address: `applyEditToLanguageClient`
66
- * targets these, since the document is *keyed* by its canonical identity but
67
- * Monaco holds it under the URI it opened. Lifecycle-bound — cleared with the
68
- * record on last close.
69
- */
70
- languageClientUris?: Set<LanguageClientUri>;
54
+ /** Delivered by {@link HydraniumTextDocuments.onDidSaveInLanguageClient}. */
55
+ export interface LanguageClientSavedEvent {
56
+ readonly uri: string;
57
+ }
58
+ /** Delivered by {@link HydraniumTextDocuments.onDidReleaseDocument}. */
59
+ export interface DocumentReleasedEvent {
60
+ readonly uri: CanonicalUri;
71
61
  }
72
62
  /**
73
63
  * A document held open by at least one client, with the client ids holding it —
@@ -80,153 +70,93 @@ export interface OpenDocument {
80
70
  readonly clients: readonly string[];
81
71
  }
82
72
  /**
83
- * Where a URI's shared version sequence left off — written once at last-client
84
- * close, consulted at the next open so the sequence CONTINUES instead of
85
- * restarting at whatever version id the reopening client declares. One entry
86
- * of {@link HydraniumTextDocuments.__versionSequences}.
87
- */
88
- interface VersionSequence {
89
- /** The shared version at last-client close. */
90
- readonly version: number;
91
- /** {@link contentHash} of the synced text at last-client close. */
92
- readonly contentHash: string;
93
- }
94
- /**
95
- * One text pushed to the LSP textual language client by
96
- * {@link HydraniumTextDocuments.applyEditToLanguageClient} whose echo has not
97
- * come back yet. One entry of {@link HydraniumTextDocuments.__pendingPushes}.
98
- */
99
- interface PendingPush {
100
- /**
101
- * The text the client held BEFORE this push — the shadow baseline the
102
- * push's edits were diffed against, and therefore the text the client's
103
- * echo addresses with its ranges.
104
- *
105
- * `undefined` when the push was a full replace sent with no baseline (a
106
- * first sync, or the recovery push after a rejection). There is then no
107
- * knowing what the client held, so the echo is reconstructed against the
108
- * synced text instead — which is sound for a full replace, whose
109
- * application is position-independent.
110
- */
111
- readonly before: string | undefined;
112
- /** {@link contentHash} of the text this push moves the client to. */
113
- readonly afterHash: string;
114
- }
115
- /**
116
- * What an incoming language-client change turns out to be once reconstructed
117
- * against the pushes still in flight — the return of
118
- * {@link HydraniumTextDocuments.classifyLanguageClientChange}.
119
- */
120
- type LanguageClientChangeOrigin =
121
- /** The client is reporting a text we pushed it. The synced document is already there. */
122
- {
123
- readonly kind: 'echo';
124
- }
125
- /**
126
- * The client's buffer has moved somewhere we did not push it — it coalesced
127
- * a genuine keystroke into the echo, or typed before the push arrived. The
128
- * reconstructed text is what it now holds, and is authoritative.
73
+ * What {@link HydraniumTextDocuments.commitRepair} did with an integrity repair.
74
+ *
75
+ * Three outcomes rather than a document-or-nothing, because the two ways of
76
+ * getting nothing call for opposite responses: `not-open` means there is no
77
+ * store document to correct and the caller carries on with the one it holds,
78
+ * while `stale` means there IS one and it has moved past the text the repair
79
+ * was computed against — so carrying on would persist a correction over an edit
80
+ * that superseded it. Collapsing them lets the second read as permission to
81
+ * proceed, which is the failure this shape exists to make unrepresentable.
129
82
  */
130
- | {
131
- readonly kind: 'divergent';
132
- readonly text: string;
83
+ export type RepairCommit<T extends TextDocument> = {
84
+ readonly status: 'committed';
85
+ readonly document: T;
86
+ } | {
87
+ readonly status: 'stale';
88
+ } | {
89
+ readonly status: 'not-open';
133
90
  };
134
91
  /**
135
- * Multi-client text-document tracking on top of Langium's `NormalizedTextDocuments`.
92
+ * The one text store every head writes to, on top of Langium's
93
+ * `NormalizedTextDocuments`, and the LSP text-sync endpoint: every
94
+ * `textDocument/*` notification and every `workspace/applyEdit` push goes
95
+ * through here.
96
+ *
97
+ * Each open, change, close and save is one synchronous transition over the
98
+ * held document and the collaborators its `create…` methods build. A
99
+ * collaborator that defers its part lets a listener of the transition's event
100
+ * read state from before it. A document no client holds any more is
101
+ * released to the `DocumentReleaseHandler` slot, after
102
+ * {@link HydraniumTextDocumentsOptions.releaseGraceMs} when its last client's
103
+ * connection was lost.
136
104
  *
137
- * Adds the framework features used by the integrity, model-server, and GLSP layers:
138
- * - Per-document client membership (multiple clients can attach to the same URI).
139
- * - A SERVER-OWNED shared version sequence: per-URI, monotonic across
140
- * close/reopen cycles, advancing exactly when the synced content changes.
141
- * Client-declared version ids (Monaco's buffer numbering) feed only a
142
- * per-client staleness guard and never leak into the shared sequence —
143
- * the two are different things (an editor's edit-operation counter vs the
144
- * document's content-revision number), and splicing them lets versions drift
145
- * silently past `baseVersion` gate holders.
146
- * - Version-author history so each edit is attributable to its originating client.
147
- * - Pending-content staging used by the integrity service to thread corrections
148
- * through `workspace/applyEdit` cycles for currently-closed documents.
149
- * - `didOpen` notifications arriving over the LSP connection wait on the
150
- * workspace-ready promise, so a client's first open cannot race workspace
151
- * discovery. Direct {@link notifyDidOpenTextDocument} calls (the non-LSP
152
- * heads) do not pass that gate — their caller owns the ordering.
105
+ * Client-declared version ids feed only the per-client staleness guard and
106
+ * never a running shared sequence: the two count different things, and
107
+ * splicing them lets versions drift past base-version gate holders. A URI
108
+ * with no ledger record and no built root starts at its opener's declared id:
109
+ * no version was handed out for it.
110
+ *
111
+ * `didOpen` notifications arriving over the LSP connection wait on the
112
+ * workspace-ready promise, so a client's first open cannot race workspace
113
+ * discovery. Direct {@link notifyDidOpenTextDocument} calls (the non-LSP
114
+ * heads) do not pass that gate — their caller owns the ordering.
153
115
  */
154
116
  export declare class HydraniumTextDocuments<T extends TextDocument = TextDocument> extends NormalizedTextDocuments<T> {
155
117
  protected services: ServerSharedServices;
118
+ protected readonly options: HydraniumTextDocumentsOptions<T>;
119
+ /** Content staged by integrity rules for a document no client holds, consumed by its first open. */
120
+ protected readonly __pendingContent: Map<CanonicalUri, string>;
156
121
  /**
157
- * Per-URI client-facing tracking ({@link DocumentTracking}): client
158
- * membership, version-author history, and integrity-staged pending content,
159
- * keyed by normalized URI. One record per URI so the last-client close clears
160
- * every axis atomically. The language-client diff baseline stays in
161
- * {@link __shadow} (its own abstraction); the parsed-document store stays in
162
- * the inherited `__syncedDocuments`.
163
- */
164
- protected __documents: Map<CanonicalUri, DocumentTracking>;
165
- /**
166
- * Per-URI shared-version continuity across close/reopen cycles
167
- * ({@link VersionSequence}), written at last-client close and consulted by
168
- * the next first-client open. DELIBERATELY outside {@link DocumentTracking}:
169
- * that record is deleted on last close, while the version sequence must
170
- * survive it — the shared version is a server-owned, monotonic,
171
- * advances-iff-content-changes counter that never resets while the server
172
- * lives. That invariant is what makes an optimistic `baseVersion` gate
173
- * sound: "version unchanged ⇔ content unchanged", with no false conflicts
174
- * from close/reopen version resets and no false passes from a reopened
175
- * sequence coincidentally landing on a stale writer's number.
176
- *
177
- * Never pruned: two small values per URI ever touched — bounded by
178
- * workspace size, not by activity.
122
+ * Which client has which document open, which client ids are registered
123
+ * sessions, and each client's declared version, the staleness guard's
124
+ * baseline. Every open-state predicate on this class reads it, so an open
125
+ * recorded anywhere else is invisible to the last-close transition.
179
126
  */
180
- protected readonly __versionSequences: Map<CanonicalUri, VersionSequence>;
181
- /**
182
- * Texts pushed to the LSP textual language client via
183
- * {@link applyEditToLanguageClient} whose echoes have not come back yet
184
- * ({@link PendingPush}), keyed like the shadow by language-client URI.
185
- * Outbound pushes and inbound echoes are uncorrelated on the wire; this
186
- * FIFO is the explicit correlation, and it is what
187
- * {@link classifyLanguageClientChange} reconstructs against.
188
- *
189
- * **Each entry keeps the client's PRE-push text, not only a hash of the
190
- * post-push one.** A hash alone can classify a full-text echo, whose
191
- * application is a no-op either way — and that is all it ever classified,
192
- * because a conforming client echoes INCREMENTAL ranges keyed to its
193
- * previous buffer. Those ranges cannot be applied to the synced text (which
194
- * the authored write already advanced) and cannot be reconstructed without
195
- * the baseline: the line they insert lands twice, validates cleanly, and
196
- * compounds on every later edit.
197
- *
198
- * Lifecycle: entries are consumed by the matching echo (together with any
199
- * older entries it supersedes), and the whole queue drops when the client
200
- * stops being a pure mirror — a divergent change, an `applyEdit`
201
- * failure/rejection (shadow invalidation), a close, or an explicit
202
- * shadow (re)baseline. {@link PENDING_ECHO_CAP} bounds the queue against
203
- * a pathological echo that never arrives; the memory cost until then is
204
- * one pre-push text per in-flight push, for milliseconds.
205
- */
206
- protected readonly __pendingPushes: Map<LanguageClientUri, PendingPush[]>;
207
- /**
208
- * Tracked text content per URI for the LSP textual language client (Monaco / VS Code).
209
- * Owned here so {@link applyEditToLanguageClient} can compute minimal `workspace/applyEdit`
210
- * diffs instead of full-document replaces (5–20 s → <500 ms on 20-30 KB YAML diagrams).
211
- *
212
- * Auto-tracked from the multi-client text-document events: open / change / close of
213
- * the language client (re)baseline or invalidate the shadow. Other client ids
214
- * (form editor, GLSP, integrity) do NOT touch the shadow — only what Monaco believes
215
- * it has matters for the diff.
216
- *
217
- * Apply-verify safety net is built in: if the diff doesn't reconstruct `newText`
218
- * exactly, {@link LanguageClientTextShadow.computeEdits} falls back to a full-range
219
- * replace and invokes the `onFallback` callback — a diff regression becomes log
220
- * noise, not a 0-byte save.
221
- *
222
- * Assigned in the constructor body so the `onFallback` callback can capture
223
- * `this.logger` after the parameter-property assignment has run (field
224
- * initializers fire BEFORE parameter-property assignment in TS).
225
- */
226
- protected readonly __shadow: LanguageClientTextShadow;
127
+ protected readonly __sessions: ClientSessionRegistry;
128
+ /** The version each open document was opened at; see {@link openedVersion}. */
129
+ protected readonly __openedVersions: Map<CanonicalUri, number>;
227
130
  protected readonly tracer: Tracer;
228
131
  protected readonly configuration: TextDocumentsConfiguration<T>;
132
+ protected __textLedger: TextLedger | undefined;
133
+ protected __languageClientShadow: LanguageClientShadow | undefined;
134
+ protected __dirtyStateTracker: DirtyStateTracker | undefined;
135
+ protected __documentReleaseScheduler: DocumentReleaseScheduler | undefined;
136
+ protected readonly documentReleasedEmitter: Emitter<DocumentReleasedEvent>;
137
+ protected readonly languageClientSavedEmitter: Emitter<LanguageClientSavedEvent>;
229
138
  constructor(services: ServerSharedServices, options?: HydraniumTextDocumentsOptions<T>);
139
+ protected get textLedger(): TextLedger;
140
+ protected get languageClientShadow(): LanguageClientShadow;
141
+ protected get dirtyStateTracker(): DirtyStateTracker;
142
+ protected get documentReleaseScheduler(): DocumentReleaseScheduler;
143
+ protected createTextLedger(): TextLedger;
144
+ protected createLanguageClientShadow(): LanguageClientShadow;
145
+ protected createDirtyStateTracker(): DirtyStateTracker;
146
+ protected createDocumentReleaseScheduler(): DocumentReleaseScheduler;
147
+ /** Hold `document` as the text of `key`, a new version authored by `author`. */
148
+ protected commitText(key: CanonicalUri, document: T, author: string): void;
149
+ /**
150
+ * Apply `changes` to `document`, the held text of `key`, and hold the
151
+ * result. The version steps only when the text changes, which is what a
152
+ * base-version gate relies on: unchanged text keeps its version and its
153
+ * author. The new text is known only once the changes are applied, so they
154
+ * go in at a tentative step that an identical result rolls back.
155
+ */
156
+ protected commitChange(key: CanonicalUri, document: T, changes: TextDocumentContentChangeEvent[], author: string): {
157
+ document: T;
158
+ changed: boolean;
159
+ };
230
160
  create(uri: string, languageId: string, version: number, content: string): T;
231
161
  update(document: T, changes: TextDocumentContentChangeEvent[], version: number): T;
232
162
  protected get __syncedDocuments(): Map<string, T>;
@@ -254,17 +184,81 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
254
184
  * A content-identical write still fires the change event (rebuild): the
255
185
  * authored write's server-side rebuild is correctness-bearing, it just
256
186
  * mints no new version — nothing observable changed, so watchers'
257
- * `baseVersion` pointers stay valid.
187
+ * base versions stay valid.
258
188
  *
259
189
  * Returns the resulting shared version. Throws when the document is not
260
190
  * open — callers (`AstDocumentManager.update`) open first.
261
191
  */
262
- applyContentChange(uri: DocumentUri, text: string, clientId: string): number;
263
- notifyDidCloseTextDocument(event: DidCloseTextDocumentParams, clientId?: string): void;
192
+ applyContentChange(uri: DocumentUri, text: string, clientId: string): TextVersion;
193
+ /**
194
+ * Close `clientId`'s open of the document. When it was the last open, the
195
+ * document is released, at once or, for a `'lost'`
196
+ * close, after {@link HydraniumTextDocumentsOptions.releaseGraceMs}.
197
+ */
198
+ notifyDidCloseTextDocument(event: DidCloseTextDocumentParams, clientId?: string, cause?: SessionEndCause): void;
199
+ /**
200
+ * Keep the document, text and all, for the release grace, then release it.
201
+ * The document stays in the store meanwhile, so a lost client that opens it
202
+ * again within its own grace attaches to it and finds its unsaved text
203
+ * rather than reading disk; see {@link resolveDeferredRelease} for any other
204
+ * open.
205
+ */
206
+ protected deferRelease(uri: CanonicalUri): void;
207
+ /** Resolve a deferred release of `uri` for an open by `clientId`: a release the scheduler decides on runs now. */
208
+ protected resolveDeferredRelease(uri: CanonicalUri, clientId: string): void;
209
+ /**
210
+ * Drop the document no client has open any more, announce it on
211
+ * {@link onDidReleaseDocument}, then hand it to the
212
+ * `DocumentReleaseHandler` slot: its listeners, such as the update
213
+ * handler dropping a change it still holds back, act before any build the
214
+ * handler runs.
215
+ */
216
+ protected releaseDocument(uri: CanonicalUri): void;
217
+ /**
218
+ * Call the `DocumentReleaseHandler` slot, and announce a document released
219
+ * dirty clean once the promise it returns settles, which is after the
220
+ * release event. A failure is logged rather than thrown: the store has let
221
+ * go of the document by now, and a throw would abort the transition that
222
+ * released it, a session's close of its other documents included.
223
+ */
224
+ protected handOverRelease(released: ReleasedDocument, cleanAnnouncement: CleanAnnouncement | undefined): void;
225
+ /** `uri` as the `DocumentReleaseHandler` slot receives it. */
226
+ protected toReleasedDocument(uri: CanonicalUri): ReleasedDocument;
264
227
  notifyWillSaveTextDocument(event: WillSaveTextDocumentParams): void;
265
228
  notifyWillSaveTextDocumentWaitUntil(event: WillSaveTextDocumentParams, token: CancellationToken): HandlerResult<TextEdit[], void>;
229
+ /**
230
+ * Handle a save the language client reports: fire
231
+ * {@link onDidSaveInLanguageClient}, then announce it on {@link onDidSave}
232
+ * only once the file read back from disk holds the store's current text.
233
+ */
234
+ protected notifyLanguageClientSave(event: DidSaveTextDocumentParams): Promise<void>;
235
+ /**
236
+ * Announce a save the server made. `event.text`, when given, is what the
237
+ * file now holds, written or found there, and becomes the disk baseline
238
+ * before the save is announced. It lags the store when an edit landed
239
+ * after the save took its text, and the document then stays dirty.
240
+ */
266
241
  notifyDidSaveTextDocument(event: DidSaveTextDocumentParams, clientId?: string): void;
242
+ /** Fire {@link onDidSave} for `document`, which need not be synced any more. */
243
+ protected announceSave(document: T, clientId: string): void;
267
244
  notifyDidOpenTextDocument(event: DidOpenTextDocumentParams, clientId?: string): void;
245
+ /**
246
+ * Record `clientId` as an additional holder of a document another client
247
+ * already has open.
248
+ *
249
+ * Unlike the attach branch of {@link notifyDidOpenTextDocument} this does
250
+ * not refresh. That branch re-renders an attaching TEXTUAL view; a client
251
+ * reaching a document through a non-textual route has nothing to re-render,
252
+ * and refreshing per attach turns each into a Langium rebuild and dependent
253
+ * relink cascade.
254
+ *
255
+ * Returns whether a hold was added — `false` when `uri` is not open,
256
+ * `clientId` already holds it, or the document was waiting out the release
257
+ * grace for other clients and was released instead (see
258
+ * {@link resolveDeferredRelease}); the caller then opens it anew.
259
+ */
260
+ attachClient(uri: DocumentUri, clientId: string): boolean;
261
+ protected logClientJoined(uri: DocumentUri, clientId: string, version: number, existingClients: readonly string[]): void;
268
262
  refreshContent(uri: DocumentUri, clientId: string): void;
269
263
  /**
270
264
  * The canonical key a document is stored under — the single point this store
@@ -273,7 +267,7 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
273
267
  * two URIs for one physical file (a symlink path and its real path) into a
274
268
  * single registration — dedup at the editor layer, not just in
275
269
  * `LangiumDocuments`. The URI the client opened under is preserved separately
276
- * for egress addressing (see {@link DocumentTracking.languageClientUris}). The
270
+ * for egress addressing, by the {@link LanguageClientShadow}. The
277
271
  * policy is always bound (the framework defaults it to
278
272
  * `DefaultDocumentUriPolicy`, where canonical ≡ syntactic normalize).
279
273
  */
@@ -287,8 +281,6 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
287
281
  * from its real path (symlink / `..` / case).
288
282
  */
289
283
  protected toLanguageClientUri(uri: string): LanguageClientUri;
290
- /** Get-or-create the per-URI tracking record. `uri` must already be a {@link documentKey}. */
291
- protected trackingFor(uri: CanonicalUri): DocumentTracking;
292
284
  setAuthor(uri: DocumentUri, version: number, author: string): void;
293
285
  /**
294
286
  * Resolve the synced `TextDocument` for `uri`. The store keys documents by
@@ -309,50 +301,107 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
309
301
  get(uri: DocumentUri): T | undefined;
310
302
  /**
311
303
  * Current SHARED version of the document at `uri`: the open document's
312
- * version, else where the persisted sequence left off at last close, else
313
- * `0` for a URI this store has never seen. The shared sequence is
304
+ * version, else where its persisted sequence left off, else `0` for a URI
305
+ * this store has never seen. The shared sequence is
314
306
  * server-owned and monotonic across close/reopen cycles, and advances
315
307
  * exactly when the synced content changes — which is what makes it a sound
316
- * optimistic-concurrency token (`baseVersion` gates): version unchanged ⇔
308
+ * optimistic-concurrency token (base-version gates): version unchanged ⇔
317
309
  * content unchanged.
318
310
  */
319
- version(uri: DocumentUri): number;
311
+ version(uri: DocumentUri): TextVersion;
312
+ /**
313
+ * The version the document at `uri` was opened at, which a client's write
314
+ * or an integrity repair steps past; `undefined` while it is not open.
315
+ */
316
+ openedVersion(uri: DocumentUri): TextVersion | undefined;
317
+ /**
318
+ * The text the store holds for `uri`: an open document's, or for a closed
319
+ * one, the clean text its version sequence left off at, which for a deleted
320
+ * document is its last text. `undefined` for a URI no build and no client
321
+ * gave the store.
322
+ */
323
+ textState(uri: DocumentUri): TextState | undefined;
324
+ /**
325
+ * The built root's recorded version for a first open of `key` with `text`,
326
+ * one on when the text differs from the root's; `undefined` when the root
327
+ * records no store version. Seeded from the opener's declared version
328
+ * instead, a write based on the built root passes the gate over other text,
329
+ * and the same text looks newer than its model. A built root records none
330
+ * only under a `LangiumDocuments` that does not reconcile at registration.
331
+ */
332
+ protected builtRootOpeningVersion(key: CanonicalUri, text: string): TextVersion | undefined;
320
333
  /**
321
334
  * Reconcile the persisted version sequence with content that reached the
322
335
  * build OUTSIDE the store's write paths — a closed document rebuilt from
323
- * disk (last-close revert) or replaced by a watched-file change. Steps the
336
+ * disk after its release, or replaced by a watched-file change. Steps the
324
337
  * sequence iff `text` differs from the sequence's last-known content and
325
338
  * returns the resulting sequence version so the caller can re-stamp the
326
- * rebuilt document (see the `AstDocumentManager` Parsed-phase listener) —
339
+ * rebuilt document (`VersionSyncService.modelProduced`) —
327
340
  * keeping the "version advances iff content changes" invariant for
328
341
  * documents no client currently holds.
329
342
  *
330
- * Returns `undefined` — and does nothing — when the document is open (the
331
- * store's own content is authoritative; external transitions never reach
332
- * the Langium factory for open documents) or was never tracked (no gate
333
- * holder can hold a version pointer for it, and the early exit keeps
334
- * workspace-wide builds from hashing every untouched document).
343
+ * For an open document, its version when it holds `text`, since a build
344
+ * that read the file while the document was closed can finish after an
345
+ * open; else `undefined`, and the caller has to build the document again.
346
+ *
347
+ * A document without a sequence starts one at `0` with `text`: snapshots
348
+ * hand out versions for documents no client opened, so an uncounted change
349
+ * would let a write based on the old text pass the gate.
335
350
  */
336
351
  reconcileExternalContent(uri: DocumentUri, text: string): number | undefined;
352
+ /**
353
+ * Commit an integrity repair into the OPEN document for `uri`, returning the
354
+ * document that now holds it, or `undefined` when there was nothing here to
355
+ * commit into.
356
+ *
357
+ * The one thing this exists to do is address the store BY URI. A repair
358
+ * reaches the resync as a text-document object, and that object is the
359
+ * store's own only on the LSP path; a document built for an already-open URI
360
+ * through `LangiumDocumentFactory.fromString` carries its own, so writing the
361
+ * repair into it corrects a copy the store does not know about and the editor
362
+ * never sees.
363
+ *
364
+ * `parsedFrom` is the text the repaired AST was parsed from, and a mismatch
365
+ * against the current content REFUSES the commit: the store has moved on,
366
+ * which means an editor change landed after that parse, and committing would
367
+ * overwrite a newer edit with a repair computed against text the user has
368
+ * already replaced. The build that change provokes recomputes the repair.
369
+ *
370
+ * Deliberately NOT compared by version. A separately created document seeds
371
+ * its own numbering, so requiring the two to agree would refuse every commit
372
+ * on the path this exists for. Content is the thing both sides can be held to.
373
+ *
374
+ * A changed text is a new version authored by {@link INTEGRITY_CLIENT_ID}.
375
+ * Kept at the old version, the repair is invisible to every reader keyed on
376
+ * versions: a write based on the unrepaired version passes the base-version gate
377
+ * and replaces the repair, and an echo filter credits the repair to the
378
+ * client whose edit it corrected. No change event is fired: the repair
379
+ * rides the build already under way, and an event would re-enter it.
380
+ */
381
+ commitRepair(uri: DocumentUri, parsedFrom: string, repaired: string): RepairCommit<T>;
337
382
  getAuthor(uri: DocumentUri, version?: number): string | undefined;
338
383
  isOpen(uri: DocumentUri): boolean;
339
384
  /**
340
385
  * True iff any client still holds `uri` open. Distinct from {@link isOpen},
341
386
  * which reads `__syncedDocuments` — that map is cleared only AFTER the
342
387
  * `onDidClose` event fires for the last client, so `isOpen` returns `true`
343
- * during the close event itself. `isOpenInAnyClient` reads the tracking
344
- * record's `clients` set, which is updated BEFORE the fire, so an `onDidClose`
345
- * subscriber that finds this `false` knows the last client just closed and a
346
- * disk re-read / rebuild can proceed.
388
+ * during the close event itself. `isOpenInAnyClient` reads the open table
389
+ * ({@link __sessions}), which is updated BEFORE the fire, so an `onDidClose`
390
+ * subscriber that finds this `false` knows the last client just closed.
391
+ * What the build keeps is the release's: a subscriber that re-read or
392
+ * rebuilt the document would race the `DocumentReleaseHandler`, and after a
393
+ * lost connection the release waits out its grace.
347
394
  */
348
395
  isOpenInAnyClient(uri: DocumentUri): boolean;
349
396
  isOpenInClient(uri: DocumentUri, client: string): boolean;
350
397
  isOpenInLanguageClient(uri: DocumentUri): boolean;
398
+ /** The clients that have `uri` open, in the order they opened it. */
399
+ clientsOf(uri: DocumentUri): string[];
351
400
  isOnlyOpenInClient(uri: DocumentUri, client: string): boolean;
352
401
  /**
353
402
  * Every document currently held open by at least one client, with the client
354
- * ids holding it. Reads the same per-URI tracking records as
355
- * {@link isOpenInAnyClient}, so it reflects a last-client close immediately.
403
+ * ids holding it. Reads the same open table as {@link isOpenInAnyClient}, so
404
+ * it reflects a last-client close immediately.
356
405
  *
357
406
  * Diagnostics-oriented — the server-state snapshot lists these so an operator
358
407
  * can see WHY a document is pinned: a document that lingers here after its
@@ -360,19 +409,133 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
360
409
  * under a shedding policy, explains why its CST is never shed).
361
410
  */
362
411
  openDocuments(): OpenDocument[];
412
+ /** Fires once a client session has ended, after every document it had open was closed. */
413
+ get onDidCloseSession(): Event<ClientSessionClosedEvent>;
414
+ /**
415
+ * Fires once a document no client has open is released: at its last close,
416
+ * or, for a lost client's last close, when its release grace runs out,
417
+ * another client opens it, or it is deleted, before the
418
+ * `DocumentReleaseHandler` slot is handed the document.
419
+ */
420
+ get onDidReleaseDocument(): Event<DocumentReleasedEvent>;
363
421
  /**
364
- * Stages integrity-updated content for a closed document.
422
+ * Fires for every save the language client reports of a document it has
423
+ * open: the editor has written the file. {@link onDidSave} follows only
424
+ * when the file holds the store's text.
425
+ */
426
+ get onDidSaveInLanguageClient(): Event<LanguageClientSavedEvent>;
427
+ /**
428
+ * Whether `uri` is waiting out the release grace: its last open closed with a
429
+ * lost connection, and it still holds its unsaved text. Such a document is
430
+ * open for no client, yet not closed either, so a caller that would persist
431
+ * a closed document's text to disk treats it as open.
432
+ */
433
+ isReleaseDeferred(uri: DocumentUri): boolean;
434
+ /**
435
+ * Whether the store holds `uri` with text that differs from its disk
436
+ * baseline: what the server last knew the file to hold. `false` for a URI
437
+ * the store does not hold; a document waiting out the release grace is still
438
+ * held.
365
439
  *
366
- * When `workspace/applyEdit` targets a closed file, the client opens it from
367
- * disk (stale) and sends `didOpen` before applying the edit. This staged
368
- * content is consumed by {@link notifyDidOpenTextDocument} to replace the
369
- * stale disk text, preventing a brief revert of the integrity update.
440
+ * The baseline is the text a first open brought, or what the server wrote,
441
+ * or read back after an editor's save or a watched-file change, so it can
442
+ * trail a change to the file that none of these has seen yet. A check that
443
+ * must know the file reads it instead.
444
+ */
445
+ isDirty(uri: DocumentUri): boolean;
446
+ /**
447
+ * Fires each time the answer of {@link isDirty} changes. For a document
448
+ * released dirty it fires once the `DocumentReleaseHandler` slot reports the
449
+ * release settled: at the version of the text the build then holds, or
450
+ * without text when the document is gone or the handler failed, though
451
+ * {@link isDirty} answers clean from the release on.
452
+ */
453
+ get onDidChangeDirty(): Event<DocumentDirtyChangedEvent>;
454
+ /**
455
+ * Record that the file behind `uri` holds `text`, or no file at all for
456
+ * `undefined`. A no-op for a URI the store does not hold: the next first
457
+ * open sets the baseline from its own text.
458
+ */
459
+ setDiskBaseline(uri: DocumentUri, text: string | undefined): void;
460
+ /**
461
+ * Read the file behind `uri` through its disk queue and take it as the
462
+ * baseline. A file that cannot be read counts as none, the side that
463
+ * leaves the document dirty.
464
+ */
465
+ reloadDiskBaseline(uri: DocumentUri): Promise<void>;
466
+ /**
467
+ * Start a client session under `clientId`. Throws where
468
+ * {@link ClientSessionRegistry.register} refuses the id.
469
+ */
470
+ registerSession(clientId: string): void;
471
+ /**
472
+ * End the client session `clientId`: close every document it has open, then
473
+ * free the id. Immediate — each close runs the ordinary close path before
474
+ * this returns, with `cause` as its cause. A no-op for an id that is not a
475
+ * registered session.
476
+ */
477
+ closeSession(clientId: string, cause?: SessionEndCause): void;
478
+ /**
479
+ * Close every document the language client has open, as a `didClose` for
480
+ * each would, so each last close releases its document. For a host whose editor connection
481
+ * can end while the process lives on, such as a worker whose port's peer
482
+ * closed: the language client is no session, so nothing else closes them.
370
483
  *
371
- * Not cleared on close: pending content is only staged for already-closed
372
- * documents (the integrity service checks `isOpenInLanguageClient` first), so
373
- * a close → stage → open cycle cannot occur. The only scenario where an
374
- * entry lingers is if `workspace/applyEdit` fails and the file is never
375
- * opened — the memory cost is one serialised string per URI.
484
+ * It first waits for the workspace initialization the open handler waits
485
+ * for, so an open that arrived before the close is closed too; closing at
486
+ * once would leave that open to land afterwards, held by a client that is
487
+ * gone.
488
+ */
489
+ closeLanguageClientDocuments(): Promise<void>;
490
+ /**
491
+ * Settles once the initial workspace build has finished, whether it
492
+ * completed, was cancelled or failed. Awaiting `workspaceInitialized` itself
493
+ * throws after a cancelled build, which any write during startup causes, and
494
+ * every open and close gated on it is then dropped for the process lifetime.
495
+ * The workspace manager logs a failed build.
496
+ */
497
+ protected initialBuildFinished(): Promise<void>;
498
+ /**
499
+ * The file behind `uri` was deleted: close every open of it except the
500
+ * language client's.
501
+ *
502
+ * The editor's open is left alone because the editor owns it: it keeps the
503
+ * buffer of a deleted file and goes on sending changes for it, and a store
504
+ * that had closed the document would drop every one of them until the editor
505
+ * reopened.
506
+ */
507
+ notifyDocumentDeleted(uri: DocumentUri): void;
508
+ /**
509
+ * Remove the document for `uri`, closing every open of it first — the
510
+ * editor's included, since the document it would keep editing is gone.
511
+ *
512
+ * The base removes the synced document without consulting the open table,
513
+ * which leaves every open recorded against a document that no longer exists:
514
+ * the store then answers that the URI is open, and the next open attaches to
515
+ * nothing.
516
+ */
517
+ delete(uri: string | URI | T): void;
518
+ /**
519
+ * A client id as log lines print it. An id containing `#` is cut eight
520
+ * characters after its last `#`, which leaves a minted `label#uuid` as the
521
+ * label and enough of the UUID to tell sessions apart; an id without `#`
522
+ * prints whole. The full id goes out at trace level wherever a session
523
+ * starts or ends.
524
+ */
525
+ protected formatClientId(clientId: string): string;
526
+ /**
527
+ * Stages integrity-updated content for a document no client holds.
528
+ *
529
+ * Nothing is pushed to a file no client holds. The next open of it reads
530
+ * disk, which lacks the update; {@link notifyDidOpenTextDocument} takes this
531
+ * staged content in place of that text, and the open's sync then delivers
532
+ * it to an editor as an unsaved change.
533
+ *
534
+ * Only a FIRST open consumes it, so stage only for a URI no client holds
535
+ * ({@link isOpenInAnyClient} is `false`). A URI held only through another
536
+ * head is not closed: an editor attaching to it joins the existing entry and
537
+ * never reads the stage, and the release discards it. An entry waits for
538
+ * that first open, at one serialised string per URI.
376
539
  */
377
540
  stagePendingContent(uri: DocumentUri, text: string): void;
378
541
  /**
@@ -384,98 +547,53 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
384
547
  * - The shared services have no LSP {@link Connection} bound (non-LSP
385
548
  * hosts like CLI / tests).
386
549
  * - The shadow already matches `newText` (no edits needed; quiet skip).
550
+ * - The language client has not opened the document. A client applies an
551
+ * edit to a closed file by opening it, and that open races the edit;
552
+ * the document's own open delivers its text instead.
387
553
  *
388
554
  * On `applyEdit` rejection (`result.applied === false`) or RPC failure the
389
- * shadow is invalidated so the next call sends a full-replace baseline.
555
+ * shadow is invalidated so the next call sends a full replace, or nothing
556
+ * when the client was last heard to hold that text.
390
557
  * Errors are re-thrown — callers wrap with their own retry / coalescing
391
558
  * policy as needed.
392
559
  *
393
560
  * The diff path is apply-verify-safe: the shadow internally checks that
394
561
  * `TextDocument.applyEdits(old, edits) === newText` and falls back to a
395
- * full replace on mismatch (logged via the warn-callback wired in the
396
- * constructor), so a diff regression becomes log noise, not data loss.
562
+ * full replace on mismatch, logged, so a diff regression becomes log noise,
563
+ * not data loss.
397
564
  *
398
565
  * That safety net verifies the diff against the SHADOW, which is what the
399
566
  * client is *believed* to hold — so it cannot see the client's buffer moving
400
567
  * underneath a push. A line-keyed edit is position-dependent: if a genuine
401
- * client keystroke lands between {@link LanguageClientTextShadow.computeEdits}
402
- * and the client applying, the ranges address the wrong lines and splice the
403
- * buffer (observed as a duplicated declaration, which the integrity tier then
568
+ * client keystroke lands between computing the edits and the client
569
+ * applying them, the ranges address the wrong lines and splice the buffer
570
+ * (observed as a duplicated declaration, which the integrity tier then
404
571
  * "repairs" into a suffixed name and persists). The edit is therefore
405
- * addressed at the language client's LAST DECLARED VERSION rather than at
406
- * `null` ("version intentionally unknown"), which is what lets the client
407
- * reject a push its buffer has outrun. On rejection the shadow is invalidated,
572
+ * addressed at the language client's last known version for that URI rather
573
+ * than at `null` ("version intentionally unknown"), which is what lets the
574
+ * client reject a push its buffer has outrun. On rejection the shadow is invalidated,
408
575
  * so the caller's retry is a full-range replace — position-independent, and
409
- * safe to apply to whatever the client now holds.
576
+ * safe to apply to whatever the client now holds — or nothing when the
577
+ * client was last heard to hold that text.
410
578
  */
411
579
  applyEditToLanguageClient(uri: DocumentUri, newText: string, options?: {
412
580
  label?: string;
413
581
  }): Promise<ApplyWorkspaceEditResult | undefined>;
414
582
  /**
415
- * The version the LSP textual language client last declared for `uri`, for
416
- * addressing an outgoing `workspace/applyEdit`.
417
- *
418
- * Client version ids are CLIENT-owned per LSP, so this is the id the client
419
- * itself stamped on its last `didOpen` / `didChange` — never the shared
420
- * server version, which advances on authored writes the client knows nothing
421
- * about and would therefore reject every push.
422
- *
423
- * Falls back to {@link UNKNOWN_CLIENT_VERSION} when the client has never
424
- * declared one, which is the honest answer for a document it has not opened.
425
- * That is also the case in which there is no shadow, so the push is already a
426
- * position-independent full replace and has nothing to gain from a gate.
583
+ * Explicitly baseline the language-client shadow for a URI the client has
584
+ * open, for an adopter that knows what the client holds without a
585
+ * `didChange` saying so (e.g. after a sideband save). Normal didOpen /
586
+ * didChange paths from the LSP language client already auto-track the
587
+ * shadow. A seed for a URI the client has not opened is kept but changes no
588
+ * push, since nothing is pushed there; its open replaces it with the text it
589
+ * declares.
427
590
  */
428
- protected languageClientVersion(uri: DocumentUri): number;
429
- /**
430
- * Append a push to the in-flight queue for `targetUri`
431
- * (see {@link __pendingPushes}). Bounded: beyond
432
- * {@link PENDING_ECHO_CAP} the oldest entry drops with a debug log — an
433
- * echo that far outstanding means the client is not echoing at all, and
434
- * an unbounded queue must not become the leak.
435
- */
436
- protected recordPendingPush(targetUri: LanguageClientUri, before: string | undefined, newText: string): void;
437
- /**
438
- * Decide what an incoming language-client change actually is, by
439
- * reconstructing the client's resulting buffer against the OLDEST push still
440
- * in flight for `clientFacing`.
441
- *
442
- * `undefined` when nothing of ours is in flight, which is the ordinary path:
443
- * the client's ranges then address the synced text and the caller applies
444
- * them to it directly.
445
- *
446
- * **Why the oldest, and why reconstruct at all.** The client applies our
447
- * pushes in order and echoes each against the buffer it held before that
448
- * push, so the first echo to arrive belongs to the oldest entry — a FIFO
449
- * correspondence the queue preserves by consuming from the front. Comparing
450
- * the reconstruction against every pending hash, not only the oldest, is
451
- * what recognises an echo that a newer write already superseded: a rapid
452
- * write sequence can deliver the echo of push N after the store applied
453
- * push N+1, and everything older is then accounted for too.
454
- *
455
- * A reconstruction matching NO pending push means the client's buffer went
456
- * somewhere we did not send it — it coalesced a keystroke into the echo, or
457
- * typed before the push landed. That text is authoritative, and the queue
458
- * drops: the client has stopped being a pure mirror, so no outstanding echo
459
- * can match again. (A push still in flight at that point will be refused by
460
- * the client's own version gate, which invalidates the shadow and makes the
461
- * next sync a position-independent full replace.)
462
- *
463
- * Content equality is a sound echo proof because entries live only between a
464
- * push and its echo — a milliseconds window, never history — and the
465
- * client's `didChange` stream is ordered, so every buffer state arrives in
466
- * mutation order. An UNDO returning the buffer to previously-pushed text is
467
- * therefore never swallowed: the edit that preceded it already emptied the
468
- * queue, so undo revisits PAST states while the queue holds IN-FLIGHT ones.
469
- */
470
- protected classifyLanguageClientChange(clientFacing: LanguageClientUri, document: T, changes: TextDocumentContentChangeEvent[]): LanguageClientChangeOrigin | undefined;
591
+ setLanguageClientText(uri: DocumentUri, text: string): void;
471
592
  /**
472
- * Explicitly baseline the language-client text shadow for a URI. Useful in
473
- * tests and for adopters that need to seed the shadow without going through
474
- * a `didOpen` event (e.g. after a sideband save). Normal didOpen / didChange
475
- * paths from the LSP language client already auto-track the shadow.
593
+ * Drop the shadow baseline for a URI; the next applyEditToLanguageClient
594
+ * sends a full replace, or nothing when the client was last heard to hold
595
+ * that text.
476
596
  */
477
- setLanguageClientText(uri: DocumentUri, text: string): void;
478
- /** Drop the shadow baseline for a URI; the next applyEditToLanguageClient sends a full replace. */
479
597
  invalidateLanguageClientText(uri: DocumentUri): void;
480
598
  protected consumePendingContent(uri: DocumentUri): string | undefined;
481
599
  protected log(uri: DocumentUri, message: string): void;
@@ -486,5 +604,4 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
486
604
  dispose(): void;
487
605
  };
488
606
  }
489
- export {};
490
607
  //# sourceMappingURL=hydranium-text-documents.d.ts.map