@gooddata/sdk-ui-gen-ai 11.48.0-alpha.2 → 11.48.0-alpha.3
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/esm/components/GenAIChatContextIndicator.d.ts.map +1 -1
- package/esm/components/GenAIChatContextIndicator.js +11 -11
- package/esm/components/GenAIChatDialogConnected.d.ts +3 -1
- package/esm/components/GenAIChatDialogConnected.d.ts.map +1 -1
- package/esm/components/GenAIChatDialogConnected.js +25 -11
- package/esm/components/GenAiChatContextChooser.d.ts +1 -1
- package/esm/components/GenAiChatContextChooser.d.ts.map +1 -1
- package/esm/components/GenAiChatContextChooser.js +8 -8
- package/esm/components/hooks/useContextItems.d.ts +2 -2
- package/esm/components/hooks/useContextItems.d.ts.map +1 -1
- package/esm/components/hooks/useContextItems.js +5 -5
- package/esm/components/utils/icons.d.ts +2 -2
- package/esm/components/utils/icons.d.ts.map +1 -1
- package/esm/components/utils/icons.js +1 -0
- package/esm/context/addContextReference.d.ts +3 -2
- package/esm/context/addContextReference.d.ts.map +1 -1
- package/esm/context/addContextReference.js +62 -7
- package/esm/context/build.d.ts +2 -2
- package/esm/context/build.d.ts.map +1 -1
- package/esm/context/build.js +35 -4
- package/esm/context/collectContextReferences.d.ts +4 -10
- package/esm/context/collectContextReferences.d.ts.map +1 -1
- package/esm/context/collectContextReferences.js +96 -8
- package/esm/context/dashboard.d.ts.map +1 -1
- package/esm/context/dashboard.js +10 -4
- package/esm/context/removeContextReference.d.ts +2 -1
- package/esm/context/removeContextReference.d.ts.map +1 -1
- package/esm/context/removeContextReference.js +31 -2
- package/esm/store/chatWindow/chatWindowSelectors.d.ts +1 -8
- package/esm/store/chatWindow/chatWindowSelectors.d.ts.map +1 -1
- package/esm/store/chatWindow/chatWindowSelectors.js +1 -13
- package/esm/store/chatWindow/chatWindowSlice.d.ts +5 -3
- package/esm/store/chatWindow/chatWindowSlice.d.ts.map +1 -1
- package/esm/store/chatWindow/chatWindowSlice.js +15 -17
- package/esm/store/sideEffects/onUserMessage.d.ts.map +1 -1
- package/esm/store/sideEffects/onUserMessage.js +3 -12
- package/esm/types.d.ts +15 -10
- package/esm/types.d.ts.map +1 -1
- package/esm/utils.d.ts +4 -1
- package/esm/utils.d.ts.map +1 -1
- package/esm/utils.js +28 -0
- package/package.json +20 -20
- package/styles/css/main.css +31 -9
- package/styles/css/main.css.map +1 -1
- package/styles/scss/main.scss +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GenAIChatContextIndicator.d.ts","sourceRoot":"","sources":["../../src/components/GenAIChatContextIndicator.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,EAAe,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"GenAIChatContextIndicator.d.ts","sourceRoot":"","sources":["../../src/components/GenAIChatContextIndicator.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,EAAe,MAAM,OAAO,CAAC;AAa7C,KAAK,iCAAiC,GAAG;IACrC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,CAAC;AAuDF,eAAO,MAAM,yBAAyB,EAAE,EAAE,CAAC,iCAAiC,CAG5C,CAAC"}
|
|
@@ -4,8 +4,8 @@ import { useCallback } from "react";
|
|
|
4
4
|
import { connect, useSelector } from "react-redux";
|
|
5
5
|
import { UiChip } from "@gooddata/sdk-ui-kit";
|
|
6
6
|
import { collectContextReferences } from "../context/collectContextReferences.js";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
7
|
+
import { userContextSelector } from "../store/chatWindow/chatWindowSelectors.js";
|
|
8
|
+
import { removeContextReferenceAction } from "../store/chatWindow/chatWindowSlice.js";
|
|
9
9
|
import { getIconByType } from "./utils/icons.js";
|
|
10
10
|
/**
|
|
11
11
|
* Shows what ambient context the assistant is answering about — the open dashboard and its live
|
|
@@ -15,21 +15,21 @@ import { getIconByType } from "./utils/icons.js";
|
|
|
15
15
|
*
|
|
16
16
|
* @internal
|
|
17
17
|
*/
|
|
18
|
-
function GenAIChatContextIndicatorCore({
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
const
|
|
18
|
+
function GenAIChatContextIndicatorCore({ removeContextReference, onDelete, }) {
|
|
19
|
+
const context = useSelector(userContextSelector);
|
|
20
|
+
const references = collectContextReferences(context);
|
|
21
|
+
const onDeleteHandler = useCallback((reference) => {
|
|
22
22
|
return () => {
|
|
23
|
-
|
|
23
|
+
removeContextReference({ object: reference });
|
|
24
24
|
onDelete?.();
|
|
25
25
|
};
|
|
26
|
-
}, [
|
|
27
|
-
if (
|
|
26
|
+
}, [removeContextReference, onDelete]);
|
|
27
|
+
if (references.length === 0) {
|
|
28
28
|
return null;
|
|
29
29
|
}
|
|
30
|
-
return (_jsx("div", { className: "gd-gen-ai-chat__context-indicator", "aria-live": "polite", children:
|
|
30
|
+
return (_jsx("div", { className: "gd-gen-ai-chat__context-indicator", "aria-live": "polite", children: references.map((reference, index) => (_jsx(UiChip, { ...getIconByType(reference.type), label: reference.title, isExpandable: false, isDeletable: true, onDelete: onDeleteHandler(reference) }, index))) }));
|
|
31
31
|
}
|
|
32
32
|
const mapDispatchToProps = {
|
|
33
|
-
|
|
33
|
+
removeContextReference: removeContextReferenceAction,
|
|
34
34
|
};
|
|
35
35
|
export const GenAIChatContextIndicator = connect(null, mapDispatchToProps)(GenAIChatContextIndicatorCore);
|
|
@@ -81,6 +81,8 @@ export interface IGenAIChatDialogConnectedProps {
|
|
|
81
81
|
ambientUserContext?: IGenAIUserContext;
|
|
82
82
|
/** When true, the seeded question is appended to the existing thread instead of clearing it first. */
|
|
83
83
|
appendToChat?: boolean;
|
|
84
|
+
/** When true, the user context is replaced instead of merged with the existing one. */
|
|
85
|
+
replaceUserContext?: boolean;
|
|
84
86
|
/** Object-search tag scope reflecting the caller's current view. */
|
|
85
87
|
includeTags?: string[];
|
|
86
88
|
excludeTags?: string[];
|
|
@@ -111,5 +113,5 @@ export interface IGenAIChatDialogConnectedProps {
|
|
|
111
113
|
*
|
|
112
114
|
* @internal
|
|
113
115
|
*/
|
|
114
|
-
export declare function GenAIChatDialogConnected({ backend, workspace, locale, canManage, canAnalyze, canFullControl, settings, isOpen, onOpen, onClose, askedQuestion, askSeq, userContext, ambientUserContext, appendToChat, includeTags, excludeTags, objectTypes: objectTypesOverride, onEvent, onAnyEvent, dialogPosition, className, colorPalette, allowNativeLinks, onLinkClick, returnFocusTo }: IGenAIChatDialogConnectedProps): import("react/jsx-runtime").JSX.Element;
|
|
116
|
+
export declare function GenAIChatDialogConnected({ backend, workspace, locale, canManage, canAnalyze, canFullControl, settings, isOpen, onOpen, onClose, askedQuestion, askSeq, userContext, ambientUserContext, appendToChat, replaceUserContext, includeTags, excludeTags, objectTypes: objectTypesOverride, onEvent, onAnyEvent, dialogPosition, className, colorPalette, allowNativeLinks, onLinkClick, returnFocusTo }: IGenAIChatDialogConnectedProps): import("react/jsx-runtime").JSX.Element;
|
|
115
117
|
//# sourceMappingURL=GenAIChatDialogConnected.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GenAIChatDialogConnected.d.ts","sourceRoot":"","sources":["../../src/components/GenAIChatDialogConnected.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"GenAIChatDialogConnected.d.ts","sourceRoot":"","sources":["../../src/components/GenAIChatDialogConnected.tsx"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@ import { GenAIChatDialog } from "./GenAIChatDialog.js";
|
|
|
17
17
|
*
|
|
18
18
|
* @internal
|
|
19
19
|
*/
|
|
20
|
-
export function GenAIChatDialogConnected({ backend, workspace, locale, canManage, canAnalyze, canFullControl, settings, isOpen, onOpen, onClose, askedQuestion, askSeq, userContext, ambientUserContext, appendToChat, includeTags, excludeTags, objectTypes: objectTypesOverride, onEvent, onAnyEvent, dialogPosition, className, colorPalette, allowNativeLinks = true, onLinkClick, returnFocusTo, }) {
|
|
20
|
+
export function GenAIChatDialogConnected({ backend, workspace, locale, canManage, canAnalyze, canFullControl, settings, isOpen, onOpen, onClose, askedQuestion, askSeq, userContext, ambientUserContext, appendToChat, replaceUserContext, includeTags, excludeTags, objectTypes: objectTypesOverride, onEvent, onAnyEvent, dialogPosition, className, colorPalette, allowNativeLinks = true, onLinkClick, returnFocusTo, }) {
|
|
21
21
|
const defaultLinkClick = useCallback(({ itemUrl, newTab, preventDefault }) => {
|
|
22
22
|
if (itemUrl) {
|
|
23
23
|
preventDefault();
|
|
@@ -100,26 +100,40 @@ export function GenAIChatDialogConnected({ backend, workspace, locale, canManage
|
|
|
100
100
|
const lastSeedTokenRef = useRef(null);
|
|
101
101
|
useEffect(() => {
|
|
102
102
|
// Only seed while the chat is open, and only once per ask (LX-2544).
|
|
103
|
-
if (!isOpen || !chatDispatcher || !
|
|
103
|
+
if (!isOpen || !chatDispatcher || !settings) {
|
|
104
104
|
return;
|
|
105
105
|
}
|
|
106
|
-
const seedToken = askSeq ?? askedQuestion;
|
|
106
|
+
const seedToken = askSeq ?? askedQuestion ?? JSON.stringify(userContext ?? {});
|
|
107
107
|
if (lastSeedTokenRef.current === seedToken) {
|
|
108
108
|
return;
|
|
109
109
|
}
|
|
110
110
|
lastSeedTokenRef.current = seedToken;
|
|
111
|
-
|
|
111
|
+
// Check clean
|
|
112
|
+
const clear = (askedQuestion || userContext) && !appendToChat;
|
|
113
|
+
if (clear) {
|
|
112
114
|
chatDispatcher(clearThreadAction());
|
|
113
115
|
}
|
|
114
116
|
// Always set (and thereby clear when undefined) so a follow-up ask without context does not
|
|
115
117
|
// inherit the previous ask's user context (LX-2544).
|
|
116
|
-
chatDispatcher(setUserContextAction({ userContext }));
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
118
|
+
chatDispatcher(setUserContextAction({ userContext, replaceUserContext }));
|
|
119
|
+
// Ask question
|
|
120
|
+
if (askedQuestion) {
|
|
121
|
+
if (settings.enableAiAgenticConversations) {
|
|
122
|
+
chatDispatcher(newMessageAction(makeUserItem({ type: "text", text: askedQuestion })));
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
chatDispatcher(newMessageAction(makeUserMessage([makeTextContents(askedQuestion, [])])));
|
|
126
|
+
}
|
|
122
127
|
}
|
|
123
|
-
}, [
|
|
128
|
+
}, [
|
|
129
|
+
isOpen,
|
|
130
|
+
chatDispatcher,
|
|
131
|
+
askedQuestion,
|
|
132
|
+
askSeq,
|
|
133
|
+
userContext,
|
|
134
|
+
appendToChat,
|
|
135
|
+
settings,
|
|
136
|
+
replaceUserContext,
|
|
137
|
+
]);
|
|
124
138
|
return (_jsx(GenAIChatDialog, { isOpen: isOpen, locale: locale, backend: backend, workspace: workspace, canManage: canManage, canAnalyze: canAnalyze, canFullControl: canFullControl, settings: settings, objectTypes: objectTypes, includeTags: includeTags, excludeTags: excludeTags, className: className, dialogPosition: dialogPosition, colorPalette: colorPalette, allowNativeLinks: allowNativeLinks, onLinkClick: onLinkClick ?? defaultLinkClick, onOpen: onOpen, onClose: onClose, eventHandlers: eventHandlers, onDispatcher: onDispatcher, returnFocusTo: returnFocusTo }));
|
|
125
139
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type FC } from "react";
|
|
2
|
-
import { type IGenAIContextObject } from "../
|
|
2
|
+
import { type IGenAIContextObject } from "../types.js";
|
|
3
3
|
type GenAiChatContextChooserOwnProps = {
|
|
4
4
|
onAddContext?: (context: IGenAIContextObject) => void;
|
|
5
5
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GenAiChatContextChooser.d.ts","sourceRoot":"","sources":["../../src/components/GenAiChatContextChooser.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"GenAiChatContextChooser.d.ts","sourceRoot":"","sources":["../../src/components/GenAiChatContextChooser.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAWhC,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAIvD,KAAK,+BAA+B,GAAG;IACnC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;CACzD,CAAC;AA4FF,eAAO,MAAM,uBAAuB,EAAE,EAAE,CAAC,+BAA+B,CAG1C,CAAC"}
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { defineMessages, useIntl } from "react-intl";
|
|
3
3
|
import { connect } from "react-redux";
|
|
4
4
|
import { Dropdown, UiIconButton, UiMenu, UiSubmenuHeader } from "@gooddata/sdk-ui-kit";
|
|
5
|
-
import { ambientContextSelector,
|
|
5
|
+
import { ambientContextSelector, userContextSelector } from "../store/chatWindow/chatWindowSelectors.js";
|
|
6
6
|
import { addContextReferenceAction } from "../store/chatWindow/chatWindowSlice.js";
|
|
7
7
|
import { useContextItems } from "./hooks/useContextItems.js";
|
|
8
8
|
const msgs = defineMessages({
|
|
@@ -10,10 +10,10 @@ const msgs = defineMessages({
|
|
|
10
10
|
id: "gd.gen-ai.context.add_context",
|
|
11
11
|
},
|
|
12
12
|
});
|
|
13
|
-
function GenAiChatContextChooserCore({
|
|
13
|
+
function GenAiChatContextChooserCore({ active, ambient, addContextReference, onAddContext, }) {
|
|
14
14
|
const intl = useIntl();
|
|
15
|
-
const items = useContextItems(
|
|
16
|
-
if (!
|
|
15
|
+
const items = useContextItems(ambient, active);
|
|
16
|
+
if (!ambient) {
|
|
17
17
|
return null;
|
|
18
18
|
}
|
|
19
19
|
return (_jsx("div", { className: "gd-gen-ai-chat__input__context", children: _jsx(Dropdown, { alignPoints: [{ align: "tl bl", offset: { x: 0, y: 0 } }], closeOnEscape: true, fullscreenOnMobile: false, autofocusOnOpen: true, accessibilityConfig: {}, renderButton: ({ isOpen, toggleDropdown, accessibilityConfig }) => (_jsx(UiIconButton, { icon: "plus", variant: "tertiary", size: "small", dataTestId: "choose_context", isActive: isOpen, accessibilityConfig: {
|
|
@@ -26,11 +26,11 @@ function GenAiChatContextChooserCore({ currentAmbient, selectedAmbient, addConte
|
|
|
26
26
|
} })) }) }));
|
|
27
27
|
}
|
|
28
28
|
const mapStateToProps = (state) => {
|
|
29
|
-
const
|
|
30
|
-
const
|
|
29
|
+
const ambient = ambientContextSelector(state);
|
|
30
|
+
const active = userContextSelector(state);
|
|
31
31
|
return {
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
active,
|
|
33
|
+
ambient,
|
|
34
34
|
};
|
|
35
35
|
};
|
|
36
36
|
const mapDispatchToProps = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type IGenAIUserContext } from "@gooddata/sdk-model";
|
|
2
2
|
import { type IUiMenuItem } from "@gooddata/sdk-ui-kit";
|
|
3
|
-
import { type IGenAIContextObject } from "../../
|
|
4
|
-
export declare function useContextItems(
|
|
3
|
+
import { type IGenAIContextObject } from "../../types.js";
|
|
4
|
+
export declare function useContextItems(ambient: IGenAIUserContext | undefined, active: IGenAIUserContext | undefined): IUiMenuItem<{
|
|
5
5
|
interactive: IGenAIContextObject;
|
|
6
6
|
}>[];
|
|
7
7
|
//# sourceMappingURL=useContextItems.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useContextItems.d.ts","sourceRoot":"","sources":["../../../src/components/hooks/useContextItems.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,KAAK,WAAW,EAAU,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"useContextItems.d.ts","sourceRoot":"","sources":["../../../src/components/hooks/useContextItems.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,KAAK,WAAW,EAAU,MAAM,sBAAsB,CAAC;AAMhE,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAG1D,wBAAgB,eAAe,CAC3B,OAAO,EAAE,iBAAiB,GAAG,SAAS,EACtC,MAAM,EAAE,iBAAiB,GAAG,SAAS,GACtC,WAAW,CAAC;IAAE,WAAW,EAAE,mBAAmB,CAAA;CAAE,CAAC,EAAE,CAgCrD"}
|
|
@@ -2,13 +2,13 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
// (C) 2026 GoodData Corporation
|
|
3
3
|
import { useMemo } from "react";
|
|
4
4
|
import { UiIcon } from "@gooddata/sdk-ui-kit";
|
|
5
|
-
import { collectContextReferences, } from "../../context/collectContextReferences.js";
|
|
5
|
+
import { collectAvailableReferences, collectContextReferences, } from "../../context/collectContextReferences.js";
|
|
6
6
|
import { getIconByType } from "../utils/icons.js";
|
|
7
|
-
export function useContextItems(
|
|
7
|
+
export function useContextItems(ambient, active) {
|
|
8
8
|
return useMemo(() => {
|
|
9
9
|
const items = [];
|
|
10
|
-
const currentReferences =
|
|
11
|
-
const selectedReferences = collectContextReferences(
|
|
10
|
+
const currentReferences = collectAvailableReferences(ambient);
|
|
11
|
+
const selectedReferences = collectContextReferences(active);
|
|
12
12
|
currentReferences.forEach((reference) => {
|
|
13
13
|
const isSelected = selectedReferences.some((selectedReference) => selectedReference.id === reference.id && selectedReference.type === reference.type);
|
|
14
14
|
if (!isSelected) {
|
|
@@ -27,5 +27,5 @@ export function useContextItems(current, selected, type) {
|
|
|
27
27
|
}
|
|
28
28
|
});
|
|
29
29
|
return items;
|
|
30
|
-
}, [
|
|
30
|
+
}, [active, ambient]);
|
|
31
31
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { type GenAIObjectType } from "@gooddata/sdk-model";
|
|
2
1
|
import { type IconType, type ThemeColor } from "@gooddata/sdk-ui-kit";
|
|
3
|
-
|
|
2
|
+
import { type IGenAIContextObject } from "../../types.js";
|
|
3
|
+
export declare function getIconByType(type: IGenAIContextObject["type"]): {
|
|
4
4
|
iconBefore?: IconType;
|
|
5
5
|
iconColor?: ThemeColor;
|
|
6
6
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../../src/components/utils/icons.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../../src/components/utils/icons.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEtE,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,wBAAgB,aAAa,CAAC,IAAI,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAAG;IAC9D,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,SAAS,CAAC,EAAE,UAAU,CAAC;CAC1B,CAeA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
import type
|
|
1
|
+
import { type IGenAIUserContext } from "@gooddata/sdk-model";
|
|
2
|
+
import { type IGenAIContextObject, type StoreContext } from "../types.js";
|
|
3
3
|
export declare function addContextReference(context: StoreContext, reference?: IGenAIContextObject): StoreContext;
|
|
4
|
+
export declare function addAmbientContextReferences(context: StoreContext, userContext?: IGenAIUserContext): StoreContext;
|
|
4
5
|
//# sourceMappingURL=addContextReference.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addContextReference.d.ts","sourceRoot":"","sources":["../../src/context/addContextReference.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"addContextReference.d.ts","sourceRoot":"","sources":["../../src/context/addContextReference.ts"],"names":[],"mappings":"AAEA,OAAO,EAEH,KAAK,iBAAiB,EAEzB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAM1E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,mBAAmB,GAAG,YAAY,CA+DxG;AAED,wBAAgB,2BAA2B,CACvC,OAAO,EAAE,YAAY,EACrB,WAAW,CAAC,EAAE,iBAAiB,GAChC,YAAY,CAgBd"}
|
|
@@ -1,19 +1,74 @@
|
|
|
1
1
|
// (C) 2026 GoodData Corporation
|
|
2
|
-
import { areObjRefsEqual } from "@gooddata/sdk-model";
|
|
2
|
+
import { areObjRefsEqual, } from "@gooddata/sdk-model";
|
|
3
|
+
import { convertGenAiTypeToReferenceType } from "../utils.js";
|
|
4
|
+
import { mergeContexts } from "./build.js";
|
|
5
|
+
import { isReferenceChanged } from "./isReferenceChanged.js";
|
|
3
6
|
export function addContextReference(context, reference) {
|
|
4
|
-
const { ambient } = context;
|
|
7
|
+
const { ambient, active } = context;
|
|
5
8
|
if (!reference) {
|
|
6
9
|
return context;
|
|
7
10
|
}
|
|
8
|
-
if (reference.where === "view.dashboard") {
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
if (areObjRefsEqual(ambientRef, ref)) {
|
|
11
|
+
if (reference.where === "view.dashboard" && ambient?.view?.dashboard) {
|
|
12
|
+
const ambientDashboard = ambient.view.dashboard;
|
|
13
|
+
if (areObjRefsEqual(ambientDashboard.ref, reference.ref)) {
|
|
12
14
|
return {
|
|
13
15
|
...context,
|
|
14
|
-
|
|
16
|
+
active: {
|
|
17
|
+
...active,
|
|
18
|
+
view: {
|
|
19
|
+
dashboard: ambientDashboard,
|
|
20
|
+
},
|
|
21
|
+
},
|
|
15
22
|
};
|
|
16
23
|
}
|
|
17
24
|
}
|
|
25
|
+
if (reference.where === "referencedObjects") {
|
|
26
|
+
const refContext = reference.context;
|
|
27
|
+
const referencedObjects = (active?.referencedObjects ?? []).slice();
|
|
28
|
+
const index = referencedObjects.findIndex((obj) => areObjRefsEqual(obj.context?.ref, refContext?.ref) || obj.context === refContext);
|
|
29
|
+
let group;
|
|
30
|
+
if (index === -1) {
|
|
31
|
+
group = {
|
|
32
|
+
context: refContext,
|
|
33
|
+
objects: [],
|
|
34
|
+
};
|
|
35
|
+
referencedObjects.push(group);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
const item = referencedObjects[index];
|
|
39
|
+
group = {
|
|
40
|
+
...item,
|
|
41
|
+
context: item.context,
|
|
42
|
+
objects: item.objects.slice(),
|
|
43
|
+
};
|
|
44
|
+
referencedObjects[index] = group;
|
|
45
|
+
}
|
|
46
|
+
group.objects.push({
|
|
47
|
+
ref: reference.ref,
|
|
48
|
+
title: reference.title,
|
|
49
|
+
type: convertGenAiTypeToReferenceType(reference.type),
|
|
50
|
+
});
|
|
51
|
+
return {
|
|
52
|
+
...context,
|
|
53
|
+
active: {
|
|
54
|
+
...active,
|
|
55
|
+
referencedObjects,
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
18
59
|
return context;
|
|
19
60
|
}
|
|
61
|
+
export function addAmbientContextReferences(context, userContext) {
|
|
62
|
+
const updateActive = Boolean(!context.ambient ||
|
|
63
|
+
context.active?.view?.dashboard ||
|
|
64
|
+
isReferenceChanged(context.ambient, userContext));
|
|
65
|
+
return {
|
|
66
|
+
...context,
|
|
67
|
+
ambient: userContext,
|
|
68
|
+
...(updateActive
|
|
69
|
+
? {
|
|
70
|
+
active: mergeContexts(context.active, userContext),
|
|
71
|
+
}
|
|
72
|
+
: {}),
|
|
73
|
+
};
|
|
74
|
+
}
|
package/esm/context/build.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type IGenAIUserContext } from "@gooddata/sdk-model";
|
|
2
2
|
export declare function buildContext(props: Partial<IGenAIUserContext>): IGenAIUserContext;
|
|
3
3
|
/**
|
|
4
4
|
* @internal
|
|
5
5
|
*/
|
|
6
|
-
export declare function mergeContexts(...contexts: IGenAIUserContext[]): IGenAIUserContext;
|
|
6
|
+
export declare function mergeContexts(...contexts: (IGenAIUserContext | undefined)[]): IGenAIUserContext | undefined;
|
|
7
7
|
//# sourceMappingURL=build.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/context/build.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/context/build.ts"],"names":[],"mappings":"AAEA,OAAO,EAGH,KAAK,iBAAiB,EAEzB,MAAM,qBAAqB,CAAC;AAE7B,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAIjF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,QAAQ,EAAE,CAAC,iBAAiB,GAAG,SAAS,CAAC,EAAE,GAAG,iBAAiB,GAAG,SAAS,CAsB3G"}
|
package/esm/context/build.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// (C) 2026 GoodData Corporation
|
|
2
|
+
import { areObjRefsEqual, } from "@gooddata/sdk-model";
|
|
2
3
|
export function buildContext(props) {
|
|
3
4
|
return {
|
|
4
5
|
...props,
|
|
@@ -8,11 +9,41 @@ export function buildContext(props) {
|
|
|
8
9
|
* @internal
|
|
9
10
|
*/
|
|
10
11
|
export function mergeContexts(...contexts) {
|
|
11
|
-
|
|
12
|
+
const merged = contexts.reduce((acc, context) => {
|
|
13
|
+
if (!context) {
|
|
14
|
+
return acc;
|
|
15
|
+
}
|
|
16
|
+
const dashboard = mergeDashboard(context.view?.dashboard, acc.view?.dashboard);
|
|
17
|
+
const view = {
|
|
18
|
+
...(dashboard ? { dashboard } : {}),
|
|
19
|
+
};
|
|
20
|
+
const activeObject = mergeActiveObject(context.activeObject, acc.activeObject);
|
|
21
|
+
const referencedObjects = [...(acc?.referencedObjects ?? []), ...(context?.referencedObjects ?? [])];
|
|
12
22
|
return {
|
|
13
|
-
view
|
|
14
|
-
activeObject
|
|
15
|
-
|
|
23
|
+
...(Object.keys(view).length > 0 ? { view } : {}),
|
|
24
|
+
...(activeObject ? { activeObject } : {}),
|
|
25
|
+
...(referencedObjects.length > 0 ? { referencedObjects } : {}),
|
|
16
26
|
};
|
|
17
27
|
}, {});
|
|
28
|
+
return Object.keys(merged).length > 0 ? merged : undefined;
|
|
29
|
+
}
|
|
30
|
+
function mergeDashboard(dashboard, existingDashboard) {
|
|
31
|
+
if (areObjRefsEqual(dashboard?.ref, existingDashboard?.ref)) {
|
|
32
|
+
const merged = {
|
|
33
|
+
...existingDashboard,
|
|
34
|
+
...dashboard,
|
|
35
|
+
};
|
|
36
|
+
return Object.keys(merged).length > 0 ? merged : undefined;
|
|
37
|
+
}
|
|
38
|
+
return dashboard ?? existingDashboard;
|
|
39
|
+
}
|
|
40
|
+
function mergeActiveObject(activeObject, existingActiveObject) {
|
|
41
|
+
if (areObjRefsEqual(activeObject?.ref, existingActiveObject?.ref)) {
|
|
42
|
+
const merged = {
|
|
43
|
+
...existingActiveObject,
|
|
44
|
+
...activeObject,
|
|
45
|
+
};
|
|
46
|
+
return Object.keys(merged).length > 0 ? merged : undefined;
|
|
47
|
+
}
|
|
48
|
+
return activeObject ?? existingActiveObject;
|
|
18
49
|
}
|
|
@@ -1,11 +1,5 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
title: string;
|
|
6
|
-
type: GenAIObjectType;
|
|
7
|
-
where: "view.dashboard";
|
|
8
|
-
nesting: number;
|
|
9
|
-
}
|
|
10
|
-
export declare function collectContextReferences(context: IGenAIUserContext | undefined, type: "ambient" | "user"): IGenAIContextObject[];
|
|
1
|
+
import { type IGenAIUserContext } from "@gooddata/sdk-model";
|
|
2
|
+
import { type IGenAIContextObject } from "../types.js";
|
|
3
|
+
export declare function collectContextReferences(context: IGenAIUserContext | undefined): IGenAIContextObject[];
|
|
4
|
+
export declare function collectAvailableReferences(context: IGenAIUserContext | undefined): IGenAIContextObject[];
|
|
11
5
|
//# sourceMappingURL=collectContextReferences.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collectContextReferences.d.ts","sourceRoot":"","sources":["../../src/context/collectContextReferences.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"collectContextReferences.d.ts","sourceRoot":"","sources":["../../src/context/collectContextReferences.ts"],"names":[],"mappings":"AAEA,OAAO,EAEH,KAAK,iBAAiB,EAGzB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGvD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,GAAG,mBAAmB,EAAE,CAwCtG;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,GAAG,mBAAmB,EAAE,CAiFxG"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// (C) 2026 GoodData Corporation
|
|
2
|
-
import { isIdentifierRef, } from "@gooddata/sdk-model";
|
|
3
|
-
|
|
2
|
+
import { isIdentifierRef, serializeObjRef, } from "@gooddata/sdk-model";
|
|
3
|
+
import { convertReferenceTypeToGenAiType } from "../utils.js";
|
|
4
|
+
export function collectContextReferences(context) {
|
|
4
5
|
if (!context) {
|
|
5
6
|
return [];
|
|
6
7
|
}
|
|
@@ -19,11 +20,98 @@ export function collectContextReferences(context, type) {
|
|
|
19
20
|
nesting: 0,
|
|
20
21
|
});
|
|
21
22
|
}
|
|
22
|
-
//
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
// references
|
|
24
|
+
context.referencedObjects?.forEach((obj) => {
|
|
25
|
+
obj.objects.forEach((item) => {
|
|
26
|
+
const ref = item.ref;
|
|
27
|
+
const id = isIdentifierRef(ref) ? ref.identifier : ref.uri;
|
|
28
|
+
references.push({
|
|
29
|
+
id,
|
|
30
|
+
ref,
|
|
31
|
+
nesting: 1,
|
|
32
|
+
where: "referencedObjects",
|
|
33
|
+
title: item.title ?? id,
|
|
34
|
+
type: convertReferenceTypeToGenAiType(item.type),
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
return references.sort((a, b) => a.nesting - b.nesting);
|
|
39
|
+
}
|
|
40
|
+
export function collectAvailableReferences(context) {
|
|
41
|
+
if (!context) {
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
const references = [];
|
|
45
|
+
const used = [];
|
|
46
|
+
// dashboard
|
|
47
|
+
const dashboard = context.view?.dashboard;
|
|
48
|
+
if (dashboard) {
|
|
49
|
+
const dashboardRef = dashboard.ref;
|
|
50
|
+
const dashboardId = isIdentifierRef(dashboardRef) ? dashboardRef.identifier : dashboardRef.uri;
|
|
51
|
+
references.push({
|
|
52
|
+
id: dashboardId,
|
|
53
|
+
ref: dashboardRef,
|
|
54
|
+
type: "dashboard",
|
|
55
|
+
where: "view.dashboard",
|
|
56
|
+
title: dashboard.title ?? dashboardId,
|
|
57
|
+
nesting: 0,
|
|
58
|
+
});
|
|
59
|
+
used.push(serializeObjRef(dashboardRef));
|
|
60
|
+
const context = {
|
|
61
|
+
ref: dashboardRef,
|
|
62
|
+
type: "DASHBOARD",
|
|
63
|
+
title: dashboard.title ?? dashboardId,
|
|
64
|
+
};
|
|
65
|
+
dashboard.widgets.forEach((widget) => {
|
|
66
|
+
switch (widget.widgetType) {
|
|
67
|
+
case "insight": {
|
|
68
|
+
const ref = widget.widgetRef;
|
|
69
|
+
if (!ref) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const id = isIdentifierRef(ref) ? ref.identifier : ref.uri;
|
|
73
|
+
const key = serializeObjRef(ref);
|
|
74
|
+
if (!used.includes(key)) {
|
|
75
|
+
used.push(key);
|
|
76
|
+
references.push({
|
|
77
|
+
id,
|
|
78
|
+
ref,
|
|
79
|
+
nesting: 1,
|
|
80
|
+
where: "referencedObjects",
|
|
81
|
+
title: widget.title ?? id,
|
|
82
|
+
type: "widget",
|
|
83
|
+
context,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
case "visualizationSwitcher": {
|
|
89
|
+
widget.visualizations?.forEach((visualization) => {
|
|
90
|
+
const ref = visualization.widgetRef;
|
|
91
|
+
if (!ref) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const id = isIdentifierRef(ref) ? ref.identifier : ref.uri;
|
|
95
|
+
const key = serializeObjRef(ref);
|
|
96
|
+
if (!used.includes(key)) {
|
|
97
|
+
used.push(key);
|
|
98
|
+
references.push({
|
|
99
|
+
id,
|
|
100
|
+
ref,
|
|
101
|
+
nesting: 1,
|
|
102
|
+
where: "referencedObjects",
|
|
103
|
+
title: visualization.title ?? id,
|
|
104
|
+
type: "widget",
|
|
105
|
+
context,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
default:
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
});
|
|
26
115
|
}
|
|
27
|
-
|
|
28
|
-
return references;
|
|
116
|
+
return references.sort((a, b) => a.nesting - b.nesting);
|
|
29
117
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/context/dashboard.ts"],"names":[],"mappings":"AAEA,OAAO,EAEH,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,mCAAmC,EACxC,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EAEtB,KAAK,sBAAsB,EAC3B,KAAK,OAAO,EACZ,KAAK,MAAM,EASd,MAAM,qBAAqB,CAAC;AAM7B;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,sBAAsB,GAAG,iBAAiB,CAM1F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAC9B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,SAAS,GAAG,uBAAuB,GAAG,UAAU,EAC5D,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,OAAO,GAAG,WAAW,GAAG,YAAY,CAAC,CAAC,GACpF,sBAAsB,CAOxB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAC/B,OAAO,EAAE,iBAAiB,EAAE,EAC5B,YAAY,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,mCAAmC,CAAC,EAAE,KAAK,CAAC,GAC7E,sBAAsB,EAAE,CA2E1B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAC/B,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,EACxD,YAAY,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,GACvE;IAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAAC,iBAAiB,EAAE,qBAAqB,EAAE,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/context/dashboard.ts"],"names":[],"mappings":"AAEA,OAAO,EAEH,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,mCAAmC,EACxC,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EAEtB,KAAK,sBAAsB,EAC3B,KAAK,OAAO,EACZ,KAAK,MAAM,EASd,MAAM,qBAAqB,CAAC;AAM7B;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,sBAAsB,GAAG,iBAAiB,CAM1F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAC9B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,SAAS,GAAG,uBAAuB,GAAG,UAAU,EAC5D,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,OAAO,GAAG,WAAW,GAAG,YAAY,CAAC,CAAC,GACpF,sBAAsB,CAOxB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAC/B,OAAO,EAAE,iBAAiB,EAAE,EAC5B,YAAY,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,mCAAmC,CAAC,EAAE,KAAK,CAAC,GAC7E,sBAAsB,EAAE,CA2E1B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAC/B,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,EACxD,YAAY,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,GACvE;IAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAAC,iBAAiB,EAAE,qBAAqB,EAAE,CAAA;CAAE,CA+DnF"}
|
package/esm/context/dashboard.js
CHANGED
|
@@ -109,21 +109,27 @@ export function buildWidgetsContext(widgetsMap, resultsIdMap) {
|
|
|
109
109
|
insightRef: widget.insight,
|
|
110
110
|
resultId: resultsIdMap?.get(serializeObjRef(widget.ref)),
|
|
111
111
|
}));
|
|
112
|
-
referencedObjects.push({ type: "WIDGET", ref: widget.ref });
|
|
112
|
+
referencedObjects.push({ type: "WIDGET", ref: widget.ref, title: widget.title });
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
115
|
if (isVisualizationSwitcherWidget(widget)) {
|
|
116
116
|
const activeVisualization = widget.visualizations[0];
|
|
117
|
-
widgets.push(buildWidgetContext(widget.title, widget.ref, "visualizationSwitcher", {
|
|
117
|
+
widgets.push(buildWidgetContext(widget.title || activeVisualization?.title, widget.ref, "visualizationSwitcher", {
|
|
118
118
|
insightRef: activeVisualization?.insight,
|
|
119
119
|
resultId: activeVisualization
|
|
120
120
|
? resultsIdMap?.get(serializeObjRef(activeVisualization.ref))
|
|
121
121
|
: undefined,
|
|
122
122
|
// All child insights, so the BE can execute the non-active children
|
|
123
123
|
// (which have no cached result).
|
|
124
|
-
|
|
124
|
+
visualizations: widget.visualizations.map((v) => buildWidgetContext(v.title, v.ref, "insight", {
|
|
125
|
+
insightRef: v.insight,
|
|
126
|
+
})),
|
|
125
127
|
}));
|
|
126
|
-
referencedObjects.push({
|
|
128
|
+
referencedObjects.push({
|
|
129
|
+
type: "WIDGET",
|
|
130
|
+
ref: widget.ref,
|
|
131
|
+
title: widget.title || activeVisualization?.title,
|
|
132
|
+
});
|
|
127
133
|
}
|
|
128
134
|
if (isRichTextWidget(widget)) {
|
|
129
135
|
widgets.push(buildWidgetContext(widget.title, widget.ref, "richText", {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type IGenAIUserContext } from "@gooddata/sdk-model";
|
|
2
|
-
import type
|
|
2
|
+
import { type IGenAIContextObject } from "../types.js";
|
|
3
3
|
export declare function removeContextReference(context: IGenAIUserContext | undefined, reference?: IGenAIContextObject): IGenAIUserContext | undefined;
|
|
4
|
+
export declare function removeUserContextReferences(context: IGenAIUserContext | undefined): IGenAIUserContext | undefined;
|
|
4
5
|
//# sourceMappingURL=removeContextReference.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"removeContextReference.d.ts","sourceRoot":"","sources":["../../src/context/removeContextReference.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"removeContextReference.d.ts","sourceRoot":"","sources":["../../src/context/removeContextReference.ts"],"names":[],"mappings":"AAEA,OAAO,EAEH,KAAK,iBAAiB,EAEzB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvD,wBAAgB,sBAAsB,CAClC,OAAO,EAAE,iBAAiB,GAAG,SAAS,EACtC,SAAS,CAAC,EAAE,mBAAmB,GAChC,iBAAiB,GAAG,SAAS,CAgD/B;AAED,wBAAgB,2BAA2B,CACvC,OAAO,EAAE,iBAAiB,GAAG,SAAS,GACvC,iBAAiB,GAAG,SAAS,CAY/B"}
|