@hydranium/core 1.0.0-next.9 → 1.0.0-next.90

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 (316) hide show
  1. package/lib/documents/ast-document-manager.d.ts +75 -16
  2. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  3. package/lib/documents/ast-document-manager.js +57 -19
  4. package/lib/documents/ast-document-manager.js.map +1 -1
  5. package/lib/documents/client-ids.d.ts +5 -19
  6. package/lib/documents/client-ids.d.ts.map +1 -1
  7. package/lib/documents/client-ids.js +5 -19
  8. package/lib/documents/client-ids.js.map +1 -1
  9. package/lib/documents/hydranium-text-documents.d.ts +55 -21
  10. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  11. package/lib/documents/hydranium-text-documents.js +142 -46
  12. package/lib/documents/hydranium-text-documents.js.map +1 -1
  13. package/lib/documents/language-client-text-shadow.d.ts +41 -9
  14. package/lib/documents/language-client-text-shadow.d.ts.map +1 -1
  15. package/lib/documents/language-client-text-shadow.js +56 -11
  16. package/lib/documents/language-client-text-shadow.js.map +1 -1
  17. package/lib/documents/self-save-registry.d.ts +37 -6
  18. package/lib/documents/self-save-registry.d.ts.map +1 -1
  19. package/lib/documents/self-save-registry.js +28 -15
  20. package/lib/documents/self-save-registry.js.map +1 -1
  21. package/lib/index.d.ts +2 -0
  22. package/lib/index.d.ts.map +1 -1
  23. package/lib/index.js +5 -0
  24. package/lib/index.js.map +1 -1
  25. package/lib/langium/ast-extension/ast-node-builder.d.ts +32 -9
  26. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  27. package/lib/langium/ast-extension/ast-node-builder.js +60 -22
  28. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  29. package/lib/langium/bootstrap.d.ts.map +1 -1
  30. package/lib/langium/bootstrap.js +16 -9
  31. package/lib/langium/bootstrap.js.map +1 -1
  32. package/lib/langium/config/configuration-provider.d.ts +81 -0
  33. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  34. package/lib/langium/config/configuration-provider.js +112 -0
  35. package/lib/langium/config/configuration-provider.js.map +1 -0
  36. package/lib/langium/config/index.d.ts +1 -0
  37. package/lib/langium/config/index.d.ts.map +1 -1
  38. package/lib/langium/config/index.js +1 -0
  39. package/lib/langium/config/index.js.map +1 -1
  40. package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
  41. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  42. package/lib/langium/diagnostics/lsp-logger.js +40 -6
  43. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  44. package/lib/langium/document-builder/build-pipeline-integration.d.ts +13 -1
  45. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  46. package/lib/langium/document-builder/build-pipeline-integration.js +1 -1
  47. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  48. package/lib/langium/document-builder/build-session.d.ts +93 -0
  49. package/lib/langium/document-builder/build-session.d.ts.map +1 -0
  50. package/lib/langium/document-builder/build-session.js +72 -0
  51. package/lib/langium/document-builder/build-session.js.map +1 -0
  52. package/lib/langium/document-builder/document-builder.d.ts +150 -7
  53. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  54. package/lib/langium/document-builder/document-builder.js +298 -11
  55. package/lib/langium/document-builder/document-builder.js.map +1 -1
  56. package/lib/langium/document-builder/index.d.ts +1 -0
  57. package/lib/langium/document-builder/index.d.ts.map +1 -1
  58. package/lib/langium/document-builder/index.js +1 -0
  59. package/lib/langium/document-builder/index.js.map +1 -1
  60. package/lib/langium/integration-services.d.ts +45 -1
  61. package/lib/langium/integration-services.d.ts.map +1 -1
  62. package/lib/langium/integration-services.js +10 -5
  63. package/lib/langium/integration-services.js.map +1 -1
  64. package/lib/langium/integrity/integrity-service.d.ts +5 -0
  65. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  66. package/lib/langium/integrity/integrity-service.js +34 -1
  67. package/lib/langium/integrity/integrity-service.js.map +1 -1
  68. package/lib/langium/keys/containment.d.ts +64 -0
  69. package/lib/langium/keys/containment.d.ts.map +1 -0
  70. package/lib/langium/keys/containment.js +53 -0
  71. package/lib/langium/keys/containment.js.map +1 -0
  72. package/lib/langium/keys/index.d.ts +1 -0
  73. package/lib/langium/keys/index.d.ts.map +1 -1
  74. package/lib/langium/keys/index.js +1 -0
  75. package/lib/langium/keys/index.js.map +1 -1
  76. package/lib/langium/keys/name-based-key-provider.d.ts +4 -0
  77. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  78. package/lib/langium/keys/name-based-key-provider.js +4 -0
  79. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  80. package/lib/langium/model-service/model-service.d.ts +149 -10
  81. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  82. package/lib/langium/model-service/model-service.js +120 -93
  83. package/lib/langium/model-service/model-service.js.map +1 -1
  84. package/lib/langium/module.d.ts +84 -15
  85. package/lib/langium/module.d.ts.map +1 -1
  86. package/lib/langium/module.js +26 -12
  87. package/lib/langium/module.js.map +1 -1
  88. package/lib/langium/naming/name-provider.d.ts +25 -4
  89. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  90. package/lib/langium/naming/name-provider.js +2 -1
  91. package/lib/langium/naming/name-provider.js.map +1 -1
  92. package/lib/langium/naming/name-separator-validation.d.ts +23 -0
  93. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  94. package/lib/langium/naming/name-separator-validation.js +30 -1
  95. package/lib/langium/naming/name-separator-validation.js.map +1 -1
  96. package/lib/langium/residency/cst-residency-service.d.ts +31 -9
  97. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  98. package/lib/langium/residency/cst-residency-service.js +13 -56
  99. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  100. package/lib/langium/scope/hydranium-scope-provider.d.ts +32 -13
  101. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  102. package/lib/langium/scope/hydranium-scope-provider.js +37 -20
  103. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  104. package/lib/langium/service-registry.d.ts +5 -1
  105. package/lib/langium/service-registry.d.ts.map +1 -1
  106. package/lib/langium/service-registry.js +4 -0
  107. package/lib/langium/service-registry.js.map +1 -1
  108. package/lib/langium/shared-services.d.ts +15 -2
  109. package/lib/langium/shared-services.d.ts.map +1 -1
  110. package/lib/langium/shared-services.js.map +1 -1
  111. package/lib/langium/transfer/transfer-encoder.d.ts +60 -17
  112. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  113. package/lib/langium/transfer/transfer-encoder.js +38 -16
  114. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  115. package/lib/langium/validation/document-validator.d.ts +294 -10
  116. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  117. package/lib/langium/validation/document-validator.js +448 -5
  118. package/lib/langium/validation/document-validator.js.map +1 -1
  119. package/lib/langium/workspace/document-uri-policy.d.ts +3 -4
  120. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  121. package/lib/langium/workspace/document-uri-policy.js +3 -4
  122. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  123. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +25 -0
  124. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  125. package/lib/langium/workspace/hydranium-langium-document-factory.js +25 -0
  126. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  127. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +21 -1
  128. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  129. package/lib/langium/workspace/hydranium-workspace-manager.js +28 -0
  130. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  131. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +8 -0
  132. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  133. package/lib/langium/workspace/in-memory-file-system-provider.js +11 -2
  134. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  135. package/lib/langium/workspace/initialize-workspace.d.ts +22 -2
  136. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  137. package/lib/langium/workspace/initialize-workspace.js +13 -5
  138. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  139. package/lib/langium/workspace/langium-documents.d.ts +79 -17
  140. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  141. package/lib/langium/workspace/langium-documents.js +83 -28
  142. package/lib/langium/workspace/langium-documents.js.map +1 -1
  143. package/lib/locale/index.d.ts +10 -0
  144. package/lib/locale/index.d.ts.map +1 -0
  145. package/lib/locale/index.js +10 -0
  146. package/lib/locale/index.js.map +1 -0
  147. package/lib/locale/server-locale.d.ts +73 -0
  148. package/lib/locale/server-locale.d.ts.map +1 -0
  149. package/lib/locale/server-locale.js +61 -0
  150. package/lib/locale/server-locale.js.map +1 -0
  151. package/lib/lsp/hydranium-document-update-handler.js +1 -1
  152. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  153. package/lib/lsp/index.d.ts +1 -1
  154. package/lib/lsp/index.d.ts.map +1 -1
  155. package/lib/lsp/index.js +1 -1
  156. package/lib/lsp/index.js.map +1 -1
  157. package/lib/lsp/lsp-latency.d.ts +39 -0
  158. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  159. package/lib/lsp/lsp-latency.js +58 -0
  160. package/lib/lsp/lsp-latency.js.map +1 -0
  161. package/lib/lsp/semantic-token-provider.d.ts +34 -1
  162. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  163. package/lib/lsp/semantic-token-provider.js +55 -8
  164. package/lib/lsp/semantic-token-provider.js.map +1 -1
  165. package/lib/messages/carriers.d.ts +54 -0
  166. package/lib/messages/carriers.d.ts.map +1 -0
  167. package/lib/messages/carriers.js +62 -0
  168. package/lib/messages/carriers.js.map +1 -0
  169. package/lib/messages/index.d.ts +25 -0
  170. package/lib/messages/index.d.ts.map +1 -0
  171. package/lib/messages/index.js +25 -0
  172. package/lib/messages/index.js.map +1 -0
  173. package/lib/messages/renderer.d.ts +136 -0
  174. package/lib/messages/renderer.d.ts.map +1 -0
  175. package/lib/messages/renderer.js +159 -0
  176. package/lib/messages/renderer.js.map +1 -0
  177. package/lib/node/heap-ceiling.d.ts +61 -0
  178. package/lib/node/heap-ceiling.d.ts.map +1 -0
  179. package/lib/node/heap-ceiling.js +72 -0
  180. package/lib/node/heap-ceiling.js.map +1 -0
  181. package/lib/node/index.d.ts +1 -0
  182. package/lib/node/index.d.ts.map +1 -1
  183. package/lib/node/index.js +1 -0
  184. package/lib/node/index.js.map +1 -1
  185. package/lib/node/latency-from-env.d.ts +1 -1
  186. package/lib/node/latency-from-env.js +1 -1
  187. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  188. package/lib/node/node-file-system-provider.js +1 -40
  189. package/lib/node/node-file-system-provider.js.map +1 -1
  190. package/lib/node/profiling-run.d.ts +2 -2
  191. package/lib/node/profiling-run.js +1 -1
  192. package/lib/node/profiling-run.js.map +1 -1
  193. package/lib/node/rename-over-open-readers.d.ts +52 -0
  194. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  195. package/lib/node/rename-over-open-readers.js +66 -0
  196. package/lib/node/rename-over-open-readers.js.map +1 -0
  197. package/lib/node/socket-launcher.d.ts +15 -0
  198. package/lib/node/socket-launcher.d.ts.map +1 -1
  199. package/lib/node/socket-launcher.js +3 -2
  200. package/lib/node/socket-launcher.js.map +1 -1
  201. package/lib/testing/fake-document.d.ts +16 -4
  202. package/lib/testing/fake-document.d.ts.map +1 -1
  203. package/lib/testing/fake-document.js +18 -3
  204. package/lib/testing/fake-document.js.map +1 -1
  205. package/lib/testing/make-noop-shared-services.d.ts +14 -0
  206. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  207. package/lib/testing/make-noop-shared-services.js +28 -2
  208. package/lib/testing/make-noop-shared-services.js.map +1 -1
  209. package/lib/testing/make-test-services.d.ts +44 -8
  210. package/lib/testing/make-test-services.d.ts.map +1 -1
  211. package/lib/testing/make-test-services.js +19 -3
  212. package/lib/testing/make-test-services.js.map +1 -1
  213. package/lib/testing/node/spawned-server.d.ts +14 -0
  214. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  215. package/lib/testing/node/spawned-server.js +33 -1
  216. package/lib/testing/node/spawned-server.js.map +1 -1
  217. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  218. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  219. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  220. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  221. package/lib/testing/playwright/index.d.ts +1 -0
  222. package/lib/testing/playwright/index.d.ts.map +1 -1
  223. package/lib/testing/playwright/index.js +1 -0
  224. package/lib/testing/playwright/index.js.map +1 -1
  225. package/lib/testing/playwright/server-log-capture.d.ts +14 -4
  226. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  227. package/lib/testing/playwright/server-log-capture.js +21 -4
  228. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  229. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  230. package/lib/testing/playwright/server-log-rename-reporter.js +10 -1
  231. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  232. package/lib/testing/stub-ast-document-manager.d.ts +5 -5
  233. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  234. package/lib/testing/stub-ast-document-manager.js +4 -6
  235. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  236. package/lib/testing/stub-document-builder.d.ts +8 -0
  237. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  238. package/lib/testing/stub-document-builder.js +22 -3
  239. package/lib/testing/stub-document-builder.js.map +1 -1
  240. package/lib/testing/stub-langium-documents.d.ts +3 -2
  241. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  242. package/lib/testing/stub-langium-documents.js.map +1 -1
  243. package/lib/testing/stub-model-service.d.ts +5 -4
  244. package/lib/testing/stub-model-service.d.ts.map +1 -1
  245. package/lib/testing/stub-model-service.js +2 -2
  246. package/lib/testing/stub-model-service.js.map +1 -1
  247. package/package.json +17 -8
  248. package/src/documents/ast-document-manager.ts +129 -36
  249. package/src/documents/client-ids.ts +5 -22
  250. package/src/documents/hydranium-text-documents.ts +167 -61
  251. package/src/documents/language-client-text-shadow.ts +59 -11
  252. package/src/documents/self-save-registry.ts +52 -13
  253. package/src/index.ts +5 -0
  254. package/src/langium/ast-extension/ast-node-builder.ts +66 -22
  255. package/src/langium/bootstrap.ts +16 -9
  256. package/src/langium/config/configuration-provider.ts +119 -0
  257. package/src/langium/config/index.ts +1 -0
  258. package/src/langium/diagnostics/lsp-logger.ts +41 -6
  259. package/src/langium/document-builder/build-pipeline-integration.ts +14 -1
  260. package/src/langium/document-builder/build-session.ts +87 -0
  261. package/src/langium/document-builder/document-builder.ts +339 -11
  262. package/src/langium/document-builder/index.ts +1 -0
  263. package/src/langium/integration-services.ts +67 -6
  264. package/src/langium/integrity/integrity-service.ts +35 -1
  265. package/src/langium/keys/containment.ts +87 -0
  266. package/src/langium/keys/index.ts +1 -0
  267. package/src/langium/keys/name-based-key-provider.ts +4 -0
  268. package/src/langium/model-service/model-service.ts +211 -30
  269. package/src/langium/module.ts +106 -21
  270. package/src/langium/naming/name-provider.ts +27 -5
  271. package/src/langium/naming/name-separator-validation.ts +34 -5
  272. package/src/langium/residency/cst-residency-service.ts +36 -12
  273. package/src/langium/scope/hydranium-scope-provider.ts +40 -22
  274. package/src/langium/service-registry.ts +6 -2
  275. package/src/langium/shared-services.ts +19 -2
  276. package/src/langium/transfer/transfer-encoder.ts +85 -24
  277. package/src/langium/validation/document-validator.ts +537 -11
  278. package/src/langium/workspace/document-uri-policy.ts +3 -4
  279. package/src/langium/workspace/hydranium-langium-document-factory.ts +34 -0
  280. package/src/langium/workspace/hydranium-workspace-manager.ts +30 -1
  281. package/src/langium/workspace/in-memory-file-system-provider.ts +13 -3
  282. package/src/langium/workspace/initialize-workspace.ts +34 -5
  283. package/src/langium/workspace/langium-documents.ts +106 -33
  284. package/src/locale/index.ts +10 -0
  285. package/src/locale/server-locale.ts +86 -0
  286. package/src/lsp/hydranium-document-update-handler.ts +1 -1
  287. package/src/lsp/index.ts +1 -1
  288. package/src/lsp/lsp-latency.ts +62 -0
  289. package/src/lsp/semantic-token-provider.ts +74 -7
  290. package/src/messages/carriers.ts +78 -0
  291. package/src/messages/index.ts +36 -0
  292. package/src/messages/renderer.ts +204 -0
  293. package/src/node/heap-ceiling.ts +108 -0
  294. package/src/node/index.ts +1 -0
  295. package/src/node/latency-from-env.ts +1 -1
  296. package/src/node/node-file-system-provider.ts +1 -41
  297. package/src/node/profiling-run.ts +3 -3
  298. package/src/node/rename-over-open-readers.ts +78 -0
  299. package/src/node/socket-launcher.ts +18 -2
  300. package/src/testing/fake-document.ts +24 -5
  301. package/src/testing/make-noop-shared-services.ts +50 -2
  302. package/src/testing/make-test-services.ts +73 -18
  303. package/src/testing/node/spawned-server.ts +35 -1
  304. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  305. package/src/testing/playwright/index.ts +1 -0
  306. package/src/testing/playwright/server-log-capture.ts +24 -5
  307. package/src/testing/playwright/server-log-rename-reporter.ts +12 -1
  308. package/src/testing/stub-ast-document-manager.ts +10 -14
  309. package/src/testing/stub-document-builder.ts +32 -3
  310. package/src/testing/stub-langium-documents.ts +3 -2
  311. package/src/testing/stub-model-service.ts +7 -6
  312. package/lib/lsp/instrument-connection.d.ts +0 -36
  313. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  314. package/lib/lsp/instrument-connection.js +0 -62
  315. package/lib/lsp/instrument-connection.js.map +0 -1
  316. package/src/lsp/instrument-connection.ts +0 -66
