@likec4/language-server 1.47.0 → 1.48.0

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/LICENSE +1 -1
  2. package/browser/package.json +2 -2
  3. package/browser-worker/package.json +2 -2
  4. package/bundled/package.json +4 -0
  5. package/dist/LikeC4LanguageServices.d.mts +4 -0
  6. package/dist/LikeC4LanguageServices.mjs +3 -0
  7. package/dist/_chunks/ConfigurableLayouter.mjs +1956 -0
  8. package/dist/_chunks/LikeC4LanguageServices.d.mts +1978 -0
  9. package/dist/_chunks/LikeC4LanguageServices.mjs +725 -0
  10. package/dist/_chunks/ast.d.mts +1444 -0
  11. package/dist/_chunks/ast.mjs +2375 -0
  12. package/dist/_chunks/ast2.mjs +176 -0
  13. package/dist/_chunks/common-exports.mjs +0 -0
  14. package/dist/_chunks/filesystem.mjs +58 -0
  15. package/dist/_chunks/grammar.mjs +8 -0
  16. package/dist/_chunks/icons.mjs +5211 -0
  17. package/dist/_chunks/libs/@hono/node-server.mjs +436 -0
  18. package/dist/_chunks/libs/@msgpack/msgpack.mjs +805 -0
  19. package/dist/_chunks/libs/eventemitter3.mjs +243 -0
  20. package/dist/_chunks/libs/fast-equals.mjs +446 -0
  21. package/dist/_chunks/libs/hono.mjs +1829 -0
  22. package/dist/_chunks/libs/p-queue.mjs +449 -0
  23. package/dist/_chunks/libs/parse-ms.mjs +36 -0
  24. package/dist/_chunks/libs/picomatch.mjs +1673 -0
  25. package/dist/_chunks/libs/pretty-ms.mjs +80 -0
  26. package/dist/_chunks/libs/remeda.mjs +482 -0
  27. package/dist/_chunks/libs/strip-indent.mjs +15 -0
  28. package/dist/_chunks/libs/ufo.mjs +166 -0
  29. package/dist/_chunks/likec4lib.mjs +9 -0
  30. package/dist/_chunks/mcp.mjs +33 -0
  31. package/dist/_chunks/module.mjs +28 -0
  32. package/dist/_chunks/module2.mjs +6576 -0
  33. package/dist/_chunks/protocol.d.mts +311 -0
  34. package/dist/_chunks/protocol.mjs +78 -0
  35. package/dist/_chunks/rolldown-runtime.mjs +42 -0
  36. package/dist/ast.d.mts +4 -0
  37. package/dist/ast.mjs +4 -0
  38. package/dist/browser-worker.d.mts +1 -0
  39. package/dist/browser-worker.mjs +6 -0
  40. package/dist/browser.d.mts +11 -0
  41. package/dist/browser.mjs +27 -0
  42. package/dist/bundled.d.mts +28 -0
  43. package/dist/bundled.mjs +51 -4853
  44. package/dist/common-exports.d.mts +4 -0
  45. package/dist/common-exports.mjs +5 -0
  46. package/dist/filesystem/index.d.mts +4 -0
  47. package/dist/filesystem/index.mjs +3 -0
  48. package/dist/generated/ast.d.mts +2 -0
  49. package/dist/generated/ast.mjs +3 -0
  50. package/dist/generated/grammar.d.mts +6 -0
  51. package/dist/generated/grammar.mjs +3 -0
  52. package/dist/generated/module.d.mts +14 -0
  53. package/dist/generated/module.mjs +3 -0
  54. package/dist/generated-lib/icons.d.mts +4 -0
  55. package/dist/generated-lib/icons.mjs +3 -0
  56. package/dist/index.d.mts +4 -0
  57. package/dist/index.mjs +48 -0
  58. package/dist/likec4lib.d.mts +9 -0
  59. package/dist/likec4lib.mjs +4 -0
  60. package/dist/mcp/index.d.mts +4 -0
  61. package/dist/mcp/index.mjs +3 -0
  62. package/dist/module.d.mts +4 -0
  63. package/dist/module.mjs +3 -0
  64. package/dist/protocol.d.mts +2 -0
  65. package/dist/protocol.mjs +3 -0
  66. package/likec4lib/package.json +2 -2
  67. package/package.json +106 -63
  68. package/protocol/package.json +2 -2
  69. package/dist/LikeC4LanguageServices.d.ts +0 -115
  70. package/dist/LikeC4LanguageServices.js +0 -164
  71. package/dist/Rpc.d.ts +0 -9
  72. package/dist/Rpc.js +0 -276
  73. package/dist/ast.d.ts +0 -226
  74. package/dist/ast.js +0 -264
  75. package/dist/browser-worker.d.ts +0 -1
  76. package/dist/browser-worker.js +0 -4
  77. package/dist/browser.d.ts +0 -10
  78. package/dist/browser.js +0 -34
  79. package/dist/bundled.d.ts +0 -8
  80. package/dist/bundled.js +0 -44
  81. package/dist/documentation/documentation-provider.d.ts +0 -8
  82. package/dist/documentation/documentation-provider.js +0 -51
  83. package/dist/documentation/index.d.ts +0 -1
  84. package/dist/documentation/index.js +0 -1
  85. package/dist/empty.d.ts +0 -2
  86. package/dist/empty.js +0 -2
  87. package/dist/filesystem/ChokidarWatcher.d.ts +0 -19
  88. package/dist/filesystem/ChokidarWatcher.js +0 -133
  89. package/dist/filesystem/FileSystemWatcher.d.ts +0 -19
  90. package/dist/filesystem/FileSystemWatcher.js +0 -14
  91. package/dist/filesystem/LikeC4FileSystem.d.ts +0 -3
  92. package/dist/filesystem/LikeC4FileSystem.js +0 -140
  93. package/dist/filesystem/index.d.ts +0 -55
  94. package/dist/filesystem/index.js +0 -29
  95. package/dist/formatting/LikeC4Formatter.d.ts +0 -59
  96. package/dist/formatting/LikeC4Formatter.js +0 -637
  97. package/dist/formatting/utils.d.ts +0 -6
  98. package/dist/formatting/utils.js +0 -18
  99. package/dist/generated/ast.d.ts +0 -1411
  100. package/dist/generated/ast.js +0 -2207
  101. package/dist/generated/grammar.d.ts +0 -6
  102. package/dist/generated/grammar.js +0 -7
  103. package/dist/generated/module.d.ts +0 -14
  104. package/dist/generated/module.js +0 -27
  105. package/dist/generated-lib/icons.d.ts +0 -1
  106. package/dist/generated-lib/icons.js +0 -18
  107. package/dist/index.d.ts +0 -37
  108. package/dist/index.js +0 -54
  109. package/dist/likec4lib.d.ts +0 -6
  110. package/dist/likec4lib.js +0 -7
  111. package/dist/logger.d.ts +0 -17
  112. package/dist/logger.js +0 -81
  113. package/dist/lsp/CodeActionProvider.d.ts +0 -14
  114. package/dist/lsp/CodeActionProvider.js +0 -33
  115. package/dist/lsp/CodeLensProvider.d.ts +0 -9
  116. package/dist/lsp/CodeLensProvider.js +0 -44
  117. package/dist/lsp/CompletionProvider.d.ts +0 -13
  118. package/dist/lsp/CompletionProvider.js +0 -238
  119. package/dist/lsp/DocumentHighlightProvider.d.ts +0 -9
  120. package/dist/lsp/DocumentHighlightProvider.js +0 -10
  121. package/dist/lsp/DocumentLinkProvider.d.ts +0 -11
  122. package/dist/lsp/DocumentLinkProvider.js +0 -58
  123. package/dist/lsp/DocumentSymbolProvider.d.ts +0 -33
  124. package/dist/lsp/DocumentSymbolProvider.js +0 -317
  125. package/dist/lsp/HoverProvider.d.ts +0 -10
  126. package/dist/lsp/HoverProvider.js +0 -106
  127. package/dist/lsp/RenameProvider.d.ts +0 -5
  128. package/dist/lsp/RenameProvider.js +0 -6
  129. package/dist/lsp/SemanticTokenProvider.d.ts +0 -19
  130. package/dist/lsp/SemanticTokenProvider.js +0 -305
  131. package/dist/lsp/index.d.ts +0 -8
  132. package/dist/lsp/index.js +0 -9
  133. package/dist/mcp/MCPServerFactory.d.ts +0 -8
  134. package/dist/mcp/MCPServerFactory.js +0 -73
  135. package/dist/mcp/NoopLikeC4MCPServer.d.ts +0 -9
  136. package/dist/mcp/NoopLikeC4MCPServer.js +0 -17
  137. package/dist/mcp/interfaces.d.ts +0 -13
  138. package/dist/mcp/interfaces.js +0 -4
  139. package/dist/mcp/server/StdioLikeC4MCPServer.d.ts +0 -16
  140. package/dist/mcp/server/StdioLikeC4MCPServer.js +0 -51
  141. package/dist/mcp/server/StreamableLikeC4MCPServer.d.ts +0 -16
  142. package/dist/mcp/server/StreamableLikeC4MCPServer.js +0 -121
  143. package/dist/mcp/server/WithMCPServer.d.ts +0 -4
  144. package/dist/mcp/server/WithMCPServer.js +0 -54
  145. package/dist/mcp/tools/_common.d.ts +0 -88
  146. package/dist/mcp/tools/_common.js +0 -49
  147. package/dist/mcp/tools/find-relationships.d.ts +0 -202
  148. package/dist/mcp/tools/find-relationships.js +0 -150
  149. package/dist/mcp/tools/list-projects.d.ts +0 -194
  150. package/dist/mcp/tools/list-projects.js +0 -62
  151. package/dist/mcp/tools/open-view.d.ts +0 -200
  152. package/dist/mcp/tools/open-view.js +0 -52
  153. package/dist/mcp/tools/read-deployment.d.ts +0 -200
  154. package/dist/mcp/tools/read-deployment.js +0 -150
  155. package/dist/mcp/tools/read-element.d.ts +0 -200
  156. package/dist/mcp/tools/read-element.js +0 -218
  157. package/dist/mcp/tools/read-project-summary.d.ts +0 -198
  158. package/dist/mcp/tools/read-project-summary.js +0 -176
  159. package/dist/mcp/tools/read-view.d.ts +0 -200
  160. package/dist/mcp/tools/read-view.js +0 -203
  161. package/dist/mcp/tools/search-element.d.ts +0 -198
  162. package/dist/mcp/tools/search-element.js +0 -177
  163. package/dist/mcp/utils.d.ts +0 -18
  164. package/dist/mcp/utils.js +0 -48
  165. package/dist/model/builder/MergedExtends.d.ts +0 -13
  166. package/dist/model/builder/MergedExtends.js +0 -74
  167. package/dist/model/builder/MergedSpecification.d.ts +0 -32
  168. package/dist/model/builder/MergedSpecification.js +0 -175
  169. package/dist/model/builder/buildModel.d.ts +0 -16
  170. package/dist/model/builder/buildModel.js +0 -245
  171. package/dist/model/deployments-index.d.ts +0 -10
  172. package/dist/model/deployments-index.js +0 -102
  173. package/dist/model/fqn-index.d.ts +0 -61
  174. package/dist/model/fqn-index.js +0 -253
  175. package/dist/model/index.d.ts +0 -6
  176. package/dist/model/index.js +0 -6
  177. package/dist/model/model-builder.d.ts +0 -54
  178. package/dist/model/model-builder.js +0 -233
  179. package/dist/model/model-locator.d.ts +0 -39
  180. package/dist/model/model-locator.js +0 -240
  181. package/dist/model/model-parser-where.d.ts +0 -4
  182. package/dist/model/model-parser-where.js +0 -81
  183. package/dist/model/model-parser.d.ts +0 -645
  184. package/dist/model/model-parser.js +0 -133
  185. package/dist/model/parser/Base.d.ts +0 -69
  186. package/dist/model/parser/Base.js +0 -382
  187. package/dist/model/parser/DeploymentModelParser.d.ts +0 -71
  188. package/dist/model/parser/DeploymentModelParser.js +0 -176
  189. package/dist/model/parser/DeploymentViewParser.d.ts +0 -75
  190. package/dist/model/parser/DeploymentViewParser.js +0 -86
  191. package/dist/model/parser/FqnRefParser.d.ts +0 -66
  192. package/dist/model/parser/FqnRefParser.js +0 -382
  193. package/dist/model/parser/GlobalsParser.d.ts +0 -109
  194. package/dist/model/parser/GlobalsParser.js +0 -84
  195. package/dist/model/parser/ImportsParser.d.ts +0 -46
  196. package/dist/model/parser/ImportsParser.js +0 -24
  197. package/dist/model/parser/ModelParser.d.ts +0 -71
  198. package/dist/model/parser/ModelParser.js +0 -209
  199. package/dist/model/parser/PredicatesParser.d.ts +0 -75
  200. package/dist/model/parser/PredicatesParser.js +0 -45
  201. package/dist/model/parser/SpecificationParser.d.ts +0 -53
  202. package/dist/model/parser/SpecificationParser.js +0 -113
  203. package/dist/model/parser/ValueConverter.d.ts +0 -4
  204. package/dist/model/parser/ValueConverter.js +0 -12
  205. package/dist/model/parser/ViewsParser.d.ts +0 -112
  206. package/dist/model/parser/ViewsParser.js +0 -492
  207. package/dist/model-change/ModelChanges.d.ts +0 -18
  208. package/dist/model-change/ModelChanges.js +0 -129
  209. package/dist/model-change/changeElementStyle.d.ts +0 -16
  210. package/dist/model-change/changeElementStyle.js +0 -134
  211. package/dist/model-change/changeViewLayout.d.ts +0 -12
  212. package/dist/model-change/changeViewLayout.js +0 -28
  213. package/dist/model-change/removeManualLayoutV1.d.ts +0 -7
  214. package/dist/model-change/removeManualLayoutV1.js +0 -27
  215. package/dist/module.d.ts +0 -92
  216. package/dist/module.js +0 -143
  217. package/dist/protocol.d.ts +0 -289
  218. package/dist/protocol.js +0 -123
  219. package/dist/references/index.d.ts +0 -3
  220. package/dist/references/index.js +0 -3
  221. package/dist/references/name-provider.d.ts +0 -9
  222. package/dist/references/name-provider.js +0 -37
  223. package/dist/references/scope-computation.d.ts +0 -20
  224. package/dist/references/scope-computation.js +0 -288
  225. package/dist/references/scope-provider.d.ts +0 -40
  226. package/dist/references/scope-provider.js +0 -239
  227. package/dist/shared/NodeKindProvider.d.ts +0 -15
  228. package/dist/shared/NodeKindProvider.js +0 -57
  229. package/dist/shared/WorkspaceSymbolProvider.d.ts +0 -3
  230. package/dist/shared/WorkspaceSymbolProvider.js +0 -3
  231. package/dist/shared/index.d.ts +0 -2
  232. package/dist/shared/index.js +0 -2
  233. package/dist/test/index.d.ts +0 -1
  234. package/dist/test/index.js +0 -1
  235. package/dist/test/testServices.d.ts +0 -64
  236. package/dist/test/testServices.js +0 -210
  237. package/dist/utils/disposable.d.ts +0 -8
  238. package/dist/utils/disposable.js +0 -26
  239. package/dist/utils/elementRef.d.ts +0 -11
  240. package/dist/utils/elementRef.js +0 -33
  241. package/dist/utils/fqnRef.d.ts +0 -11
  242. package/dist/utils/fqnRef.js +0 -63
  243. package/dist/utils/index.d.ts +0 -11
  244. package/dist/utils/index.js +0 -35
  245. package/dist/utils/printDocs.d.ts +0 -2
  246. package/dist/utils/printDocs.js +0 -1
  247. package/dist/utils/projectId.d.ts +0 -4
  248. package/dist/utils/projectId.js +0 -16
  249. package/dist/utils/stringHash.d.ts +0 -1
  250. package/dist/utils/stringHash.js +0 -5
  251. package/dist/validation/DocumentValidator.d.ts +0 -11
  252. package/dist/validation/DocumentValidator.js +0 -17
  253. package/dist/validation/_shared.d.ts +0 -3
  254. package/dist/validation/_shared.js +0 -26
  255. package/dist/validation/deployment-checks.d.ts +0 -7
  256. package/dist/validation/deployment-checks.js +0 -140
  257. package/dist/validation/dynamic-view.d.ts +0 -6
  258. package/dist/validation/dynamic-view.js +0 -67
  259. package/dist/validation/element-ref.d.ts +0 -4
  260. package/dist/validation/element-ref.js +0 -12
  261. package/dist/validation/element.d.ts +0 -4
  262. package/dist/validation/element.js +0 -49
  263. package/dist/validation/imports.d.ts +0 -4
  264. package/dist/validation/imports.js +0 -46
  265. package/dist/validation/index.d.ts +0 -15
  266. package/dist/validation/index.js +0 -167
  267. package/dist/validation/property-checks.d.ts +0 -7
  268. package/dist/validation/property-checks.js +0 -108
  269. package/dist/validation/relation.d.ts +0 -6
  270. package/dist/validation/relation.js +0 -141
  271. package/dist/validation/specification.d.ts +0 -12
  272. package/dist/validation/specification.js +0 -190
  273. package/dist/validation/view-checks.d.ts +0 -4
  274. package/dist/validation/view-checks.js +0 -46
  275. package/dist/validation/view-predicates/fqn-expr-with.d.ts +0 -4
  276. package/dist/validation/view-predicates/fqn-expr-with.js +0 -43
  277. package/dist/validation/view-predicates/fqn-ref-expr.d.ts +0 -4
  278. package/dist/validation/view-predicates/fqn-ref-expr.js +0 -51
  279. package/dist/validation/view-predicates/incoming.d.ts +0 -4
  280. package/dist/validation/view-predicates/incoming.js +0 -16
  281. package/dist/validation/view-predicates/index.d.ts +0 -6
  282. package/dist/validation/view-predicates/index.js +0 -6
  283. package/dist/validation/view-predicates/outgoing.d.ts +0 -4
  284. package/dist/validation/view-predicates/outgoing.js +0 -20
  285. package/dist/validation/view-predicates/relation-expr.d.ts +0 -4
  286. package/dist/validation/view-predicates/relation-expr.js +0 -46
  287. package/dist/validation/view-predicates/relation-with.d.ts +0 -4
  288. package/dist/validation/view-predicates/relation-with.js +0 -16
  289. package/dist/validation/view.d.ts +0 -4
  290. package/dist/validation/view.js +0 -42
  291. package/dist/view-utils/assignNavigateTo.d.ts +0 -2
  292. package/dist/view-utils/assignNavigateTo.js +0 -27
  293. package/dist/view-utils/index.d.ts +0 -2
  294. package/dist/view-utils/index.js +0 -2
  295. package/dist/view-utils/manual-layout.d.ts +0 -13
  296. package/dist/view-utils/manual-layout.js +0 -149
  297. package/dist/views/ConfigurableLayouter.d.ts +0 -7
  298. package/dist/views/ConfigurableLayouter.js +0 -51
  299. package/dist/views/LikeC4ManualLayouts.d.ts +0 -42
  300. package/dist/views/LikeC4ManualLayouts.js +0 -209
  301. package/dist/views/LikeC4Views.d.ts +0 -89
  302. package/dist/views/LikeC4Views.js +0 -216
  303. package/dist/views/index.d.ts +0 -4
  304. package/dist/views/index.js +0 -11
  305. package/dist/workspace/AstNodeDescriptionProvider.d.ts +0 -7
  306. package/dist/workspace/AstNodeDescriptionProvider.js +0 -18
  307. package/dist/workspace/IndexManager.d.ts +0 -10
  308. package/dist/workspace/IndexManager.js +0 -26
  309. package/dist/workspace/LangiumDocuments.d.ts +0 -29
  310. package/dist/workspace/LangiumDocuments.js +0 -104
  311. package/dist/workspace/ProjectsManager.d.ts +0 -134
  312. package/dist/workspace/ProjectsManager.js +0 -610
  313. package/dist/workspace/WorkspaceManager.d.ts +0 -31
  314. package/dist/workspace/WorkspaceManager.js +0 -132
  315. package/dist/workspace/index.d.ts +0 -5
  316. package/dist/workspace/index.js +0 -5
