@finos/legend-lego 2.0.197 → 2.0.199
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/index.css +2 -2
- package/lib/index.css.map +1 -1
- package/lib/legend-ai/LegendAIDocEnrichment.d.ts +60 -0
- package/lib/legend-ai/LegendAIDocEnrichment.d.ts.map +1 -0
- package/lib/legend-ai/LegendAIDocEnrichment.js +429 -0
- package/lib/legend-ai/LegendAIDocEnrichment.js.map +1 -0
- package/lib/legend-ai/LegendAITypes.d.ts +127 -1
- package/lib/legend-ai/LegendAITypes.d.ts.map +1 -1
- package/lib/legend-ai/LegendAITypes.js +111 -2
- package/lib/legend-ai/LegendAITypes.js.map +1 -1
- package/lib/legend-ai/LegendAI_LegendApplicationPlugin_Extension.d.ts +14 -1
- package/lib/legend-ai/LegendAI_LegendApplicationPlugin_Extension.d.ts.map +1 -1
- package/lib/legend-ai/LegendAI_LegendApplicationPlugin_Extension.js.map +1 -1
- package/lib/legend-ai/__test-utils__/LegendAITestUtils.d.ts +2 -1
- package/lib/legend-ai/__test-utils__/LegendAITestUtils.d.ts.map +1 -1
- package/lib/legend-ai/__test-utils__/LegendAITestUtils.js +37 -2
- package/lib/legend-ai/__test-utils__/LegendAITestUtils.js.map +1 -1
- package/lib/legend-ai/components/LegendAIAnalysisPanel.d.ts.map +1 -1
- package/lib/legend-ai/components/LegendAIAnalysisPanel.js +11 -12
- package/lib/legend-ai/components/LegendAIAnalysisPanel.js.map +1 -1
- package/lib/legend-ai/components/LegendAIAnalysisUtils.d.ts +7 -0
- package/lib/legend-ai/components/LegendAIAnalysisUtils.d.ts.map +1 -1
- package/lib/legend-ai/components/LegendAIAnalysisUtils.js +106 -41
- package/lib/legend-ai/components/LegendAIAnalysisUtils.js.map +1 -1
- package/lib/legend-ai/components/LegendAIChat.d.ts +1 -5
- package/lib/legend-ai/components/LegendAIChat.d.ts.map +1 -1
- package/lib/legend-ai/components/LegendAIChat.js +168 -109
- package/lib/legend-ai/components/LegendAIChat.js.map +1 -1
- package/lib/legend-ai/components/LegendAIChatHelpers.d.ts +21 -0
- package/lib/legend-ai/components/LegendAIChatHelpers.d.ts.map +1 -0
- package/lib/legend-ai/components/LegendAIChatHelpers.js +85 -0
- package/lib/legend-ai/components/LegendAIChatHelpers.js.map +1 -0
- package/lib/legend-ai/components/LegendAIChatInput.d.ts +21 -0
- package/lib/legend-ai/components/LegendAIChatInput.d.ts.map +1 -0
- package/lib/legend-ai/components/LegendAIChatInput.js +78 -0
- package/lib/legend-ai/components/LegendAIChatInput.js.map +1 -0
- package/lib/legend-ai/components/LegendAIScopeSelector.d.ts +25 -0
- package/lib/legend-ai/components/LegendAIScopeSelector.d.ts.map +1 -0
- package/lib/legend-ai/components/LegendAIScopeSelector.js +85 -0
- package/lib/legend-ai/components/LegendAIScopeSelector.js.map +1 -0
- package/lib/legend-ai/index.d.ts +8 -3
- package/lib/legend-ai/index.d.ts.map +1 -1
- package/lib/legend-ai/index.js +8 -3
- package/lib/legend-ai/index.js.map +1 -1
- package/lib/legend-ai/stores/LegendAIChatProcessors.d.ts +105 -0
- package/lib/legend-ai/stores/LegendAIChatProcessors.d.ts.map +1 -0
- package/lib/legend-ai/stores/LegendAIChatProcessors.js +1482 -0
- package/lib/legend-ai/stores/LegendAIChatProcessors.js.map +1 -0
- package/lib/legend-ai/stores/LegendAIChatState.d.ts +2 -35
- package/lib/legend-ai/stores/LegendAIChatState.d.ts.map +1 -1
- package/lib/legend-ai/stores/LegendAIChatState.js +114 -949
- package/lib/legend-ai/stores/LegendAIChatState.js.map +1 -1
- package/package.json +5 -5
- package/src/legend-ai/LegendAIDocEnrichment.ts +572 -0
- package/src/legend-ai/LegendAITypes.ts +213 -5
- package/src/legend-ai/LegendAI_LegendApplicationPlugin_Extension.ts +25 -0
- package/src/legend-ai/__test-utils__/LegendAITestUtils.ts +55 -1
- package/src/legend-ai/components/LegendAIAnalysisPanel.tsx +14 -34
- package/src/legend-ai/components/LegendAIAnalysisUtils.ts +157 -47
- package/src/legend-ai/components/LegendAIChat.tsx +389 -206
- package/src/legend-ai/components/LegendAIChatHelpers.ts +117 -0
- package/src/legend-ai/components/LegendAIChatInput.tsx +209 -0
- package/src/legend-ai/components/LegendAIScopeSelector.tsx +199 -0
- package/src/legend-ai/index.ts +31 -4
- package/src/legend-ai/stores/LegendAIChatProcessors.ts +2563 -0
- package/src/legend-ai/stores/LegendAIChatState.ts +161 -1697
- package/tsconfig.json +5 -0
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026-present, Goldman Sachs
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { ClassDocumentationEntry, AssociationDocumentationEntry, PropertyDocumentationEntry, } from '../model-documentation/index.js';
|
|
17
|
+
/**
|
|
18
|
+
* Builds a lookup map from lowercase property name to its documentation entry.
|
|
19
|
+
* Used to enrich TDS columns with business descriptions and nullability
|
|
20
|
+
* from the PURE model's class properties.
|
|
21
|
+
*/
|
|
22
|
+
export function buildPropertyDocIndex(elementDocs) {
|
|
23
|
+
const index = new Map();
|
|
24
|
+
for (const entry of elementDocs) {
|
|
25
|
+
if (entry.elementEntry instanceof ClassDocumentationEntry &&
|
|
26
|
+
entry.entry instanceof PropertyDocumentationEntry) {
|
|
27
|
+
if (entry.entry.name) {
|
|
28
|
+
index.set(entry.entry.name.toLowerCase(), entry.entry);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return index;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Enriches TDS columns with documentation and nullability from model
|
|
36
|
+
* class property docs. Matches columns to properties case-insensitively.
|
|
37
|
+
*/
|
|
38
|
+
export function enrichColumnsFromElementDocs(columns, propIndex) {
|
|
39
|
+
for (const col of columns) {
|
|
40
|
+
const prop = propIndex.get(col.name.toLowerCase());
|
|
41
|
+
if (prop) {
|
|
42
|
+
if (!col.documentation && prop.docs.length > 0) {
|
|
43
|
+
col.documentation = prop.docs.join('; ');
|
|
44
|
+
}
|
|
45
|
+
if (col.nullable === undefined && prop.multiplicity) {
|
|
46
|
+
col.nullable = prop.multiplicity.lowerBound === 0;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function extractClassNamesFromPattern(pattern) {
|
|
52
|
+
return pattern
|
|
53
|
+
.split('/')
|
|
54
|
+
.filter(Boolean)
|
|
55
|
+
.flatMap((part) => {
|
|
56
|
+
const match = /^get(?<name>.+)$/i.exec(part);
|
|
57
|
+
return match?.groups?.name ? [match.groups.name] : [part];
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function formatMultiplicity(multiplicity) {
|
|
61
|
+
if (!multiplicity) {
|
|
62
|
+
return '*';
|
|
63
|
+
}
|
|
64
|
+
const upper = multiplicity.upperBound === undefined ? '*' : `${multiplicity.upperBound}`;
|
|
65
|
+
return `${multiplicity.lowerBound}..${upper}`;
|
|
66
|
+
}
|
|
67
|
+
function extractUniqueAssociations(elementDocs) {
|
|
68
|
+
const assocEntries = elementDocs
|
|
69
|
+
.map((e) => e.elementEntry)
|
|
70
|
+
.filter((e) => e instanceof AssociationDocumentationEntry);
|
|
71
|
+
const uniqueAssocs = new Map();
|
|
72
|
+
for (const a of assocEntries) {
|
|
73
|
+
if (!uniqueAssocs.has(a.path)) {
|
|
74
|
+
uniqueAssocs.set(a.path, a);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return uniqueAssocs;
|
|
78
|
+
}
|
|
79
|
+
function addAdjacencyEdge(adjacency, from, to, multiplicity) {
|
|
80
|
+
let edges = adjacency.get(from);
|
|
81
|
+
if (!edges) {
|
|
82
|
+
edges = [];
|
|
83
|
+
adjacency.set(from, edges);
|
|
84
|
+
}
|
|
85
|
+
edges.push({ target: to, multiplicity });
|
|
86
|
+
}
|
|
87
|
+
function buildAssociationAdjacency(uniqueAssocs) {
|
|
88
|
+
const adjacency = new Map();
|
|
89
|
+
for (const assoc of uniqueAssocs.values()) {
|
|
90
|
+
if (assoc.properties.length === 2) {
|
|
91
|
+
const [propA, propB] = assoc.properties;
|
|
92
|
+
if (propA && propB) {
|
|
93
|
+
const nameA = propA.name.toLowerCase();
|
|
94
|
+
const nameB = propB.name.toLowerCase();
|
|
95
|
+
addAdjacencyEdge(adjacency, nameA, nameB, formatMultiplicity(propB.multiplicity));
|
|
96
|
+
addAdjacencyEdge(adjacency, nameB, nameA, formatMultiplicity(propA.multiplicity));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return adjacency;
|
|
101
|
+
}
|
|
102
|
+
function findSharedColumns(svcA, svcB) {
|
|
103
|
+
const colsA = new Set(svcA.columns.map((c) => c.name.toLowerCase()));
|
|
104
|
+
return svcB.columns
|
|
105
|
+
.filter((c) => colsA.has(c.name.toLowerCase()))
|
|
106
|
+
.map((c) => c.name);
|
|
107
|
+
}
|
|
108
|
+
function findViaConnectionFromClass(clsA, classNamesB, adjacency) {
|
|
109
|
+
const edgesA = adjacency.get(clsA.toLowerCase());
|
|
110
|
+
if (!edgesA) {
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
for (const edgeA of edgesA) {
|
|
114
|
+
const edgesFromVia = adjacency.get(edgeA.target);
|
|
115
|
+
if (!edgesFromVia) {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
for (const clsB of classNamesB) {
|
|
119
|
+
const edgeB = edgesFromVia.find((e) => e.target === clsB.toLowerCase());
|
|
120
|
+
if (edgeB) {
|
|
121
|
+
return {
|
|
122
|
+
viaEntity: edgeA.target,
|
|
123
|
+
leftMult: edgeA.multiplicity,
|
|
124
|
+
rightMult: edgeB.multiplicity,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
function findViaRelationship(svcA, svcB, adjacency) {
|
|
132
|
+
const classNamesA = extractClassNamesFromPattern(svcA.pattern);
|
|
133
|
+
const classNamesB = extractClassNamesFromPattern(svcB.pattern);
|
|
134
|
+
for (const clsA of classNamesA) {
|
|
135
|
+
const via = findViaConnectionFromClass(clsA, classNamesB, adjacency);
|
|
136
|
+
if (via) {
|
|
137
|
+
return {
|
|
138
|
+
leftService: svcA.title,
|
|
139
|
+
rightService: svcB.title,
|
|
140
|
+
joinColumns: findSharedColumns(svcA, svcB),
|
|
141
|
+
viaEntity: via.viaEntity,
|
|
142
|
+
leftCardinality: via.leftMult,
|
|
143
|
+
rightCardinality: via.rightMult,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
function findDirectRelationship(svcA, svcB, adjacency) {
|
|
150
|
+
const classNamesA = extractClassNamesFromPattern(svcA.pattern);
|
|
151
|
+
const classNamesB = extractClassNamesFromPattern(svcB.pattern);
|
|
152
|
+
for (const clsA of classNamesA) {
|
|
153
|
+
const edges = adjacency.get(clsA.toLowerCase());
|
|
154
|
+
if (!edges) {
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
for (const clsB of classNamesB) {
|
|
158
|
+
const edge = edges.find((e) => e.target === clsB.toLowerCase());
|
|
159
|
+
if (edge) {
|
|
160
|
+
return {
|
|
161
|
+
leftService: svcA.title,
|
|
162
|
+
rightService: svcB.title,
|
|
163
|
+
joinColumns: findSharedColumns(svcA, svcB),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return undefined;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Infers cross-service relationships from association documentation entries.
|
|
172
|
+
*
|
|
173
|
+
* Associations in the PURE model define how classes connect (e.g.,
|
|
174
|
+
* `Trade ──(1:*)──→ Instrument`). By finding associations that link
|
|
175
|
+
* classes backing different services, we determine:
|
|
176
|
+
* - Which services share a common parent entity (the via entity)
|
|
177
|
+
* - The cardinality of each side (1:1, 1:*, etc.)
|
|
178
|
+
* - Which columns to JOIN on (shared column names)
|
|
179
|
+
*
|
|
180
|
+
* Used by both Data Space and Data Product AI integrations.
|
|
181
|
+
*/
|
|
182
|
+
export function inferServiceRelationshipsFromAssociations(services, elementDocs) {
|
|
183
|
+
const uniqueAssocs = extractUniqueAssociations(elementDocs);
|
|
184
|
+
const adjacency = buildAssociationAdjacency(uniqueAssocs);
|
|
185
|
+
const relationships = [];
|
|
186
|
+
const seen = new Set();
|
|
187
|
+
for (let i = 0; i < services.length; i++) {
|
|
188
|
+
for (let j = i + 1; j < services.length; j++) {
|
|
189
|
+
const svcA = services[i];
|
|
190
|
+
const svcB = services[j];
|
|
191
|
+
if (!svcA || !svcB) {
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
const key = `${svcA.title}|${svcB.title}`;
|
|
195
|
+
if (seen.has(key)) {
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
const relationship = findViaRelationship(svcA, svcB, adjacency) ??
|
|
199
|
+
findDirectRelationship(svcA, svcB, adjacency);
|
|
200
|
+
if (relationship) {
|
|
201
|
+
seen.add(key);
|
|
202
|
+
relationships.push(relationship);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return relationships;
|
|
207
|
+
}
|
|
208
|
+
function isLambdaNode(value) {
|
|
209
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
210
|
+
}
|
|
211
|
+
function collectPropertyPath(node) {
|
|
212
|
+
if (node._type !== 'property' || !node.property) {
|
|
213
|
+
return undefined;
|
|
214
|
+
}
|
|
215
|
+
const params = node.parameters;
|
|
216
|
+
if (!params || params.length === 0) {
|
|
217
|
+
return node.property;
|
|
218
|
+
}
|
|
219
|
+
const firstParam = params[0];
|
|
220
|
+
if (!firstParam) {
|
|
221
|
+
return node.property;
|
|
222
|
+
}
|
|
223
|
+
if (firstParam._type === 'var') {
|
|
224
|
+
return node.property;
|
|
225
|
+
}
|
|
226
|
+
const parentPath = collectPropertyPath(firstParam);
|
|
227
|
+
if (parentPath) {
|
|
228
|
+
return `${parentPath}.${node.property}`;
|
|
229
|
+
}
|
|
230
|
+
return node.property;
|
|
231
|
+
}
|
|
232
|
+
function extractLiteralValue(node) {
|
|
233
|
+
if (node._type === 'string' &&
|
|
234
|
+
(typeof node.value === 'string' || typeof node.value === 'number')) {
|
|
235
|
+
return node.value;
|
|
236
|
+
}
|
|
237
|
+
if (node._type === 'integer' && typeof node.value === 'number') {
|
|
238
|
+
return node.value;
|
|
239
|
+
}
|
|
240
|
+
if (node._type === 'float' && typeof node.value === 'number') {
|
|
241
|
+
return node.value;
|
|
242
|
+
}
|
|
243
|
+
if (node._type === 'boolean' && typeof node.value === 'boolean') {
|
|
244
|
+
return node.value;
|
|
245
|
+
}
|
|
246
|
+
if (node._type === 'strictDate' && typeof node.value === 'string') {
|
|
247
|
+
return node.value;
|
|
248
|
+
}
|
|
249
|
+
return undefined;
|
|
250
|
+
}
|
|
251
|
+
function tryExtractEqualFilter(node) {
|
|
252
|
+
if (node.parameters?.length !== 2) {
|
|
253
|
+
return undefined;
|
|
254
|
+
}
|
|
255
|
+
const [left, right] = node.parameters;
|
|
256
|
+
if (!left || !right) {
|
|
257
|
+
return undefined;
|
|
258
|
+
}
|
|
259
|
+
const propPath = collectPropertyPath(left);
|
|
260
|
+
const literal = extractLiteralValue(right);
|
|
261
|
+
if (propPath && literal !== undefined) {
|
|
262
|
+
return { property: propPath, operator: 'equal', value: literal };
|
|
263
|
+
}
|
|
264
|
+
return undefined;
|
|
265
|
+
}
|
|
266
|
+
function tryExtractUnaryFilter(node, operator) {
|
|
267
|
+
if (node.parameters?.length !== 1) {
|
|
268
|
+
return undefined;
|
|
269
|
+
}
|
|
270
|
+
const [arg] = node.parameters;
|
|
271
|
+
const propPath = arg ? collectPropertyPath(arg) : undefined;
|
|
272
|
+
if (propPath) {
|
|
273
|
+
return { property: propPath, operator };
|
|
274
|
+
}
|
|
275
|
+
return undefined;
|
|
276
|
+
}
|
|
277
|
+
function extractFiltersFromExpression(node, results) {
|
|
278
|
+
if (node._type !== 'func' || !node.parameters) {
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
if (node.function === 'equal') {
|
|
282
|
+
const filter = tryExtractEqualFilter(node);
|
|
283
|
+
if (filter) {
|
|
284
|
+
results.push(filter);
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
if (node.function === 'isEmpty' || node.function === 'isNotEmpty') {
|
|
289
|
+
const filter = tryExtractUnaryFilter(node, node.function);
|
|
290
|
+
if (filter) {
|
|
291
|
+
results.push(filter);
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
for (const param of node.parameters) {
|
|
296
|
+
extractFiltersFromExpression(param, results);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
function extractFiltersFromFilterCall(filterLambda, results) {
|
|
300
|
+
const body = filterLambda.body;
|
|
301
|
+
if (!body || !Array.isArray(body)) {
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
for (const expr of body) {
|
|
305
|
+
extractFiltersFromExpression(expr, results);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
function processFilterNode(node, results) {
|
|
309
|
+
const params = node.parameters;
|
|
310
|
+
if (params?.length === 2) {
|
|
311
|
+
const filterLambdaParam = params[1];
|
|
312
|
+
if (filterLambdaParam?._type === 'lambda') {
|
|
313
|
+
extractFiltersFromFilterCall(filterLambdaParam, results);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
if (params) {
|
|
317
|
+
walkLambdaBody(params, results);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
function walkLambdaBody(nodes, results) {
|
|
321
|
+
for (const rawNode of nodes) {
|
|
322
|
+
if (!isLambdaNode(rawNode)) {
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
if (rawNode._type === 'func' && rawNode.function === 'filter') {
|
|
326
|
+
processFilterNode(rawNode, results);
|
|
327
|
+
}
|
|
328
|
+
else if (rawNode._type === 'func' && rawNode.parameters) {
|
|
329
|
+
walkLambdaBody(rawNode.parameters, results);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
function processPostFilterNode(rawNode, results) {
|
|
334
|
+
if (rawNode.function === 'filter' && rawNode.parameters?.length === 2) {
|
|
335
|
+
const innerLambda = rawNode.parameters[1];
|
|
336
|
+
if (innerLambda?._type === 'lambda' && innerLambda.body) {
|
|
337
|
+
for (const bodyNode of innerLambda.body) {
|
|
338
|
+
collectIsNotNullChecks(bodyNode, results);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
extractIsNotNullPostFilters(rawNode.parameters, results);
|
|
342
|
+
}
|
|
343
|
+
else if (rawNode.parameters) {
|
|
344
|
+
extractIsNotNullPostFilters(rawNode.parameters, results);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
function extractIsNotNullPostFilters(nodes, results) {
|
|
348
|
+
for (const rawNode of nodes) {
|
|
349
|
+
if (!isLambdaNode(rawNode)) {
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
if (rawNode._type !== 'func') {
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
processPostFilterNode(rawNode, results);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
function collectIsNotNullChecks(node, results) {
|
|
359
|
+
if (node._type === 'property' && node.property === 'isNotNull') {
|
|
360
|
+
const colNameNode = node.parameters?.[1];
|
|
361
|
+
if (colNameNode?._type === 'string' &&
|
|
362
|
+
typeof colNameNode.value === 'string') {
|
|
363
|
+
results.push({
|
|
364
|
+
property: colNameNode.value,
|
|
365
|
+
operator: 'isNotNull',
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
if (node._type === 'func' && node.function === 'and' && node.parameters) {
|
|
371
|
+
for (const param of node.parameters) {
|
|
372
|
+
collectIsNotNullChecks(param, results);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Extracts hardcoded pre-filter constraints from a raw lambda body.
|
|
378
|
+
*
|
|
379
|
+
* Walks the lambda JSON tree to find:
|
|
380
|
+
* - `equal` comparisons with literal values (e.g. `fsymId == 'D7HG0X-S'`)
|
|
381
|
+
* - `isEmpty` checks (e.g. `consEndDate->isEmpty()`)
|
|
382
|
+
* - `isNotNull` post-projection TDS row checks (e.g. `row.isNotNull('Fe Mean')`)
|
|
383
|
+
*
|
|
384
|
+
* The `rawLambdaBody` parameter is `RawLambda.body` — the raw JSON array
|
|
385
|
+
* from the PURE protocol.
|
|
386
|
+
*/
|
|
387
|
+
export function extractLambdaPreFilters(rawLambdaBody) {
|
|
388
|
+
if (!rawLambdaBody || !Array.isArray(rawLambdaBody)) {
|
|
389
|
+
return [];
|
|
390
|
+
}
|
|
391
|
+
const results = [];
|
|
392
|
+
walkLambdaBody(rawLambdaBody, results);
|
|
393
|
+
extractIsNotNullPostFilters(rawLambdaBody, results);
|
|
394
|
+
return results;
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Formats pre-filter constraints into a human-readable summary for LLM context.
|
|
398
|
+
* This generates a concise description of what's hardcoded in the service lambda
|
|
399
|
+
* so the AI avoids generating contradictory WHERE clauses.
|
|
400
|
+
*/
|
|
401
|
+
export function formatPreFiltersForContext(preFilters) {
|
|
402
|
+
if (preFilters.length === 0) {
|
|
403
|
+
return '';
|
|
404
|
+
}
|
|
405
|
+
const parts = [];
|
|
406
|
+
for (const pf of preFilters) {
|
|
407
|
+
const shortProp = pf.property.includes('.')
|
|
408
|
+
? (pf.property.split('.').pop() ?? pf.property)
|
|
409
|
+
: pf.property;
|
|
410
|
+
switch (pf.operator) {
|
|
411
|
+
case 'equal':
|
|
412
|
+
parts.push(`${shortProp} = '${String(pf.value)}'`);
|
|
413
|
+
break;
|
|
414
|
+
case 'isEmpty':
|
|
415
|
+
parts.push(`${shortProp} IS NULL (always)`);
|
|
416
|
+
break;
|
|
417
|
+
case 'isNotEmpty':
|
|
418
|
+
parts.push(`${shortProp} IS NOT NULL (always)`);
|
|
419
|
+
break;
|
|
420
|
+
case 'isNotNull':
|
|
421
|
+
parts.push(`${shortProp} IS NOT NULL (post-filter)`);
|
|
422
|
+
break;
|
|
423
|
+
default:
|
|
424
|
+
break;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
return `Pre-applied filters: ${parts.join('; ')}`;
|
|
428
|
+
}
|
|
429
|
+
//# sourceMappingURL=LegendAIDocEnrichment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LegendAIDocEnrichment.js","sourceRoot":"","sources":["../../src/legend-ai/LegendAIDocEnrichment.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
import type { DataGridColumnDefinition } from '../data-grid/index.js';
|
|
17
|
-
import type
|
|
17
|
+
import { type TDSRowDataType, type QueryExplicitExecutionContextInfo, type AbstractPureGraphManager, type GraphManagerState } from '@finos/legend-graph';
|
|
18
18
|
import type { LegendApplicationPlugin } from '@finos/legend-application';
|
|
19
19
|
import { LegendAI_LegendApplicationPlugin_Extension, type LegendAIOrchestratorDataProductCoordinates } from './LegendAI_LegendApplicationPlugin_Extension.js';
|
|
20
20
|
export declare class TDSColumnSchema {
|
|
@@ -22,6 +22,28 @@ export declare class TDSColumnSchema {
|
|
|
22
22
|
type?: string;
|
|
23
23
|
documentation?: string;
|
|
24
24
|
sampleValues?: string;
|
|
25
|
+
/** Whether this column is nullable (multiplicity lowerBound === 0). */
|
|
26
|
+
nullable?: boolean;
|
|
27
|
+
/** Physical relational type (e.g. 'VARCHAR(100)', 'DECIMAL(18,4)'). */
|
|
28
|
+
relationalType?: string;
|
|
29
|
+
}
|
|
30
|
+
export declare class TDSParameterSchema {
|
|
31
|
+
name: string;
|
|
32
|
+
type?: string;
|
|
33
|
+
required?: boolean;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Describes a hardcoded filter constraint baked into a service lambda.
|
|
37
|
+
* These are equality checks, isEmpty/isNotEmpty checks, or isNotNull
|
|
38
|
+
* guards that are applied before the TDS result is returned.
|
|
39
|
+
*/
|
|
40
|
+
export interface TDSServicePreFilter {
|
|
41
|
+
/** Dot-separated property path (e.g. 'FeSecCoveragePublic.SymCoveragePublicEquities.SymSecEntityPublic.fsymId'). */
|
|
42
|
+
property: string;
|
|
43
|
+
/** The comparison operator. */
|
|
44
|
+
operator: 'equal' | 'isEmpty' | 'isNotEmpty' | 'isNotNull';
|
|
45
|
+
/** The literal value for equality comparisons. */
|
|
46
|
+
value?: string | number | boolean;
|
|
25
47
|
}
|
|
26
48
|
export declare enum TDSServiceSourceType {
|
|
27
49
|
SERVICE = "service",
|
|
@@ -33,6 +55,12 @@ export declare class TDSServiceSchema {
|
|
|
33
55
|
pattern: string;
|
|
34
56
|
columns: TDSColumnSchema[];
|
|
35
57
|
parameters: string[];
|
|
58
|
+
/**
|
|
59
|
+
* Rich parameter metadata including type and multiplicity.
|
|
60
|
+
* When populated, downstream consumers can use this for richer
|
|
61
|
+
* prompts and user-facing hints. Falls back to `parameters` names.
|
|
62
|
+
*/
|
|
63
|
+
parameterSchemas?: TDSParameterSchema[];
|
|
36
64
|
/**
|
|
37
65
|
* Indicates the source of this service schema.
|
|
38
66
|
* - SERVICE: traditional DataSpace service executable (uses `FROM service(...)` SQL syntax)
|
|
@@ -41,11 +69,27 @@ export declare class TDSServiceSchema {
|
|
|
41
69
|
sourceType?: TDSServiceSourceType;
|
|
42
70
|
/** Full data product path (e.g. 'my::package::DataProduct'), used with `p()` syntax for access points. */
|
|
43
71
|
dataProductPath?: string;
|
|
72
|
+
/**
|
|
73
|
+
* Set to true when parameter extraction from the service query failed.
|
|
74
|
+
* Downstream consumers can use this to warn users that required parameters
|
|
75
|
+
* may not be detected automatically.
|
|
76
|
+
*/
|
|
77
|
+
parameterExtractionFailed?: boolean;
|
|
78
|
+
/** Access point group title this AP belongs to. */
|
|
79
|
+
accessPointGroupTitle?: string;
|
|
80
|
+
/** Raw DDL script (CREATE VIEW/TABLE) from the access point resource builder. */
|
|
81
|
+
ddlScript?: string;
|
|
82
|
+
/**
|
|
83
|
+
* Hardcoded filter constraints extracted from the service lambda.
|
|
84
|
+
* These indicate pre-applied conditions the AI must not contradict.
|
|
85
|
+
*/
|
|
86
|
+
preFilters?: TDSServicePreFilter[];
|
|
44
87
|
}
|
|
45
88
|
export declare class LegendAIConfig {
|
|
46
89
|
enabled: boolean;
|
|
47
90
|
llmServiceUrl: string | undefined;
|
|
48
91
|
llmModelName: string | undefined;
|
|
92
|
+
llmModelOptions?: string[];
|
|
49
93
|
sqlExecutionUrl: string | undefined;
|
|
50
94
|
orchestratorUrl: string | undefined;
|
|
51
95
|
marketplaceSearchUrl: string | undefined;
|
|
@@ -66,6 +110,13 @@ export declare const LAKEHOUSE_ENV_PROD = "prod";
|
|
|
66
110
|
export declare const COVERAGE_NAME_PROD = "legend-ai";
|
|
67
111
|
/** EngHub coverage app name for non-production (sandbox). */
|
|
68
112
|
export declare const COVERAGE_NAME_SANDBOX = "Legend-AI-Sandbox";
|
|
113
|
+
/**
|
|
114
|
+
* Delimiter used in TDS column `doc` fields to separate human-readable
|
|
115
|
+
* documentation from sample values. Shared across DataProduct and
|
|
116
|
+
* DataSpace parsers.
|
|
117
|
+
*/
|
|
118
|
+
export declare const TDS_SAMPLE_VALUES_DELIMITER = "-- e.g.";
|
|
119
|
+
export declare function getTodayISO(): string;
|
|
69
120
|
/** Action ID used to offer the Legend AI Orchestrator as a fallback. */
|
|
70
121
|
export declare const LEGEND_AI_ORCHESTRATOR_FALLBACK_ACTION_ID = "orchestrator-fallback";
|
|
71
122
|
export declare function findLegendAIPlugin(plugins: LegendApplicationPlugin[]): LegendAI_LegendApplicationPlugin_Extension | undefined;
|
|
@@ -109,6 +160,18 @@ export interface LegendAIFallbackAction {
|
|
|
109
160
|
label: string;
|
|
110
161
|
actionId: string;
|
|
111
162
|
}
|
|
163
|
+
export declare enum LegendAIMessageFeedbackRating {
|
|
164
|
+
THUMBS_UP = "thumbs_up",
|
|
165
|
+
THUMBS_DOWN = "thumbs_down"
|
|
166
|
+
}
|
|
167
|
+
export interface LegendAIMessageFeedback {
|
|
168
|
+
messageId: string;
|
|
169
|
+
rating: LegendAIMessageFeedbackRating;
|
|
170
|
+
question: string;
|
|
171
|
+
answer?: string;
|
|
172
|
+
sql?: string;
|
|
173
|
+
rowCount?: number;
|
|
174
|
+
}
|
|
112
175
|
export declare class LegendAIAssistantMessage {
|
|
113
176
|
id: string;
|
|
114
177
|
role: LegendAIMessageRole.ASSISTANT;
|
|
@@ -136,12 +199,19 @@ export declare class LegendAIConversationTurn {
|
|
|
136
199
|
* to differentiate prior metadata answers from SQL query results.
|
|
137
200
|
*/
|
|
138
201
|
intent?: LegendAIQuestionIntent;
|
|
202
|
+
/** Number of rows returned by the query, when available. */
|
|
203
|
+
rowCount?: number;
|
|
204
|
+
/** Brief summary of the result (e.g. column names, first few values). */
|
|
205
|
+
resultSummary?: string;
|
|
139
206
|
}
|
|
140
207
|
export interface LegendAIChatState {
|
|
141
208
|
questionText: string;
|
|
142
209
|
setQuestionText: (text: string) => void;
|
|
143
210
|
isSending: boolean;
|
|
144
211
|
messages: LegendAIMessage[];
|
|
212
|
+
selectedModelName: string | undefined;
|
|
213
|
+
availableModelNames: string[];
|
|
214
|
+
setSelectedModelName: (modelName: string) => void;
|
|
145
215
|
askQuestion: () => void;
|
|
146
216
|
askQuestionWithIntent: (text: string, intent: LegendAIQuestionIntent) => void;
|
|
147
217
|
runFallbackAction: (messageId: string) => void;
|
|
@@ -151,10 +221,21 @@ export interface LegendAIChatState {
|
|
|
151
221
|
conversationRef: {
|
|
152
222
|
readonly current: HTMLDivElement | null;
|
|
153
223
|
};
|
|
224
|
+
selectedScopes: LegendAIScopeItem[];
|
|
225
|
+
toggleScope: (scope: LegendAIScopeItem) => void;
|
|
226
|
+
removeScope: (scopeId: string) => void;
|
|
227
|
+
stopGeneration: () => void;
|
|
228
|
+
}
|
|
229
|
+
export interface LegendAIScopeItem {
|
|
230
|
+
id: string;
|
|
231
|
+
label: string;
|
|
232
|
+
description?: string;
|
|
154
233
|
}
|
|
155
234
|
export interface LegendAIServiceSummary {
|
|
156
235
|
title: string;
|
|
157
236
|
description?: string;
|
|
237
|
+
columnNames?: string[];
|
|
238
|
+
parameters?: string[];
|
|
158
239
|
}
|
|
159
240
|
export interface LegendAIAccessPointInfo {
|
|
160
241
|
title?: string;
|
|
@@ -169,6 +250,30 @@ export declare class LegendAIAccessPointGroupInfo {
|
|
|
169
250
|
description?: string;
|
|
170
251
|
accessPoints: LegendAIAccessPointInfo[];
|
|
171
252
|
}
|
|
253
|
+
export interface LegendAIAccessPointRelationship {
|
|
254
|
+
leftAccessPoint: string;
|
|
255
|
+
rightAccessPoint: string;
|
|
256
|
+
sharedColumns: string[];
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Describes a relationship between two TDS services in a DataSpace,
|
|
260
|
+
* derived from model association documentation (elementDocs).
|
|
261
|
+
* Used to generate accurate JOIN hints in LLM prompts.
|
|
262
|
+
*/
|
|
263
|
+
export interface LegendAIServiceRelationship {
|
|
264
|
+
/** Title of the first service. */
|
|
265
|
+
leftService: string;
|
|
266
|
+
/** Title of the second service. */
|
|
267
|
+
rightService: string;
|
|
268
|
+
/** Column names that can serve as JOIN keys between the services. */
|
|
269
|
+
joinColumns: string[];
|
|
270
|
+
/** Name of the intermediate entity connecting both services (e.g. "Own2Ownermap"). */
|
|
271
|
+
viaEntity?: string;
|
|
272
|
+
/** Cardinality from the connecting entity to the left service (e.g. "1:*"). */
|
|
273
|
+
leftCardinality?: string;
|
|
274
|
+
/** Cardinality from the connecting entity to the right service (e.g. "1:*"). */
|
|
275
|
+
rightCardinality?: string;
|
|
276
|
+
}
|
|
172
277
|
export declare class LegendAIProductMetadata {
|
|
173
278
|
name: string;
|
|
174
279
|
description?: string;
|
|
@@ -177,6 +282,12 @@ export declare class LegendAIProductMetadata {
|
|
|
177
282
|
accessPointGroups?: LegendAIAccessPointGroupInfo[];
|
|
178
283
|
tags?: LegendAITagInfo[];
|
|
179
284
|
supportInfo?: string;
|
|
285
|
+
/** Inferred cross-access-point relationships based on shared column names. */
|
|
286
|
+
accessPointRelationships?: LegendAIAccessPointRelationship[];
|
|
287
|
+
/** Cross-service relationships derived from model associations (elementDocs). */
|
|
288
|
+
serviceRelationships?: LegendAIServiceRelationship[];
|
|
289
|
+
/** Per-product domain knowledge for LLM context enrichment. */
|
|
290
|
+
domainContext?: string;
|
|
180
291
|
}
|
|
181
292
|
export declare enum LegendAIQuestionIntent {
|
|
182
293
|
DATA_QUERY = "data_query",
|
|
@@ -207,6 +318,11 @@ export declare function classifyQuestionIntentFast(question: string, hasServices
|
|
|
207
318
|
* Returns just the intent, discarding ambiguity info.
|
|
208
319
|
*/
|
|
209
320
|
export declare function classifyQuestionIntent(question: string, hasServices: boolean): LegendAIQuestionIntent;
|
|
321
|
+
export declare function extractParameterSchemas(query: string, graphManager: AbstractPureGraphManager, graphManagerState: GraphManagerState): Promise<{
|
|
322
|
+
parameters: string[];
|
|
323
|
+
parameterSchemas: TDSParameterSchema[];
|
|
324
|
+
parameterExtractionFailed: boolean;
|
|
325
|
+
}>;
|
|
210
326
|
export interface LegendAIChatProps {
|
|
211
327
|
services: TDSServiceSchema[];
|
|
212
328
|
coordinates: string;
|
|
@@ -225,5 +341,15 @@ export interface LegendAIChatProps {
|
|
|
225
341
|
* returned by the orchestrator. Required for the execute-after-generate flow.
|
|
226
342
|
*/
|
|
227
343
|
pureExecutionContext?: QueryExplicitExecutionContextInfo;
|
|
344
|
+
availableScopes?: LegendAIScopeItem[];
|
|
345
|
+
/** Called when the user clicks the close button in the chat header. */
|
|
346
|
+
onClose?: () => void;
|
|
347
|
+
/** Called when the user clicks the minimize button in the chat header. */
|
|
348
|
+
onMinimize?: () => void;
|
|
349
|
+
/**
|
|
350
|
+
* Optional callback fired when users submit thumbs-up/down feedback
|
|
351
|
+
* for an assistant response.
|
|
352
|
+
*/
|
|
353
|
+
onMessageFeedback?: (feedback: LegendAIMessageFeedback) => Promise<void> | void;
|
|
228
354
|
}
|
|
229
355
|
//# sourceMappingURL=LegendAITypes.d.ts.map
|