@finos/legend-lego 2.0.211 → 2.0.213
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 +12 -12
- package/lib/legend-ai/LegendAIDocEnrichment.d.ts.map +1 -1
- package/lib/legend-ai/LegendAIDocEnrichment.js +317 -86
- package/lib/legend-ai/LegendAIDocEnrichment.js.map +1 -1
- package/lib/legend-ai/LegendAIHostIntegration.d.ts +31 -0
- package/lib/legend-ai/LegendAIHostIntegration.d.ts.map +1 -0
- package/lib/legend-ai/LegendAIHostIntegration.js +50 -0
- package/lib/legend-ai/LegendAIHostIntegration.js.map +1 -0
- package/lib/legend-ai/LegendAIServiceRetrieval.d.ts.map +1 -1
- package/lib/legend-ai/LegendAIServiceRetrieval.js +34 -35
- package/lib/legend-ai/LegendAIServiceRetrieval.js.map +1 -1
- package/lib/legend-ai/LegendAITypes.d.ts +85 -7
- package/lib/legend-ai/LegendAITypes.d.ts.map +1 -1
- package/lib/legend-ai/LegendAITypes.js +99 -1
- package/lib/legend-ai/LegendAITypes.js.map +1 -1
- package/lib/legend-ai/LegendAI_LegendApplicationPlugin_Extension.d.ts +36 -3
- package/lib/legend-ai/LegendAI_LegendApplicationPlugin_Extension.d.ts.map +1 -1
- package/lib/legend-ai/LegendAI_LegendApplicationPlugin_Extension.js +29 -0
- package/lib/legend-ai/LegendAI_LegendApplicationPlugin_Extension.js.map +1 -1
- package/lib/legend-ai/__test-utils__/LegendAITestUtils.d.ts.map +1 -1
- package/lib/legend-ai/__test-utils__/LegendAITestUtils.js +7 -0
- package/lib/legend-ai/__test-utils__/LegendAITestUtils.js.map +1 -1
- package/lib/legend-ai/components/LegendAICharts.d.ts.map +1 -1
- package/lib/legend-ai/components/LegendAICharts.js +6 -10
- package/lib/legend-ai/components/LegendAICharts.js.map +1 -1
- package/lib/legend-ai/components/LegendAIChat.d.ts.map +1 -1
- package/lib/legend-ai/components/LegendAIChat.js +263 -41
- package/lib/legend-ai/components/LegendAIChat.js.map +1 -1
- package/lib/legend-ai/components/LegendAIChatInput.d.ts +1 -1
- package/lib/legend-ai/components/LegendAIChatInput.d.ts.map +1 -1
- package/lib/legend-ai/components/LegendAIChatInput.js +2 -1
- package/lib/legend-ai/components/LegendAIChatInput.js.map +1 -1
- package/lib/legend-ai/index.d.ts +5 -2
- package/lib/legend-ai/index.d.ts.map +1 -1
- package/lib/legend-ai/index.js +5 -2
- package/lib/legend-ai/index.js.map +1 -1
- package/lib/legend-ai/stores/LegendAIChatProcessors.d.ts +9 -3
- package/lib/legend-ai/stores/LegendAIChatProcessors.d.ts.map +1 -1
- package/lib/legend-ai/stores/LegendAIChatProcessors.js +794 -220
- package/lib/legend-ai/stores/LegendAIChatProcessors.js.map +1 -1
- package/lib/legend-ai/stores/LegendAIChatState.d.ts.map +1 -1
- package/lib/legend-ai/stores/LegendAIChatState.js +47 -21
- package/lib/legend-ai/stores/LegendAIChatState.js.map +1 -1
- package/lib/legend-ai/stores/LegendAIJoinAnalysis.d.ts +29 -0
- package/lib/legend-ai/stores/LegendAIJoinAnalysis.d.ts.map +1 -0
- package/lib/legend-ai/stores/LegendAIJoinAnalysis.js +124 -0
- package/lib/legend-ai/stores/LegendAIJoinAnalysis.js.map +1 -0
- package/lib/legend-ai/stores/LegendAISqlHelpers.d.ts +25 -0
- package/lib/legend-ai/stores/LegendAISqlHelpers.d.ts.map +1 -0
- package/lib/legend-ai/stores/LegendAISqlHelpers.js +64 -0
- package/lib/legend-ai/stores/LegendAISqlHelpers.js.map +1 -0
- package/lib/legend-ai/stores/LegendAISqlJoinSanitizers.d.ts +22 -0
- package/lib/legend-ai/stores/LegendAISqlJoinSanitizers.d.ts.map +1 -0
- package/lib/legend-ai/stores/LegendAISqlJoinSanitizers.js +411 -0
- package/lib/legend-ai/stores/LegendAISqlJoinSanitizers.js.map +1 -0
- package/package.json +6 -6
- package/src/legend-ai/LegendAIDocEnrichment.ts +435 -97
- package/src/legend-ai/LegendAIHostIntegration.tsx +80 -0
- package/src/legend-ai/LegendAIServiceRetrieval.ts +50 -35
- package/src/legend-ai/LegendAITypes.ts +169 -5
- package/src/legend-ai/LegendAI_LegendApplicationPlugin_Extension.ts +73 -1
- package/src/legend-ai/__test-utils__/LegendAITestUtils.ts +10 -0
- package/src/legend-ai/components/LegendAICharts.tsx +30 -33
- package/src/legend-ai/components/LegendAIChat.tsx +555 -91
- package/src/legend-ai/components/LegendAIChatInput.tsx +6 -2
- package/src/legend-ai/index.ts +22 -3
- package/src/legend-ai/stores/LegendAIChatProcessors.ts +1286 -322
- package/src/legend-ai/stores/LegendAIChatState.ts +73 -28
- package/src/legend-ai/stores/LegendAIJoinAnalysis.ts +165 -0
- package/src/legend-ai/stores/LegendAISqlHelpers.ts +82 -0
- package/src/legend-ai/stores/LegendAISqlJoinSanitizers.ts +515 -0
- package/tsconfig.json +4 -0
|
@@ -47,6 +47,7 @@ export const TEST__makeAssistantMessage = (overrides) => ({
|
|
|
47
47
|
suggestedQueries: [],
|
|
48
48
|
fallbackAction: null,
|
|
49
49
|
queriedAccessPointGroups: [],
|
|
50
|
+
queriedAccessPoints: [],
|
|
50
51
|
...overrides,
|
|
51
52
|
});
|
|
52
53
|
export const TEST__seedAssistant = (setter) => {
|
|
@@ -105,6 +106,8 @@ export const TEST__createMockLegendAIPlugin = (overrides) => ({
|
|
|
105
106
|
preWarmSchemaAnalysis: () => {
|
|
106
107
|
/* no-op in test */
|
|
107
108
|
},
|
|
109
|
+
enrichAccessPointSampleValues: () => Promise.resolve(),
|
|
110
|
+
buildNoResultsFallback: () => Promise.resolve(undefined),
|
|
108
111
|
callLLM: createMock(),
|
|
109
112
|
executeSql: createMock(),
|
|
110
113
|
extractSqlFromResponse: (_a) => ({
|
|
@@ -140,6 +143,10 @@ export const TEST__createMockLegendAIPlugin = (overrides) => ({
|
|
|
140
143
|
},
|
|
141
144
|
buildErrorCorrectionPrompt: () => '',
|
|
142
145
|
buildZeroRowCorrectionPrompt: () => '',
|
|
146
|
+
supportsPythonCodegen: () => false,
|
|
147
|
+
generatePythonQueryCodeAsync: () => Promise.resolve(undefined),
|
|
148
|
+
supportsOpenInDataCube: () => false,
|
|
149
|
+
translateAccessPointSqlToDataCubeQuery: () => Promise.resolve(undefined),
|
|
143
150
|
...overrides,
|
|
144
151
|
});
|
|
145
152
|
export const TEST__createOperationContext = (overrides) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LegendAITestUtils.js","sourceRoot":"","sources":["../../../src/legend-ai/__test-utils__/LegendAITestUtils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LegendAITestUtils.js","sourceRoot":"","sources":["../../../src/legend-ai/__test-utils__/LegendAITestUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LegendAICharts.d.ts","sourceRoot":"","sources":["../../../src/legend-ai/components/LegendAICharts.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kDAAkD,CAAC;AAgB/F,eAAO,MAAM,gBAAgB,GAAI,OAAO;IACtC,IAAI,EAAE,sBAAsB,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,KAAG,KAAK,CAAC,SA8CT,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,OAAO;IACxC,IAAI,EAAE,sBAAsB,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,KAAG,KAAK,CAAC,SA8ET,CAAC;
|
|
1
|
+
{"version":3,"file":"LegendAICharts.d.ts","sourceRoot":"","sources":["../../../src/legend-ai/components/LegendAICharts.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kDAAkD,CAAC;AAgB/F,eAAO,MAAM,gBAAgB,GAAI,OAAO;IACtC,IAAI,EAAE,sBAAsB,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,KAAG,KAAK,CAAC,SA8CT,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,OAAO;IACxC,IAAI,EAAE,sBAAsB,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,KAAG,KAAK,CAAC,SA8ET,CAAC;AASF,eAAO,MAAM,iBAAiB,GAAI,OAAO;IACvC,IAAI,EAAE,sBAAsB,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,KAAG,KAAK,CAAC,SAiJT,CAAC"}
|
|
@@ -71,6 +71,7 @@ export const LegendAIDonutChart = (props) => {
|
|
|
71
71
|
const LINE_SVG_WIDTH = 400;
|
|
72
72
|
const LINE_SVG_HEIGHT = 180;
|
|
73
73
|
const LINE_PADDING = { top: 16, right: 16, bottom: 28, left: 52 };
|
|
74
|
+
const AXIS_LABEL_MAX_CHARS = 10;
|
|
74
75
|
export const LegendAILineChart = (props) => {
|
|
75
76
|
const { data, title } = props;
|
|
76
77
|
const { points, polyline, minVal, maxVal } = useMemo(() => {
|
|
@@ -98,7 +99,7 @@ export const LegendAILineChart = (props) => {
|
|
|
98
99
|
const x = LINE_PADDING.left +
|
|
99
100
|
(data.length > 1 ? (i / (data.length - 1)) * plotW : plotW / 2);
|
|
100
101
|
const y = LINE_PADDING.top + (1 - (d.value - lo) / range) * plotH;
|
|
101
|
-
return { x, y,
|
|
102
|
+
return { x, y, label: d.label, value: d.value };
|
|
102
103
|
});
|
|
103
104
|
return {
|
|
104
105
|
points: pts,
|
|
@@ -112,18 +113,13 @@ export const LegendAILineChart = (props) => {
|
|
|
112
113
|
}
|
|
113
114
|
const plotBottom = LINE_SVG_HEIGHT - LINE_PADDING.bottom;
|
|
114
115
|
const color = getChartColor(0);
|
|
116
|
+
const firstPt = points[0];
|
|
117
|
+
const lastPt = points[points.length - 1];
|
|
118
|
+
const axisEndpoints = firstPt && lastPt ? { first: firstPt, last: lastPt } : undefined;
|
|
115
119
|
return (_jsxs("div", { className: "legend-ai-chart legend-ai-chart--line", children: [title !== undefined && title.length > 0 && (_jsx("div", { className: "legend-ai-chart__title", children: title })), _jsxs("svg", { viewBox: `0 0 ${LINE_SVG_WIDTH} ${LINE_SVG_HEIGHT}`, className: "legend-ai-chart__line-svg", preserveAspectRatio: "xMidYMid meet", children: [_jsx("text", { x: LINE_PADDING.left - 6, y: LINE_PADDING.top + 4, className: "legend-ai-chart__axis-label", textAnchor: "end", children: Number.isInteger(maxVal)
|
|
116
120
|
? maxVal.toLocaleString()
|
|
117
121
|
: maxVal.toFixed(1) }), _jsx("text", { x: LINE_PADDING.left - 6, y: plotBottom + 4, className: "legend-ai-chart__axis-label", textAnchor: "end", children: Number.isInteger(minVal)
|
|
118
122
|
? minVal.toLocaleString()
|
|
119
|
-
: minVal.toFixed(1) }), _jsx("line", { x1: LINE_PADDING.left, y1: LINE_PADDING.top, x2: LINE_SVG_WIDTH - LINE_PADDING.right, y2: LINE_PADDING.top, className: "legend-ai-chart__grid-line" }), _jsx("line", { x1: LINE_PADDING.left, y1: plotBottom, x2: LINE_SVG_WIDTH - LINE_PADDING.right, y2: plotBottom, className: "legend-ai-chart__grid-line" }), _jsx("polyline", { points: polyline, fill: "none", stroke: color, strokeWidth: "2", className: "legend-ai-chart__line-path" }), points.map((p) => (_jsx("circle", { cx: p.x, cy: p.y, r: 3, fill: color, className: "legend-ai-chart__line-dot" }, `${p.
|
|
120
|
-
(() => {
|
|
121
|
-
const firstPt = points[0];
|
|
122
|
-
const lastPt = points[points.length - 1];
|
|
123
|
-
if (!firstPt || !lastPt) {
|
|
124
|
-
return null;
|
|
125
|
-
}
|
|
126
|
-
return (_jsxs(_Fragment, { children: [_jsx("text", { x: firstPt.x, y: plotBottom + 16, className: "legend-ai-chart__axis-label", textAnchor: "start", children: firstPt.label.slice(0, 10) }), points.length > 2 && (_jsx("text", { x: lastPt.x, y: plotBottom + 16, className: "legend-ai-chart__axis-label", textAnchor: "end", children: lastPt.label.slice(0, 10) }))] }));
|
|
127
|
-
})()] })] }));
|
|
123
|
+
: minVal.toFixed(1) }), _jsx("line", { x1: LINE_PADDING.left, y1: LINE_PADDING.top, x2: LINE_SVG_WIDTH - LINE_PADDING.right, y2: LINE_PADDING.top, className: "legend-ai-chart__grid-line" }), _jsx("line", { x1: LINE_PADDING.left, y1: plotBottom, x2: LINE_SVG_WIDTH - LINE_PADDING.right, y2: plotBottom, className: "legend-ai-chart__grid-line" }), _jsx("polyline", { points: polyline, fill: "none", stroke: color, strokeWidth: "2", className: "legend-ai-chart__line-path" }), points.map((p) => (_jsx("circle", { cx: p.x, cy: p.y, r: 3, fill: color, className: "legend-ai-chart__line-dot" }, `${p.x}-${p.y}`))), axisEndpoints && (_jsxs(_Fragment, { children: [_jsx("text", { x: axisEndpoints.first.x, y: plotBottom + 16, className: "legend-ai-chart__axis-label", textAnchor: "start", children: axisEndpoints.first.label.slice(0, AXIS_LABEL_MAX_CHARS) }), points.length > 2 && (_jsx("text", { x: axisEndpoints.last.x, y: plotBottom + 16, className: "legend-ai-chart__axis-label", textAnchor: "end", children: axisEndpoints.last.label.slice(0, AXIS_LABEL_MAX_CHARS) }))] }))] })] }));
|
|
128
124
|
};
|
|
129
125
|
//# sourceMappingURL=LegendAICharts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LegendAICharts.js","sourceRoot":"","sources":["../../../src/legend-ai/components/LegendAICharts.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"LegendAICharts.js","sourceRoot":"","sources":["../../../src/legend-ai/components/LegendAICharts.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LegendAIChat.d.ts","sourceRoot":"","sources":["../../../src/legend-ai/components/LegendAIChat.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"LegendAIChat.d.ts","sourceRoot":"","sources":["../../../src/legend-ai/components/LegendAIChat.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAgCH,OAAO,EACL,KAAK,iBAAiB,EAQtB,0BAA0B,EAS3B,MAAM,qBAAqB,CAAC;AAQ7B,eAAO,MAAM,mBAAmB,qBAAqB,CAAC;AAmJtD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,0BAA0B,GACjC,KAAK,CAAC,SAAS,CASjB;AAonBD,eAAO,MAAM,YAAY,GAAI,OAAO,iBAAiB,KAAG,KAAK,CAAC,SAib7D,CAAC"}
|
|
@@ -14,11 +14,12 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
14
14
|
* See the License for the specific language governing permissions and
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
|
-
import { useMemo, useCallback, useState, useRef, useEffect } from 'react';
|
|
18
|
-
import { SparkleStarsIcon, CodeIcon, TableIcon, CopyIcon, CheckIcon, TimesIcon, MinusIcon, PlusIcon, CaretDownIcon, CaretRightIcon, DotIcon, LoadingIcon, LikeIcon, DislikeIcon, ExternalLinkIcon, InfoCircleIcon, MarkdownTextViewer, clsx, } from '@finos/legend-art';
|
|
19
|
-
import { noop } from '@finos/legend-shared';
|
|
20
|
-
import { LegendAIMessageFeedbackRating, LegendAIThinkingStepStatus, LegendAIMessageRole, LegendAIErrorType, TDSServiceSourceType, classifyQuestionIntentFast, } from '../LegendAITypes.js';
|
|
17
|
+
import { memo, useMemo, useCallback, useState, useRef, useEffect } from 'react';
|
|
18
|
+
import { SparkleStarsIcon, CodeIcon, TableIcon, CopyIcon, CheckIcon, TimesIcon, MinusIcon, PlusIcon, CaretDownIcon, CaretRightIcon, DotIcon, LoadingIcon, LikeIcon, DislikeIcon, ExternalLinkIcon, InfoCircleIcon, PythonIcon, JupyterIcon, CubeIcon, MarkdownTextViewer, clsx, } from '@finos/legend-art';
|
|
19
|
+
import { assertErrorThrown, noop } from '@finos/legend-shared';
|
|
20
|
+
import { LegendAIMessageFeedbackRating, LegendAIThinkingStepStatus, LegendAIMessageRole, LegendAIErrorType, TDSServiceSourceType, LEGEND_AI_FEEDBACK_PROMPT, classifyQuestionIntentFast, LegendAIChatTelemetryEventType, LegendAITelemetryArtifact, LegendAISuggestedQuerySource, } from '../LegendAITypes.js';
|
|
21
21
|
import { useLegendAIChatState } from '../stores/LegendAIChatState.js';
|
|
22
|
+
import { looksLikeAccessError } from '../stores/LegendAIChatProcessors.js';
|
|
22
23
|
import { LegendAIResultGrid } from './LegendAIResultGrid.js';
|
|
23
24
|
import { LegendAIAnalysisPanel } from './LegendAIAnalysisPanel.js';
|
|
24
25
|
import { LegendAIChatInput } from './LegendAIChatInput.js';
|
|
@@ -124,32 +125,41 @@ export function renderStepStatusIcon(status) {
|
|
|
124
125
|
}
|
|
125
126
|
return status === LegendAIThinkingStepStatus.DONE ? (_jsx(CheckIcon, {})) : (_jsx(TimesIcon, {}));
|
|
126
127
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
const
|
|
140
|
-
const { msg, questionText, isThinkingVisible, onToggleThinking, onMessageFeedback, selectedFeedbackRating, feedbackSubmitting, onSuggestedQueryClick, onFallbackAction, enghubDocUrl, enthubRequestAccessUrl, onRequestAccess, } = props;
|
|
128
|
+
const SuggestionButton = (props) => {
|
|
129
|
+
const { query, position, className, source, onSelect, onLogTelemetryEvent } = props;
|
|
130
|
+
return (_jsx("button", { type: "button", className: className, onClick: () => {
|
|
131
|
+
onLogTelemetryEvent?.({
|
|
132
|
+
type: LegendAIChatTelemetryEventType.SUGGESTED_QUERY_CLICKED,
|
|
133
|
+
position,
|
|
134
|
+
source,
|
|
135
|
+
});
|
|
136
|
+
onSelect(query);
|
|
137
|
+
}, children: query }));
|
|
138
|
+
};
|
|
139
|
+
const AssistantMessageView = memo(function AssistantMessageView(props) {
|
|
140
|
+
const { msg, msgIndex, questionText, isThinkingVisible, onToggleThinking, onMessageFeedback, selectedFeedbackRating, feedbackSubmitting, onSuggestedQueryClick, onFallbackAction, enghubDocUrl, enthubRequestAccessUrl, onRequestAccess, pythonEntry, onRequestPython, onOpenInDataCube, isOpeningInDataCube, onLogTelemetryEvent, } = props;
|
|
141
141
|
const hasPermissionAccessLinks = enghubDocUrl !== undefined || enthubRequestAccessUrl !== undefined;
|
|
142
142
|
const [sqlCopied, setSqlCopied] = useState(false);
|
|
143
143
|
const copyTimerRef = useRef(undefined);
|
|
144
|
+
const [showPython, setShowPython] = useState(false);
|
|
145
|
+
const [pythonCopied, setPythonCopied] = useState(false);
|
|
146
|
+
const pythonCopyTimerRef = useRef(undefined);
|
|
144
147
|
useEffect(() => () => {
|
|
145
148
|
if (copyTimerRef.current !== undefined) {
|
|
146
149
|
clearTimeout(copyTimerRef.current);
|
|
147
150
|
}
|
|
151
|
+
if (pythonCopyTimerRef.current !== undefined) {
|
|
152
|
+
clearTimeout(pythonCopyTimerRef.current);
|
|
153
|
+
}
|
|
148
154
|
}, []);
|
|
149
155
|
const handleCopySql = useCallback(() => {
|
|
150
156
|
if (msg.sql) {
|
|
151
157
|
navigator.clipboard.writeText(msg.sql).catch(noop);
|
|
152
158
|
setSqlCopied(true);
|
|
159
|
+
onLogTelemetryEvent?.({
|
|
160
|
+
type: LegendAIChatTelemetryEventType.ARTIFACT_COPIED,
|
|
161
|
+
artifact: LegendAITelemetryArtifact.SQL,
|
|
162
|
+
});
|
|
153
163
|
if (copyTimerRef.current !== undefined) {
|
|
154
164
|
clearTimeout(copyTimerRef.current);
|
|
155
165
|
}
|
|
@@ -158,18 +168,54 @@ const AssistantMessageView = (props) => {
|
|
|
158
168
|
copyTimerRef.current = undefined;
|
|
159
169
|
}, COPY_FEEDBACK_DURATION_MS);
|
|
160
170
|
}
|
|
161
|
-
}, [msg.sql]);
|
|
171
|
+
}, [msg.sql, onLogTelemetryEvent]);
|
|
172
|
+
const handleCopyPython = useCallback(() => {
|
|
173
|
+
if (pythonEntry?.status === 'ready' && pythonEntry.code) {
|
|
174
|
+
navigator.clipboard.writeText(pythonEntry.code.code).catch(noop);
|
|
175
|
+
setPythonCopied(true);
|
|
176
|
+
onLogTelemetryEvent?.({
|
|
177
|
+
type: LegendAIChatTelemetryEventType.ARTIFACT_COPIED,
|
|
178
|
+
artifact: LegendAITelemetryArtifact.PYTHON,
|
|
179
|
+
});
|
|
180
|
+
if (pythonCopyTimerRef.current !== undefined) {
|
|
181
|
+
clearTimeout(pythonCopyTimerRef.current);
|
|
182
|
+
}
|
|
183
|
+
pythonCopyTimerRef.current = setTimeout(() => {
|
|
184
|
+
setPythonCopied(false);
|
|
185
|
+
pythonCopyTimerRef.current = undefined;
|
|
186
|
+
}, COPY_FEEDBACK_DURATION_MS);
|
|
187
|
+
}
|
|
188
|
+
}, [pythonEntry, onLogTelemetryEvent]);
|
|
189
|
+
const handleTogglePython = useCallback(() => {
|
|
190
|
+
const opening = !showPython;
|
|
191
|
+
setShowPython(opening);
|
|
192
|
+
onLogTelemetryEvent?.({
|
|
193
|
+
type: LegendAIChatTelemetryEventType.PYTHON_CODE_TOGGLED,
|
|
194
|
+
shown: opening,
|
|
195
|
+
});
|
|
196
|
+
if (opening && !pythonEntry && onRequestPython) {
|
|
197
|
+
onLogTelemetryEvent?.({
|
|
198
|
+
type: LegendAIChatTelemetryEventType.PYTHON_CODE_REQUESTED,
|
|
199
|
+
});
|
|
200
|
+
onRequestPython(msg);
|
|
201
|
+
}
|
|
202
|
+
}, [showPython, pythonEntry, onRequestPython, msg, onLogTelemetryEvent]);
|
|
162
203
|
const canShowFeedback = !msg.isProcessing &&
|
|
163
204
|
(msg.textAnswer !== null || msg.gridData !== null || msg.error !== null);
|
|
164
|
-
const visibleThinkingSteps = formatThinkingSteps(msg.thinkingSteps);
|
|
165
|
-
const { metadataContext,
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
205
|
+
const visibleThinkingSteps = useMemo(() => formatThinkingSteps(msg.thinkingSteps), [msg.thinkingSteps]);
|
|
206
|
+
const { metadataContext, analysisSummary, plainAnswer } = useMemo(() => {
|
|
207
|
+
const split = splitCombinedAnswer(msg.textAnswer);
|
|
208
|
+
const gridAnalysisFallback = split.metadataContext === null ? msg.textAnswer : null;
|
|
209
|
+
return {
|
|
210
|
+
metadataContext: split.metadataContext,
|
|
211
|
+
analysisSummary: msg.gridData === null
|
|
212
|
+
? null
|
|
213
|
+
: (split.queryAnalysis ?? gridAnalysisFallback),
|
|
214
|
+
plainAnswer: msg.gridData === null
|
|
215
|
+
? (split.metadataContext ?? msg.textAnswer)
|
|
216
|
+
: null,
|
|
217
|
+
};
|
|
218
|
+
}, [msg.textAnswer, msg.gridData]);
|
|
173
219
|
const submitFeedback = useCallback((rating) => {
|
|
174
220
|
const result = onMessageFeedback?.({
|
|
175
221
|
messageId: msg.id,
|
|
@@ -185,7 +231,10 @@ const AssistantMessageView = (props) => {
|
|
|
185
231
|
result.catch(noop);
|
|
186
232
|
}
|
|
187
233
|
}, [msg, onMessageFeedback, questionText]);
|
|
188
|
-
return (_jsxs("div", { className: "legend-ai__msg legend-ai__msg--assistant", children: [_jsx("div", { className: "legend-ai__msg-avatar", children: _jsx(SparkleStarsIcon, {}) }), _jsxs("div", { className: "legend-ai__msg-content", children: [visibleThinkingSteps.length > 0 && (_jsxs("div", { className: "legend-ai__thinking", children: [!msg.isProcessing && (_jsxs("button", { type: "button", className: "legend-ai__thinking-toggle", onClick: onToggleThinking, children: [_jsx("span", { className: "legend-ai__thinking-toggle-icon", children: isThinkingVisible ? _jsx(CaretDownIcon, {}) : _jsx(CaretRightIcon, {}) }), "Thought for ", msg.thinkingDuration ?? '...', "s"] })), isThinkingVisible && (_jsx("div", { className: "legend-ai__thinking-steps", children: visibleThinkingSteps.map((step) => (_jsxs("div", { className: clsx('legend-ai__thinking-step', `legend-ai__thinking-step--${step.status}`), children: [_jsx("span", { className: "legend-ai__thinking-step-icon", children: renderStepStatusIcon(step.status) }), _jsx("span", { children: step.label })] }, step.id))) }))] })), metadataContext && msg.gridData && (_jsx("div", { className: "legend-ai__inline-answer", children: _jsx(MarkdownTextViewer, { value: { value: metadataContext }, className: "legend-ai__text-answer-md" }) })), msg.sql && (_jsxs("
|
|
234
|
+
return (_jsxs("div", { className: "legend-ai__msg legend-ai__msg--assistant", children: [_jsx("div", { className: "legend-ai__msg-avatar", children: _jsx(SparkleStarsIcon, {}) }), _jsxs("div", { className: "legend-ai__msg-content", children: [visibleThinkingSteps.length > 0 && (_jsxs("div", { className: "legend-ai__thinking", children: [!msg.isProcessing && (_jsxs("button", { type: "button", className: "legend-ai__thinking-toggle", onClick: () => onToggleThinking(msgIndex), children: [_jsx("span", { className: "legend-ai__thinking-toggle-icon", children: isThinkingVisible ? _jsx(CaretDownIcon, {}) : _jsx(CaretRightIcon, {}) }), "Thought for ", msg.thinkingDuration ?? '...', "s"] })), isThinkingVisible && (_jsx("div", { className: "legend-ai__thinking-steps", children: visibleThinkingSteps.map((step) => (_jsxs("div", { className: clsx('legend-ai__thinking-step', `legend-ai__thinking-step--${step.status}`), children: [_jsx("span", { className: "legend-ai__thinking-step-icon", children: renderStepStatusIcon(step.status) }), _jsx("span", { children: step.label })] }, step.id))) }))] })), metadataContext && msg.gridData && (_jsx("div", { className: "legend-ai__inline-answer", children: _jsx(MarkdownTextViewer, { value: { value: metadataContext }, className: "legend-ai__text-answer-md" }) })), msg.sql && (_jsxs("details", { className: "legend-ai__sql-details", open: msg.gridData !== null, onToggle: (event) => onLogTelemetryEvent?.({
|
|
235
|
+
type: LegendAIChatTelemetryEventType.SQL_DETAILS_TOGGLED,
|
|
236
|
+
shown: event.currentTarget.open,
|
|
237
|
+
}), children: [_jsx("summary", { className: "legend-ai__sql-details-summary", children: msg.gridData === null ? 'Show the query I tried' : 'Query' }), _jsxs("div", { className: "legend-ai__sql-block", children: [_jsxs("div", { className: "legend-ai__sql-block-header", children: [_jsx("span", { className: "legend-ai__sql-block-header-icon", children: _jsx(CodeIcon, {}) }), _jsx("span", { children: "Generated SQL" }), msg.sqlGenTime && (_jsxs("span", { className: "legend-ai__sql-block-time", children: [msg.sqlGenTime, "s"] })), _jsx("button", { type: "button", className: "legend-ai__sql-copy-btn", title: "Copy SQL", "aria-label": "Copy SQL", onClick: handleCopySql, children: sqlCopied ? (_jsx("span", { className: "legend-ai__sql-copy-btn--copied", children: _jsx(CheckIcon, {}) })) : (_jsx(CopyIcon, {})) })] }), _jsx("div", { className: "legend-ai__sql-scroll", children: _jsx("pre", { className: "legend-ai__sql-display", children: msg.sql }) })] })] })), msg.isExecuting && (_jsxs("div", { className: "legend-ai__executing", children: [_jsx(LoadingIcon, { isLoading: true }), _jsx("span", { children: "Executing query..." })] })), msg.error && (_jsxs("div", { className: "legend-ai__exec-error", children: [msg.error, msg.errorType === LegendAIErrorType.PERMISSION &&
|
|
189
238
|
hasPermissionAccessLinks && (_jsxs("div", { className: "legend-ai__permission-error-action", children: [_jsx("span", { className: "legend-ai__permission-error-note", children: "Need access?" }), _jsxs("div", { className: "legend-ai__permission-error-btns", children: [enghubDocUrl && (_jsxs("a", { className: "legend-ai__permission-error-btn", href: enghubDocUrl, target: "_blank", rel: "noopener noreferrer", children: [_jsx(ExternalLinkIcon, {}), _jsx("span", { children: "View Documentation" })] })), enthubRequestAccessUrl && (_jsxs("a", { className: "legend-ai__permission-error-btn legend-ai__permission-error-btn--primary", href: enthubRequestAccessUrl, target: "_blank", rel: "noopener noreferrer", children: [_jsx(ExternalLinkIcon, {}), _jsx("span", { children: "Request Access" })] }))] })] })), msg.errorType === LegendAIErrorType.EXECUTION &&
|
|
190
239
|
onRequestAccess &&
|
|
191
240
|
msg.queriedAccessPointGroups.length > 0 &&
|
|
@@ -193,29 +242,180 @@ const AssistantMessageView = (props) => {
|
|
|
193
242
|
? 'You may not have access to this data. You can request access below.'
|
|
194
243
|
: `This query uses ${msg.queriedAccessPointGroups.length} access point groups. You can request access to each one below.` }), _jsx("div", { className: "legend-ai__permission-error-btns", children: msg.queriedAccessPointGroups.map((apgTitle) => (_jsxs("button", { type: "button", className: "legend-ai__permission-error-btn legend-ai__permission-error-btn--primary", onClick: () => onRequestAccess(apgTitle), children: [_jsx(ExternalLinkIcon, {}), _jsxs("span", { children: ["Request Access \u2014 ", apgTitle] })] }, apgTitle))) })] }))] })), msg.gridData && (_jsxs("div", { className: "legend-ai__results-block", children: [_jsxs("div", { className: "legend-ai__results-header", children: [_jsx("span", { className: "legend-ai__results-header-icon", children: _jsx(TableIcon, {}) }), _jsx("span", { children: "Results" }), _jsxs("span", { className: "legend-ai__results-meta", children: [msg.gridData.rowData.length, " row", msg.gridData.rowData.length === 1 ? '' : 's', msg.execTime ? (_jsxs(_Fragment, { children: [' ', _jsx(DotIcon, { className: "legend-ai__results-meta-dot" }), ' ', msg.execTime, "s"] })) : ('')] })] }), _jsx(LegendAIResultGrid, { data: msg.gridData })] })), plainAnswer && (_jsx("div", { className: "legend-ai__inline-answer", children: _jsx(MarkdownTextViewer, { value: { value: plainAnswer }, className: "legend-ai__text-answer-md" }) })), analysisSummary && msg.gridData && (_jsx(LegendAIAnalysisPanel, { gridData: msg.gridData, summary: analysisSummary, SummaryRenderer: AISummaryRenderer })), msg.isProcessing && !msg.isExecuting && msg.gridData && (_jsxs("div", { className: "legend-ai__analyzing", children: [_jsx(LoadingIcon, { isLoading: true }), _jsx("span", { children: "Analyzing results..." })] })), !msg.isProcessing &&
|
|
195
244
|
msg.suggestedQueries.length > 0 &&
|
|
196
|
-
onSuggestedQueryClick && (_jsxs("div", { className: "legend-ai__follow-up-suggestions", children: [_jsx("span", { className: "legend-ai__follow-up-label", children: "Try a data query:" }), msg.suggestedQueries.map((q) => (_jsx(
|
|
245
|
+
onSuggestedQueryClick && (_jsxs("div", { className: "legend-ai__follow-up-suggestions", children: [_jsx("span", { className: "legend-ai__follow-up-label", children: "Try a data query:" }), msg.suggestedQueries.map((q, position) => (_jsx(SuggestionButton, { query: q, position: position, className: "legend-ai__follow-up-btn", source: LegendAISuggestedQuerySource.FOLLOW_UP, onSelect: onSuggestedQueryClick, ...(onLogTelemetryEvent ? { onLogTelemetryEvent } : {}) }, q)))] })), msg.fallbackAction && !msg.isProcessing && onFallbackAction && (_jsxs("button", { type: "button", className: "legend-ai__fallback-action-btn", onClick: () => {
|
|
197
246
|
if (msg.fallbackAction?.actionId) {
|
|
198
247
|
onFallbackAction(msg.id);
|
|
199
248
|
}
|
|
200
|
-
}, children: [_jsx(SparkleStarsIcon, {}), _jsx("span", { children: msg.fallbackAction.label })] })),
|
|
249
|
+
}, children: [_jsx(SparkleStarsIcon, {}), _jsx("span", { children: msg.fallbackAction.label })] })), (onRequestPython || onOpenInDataCube) &&
|
|
250
|
+
!msg.isProcessing &&
|
|
251
|
+
(msg.sql !== null || msg.gridData !== null) && (_jsxs("div", { className: "legend-ai__python-block", children: [_jsxs("div", { className: "legend-ai__cta-row", children: [onRequestPython && (_jsxs("button", { type: "button", className: "legend-ai__python-cta", onClick: handleTogglePython, children: [_jsx(PythonIcon, {}), _jsx("span", { children: showPython
|
|
252
|
+
? 'Hide Python code'
|
|
253
|
+
: 'Want the Python code for this query?' }), _jsx("span", { className: "legend-ai__python-cta-caret", children: showPython ? _jsx(CaretDownIcon, {}) : _jsx(CaretRightIcon, {}) })] })), onOpenInDataCube && msg.sql !== null && (_jsxs("button", { type: "button", className: "legend-ai__datacube-cta", onClick: () => {
|
|
254
|
+
onLogTelemetryEvent?.({
|
|
255
|
+
type: LegendAIChatTelemetryEventType.OPEN_IN_DATACUBE_CLICKED,
|
|
256
|
+
});
|
|
257
|
+
onOpenInDataCube(msg);
|
|
258
|
+
}, disabled: isOpeningInDataCube, title: "Open this query in DataCube", "aria-label": "Open this query in DataCube", children: [isOpeningInDataCube ? (_jsx(LoadingIcon, { isLoading: true })) : (_jsx(CubeIcon, {})), _jsx("span", { children: isOpeningInDataCube
|
|
259
|
+
? 'Opening in DataCube...'
|
|
260
|
+
: 'Open in DataCube' }), _jsx("span", { className: "legend-ai__datacube-cta-launch", children: _jsx(ExternalLinkIcon, {}) })] }))] }), showPython && onRequestPython && (_jsxs("div", { className: "legend-ai__python-panel", children: [_jsxs("div", { className: "legend-ai__python-panel-header", children: [_jsx("span", { className: "legend-ai__python-panel-header-icon", children: _jsx(CodeIcon, {}) }), _jsx("span", { children: "Python" }), pythonEntry?.status === 'ready' && pythonEntry.code && (_jsx("button", { type: "button", className: "legend-ai__sql-copy-btn", title: "Copy Python code", "aria-label": "Copy Python code", onClick: handleCopyPython, children: pythonCopied ? (_jsx("span", { className: "legend-ai__sql-copy-btn--copied", children: _jsx(CheckIcon, {}) })) : (_jsx(CopyIcon, {})) }))] }), pythonEntry?.status === 'loading' && (_jsxs("div", { className: "legend-ai__python-panel-loading", children: [_jsx(LoadingIcon, { isLoading: true }), _jsx("span", { children: "Generating Python\u2026" })] })), pythonEntry?.status === 'error' && (_jsxs("div", { className: "legend-ai__python-panel-error", children: [_jsx("span", { children: "Could not generate Python code. Try again in a moment." }), _jsx("button", { type: "button", className: "legend-ai__permission-error-btn", onClick: () => {
|
|
261
|
+
onLogTelemetryEvent?.({
|
|
262
|
+
type: LegendAIChatTelemetryEventType.PYTHON_CODE_REQUESTED,
|
|
263
|
+
});
|
|
264
|
+
onRequestPython(msg);
|
|
265
|
+
}, children: "Retry" })] })), pythonEntry?.status === 'ready' &&
|
|
266
|
+
pythonEntry.code === undefined && (_jsx("div", { className: "legend-ai__python-panel-loading", children: _jsx("span", { children: "Python code is not available for this data source." }) })), pythonEntry?.status === 'ready' && pythonEntry.code && (_jsxs(_Fragment, { children: [_jsx("div", { className: "legend-ai__sql-scroll", children: _jsx("pre", { className: "legend-ai__sql-display", children: pythonEntry.code.code }) }), pythonEntry.code.notebookUrl && (_jsx("div", { className: "legend-ai__python-panel-actions", children: _jsxs("a", { className: "legend-ai__permission-error-btn", href: pythonEntry.code.notebookUrl, target: "_blank", rel: "noopener noreferrer", children: [_jsx(JupyterIcon, {}), _jsx("span", { children: "Launch Notebook" })] }) }))] }))] }))] })), canShowFeedback && (_jsxs("div", { className: "legend-ai__message-feedback", children: [_jsx("span", { className: "legend-ai__message-feedback-label", children: LEGEND_AI_FEEDBACK_PROMPT }), _jsxs("div", { className: "legend-ai__message-feedback-actions", children: [_jsx("button", { type: "button", className: clsx('legend-ai__message-feedback-btn', {
|
|
201
267
|
'legend-ai__message-feedback-btn--selected': selectedFeedbackRating ===
|
|
202
268
|
LegendAIMessageFeedbackRating.THUMBS_UP,
|
|
203
269
|
}), title: "Thumbs up", "aria-label": "Thumbs up", onClick: () => submitFeedback(LegendAIMessageFeedbackRating.THUMBS_UP), disabled: feedbackSubmitting, children: _jsx(LikeIcon, {}) }), _jsx("button", { type: "button", className: clsx('legend-ai__message-feedback-btn', {
|
|
204
270
|
'legend-ai__message-feedback-btn--selected': selectedFeedbackRating ===
|
|
205
271
|
LegendAIMessageFeedbackRating.THUMBS_DOWN,
|
|
206
272
|
}), title: "Thumbs down", "aria-label": "Thumbs down", onClick: () => submitFeedback(LegendAIMessageFeedbackRating.THUMBS_DOWN), disabled: feedbackSubmitting, children: _jsx(DislikeIcon, {}) })] })] }))] })] }));
|
|
207
|
-
};
|
|
273
|
+
});
|
|
208
274
|
export const LegendAIChat = (props) => {
|
|
209
|
-
const { services, coordinates, config, metadata, title, plugin, dataProductCoordinates, pureExecutionContext, modelContext, availableScopes, onMessageFeedback, onClose, onMinimize, onRequestAccess, contextBannerMessage, onLogTelemetryEvent, } = props;
|
|
275
|
+
const { services, coordinates, config, metadata, title, plugin, dataProductCoordinates, pureExecutionContext, modelContext, availableScopes, onMessageFeedback, onClose, onMinimize, onRequestAccess, onOpenInDataCube, contextBannerMessage, onLogTelemetryEvent, } = props;
|
|
210
276
|
const state = useLegendAIChatState(services, coordinates, config, metadata, plugin, dataProductCoordinates, pureExecutionContext, modelContext, onLogTelemetryEvent);
|
|
211
277
|
const suggestedQueries = useMemo(() => buildSuggestedQueries(services, metadata), [services, metadata]);
|
|
278
|
+
const overview = useMemo(() => {
|
|
279
|
+
const raw = modelContext?.dataspaceDescription ?? metadata.description ?? '';
|
|
280
|
+
const summary = raw
|
|
281
|
+
.split('\n')
|
|
282
|
+
.map((line) => line.trim())
|
|
283
|
+
.filter((line) => line.length > 0 && !line.startsWith('#') && !line.startsWith('|'))
|
|
284
|
+
.slice(0, 3)
|
|
285
|
+
.join(' ')
|
|
286
|
+
.slice(0, 300);
|
|
287
|
+
const entityCount = modelContext?.entities.length ?? 0;
|
|
288
|
+
const serviceCount = metadata.serviceSummaries.length > 0
|
|
289
|
+
? metadata.serviceSummaries.length
|
|
290
|
+
: services.length;
|
|
291
|
+
return { summary, entityCount, serviceCount };
|
|
292
|
+
}, [modelContext, metadata, services]);
|
|
212
293
|
const hasServices = services.length > 0;
|
|
213
294
|
const inferSuggestedQueryIntent = useCallback((query) => classifyQuestionIntentFast(query, hasServices).intent, [hasServices]);
|
|
214
|
-
const isDataProduct =
|
|
295
|
+
const { isDataProduct, supportsPython, supportsDataCube } = useMemo(() => ({
|
|
296
|
+
isDataProduct: services.some((s) => s.sourceType === TDSServiceSourceType.ACCESS_POINT),
|
|
297
|
+
supportsPython: services.some((s) => plugin.supportsPythonCodegen(s)),
|
|
298
|
+
supportsDataCube: services.some((s) => plugin.supportsOpenInDataCube(s)),
|
|
299
|
+
}), [services, plugin]);
|
|
300
|
+
const [pythonCodeByMessageId, setPythonCodeByMessageId] = useState(new Map());
|
|
301
|
+
const pythonCodeByMessageIdRef = useRef(pythonCodeByMessageId);
|
|
302
|
+
pythonCodeByMessageIdRef.current = pythonCodeByMessageId;
|
|
303
|
+
const requestPythonCode = useCallback(async (msg) => {
|
|
304
|
+
const existing = pythonCodeByMessageIdRef.current.get(msg.id);
|
|
305
|
+
if (existing?.status === 'loading' || existing?.status === 'ready') {
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
setPythonCodeByMessageId((prev) => {
|
|
309
|
+
const next = new Map(prev);
|
|
310
|
+
next.set(msg.id, { status: 'loading' });
|
|
311
|
+
return next;
|
|
312
|
+
});
|
|
313
|
+
const resolvedSet = new Set(msg.queriedAccessPoints);
|
|
314
|
+
const service = services.find((s) => resolvedSet.has(s.pattern.replace(/^\//u, ''))) ??
|
|
315
|
+
services[0];
|
|
316
|
+
if (!service) {
|
|
317
|
+
setPythonCodeByMessageId((prev) => {
|
|
318
|
+
const next = new Map(prev);
|
|
319
|
+
next.set(msg.id, { status: 'ready', code: undefined });
|
|
320
|
+
return next;
|
|
321
|
+
});
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
const msgIndex = state.messages.findIndex((m) => m.id === msg.id);
|
|
325
|
+
const previousUser = msgIndex > 0 ? state.messages[msgIndex - 1] : undefined;
|
|
326
|
+
const question = previousUser?.role === LegendAIMessageRole.USER
|
|
327
|
+
? previousUser.text
|
|
328
|
+
: undefined;
|
|
329
|
+
const request = {
|
|
330
|
+
service,
|
|
331
|
+
config,
|
|
332
|
+
...(dataProductCoordinates ? { dataProductCoordinates } : {}),
|
|
333
|
+
...(question === undefined ? {} : { question }),
|
|
334
|
+
...(msg.sql === null ? {} : { sql: msg.sql }),
|
|
335
|
+
};
|
|
336
|
+
try {
|
|
337
|
+
const code = await plugin.generatePythonQueryCodeAsync(request);
|
|
338
|
+
setPythonCodeByMessageId((prev) => {
|
|
339
|
+
const next = new Map(prev);
|
|
340
|
+
next.set(msg.id, { status: 'ready', code });
|
|
341
|
+
return next;
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
catch (error) {
|
|
345
|
+
assertErrorThrown(error);
|
|
346
|
+
setPythonCodeByMessageId((prev) => {
|
|
347
|
+
const next = new Map(prev);
|
|
348
|
+
next.set(msg.id, { status: 'error', errorMessage: error.message });
|
|
349
|
+
return next;
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
}, [plugin, services, dataProductCoordinates, config, state.messages]);
|
|
353
|
+
const [openingDataCubeMessageIds, setOpeningDataCubeMessageIds] = useState(new Set());
|
|
354
|
+
// Resolves the AP, best-effort translates its SQL to a DataCube Pure query, and
|
|
355
|
+
// launches DataCube; on translation failure it opens on the bare access point.
|
|
356
|
+
const handleOpenInDataCubeMsg = useCallback(async (msg) => {
|
|
357
|
+
if (!onOpenInDataCube || msg.sql === null) {
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
const accessPointName = msg.queriedAccessPoints[0];
|
|
361
|
+
if (accessPointName === undefined) {
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
const service = services.find((s) => s.pattern.replace(/^\//u, '') === accessPointName) ?? services[0];
|
|
365
|
+
if (!service) {
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
const dataProductPath = dataProductCoordinates?.data_product ?? '';
|
|
369
|
+
setOpeningDataCubeMessageIds((prev) => {
|
|
370
|
+
const next = new Set(prev);
|
|
371
|
+
next.add(msg.id);
|
|
372
|
+
return next;
|
|
373
|
+
});
|
|
374
|
+
const msgIndex = state.messages.findIndex((m) => m.id === msg.id);
|
|
375
|
+
const previousUser = msgIndex > 0 ? state.messages[msgIndex - 1] : undefined;
|
|
376
|
+
const question = previousUser?.role === LegendAIMessageRole.USER
|
|
377
|
+
? previousUser.text
|
|
378
|
+
: undefined;
|
|
379
|
+
const request = {
|
|
380
|
+
sql: msg.sql,
|
|
381
|
+
service,
|
|
382
|
+
dataProductPath,
|
|
383
|
+
config,
|
|
384
|
+
...(question === undefined ? {} : { question }),
|
|
385
|
+
};
|
|
386
|
+
let pureQuery;
|
|
387
|
+
try {
|
|
388
|
+
pureQuery =
|
|
389
|
+
await plugin.translateAccessPointSqlToDataCubeQuery(request);
|
|
390
|
+
}
|
|
391
|
+
catch (error) {
|
|
392
|
+
assertErrorThrown(error);
|
|
393
|
+
}
|
|
394
|
+
try {
|
|
395
|
+
onOpenInDataCube(accessPointName, pureQuery);
|
|
396
|
+
}
|
|
397
|
+
finally {
|
|
398
|
+
setOpeningDataCubeMessageIds((prev) => {
|
|
399
|
+
if (!prev.has(msg.id)) {
|
|
400
|
+
return prev;
|
|
401
|
+
}
|
|
402
|
+
const next = new Set(prev);
|
|
403
|
+
next.delete(msg.id);
|
|
404
|
+
return next;
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
}, [
|
|
408
|
+
onOpenInDataCube,
|
|
409
|
+
plugin,
|
|
410
|
+
services,
|
|
411
|
+
dataProductCoordinates,
|
|
412
|
+
config,
|
|
413
|
+
state.messages,
|
|
414
|
+
]);
|
|
215
415
|
const [showContextBanner, setShowContextBanner] = useState(true);
|
|
216
416
|
const dismissBanner = useCallback(() => setShowContextBanner(false), []);
|
|
217
417
|
const hasMessages = state.messages.length > 0;
|
|
218
|
-
const scopes = isDataProduct ? [] : (availableScopes ?? DEFAULT_SCOPES);
|
|
418
|
+
const scopes = useMemo(() => (isDataProduct ? [] : (availableScopes ?? DEFAULT_SCOPES)), [isDataProduct, availableScopes]);
|
|
219
419
|
const [feedbackByMessageId, setFeedbackByMessageId] = useState(new Map());
|
|
220
420
|
const [pendingFeedbackByMessageId, setPendingFeedbackByMessageId] = useState(new Set());
|
|
221
421
|
const handleMessageFeedback = useCallback(async (feedback) => {
|
|
@@ -235,7 +435,8 @@ export const LegendAIChat = (props) => {
|
|
|
235
435
|
try {
|
|
236
436
|
await onMessageFeedback(feedback);
|
|
237
437
|
}
|
|
238
|
-
catch {
|
|
438
|
+
catch (error) {
|
|
439
|
+
assertErrorThrown(error);
|
|
239
440
|
setFeedbackByMessageId((prev) => {
|
|
240
441
|
const next = new Map(prev);
|
|
241
442
|
next.delete(feedback.messageId);
|
|
@@ -250,9 +451,22 @@ export const LegendAIChat = (props) => {
|
|
|
250
451
|
});
|
|
251
452
|
}
|
|
252
453
|
}, [onMessageFeedback]);
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
454
|
+
const { toggleThinking, runFallbackAction, askQuestionWithIntent } = state;
|
|
455
|
+
const handleSuggestedQueryClick = useCallback((query) => askQuestionWithIntent(query, inferSuggestedQueryIntent(query)), [askQuestionWithIntent, inferSuggestedQueryIntent]);
|
|
456
|
+
const handleRequestPython = useCallback((message) => {
|
|
457
|
+
requestPythonCode(message).catch(noop);
|
|
458
|
+
}, [requestPythonCode]);
|
|
459
|
+
const handleOpenInDataCube = useCallback((message) => {
|
|
460
|
+
handleOpenInDataCubeMsg(message).catch(noop);
|
|
461
|
+
}, [handleOpenInDataCubeMsg]);
|
|
462
|
+
return (_jsxs("div", { className: "legend-ai", id: LEGEND_AI_ANCHOR_ID, children: [_jsxs("div", { className: "legend-ai__header", children: [_jsx("div", { className: "legend-ai__header-icon", children: _jsx(SparkleStarsIcon, {}) }), _jsx("div", { className: "legend-ai__title", children: title ?? 'Legend AI' }), _jsxs("div", { className: "legend-ai__header-actions", children: [_jsx("button", { type: "button", className: "legend-ai__header-action", title: "New chat", "aria-label": "New chat", onClick: () => state.clearChat(), children: _jsx(PlusIcon, {}) }), onMinimize && (_jsx("button", { type: "button", className: "legend-ai__header-action", title: "Minimize", "aria-label": "Minimize", onClick: onMinimize, children: _jsx(MinusIcon, {}) })), onClose && (_jsx("button", { type: "button", className: "legend-ai__header-action", title: "Close", "aria-label": "Close", onClick: () => {
|
|
463
|
+
onLogTelemetryEvent?.({
|
|
464
|
+
type: LegendAIChatTelemetryEventType.ASSISTANT_CLOSED,
|
|
465
|
+
});
|
|
466
|
+
onClose();
|
|
467
|
+
}, children: _jsx(TimesIcon, {}) }))] })] }), showContextBanner && contextBannerMessage && (_jsx(LegendAIContextBanner, { message: contextBannerMessage, onDismiss: dismissBanner })), _jsxs("div", { className: "legend-ai__conversation", ref: state.conversationRef, children: [!hasMessages && (_jsxs("div", { className: "legend-ai__empty-state", children: [_jsx("div", { className: "legend-ai__empty-icon", children: _jsx(SparkleStarsIcon, {}) }), _jsx("div", { className: "legend-ai__empty-text", children: "Ask a question about your data" }), overview.summary.length > 0 && (_jsx("div", { className: "legend-ai__empty-overview", children: overview.summary })), (overview.entityCount > 0 || overview.serviceCount > 0) && (_jsxs("div", { className: "legend-ai__empty-meta", children: [overview.entityCount > 0 &&
|
|
468
|
+
`${overview.entityCount} entit${overview.entityCount === 1 ? 'y' : 'ies'}`, overview.entityCount > 0 && overview.serviceCount > 0 && ' · ', overview.serviceCount > 0 &&
|
|
469
|
+
`${overview.serviceCount} service${overview.serviceCount === 1 ? '' : 's'}`] })), _jsx("div", { className: "legend-ai__suggestions", children: suggestedQueries.map((q, position) => (_jsx(SuggestionButton, { query: q, position: position, className: "legend-ai__suggestion-chip", source: LegendAISuggestedQuerySource.STARTER, onSelect: (query) => state.askQuestionWithIntent(query, inferSuggestedQueryIntent(query)), ...(onLogTelemetryEvent ? { onLogTelemetryEvent } : {}) }, q))) })] })), state.messages.map((msg, msgIndex) => {
|
|
256
470
|
if (msg.role === LegendAIMessageRole.USER) {
|
|
257
471
|
return (_jsx("div", { className: "legend-ai__msg legend-ai__msg--user", children: _jsx("div", { className: "legend-ai__msg-bubble", children: msg.text }) }, msg.id));
|
|
258
472
|
}
|
|
@@ -261,11 +475,19 @@ export const LegendAIChat = (props) => {
|
|
|
261
475
|
const questionText = previousMessage?.role === LegendAIMessageRole.USER
|
|
262
476
|
? previousMessage.text
|
|
263
477
|
: '';
|
|
264
|
-
|
|
478
|
+
const messagePython = pythonCodeByMessageId.get(msg.id);
|
|
479
|
+
return (_jsx(AssistantMessageView, { msg: msg, msgIndex: msgIndex, questionText: questionText, isThinkingVisible: isThinkingVisible, onToggleThinking: toggleThinking, onMessageFeedback: handleMessageFeedback, selectedFeedbackRating: feedbackByMessageId.get(msg.id), feedbackSubmitting: pendingFeedbackByMessageId.has(msg.id), ...(config.enghubDocUrl === undefined
|
|
265
480
|
? {}
|
|
266
481
|
: { enghubDocUrl: config.enghubDocUrl }), ...(config.enthubRequestAccessUrl === undefined
|
|
267
482
|
? {}
|
|
268
|
-
: { enthubRequestAccessUrl: config.enthubRequestAccessUrl }), ...(onRequestAccess ? { onRequestAccess } : {}),
|
|
483
|
+
: { enthubRequestAccessUrl: config.enthubRequestAccessUrl }), ...(onRequestAccess ? { onRequestAccess } : {}), ...(messagePython ? { pythonEntry: messagePython } : {}), ...(supportsPython
|
|
484
|
+
? { onRequestPython: handleRequestPython }
|
|
485
|
+
: {}), ...(supportsDataCube && onOpenInDataCube
|
|
486
|
+
? {
|
|
487
|
+
onOpenInDataCube: handleOpenInDataCube,
|
|
488
|
+
isOpeningInDataCube: openingDataCubeMessageIds.has(msg.id),
|
|
489
|
+
}
|
|
490
|
+
: {}), onFallbackAction: runFallbackAction, onSuggestedQueryClick: handleSuggestedQueryClick, ...(onLogTelemetryEvent ? { onLogTelemetryEvent } : {}) }, msg.id));
|
|
269
491
|
})] }), _jsx(LegendAIChatInput, { state: state, scopes: scopes })] }));
|
|
270
492
|
};
|
|
271
493
|
//# sourceMappingURL=LegendAIChat.js.map
|