@finos/legend-extension-dsl-data-space 10.4.231 → 10.4.232
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/lib/__lib__/DSL_DataSpace_Event.d.ts +2 -1
- package/lib/__lib__/DSL_DataSpace_Event.d.ts.map +1 -1
- package/lib/__lib__/DSL_DataSpace_Event.js +1 -0
- package/lib/__lib__/DSL_DataSpace_Event.js.map +1 -1
- package/lib/components/DataSpaceLegendAIIntegration.d.ts +17 -1
- package/lib/components/DataSpaceLegendAIIntegration.d.ts.map +1 -1
- package/lib/components/DataSpaceLegendAIIntegration.js +243 -17
- package/lib/components/DataSpaceLegendAIIntegration.js.map +1 -1
- package/lib/index.css +1 -1
- package/lib/package.json +1 -1
- package/package.json +6 -6
- package/src/__lib__/DSL_DataSpace_Event.ts +1 -0
- package/src/components/DataSpaceLegendAIIntegration.tsx +329 -15
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
export declare enum DSL_DATASPACE_EVENT {
|
|
17
17
|
BUILD_ANALYTICS_RESULT = "dataProduct.builder.analytics-result",
|
|
18
|
-
ERROR_GENERATE_SAMPLE_VALUES = "dataProduct.error.build-sample-values"
|
|
18
|
+
ERROR_GENERATE_SAMPLE_VALUES = "dataProduct.error.build-sample-values",
|
|
19
|
+
ERROR_EXTRACT_LEGEND_AI_SERVICES = "dataProduct.error.extract-legend-ai-services"
|
|
19
20
|
}
|
|
20
21
|
//# sourceMappingURL=DSL_DataSpace_Event.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DSL_DataSpace_Event.d.ts","sourceRoot":"","sources":["../../src/__lib__/DSL_DataSpace_Event.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,oBAAY,mBAAmB;IAC7B,sBAAsB,yCAAyC;IAC/D,4BAA4B,0CAA0C;
|
|
1
|
+
{"version":3,"file":"DSL_DataSpace_Event.d.ts","sourceRoot":"","sources":["../../src/__lib__/DSL_DataSpace_Event.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,oBAAY,mBAAmB;IAC7B,sBAAsB,yCAAyC;IAC/D,4BAA4B,0CAA0C;IACtE,gCAAgC,iDAAiD;CAClF"}
|
|
@@ -17,5 +17,6 @@ export var DSL_DATASPACE_EVENT;
|
|
|
17
17
|
(function (DSL_DATASPACE_EVENT) {
|
|
18
18
|
DSL_DATASPACE_EVENT["BUILD_ANALYTICS_RESULT"] = "dataProduct.builder.analytics-result";
|
|
19
19
|
DSL_DATASPACE_EVENT["ERROR_GENERATE_SAMPLE_VALUES"] = "dataProduct.error.build-sample-values";
|
|
20
|
+
DSL_DATASPACE_EVENT["ERROR_EXTRACT_LEGEND_AI_SERVICES"] = "dataProduct.error.extract-legend-ai-services";
|
|
20
21
|
})(DSL_DATASPACE_EVENT || (DSL_DATASPACE_EVENT = {}));
|
|
21
22
|
//# sourceMappingURL=DSL_DataSpace_Event.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DSL_DataSpace_Event.js","sourceRoot":"","sources":["../../src/__lib__/DSL_DataSpace_Event.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,CAAN,IAAY,
|
|
1
|
+
{"version":3,"file":"DSL_DataSpace_Event.js","sourceRoot":"","sources":["../../src/__lib__/DSL_DataSpace_Event.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,CAAN,IAAY,mBAIX;AAJD,WAAY,mBAAmB;IAC7B,sFAA+D,CAAA;IAC/D,6FAAsE,CAAA;IACtE,wGAAiF,CAAA;AACnF,CAAC,EAJW,mBAAmB,KAAnB,mBAAmB,QAI9B"}
|
|
@@ -13,8 +13,24 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import { type
|
|
16
|
+
import { type MappingModelCoverageAnalysisResult } from '@finos/legend-graph';
|
|
17
|
+
import { type TDSServiceSchema, type LegendAIConfig, type LegendAIModelContext, type LegendAIExecutableInfo } from '@finos/legend-lego/legend-ai';
|
|
18
|
+
import { type DiagramAnalysisResult } from '@finos/legend-extension-dsl-diagram';
|
|
17
19
|
import type { DataSpaceViewerState } from '../stores/DataSpaceViewerState.js';
|
|
20
|
+
import { type DataSpaceExecutableAnalysisResult } from '../graph-manager/action/analytics/DataSpaceAnalysis.js';
|
|
21
|
+
/**
|
|
22
|
+
* Extracts a {@link LegendAIModelContext} from diagram metamodel objects.
|
|
23
|
+
* Diagrams always contain the actual Class metamodel references so this
|
|
24
|
+
* works even when elementDocs documentation is empty or incomplete.
|
|
25
|
+
*/
|
|
26
|
+
export declare function extractModelContextFromDiagrams(diagrams: DiagramAnalysisResult[]): LegendAIModelContext;
|
|
27
|
+
/**
|
|
28
|
+
* Enriches a {@link LegendAIModelContext} with mapping coverage data.
|
|
29
|
+
* Marks entities that are root-mapped (directly queryable by the orchestrator)
|
|
30
|
+
* so entity resolution can prefer them.
|
|
31
|
+
*/
|
|
32
|
+
export declare function enrichModelContextWithMappingCoverage(modelContext: LegendAIModelContext, mappingCoverage: MappingModelCoverageAnalysisResult | undefined): void;
|
|
33
|
+
export declare function extractExecutableInfo(executables: DataSpaceExecutableAnalysisResult[], modelContext: LegendAIModelContext, services: TDSServiceSchema[]): LegendAIExecutableInfo[];
|
|
18
34
|
export declare function extractTDSServicesFromDataSpace(viewerState: DataSpaceViewerState): Promise<TDSServiceSchema[]>;
|
|
19
35
|
export declare const DataSpaceLegendAIIntegration: ((props: {
|
|
20
36
|
dataSpaceViewerState: DataSpaceViewerState;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataSpaceLegendAIIntegration.d.ts","sourceRoot":"","sources":["../../src/components/DataSpaceLegendAIIntegration.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"DataSpaceLegendAIIntegration.d.ts","sourceRoot":"","sources":["../../src/components/DataSpaceLegendAIIntegration.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAEL,KAAK,kCAAkC,EAIxC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAWL,KAAK,gBAAgB,EACrB,KAAK,cAAc,EAInB,KAAK,oBAAoB,EAIzB,KAAK,sBAAsB,EAG5B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAEjF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAE9E,OAAO,EAIL,KAAK,iCAAiC,EACvC,MAAM,wDAAwD,CAAC;AAehE;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,qBAAqB,EAAE,GAChC,oBAAoB,CAkEtB;AAED;;;;GAIG;AACH,wBAAgB,qCAAqC,CACnD,YAAY,EAAE,oBAAoB,EAClC,eAAe,EAAE,kCAAkC,GAAG,SAAS,GAC9D,IAAI,CAYN;AAoGD,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,iCAAiC,EAAE,EAChD,YAAY,EAAE,oBAAoB,EAClC,QAAQ,EAAE,gBAAgB,EAAE,GAC3B,sBAAsB,EAAE,CAgC1B;AAED,wBAAsB,+BAA+B,CACnD,WAAW,EAAE,oBAAoB,GAChC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAoF7B;AAiND,eAAO,MAAM,4BAA4B,WAC/B;IACN,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB;;CAKF,CAAC"}
|
|
@@ -16,10 +16,207 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
16
16
|
*/
|
|
17
17
|
import { useState, useEffect, useMemo } from 'react';
|
|
18
18
|
import { observer } from 'mobx-react-lite';
|
|
19
|
-
import {} from '@finos/legend-graph';
|
|
20
|
-
import { LegendAIChat, LegendAIErrorBoundary, findLegendAIPlugin, extractParameterSchemas, buildPropertyDocIndex, enrichColumnsFromElementDocs, inferServiceRelationshipsFromAssociations, extractLambdaPreFilters, } from '@finos/legend-lego/legend-ai';
|
|
19
|
+
import { Enumeration, getAllSuperclasses, PRIMITIVE_TYPE, } from '@finos/legend-graph';
|
|
20
|
+
import { LegendAIChat, LegendAIErrorBoundary, findLegendAIPlugin, extractParameterSchemas, buildPropertyDocIndex, enrichColumnsFromElementDocs, inferServiceRelationshipsFromAssociations, extractLambdaPreFilters, extractModelContext, } from '@finos/legend-lego/legend-ai';
|
|
21
|
+
import {} from '@finos/legend-extension-dsl-diagram';
|
|
22
|
+
import { assertErrorThrown, LogEvent } from '@finos/legend-shared';
|
|
23
|
+
import { DSL_DATASPACE_EVENT } from '../__lib__/DSL_DataSpace_Event.js';
|
|
21
24
|
import { DataSpaceServiceExecutableInfo, DataSpaceMultiExecutionServiceExecutableInfo, DataSpaceExecutableTDSResult, } from '../graph-manager/action/analytics/DataSpaceAnalysis.js';
|
|
22
25
|
import { DataSpaceSupportEmail, DataSpaceSupportCombinedInfo, } from '../graph/metamodel/pure/model/packageableElements/dataSpace/DSL_DataSpace_DataSpace.js';
|
|
26
|
+
const MAX_QUERY_SCAN_LENGTH = 5_000;
|
|
27
|
+
const MAX_QUERY_TEMPLATE_LENGTH = 1000;
|
|
28
|
+
const ENTITY_PATH_PATTERN = /(?<entityPath>[A-Za-z_]\w{0,63}(?:::[A-Za-z_]\w{0,63}){0,10})\.all\(\)/g;
|
|
29
|
+
// ────────────────────────────────────────────────────────────────────────────
|
|
30
|
+
// Diagram-based model context extraction (fallback when elementDocs is sparse)
|
|
31
|
+
// ────────────────────────────────────────────────────────────────────────────
|
|
32
|
+
/**
|
|
33
|
+
* Extracts a {@link LegendAIModelContext} from diagram metamodel objects.
|
|
34
|
+
* Diagrams always contain the actual Class metamodel references so this
|
|
35
|
+
* works even when elementDocs documentation is empty or incomplete.
|
|
36
|
+
*/
|
|
37
|
+
export function extractModelContextFromDiagrams(diagrams) {
|
|
38
|
+
const entityMap = new Map();
|
|
39
|
+
const associations = [];
|
|
40
|
+
const enumPaths = new Map();
|
|
41
|
+
for (const { diagram } of diagrams) {
|
|
42
|
+
for (const classView of diagram.classViews) {
|
|
43
|
+
const cls = classView.class.value;
|
|
44
|
+
if (entityMap.has(cls.path)) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const properties = cls.properties.map((prop) => {
|
|
48
|
+
const rawType = prop.genericType.value.rawType;
|
|
49
|
+
const typePath = rawType.path;
|
|
50
|
+
if (rawType instanceof Enumeration && !enumPaths.has(typePath)) {
|
|
51
|
+
enumPaths.set(typePath, {
|
|
52
|
+
path: typePath,
|
|
53
|
+
name: rawType.name,
|
|
54
|
+
values: rawType.values.map((v) => v.name),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
name: prop.name,
|
|
59
|
+
type: typePath,
|
|
60
|
+
isCollection: prop.multiplicity.upperBound === undefined ||
|
|
61
|
+
prop.multiplicity.upperBound > 1,
|
|
62
|
+
isOptional: prop.multiplicity.lowerBound === 0,
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
const entity = {
|
|
66
|
+
path: cls.path,
|
|
67
|
+
name: cls.name,
|
|
68
|
+
properties,
|
|
69
|
+
};
|
|
70
|
+
const superTypes = getAllSuperclasses(cls).map((c) => c.path);
|
|
71
|
+
if (superTypes.length > 0) {
|
|
72
|
+
entity.superTypes = superTypes;
|
|
73
|
+
}
|
|
74
|
+
entityMap.set(cls.path, entity);
|
|
75
|
+
}
|
|
76
|
+
for (const assocView of diagram.associationViews) {
|
|
77
|
+
const assoc = assocView.association.value;
|
|
78
|
+
const [propA, propB] = assoc.properties;
|
|
79
|
+
associations.push({
|
|
80
|
+
name: assoc.name,
|
|
81
|
+
leftEntity: assocView.from.classView.value.class.value.path,
|
|
82
|
+
leftProperty: propA.name,
|
|
83
|
+
rightEntity: assocView.to.classView.value.class.value.path,
|
|
84
|
+
rightProperty: propB.name,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const result = {
|
|
89
|
+
entities: Array.from(entityMap.values()),
|
|
90
|
+
associations,
|
|
91
|
+
};
|
|
92
|
+
if (enumPaths.size > 0) {
|
|
93
|
+
result.enumerations = Array.from(enumPaths.values());
|
|
94
|
+
}
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Enriches a {@link LegendAIModelContext} with mapping coverage data.
|
|
99
|
+
* Marks entities that are root-mapped (directly queryable by the orchestrator)
|
|
100
|
+
* so entity resolution can prefer them.
|
|
101
|
+
*/
|
|
102
|
+
export function enrichModelContextWithMappingCoverage(modelContext, mappingCoverage) {
|
|
103
|
+
if (!mappingCoverage) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
for (const entity of modelContext.entities) {
|
|
107
|
+
const mapped = mappingCoverage.mappedEntities.find((me) => me.path === entity.path);
|
|
108
|
+
if (mapped?.info?.isRootEntity) {
|
|
109
|
+
entity.isRootMapped = true;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Builds column-to-property mappings by matching TDS result column names
|
|
115
|
+
* to model property names on the root entity.
|
|
116
|
+
* Uses case-insensitive, whitespace/underscore-normalized comparison.
|
|
117
|
+
*/
|
|
118
|
+
function buildColumnPropertyMappings(columns, rootEntity) {
|
|
119
|
+
if (!rootEntity || rootEntity.properties.length === 0) {
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
const propLookup = new Map();
|
|
123
|
+
for (const prop of rootEntity.properties) {
|
|
124
|
+
const normalized = prop.name.toLowerCase().replaceAll('_', '');
|
|
125
|
+
propLookup.set(normalized, prop.name);
|
|
126
|
+
}
|
|
127
|
+
const mappings = [];
|
|
128
|
+
for (const colName of columns) {
|
|
129
|
+
const normalized = colName.toLowerCase().replaceAll(/[\s_]/g, '');
|
|
130
|
+
const propName = propLookup.get(normalized);
|
|
131
|
+
if (propName && propName !== colName) {
|
|
132
|
+
mappings.push({ columnName: colName, propertyPath: propName });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return mappings.length > 0 ? mappings : undefined;
|
|
136
|
+
}
|
|
137
|
+
function collectReferencedEntityPaths(queryStr) {
|
|
138
|
+
const safeQuery = queryStr.slice(0, MAX_QUERY_SCAN_LENGTH);
|
|
139
|
+
// Reset lastIndex defensively — the regex is module-scoped and reused.
|
|
140
|
+
ENTITY_PATH_PATTERN.lastIndex = 0;
|
|
141
|
+
const paths = [];
|
|
142
|
+
const seen = new Set();
|
|
143
|
+
let match;
|
|
144
|
+
while ((match = ENTITY_PATH_PATTERN.exec(safeQuery)) !== null) {
|
|
145
|
+
const path = match.groups?.entityPath;
|
|
146
|
+
if (path && !seen.has(path)) {
|
|
147
|
+
seen.add(path);
|
|
148
|
+
paths.push(path);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return paths;
|
|
152
|
+
}
|
|
153
|
+
function buildExecutableInfo(exec, entityMap, serviceParameters) {
|
|
154
|
+
if (!(exec.info instanceof DataSpaceServiceExecutableInfo ||
|
|
155
|
+
exec.info instanceof DataSpaceMultiExecutionServiceExecutableInfo)) {
|
|
156
|
+
return undefined;
|
|
157
|
+
}
|
|
158
|
+
const queryStr = exec.info.query;
|
|
159
|
+
const referencedEntityPaths = collectReferencedEntityPaths(queryStr);
|
|
160
|
+
const rootEntityPath = referencedEntityPaths[0];
|
|
161
|
+
if (!rootEntityPath) {
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
const info = {
|
|
165
|
+
title: exec.title,
|
|
166
|
+
rootEntityPath,
|
|
167
|
+
queryTemplate: queryStr.length > MAX_QUERY_TEMPLATE_LENGTH
|
|
168
|
+
? `${queryStr.slice(0, MAX_QUERY_TEMPLATE_LENGTH)}...`
|
|
169
|
+
: queryStr,
|
|
170
|
+
};
|
|
171
|
+
if (referencedEntityPaths.length > 1) {
|
|
172
|
+
info.referencedEntityPaths = referencedEntityPaths;
|
|
173
|
+
}
|
|
174
|
+
if (exec.description !== undefined) {
|
|
175
|
+
info.description = exec.description;
|
|
176
|
+
}
|
|
177
|
+
const reqParams = serviceParameters.get(exec.title);
|
|
178
|
+
if (reqParams && reqParams.length > 0) {
|
|
179
|
+
info.requiredParameters = reqParams;
|
|
180
|
+
}
|
|
181
|
+
if (exec.result instanceof DataSpaceExecutableTDSResult) {
|
|
182
|
+
info.columns = exec.result.columns.map((c) => c.name);
|
|
183
|
+
const colMappings = buildColumnPropertyMappings(info.columns, entityMap.get(rootEntityPath));
|
|
184
|
+
if (colMappings) {
|
|
185
|
+
info.columnPropertyMappings = colMappings;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return info;
|
|
189
|
+
}
|
|
190
|
+
export function extractExecutableInfo(executables, modelContext, services) {
|
|
191
|
+
const entityMap = new Map(modelContext.entities.map((e) => [e.path, e]));
|
|
192
|
+
const serviceParameters = new Map();
|
|
193
|
+
for (const svc of services) {
|
|
194
|
+
if (svc.parameterSchemas && svc.parameterSchemas.length > 0) {
|
|
195
|
+
serviceParameters.set(svc.title, svc.parameterSchemas.map((p) => ({
|
|
196
|
+
name: p.name,
|
|
197
|
+
type: p.type ?? PRIMITIVE_TYPE.STRING,
|
|
198
|
+
})));
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
const result = [];
|
|
202
|
+
for (const exec of executables) {
|
|
203
|
+
const info = buildExecutableInfo(exec, entityMap, serviceParameters);
|
|
204
|
+
if (!info) {
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
result.push(info);
|
|
208
|
+
const queryableEntityPaths = info.referencedEntityPaths ?? [
|
|
209
|
+
info.rootEntityPath,
|
|
210
|
+
];
|
|
211
|
+
for (const entityPath of queryableEntityPaths) {
|
|
212
|
+
const entity = entityMap.get(entityPath);
|
|
213
|
+
if (entity) {
|
|
214
|
+
entity.isQueryable = true;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return result;
|
|
219
|
+
}
|
|
23
220
|
export async function extractTDSServicesFromDataSpace(viewerState) {
|
|
24
221
|
const executables = viewerState.dataSpaceAnalysisResult.executables;
|
|
25
222
|
const graphManager = viewerState.graphManagerState.graphManager;
|
|
@@ -41,8 +238,10 @@ export async function extractTDSServicesFromDataSpace(viewerState) {
|
|
|
41
238
|
preFilters = extracted;
|
|
42
239
|
}
|
|
43
240
|
}
|
|
44
|
-
catch {
|
|
45
|
-
|
|
241
|
+
catch (error) {
|
|
242
|
+
assertErrorThrown(error);
|
|
243
|
+
// pre-filter extraction is best-effort — a service without pre-filters
|
|
244
|
+
// still works, the AI just won't know about hardcoded constraints.
|
|
46
245
|
}
|
|
47
246
|
const entry = {
|
|
48
247
|
title: exec.title,
|
|
@@ -140,8 +339,9 @@ const DataSpaceLegendAIIntegrationInner = observer((props) => {
|
|
|
140
339
|
setServices(result);
|
|
141
340
|
}
|
|
142
341
|
})
|
|
143
|
-
.catch(() => {
|
|
144
|
-
|
|
342
|
+
.catch((error) => {
|
|
343
|
+
assertErrorThrown(error);
|
|
344
|
+
dataSpaceViewerState.applicationStore.logService.warn(LogEvent.create(DSL_DATASPACE_EVENT.ERROR_EXTRACT_LEGEND_AI_SERVICES), error);
|
|
145
345
|
});
|
|
146
346
|
return () => {
|
|
147
347
|
cancelled = true;
|
|
@@ -166,24 +366,50 @@ const DataSpaceLegendAIIntegrationInner = observer((props) => {
|
|
|
166
366
|
dataSpaceViewerState.currentExecutionContext.mapping,
|
|
167
367
|
dataSpaceViewerState.currentRuntime,
|
|
168
368
|
]);
|
|
169
|
-
const metadata = useMemo(() =>
|
|
170
|
-
|
|
171
|
-
|
|
369
|
+
const metadata = useMemo(() => extractMetadataFromDataSpace(dataSpaceViewerState, coordinates, services), [dataSpaceViewerState, coordinates, services]);
|
|
370
|
+
const modelContext = useMemo(() => {
|
|
371
|
+
const result = dataSpaceViewerState.dataSpaceAnalysisResult;
|
|
372
|
+
let ctx;
|
|
373
|
+
if (result.elementDocs.length > 0) {
|
|
374
|
+
const docsCtx = extractModelContext(result.elementDocs);
|
|
375
|
+
if (docsCtx.entities.length > 0) {
|
|
376
|
+
ctx = docsCtx;
|
|
377
|
+
}
|
|
172
378
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
}
|
|
379
|
+
// Fallback: extract from diagram metamodel objects (always available)
|
|
380
|
+
if (!ctx && result.diagrams.length > 0) {
|
|
381
|
+
const diagramCtx = extractModelContextFromDiagrams(result.diagrams);
|
|
382
|
+
if (diagramCtx.entities.length > 0) {
|
|
383
|
+
ctx = diagramCtx;
|
|
384
|
+
}
|
|
179
385
|
}
|
|
180
|
-
|
|
386
|
+
if (!ctx) {
|
|
387
|
+
return undefined;
|
|
388
|
+
}
|
|
389
|
+
const mappingPath = dataSpaceViewerState.currentExecutionContext.mapping.path;
|
|
390
|
+
const mappingCoverage = result.mappingToMappingCoverageResult?.get(mappingPath);
|
|
391
|
+
enrichModelContextWithMappingCoverage(ctx, mappingCoverage);
|
|
392
|
+
if (result.executables.length > 0) {
|
|
393
|
+
const execInfos = extractExecutableInfo(result.executables, ctx, services);
|
|
394
|
+
if (execInfos.length > 0) {
|
|
395
|
+
ctx.executables = execInfos;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
if (result.description) {
|
|
399
|
+
ctx.dataspaceDescription = result.description;
|
|
400
|
+
}
|
|
401
|
+
return ctx;
|
|
402
|
+
}, [
|
|
403
|
+
dataSpaceViewerState.dataSpaceAnalysisResult,
|
|
404
|
+
dataSpaceViewerState.currentExecutionContext.mapping,
|
|
405
|
+
services,
|
|
406
|
+
]);
|
|
181
407
|
if (!config.enabled || !legendAIPlugin) {
|
|
182
408
|
return null;
|
|
183
409
|
}
|
|
184
410
|
const dsTitle = dataSpaceViewerState.dataSpaceAnalysisResult.title ??
|
|
185
411
|
dataSpaceViewerState.dataSpaceAnalysisResult.name;
|
|
186
|
-
return (_jsx(LegendAIChat, { services: services, coordinates: coordinates, config: config, metadata: metadata, title: `Ask ${dsTitle}`, plugin: legendAIPlugin, dataProductCoordinates: dataProductCoordinates, pureExecutionContext: pureExecutionContext, ...(onClose ? { onClose } : {}), ...(onMinimize ? { onMinimize } : {}) }));
|
|
412
|
+
return (_jsx(LegendAIChat, { services: services, coordinates: coordinates, config: config, metadata: metadata, title: `Ask ${dsTitle}`, plugin: legendAIPlugin, contextBannerMessage: "You can query available TDS Executables within Data Space, or use Legend AI MCP for Pure queries on models.", dataProductCoordinates: dataProductCoordinates, pureExecutionContext: pureExecutionContext, ...(modelContext ? { modelContext } : {}), ...(onClose ? { onClose } : {}), ...(onMinimize ? { onMinimize } : {}) }));
|
|
187
413
|
});
|
|
188
414
|
export const DataSpaceLegendAIIntegration = observer((props) => (_jsx(LegendAIErrorBoundary, { children: _jsx(DataSpaceLegendAIIntegrationInner, { ...props }) })));
|
|
189
415
|
//# sourceMappingURL=DataSpaceLegendAIIntegration.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataSpaceLegendAIIntegration.js","sourceRoot":"","sources":["../../src/components/DataSpaceLegendAIIntegration.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAA0C,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,4BAA4B,EAC5B,yCAAyC,EACzC,uBAAuB,GAOxB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,8BAA8B,EAC9B,4CAA4C,EAC5C,4BAA4B,GAC7B,MAAM,wDAAwD,CAAC;AAChE,OAAO,EACL,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,wFAAwF,CAAC;AAEhG,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,WAAiC;IAEjC,MAAM,WAAW,GAAG,WAAW,CAAC,uBAAuB,CAAC,WAAW,CAAC;IACpE,MAAM,YAAY,GAAG,WAAW,CAAC,iBAAiB,CAAC,YAAY,CAAC;IAEhE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAA+B,EAAE;QAC1D,IACE,CAAC,CACC,IAAI,CAAC,IAAI,YAAY,8BAA8B;YACnD,IAAI,CAAC,IAAI,YAAY,4CAA4C,CAClE;YACD,CAAC,CAAC,IAAI,CAAC,MAAM,YAAY,4BAA4B,CAAC,EACtD,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;QAE9B,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,GAC/D,MAAM,uBAAuB,CAC3B,IAAI,CAAC,KAAK,EACV,YAAY,EACZ,WAAW,CAAC,iBAAiB,CAC9B,CAAC;QAEJ,2DAA2D;QAC3D,IAAI,UAA0C,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClE,MAAM,SAAS,GAAG,uBAAuB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC1D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,UAAU,GAAG,SAAS,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0CAA0C;QAC5C,CAAC;QAED,MAAM,KAAK,GAAqB;YAC9B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBACrC,MAAM,MAAM,GAAoB,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;gBACnD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC3B,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;gBACzB,CAAC;gBACD,IAAI,GAAG,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;oBACrC,MAAM,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,CAAC;gBAC7C,CAAC;gBACD,IAAI,GAAG,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;oBACpC,MAAM,CAAC,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;gBAC3C,CAAC;gBACD,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;oBACnC,MAAM,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;gBACzC,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC,CAAC;YACF,UAAU;YACV,GAAG,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,GAAG,CAAC,yBAAyB;gBAC3B,CAAC,CAAC,EAAE,yBAAyB,EAAE,IAAI,EAAE;gBACrC,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtC,CAAC;QACF,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACnC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACvC,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC,CAAC,CACH,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAE/B,qEAAqE;IACrE,MAAM,SAAS,GAAG,qBAAqB,CACrC,WAAW,CAAC,uBAAuB,CAAC,WAAW,CAChD,CAAC;IACF,IAAI,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,4BAA4B,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,4BAA4B,CACnC,WAAiC,EACjC,WAAmB,EACnB,QAA4B;IAE5B,MAAM,MAAM,GAAG,WAAW,CAAC,uBAAuB,CAAC;IAEnD,IAAI,eAAmC,CAAC;IACxC,IAAI,MAAM,CAAC,WAAW,YAAY,qBAAqB,EAAE,CAAC;QACxD,eAAe,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;IAC/C,CAAC;SAAM,IAAI,MAAM,CAAC,WAAW,YAAY,4BAA4B,EAAE,CAAC;QACtE,eAAe,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,QAAQ,GAA4B;QACxC,IAAI,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI;QACjC,WAAW;QACX,gBAAgB,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAChD,MAAM,OAAO,GAA2B;gBACtC,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC;YACF,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;gBACnC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YACzC,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,YAAY,4BAA4B,EAAE,CAAC;gBACxD,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACnE,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;QACF,IAAI,EAAE,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACrC,OAAO,EAAE,EAAE,CAAC,OAAO;YACnB,KAAK,EAAE,EAAE,CAAC,KAAK;SAChB,CAAC,CAAC;KACJ,CAAC;IACF,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACrC,QAAQ,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IAC5C,CAAC;IACD,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,QAAQ,CAAC,WAAW,GAAG,eAAe,CAAC;IACzC,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,WAAW,GAAG,yCAAyC,CAC3D,QAAQ,EACR,MAAM,CAAC,WAAW,CACnB,CAAC;QACF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,QAAQ,CAAC,oBAAoB,GAAG,WAAW,CAAC;QAC9C,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,iCAAiC,GAAG,QAAQ,CAChD,CAAC,KAKA,EAAE,EAAE;IACH,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAEpE,MAAM,cAAc,GAAG,OAAO,CAC5B,GAAG,EAAE,CACH,kBAAkB,CAChB,oBAAoB,CAAC,gBAAgB,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAC5E,EACH,CAAC,oBAAoB,CAAC,CACvB,CAAC;IAEF,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAqB,EAAE,CAAC,CAAC;IACjE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,+BAA+B,CAAC,oBAAoB,CAAC;aAClD,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACf,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,WAAW,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,8DAA8D;QAChE,CAAC,CAAC,CAAC;QACL,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAE3B,MAAM,WAAW,GAAG,GAAG,oBAAoB,CAAC,OAAO,IAAI,oBAAoB,CAAC,UAAU,IAAI,oBAAoB,CAAC,SAAS,EAAE,CAAC;IAE3H,MAAM,sBAAsB,GAAG,OAAO,CACpC,GAA+C,EAAE,CAAC,CAAC;QACjD,YAAY,EAAE,oBAAoB,CAAC,uBAAuB,CAAC,IAAI;QAC/D,QAAQ,EAAE,oBAAoB,CAAC,OAAO;QACtC,WAAW,EAAE,oBAAoB,CAAC,UAAU;QAC5C,OAAO,EAAE,oBAAoB,CAAC,SAAS;KACxC,CAAC,EACF;QACE,oBAAoB,CAAC,uBAAuB,CAAC,IAAI;QACjD,oBAAoB,CAAC,OAAO;QAC5B,oBAAoB,CAAC,UAAU;QAC/B,oBAAoB,CAAC,SAAS;KAC/B,CACF,CAAC;IAEF,MAAM,oBAAoB,GAAG,OAAO,CAClC,GAAsC,EAAE,CAAC,CAAC;QACxC,OAAO,EAAE,oBAAoB,CAAC,uBAAuB,CAAC,OAAO,CAAC,IAAI;QAClE,OAAO,EAAE,oBAAoB,CAAC,cAAc,CAAC,IAAI;KAClD,CAAC,EACF;QACE,oBAAoB,CAAC,uBAAuB,CAAC,OAAO;QACpD,oBAAoB,CAAC,cAAc;KACpC,CACF,CAAC;IAEF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE;QAC5B,IAAI,CAAC;YACH,OAAO,4BAA4B,CACjC,oBAAoB,EACpB,WAAW,EACX,QAAQ,CACT,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW;gBACX,gBAAgB,EAAE,EAAE;aACrB,CAAC;QACJ,CAAC;IACH,CAAC,EAAE,CAAC,oBAAoB,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;IAElD,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GACX,oBAAoB,CAAC,uBAAuB,CAAC,KAAK;QAClD,oBAAoB,CAAC,uBAAuB,CAAC,IAAI,CAAC;IAEpD,OAAO,CACL,KAAC,YAAY,IACX,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,OAAO,OAAO,EAAE,EACvB,MAAM,EAAE,cAAc,EACtB,sBAAsB,EAAE,sBAAsB,EAC9C,oBAAoB,EAAE,oBAAoB,KACtC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAC5B,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GACtC,CACH,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,QAAQ,CAClD,CAAC,KAKA,EAAE,EAAE,CAAC,CACJ,KAAC,qBAAqB,cACpB,KAAC,iCAAiC,OAAK,KAAK,GAAI,GAC1B,CACzB,CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"DataSpaceLegendAIIntegration.js","sourceRoot":"","sources":["../../src/components/DataSpaceLegendAIIntegration.tsx"],"names":[],"mappings":"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"}
|
package/lib/index.css
CHANGED
package/lib/package.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@finos/legend-extension-dsl-data-space",
|
|
3
|
-
"version": "10.4.
|
|
3
|
+
"version": "10.4.232",
|
|
4
4
|
"description": "Legend extension for Data Space DSL",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"legend",
|
|
@@ -45,11 +45,11 @@
|
|
|
45
45
|
"dependencies": {
|
|
46
46
|
"@finos/legend-application": "16.0.113",
|
|
47
47
|
"@finos/legend-art": "7.1.154",
|
|
48
|
-
"@finos/legend-code-editor": "2.0.
|
|
49
|
-
"@finos/legend-extension-dsl-diagram": "8.1.
|
|
50
|
-
"@finos/legend-graph": "32.6.
|
|
51
|
-
"@finos/legend-lego": "2.0.
|
|
52
|
-
"@finos/legend-query-builder": "4.18.
|
|
48
|
+
"@finos/legend-code-editor": "2.0.183",
|
|
49
|
+
"@finos/legend-extension-dsl-diagram": "8.1.247",
|
|
50
|
+
"@finos/legend-graph": "32.6.14",
|
|
51
|
+
"@finos/legend-lego": "2.0.203",
|
|
52
|
+
"@finos/legend-query-builder": "4.18.22",
|
|
53
53
|
"@finos/legend-server-depot": "6.1.14",
|
|
54
54
|
"@finos/legend-server-sdlc": "5.4.5",
|
|
55
55
|
"@finos/legend-shared": "11.0.26",
|
|
@@ -17,4 +17,5 @@
|
|
|
17
17
|
export enum DSL_DATASPACE_EVENT {
|
|
18
18
|
BUILD_ANALYTICS_RESULT = 'dataProduct.builder.analytics-result',
|
|
19
19
|
ERROR_GENERATE_SAMPLE_VALUES = 'dataProduct.error.build-sample-values',
|
|
20
|
+
ERROR_EXTRACT_LEGEND_AI_SERVICES = 'dataProduct.error.extract-legend-ai-services',
|
|
20
21
|
}
|
|
@@ -16,7 +16,13 @@
|
|
|
16
16
|
|
|
17
17
|
import { useState, useEffect, useMemo } from 'react';
|
|
18
18
|
import { observer } from 'mobx-react-lite';
|
|
19
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
type QueryExplicitExecutionContextInfo,
|
|
21
|
+
type MappingModelCoverageAnalysisResult,
|
|
22
|
+
Enumeration,
|
|
23
|
+
getAllSuperclasses,
|
|
24
|
+
PRIMITIVE_TYPE,
|
|
25
|
+
} from '@finos/legend-graph';
|
|
20
26
|
import {
|
|
21
27
|
LegendAIChat,
|
|
22
28
|
LegendAIErrorBoundary,
|
|
@@ -26,24 +32,278 @@ import {
|
|
|
26
32
|
enrichColumnsFromElementDocs,
|
|
27
33
|
inferServiceRelationshipsFromAssociations,
|
|
28
34
|
extractLambdaPreFilters,
|
|
35
|
+
extractModelContext,
|
|
29
36
|
type TDSColumnSchema,
|
|
30
37
|
type TDSServiceSchema,
|
|
31
38
|
type LegendAIConfig,
|
|
32
39
|
type LegendAIProductMetadata,
|
|
33
40
|
type LegendAIOrchestratorDataProductCoordinates,
|
|
34
41
|
type LegendAIServiceSummary,
|
|
42
|
+
type LegendAIModelContext,
|
|
43
|
+
type LegendAIModelEntity,
|
|
44
|
+
type LegendAIModelProperty,
|
|
45
|
+
type LegendAIModelAssociation,
|
|
46
|
+
type LegendAIExecutableInfo,
|
|
47
|
+
type LegendAIColumnPropertyMapping,
|
|
48
|
+
type LegendAIParameterInfo,
|
|
35
49
|
} from '@finos/legend-lego/legend-ai';
|
|
50
|
+
import { type DiagramAnalysisResult } from '@finos/legend-extension-dsl-diagram';
|
|
51
|
+
import { assertErrorThrown, LogEvent } from '@finos/legend-shared';
|
|
36
52
|
import type { DataSpaceViewerState } from '../stores/DataSpaceViewerState.js';
|
|
53
|
+
import { DSL_DATASPACE_EVENT } from '../__lib__/DSL_DataSpace_Event.js';
|
|
37
54
|
import {
|
|
38
55
|
DataSpaceServiceExecutableInfo,
|
|
39
56
|
DataSpaceMultiExecutionServiceExecutableInfo,
|
|
40
57
|
DataSpaceExecutableTDSResult,
|
|
58
|
+
type DataSpaceExecutableAnalysisResult,
|
|
41
59
|
} from '../graph-manager/action/analytics/DataSpaceAnalysis.js';
|
|
42
60
|
import {
|
|
43
61
|
DataSpaceSupportEmail,
|
|
44
62
|
DataSpaceSupportCombinedInfo,
|
|
45
63
|
} from '../graph/metamodel/pure/model/packageableElements/dataSpace/DSL_DataSpace_DataSpace.js';
|
|
46
64
|
|
|
65
|
+
const MAX_QUERY_SCAN_LENGTH = 5_000;
|
|
66
|
+
const MAX_QUERY_TEMPLATE_LENGTH = 1000;
|
|
67
|
+
const ENTITY_PATH_PATTERN =
|
|
68
|
+
/(?<entityPath>[A-Za-z_]\w{0,63}(?:::[A-Za-z_]\w{0,63}){0,10})\.all\(\)/g;
|
|
69
|
+
|
|
70
|
+
// ────────────────────────────────────────────────────────────────────────────
|
|
71
|
+
// Diagram-based model context extraction (fallback when elementDocs is sparse)
|
|
72
|
+
// ────────────────────────────────────────────────────────────────────────────
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Extracts a {@link LegendAIModelContext} from diagram metamodel objects.
|
|
76
|
+
* Diagrams always contain the actual Class metamodel references so this
|
|
77
|
+
* works even when elementDocs documentation is empty or incomplete.
|
|
78
|
+
*/
|
|
79
|
+
export function extractModelContextFromDiagrams(
|
|
80
|
+
diagrams: DiagramAnalysisResult[],
|
|
81
|
+
): LegendAIModelContext {
|
|
82
|
+
const entityMap = new Map<string, LegendAIModelEntity>();
|
|
83
|
+
const associations: LegendAIModelAssociation[] = [];
|
|
84
|
+
const enumPaths = new Map<
|
|
85
|
+
string,
|
|
86
|
+
{ path: string; name: string; values: string[] }
|
|
87
|
+
>();
|
|
88
|
+
|
|
89
|
+
for (const { diagram } of diagrams) {
|
|
90
|
+
for (const classView of diagram.classViews) {
|
|
91
|
+
const cls = classView.class.value;
|
|
92
|
+
if (entityMap.has(cls.path)) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const properties: LegendAIModelProperty[] = cls.properties.map((prop) => {
|
|
96
|
+
const rawType = prop.genericType.value.rawType;
|
|
97
|
+
const typePath = rawType.path;
|
|
98
|
+
if (rawType instanceof Enumeration && !enumPaths.has(typePath)) {
|
|
99
|
+
enumPaths.set(typePath, {
|
|
100
|
+
path: typePath,
|
|
101
|
+
name: rawType.name,
|
|
102
|
+
values: rawType.values.map((v) => v.name),
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
name: prop.name,
|
|
107
|
+
type: typePath,
|
|
108
|
+
isCollection:
|
|
109
|
+
prop.multiplicity.upperBound === undefined ||
|
|
110
|
+
prop.multiplicity.upperBound > 1,
|
|
111
|
+
isOptional: prop.multiplicity.lowerBound === 0,
|
|
112
|
+
};
|
|
113
|
+
});
|
|
114
|
+
const entity: LegendAIModelEntity = {
|
|
115
|
+
path: cls.path,
|
|
116
|
+
name: cls.name,
|
|
117
|
+
properties,
|
|
118
|
+
};
|
|
119
|
+
const superTypes = getAllSuperclasses(cls).map((c) => c.path);
|
|
120
|
+
if (superTypes.length > 0) {
|
|
121
|
+
entity.superTypes = superTypes;
|
|
122
|
+
}
|
|
123
|
+
entityMap.set(cls.path, entity);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
for (const assocView of diagram.associationViews) {
|
|
127
|
+
const assoc = assocView.association.value;
|
|
128
|
+
const [propA, propB] = assoc.properties;
|
|
129
|
+
associations.push({
|
|
130
|
+
name: assoc.name,
|
|
131
|
+
leftEntity: assocView.from.classView.value.class.value.path,
|
|
132
|
+
leftProperty: propA.name,
|
|
133
|
+
rightEntity: assocView.to.classView.value.class.value.path,
|
|
134
|
+
rightProperty: propB.name,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const result: LegendAIModelContext = {
|
|
140
|
+
entities: Array.from(entityMap.values()),
|
|
141
|
+
associations,
|
|
142
|
+
};
|
|
143
|
+
if (enumPaths.size > 0) {
|
|
144
|
+
result.enumerations = Array.from(enumPaths.values());
|
|
145
|
+
}
|
|
146
|
+
return result;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Enriches a {@link LegendAIModelContext} with mapping coverage data.
|
|
151
|
+
* Marks entities that are root-mapped (directly queryable by the orchestrator)
|
|
152
|
+
* so entity resolution can prefer them.
|
|
153
|
+
*/
|
|
154
|
+
export function enrichModelContextWithMappingCoverage(
|
|
155
|
+
modelContext: LegendAIModelContext,
|
|
156
|
+
mappingCoverage: MappingModelCoverageAnalysisResult | undefined,
|
|
157
|
+
): void {
|
|
158
|
+
if (!mappingCoverage) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
for (const entity of modelContext.entities) {
|
|
162
|
+
const mapped = mappingCoverage.mappedEntities.find(
|
|
163
|
+
(me) => me.path === entity.path,
|
|
164
|
+
);
|
|
165
|
+
if (mapped?.info?.isRootEntity) {
|
|
166
|
+
entity.isRootMapped = true;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Builds column-to-property mappings by matching TDS result column names
|
|
173
|
+
* to model property names on the root entity.
|
|
174
|
+
* Uses case-insensitive, whitespace/underscore-normalized comparison.
|
|
175
|
+
*/
|
|
176
|
+
function buildColumnPropertyMappings(
|
|
177
|
+
columns: string[],
|
|
178
|
+
rootEntity: { properties: { name: string }[] } | undefined,
|
|
179
|
+
): LegendAIColumnPropertyMapping[] | undefined {
|
|
180
|
+
if (!rootEntity || rootEntity.properties.length === 0) {
|
|
181
|
+
return undefined;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const propLookup = new Map<string, string>();
|
|
185
|
+
for (const prop of rootEntity.properties) {
|
|
186
|
+
const normalized = prop.name.toLowerCase().replaceAll('_', '');
|
|
187
|
+
propLookup.set(normalized, prop.name);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const mappings: LegendAIColumnPropertyMapping[] = [];
|
|
191
|
+
for (const colName of columns) {
|
|
192
|
+
const normalized = colName.toLowerCase().replaceAll(/[\s_]/g, '');
|
|
193
|
+
const propName = propLookup.get(normalized);
|
|
194
|
+
if (propName && propName !== colName) {
|
|
195
|
+
mappings.push({ columnName: colName, propertyPath: propName });
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return mappings.length > 0 ? mappings : undefined;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function collectReferencedEntityPaths(queryStr: string): string[] {
|
|
203
|
+
const safeQuery = queryStr.slice(0, MAX_QUERY_SCAN_LENGTH);
|
|
204
|
+
// Reset lastIndex defensively — the regex is module-scoped and reused.
|
|
205
|
+
ENTITY_PATH_PATTERN.lastIndex = 0;
|
|
206
|
+
const paths: string[] = [];
|
|
207
|
+
const seen = new Set<string>();
|
|
208
|
+
let match: RegExpExecArray | null;
|
|
209
|
+
while ((match = ENTITY_PATH_PATTERN.exec(safeQuery)) !== null) {
|
|
210
|
+
const path = match.groups?.entityPath;
|
|
211
|
+
if (path && !seen.has(path)) {
|
|
212
|
+
seen.add(path);
|
|
213
|
+
paths.push(path);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return paths;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function buildExecutableInfo(
|
|
220
|
+
exec: DataSpaceExecutableAnalysisResult,
|
|
221
|
+
entityMap: Map<string, LegendAIModelEntity>,
|
|
222
|
+
serviceParameters: Map<string, LegendAIParameterInfo[]>,
|
|
223
|
+
): LegendAIExecutableInfo | undefined {
|
|
224
|
+
if (
|
|
225
|
+
!(
|
|
226
|
+
exec.info instanceof DataSpaceServiceExecutableInfo ||
|
|
227
|
+
exec.info instanceof DataSpaceMultiExecutionServiceExecutableInfo
|
|
228
|
+
)
|
|
229
|
+
) {
|
|
230
|
+
return undefined;
|
|
231
|
+
}
|
|
232
|
+
const queryStr = exec.info.query;
|
|
233
|
+
const referencedEntityPaths = collectReferencedEntityPaths(queryStr);
|
|
234
|
+
const rootEntityPath = referencedEntityPaths[0];
|
|
235
|
+
if (!rootEntityPath) {
|
|
236
|
+
return undefined;
|
|
237
|
+
}
|
|
238
|
+
const info: LegendAIExecutableInfo = {
|
|
239
|
+
title: exec.title,
|
|
240
|
+
rootEntityPath,
|
|
241
|
+
queryTemplate:
|
|
242
|
+
queryStr.length > MAX_QUERY_TEMPLATE_LENGTH
|
|
243
|
+
? `${queryStr.slice(0, MAX_QUERY_TEMPLATE_LENGTH)}...`
|
|
244
|
+
: queryStr,
|
|
245
|
+
};
|
|
246
|
+
if (referencedEntityPaths.length > 1) {
|
|
247
|
+
info.referencedEntityPaths = referencedEntityPaths;
|
|
248
|
+
}
|
|
249
|
+
if (exec.description !== undefined) {
|
|
250
|
+
info.description = exec.description;
|
|
251
|
+
}
|
|
252
|
+
const reqParams = serviceParameters.get(exec.title);
|
|
253
|
+
if (reqParams && reqParams.length > 0) {
|
|
254
|
+
info.requiredParameters = reqParams;
|
|
255
|
+
}
|
|
256
|
+
if (exec.result instanceof DataSpaceExecutableTDSResult) {
|
|
257
|
+
info.columns = exec.result.columns.map((c) => c.name);
|
|
258
|
+
const colMappings = buildColumnPropertyMappings(
|
|
259
|
+
info.columns,
|
|
260
|
+
entityMap.get(rootEntityPath),
|
|
261
|
+
);
|
|
262
|
+
if (colMappings) {
|
|
263
|
+
info.columnPropertyMappings = colMappings;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return info;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
export function extractExecutableInfo(
|
|
270
|
+
executables: DataSpaceExecutableAnalysisResult[],
|
|
271
|
+
modelContext: LegendAIModelContext,
|
|
272
|
+
services: TDSServiceSchema[],
|
|
273
|
+
): LegendAIExecutableInfo[] {
|
|
274
|
+
const entityMap = new Map(modelContext.entities.map((e) => [e.path, e]));
|
|
275
|
+
const serviceParameters = new Map<string, LegendAIParameterInfo[]>();
|
|
276
|
+
for (const svc of services) {
|
|
277
|
+
if (svc.parameterSchemas && svc.parameterSchemas.length > 0) {
|
|
278
|
+
serviceParameters.set(
|
|
279
|
+
svc.title,
|
|
280
|
+
svc.parameterSchemas.map((p) => ({
|
|
281
|
+
name: p.name,
|
|
282
|
+
type: p.type ?? PRIMITIVE_TYPE.STRING,
|
|
283
|
+
})),
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
const result: LegendAIExecutableInfo[] = [];
|
|
288
|
+
for (const exec of executables) {
|
|
289
|
+
const info = buildExecutableInfo(exec, entityMap, serviceParameters);
|
|
290
|
+
if (!info) {
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
result.push(info);
|
|
294
|
+
const queryableEntityPaths = info.referencedEntityPaths ?? [
|
|
295
|
+
info.rootEntityPath,
|
|
296
|
+
];
|
|
297
|
+
for (const entityPath of queryableEntityPaths) {
|
|
298
|
+
const entity = entityMap.get(entityPath);
|
|
299
|
+
if (entity) {
|
|
300
|
+
entity.isQueryable = true;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return result;
|
|
305
|
+
}
|
|
306
|
+
|
|
47
307
|
export async function extractTDSServicesFromDataSpace(
|
|
48
308
|
viewerState: DataSpaceViewerState,
|
|
49
309
|
): Promise<TDSServiceSchema[]> {
|
|
@@ -79,8 +339,10 @@ export async function extractTDSServicesFromDataSpace(
|
|
|
79
339
|
if (extracted.length > 0) {
|
|
80
340
|
preFilters = extracted;
|
|
81
341
|
}
|
|
82
|
-
} catch {
|
|
83
|
-
|
|
342
|
+
} catch (error) {
|
|
343
|
+
assertErrorThrown(error);
|
|
344
|
+
// pre-filter extraction is best-effort — a service without pre-filters
|
|
345
|
+
// still works, the AI just won't know about hardcoded constraints.
|
|
84
346
|
}
|
|
85
347
|
|
|
86
348
|
const entry: TDSServiceSchema = {
|
|
@@ -208,8 +470,14 @@ const DataSpaceLegendAIIntegrationInner = observer(
|
|
|
208
470
|
setServices(result);
|
|
209
471
|
}
|
|
210
472
|
})
|
|
211
|
-
.catch(() => {
|
|
212
|
-
|
|
473
|
+
.catch((error) => {
|
|
474
|
+
assertErrorThrown(error);
|
|
475
|
+
dataSpaceViewerState.applicationStore.logService.warn(
|
|
476
|
+
LogEvent.create(
|
|
477
|
+
DSL_DATASPACE_EVENT.ERROR_EXTRACT_LEGEND_AI_SERVICES,
|
|
478
|
+
),
|
|
479
|
+
error,
|
|
480
|
+
);
|
|
213
481
|
});
|
|
214
482
|
return () => {
|
|
215
483
|
cancelled = true;
|
|
@@ -244,21 +512,65 @@ const DataSpaceLegendAIIntegrationInner = observer(
|
|
|
244
512
|
],
|
|
245
513
|
);
|
|
246
514
|
|
|
247
|
-
const metadata = useMemo(
|
|
248
|
-
|
|
249
|
-
|
|
515
|
+
const metadata = useMemo(
|
|
516
|
+
() =>
|
|
517
|
+
extractMetadataFromDataSpace(
|
|
250
518
|
dataSpaceViewerState,
|
|
251
519
|
coordinates,
|
|
252
520
|
services,
|
|
521
|
+
),
|
|
522
|
+
[dataSpaceViewerState, coordinates, services],
|
|
523
|
+
);
|
|
524
|
+
|
|
525
|
+
const modelContext: LegendAIModelContext | undefined = useMemo(() => {
|
|
526
|
+
const result = dataSpaceViewerState.dataSpaceAnalysisResult;
|
|
527
|
+
let ctx: LegendAIModelContext | undefined;
|
|
528
|
+
if (result.elementDocs.length > 0) {
|
|
529
|
+
const docsCtx = extractModelContext(result.elementDocs);
|
|
530
|
+
if (docsCtx.entities.length > 0) {
|
|
531
|
+
ctx = docsCtx;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
// Fallback: extract from diagram metamodel objects (always available)
|
|
536
|
+
if (!ctx && result.diagrams.length > 0) {
|
|
537
|
+
const diagramCtx = extractModelContextFromDiagrams(result.diagrams);
|
|
538
|
+
if (diagramCtx.entities.length > 0) {
|
|
539
|
+
ctx = diagramCtx;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
if (!ctx) {
|
|
544
|
+
return undefined;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
const mappingPath =
|
|
548
|
+
dataSpaceViewerState.currentExecutionContext.mapping.path;
|
|
549
|
+
const mappingCoverage =
|
|
550
|
+
result.mappingToMappingCoverageResult?.get(mappingPath);
|
|
551
|
+
enrichModelContextWithMappingCoverage(ctx, mappingCoverage);
|
|
552
|
+
|
|
553
|
+
if (result.executables.length > 0) {
|
|
554
|
+
const execInfos = extractExecutableInfo(
|
|
555
|
+
result.executables,
|
|
556
|
+
ctx,
|
|
557
|
+
services,
|
|
253
558
|
);
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
559
|
+
if (execInfos.length > 0) {
|
|
560
|
+
ctx.executables = execInfos;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
if (result.description) {
|
|
565
|
+
ctx.dataspaceDescription = result.description;
|
|
260
566
|
}
|
|
261
|
-
|
|
567
|
+
|
|
568
|
+
return ctx;
|
|
569
|
+
}, [
|
|
570
|
+
dataSpaceViewerState.dataSpaceAnalysisResult,
|
|
571
|
+
dataSpaceViewerState.currentExecutionContext.mapping,
|
|
572
|
+
services,
|
|
573
|
+
]);
|
|
262
574
|
|
|
263
575
|
if (!config.enabled || !legendAIPlugin) {
|
|
264
576
|
return null;
|
|
@@ -276,8 +588,10 @@ const DataSpaceLegendAIIntegrationInner = observer(
|
|
|
276
588
|
metadata={metadata}
|
|
277
589
|
title={`Ask ${dsTitle}`}
|
|
278
590
|
plugin={legendAIPlugin}
|
|
591
|
+
contextBannerMessage="You can query available TDS Executables within Data Space, or use Legend AI MCP for Pure queries on models."
|
|
279
592
|
dataProductCoordinates={dataProductCoordinates}
|
|
280
593
|
pureExecutionContext={pureExecutionContext}
|
|
594
|
+
{...(modelContext ? { modelContext } : {})}
|
|
281
595
|
{...(onClose ? { onClose } : {})}
|
|
282
596
|
{...(onMinimize ? { onMinimize } : {})}
|
|
283
597
|
/>
|