@@ -1,305 +0,0 @@
1
- import { isAnyOf, nonNullable } from '@likec4/core/utils';
2
- import { DocumentState } from 'langium';
3
- import { AbstractSemanticTokenProvider, } from 'langium/lsp';
4
- import { isTruthy } from 'remeda';
5
- import { CancellationToken, } from 'vscode-languageserver-protocol';
6
- import { SemanticTokenModifiers, SemanticTokenTypes, } from 'vscode-languageserver-types';
7
- import { ast } from '../ast';
8
- import { logger as rootLogger } from '../logger';
9
- const logger = rootLogger.getChild('SemanticTokenProvider');
10
- const SemanticTypes = { ...SemanticTokenTypes };
11
- const SemanticModifiers = { ...SemanticTokenModifiers };
12
- function createSemanticTypeMethods(applyHighlight) {
13
- const modifier = [];
14
- const self = new Proxy({}, {
15
- get(_, prop) {
16
- if (prop === 'modifier') {
17
- return (mod) => {
18
- modifier.push(mod);
19
- return self;
20
- };
21
- }
22
- if (prop in SemanticModifiers) {
23
- modifier.push(SemanticModifiers[prop]);
24
- return self;
25
- }
26
- if (prop in SemanticTypes) {
27
- return () => applyHighlight(SemanticTypes[prop], modifier);
28
- }
29
- throw new Error(`Unknown semantic token type or modifier: ${prop}`);
30
- },
31
- });
32
- return self;
33
- }
34
- const PRUNE = 'Stop Highlighting';
35
- /**
36
- * Used to stop further highlighting for the current node (processing of its children
37
- */
38
- const stopHighlight = () => {
39
- throw PRUNE;
40
- };
41
- export class LikeC4SemanticTokenProvider extends AbstractSemanticTokenProvider {
42
- services;
43
- rules = [];
44
- constructor(services) {
45
- super(services);
46
- this.services = services;
47
- this.initRules();
48
- }
49
- initRules() {
50
- this.rules = [];
51
- const when = (predicate, highlightFn) => {
52
- const rule = { predicate, highlightFn };
53
- this.rules.push(rule);
54
- };
55
- when(ast.isRelationshipKind, mark => {
56
- mark.property('name').function();
57
- });
58
- when(isAnyOf(ast.isRelation, ast.isOutgoingRelationExpr, ast.isDeploymentRelation), mark => {
59
- mark.property('kind').function();
60
- });
61
- when(ast.isLibIcon, mark => {
62
- mark.property('name').definition.function();
63
- stopHighlight();
64
- });
65
- when(isAnyOf(ast.isNavigateToProperty, ast.isRelationNavigateToProperty), mark => {
66
- mark.property('value').readonly.definition.interface();
67
- stopHighlight();
68
- });
69
- when(ast.isWildcardExpression, mark => {
70
- mark.cst().readonly.definition.variable();
71
- stopHighlight();
72
- });
73
- when(ast.isFqnRefExpr, mark => {
74
- if (!mark.node.selector) {
75
- return;
76
- }
77
- if (mark.node.ref.parent) {
78
- mark.property('selector').property();
79
- }
80
- else {
81
- mark.property('selector').readonly.definition.variable();
82
- }
83
- });
84
- when(ast.isTagRef, mark => {
85
- mark.cst().type();
86
- stopHighlight();
87
- });
88
- when(ast.isRelationKindDotRef, mark => {
89
- mark.cst().function();
90
- stopHighlight();
91
- });
92
- when(ast.isWhereRelationKind, mark => {
93
- if (isTruthy(mark.node.value)) {
94
- mark.property('value').function();
95
- }
96
- });
97
- when(isAnyOf(ast.isWhereElement, ast.isWhereRelation), mark => {
98
- if (isTruthy(mark.node.value)) {
99
- mark.property('value').readonly.definition.type();
100
- }
101
- });
102
- when(isAnyOf(ast.isWhereRelationParticipantKind, ast.isWhereRelationParticipantTag), mark => {
103
- mark.property('participant').keyword();
104
- });
105
- when(ast.isElementKindExpression, mark => {
106
- if (isTruthy(mark.node.kind)) {
107
- mark.property('kind').definition.type();
108
- }
109
- });
110
- when(isAnyOf(ast.isGlobalStyleGroup, ast.isGlobalStyle), mark => {
111
- mark.property('id').readonly.definition.variable();
112
- });
113
- when(ast.isViewRuleGlobalStyle, mark => {
114
- mark.property('style').readonly.definition.variable();
115
- });
116
- when(isAnyOf(ast.isGlobalPredicateGroup, ast.isGlobalDynamicPredicateGroup), mark => {
117
- mark.property('name').readonly.definition.variable();
118
- });
119
- when(ast.isViewRuleGlobalPredicateRef, mark => {
120
- mark.property('predicate').readonly.definition.variable();
121
- });
122
- when(ast.isElementTagExpression, mark => {
123
- if (isTruthy(mark.node.tag)) {
124
- mark.property('tag').definition.type();
125
- }
126
- });
127
- when(isAnyOf(ast.isFqnRef, ast.isStrictFqnRef), mark => {
128
- if (!mark.node.parent) {
129
- mark.property('value').readonly.definition.variable();
130
- stopHighlight();
131
- }
132
- else {
133
- mark.property('value').property();
134
- }
135
- });
136
- when(ast.isStrictFqnElementRef, mark => {
137
- if (!mark.node.parent) {
138
- mark.property('el').readonly.definition.variable();
139
- stopHighlight();
140
- }
141
- else {
142
- mark.property('el').property();
143
- }
144
- });
145
- when(ast.isSpecificationColor, mark => {
146
- mark.keyword('color').keyword();
147
- mark.property('name').readonly.declaration.type();
148
- });
149
- when(ast.isSpecificationTag, mark => {
150
- if (isTruthy(mark.node.color)) {
151
- mark.keyword('color').property();
152
- }
153
- });
154
- when(isAnyOf(ast.isSpecificationElementKind, ast.isSpecificationRelationshipKind, ast.isSpecificationDeploymentNodeKind), mark => {
155
- mark.property('kind').readonly.declaration.type();
156
- });
157
- when(ast.isTag, mark => {
158
- mark.property('name').definition.type();
159
- });
160
- when(ast.isOpacityProperty, mark => {
161
- mark.property('value').number();
162
- });
163
- when(ast.isIconProperty, mark => {
164
- if (mark.node.libicon || mark.node.value === 'none') {
165
- mark.property(mark.node.libicon ? 'libicon' : 'value').defaultLibrary.enum();
166
- return;
167
- }
168
- mark.property('value').string();
169
- });
170
- when(ast.isLinkProperty, mark => {
171
- if (isTruthy(mark.node.value)) {
172
- mark.property('value').string();
173
- }
174
- });
175
- when(ast.isColorProperty, mark => {
176
- if (isTruthy(mark.node.customColor)) {
177
- mark.property('customColor').enum();
178
- }
179
- if (isTruthy(mark.node.themeColor)) {
180
- mark.property('themeColor').enum();
181
- }
182
- });
183
- when(isAnyOf(ast.isShapeProperty, ast.isArrowProperty, ast.isLineProperty, ast.isBorderProperty, ast.isSizeProperty, ast.isDynamicViewDisplayVariantProperty), mark => {
184
- if (isTruthy(mark.node.value)) {
185
- mark.property('value').enum();
186
- }
187
- });
188
- }
189
- async semanticHighlight(document, params, cancelToken = CancellationToken.None) {
190
- if (document.state < DocumentState.Linked) {
191
- await this.ensureState(document, cancelToken);
192
- }
193
- return await super.semanticHighlight(document, params, cancelToken);
194
- }
195
- async semanticHighlightRange(document, params, cancelToken = CancellationToken.None) {
196
- if (document.state < DocumentState.Linked) {
197
- await this.ensureState(document, cancelToken);
198
- }
199
- return await super.semanticHighlightRange(document, params, cancelToken);
200
- }
201
- async semanticHighlightDelta(document, params, cancelToken = CancellationToken.None) {
202
- if (document.state < DocumentState.Linked) {
203
- await this.ensureState(document, cancelToken);
204
- }
205
- return await super.semanticHighlightDelta(document, params, cancelToken);
206
- }
207
- async ensureState(document, cancelToken) {
208
- if (document.state < DocumentState.Linked) {
209
- logger.debug `waiting for document ${document.uri.path} to be ${'Linked'}`;
210
- await this.services.shared.workspace.DocumentBuilder.waitUntil(DocumentState.Linked, document.uri, cancelToken);
211
- logger.debug `document ${document.uri.path} is ${'Linked'}`;
212
- }
213
- }
214
- highlightElement(node, acceptor) {
215
- if (isAnyOf(ast.isElement, ast.isDeploymentNode, ast.isDeployedInstance)(node)) {
216
- return this.highlightNameAndKind(node);
217
- }
218
- if (ast.isLikeC4View(node)) {
219
- return this.highlightView(node);
220
- }
221
- if (ast.isAnyProperty(node) &&
222
- !isAnyOf(ast.isMetadataProperty, ast.isElementStyleProperty, ast.isRelationStyleProperty)(node) &&
223
- isTruthy(node.key)) {
224
- acceptor({
225
- node,
226
- property: 'key',
227
- type: SemanticTokenTypes.property,
228
- });
229
- }
230
- let m;
231
- for (const { predicate, highlightFn } of this.rules) {
232
- if (predicate(node)) {
233
- try {
234
- m ??= this.mark(node);
235
- highlightFn(m);
236
- }
237
- catch (error) {
238
- if (error === PRUNE) {
239
- return 'prune';
240
- }
241
- logger.warn(`Error highlighting node of type ${node._type}`, { error });
242
- }
243
- }
244
- }
245
- }
246
- highlightNameAndKind(node) {
247
- const mark = this.mark(node);
248
- mark.property('name').declaration.readonly.variable();
249
- if (!ast.isDeployedInstance(node)) {
250
- this.mark(node).property('kind').keyword();
251
- }
252
- if (ast.isElement(node)) {
253
- if (node.props.length > 0) {
254
- this.mark(node).property('props').string();
255
- }
256
- return;
257
- }
258
- // This is DeploymentNode
259
- if (node.title) {
260
- this.mark(node).property('title').string();
261
- }
262
- }
263
- highlightView(node) {
264
- if (node.name) {
265
- const mark = this.mark(node);
266
- mark.property('name')
267
- .modifier('local')
268
- .declaration
269
- .readonly
270
- .interface();
271
- }
272
- }
273
- mark(node) {
274
- const cst = (cstNode) => {
275
- return createSemanticTypeMethods((type, modifier) => this.highlightToken({
276
- range: nonNullable(cstNode ?? node.$cstNode, 'AST node has no CST node').range,
277
- type,
278
- modifier,
279
- }));
280
- };
281
- const keyword = (keyword) => {
282
- return createSemanticTypeMethods((type, modifier) => this.highlightKeyword({
283
- node,
284
- keyword,
285
- type,
286
- modifier,
287
- }));
288
- };
289
- const property = (property, index) => {
290
- return createSemanticTypeMethods((type, modifier) => this.highlightProperty({
291
- node,
292
- property,
293
- type,
294
- modifier,
295
- ...(index !== undefined ? { index } : {}),
296
- }));
297
- };
298
- return {
299
- node,
300
- cst,
301
- keyword,
302
- property,
303
- };
304
- }
305
- }
@@ -1,8 +0,0 @@
1
- export * from './CodeLensProvider';
2
- export * from './CompletionProvider';
3
- export * from './DocumentHighlightProvider';
4
- export * from './DocumentLinkProvider';
5
- export * from './DocumentSymbolProvider';
6
- export * from './HoverProvider';
7
- export * from './CodeActionProvider';
8
- export * from './SemanticTokenProvider';
package/dist/lsp/index.js DELETED
@@ -1,9 +0,0 @@
1
- export * from './CodeLensProvider';
2
- export * from './CompletionProvider';
3
- export * from './DocumentHighlightProvider';
4
- export * from './DocumentLinkProvider';
5
- export * from './DocumentSymbolProvider';
6
- export * from './HoverProvider';
7
- // export * from './RenameProvider'
8
- export * from './CodeActionProvider';
9
- export * from './SemanticTokenProvider';
@@ -1,8 +0,0 @@
1
- import type { ServerOptions } from '@modelcontextprotocol/sdk/server/index.js';
2
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
- import type { LikeC4Services } from '../module';
4
- export declare class LikeC4MCPServerFactory {
5
- private services;
6
- constructor(services: LikeC4Services);
7
- create(options?: ServerOptions): McpServer;
8
- }
@@ -1,73 +0,0 @@
1
- import { loggable } from '@likec4/log';
2
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
- import packageJson from '../../package.json' with { type: 'json' };
4
- import { logger } from '../logger';
5
- import { findRelationships } from './tools/find-relationships';
6
- import { listProjects } from './tools/list-projects';
7
- import { openView } from './tools/open-view';
8
- import { readDeployment } from './tools/read-deployment';
9
- import { readElement } from './tools/read-element';
10
- import { readProjectSummary } from './tools/read-project-summary';
11
- import { readView } from './tools/read-view';
12
- import { searchElement } from './tools/search-element';
13
- export class LikeC4MCPServerFactory {
14
- services;
15
- constructor(services) {
16
- this.services = services;
17
- }
18
- create(options) {
19
- const isInEditor = this.services.shared.lsp.Connection !== undefined;
20
- const mcp = new McpServer({
21
- name: 'LikeC4',
22
- version: packageJson.version,
23
- }, {
24
- instructions: `LikeC4 MCP – query and navigate LikeC4 models.
25
-
26
- Conventions:
27
- - All tools are read-only and idempotent.
28
- - "project" is optional and defaults to "default".
29
-
30
- Available tools:
31
- - list-projects — List all LikeC4 projects in the workspace.
32
- - read-project-summary — Project specification (element kinds, deployment node kinds, tags, metadata keys), all elements, deployment nodes and views. Input: { project? }.
33
- - search-element — Search elements and deployment nodes across all projects by id/title/kind/shape/tags/metadata. Input: { search }.
34
- - read-element — Full element details including relationships, includedInViews, deployedInstances, metadata and sourceLocation. Input: { id, project? }.
35
- - read-deployment — Details of a deployment node or deployed instance. Input: { id, project? }.
36
- - read-view — Full view details (nodes/edges) and sourceLocation. Input: { viewId, project? }.
37
- - find-relationships — Direct and indirect relationships between two elements in a project. Input: { element1, element2, project? }.
38
- ${isInEditor
39
- ? '- open-view — Opens the LikeC4 view panel in the editor. Triggers UI; at most one preview panel at a time. Input: { viewId, project? }.'
40
- : ''}
41
-
42
- Instructions:
43
- - Identify the project first
44
- - Use "search-element" to find elements by id/title/kind/shape/tags/metadata and select the project
45
- - Use "read-project-summary" to find all elements and deployment nodes inside the project, what kinds, tags, metadata keys are available
46
- - Use "list-projects" to list all available projects
47
- - If response returns "sourceLocation", provide link to this location in the editor
48
-
49
- Full documentation: https://likec4.dev/llms-full.txt
50
- `,
51
- enforceStrictCapabilities: true,
52
- ...options,
53
- capabilities: {
54
- tools: {},
55
- ...options?.capabilities,
56
- },
57
- });
58
- mcp.registerTool(...listProjects(this.services.likec4.LanguageServices));
59
- mcp.registerTool(...readProjectSummary(this.services.likec4.LanguageServices));
60
- mcp.registerTool(...readElement(this.services.likec4.LanguageServices));
61
- mcp.registerTool(...readDeployment(this.services.likec4.LanguageServices));
62
- mcp.registerTool(...readView(this.services.likec4.LanguageServices));
63
- mcp.registerTool(...searchElement(this.services.likec4.LanguageServices));
64
- mcp.registerTool(...findRelationships(this.services.likec4.LanguageServices));
65
- if (isInEditor) {
66
- mcp.registerTool(...openView(this.services.likec4.LanguageServices));
67
- }
68
- mcp.server.onerror = (err) => {
69
- logger.error(loggable(err));
70
- };
71
- return mcp;
72
- }
73
- }
@@ -1,9 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import type { LikeC4MCPServer } from './interfaces';
3
- export declare class NoopLikeC4MCPServer implements LikeC4MCPServer {
4
- get mcp(): McpServer;
5
- get isStarted(): boolean;
6
- get port(): number;
7
- start(): Promise<void>;
8
- stop(): Promise<void>;
9
- }
@@ -1,17 +0,0 @@
1
- export class NoopLikeC4MCPServer {
2
- get mcp() {
3
- throw new Error('NoopLikeC4MCPServer does not have a McpServer');
4
- }
5
- get isStarted() {
6
- return false;
7
- }
8
- get port() {
9
- return NaN;
10
- }
11
- start() {
12
- return Promise.resolve();
13
- }
14
- stop() {
15
- return Promise.resolve();
16
- }
17
- }
@@ -1,13 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import type { LikeC4Services } from '../module';
3
- export interface LikeC4MCPServer {
4
- readonly mcp: McpServer;
5
- readonly isStarted: boolean;
6
- readonly port: number;
7
- start(port?: number): Promise<void>;
8
- stop(): Promise<void>;
9
- }
10
- export interface LikeC4MCPServerModuleContext {
11
- mcpServer: (services: LikeC4Services) => LikeC4MCPServer;
12
- }
13
- export declare const NoMCPServer: LikeC4MCPServerModuleContext;
@@ -1,4 +0,0 @@
1
- import { NoopLikeC4MCPServer } from './NoopLikeC4MCPServer';
2
- export const NoMCPServer = {
3
- mcpServer: () => new NoopLikeC4MCPServer(),
4
- };
@@ -1,16 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import type { AsyncDisposable } from 'langium';
3
- import type { LikeC4Services } from '../../module';
4
- import type { LikeC4MCPServer } from '../interfaces';
5
- export declare class StdioLikeC4MCPServer implements LikeC4MCPServer, AsyncDisposable {
6
- private services;
7
- private transport;
8
- private _mcp;
9
- constructor(services: LikeC4Services);
10
- get mcp(): McpServer;
11
- get isStarted(): boolean;
12
- get port(): number;
13
- dispose(): Promise<void>;
14
- start(): Promise<void>;
15
- stop(): Promise<void>;
16
- }
@@ -1,51 +0,0 @@
1
- import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
2
- import { logger } from '../utils';
3
- export class StdioLikeC4MCPServer {
4
- services;
5
- transport = undefined;
6
- _mcp = undefined;
7
- constructor(services) {
8
- this.services = services;
9
- }
10
- get mcp() {
11
- if (!this._mcp) {
12
- throw new Error('MCP server is not started');
13
- }
14
- return this._mcp;
15
- }
16
- get isStarted() {
17
- return this.transport !== undefined;
18
- }
19
- get port() {
20
- return NaN;
21
- }
22
- async dispose() {
23
- await this.stop();
24
- }
25
- async start() {
26
- if (this.transport) {
27
- return;
28
- }
29
- logger.info('Starting MCP stdio server');
30
- this._mcp = this.services.mcp.ServerFactory.create();
31
- this.transport = new StdioServerTransport();
32
- await this._mcp.connect(this.transport);
33
- logger.info('LikeC4 MCP Server running on stdio');
34
- }
35
- async stop() {
36
- if (!this.transport) {
37
- return;
38
- }
39
- try {
40
- logger.info('Stopping MCP stdio server');
41
- await this.transport.close();
42
- if (this._mcp) {
43
- await this._mcp.close();
44
- }
45
- }
46
- finally {
47
- this._mcp = undefined;
48
- this.transport = undefined;
49
- }
50
- }
51
- }
@@ -1,16 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import type { AsyncDisposable } from 'langium';
3
- import type { LikeC4Services } from '../../module';
4
- import type { LikeC4MCPServer } from '../interfaces';
5
- export declare class StreamableLikeC4MCPServer implements LikeC4MCPServer, AsyncDisposable {
6
- private services;
7
- private _port;
8
- private server;
9
- constructor(services: LikeC4Services, _port?: number);
10
- get mcp(): McpServer;
11
- get isStarted(): boolean;
12
- get port(): number;
13
- dispose(): Promise<void>;
14
- start(port?: number): Promise<void>;
15
- stop(): Promise<void>;
16
- }
@@ -1,121 +0,0 @@
1
- import { serve } from '@hono/node-server';
2
- import { loggable } from '@likec4/log';
3
- import { WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js';
4
- import { Hono } from 'hono';
5
- import { cors } from 'hono/cors';
6
- import { nanoid } from 'nanoid';
7
- import { logger } from '../utils';
8
- async function createHonoApp(factory) {
9
- const mcp = factory.create();
10
- const transport = new WebStandardStreamableHTTPServerTransport({
11
- sessionIdGenerator: () => nanoid(),
12
- });
13
- const app = new Hono();
14
- // Enable CORS for all origins
15
- app.use('*', cors({
16
- origin: '*',
17
- allowHeaders: ['Content-Type', 'mcp-session-id', 'Last-Event-ID', 'mcp-protocol-version'],
18
- exposeHeaders: ['mcp-session-id', 'mcp-protocol-version'],
19
- }));
20
- // Health check endpoint
21
- app.get('/health', c => c.json({ status: 'ok' }));
22
- // MCP endpoint
23
- app.all('/mcp', c => transport.handleRequest(c.req.raw));
24
- app.notFound((c) => {
25
- logger.debug(`${c.req.method} ${c.req.url} not found`);
26
- return c.json({
27
- jsonrpc: '2.0',
28
- error: {
29
- code: -32000,
30
- message: 'Method not found.',
31
- },
32
- id: null,
33
- }, { status: 404 });
34
- });
35
- app.onError((e, c) => {
36
- logger.error(loggable(e));
37
- return c.json({
38
- jsonrpc: '2.0',
39
- error: {
40
- code: -32603,
41
- message: 'Internal server error',
42
- },
43
- id: null,
44
- }, { status: 500 });
45
- });
46
- await mcp.connect(transport);
47
- return app;
48
- }
49
- async function startServer(params) {
50
- const { factory, port } = params;
51
- const app = await createHonoApp(factory);
52
- return new Promise((resolve, reject) => {
53
- const server = serve({
54
- fetch: app.fetch,
55
- hostname: '0.0.0.0',
56
- port,
57
- })
58
- .prependOnceListener('error', reject)
59
- .prependOnceListener('listening', () => {
60
- server.removeListener('error', reject);
61
- resolve(server.unref());
62
- });
63
- });
64
- }
65
- export class StreamableLikeC4MCPServer {
66
- services;
67
- _port;
68
- // Store transports by session ID to send notifications
69
- server = undefined;
70
- constructor(services, _port = 33335) {
71
- this.services = services;
72
- this._port = _port;
73
- }
74
- get mcp() {
75
- throw new Error('StreamableLikeC4MCPServer has access to McpServer only during the request');
76
- }
77
- get isStarted() {
78
- return this.server?.listening === true;
79
- }
80
- get port() {
81
- return this._port;
82
- }
83
- async dispose() {
84
- await this.stop();
85
- }
86
- async start(port = this._port) {
87
- if (this.server) {
88
- if (this.port === port) {
89
- return;
90
- }
91
- await this.stop();
92
- }
93
- logger.info('Starting MCP server on port {port}', { port });
94
- this._port = port;
95
- this.server = await startServer({
96
- factory: this.services.mcp.ServerFactory,
97
- port,
98
- });
99
- logger.info('MCP server ready at http://0.0.0.0:{port}/mcp', { port });
100
- }
101
- stop() {
102
- const server = this.server;
103
- if (!server) {
104
- logger.info('MCP server is not running, nothing to stop');
105
- return Promise.resolve();
106
- }
107
- logger.info('Stopping MCP server');
108
- this.server = undefined;
109
- return new Promise((resolve) => {
110
- server.close((err) => {
111
- if (err) {
112
- logger.error('Failed to stop MCP server', { err });
113
- }
114
- else {
115
- logger.info('MCP server stopped');
116
- }
117
- resolve();
118
- });
119
- });
120
- }
121
- }
@@ -1,4 +0,0 @@
1
- import type { LikeC4MCPServerModuleContext } from '../interfaces';
2
- export declare const WithMCPServer: (type?: "stdio" | "sse" | {
3
- port: number;
4
- }) => LikeC4MCPServerModuleContext;