@likec4/language-server 1.46.4 → 1.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. package/LICENSE +1 -1
  2. package/browser/package.json +2 -2
  3. package/browser-worker/package.json +2 -2
  4. package/bundled/package.json +4 -0
  5. package/dist/LikeC4LanguageServices.d.mts +4 -0
  6. package/dist/LikeC4LanguageServices.mjs +3 -0
  7. package/dist/_chunks/ConfigurableLayouter.mjs +1956 -0
  8. package/dist/_chunks/LikeC4LanguageServices.d.mts +1978 -0
  9. package/dist/_chunks/LikeC4LanguageServices.mjs +725 -0
  10. package/dist/_chunks/ast.d.mts +1444 -0
  11. package/dist/_chunks/ast.mjs +2375 -0
  12. package/dist/_chunks/ast2.mjs +176 -0
  13. package/dist/_chunks/common-exports.mjs +0 -0
  14. package/dist/_chunks/filesystem.mjs +58 -0
  15. package/dist/_chunks/grammar.mjs +8 -0
  16. package/dist/_chunks/icons.mjs +5211 -0
  17. package/dist/_chunks/libs/@hono/node-server.mjs +436 -0
  18. package/dist/_chunks/libs/@msgpack/msgpack.mjs +805 -0
  19. package/dist/_chunks/libs/eventemitter3.mjs +243 -0
  20. package/dist/_chunks/libs/fast-equals.mjs +446 -0
  21. package/dist/_chunks/libs/hono.mjs +1829 -0
  22. package/dist/_chunks/libs/p-queue.mjs +449 -0
  23. package/dist/_chunks/libs/parse-ms.mjs +36 -0
  24. package/dist/_chunks/libs/picomatch.mjs +1673 -0
  25. package/dist/_chunks/libs/pretty-ms.mjs +80 -0
  26. package/dist/_chunks/libs/remeda.mjs +482 -0
  27. package/dist/_chunks/libs/strip-indent.mjs +15 -0
  28. package/dist/_chunks/libs/ufo.mjs +166 -0
  29. package/dist/_chunks/likec4lib.mjs +9 -0
  30. package/dist/_chunks/mcp.mjs +33 -0
  31. package/dist/_chunks/module.mjs +28 -0
  32. package/dist/_chunks/module2.mjs +6576 -0
  33. package/dist/_chunks/protocol.d.mts +311 -0
  34. package/dist/_chunks/protocol.mjs +78 -0
  35. package/dist/_chunks/rolldown-runtime.mjs +42 -0
  36. package/dist/ast.d.mts +4 -0
  37. package/dist/ast.mjs +4 -0
  38. package/dist/browser-worker.d.mts +1 -0
  39. package/dist/browser-worker.mjs +6 -0
  40. package/dist/browser.d.mts +11 -0
  41. package/dist/browser.mjs +27 -0
  42. package/dist/bundled.d.mts +28 -0
  43. package/dist/bundled.mjs +51 -4681
  44. package/dist/common-exports.d.mts +4 -0
  45. package/dist/common-exports.mjs +5 -0
  46. package/dist/filesystem/index.d.mts +4 -0
  47. package/dist/filesystem/index.mjs +3 -0
  48. package/dist/generated/ast.d.mts +2 -0
  49. package/dist/generated/ast.mjs +3 -0
  50. package/dist/generated/grammar.d.mts +6 -0
  51. package/dist/generated/grammar.mjs +3 -0
  52. package/dist/generated/module.d.mts +14 -0
  53. package/dist/generated/module.mjs +3 -0
  54. package/dist/generated-lib/icons.d.mts +4 -0
  55. package/dist/generated-lib/icons.mjs +3 -0
  56. package/dist/index.d.mts +4 -0
  57. package/dist/index.mjs +48 -0
  58. package/dist/likec4lib.d.mts +9 -0
  59. package/dist/likec4lib.mjs +4 -0
  60. package/dist/mcp/index.d.mts +4 -0
  61. package/dist/mcp/index.mjs +3 -0
  62. package/dist/module.d.mts +4 -0
  63. package/dist/module.mjs +3 -0
  64. package/dist/protocol.d.mts +2 -0
  65. package/dist/protocol.mjs +3 -0
  66. package/likec4lib/package.json +2 -2
  67. package/package.json +106 -62
  68. package/protocol/package.json +2 -2
  69. package/dist/LikeC4LanguageServices.d.ts +0 -109
  70. package/dist/LikeC4LanguageServices.js +0 -154
  71. package/dist/Rpc.d.ts +0 -9
  72. package/dist/Rpc.js +0 -270
  73. package/dist/ast.d.ts +0 -226
  74. package/dist/ast.js +0 -264
  75. package/dist/browser-worker.d.ts +0 -1
  76. package/dist/browser-worker.js +0 -4
  77. package/dist/browser.d.ts +0 -11
  78. package/dist/browser.js +0 -35
  79. package/dist/bundled.d.ts +0 -8
  80. package/dist/bundled.js +0 -44
  81. package/dist/documentation/documentation-provider.d.ts +0 -8
  82. package/dist/documentation/documentation-provider.js +0 -51
  83. package/dist/documentation/index.d.ts +0 -1
  84. package/dist/documentation/index.js +0 -1
  85. package/dist/empty.d.ts +0 -2
  86. package/dist/empty.js +0 -2
  87. package/dist/filesystem/ChokidarWatcher.d.ts +0 -16
  88. package/dist/filesystem/ChokidarWatcher.js +0 -108
  89. package/dist/filesystem/FileSystemWatcher.d.ts +0 -19
  90. package/dist/filesystem/FileSystemWatcher.js +0 -14
  91. package/dist/filesystem/LikeC4FileSystem.d.ts +0 -3
  92. package/dist/filesystem/LikeC4FileSystem.js +0 -130
  93. package/dist/filesystem/index.d.ts +0 -55
  94. package/dist/filesystem/index.js +0 -29
  95. package/dist/formatting/LikeC4Formatter.d.ts +0 -59
  96. package/dist/formatting/LikeC4Formatter.js +0 -637
  97. package/dist/formatting/utils.d.ts +0 -6
  98. package/dist/formatting/utils.js +0 -18
  99. package/dist/generated/ast.d.ts +0 -1411
  100. package/dist/generated/ast.js +0 -2207
  101. package/dist/generated/grammar.d.ts +0 -6
  102. package/dist/generated/grammar.js +0 -7
  103. package/dist/generated/module.d.ts +0 -14
  104. package/dist/generated/module.js +0 -27
  105. package/dist/generated-lib/icons.d.ts +0 -1
  106. package/dist/generated-lib/icons.js +0 -18
  107. package/dist/index.d.ts +0 -38
  108. package/dist/index.js +0 -55
  109. package/dist/likec4lib.d.ts +0 -6
  110. package/dist/likec4lib.js +0 -7
  111. package/dist/logger.d.ts +0 -17
  112. package/dist/logger.js +0 -81
  113. package/dist/lsp/CodeActionProvider.d.ts +0 -14
  114. package/dist/lsp/CodeActionProvider.js +0 -33
  115. package/dist/lsp/CodeLensProvider.d.ts +0 -9
  116. package/dist/lsp/CodeLensProvider.js +0 -44
  117. package/dist/lsp/CompletionProvider.d.ts +0 -11
  118. package/dist/lsp/CompletionProvider.js +0 -200
  119. package/dist/lsp/DocumentHighlightProvider.d.ts +0 -9
  120. package/dist/lsp/DocumentHighlightProvider.js +0 -10
  121. package/dist/lsp/DocumentLinkProvider.d.ts +0 -11
  122. package/dist/lsp/DocumentLinkProvider.js +0 -58
  123. package/dist/lsp/DocumentSymbolProvider.d.ts +0 -33
  124. package/dist/lsp/DocumentSymbolProvider.js +0 -317
  125. package/dist/lsp/HoverProvider.d.ts +0 -10
  126. package/dist/lsp/HoverProvider.js +0 -106
  127. package/dist/lsp/RenameProvider.d.ts +0 -5
  128. package/dist/lsp/RenameProvider.js +0 -6
  129. package/dist/lsp/SemanticTokenProvider.d.ts +0 -12
  130. package/dist/lsp/SemanticTokenProvider.js +0 -264
  131. package/dist/lsp/index.d.ts +0 -8
  132. package/dist/lsp/index.js +0 -9
  133. package/dist/mcp/MCPServerFactory.d.ts +0 -8
  134. package/dist/mcp/MCPServerFactory.js +0 -73
  135. package/dist/mcp/NoopLikeC4MCPServer.d.ts +0 -9
  136. package/dist/mcp/NoopLikeC4MCPServer.js +0 -17
  137. package/dist/mcp/interfaces.d.ts +0 -13
  138. package/dist/mcp/interfaces.js +0 -5
  139. package/dist/mcp/server/StdioLikeC4MCPServer.d.ts +0 -16
  140. package/dist/mcp/server/StdioLikeC4MCPServer.js +0 -51
  141. package/dist/mcp/server/StreamableLikeC4MCPServer.d.ts +0 -16
  142. package/dist/mcp/server/StreamableLikeC4MCPServer.js +0 -145
  143. package/dist/mcp/server/WithMCPServer.d.ts +0 -4
  144. package/dist/mcp/server/WithMCPServer.js +0 -54
  145. package/dist/mcp/tools/_common.d.ts +0 -88
  146. package/dist/mcp/tools/_common.js +0 -49
  147. package/dist/mcp/tools/find-relationships.d.ts +0 -12
  148. package/dist/mcp/tools/find-relationships.js +0 -150
  149. package/dist/mcp/tools/list-projects.d.ts +0 -6
  150. package/dist/mcp/tools/list-projects.js +0 -62
  151. package/dist/mcp/tools/open-view.d.ts +0 -10
  152. package/dist/mcp/tools/open-view.js +0 -52
  153. package/dist/mcp/tools/read-deployment.d.ts +0 -10
  154. package/dist/mcp/tools/read-deployment.js +0 -150
  155. package/dist/mcp/tools/read-element.d.ts +0 -10
  156. package/dist/mcp/tools/read-element.js +0 -218
  157. package/dist/mcp/tools/read-project-summary.d.ts +0 -8
  158. package/dist/mcp/tools/read-project-summary.js +0 -176
  159. package/dist/mcp/tools/read-view.d.ts +0 -10
  160. package/dist/mcp/tools/read-view.js +0 -203
  161. package/dist/mcp/tools/search-element.d.ts +0 -8
  162. package/dist/mcp/tools/search-element.js +0 -177
  163. package/dist/mcp/utils.d.ts +0 -18
  164. package/dist/mcp/utils.js +0 -48
  165. package/dist/model/builder/MergedExtends.d.ts +0 -13
  166. package/dist/model/builder/MergedExtends.js +0 -74
  167. package/dist/model/builder/MergedSpecification.d.ts +0 -32
  168. package/dist/model/builder/MergedSpecification.js +0 -175
  169. package/dist/model/builder/buildModel.d.ts +0 -16
  170. package/dist/model/builder/buildModel.js +0 -245
  171. package/dist/model/deployments-index.d.ts +0 -10
  172. package/dist/model/deployments-index.js +0 -102
  173. package/dist/model/fqn-index.d.ts +0 -61
  174. package/dist/model/fqn-index.js +0 -253
  175. package/dist/model/index.d.ts +0 -6
  176. package/dist/model/index.js +0 -6
  177. package/dist/model/model-builder.d.ts +0 -52
  178. package/dist/model/model-builder.js +0 -224
  179. package/dist/model/model-locator.d.ts +0 -39
  180. package/dist/model/model-locator.js +0 -240
  181. package/dist/model/model-parser-where.d.ts +0 -4
  182. package/dist/model/model-parser-where.js +0 -81
  183. package/dist/model/model-parser.d.ts +0 -645
  184. package/dist/model/model-parser.js +0 -133
  185. package/dist/model/parser/Base.d.ts +0 -69
  186. package/dist/model/parser/Base.js +0 -372
  187. package/dist/model/parser/DeploymentModelParser.d.ts +0 -71
  188. package/dist/model/parser/DeploymentModelParser.js +0 -176
  189. package/dist/model/parser/DeploymentViewParser.d.ts +0 -75
  190. package/dist/model/parser/DeploymentViewParser.js +0 -86
  191. package/dist/model/parser/FqnRefParser.d.ts +0 -66
  192. package/dist/model/parser/FqnRefParser.js +0 -382
  193. package/dist/model/parser/GlobalsParser.d.ts +0 -109
  194. package/dist/model/parser/GlobalsParser.js +0 -84
  195. package/dist/model/parser/ImportsParser.d.ts +0 -46
  196. package/dist/model/parser/ImportsParser.js +0 -24
  197. package/dist/model/parser/ModelParser.d.ts +0 -71
  198. package/dist/model/parser/ModelParser.js +0 -209
  199. package/dist/model/parser/PredicatesParser.d.ts +0 -75
  200. package/dist/model/parser/PredicatesParser.js +0 -45
  201. package/dist/model/parser/SpecificationParser.d.ts +0 -53
  202. package/dist/model/parser/SpecificationParser.js +0 -113
  203. package/dist/model/parser/ValueConverter.d.ts +0 -4
  204. package/dist/model/parser/ValueConverter.js +0 -12
  205. package/dist/model/parser/ViewsParser.d.ts +0 -112
  206. package/dist/model/parser/ViewsParser.js +0 -492
  207. package/dist/model-change/ModelChanges.d.ts +0 -18
  208. package/dist/model-change/ModelChanges.js +0 -129
  209. package/dist/model-change/changeElementStyle.d.ts +0 -16
  210. package/dist/model-change/changeElementStyle.js +0 -134
  211. package/dist/model-change/changeViewLayout.d.ts +0 -12
  212. package/dist/model-change/changeViewLayout.js +0 -28
  213. package/dist/model-change/removeManualLayoutV1.d.ts +0 -7
  214. package/dist/model-change/removeManualLayoutV1.js +0 -27
  215. package/dist/module.d.ts +0 -92
  216. package/dist/module.js +0 -143
  217. package/dist/protocol.d.ts +0 -284
  218. package/dist/protocol.js +0 -123
  219. package/dist/references/index.d.ts +0 -3
  220. package/dist/references/index.js +0 -3
  221. package/dist/references/name-provider.d.ts +0 -9
  222. package/dist/references/name-provider.js +0 -37
  223. package/dist/references/scope-computation.d.ts +0 -20
  224. package/dist/references/scope-computation.js +0 -288
  225. package/dist/references/scope-provider.d.ts +0 -40
  226. package/dist/references/scope-provider.js +0 -239
  227. package/dist/shared/NodeKindProvider.d.ts +0 -15
  228. package/dist/shared/NodeKindProvider.js +0 -57
  229. package/dist/shared/WorkspaceSymbolProvider.d.ts +0 -3
  230. package/dist/shared/WorkspaceSymbolProvider.js +0 -3
  231. package/dist/shared/index.d.ts +0 -2
  232. package/dist/shared/index.js +0 -2
  233. package/dist/test/index.d.ts +0 -1
  234. package/dist/test/index.js +0 -1
  235. package/dist/test/testServices.d.ts +0 -64
  236. package/dist/test/testServices.js +0 -210
  237. package/dist/utils/disposable.d.ts +0 -8
  238. package/dist/utils/disposable.js +0 -26
  239. package/dist/utils/elementRef.d.ts +0 -11
  240. package/dist/utils/elementRef.js +0 -27
  241. package/dist/utils/fqnRef.d.ts +0 -11
  242. package/dist/utils/fqnRef.js +0 -63
  243. package/dist/utils/index.d.ts +0 -11
  244. package/dist/utils/index.js +0 -35
  245. package/dist/utils/printDocs.d.ts +0 -2
  246. package/dist/utils/printDocs.js +0 -1
  247. package/dist/utils/projectId.d.ts +0 -4
  248. package/dist/utils/projectId.js +0 -16
  249. package/dist/utils/stringHash.d.ts +0 -1
  250. package/dist/utils/stringHash.js +0 -5
  251. package/dist/validation/DocumentValidator.d.ts +0 -11
  252. package/dist/validation/DocumentValidator.js +0 -17
  253. package/dist/validation/_shared.d.ts +0 -3
  254. package/dist/validation/_shared.js +0 -26
  255. package/dist/validation/deployment-checks.d.ts +0 -7
  256. package/dist/validation/deployment-checks.js +0 -140
  257. package/dist/validation/dynamic-view.d.ts +0 -6
  258. package/dist/validation/dynamic-view.js +0 -67
  259. package/dist/validation/element-ref.d.ts +0 -4
  260. package/dist/validation/element-ref.js +0 -12
  261. package/dist/validation/element.d.ts +0 -4
  262. package/dist/validation/element.js +0 -49
  263. package/dist/validation/imports.d.ts +0 -4
  264. package/dist/validation/imports.js +0 -46
  265. package/dist/validation/index.d.ts +0 -15
  266. package/dist/validation/index.js +0 -167
  267. package/dist/validation/property-checks.d.ts +0 -7
  268. package/dist/validation/property-checks.js +0 -108
  269. package/dist/validation/relation.d.ts +0 -6
  270. package/dist/validation/relation.js +0 -141
  271. package/dist/validation/specification.d.ts +0 -12
  272. package/dist/validation/specification.js +0 -190
  273. package/dist/validation/view-checks.d.ts +0 -4
  274. package/dist/validation/view-checks.js +0 -46
  275. package/dist/validation/view-predicates/fqn-expr-with.d.ts +0 -4
  276. package/dist/validation/view-predicates/fqn-expr-with.js +0 -43
  277. package/dist/validation/view-predicates/fqn-ref-expr.d.ts +0 -4
  278. package/dist/validation/view-predicates/fqn-ref-expr.js +0 -51
  279. package/dist/validation/view-predicates/incoming.d.ts +0 -4
  280. package/dist/validation/view-predicates/incoming.js +0 -16
  281. package/dist/validation/view-predicates/index.d.ts +0 -6
  282. package/dist/validation/view-predicates/index.js +0 -6
  283. package/dist/validation/view-predicates/outgoing.d.ts +0 -4
  284. package/dist/validation/view-predicates/outgoing.js +0 -20
  285. package/dist/validation/view-predicates/relation-expr.d.ts +0 -4
  286. package/dist/validation/view-predicates/relation-expr.js +0 -46
  287. package/dist/validation/view-predicates/relation-with.d.ts +0 -4
  288. package/dist/validation/view-predicates/relation-with.js +0 -16
  289. package/dist/validation/view.d.ts +0 -4
  290. package/dist/validation/view.js +0 -42
  291. package/dist/view-utils/assignNavigateTo.d.ts +0 -2
  292. package/dist/view-utils/assignNavigateTo.js +0 -27
  293. package/dist/view-utils/index.d.ts +0 -2
  294. package/dist/view-utils/index.js +0 -2
  295. package/dist/view-utils/manual-layout.d.ts +0 -13
  296. package/dist/view-utils/manual-layout.js +0 -149
  297. package/dist/views/ConfigurableLayouter.d.ts +0 -7
  298. package/dist/views/ConfigurableLayouter.js +0 -51
  299. package/dist/views/LikeC4ManualLayouts.d.ts +0 -42
  300. package/dist/views/LikeC4ManualLayouts.js +0 -209
  301. package/dist/views/LikeC4Views.d.ts +0 -89
  302. package/dist/views/LikeC4Views.js +0 -216
  303. package/dist/views/index.d.ts +0 -4
  304. package/dist/views/index.js +0 -11
  305. package/dist/workspace/AstNodeDescriptionProvider.d.ts +0 -7
  306. package/dist/workspace/AstNodeDescriptionProvider.js +0 -18
  307. package/dist/workspace/IndexManager.d.ts +0 -10
  308. package/dist/workspace/IndexManager.js +0 -26
  309. package/dist/workspace/LangiumDocuments.d.ts +0 -25
  310. package/dist/workspace/LangiumDocuments.js +0 -98
  311. package/dist/workspace/ProjectsManager.d.ts +0 -130
  312. package/dist/workspace/ProjectsManager.js +0 -605
  313. package/dist/workspace/WorkspaceManager.d.ts +0 -31
  314. package/dist/workspace/WorkspaceManager.js +0 -132
  315. package/dist/workspace/index.d.ts +0 -5
  316. package/dist/workspace/index.js +0 -5
