@likec4/language-server 1.43.0 → 1.45.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 (301) hide show
  1. package/browser/package.json +1 -1
  2. package/browser-worker/package.json +1 -1
  3. package/dist/LikeC4LanguageServices.d.ts +13 -34
  4. package/dist/LikeC4LanguageServices.js +152 -0
  5. package/dist/Rpc.js +257 -0
  6. package/dist/ast.d.ts +5 -1
  7. package/dist/ast.js +257 -0
  8. package/dist/browser-worker.js +4 -0
  9. package/dist/browser.js +35 -0
  10. package/dist/bundled.js +44 -0
  11. package/dist/bundled.mjs +3568 -3900
  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.d.ts +2 -0
  16. package/dist/filesystem/ChokidarWatcher.js +108 -0
  17. package/dist/filesystem/FileSystemWatcher.js +14 -0
  18. package/dist/filesystem/LikeC4FileSystem.d.ts +1 -2
  19. package/dist/filesystem/LikeC4FileSystem.js +126 -0
  20. package/dist/filesystem/index.d.ts +26 -0
  21. package/dist/filesystem/index.js +29 -0
  22. package/dist/formatting/LikeC4Formatter.js +637 -0
  23. package/dist/formatting/utils.js +18 -0
  24. package/dist/generated/ast.js +2155 -0
  25. package/dist/generated/{grammar.mjs → grammar.js} +6 -2
  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 +10 -1
  30. package/dist/index.js +55 -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.js +257 -0
  44. package/dist/lsp/index.d.ts +1 -0
  45. package/dist/lsp/index.js +9 -0
  46. package/dist/mcp/MCPServerFactory.js +73 -0
  47. package/dist/mcp/NoopLikeC4MCPServer.js +17 -0
  48. package/dist/mcp/interfaces.js +5 -0
  49. package/dist/mcp/server/StdioLikeC4MCPServer.js +51 -0
  50. package/dist/mcp/server/StreamableLikeC4MCPServer.js +145 -0
  51. package/dist/mcp/server/WithMCPServer.js +56 -0
  52. package/dist/mcp/tools/_common.d.ts +8 -7
  53. package/dist/mcp/tools/_common.js +49 -0
  54. package/dist/mcp/tools/find-relationships.d.ts +7 -8
  55. package/dist/mcp/tools/find-relationships.js +150 -0
  56. package/dist/mcp/tools/list-projects.d.ts +3 -3
  57. package/dist/mcp/tools/list-projects.js +62 -0
  58. package/dist/mcp/tools/open-view.d.ts +6 -7
  59. package/dist/mcp/tools/open-view.js +52 -0
  60. package/dist/mcp/tools/read-deployment.d.ts +6 -7
  61. package/dist/mcp/tools/read-deployment.js +132 -0
  62. package/dist/mcp/tools/read-element.d.ts +6 -7
  63. package/dist/mcp/tools/read-element.js +194 -0
  64. package/dist/mcp/tools/read-project-summary.d.ts +5 -6
  65. package/dist/mcp/tools/read-project-summary.js +176 -0
  66. package/dist/mcp/tools/read-view.d.ts +6 -7
  67. package/dist/mcp/tools/read-view.js +203 -0
  68. package/dist/mcp/tools/search-element.d.ts +3 -3
  69. package/dist/mcp/tools/search-element.js +177 -0
  70. package/dist/mcp/utils.d.ts +2 -2
  71. package/dist/mcp/utils.js +48 -0
  72. package/dist/model/builder/MergedExtends.js +74 -0
  73. package/dist/model/builder/MergedSpecification.js +175 -0
  74. package/dist/model/builder/buildModel.js +176 -0
  75. package/dist/model/deployments-index.js +102 -0
  76. package/dist/model/fqn-index.d.ts +1 -2
  77. package/dist/model/fqn-index.js +247 -0
  78. package/dist/model/index.js +6 -0
  79. package/dist/model/model-builder.d.ts +13 -11
  80. package/dist/model/model-builder.js +232 -0
  81. package/dist/model/model-locator.d.ts +6 -5
  82. package/dist/model/model-locator.js +240 -0
  83. package/dist/model/model-parser-where.js +81 -0
  84. package/dist/model/model-parser.d.ts +309 -304
  85. package/dist/model/model-parser.js +126 -0
  86. package/dist/model/parser/Base.d.ts +2 -2
  87. package/dist/model/parser/Base.js +367 -0
  88. package/dist/model/parser/DeploymentModelParser.d.ts +2 -2
  89. package/dist/model/parser/DeploymentModelParser.js +176 -0
  90. package/dist/model/parser/DeploymentViewParser.d.ts +3 -3
  91. package/dist/model/parser/DeploymentViewParser.js +86 -0
  92. package/dist/model/parser/FqnRefParser.d.ts +2 -2
  93. package/dist/model/parser/FqnRefParser.js +382 -0
  94. package/dist/model/parser/GlobalsParser.d.ts +6 -6
  95. package/dist/model/parser/GlobalsParser.js +84 -0
  96. package/dist/model/parser/ImportsParser.d.ts +11 -12
  97. package/dist/model/parser/ImportsParser.js +24 -0
  98. package/dist/model/parser/ModelParser.d.ts +2 -2
  99. package/dist/model/parser/ModelParser.js +165 -0
  100. package/dist/model/parser/PredicatesParser.d.ts +2 -2
  101. package/dist/model/parser/PredicatesParser.js +45 -0
  102. package/dist/model/parser/SpecificationParser.d.ts +2 -2
  103. package/dist/model/parser/SpecificationParser.js +113 -0
  104. package/dist/model/parser/ValueConverter.js +12 -0
  105. package/dist/model/parser/ViewsParser.d.ts +3 -3
  106. package/dist/model/parser/ViewsParser.js +479 -0
  107. package/dist/model-change/ModelChanges.d.ts +8 -5
  108. package/dist/model-change/ModelChanges.js +129 -0
  109. package/dist/model-change/changeElementStyle.js +134 -0
  110. package/dist/model-change/changeViewLayout.d.ts +2 -2
  111. package/dist/model-change/changeViewLayout.js +28 -0
  112. package/dist/model-change/removeManualLayoutV1.d.ts +7 -0
  113. package/dist/model-change/removeManualLayoutV1.js +27 -0
  114. package/dist/module.d.ts +10 -5
  115. package/dist/module.js +143 -0
  116. package/dist/protocol.d.ts +34 -27
  117. package/dist/protocol.js +123 -0
  118. package/dist/references/index.js +3 -0
  119. package/dist/references/name-provider.js +37 -0
  120. package/dist/references/scope-computation.js +288 -0
  121. package/dist/references/scope-provider.d.ts +3 -3
  122. package/dist/references/scope-provider.js +242 -0
  123. package/dist/shared/NodeKindProvider.js +57 -0
  124. package/dist/shared/{WorkspaceSymbolProvider.mjs → WorkspaceSymbolProvider.js} +1 -1
  125. package/dist/shared/index.js +2 -0
  126. package/dist/test/index.js +1 -0
  127. package/dist/test/testServices.d.ts +16 -16
  128. package/dist/test/testServices.js +210 -0
  129. package/dist/utils/disposable.js +26 -0
  130. package/dist/utils/elementRef.d.ts +1 -1
  131. package/dist/utils/elementRef.js +27 -0
  132. package/dist/utils/fqnRef.js +63 -0
  133. package/dist/utils/index.js +35 -0
  134. package/dist/utils/printDocs.js +1 -0
  135. package/dist/utils/projectId.js +16 -0
  136. package/dist/utils/stringHash.js +5 -0
  137. package/dist/validation/DocumentValidator.js +17 -0
  138. package/dist/validation/_shared.js +26 -0
  139. package/dist/validation/deployment-checks.js +140 -0
  140. package/dist/validation/dynamic-view.js +67 -0
  141. package/dist/validation/element-ref.js +12 -0
  142. package/dist/validation/element.js +49 -0
  143. package/dist/validation/imports.js +46 -0
  144. package/dist/validation/index.d.ts +1 -1
  145. package/dist/validation/index.js +157 -0
  146. package/dist/validation/property-checks.js +108 -0
  147. package/dist/validation/relation.js +55 -0
  148. package/dist/validation/specification.js +190 -0
  149. package/dist/validation/view-predicates/fqn-expr-with.js +43 -0
  150. package/dist/validation/view-predicates/fqn-ref-expr.js +51 -0
  151. package/dist/validation/view-predicates/incoming.js +16 -0
  152. package/dist/validation/view-predicates/index.js +6 -0
  153. package/dist/validation/view-predicates/outgoing.js +20 -0
  154. package/dist/validation/view-predicates/relation-expr.js +46 -0
  155. package/dist/validation/view-predicates/relation-with.js +16 -0
  156. package/dist/validation/view.d.ts +1 -1
  157. package/dist/validation/view.js +42 -0
  158. package/dist/view-utils/assignNavigateTo.js +27 -0
  159. package/dist/view-utils/index.d.ts +1 -0
  160. package/dist/view-utils/index.js +2 -0
  161. package/dist/view-utils/manual-layout.d.ts +6 -0
  162. package/dist/view-utils/manual-layout.js +149 -0
  163. package/dist/views/ConfigurableLayouter.js +51 -0
  164. package/dist/views/LikeC4ManualLayouts.d.ts +42 -0
  165. package/dist/views/LikeC4ManualLayouts.js +209 -0
  166. package/dist/views/{likec4-views.d.ts → LikeC4Views.d.ts} +32 -10
  167. package/dist/views/LikeC4Views.js +216 -0
  168. package/dist/views/index.d.ts +4 -1
  169. package/dist/views/index.js +11 -0
  170. package/dist/workspace/AstNodeDescriptionProvider.js +18 -0
  171. package/dist/workspace/IndexManager.js +21 -0
  172. package/dist/workspace/LangiumDocuments.d.ts +4 -3
  173. package/dist/workspace/LangiumDocuments.js +72 -0
  174. package/dist/workspace/ProjectsManager.d.ts +25 -16
  175. package/dist/workspace/ProjectsManager.js +469 -0
  176. package/dist/workspace/WorkspaceManager.d.ts +3 -2
  177. package/dist/workspace/WorkspaceManager.js +98 -0
  178. package/dist/workspace/index.js +5 -0
  179. package/likec4lib/package.json +1 -1
  180. package/package.json +30 -28
  181. package/protocol/package.json +1 -1
  182. package/dist/LikeC4LanguageServices.mjs +0 -197
  183. package/dist/Rpc.mjs +0 -296
  184. package/dist/ast.mjs +0 -221
  185. package/dist/browser-worker.mjs +0 -2
  186. package/dist/browser.mjs +0 -32
  187. package/dist/documentation/documentation-provider.mjs +0 -48
  188. package/dist/documentation/index.mjs +0 -1
  189. package/dist/empty.mjs +0 -1
  190. package/dist/filesystem/ChokidarWatcher.mjs +0 -68
  191. package/dist/filesystem/FileSystemWatcher.mjs +0 -11
  192. package/dist/filesystem/LikeC4FileSystem.mjs +0 -64
  193. package/dist/filesystem/index.mjs +0 -19
  194. package/dist/formatting/LikeC4Formatter.mjs +0 -511
  195. package/dist/formatting/utils.mjs +0 -15
  196. package/dist/generated/ast.mjs +0 -2150
  197. package/dist/generated/module.mjs +0 -23
  198. package/dist/index.mjs +0 -50
  199. package/dist/logger.mjs +0 -82
  200. package/dist/lsp/CodeLensProvider.mjs +0 -42
  201. package/dist/lsp/CompletionProvider.mjs +0 -208
  202. package/dist/lsp/DocumentHighlightProvider.mjs +0 -10
  203. package/dist/lsp/DocumentLinkProvider.mjs +0 -53
  204. package/dist/lsp/DocumentSymbolProvider.mjs +0 -287
  205. package/dist/lsp/HoverProvider.mjs +0 -104
  206. package/dist/lsp/RenameProvider.mjs +0 -6
  207. package/dist/lsp/SemanticTokenProvider.mjs +0 -276
  208. package/dist/lsp/index.mjs +0 -7
  209. package/dist/mcp/MCPServerFactory.mjs +0 -70
  210. package/dist/mcp/NoopLikeC4MCPServer.mjs +0 -17
  211. package/dist/mcp/interfaces.mjs +0 -4
  212. package/dist/mcp/server/StdioLikeC4MCPServer.mjs +0 -46
  213. package/dist/mcp/server/StreamableLikeC4MCPServer.mjs +0 -153
  214. package/dist/mcp/server/WithMCPServer.mjs +0 -58
  215. package/dist/mcp/tools/_common.mjs +0 -42
  216. package/dist/mcp/tools/find-relationships.mjs +0 -151
  217. package/dist/mcp/tools/list-projects.mjs +0 -62
  218. package/dist/mcp/tools/open-view.mjs +0 -52
  219. package/dist/mcp/tools/read-deployment.mjs +0 -130
  220. package/dist/mcp/tools/read-element.mjs +0 -198
  221. package/dist/mcp/tools/read-project-summary.mjs +0 -178
  222. package/dist/mcp/tools/read-view.mjs +0 -205
  223. package/dist/mcp/tools/search-element.mjs +0 -171
  224. package/dist/mcp/utils.mjs +0 -47
  225. package/dist/model/builder/MergedExtends.mjs +0 -76
  226. package/dist/model/builder/MergedSpecification.mjs +0 -205
  227. package/dist/model/builder/assignTagColors.d.ts +0 -7
  228. package/dist/model/builder/assignTagColors.mjs +0 -51
  229. package/dist/model/builder/buildModel.mjs +0 -226
  230. package/dist/model/deployments-index.mjs +0 -100
  231. package/dist/model/fqn-index.mjs +0 -243
  232. package/dist/model/index.mjs +0 -6
  233. package/dist/model/model-builder.mjs +0 -285
  234. package/dist/model/model-locator.mjs +0 -239
  235. package/dist/model/model-parser-where.mjs +0 -81
  236. package/dist/model/model-parser.mjs +0 -127
  237. package/dist/model/parser/Base.mjs +0 -376
  238. package/dist/model/parser/DeploymentModelParser.mjs +0 -212
  239. package/dist/model/parser/DeploymentViewParser.mjs +0 -95
  240. package/dist/model/parser/FqnRefParser.mjs +0 -398
  241. package/dist/model/parser/GlobalsParser.mjs +0 -82
  242. package/dist/model/parser/ImportsParser.mjs +0 -28
  243. package/dist/model/parser/ModelParser.mjs +0 -190
  244. package/dist/model/parser/PredicatesParser.mjs +0 -45
  245. package/dist/model/parser/SpecificationParser.mjs +0 -120
  246. package/dist/model/parser/ValueConverter.mjs +0 -12
  247. package/dist/model/parser/ViewsParser.mjs +0 -490
  248. package/dist/model-change/ModelChanges.mjs +0 -89
  249. package/dist/model-change/changeElementStyle.mjs +0 -143
  250. package/dist/model-change/changeViewLayout.mjs +0 -32
  251. package/dist/model-change/saveManualLayout.d.ts +0 -11
  252. package/dist/model-change/saveManualLayout.mjs +0 -27
  253. package/dist/module.mjs +0 -180
  254. package/dist/protocol.mjs +0 -65
  255. package/dist/references/index.mjs +0 -3
  256. package/dist/references/name-provider.mjs +0 -39
  257. package/dist/references/scope-computation.mjs +0 -312
  258. package/dist/references/scope-provider.mjs +0 -239
  259. package/dist/shared/NodeKindProvider.mjs +0 -110
  260. package/dist/shared/index.mjs +0 -2
  261. package/dist/test/index.mjs +0 -1
  262. package/dist/test/testServices.mjs +0 -200
  263. package/dist/utils/disposable.mjs +0 -25
  264. package/dist/utils/elementRef.mjs +0 -20
  265. package/dist/utils/fqnRef.mjs +0 -57
  266. package/dist/utils/index.mjs +0 -33
  267. package/dist/utils/printDocs.mjs +0 -1
  268. package/dist/utils/projectId.mjs +0 -16
  269. package/dist/utils/stringHash.mjs +0 -5
  270. package/dist/validation/DocumentValidator.mjs +0 -16
  271. package/dist/validation/_shared.mjs +0 -25
  272. package/dist/validation/deployment-checks.mjs +0 -146
  273. package/dist/validation/dynamic-view.mjs +0 -67
  274. package/dist/validation/element-ref.mjs +0 -12
  275. package/dist/validation/element.mjs +0 -50
  276. package/dist/validation/imports.mjs +0 -25
  277. package/dist/validation/index.mjs +0 -180
  278. package/dist/validation/property-checks.mjs +0 -107
  279. package/dist/validation/relation.mjs +0 -53
  280. package/dist/validation/specification.mjs +0 -173
  281. package/dist/validation/view-predicates/fqn-expr-with.mjs +0 -43
  282. package/dist/validation/view-predicates/fqn-ref-expr.mjs +0 -53
  283. package/dist/validation/view-predicates/incoming.mjs +0 -16
  284. package/dist/validation/view-predicates/index.mjs +0 -6
  285. package/dist/validation/view-predicates/outgoing.mjs +0 -20
  286. package/dist/validation/view-predicates/relation-expr.mjs +0 -39
  287. package/dist/validation/view-predicates/relation-with.mjs +0 -16
  288. package/dist/validation/view.mjs +0 -25
  289. package/dist/view-utils/assignNavigateTo.mjs +0 -25
  290. package/dist/view-utils/index.mjs +0 -1
  291. package/dist/view-utils/manual-layout.mjs +0 -99
  292. package/dist/views/configurable-layouter.mjs +0 -51
  293. package/dist/views/index.mjs +0 -1
  294. package/dist/views/likec4-views.mjs +0 -166
  295. package/dist/workspace/AstNodeDescriptionProvider.mjs +0 -17
  296. package/dist/workspace/IndexManager.mjs +0 -17
  297. package/dist/workspace/LangiumDocuments.mjs +0 -53
  298. package/dist/workspace/ProjectsManager.mjs +0 -360
  299. package/dist/workspace/WorkspaceManager.mjs +0 -83
  300. package/dist/workspace/index.mjs +0 -5
  301. /package/dist/views/{configurable-layouter.d.ts → ConfigurableLayouter.d.ts} +0 -0
