@likec4/language-server 1.28.0 → 1.29.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/dist/LikeC4LanguageServices.d.ts +6 -1
- package/dist/LikeC4LanguageServices.js +18 -1
- package/dist/bundled.mjs +2447 -2174
- package/dist/generated/ast.d.ts +2 -2
- package/dist/generated/ast.js +2 -2
- package/dist/generated/grammar.js +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +7 -1
- package/dist/lsp/SemanticTokenProvider.js +5 -28
- package/dist/mcp/LikeC4MCPServerFactory.d.ts +16 -0
- package/dist/mcp/LikeC4MCPServerFactory.js +86 -0
- package/dist/mcp/LikeC4MCPTools.d.ts +96 -0
- package/dist/mcp/LikeC4MCPTools.js +288 -0
- package/dist/mcp/sseserver/SSELikeC4MCPServer.d.ts +13 -0
- package/dist/mcp/sseserver/SSELikeC4MCPServer.js +74 -0
- package/dist/mcp/sseserver/with-mcp-server.d.ts +7 -0
- package/dist/mcp/sseserver/with-mcp-server.js +28 -0
- package/dist/mcp/utils.d.ts +34 -0
- package/dist/mcp/utils.js +104 -0
- package/dist/model/parser/ViewsParser.js +1 -1
- package/dist/model-change/changeElementStyle.js +9 -7
- package/dist/module.d.ts +7 -0
- package/dist/module.js +7 -0
- package/dist/views/likec4-views.d.ts +1 -0
- package/dist/views/likec4-views.js +23 -4
- package/package.json +17 -11
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { logger } from "../../logger.js";
|
|
2
|
+
import { SSELikeC4MCPServer } from "./SSELikeC4MCPServer.js";
|
|
3
|
+
export const WithMCPServer = {
|
|
4
|
+
mcp: {
|
|
5
|
+
Server(services) {
|
|
6
|
+
logger.debug("Creating SSELikeC4MCPServer");
|
|
7
|
+
const server = new SSELikeC4MCPServer(services);
|
|
8
|
+
const langId = services.LanguageMetaData.languageId;
|
|
9
|
+
services.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate((update) => {
|
|
10
|
+
if (update.section !== langId) {
|
|
11
|
+
logger.warn("Unexpected configuration update: {update}", { update });
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
logger.debug("Configuration update: {update}", { update });
|
|
15
|
+
const { enabled, port } = update.configuration.mcp ?? {
|
|
16
|
+
enabled: false,
|
|
17
|
+
port: 33335
|
|
18
|
+
};
|
|
19
|
+
if (!enabled) {
|
|
20
|
+
server.stop();
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
server.start(port);
|
|
24
|
+
});
|
|
25
|
+
return server;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type LikeC4Model, type ProjectId } from '@likec4/core';
|
|
2
|
+
import type { LikeC4LanguageServices } from '../LikeC4LanguageServices';
|
|
3
|
+
export declare function elementResource(languageServices: LikeC4LanguageServices, el: LikeC4Model.Element, projectId?: ProjectId): {
|
|
4
|
+
id: any;
|
|
5
|
+
parent: {
|
|
6
|
+
id: any;
|
|
7
|
+
title: any;
|
|
8
|
+
kind: any;
|
|
9
|
+
} | null;
|
|
10
|
+
projectId: any;
|
|
11
|
+
title: any;
|
|
12
|
+
kind: any;
|
|
13
|
+
shape: any;
|
|
14
|
+
technology: any;
|
|
15
|
+
description: any;
|
|
16
|
+
tags: any;
|
|
17
|
+
children: any;
|
|
18
|
+
relations: {
|
|
19
|
+
incoming: any;
|
|
20
|
+
outgoing: any;
|
|
21
|
+
};
|
|
22
|
+
views: any;
|
|
23
|
+
sourceFile: import("../protocol").Locate.Res;
|
|
24
|
+
};
|
|
25
|
+
export declare function modelViewResource(languageServices: LikeC4LanguageServices, view: LikeC4Model.View, projectId?: ProjectId): {
|
|
26
|
+
id: any;
|
|
27
|
+
title: any;
|
|
28
|
+
projectId: any;
|
|
29
|
+
viewType: any;
|
|
30
|
+
description: any;
|
|
31
|
+
tags: any;
|
|
32
|
+
nodes: any;
|
|
33
|
+
sourceFile: import("../protocol").Locate.Res;
|
|
34
|
+
};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { imap, toArray } from "@likec4/core";
|
|
2
|
+
export function elementResource(languageServices, el, projectId) {
|
|
3
|
+
return {
|
|
4
|
+
id: el.id,
|
|
5
|
+
parent: !el.parent ? null : {
|
|
6
|
+
id: el.parent.id,
|
|
7
|
+
title: el.parent.title,
|
|
8
|
+
kind: el.parent.kind
|
|
9
|
+
},
|
|
10
|
+
projectId,
|
|
11
|
+
title: el.title,
|
|
12
|
+
kind: el.kind,
|
|
13
|
+
shape: el.shape,
|
|
14
|
+
technology: el.technology,
|
|
15
|
+
description: el.description,
|
|
16
|
+
tags: el.tags,
|
|
17
|
+
children: toArray(imap(el.children(), (c) => ({
|
|
18
|
+
id: c.id,
|
|
19
|
+
title: c.title,
|
|
20
|
+
kind: el.kind
|
|
21
|
+
}))),
|
|
22
|
+
relations: {
|
|
23
|
+
incoming: toArray(imap(el.incoming(), (r) => ({
|
|
24
|
+
id: r.id,
|
|
25
|
+
title: r.title,
|
|
26
|
+
description: r.description,
|
|
27
|
+
technology: r.technology,
|
|
28
|
+
source: {
|
|
29
|
+
id: r.source.id,
|
|
30
|
+
title: r.source.title,
|
|
31
|
+
kind: r.source.kind
|
|
32
|
+
},
|
|
33
|
+
...r.target.id === el.id ? {
|
|
34
|
+
type: "direct"
|
|
35
|
+
} : {
|
|
36
|
+
type: "implicit, to nested",
|
|
37
|
+
target: {
|
|
38
|
+
id: r.target.id,
|
|
39
|
+
title: r.target.title,
|
|
40
|
+
kind: r.target.kind
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}))),
|
|
44
|
+
outgoing: toArray(imap(el.outgoing(), (r) => ({
|
|
45
|
+
id: r.id,
|
|
46
|
+
title: r.title,
|
|
47
|
+
description: r.description,
|
|
48
|
+
technology: r.technology,
|
|
49
|
+
target: {
|
|
50
|
+
id: r.target.id,
|
|
51
|
+
title: r.target.title,
|
|
52
|
+
kind: r.target.kind
|
|
53
|
+
},
|
|
54
|
+
...r.source.id === el.id ? {
|
|
55
|
+
type: "direct"
|
|
56
|
+
} : {
|
|
57
|
+
type: "implicit, from nested",
|
|
58
|
+
source: {
|
|
59
|
+
id: r.source.id,
|
|
60
|
+
title: r.source.title,
|
|
61
|
+
kind: r.source.kind
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
})))
|
|
65
|
+
},
|
|
66
|
+
views: toArray(imap(el.views(), (v) => ({
|
|
67
|
+
id: v.id,
|
|
68
|
+
title: v.title
|
|
69
|
+
}))),
|
|
70
|
+
sourceFile: languageServices.locate({
|
|
71
|
+
element: el.id,
|
|
72
|
+
projectId
|
|
73
|
+
})
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
export function modelViewResource(languageServices, view, projectId) {
|
|
77
|
+
return {
|
|
78
|
+
id: view.id,
|
|
79
|
+
title: view.title,
|
|
80
|
+
projectId,
|
|
81
|
+
viewType: view.__,
|
|
82
|
+
description: view.$view.description ?? "",
|
|
83
|
+
tags: view.tags,
|
|
84
|
+
nodes: toArray(imap(view.nodes(), (node) => ({
|
|
85
|
+
id: node.id,
|
|
86
|
+
title: node.title,
|
|
87
|
+
represents: node.element ? {
|
|
88
|
+
element: node.element.id
|
|
89
|
+
} : {}
|
|
90
|
+
}))),
|
|
91
|
+
sourceFile: languageServices.locate({
|
|
92
|
+
view: view.id,
|
|
93
|
+
projectId
|
|
94
|
+
})
|
|
95
|
+
// edges: toArray(imap(view.edges(), edge => ({
|
|
96
|
+
// id: edge.id,
|
|
97
|
+
// title: edge.title,
|
|
98
|
+
// }))),
|
|
99
|
+
// elements: toArray(imap(view.elements(), el => ({
|
|
100
|
+
// id: el.id,
|
|
101
|
+
// title: el.title,
|
|
102
|
+
// }))),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
@@ -187,7 +187,7 @@ export function ViewsParser(B) {
|
|
|
187
187
|
}
|
|
188
188
|
parseViewRuleStyle(astRule) {
|
|
189
189
|
const styleProps = astRule.props.filter(ast.isStyleProperty);
|
|
190
|
-
const targets = astRule.
|
|
190
|
+
const targets = astRule.targets;
|
|
191
191
|
const notation = astRule.props.find(ast.isNotationProperty);
|
|
192
192
|
return this.parseRuleStyle(styleProps, targets, notation);
|
|
193
193
|
}
|
|
@@ -3,7 +3,6 @@ import { GrammarUtils } from "langium";
|
|
|
3
3
|
import { entries, filter, findLast, isTruthy, last } from "remeda";
|
|
4
4
|
import { TextEdit } from "vscode-languageserver-types";
|
|
5
5
|
import { ast } from "../ast.js";
|
|
6
|
-
import { isReferenceToLogicalModel } from "../utils/index.js";
|
|
7
6
|
const { findNodeForKeyword, findNodeForProperty } = GrammarUtils;
|
|
8
7
|
const asViewStyleRule = (target, style, indent = 0) => {
|
|
9
8
|
const indentStr = indent > 0 ? " ".repeat(indent) : "";
|
|
@@ -16,15 +15,15 @@ const asViewStyleRule = (target, style, indent = 0) => {
|
|
|
16
15
|
];
|
|
17
16
|
};
|
|
18
17
|
const isMatchingViewRule = (fqn, index) => (rule) => {
|
|
19
|
-
if (!ast.isViewRuleStyle(rule)) {
|
|
18
|
+
if (!ast.isViewRuleStyle(rule) && !ast.isDeploymentViewRuleStyle(rule)) {
|
|
20
19
|
return false;
|
|
21
20
|
}
|
|
22
|
-
const target = rule.
|
|
23
|
-
if (!target || isTruthy(rule.
|
|
21
|
+
const target = rule.targets.value;
|
|
22
|
+
if (!target || isTruthy(rule.targets.prev) || target.$type !== "FqnRefExpr" || isTruthy(target.selector)) {
|
|
24
23
|
return false;
|
|
25
24
|
}
|
|
26
|
-
const ref = target.
|
|
27
|
-
const _fqn = ref ? index.
|
|
25
|
+
const ref = target.ref?.value?.ref;
|
|
26
|
+
const _fqn = ref ? index.resolve(ref) : null;
|
|
28
27
|
return _fqn === fqn;
|
|
29
28
|
};
|
|
30
29
|
export function changeElementStyle(services, {
|
|
@@ -40,7 +39,10 @@ export function changeElementStyle(services, {
|
|
|
40
39
|
invariant(insertPos, "insertPos is not defined");
|
|
41
40
|
const indent = viewCstNode.range.start.character + 2;
|
|
42
41
|
const fqnIndex = services.likec4.FqnIndex;
|
|
43
|
-
const styleRules = filter(
|
|
42
|
+
const styleRules = filter(
|
|
43
|
+
viewAst.body.rules,
|
|
44
|
+
(r) => ast.isViewRuleStyle(r) || ast.isDeploymentViewRuleStyle(r)
|
|
45
|
+
);
|
|
44
46
|
const viewOf = view.__ === "element" ? view.viewOf : null;
|
|
45
47
|
const existing = [];
|
|
46
48
|
const insert = [];
|
package/dist/module.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ import { type DefaultSharedModuleContext, type LangiumServices, type LangiumShar
|
|
|
4
4
|
import { LikeC4DocumentationProvider } from './documentation';
|
|
5
5
|
import { type LikeC4LanguageServices } from './LikeC4LanguageServices';
|
|
6
6
|
import { LikeC4CodeLensProvider, LikeC4CompletionProvider, LikeC4DocumentHighlightProvider, LikeC4DocumentLinkProvider, LikeC4DocumentSymbolProvider, LikeC4HoverProvider, LikeC4SemanticTokenProvider } from './lsp';
|
|
7
|
+
import { type LikeC4MCPServer, LikeC4MCPServerFactory } from './mcp/LikeC4MCPServerFactory';
|
|
8
|
+
import { type LikeC4MCPTools } from './mcp/LikeC4MCPTools';
|
|
7
9
|
import { type LikeC4ModelBuilder, DeploymentsIndex, FqnIndex, LikeC4ModelLocator, LikeC4ModelParser } from './model';
|
|
8
10
|
import { LikeC4ModelChanges } from './model-change/ModelChanges';
|
|
9
11
|
import { LikeC4NameProvider, LikeC4ScopeComputation, LikeC4ScopeProvider } from './references';
|
|
@@ -33,6 +35,11 @@ export interface LikeC4AddedServices {
|
|
|
33
35
|
};
|
|
34
36
|
ValidatedWorkspaceCache: WorkspaceCache<string, any>;
|
|
35
37
|
Rpc: Rpc;
|
|
38
|
+
mcp: {
|
|
39
|
+
Tools: LikeC4MCPTools;
|
|
40
|
+
Server: LikeC4MCPServer;
|
|
41
|
+
ServerFactory: LikeC4MCPServerFactory;
|
|
42
|
+
};
|
|
36
43
|
likec4: {
|
|
37
44
|
LanguageServices: LikeC4LanguageServices;
|
|
38
45
|
Views: LikeC4Views;
|
package/dist/module.js
CHANGED
|
@@ -26,6 +26,8 @@ import {
|
|
|
26
26
|
LikeC4HoverProvider,
|
|
27
27
|
LikeC4SemanticTokenProvider
|
|
28
28
|
} from "./lsp/index.js";
|
|
29
|
+
import { LikeC4MCPServerFactory, NoopLikeC4MCPServer } from "./mcp/LikeC4MCPServerFactory.js";
|
|
30
|
+
import { DefaultLikeC4MCPTools } from "./mcp/LikeC4MCPTools.js";
|
|
29
31
|
import {
|
|
30
32
|
DefaultLikeC4ModelBuilder,
|
|
31
33
|
DeploymentsIndex,
|
|
@@ -74,6 +76,11 @@ export const LikeC4Module = {
|
|
|
74
76
|
},
|
|
75
77
|
ValidatedWorkspaceCache: (services) => new WorkspaceCache(services.shared, DocumentState.Validated),
|
|
76
78
|
Rpc: bind(Rpc),
|
|
79
|
+
mcp: {
|
|
80
|
+
Tools: bind(DefaultLikeC4MCPTools),
|
|
81
|
+
Server: bind(NoopLikeC4MCPServer),
|
|
82
|
+
ServerFactory: bind(LikeC4MCPServerFactory)
|
|
83
|
+
},
|
|
77
84
|
likec4: {
|
|
78
85
|
LanguageServices: bind(DefaultLikeC4LanguageServices),
|
|
79
86
|
Layouter: (_services) => {
|
|
@@ -25,6 +25,7 @@ export declare class DefaultLikeC4Views implements LikeC4Views {
|
|
|
25
25
|
private cache;
|
|
26
26
|
private viewsWithReportedErrors;
|
|
27
27
|
private ModelBuilder;
|
|
28
|
+
private queue;
|
|
28
29
|
constructor(services: LikeC4Services);
|
|
29
30
|
get layouter(): GraphvizLayouter;
|
|
30
31
|
computedViews(projectId?: ProjectId | undefined, cancelToken?: CancellationToken): Promise<ComputedView[]>;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { loggable } from "@likec4/log";
|
|
2
|
+
import PQueue from "p-queue";
|
|
2
3
|
import prettyMs from "pretty-ms";
|
|
3
4
|
import { values } from "remeda";
|
|
4
5
|
import { CancellationToken } from "vscode-jsonrpc";
|
|
5
6
|
import { logError, logger as rootLogger, logWarnError } from "../logger.js";
|
|
6
|
-
const logger = rootLogger.getChild("Views");
|
|
7
7
|
export class DefaultLikeC4Views {
|
|
8
8
|
constructor(services) {
|
|
9
9
|
this.services = services;
|
|
@@ -12,6 +12,7 @@ export class DefaultLikeC4Views {
|
|
|
12
12
|
cache = /* @__PURE__ */ new WeakMap();
|
|
13
13
|
viewsWithReportedErrors = /* @__PURE__ */ new Set();
|
|
14
14
|
ModelBuilder;
|
|
15
|
+
queue = new PQueue({ concurrency: 4, timeout: 1e4, throwOnTimeout: true });
|
|
15
16
|
get layouter() {
|
|
16
17
|
return this.services.likec4.Layouter;
|
|
17
18
|
}
|
|
@@ -24,19 +25,28 @@ export class DefaultLikeC4Views {
|
|
|
24
25
|
if (views.length === 0) {
|
|
25
26
|
return [];
|
|
26
27
|
}
|
|
28
|
+
const logger = rootLogger.getChild(["views", projectId ?? ""]);
|
|
27
29
|
logger.debug`layoutAll: ${views.length} views`;
|
|
28
30
|
const results = [];
|
|
29
31
|
const tasks = [];
|
|
30
32
|
for (const view of views) {
|
|
31
33
|
this.viewsWithReportedErrors.delete(view.id);
|
|
32
34
|
tasks.push(
|
|
33
|
-
|
|
35
|
+
Promise.resolve().then(async () => {
|
|
36
|
+
const result = await this.queue.add(async () => {
|
|
37
|
+
logger.debug`layouting view ${view.id}...`;
|
|
38
|
+
return await this.layouter.layout(view);
|
|
39
|
+
});
|
|
40
|
+
if (!result) {
|
|
41
|
+
return Promise.reject(new Error(`Failed to layout view ${view.id}`));
|
|
42
|
+
}
|
|
43
|
+
logger.debug`done layout view ${view.id}`;
|
|
34
44
|
this.viewsWithReportedErrors.delete(view.id);
|
|
35
45
|
this.cache.set(view, result);
|
|
36
46
|
return result;
|
|
37
47
|
}).catch((e) => {
|
|
48
|
+
logger.warn(`fail layout view ${view.id}`, { e });
|
|
38
49
|
this.cache.delete(view);
|
|
39
|
-
logWarnError(e);
|
|
40
50
|
return Promise.reject(e);
|
|
41
51
|
})
|
|
42
52
|
);
|
|
@@ -44,6 +54,8 @@ export class DefaultLikeC4Views {
|
|
|
44
54
|
for (const task of await Promise.allSettled(tasks)) {
|
|
45
55
|
if (task.status === "fulfilled") {
|
|
46
56
|
results.push(task.value);
|
|
57
|
+
} else {
|
|
58
|
+
logger.error(loggable(task.reason));
|
|
47
59
|
}
|
|
48
60
|
}
|
|
49
61
|
if (results.length !== views.length) {
|
|
@@ -56,6 +68,7 @@ export class DefaultLikeC4Views {
|
|
|
56
68
|
async layoutView(viewId, projectId, cancelToken = CancellationToken.None) {
|
|
57
69
|
const model = await this.ModelBuilder.buildLikeC4Model(projectId, cancelToken);
|
|
58
70
|
const view = model.findView(viewId)?.$view;
|
|
71
|
+
const logger = rootLogger.getChild(["views", projectId ?? ""]);
|
|
59
72
|
if (!view) {
|
|
60
73
|
logger.warn`layoutView ${viewId} not found`;
|
|
61
74
|
return null;
|
|
@@ -67,7 +80,13 @@ export class DefaultLikeC4Views {
|
|
|
67
80
|
}
|
|
68
81
|
try {
|
|
69
82
|
const start = performance.now();
|
|
70
|
-
const result = await this.
|
|
83
|
+
const result = await this.queue.add(async () => {
|
|
84
|
+
logger.debug`layouting view ${view.id}...`;
|
|
85
|
+
return await this.layouter.layout(view);
|
|
86
|
+
});
|
|
87
|
+
if (!result) {
|
|
88
|
+
throw new Error(`Failed to layout view ${viewId}`);
|
|
89
|
+
}
|
|
71
90
|
this.viewsWithReportedErrors.delete(viewId);
|
|
72
91
|
this.cache.set(view, result);
|
|
73
92
|
logger.debug(`layout {viewId} ready in ${prettyMs(performance.now() - start)}`, { viewId });
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@likec4/language-server",
|
|
3
3
|
"description": "LikeC4 Language Server",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.29.0",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"bugs": "https://github.com/likec4/likec4/issues",
|
|
7
7
|
"homepage": "https://likec4.dev",
|
|
@@ -94,9 +94,14 @@
|
|
|
94
94
|
"vscode-uri": "3.1.0"
|
|
95
95
|
},
|
|
96
96
|
"devDependencies": {
|
|
97
|
+
"@modelcontextprotocol/sdk": "^1.9.0",
|
|
98
|
+
"express": "^5.1.0",
|
|
97
99
|
"@msgpack/msgpack": "^3.1.1",
|
|
98
100
|
"@smithy/util-base64": "^4.0.0",
|
|
99
|
-
"@types/
|
|
101
|
+
"@types/express": "^5.0.1",
|
|
102
|
+
"@types/node": "^20.17.30",
|
|
103
|
+
"@types/picomatch": "^4.0.0",
|
|
104
|
+
"picomatch": "^4.0.2",
|
|
100
105
|
"@types/which": "^3.0.4",
|
|
101
106
|
"esm-env": "^1.2.2",
|
|
102
107
|
"fast-equals": "^5.2.2",
|
|
@@ -107,28 +112,29 @@
|
|
|
107
112
|
"langium-cli": "3.4.0",
|
|
108
113
|
"natural-compare-lite": "^1.4.0",
|
|
109
114
|
"p-debounce": "^4.0.0",
|
|
115
|
+
"p-queue": "^8.1.0",
|
|
116
|
+
"p-timeout": "^6.1.4",
|
|
110
117
|
"pretty-ms": "^9.2.0",
|
|
111
118
|
"remeda": "^2.21.2",
|
|
112
|
-
"@types/picomatch": "^4.0.0",
|
|
113
|
-
"picomatch": "^4.0.2",
|
|
114
119
|
"strip-indent": "^4.0.0",
|
|
115
120
|
"tsx": "~4.19.3",
|
|
116
121
|
"turbo": "^2.5.0",
|
|
117
122
|
"type-fest": "^4.39.1",
|
|
118
123
|
"typescript": "^5.8.3",
|
|
119
|
-
"ufo": "^1.
|
|
124
|
+
"ufo": "^1.6.1",
|
|
120
125
|
"unbuild": "^3.5.0",
|
|
121
126
|
"valibot": "^1.0.0",
|
|
127
|
+
"zod": "^3.24.2",
|
|
122
128
|
"vitest": "^3.1.1",
|
|
123
129
|
"vscode-languageserver": "9.0.1",
|
|
124
|
-
"vscode-languageserver-types": "3.17.5",
|
|
125
130
|
"vscode-languageserver-protocol": "3.17.5",
|
|
131
|
+
"vscode-languageserver-types": "3.17.5",
|
|
126
132
|
"which": "^5.0.0",
|
|
127
|
-
"@likec4/
|
|
128
|
-
"@likec4/
|
|
129
|
-
"@likec4/log": "1.
|
|
130
|
-
"@likec4/
|
|
131
|
-
"@likec4/
|
|
133
|
+
"@likec4/icons": "1.29.0",
|
|
134
|
+
"@likec4/core": "1.29.0",
|
|
135
|
+
"@likec4/log": "1.29.0",
|
|
136
|
+
"@likec4/tsconfig": "1.29.0",
|
|
137
|
+
"@likec4/layouts": "1.29.0"
|
|
132
138
|
},
|
|
133
139
|
"scripts": {
|
|
134
140
|
"typecheck": "tsc --noEmit",
|