@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.
- 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 +5 -1
- 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 +3542 -3896
- 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.js +2155 -0
- package/dist/generated/{grammar.mjs → grammar.js} +6 -2
- 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.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.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 +309 -304
- package/dist/model/model-parser.js +119 -0
- package/dist/model/parser/Base.d.ts +2 -2
- package/dist/model/parser/Base.js +367 -0
- package/dist/model/parser/DeploymentModelParser.d.ts +2 -2
- package/dist/model/parser/DeploymentModelParser.js +176 -0
- package/dist/model/parser/DeploymentViewParser.d.ts +3 -3
- package/dist/model/parser/DeploymentViewParser.js +86 -0
- package/dist/model/parser/FqnRefParser.d.ts +2 -2
- package/dist/model/parser/FqnRefParser.js +382 -0
- package/dist/model/parser/GlobalsParser.d.ts +6 -6
- package/dist/model/parser/GlobalsParser.js +84 -0
- package/dist/model/parser/ImportsParser.d.ts +11 -12
- package/dist/model/parser/ImportsParser.js +24 -0
- package/dist/model/parser/ModelParser.d.ts +2 -2
- package/dist/model/parser/ModelParser.js +165 -0
- package/dist/model/parser/PredicatesParser.d.ts +2 -2
- package/dist/model/parser/PredicatesParser.js +45 -0
- package/dist/model/parser/SpecificationParser.d.ts +2 -2
- package/dist/model/parser/SpecificationParser.js +109 -0
- package/dist/model/parser/ValueConverter.js +12 -0
- package/dist/model/parser/ViewsParser.d.ts +3 -3
- 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 +25 -24
- 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 -2150
- 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 -276
- 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 -76
- 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 -376
- 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,70 +0,0 @@
|
|
|
1
|
-
import { loggable } from "@likec4/log";
|
|
2
|
-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
-
import packageJson from "../../package.json" with { type: "json" };
|
|
4
|
-
import { logger } from "../logger.mjs";
|
|
5
|
-
import { findRelationships } from "./tools/find-relationships.mjs";
|
|
6
|
-
import { listProjects } from "./tools/list-projects.mjs";
|
|
7
|
-
import { openView } from "./tools/open-view.mjs";
|
|
8
|
-
import { readDeployment } from "./tools/read-deployment.mjs";
|
|
9
|
-
import { readElement } from "./tools/read-element.mjs";
|
|
10
|
-
import { readProjectSummary } from "./tools/read-project-summary.mjs";
|
|
11
|
-
import { readView } from "./tools/read-view.mjs";
|
|
12
|
-
import { searchElement } from "./tools/search-element.mjs";
|
|
13
|
-
export class LikeC4MCPServerFactory {
|
|
14
|
-
constructor(services) {
|
|
15
|
-
this.services = services;
|
|
16
|
-
}
|
|
17
|
-
create(options) {
|
|
18
|
-
const isInEditor = this.services.shared.lsp.Connection !== void 0;
|
|
19
|
-
const mcp = new McpServer({
|
|
20
|
-
name: "LikeC4",
|
|
21
|
-
version: packageJson.version
|
|
22
|
-
}, {
|
|
23
|
-
instructions: `LikeC4 MCP \u2013 query and navigate LikeC4 models.
|
|
24
|
-
|
|
25
|
-
Conventions:
|
|
26
|
-
- All tools are read-only and idempotent.
|
|
27
|
-
- "project" is optional and defaults to "default".
|
|
28
|
-
|
|
29
|
-
Available tools:
|
|
30
|
-
- list-projects \u2014 List all LikeC4 projects in the workspace.
|
|
31
|
-
- read-project-summary \u2014 Project specification (element kinds, deployment node kinds, tags, metadata keys), all elements, deployment nodes and views. Input: { project? }.
|
|
32
|
-
- search-element \u2014 Search elements and deployment nodes across all projects by id/title/kind/shape/tags/metadata. Input: { search }.
|
|
33
|
-
- read-element \u2014 Full element details including relationships, includedInViews, deployedInstances, metadata and sourceLocation. Input: { id, project? }.
|
|
34
|
-
- read-deployment \u2014 Details of a deployment node or deployed instance. Input: { id, project? }.
|
|
35
|
-
- read-view \u2014 Full view details (nodes/edges) and sourceLocation. Input: { viewId, project? }.
|
|
36
|
-
- find-relationships \u2014 Direct and indirect relationships between two elements in a project. Input: { element1, element2, project? }.
|
|
37
|
-
${isInEditor ? "- open-view \u2014 Opens the LikeC4 view panel in the editor. Triggers UI; at most one preview panel at a time. Input: { viewId, project? }." : ""}
|
|
38
|
-
|
|
39
|
-
Instructions:
|
|
40
|
-
- Identify the project first
|
|
41
|
-
- Use "search-element" to find elements by id/title/kind/shape/tags/metadata and select the project
|
|
42
|
-
- Use "read-project-summary" to find all elements and deployment nodes inside the project, what kinds, tags, metadata keys are available
|
|
43
|
-
- Use "list-projects" to list all available projects
|
|
44
|
-
- If response returns "sourceLocation", provide link to this location in the editor
|
|
45
|
-
|
|
46
|
-
Full documentation: https://likec4.dev/llms-full.txt
|
|
47
|
-
`,
|
|
48
|
-
enforceStrictCapabilities: true,
|
|
49
|
-
...options,
|
|
50
|
-
capabilities: {
|
|
51
|
-
tools: {},
|
|
52
|
-
...options?.capabilities
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
mcp.registerTool(...listProjects(this.services.likec4.LanguageServices));
|
|
56
|
-
mcp.registerTool(...readProjectSummary(this.services.likec4.LanguageServices));
|
|
57
|
-
mcp.registerTool(...readElement(this.services.likec4.LanguageServices));
|
|
58
|
-
mcp.registerTool(...readDeployment(this.services.likec4.LanguageServices));
|
|
59
|
-
mcp.registerTool(...readView(this.services.likec4.LanguageServices));
|
|
60
|
-
mcp.registerTool(...searchElement(this.services.likec4.LanguageServices));
|
|
61
|
-
mcp.registerTool(...findRelationships(this.services.likec4.LanguageServices));
|
|
62
|
-
if (isInEditor) {
|
|
63
|
-
mcp.registerTool(...openView(this.services.likec4.LanguageServices));
|
|
64
|
-
}
|
|
65
|
-
mcp.server.onerror = (err) => {
|
|
66
|
-
logger.error(loggable(err));
|
|
67
|
-
};
|
|
68
|
-
return mcp;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
export class NoopLikeC4MCPServer {
|
|
2
|
-
get mcp() {
|
|
3
|
-
throw new Error("NoopLikeC4MCPServer does not have a McpServer");
|
|
4
|
-
}
|
|
5
|
-
get isStarted() {
|
|
6
|
-
return false;
|
|
7
|
-
}
|
|
8
|
-
get port() {
|
|
9
|
-
return NaN;
|
|
10
|
-
}
|
|
11
|
-
start() {
|
|
12
|
-
return Promise.resolve();
|
|
13
|
-
}
|
|
14
|
-
stop() {
|
|
15
|
-
return Promise.resolve();
|
|
16
|
-
}
|
|
17
|
-
}
|
package/dist/mcp/interfaces.mjs
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
2
|
-
import { logger } from "../utils.mjs";
|
|
3
|
-
export class StdioLikeC4MCPServer {
|
|
4
|
-
constructor(services) {
|
|
5
|
-
this.services = services;
|
|
6
|
-
}
|
|
7
|
-
transport = void 0;
|
|
8
|
-
_mcp = void 0;
|
|
9
|
-
get mcp() {
|
|
10
|
-
if (!this._mcp) {
|
|
11
|
-
throw new Error("MCP server is not started");
|
|
12
|
-
}
|
|
13
|
-
return this._mcp;
|
|
14
|
-
}
|
|
15
|
-
get isStarted() {
|
|
16
|
-
return this.transport !== void 0;
|
|
17
|
-
}
|
|
18
|
-
get port() {
|
|
19
|
-
return NaN;
|
|
20
|
-
}
|
|
21
|
-
async dispose() {
|
|
22
|
-
await this.stop();
|
|
23
|
-
}
|
|
24
|
-
async start() {
|
|
25
|
-
if (this.transport) {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
logger.info("Starting MCP stdio server");
|
|
29
|
-
this._mcp = this.services.mcp.ServerFactory.create();
|
|
30
|
-
this.transport = new StdioServerTransport();
|
|
31
|
-
await this._mcp.connect(this.transport);
|
|
32
|
-
logger.info("LikeC4 MCP Server running on stdio");
|
|
33
|
-
}
|
|
34
|
-
async stop() {
|
|
35
|
-
if (!this.transport) {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
logger.info("Stopping MCP stdio server");
|
|
39
|
-
await this.transport.close();
|
|
40
|
-
if (this._mcp) {
|
|
41
|
-
await this._mcp.close();
|
|
42
|
-
}
|
|
43
|
-
this._mcp = void 0;
|
|
44
|
-
this.transport = void 0;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
import { serve } from "@hono/node-server";
|
|
2
|
-
import { promiseNextTick } from "@likec4/core/utils";
|
|
3
|
-
import { loggable } from "@likec4/log";
|
|
4
|
-
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
5
|
-
import { toFetchResponse, toReqRes } from "fetch-to-node";
|
|
6
|
-
import { Hono } from "hono";
|
|
7
|
-
import { logger } from "../utils.mjs";
|
|
8
|
-
export class StreamableLikeC4MCPServer {
|
|
9
|
-
constructor(services, _port = 33335) {
|
|
10
|
-
this.services = services;
|
|
11
|
-
this._port = _port;
|
|
12
|
-
}
|
|
13
|
-
// Store transports by session ID to send notifications
|
|
14
|
-
server = void 0;
|
|
15
|
-
get mcp() {
|
|
16
|
-
throw new Error("StreamableLikeC4MCPServer has access to McpServer only during the request");
|
|
17
|
-
}
|
|
18
|
-
get isStarted() {
|
|
19
|
-
return this.server?.listening === true;
|
|
20
|
-
}
|
|
21
|
-
get port() {
|
|
22
|
-
return this._port;
|
|
23
|
-
}
|
|
24
|
-
async dispose() {
|
|
25
|
-
await this.stop();
|
|
26
|
-
}
|
|
27
|
-
async start(port = this._port) {
|
|
28
|
-
try {
|
|
29
|
-
if (this.server) {
|
|
30
|
-
if (this.port === port) {
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
await this.stop();
|
|
34
|
-
}
|
|
35
|
-
logger.info("Starting MCP server on port {port}", { port });
|
|
36
|
-
this._port = port;
|
|
37
|
-
await promiseNextTick();
|
|
38
|
-
const app = new Hono().post("/mcp", async (c) => {
|
|
39
|
-
const { req, res } = toReqRes(c.req.raw);
|
|
40
|
-
const server = this.services.mcp.ServerFactory.create();
|
|
41
|
-
try {
|
|
42
|
-
const transport = new StreamableHTTPServerTransport({
|
|
43
|
-
sessionIdGenerator: void 0
|
|
44
|
-
});
|
|
45
|
-
transport.onerror = (err) => {
|
|
46
|
-
logger.error(loggable(err));
|
|
47
|
-
};
|
|
48
|
-
await server.connect(transport);
|
|
49
|
-
await transport.handleRequest(req, res, await c.req.json());
|
|
50
|
-
res.on("close", async () => {
|
|
51
|
-
logger.debug("Request closed");
|
|
52
|
-
await transport.close();
|
|
53
|
-
await server.close();
|
|
54
|
-
});
|
|
55
|
-
return toFetchResponse(res);
|
|
56
|
-
} catch (e) {
|
|
57
|
-
logger.error(loggable(e));
|
|
58
|
-
return c.json(
|
|
59
|
-
{
|
|
60
|
-
jsonrpc: "2.0",
|
|
61
|
-
error: {
|
|
62
|
-
code: -32603,
|
|
63
|
-
message: "Internal server error"
|
|
64
|
-
},
|
|
65
|
-
id: null
|
|
66
|
-
},
|
|
67
|
-
{ status: 500 }
|
|
68
|
-
);
|
|
69
|
-
}
|
|
70
|
-
}).get("/mcp", async (c) => {
|
|
71
|
-
logger.debug("Received GET MCP request");
|
|
72
|
-
return c.json(
|
|
73
|
-
{
|
|
74
|
-
jsonrpc: "2.0",
|
|
75
|
-
error: {
|
|
76
|
-
code: -32e3,
|
|
77
|
-
message: "Method not allowed."
|
|
78
|
-
},
|
|
79
|
-
id: null
|
|
80
|
-
},
|
|
81
|
-
{ status: 405 }
|
|
82
|
-
);
|
|
83
|
-
}).delete("/mcp", async (c) => {
|
|
84
|
-
logger.debug("Received DELETE MCP request");
|
|
85
|
-
return c.json(
|
|
86
|
-
{
|
|
87
|
-
jsonrpc: "2.0",
|
|
88
|
-
error: {
|
|
89
|
-
code: -32e3,
|
|
90
|
-
message: "Method not allowed."
|
|
91
|
-
},
|
|
92
|
-
id: null
|
|
93
|
-
},
|
|
94
|
-
{ status: 405 }
|
|
95
|
-
);
|
|
96
|
-
}).notFound((c) => {
|
|
97
|
-
logger.debug(`${c.req.method} ${c.req.url} not found`);
|
|
98
|
-
return c.json(
|
|
99
|
-
{
|
|
100
|
-
jsonrpc: "2.0",
|
|
101
|
-
error: {
|
|
102
|
-
code: -32e3,
|
|
103
|
-
message: "Method not found."
|
|
104
|
-
},
|
|
105
|
-
id: null
|
|
106
|
-
},
|
|
107
|
-
{ status: 404 }
|
|
108
|
-
);
|
|
109
|
-
}).onError((e, c) => {
|
|
110
|
-
logger.error(loggable(e));
|
|
111
|
-
return c.json(
|
|
112
|
-
{
|
|
113
|
-
jsonrpc: "2.0",
|
|
114
|
-
error: {
|
|
115
|
-
code: -32603,
|
|
116
|
-
message: "Internal server error"
|
|
117
|
-
},
|
|
118
|
-
id: null
|
|
119
|
-
},
|
|
120
|
-
{ status: 500 }
|
|
121
|
-
);
|
|
122
|
-
});
|
|
123
|
-
this.server = serve(
|
|
124
|
-
{
|
|
125
|
-
fetch: app.fetch,
|
|
126
|
-
hostname: "0.0.0.0",
|
|
127
|
-
port: this._port
|
|
128
|
-
},
|
|
129
|
-
(info) => logger.info("MCP server ready at http://0.0.0.0:{port}/mcp", { port: info.port })
|
|
130
|
-
);
|
|
131
|
-
} catch (err) {
|
|
132
|
-
logger.warn("Failed to start MCP server", { err });
|
|
133
|
-
return Promise.reject(err);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
stop() {
|
|
137
|
-
const server = this.server;
|
|
138
|
-
if (!server) {
|
|
139
|
-
return Promise.resolve();
|
|
140
|
-
}
|
|
141
|
-
logger.info("Stopping MCP server");
|
|
142
|
-
this.server = void 0;
|
|
143
|
-
return new Promise((resolve) => {
|
|
144
|
-
server.close((err) => {
|
|
145
|
-
if (err) {
|
|
146
|
-
logger.error("Failed to stop MCP server", { err });
|
|
147
|
-
}
|
|
148
|
-
logger.info("MCP server stopped");
|
|
149
|
-
resolve();
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { loggable } from "@likec4/log";
|
|
2
|
-
import { isError } from "remeda";
|
|
3
|
-
import { logger } from "../utils.mjs";
|
|
4
|
-
import { StdioLikeC4MCPServer } from "./StdioLikeC4MCPServer.mjs";
|
|
5
|
-
import { StreamableLikeC4MCPServer } from "./StreamableLikeC4MCPServer.mjs";
|
|
6
|
-
const streamableLikeC4MCPServer = (services, defaultPort = 33335) => {
|
|
7
|
-
logger.debug("Creating StreamableLikeC4MCPServer");
|
|
8
|
-
const server = new StreamableLikeC4MCPServer(services, defaultPort);
|
|
9
|
-
const langId = services.LanguageMetaData.languageId;
|
|
10
|
-
const connection = services.shared.lsp.Connection;
|
|
11
|
-
services.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate((update) => {
|
|
12
|
-
if (update.section !== langId) {
|
|
13
|
-
logger.warn("Unexpected configuration update: {update}", { update });
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
logger.debug("Configuration update: {update}", { update });
|
|
17
|
-
const {
|
|
18
|
-
enabled = false,
|
|
19
|
-
port = defaultPort
|
|
20
|
-
} = update.configuration.mcp;
|
|
21
|
-
if (!enabled) {
|
|
22
|
-
void server.stop();
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
void Promise.resolve().then(() => server.start(port)).then(() => {
|
|
26
|
-
connection?.telemetry?.logEvent({
|
|
27
|
-
eventName: "mcp-server-started",
|
|
28
|
-
mcpPort: port
|
|
29
|
-
});
|
|
30
|
-
}).catch((err) => {
|
|
31
|
-
const message = isError(err) ? err.message : void 0;
|
|
32
|
-
connection?.telemetry?.logEvent({
|
|
33
|
-
eventName: "mcp-server-start-failed",
|
|
34
|
-
mcpPort: port,
|
|
35
|
-
...message && { message }
|
|
36
|
-
});
|
|
37
|
-
logger.error("Failed to start LikeC4 MCP Server", { err });
|
|
38
|
-
if (connection) {
|
|
39
|
-
connection.window.showErrorMessage(`LikeC4: Failed to start MCP Server
|
|
40
|
-
|
|
41
|
-
${loggable(err)}`);
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
return server;
|
|
46
|
-
};
|
|
47
|
-
const stdioLikeC4MCPServer = (services) => {
|
|
48
|
-
return new StdioLikeC4MCPServer(services);
|
|
49
|
-
};
|
|
50
|
-
export const WithMCPServer = (type = "sse") => ({
|
|
51
|
-
mcpServer: (services) => {
|
|
52
|
-
if (type === "stdio") {
|
|
53
|
-
return stdioLikeC4MCPServer(services);
|
|
54
|
-
}
|
|
55
|
-
const port = typeof type === "object" ? type.port : 33335;
|
|
56
|
-
return streamableLikeC4MCPServer(services, port);
|
|
57
|
-
}
|
|
58
|
-
});
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { URI } from "vscode-uri";
|
|
2
|
-
import z from "zod";
|
|
3
|
-
import { ProjectsManager } from "../../workspace/index.mjs";
|
|
4
|
-
import { logger } from "../utils.mjs";
|
|
5
|
-
export const locationSchema = z.object({
|
|
6
|
-
path: z.string().describe("Path to the file"),
|
|
7
|
-
range: z.object({
|
|
8
|
-
start: z.object({
|
|
9
|
-
line: z.number(),
|
|
10
|
-
character: z.number()
|
|
11
|
-
}),
|
|
12
|
-
end: z.object({
|
|
13
|
-
line: z.number(),
|
|
14
|
-
character: z.number()
|
|
15
|
-
})
|
|
16
|
-
}).describe("Range in the file")
|
|
17
|
-
}).nullable();
|
|
18
|
-
export const projectIdSchema = z.string().refine((_v) => true).optional().default(ProjectsManager.DefaultProjectId).describe('Project id (optional, will use "default" if not specified)');
|
|
19
|
-
export const includedInViewsSchema = z.array(z.object({
|
|
20
|
-
id: z.string().describe("View id"),
|
|
21
|
-
title: z.string().describe("View title"),
|
|
22
|
-
type: z.enum(["element", "deployment", "dynamic"]).describe("View type")
|
|
23
|
-
}));
|
|
24
|
-
export const includedInViews = (views) => {
|
|
25
|
-
return [...views].map((v) => ({
|
|
26
|
-
id: v.id,
|
|
27
|
-
title: v.titleOrId,
|
|
28
|
-
type: v.$view._type
|
|
29
|
-
}));
|
|
30
|
-
};
|
|
31
|
-
export const mkLocate = (languageServices, projectId) => (params) => {
|
|
32
|
-
try {
|
|
33
|
-
const loc = languageServices.locate({ projectId, ...params });
|
|
34
|
-
return loc ? {
|
|
35
|
-
path: URI.parse(loc.uri).fsPath,
|
|
36
|
-
range: loc.range
|
|
37
|
-
} : null;
|
|
38
|
-
} catch (e) {
|
|
39
|
-
logger.debug(`Failed to locate {params}`, { error: e, params });
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
};
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
import { modelConnection } from "@likec4/core/model";
|
|
2
|
-
import { invariant, isSameHierarchy } from "@likec4/core/utils";
|
|
3
|
-
import z from "zod";
|
|
4
|
-
import { likec4Tool } from "../utils.mjs";
|
|
5
|
-
import { includedInViews, includedInViewsSchema, locationSchema, mkLocate, projectIdSchema } from "./_common.mjs";
|
|
6
|
-
const endpointSchema = z.object({
|
|
7
|
-
id: z.string(),
|
|
8
|
-
title: z.string(),
|
|
9
|
-
kind: z.string()
|
|
10
|
-
});
|
|
11
|
-
const searchResultSchema = z.object({
|
|
12
|
-
type: z.enum(["direct", "indirect"]).describe(
|
|
13
|
-
'Type of relationship, "direct" for direct relationships, "indirect" for relationships through nested elements'
|
|
14
|
-
),
|
|
15
|
-
source: endpointSchema,
|
|
16
|
-
target: endpointSchema,
|
|
17
|
-
kind: z.string().nullable().describe("Relationship kind"),
|
|
18
|
-
title: z.string().nullable().describe("Relationship title"),
|
|
19
|
-
description: z.string().nullable().describe("Relationship description"),
|
|
20
|
-
technology: z.string().nullable().describe("Relationship technology"),
|
|
21
|
-
tags: z.array(z.string()).describe("Relationship tags"),
|
|
22
|
-
includedInViews: includedInViewsSchema.describe("Views that include this relationship"),
|
|
23
|
-
sourceLocation: locationSchema
|
|
24
|
-
});
|
|
25
|
-
export const findRelationships = likec4Tool({
|
|
26
|
-
name: "find-relationships",
|
|
27
|
-
annotations: {
|
|
28
|
-
readOnlyHint: true,
|
|
29
|
-
idempotentHint: true,
|
|
30
|
-
title: "Find relationships between two elements"
|
|
31
|
-
},
|
|
32
|
-
description: `
|
|
33
|
-
Find relationships between two LikeC4 elements within a project.
|
|
34
|
-
|
|
35
|
-
What it does:
|
|
36
|
-
- Finds both direct relationships (element1 \u2194 element2) and indirect ones that arise via containment (e.g. via nested elements).
|
|
37
|
-
- Returns rich metadata for each relationship and where it appears in views.
|
|
38
|
-
|
|
39
|
-
Inputs:
|
|
40
|
-
- element1: string \u2014 Element ID (FQN)
|
|
41
|
-
- element2: string \u2014 Element ID (FQN)
|
|
42
|
-
- project: string (optional, defaults to "default") \u2014 Project id
|
|
43
|
-
|
|
44
|
-
Output:
|
|
45
|
-
- found: Relationship[]
|
|
46
|
-
|
|
47
|
-
Relationship (object) fields:
|
|
48
|
-
- type: "direct" | "indirect" \u2014 direct is between the specified endpoints; indirect is via nested elements
|
|
49
|
-
- source: Endpoint
|
|
50
|
-
- target: Endpoint
|
|
51
|
-
- kind: string|null \u2014 relationship kind from the model
|
|
52
|
-
- title: string|null \u2014 relationship title if provided
|
|
53
|
-
- description: string|null \u2014 relationship description text
|
|
54
|
-
- technology: string|null \u2014 relationship technology
|
|
55
|
-
- tags: string[] \u2014 relationship tags
|
|
56
|
-
- includedInViews: View[] \u2014 views where this relationship appears
|
|
57
|
-
- sourceLocation: { path: string, range: { start: { line: number, character: number }, end: { line: number, character: number } } } | null
|
|
58
|
-
|
|
59
|
-
Endpoint (object) fields:
|
|
60
|
-
- id: string \u2014 Element ID (FQN)
|
|
61
|
-
- title: string \u2014 element title
|
|
62
|
-
- kind: string \u2014 element kind
|
|
63
|
-
|
|
64
|
-
View (object) fields:
|
|
65
|
-
- id: string \u2014 view identifier
|
|
66
|
-
- title: string \u2014 view title
|
|
67
|
-
- type: "element" | "deployment" | "dynamic"
|
|
68
|
-
|
|
69
|
-
Notes:
|
|
70
|
-
- Read-only, idempotent; does not mutate the model. May trigger UI navigation in supporting clients.
|
|
71
|
-
- The order of results is not guaranteed.
|
|
72
|
-
|
|
73
|
-
Example:
|
|
74
|
-
Request:
|
|
75
|
-
{
|
|
76
|
-
"element1": "shop.frontend",
|
|
77
|
-
"element2": "shop.backend",
|
|
78
|
-
"project": "default"
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
Response:
|
|
82
|
-
{
|
|
83
|
-
"found": [
|
|
84
|
-
{
|
|
85
|
-
"type": "direct",
|
|
86
|
-
"source": { "id": "shop.frontend", "title": "Frontend", "kind": "component" },
|
|
87
|
-
"target": { "id": "shop.backend", "title": "Backend", "kind": "component" },
|
|
88
|
-
"kind": "sync",
|
|
89
|
-
"title": "Calls",
|
|
90
|
-
"description": "Frontend calls Backend",
|
|
91
|
-
"technology": "HTTP",
|
|
92
|
-
"tags": ["public"],
|
|
93
|
-
"includedInViews": [
|
|
94
|
-
{ "id": "system-overview", "title": "System Overview", "type": "element" }
|
|
95
|
-
],
|
|
96
|
-
"sourceLocation": {
|
|
97
|
-
"path": "/abs/path/project/model.c4",
|
|
98
|
-
"range": { "start": { "line": 12, "character": 0 }, "end": { "line": 14, "character": 0 } }
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
]
|
|
102
|
-
}
|
|
103
|
-
`,
|
|
104
|
-
inputSchema: {
|
|
105
|
-
element1: z.string().describe("Element ID (FQN)"),
|
|
106
|
-
element2: z.string().describe("Element ID (FQN)"),
|
|
107
|
-
project: projectIdSchema
|
|
108
|
-
},
|
|
109
|
-
outputSchema: {
|
|
110
|
-
found: z.array(searchResultSchema)
|
|
111
|
-
}
|
|
112
|
-
}, async (languageServices, args) => {
|
|
113
|
-
const projectId = languageServices.projectsManager.ensureProjectId(args.project);
|
|
114
|
-
if (isSameHierarchy(args.element1, args.element2)) {
|
|
115
|
-
throw new Error("No relationships possible between parent-child");
|
|
116
|
-
}
|
|
117
|
-
const found = [];
|
|
118
|
-
const model = await languageServices.computedModel(projectId);
|
|
119
|
-
const el1 = model.findElement(args.element1);
|
|
120
|
-
invariant(el1, `Element "${args.element1}" not found in project "${projectId}"`);
|
|
121
|
-
const el2 = model.findElement(args.element2);
|
|
122
|
-
invariant(el2, `Element "${args.element2}" not found in project "${projectId}"`);
|
|
123
|
-
const locate = mkLocate(languageServices, projectId);
|
|
124
|
-
const relationships = modelConnection.findConnection(el1, el2, "both").flatMap((c) => [...c.relations]);
|
|
125
|
-
for (const relationship of relationships) {
|
|
126
|
-
const isDirect = relationship.source === el1 && relationship.target === el2 || relationship.source === el2 && relationship.target === el1;
|
|
127
|
-
found.push({
|
|
128
|
-
type: isDirect ? "direct" : "indirect",
|
|
129
|
-
source: {
|
|
130
|
-
id: relationship.source.id,
|
|
131
|
-
title: relationship.source.title,
|
|
132
|
-
kind: relationship.source.kind
|
|
133
|
-
},
|
|
134
|
-
target: {
|
|
135
|
-
id: relationship.target.id,
|
|
136
|
-
title: relationship.target.title,
|
|
137
|
-
kind: relationship.target.kind
|
|
138
|
-
},
|
|
139
|
-
kind: relationship.kind,
|
|
140
|
-
title: relationship.title,
|
|
141
|
-
description: relationship.description.text,
|
|
142
|
-
technology: relationship.technology,
|
|
143
|
-
tags: [...relationship.tags],
|
|
144
|
-
includedInViews: includedInViews(relationship.views()),
|
|
145
|
-
sourceLocation: locate({ relation: relationship.id })
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
return {
|
|
149
|
-
found
|
|
150
|
-
};
|
|
151
|
-
});
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import z from "zod";
|
|
2
|
-
import { likec4Tool } from "../utils.mjs";
|
|
3
|
-
export const listProjects = likec4Tool({
|
|
4
|
-
name: "list-projects",
|
|
5
|
-
description: `
|
|
6
|
-
List LikeC4 projects discoverable in the current workspace.
|
|
7
|
-
|
|
8
|
-
Request:
|
|
9
|
-
- No input parameters.
|
|
10
|
-
|
|
11
|
-
Response (JSON object):
|
|
12
|
-
- projects: Project[]
|
|
13
|
-
|
|
14
|
-
Project (object) fields:
|
|
15
|
-
- id: string \u2014 stable project identifier
|
|
16
|
-
- title: string \u2014 human-readable project title
|
|
17
|
-
- folder: string \u2014 absolute path to the project root
|
|
18
|
-
- sources: string[] \u2014 absolute file paths of related documents
|
|
19
|
-
|
|
20
|
-
Notes:
|
|
21
|
-
- Read-only, idempotent, no side effects.
|
|
22
|
-
- Safe to call repeatedly.
|
|
23
|
-
|
|
24
|
-
Example response:
|
|
25
|
-
{
|
|
26
|
-
"projects": [
|
|
27
|
-
{
|
|
28
|
-
"id": "docs",
|
|
29
|
-
"title": "Documentation",
|
|
30
|
-
"folder": "/abs/path/to/workspace/docs",
|
|
31
|
-
"sources": [
|
|
32
|
-
"/abs/path/to/workspace/docs/model/contexts.likec4",
|
|
33
|
-
"/abs/path/to/workspace/docs/model/relations.likec4"
|
|
34
|
-
]
|
|
35
|
-
}
|
|
36
|
-
]
|
|
37
|
-
}
|
|
38
|
-
`,
|
|
39
|
-
annotations: {
|
|
40
|
-
readOnlyHint: true,
|
|
41
|
-
idempotentHint: true,
|
|
42
|
-
title: "List projects"
|
|
43
|
-
},
|
|
44
|
-
outputSchema: {
|
|
45
|
-
projects: z.array(z.object({
|
|
46
|
-
id: z.string(),
|
|
47
|
-
title: z.string(),
|
|
48
|
-
folder: z.string(),
|
|
49
|
-
sources: z.array(z.string())
|
|
50
|
-
}))
|
|
51
|
-
}
|
|
52
|
-
}, async (languageServices) => {
|
|
53
|
-
const projects = languageServices.projects();
|
|
54
|
-
return {
|
|
55
|
-
projects: projects.map((p) => ({
|
|
56
|
-
id: p.id,
|
|
57
|
-
title: p.title,
|
|
58
|
-
folder: p.folder.fsPath,
|
|
59
|
-
sources: p.documents.map((d) => d.fsPath)
|
|
60
|
-
}))
|
|
61
|
-
};
|
|
62
|
-
});
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import z from "zod";
|
|
2
|
-
import { likec4Tool } from "../utils.mjs";
|
|
3
|
-
import { locationSchema, mkLocate, projectIdSchema } from "./_common.mjs";
|
|
4
|
-
export const openView = likec4Tool({
|
|
5
|
-
name: "open-view",
|
|
6
|
-
description: `
|
|
7
|
-
Open a LikeC4 view in the editor's preview panel.
|
|
8
|
-
|
|
9
|
-
Request:
|
|
10
|
-
- viewId: string \u2014 view id (name)
|
|
11
|
-
- project: string (optional) \u2014 project id. Defaults to "default" if omitted.
|
|
12
|
-
|
|
13
|
-
Response (JSON object):
|
|
14
|
-
- location: { path: string, range: { start: { line: number, character: number }, end: { line: number, character: number } } } | null \u2014 source location of the view if available
|
|
15
|
-
|
|
16
|
-
Notes:
|
|
17
|
-
- Read-only and idempotent with respect to the project model. Triggers a UI action in the editor.
|
|
18
|
-
- Only one preview panel can be open at a time.
|
|
19
|
-
|
|
20
|
-
Example response:
|
|
21
|
-
{
|
|
22
|
-
"location": {
|
|
23
|
-
"path": "/abs/path/project/model.c4",
|
|
24
|
-
"range": { "start": { "line": 10, "character": 0 }, "end": { "line": 30, "character": 0 } }
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
`,
|
|
28
|
-
annotations: {
|
|
29
|
-
readOnlyHint: true,
|
|
30
|
-
idempotentHint: true,
|
|
31
|
-
title: "Open view in preview panel"
|
|
32
|
-
},
|
|
33
|
-
inputSchema: {
|
|
34
|
-
viewId: z.string().describe("View id (name)"),
|
|
35
|
-
project: projectIdSchema
|
|
36
|
-
},
|
|
37
|
-
outputSchema: {
|
|
38
|
-
location: locationSchema
|
|
39
|
-
}
|
|
40
|
-
}, async (languageServices, args) => {
|
|
41
|
-
const projectId = languageServices.projectsManager.ensureProjectId(args.project);
|
|
42
|
-
const model = await languageServices.computedModel(projectId);
|
|
43
|
-
const view = model.findView(args.viewId);
|
|
44
|
-
if (!view) {
|
|
45
|
-
throw new Error(`View with ID '${args.viewId}' not found in project ${projectId}`);
|
|
46
|
-
}
|
|
47
|
-
await languageServices.views.openView(view.id, projectId);
|
|
48
|
-
const locate = mkLocate(languageServices, projectId);
|
|
49
|
-
return {
|
|
50
|
-
location: locate({ view: view.id })
|
|
51
|
-
};
|
|
52
|
-
});
|