@@ -1,177 +0,0 @@
1
- import { ifilter } from '@likec4/core/utils';
2
- import * as z from 'zod/v3';
3
- import { likec4Tool, logger } from '../utils';
4
- import { includedInViews, includedInViewsSchema } from './_common';
5
- const searchResultSchema = z.array(z.discriminatedUnion('type', [
6
- z.object({
7
- type: z.literal('element'),
8
- project: z.string().describe('Project ID'),
9
- id: z.string().describe('Element ID (FQN)'),
10
- name: z.string().describe('Element name'),
11
- kind: z.string(),
12
- title: z.string(),
13
- technology: z.string().nullable(),
14
- shape: z.string(),
15
- includedInViews: includedInViewsSchema,
16
- metadata: z.record(z.union([z.string(), z.array(z.string())])),
17
- tags: z.array(z.string()),
18
- }),
19
- z.object({
20
- type: z.literal('deployment-node'),
21
- project: z.string().describe('Project ID'),
22
- id: z.string().describe('Deployment ID (FQN)'),
23
- name: z.string().describe('Deployment name'),
24
- kind: z.string(),
25
- title: z.string(),
26
- technology: z.string().nullable(),
27
- shape: z.string(),
28
- includedInViews: includedInViewsSchema,
29
- metadata: z.record(z.union([z.string(), z.array(z.string())])),
30
- tags: z.array(z.string()),
31
- }),
32
- ]));
33
- export const searchElement = likec4Tool({
34
- name: 'search-element',
35
- annotations: {
36
- readOnlyHint: true,
37
- idempotentHint: true,
38
- title: 'Search elements',
39
- },
40
- description: `
41
- Search LikeC4 elements and deployment nodes across all projects.
42
-
43
- Query syntax (case-insensitive):
44
- - kind:<value> filters by kind
45
- - shape:<value> filters by shape
46
- - meta:<key> filters by having metadata with the given key
47
- - #<value> matches assigned tags
48
- - <value> matches id (FQN) or title
49
-
50
- Request:
51
- - search: string — at least 2 characters
52
-
53
- Response (JSON object):
54
- - total: number - total number of results
55
- - found: Result[] - returns top 20 results
56
-
57
- Result (discriminated union by "type"):
58
- - type = "element": { id: string, name: string, kind: string, title: string, technology: string|null, shape: string, project: string, includedInViews: View[], tags: string[], metadata: Record<string, string> }
59
- - type = "deployment-node": { id: string, name: string, kind: string, title: string, technology: string|null, shape: string, project: string, includedInViews: View[], tags: string[], metadata: Record<string, string> }
60
-
61
- View (object) fields:
62
- - id: string — view identifier
63
- - title: string — view title
64
- - type: "element" | "deployment" | "dynamic"
65
-
66
- Notes:
67
- - Read-only, idempotent.
68
- - Use results as input to other tools (e.g., read-element, read-view).
69
-
70
- Example response:
71
- {
72
- "total": 1,
73
- "found": [
74
- {
75
- "type": "logical",
76
- "project": "default",
77
- "id": "shop.frontend",
78
- "name": "frontend",
79
- "kind": "container",
80
- "title": "Frontend",
81
- "technology": "React",
82
- "shape": "rectangle",
83
- "includedInViews": [
84
- {
85
- "id": "system-overview",
86
- "title": "System Overview",
87
- "type": "element"
88
- }
89
- ],
90
- "tags": ["public"],
91
- "metadata": {}
92
- }
93
- ]
94
- }
95
- `,
96
- inputSchema: {
97
- search: z.string().min(2, 'Search must be at least 2 characters long'),
98
- },
99
- outputSchema: {
100
- total: z.number(),
101
- found: searchResultSchema,
102
- },
103
- }, async (languageServices, args) => {
104
- const projects = languageServices.projects();
105
- const found = [];
106
- let search = args.search.toLowerCase();
107
- let predicate;
108
- if (search.startsWith('kind:')) {
109
- search = search.slice(5);
110
- logger.debug('search by kind: {search}', { search });
111
- predicate = (el) => el.kind.toLowerCase() === search;
112
- }
113
- else if (search.startsWith('shape:')) {
114
- search = search.slice(6);
115
- logger.debug('search by shape: {search}', { search });
116
- predicate = (el) => el.shape.toLowerCase() === search;
117
- }
118
- else if (search.startsWith('meta:')) {
119
- search = search.slice(5);
120
- logger.debug('search by metadata: {search}', { search });
121
- predicate = (el) => !!el.getMetadata(search);
122
- }
123
- else if (search.startsWith('#')) {
124
- search = search.slice(1);
125
- logger.debug('search by tag: {search}', { search });
126
- predicate = (el) => el.tags.some(tag => tag.toLowerCase().includes(search));
127
- }
128
- else {
129
- logger.debug('search by id/title: {search}', { search });
130
- predicate = (el) => el.id.toLowerCase().includes(search)
131
- || el.title.toLowerCase().includes(search);
132
- }
133
- for (const project of projects) {
134
- try {
135
- const model = await languageServices.computedModel(project.id);
136
- // filter elements
137
- for (const el of ifilter(model.elements(), e => !e.imported && predicate(e))) {
138
- found.push({
139
- type: 'element',
140
- project: project.id,
141
- id: el.id,
142
- name: el.name,
143
- kind: el.kind,
144
- title: el.title,
145
- technology: el.technology,
146
- shape: el.shape,
147
- tags: [...el.tags],
148
- metadata: el.getMetadata(),
149
- includedInViews: includedInViews(el.views()),
150
- });
151
- }
152
- // filter deployment nodes
153
- for (const el of ifilter(model.deployment.nodes(), predicate)) {
154
- found.push({
155
- type: 'deployment-node',
156
- project: project.id,
157
- id: el.id,
158
- name: el.name,
159
- kind: el.kind,
160
- title: el.title,
161
- technology: el.technology,
162
- shape: el.shape,
163
- tags: [...el.tags],
164
- metadata: el.getMetadata(),
165
- includedInViews: includedInViews(el.views()),
166
- });
167
- }
168
- }
169
- catch (error) {
170
- logger.error(`Error searching in project ${project.id}:`, { error });
171
- }
172
- }
173
- return {
174
- total: found.length,
175
- found: found.slice(0, 20),
176
- };
177
- });
@@ -1,18 +0,0 @@
1
- import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
2
- import type { ServerNotification, ServerRequest, ToolAnnotations } from '@modelcontextprotocol/sdk/types.js';
3
- import type { z, ZodRawShape, ZodTypeAny } from 'zod/v3';
4
- import type { ToolCallback } from '@modelcontextprotocol/sdk/server/mcp.js';
5
- import type { LikeC4LanguageServices } from '../LikeC4LanguageServices';
6
- export declare const logger: import("@logtape/logtape").Logger;
7
- type ToolResult<Out extends undefined | ZodRawShape = undefined> = Out extends ZodRawShape ? z.objectOutputType<Out, ZodTypeAny> : string;
8
- type LikeC4ToolCallback<Args extends undefined | ZodRawShape, Out extends undefined | ZodRawShape> = Args extends ZodRawShape ? (languageServices: LikeC4LanguageServices, args: z.objectOutputType<Args, ZodTypeAny>, extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => Promise<ToolResult<Out>> : (languageServices: LikeC4LanguageServices, extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => Promise<ToolResult<Out>>;
9
- export declare function likec4Tool<InputArgs extends ZodRawShape, OutputArgs extends ZodRawShape, Cb extends LikeC4ToolCallback<InputArgs, OutputArgs>>(config: {
10
- name: string;
11
- description?: string;
12
- inputSchema?: InputArgs;
13
- outputSchema?: OutputArgs;
14
- annotations?: ToolAnnotations;
15
- }, cb: Cb): (languageServices: LikeC4LanguageServices) => [string, {
16
- inputSchema?: InputArgs;
17
- }, ToolCallback<InputArgs>];
18
- export {};
package/dist/mcp/utils.js DELETED
@@ -1,48 +0,0 @@
1
- import { loggable } from '@likec4/log';
2
- import { logger as mainLogger } from '../logger';
3
- export const logger = mainLogger.getChild('mcp');
4
- export function likec4Tool(config, cb) {
5
- const { name, description, ...rest } = config;
6
- return (languageServices) => [
7
- name,
8
- {
9
- description: description?.trim() ?? '',
10
- ...rest,
11
- },
12
- mkcallTool(name, languageServices, cb),
13
- ];
14
- }
15
- function mkcallTool(name, languageServices, cb) {
16
- const tool = cb.bind(null, languageServices);
17
- return (async function callTool(args, extra) {
18
- logger.debug('Calling tool {name}, args: {args}', { name, args });
19
- try {
20
- const result = await tool.call(null, args, extra);
21
- if (typeof result === 'string') {
22
- return {
23
- content: [{
24
- type: 'text',
25
- text: result,
26
- }],
27
- };
28
- }
29
- return {
30
- content: [{
31
- type: 'text',
32
- text: JSON.stringify(result),
33
- }],
34
- structuredContent: result,
35
- };
36
- }
37
- catch (err) {
38
- logger.error(`Tool ${name} failed`, { err });
39
- return {
40
- content: [{
41
- type: 'text',
42
- text: loggable(err),
43
- }],
44
- isError: true,
45
- };
46
- }
47
- });
48
- }
@@ -1,13 +0,0 @@
1
- import type * as c4 from '@likec4/core';
2
- import type { ParsedAstExtend } from '../../ast';
3
- export declare class MergedExtends {
4
- private mergedData;
5
- private mergeMetadata;
6
- merge(parsedExtends: ParsedAstExtend[]): void;
7
- applyExtended<E extends {
8
- id: string;
9
- tags?: readonly string[] | null;
10
- links?: readonly c4.Link[] | null;
11
- metadata?: Record<string, string | string[]>;
12
- }>(el: E): E;
13
- }
@@ -1,74 +0,0 @@
1
- import { hasAtLeast, isEmpty, unique, } from 'remeda';
2
- export class MergedExtends {
3
- mergedData = new Map();
4
- mergeMetadata(existing, incoming) {
5
- const result = { ...existing };
6
- for (const [key, incomingValue] of Object.entries(incoming)) {
7
- const existingValue = result[key];
8
- if (existingValue === undefined) {
9
- result[key] = incomingValue;
10
- continue;
11
- }
12
- // Convert both values to arrays to make merging easier.
13
- const existingArray = Array.isArray(existingValue) ? existingValue : [existingValue];
14
- const incomingArray = Array.isArray(incomingValue) ? incomingValue : [incomingValue];
15
- // Merge and deduplicate based on value.
16
- const merged = unique([...existingArray, ...incomingArray]);
17
- result[key] = merged.length === 1 ? merged[0] : merged;
18
- }
19
- return result;
20
- }
21
- merge(parsedExtends) {
22
- for (const parsedExtend of parsedExtends) {
23
- const { id, links, tags, metadata } = parsedExtend;
24
- const existing = this.mergedData.get(id) ?? {
25
- links: [],
26
- tags: [],
27
- metadata: {},
28
- };
29
- if (links) {
30
- existing.links.push(...links);
31
- }
32
- if (tags) {
33
- existing.tags = unique([
34
- ...existing.tags,
35
- ...tags,
36
- ]);
37
- }
38
- if (metadata) {
39
- existing.metadata = this.mergeMetadata(existing.metadata, metadata);
40
- }
41
- this.mergedData.set(id, existing);
42
- }
43
- }
44
- applyExtended(el) {
45
- const extendData = this.mergedData.get(el.id);
46
- if (!extendData) {
47
- return el;
48
- }
49
- let links = extendData.links;
50
- if (el.links && el.links.length > 0) {
51
- links = [
52
- ...el.links,
53
- ...links,
54
- ];
55
- }
56
- let tags = extendData.tags;
57
- if (el.tags && el.tags.length > 0) {
58
- tags = unique([
59
- ...el.tags,
60
- ...tags,
61
- ]);
62
- }
63
- let metadata = extendData.metadata;
64
- if (el.metadata) {
65
- metadata = this.mergeMetadata(el.metadata, extendData.metadata);
66
- }
67
- return {
68
- ...el,
69
- tags: hasAtLeast(tags, 1) ? tags : null,
70
- links: hasAtLeast(links, 1) ? links : null,
71
- ...(!isEmpty(metadata) && { metadata }),
72
- };
73
- }
74
- }
@@ -1,32 +0,0 @@
1
- import type * as c4 from '@likec4/core';
2
- import { MultiMap } from '@likec4/core/utils';
3
- import type { ParsedAstDeployment, ParsedAstDeploymentRelation, ParsedAstElement, ParsedAstRelation, ParsedAstSpecification, ParsedLikeC4LangiumDocument } from '../../ast';
4
- /**
5
- * The `MergedSpecification` class is responsible for merging multiple parsed
6
- * LikeC4Langium documents into a single specification. It consolidates tags,
7
- * elements, deployments, relationships, and colors from the provided documents
8
- * and provides methods to convert parsed models into C4 model elements and relations.
9
- */
10
- export declare class MergedSpecification {
11
- readonly specs: Omit<ParsedAstSpecification, 'tags'>;
12
- readonly tags: Readonly<Record<c4.Tag, c4.TagSpecification>>;
13
- readonly globals: c4.ModelGlobals;
14
- readonly imports: MultiMap<c4.ProjectId, c4.Fqn, Set<c4.Fqn>>;
15
- constructor(docs: ReadonlyArray<ParsedLikeC4LangiumDocument>);
16
- /**
17
- * Converts a parsed model into a C4 model element.
18
- */
19
- toModelElement: ({ tags, links, style, id, kind, title, description, technology, summary, metadata, }: ParsedAstElement) => c4.Element | null;
20
- /**
21
- * Converts a parsed model into a C4 model relation.
22
- */
23
- toModelRelation: ({ astPath: _astPath, source, target, kind, links, id, ...model }: ParsedAstRelation) => c4.Relationship | null;
24
- /**
25
- * Converts a parsed deployment model into a C4 deployment model
26
- */
27
- toDeploymentElement: (parsed: ParsedAstDeployment) => c4.DeploymentElement | null;
28
- /**
29
- * Converts a parsed deployment relation into a C4 deployment relation.
30
- */
31
- toDeploymentRelation: ({ astPath: _astPath, source, target, kind, links, id, ...model }: ParsedAstDeploymentRelation) => c4.DeploymentRelationship | null;
32
- }
@@ -1,175 +0,0 @@
1
- import { assignTagColors } from '@likec4/core/styles';
2
- import { exact, FqnRef } from '@likec4/core/types';
3
- import { isNonEmptyArray, MultiMap, nameFromFqn } from '@likec4/core/utils';
4
- import { isEmpty, isNonNullish, unique, } from 'remeda';
5
- import { logger, logWarnError } from '../../logger';
6
- /**
7
- * The `MergedSpecification` class is responsible for merging multiple parsed
8
- * LikeC4Langium documents into a single specification. It consolidates tags,
9
- * elements, deployments, relationships, and colors from the provided documents
10
- * and provides methods to convert parsed models into C4 model elements and relations.
11
- */
12
- export class MergedSpecification {
13
- specs = {
14
- elements: {},
15
- deployments: {},
16
- relationships: {},
17
- colors: {},
18
- };
19
- tags;
20
- globals = {
21
- predicates: {},
22
- dynamicPredicates: {},
23
- styles: {},
24
- };
25
- imports = new MultiMap(Set);
26
- constructor(docs) {
27
- const tags = {};
28
- for (const doc of docs) {
29
- const { c4Specification: spec, c4Globals, c4Imports, } = doc;
30
- Object.assign(tags, spec.tags);
31
- Object.assign(this.specs.elements, spec.elements);
32
- Object.assign(this.specs.relationships, spec.relationships);
33
- Object.assign(this.specs.colors, spec.colors);
34
- Object.assign(this.specs.deployments, spec.deployments);
35
- Object.assign(this.globals.predicates, c4Globals.predicates);
36
- Object.assign(this.globals.dynamicPredicates, c4Globals.dynamicPredicates);
37
- Object.assign(this.globals.styles, c4Globals.styles);
38
- for (const [projectId, fqn] of c4Imports) {
39
- this.imports.set(projectId, fqn);
40
- }
41
- }
42
- this.tags = assignTagColors(tags);
43
- }
44
- /**
45
- * Converts a parsed model into a C4 model element.
46
- */
47
- toModelElement = ({ tags, links, style, id, kind, title, description, technology, summary, metadata, }) => {
48
- try {
49
- const __kind = this.specs.elements[kind];
50
- if (!__kind) {
51
- logger.warn `No kind '${kind}' found for ${id}`;
52
- return null;
53
- }
54
- technology ??= __kind.technology;
55
- description ??= __kind.description;
56
- summary ??= __kind.summary;
57
- links ??= __kind.links;
58
- title = title === nameFromFqn(id) && __kind.title ? __kind.title : title;
59
- if (__kind.tags && isNonEmptyArray(__kind.tags)) {
60
- tags = tags
61
- ? unique([
62
- ...__kind.tags,
63
- ...tags,
64
- ])
65
- : __kind.tags;
66
- }
67
- return exact({
68
- metadata: metadata && !isEmpty(metadata) ? metadata : undefined,
69
- notation: __kind.notation,
70
- style: exact({
71
- ...__kind.style,
72
- ...style,
73
- }),
74
- links,
75
- tags,
76
- summary,
77
- technology,
78
- description,
79
- title,
80
- kind,
81
- id,
82
- });
83
- }
84
- catch (e) {
85
- logWarnError(e);
86
- }
87
- return null;
88
- };
89
- /**
90
- * Converts a parsed model into a C4 model relation.
91
- */
92
- toModelRelation = ({ astPath: _astPath, // omit
93
- source, target, kind, links, id, ...model }) => {
94
- if (isNonNullish(kind) && this.specs.relationships[kind]) {
95
- return {
96
- ...this.specs.relationships[kind],
97
- ...model,
98
- ...(links && { links }),
99
- source,
100
- target,
101
- kind,
102
- id,
103
- };
104
- }
105
- return {
106
- ...(links && { links }),
107
- ...model,
108
- source,
109
- target,
110
- id,
111
- };
112
- };
113
- /**
114
- * Converts a parsed deployment model into a C4 deployment model
115
- */
116
- toDeploymentElement = (parsed) => {
117
- if ('element' in parsed && !('kind' in parsed)) {
118
- return {
119
- ...parsed,
120
- element: FqnRef.flatten(parsed.element),
121
- };
122
- }
123
- if ('element' in parsed) {
124
- logger.warn `Invalid ParsedAstDeployment ${parsed.id}, has both element and kind properties`;
125
- return null;
126
- }
127
- try {
128
- const __kind = this.specs.deployments[parsed.kind];
129
- if (!__kind) {
130
- logger.warn `No kind ${parsed.kind} found for ${parsed.id}`;
131
- return null;
132
- }
133
- let { id, style, title, ...rest } = parsed;
134
- title = title === nameFromFqn(parsed.id) && __kind.title ? __kind.title : title;
135
- return exact({
136
- ...__kind,
137
- ...rest,
138
- title,
139
- style: exact({
140
- ...__kind.style,
141
- ...style,
142
- }),
143
- id,
144
- });
145
- }
146
- catch (e) {
147
- logWarnError(e);
148
- }
149
- return null;
150
- };
151
- /**
152
- * Converts a parsed deployment relation into a C4 deployment relation.
153
- */
154
- toDeploymentRelation = ({ astPath: _astPath, // omit
155
- source, target, kind, links, id, ...model }) => {
156
- if (isNonNullish(kind) && this.specs.relationships[kind]) {
157
- return {
158
- ...this.specs.relationships[kind],
159
- ...model,
160
- ...(links && { links }),
161
- source,
162
- target,
163
- kind,
164
- id,
165
- };
166
- }
167
- return {
168
- ...(links && { links }),
169
- ...model,
170
- source,
171
- target,
172
- id,
173
- };
174
- };
175
- }
@@ -1,16 +0,0 @@
1
- import type * as c4 from '@likec4/core';
2
- import { type MultiMap } from '@likec4/core';
3
- import type { ParsedLikeC4LangiumDocument } from '../../ast';
4
- import type { Project } from '../../workspace/ProjectsManager';
5
- export type BuildModelData = {
6
- data: c4.ParsedLikeC4ModelData;
7
- imports: MultiMap<c4.ProjectId, c4.Fqn, Set<c4.Fqn>>;
8
- };
9
- /**
10
- * Each document was parsed into a ParsedLikeC4LangiumDocument, where elements
11
- * do not inherit styles from specification.
12
- *
13
- * This function builds a model from all documents, merging the specifications
14
- * and globals, and applying the extends to the elements.
15
- */
16
- export declare function buildModelData(project: Project, docs: ReadonlyArray<ParsedLikeC4LangiumDocument>): BuildModelData;