@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.
Files changed (67) hide show
  1. package/lib/index.css +2 -2
  2. package/lib/index.css.map +1 -1
  3. package/lib/legend-ai/LegendAIDocEnrichment.d.ts +60 -0
  4. package/lib/legend-ai/LegendAIDocEnrichment.d.ts.map +1 -0
  5. package/lib/legend-ai/LegendAIDocEnrichment.js +429 -0
  6. package/lib/legend-ai/LegendAIDocEnrichment.js.map +1 -0
  7. package/lib/legend-ai/LegendAITypes.d.ts +127 -1
  8. package/lib/legend-ai/LegendAITypes.d.ts.map +1 -1
  9. package/lib/legend-ai/LegendAITypes.js +111 -2
  10. package/lib/legend-ai/LegendAITypes.js.map +1 -1
  11. package/lib/legend-ai/LegendAI_LegendApplicationPlugin_Extension.d.ts +14 -1
  12. package/lib/legend-ai/LegendAI_LegendApplicationPlugin_Extension.d.ts.map +1 -1
  13. package/lib/legend-ai/LegendAI_LegendApplicationPlugin_Extension.js.map +1 -1
  14. package/lib/legend-ai/__test-utils__/LegendAITestUtils.d.ts +2 -1
  15. package/lib/legend-ai/__test-utils__/LegendAITestUtils.d.ts.map +1 -1
  16. package/lib/legend-ai/__test-utils__/LegendAITestUtils.js +37 -2
  17. package/lib/legend-ai/__test-utils__/LegendAITestUtils.js.map +1 -1
  18. package/lib/legend-ai/components/LegendAIAnalysisPanel.d.ts.map +1 -1
  19. package/lib/legend-ai/components/LegendAIAnalysisPanel.js +11 -12
  20. package/lib/legend-ai/components/LegendAIAnalysisPanel.js.map +1 -1
  21. package/lib/legend-ai/components/LegendAIAnalysisUtils.d.ts +7 -0
  22. package/lib/legend-ai/components/LegendAIAnalysisUtils.d.ts.map +1 -1
  23. package/lib/legend-ai/components/LegendAIAnalysisUtils.js +106 -41
  24. package/lib/legend-ai/components/LegendAIAnalysisUtils.js.map +1 -1
  25. package/lib/legend-ai/components/LegendAIChat.d.ts +1 -5
  26. package/lib/legend-ai/components/LegendAIChat.d.ts.map +1 -1
  27. package/lib/legend-ai/components/LegendAIChat.js +168 -109
  28. package/lib/legend-ai/components/LegendAIChat.js.map +1 -1
  29. package/lib/legend-ai/components/LegendAIChatHelpers.d.ts +21 -0
  30. package/lib/legend-ai/components/LegendAIChatHelpers.d.ts.map +1 -0
  31. package/lib/legend-ai/components/LegendAIChatHelpers.js +85 -0
  32. package/lib/legend-ai/components/LegendAIChatHelpers.js.map +1 -0
  33. package/lib/legend-ai/components/LegendAIChatInput.d.ts +21 -0
  34. package/lib/legend-ai/components/LegendAIChatInput.d.ts.map +1 -0
  35. package/lib/legend-ai/components/LegendAIChatInput.js +78 -0
  36. package/lib/legend-ai/components/LegendAIChatInput.js.map +1 -0
  37. package/lib/legend-ai/components/LegendAIScopeSelector.d.ts +25 -0
  38. package/lib/legend-ai/components/LegendAIScopeSelector.d.ts.map +1 -0
  39. package/lib/legend-ai/components/LegendAIScopeSelector.js +85 -0
  40. package/lib/legend-ai/components/LegendAIScopeSelector.js.map +1 -0
  41. package/lib/legend-ai/index.d.ts +8 -3
  42. package/lib/legend-ai/index.d.ts.map +1 -1
  43. package/lib/legend-ai/index.js +8 -3
  44. package/lib/legend-ai/index.js.map +1 -1
  45. package/lib/legend-ai/stores/LegendAIChatProcessors.d.ts +105 -0
  46. package/lib/legend-ai/stores/LegendAIChatProcessors.d.ts.map +1 -0
  47. package/lib/legend-ai/stores/LegendAIChatProcessors.js +1482 -0
  48. package/lib/legend-ai/stores/LegendAIChatProcessors.js.map +1 -0
  49. package/lib/legend-ai/stores/LegendAIChatState.d.ts +2 -35
  50. package/lib/legend-ai/stores/LegendAIChatState.d.ts.map +1 -1
  51. package/lib/legend-ai/stores/LegendAIChatState.js +114 -949
  52. package/lib/legend-ai/stores/LegendAIChatState.js.map +1 -1
  53. package/package.json +5 -5
  54. package/src/legend-ai/LegendAIDocEnrichment.ts +572 -0
  55. package/src/legend-ai/LegendAITypes.ts +213 -5
  56. package/src/legend-ai/LegendAI_LegendApplicationPlugin_Extension.ts +25 -0
  57. package/src/legend-ai/__test-utils__/LegendAITestUtils.ts +55 -1
  58. package/src/legend-ai/components/LegendAIAnalysisPanel.tsx +14 -34
  59. package/src/legend-ai/components/LegendAIAnalysisUtils.ts +157 -47
  60. package/src/legend-ai/components/LegendAIChat.tsx +389 -206
  61. package/src/legend-ai/components/LegendAIChatHelpers.ts +117 -0
  62. package/src/legend-ai/components/LegendAIChatInput.tsx +209 -0
  63. package/src/legend-ai/components/LegendAIScopeSelector.tsx +199 -0
  64. package/src/legend-ai/index.ts +31 -4
  65. package/src/legend-ai/stores/LegendAIChatProcessors.ts +2563 -0
  66. package/src/legend-ai/stores/LegendAIChatState.ts +161 -1697
  67. 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 { TDSRowDataType, QueryExplicitExecutionContextInfo } from '@finos/legend-graph';
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