@likec4/language-server 1.42.1 → 1.44.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 (303) hide show
  1. package/browser/package.json +1 -1
  2. package/browser-worker/package.json +1 -1
  3. package/dist/LikeC4LanguageServices.d.ts +12 -19
  4. package/dist/LikeC4LanguageServices.js +182 -0
  5. package/dist/Rpc.js +245 -0
  6. package/dist/ast.d.ts +10 -6
  7. package/dist/ast.js +253 -0
  8. package/dist/browser-worker.js +4 -0
  9. package/dist/browser.js +35 -0
  10. package/dist/bundled.js +42 -0
  11. package/dist/bundled.mjs +3830 -4172
  12. package/dist/documentation/documentation-provider.js +51 -0
  13. package/dist/documentation/index.js +1 -0
  14. package/dist/empty.js +2 -0
  15. package/dist/filesystem/ChokidarWatcher.js +97 -0
  16. package/dist/filesystem/FileSystemWatcher.js +14 -0
  17. package/dist/filesystem/LikeC4FileSystem.d.ts +1 -2
  18. package/dist/filesystem/LikeC4FileSystem.js +126 -0
  19. package/dist/filesystem/index.d.ts +26 -0
  20. package/dist/filesystem/index.js +29 -0
  21. package/dist/formatting/LikeC4Formatter.js +637 -0
  22. package/dist/formatting/utils.js +18 -0
  23. package/dist/generated/ast.d.ts +19 -3
  24. package/dist/generated/ast.js +2155 -0
  25. package/dist/generated/grammar.js +7 -0
  26. package/dist/generated/module.d.ts +6 -1
  27. package/dist/generated/module.js +27 -0
  28. package/dist/generated-lib/{icons.mjs → icons.js} +11 -7
  29. package/dist/index.d.ts +7 -0
  30. package/dist/index.js +53 -0
  31. package/dist/{likec4lib.mjs → likec4lib.js} +3 -3
  32. package/dist/logger.js +81 -0
  33. package/dist/lsp/CodeActionProvider.d.ts +14 -0
  34. package/dist/lsp/CodeActionProvider.js +33 -0
  35. package/dist/lsp/CodeLensProvider.js +44 -0
  36. package/dist/lsp/CompletionProvider.d.ts +3 -1
  37. package/dist/lsp/CompletionProvider.js +200 -0
  38. package/dist/lsp/DocumentHighlightProvider.js +10 -0
  39. package/dist/lsp/DocumentLinkProvider.js +58 -0
  40. package/dist/lsp/DocumentSymbolProvider.js +306 -0
  41. package/dist/lsp/HoverProvider.js +106 -0
  42. package/dist/lsp/RenameProvider.js +6 -0
  43. package/dist/lsp/SemanticTokenProvider.d.ts +5 -0
  44. package/dist/lsp/SemanticTokenProvider.js +257 -0
  45. package/dist/lsp/index.d.ts +1 -0
  46. package/dist/lsp/index.js +9 -0
  47. package/dist/mcp/MCPServerFactory.js +73 -0
  48. package/dist/mcp/NoopLikeC4MCPServer.js +17 -0
  49. package/dist/mcp/interfaces.js +5 -0
  50. package/dist/mcp/server/StdioLikeC4MCPServer.js +47 -0
  51. package/dist/mcp/server/StreamableLikeC4MCPServer.js +145 -0
  52. package/dist/mcp/server/WithMCPServer.js +56 -0
  53. package/dist/mcp/tools/_common.d.ts +8 -7
  54. package/dist/mcp/tools/_common.js +49 -0
  55. package/dist/mcp/tools/find-relationships.d.ts +7 -8
  56. package/dist/mcp/tools/find-relationships.js +150 -0
  57. package/dist/mcp/tools/list-projects.d.ts +3 -3
  58. package/dist/mcp/tools/list-projects.js +62 -0
  59. package/dist/mcp/tools/open-view.d.ts +6 -7
  60. package/dist/mcp/tools/open-view.js +52 -0
  61. package/dist/mcp/tools/read-deployment.d.ts +6 -7
  62. package/dist/mcp/tools/read-deployment.js +132 -0
  63. package/dist/mcp/tools/read-element.d.ts +6 -7
  64. package/dist/mcp/tools/read-element.js +194 -0
  65. package/dist/mcp/tools/read-project-summary.d.ts +5 -6
  66. package/dist/mcp/tools/read-project-summary.js +176 -0
  67. package/dist/mcp/tools/read-view.d.ts +6 -7
  68. package/dist/mcp/tools/read-view.js +203 -0
  69. package/dist/mcp/tools/search-element.d.ts +3 -3
  70. package/dist/mcp/tools/search-element.js +177 -0
  71. package/dist/mcp/utils.d.ts +2 -2
  72. package/dist/mcp/utils.js +48 -0
  73. package/dist/model/builder/MergedExtends.d.ts +2 -1
  74. package/dist/model/builder/MergedExtends.js +74 -0
  75. package/dist/model/builder/MergedSpecification.js +175 -0
  76. package/dist/model/builder/buildModel.js +176 -0
  77. package/dist/model/deployments-index.js +102 -0
  78. package/dist/model/fqn-index.js +250 -0
  79. package/dist/model/index.js +6 -0
  80. package/dist/model/model-builder.d.ts +13 -11
  81. package/dist/model/model-builder.js +234 -0
  82. package/dist/model/model-locator.d.ts +6 -5
  83. package/dist/model/model-locator.js +240 -0
  84. package/dist/model/model-parser-where.js +81 -0
  85. package/dist/model/model-parser.d.ts +318 -313
  86. package/dist/model/model-parser.js +119 -0
  87. package/dist/model/parser/Base.d.ts +3 -3
  88. package/dist/model/parser/Base.js +367 -0
  89. package/dist/model/parser/DeploymentModelParser.d.ts +3 -3
  90. package/dist/model/parser/DeploymentModelParser.js +176 -0
  91. package/dist/model/parser/DeploymentViewParser.d.ts +4 -4
  92. package/dist/model/parser/DeploymentViewParser.js +86 -0
  93. package/dist/model/parser/FqnRefParser.d.ts +3 -3
  94. package/dist/model/parser/FqnRefParser.js +382 -0
  95. package/dist/model/parser/GlobalsParser.d.ts +7 -7
  96. package/dist/model/parser/GlobalsParser.js +84 -0
  97. package/dist/model/parser/ImportsParser.d.ts +12 -13
  98. package/dist/model/parser/ImportsParser.js +24 -0
  99. package/dist/model/parser/ModelParser.d.ts +3 -3
  100. package/dist/model/parser/ModelParser.js +165 -0
  101. package/dist/model/parser/PredicatesParser.d.ts +3 -3
  102. package/dist/model/parser/PredicatesParser.js +45 -0
  103. package/dist/model/parser/SpecificationParser.d.ts +3 -3
  104. package/dist/model/parser/SpecificationParser.js +109 -0
  105. package/dist/model/parser/ValueConverter.js +12 -0
  106. package/dist/model/parser/ViewsParser.d.ts +4 -4
  107. package/dist/model/parser/ViewsParser.js +477 -0
  108. package/dist/model-change/ModelChanges.d.ts +6 -3
  109. package/dist/model-change/ModelChanges.js +102 -0
  110. package/dist/model-change/changeElementStyle.js +134 -0
  111. package/dist/model-change/changeViewLayout.d.ts +2 -2
  112. package/dist/model-change/changeViewLayout.js +28 -0
  113. package/dist/model-change/removeManualLayoutV1.d.ts +7 -0
  114. package/dist/model-change/removeManualLayoutV1.js +27 -0
  115. package/dist/module.d.ts +10 -5
  116. package/dist/module.js +143 -0
  117. package/dist/protocol.d.ts +1 -17
  118. package/dist/protocol.js +114 -0
  119. package/dist/references/index.js +3 -0
  120. package/dist/references/name-provider.js +37 -0
  121. package/dist/references/scope-computation.js +288 -0
  122. package/dist/references/scope-provider.d.ts +3 -3
  123. package/dist/references/scope-provider.js +242 -0
  124. package/dist/shared/NodeKindProvider.js +57 -0
  125. package/dist/shared/{WorkspaceSymbolProvider.mjs → WorkspaceSymbolProvider.js} +1 -1
  126. package/dist/shared/index.js +2 -0
  127. package/dist/test/index.js +1 -0
  128. package/dist/test/testServices.d.ts +16 -16
  129. package/dist/test/testServices.js +210 -0
  130. package/dist/utils/disposable.js +26 -0
  131. package/dist/utils/elementRef.d.ts +1 -1
  132. package/dist/utils/elementRef.js +27 -0
  133. package/dist/utils/fqnRef.js +63 -0
  134. package/dist/utils/index.js +35 -0
  135. package/dist/utils/printDocs.js +1 -0
  136. package/dist/utils/projectId.js +16 -0
  137. package/dist/utils/stringHash.js +5 -0
  138. package/dist/validation/DocumentValidator.js +17 -0
  139. package/dist/validation/_shared.js +26 -0
  140. package/dist/validation/deployment-checks.js +140 -0
  141. package/dist/validation/dynamic-view.js +67 -0
  142. package/dist/validation/element-ref.js +12 -0
  143. package/dist/validation/element.js +49 -0
  144. package/dist/validation/imports.js +46 -0
  145. package/dist/validation/index.d.ts +1 -1
  146. package/dist/validation/index.js +157 -0
  147. package/dist/validation/property-checks.js +108 -0
  148. package/dist/validation/relation.js +55 -0
  149. package/dist/validation/specification.js +190 -0
  150. package/dist/validation/view-predicates/fqn-expr-with.js +43 -0
  151. package/dist/validation/view-predicates/fqn-ref-expr.js +51 -0
  152. package/dist/validation/view-predicates/incoming.js +16 -0
  153. package/dist/validation/view-predicates/index.js +6 -0
  154. package/dist/validation/view-predicates/outgoing.js +20 -0
  155. package/dist/validation/view-predicates/relation-expr.js +46 -0
  156. package/dist/validation/view-predicates/relation-with.js +16 -0
  157. package/dist/validation/view.d.ts +1 -1
  158. package/dist/validation/view.js +42 -0
  159. package/dist/view-utils/assignNavigateTo.js +27 -0
  160. package/dist/view-utils/index.d.ts +1 -0
  161. package/dist/view-utils/index.js +2 -0
  162. package/dist/view-utils/manual-layout.d.ts +6 -0
  163. package/dist/view-utils/manual-layout.js +151 -0
  164. package/dist/views/ConfigurableLayouter.js +51 -0
  165. package/dist/views/LikeC4ManualLayouts.d.ts +28 -0
  166. package/dist/views/LikeC4ManualLayouts.js +132 -0
  167. package/dist/views/{likec4-views.d.ts → LikeC4Views.d.ts} +9 -8
  168. package/dist/views/LikeC4Views.js +200 -0
  169. package/dist/views/index.d.ts +4 -1
  170. package/dist/views/index.js +11 -0
  171. package/dist/workspace/AstNodeDescriptionProvider.js +15 -0
  172. package/dist/workspace/IndexManager.js +21 -0
  173. package/dist/workspace/LangiumDocuments.d.ts +1 -1
  174. package/dist/workspace/LangiumDocuments.js +58 -0
  175. package/dist/workspace/ProjectsManager.d.ts +8 -3
  176. package/dist/workspace/ProjectsManager.js +373 -0
  177. package/dist/workspace/WorkspaceManager.d.ts +3 -2
  178. package/dist/workspace/WorkspaceManager.js +93 -0
  179. package/dist/workspace/index.js +5 -0
  180. package/likec4lib/package.json +1 -1
  181. package/package.json +32 -31
  182. package/protocol/package.json +1 -1
  183. package/dist/LikeC4LanguageServices.mjs +0 -197
  184. package/dist/Rpc.mjs +0 -296
  185. package/dist/ast.mjs +0 -221
  186. package/dist/browser-worker.mjs +0 -2
  187. package/dist/browser.mjs +0 -32
  188. package/dist/documentation/documentation-provider.mjs +0 -48
  189. package/dist/documentation/index.mjs +0 -1
  190. package/dist/empty.mjs +0 -1
  191. package/dist/filesystem/ChokidarWatcher.mjs +0 -68
  192. package/dist/filesystem/FileSystemWatcher.mjs +0 -11
  193. package/dist/filesystem/LikeC4FileSystem.mjs +0 -64
  194. package/dist/filesystem/index.mjs +0 -19
  195. package/dist/formatting/LikeC4Formatter.mjs +0 -511
  196. package/dist/formatting/utils.mjs +0 -15
  197. package/dist/generated/ast.mjs +0 -2118
  198. package/dist/generated/grammar.mjs +0 -3
  199. package/dist/generated/module.mjs +0 -23
  200. package/dist/index.mjs +0 -50
  201. package/dist/logger.mjs +0 -82
  202. package/dist/lsp/CodeLensProvider.mjs +0 -42
  203. package/dist/lsp/CompletionProvider.mjs +0 -208
  204. package/dist/lsp/DocumentHighlightProvider.mjs +0 -10
  205. package/dist/lsp/DocumentLinkProvider.mjs +0 -53
  206. package/dist/lsp/DocumentSymbolProvider.mjs +0 -287
  207. package/dist/lsp/HoverProvider.mjs +0 -104
  208. package/dist/lsp/RenameProvider.mjs +0 -6
  209. package/dist/lsp/SemanticTokenProvider.mjs +0 -350
  210. package/dist/lsp/index.mjs +0 -7
  211. package/dist/mcp/MCPServerFactory.mjs +0 -70
  212. package/dist/mcp/NoopLikeC4MCPServer.mjs +0 -17
  213. package/dist/mcp/interfaces.mjs +0 -4
  214. package/dist/mcp/server/StdioLikeC4MCPServer.mjs +0 -46
  215. package/dist/mcp/server/StreamableLikeC4MCPServer.mjs +0 -153
  216. package/dist/mcp/server/WithMCPServer.mjs +0 -58
  217. package/dist/mcp/tools/_common.mjs +0 -42
  218. package/dist/mcp/tools/find-relationships.mjs +0 -151
  219. package/dist/mcp/tools/list-projects.mjs +0 -62
  220. package/dist/mcp/tools/open-view.mjs +0 -52
  221. package/dist/mcp/tools/read-deployment.mjs +0 -130
  222. package/dist/mcp/tools/read-element.mjs +0 -198
  223. package/dist/mcp/tools/read-project-summary.mjs +0 -178
  224. package/dist/mcp/tools/read-view.mjs +0 -205
  225. package/dist/mcp/tools/search-element.mjs +0 -171
  226. package/dist/mcp/utils.mjs +0 -47
  227. package/dist/model/builder/MergedExtends.mjs +0 -67
  228. package/dist/model/builder/MergedSpecification.mjs +0 -205
  229. package/dist/model/builder/assignTagColors.d.ts +0 -7
  230. package/dist/model/builder/assignTagColors.mjs +0 -51
  231. package/dist/model/builder/buildModel.mjs +0 -226
  232. package/dist/model/deployments-index.mjs +0 -100
  233. package/dist/model/fqn-index.mjs +0 -243
  234. package/dist/model/index.mjs +0 -6
  235. package/dist/model/model-builder.mjs +0 -285
  236. package/dist/model/model-locator.mjs +0 -239
  237. package/dist/model/model-parser-where.mjs +0 -81
  238. package/dist/model/model-parser.mjs +0 -127
  239. package/dist/model/parser/Base.mjs +0 -342
  240. package/dist/model/parser/DeploymentModelParser.mjs +0 -212
  241. package/dist/model/parser/DeploymentViewParser.mjs +0 -95
  242. package/dist/model/parser/FqnRefParser.mjs +0 -398
  243. package/dist/model/parser/GlobalsParser.mjs +0 -82
  244. package/dist/model/parser/ImportsParser.mjs +0 -28
  245. package/dist/model/parser/ModelParser.mjs +0 -190
  246. package/dist/model/parser/PredicatesParser.mjs +0 -45
  247. package/dist/model/parser/SpecificationParser.mjs +0 -120
  248. package/dist/model/parser/ValueConverter.mjs +0 -12
  249. package/dist/model/parser/ViewsParser.mjs +0 -490
  250. package/dist/model-change/ModelChanges.mjs +0 -89
  251. package/dist/model-change/changeElementStyle.mjs +0 -143
  252. package/dist/model-change/changeViewLayout.mjs +0 -32
  253. package/dist/model-change/saveManualLayout.d.ts +0 -11
  254. package/dist/model-change/saveManualLayout.mjs +0 -27
  255. package/dist/module.mjs +0 -180
  256. package/dist/protocol.mjs +0 -65
  257. package/dist/references/index.mjs +0 -3
  258. package/dist/references/name-provider.mjs +0 -39
  259. package/dist/references/scope-computation.mjs +0 -312
  260. package/dist/references/scope-provider.mjs +0 -239
  261. package/dist/shared/NodeKindProvider.mjs +0 -110
  262. package/dist/shared/index.mjs +0 -2
  263. package/dist/test/index.mjs +0 -1
  264. package/dist/test/testServices.mjs +0 -200
  265. package/dist/utils/disposable.mjs +0 -25
  266. package/dist/utils/elementRef.mjs +0 -20
  267. package/dist/utils/fqnRef.mjs +0 -57
  268. package/dist/utils/index.mjs +0 -33
  269. package/dist/utils/printDocs.mjs +0 -1
  270. package/dist/utils/projectId.mjs +0 -16
  271. package/dist/utils/stringHash.mjs +0 -5
  272. package/dist/validation/DocumentValidator.mjs +0 -16
  273. package/dist/validation/_shared.mjs +0 -25
  274. package/dist/validation/deployment-checks.mjs +0 -146
  275. package/dist/validation/dynamic-view.mjs +0 -67
  276. package/dist/validation/element-ref.mjs +0 -12
  277. package/dist/validation/element.mjs +0 -50
  278. package/dist/validation/imports.mjs +0 -25
  279. package/dist/validation/index.mjs +0 -180
  280. package/dist/validation/property-checks.mjs +0 -107
  281. package/dist/validation/relation.mjs +0 -53
  282. package/dist/validation/specification.mjs +0 -173
  283. package/dist/validation/view-predicates/fqn-expr-with.mjs +0 -43
  284. package/dist/validation/view-predicates/fqn-ref-expr.mjs +0 -53
  285. package/dist/validation/view-predicates/incoming.mjs +0 -16
  286. package/dist/validation/view-predicates/index.mjs +0 -6
  287. package/dist/validation/view-predicates/outgoing.mjs +0 -20
  288. package/dist/validation/view-predicates/relation-expr.mjs +0 -39
  289. package/dist/validation/view-predicates/relation-with.mjs +0 -16
  290. package/dist/validation/view.mjs +0 -25
  291. package/dist/view-utils/assignNavigateTo.mjs +0 -25
  292. package/dist/view-utils/index.mjs +0 -1
  293. package/dist/view-utils/manual-layout.mjs +0 -99
  294. package/dist/views/configurable-layouter.mjs +0 -51
  295. package/dist/views/index.mjs +0 -1
  296. package/dist/views/likec4-views.mjs +0 -166
  297. package/dist/workspace/AstNodeDescriptionProvider.mjs +0 -17
  298. package/dist/workspace/IndexManager.mjs +0 -17
  299. package/dist/workspace/LangiumDocuments.mjs +0 -53
  300. package/dist/workspace/ProjectsManager.mjs +0 -360
  301. package/dist/workspace/WorkspaceManager.mjs +0 -83
  302. package/dist/workspace/index.mjs +0 -5
  303. /package/dist/views/{configurable-layouter.d.ts → ConfigurableLayouter.d.ts} +0 -0
