@domainlang/language 0.9.0 β†’ 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/README.md +44 -102
  2. package/out/domain-lang-module.d.ts +2 -2
  3. package/out/domain-lang-module.js +2 -2
  4. package/out/domain-lang-module.js.map +1 -1
  5. package/out/index.d.ts +4 -0
  6. package/out/index.js +4 -0
  7. package/out/index.js.map +1 -1
  8. package/out/lsp/domain-lang-completion.js +1 -1
  9. package/out/lsp/domain-lang-completion.js.map +1 -1
  10. package/out/lsp/domain-lang-index-manager.d.ts +149 -5
  11. package/out/lsp/domain-lang-index-manager.js +388 -52
  12. package/out/lsp/domain-lang-index-manager.js.map +1 -1
  13. package/out/lsp/domain-lang-refresh.d.ts +35 -0
  14. package/out/lsp/domain-lang-refresh.js +129 -0
  15. package/out/lsp/domain-lang-refresh.js.map +1 -0
  16. package/out/lsp/domain-lang-workspace-manager.d.ts +10 -0
  17. package/out/lsp/domain-lang-workspace-manager.js +35 -0
  18. package/out/lsp/domain-lang-workspace-manager.js.map +1 -1
  19. package/out/lsp/explain.d.ts +18 -0
  20. package/out/lsp/explain.js +138 -0
  21. package/out/lsp/explain.js.map +1 -0
  22. package/out/lsp/tool-handlers.d.ts +113 -0
  23. package/out/lsp/tool-handlers.js +297 -0
  24. package/out/lsp/tool-handlers.js.map +1 -0
  25. package/out/main.js +33 -190
  26. package/out/main.js.map +1 -1
  27. package/out/sdk/index.d.ts +2 -0
  28. package/out/sdk/index.js +2 -0
  29. package/out/sdk/index.js.map +1 -1
  30. package/out/sdk/loader-node.js +1 -1
  31. package/out/sdk/loader-node.js.map +1 -1
  32. package/out/sdk/serializers.d.ts +110 -0
  33. package/out/sdk/serializers.js +158 -0
  34. package/out/sdk/serializers.js.map +1 -0
  35. package/out/sdk/validator.js +17 -14
  36. package/out/sdk/validator.js.map +1 -1
  37. package/out/services/import-resolver.d.ts +67 -17
  38. package/out/services/import-resolver.js +146 -65
  39. package/out/services/import-resolver.js.map +1 -1
  40. package/out/services/lsp-logger.d.ts +42 -0
  41. package/out/services/lsp-logger.js +50 -0
  42. package/out/services/lsp-logger.js.map +1 -0
  43. package/out/services/lsp-runtime-settings.d.ts +20 -0
  44. package/out/services/lsp-runtime-settings.js +20 -0
  45. package/out/services/lsp-runtime-settings.js.map +1 -0
  46. package/out/services/performance-optimizer.d.ts +9 -9
  47. package/out/services/performance-optimizer.js +17 -41
  48. package/out/services/performance-optimizer.js.map +1 -1
  49. package/out/services/workspace-manager.d.ts +22 -1
  50. package/out/services/workspace-manager.js +57 -9
  51. package/out/services/workspace-manager.js.map +1 -1
  52. package/out/utils/import-utils.js +6 -6
  53. package/out/utils/import-utils.js.map +1 -1
  54. package/out/validation/constants.d.ts +6 -0
  55. package/out/validation/constants.js +7 -0
  56. package/out/validation/constants.js.map +1 -1
  57. package/out/validation/import.d.ts +13 -3
  58. package/out/validation/import.js +54 -10
  59. package/out/validation/import.js.map +1 -1
  60. package/package.json +1 -1
  61. package/src/domain-lang-module.ts +3 -3
  62. package/src/index.ts +4 -0
  63. package/src/lsp/domain-lang-completion.ts +3 -3
  64. package/src/lsp/domain-lang-index-manager.ts +438 -56
  65. package/src/lsp/domain-lang-refresh.ts +205 -0
  66. package/src/lsp/domain-lang-workspace-manager.ts +45 -0
  67. package/src/lsp/explain.ts +172 -0
  68. package/src/lsp/tool-handlers.ts +443 -0
  69. package/src/main.ts +40 -244
  70. package/src/sdk/index.ts +11 -0
  71. package/src/sdk/loader-node.ts +1 -1
  72. package/src/sdk/serializers.ts +213 -0
  73. package/src/sdk/validator.ts +17 -13
  74. package/src/services/import-resolver.ts +196 -89
  75. package/src/services/lsp-logger.ts +89 -0
  76. package/src/services/lsp-runtime-settings.ts +34 -0
  77. package/src/services/performance-optimizer.ts +18 -57
  78. package/src/services/workspace-manager.ts +62 -10
  79. package/src/utils/import-utils.ts +6 -6
  80. package/src/validation/constants.ts +9 -0
  81. package/src/validation/import.ts +67 -12
