@oml/server 0.14.0 → 0.14.2
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/auth/feature-gate.d.ts +23 -0
- package/out/auth/feature-gate.js +172 -0
- package/out/auth/feature-gate.js.map +1 -0
- package/out/auth/feature-policy.d.ts +13 -0
- package/out/auth/feature-policy.js +38 -0
- package/out/auth/feature-policy.js.map +1 -0
- package/out/cli.d.ts +1 -0
- package/{src/cli.ts → out/cli.js} +45 -55
- 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 +15 -0
- package/{src/lsp/language-server.ts → out/lsp/language-server.js} +95 -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 +47 -0
- package/{src/rest/routes.ts → out/rest/routes.js} +40 -35
- package/out/rest/routes.js.map +1 -0
- package/out/rest/server.d.ts +17 -0
- package/{src/rest/server.ts → out/rest/server.js} +232 -485
- 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
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type OmlFeatureGateLike } from './feature-policy.js';
|
|
2
|
+
export declare class OmlFeatureGate implements OmlFeatureGateLike {
|
|
3
|
+
private currentAccessToken?;
|
|
4
|
+
private readonly apiBaseUrl;
|
|
5
|
+
private readonly tool;
|
|
6
|
+
private runtimeToken?;
|
|
7
|
+
private client;
|
|
8
|
+
private readonly storage;
|
|
9
|
+
private initPromise?;
|
|
10
|
+
constructor(options?: {
|
|
11
|
+
apiBaseUrl?: string;
|
|
12
|
+
initialAccessToken?: string;
|
|
13
|
+
tool?: string;
|
|
14
|
+
});
|
|
15
|
+
setAccessToken(token: string | undefined): void;
|
|
16
|
+
getAccessToken(): string | undefined;
|
|
17
|
+
primeEntitlements(tokenOverride?: string): Promise<void>;
|
|
18
|
+
requireFeature(featureId: string): Promise<void>;
|
|
19
|
+
runWithFeature<T>(featureId: string, action: () => Promise<T>, metadata?: Record<string, unknown>): Promise<T>;
|
|
20
|
+
dispose(): Promise<void>;
|
|
21
|
+
private ensureRuntime;
|
|
22
|
+
private reinitializeClient;
|
|
23
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
// Copyright (c) 2026 Modelware. All rights reserved.
|
|
2
|
+
import { OmlClient } from '@oml/platform';
|
|
3
|
+
import { OmlAccessError } from './feature-policy.js';
|
|
4
|
+
const DEFAULT_API_BASE_URL = 'https://oml-platform-worker.melaasar.workers.dev';
|
|
5
|
+
export class OmlFeatureGate {
|
|
6
|
+
constructor(options) {
|
|
7
|
+
this.client = null;
|
|
8
|
+
this.storage = new InMemoryTokenStorage();
|
|
9
|
+
this.apiBaseUrl = normalizeApiBaseUrl(options?.apiBaseUrl);
|
|
10
|
+
this.currentAccessToken = normalizeToken(options?.initialAccessToken);
|
|
11
|
+
this.tool = normalizeTool(options?.tool);
|
|
12
|
+
}
|
|
13
|
+
setAccessToken(token) {
|
|
14
|
+
const normalized = normalizeToken(token);
|
|
15
|
+
const changed = normalized !== this.currentAccessToken;
|
|
16
|
+
this.currentAccessToken = normalized;
|
|
17
|
+
if (changed) {
|
|
18
|
+
this.runtimeToken = undefined;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
getAccessToken() {
|
|
22
|
+
return this.currentAccessToken;
|
|
23
|
+
}
|
|
24
|
+
async primeEntitlements(tokenOverride) {
|
|
25
|
+
const accessToken = normalizeToken(tokenOverride) ?? this.currentAccessToken;
|
|
26
|
+
await this.ensureRuntime(accessToken);
|
|
27
|
+
}
|
|
28
|
+
async requireFeature(featureId) {
|
|
29
|
+
const accessToken = this.currentAccessToken;
|
|
30
|
+
const client = await this.ensureRuntime(accessToken);
|
|
31
|
+
if (!client.hasFeature(featureId)) {
|
|
32
|
+
throw new OmlAccessError(`Feature '${featureId}' is not enabled for this account.`, 403, 'FORBIDDEN');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async runWithFeature(featureId, action, metadata) {
|
|
36
|
+
const accessToken = this.currentAccessToken;
|
|
37
|
+
const client = await this.ensureRuntime(accessToken);
|
|
38
|
+
if (!client.hasFeature(featureId)) {
|
|
39
|
+
throw new OmlAccessError(`Feature '${featureId}' is not enabled for this account.`, 403, 'FORBIDDEN');
|
|
40
|
+
}
|
|
41
|
+
const done = client.trackInvocation(featureId, metadata);
|
|
42
|
+
try {
|
|
43
|
+
const result = await action();
|
|
44
|
+
done();
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
done(error);
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async dispose() {
|
|
53
|
+
if (this.initPromise) {
|
|
54
|
+
try {
|
|
55
|
+
await this.initPromise;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// ignore init failure during disposal
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const activeClient = this.client;
|
|
62
|
+
this.client = null;
|
|
63
|
+
this.runtimeToken = undefined;
|
|
64
|
+
if (activeClient) {
|
|
65
|
+
await activeClient.dispose();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async ensureRuntime(accessToken) {
|
|
69
|
+
const token = normalizeToken(accessToken);
|
|
70
|
+
if (!token) {
|
|
71
|
+
throw new OmlAccessError('OML server access requires authentication. Log in to continue.', 401, 'UNAUTHORIZED');
|
|
72
|
+
}
|
|
73
|
+
if (this.client && this.runtimeToken === token) {
|
|
74
|
+
return this.client;
|
|
75
|
+
}
|
|
76
|
+
if (this.initPromise) {
|
|
77
|
+
await this.initPromise;
|
|
78
|
+
if (this.client && this.runtimeToken === token) {
|
|
79
|
+
return this.client;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
this.initPromise = this.reinitializeClient(token).finally(() => {
|
|
83
|
+
this.initPromise = undefined;
|
|
84
|
+
});
|
|
85
|
+
await this.initPromise;
|
|
86
|
+
if (!this.client || this.runtimeToken !== token) {
|
|
87
|
+
throw new Error('Failed to initialize OML platform runtime.');
|
|
88
|
+
}
|
|
89
|
+
return this.client;
|
|
90
|
+
}
|
|
91
|
+
async reinitializeClient(token) {
|
|
92
|
+
this.storage.setToken(token);
|
|
93
|
+
const previous = this.client;
|
|
94
|
+
this.client = null;
|
|
95
|
+
this.runtimeToken = undefined;
|
|
96
|
+
if (previous) {
|
|
97
|
+
await previous.dispose();
|
|
98
|
+
}
|
|
99
|
+
const config = {
|
|
100
|
+
apiBaseUrl: this.apiBaseUrl,
|
|
101
|
+
tool: this.tool,
|
|
102
|
+
storage: this.storage,
|
|
103
|
+
auth: {
|
|
104
|
+
method: 'oauth',
|
|
105
|
+
getToken: async () => this.storage.getToken(),
|
|
106
|
+
refreshToken: async () => {
|
|
107
|
+
throw new OmlAccessError('OML server session expired. Refresh authentication and try again.', 401, 'UNAUTHORIZED');
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
debug: false,
|
|
111
|
+
};
|
|
112
|
+
const client = new OmlClient(config);
|
|
113
|
+
try {
|
|
114
|
+
await client.initialize();
|
|
115
|
+
if (this.currentAccessToken !== token) {
|
|
116
|
+
await client.dispose();
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
this.client = client;
|
|
120
|
+
this.runtimeToken = token;
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
await client.dispose().catch(() => undefined);
|
|
124
|
+
if (error instanceof OmlAccessError) {
|
|
125
|
+
throw error;
|
|
126
|
+
}
|
|
127
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
128
|
+
if (message.includes('401')) {
|
|
129
|
+
throw new OmlAccessError('OML server access requires authentication. Log in to continue.', 401, 'UNAUTHORIZED');
|
|
130
|
+
}
|
|
131
|
+
if (message.includes('403')) {
|
|
132
|
+
throw new OmlAccessError('Authenticated, but permission was denied by OML Platform.', 403, 'FORBIDDEN');
|
|
133
|
+
}
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function normalizeToken(value) {
|
|
139
|
+
const trimmed = typeof value === 'string' ? value.trim() : '';
|
|
140
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
141
|
+
}
|
|
142
|
+
function normalizeApiBaseUrl(value) {
|
|
143
|
+
const trimmed = typeof value === 'string' ? value.trim() : '';
|
|
144
|
+
const base = trimmed.length > 0 ? trimmed : DEFAULT_API_BASE_URL;
|
|
145
|
+
return base.replace(/\/+$/, '');
|
|
146
|
+
}
|
|
147
|
+
function normalizeTool(value) {
|
|
148
|
+
const trimmed = typeof value === 'string' ? value.trim() : '';
|
|
149
|
+
return trimmed.length > 0 ? trimmed : 'oml-cli';
|
|
150
|
+
}
|
|
151
|
+
class InMemoryTokenStorage {
|
|
152
|
+
constructor() {
|
|
153
|
+
this.entries = new Map();
|
|
154
|
+
}
|
|
155
|
+
async get(key) {
|
|
156
|
+
return this.entries.get(key) ?? null;
|
|
157
|
+
}
|
|
158
|
+
async set(key, value) {
|
|
159
|
+
this.entries.set(key, value);
|
|
160
|
+
}
|
|
161
|
+
async delete(key) {
|
|
162
|
+
this.entries.delete(key);
|
|
163
|
+
}
|
|
164
|
+
setToken(token) {
|
|
165
|
+
this.entries.set(InMemoryTokenStorage.AccessTokenKey, token);
|
|
166
|
+
}
|
|
167
|
+
getToken() {
|
|
168
|
+
return this.entries.get(InMemoryTokenStorage.AccessTokenKey) ?? '';
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
InMemoryTokenStorage.AccessTokenKey = 'access_token';
|
|
172
|
+
//# sourceMappingURL=feature-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-gate.js","sourceRoot":"","sources":["../../src/auth/feature-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class OmlAccessError extends Error {
|
|
2
|
+
readonly statusCode: number;
|
|
3
|
+
readonly code: 'UNAUTHORIZED' | 'FORBIDDEN';
|
|
4
|
+
constructor(message: string, statusCode: number, code: 'UNAUTHORIZED' | 'FORBIDDEN');
|
|
5
|
+
}
|
|
6
|
+
export interface OmlFeatureGateLike {
|
|
7
|
+
setAccessToken(token: string | undefined): void;
|
|
8
|
+
primeEntitlements(tokenOverride?: string): Promise<void>;
|
|
9
|
+
runWithFeature<T>(featureId: string, action: () => Promise<T>, metadata?: Record<string, unknown>): Promise<T>;
|
|
10
|
+
dispose(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export declare function requiredFeatureForRestOperation(operationId: string): string | undefined;
|
|
13
|
+
export declare function requiredFeatureForLspMethod(method: string): string | undefined;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// Copyright (c) 2026 Modelware. All rights reserved.
|
|
2
|
+
const REST_FEATURES_BY_OPERATION = {
|
|
3
|
+
query: 'oml-text',
|
|
4
|
+
update: 'oml-update',
|
|
5
|
+
fuzzysearch: 'oml-text',
|
|
6
|
+
lint: 'oml-lint',
|
|
7
|
+
reason: 'oml-reason',
|
|
8
|
+
validate: 'oml-validate',
|
|
9
|
+
render: 'oml-render',
|
|
10
|
+
export: 'oml-export',
|
|
11
|
+
};
|
|
12
|
+
const LSP_FEATURES_BY_METHOD = {
|
|
13
|
+
'oml/query': 'oml-text',
|
|
14
|
+
'oml/fuzzysearch': 'oml-text',
|
|
15
|
+
'oml/resolveModelUri': 'oml-text',
|
|
16
|
+
'oml/completion': 'oml-text',
|
|
17
|
+
'oml/update': 'oml-update',
|
|
18
|
+
'oml/validate': 'oml-validate',
|
|
19
|
+
'oml/markdown': 'oml-markdown',
|
|
20
|
+
'oml/diagram/model': 'oml-diagram',
|
|
21
|
+
'oml/definition': 'oml-text',
|
|
22
|
+
'oml/labels': 'oml-text',
|
|
23
|
+
};
|
|
24
|
+
export class OmlAccessError extends Error {
|
|
25
|
+
constructor(message, statusCode, code) {
|
|
26
|
+
super(message);
|
|
27
|
+
this.name = 'OmlAccessError';
|
|
28
|
+
this.statusCode = statusCode;
|
|
29
|
+
this.code = code;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function requiredFeatureForRestOperation(operationId) {
|
|
33
|
+
return REST_FEATURES_BY_OPERATION[operationId];
|
|
34
|
+
}
|
|
35
|
+
export function requiredFeatureForLspMethod(method) {
|
|
36
|
+
return LSP_FEATURES_BY_METHOD[method];
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=feature-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-policy.js","sourceRoot":"","sources":["../../src/auth/feature-policy.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAErD,MAAM,0BAA0B,GAA2B;IACvD,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,YAAY;IACpB,WAAW,EAAE,UAAU;IACvB,IAAI,EAAE,UAAU;IAChB,MAAM,EAAE,YAAY;IACpB,QAAQ,EAAE,cAAc;IACxB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,YAAY;CACvB,CAAC;AAEF,MAAM,sBAAsB,GAA2B;IACnD,WAAW,EAAE,UAAU;IACvB,iBAAiB,EAAE,UAAU;IAC7B,qBAAqB,EAAE,UAAU;IACjC,gBAAgB,EAAE,UAAU;IAC5B,YAAY,EAAE,YAAY;IAC1B,cAAc,EAAE,cAAc;IAC9B,cAAc,EAAE,cAAc;IAC9B,mBAAmB,EAAE,aAAa;IAClC,gBAAgB,EAAE,UAAU;IAC5B,YAAY,EAAE,UAAU;CAC3B,CAAC;AAEF,MAAM,OAAO,cAAe,SAAQ,KAAK;IAIrC,YAAY,OAAe,EAAE,UAAkB,EAAE,IAAkC;QAC/E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;CACJ;AAaD,MAAM,UAAU,+BAA+B,CAAC,WAAmB;IAC/D,OAAO,0BAA0B,CAAC,WAAW,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,MAAc;IACtD,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC"}
|
package/out/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runServerCli(argv?: string[]): void;
|
|
@@ -1,26 +1,16 @@
|
|
|
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
|
-
|
|
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
|
+
import { OmlFeatureGate } from './auth/feature-gate.js';
|
|
11
|
+
function formatStartupError(error, host, port) {
|
|
22
12
|
if (error && typeof error === 'object' && 'code' in error) {
|
|
23
|
-
const code =
|
|
13
|
+
const code = error.code;
|
|
24
14
|
if (code === 'EADDRINUSE') {
|
|
25
15
|
return `Port ${port} is already in use on ${host}.`;
|
|
26
16
|
}
|
|
@@ -30,8 +20,7 @@ function formatStartupError(error: unknown, host: string, port: number): string
|
|
|
30
20
|
}
|
|
31
21
|
return error instanceof Error ? error.message : String(error);
|
|
32
22
|
}
|
|
33
|
-
|
|
34
|
-
function readOptionValue(argv: string[], index: number, aliases: string[]): string {
|
|
23
|
+
function readOptionValue(argv, index, aliases) {
|
|
35
24
|
const current = argv[index];
|
|
36
25
|
const equalsIndex = current.indexOf('=');
|
|
37
26
|
if (equalsIndex >= 0) {
|
|
@@ -43,11 +32,10 @@ function readOptionValue(argv: string[], index: number, aliases: string[]): stri
|
|
|
43
32
|
}
|
|
44
33
|
return next;
|
|
45
34
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
let
|
|
49
|
-
let
|
|
50
|
-
let tokenValue: string | undefined;
|
|
35
|
+
function parseRemoteOptions(argv) {
|
|
36
|
+
let portValue;
|
|
37
|
+
let workspaceValue;
|
|
38
|
+
let tokenValue;
|
|
51
39
|
for (let index = 0; index < argv.length; index += 1) {
|
|
52
40
|
const arg = argv[index];
|
|
53
41
|
if (arg === '--node-ipc' || arg.startsWith('--clientProcessId=')) {
|
|
@@ -78,7 +66,6 @@ function parseRemoteOptions(argv: string[]): RemoteOptions {
|
|
|
78
66
|
throw new Error(`Unknown option '${arg}'.`);
|
|
79
67
|
}
|
|
80
68
|
}
|
|
81
|
-
|
|
82
69
|
const host = '127.0.0.1';
|
|
83
70
|
const rawPort = Number(portValue ?? process.env.OML_SERVER_PORT ?? '8080');
|
|
84
71
|
const port = Number.isFinite(rawPort) ? Math.max(0, Math.min(65535, Math.trunc(rawPort))) : 8080;
|
|
@@ -86,8 +73,7 @@ function parseRemoteOptions(argv: string[]): RemoteOptions {
|
|
|
86
73
|
const token = tokenValue && tokenValue.length > 0 ? tokenValue : undefined;
|
|
87
74
|
return { host, port, workspaceRoot, token };
|
|
88
75
|
}
|
|
89
|
-
|
|
90
|
-
function startIpcLanguageServerIfAvailable(): { connection: import('vscode-languageserver').Connection; runtime: OmlLanguageServerRuntime } | undefined {
|
|
76
|
+
function startIpcLanguageServerIfAvailable(featureGate) {
|
|
91
77
|
if (typeof process.send !== 'function') {
|
|
92
78
|
return undefined;
|
|
93
79
|
}
|
|
@@ -97,69 +83,75 @@ function startIpcLanguageServerIfAvailable(): { connection: import('vscode-langu
|
|
|
97
83
|
registerDiagramHandlers: true,
|
|
98
84
|
suppressTransientDiagnostics: true,
|
|
99
85
|
installNodeProcessHandlers: true,
|
|
86
|
+
featureGate,
|
|
100
87
|
});
|
|
101
88
|
return { connection, runtime };
|
|
102
89
|
}
|
|
103
|
-
|
|
104
|
-
function workspaceHash(workspaceRoot: string): string {
|
|
90
|
+
function workspaceHash(workspaceRoot) {
|
|
105
91
|
return createHash('sha256').update(path.resolve(workspaceRoot)).digest('hex');
|
|
106
92
|
}
|
|
107
|
-
|
|
108
|
-
function lockFilePathForWorkspace(workspaceRoot: string): string {
|
|
93
|
+
function lockFilePathForWorkspace(workspaceRoot) {
|
|
109
94
|
return path.join(os.homedir(), '.oml', 'workspaces', workspaceHash(workspaceRoot), 'server.lock');
|
|
110
95
|
}
|
|
111
|
-
|
|
112
|
-
async function writeServerLock(workspaceRoot: string, port: number, owner: ServerLockOwner): Promise<string> {
|
|
96
|
+
async function writeServerLock(workspaceRoot, port, owner) {
|
|
113
97
|
const lockFile = lockFilePathForWorkspace(workspaceRoot);
|
|
114
98
|
await fs.mkdir(path.dirname(lockFile), { recursive: true });
|
|
115
99
|
await fs.writeFile(lockFile, JSON.stringify({ port, pid: process.pid, owner }) + '\n', 'utf-8');
|
|
116
100
|
return lockFile;
|
|
117
101
|
}
|
|
118
|
-
|
|
119
|
-
async function removeServerLock(lockFile: string): Promise<void> {
|
|
102
|
+
async function removeServerLock(lockFile) {
|
|
120
103
|
await fs.rm(lockFile, { force: true });
|
|
121
104
|
}
|
|
122
|
-
|
|
123
|
-
function resolveListeningPort(server: import('node:http').Server): number {
|
|
105
|
+
function resolveListeningPort(server) {
|
|
124
106
|
const address = server.address();
|
|
125
107
|
if (!address || typeof address === 'string') {
|
|
126
108
|
throw new Error('Unable to resolve listening port.');
|
|
127
109
|
}
|
|
128
110
|
return address.port;
|
|
129
111
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
let options: RemoteOptions;
|
|
112
|
+
export function runServerCli(argv = process.argv.slice(2)) {
|
|
113
|
+
let options;
|
|
133
114
|
try {
|
|
134
115
|
options = parseRemoteOptions(argv);
|
|
135
|
-
}
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
136
118
|
const message = error instanceof Error ? error.message : String(error);
|
|
137
119
|
process.stderr.write(`[oml-server] REST startup failed: ${message}\n`);
|
|
138
120
|
process.exitCode = 1;
|
|
139
121
|
process.exit();
|
|
140
122
|
return;
|
|
141
123
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
124
|
+
void (async () => {
|
|
125
|
+
const runtimeTool = typeof process.send === 'function' ? 'oml-code' : 'oml-cli';
|
|
126
|
+
const featureGate = new OmlFeatureGate({ initialAccessToken: options.token, tool: runtimeTool });
|
|
127
|
+
if (options.token) {
|
|
128
|
+
await featureGate.primeEntitlements();
|
|
129
|
+
}
|
|
130
|
+
const ipcServer = startIpcLanguageServerIfAvailable(featureGate);
|
|
131
|
+
const owner = ipcServer ? 'extension' : 'daemon';
|
|
132
|
+
const { server, updateToken } = await startOmlRestServer({
|
|
133
|
+
host: options.host,
|
|
134
|
+
port: options.port,
|
|
135
|
+
workspaceRoot: options.workspaceRoot,
|
|
136
|
+
watchWorkspace: true,
|
|
137
|
+
authToken: options.token,
|
|
138
|
+
runtime: ipcServer?.runtime,
|
|
139
|
+
featureGate,
|
|
140
|
+
});
|
|
152
141
|
if (ipcServer) {
|
|
153
|
-
ipcServer.connection.onNotification('$/tokenRefreshed', (params
|
|
142
|
+
ipcServer.connection.onNotification('$/tokenRefreshed', (params) => {
|
|
154
143
|
if (params?.accessToken) {
|
|
155
|
-
updateToken(params.accessToken)
|
|
144
|
+
void updateToken(params.accessToken).catch((error) => {
|
|
145
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
146
|
+
process.stderr.write(`[oml-server] token refresh entitlement sync failed: ${message}\n`);
|
|
147
|
+
});
|
|
156
148
|
}
|
|
157
149
|
});
|
|
158
150
|
}
|
|
159
151
|
const listeningPort = resolveListeningPort(server);
|
|
160
152
|
const lockFile = await writeServerLock(options.workspaceRoot, listeningPort, owner);
|
|
161
153
|
let shuttingDown = false;
|
|
162
|
-
const shutdown = (exitCode
|
|
154
|
+
const shutdown = (exitCode) => {
|
|
163
155
|
if (shuttingDown) {
|
|
164
156
|
return;
|
|
165
157
|
}
|
|
@@ -170,20 +162,18 @@ export function runServerCli(argv: string[] = process.argv.slice(2)): void {
|
|
|
170
162
|
});
|
|
171
163
|
});
|
|
172
164
|
};
|
|
173
|
-
|
|
174
165
|
process.once('SIGINT', () => shutdown(0));
|
|
175
166
|
process.once('SIGTERM', () => shutdown(0));
|
|
176
167
|
server.once('close', () => {
|
|
177
168
|
void removeServerLock(lockFile);
|
|
178
169
|
});
|
|
179
|
-
|
|
180
170
|
process.stdout.write(`[oml-server] REST listening on http://${options.host}:${listeningPort}\n`);
|
|
181
|
-
}).catch((error
|
|
171
|
+
})().catch((error) => {
|
|
182
172
|
const message = formatStartupError(error, options.host, options.port);
|
|
183
173
|
process.stderr.write(`[oml-server] REST startup failed: ${message}\n`);
|
|
184
174
|
process.exitCode = 1;
|
|
185
175
|
process.exit();
|
|
186
176
|
});
|
|
187
177
|
}
|
|
188
|
-
|
|
189
178
|
runServerCli();
|
|
179
|
+
//# 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,15 @@
|
|
|
1
|
+
import type { DefaultSharedModuleContext } from 'langium/lsp';
|
|
2
|
+
import type { Connection } from 'vscode-languageserver';
|
|
3
|
+
import { type OmlFeatureGateLike } from '../auth/feature-policy.js';
|
|
4
|
+
export interface OmlLanguageServerStartOptions {
|
|
5
|
+
fileSystem: Omit<DefaultSharedModuleContext, 'connection'>;
|
|
6
|
+
registerDiagramHandlers?: boolean;
|
|
7
|
+
suppressTransientDiagnostics?: boolean;
|
|
8
|
+
installNodeProcessHandlers?: boolean;
|
|
9
|
+
featureGate?: OmlFeatureGateLike;
|
|
10
|
+
}
|
|
11
|
+
export interface OmlLanguageServerRuntime {
|
|
12
|
+
shared: any;
|
|
13
|
+
Oml: any;
|
|
14
|
+
}
|
|
15
|
+
export declare function startOmlLanguageServer(connection: Connection, options: OmlLanguageServerStartOptions): OmlLanguageServerRuntime;
|