@@ -6,9 +6,10 @@
6
6
  *
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
- import { type CloseModelArgs, type Tracer, type TransferSavedEvent, type TransferUpdatedEvent, type OpenModelArgs } from '@hydranium/protocol';
9
+ import { type CloseModelArgs, type Tracer, type TransferSavedEvent, type TransferUpdatedEvent, type OpenModelArgs, type SnapshotVersion } from '@hydranium/protocol';
10
10
  import { type AstNode, type DocumentBuilder, type FileSystemProvider, type LangiumDocument, type LangiumDocuments } from '@hydranium/langium';
11
11
  import { type LogNameOptions } from '../langium/diagnostics/logger.js';
12
+ import { type AstDiagnostic } from '../langium/validation/document-validator.js';
12
13
  /**
13
14
  * File-system provider extension that supports writes. Langium's standard
14
15
  * {@link FileSystemProvider} is read-only; the manager needs to persist saves,
@@ -82,19 +83,19 @@ export interface UpdateInfo {
82
83
  * twins; the type-system distinction is the generic constraint, and the
83
84
  * conversion seam between them is the framework `TransferEncoder`.
84
85
  */
85
- export interface AstDocument<TAst extends AstNode, TDiagnostic> {
86
+ export interface AstDocument<TAst extends AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic> {
86
87
  root: TAst;
87
88
  diagnostics: TDiagnostic[];
88
89
  uri: string;
89
90
  /**
90
91
  * Text-document version this snapshot was taken at — read from
91
92
  * `LangiumDocument.textDocument.version`. Symmetric with
92
- * `TransferDocument.version` on the wire side: in-process callers
93
- * that hold an `AstDocument` and mutate it pass this value back as
94
- * `TransferUpdateArgs.baseVersion` / `TransferSaveArgs.baseVersion` to opt
95
- * into the conflict gate.
93
+ * `TransferDocument.version` on the wire side: an in-process caller that
94
+ * holds an `AstDocument` and mutates it sends this straight back as
95
+ * `TransferUpdateArgs.basedOn` / `TransferSaveArgs.basedOn`, and the
96
+ * conflict gate arms on it.
96
97
  */
97
- version: number;
98
+ version: SnapshotVersion;
98
99
  }
99
100
  export declare namespace AstDocument {
100
101
  /**
@@ -103,7 +104,7 @@ export declare namespace AstDocument {
103
104
  * don't need to repeat the empty array at every call site. Mirrors
104
105
  * `TransferDocument.create` on the wire side.
105
106
  */
106
- function create<TAst extends AstNode, TDiagnostic = unknown>(uri: string, version: number, root: TAst, diagnostics?: TDiagnostic[]): AstDocument<TAst, TDiagnostic>;
107
+ function create<TAst extends AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic>(uri: string, version: number, root: TAst, diagnostics?: TDiagnostic[]): AstDocument<TAst, TDiagnostic>;
107
108
  /**
108
109
  * Project a {@link LangiumDocument} into its {@link AstDocument}
109
110
  * envelope — the single place that reads `root` / `diagnostics` /
@@ -117,15 +118,59 @@ export declare namespace AstDocument {
117
118
  * carry that identity, not the subscriber's (possibly non-canonical) URI:
118
119
  * a subscriber already knows the URI it subscribed with, so the useful
119
120
  * thing to surface is the canonical one every other layer keys by.
121
+ *
122
+ * Narrowing `TDiagnostic` below the constraint asserts that the validators
123
+ * in play produce that shape, and nothing here checks it: the build fills the
124
+ * array, so a document carrying a diagnostic from elsewhere — a lexer error,
125
+ * another validator — satisfies the declared type and not the narrowed one.
120
126
  */
121
- function from<TAst extends AstNode, TDiagnostic = unknown>(document: LangiumDocument): AstDocument<TAst, TDiagnostic>;
127
+ function from<TAst extends AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic>(document: LangiumDocument): AstDocument<TAst, TDiagnostic>;
122
128
  }
123
129
  /** Update event delivered by {@link AstDocumentManager.onUpdate} — typed alias over the generic event wrapper. */
124
- export type AstDocumentUpdatedEvent<TAst extends AstNode, TDiagnostic> = TransferUpdatedEvent<AstDocument<TAst, TDiagnostic>>;
130
+ export type AstDocumentUpdatedEvent<TAst extends AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic> = TransferUpdatedEvent<AstDocument<TAst, TDiagnostic>>;
125
131
  /** Save event delivered by {@link AstDocumentManager.onSave} — typed alias over the generic event wrapper. */
126
- export type AstDocumentSavedEvent<TAst extends AstNode, TDiagnostic> = TransferSavedEvent<AstDocument<TAst, TDiagnostic>>;
132
+ export type AstDocumentSavedEvent<TAst extends AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic> = TransferSavedEvent<AstDocument<TAst, TDiagnostic>>;
127
133
  /** Construction options for {@link AstDocumentManager}. */
128
134
  export type AstDocumentManagerOptions = LogNameOptions;
135
+ /**
136
+ * The document slot the model server and the integrity service talk to:
137
+ * open/close/update/save plus the AST-typed event streams, with the LSP
138
+ * plumbing hidden.
139
+ *
140
+ * Generic over `<TAst extends AstNode, TDiagnostic>` so each consumer projects
141
+ * its own AST root type and diagnostic shape into the emitted
142
+ * {@link AstDocument} envelopes.
143
+ *
144
+ * **URI contract.** Every URI-accepting member takes a URI in *any* spelling
145
+ * (canonical, symlinked, `..`/case-divergent) and canonicalizes internally
146
+ * through the {@link DocumentUriPolicy}, so a caller never has to canonicalize
147
+ * first and an implementation may not require it.
148
+ */
149
+ export interface AstDocumentManager<TAst extends AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic> {
150
+ open(args: OpenModelArgs): Promise<Disposable>;
151
+ close(args: CloseModelArgs): Promise<void>;
152
+ isOpen(uri: string): boolean;
153
+ /** Apply `text` as `clientId`'s edit. Resolves to the resulting text-document version. */
154
+ update(uri: string, text: string, clientId: string): Promise<number>;
155
+ save(uri: string, clientId: string): Promise<void>;
156
+ onUpdate(uri: string, listener: (event: AstDocumentUpdatedEvent<TAst, TDiagnostic>) => void): Disposable;
157
+ onSave(uri: string, listener: (event: AstDocumentSavedEvent<TAst, TDiagnostic>) => void | Promise<void>): Disposable;
158
+ onClientClosed(uri: string, clientId: string, listener: () => void): Disposable;
159
+ getDocument(uri: string): LangiumDocument | undefined;
160
+ /** Client id that authored the document's current version, or `undefined` for a framework-internal build. */
161
+ getAuthor(document: LangiumDocument): string | undefined;
162
+ /**
163
+ * Whether `uri` is one of the URIs the most recent build request named, as
164
+ * opposed to a document that build swept in as a dependent. Deletions are
165
+ * excluded: they never reach this layer, since a deleted document is
166
+ * removed before the build set is computed.
167
+ *
168
+ * The answer refers to the latest request, which may still be building, and
169
+ * it is retained between builds — so outside a build it describes whichever
170
+ * one ran last.
171
+ */
172
+ isTriggeringEdit(uri: string): boolean;
173
+ }
129
174
  /**
130
175
  * Higher-level facade over {@link HydraniumTextDocuments} that speaks the
131
176
  * model-server protocol (open/close/update/save with the transfer-model event
@@ -146,7 +191,7 @@ export type AstDocumentManagerOptions = LogNameOptions;
146
191
  * resolution (the egress `applyEditToLanguageClient`) stay on
147
192
  * {@link HydraniumTextDocuments}, their owner.
148
193
  */
149
- export declare class AstDocumentManager<TAst extends AstNode = AstNode, TDiagnostic = unknown> {
194
+ export declare class DefaultAstDocumentManager<TAst extends AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic> implements AstDocumentManager<TAst, TDiagnostic> {
150
195
  protected readonly services: ServerSharedServices;
151
196
  protected lastUpdate?: UpdateInfo;
152
197
  protected readonly textDocuments: HydraniumTextDocuments<TextDocument>;
@@ -195,7 +240,7 @@ export declare class AstDocumentManager<TAst extends AstNode = AstNode, TDiagnos
195
240
  * concrete value (the `onUpdate` event's `sourceClientId`, the data-server's
196
241
  * `resolveSourceClientId`).
197
242
  */
198
- getAuthor(document: LangiumDocument<AstNode>): string | undefined;
243
+ getAuthor(document: LangiumDocument): string | undefined;
199
244
  open(args: OpenModelArgs): Promise<Disposable>;
200
245
  close(args: CloseModelArgs): Promise<void>;
201
246
  /**
@@ -217,12 +262,27 @@ export declare class AstDocumentManager<TAst extends AstNode = AstNode, TDiagnos
217
262
  * callers don't need to pass it — the manager owns content and version
218
263
  * sequencing.
219
264
  *
265
+ * **The write is skipped when the file already holds that text; the
266
+ * notification is not.** A save announces that the content is on disk, which
267
+ * is true either way — so a subscriber clearing a dirty marker or reacting to
268
+ * a persist behaves the same, while an mtime is not moved for byte-identical
269
+ * content that a downstream mtime-keyed build would then read as new work.
270
+ *
220
271
  * Throws if no document is open for `uri`.
221
272
  */
222
273
  save(uri: string, clientId: string): Promise<void>;
274
+ /**
275
+ * Whether the file at `uri` already holds `text`.
276
+ *
277
+ * Compared by CONTENT rather than against a remembered version, so a write
278
+ * from outside this server is still corrected: a version this manager already
279
+ * saved says nothing about what is on disk now. `false` when the file cannot
280
+ * be read at all, which is the answer that writes — a document whose file does
281
+ * not exist yet is exactly the one a first save has to create.
282
+ */
283
+ protected matchesDisk(uri: string, text: string): Promise<boolean>;
223
284
  isOpen(uri: string): boolean;
224
- /** True if the URI was in the directly-changed set of the most recent build (not just affected). */
225
- isDirectChange(uri: string): boolean;
285
+ isTriggeringEdit(uri: string): boolean;
226
286
  /**
227
287
  * The `LangiumDocument` for an externally-supplied URI, looked up by its
228
288
  * canonical identity. Folds the `getDocument(toUri(canonicalUri(uri)))` idiom
@@ -232,7 +292,6 @@ export declare class AstDocumentManager<TAst extends AstNode = AstNode, TDiagnos
232
292
  */
233
293
  getDocument(uri: string): LangiumDocument | undefined;
234
294
  protected createDocumentFromTextOrFileSystem(uri: string, languageId?: string, version?: number, text?: string): Promise<TextDocumentItem>;
235
- readFile(uri: string): Promise<string>;
236
295
  /**
237
296
  * Hook for subclasses that want to re-shape the emitted document (e.g. inject
238
297
  * a custom-typed `diagnostics` field). The default delegates to
@@ -1 +1 @@
1
- {"version":3,"file":"ast-document-manager.d.ts","sourceRoot":"","sources":["../../src/documents/ast-document-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ast-document-manager.d.ts","sourceRoot":"","sources":["../../src/documents/ast-document-manager.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
+ import { asSnapshotVersion } from '@hydranium/protocol';
9
10
  import { DocumentState, UriUtils } from '@hydranium/langium';
10
11
  import { Disposable } from 'vscode-languageserver';
11
12
  import { TextDocumentIdentifier } from 'vscode-languageserver-protocol';
@@ -21,7 +22,7 @@ export var AstDocument;
21
22
  * `TransferDocument.create` on the wire side.
22
23
  */
23
24
  function create(uri, version, root, diagnostics = []) {
24
- return { uri, version, root, diagnostics };
25
+ return { uri, version: asSnapshotVersion(version), root, diagnostics };
25
26
  }
26
27
  AstDocument.create = create;
27
28
  /**
@@ -37,6 +38,11 @@ export var AstDocument;
37
38
  * carry that identity, not the subscriber's (possibly non-canonical) URI:
38
39
  * a subscriber already knows the URI it subscribed with, so the useful
39
40
  * thing to surface is the canonical one every other layer keys by.
41
+ *
42
+ * Narrowing `TDiagnostic` below the constraint asserts that the validators
43
+ * in play produce that shape, and nothing here checks it: the build fills the
44
+ * array, so a document carrying a diagnostic from elsewhere — a lexer error,
45
+ * another validator — satisfies the declared type and not the narrowed one.
40
46
  */
41
47
  function from(document) {
42
48
  return create(document.textDocument.uri, document.textDocument.version, document.parseResult.value, (document.diagnostics ?? []));
@@ -63,7 +69,7 @@ export var AstDocument;
63
69
  * resolution (the egress `applyEditToLanguageClient`) stay on
64
70
  * {@link HydraniumTextDocuments}, their owner.
65
71
  */
66
- export class AstDocumentManager {
72
+ export class DefaultAstDocumentManager {
67
73
  services;
68
74
  lastUpdate;
69
75
  textDocuments;
@@ -176,11 +182,12 @@ export class AstDocumentManager {
176
182
  const event = {
177
183
  document: this.toAstDocument(document),
178
184
  sourceClientId,
179
- reason: this.lastUpdate?.changed.find(changed => UriUtils.equals(changed, document.uri))
180
- ? 'changed'
181
- : this.lastUpdate?.deleted.find(deleted => UriUtils.equals(deleted, document.uri))
182
- ? 'deleted'
183
- : 'rebuilt'
185
+ // No `'deleted'` arm: `DocumentBuilder.update` drops a deleted
186
+ // document from `LangiumDocuments` before deriving the rebuild set
187
+ // from it, so a deleted URI is never built and never reaches this
188
+ // phase listener. A subscriber needing deletions has to be told on
189
+ // a channel that does not require a built document.
190
+ reason: this.lastUpdate?.changed.some(changed => UriUtils.equals(changed, document.uri)) ? 'changed' : 'rebuilt'
184
191
  };
185
192
  this.tracer.with(uri).trace(`emitUpdate start: source=${sourceClientId}, reason=${event.reason}`);
186
193
  listener(event);
@@ -218,11 +225,19 @@ export class AstDocumentManager {
218
225
  // transiently breaks cross-document linking mid-rebuild (a dependent briefly
219
226
  // seeing an `extends`/`type` reference unresolved). And because the constructor
220
227
  // wires `onDidOpen -> this.open`, it would fire a second, identical rebuild on
221
- // every first open. So an already-open `open()` is a no-op.
228
+ // every first open.
229
+ //
230
+ // So an already-open `open()` records the attaching client's hold and nothing
231
+ // else. The hold is per `(uri, clientId)` and the last-close revert counts down
232
+ // to it, so skipping it lets the first holder's close tear down a document
233
+ // another client is still reading.
222
234
  if (!this.isOpen(args.uri)) {
223
235
  const textDocument = await this.createDocumentFromTextOrFileSystem(args.uri, args.languageId, args.version, args.text);
224
236
  this.textDocuments.notifyDidOpenTextDocument({ textDocument }, args.clientId);
225
237
  }
238
+ else {
239
+ this.textDocuments.attachClient(args.uri, args.clientId);
240
+ }
226
241
  return Disposable.create(() => this.close(args));
227
242
  }
228
243
  async close(args) {
@@ -253,24 +268,50 @@ export class AstDocumentManager {
253
268
  * callers don't need to pass it — the manager owns content and version
254
269
  * sequencing.
255
270
  *
271
+ * **The write is skipped when the file already holds that text; the
272
+ * notification is not.** A save announces that the content is on disk, which
273
+ * is true either way — so a subscriber clearing a dirty marker or reacting to
274
+ * a persist behaves the same, while an mtime is not moved for byte-identical
275
+ * content that a downstream mtime-keyed build would then read as new work.
276
+ *
256
277
  * Throws if no document is open for `uri`.
257
278
  */
258
279
  async save(uri, clientId) {
259
- const document = this.textDocuments.get(uri);
280
+ // Canonical throughout: the write and the read that gates it must address
281
+ // the same file the store was keyed by, or a divergent spelling compares
282
+ // one file and writes another.
283
+ const canonical = this.uriPolicy.canonicalUri(uri);
284
+ const document = this.textDocuments.get(canonical);
260
285
  if (!document) {
261
286
  throw new Error(`Document ${uri} hasn't been opened for saving yet`);
262
287
  }
263
288
  const text = document.getText();
264
- await this.tracer.with(uri).time(`Write file (${text.length} bytes, from ${clientId})`,
265
- // Async write so a slow disk does not block the event loop for the duration of the fs call.
266
- () => this.fileSystemProvider.writeFile(UriUtils.toUri(uri), text), 'debug');
267
- this.textDocuments.notifyDidSaveTextDocument({ textDocument: TextDocumentIdentifier.create(uri), text }, clientId);
289
+ if (!(await this.matchesDisk(canonical, text))) {
290
+ await this.tracer.with(canonical).time(`Write file (${text.length} bytes, from ${clientId})`,
291
+ // Async write so a slow disk does not block the event loop for the duration of the fs call.
292
+ () => this.fileSystemProvider.writeFile(UriUtils.toUri(canonical), text), 'debug');
293
+ }
294
+ this.textDocuments.notifyDidSaveTextDocument({ textDocument: TextDocumentIdentifier.create(canonical), text }, clientId);
295
+ }
296
+ /**
297
+ * Whether the file at `uri` already holds `text`.
298
+ *
299
+ * Compared by CONTENT rather than against a remembered version, so a write
300
+ * from outside this server is still corrected: a version this manager already
301
+ * saved says nothing about what is on disk now. `false` when the file cannot
302
+ * be read at all, which is the answer that writes — a document whose file does
303
+ * not exist yet is exactly the one a first save has to create.
304
+ */
305
+ async matchesDisk(uri, text) {
306
+ return this.fileSystemProvider
307
+ .readFile(UriUtils.toUri(uri))
308
+ .then(onDisk => onDisk === text)
309
+ .catch(() => false);
268
310
  }
269
311
  isOpen(uri) {
270
312
  return !!this.textDocuments.get(uri);
271
313
  }
272
- /** True if the URI was in the directly-changed set of the most recent build (not just affected). */
273
- isDirectChange(uri) {
314
+ isTriggeringEdit(uri) {
274
315
  const canonical = this.uriPolicy.canonicalUri(uri);
275
316
  return this.lastUpdate?.changed.some(changed => this.uriPolicy.canonicalUri(changed) === canonical) ?? false;
276
317
  }
@@ -285,10 +326,7 @@ export class AstDocumentManager {
285
326
  return this.langiumDocs.getDocument(UriUtils.toUri(this.uriPolicy.canonicalUri(uri)));
286
327
  }
287
328
  async createDocumentFromTextOrFileSystem(uri, languageId = this.resolveLanguageId(uri), version = 0, text) {
288
- return { uri, languageId, version, text: text ?? (await this.readFile(uri)) };
289
- }
290
- async readFile(uri) {
291
- return this.fileSystemProvider.readFile(UriUtils.toUri(uri));
329
+ return { uri, languageId, version, text: text ?? (await this.fileSystemProvider.readFile(UriUtils.toUri(uri))) };
292
330
  }
293
331
  /**
294
332
  * Hook for subclasses that want to re-shape the emitted document (e.g. inject
@@ -1 +1 @@
1
- {"version":3,"file":"ast-document-manager.js","sourceRoot":"","sources":["../../src/documents/ast-document-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ast-document-manager.js","sourceRoot":"","sources":["../../src/documents/ast-document-manager.ts"],"names":[],"mappings":"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"}
@@ -7,24 +7,10 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
  /**
10
- * Well-known client-kind identifiers used across the multi-client framework.
11
- *
12
- * The framework tracks each document as belonging to one or more "clients"
13
- * — typically an LSP-text-client (Monaco, VS Code, etc.), a GLSP diagram
14
- * client, and/or a structured-form client. Each kind carries a stable id so
15
- * the server can route outbound corrections, edits, and notifications to the
16
- * right transport.
17
- */
18
- /** Identifier for an LSP-text client (Monaco, VS Code, …). */
19
- export declare const LANGUAGE_CLIENT_ID = "language-client";
20
- /** Fallback identifier when a document's author is unknown (e.g. cold workspace-init load). */
21
- export declare const UNKNOWN_CLIENT_ID = "unknown";
22
- /**
23
- * Synthetic author id on the `onDocumentUpdated` broadcast a data-server
24
- * emits after the LAST client closed a document and the framework rebuilt it
25
- * from its disk content (discarding unsaved in-session edits). Not a real
26
- * client: it lets consumers distinguish the revert broadcast from
27
- * client-authored updates.
10
+ * Re-export, because these are WIRE values and the side that has to recognise
11
+ * them is the client. They are defined in `@hydranium/protocol` so a frontend
12
+ * can name them without depending on the server tier; this path stays so
13
+ * server-side code keeps importing them from where it already does.
28
14
  */
29
- export declare const REVERT_ON_CLOSE_CLIENT_ID = "revert-on-close";
15
+ export { FRAMEWORK_CLIENT_IDS, LANGUAGE_CLIENT_ID, REVERT_ON_CLOSE_CLIENT_ID, UNKNOWN_CLIENT_ID } from '@hydranium/protocol';
30
16
  //# sourceMappingURL=client-ids.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-ids.d.ts","sourceRoot":"","sources":["../../src/documents/client-ids.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF;;;;;;;;GAQG;AAEH,8DAA8D;AAC9D,eAAO,MAAM,kBAAkB,oBAAoB,CAAC;AAEpD,+FAA+F;AAC/F,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAE3C;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,oBAAoB,CAAC"}
1
+ {"version":3,"file":"client-ids.d.ts","sourceRoot":"","sources":["../../src/documents/client-ids.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF;;;;;GAKG;AACH,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -7,24 +7,10 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
  /**
10
- * Well-known client-kind identifiers used across the multi-client framework.
11
- *
12
- * The framework tracks each document as belonging to one or more "clients"
13
- * — typically an LSP-text-client (Monaco, VS Code, etc.), a GLSP diagram
14
- * client, and/or a structured-form client. Each kind carries a stable id so
15
- * the server can route outbound corrections, edits, and notifications to the
16
- * right transport.
17
- */
18
- /** Identifier for an LSP-text client (Monaco, VS Code, …). */
19
- export const LANGUAGE_CLIENT_ID = 'language-client';
20
- /** Fallback identifier when a document's author is unknown (e.g. cold workspace-init load). */
21
- export const UNKNOWN_CLIENT_ID = 'unknown';
22
- /**
23
- * Synthetic author id on the `onDocumentUpdated` broadcast a data-server
24
- * emits after the LAST client closed a document and the framework rebuilt it
25
- * from its disk content (discarding unsaved in-session edits). Not a real
26
- * client: it lets consumers distinguish the revert broadcast from
27
- * client-authored updates.
10
+ * Re-export, because these are WIRE values and the side that has to recognise
11
+ * them is the client. They are defined in `@hydranium/protocol` so a frontend
12
+ * can name them without depending on the server tier; this path stays so
13
+ * server-side code keeps importing them from where it already does.
28
14
  */
29
- export const REVERT_ON_CLOSE_CLIENT_ID = 'revert-on-close';
15
+ export { FRAMEWORK_CLIENT_IDS, LANGUAGE_CLIENT_ID, REVERT_ON_CLOSE_CLIENT_ID, UNKNOWN_CLIENT_ID } from '@hydranium/protocol';
30
16
  //# sourceMappingURL=client-ids.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-ids.js","sourceRoot":"","sources":["../../src/documents/client-ids.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF;;;;;;;;GAQG;AAEH,8DAA8D;AAC9D,MAAM,CAAC,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;AAEpD,+FAA+F;AAC/F,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,iBAAiB,CAAC"}
1
+ {"version":3,"file":"client-ids.js","sourceRoot":"","sources":["../../src/documents/client-ids.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF;;;;;GAKG;AACH,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -98,15 +98,15 @@ interface VersionSequence {
98
98
  */
99
99
  interface PendingPush {
100
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.
101
+ * The text the client held BEFORE this push, and therefore the text its
102
+ * echo addresses with its ranges. Wider than the baseline the push's edits
103
+ * were diffed against: a full replace is sent with no diff baseline and
104
+ * still lands on a buffer the echo is keyed to.
104
105
  *
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.
106
+ * `undefined` only when that buffer is unknown — the client never declared
107
+ * one, or a rejection invalidated what was tracked. The echo is then
108
+ * reconstructed against the synced text, which is sound only for a
109
+ * position-independent (full-text) change.
110
110
  */
111
111
  readonly before: string | undefined;
112
112
  /** {@link contentHash} of the text this push moves the client to. */
@@ -114,7 +114,7 @@ interface PendingPush {
114
114
  }
115
115
  /**
116
116
  * What an incoming language-client change turns out to be once reconstructed
117
- * against the pushes still in flight — the return of
117
+ * against the buffer its ranges address — the return of
118
118
  * {@link HydraniumTextDocuments.classifyLanguageClientChange}.
119
119
  */
120
120
  type LanguageClientChangeOrigin =
@@ -123,13 +123,22 @@ type LanguageClientChangeOrigin =
123
123
  readonly kind: 'echo';
124
124
  }
125
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.
126
+ * The client's buffer holds a text we did not push it — a keystroke that
127
+ * raced a push, or an edit to a buffer the store has already been written
128
+ * past. The reconstructed text is what it now holds, and is authoritative.
129
129
  */
130
130
  | {
131
131
  readonly kind: 'divergent';
132
132
  readonly text: string;
133
+ }
134
+ /**
135
+ * The change carries ranges and no known text addresses them, so no
136
+ * reconstruction is offered. Adopting one anyway splices the document and
137
+ * stores an edit nobody made; dropping costs at most the one keystroke the
138
+ * client still holds and the next push contradicts.
139
+ */
140
+ | {
141
+ readonly kind: 'unreconstructable';
133
142
  };
134
143
  /**
135
144
  * Multi-client text-document tracking on top of Langium's `NormalizedTextDocuments`.
@@ -142,7 +151,7 @@ type LanguageClientChangeOrigin =
142
151
  * per-client staleness guard and never leak into the shared sequence —
143
152
  * the two are different things (an editor's edit-operation counter vs the
144
153
  * document's content-revision number), and splicing them lets versions drift
145
- * silently past `baseVersion` gate holders.
154
+ * silently past based-on gate holders.
146
155
  * - Version-author history so each edit is attributable to its originating client.
147
156
  * - Pending-content staging used by the integrity service to thread corrections
148
157
  * through `workspace/applyEdit` cycles for currently-closed documents.
@@ -169,7 +178,7 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
169
178
  * that record is deleted on last close, while the version sequence must
170
179
  * survive it — the shared version is a server-owned, monotonic,
171
180
  * advances-iff-content-changes counter that never resets while the server
172
- * lives. That invariant is what makes an optimistic `baseVersion` gate
181
+ * lives. That invariant is what makes an optimistic based-on gate
173
182
  * sound: "version unchanged ⇔ content unchanged", with no false conflicts
174
183
  * from close/reopen version resets and no false passes from a reopened
175
184
  * sequence coincidentally landing on a stale writer's number.
@@ -254,7 +263,7 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
254
263
  * A content-identical write still fires the change event (rebuild): the
255
264
  * authored write's server-side rebuild is correctness-bearing, it just
256
265
  * mints no new version — nothing observable changed, so watchers'
257
- * `baseVersion` pointers stay valid.
266
+ * based-on versions stay valid.
258
267
  *
259
268
  * Returns the resulting shared version. Throws when the document is not
260
269
  * open — callers (`AstDocumentManager.update`) open first.
@@ -265,6 +274,26 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
265
274
  notifyWillSaveTextDocumentWaitUntil(event: WillSaveTextDocumentParams, token: CancellationToken): HandlerResult<TextEdit[], void>;
266
275
  notifyDidSaveTextDocument(event: DidSaveTextDocumentParams, clientId?: string): void;
267
276
  notifyDidOpenTextDocument(event: DidOpenTextDocumentParams, clientId?: string): void;
277
+ /**
278
+ * Record `clientId` as an additional holder of a document another client
279
+ * already has open.
280
+ *
281
+ * Unlike the attach branch of {@link notifyDidOpenTextDocument} this does
282
+ * not refresh. That branch re-renders an attaching TEXTUAL view; a client
283
+ * reaching a document through a non-textual route has nothing to re-render,
284
+ * and refreshing per attach turns each into a Langium rebuild and dependent
285
+ * relink cascade.
286
+ *
287
+ * The staleness guard baselines at the SYNCED version, not a declared buffer
288
+ * version, because a client arriving this way holds no buffer of its own.
289
+ * Unifying the two routes therefore rebaselines a textual client's guard to a
290
+ * version it never declared.
291
+ *
292
+ * Returns whether a hold was added — `false` when `uri` is not open, or
293
+ * `clientId` already holds it.
294
+ */
295
+ attachClient(uri: DocumentUri, clientId: string): boolean;
296
+ protected logClientJoined(uri: DocumentUri, clientId: string, version: number, existingClients: readonly string[]): void;
268
297
  refreshContent(uri: DocumentUri, clientId: string): void;
269
298
  /**
270
299
  * The canonical key a document is stored under — the single point this store
@@ -313,7 +342,7 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
313
342
  * `0` for a URI this store has never seen. The shared sequence is
314
343
  * server-owned and monotonic across close/reopen cycles, and advances
315
344
  * exactly when the synced content changes — which is what makes it a sound
316
- * optimistic-concurrency token (`baseVersion` gates): version unchanged ⇔
345
+ * optimistic-concurrency token (based-on gates): version unchanged ⇔
317
346
  * content unchanged.
318
347
  */
319
348
  version(uri: DocumentUri): number;
@@ -436,12 +465,17 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
436
465
  protected recordPendingPush(targetUri: LanguageClientUri, before: string | undefined, newText: string): void;
437
466
  /**
438
467
  * 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`.
468
+ * reconstructing the client's resulting buffer against the text its ranges
469
+ * address — the pre-push buffer of the OLDEST push still in flight for
470
+ * `clientFacing`, else whatever that client is believed to hold.
441
471
  *
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.
472
+ * `undefined` when the client's ranges address the synced text itself —
473
+ * nothing in flight, and no evidence the client holds anything else. That
474
+ * is the ordinary path, and the caller then applies the ranges directly.
475
+ * The two texts part company without a push in flight whenever a client
476
+ * attaches to a document another client has already written: it opened
477
+ * from disk, so applying its ranges to the synced text splices lines they
478
+ * never addressed.
445
479
  *
446
480
  * **Why the oldest, and why reconstruct at all.** The client applies our
447
481
  * pushes in order and echoes each against the buffer it held before that