@likec4/language-server 1.43.0 → 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 (299) 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 +5 -1
  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 +3542 -3896
  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.js +2155 -0
  24. package/dist/generated/{grammar.mjs → grammar.js} +6 -2
  25. package/dist/generated/module.d.ts +6 -1
  26. package/dist/generated/module.js +27 -0
  27. package/dist/generated-lib/{icons.mjs → icons.js} +11 -7
  28. package/dist/index.d.ts +7 -0
  29. package/dist/index.js +53 -0
  30. package/dist/{likec4lib.mjs → likec4lib.js} +3 -3
  31. package/dist/logger.js +81 -0
  32. package/dist/lsp/CodeActionProvider.d.ts +14 -0
  33. package/dist/lsp/CodeActionProvider.js +33 -0
  34. package/dist/lsp/CodeLensProvider.js +44 -0
  35. package/dist/lsp/CompletionProvider.d.ts +3 -1
  36. package/dist/lsp/CompletionProvider.js +200 -0
  37. package/dist/lsp/DocumentHighlightProvider.js +10 -0
  38. package/dist/lsp/DocumentLinkProvider.js +58 -0
  39. package/dist/lsp/DocumentSymbolProvider.js +306 -0
  40. package/dist/lsp/HoverProvider.js +106 -0
  41. package/dist/lsp/RenameProvider.js +6 -0
  42. package/dist/lsp/SemanticTokenProvider.js +257 -0
  43. package/dist/lsp/index.d.ts +1 -0
  44. package/dist/lsp/index.js +9 -0
  45. package/dist/mcp/MCPServerFactory.js +73 -0
  46. package/dist/mcp/NoopLikeC4MCPServer.js +17 -0
  47. package/dist/mcp/interfaces.js +5 -0
  48. package/dist/mcp/server/StdioLikeC4MCPServer.js +47 -0
  49. package/dist/mcp/server/StreamableLikeC4MCPServer.js +145 -0
  50. package/dist/mcp/server/WithMCPServer.js +56 -0
  51. package/dist/mcp/tools/_common.d.ts +8 -7
  52. package/dist/mcp/tools/_common.js +49 -0
  53. package/dist/mcp/tools/find-relationships.d.ts +7 -8
  54. package/dist/mcp/tools/find-relationships.js +150 -0
  55. package/dist/mcp/tools/list-projects.d.ts +3 -3
  56. package/dist/mcp/tools/list-projects.js +62 -0
  57. package/dist/mcp/tools/open-view.d.ts +6 -7
  58. package/dist/mcp/tools/open-view.js +52 -0
  59. package/dist/mcp/tools/read-deployment.d.ts +6 -7
  60. package/dist/mcp/tools/read-deployment.js +132 -0
  61. package/dist/mcp/tools/read-element.d.ts +6 -7
  62. package/dist/mcp/tools/read-element.js +194 -0
  63. package/dist/mcp/tools/read-project-summary.d.ts +5 -6
  64. package/dist/mcp/tools/read-project-summary.js +176 -0
  65. package/dist/mcp/tools/read-view.d.ts +6 -7
  66. package/dist/mcp/tools/read-view.js +203 -0
  67. package/dist/mcp/tools/search-element.d.ts +3 -3
  68. package/dist/mcp/tools/search-element.js +177 -0
  69. package/dist/mcp/utils.d.ts +2 -2
  70. package/dist/mcp/utils.js +48 -0
  71. package/dist/model/builder/MergedExtends.js +74 -0
  72. package/dist/model/builder/MergedSpecification.js +175 -0
  73. package/dist/model/builder/buildModel.js +176 -0
  74. package/dist/model/deployments-index.js +102 -0
  75. package/dist/model/fqn-index.js +250 -0
  76. package/dist/model/index.js +6 -0
  77. package/dist/model/model-builder.d.ts +13 -11
  78. package/dist/model/model-builder.js +234 -0
  79. package/dist/model/model-locator.d.ts +6 -5
  80. package/dist/model/model-locator.js +240 -0
  81. package/dist/model/model-parser-where.js +81 -0
  82. package/dist/model/model-parser.d.ts +309 -304
  83. package/dist/model/model-parser.js +119 -0
  84. package/dist/model/parser/Base.d.ts +2 -2
  85. package/dist/model/parser/Base.js +367 -0
  86. package/dist/model/parser/DeploymentModelParser.d.ts +2 -2
  87. package/dist/model/parser/DeploymentModelParser.js +176 -0
  88. package/dist/model/parser/DeploymentViewParser.d.ts +3 -3
  89. package/dist/model/parser/DeploymentViewParser.js +86 -0
  90. package/dist/model/parser/FqnRefParser.d.ts +2 -2
  91. package/dist/model/parser/FqnRefParser.js +382 -0
  92. package/dist/model/parser/GlobalsParser.d.ts +6 -6
  93. package/dist/model/parser/GlobalsParser.js +84 -0
  94. package/dist/model/parser/ImportsParser.d.ts +11 -12
  95. package/dist/model/parser/ImportsParser.js +24 -0
  96. package/dist/model/parser/ModelParser.d.ts +2 -2
  97. package/dist/model/parser/ModelParser.js +165 -0
  98. package/dist/model/parser/PredicatesParser.d.ts +2 -2
  99. package/dist/model/parser/PredicatesParser.js +45 -0
  100. package/dist/model/parser/SpecificationParser.d.ts +2 -2
  101. package/dist/model/parser/SpecificationParser.js +109 -0
  102. package/dist/model/parser/ValueConverter.js +12 -0
  103. package/dist/model/parser/ViewsParser.d.ts +3 -3
  104. package/dist/model/parser/ViewsParser.js +477 -0
  105. package/dist/model-change/ModelChanges.d.ts +6 -3
  106. package/dist/model-change/ModelChanges.js +102 -0
  107. package/dist/model-change/changeElementStyle.js +134 -0
  108. package/dist/model-change/changeViewLayout.d.ts +2 -2
  109. package/dist/model-change/changeViewLayout.js +28 -0
  110. package/dist/model-change/removeManualLayoutV1.d.ts +7 -0
  111. package/dist/model-change/removeManualLayoutV1.js +27 -0
  112. package/dist/module.d.ts +10 -5
  113. package/dist/module.js +143 -0
  114. package/dist/protocol.d.ts +1 -17
  115. package/dist/protocol.js +114 -0
  116. package/dist/references/index.js +3 -0
  117. package/dist/references/name-provider.js +37 -0
  118. package/dist/references/scope-computation.js +288 -0
  119. package/dist/references/scope-provider.d.ts +3 -3
  120. package/dist/references/scope-provider.js +242 -0
  121. package/dist/shared/NodeKindProvider.js +57 -0
  122. package/dist/shared/{WorkspaceSymbolProvider.mjs → WorkspaceSymbolProvider.js} +1 -1
  123. package/dist/shared/index.js +2 -0
  124. package/dist/test/index.js +1 -0
  125. package/dist/test/testServices.d.ts +16 -16
  126. package/dist/test/testServices.js +210 -0
  127. package/dist/utils/disposable.js +26 -0
  128. package/dist/utils/elementRef.d.ts +1 -1
  129. package/dist/utils/elementRef.js +27 -0
  130. package/dist/utils/fqnRef.js +63 -0
  131. package/dist/utils/index.js +35 -0
  132. package/dist/utils/printDocs.js +1 -0
  133. package/dist/utils/projectId.js +16 -0
  134. package/dist/utils/stringHash.js +5 -0
  135. package/dist/validation/DocumentValidator.js +17 -0
  136. package/dist/validation/_shared.js +26 -0
  137. package/dist/validation/deployment-checks.js +140 -0
  138. package/dist/validation/dynamic-view.js +67 -0
  139. package/dist/validation/element-ref.js +12 -0
  140. package/dist/validation/element.js +49 -0
  141. package/dist/validation/imports.js +46 -0
  142. package/dist/validation/index.d.ts +1 -1
  143. package/dist/validation/index.js +157 -0
  144. package/dist/validation/property-checks.js +108 -0
  145. package/dist/validation/relation.js +55 -0
  146. package/dist/validation/specification.js +190 -0
  147. package/dist/validation/view-predicates/fqn-expr-with.js +43 -0
  148. package/dist/validation/view-predicates/fqn-ref-expr.js +51 -0
  149. package/dist/validation/view-predicates/incoming.js +16 -0
  150. package/dist/validation/view-predicates/index.js +6 -0
  151. package/dist/validation/view-predicates/outgoing.js +20 -0
  152. package/dist/validation/view-predicates/relation-expr.js +46 -0
  153. package/dist/validation/view-predicates/relation-with.js +16 -0
  154. package/dist/validation/view.d.ts +1 -1
  155. package/dist/validation/view.js +42 -0
  156. package/dist/view-utils/assignNavigateTo.js +27 -0
  157. package/dist/view-utils/index.d.ts +1 -0
  158. package/dist/view-utils/index.js +2 -0
  159. package/dist/view-utils/manual-layout.d.ts +6 -0
  160. package/dist/view-utils/manual-layout.js +151 -0
  161. package/dist/views/ConfigurableLayouter.js +51 -0
  162. package/dist/views/LikeC4ManualLayouts.d.ts +28 -0
  163. package/dist/views/LikeC4ManualLayouts.js +132 -0
  164. package/dist/views/{likec4-views.d.ts → LikeC4Views.d.ts} +9 -8
  165. package/dist/views/LikeC4Views.js +200 -0
  166. package/dist/views/index.d.ts +4 -1
  167. package/dist/views/index.js +11 -0
  168. package/dist/workspace/AstNodeDescriptionProvider.js +15 -0
  169. package/dist/workspace/IndexManager.js +21 -0
  170. package/dist/workspace/LangiumDocuments.d.ts +1 -1
  171. package/dist/workspace/LangiumDocuments.js +58 -0
  172. package/dist/workspace/ProjectsManager.d.ts +8 -3
  173. package/dist/workspace/ProjectsManager.js +373 -0
  174. package/dist/workspace/WorkspaceManager.d.ts +3 -2
  175. package/dist/workspace/WorkspaceManager.js +93 -0
  176. package/dist/workspace/index.js +5 -0
  177. package/likec4lib/package.json +1 -1
  178. package/package.json +25 -24
  179. package/protocol/package.json +1 -1
  180. package/dist/LikeC4LanguageServices.mjs +0 -197
  181. package/dist/Rpc.mjs +0 -296
  182. package/dist/ast.mjs +0 -221
  183. package/dist/browser-worker.mjs +0 -2
  184. package/dist/browser.mjs +0 -32
  185. package/dist/documentation/documentation-provider.mjs +0 -48
  186. package/dist/documentation/index.mjs +0 -1
  187. package/dist/empty.mjs +0 -1
  188. package/dist/filesystem/ChokidarWatcher.mjs +0 -68
  189. package/dist/filesystem/FileSystemWatcher.mjs +0 -11
  190. package/dist/filesystem/LikeC4FileSystem.mjs +0 -64
  191. package/dist/filesystem/index.mjs +0 -19
  192. package/dist/formatting/LikeC4Formatter.mjs +0 -511
  193. package/dist/formatting/utils.mjs +0 -15
  194. package/dist/generated/ast.mjs +0 -2150
  195. package/dist/generated/module.mjs +0 -23
  196. package/dist/index.mjs +0 -50
  197. package/dist/logger.mjs +0 -82
  198. package/dist/lsp/CodeLensProvider.mjs +0 -42
  199. package/dist/lsp/CompletionProvider.mjs +0 -208
  200. package/dist/lsp/DocumentHighlightProvider.mjs +0 -10
  201. package/dist/lsp/DocumentLinkProvider.mjs +0 -53
  202. package/dist/lsp/DocumentSymbolProvider.mjs +0 -287
  203. package/dist/lsp/HoverProvider.mjs +0 -104
  204. package/dist/lsp/RenameProvider.mjs +0 -6
  205. package/dist/lsp/SemanticTokenProvider.mjs +0 -276
  206. package/dist/lsp/index.mjs +0 -7
  207. package/dist/mcp/MCPServerFactory.mjs +0 -70
  208. package/dist/mcp/NoopLikeC4MCPServer.mjs +0 -17
  209. package/dist/mcp/interfaces.mjs +0 -4
  210. package/dist/mcp/server/StdioLikeC4MCPServer.mjs +0 -46
  211. package/dist/mcp/server/StreamableLikeC4MCPServer.mjs +0 -153
  212. package/dist/mcp/server/WithMCPServer.mjs +0 -58
  213. package/dist/mcp/tools/_common.mjs +0 -42
  214. package/dist/mcp/tools/find-relationships.mjs +0 -151
  215. package/dist/mcp/tools/list-projects.mjs +0 -62
  216. package/dist/mcp/tools/open-view.mjs +0 -52
  217. package/dist/mcp/tools/read-deployment.mjs +0 -130
  218. package/dist/mcp/tools/read-element.mjs +0 -198
  219. package/dist/mcp/tools/read-project-summary.mjs +0 -178
  220. package/dist/mcp/tools/read-view.mjs +0 -205
  221. package/dist/mcp/tools/search-element.mjs +0 -171
  222. package/dist/mcp/utils.mjs +0 -47
  223. package/dist/model/builder/MergedExtends.mjs +0 -76
  224. package/dist/model/builder/MergedSpecification.mjs +0 -205
  225. package/dist/model/builder/assignTagColors.d.ts +0 -7
  226. package/dist/model/builder/assignTagColors.mjs +0 -51
  227. package/dist/model/builder/buildModel.mjs +0 -226
  228. package/dist/model/deployments-index.mjs +0 -100
  229. package/dist/model/fqn-index.mjs +0 -243
  230. package/dist/model/index.mjs +0 -6
  231. package/dist/model/model-builder.mjs +0 -285
  232. package/dist/model/model-locator.mjs +0 -239
  233. package/dist/model/model-parser-where.mjs +0 -81
  234. package/dist/model/model-parser.mjs +0 -127
  235. package/dist/model/parser/Base.mjs +0 -376
  236. package/dist/model/parser/DeploymentModelParser.mjs +0 -212
  237. package/dist/model/parser/DeploymentViewParser.mjs +0 -95
  238. package/dist/model/parser/FqnRefParser.mjs +0 -398
  239. package/dist/model/parser/GlobalsParser.mjs +0 -82
  240. package/dist/model/parser/ImportsParser.mjs +0 -28
  241. package/dist/model/parser/ModelParser.mjs +0 -190
  242. package/dist/model/parser/PredicatesParser.mjs +0 -45
  243. package/dist/model/parser/SpecificationParser.mjs +0 -120
  244. package/dist/model/parser/ValueConverter.mjs +0 -12
  245. package/dist/model/parser/ViewsParser.mjs +0 -490
  246. package/dist/model-change/ModelChanges.mjs +0 -89
  247. package/dist/model-change/changeElementStyle.mjs +0 -143
  248. package/dist/model-change/changeViewLayout.mjs +0 -32
  249. package/dist/model-change/saveManualLayout.d.ts +0 -11
  250. package/dist/model-change/saveManualLayout.mjs +0 -27
  251. package/dist/module.mjs +0 -180
  252. package/dist/protocol.mjs +0 -65
  253. package/dist/references/index.mjs +0 -3
  254. package/dist/references/name-provider.mjs +0 -39
  255. package/dist/references/scope-computation.mjs +0 -312
  256. package/dist/references/scope-provider.mjs +0 -239
  257. package/dist/shared/NodeKindProvider.mjs +0 -110
  258. package/dist/shared/index.mjs +0 -2
  259. package/dist/test/index.mjs +0 -1
  260. package/dist/test/testServices.mjs +0 -200
  261. package/dist/utils/disposable.mjs +0 -25
  262. package/dist/utils/elementRef.mjs +0 -20
  263. package/dist/utils/fqnRef.mjs +0 -57
  264. package/dist/utils/index.mjs +0 -33
  265. package/dist/utils/printDocs.mjs +0 -1
  266. package/dist/utils/projectId.mjs +0 -16
  267. package/dist/utils/stringHash.mjs +0 -5
  268. package/dist/validation/DocumentValidator.mjs +0 -16
  269. package/dist/validation/_shared.mjs +0 -25
  270. package/dist/validation/deployment-checks.mjs +0 -146
  271. package/dist/validation/dynamic-view.mjs +0 -67
  272. package/dist/validation/element-ref.mjs +0 -12
  273. package/dist/validation/element.mjs +0 -50
  274. package/dist/validation/imports.mjs +0 -25
  275. package/dist/validation/index.mjs +0 -180
  276. package/dist/validation/property-checks.mjs +0 -107
  277. package/dist/validation/relation.mjs +0 -53
  278. package/dist/validation/specification.mjs +0 -173
  279. package/dist/validation/view-predicates/fqn-expr-with.mjs +0 -43
  280. package/dist/validation/view-predicates/fqn-ref-expr.mjs +0 -53
  281. package/dist/validation/view-predicates/incoming.mjs +0 -16
  282. package/dist/validation/view-predicates/index.mjs +0 -6
  283. package/dist/validation/view-predicates/outgoing.mjs +0 -20
  284. package/dist/validation/view-predicates/relation-expr.mjs +0 -39
  285. package/dist/validation/view-predicates/relation-with.mjs +0 -16
  286. package/dist/validation/view.mjs +0 -25
  287. package/dist/view-utils/assignNavigateTo.mjs +0 -25
  288. package/dist/view-utils/index.mjs +0 -1
  289. package/dist/view-utils/manual-layout.mjs +0 -99
  290. package/dist/views/configurable-layouter.mjs +0 -51
  291. package/dist/views/index.mjs +0 -1
  292. package/dist/views/likec4-views.mjs +0 -166
  293. package/dist/workspace/AstNodeDescriptionProvider.mjs +0 -17
  294. package/dist/workspace/IndexManager.mjs +0 -17
  295. package/dist/workspace/LangiumDocuments.mjs +0 -53
  296. package/dist/workspace/ProjectsManager.mjs +0 -360
  297. package/dist/workspace/WorkspaceManager.mjs +0 -83
  298. package/dist/workspace/index.mjs +0 -5
  299. /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>];