@@ -1,153 +0,0 @@
1
- import { serve } from "@hono/node-server";
2
- import { promiseNextTick } from "@likec4/core/utils";
3
- import { loggable } from "@likec4/log";
4
- import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
5
- import { toFetchResponse, toReqRes } from "fetch-to-node";
6
- import { Hono } from "hono";
7
- import { logger } from "../utils.mjs";
8
- export class StreamableLikeC4MCPServer {
9
- constructor(services, _port = 33335) {
10
- this.services = services;
11
- this._port = _port;
12
- }
13
- // Store transports by session ID to send notifications
14
- server = void 0;
15
- get mcp() {
16
- throw new Error("StreamableLikeC4MCPServer has access to McpServer only during the request");
17
- }
18
- get isStarted() {
19
- return this.server?.listening === true;
20
- }
21
- get port() {
22
- return this._port;
23
- }
24
- async dispose() {
25
- await this.stop();
26
- }
27
- async start(port = this._port) {
28
- try {
29
- if (this.server) {
30
- if (this.port === port) {
31
- return;
32
- }
33
- await this.stop();
34
- }
35
- logger.info("Starting MCP server on port {port}", { port });
36
- this._port = port;
37
- await promiseNextTick();
38
- const app = new Hono().post("/mcp", async (c) => {
39
- const { req, res } = toReqRes(c.req.raw);
40
- const server = this.services.mcp.ServerFactory.create();
41
- try {
42
- const transport = new StreamableHTTPServerTransport({
43
- sessionIdGenerator: void 0
44
- });
45
- transport.onerror = (err) => {
46
- logger.error(loggable(err));
47
- };
48
- await server.connect(transport);
49
- await transport.handleRequest(req, res, await c.req.json());
50
- res.on("close", async () => {
51
- logger.debug("Request closed");
52
- await transport.close();
53
- await server.close();
54
- });
55
- return toFetchResponse(res);
56
- } catch (e) {
57
- logger.error(loggable(e));
58
- return c.json(
59
- {
60
- jsonrpc: "2.0",
61
- error: {
62
- code: -32603,
63
- message: "Internal server error"
64
- },
65
- id: null
66
- },
67
- { status: 500 }
68
- );
69
- }
70
- }).get("/mcp", async (c) => {
71
- logger.debug("Received GET MCP request");
72
- return c.json(
73
- {
74
- jsonrpc: "2.0",
75
- error: {
76
- code: -32e3,
77
- message: "Method not allowed."
78
- },
79
- id: null
80
- },
81
- { status: 405 }
82
- );
83
- }).delete("/mcp", async (c) => {
84
- logger.debug("Received DELETE MCP request");
85
- return c.json(
86
- {
87
- jsonrpc: "2.0",
88
- error: {
89
- code: -32e3,
90
- message: "Method not allowed."
91
- },
92
- id: null
93
- },
94
- { status: 405 }
95
- );
96
- }).notFound((c) => {
97
- logger.debug(`${c.req.method} ${c.req.url} not found`);
98
- return c.json(
99
- {
100
- jsonrpc: "2.0",
101
- error: {
102
- code: -32e3,
103
- message: "Method not found."
104
- },
105
- id: null
106
- },
107
- { status: 404 }
108
- );
109
- }).onError((e, c) => {
110
- logger.error(loggable(e));
111
- return c.json(
112
- {
113
- jsonrpc: "2.0",
114
- error: {
115
- code: -32603,
116
- message: "Internal server error"
117
- },
118
- id: null
119
- },
120
- { status: 500 }
121
- );
122
- });
123
- this.server = serve(
124
- {
125
- fetch: app.fetch,
126
- hostname: "0.0.0.0",
127
- port: this._port
128
- },
129
- (info) => logger.info("MCP server ready at http://0.0.0.0:{port}/mcp", { port: info.port })
130
- );
131
- } catch (err) {
132
- logger.warn("Failed to start MCP server", { err });
133
- return Promise.reject(err);
134
- }
135
- }
136
- stop() {
137
- const server = this.server;
138
- if (!server) {
139
- return Promise.resolve();
140
- }
141
- logger.info("Stopping MCP server");
142
- this.server = void 0;
143
- return new Promise((resolve) => {
144
- server.close((err) => {
145
- if (err) {
146
- logger.error("Failed to stop MCP server", { err });
147
- }
148
- logger.info("MCP server stopped");
149
- resolve();
150
- });
151
- });
152
- }
153
- }
@@ -1,58 +0,0 @@
1
- import { loggable } from "@likec4/log";
2
- import { isError } from "remeda";
3
- import { logger } from "../utils.mjs";
4
- import { StdioLikeC4MCPServer } from "./StdioLikeC4MCPServer.mjs";
5
- import { StreamableLikeC4MCPServer } from "./StreamableLikeC4MCPServer.mjs";
6
- const streamableLikeC4MCPServer = (services, defaultPort = 33335) => {
7
- logger.debug("Creating StreamableLikeC4MCPServer");
8
- const server = new StreamableLikeC4MCPServer(services, defaultPort);
9
- const langId = services.LanguageMetaData.languageId;
10
- const connection = services.shared.lsp.Connection;
11
- services.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate((update) => {
12
- if (update.section !== langId) {
13
- logger.warn("Unexpected configuration update: {update}", { update });
14
- return;
15
- }
16
- logger.debug("Configuration update: {update}", { update });
17
- const {
18
- enabled = false,
19
- port = defaultPort
20
- } = update.configuration.mcp;
21
- if (!enabled) {
22
- void server.stop();
23
- return;
24
- }
25
- void Promise.resolve().then(() => server.start(port)).then(() => {
26
- connection?.telemetry?.logEvent({
27
- eventName: "mcp-server-started",
28
- mcpPort: port
29
- });
30
- }).catch((err) => {
31
- const message = isError(err) ? err.message : void 0;
32
- connection?.telemetry?.logEvent({
33
- eventName: "mcp-server-start-failed",
34
- mcpPort: port,
35
- ...message && { message }
36
- });
37
- logger.error("Failed to start LikeC4 MCP Server", { err });
38
- if (connection) {
39
- connection.window.showErrorMessage(`LikeC4: Failed to start MCP Server
40
-
41
- ${loggable(err)}`);
42
- }
43
- });
44
- });
45
- return server;
46
- };
47
- const stdioLikeC4MCPServer = (services) => {
48
- return new StdioLikeC4MCPServer(services);
49
- };
50
- export const WithMCPServer = (type = "sse") => ({
51
- mcpServer: (services) => {
52
- if (type === "stdio") {
53
- return stdioLikeC4MCPServer(services);
54
- }
55
- const port = typeof type === "object" ? type.port : 33335;
56
- return streamableLikeC4MCPServer(services, port);
57
- }
58
- });
@@ -1,42 +0,0 @@
1
- import { URI } from "vscode-uri";
2
- import z from "zod";
3
- import { ProjectsManager } from "../../workspace/index.mjs";
4
- import { logger } from "../utils.mjs";
5
- export const locationSchema = z.object({
6
- path: z.string().describe("Path to the file"),
7
- range: z.object({
8
- start: z.object({
9
- line: z.number(),
10
- character: z.number()
11
- }),
12
- end: z.object({
13
- line: z.number(),
14
- character: z.number()
15
- })
16
- }).describe("Range in the file")
17
- }).nullable();
18
- export const projectIdSchema = z.string().refine((_v) => true).optional().default(ProjectsManager.DefaultProjectId).describe('Project id (optional, will use "default" if not specified)');
19
- export const includedInViewsSchema = z.array(z.object({
20
- id: z.string().describe("View id"),
21
- title: z.string().describe("View title"),
22
- type: z.enum(["element", "deployment", "dynamic"]).describe("View type")
23
- }));
24
- export const includedInViews = (views) => {
25
- return [...views].map((v) => ({
26
- id: v.id,
27
- title: v.titleOrId,
28
- type: v.$view._type
29
- }));
30
- };
31
- export const mkLocate = (languageServices, projectId) => (params) => {
32
- try {
33
- const loc = languageServices.locate({ projectId, ...params });
34
- return loc ? {
35
- path: URI.parse(loc.uri).fsPath,
36
- range: loc.range
37
- } : null;
38
- } catch (e) {
39
- logger.debug(`Failed to locate {params}`, { error: e, params });
40
- return null;
41
- }
42
- };
@@ -1,151 +0,0 @@
1
- import { modelConnection } from "@likec4/core/model";
2
- import { invariant, isSameHierarchy } from "@likec4/core/utils";
3
- import z from "zod";
4
- import { likec4Tool } from "../utils.mjs";
5
- import { includedInViews, includedInViewsSchema, locationSchema, mkLocate, projectIdSchema } from "./_common.mjs";
6
- const endpointSchema = z.object({
7
- id: z.string(),
8
- title: z.string(),
9
- kind: z.string()
10
- });
11
- const searchResultSchema = z.object({
12
- type: z.enum(["direct", "indirect"]).describe(
13
- 'Type of relationship, "direct" for direct relationships, "indirect" for relationships through nested elements'
14
- ),
15
- source: endpointSchema,
16
- target: endpointSchema,
17
- kind: z.string().nullable().describe("Relationship kind"),
18
- title: z.string().nullable().describe("Relationship title"),
19
- description: z.string().nullable().describe("Relationship description"),
20
- technology: z.string().nullable().describe("Relationship technology"),
21
- tags: z.array(z.string()).describe("Relationship tags"),
22
- includedInViews: includedInViewsSchema.describe("Views that include this relationship"),
23
- sourceLocation: locationSchema
24
- });
25
- export const findRelationships = likec4Tool({
26
- name: "find-relationships",
27
- annotations: {
28
- readOnlyHint: true,
29
- idempotentHint: true,
30
- title: "Find relationships between two elements"
31
- },
32
- description: `
33
- Find relationships between two LikeC4 elements within a project.
34
-
35
- What it does:
36
- - Finds both direct relationships (element1 \u2194 element2) and indirect ones that arise via containment (e.g. via nested elements).
37
- - Returns rich metadata for each relationship and where it appears in views.
38
-
39
- Inputs:
40
- - element1: string \u2014 Element ID (FQN)
41
- - element2: string \u2014 Element ID (FQN)
42
- - project: string (optional, defaults to "default") \u2014 Project id
43
-
44
- Output:
45
- - found: Relationship[]
46
-
47
- Relationship (object) fields:
48
- - type: "direct" | "indirect" \u2014 direct is between the specified endpoints; indirect is via nested elements
49
- - source: Endpoint
50
- - target: Endpoint
51
- - kind: string|null \u2014 relationship kind from the model
52
- - title: string|null \u2014 relationship title if provided
53
- - description: string|null \u2014 relationship description text
54
- - technology: string|null \u2014 relationship technology
55
- - tags: string[] \u2014 relationship tags
56
- - includedInViews: View[] \u2014 views where this relationship appears
57
- - sourceLocation: { path: string, range: { start: { line: number, character: number }, end: { line: number, character: number } } } | null
58
-
59
- Endpoint (object) fields:
60
- - id: string \u2014 Element ID (FQN)
61
- - title: string \u2014 element title
62
- - kind: string \u2014 element kind
63
-
64
- View (object) fields:
65
- - id: string \u2014 view identifier
66
- - title: string \u2014 view title
67
- - type: "element" | "deployment" | "dynamic"
68
-
69
- Notes:
70
- - Read-only, idempotent; does not mutate the model. May trigger UI navigation in supporting clients.
71
- - The order of results is not guaranteed.
72
-
73
- Example:
74
- Request:
75
- {
76
- "element1": "shop.frontend",
77
- "element2": "shop.backend",
78
- "project": "default"
79
- }
80
-
81
- Response:
82
- {
83
- "found": [
84
- {
85
- "type": "direct",
86
- "source": { "id": "shop.frontend", "title": "Frontend", "kind": "component" },
87
- "target": { "id": "shop.backend", "title": "Backend", "kind": "component" },
88
- "kind": "sync",
89
- "title": "Calls",
90
- "description": "Frontend calls Backend",
91
- "technology": "HTTP",
92
- "tags": ["public"],
93
- "includedInViews": [
94
- { "id": "system-overview", "title": "System Overview", "type": "element" }
95
- ],
96
- "sourceLocation": {
97
- "path": "/abs/path/project/model.c4",
98
- "range": { "start": { "line": 12, "character": 0 }, "end": { "line": 14, "character": 0 } }
99
- }
100
- }
101
- ]
102
- }
103
- `,
104
- inputSchema: {
105
- element1: z.string().describe("Element ID (FQN)"),
106
- element2: z.string().describe("Element ID (FQN)"),
107
- project: projectIdSchema
108
- },
109
- outputSchema: {
110
- found: z.array(searchResultSchema)
111
- }
112
- }, async (languageServices, args) => {
113
- const projectId = languageServices.projectsManager.ensureProjectId(args.project);
114
- if (isSameHierarchy(args.element1, args.element2)) {
115
- throw new Error("No relationships possible between parent-child");
116
- }
117
- const found = [];
118
- const model = await languageServices.computedModel(projectId);
119
- const el1 = model.findElement(args.element1);
120
- invariant(el1, `Element "${args.element1}" not found in project "${projectId}"`);
121
- const el2 = model.findElement(args.element2);
122
- invariant(el2, `Element "${args.element2}" not found in project "${projectId}"`);
123
- const locate = mkLocate(languageServices, projectId);
124
- const relationships = modelConnection.findConnection(el1, el2, "both").flatMap((c) => [...c.relations]);
125
- for (const relationship of relationships) {
126
- const isDirect = relationship.source === el1 && relationship.target === el2 || relationship.source === el2 && relationship.target === el1;
127
- found.push({
128
- type: isDirect ? "direct" : "indirect",
129
- source: {
130
- id: relationship.source.id,
131
- title: relationship.source.title,
132
- kind: relationship.source.kind
133
- },
134
- target: {
135
- id: relationship.target.id,
136
- title: relationship.target.title,
137
- kind: relationship.target.kind
138
- },
139
- kind: relationship.kind,
140
- title: relationship.title,
141
- description: relationship.description.text,
142
- technology: relationship.technology,
143
- tags: [...relationship.tags],
144
- includedInViews: includedInViews(relationship.views()),
145
- sourceLocation: locate({ relation: relationship.id })
146
- });
147
- }
148
- return {
149
- found
150
- };
151
- });
@@ -1,62 +0,0 @@
1
- import z from "zod";
2
- import { likec4Tool } from "../utils.mjs";
3
- export const listProjects = likec4Tool({
4
- name: "list-projects",
5
- description: `
6
- List LikeC4 projects discoverable in the current workspace.
7
-
8
- Request:
9
- - No input parameters.
10
-
11
- Response (JSON object):
12
- - projects: Project[]
13
-
14
- Project (object) fields:
15
- - id: string \u2014 stable project identifier
16
- - title: string \u2014 human-readable project title
17
- - folder: string \u2014 absolute path to the project root
18
- - sources: string[] \u2014 absolute file paths of related documents
19
-
20
- Notes:
21
- - Read-only, idempotent, no side effects.
22
- - Safe to call repeatedly.
23
-
24
- Example response:
25
- {
26
- "projects": [
27
- {
28
- "id": "docs",
29
- "title": "Documentation",
30
- "folder": "/abs/path/to/workspace/docs",
31
- "sources": [
32
- "/abs/path/to/workspace/docs/model/contexts.likec4",
33
- "/abs/path/to/workspace/docs/model/relations.likec4"
34
- ]
35
- }
36
- ]
37
- }
38
- `,
39
- annotations: {
40
- readOnlyHint: true,
41
- idempotentHint: true,
42
- title: "List projects"
43
- },
44
- outputSchema: {
45
- projects: z.array(z.object({
46
- id: z.string(),
47
- title: z.string(),
48
- folder: z.string(),
49
- sources: z.array(z.string())
50
- }))
51
- }
52
- }, async (languageServices) => {
53
- const projects = languageServices.projects();
54
- return {
55
- projects: projects.map((p) => ({
56
- id: p.id,
57
- title: p.title,
58
- folder: p.folder.fsPath,
59
- sources: p.documents.map((d) => d.fsPath)
60
- }))
61
- };
62
- });
@@ -1,52 +0,0 @@
1
- import z from "zod";
2
- import { likec4Tool } from "../utils.mjs";
3
- import { locationSchema, mkLocate, projectIdSchema } from "./_common.mjs";
4
- export const openView = likec4Tool({
5
- name: "open-view",
6
- description: `
7
- Open a LikeC4 view in the editor's preview panel.
8
-
9
- Request:
10
- - viewId: string \u2014 view id (name)
11
- - project: string (optional) \u2014 project id. Defaults to "default" if omitted.
12
-
13
- Response (JSON object):
14
- - location: { path: string, range: { start: { line: number, character: number }, end: { line: number, character: number } } } | null \u2014 source location of the view if available
15
-
16
- Notes:
17
- - Read-only and idempotent with respect to the project model. Triggers a UI action in the editor.
18
- - Only one preview panel can be open at a time.
19
-
20
- Example response:
21
- {
22
- "location": {
23
- "path": "/abs/path/project/model.c4",
24
- "range": { "start": { "line": 10, "character": 0 }, "end": { "line": 30, "character": 0 } }
25
- }
26
- }
27
- `,
28
- annotations: {
29
- readOnlyHint: true,
30
- idempotentHint: true,
31
- title: "Open view in preview panel"
32
- },
33
- inputSchema: {
34
- viewId: z.string().describe("View id (name)"),
35
- project: projectIdSchema
36
- },
37
- outputSchema: {
38
- location: locationSchema
39
- }
40
- }, async (languageServices, args) => {
41
- const projectId = languageServices.projectsManager.ensureProjectId(args.project);
42
- const model = await languageServices.computedModel(projectId);
43
- const view = model.findView(args.viewId);
44
- if (!view) {
45
- throw new Error(`View with ID '${args.viewId}' not found in project ${projectId}`);
46
- }
47
- await languageServices.views.openView(view.id, projectId);
48
- const locate = mkLocate(languageServices, projectId);
49
- return {
50
- location: locate({ view: view.id })
51
- };
52
- });
@@ -1,130 +0,0 @@
1
- import { invariant } from "@likec4/core";
2
- import z from "zod";
3
- import { likec4Tool } from "../utils.mjs";
4
- import { includedInViews, includedInViewsSchema, locationSchema, mkLocate, projectIdSchema } from "./_common.mjs";
5
- export const readDeployment = likec4Tool({
6
- name: "read-deployment",
7
- description: `
8
- Read details about a deployment node or a deployed instance in a LikeC4 project.
9
-
10
- What it does:
11
- - Returns metadata about a deployment entity (node or instance), including kind, tags, color/shape, children, which views include it, and its source location.
12
-
13
- Inputs:
14
- - id: string \u2014 Deployment id (FQN)
15
- - project: string (optional, defaults to "default") \u2014 Project id
16
-
17
- Output fields:
18
- - type: "deployment-node" | "deployed-instance"
19
- - id: string \u2014 Deployment id (FQN)
20
- - kind: string \u2014 Deployment node kind, or element kind for deployed instances
21
- - name: string \u2014 Name of the deployment entity
22
- - title: string \u2014 Title of the deployment entity
23
- - description: string|null \u2014 Description text
24
- - technology: string|null \u2014 Technology info, if any
25
- - tags: string[] \u2014 Tags assigned to this entity
26
- - project: string \u2014 Project id
27
- - metadata: Record<string, string>
28
- - shape: string \u2014 Rendered shape
29
- - color: string \u2014 Rendered color
30
- - children: string[] \u2014 Child deployment ids (empty for instances)
31
- - includedInViews: View[] \u2014 Views that include this entity
32
- - instanceof: { id: string, title: string, kind: string } | null \u2014 If type is "deployed-instance", the referenced element
33
- - sourceLocation: { path: string, range: { start: { line: number, character: number }, end: { line: number, character: number } } } | null
34
-
35
- View (object) fields:
36
- - id: string \u2014 view identifier
37
- - title: string \u2014 view title
38
- - type: "element" | "deployment" | "dynamic"
39
-
40
- Notes:
41
- - Read-only, idempotent; does not mutate the model.
42
-
43
- Example request:
44
- { "id": "k8s.cluster.frontend", "project": "default" }
45
-
46
- Example response (deployed instance):
47
- {
48
- "type": "deployed-instance",
49
- "id": "k8s.cluster.frontend",
50
- "kind": "k8s.pod",
51
- "name": "frontend",
52
- "title": "Frontend Pod",
53
- "description": null,
54
- "technology": "Kubernetes",
55
- "tags": ["prod"],
56
- "project": "default",
57
- "metadata": {},
58
- "shape": "rectangle",
59
- "color": "#2F80ED",
60
- "children": [],
61
- "includedInViews": [
62
- { "id": "runtime-overview", "title": "Runtime Overview", "type": "deployment" }
63
- ],
64
- "instanceof": { "id": "shop.frontend", "title": "Frontend", "kind": "component" },
65
- "sourceLocation": {
66
- "path": "/abs/path/project/model.c4",
67
- "range": { "start": { "line": 10, "character": 0 }, "end": { "line": 25, "character": 0 } }
68
- }
69
- }
70
- `,
71
- annotations: {
72
- readOnlyHint: true,
73
- idempotentHint: true,
74
- title: "Read deployment entity"
75
- },
76
- inputSchema: {
77
- id: z.string().describe("Deployment id (FQN)"),
78
- project: projectIdSchema
79
- },
80
- outputSchema: {
81
- type: z.enum(["deployment-node", "deployed-instance"]),
82
- id: z.string().describe("Deployment id (FQN)"),
83
- kind: z.string().describe("Deployment node kind, or element kind for deployed instances"),
84
- name: z.string(),
85
- title: z.string(),
86
- description: z.string().nullable(),
87
- technology: z.string().nullable(),
88
- tags: z.array(z.string()),
89
- project: z.string(),
90
- metadata: z.record(z.string()),
91
- shape: z.string(),
92
- color: z.string(),
93
- children: z.array(z.string()).describe("Children of this deployment node (Array of Deployment ids)"),
94
- includedInViews: includedInViewsSchema.describe("Views that include this deployment node"),
95
- instanceof: z.object({
96
- id: z.string().describe("Element ID (FQN)"),
97
- title: z.string(),
98
- kind: z.string()
99
- }).nullable().describe('If type is "deployed-instance", the referenced element'),
100
- sourceLocation: locationSchema
101
- }
102
- }, async (languageServices, args) => {
103
- const projectId = languageServices.projectsManager.ensureProjectId(args.project);
104
- const model = await languageServices.computedModel(projectId);
105
- const element = model.deployment.findElement(args.id);
106
- invariant(element, `Deployment entity "${args.id}" not found in project "${projectId}"`);
107
- const locate = mkLocate(languageServices, projectId);
108
- return {
109
- type: element.isInstance() ? "deployed-instance" : "deployment-node",
110
- id: element.id,
111
- name: element.name,
112
- kind: element.kind,
113
- title: element.title,
114
- description: element.description.text,
115
- technology: element.technology,
116
- tags: [...element.tags],
117
- project: projectId,
118
- metadata: element.getMetadata(),
119
- shape: element.shape,
120
- color: element.color,
121
- children: element.isInstance() ? [] : [...element.children()].map((c) => c.id),
122
- includedInViews: includedInViews(element.views()),
123
- instanceof: element.isInstance() ? {
124
- id: element.element.id,
125
- title: element.element.title,
126
- kind: element.element.kind
127
- } : null,
128
- sourceLocation: locate({ deployment: element.id })
129
- };
130
- });