@@ -0,0 +1,129 @@
1
+ import path from 'node:path';
2
+ import { URI } from 'langium';
3
+ import { FileChangeType } from 'vscode-languageserver-protocol';
4
+ class RecentChangeDeduper {
5
+ constructor(dedupeWindowMs = 300) {
6
+ this.seen = new Map();
7
+ this.dedupeWindowMs = dedupeWindowMs;
8
+ }
9
+ dedupe(changes) {
10
+ const now = Date.now();
11
+ const filtered = [];
12
+ for (const [key, timestamp] of this.seen.entries()) {
13
+ if (now - timestamp > this.dedupeWindowMs * 4) {
14
+ this.seen.delete(key);
15
+ }
16
+ }
17
+ for (const change of changes) {
18
+ const key = `${change.uri}|${change.type}`;
19
+ const previous = this.seen.get(key);
20
+ if (previous !== undefined && now - previous < this.dedupeWindowMs) {
21
+ continue;
22
+ }
23
+ this.seen.set(key, now);
24
+ filtered.push(change);
25
+ }
26
+ return filtered;
27
+ }
28
+ }
29
+ export function registerDomainLangRefresh(shared, domainLang, hooks = {}, options = {}) {
30
+ const deduper = new RecentChangeDeduper(options.dedupeWindowMs);
31
+ return shared.lsp.DocumentUpdateHandler.onWatchedFilesChange(async (params) => {
32
+ try {
33
+ const dedupedChanges = deduper.dedupe(params.changes);
34
+ if (dedupedChanges.length === 0) {
35
+ return;
36
+ }
37
+ await processWatchedFileChanges({ changes: dedupedChanges }, shared, domainLang, hooks);
38
+ }
39
+ catch (error) {
40
+ const message = error instanceof Error ? error.message : String(error);
41
+ console.error(`Error handling watched file changes: ${message}`);
42
+ }
43
+ });
44
+ }
45
+ /**
46
+ * Processes watched file change events.
47
+ *
48
+ * **Architecture:**
49
+ * - `.dlang` changes are handled entirely by Langium's own `DocumentBuilder.update()`
50
+ * pipeline. `DomainLangIndexManager.isAffected()` provides transitive import
51
+ * dependency tracking and specifier-sensitive matching, so Langium's single
52
+ * `update()` call propagates changes correctly through the import graph.
53
+ *
54
+ * - Config changes (model.yaml, model.lock) need explicit handling because Langium
55
+ * ignores non-language files (they have no LangiumDocument). Config changes
56
+ * invalidate caches and trigger a full rebuild of all loaded documents, routed
57
+ * through the workspace lock to serialize with Langium's own updates.
58
+ */
59
+ export async function processWatchedFileChanges(params, shared, domainLang, hooks = {}) {
60
+ const categorized = categorizeChanges(params);
61
+ const hasConfigChanges = categorized.manifestChanges.length > 0
62
+ || categorized.lockFileChanges.length > 0;
63
+ if (!hasConfigChanges) {
64
+ // .dlang changes handled by Langium's update() β†’ isAffected() pipeline.
65
+ // DomainLangIndexManager.isAffected() checks transitive import deps
66
+ // and specifier-sensitive matching β€” no second update() needed.
67
+ return { configChanged: false, fullRebuildTriggered: false };
68
+ }
69
+ // Config changes need explicit handling: invalidate caches, then rebuild.
70
+ // Route through the workspace lock to serialize with Langium's own updates.
71
+ const indexManager = shared.workspace.IndexManager;
72
+ await shared.workspace.WorkspaceLock.write(async (token) => {
73
+ // 1. Invalidate caches
74
+ await processManifestChanges(categorized.manifestChanges, domainLang, hooks);
75
+ await processLockFileChanges(categorized.lockFileChanges, domainLang);
76
+ domainLang.imports.ImportResolver.clearCache();
77
+ indexManager.clearImportDependencies();
78
+ // 2. Rebuild ALL loaded documents β€” config changes affect all imports
79
+ const allDocUris = shared.workspace.LangiumDocuments.all
80
+ .map(doc => doc.uri)
81
+ .toArray();
82
+ if (allDocUris.length > 0) {
83
+ await shared.workspace.DocumentBuilder.update(allDocUris, [], token);
84
+ }
85
+ });
86
+ return { configChanged: true, fullRebuildTriggered: true };
87
+ }
88
+ function categorizeChanges(params) {
89
+ const manifestChanges = [];
90
+ const lockFileChanges = [];
91
+ for (const change of params.changes) {
92
+ const uri = URI.parse(change.uri);
93
+ const fileName = path.basename(uri.path).toLowerCase();
94
+ if (fileName === 'model.yaml') {
95
+ manifestChanges.push({ uri: change.uri, type: change.type });
96
+ }
97
+ else if (fileName === 'model.lock') {
98
+ lockFileChanges.push({ uri: change.uri, type: change.type });
99
+ }
100
+ }
101
+ return { manifestChanges, lockFileChanges };
102
+ }
103
+ async function processManifestChanges(manifestChanges, domainLang, hooks) {
104
+ for (const change of manifestChanges) {
105
+ domainLang.imports.ManifestManager.invalidateManifestCache();
106
+ // R11: Update workspace layout cache for the manifest's directory
107
+ const manifestDir = path.dirname(URI.parse(change.uri).fsPath);
108
+ domainLang.imports.ManifestManager.onManifestEvent(manifestDir, change.type !== FileChangeType.Deleted);
109
+ if (change.type === FileChangeType.Deleted) {
110
+ if (hooks.onManifestDeleted) {
111
+ await hooks.onManifestDeleted(change.uri);
112
+ }
113
+ continue;
114
+ }
115
+ if (hooks.onManifestChanged) {
116
+ await hooks.onManifestChanged(change);
117
+ }
118
+ }
119
+ }
120
+ async function processLockFileChanges(lockFileChanges, domainLang) {
121
+ for (const change of lockFileChanges) {
122
+ if (change.type === FileChangeType.Deleted) {
123
+ domainLang.imports.ManifestManager.invalidateLockCache();
124
+ continue;
125
+ }
126
+ await domainLang.imports.ManifestManager.refreshLockFile();
127
+ }
128
+ }
129
+ //# sourceMappingURL=domain-lang-refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-lang-refresh.js","sourceRoot":"","sources":["../../src/lsp/domain-lang-refresh.ts"],"names":[],"mappings":"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"}
@@ -49,6 +49,11 @@ import type { DomainLangServices } from '../domain-lang-module.js';
49
49
  */
