@domainlang/language 0.9.0 → 0.10.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/out/index.d.ts CHANGED
@@ -11,3 +11,4 @@ export * from './services/performance-optimizer.js';
11
11
  export * from './utils/manifest-utils.js';
12
12
  export * from './lsp/manifest-diagnostics.js';
13
13
  export { DomainLangIndexManager } from './lsp/domain-lang-index-manager.js';
14
+ export { registerToolHandlers } from './lsp/tool-handlers.js';
package/out/index.js CHANGED
@@ -23,4 +23,5 @@ export * from './utils/manifest-utils.js';
23
23
  // Export LSP services
24
24
  export * from './lsp/manifest-diagnostics.js';
25
25
  export { DomainLangIndexManager } from './lsp/domain-lang-index-manager.js';
26
+ export { registerToolHandlers } from './lsp/tool-handlers.js';
26
27
  //# sourceMappingURL=index.js.map
package/out/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,8EAA8E;AAC9E,gFAAgF;AAChF,cAAc,uBAAuB,CAAC;AAEtC,oEAAoE;AACpE,cAAc,qBAAqB,CAAC;AAEpC,8DAA8D;AAC9D,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC;AACrD,cAAc,qCAAqC,CAAC;AAEpD,0BAA0B;AAC1B,cAAc,2BAA2B,CAAC;AAE1C,+DAA+D;AAC/D,mDAAmD;AACnD,sDAAsD;AACtD,sDAAsD;AACtD,uDAAuD;AACvD,yCAAyC;AAEzC,sBAAsB;AACtB,cAAc,+BAA+B,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,8EAA8E;AAC9E,gFAAgF;AAChF,cAAc,uBAAuB,CAAC;AAEtC,oEAAoE;AACpE,cAAc,qBAAqB,CAAC;AAEpC,8DAA8D;AAC9D,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC;AACrD,cAAc,qCAAqC,CAAC;AAEpD,0BAA0B;AAC1B,cAAc,2BAA2B,CAAC;AAE1C,+DAA+D;AAC/D,mDAAmD;AACnD,sDAAsD;AACtD,sDAAsD;AACtD,uDAAuD;AACvD,yCAAyC;AAEzC,sBAAsB;AACtB,cAAc,+BAA+B,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Explanation generation for model elements (PRS-015)
3
+ *
4
+ * Reuses hover builder functions to generate rich markdown explanations
5
+ * of any model element. This provides the same content that appears in
6
+ * hover tooltips, but in a format suitable for Language Model Tools.
7
+ *
8
+ * @module lsp/explain
9
+ */
10
+ import type { AstNode } from 'langium';
11
+ /**
12
+ * Generates a rich markdown explanation for any model element.
13
+ * Delegates to the appropriate builder based on element type.
14
+ *
15
+ * @param node - AST node to explain
16
+ * @returns Markdown explanation
17
+ */
18
+ export declare function generateExplanation(node: AstNode): string;
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Explanation generation for model elements (PRS-015)
3
+ *
4
+ * Reuses hover builder functions to generate rich markdown explanations
5
+ * of any model element. This provides the same content that appears in
6
+ * hover tooltips, but in a format suitable for Language Model Tools.
7
+ *
8
+ * @module lsp/explain
9
+ */
10
+ import { isBoundedContext, isClassification, isContextMap, isDomain, isDomainMap, isRelationship, isTeam, } from '../generated/ast.js';
11
+ import { formatHoverContent, buildDomainFields, buildBcSignature, codeBlock, } from './hover/hover-builders.js';
12
+ import { effectiveClassification, effectiveTeam } from '../sdk/resolution.js';
13
+ /**
14
+ * Creates a plain-text reference link function for explain output.
15
+ * Unlike the hover provider (which creates clickable links), this returns
16
+ * plain names suitable for Language Model consumption.
17
+ */
18
+ function createRefLink() {
19
+ return (ref, label) => {
20
+ if (!ref)
21
+ return label ?? 'unknown';
22
+ return label ?? ref.name;
23
+ };
24
+ }
25
+ /**
26
+ * Generates a rich markdown explanation for any model element.
27
+ * Delegates to the appropriate builder based on element type.
28
+ *
29
+ * @param node - AST node to explain
30
+ * @returns Markdown explanation
31
+ */
32
+ export function generateExplanation(node) {
33
+ const refLink = createRefLink();
34
+ if (isDomain(node)) {
35
+ return explainDomain(node, refLink);
36
+ }
37
+ else if (isBoundedContext(node)) {
38
+ return explainBoundedContext(node, refLink);
39
+ }
40
+ else if (isTeam(node)) {
41
+ return explainTeam(node);
42
+ }
43
+ else if (isClassification(node)) {
44
+ return explainClassification(node);
45
+ }
46
+ else if (isRelationship(node)) {
47
+ return explainRelationship(node);
48
+ }
49
+ else if (isContextMap(node)) {
50
+ return explainContextMap(node);
51
+ }
52
+ else if (isDomainMap(node)) {
53
+ return explainDomainMap(node);
54
+ }
55
+ else {
56
+ return `**Unknown element type:** ${node.$type}`;
57
+ }
58
+ }
59
+ /**
60
+ * Explains a Domain element.
61
+ */
62
+ function explainDomain(domain, refLink) {
63
+ const fields = buildDomainFields(domain, refLink);
64
+ return formatHoverContent('', '🏛️', 'domain', domain.name, fields);
65
+ }
66
+ /**
67
+ * Explains a BoundedContext element.
68
+ */
69
+ function explainBoundedContext(bc, refLink) {
70
+ const description = bc.description ?? '';
71
+ const classification = effectiveClassification(bc);
72
+ const team = effectiveTeam(bc);
73
+ const signature = codeBlock(buildBcSignature(bc));
74
+ const fields = [signature];
75
+ if (description)
76
+ fields.push(description);
77
+ const extraFields = [];
78
+ if (bc.domain?.ref) {
79
+ extraFields.push('---', `📁 **Domain:** ${refLink(bc.domain.ref)}`);
80
+ }
81
+ if (classification) {
82
+ extraFields.push(`🔖 **Classification:** ${refLink(classification)}`);
83
+ }
84
+ if (team) {
85
+ extraFields.push(`👥 **Team:** ${refLink(team)}`);
86
+ }
87
+ fields.push(...extraFields);
88
+ return formatHoverContent('', '📦', 'bounded context', bc.name, fields);
89
+ }
90
+ /**
91
+ * Explains a Team element.
92
+ */
93
+ function explainTeam(team) {
94
+ return formatHoverContent('', '👥', 'team', team.name, []);
95
+ }
96
+ /**
97
+ * Explains a Classification element.
98
+ */
99
+ function explainClassification(classification) {
100
+ return formatHoverContent('', '🏷️', 'classification', classification.name, []);
101
+ }
102
+ /**
103
+ * Explains a Relationship element.
104
+ */
105
+ function explainRelationship(relationship) {
106
+ const leftName = relationship.left.link?.ref?.name ?? 'unknown';
107
+ const rightName = relationship.right.link?.ref?.name ?? 'unknown';
108
+ const arrow = relationship.arrow;
109
+ const description = `Relationship from **${leftName}** ${arrow} **${rightName}**`;
110
+ return formatHoverContent('', '🔗', 'relationship', undefined, [description]);
111
+ }
112
+ /**
113
+ * Explains a ContextMap element.
114
+ */
115
+ function explainContextMap(contextMap) {
116
+ const bcNames = contextMap.boundedContexts
117
+ .flatMap(mr => mr.items.map(item => item.ref?.name ?? 'unknown'));
118
+ const relCount = contextMap.relationships.length;
119
+ const fields = [];
120
+ if (bcNames.length > 0) {
121
+ fields.push(`**Bounded contexts:** ${bcNames.join(', ')}`);
122
+ }
123
+ fields.push(`**Relationships:** ${relCount}`);
124
+ return formatHoverContent('', '🗺️', 'context map', contextMap.name, fields);
125
+ }
126
+ /**
127
+ * Explains a DomainMap element.
128
+ */
129
+ function explainDomainMap(domainMap) {
130
+ const domainNames = domainMap.domains
131
+ .flatMap(mr => mr.items.map(item => item.ref?.name ?? 'unknown'));
132
+ const fields = [];
133
+ if (domainNames.length > 0) {
134
+ fields.push(`**Domains:** ${domainNames.join(', ')}`);
135
+ }
136
+ return formatHoverContent('', '🌐', 'domain map', domainMap.name, fields);
137
+ }
138
+ //# sourceMappingURL=explain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain.js","sourceRoot":"","sources":["../../src/lsp/explain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * LSP Custom Request Handlers for VS Code Language Model Tools (PRS-015)
3
+ *
4
+ * These handlers respond to custom LSP requests from the VS Code extension
5
+ * and return serialized model data suitable for Language Model Tools.
6
+ *
7
+ * Architecture:
8
+ * - Extension calls `client.sendRequest('domainlang/validate', params)`
9
+ * - LSP receives via `connection.onRequest('domainlang/validate', handler)`
10
+ * - Handler uses SDK `fromServices()` for zero-copy AST access
11
+ * - Handler returns plain JSON (no circular refs, no class instances)
12
+ *
13
+ * @module lsp/tool-handlers
14
+ */
15
+ import type { Connection } from 'vscode-languageserver';
16
+ import type { LangiumSharedServices } from 'langium/lsp';
17
+ import type { QueryEntityType, QueryFilters } from '../sdk/serializers.js';
18
+ /**
19
+ * Request parameters for domainlang/validate.
20
+ * No parameters needed - validates entire workspace.
21
+ */
22
+ export interface ValidateParams {
23
+ /** Optional: filter by file URI */
24
+ file?: string;
25
+ }
26
+ /**
27
+ * Response from domainlang/validate.
28
+ */
29
+ export interface ValidateResponse {
30
+ /** Total number of validation diagnostics */
31
+ count: number;
32
+ /** Validation diagnostics grouped by severity */
33
+ diagnostics: {
34
+ errors: DiagnosticInfo[];
35
+ warnings: DiagnosticInfo[];
36
+ info: DiagnosticInfo[];
37
+ };
38
+ }
39
+ /**
40
+ * Diagnostic information for validation response.
41
+ */
42
+ export interface DiagnosticInfo {
43
+ /** File URI */
44
+ file: string;
45
+ /** Line number (1-indexed) */
46
+ line: number;
47
+ /** Column number (1-indexed) */
48
+ column: number;
49
+ /** Diagnostic message */
50
+ message: string;
51
+ /** Severity level */
52
+ severity: 'error' | 'warning' | 'info';
53
+ /** Optional diagnostic code */
54
+ code?: string | number;
55
+ }
56
+ /**
57
+ * Request parameters for domainlang/list.
58
+ */
59
+ export interface ListParams {
60
+ /** Entity type to query */
61
+ type: string;
62
+ /** Optional filters */
63
+ filters?: QueryFilters;
64
+ }
65
+ /**
66
+ * Response from domainlang/list.
67
+ */
68
+ export interface ListResponse {
69
+ /** Entity type queried */
70
+ entityType: QueryEntityType;
71
+ /** Number of results */
72
+ count: number;
73
+ /** Serialized results */
74
+ results: Record<string, unknown>[];
75
+ }
76
+ /**
77
+ * Request parameters for domainlang/get.
78
+ */
79
+ export interface GetParams {
80
+ /** Fully qualified name of element to retrieve */
81
+ fqn?: string;
82
+ /** If true, return model summary instead of single element */
83
+ summary?: boolean;
84
+ }
85
+ /**
86
+ * Response from domainlang/get.
87
+ */
88
+ export interface GetResponse {
89
+ /** Serialized element or model summary */
90
+ result: Record<string, unknown> | null;
91
+ }
92
+ /**
93
+ * Request parameters for domainlang/explain.
94
+ */
95
+ export interface ExplainParams {
96
+ /** Fully qualified name of element to explain */
97
+ fqn: string;
98
+ }
99
+ /**
100
+ * Response from domainlang/explain.
101
+ */
102
+ export interface ExplainResponse {
103
+ /** Rich markdown explanation */
104
+ explanation: string;
105
+ }
106
+ /**
107
+ * Registers all custom request handlers on the LSP connection.
108
+ * Call this from main.ts after creating the connection.
109
+ *
110
+ * @param connection - LSP connection
111
+ * @param sharedServices - Langium shared services for workspace access
112
+ */
113
+ export declare function registerToolHandlers(connection: Connection, sharedServices: LangiumSharedServices): void;
@@ -0,0 +1,297 @@
1
+ /**
2
+ * LSP Custom Request Handlers for VS Code Language Model Tools (PRS-015)
3
+ *
4
+ * These handlers respond to custom LSP requests from the VS Code extension
5
+ * and return serialized model data suitable for Language Model Tools.
6
+ *
7
+ * Architecture:
8
+ * - Extension calls `client.sendRequest('domainlang/validate', params)`
9
+ * - LSP receives via `connection.onRequest('domainlang/validate', handler)`
10
+ * - Handler uses SDK `fromServices()` for zero-copy AST access
11
+ * - Handler returns plain JSON (no circular refs, no class instances)
12
+ *
13
+ * @module lsp/tool-handlers
14
+ */
15
+ import { URI } from 'langium';
16
+ import { fromDocument } from '../sdk/query.js';
17
+ import { serializeNode, serializeRelationship, normalizeEntityType, } from '../sdk/serializers.js';
18
+ import { generateExplanation } from './explain.js';
19
+ // ─────────────────────────────────────────────────────────────────────────────
20
+ // Handler Registration
21
+ // ─────────────────────────────────────────────────────────────────────────────
22
+ /**
23
+ * Registers all custom request handlers on the LSP connection.
24
+ * Call this from main.ts after creating the connection.
25
+ *
26
+ * @param connection - LSP connection
27
+ * @param sharedServices - Langium shared services for workspace access
28
+ */
29
+ export function registerToolHandlers(connection, sharedServices) {
30
+ connection.onRequest('domainlang/validate', async (params) => {
31
+ return handleValidate(params, sharedServices);
32
+ });
33
+ connection.onRequest('domainlang/list', async (params) => {
34
+ return handleList(params, sharedServices);
35
+ });
36
+ connection.onRequest('domainlang/get', async (params) => {
37
+ return handleGet(params, sharedServices);
38
+ });
39
+ connection.onRequest('domainlang/explain', async (params) => {
40
+ return handleExplain(params, sharedServices);
41
+ });
42
+ }
43
+ // ─────────────────────────────────────────────────────────────────────────────
44
+ // Handler Implementations
45
+ // ─────────────────────────────────────────────────────────────────────────────
46
+ /**
47
+ * Handles domainlang/validate requests.
48
+ * Aggregates all validation diagnostics from the workspace.
49
+ */
50
+ async function handleValidate(params, sharedServices) {
51
+ try {
52
+ const langiumDocs = sharedServices.workspace.LangiumDocuments;
53
+ const documents = params.file
54
+ ? [langiumDocs.getDocument(URI.parse(params.file))]
55
+ : Array.from(langiumDocs.all);
56
+ const errors = [];
57
+ const warnings = [];
58
+ const info = [];
59
+ for (const doc of documents) {
60
+ if (!doc)
61
+ continue;
62
+ const diagnostics = doc.diagnostics ?? [];
63
+ for (const diag of diagnostics) {
64
+ const diagInfo = {
65
+ file: doc.uri.toString(),
66
+ line: diag.range.start.line + 1, // 1-indexed
67
+ column: diag.range.start.character + 1, // 1-indexed
68
+ message: diag.message,
69
+ severity: severityToString(diag.severity ?? 1),
70
+ code: diag.code,
71
+ };
72
+ if (diag.severity === 1) {
73
+ errors.push(diagInfo);
74
+ }
75
+ else if (diag.severity === 2) {
76
+ warnings.push(diagInfo);
77
+ }
78
+ else {
79
+ info.push(diagInfo);
80
+ }
81
+ }
82
+ }
83
+ return {
84
+ count: errors.length + warnings.length + info.length,
85
+ diagnostics: { errors, warnings, info },
86
+ };
87
+ }
88
+ catch (error) {
89
+ console.error('domainlang/validate handler error:', error);
90
+ return { count: 0, diagnostics: { errors: [], warnings: [], info: [] } };
91
+ }
92
+ }
93
+ /**
94
+ * Handles domainlang/list requests.
95
+ * Queries entities of a specific type and returns serialized results.
96
+ */
97
+ async function handleList(params, sharedServices) {
98
+ try {
99
+ const entityType = normalizeEntityType(params.type);
100
+ const filters = params.filters ?? {};
101
+ // Get all documents and merge results
102
+ const langiumDocs = sharedServices.workspace.LangiumDocuments;
103
+ const documents = Array.from(langiumDocs.all);
104
+ const allResults = [];
105
+ const seen = new Set(); // Deduplicate by FQN
106
+ for (const doc of documents) {
107
+ const query = fromDocument(doc);
108
+ const results = executeListQuery(query, entityType, filters);
109
+ for (const result of results) {
110
+ const fqn = result.fqn;
111
+ if (fqn && seen.has(fqn))
112
+ continue;
113
+ if (fqn)
114
+ seen.add(fqn);
115
+ allResults.push(result);
116
+ }
117
+ }
118
+ return {
119
+ entityType,
120
+ count: allResults.length,
121
+ results: allResults,
122
+ };
123
+ }
124
+ catch (error) {
125
+ console.error('domainlang/list handler error:', error);
126
+ return { entityType: normalizeEntityType(params.type), count: 0, results: [] };
127
+ }
128
+ }
129
+ /**
130
+ * Handles domainlang/get requests.
131
+ * Retrieves a single element by FQN or returns a model summary.
132
+ */
133
+ async function handleGet(params, sharedServices) {
134
+ try {
135
+ if (params.summary) {
136
+ return { result: await getModelSummary(sharedServices) };
137
+ }
138
+ if (!params.fqn) {
139
+ return { result: null };
140
+ }
141
+ // Search all documents for the element
142
+ const langiumDocs = sharedServices.workspace.LangiumDocuments;
143
+ const documents = Array.from(langiumDocs.all);
144
+ for (const doc of documents) {
145
+ const query = fromDocument(doc);
146
+ const element = query.byFqn(params.fqn);
147
+ if (element) {
148
+ return { result: serializeNode(element, query) };
149
+ }
150
+ }
151
+ return { result: null };
152
+ }
153
+ catch (error) {
154
+ console.error('domainlang/get handler error:', error);
155
+ return { result: null };
156
+ }
157
+ }
158
+ /**
159
+ * Handles domainlang/explain requests.
160
+ * Returns rich markdown explanation of a model element.
161
+ */
162
+ async function handleExplain(params, sharedServices) {
163
+ try {
164
+ const langiumDocs = sharedServices.workspace.LangiumDocuments;
165
+ const documents = Array.from(langiumDocs.all);
166
+ for (const doc of documents) {
167
+ const query = fromDocument(doc);
168
+ const element = query.byFqn(params.fqn);
169
+ if (element) {
170
+ const explanation = generateExplanation(element);
171
+ return { explanation };
172
+ }
173
+ }
174
+ return {
175
+ explanation: `Element not found: ${params.fqn}`,
176
+ };
177
+ }
178
+ catch (error) {
179
+ console.error('domainlang/explain handler error:', error);
180
+ return { explanation: `Error explaining element: ${params.fqn}` };
181
+ }
182
+ }
183
+ // ─────────────────────────────────────────────────────────────────────────────
184
+ // Helper Functions
185
+ // ─────────────────────────────────────────────────────────────────────────────
186
+ /**
187
+ * Executes a list query for a specific entity type.
188
+ */
189
+ function executeListQuery(query, entityType, filters) {
190
+ switch (entityType) {
191
+ case 'domains': {
192
+ let builder = query.domains();
193
+ if (filters.name)
194
+ builder = builder.withName(filters.name);
195
+ if (filters.fqn)
196
+ builder = builder.withFqn(filters.fqn);
197
+ return builder.toArray().map((d) => serializeNode(d, query));
198
+ }
199
+ case 'bcs': {
200
+ let builder = query.boundedContexts();
201
+ if (filters.domain)
202
+ builder = builder.inDomain(filters.domain);
203
+ if (filters.team)
204
+ builder = builder.withTeam(filters.team);
205
+ if (filters.classification)
206
+ builder = builder.withClassification(filters.classification);
207
+ if (filters.metadata) {
208
+ const [key, value] = filters.metadata.split('=');
209
+ builder = builder.withMetadata(key, value);
210
+ }
211
+ if (filters.name)
212
+ builder = builder.withName(filters.name);
213
+ if (filters.fqn)
214
+ builder = builder.withFqn(filters.fqn);
215
+ return builder.toArray().map((bc) => serializeNode(bc, query));
216
+ }
217
+ case 'teams': {
218
+ let builder = query.teams();
219
+ if (filters.name)
220
+ builder = builder.withName(filters.name);
221
+ return builder.toArray().map((t) => serializeNode(t, query));
222
+ }
223
+ case 'classifications': {
224
+ let builder = query.classifications();
225
+ if (filters.name)
226
+ builder = builder.withName(filters.name);
227
+ return builder.toArray().map((c) => serializeNode(c, query));
228
+ }
229
+ case 'relationships': {
230
+ const rels = query.relationships().toArray();
231
+ return rels.map((r) => serializeRelationship(r));
232
+ }
233
+ case 'context-maps': {
234
+ let builder = query.contextMaps();
235
+ if (filters.name)
236
+ builder = builder.withName(filters.name);
237
+ return builder.toArray().map((cm) => serializeNode(cm, query));
238
+ }
239
+ case 'domain-maps': {
240
+ let builder = query.domainMaps();
241
+ if (filters.name)
242
+ builder = builder.withName(filters.name);
243
+ return builder.toArray().map((dm) => serializeNode(dm, query));
244
+ }
245
+ default:
246
+ return [];
247
+ }
248
+ }
249
+ /**
250
+ * Generates a model summary with counts of major entities.
251
+ */
252
+ async function getModelSummary(sharedServices) {
253
+ const langiumDocs = sharedServices.workspace.LangiumDocuments;
254
+ const documents = Array.from(langiumDocs.all);
255
+ let domains = 0;
256
+ let bcs = 0;
257
+ let teams = 0;
258
+ let classifications = 0;
259
+ let relationships = 0;
260
+ let contextMaps = 0;
261
+ let domainMaps = 0;
262
+ for (const doc of documents) {
263
+ const query = fromDocument(doc);
264
+ domains += query.domains().count();
265
+ bcs += query.boundedContexts().count();
266
+ teams += query.teams().count();
267
+ classifications += query.classifications().count();
268
+ relationships += query.relationships().count();
269
+ contextMaps += query.contextMaps().count();
270
+ domainMaps += query.domainMaps().count();
271
+ }
272
+ return {
273
+ $type: 'ModelSummary',
274
+ documentCount: documents.length,
275
+ domains,
276
+ boundedContexts: bcs,
277
+ teams,
278
+ classifications,
279
+ relationships,
280
+ contextMaps,
281
+ domainMaps,
282
+ };
283
+ }
284
+ /**
285
+ * Converts diagnostic severity number to string.
286
+ */
287
+ function severityToString(severity) {
288
+ switch (severity) {
289
+ case 1:
290
+ return 'error';
291
+ case 2:
292
+ return 'warning';
293
+ default:
294
+ return 'info';
295
+ }
296
+ }
297
+ //# sourceMappingURL=tool-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-handlers.js","sourceRoot":"","sources":["../../src/lsp/tool-handlers.ts"],"names":[],"mappings":"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"}
package/out/main.js CHANGED
@@ -3,11 +3,14 @@ import { NodeFileSystem } from 'langium/node';
3
3
  import { createConnection, ProposedFeatures, FileChangeType } from 'vscode-languageserver/node.js';
4
4
  import { createDomainLangServices } from './domain-lang-module.js';
5
5
  import { ensureImportGraphFromEntryFile } from './utils/import-utils.js';
6
+ import { registerToolHandlers } from './lsp/tool-handlers.js';
6
7
  import { URI } from 'langium';
7
8
  // Create a connection to the client
8
9
  const connection = createConnection(ProposedFeatures.all);
9
10
  // Inject the shared services and language-specific services
10
11
  const { shared, DomainLang } = createDomainLangServices({ connection, ...NodeFileSystem });
12
+ // Register custom LSP request handlers for VS Code Language Model Tools (PRS-015)
13
+ registerToolHandlers(connection, shared);
11
14
  // Initialize workspace manager when language server initializes
12
15
  // Uses Langium's LanguageServer.onInitialize hook (not raw connection handler)
13
16
  // This integrates properly with Langium's initialization flow