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

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 +23 -18
  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
@@ -7,12 +7,18 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
- import type { CanonicalUri } from '@hydranium/protocol';
10
+ import { type CanonicalUri, textHash } from '@hydranium/protocol';
11
11
  import type { ApplyWorkspaceEditResult } from 'vscode-languageserver';
12
- import { Disposable } from 'vscode-languageserver';
12
+ import { Disposable, Emitter } from 'vscode-languageserver';
13
13
  import type { TextDocument } from 'vscode-languageserver-textdocument';
14
14
  import { LANGUAGE_CLIENT_ID } from '../documents/client-ids.js';
15
- import type { ClientTextDocumentChangeEvent, HydraniumTextDocuments } from '../documents/hydranium-text-documents.js';
15
+ import { ClientSessionRegistry } from '../documents/client-session-registry.js';
16
+ import type { DocumentDirtyChangedEvent } from '../documents/dirty-state-tracker.js';
17
+ import type {
18
+ ClientTextDocumentChangeEvent,
19
+ HydraniumTextDocuments,
20
+ DocumentReleasedEvent
21
+ } from '../documents/hydranium-text-documents.js';
16
22
 
17
23
  /** Snapshot of an open document tracked by the stub. */
18
24
  export interface StubTextDocumentEntry {
@@ -27,9 +33,14 @@ export interface StubTextDocumentEntry {
27
33
  * reads from on test paths — the content channel
28
34
  * (`notifyDidChangeTextDocument` / `applyContentChange` / `version` /
29
35
  * `getAuthor`), the open-state probes (`isOpenInLanguageClient` /
30
- * `isOpenInAnyClient` / `openDocuments`), the push channel to the language
31
- * client (`applyEditToLanguageClient` / `stagePendingContent`) and the
32
- * save / close notifications — plus test-only helpers:
36
+ * `isOpenInAnyClient` / `isOpenInClient` / `isReleaseDeferred` /
37
+ * `openDocuments`), the push channel
38
+ * to the language client (`applyEditToLanguageClient` / `stagePendingContent`),
39
+ * the save / close notifications, the dirty state (`isDirty` / `textState` /
40
+ * `onDidChangeDirty` / `setDiskBaseline`, against a baseline {@link seedOpen}
41
+ * sets and a save that carries its text moves), and the client-session table
42
+ * (`registerSession` / `closeSession` / `onDidCloseSession`), which is a real
43
+ * `ClientSessionRegistry` — plus test-only helpers:
33
44
  *
34
45
  * - {@link seedOpen} — pre-populate an open document without firing change
35
46
  * events. Use to set up a baseline version before exercising an `update`.
@@ -66,9 +77,21 @@ export interface StubHydraniumTextDocuments extends Pick<
66
77
  | 'getAuthor'
67
78
  | 'isOpenInLanguageClient'
68
79
  | 'isOpenInAnyClient'
80
+ | 'isReleaseDeferred'
69
81
  | 'applyEditToLanguageClient'
70
82
  | 'stagePendingContent'
71
83
  | 'openDocuments'
84
+ | 'isOpenInClient'
85
+ | 'attachClient'
86
+ | 'registerSession'
87
+ | 'closeSession'
88
+ | 'onDidCloseSession'
89
+ | 'onDidReleaseDocument'
90
+ | 'isDirty'
91
+ | 'textState'
92
+ | 'openedVersion'
93
+ | 'onDidChangeDirty'
94
+ | 'setDiskBaseline'
72
95
  > {
73
96
  /**
74
97
  * Stub-tailored read accessor. Returns just the surface the framework's
@@ -87,28 +110,46 @@ export interface StubHydraniumTextDocuments extends Pick<
87
110
  onDidSave(listener: (event: { document: { uri: string }; clientId: string }) => void): Disposable;
88
111
  /** Real-shaped close subscription — listener gets {@link ClientTextDocumentChangeEvent}. */
89
112
  onDidClose(listener: (event: ClientTextDocumentChangeEvent<TextDocument>) => void): Disposable;
90
- /** Pre-populate an open document without firing change events. */
113
+ /** Pre-populate an open document without firing change events; `text` is also its disk baseline. */
91
114
  seedOpen(uri: string, text: string, clientId: string): void;
92
115
  /** Mark `uri` as open in the LSP textual language client (drives {@link isOpenInLanguageClient}). */
93
116
  seedOpenInLanguageClient(uri: string): void;
94
- /** Synchronously deliver `onDidClose` to subscribers. */
117
+ /**
118
+ * Synchronously deliver `onDidClose` to subscribers, then `onDidReleaseDocument`
119
+ * when no client has `uri` open any more, then the dirty flip of a dropped
120
+ * holder: the real store's order. The stub keeps no release grace and runs
121
+ * no release handler, so the flip comes at once and without text, where the
122
+ * real store announces it once the handler settles, with text while the
123
+ * build still has the document.
124
+ */
95
125
  fireClose(uri: string, clientId: string): void;
96
- /** Drop recorded state. Useful for `beforeEach` resets. */
126
+ /**
127
+ * Drop recorded state. Useful for `beforeEach` resets.
128
+ *
129
+ * Sessions end without announcing it, so a model service built on this
130
+ * stub still holds the handles it started before the reset. Build a fresh
131
+ * service after a reset rather than reusing one across it.
132
+ */
97
133
  reset(): void;
98
134
  readonly changes: readonly StubTextDocumentEntry[];
99
135
  readonly saves: readonly { uri: string; clientId: string }[];
100
136
  /**
101
137
  * Decide what {@link applyEditToLanguageClient} answers, so a suite can drive
102
138
  * the rejection path (`{ applied: false }`) the real client takes when its
103
- * buffer has outrun the version the push was addressed at. The call is still
104
- * recorded in {@link appliedEdits} either way. Defaults to accepting.
139
+ * buffer has outrun the version the push was addressed at. The push is still
140
+ * recorded in {@link appliedEdits} either way. Defaults to accepting; not
141
+ * called for a URI not open in the language client.
105
142
  *
106
143
  * The handler runs INSIDE the call, which is also the only place a suite can
107
144
  * simulate something happening while the push is in flight — a newer settle,
108
145
  * a concurrent client edit.
109
146
  */
110
147
  setApplyEditHandler(handler: (uri: string, text: string) => ApplyWorkspaceEditResult | undefined): void;
111
- /** Replay of every {@link applyEditToLanguageClient} call (the text channel to Monaco). */
148
+ /**
149
+ * Replay of every push {@link applyEditToLanguageClient} sent (the text
150
+ * channel to Monaco): none for a URI not seeded open in the language client,
151
+ * as the real store sends none.
152
+ */
112
153
  readonly appliedEdits: readonly { uri: string; text: string; label?: string }[];
113
154
  /** Replay of every {@link stagePendingContent} call (the not-yet-open staging path). */
114
155
  readonly staged: readonly { uri: string; text: string }[];
@@ -125,8 +166,37 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
125
166
  let applyEditHandler: (uri: string, text: string) => ApplyWorkspaceEditResult | undefined = () => ({ applied: true });
126
167
  const saveListeners: Array<(event: { document: { uri: string }; clientId: string }) => void> = [];
127
168
  const closeListeners: Array<(event: ClientTextDocumentChangeEvent<TextDocument>) => void> = [];
169
+ // The real registry, so the session table, the opens and the closing state
170
+ // behave as the store's do. The stub's plain-string keys
171
+ // stand in for canonical URIs (one stub-boundary cast, like `fireClose`).
172
+ const sessions = new ClientSessionRegistry();
173
+ const key = (uri: string): CanonicalUri => uri as CanonicalUri;
174
+ const documentReleased = new Emitter<DocumentReleasedEvent>();
175
+ const baselines = new Map<string, string | undefined>();
176
+ const openedVersions = new Map<string, number>();
177
+ const dirty = new Set<string>();
178
+ const dirtyChanged = new Emitter<DocumentDirtyChangedEvent>();
179
+ // As the real store: dirty while held with text other than the baseline,
180
+ // announced only when the answer changes.
181
+ const refreshDirty = (uri: string): void => {
182
+ const held = docs.get(uri);
183
+ const now = held !== undefined && held.text !== baselines.get(uri);
184
+ if (now !== dirty.has(uri)) {
185
+ if (now) {
186
+ dirty.add(uri);
187
+ } else {
188
+ dirty.delete(uri);
189
+ }
190
+ // No build behind the stub, so a document no longer held is announced without text.
191
+ dirtyChanged.fire(
192
+ held === undefined
193
+ ? { uri: key(uri) }
194
+ : { uri: key(uri), text: { version: held.version, hash: textHash(held.text), dirty: now } }
195
+ );
196
+ }
197
+ };
128
198
 
129
- return {
199
+ const stub: StubHydraniumTextDocuments = {
130
200
  get changes() {
131
201
  return changes;
132
202
  },
@@ -146,6 +216,13 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
146
216
  version(uri) {
147
217
  return docs.get(uri)?.version ?? 0;
148
218
  },
219
+ openedVersion(uri) {
220
+ return docs.has(uri) ? openedVersions.get(uri) : undefined;
221
+ },
222
+ textState(uri) {
223
+ const held = docs.get(uri);
224
+ return held && { version: held.version, hash: textHash(held.text), dirty: dirty.has(uri) };
225
+ },
149
226
  notifyDidChangeTextDocument(event, clientId = LANGUAGE_CLIENT_ID) {
150
227
  const existing = docs.get(event.textDocument.uri);
151
228
  const next: StubTextDocumentEntry = {
@@ -159,6 +236,7 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
159
236
  }
160
237
  docs.set(event.textDocument.uri, next);
161
238
  changes.push(next);
239
+ refreshDirty(event.textDocument.uri);
162
240
  },
163
241
  applyContentChange(uri, text, clientId) {
164
242
  const existing = docs.get(uri);
@@ -172,9 +250,13 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
172
250
  const next: StubTextDocumentEntry = changed ? { uri, version: existing.version + 1, text, clientId } : existing;
173
251
  docs.set(uri, next);
174
252
  changes.push({ uri, version: next.version, text, clientId });
253
+ refreshDirty(uri);
175
254
  return next.version;
176
255
  },
177
256
  notifyDidSaveTextDocument(event, clientId) {
257
+ if (event.text !== undefined) {
258
+ stub.setDiskBaseline(event.textDocument.uri, event.text);
259
+ }
178
260
  saves.push({ uri: event.textDocument.uri, clientId });
179
261
  for (const listener of saveListeners.slice()) {
180
262
  listener({ document: { uri: event.textDocument.uri }, clientId });
@@ -207,26 +289,61 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
207
289
  isOpenInAnyClient(uri) {
208
290
  return docs.has(uri) || languageClientOpen.has(uri);
209
291
  },
210
- openDocuments() {
211
- // Merge the two seeding channels: `seedOpen` records the holding client
212
- // on the doc entry, `seedOpenInLanguageClient` marks the LSP client.
213
- const clientsByUri = new Map<string, Set<string>>();
214
- for (const [uri, entry] of docs) {
215
- clientsByUri.set(uri, new Set([entry.clientId]));
292
+ isOpenInClient(uri, clientId) {
293
+ return sessions.isOpenIn(key(uri), clientId);
294
+ },
295
+ isReleaseDeferred() {
296
+ // The stub keeps no release grace.
297
+ return false;
298
+ },
299
+ attachClient(uri, clientId) {
300
+ return docs.has(uri) && sessions.addOpen(key(uri), clientId);
301
+ },
302
+ registerSession(clientId) {
303
+ sessions.register(clientId);
304
+ },
305
+ closeSession(clientId, cause) {
306
+ if (!sessions.isRegistered(clientId)) {
307
+ return;
216
308
  }
217
- for (const uri of languageClientOpen) {
218
- const clients = clientsByUri.get(uri) ?? new Set<string>();
219
- clients.add(LANGUAGE_CLIENT_ID);
220
- clientsByUri.set(uri, clients);
309
+ try {
310
+ for (const uri of sessions.beginClose(clientId)) {
311
+ stub.fireClose(uri, clientId);
312
+ }
313
+ } finally {
314
+ sessions.unregister(clientId, cause);
221
315
  }
222
- // The real store keys by canonical identity; the stub's plain-string
223
- // keys stand in for it (single stub-boundary cast, like `fireClose`).
224
- return [...clientsByUri].map(([uri, clients]) => ({ uri: uri as CanonicalUri, clients: [...clients] }));
316
+ },
317
+ get onDidCloseSession() {
318
+ return sessions.onDidCloseSession;
319
+ },
320
+ get onDidReleaseDocument() {
321
+ return documentReleased.event;
322
+ },
323
+ isDirty(uri) {
324
+ return dirty.has(uri);
325
+ },
326
+ get onDidChangeDirty() {
327
+ return dirtyChanged.event;
328
+ },
329
+ setDiskBaseline(uri, text) {
330
+ if (docs.has(uri)) {
331
+ baselines.set(uri, text);
332
+ refreshDirty(uri);
333
+ }
334
+ },
335
+ openDocuments() {
336
+ // From the registry that also answers `isOpenInClient`, which both
337
+ // seeding channels feed, so the two never disagree about an open.
338
+ return sessions.openDocuments();
225
339
  },
226
340
  setApplyEditHandler(handler) {
227
341
  applyEditHandler = handler;
228
342
  },
229
343
  async applyEditToLanguageClient(uri, newText, options): Promise<ApplyWorkspaceEditResult | undefined> {
344
+ if (!languageClientOpen.has(uri)) {
345
+ return undefined;
346
+ }
230
347
  appliedEdits.push({ uri, text: newText, label: options?.label });
231
348
  return applyEditHandler(uri, newText);
232
349
  },
@@ -234,9 +351,13 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
234
351
  staged.push({ uri, text });
235
352
  },
236
353
  seedOpen(uri, text, clientId) {
354
+ sessions.addOpen(key(uri), clientId);
237
355
  docs.set(uri, { uri, version: 1, text, clientId });
356
+ openedVersions.set(uri, 1);
357
+ baselines.set(uri, text);
238
358
  },
239
359
  seedOpenInLanguageClient(uri) {
360
+ sessions.addOpen(key(uri), LANGUAGE_CLIENT_ID);
240
361
  languageClientOpen.add(uri);
241
362
  },
242
363
  fireClose(uri, clientId) {
@@ -244,9 +365,11 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
244
365
  // class: listeners detect the last-close transition by consulting
245
366
  // `isOpenInAnyClient`, which reads the already-decremented state.
246
367
  const holder = docs.get(uri);
247
- if (holder && holder.clientId === clientId) {
368
+ const dropped = holder !== undefined && holder.clientId === clientId;
369
+ if (dropped) {
248
370
  docs.delete(uri);
249
371
  }
372
+ const removed = sessions.removeOpen(key(uri), clientId);
250
373
  if (clientId === LANGUAGE_CLIENT_ID) {
251
374
  languageClientOpen.delete(uri);
252
375
  }
@@ -254,6 +377,13 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
254
377
  for (const listener of closeListeners.slice()) {
255
378
  listener(event);
256
379
  }
380
+ if (removed && !sessions.isOpen(key(uri))) {
381
+ documentReleased.fire({ uri: key(uri) });
382
+ }
383
+ // After the release event, in the order the real store announces them.
384
+ if (dropped) {
385
+ refreshDirty(uri);
386
+ }
257
387
  },
258
388
  reset() {
259
389
  docs.clear();
@@ -262,9 +392,17 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
262
392
  languageClientOpen.clear();
263
393
  appliedEdits.length = 0;
264
394
  staged.length = 0;
395
+ baselines.clear();
396
+ openedVersions.clear();
397
+ dirty.clear();
265
398
  saveListeners.length = 0;
266
399
  closeListeners.length = 0;
267
400
  applyEditHandler = () => ({ applied: true });
401
+ // Cleared in place rather than replaced: a model service built on the
402
+ // stub subscribed to `onDidCloseSession` once, and a new registry would
403
+ // leave that subscription on one nothing fires.
404
+ sessions.clear();
268
405
  }
269
406
  };
407
+ return stub;
270
408
  }
@@ -9,6 +9,7 @@
9
9
 
10
10
  import { type AstNode, type LangiumDocument, type LangiumDocuments, stream, type URI } from '@hydranium/langium';
11
11
  import { makeFakeAstNode, makeFakeDocument, type FakeDocumentOptions } from './fake-document.js';
12
+ import { type AstDiagnostic } from '../langium/validation/document-validator.js';
12
13
 
13
14
  /**
14
15
  * Map-backed stub for Langium's {@link LangiumDocuments} registry. Implements
@@ -31,7 +32,7 @@ import { makeFakeAstNode, makeFakeDocument, type FakeDocumentOptions } from './f
31
32
  * production code reads the slot value through the `LangiumDocuments`
32
33
  * interface and a narrowing cast bridges the stub at the binding site.
33
34
  */
34
- export interface StubLangiumDocuments<TAst extends AstNode = AstNode, TDiagnostic = unknown> extends Pick<
35
+ export interface StubLangiumDocuments<TAst extends AstNode = AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic> extends Pick<
35
36
  LangiumDocuments,
36
37
  'getDocument' | 'hasDocument' | 'getOrCreateDocument' | 'all'
37
38
  > {
@@ -51,7 +52,7 @@ export interface StubLangiumDocuments<TAst extends AstNode = AstNode, TDiagnosti
51
52
  * Build a {@link StubLangiumDocuments}. Seed entries via the optional
52
53
  * `seeds` parameter so simple tests don't need a separate `set` call.
53
54
  */
54
- export function makeStubLangiumDocuments<TAst extends AstNode = AstNode, TDiagnostic = unknown>(
55
+ export function makeStubLangiumDocuments<TAst extends AstNode = AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic>(
55
56
  seeds: ReadonlyArray<{ uri: string | URI; root: TAst; options?: FakeDocumentOptions<TAst, TDiagnostic> }> = []
56
57
  ): StubLangiumDocuments<TAst, TDiagnostic> {
57
58
  const docs = new Map<string, LangiumDocument<TAst>>();
@@ -7,9 +7,10 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
- import type { TransferDiagnostic, TransferElement } from '@hydranium/protocol';
10
+ import type { TransferElement } from '@hydranium/protocol';
11
+ import type { AstDiagnostic } from '../langium/validation/document-validator.js';
11
12
  import type { AstNode } from '@hydranium/langium';
12
- import { ModelService, type ModelServiceOptions } from '../langium/model-service/model-service.js';
13
+ import { DefaultModelService, type ModelService, type ModelServiceOptions } from '../langium/model-service/model-service.js';
13
14
  import type { ServerSharedServices } from '../langium/module.js';
14
15
 
15
16
  /**
@@ -21,9 +22,9 @@ import type { ServerSharedServices } from '../langium/module.js';
21
22
  */
22
23
  class StubModelServiceImpl<
23
24
  TAst extends AstNode,
24
- TDiagnostic extends TransferDiagnostic = TransferDiagnostic,
25
+ TDiagnostic extends AstDiagnostic = AstDiagnostic,
25
26
  TTransfer extends TransferElement = TransferElement
26
- > extends ModelService<TAst, TDiagnostic, TTransfer> {
27
+ > extends DefaultModelService<TAst, TDiagnostic, TTransfer> {
27
28
  constructor(
28
29
  services: ServerSharedServices,
29
30
  protected readonly serializeFn: (uri: string, root: TTransfer) => string,
@@ -40,7 +41,7 @@ class StubModelServiceImpl<
40
41
  /** The type of the model-service test double produced by {@link makeStubModelService}. */
41
42
  export type StubModelService<
42
43
  TAst extends AstNode,
43
- TDiagnostic extends TransferDiagnostic = TransferDiagnostic,
44
+ TDiagnostic extends AstDiagnostic = AstDiagnostic,
44
45
  TTransfer extends TransferElement = TransferElement
45
46
  > = ModelService<TAst, TDiagnostic, TTransfer>;
46
47
 
@@ -52,8 +53,8 @@ export type StubModelService<
52
53
  * `makeTestServices` wires this stub automatically.
53
54
  *
54
55
  * `options` are the framework {@link ModelServiceOptions}, forwarded verbatim, so
55
- * a test can exercise an option-gated code path (`serializeBuilds`, the slow-warn
56
- * threshold) without hand-rolling a subclass just to reach the constructor.
56
+ * a test can exercise an option-gated code path (`allowReentrantBuilds`) without
57
+ * hand-rolling a subclass just to reach the constructor.
57
58
  *
58
59
  * Adopters that need richer override behaviour — the framework's own extension
59
60
  * surface is {@link ModelService.rewriteModel} alongside `serialize` — should
@@ -61,7 +62,7 @@ export type StubModelService<
61
62
  */
62
63
  export function makeStubModelService<
63
64
  TAst extends AstNode,
64
- TDiagnostic extends TransferDiagnostic = TransferDiagnostic,
65
+ TDiagnostic extends AstDiagnostic = AstDiagnostic,
65
66
  TTransfer extends TransferElement = TransferElement
66
67
  >(
67
68
  services: ServerSharedServices,
@@ -7,7 +7,7 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
- import type { SelfSaveRegistry } from '../documents/self-save-registry.js';
10
+ import type { SelfSaveRegistry } from '../langium/workspace/self-save-registry.js';
11
11
 
12
12
  /**
13
13
  * Stub for the framework's {@link SelfSaveRegistry}. Records `register` calls
@@ -29,7 +29,7 @@ export interface StubLanguageDescriptor {
29
29
  * AST `$type`s this language's grammar produces. Synthesised into a minimal
30
30
  * `Grammar` — one entry-less parser rule per type — which is exactly what
31
31
  * `collectProducibleTypes` reads, so type→language routing
32
- * (`buildLanguageTypeIndex`, `DataServer.resolveReferenceLanguage`) resolves
32
+ * (`buildLanguageTypeIndex`, `ExtendedServiceRegistry.getLanguageFor`) resolves
33
33
  * against this stub the same way it does against generated grammars.
34
34
  *
35
35
  * Entry-less on purpose: `reachableParserRules` falls back to every parser
@@ -8,7 +8,7 @@
8
8
  ********************************************************************************/
9
9
 
10
10
  import type { URI } from '@hydranium/langium';
11
- import type { WritableFileSystemProvider } from '../documents/ast-document-manager.js';
11
+ import type { WritableFileSystemProvider } from '../langium/workspace/file-system-provider.js';
12
12
  import type { StubSelfSaveRegistry } from './stub-self-save-registry.js';
13
13
 
14
14
  /**
@@ -8,39 +8,62 @@
8
8
  ********************************************************************************/
9
9
 
10
10
  /**
11
- * Phrases `vscode-jsonrpc` uses when a call loses its connection. Matched on the
12
- * message because the condition surfaces in two different shapes:
11
+ * Phrases that mean a call lost its connection. Matched on the message because
12
+ * the condition surfaces in shapes that share no discriminator:
13
13
  *
14
14
  * - a **throw** from `throwIfClosedOrDisposed` (`Connection is disposed.` /
15
15
  * `Connection is closed.`), a `ConnectionError` raised synchronously by
16
16
  * `sendRequest` / `sendNotification` and by `RemoteConsole.send`;
17
17
  * - a **rejection** of an already-issued request (`Pending response rejected
18
18
  * since connection got disposed`), a `ResponseError` produced when the
19
- * pending-response map is drained on teardown.
19
+ * pending-response map is drained on teardown;
20
+ * - a **write into a destroyed transport** (`Cannot call write after a stream
21
+ * was destroyed`), Node's own error for a message the writer queued before
22
+ * the connection was disposed and flushed after its stream was destroyed.
23
+ * A notification rejects with Node's error itself, which
24
+ * {@link isDestroyedStreamError} catches by its code; a request rejects with
25
+ * a `ResponseError` that copies only the message, so the phrase is needed
26
+ * too.
20
27
  *
21
- * Both are typed, but they are different error classes carrying codes from
22
- * different enums, so no single code check covers both. Kept
23
- * lowercase-normalised and anchored on `connection` so an unrelated "disposed"
24
- * message cannot match.
28
+ * The typed errors come from different classes carrying codes from different
29
+ * enums, so no single code check covers them. Kept lowercase-normalised and
30
+ * anchored on `connection` or `stream` so an unrelated "disposed" message
31
+ * cannot match.
25
32
  */
26
- const CONNECTION_GONE_PATTERNS = [/connection is disposed/, /connection is closed/, /connection got disposed/, /connection got closed/];
33
+ const CONNECTION_GONE_PATTERNS = [
34
+ /connection is disposed/,
35
+ /connection is closed/,
36
+ /connection got disposed/,
37
+ /connection got closed/,
38
+ /after a stream was destroyed/
39
+ ];
40
+
41
+ const DESTROYED_STREAM_CODE = 'ERR_STREAM_DESTROYED';
42
+
43
+ function isDestroyedStreamError(err: unknown): boolean {
44
+ return err instanceof Error && 'code' in err && err.code === DESTROYED_STREAM_CODE;
45
+ }
27
46
 
28
47
  /**
29
48
  * Whether `err` means "the peer is gone", as opposed to a genuine failure of
30
49
  * the operation.
31
50
  *
32
- * The distinction is a **log-severity** one, and it matters because the two are
33
- * indistinguishable at the call site otherwise. Pushing an edit to a language
34
- * client that has already disconnected is a no-op, not a fault — it happens on
35
- * every ordinary shutdown, and reporting it at `error` turns routine teardown
36
- * into something that looks like it needs investigation. A real `applyEdit`
37
- * failure (the client refused, the request malformed) still deserves `error`.
51
+ * The two are indistinguishable at the call site otherwise, and callers act on
52
+ * the answer: a gone peer is logged at `debug` or dropped, a genuine failure is
53
+ * logged at `error` or re-raised as an unhandled rejection. Pushing an edit to
54
+ * a language client that has already disconnected is a no-op, not a fault — it
55
+ * happens on every ordinary shutdown — so a `false` here turns routine teardown
56
+ * into errors that look like they need investigation. A `true` for a real
57
+ * `applyEdit` failure (the client refused, the request malformed) hides it.
38
58
  *
39
59
  * Callers that only need to *survive* a dead connection rather than classify it
40
60
  * should just catch — see `LspLogger.emit`, whose fallback path does exactly
41
61
  * that, since a logger has nowhere to report a logging failure anyway.
42
62
  */
43
63
  export function isConnectionGoneError(err: unknown): boolean {
64
+ if (isDestroyedStreamError(err)) {
65
+ return true;
66
+ }
44
67
  const message = err instanceof Error ? err.message : String(err);
45
68
  const normalized = message.toLowerCase();
46
69
  return CONNECTION_GONE_PATTERNS.some(pattern => pattern.test(normalized));
@@ -44,7 +44,15 @@ export function isCaseInsensitiveFileSystem(): boolean {
44
44
 
45
45
  /** Node `process` lifecycle / error / signal events accepted by {@link onProcessEvent}. */
46
46
  export type ProcessEvent =
47
- 'exit' | 'beforeExit' | 'uncaughtException' | 'unhandledRejection' | 'rejectionHandled' | 'warning' | 'SIGINT' | 'SIGTERM' | 'SIGHUP';
47
+ | 'exit'
48
+ | 'beforeExit'
49
+ | 'uncaughtException'
50
+ | 'unhandledRejection'
51
+ | 'rejectionHandled'
52
+ | 'warning'
53
+ | 'SIGINT'
54
+ | 'SIGTERM'
55
+ | 'SIGHUP';
48
56
 
49
57
  /**
50
58
  * Register a process lifecycle handler (`'exit'`, `'unhandledRejection'`, …) if
@@ -1,101 +0,0 @@
1
- /********************************************************************************
2
- * Copyright (c) 2026 CrossBreeze, EclipseSource and others.
3
- *
4
- * This program and the accompanying materials are made available under the
5
- * terms of the MIT License which is available in the project root.
6
- *
7
- * SPDX-License-Identifier: MIT
8
- ********************************************************************************/
9
- import { type TextEdit } from 'vscode-languageserver';
10
- import { TextDocument } from 'vscode-languageserver-textdocument';
11
- /**
12
- * The minimum surface the shadow needs from a `HydraniumTextDocuments`:
13
- * a `create` method that materialises a fresh text document via the
14
- * configured `TextDocumentsConfiguration`. Declared as a narrow
15
- * structural interface so the manager satisfies it without an explicit
16
- * import (sidestepping the circular `HydraniumTextDocuments → shadow → manager`
17
- * dependency) and so tests can stub it with a minimal object literal.
18
- */
19
- export interface ShadowDocumentSource {
20
- create(uri: string, languageId: string, version: number, content: string): TextDocument;
21
- }
22
- /**
23
- * Whether `edits` is the single full-document replace {@link LanguageClientTextShadow.computeEdits}
24
- * emits when it has no usable baseline.
25
- *
26
- * The distinction matters at the `workspace/applyEdit` egress: a full replace is
27
- * position-INDEPENDENT and therefore lands correctly on any client buffer, while
28
- * a line-keyed diff only lands correctly on the exact text it was diffed
29
- * against. Only the latter needs a client-version gate.
30
- */
31
- export declare function isFullReplace(edits: readonly TextEdit[]): boolean;
32
- /**
33
- * Tracks the text content the language client (typically Monaco) is believed to
34
- * currently hold so outgoing `workspace/applyEdit` requests can ship minimal
35
- * diffs instead of full-document replaces.
36
- *
37
- * Why it matters: a full-range replace on a moderately-sized YAML or DSL source
38
- * forces Monaco to re-tokenise the entire document (observed multi-second hangs
39
- * on large diagrams), whereas line-level diffs usually reduce that to a handful
40
- * of small edits.
41
- *
42
- * Update points the caller is responsible for:
43
- * - {@link computeEdits} after each outgoing server→client sync (updates the shadow optimistically).
44
- * - {@link set} when the server receives a `didChange` from the language client (the client now
45
- * holds that text; we shouldn't resend it).
46
- * - {@link invalidate} when the client rejects an edit (`applied=false`) or a doc is closed —
47
- * the shadow is now stale and the next sync must fall back to a full replace.
48
- */
49
- export declare class LanguageClientTextShadow {
50
- protected onFallback: (uri: string, reason: string) => void;
51
- protected documents: ShadowDocumentSource;
52
- protected shadow: Map<string, string>;
53
- /**
54
- * @param onFallback invoked when {@link computeEdits} falls back to a full-range replace due to
55
- * apply-verify mismatch. Useful for logging regressions.
56
- * @param documents the {@link ShadowDocumentSource} used to materialise the throwaway probe
57
- * document in {@link computeEdits}. In production this is the owning
58
- * `HydraniumTextDocuments` (whose `create` threads through its configured
59
- * `TextDocumentsConfiguration`); tests pass a minimal stub. Routing
60
- * through the manager rather than `TextDocument.create` directly avoids the
61
- * `instanceof FullTextDocument` gate in the bare LSP `TextDocument.update`,
62
- * keeping the verifier honest for adopters with a custom text-document type.
63
- */
64
- constructor(onFallback: (uri: string, reason: string) => void, documents: ShadowDocumentSource);
65
- /** Record the text the language client is known to hold (e.g. after a `didChange` echo). */
66
- set(uri: string, text: string): void;
67
- /**
68
- * The text the language client is believed to hold, or `undefined` when
69
- * there is no baseline (first sync, or after an {@link invalidate}).
70
- *
71
- * Read at the `workspace/applyEdit` egress BEFORE {@link computeEdits},
72
- * which overwrites it: a push's minimal edits are keyed to this text, so an
73
- * echo of that push carries ranges addressing it and nothing else. Losing
74
- * it is what makes an incremental echo unreconstructable, and applying such
75
- * an echo to the already-advanced synced text duplicates every inserted
76
- * line.
77
- */
78
- get(uri: string): string | undefined;
79
- /** Forget the shadow for a URI; next {@link computeEdits} falls back to a full-document replace. */
80
- invalidate(uri: string): void;
81
- /**
82
- * Return the minimal LSP {@link TextEdit}s required to bring the language client's content from
83
- * the tracked shadow to `newText`. Updates the shadow to `newText` so subsequent calls diff
84
- * against it.
85
- *
86
- * - Empty array when the shadow already equals `newText` (caller should skip the RPC).
87
- * - Full-range replace when there is no shadow (first sync or post-{@link invalidate}).
88
- * - Line-level diff otherwise. Before returning, we locally reconstruct `newText` by applying
89
- * the diff to `old`; if that doesn't match, we fall back to a full-range replace and notify
90
- * the fallback callback. This catches any algorithmic regression in {@link diffToEdits}
91
- * without risking client corruption.
92
- */
93
- computeEdits(uri: string, newText: string): TextEdit[];
94
- }
95
- /**
96
- * Convert a {@link diffLines} result to a list of LSP {@link TextEdit}s keyed on line positions
97
- * in the *old* text. Contiguous added/removed hunks are coalesced into a single replace so the
98
- * client sees one edit per changed region.
99
- */
100
- export declare function diffToEdits(oldText: string, newText: string): TextEdit[];
101
- //# sourceMappingURL=language-client-text-shadow.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"language-client-text-shadow.d.ts","sourceRoot":"","sources":["../../src/documents/language-client-text-shadow.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAGlF,OAAO,EAAS,KAAK,QAAQ,EAAY,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAElE;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IAClC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,CAAC;CAC1F;AAKD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,OAAO,CAMjE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,wBAAwB;IAe/B,SAAS,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI;IAC3D,SAAS,CAAC,SAAS,EAAE,oBAAoB;IAf5C,SAAS,CAAC,MAAM,sBAA6B;IAE7C;;;;;;;;;;OAUG;gBAEU,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,EACjD,SAAS,EAAE,oBAAoB;IAG5C,4FAA4F;IAC5F,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAIpC;;;;;;;;;;OAUG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIpC,oGAAoG;IACpG,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7B;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE;CAkBxD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CA+BxE"}