50
50
  export declare class DomainLangWorkspaceManager extends DefaultWorkspaceManager {
51
51
  private readonly sharedServices;
52
+ /**
53
+ * LSP connection for progress reporting (PRS-017 R7).
54
+ * Optional because the workspace manager can run in non-LSP contexts.
55
+ */
56
+ private readonly connection;
52
57
  /**
53
58
  * DI-injected import resolver. Set via late-binding because
54
59
  * WorkspaceManager (shared module) is created before ImportResolver (language module).
@@ -106,4 +111,9 @@ export declare class DomainLangWorkspaceManager extends DefaultWorkspaceManager
106
111
  * @returns Set of URIs (as strings) for all documents in the import graph
107
112
  */
108
113
  private loadImportGraph;
114
+ /**
115
+ * Creates an LSP work-done progress reporter.
116
+ * Returns undefined in non-LSP contexts (no connection).
117
+ */
118
+ private createProgress;
109
119
  }
@@ -53,6 +53,9 @@ export class DomainLangWorkspaceManager extends DefaultWorkspaceManager {
53
53
  constructor(services) {
54
54
  super(services);
55
55
  this.sharedServices = services;
56
+ // Attempt to access connection from LSP services (cast to full shared services)
57
+ const lspServices = services;
58
+ this.connection = lspServices.lsp?.Connection;
56
59
  }
57
60
  /**
58
61
  * Late-binds the language-specific services after DI initialization.
@@ -73,13 +76,18 @@ export class DomainLangWorkspaceManager extends DefaultWorkspaceManager {
73
76
  await super.initializeWorkspace(folders, cancelToken);
74
77
  }
75
78
  async loadAdditionalDocuments(folders, collector) {
79
+ const progress = await this.createProgress('DomainLang: Indexing workspace');
76
80
  // Find ALL model.yaml files in workspace (supports mixed mode)
77
81
  const manifestInfos = await this.findAllManifestsInFolders(folders);
78
82
  // Track directories covered by manifests to avoid loading their files as standalone
79
83
  const moduleDirectories = new Set(manifestInfos.map(m => path.dirname(m.manifestPath)));
84
+ progress?.report(`Found ${manifestInfos.length} module(s)`);
80
85
  // Mode A or Mode C: Load each module's entry + import graph
86
+ let moduleIdx = 0;
81
87
  for (const manifestInfo of manifestInfos) {
88
+ moduleIdx++;
82
89
  try {
90
+ progress?.report(`Loading module ${moduleIdx}/${manifestInfos.length}`);
83
91
  const entryUri = URI.file(manifestInfo.entryPath);
84
92
  const entryDoc = await this.langiumDocuments.getOrCreateDocument(entryUri);
85
93
  collector(entryDoc);
@@ -110,7 +118,9 @@ export class DomainLangWorkspaceManager extends DefaultWorkspaceManager {
110
118
  }
111
119
  // Load standalone .dlang files in workspace root folders
112
120
  // These are files NOT covered by any module's import graph
121
+ progress?.report('Loading standalone files');
113
122
  await this.loadStandaloneFiles(folders, moduleDirectories, collector);
123
+ progress?.done();
114
124
  }
115
125
  /**
116
126
  * Loads standalone .dlang files from workspace folders recursively.
@@ -256,5 +266,30 @@ export class DomainLangWorkspaceManager extends DefaultWorkspaceManager {
256
266
  await visit(document);
257
267
  return visited;
258
268
  }
269
+ // --- PRS-017 R7: Progress reporting ---
270
+ /**
271
+ * Creates an LSP work-done progress reporter.
272
+ * Returns undefined in non-LSP contexts (no connection).
273
+ */
274
+ async createProgress(title) {
275
+ if (!this.connection)
276
+ return undefined;
277
+ try {
278
+ const reporter = await this.connection.window.createWorkDoneProgress();
279
+ reporter.begin(title);
280
+ return {
281
+ report: (message) => {
282
+ reporter.report(message);
283
+ },
284
+ done: () => {
285
+ reporter.done();
286
+ }
287
+ };
288
+ }
289
+ catch {
290
+ // Client may not support progress β€” degrade gracefully
291
+ return undefined;
292
+ }
293
+ }
259
294
  }
260
295
  //# sourceMappingURL=domain-lang-workspace-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"domain-lang-workspace-manager.js","sourceRoot":"","sources":["../../src/lsp/domain-lang-workspace-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"domain-lang-workspace-manager.js","sourceRoot":"","sources":["../../src/lsp/domain-lang-workspace-manager.ts"],"names":[],"mappings":"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"}
@@ -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;