@@ -0,0 +1,49 @@
1
+ import { URI } from 'vscode-uri';
2
+ import * as z from 'zod/v3';
3
+ import { ProjectsManager } from '../../workspace';
4
+ import { logger } from '../utils';
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()
19
+ .refine((_v) => true)
20
+ .optional()
21
+ .default(ProjectsManager.DefaultProjectId)
22
+ .describe('Project id (optional, will use "default" if not specified)');
23
+ export const includedInViewsSchema = z.array(z.object({
24
+ id: z.string().describe('View id'),
25
+ title: z.string().describe('View title'),
26
+ type: z.enum(['element', 'deployment', 'dynamic']).describe('View type'),
27
+ }));
28
+ export const includedInViews = (views) => {
29
+ return [...views].map(v => ({
30
+ id: v.id,
31
+ title: v.titleOrId,
32
+ type: v.$view._type,
33
+ }));
34
+ };
35
+ export const mkLocate = (languageServices, projectId) => (params) => {
36
+ try {
37
+ const loc = languageServices.locate({ projectId, ...params });
38
+ return loc
39
+ ? {
40
+ path: URI.parse(loc.uri).fsPath,
41
+ range: loc.range,
42
+ }
43
+ : null;
44
+ }
45
+ catch (e) {
46
+ logger.debug(`Failed to locate {params}`, { error: e, params });
47
+ return null;
48
+ }
49
+ };
@@ -1,13 +1,12 @@
1
- import z from 'zod';
1
+ import * as z from 'zod/v3';
2
2
  export declare const findRelationships: (languageServices: import("../..").LikeC4LanguageServices) => [string, {
3
3
  inputSchema?: {
4
4
  element1: z.ZodString;
5
5
  element2: z.ZodString;
6
- project: z.ZodDefault<z.ZodOptional<z.ZodEffects<z.ZodString, ProjectId, string>>>;
7
- } | undefined;
6
+ project: z.ZodDefault<z.ZodOptional<z.ZodEffects<z.ZodString, import("@likec4/core").ProjectId, string>>>;
7
+ };
8
8
  }, (args: {
9
- [x: string]: any;
10
- element1?: unknown;
11
- element2?: unknown;
12
- project?: unknown;
13
- }, extra: import("@modelcontextprotocol/sdk/shared/protocol").RequestHandlerExtra<import("@modelcontextprotocol/sdk/types").ServerRequest, import("@modelcontextprotocol/sdk/types").ServerNotification>) => import("@modelcontextprotocol/sdk/types").CallToolResult | Promise<import("@modelcontextprotocol/sdk/types").CallToolResult>];
9
+ project: string & import("type-fest/source/tagged").Tag<"ProjectID", never>;
10
+ element1: string;
11
+ element2: string;
12
+ }, extra: import("@modelcontextprotocol/sdk/shared/protocol.js").RequestHandlerExtra<import("@modelcontextprotocol/sdk/types.js").ServerRequest, import("@modelcontextprotocol/sdk/types.js").ServerNotification>) => import("@modelcontextprotocol/sdk/types.js").CallToolResult | Promise<import("@modelcontextprotocol/sdk/types.js").CallToolResult>];
@@ -0,0 +1,150 @@
1
+ import { modelConnection } from '@likec4/core/model';
2
+ import { invariant, isSameHierarchy } from '@likec4/core/utils';
3
+ import * as z from 'zod/v3';
4
+ import { likec4Tool } from '../utils';
5
+ import { includedInViews, includedInViewsSchema, locationSchema, mkLocate, projectIdSchema } from './_common';
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('Type of relationship, "direct" for direct relationships, "indirect" for relationships through nested elements'),
13
+ source: endpointSchema,
14
+ target: endpointSchema,
15
+ kind: z.string().nullable().describe('Relationship kind'),
16
+ title: z.string().nullable().describe('Relationship title'),
17
+ description: z.string().nullable().describe('Relationship description'),
18
+ technology: z.string().nullable().describe('Relationship technology'),
19
+ tags: z.array(z.string()).describe('Relationship tags'),
20
+ includedInViews: includedInViewsSchema.describe('Views that include this relationship'),
21
+ sourceLocation: locationSchema,
22
+ });
23
+ export const findRelationships = likec4Tool({
24
+ name: 'find-relationships',
25
+ annotations: {
26
+ readOnlyHint: true,
27
+ idempotentHint: true,
28
+ title: 'Find relationships between two elements',
29
+ },
30
+ description: `
31
+ Find relationships between two LikeC4 elements within a project.
32
+
33
+ What it does:
34
+ - Finds both direct relationships (element1 ↔ element2) and indirect ones that arise via containment (e.g. via nested elements).
35
+ - Returns rich metadata for each relationship and where it appears in views.
36
+
37
+ Inputs:
38
+ - element1: string — Element ID (FQN)
39
+ - element2: string — Element ID (FQN)
40
+ - project: string (optional, defaults to "default") — Project id
41
+
42
+ Output:
43
+ - found: Relationship[]
44
+
45
+ Relationship (object) fields:
46
+ - type: "direct" | "indirect" — direct is between the specified endpoints; indirect is via nested elements
47
+ - source: Endpoint
48
+ - target: Endpoint
49
+ - kind: string|null — relationship kind from the model
50
+ - title: string|null — relationship title if provided
51
+ - description: string|null — relationship description text
52
+ - technology: string|null — relationship technology
53
+ - tags: string[] — relationship tags
54
+ - includedInViews: View[] — views where this relationship appears
55
+ - sourceLocation: { path: string, range: { start: { line: number, character: number }, end: { line: number, character: number } } } | null
56
+
57
+ Endpoint (object) fields:
58
+ - id: string — Element ID (FQN)
59
+ - title: string — element title
60
+ - kind: string — element kind
61
+
62
+ View (object) fields:
63
+ - id: string — view identifier
64
+ - title: string — view title
65
+ - type: "element" | "deployment" | "dynamic"
66
+
67
+ Notes:
68
+ - Read-only, idempotent; does not mutate the model. May trigger UI navigation in supporting clients.
69
+ - The order of results is not guaranteed.
70
+
71
+ Example:
72
+ Request:
73
+ {
74
+ "element1": "shop.frontend",
75
+ "element2": "shop.backend",
76
+ "project": "default"
77
+ }
78
+
79
+ Response:
80
+ {
81
+ "found": [
82
+ {
83
+ "type": "direct",
84
+ "source": { "id": "shop.frontend", "title": "Frontend", "kind": "component" },
85
+ "target": { "id": "shop.backend", "title": "Backend", "kind": "component" },
86
+ "kind": "sync",
87
+ "title": "Calls",
88
+ "description": "Frontend calls Backend",
89
+ "technology": "HTTP",
90
+ "tags": ["public"],
91
+ "includedInViews": [
92
+ { "id": "system-overview", "title": "System Overview", "type": "element" }
93
+ ],
94
+ "sourceLocation": {
95
+ "path": "/abs/path/project/model.c4",
96
+ "range": { "start": { "line": 12, "character": 0 }, "end": { "line": 14, "character": 0 } }
97
+ }
98
+ }
99
+ ]
100
+ }
101
+ `,
102
+ inputSchema: {
103
+ element1: z.string().describe('Element ID (FQN)'),
104
+ element2: z.string().describe('Element ID (FQN)'),
105
+ project: projectIdSchema,
106
+ },
107
+ outputSchema: {
108
+ found: z.array(searchResultSchema),
109
+ },
110
+ }, async (languageServices, args) => {
111
+ const projectId = languageServices.projectsManager.ensureProjectId(args.project);
112
+ if (isSameHierarchy(args.element1, args.element2)) {
113
+ throw new Error('No relationships possible between parent-child');
114
+ }
115
+ const found = [];
116
+ const model = await languageServices.computedModel(projectId);
117
+ const el1 = model.findElement(args.element1);
118
+ invariant(el1, `Element "${args.element1}" not found in project "${projectId}"`);
119
+ const el2 = model.findElement(args.element2);
120
+ invariant(el2, `Element "${args.element2}" not found in project "${projectId}"`);
121
+ const locate = mkLocate(languageServices, projectId);
122
+ const relationships = modelConnection.findConnection(el1, el2, 'both').flatMap(c => [...c.relations]);
123
+ for (const relationship of relationships) {
124
+ const isDirect = (relationship.source === el1 && relationship.target === el2)
125
+ || (relationship.source === el2 && relationship.target === el1);
126
+ found.push({
127
+ type: isDirect ? 'direct' : 'indirect',
128
+ source: {
129
+ id: relationship.source.id,
130
+ title: relationship.source.title,
131
+ kind: relationship.source.kind,
132
+ },
133
+ target: {
134
+ id: relationship.target.id,
135
+ title: relationship.target.title,
136
+ kind: relationship.target.kind,
137
+ },
138
+ kind: relationship.kind,
139
+ title: relationship.title,
140
+ description: relationship.description.text,
141
+ technology: relationship.technology,
142
+ tags: [...relationship.tags],
143
+ includedInViews: includedInViews(relationship.views()),
144
+ sourceLocation: locate({ relation: relationship.id }),
145
+ });
146
+ }
147
+ return {
148
+ found,
149
+ };
150
+ });
@@ -1,6 +1,6 @@
1
- import z from 'zod';
1
+ import * as z from 'zod/v3';
2
2
  export declare const listProjects: (languageServices: import("../..").LikeC4LanguageServices) => [string, {
3
- inputSchema?: z.ZodRawShape | undefined;
3
+ inputSchema?: z.ZodRawShape;
4
4
  }, (args: {
5
5
  [x: string]: any;
6
- }, extra: import("@modelcontextprotocol/sdk/shared/protocol").RequestHandlerExtra<import("@modelcontextprotocol/sdk/types").ServerRequest, import("@modelcontextprotocol/sdk/types").ServerNotification>) => import("@modelcontextprotocol/sdk/types").CallToolResult | Promise<import("@modelcontextprotocol/sdk/types").CallToolResult>];
6
+ }, extra: import("@modelcontextprotocol/sdk/shared/protocol.js").RequestHandlerExtra<import("@modelcontextprotocol/sdk/types.js").ServerRequest, import("@modelcontextprotocol/sdk/types.js").ServerNotification>) => import("@modelcontextprotocol/sdk/types.js").CallToolResult | Promise<import("@modelcontextprotocol/sdk/types.js").CallToolResult>];
@@ -0,0 +1,62 @@
1
+ import * as z from 'zod/v3';
2
+ import { likec4Tool } from '../utils';
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 — stable project identifier
16
+ - title: string — human-readable project title
17
+ - folder: string — absolute path to the project root
18
+ - sources: string[] — 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,11 +1,10 @@
1
- import z from 'zod';
1
+ import * as z from 'zod/v3';
2
2
  export declare const openView: (languageServices: import("../..").LikeC4LanguageServices) => [string, {
3
3
  inputSchema?: {
4
4
  viewId: z.ZodString;
5
- project: z.ZodDefault<z.ZodOptional<z.ZodEffects<z.ZodString, ProjectId, string>>>;
6
- } | undefined;
5
+ project: z.ZodDefault<z.ZodOptional<z.ZodEffects<z.ZodString, import("@likec4/core").ProjectId, string>>>;
6
+ };
7
7
  }, (args: {
8
- [x: string]: any;
9
- viewId?: unknown;
10
- project?: unknown;
11
- }, extra: import("@modelcontextprotocol/sdk/shared/protocol").RequestHandlerExtra<import("@modelcontextprotocol/sdk/types").ServerRequest, import("@modelcontextprotocol/sdk/types").ServerNotification>) => import("@modelcontextprotocol/sdk/types").CallToolResult | Promise<import("@modelcontextprotocol/sdk/types").CallToolResult>];
8
+ project: string & import("type-fest/source/tagged").Tag<"ProjectID", never>;
9
+ viewId: string;
10
+ }, extra: import("@modelcontextprotocol/sdk/shared/protocol.js").RequestHandlerExtra<import("@modelcontextprotocol/sdk/types.js").ServerRequest, import("@modelcontextprotocol/sdk/types.js").ServerNotification>) => import("@modelcontextprotocol/sdk/types.js").CallToolResult | Promise<import("@modelcontextprotocol/sdk/types.js").CallToolResult>];
@@ -0,0 +1,52 @@
1
+ import * as z from 'zod/v3';
2
+ import { likec4Tool } from '../utils';
3
+ import { locationSchema, mkLocate, projectIdSchema } from './_common';
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 — view id (name)
11
+ - project: string (optional) — 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 — 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,11 +1,10 @@
1
- import z from 'zod';
1
+ import * as z from 'zod/v3';
2
2
  export declare const readDeployment: (languageServices: import("../..").LikeC4LanguageServices) => [string, {
3
3
  inputSchema?: {
4
4
  id: z.ZodString;
5
- project: z.ZodDefault<z.ZodOptional<z.ZodEffects<z.ZodString, ProjectId, string>>>;
6
- } | undefined;
5
+ project: z.ZodDefault<z.ZodOptional<z.ZodEffects<z.ZodString, import("@likec4/core").ProjectId, string>>>;
6
+ };
7
7
  }, (args: {
8
- [x: string]: any;
9
- id?: unknown;
10
- project?: unknown;
11
- }, extra: import("@modelcontextprotocol/sdk/shared/protocol").RequestHandlerExtra<import("@modelcontextprotocol/sdk/types").ServerRequest, import("@modelcontextprotocol/sdk/types").ServerNotification>) => import("@modelcontextprotocol/sdk/types").CallToolResult | Promise<import("@modelcontextprotocol/sdk/types").CallToolResult>];
8
+ id: string;
9
+ project: string & import("type-fest/source/tagged").Tag<"ProjectID", never>;
10
+ }, extra: import("@modelcontextprotocol/sdk/shared/protocol.js").RequestHandlerExtra<import("@modelcontextprotocol/sdk/types.js").ServerRequest, import("@modelcontextprotocol/sdk/types.js").ServerNotification>) => import("@modelcontextprotocol/sdk/types.js").CallToolResult | Promise<import("@modelcontextprotocol/sdk/types.js").CallToolResult>];
@@ -0,0 +1,132 @@
1
+ import { invariant } from '@likec4/core';
2
+ import * as z from 'zod/v3';
3
+ import { likec4Tool } from '../utils';
4
+ import { includedInViews, includedInViewsSchema, locationSchema, mkLocate, projectIdSchema } from './_common';
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 — Deployment id (FQN)
15
+ - project: string (optional, defaults to "default") — Project id
16
+
17
+ Output fields:
18
+ - type: "deployment-node" | "deployed-instance"
19
+ - id: string — Deployment id (FQN)
20
+ - kind: string — Deployment node kind, or element kind for deployed instances
21
+ - name: string — Name of the deployment entity
22
+ - title: string — Title of the deployment entity
23
+ - description: string|null — Description text
24
+ - technology: string|null — Technology info, if any
25
+ - tags: string[] — Tags assigned to this entity
26
+ - project: string — Project id
27
+ - metadata: Record<string, string>
28
+ - shape: string — Rendered shape
29
+ - color: string — Rendered color
30
+ - children: string[] — Child deployment ids (empty for instances)
31
+ - includedInViews: View[] — Views that include this entity
32
+ - instanceof: { id: string, title: string, kind: string } | null — 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 — view identifier
37
+ - title: string — 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.union([z.string(), z.array(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
+ ? {
125
+ id: element.element.id,
126
+ title: element.element.title,
127
+ kind: element.element.kind,
128
+ }
129
+ : null,
130
+ sourceLocation: locate({ deployment: element.id }),
131
+ };
132
+ });
@@ -1,11 +1,10 @@
1
- import z from 'zod';
1
+ import * as z from 'zod/v3';
2
2
  export declare const readElement: (languageServices: import("../..").LikeC4LanguageServices) => [string, {
3
3
  inputSchema?: {
4
4
  id: z.ZodString;
5
- project: z.ZodDefault<z.ZodOptional<z.ZodEffects<z.ZodString, ProjectId, string>>>;
6
- } | undefined;
5
+ project: z.ZodDefault<z.ZodOptional<z.ZodEffects<z.ZodString, import("@likec4/core").ProjectId, string>>>;
6
+ };
7
7
  }, (args: {
8
- [x: string]: any;
9
- id?: unknown;
10
- project?: unknown;
11
- }, extra: import("@modelcontextprotocol/sdk/shared/protocol").RequestHandlerExtra<import("@modelcontextprotocol/sdk/types").ServerRequest, import("@modelcontextprotocol/sdk/types").ServerNotification>) => import("@modelcontextprotocol/sdk/types").CallToolResult | Promise<import("@modelcontextprotocol/sdk/types").CallToolResult>];
8
+ id: string;
9
+ project: string & import("type-fest/source/tagged").Tag<"ProjectID", never>;
10
+ }, extra: import("@modelcontextprotocol/sdk/shared/protocol.js").RequestHandlerExtra<import("@modelcontextprotocol/sdk/types.js").ServerRequest, import("@modelcontextprotocol/sdk/types.js").ServerNotification>) => import("@modelcontextprotocol/sdk/types.js").CallToolResult | Promise<import("@modelcontextprotocol/sdk/types.js").CallToolResult>];