@oml/server 0.14.0 → 0.14.1
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/cli.d.ts +1 -0
- package/{src/cli.ts → out/cli.js} +23 -45
- package/out/cli.js.map +1 -0
- package/out/index.d.ts +7 -0
- package/{src/index.ts → out/index.js} +1 -1
- package/out/index.js.map +1 -0
- package/out/lsp/diagram-server.d.ts +6 -0
- package/out/lsp/diagram-server.js +36 -0
- package/out/lsp/diagram-server.js.map +1 -0
- package/out/lsp/language-server.d.ts +13 -0
- package/{src/lsp/language-server.ts → out/lsp/language-server.js} +62 -120
- package/out/lsp/language-server.js.map +1 -0
- package/out/lsp/protocol/browser-fs-protocol.d.ts +14 -0
- package/{src/lsp/protocol/browser-fs-protocol.ts → out/lsp/protocol/browser-fs-protocol.js} +2 -14
- package/out/lsp/protocol/browser-fs-protocol.js.map +1 -0
- package/{src/lsp/protocol/reasoner-protocol.ts → out/lsp/protocol/reasoner-protocol.d.ts} +10 -24
- package/out/lsp/protocol/reasoner-protocol.js +12 -0
- package/out/lsp/protocol/reasoner-protocol.js.map +1 -0
- package/out/lsp/providers/browser-fs-provider.d.ts +21 -0
- package/{src/lsp/providers/browser-fs-provider.ts → out/lsp/providers/browser-fs-provider.js} +22 -34
- package/out/lsp/providers/browser-fs-provider.js.map +1 -0
- package/out/lsp/providers/hybrid-fs-provider.d.ts +28 -0
- package/{src/lsp/providers/hybrid-fs-provider.ts → out/lsp/providers/hybrid-fs-provider.js} +22 -44
- package/out/lsp/providers/hybrid-fs-provider.js.map +1 -0
- package/out/rest/export.d.ts +16 -0
- package/{src/rest/export.ts → out/rest/export.js} +14 -35
- package/out/rest/export.js.map +1 -0
- package/out/rest/routes.d.ts +49 -0
- package/{src/rest/routes.ts → out/rest/routes.js} +5 -27
- package/out/rest/routes.js.map +1 -0
- package/out/rest/server.d.ts +15 -0
- package/{src/rest/server.ts → out/rest/server.js} +207 -479
- package/out/rest/server.js.map +1 -0
- package/out/rest/template.d.ts +18 -0
- package/{src/rest/template.ts → out/rest/template.js} +21 -80
- package/out/rest/template.js.map +1 -0
- package/out/rest/validation.d.ts +49 -0
- package/{src/rest/validation.ts → out/rest/validation.js} +59 -163
- package/out/rest/validation.js.map +1 -0
- package/package.json +9 -4
- package/src/lsp/diagram-server.ts +0 -48
- package/tsconfig.json +0 -22
package/out/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runServerCli(argv?: string[]): void;
|
|
@@ -1,26 +1,15 @@
|
|
|
1
1
|
// Copyright (c) 2026 Modelware. All rights reserved.
|
|
2
|
-
|
|
3
2
|
import * as fs from 'node:fs/promises';
|
|
4
3
|
import * as os from 'node:os';
|
|
5
4
|
import * as path from 'node:path';
|
|
6
5
|
import { createHash } from 'node:crypto';
|
|
7
6
|
import { NodeFileSystem } from 'langium/node';
|
|
8
7
|
import { createConnection } from 'vscode-languageserver/node.js';
|
|
9
|
-
import { startOmlLanguageServer
|
|
8
|
+
import { startOmlLanguageServer } from './lsp/language-server.js';
|
|
10
9
|
import { startOmlRestServer } from './rest/server.js';
|
|
11
|
-
|
|
12
|
-
interface RemoteOptions {
|
|
13
|
-
host: string;
|
|
14
|
-
port: number;
|
|
15
|
-
workspaceRoot: string;
|
|
16
|
-
token?: string;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
type ServerLockOwner = 'daemon' | 'extension';
|
|
20
|
-
|
|
21
|
-
function formatStartupError(error: unknown, host: string, port: number): string {
|
|
10
|
+
function formatStartupError(error, host, port) {
|
|
22
11
|
if (error && typeof error === 'object' && 'code' in error) {
|
|
23
|
-
const code =
|
|
12
|
+
const code = error.code;
|
|
24
13
|
if (code === 'EADDRINUSE') {
|
|
25
14
|
return `Port ${port} is already in use on ${host}.`;
|
|
26
15
|
}
|
|
@@ -30,8 +19,7 @@ function formatStartupError(error: unknown, host: string, port: number): string
|
|
|
30
19
|
}
|
|
31
20
|
return error instanceof Error ? error.message : String(error);
|
|
32
21
|
}
|
|
33
|
-
|
|
34
|
-
function readOptionValue(argv: string[], index: number, aliases: string[]): string {
|
|
22
|
+
function readOptionValue(argv, index, aliases) {
|
|
35
23
|
const current = argv[index];
|
|
36
24
|
const equalsIndex = current.indexOf('=');
|
|
37
25
|
if (equalsIndex >= 0) {
|
|
@@ -43,11 +31,10 @@ function readOptionValue(argv: string[], index: number, aliases: string[]): stri
|
|
|
43
31
|
}
|
|
44
32
|
return next;
|
|
45
33
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
let
|
|
49
|
-
let
|
|
50
|
-
let tokenValue: string | undefined;
|
|
34
|
+
function parseRemoteOptions(argv) {
|
|
35
|
+
let portValue;
|
|
36
|
+
let workspaceValue;
|
|
37
|
+
let tokenValue;
|
|
51
38
|
for (let index = 0; index < argv.length; index += 1) {
|
|
52
39
|
const arg = argv[index];
|
|
53
40
|
if (arg === '--node-ipc' || arg.startsWith('--clientProcessId=')) {
|
|
@@ -78,7 +65,6 @@ function parseRemoteOptions(argv: string[]): RemoteOptions {
|
|
|
78
65
|
throw new Error(`Unknown option '${arg}'.`);
|
|
79
66
|
}
|
|
80
67
|
}
|
|
81
|
-
|
|
82
68
|
const host = '127.0.0.1';
|
|
83
69
|
const rawPort = Number(portValue ?? process.env.OML_SERVER_PORT ?? '8080');
|
|
84
70
|
const port = Number.isFinite(rawPort) ? Math.max(0, Math.min(65535, Math.trunc(rawPort))) : 8080;
|
|
@@ -86,8 +72,7 @@ function parseRemoteOptions(argv: string[]): RemoteOptions {
|
|
|
86
72
|
const token = tokenValue && tokenValue.length > 0 ? tokenValue : undefined;
|
|
87
73
|
return { host, port, workspaceRoot, token };
|
|
88
74
|
}
|
|
89
|
-
|
|
90
|
-
function startIpcLanguageServerIfAvailable(): { connection: import('vscode-languageserver').Connection; runtime: OmlLanguageServerRuntime } | undefined {
|
|
75
|
+
function startIpcLanguageServerIfAvailable() {
|
|
91
76
|
if (typeof process.send !== 'function') {
|
|
92
77
|
return undefined;
|
|
93
78
|
}
|
|
@@ -100,39 +85,34 @@ function startIpcLanguageServerIfAvailable(): { connection: import('vscode-langu
|
|
|
100
85
|
});
|
|
101
86
|
return { connection, runtime };
|
|
102
87
|
}
|
|
103
|
-
|
|
104
|
-
function workspaceHash(workspaceRoot: string): string {
|
|
88
|
+
function workspaceHash(workspaceRoot) {
|
|
105
89
|
return createHash('sha256').update(path.resolve(workspaceRoot)).digest('hex');
|
|
106
90
|
}
|
|
107
|
-
|
|
108
|
-
function lockFilePathForWorkspace(workspaceRoot: string): string {
|
|
91
|
+
function lockFilePathForWorkspace(workspaceRoot) {
|
|
109
92
|
return path.join(os.homedir(), '.oml', 'workspaces', workspaceHash(workspaceRoot), 'server.lock');
|
|
110
93
|
}
|
|
111
|
-
|
|
112
|
-
async function writeServerLock(workspaceRoot: string, port: number, owner: ServerLockOwner): Promise<string> {
|
|
94
|
+
async function writeServerLock(workspaceRoot, port, owner) {
|
|
113
95
|
const lockFile = lockFilePathForWorkspace(workspaceRoot);
|
|
114
96
|
await fs.mkdir(path.dirname(lockFile), { recursive: true });
|
|
115
97
|
await fs.writeFile(lockFile, JSON.stringify({ port, pid: process.pid, owner }) + '\n', 'utf-8');
|
|
116
98
|
return lockFile;
|
|
117
99
|
}
|
|
118
|
-
|
|
119
|
-
async function removeServerLock(lockFile: string): Promise<void> {
|
|
100
|
+
async function removeServerLock(lockFile) {
|
|
120
101
|
await fs.rm(lockFile, { force: true });
|
|
121
102
|
}
|
|
122
|
-
|
|
123
|
-
function resolveListeningPort(server: import('node:http').Server): number {
|
|
103
|
+
function resolveListeningPort(server) {
|
|
124
104
|
const address = server.address();
|
|
125
105
|
if (!address || typeof address === 'string') {
|
|
126
106
|
throw new Error('Unable to resolve listening port.');
|
|
127
107
|
}
|
|
128
108
|
return address.port;
|
|
129
109
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
let options: RemoteOptions;
|
|
110
|
+
export function runServerCli(argv = process.argv.slice(2)) {
|
|
111
|
+
let options;
|
|
133
112
|
try {
|
|
134
113
|
options = parseRemoteOptions(argv);
|
|
135
|
-
}
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
136
116
|
const message = error instanceof Error ? error.message : String(error);
|
|
137
117
|
process.stderr.write(`[oml-server] REST startup failed: ${message}\n`);
|
|
138
118
|
process.exitCode = 1;
|
|
@@ -140,7 +120,7 @@ export function runServerCli(argv: string[] = process.argv.slice(2)): void {
|
|
|
140
120
|
return;
|
|
141
121
|
}
|
|
142
122
|
const ipcServer = startIpcLanguageServerIfAvailable();
|
|
143
|
-
const owner
|
|
123
|
+
const owner = ipcServer ? 'extension' : 'daemon';
|
|
144
124
|
void startOmlRestServer({
|
|
145
125
|
host: options.host,
|
|
146
126
|
port: options.port,
|
|
@@ -150,7 +130,7 @@ export function runServerCli(argv: string[] = process.argv.slice(2)): void {
|
|
|
150
130
|
runtime: ipcServer?.runtime,
|
|
151
131
|
}).then(async ({ server, updateToken }) => {
|
|
152
132
|
if (ipcServer) {
|
|
153
|
-
ipcServer.connection.onNotification('$/tokenRefreshed', (params
|
|
133
|
+
ipcServer.connection.onNotification('$/tokenRefreshed', (params) => {
|
|
154
134
|
if (params?.accessToken) {
|
|
155
135
|
updateToken(params.accessToken);
|
|
156
136
|
}
|
|
@@ -159,7 +139,7 @@ export function runServerCli(argv: string[] = process.argv.slice(2)): void {
|
|
|
159
139
|
const listeningPort = resolveListeningPort(server);
|
|
160
140
|
const lockFile = await writeServerLock(options.workspaceRoot, listeningPort, owner);
|
|
161
141
|
let shuttingDown = false;
|
|
162
|
-
const shutdown = (exitCode
|
|
142
|
+
const shutdown = (exitCode) => {
|
|
163
143
|
if (shuttingDown) {
|
|
164
144
|
return;
|
|
165
145
|
}
|
|
@@ -170,20 +150,18 @@ export function runServerCli(argv: string[] = process.argv.slice(2)): void {
|
|
|
170
150
|
});
|
|
171
151
|
});
|
|
172
152
|
};
|
|
173
|
-
|
|
174
153
|
process.once('SIGINT', () => shutdown(0));
|
|
175
154
|
process.once('SIGTERM', () => shutdown(0));
|
|
176
155
|
server.once('close', () => {
|
|
177
156
|
void removeServerLock(lockFile);
|
|
178
157
|
});
|
|
179
|
-
|
|
180
158
|
process.stdout.write(`[oml-server] REST listening on http://${options.host}:${listeningPort}\n`);
|
|
181
|
-
}).catch((error
|
|
159
|
+
}).catch((error) => {
|
|
182
160
|
const message = formatStartupError(error, options.host, options.port);
|
|
183
161
|
process.stderr.write(`[oml-server] REST startup failed: ${message}\n`);
|
|
184
162
|
process.exitCode = 1;
|
|
185
163
|
process.exit();
|
|
186
164
|
});
|
|
187
165
|
}
|
|
188
|
-
|
|
189
166
|
runServerCli();
|
|
167
|
+
//# sourceMappingURL=cli.js.map
|
package/out/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/out/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './lsp/language-server.js';
|
|
2
|
+
export * from './lsp/diagram-server.js';
|
|
3
|
+
export * from './rest/server.js';
|
|
4
|
+
export * from './lsp/providers/browser-fs-provider.js';
|
|
5
|
+
export * from './lsp/providers/hybrid-fs-provider.js';
|
|
6
|
+
export * from './lsp/protocol/reasoner-protocol.js';
|
|
7
|
+
export * from './lsp/protocol/browser-fs-protocol.js';
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
// Copyright (c) 2026 Modelware. All rights reserved.
|
|
2
|
-
|
|
3
2
|
export * from './lsp/language-server.js';
|
|
4
3
|
export * from './lsp/diagram-server.js';
|
|
5
4
|
export * from './rest/server.js';
|
|
@@ -7,3 +6,4 @@ export * from './lsp/providers/browser-fs-provider.js';
|
|
|
7
6
|
export * from './lsp/providers/hybrid-fs-provider.js';
|
|
8
7
|
export * from './lsp/protocol/reasoner-protocol.js';
|
|
9
8
|
export * from './lsp/protocol/browser-fs-protocol.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
package/out/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAErD,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wCAAwC,CAAC;AACvD,cAAc,uCAAuC,CAAC;AACtD,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { RequestType } from 'vscode-languageserver-protocol';
|
|
2
|
+
type ConnectionLike = {
|
|
3
|
+
onRequest: (type: RequestType<any, any, any>, handler: (params: any) => any | Promise<any>) => void;
|
|
4
|
+
};
|
|
5
|
+
export declare function registerDiagramRequests(connection: ConnectionLike, shared: any, oml?: any): void;
|
|
6
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Copyright (c) 2026 Modelware. All rights reserved.
|
|
2
|
+
import { computeLaidOutSModelForUri, resolveDefinition, resolveOntologyMemberLabels, } from '@oml/language';
|
|
3
|
+
import { RequestType } from 'vscode-languageserver-protocol';
|
|
4
|
+
const DiagramModelRequest = new RequestType('oml/diagram/model');
|
|
5
|
+
const DefinitionRequest = new RequestType('oml/definition');
|
|
6
|
+
const OntologyLabelsRequest = new RequestType('oml/labels');
|
|
7
|
+
export function registerDiagramRequests(connection, shared, oml) {
|
|
8
|
+
connection.onRequest(DiagramModelRequest, async ({ modelUri }) => {
|
|
9
|
+
try {
|
|
10
|
+
return await computeLaidOutSModelForUri(shared, modelUri);
|
|
11
|
+
}
|
|
12
|
+
catch (err) {
|
|
13
|
+
console.error('[oml] diagram model error', err);
|
|
14
|
+
return { id: 'root', type: 'graph', children: [] };
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
connection.onRequest(DefinitionRequest, async ({ elementId, referencingUri }) => {
|
|
18
|
+
try {
|
|
19
|
+
return await resolveDefinition(shared, elementId, referencingUri);
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
console.error('[oml] definition error', err);
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
connection.onRequest(OntologyLabelsRequest, async ({ modelUri }) => {
|
|
27
|
+
try {
|
|
28
|
+
return await resolveOntologyMemberLabels(shared, oml, modelUri);
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
console.error('[oml] labels error', err);
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=diagram-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagram-server.js","sourceRoot":"","sources":["../../src/lsp/diagram-server.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAGrD,OAAO,EACH,0BAA0B,EAC1B,iBAAiB,EACjB,2BAA2B,GAG9B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAM7D,MAAM,mBAAmB,GAAG,IAAI,WAAW,CAAyC,mBAAmB,CAAC,CAAC;AACzG,MAAM,iBAAiB,GAAG,IAAI,WAAW,CAA6E,gBAAgB,CAAC,CAAC;AACxI,MAAM,qBAAqB,GAAG,IAAI,WAAW,CAAyD,YAAY,CAAC,CAAC;AAEpH,MAAM,UAAU,uBAAuB,CAAC,UAA0B,EAAE,MAAW,EAAE,GAAS;IACtF,UAAU,CAAC,SAAS,CAAC,mBAAmB,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC7D,IAAI,CAAC;YACD,OAAO,MAAM,0BAA0B,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;YAChD,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAA2B,CAAC;QAChF,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,SAAS,CAAC,iBAAiB,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE,EAAE;QAC5E,IAAI,CAAC;YACD,OAAO,MAAM,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;YAC7C,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,SAAS,CAAC,qBAAqB,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC/D,IAAI,CAAC;YACD,OAAO,MAAM,2BAA2B,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;YACzC,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { DefaultSharedModuleContext } from 'langium/lsp';
|
|
2
|
+
import type { Connection } from 'vscode-languageserver';
|
|
3
|
+
export interface OmlLanguageServerStartOptions {
|
|
4
|
+
fileSystem: Omit<DefaultSharedModuleContext, 'connection'>;
|
|
5
|
+
registerDiagramHandlers?: boolean;
|
|
6
|
+
suppressTransientDiagnostics?: boolean;
|
|
7
|
+
installNodeProcessHandlers?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface OmlLanguageServerRuntime {
|
|
10
|
+
shared: any;
|
|
11
|
+
Oml: any;
|
|
12
|
+
}
|
|
13
|
+
export declare function startOmlLanguageServer(connection: Connection, options: OmlLanguageServerStartOptions): OmlLanguageServerRuntime;
|
|
@@ -1,78 +1,29 @@
|
|
|
1
1
|
// Copyright (c) 2026 Modelware. All rights reserved.
|
|
2
|
-
|
|
3
2
|
import { DocumentState, URI } from 'langium';
|
|
4
3
|
import { startLanguageServer } from 'langium/lsp';
|
|
5
|
-
import
|
|
6
|
-
import type { Connection } from 'vscode-languageserver';
|
|
7
|
-
import {
|
|
8
|
-
collectOntologyMembers,
|
|
9
|
-
getIriForNode,
|
|
10
|
-
getOntologyModelIndex,
|
|
11
|
-
iriFragment,
|
|
12
|
-
isDescription,
|
|
13
|
-
isOntology,
|
|
14
|
-
type OmlFuzzyIndexedEntry,
|
|
15
|
-
isVocabulary,
|
|
16
|
-
registerOmlCandidatesRequests,
|
|
17
|
-
registerOmlEditRequests,
|
|
18
|
-
tokenizeForFuzzy,
|
|
19
|
-
} from '@oml/language';
|
|
4
|
+
import { collectOntologyMembers, getIriForNode, getOntologyModelIndex, iriFragment, isDescription, isOntology, isVocabulary, registerOmlCandidatesRequests, registerOmlEditRequests, tokenizeForFuzzy, } from '@oml/language';
|
|
20
5
|
import { createOwlServices, detectSparqlKind, registerShaclValidationRequests } from '@oml/owl';
|
|
21
6
|
import uFuzzy from '@leeoniya/ufuzzy';
|
|
22
|
-
import {
|
|
23
|
-
MarkdownExecutionRequest,
|
|
24
|
-
MarkdownExecutor,
|
|
25
|
-
type MdExecuteBlocksParams,
|
|
26
|
-
type MdExecuteBlocksResult
|
|
27
|
-
} from '@oml/markdown';
|
|
7
|
+
import { MarkdownExecutionRequest, MarkdownExecutor } from '@oml/markdown';
|
|
28
8
|
import { registerDiagramRequests } from './diagram-server.js';
|
|
29
|
-
import {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
type ActiveDocumentParams,
|
|
33
|
-
type FuzzySearchParams,
|
|
34
|
-
type FuzzySearchResult,
|
|
35
|
-
type ResolveModelUriParams,
|
|
36
|
-
type ResolveModelUriResult,
|
|
37
|
-
type SemanticChangedParams,
|
|
38
|
-
type SparqlQueryParams,
|
|
39
|
-
type SparqlQueryResult,
|
|
40
|
-
type SparqlTermDto,
|
|
41
|
-
} from './protocol/reasoner-protocol.js';
|
|
42
|
-
|
|
43
|
-
export interface OmlLanguageServerStartOptions {
|
|
44
|
-
fileSystem: Omit<DefaultSharedModuleContext, 'connection'>;
|
|
45
|
-
registerDiagramHandlers?: boolean;
|
|
46
|
-
suppressTransientDiagnostics?: boolean;
|
|
47
|
-
installNodeProcessHandlers?: boolean;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export interface OmlLanguageServerRuntime {
|
|
51
|
-
shared: any;
|
|
52
|
-
Oml: any;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const workspacePreloadState = new WeakMap<object, { completed: boolean; promise?: Promise<void> }>();
|
|
56
|
-
|
|
57
|
-
function formatError(error: unknown, depth = 0): string {
|
|
9
|
+
import { ReasoningNotifications, ReasoningRequests, } from './protocol/reasoner-protocol.js';
|
|
10
|
+
const workspacePreloadState = new WeakMap();
|
|
11
|
+
function formatError(error, depth = 0) {
|
|
58
12
|
if (!(error instanceof Error)) {
|
|
59
13
|
return String(error);
|
|
60
14
|
}
|
|
61
|
-
|
|
62
15
|
const indent = depth > 0 ? '\n' + ' '.repeat(depth) : '';
|
|
63
16
|
const stack = error.stack ? `${indent}${error.stack}` : `${indent}${error.message}`;
|
|
64
|
-
const cause =
|
|
17
|
+
const cause = error.cause;
|
|
65
18
|
if (cause === undefined) {
|
|
66
19
|
return stack;
|
|
67
20
|
}
|
|
68
21
|
return `${stack}\n${' '.repeat(depth)}cause: ${formatError(cause, depth + 1)}`;
|
|
69
22
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
const logServerError = (scope: string, error: unknown): void => {
|
|
23
|
+
export function startOmlLanguageServer(connection, options) {
|
|
24
|
+
const logServerError = (scope, error) => {
|
|
73
25
|
connection.console.error(`[oml] ${scope}: ${formatError(error)}`);
|
|
74
26
|
};
|
|
75
|
-
|
|
76
27
|
if (options.installNodeProcessHandlers) {
|
|
77
28
|
process.on('unhandledRejection', (reason) => {
|
|
78
29
|
logServerError('Unhandled rejection', reason);
|
|
@@ -81,9 +32,8 @@ export function startOmlLanguageServer(connection: Connection, options: OmlLangu
|
|
|
81
32
|
logServerError('Uncaught exception', error);
|
|
82
33
|
});
|
|
83
34
|
}
|
|
84
|
-
|
|
85
35
|
const sendDiagnostics = connection.sendDiagnostics.bind(connection);
|
|
86
|
-
connection.sendDiagnostics = ((params
|
|
36
|
+
connection.sendDiagnostics = ((params) => {
|
|
87
37
|
if (!params?.uri) {
|
|
88
38
|
return sendDiagnostics(params);
|
|
89
39
|
}
|
|
@@ -91,38 +41,35 @@ export function startOmlLanguageServer(connection: Connection, options: OmlLangu
|
|
|
91
41
|
return sendDiagnostics({ ...params, diagnostics: [] });
|
|
92
42
|
}
|
|
93
43
|
return sendDiagnostics(params);
|
|
94
|
-
})
|
|
95
|
-
|
|
44
|
+
});
|
|
96
45
|
const { shared, Oml } = createOwlServices({ connection, ...options.fileSystem });
|
|
97
|
-
|
|
98
46
|
if (options.registerDiagramHandlers !== false) {
|
|
99
|
-
registerDiagramRequests(connection
|
|
47
|
+
registerDiagramRequests(connection, shared, Oml);
|
|
100
48
|
}
|
|
101
|
-
registerOmlCandidatesRequests(connection
|
|
102
|
-
registerOmlEditRequests(connection
|
|
103
|
-
registerShaclValidationRequests(connection
|
|
104
|
-
|
|
49
|
+
registerOmlCandidatesRequests(connection, shared);
|
|
50
|
+
registerOmlEditRequests(connection, shared);
|
|
51
|
+
registerShaclValidationRequests(connection, Oml);
|
|
105
52
|
{
|
|
106
|
-
const reasoningService = Oml.reasoning.ReasoningService
|
|
107
|
-
reasoningService.onSemanticChanged((modelUris
|
|
108
|
-
const params
|
|
53
|
+
const reasoningService = Oml.reasoning.ReasoningService;
|
|
54
|
+
reasoningService.onSemanticChanged((modelUris) => {
|
|
55
|
+
const params = { modelUris };
|
|
109
56
|
connection.sendNotification(ReasoningNotifications.semanticChanged, params);
|
|
110
57
|
});
|
|
111
58
|
}
|
|
112
|
-
connection.onNotification(ReasoningNotifications.markDocumentActive, ({ modelUri }
|
|
113
|
-
const reasoningService = Oml.reasoning.ReasoningService
|
|
59
|
+
connection.onNotification(ReasoningNotifications.markDocumentActive, ({ modelUri }) => {
|
|
60
|
+
const reasoningService = Oml.reasoning.ReasoningService;
|
|
114
61
|
reasoningService.markDocumentActive(modelUri);
|
|
115
62
|
});
|
|
116
|
-
connection.onNotification(ReasoningNotifications.markDocumentInactive, ({ modelUri }
|
|
117
|
-
const reasoningService = Oml.reasoning.ReasoningService
|
|
63
|
+
connection.onNotification(ReasoningNotifications.markDocumentInactive, ({ modelUri }) => {
|
|
64
|
+
const reasoningService = Oml.reasoning.ReasoningService;
|
|
118
65
|
reasoningService.markDocumentInactive(modelUri);
|
|
119
66
|
});
|
|
120
|
-
connection.onRequest(MarkdownExecutionRequest, async (params
|
|
67
|
+
connection.onRequest(MarkdownExecutionRequest, async (params) => {
|
|
121
68
|
try {
|
|
122
|
-
const reasoningService = Oml.reasoning.ReasoningService
|
|
123
|
-
const ontologyIndex = getOntologyModelIndex(shared
|
|
124
|
-
const knownNamespaceCache = new Map
|
|
125
|
-
const isKnownOntologyIriNamespace = (ontologyIri
|
|
69
|
+
const reasoningService = Oml.reasoning.ReasoningService;
|
|
70
|
+
const ontologyIndex = getOntologyModelIndex(shared);
|
|
71
|
+
const knownNamespaceCache = new Map();
|
|
72
|
+
const isKnownOntologyIriNamespace = (ontologyIri) => {
|
|
126
73
|
const normalized = ontologyIri.trim().replace(/[\/#]+$/, '');
|
|
127
74
|
if (!normalized) {
|
|
128
75
|
return false;
|
|
@@ -148,7 +95,8 @@ export function startOmlLanguageServer(connection: Connection, options: OmlLangu
|
|
|
148
95
|
isKnownOntologyIriNamespace,
|
|
149
96
|
});
|
|
150
97
|
return await executor.executeBlocks(params);
|
|
151
|
-
}
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
152
100
|
logServerError('MarkdownExecutionRequest failed', error);
|
|
153
101
|
return {
|
|
154
102
|
results: params.blocks.map((block) => ({
|
|
@@ -161,9 +109,9 @@ export function startOmlLanguageServer(connection: Connection, options: OmlLangu
|
|
|
161
109
|
};
|
|
162
110
|
}
|
|
163
111
|
});
|
|
164
|
-
connection.onRequest(ReasoningRequests.sparqlQuery, async (params
|
|
112
|
+
connection.onRequest(ReasoningRequests.sparqlQuery, async (params) => {
|
|
165
113
|
try {
|
|
166
|
-
const reasoningService = Oml.reasoning.ReasoningService
|
|
114
|
+
const reasoningService = Oml.reasoning.ReasoningService;
|
|
167
115
|
const kind = detectSparqlKind(params.sparql);
|
|
168
116
|
await reasoningService.ensureQueryContext(params.modelUri);
|
|
169
117
|
const sparqlService = reasoningService.getSparqlService();
|
|
@@ -173,7 +121,7 @@ export function startOmlLanguageServer(connection: Connection, options: OmlLangu
|
|
|
173
121
|
success: result.success,
|
|
174
122
|
kind,
|
|
175
123
|
warnings: result.warnings ?? [],
|
|
176
|
-
rows: result.rows.map((row
|
|
124
|
+
rows: result.rows.map((row) => toRowDto(row)),
|
|
177
125
|
error: result.error,
|
|
178
126
|
};
|
|
179
127
|
}
|
|
@@ -193,7 +141,7 @@ export function startOmlLanguageServer(connection: Connection, options: OmlLangu
|
|
|
193
141
|
success: result.success,
|
|
194
142
|
kind,
|
|
195
143
|
warnings: result.warnings ?? [],
|
|
196
|
-
quads: result.quads.map((quad
|
|
144
|
+
quads: result.quads.map((quad) => ({
|
|
197
145
|
subject: quad.subject.value,
|
|
198
146
|
predicate: quad.predicate.value,
|
|
199
147
|
object: quad.object.value,
|
|
@@ -208,7 +156,8 @@ export function startOmlLanguageServer(connection: Connection, options: OmlLangu
|
|
|
208
156
|
warnings: [],
|
|
209
157
|
error: 'Unsupported or unknown SPARQL query kind.',
|
|
210
158
|
};
|
|
211
|
-
}
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
212
161
|
logServerError('oml/query failed', error);
|
|
213
162
|
return {
|
|
214
163
|
success: false,
|
|
@@ -218,22 +167,21 @@ export function startOmlLanguageServer(connection: Connection, options: OmlLangu
|
|
|
218
167
|
};
|
|
219
168
|
}
|
|
220
169
|
});
|
|
221
|
-
|
|
222
|
-
connection.onRequest(ReasoningRequests.fuzzySearch, async (params: FuzzySearchParams): Promise<FuzzySearchResult> => {
|
|
170
|
+
connection.onRequest(ReasoningRequests.fuzzySearch, async (params) => {
|
|
223
171
|
try {
|
|
224
172
|
const text = (params.text ?? '').trim();
|
|
225
173
|
if (!text) {
|
|
226
174
|
return { success: true, candidates: [] };
|
|
227
175
|
}
|
|
228
176
|
const limit = Math.max(1, Math.min(50, params.limit ?? 12));
|
|
229
|
-
const ontologyIndex = getOntologyModelIndex(shared
|
|
230
|
-
const langiumDocuments
|
|
177
|
+
const ontologyIndex = getOntologyModelIndex(shared);
|
|
178
|
+
const langiumDocuments = shared.workspace.LangiumDocuments;
|
|
231
179
|
const allDocs = langiumDocuments.all ?? [];
|
|
232
|
-
const iterable
|
|
180
|
+
const iterable = Array.isArray(allDocs)
|
|
233
181
|
? allDocs
|
|
234
|
-
: (typeof allDocs?.toArray === 'function' ? allDocs.toArray() : Array.from(allDocs
|
|
235
|
-
const modelUris
|
|
236
|
-
const candidateByIri = new Map
|
|
182
|
+
: (typeof allDocs?.toArray === 'function' ? allDocs.toArray() : Array.from(allDocs));
|
|
183
|
+
const modelUris = [];
|
|
184
|
+
const candidateByIri = new Map();
|
|
237
185
|
for (const doc of iterable) {
|
|
238
186
|
const root = doc?.parseResult?.value;
|
|
239
187
|
if (!root || !isOntology(root) || (!isVocabulary(root) && !isDescription(root))) {
|
|
@@ -254,8 +202,7 @@ export function startOmlLanguageServer(connection: Connection, options: OmlLangu
|
|
|
254
202
|
entry.label = label;
|
|
255
203
|
candidateByIri.set(iri, entry);
|
|
256
204
|
}
|
|
257
|
-
|
|
258
|
-
const indexedEntries: OmlFuzzyIndexedEntry[] = [...candidateByIri.values()].map((entry) => ({
|
|
205
|
+
const indexedEntries = [...candidateByIri.values()].map((entry) => ({
|
|
259
206
|
iri: entry.iri,
|
|
260
207
|
label: entry.label,
|
|
261
208
|
fragment: iriFragment(entry.iri),
|
|
@@ -271,11 +218,11 @@ export function startOmlLanguageServer(connection: Connection, options: OmlLangu
|
|
|
271
218
|
const info = uf.info(filtered, haystack, text);
|
|
272
219
|
const order = info ? uf.sort(info, haystack, text) : null;
|
|
273
220
|
const ranked = (order ?? filtered.map((_, index) => index))
|
|
274
|
-
.map((index) => filtered[index]
|
|
221
|
+
.map((index) => filtered[index])
|
|
275
222
|
.slice(0, limit);
|
|
276
223
|
const queryTokens = tokenizeForFuzzy(text).slice(0, 6);
|
|
277
224
|
const candidates = ranked.map((entryIndex, index) => {
|
|
278
|
-
const entry = indexedEntries[entryIndex]
|
|
225
|
+
const entry = indexedEntries[entryIndex];
|
|
279
226
|
const fragment = entry.fragment.toLowerCase();
|
|
280
227
|
const lowerLabel = (entry.label ?? '').toLowerCase();
|
|
281
228
|
const lowerInput = text.toLowerCase();
|
|
@@ -308,13 +255,13 @@ export function startOmlLanguageServer(connection: Connection, options: OmlLangu
|
|
|
308
255
|
};
|
|
309
256
|
});
|
|
310
257
|
return { success: true, candidates };
|
|
311
|
-
}
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
312
260
|
logServerError('oml/fuzzysearch failed', error);
|
|
313
261
|
return { success: false, candidates: [], error: error instanceof Error ? error.message : String(error) };
|
|
314
262
|
}
|
|
315
263
|
});
|
|
316
|
-
|
|
317
|
-
connection.onRequest(ReasoningRequests.resolveModelUri, async (params: ResolveModelUriParams): Promise<ResolveModelUriResult> => {
|
|
264
|
+
connection.onRequest(ReasoningRequests.resolveModelUri, async (params) => {
|
|
318
265
|
await ensureWorkspaceIndexed(shared);
|
|
319
266
|
const ontologyIri = typeof params?.ontologyIri === 'string' ? params.ontologyIri.trim() : '';
|
|
320
267
|
if (!ontologyIri) {
|
|
@@ -324,38 +271,35 @@ export function startOmlLanguageServer(connection: Connection, options: OmlLangu
|
|
|
324
271
|
? params.referencingUri.trim()
|
|
325
272
|
: undefined;
|
|
326
273
|
const normalized = normalizeOntologyIri(ontologyIri);
|
|
327
|
-
const ontologyIndex = getOntologyModelIndex(shared
|
|
274
|
+
const ontologyIndex = getOntologyModelIndex(shared);
|
|
328
275
|
const modelUri = ontologyIndex.resolveModelUri(normalized, referencingUri);
|
|
329
276
|
if (modelUri) {
|
|
330
277
|
await ensureResolvedModelDocumentLoaded(shared, modelUri);
|
|
331
278
|
}
|
|
332
279
|
return modelUri ? { modelUri } : {};
|
|
333
280
|
});
|
|
334
|
-
|
|
335
281
|
startLanguageServer(shared, {
|
|
336
282
|
CodeActionProvider: DocumentState.IndexedReferences
|
|
337
283
|
});
|
|
338
284
|
return { shared, Oml };
|
|
339
285
|
}
|
|
340
|
-
|
|
341
|
-
function normalizeOntologyIri(value: string): string {
|
|
286
|
+
function normalizeOntologyIri(value) {
|
|
342
287
|
return value.replace(/^<|>$/g, '').replace(/[\/#]+$/, '');
|
|
343
288
|
}
|
|
344
|
-
|
|
345
|
-
function isTransientDiagnosticsUri(uri: string): boolean {
|
|
289
|
+
function isTransientDiagnosticsUri(uri) {
|
|
346
290
|
try {
|
|
347
291
|
const scheme = URI.parse(uri).scheme;
|
|
348
292
|
return scheme === 'git'
|
|
349
293
|
|| scheme === 'chat-editing-text-model'
|
|
350
294
|
|| scheme === 'chat-editing-snapshot-text-model'
|
|
351
295
|
|| scheme === 'vscode-chat-code-block';
|
|
352
|
-
}
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
353
298
|
return false;
|
|
354
299
|
}
|
|
355
300
|
}
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
const key = sharedServices as object;
|
|
301
|
+
async function ensureWorkspaceIndexed(sharedServices) {
|
|
302
|
+
const key = sharedServices;
|
|
359
303
|
const existing = workspacePreloadState.get(key);
|
|
360
304
|
if (existing?.completed) {
|
|
361
305
|
return;
|
|
@@ -371,7 +315,7 @@ async function ensureWorkspaceIndexed(sharedServices: any): Promise<void> {
|
|
|
371
315
|
const builder = sharedServices.workspace.DocumentBuilder;
|
|
372
316
|
await workspace.ready;
|
|
373
317
|
const folderUris = workspace.workspaceFolders ?? [];
|
|
374
|
-
const omlUris = new Set
|
|
318
|
+
const omlUris = new Set();
|
|
375
319
|
for (const folder of folderUris) {
|
|
376
320
|
const entries = await workspace.searchFolder(URI.parse(folder.uri));
|
|
377
321
|
for (const entry of entries) {
|
|
@@ -382,9 +326,7 @@ async function ensureWorkspaceIndexed(sharedServices: any): Promise<void> {
|
|
|
382
326
|
}
|
|
383
327
|
}
|
|
384
328
|
if (omlUris.size > 0) {
|
|
385
|
-
const docs = await Promise.all(
|
|
386
|
-
[...omlUris].map((uri) => documents.getOrCreateDocument(URI.parse(uri)))
|
|
387
|
-
);
|
|
329
|
+
const docs = await Promise.all([...omlUris].map((uri) => documents.getOrCreateDocument(URI.parse(uri))));
|
|
388
330
|
await builder.build(docs, { validation: { categories: ['built-in', 'fast'] } });
|
|
389
331
|
}
|
|
390
332
|
state.completed = true;
|
|
@@ -395,22 +337,21 @@ async function ensureWorkspaceIndexed(sharedServices: any): Promise<void> {
|
|
|
395
337
|
workspacePreloadState.set(key, state);
|
|
396
338
|
await promise;
|
|
397
339
|
}
|
|
398
|
-
|
|
399
|
-
async function ensureResolvedModelDocumentLoaded(sharedServices: any, modelUri: string): Promise<void> {
|
|
340
|
+
async function ensureResolvedModelDocumentLoaded(sharedServices, modelUri) {
|
|
400
341
|
try {
|
|
401
342
|
const documents = sharedServices.workspace.LangiumDocuments;
|
|
402
343
|
const uri = URI.parse(modelUri);
|
|
403
344
|
if (!documents.getDocument(uri)) {
|
|
404
345
|
await documents.getOrCreateDocument(uri);
|
|
405
346
|
}
|
|
406
|
-
}
|
|
347
|
+
}
|
|
348
|
+
catch {
|
|
407
349
|
// Resolution must stay deterministic and non-throwing;
|
|
408
350
|
// loading failures are surfaced later by query/edit operations.
|
|
409
351
|
}
|
|
410
352
|
}
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
const result: Record<string, SparqlTermDto> = {};
|
|
353
|
+
function toRowDto(row) {
|
|
354
|
+
const result = {};
|
|
414
355
|
for (const [name, term] of row.entries()) {
|
|
415
356
|
result[name] = {
|
|
416
357
|
termType: term.termType,
|
|
@@ -421,3 +362,4 @@ function toRowDto(row: Map<string, any>): Record<string, SparqlTermDto> {
|
|
|
421
362
|
}
|
|
422
363
|
return result;
|
|
423
364
|
}
|
|
365
|
+
//# sourceMappingURL=language-server.js.map
|