@likec4/language-server 1.42.1 → 1.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/browser/package.json +1 -1
- package/browser-worker/package.json +1 -1
- package/dist/LikeC4LanguageServices.d.ts +12 -19
- package/dist/LikeC4LanguageServices.js +182 -0
- package/dist/Rpc.js +245 -0
- package/dist/ast.d.ts +10 -6
- package/dist/ast.js +253 -0
- package/dist/browser-worker.js +4 -0
- package/dist/browser.js +35 -0
- package/dist/bundled.js +42 -0
- package/dist/bundled.mjs +3830 -4172
- package/dist/documentation/documentation-provider.js +51 -0
- package/dist/documentation/index.js +1 -0
- package/dist/empty.js +2 -0
- package/dist/filesystem/ChokidarWatcher.js +97 -0
- package/dist/filesystem/FileSystemWatcher.js +14 -0
- package/dist/filesystem/LikeC4FileSystem.d.ts +1 -2
- package/dist/filesystem/LikeC4FileSystem.js +126 -0
- package/dist/filesystem/index.d.ts +26 -0
- package/dist/filesystem/index.js +29 -0
- package/dist/formatting/LikeC4Formatter.js +637 -0
- package/dist/formatting/utils.js +18 -0
- package/dist/generated/ast.d.ts +19 -3
- package/dist/generated/ast.js +2155 -0
- package/dist/generated/grammar.js +7 -0
- package/dist/generated/module.d.ts +6 -1
- package/dist/generated/module.js +27 -0
- package/dist/generated-lib/{icons.mjs → icons.js} +11 -7
- package/dist/index.d.ts +7 -0
- package/dist/index.js +53 -0
- package/dist/{likec4lib.mjs → likec4lib.js} +3 -3
- package/dist/logger.js +81 -0
- package/dist/lsp/CodeActionProvider.d.ts +14 -0
- package/dist/lsp/CodeActionProvider.js +33 -0
- package/dist/lsp/CodeLensProvider.js +44 -0
- package/dist/lsp/CompletionProvider.d.ts +3 -1
- package/dist/lsp/CompletionProvider.js +200 -0
- package/dist/lsp/DocumentHighlightProvider.js +10 -0
- package/dist/lsp/DocumentLinkProvider.js +58 -0
- package/dist/lsp/DocumentSymbolProvider.js +306 -0
- package/dist/lsp/HoverProvider.js +106 -0
- package/dist/lsp/RenameProvider.js +6 -0
- package/dist/lsp/SemanticTokenProvider.d.ts +5 -0
- package/dist/lsp/SemanticTokenProvider.js +257 -0
- package/dist/lsp/index.d.ts +1 -0
- package/dist/lsp/index.js +9 -0
- package/dist/mcp/MCPServerFactory.js +73 -0
- package/dist/mcp/NoopLikeC4MCPServer.js +17 -0
- package/dist/mcp/interfaces.js +5 -0
- package/dist/mcp/server/StdioLikeC4MCPServer.js +47 -0
- package/dist/mcp/server/StreamableLikeC4MCPServer.js +145 -0
- package/dist/mcp/server/WithMCPServer.js +56 -0
- package/dist/mcp/tools/_common.d.ts +8 -7
- package/dist/mcp/tools/_common.js +49 -0
- package/dist/mcp/tools/find-relationships.d.ts +7 -8
- package/dist/mcp/tools/find-relationships.js +150 -0
- package/dist/mcp/tools/list-projects.d.ts +3 -3
- package/dist/mcp/tools/list-projects.js +62 -0
- package/dist/mcp/tools/open-view.d.ts +6 -7
- package/dist/mcp/tools/open-view.js +52 -0
- package/dist/mcp/tools/read-deployment.d.ts +6 -7
- package/dist/mcp/tools/read-deployment.js +132 -0
- package/dist/mcp/tools/read-element.d.ts +6 -7
- package/dist/mcp/tools/read-element.js +194 -0
- package/dist/mcp/tools/read-project-summary.d.ts +5 -6
- package/dist/mcp/tools/read-project-summary.js +176 -0
- package/dist/mcp/tools/read-view.d.ts +6 -7
- package/dist/mcp/tools/read-view.js +203 -0
- package/dist/mcp/tools/search-element.d.ts +3 -3
- package/dist/mcp/tools/search-element.js +177 -0
- package/dist/mcp/utils.d.ts +2 -2
- package/dist/mcp/utils.js +48 -0
- package/dist/model/builder/MergedExtends.d.ts +2 -1
- package/dist/model/builder/MergedExtends.js +74 -0
- package/dist/model/builder/MergedSpecification.js +175 -0
- package/dist/model/builder/buildModel.js +176 -0
- package/dist/model/deployments-index.js +102 -0
- package/dist/model/fqn-index.js +250 -0
- package/dist/model/index.js +6 -0
- package/dist/model/model-builder.d.ts +13 -11
- package/dist/model/model-builder.js +234 -0
- package/dist/model/model-locator.d.ts +6 -5
- package/dist/model/model-locator.js +240 -0
- package/dist/model/model-parser-where.js +81 -0
- package/dist/model/model-parser.d.ts +318 -313
- package/dist/model/model-parser.js +119 -0
- package/dist/model/parser/Base.d.ts +3 -3
- package/dist/model/parser/Base.js +367 -0
- package/dist/model/parser/DeploymentModelParser.d.ts +3 -3
- package/dist/model/parser/DeploymentModelParser.js +176 -0
- package/dist/model/parser/DeploymentViewParser.d.ts +4 -4
- package/dist/model/parser/DeploymentViewParser.js +86 -0
- package/dist/model/parser/FqnRefParser.d.ts +3 -3
- package/dist/model/parser/FqnRefParser.js +382 -0
- package/dist/model/parser/GlobalsParser.d.ts +7 -7
- package/dist/model/parser/GlobalsParser.js +84 -0
- package/dist/model/parser/ImportsParser.d.ts +12 -13
- package/dist/model/parser/ImportsParser.js +24 -0
- package/dist/model/parser/ModelParser.d.ts +3 -3
- package/dist/model/parser/ModelParser.js +165 -0
- package/dist/model/parser/PredicatesParser.d.ts +3 -3
- package/dist/model/parser/PredicatesParser.js +45 -0
- package/dist/model/parser/SpecificationParser.d.ts +3 -3
- package/dist/model/parser/SpecificationParser.js +109 -0
- package/dist/model/parser/ValueConverter.js +12 -0
- package/dist/model/parser/ViewsParser.d.ts +4 -4
- package/dist/model/parser/ViewsParser.js +477 -0
- package/dist/model-change/ModelChanges.d.ts +6 -3
- package/dist/model-change/ModelChanges.js +102 -0
- package/dist/model-change/changeElementStyle.js +134 -0
- package/dist/model-change/changeViewLayout.d.ts +2 -2
- package/dist/model-change/changeViewLayout.js +28 -0
- package/dist/model-change/removeManualLayoutV1.d.ts +7 -0
- package/dist/model-change/removeManualLayoutV1.js +27 -0
- package/dist/module.d.ts +10 -5
- package/dist/module.js +143 -0
- package/dist/protocol.d.ts +1 -17
- package/dist/protocol.js +114 -0
- package/dist/references/index.js +3 -0
- package/dist/references/name-provider.js +37 -0
- package/dist/references/scope-computation.js +288 -0
- package/dist/references/scope-provider.d.ts +3 -3
- package/dist/references/scope-provider.js +242 -0
- package/dist/shared/NodeKindProvider.js +57 -0
- package/dist/shared/{WorkspaceSymbolProvider.mjs → WorkspaceSymbolProvider.js} +1 -1
- package/dist/shared/index.js +2 -0
- package/dist/test/index.js +1 -0
- package/dist/test/testServices.d.ts +16 -16
- package/dist/test/testServices.js +210 -0
- package/dist/utils/disposable.js +26 -0
- package/dist/utils/elementRef.d.ts +1 -1
- package/dist/utils/elementRef.js +27 -0
- package/dist/utils/fqnRef.js +63 -0
- package/dist/utils/index.js +35 -0
- package/dist/utils/printDocs.js +1 -0
- package/dist/utils/projectId.js +16 -0
- package/dist/utils/stringHash.js +5 -0
- package/dist/validation/DocumentValidator.js +17 -0
- package/dist/validation/_shared.js +26 -0
- package/dist/validation/deployment-checks.js +140 -0
- package/dist/validation/dynamic-view.js +67 -0
- package/dist/validation/element-ref.js +12 -0
- package/dist/validation/element.js +49 -0
- package/dist/validation/imports.js +46 -0
- package/dist/validation/index.d.ts +1 -1
- package/dist/validation/index.js +157 -0
- package/dist/validation/property-checks.js +108 -0
- package/dist/validation/relation.js +55 -0
- package/dist/validation/specification.js +190 -0
- package/dist/validation/view-predicates/fqn-expr-with.js +43 -0
- package/dist/validation/view-predicates/fqn-ref-expr.js +51 -0
- package/dist/validation/view-predicates/incoming.js +16 -0
- package/dist/validation/view-predicates/index.js +6 -0
- package/dist/validation/view-predicates/outgoing.js +20 -0
- package/dist/validation/view-predicates/relation-expr.js +46 -0
- package/dist/validation/view-predicates/relation-with.js +16 -0
- package/dist/validation/view.d.ts +1 -1
- package/dist/validation/view.js +42 -0
- package/dist/view-utils/assignNavigateTo.js +27 -0
- package/dist/view-utils/index.d.ts +1 -0
- package/dist/view-utils/index.js +2 -0
- package/dist/view-utils/manual-layout.d.ts +6 -0
- package/dist/view-utils/manual-layout.js +151 -0
- package/dist/views/ConfigurableLayouter.js +51 -0
- package/dist/views/LikeC4ManualLayouts.d.ts +28 -0
- package/dist/views/LikeC4ManualLayouts.js +132 -0
- package/dist/views/{likec4-views.d.ts → LikeC4Views.d.ts} +9 -8
- package/dist/views/LikeC4Views.js +200 -0
- package/dist/views/index.d.ts +4 -1
- package/dist/views/index.js +11 -0
- package/dist/workspace/AstNodeDescriptionProvider.js +15 -0
- package/dist/workspace/IndexManager.js +21 -0
- package/dist/workspace/LangiumDocuments.d.ts +1 -1
- package/dist/workspace/LangiumDocuments.js +58 -0
- package/dist/workspace/ProjectsManager.d.ts +8 -3
- package/dist/workspace/ProjectsManager.js +373 -0
- package/dist/workspace/WorkspaceManager.d.ts +3 -2
- package/dist/workspace/WorkspaceManager.js +93 -0
- package/dist/workspace/index.js +5 -0
- package/likec4lib/package.json +1 -1
- package/package.json +32 -31
- package/protocol/package.json +1 -1
- package/dist/LikeC4LanguageServices.mjs +0 -197
- package/dist/Rpc.mjs +0 -296
- package/dist/ast.mjs +0 -221
- package/dist/browser-worker.mjs +0 -2
- package/dist/browser.mjs +0 -32
- package/dist/documentation/documentation-provider.mjs +0 -48
- package/dist/documentation/index.mjs +0 -1
- package/dist/empty.mjs +0 -1
- package/dist/filesystem/ChokidarWatcher.mjs +0 -68
- package/dist/filesystem/FileSystemWatcher.mjs +0 -11
- package/dist/filesystem/LikeC4FileSystem.mjs +0 -64
- package/dist/filesystem/index.mjs +0 -19
- package/dist/formatting/LikeC4Formatter.mjs +0 -511
- package/dist/formatting/utils.mjs +0 -15
- package/dist/generated/ast.mjs +0 -2118
- package/dist/generated/grammar.mjs +0 -3
- package/dist/generated/module.mjs +0 -23
- package/dist/index.mjs +0 -50
- package/dist/logger.mjs +0 -82
- package/dist/lsp/CodeLensProvider.mjs +0 -42
- package/dist/lsp/CompletionProvider.mjs +0 -208
- package/dist/lsp/DocumentHighlightProvider.mjs +0 -10
- package/dist/lsp/DocumentLinkProvider.mjs +0 -53
- package/dist/lsp/DocumentSymbolProvider.mjs +0 -287
- package/dist/lsp/HoverProvider.mjs +0 -104
- package/dist/lsp/RenameProvider.mjs +0 -6
- package/dist/lsp/SemanticTokenProvider.mjs +0 -350
- package/dist/lsp/index.mjs +0 -7
- package/dist/mcp/MCPServerFactory.mjs +0 -70
- package/dist/mcp/NoopLikeC4MCPServer.mjs +0 -17
- package/dist/mcp/interfaces.mjs +0 -4
- package/dist/mcp/server/StdioLikeC4MCPServer.mjs +0 -46
- package/dist/mcp/server/StreamableLikeC4MCPServer.mjs +0 -153
- package/dist/mcp/server/WithMCPServer.mjs +0 -58
- package/dist/mcp/tools/_common.mjs +0 -42
- package/dist/mcp/tools/find-relationships.mjs +0 -151
- package/dist/mcp/tools/list-projects.mjs +0 -62
- package/dist/mcp/tools/open-view.mjs +0 -52
- package/dist/mcp/tools/read-deployment.mjs +0 -130
- package/dist/mcp/tools/read-element.mjs +0 -198
- package/dist/mcp/tools/read-project-summary.mjs +0 -178
- package/dist/mcp/tools/read-view.mjs +0 -205
- package/dist/mcp/tools/search-element.mjs +0 -171
- package/dist/mcp/utils.mjs +0 -47
- package/dist/model/builder/MergedExtends.mjs +0 -67
- package/dist/model/builder/MergedSpecification.mjs +0 -205
- package/dist/model/builder/assignTagColors.d.ts +0 -7
- package/dist/model/builder/assignTagColors.mjs +0 -51
- package/dist/model/builder/buildModel.mjs +0 -226
- package/dist/model/deployments-index.mjs +0 -100
- package/dist/model/fqn-index.mjs +0 -243
- package/dist/model/index.mjs +0 -6
- package/dist/model/model-builder.mjs +0 -285
- package/dist/model/model-locator.mjs +0 -239
- package/dist/model/model-parser-where.mjs +0 -81
- package/dist/model/model-parser.mjs +0 -127
- package/dist/model/parser/Base.mjs +0 -342
- package/dist/model/parser/DeploymentModelParser.mjs +0 -212
- package/dist/model/parser/DeploymentViewParser.mjs +0 -95
- package/dist/model/parser/FqnRefParser.mjs +0 -398
- package/dist/model/parser/GlobalsParser.mjs +0 -82
- package/dist/model/parser/ImportsParser.mjs +0 -28
- package/dist/model/parser/ModelParser.mjs +0 -190
- package/dist/model/parser/PredicatesParser.mjs +0 -45
- package/dist/model/parser/SpecificationParser.mjs +0 -120
- package/dist/model/parser/ValueConverter.mjs +0 -12
- package/dist/model/parser/ViewsParser.mjs +0 -490
- package/dist/model-change/ModelChanges.mjs +0 -89
- package/dist/model-change/changeElementStyle.mjs +0 -143
- package/dist/model-change/changeViewLayout.mjs +0 -32
- package/dist/model-change/saveManualLayout.d.ts +0 -11
- package/dist/model-change/saveManualLayout.mjs +0 -27
- package/dist/module.mjs +0 -180
- package/dist/protocol.mjs +0 -65
- package/dist/references/index.mjs +0 -3
- package/dist/references/name-provider.mjs +0 -39
- package/dist/references/scope-computation.mjs +0 -312
- package/dist/references/scope-provider.mjs +0 -239
- package/dist/shared/NodeKindProvider.mjs +0 -110
- package/dist/shared/index.mjs +0 -2
- package/dist/test/index.mjs +0 -1
- package/dist/test/testServices.mjs +0 -200
- package/dist/utils/disposable.mjs +0 -25
- package/dist/utils/elementRef.mjs +0 -20
- package/dist/utils/fqnRef.mjs +0 -57
- package/dist/utils/index.mjs +0 -33
- package/dist/utils/printDocs.mjs +0 -1
- package/dist/utils/projectId.mjs +0 -16
- package/dist/utils/stringHash.mjs +0 -5
- package/dist/validation/DocumentValidator.mjs +0 -16
- package/dist/validation/_shared.mjs +0 -25
- package/dist/validation/deployment-checks.mjs +0 -146
- package/dist/validation/dynamic-view.mjs +0 -67
- package/dist/validation/element-ref.mjs +0 -12
- package/dist/validation/element.mjs +0 -50
- package/dist/validation/imports.mjs +0 -25
- package/dist/validation/index.mjs +0 -180
- package/dist/validation/property-checks.mjs +0 -107
- package/dist/validation/relation.mjs +0 -53
- package/dist/validation/specification.mjs +0 -173
- package/dist/validation/view-predicates/fqn-expr-with.mjs +0 -43
- package/dist/validation/view-predicates/fqn-ref-expr.mjs +0 -53
- package/dist/validation/view-predicates/incoming.mjs +0 -16
- package/dist/validation/view-predicates/index.mjs +0 -6
- package/dist/validation/view-predicates/outgoing.mjs +0 -20
- package/dist/validation/view-predicates/relation-expr.mjs +0 -39
- package/dist/validation/view-predicates/relation-with.mjs +0 -16
- package/dist/validation/view.mjs +0 -25
- package/dist/view-utils/assignNavigateTo.mjs +0 -25
- package/dist/view-utils/index.mjs +0 -1
- package/dist/view-utils/manual-layout.mjs +0 -99
- package/dist/views/configurable-layouter.mjs +0 -51
- package/dist/views/index.mjs +0 -1
- package/dist/views/likec4-views.mjs +0 -166
- package/dist/workspace/AstNodeDescriptionProvider.mjs +0 -17
- package/dist/workspace/IndexManager.mjs +0 -17
- package/dist/workspace/LangiumDocuments.mjs +0 -53
- package/dist/workspace/ProjectsManager.mjs +0 -360
- package/dist/workspace/WorkspaceManager.mjs +0 -83
- package/dist/workspace/index.mjs +0 -5
- /package/dist/views/{configurable-layouter.d.ts → ConfigurableLayouter.d.ts} +0 -0
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
import { invariant } from "@likec4/core";
|
|
2
|
-
import z from "zod";
|
|
3
|
-
import { likec4Tool } from "../utils.mjs";
|
|
4
|
-
import { includedInViews, includedInViewsSchema, locationSchema, mkLocate, projectIdSchema } from "./_common.mjs";
|
|
5
|
-
export const readElement = likec4Tool({
|
|
6
|
-
name: "read-element",
|
|
7
|
-
description: `
|
|
8
|
-
Read detailed information about a LikeC4 element.
|
|
9
|
-
|
|
10
|
-
Request:
|
|
11
|
-
- id: string \u2014 element id (FQN)
|
|
12
|
-
- project: string (optional) \u2014 project id. Defaults to "default" if omitted.
|
|
13
|
-
|
|
14
|
-
Response (JSON object):
|
|
15
|
-
- id: string \u2014 element id (FQN)
|
|
16
|
-
- name: string \u2014 element name
|
|
17
|
-
- kind: string \u2014 element kind
|
|
18
|
-
- title: string \u2014 human-readable title
|
|
19
|
-
- description: string|null \u2014 optional description
|
|
20
|
-
- technology: string|null \u2014 optional technology
|
|
21
|
-
- tags: string[] \u2014 assigned tags
|
|
22
|
-
- project: string \u2014 project id this element belongs to
|
|
23
|
-
- metadata: Record<string, string> \u2014 element metadata
|
|
24
|
-
- shape: string \u2014 rendered shape
|
|
25
|
-
- color: string \u2014 rendered color
|
|
26
|
-
- children: string[] \u2014 ids (FQNs) of direct child elements
|
|
27
|
-
- defaultView: string|null \u2014 default view name if set
|
|
28
|
-
- includedInViews: View[] \u2014 views that include this element
|
|
29
|
-
- relationships: object \u2014 relationships of this element (direct and indirect)
|
|
30
|
-
- incoming: Array<{ source: { id: string, title: string, kind: string }, kind: string|null, target: string, title: string|null, description: string|null, technology: string|null, tags: string[] }>
|
|
31
|
-
- outgoing: Array<{ source: string, target: { id: string, title: string, kind: string }, kind: string|null, title: string|null, description: string|null, technology: string|null, tags: string[] }>
|
|
32
|
-
- deployedInstances: string[] \u2014 deployed instance ids (Deployment FQNs)
|
|
33
|
-
- sourceLocation: { path: string, range: { start: { line: number, character: number }, end: { line: number, character: number } } } | null \u2014 source location if available
|
|
34
|
-
|
|
35
|
-
View (object) fields:
|
|
36
|
-
- id: string \u2014 view identifier
|
|
37
|
-
- title: string \u2014 view title
|
|
38
|
-
- type: "element" | "deployment" | "dynamic"
|
|
39
|
-
|
|
40
|
-
Notes:
|
|
41
|
-
- Read-only, idempotent, no side effects.
|
|
42
|
-
- Safe to call repeatedly.
|
|
43
|
-
|
|
44
|
-
Example response:
|
|
45
|
-
{
|
|
46
|
-
"id": "shop.frontend",
|
|
47
|
-
"name": "frontend",
|
|
48
|
-
"kind": "container",
|
|
49
|
-
"title": "Frontend",
|
|
50
|
-
"description": "User-facing web app",
|
|
51
|
-
"technology": "React",
|
|
52
|
-
"tags": ["public"],
|
|
53
|
-
"project": "default",
|
|
54
|
-
"metadata": { "owner": "web" },
|
|
55
|
-
"shape": "rounded-rectangle",
|
|
56
|
-
"color": "#2F80ED",
|
|
57
|
-
"children": ["shop.frontend.auth"],
|
|
58
|
-
"defaultView": "frontend-overview",
|
|
59
|
-
"includedInViews": [
|
|
60
|
-
{
|
|
61
|
-
"id": "frontend-overview",
|
|
62
|
-
"title": "Frontend Overview",
|
|
63
|
-
"type": "element"
|
|
64
|
-
}
|
|
65
|
-
],
|
|
66
|
-
"relationships": {
|
|
67
|
-
"incoming": [
|
|
68
|
-
{
|
|
69
|
-
"source": { "id": "shop.api", "title": "API", "kind": "container" },
|
|
70
|
-
"kind": "uses",
|
|
71
|
-
"target": "shop.frontend",
|
|
72
|
-
"title": "Calls",
|
|
73
|
-
"description": null,
|
|
74
|
-
"technology": "HTTPS",
|
|
75
|
-
"tags": []
|
|
76
|
-
}
|
|
77
|
-
],
|
|
78
|
-
"outgoing": []
|
|
79
|
-
},
|
|
80
|
-
"deployedInstances": ["k8s.cluster.frontend"],
|
|
81
|
-
"sourceLocation": {
|
|
82
|
-
"path": "/abs/path/project/model.c4",
|
|
83
|
-
"range": { "start": { "line": 10, "character": 0 }, "end": { "line": 25, "character": 0 } }
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
`,
|
|
87
|
-
annotations: {
|
|
88
|
-
readOnlyHint: true,
|
|
89
|
-
idempotentHint: true,
|
|
90
|
-
title: "Read element"
|
|
91
|
-
},
|
|
92
|
-
inputSchema: {
|
|
93
|
-
id: z.string().describe("Element id (FQN)"),
|
|
94
|
-
project: projectIdSchema
|
|
95
|
-
},
|
|
96
|
-
outputSchema: {
|
|
97
|
-
id: z.string().describe("Element id (FQN)"),
|
|
98
|
-
kind: z.string().describe("Element kind"),
|
|
99
|
-
name: z.string().describe("Element name"),
|
|
100
|
-
title: z.string(),
|
|
101
|
-
description: z.string().nullable(),
|
|
102
|
-
technology: z.string().nullable(),
|
|
103
|
-
tags: z.array(z.string()),
|
|
104
|
-
project: z.string(),
|
|
105
|
-
metadata: z.record(z.string()),
|
|
106
|
-
shape: z.string(),
|
|
107
|
-
color: z.string(),
|
|
108
|
-
children: z.array(z.string()).describe("Children of this element (Array of FQNs)"),
|
|
109
|
-
defaultView: z.string().nullable().describe("Name of the default view of this element"),
|
|
110
|
-
includedInViews: includedInViewsSchema.describe("Views that include this element"),
|
|
111
|
-
relationships: z.object({
|
|
112
|
-
incoming: z.array(z.object({
|
|
113
|
-
source: z.object({
|
|
114
|
-
id: z.string(),
|
|
115
|
-
title: z.string(),
|
|
116
|
-
kind: z.string()
|
|
117
|
-
}).describe("Source element of this relationship"),
|
|
118
|
-
kind: z.string().nullable().describe("Relationship kind"),
|
|
119
|
-
target: z.string().describe(
|
|
120
|
-
"Target element id (FQN), either this element or nested element, if relationship is indirect"
|
|
121
|
-
),
|
|
122
|
-
title: z.string().nullable().describe("Relationship title"),
|
|
123
|
-
description: z.string().nullable().describe("Relationship description"),
|
|
124
|
-
technology: z.string().nullable().describe("Relationship technology"),
|
|
125
|
-
tags: z.array(z.string()).describe("Relationship tags")
|
|
126
|
-
})).describe("Incoming relationships of this element (direct and indirect, incoming to nested elements)"),
|
|
127
|
-
outgoing: z.array(z.object({
|
|
128
|
-
source: z.string().describe(
|
|
129
|
-
"Source element id (FQN), either this element or nested element, if relationship is indirect"
|
|
130
|
-
),
|
|
131
|
-
target: z.object({
|
|
132
|
-
id: z.string(),
|
|
133
|
-
title: z.string(),
|
|
134
|
-
kind: z.string()
|
|
135
|
-
}).describe("Target element of this relationship"),
|
|
136
|
-
kind: z.string().nullable().describe("Relationship kind"),
|
|
137
|
-
title: z.string().nullable().describe("Relationship title"),
|
|
138
|
-
description: z.string().nullable().describe("Relationship description"),
|
|
139
|
-
technology: z.string().nullable().describe("Relationship technology"),
|
|
140
|
-
tags: z.array(z.string()).describe("Relationship tags")
|
|
141
|
-
})).describe("Outgoing relationships of this element (direct and indirect, outgoing from nested elements)")
|
|
142
|
-
}).describe("Relationships of this element"),
|
|
143
|
-
deployedInstances: z.array(z.string()).describe("Deployed instances of this element (Array of Deployment FQNs)"),
|
|
144
|
-
sourceLocation: locationSchema
|
|
145
|
-
}
|
|
146
|
-
}, async (languageServices, args) => {
|
|
147
|
-
const projectId = languageServices.projectsManager.ensureProjectId(args.project);
|
|
148
|
-
const model = await languageServices.computedModel(projectId);
|
|
149
|
-
const element = model.findElement(args.id);
|
|
150
|
-
invariant(element, `Element "${args.id}" not found in project "${projectId}"`);
|
|
151
|
-
const locate = mkLocate(languageServices, projectId);
|
|
152
|
-
return {
|
|
153
|
-
id: element.id,
|
|
154
|
-
name: element.name,
|
|
155
|
-
kind: element.kind,
|
|
156
|
-
title: element.title,
|
|
157
|
-
description: element.description.text,
|
|
158
|
-
technology: element.technology,
|
|
159
|
-
tags: [...element.tags],
|
|
160
|
-
project: projectId,
|
|
161
|
-
metadata: element.getMetadata(),
|
|
162
|
-
shape: element.shape,
|
|
163
|
-
color: element.color,
|
|
164
|
-
children: [...element.children()].map((c) => c.id),
|
|
165
|
-
defaultView: element.defaultView?.id || null,
|
|
166
|
-
includedInViews: includedInViews(element.views()),
|
|
167
|
-
relationships: {
|
|
168
|
-
incoming: [...element.incoming()].map((r) => ({
|
|
169
|
-
source: {
|
|
170
|
-
id: r.source.id,
|
|
171
|
-
title: r.source.title,
|
|
172
|
-
kind: r.source.kind
|
|
173
|
-
},
|
|
174
|
-
kind: r.kind,
|
|
175
|
-
target: r.target.id,
|
|
176
|
-
title: r.title,
|
|
177
|
-
description: r.description.text,
|
|
178
|
-
technology: r.technology,
|
|
179
|
-
tags: [...r.tags]
|
|
180
|
-
})),
|
|
181
|
-
outgoing: [...element.outgoing()].map((r) => ({
|
|
182
|
-
source: r.source.id,
|
|
183
|
-
target: {
|
|
184
|
-
id: r.target.id,
|
|
185
|
-
title: r.target.title,
|
|
186
|
-
kind: r.target.kind
|
|
187
|
-
},
|
|
188
|
-
kind: r.kind,
|
|
189
|
-
title: r.title,
|
|
190
|
-
description: r.description.text,
|
|
191
|
-
technology: r.technology,
|
|
192
|
-
tags: [...r.tags]
|
|
193
|
-
}))
|
|
194
|
-
},
|
|
195
|
-
deployedInstances: [...element.deployments()].map((i) => i.id),
|
|
196
|
-
sourceLocation: locate({ element: element.id })
|
|
197
|
-
};
|
|
198
|
-
});
|
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
import { keys } from "remeda";
|
|
2
|
-
import z from "zod";
|
|
3
|
-
import { likec4Tool } from "../utils.mjs";
|
|
4
|
-
import { projectIdSchema } from "./_common.mjs";
|
|
5
|
-
export const readProjectSummary = likec4Tool({
|
|
6
|
-
name: "read-project-summary",
|
|
7
|
-
annotations: {
|
|
8
|
-
readOnlyHint: true,
|
|
9
|
-
idempotentHint: true,
|
|
10
|
-
title: "Read project summary"
|
|
11
|
-
},
|
|
12
|
-
description: `
|
|
13
|
-
Request:
|
|
14
|
-
- project: string (optional) \u2014 project id. Defaults to "default" if omitted.
|
|
15
|
-
|
|
16
|
-
Response (JSON object):
|
|
17
|
-
- title: string \u2014 human-readable project title
|
|
18
|
-
- folder: string \u2014 absolute path to the project root
|
|
19
|
-
- sources: string[] \u2014 absolute file paths of model documents
|
|
20
|
-
- specification: object
|
|
21
|
-
- elementKinds: string[] \u2014 all element kinds
|
|
22
|
-
- relationshipKinds: string[] \u2014 all relationship kinds
|
|
23
|
-
- deploymentKinds: string[] \u2014 all deployment kinds
|
|
24
|
-
- tags: string[] \u2014 all tags
|
|
25
|
-
- metadataKeys: string[] \u2014 used metadata keys
|
|
26
|
-
- elements: Element[] \u2014 list of elements
|
|
27
|
-
- deployments: Deployment[] \u2014 list of deployment entities
|
|
28
|
-
- views: View[] \u2014 list of views defined in the model
|
|
29
|
-
|
|
30
|
-
Element (object) fields:
|
|
31
|
-
- id: string \u2014 element id (FQN)
|
|
32
|
-
- kind: string \u2014 element kind
|
|
33
|
-
- title: string \u2014 element title
|
|
34
|
-
- tags: string[] \u2014 element tags
|
|
35
|
-
|
|
36
|
-
Deployment (object) fields:
|
|
37
|
-
- type = "deployment-node": { id: string, kind: string, title: string, tags: string[] }
|
|
38
|
-
- type = "deployed-instance": { id: string, title: string, tags: string[], referencedElementId: string }
|
|
39
|
-
|
|
40
|
-
View (object) fields:
|
|
41
|
-
- id: string \u2014 view identifier
|
|
42
|
-
- title: string \u2014 view title
|
|
43
|
-
- type: "element" | "deployment" | "dynamic"
|
|
44
|
-
|
|
45
|
-
Notes:
|
|
46
|
-
- Read-only, idempotent, no side effects.
|
|
47
|
-
- Safe to call repeatedly.
|
|
48
|
-
|
|
49
|
-
Example response:
|
|
50
|
-
{
|
|
51
|
-
"title": "Cloud Boutique",
|
|
52
|
-
"folder": "/abs/path/to/workspace/examples/cloud-system",
|
|
53
|
-
"sources": [
|
|
54
|
-
"/abs/path/to/workspace/examples/cloud-system/model.c4"
|
|
55
|
-
],
|
|
56
|
-
"specification": {
|
|
57
|
-
"elementKinds": ["system", "container", "component"],
|
|
58
|
-
"relationshipKinds": ["uses", "depends-on"],
|
|
59
|
-
"deploymentKinds": ["node", "cluster"],
|
|
60
|
-
"tags": ["public", "internal"],
|
|
61
|
-
"metadataKeys": ["owner", "tier"]
|
|
62
|
-
},
|
|
63
|
-
"elements": [
|
|
64
|
-
{
|
|
65
|
-
"id": "shop.frontend",
|
|
66
|
-
"kind": "component",
|
|
67
|
-
"title": "Frontend",
|
|
68
|
-
"tags": ["public"]
|
|
69
|
-
}
|
|
70
|
-
],
|
|
71
|
-
"deployments": [
|
|
72
|
-
{
|
|
73
|
-
"type": "deployment-node",
|
|
74
|
-
"id": "k8s.shop.frontend",
|
|
75
|
-
"kind": "cluster",
|
|
76
|
-
"title": "Frontend",
|
|
77
|
-
"tags": []
|
|
78
|
-
}
|
|
79
|
-
],
|
|
80
|
-
"views": [
|
|
81
|
-
{
|
|
82
|
-
"name": "system-overview",
|
|
83
|
-
"title": "System Overview",
|
|
84
|
-
"type": "element"
|
|
85
|
-
}
|
|
86
|
-
]
|
|
87
|
-
}
|
|
88
|
-
`,
|
|
89
|
-
inputSchema: {
|
|
90
|
-
project: projectIdSchema
|
|
91
|
-
},
|
|
92
|
-
outputSchema: {
|
|
93
|
-
title: z.string(),
|
|
94
|
-
folder: z.string(),
|
|
95
|
-
sources: z.array(z.string()),
|
|
96
|
-
specification: z.object({
|
|
97
|
-
elementKinds: z.array(z.string()),
|
|
98
|
-
relationshipKinds: z.array(z.string()),
|
|
99
|
-
deploymentKinds: z.array(z.string()),
|
|
100
|
-
tags: z.array(z.string()),
|
|
101
|
-
metadataKeys: z.array(z.string())
|
|
102
|
-
}),
|
|
103
|
-
elements: z.array(z.object({
|
|
104
|
-
id: z.string(),
|
|
105
|
-
kind: z.string(),
|
|
106
|
-
title: z.string(),
|
|
107
|
-
tags: z.array(z.string())
|
|
108
|
-
})).describe("List of elements in the project"),
|
|
109
|
-
deployments: z.array(
|
|
110
|
-
z.discriminatedUnion("type", [
|
|
111
|
-
z.object({
|
|
112
|
-
type: z.literal("deployment-node"),
|
|
113
|
-
id: z.string().describe("Node ID"),
|
|
114
|
-
kind: z.string().describe("Deployment node kind"),
|
|
115
|
-
title: z.string().describe("Node title"),
|
|
116
|
-
tags: z.array(z.string())
|
|
117
|
-
}),
|
|
118
|
-
z.object({
|
|
119
|
-
type: z.literal("deployed-instance"),
|
|
120
|
-
id: z.string().describe("Node ID"),
|
|
121
|
-
title: z.string().describe("Node title"),
|
|
122
|
-
tags: z.array(z.string()),
|
|
123
|
-
referencedElementId: z.string().describe("Element ID (FQN)")
|
|
124
|
-
})
|
|
125
|
-
])
|
|
126
|
-
).describe("List of deployment nodes and deployed instances in the project"),
|
|
127
|
-
views: z.array(z.object({
|
|
128
|
-
id: z.string(),
|
|
129
|
-
title: z.string(),
|
|
130
|
-
type: z.enum(["element", "deployment", "dynamic"])
|
|
131
|
-
}))
|
|
132
|
-
}
|
|
133
|
-
}, async (languageServices, args) => {
|
|
134
|
-
const projectId = languageServices.projectsManager.ensureProjectId(args.project);
|
|
135
|
-
const project = languageServices.project(projectId);
|
|
136
|
-
const model = await languageServices.computedModel(projectId);
|
|
137
|
-
return {
|
|
138
|
-
title: project.title,
|
|
139
|
-
folder: project.folder.fsPath,
|
|
140
|
-
specification: {
|
|
141
|
-
elementKinds: keys(model.specification.elements),
|
|
142
|
-
relationshipKinds: keys(model.specification.relationships),
|
|
143
|
-
deploymentKinds: keys(model.specification.deployments),
|
|
144
|
-
tags: [...model.tags],
|
|
145
|
-
metadataKeys: model.specification.metadataKeys ?? []
|
|
146
|
-
},
|
|
147
|
-
elements: [...model.elements()].filter((e) => !e.imported).map((e) => ({
|
|
148
|
-
id: e.id,
|
|
149
|
-
kind: e.kind,
|
|
150
|
-
title: e.title,
|
|
151
|
-
tags: [...e.tags]
|
|
152
|
-
})),
|
|
153
|
-
deployments: [...model.deployment.elements()].map((d) => {
|
|
154
|
-
if (d.isInstance()) {
|
|
155
|
-
return {
|
|
156
|
-
type: "deployed-instance",
|
|
157
|
-
id: d.id,
|
|
158
|
-
title: d.title,
|
|
159
|
-
tags: [...d.tags],
|
|
160
|
-
referencedElementId: d.element.id
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
return {
|
|
164
|
-
type: "deployment-node",
|
|
165
|
-
id: d.id,
|
|
166
|
-
kind: d.kind,
|
|
167
|
-
title: d.title,
|
|
168
|
-
tags: [...d.tags]
|
|
169
|
-
};
|
|
170
|
-
}),
|
|
171
|
-
views: [...model.views()].map((v) => ({
|
|
172
|
-
id: v.id,
|
|
173
|
-
title: v.titleOrId,
|
|
174
|
-
type: v.$view._type
|
|
175
|
-
})),
|
|
176
|
-
sources: project.documents?.map((d) => d.fsPath) ?? []
|
|
177
|
-
};
|
|
178
|
-
});
|
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
import z from "zod";
|
|
2
|
-
import { likec4Tool } from "../utils.mjs";
|
|
3
|
-
import { locationSchema, mkLocate, projectIdSchema } from "./_common.mjs";
|
|
4
|
-
const modelRef = (node) => {
|
|
5
|
-
if (node.hasElement()) {
|
|
6
|
-
return node.element.id;
|
|
7
|
-
}
|
|
8
|
-
if (node.hasDeployment()) {
|
|
9
|
-
return node.deployment.id;
|
|
10
|
-
}
|
|
11
|
-
return null;
|
|
12
|
-
};
|
|
13
|
-
const nodeSchema = z.discriminatedUnion("type", [
|
|
14
|
-
z.object({
|
|
15
|
-
type: z.literal("element"),
|
|
16
|
-
id: z.string().describe("Node ID"),
|
|
17
|
-
elementId: z.string().describe("Element ID (FQN)"),
|
|
18
|
-
kind: z.string().describe("Element kind"),
|
|
19
|
-
title: z.string().describe("Node title"),
|
|
20
|
-
description: z.string().nullable(),
|
|
21
|
-
technology: z.string().nullable(),
|
|
22
|
-
children: z.array(z.string()).describe("Children nodes, array of node IDs"),
|
|
23
|
-
shape: z.string().describe("Rendered shape"),
|
|
24
|
-
color: z.string().describe("Rendered color"),
|
|
25
|
-
tags: z.array(z.string())
|
|
26
|
-
}),
|
|
27
|
-
z.object({
|
|
28
|
-
type: z.literal("deployment-node"),
|
|
29
|
-
id: z.string().describe("Node ID"),
|
|
30
|
-
deploymentId: z.string().describe("Deployment entity ID (FQN)"),
|
|
31
|
-
kind: z.string().describe("Deployment kind"),
|
|
32
|
-
title: z.string().describe("Node title"),
|
|
33
|
-
description: z.string().nullable(),
|
|
34
|
-
technology: z.string().nullable(),
|
|
35
|
-
children: z.array(z.string()).describe("Children nodes, array of node IDs"),
|
|
36
|
-
shape: z.string().describe("Rendered shape"),
|
|
37
|
-
color: z.string().describe("Rendered color"),
|
|
38
|
-
tags: z.array(z.string())
|
|
39
|
-
}),
|
|
40
|
-
z.object({
|
|
41
|
-
type: z.literal("deployed-instance"),
|
|
42
|
-
id: z.string().describe("Node ID"),
|
|
43
|
-
deploymentId: z.string().describe("Deployment entity ID (FQN)"),
|
|
44
|
-
title: z.string().describe("Node title"),
|
|
45
|
-
description: z.string().nullable(),
|
|
46
|
-
technology: z.string().nullable(),
|
|
47
|
-
referencedElement: z.object({
|
|
48
|
-
id: z.string().describe("Element ID (FQN)"),
|
|
49
|
-
kind: z.string().describe("Element kind"),
|
|
50
|
-
title: z.string().describe("Element title")
|
|
51
|
-
}),
|
|
52
|
-
shape: z.string().describe("Rendered shape"),
|
|
53
|
-
color: z.string().describe("Rendered color"),
|
|
54
|
-
tags: z.array(z.string())
|
|
55
|
-
})
|
|
56
|
-
]);
|
|
57
|
-
export const readView = likec4Tool({
|
|
58
|
-
name: "read-view",
|
|
59
|
-
description: `
|
|
60
|
-
Read detailed information about a LikeC4 view.
|
|
61
|
-
|
|
62
|
-
Request:
|
|
63
|
-
- viewId: string \u2014 view id (name)
|
|
64
|
-
- project: string (optional) \u2014 project id. Defaults to "default" if omitted.
|
|
65
|
-
|
|
66
|
-
Response (JSON object):
|
|
67
|
-
- id: string \u2014 view id
|
|
68
|
-
- type: "element" | "deployment" | "dynamic" \u2014 view type
|
|
69
|
-
- title: string \u2014 view title (falls back to id if not set)
|
|
70
|
-
- description: string|null \u2014 optional description
|
|
71
|
-
- tags: string[] \u2014 view tags
|
|
72
|
-
- project: string \u2014 project id this view belongs to
|
|
73
|
-
- nodes: Node[] \u2014 nodes included in the view
|
|
74
|
-
- edges: Edge[] \u2014 relationships between nodes
|
|
75
|
-
- sourceLocation: { path: string, range: { start: { line: number, character: number }, end: { line: number, character: number } } } | null \u2014 source location if available
|
|
76
|
-
|
|
77
|
-
Node (discriminated union by "type"):
|
|
78
|
-
- type = "element": { id: string, elementId: string, kind: string, title: string, description: string|null, technology: string|null, children: string[], shape: string, color: string, tags: string[] }
|
|
79
|
-
- type = "deployment-node": { id: string, deploymentId: string, kind: string, title: string, description: string|null, technology: string|null, children: string[], shape: string, color: string, tags: string[] }
|
|
80
|
-
- type = "deployed-instance": { id: string, deploymentId: string, title: string, description: string|null, technology: string|null, referencedElement: { id: string, kind: string, title: string }, shape: string, color: string, tags: string[] }
|
|
81
|
-
|
|
82
|
-
Edge object:
|
|
83
|
-
- { source: string, target: string, label: string|null, description: string|null, technology: string|null, tags: string[] }
|
|
84
|
-
|
|
85
|
-
Notes:
|
|
86
|
-
- Read-only, idempotent, no side effects.
|
|
87
|
-
|
|
88
|
-
Example response:
|
|
89
|
-
{
|
|
90
|
-
"id": "system-overview",
|
|
91
|
-
"type": "element",
|
|
92
|
-
"title": "System Overview",
|
|
93
|
-
"description": null,
|
|
94
|
-
"tags": [],
|
|
95
|
-
"project": "default",
|
|
96
|
-
"nodes": [
|
|
97
|
-
{ "type": "logical", "id": "n1", "elementId": "shop.frontend", "kind": "container", "title": "Frontend", "description": null, "technology": "React", "children": [], "shape": "rounded-rectangle", "color": "#2F80ED", "tags": [] }
|
|
98
|
-
],
|
|
99
|
-
"edges": [
|
|
100
|
-
{ "source": "n1", "target": "n2", "label": "calls", "description": null, "technology": "HTTPS", "tags": [] }
|
|
101
|
-
],
|
|
102
|
-
"sourceLocation": {
|
|
103
|
-
"path": "/abs/path/project/model.c4",
|
|
104
|
-
"range": { "start": { "line": 10, "character": 0 }, "end": { "line": 30, "character": 0 } }
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
`,
|
|
108
|
-
annotations: {
|
|
109
|
-
readOnlyHint: true,
|
|
110
|
-
idempotentHint: true,
|
|
111
|
-
title: "Read view"
|
|
112
|
-
},
|
|
113
|
-
inputSchema: {
|
|
114
|
-
viewId: z.string().describe("View id (name)"),
|
|
115
|
-
project: projectIdSchema
|
|
116
|
-
},
|
|
117
|
-
outputSchema: {
|
|
118
|
-
id: z.string(),
|
|
119
|
-
type: z.enum(["element", "deployment", "dynamic"]).describe("View type"),
|
|
120
|
-
title: z.string(),
|
|
121
|
-
description: z.string().nullable(),
|
|
122
|
-
tags: z.array(z.string()),
|
|
123
|
-
project: z.string(),
|
|
124
|
-
nodes: z.array(nodeSchema),
|
|
125
|
-
edges: z.array(
|
|
126
|
-
z.object({
|
|
127
|
-
source: z.string().describe("Source node"),
|
|
128
|
-
target: z.string().describe("Target node"),
|
|
129
|
-
label: z.string().nullable(),
|
|
130
|
-
description: z.string().nullable(),
|
|
131
|
-
technology: z.string().nullable(),
|
|
132
|
-
tags: z.array(z.string())
|
|
133
|
-
})
|
|
134
|
-
).describe("Edge represents relationship between nodes"),
|
|
135
|
-
sourceLocation: locationSchema
|
|
136
|
-
}
|
|
137
|
-
}, async (languageServices, args) => {
|
|
138
|
-
const projectId = languageServices.projectsManager.ensureProjectId(args.project);
|
|
139
|
-
const project = languageServices.project(projectId);
|
|
140
|
-
const model = await languageServices.computedModel(projectId);
|
|
141
|
-
const view = model.findView(args.viewId);
|
|
142
|
-
if (!view) {
|
|
143
|
-
throw new Error(`View with ID '${args.viewId}' not found in project ${project.id}`);
|
|
144
|
-
}
|
|
145
|
-
const locate = mkLocate(languageServices, project.id);
|
|
146
|
-
return {
|
|
147
|
-
id: view.id,
|
|
148
|
-
type: view.$view._type,
|
|
149
|
-
title: view.title ?? view.id,
|
|
150
|
-
description: view.description.text,
|
|
151
|
-
tags: [...view.tags],
|
|
152
|
-
project: project.id,
|
|
153
|
-
nodes: [...view.nodes()].flatMap((node) => {
|
|
154
|
-
const base = {
|
|
155
|
-
id: node.id,
|
|
156
|
-
title: node.title,
|
|
157
|
-
description: node.description.text,
|
|
158
|
-
technology: node.technology,
|
|
159
|
-
shape: node.shape,
|
|
160
|
-
color: node.color,
|
|
161
|
-
tags: [...node.tags]
|
|
162
|
-
};
|
|
163
|
-
if (node.hasDeployedInstance()) {
|
|
164
|
-
return {
|
|
165
|
-
...base,
|
|
166
|
-
type: "deployed-instance",
|
|
167
|
-
deploymentId: node.deployment.id,
|
|
168
|
-
referencedElement: {
|
|
169
|
-
id: node.deployment.element.id,
|
|
170
|
-
kind: node.deployment.element.kind,
|
|
171
|
-
title: node.deployment.element.title
|
|
172
|
-
}
|
|
173
|
-
};
|
|
174
|
-
}
|
|
175
|
-
if (node.hasDeployment()) {
|
|
176
|
-
return {
|
|
177
|
-
...base,
|
|
178
|
-
type: "deployment-node",
|
|
179
|
-
kind: node.deployment.kind,
|
|
180
|
-
deploymentId: node.deployment.id,
|
|
181
|
-
children: [...node.children()].map((c) => c.id)
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
if (node.hasElement()) {
|
|
185
|
-
return {
|
|
186
|
-
...base,
|
|
187
|
-
type: "element",
|
|
188
|
-
elementId: node.element.id,
|
|
189
|
-
kind: node.element.kind,
|
|
190
|
-
children: [...node.children()].flatMap((c) => modelRef(c) ?? [])
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
return [];
|
|
194
|
-
}),
|
|
195
|
-
edges: [...view.edges()].map((r) => ({
|
|
196
|
-
source: r.source.id,
|
|
197
|
-
target: r.target.id,
|
|
198
|
-
label: r.label,
|
|
199
|
-
description: r.description.text,
|
|
200
|
-
technology: r.technology,
|
|
201
|
-
tags: [...r.tags]
|
|
202
|
-
})),
|
|
203
|
-
sourceLocation: locate({ view: view.id })
|
|
204
|
-
};
|
|
205
|
-
});
|