@gooddata/sdk-ui-pluggable-host 11.62.0-alpha.0 → 11.62.0-alpha.2
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/HostUiContainer.d.ts.map +1 -1
- package/esm/components/HostUiContainer.js +12 -7
- package/esm/platformContext/backend.d.ts +1 -0
- package/esm/platformContext/backend.d.ts.map +1 -1
- package/esm/platformContext/backend.js +24 -2
- package/esm/ui/GenAIChat.d.ts +6 -4
- package/esm/ui/GenAIChat.d.ts.map +1 -1
- package/esm/ui/GenAIChat.js +2 -2
- package/esm/ui/HostChat.d.ts +6 -4
- package/esm/ui/HostChat.d.ts.map +1 -1
- package/esm/ui/HostChat.js +3 -2
- package/esm/ui/PluggableApplicationRenderer.d.ts +15 -5
- package/esm/ui/PluggableApplicationRenderer.d.ts.map +1 -1
- package/esm/ui/PluggableApplicationRenderer.js +14 -8
- package/esm/ui/useHostChromeChat.d.ts +6 -4
- package/esm/ui/useHostChromeChat.d.ts.map +1 -1
- package/esm/ui/useHostChromeChat.js +2 -2
- package/package.json +17 -17
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HostUiContainer.d.ts","sourceRoot":"","sources":["../../src/components/HostUiContainer.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAA0B,KAAK,gCAAgC,EAAE,MAAM,qBAAqB,CAAC;AACpG,OAAO,EAGH,KAAK,gBAAgB,EAExB,MAAM,2CAA2C,CAAC;AAkBnD,OAAO,wBAAwB,CAAC;AAOhC,MAAM,WAAW,qBAAqB;IAClC,GAAG,EAAE,gBAAgB,CAAC;IACtB,IAAI,EAAE,gCAAgC,EAAE,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,gBAAgB,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACtD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"HostUiContainer.d.ts","sourceRoot":"","sources":["../../src/components/HostUiContainer.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAA0B,KAAK,gCAAgC,EAAE,MAAM,qBAAqB,CAAC;AACpG,OAAO,EAGH,KAAK,gBAAgB,EAExB,MAAM,2CAA2C,CAAC;AAkBnD,OAAO,wBAAwB,CAAC;AAOhC,MAAM,WAAW,qBAAqB;IAClC,GAAG,EAAE,gBAAgB,CAAC;IACtB,IAAI,EAAE,gCAAgC,EAAE,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,gBAAgB,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACtD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,qBAAqB,2CA4XtG"}
|
|
@@ -70,10 +70,15 @@ export function HostUiContainer({ ctx, apps, pathname, routerNavigate, onError }
|
|
|
70
70
|
const [aiVisibility, setAiVisibility] = useState(null);
|
|
71
71
|
const [aiContext, setAiContext] = useState(null);
|
|
72
72
|
const aiVisibilitySeqRef = useRef(0);
|
|
73
|
-
|
|
74
|
-
const
|
|
75
|
-
const
|
|
76
|
-
|
|
73
|
+
// Publisher document saved event and sequence number.
|
|
74
|
+
const [aiPublisherDocumentSaved, setAiPublisherDocumentSaved] = useState(undefined);
|
|
75
|
+
const reportAiAssistantPublisherDocumentSaved = useCallback((saved) => {
|
|
76
|
+
setAiPublisherDocumentSaved({ ...saved, seq: (aiPublisherDocumentSaved?.seq ?? 0) + 1 });
|
|
77
|
+
}, []);
|
|
78
|
+
// Dashboard saved event and sequence number.
|
|
79
|
+
const [aiDashboardSaved, setAiDashboardSaved] = useState(undefined);
|
|
80
|
+
const reportAiAssistantDashboardSaved = useCallback((saved) => {
|
|
81
|
+
setAiDashboardSaved({ ...saved, seq: (aiDashboardSaved?.seq ?? 0) + 1 });
|
|
77
82
|
}, []);
|
|
78
83
|
const requestOpenAi = useCallback((question, agentId, userContext, appendToChat, replaceUserContext) => {
|
|
79
84
|
setAiVisibility({
|
|
@@ -254,7 +259,7 @@ export function HostUiContainer({ ctx, apps, pathname, routerNavigate, onError }
|
|
|
254
259
|
return;
|
|
255
260
|
}
|
|
256
261
|
if (activeInternalApplication) {
|
|
257
|
-
appRootRef.current.render(_jsx(HostErrorBoundary, { resetKey: pathname, onError: reportError, locale: resolveLocale(ctx.preferredLocale), children: _jsx(HostIntlProvider, { locale: resolveLocale(ctx.preferredLocale), children: _jsx(PluggableApplicationRenderer, { app: activeInternalApplication, ctx: ctx, pathname: pathname, aiAssistantOpen: aiAssistantOpen, onOpenAiAssistant: requestOpenAi, onCloseAiAssistant: requestCloseAi, onAiAssistantContext: setAiAssistantContext,
|
|
262
|
+
appRootRef.current.render(_jsx(HostErrorBoundary, { resetKey: pathname, onError: reportError, locale: resolveLocale(ctx.preferredLocale), children: _jsx(HostIntlProvider, { locale: resolveLocale(ctx.preferredLocale), children: _jsx(PluggableApplicationRenderer, { app: activeInternalApplication, ctx: ctx, pathname: pathname, aiAssistantOpen: aiAssistantOpen, onOpenAiAssistant: requestOpenAi, onCloseAiAssistant: requestCloseAi, onAiAssistantContext: setAiAssistantContext, onAiAssistantPublisherDocumentSaved: reportAiAssistantPublisherDocumentSaved, onAiAssistantDashboardSaved: reportAiAssistantDashboardSaved, aiLinkClickHandlerRef: appAiLinkClickRef, navigationRequestRef: appNavigationRequestRef, aiEventReceiveRef: appEventReceiveRef, onHeaderChange: onHeaderChange, onDocumentTitleChange: onDocumentTitleChange }, activeInternalApplication.id) }) }, `${activeInternalApplication.id}:${appContextEpoch}`));
|
|
258
263
|
}
|
|
259
264
|
else {
|
|
260
265
|
appRootRef.current.render(null);
|
|
@@ -272,7 +277,7 @@ export function HostUiContainer({ ctx, apps, pathname, routerNavigate, onError }
|
|
|
272
277
|
requestOpenAi,
|
|
273
278
|
requestCloseAi,
|
|
274
279
|
setAiAssistantContext,
|
|
275
|
-
|
|
280
|
+
reportAiAssistantPublisherDocumentSaved,
|
|
276
281
|
]);
|
|
277
|
-
return (_jsxs(_Fragment, { children: [_jsx("div", { ref: containerRef, className: "gd-host-ui-container" }), hostReady && !ctx.isExportMode ? (_jsx(HostChat, { ctx: ctx, resolvedApplications: apps, pathname: pathname, activeAppId: activeInternalApplication?.id, visibility: aiVisibility, context: aiContext,
|
|
282
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { ref: containerRef, className: "gd-host-ui-container" }), hostReady && !ctx.isExportMode ? (_jsx(HostChat, { ctx: ctx, resolvedApplications: apps, pathname: pathname, activeAppId: activeInternalApplication?.id, visibility: aiVisibility, context: aiContext, publisherDocumentSaved: aiPublisherDocumentSaved, dashboardSaved: aiDashboardSaved, onOpenChange: setAiAssistantOpen, onChatStateChange: onChatStateChange, onAppLinkClick: onAppLinkClick, onAppEventReceive: onAppEventReceive })) : null] }));
|
|
278
283
|
}
|
|
@@ -22,6 +22,7 @@ export interface IBackendFactory {
|
|
|
22
22
|
setApiToken: (token: string) => void;
|
|
23
23
|
setJwt: (jwt: string, secondsBeforeTokenExpirationToCallReminder?: number) => void;
|
|
24
24
|
}
|
|
25
|
+
export declare const wrapWithCustomWorkspaceSettings: (backend: IAnalyticalBackend) => IAnalyticalBackend;
|
|
25
26
|
export declare function createBackendFactory(options?: ICreateBackendOptions): IBackendFactory;
|
|
26
27
|
/**
|
|
27
28
|
* Sets the package name reported to the backend for telemetry.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/platformContext/backend.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/platformContext/backend.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAUlG,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAKlF,MAAM,WAAW,qBAAqB;IAClC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC5B,UAAU,EAAE,MAAM,kBAAkB,CAAC;IACrC,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;IAC3C,0BAA0B,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,IAAI,CAAC;IACvE,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,0CAA0C,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACtF;AAcD,eAAO,MAAM,+BAA+B,YAAa,kBAAkB,KAAG,kBAU7E,CAAC;AAsCF,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,eAAe,CAkGzF;AAYD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAExD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAEjE;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,kBAAkB,CAE/C;AAED,wBAAgB,kBAAkB,IAAI,gBAAgB,CAErD;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAEjF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,0CAA0C,CAAC,EAAE,MAAM,GAAG,IAAI,CAE7F"}
|
|
@@ -1,10 +1,32 @@
|
|
|
1
1
|
// (C) 2026 GoodData Corporation
|
|
2
|
-
import { RecommendedCachingConfiguration, withCaching } from "@gooddata/sdk-backend-base";
|
|
2
|
+
import { RecommendedCachingConfiguration, withCaching, withCustomWorkspaceSettings, } from "@gooddata/sdk-backend-base";
|
|
3
3
|
import { ContextDeferredAuthProvider, TigerJwtAuthProvider, TigerTokenAuthProvider, tigerFactory, } from "@gooddata/sdk-backend-tiger";
|
|
4
4
|
import { notifyContractExpired } from "./contractExpired.js";
|
|
5
5
|
import { createNotAuthenticatedHandler } from "./tigerNotAuthenticatedHandler.js";
|
|
6
|
+
/**
|
|
7
|
+
* E2E tests set `window.customWorkspaceSettings` before the page loads. They win over the
|
|
8
|
+
* workspace settings from the backend, so `ctx.settings`, `ctx.workspaceSettings` and the host
|
|
9
|
+
* UI (for example the AI chat) see the same values as the pluggable applications.
|
|
10
|
+
*/
|
|
11
|
+
const getCustomWorkspaceSettings = () => {
|
|
12
|
+
if (typeof window === "undefined") {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
return window.customWorkspaceSettings;
|
|
16
|
+
};
|
|
17
|
+
export const wrapWithCustomWorkspaceSettings = (backend) => {
|
|
18
|
+
if (!getCustomWorkspaceSettings()) {
|
|
19
|
+
return backend;
|
|
20
|
+
}
|
|
21
|
+
return withCustomWorkspaceSettings(backend, {
|
|
22
|
+
commonSettingsWrapper: (originalSettings) => ({
|
|
23
|
+
...originalSettings,
|
|
24
|
+
...getCustomWorkspaceSettings(),
|
|
25
|
+
}),
|
|
26
|
+
});
|
|
27
|
+
};
|
|
6
28
|
const decorateBackend = (backend) => {
|
|
7
|
-
return withCaching(backend, RecommendedCachingConfiguration);
|
|
29
|
+
return withCaching(wrapWithCustomWorkspaceSettings(backend), RecommendedCachingConfiguration);
|
|
8
30
|
};
|
|
9
31
|
const EMBEDDED_PATH_PREFIX = "/embedded/";
|
|
10
32
|
const EXTERNAL_PROVIDER_ID_PARAM = "externalproviderid";
|
package/esm/ui/GenAIChat.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type IUserWorkspaceSettings } from "@gooddata/sdk-backend-spi";
|
|
2
2
|
import type { IGenAIUserContext } from "@gooddata/sdk-model";
|
|
3
3
|
import { type ChatDefinitionReceivedEvent, type ChatAssistantMessageEvent, type ChatClosedEvent, type ChatFeedbackEvent, type ChatOpenedEvent, type ChatResetEvent, type ChatUserMessageEvent, type ChatModeChangeEvent } from "@gooddata/sdk-ui-gen-ai";
|
|
4
|
-
import { type
|
|
4
|
+
import { type IDashboardSaved, type IPublisherDocumentSaved } from "@gooddata/sdk-ui-gen-ai/internal";
|
|
5
5
|
/**
|
|
6
6
|
* Discriminated union of GenAI chat events that are forwarded to the host
|
|
7
7
|
* caller via the `onEvent` callback.
|
|
@@ -74,8 +74,10 @@ export interface IGenAIChatProps {
|
|
|
74
74
|
* Whether the ambient user context is currently loading.
|
|
75
75
|
*/
|
|
76
76
|
ambientUserContextLoading?: boolean;
|
|
77
|
-
/** The latest
|
|
78
|
-
|
|
77
|
+
/** The latest document of the conversation that the active application saved. */
|
|
78
|
+
publisherDocumentSaved: IPublisherDocumentSaved | undefined;
|
|
79
|
+
/** The latest dashboard save reported by the active application. */
|
|
80
|
+
dashboardSaved: IDashboardSaved | undefined;
|
|
79
81
|
/**
|
|
80
82
|
* Tag identifiers the assistant's object search/autocomplete should be restricted to,
|
|
81
83
|
* reflecting the active hosted application's current view.
|
|
@@ -108,5 +110,5 @@ export interface IGenAIChatProps {
|
|
|
108
110
|
* (`@gooddata/sdk-ui-gen-ai/internal`); this adapter only supplies the host's data sources, renders the
|
|
109
111
|
* host's own save-visualization / copy toasts, and forwards telemetry events through `onEvent`.
|
|
110
112
|
*/
|
|
111
|
-
export declare function GenAIChat({ workspaceId, open, disabled, onOpen, onClose, askedQuestion, askSeq, appendToChat, agentId, userContext, replaceUserContext, ambientUserContext, ambientUserContextLoading,
|
|
113
|
+
export declare function GenAIChat({ workspaceId, open, disabled, onOpen, onClose, askedQuestion, askSeq, appendToChat, agentId, userContext, replaceUserContext, ambientUserContext, ambientUserContextLoading, publisherDocumentSaved, dashboardSaved, includeTags, excludeTags, canManageProject, canAnalyzeProject, canFullControl, settings, dialogPosition, embedded, onAppLinkClick, onEvent, }: IGenAIChatProps): import("react/jsx-runtime").JSX.Element;
|
|
112
114
|
//# sourceMappingURL=GenAIChat.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GenAIChat.d.ts","sourceRoot":"","sources":["../../src/ui/GenAIChat.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EACH,KAAK,2BAA2B,EAChC,KAAK,yBAAyB,EAC9B,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EAEzB,KAAK,mBAAmB,EAC3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAGH,KAAK,
|
|
1
|
+
{"version":3,"file":"GenAIChat.d.ts","sourceRoot":"","sources":["../../src/ui/GenAIChat.tsx"],"names":[],"mappings":"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"}
|
package/esm/ui/GenAIChat.js
CHANGED
|
@@ -18,7 +18,7 @@ const EMBEDDED_CHAT_CLASS = "gd-gen-ai-chat-embedded";
|
|
|
18
18
|
* (`@gooddata/sdk-ui-gen-ai/internal`); this adapter only supplies the host's data sources, renders the
|
|
19
19
|
* host's own save-visualization / copy toasts, and forwards telemetry events through `onEvent`.
|
|
20
20
|
*/
|
|
21
|
-
export function GenAIChat({ workspaceId, open, disabled, onOpen, onClose, askedQuestion, askSeq, appendToChat, agentId, userContext, replaceUserContext, ambientUserContext, ambientUserContextLoading,
|
|
21
|
+
export function GenAIChat({ workspaceId, open, disabled, onOpen, onClose, askedQuestion, askSeq, appendToChat, agentId, userContext, replaceUserContext, ambientUserContext, ambientUserContextLoading, publisherDocumentSaved, dashboardSaved, includeTags, excludeTags, canManageProject, canAnalyzeProject, canFullControl, settings, dialogPosition, embedded, onAppLinkClick, onEvent, }) {
|
|
22
22
|
const { addSuccess, addError } = useToastMessage();
|
|
23
23
|
const intl = useIntl();
|
|
24
24
|
const backend = useBackendStrict();
|
|
@@ -74,5 +74,5 @@ export function GenAIChat({ workspaceId, open, disabled, onOpen, onClose, askedQ
|
|
|
74
74
|
}
|
|
75
75
|
}, [addError, addSuccess, intl, onEvent]);
|
|
76
76
|
const enableRightPanel = useGenAiRightPanel(settings?.["enableGenAiRightPanel"], embedded);
|
|
77
|
-
return (_jsx(GenAIChatDialogConnected, { backend: backend, workspace: workspaceId, locale: intl.locale, isOpen: open, isDisabled: disabled, onOpen: onOpen, onClose: onClose, askedQuestion: askedQuestion, askSeq: askSeq, userContext: userContext, appendToChat: appendToChat, agentId: agentId, replaceUserContext: replaceUserContext, ambientUserContext: ambientUserContext,
|
|
77
|
+
return (_jsx(GenAIChatDialogConnected, { backend: backend, workspace: workspaceId, locale: intl.locale, isOpen: open, isDisabled: disabled, onOpen: onOpen, onClose: onClose, askedQuestion: askedQuestion, askSeq: askSeq, userContext: userContext, appendToChat: appendToChat, agentId: agentId, replaceUserContext: replaceUserContext, ambientUserContext: ambientUserContext, publisherDocumentSaved: publisherDocumentSaved, dashboardSaved: dashboardSaved, ambientUserContextLoading: ambientUserContextLoading, includeTags: includeTags, excludeTags: excludeTags, canManage: canManageProject, canAnalyze: canAnalyzeProject, canFullControl: canFullControl, settings: settings, dialogPosition: dialogPosition, className: embedded ? EMBEDDED_CHAT_CLASS : undefined, allowNativeLinks: false, onLinkClick: onLinkClick, onEvent: handleEvent, displayMode: enableRightPanel ? "inline" : "modal", returnFocusTo: embedded ? EMBEDDED_AI_TRIGGER_ID : HEADER_CHAT_BUTTON_ID }));
|
|
78
78
|
}
|
package/esm/ui/HostChat.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type IGenAIUserContext, type PluggableApplicationRegistryItem } from "@gooddata/sdk-model";
|
|
2
2
|
import { type IPlatformContext } from "@gooddata/sdk-pluggable-application-model";
|
|
3
3
|
import { GenAIAssistantMode } from "@gooddata/sdk-ui-gen-ai";
|
|
4
|
-
import { type
|
|
4
|
+
import { type IDashboardSaved, type IPublisherDocumentSaved } from "@gooddata/sdk-ui-gen-ai/internal";
|
|
5
5
|
import { GenAIChatEvent } from "./GenAIChat.js";
|
|
6
6
|
import "./HostChat.scss";
|
|
7
7
|
import "@gooddata/sdk-ui-gen-ai/styles/css/main.css";
|
|
@@ -69,8 +69,10 @@ export interface IHostChatProps {
|
|
|
69
69
|
* Delegates a chat event receive to the active application.
|
|
70
70
|
*/
|
|
71
71
|
onAppEventReceive?: (event: GenAIChatEvent) => void;
|
|
72
|
-
/** The latest
|
|
73
|
-
|
|
72
|
+
/** The latest document of the conversation that the active application saved. */
|
|
73
|
+
publisherDocumentSaved: IPublisherDocumentSaved | undefined;
|
|
74
|
+
/** The latest dashboard save reported by the active application. */
|
|
75
|
+
dashboardSaved: IDashboardSaved | undefined;
|
|
74
76
|
}
|
|
75
77
|
/**
|
|
76
78
|
* Owns and renders the host's single GenAI chat, decoupled from the host UI module.
|
|
@@ -81,5 +83,5 @@ export interface IHostChatProps {
|
|
|
81
83
|
* (embedded/export). The header chat button and app-side controls drive it through the `visibility`
|
|
82
84
|
* and `context` props; it reports its open-state and button state back via callbacks.
|
|
83
85
|
*/
|
|
84
|
-
export declare function HostChat({ ctx, resolvedApplications, pathname, activeAppId, visibility, context, onOpenChange, onChatStateChange, onAppLinkClick, onAppEventReceive,
|
|
86
|
+
export declare function HostChat({ ctx, resolvedApplications, pathname, activeAppId, visibility, context, onOpenChange, onChatStateChange, onAppLinkClick, onAppEventReceive, publisherDocumentSaved, dashboardSaved, }: IHostChatProps): import("react/jsx-runtime").JSX.Element;
|
|
85
87
|
//# sourceMappingURL=HostChat.d.ts.map
|
package/esm/ui/HostChat.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HostChat.d.ts","sourceRoot":"","sources":["../../src/ui/HostChat.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,gCAAgC,EAAE,MAAM,qBAAqB,CAAC;AACpG,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAElF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"HostChat.d.ts","sourceRoot":"","sources":["../../src/ui/HostChat.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,gCAAgC,EAAE,MAAM,qBAAqB,CAAC;AACpG,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAElF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAMtG,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,iBAAiB,CAAC;AACzB,OAAO,6CAA6C,CAAC;AAMrD;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;CACf;AAED,+FAA+F;AAC/F,MAAM,WAAW,aAAa;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC7B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC3B,GAAG,EAAE,gBAAgB,CAAC;IACtB,oBAAoB,EAAE,gCAAgC,EAAE,CAAC;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,qFAAqF;IACrF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+FAA+F;IAC/F,UAAU,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACxC,oFAAoF;IACpF,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAClC,mFAAmF;IACnF,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,6FAA6F;IAC7F,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,YAAY,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,kBAAkB,CAAA;KAAE,KAAK,IAAI,CAAC;IAC1G;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,OAAO,CAAC;IAClD;;OAEG;IACH,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IACpD,iFAAiF;IACjF,sBAAsB,EAAE,uBAAuB,GAAG,SAAS,CAAC;IAC5D,oEAAoE;IACpE,cAAc,EAAE,eAAe,GAAG,SAAS,CAAC;CAC/C;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,EACrB,GAAG,EACH,oBAAoB,EACpB,QAAQ,EACR,WAAW,EACX,UAAiB,EACjB,OAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,GACjB,EAAE,cAAc,2CAoIhB"}
|
package/esm/ui/HostChat.js
CHANGED
|
@@ -21,7 +21,7 @@ import { useHostChromeWorkspaceFeatures } from "./useHostChromeWorkspaceFeatures
|
|
|
21
21
|
* (embedded/export). The header chat button and app-side controls drive it through the `visibility`
|
|
22
22
|
* and `context` props; it reports its open-state and button state back via callbacks.
|
|
23
23
|
*/
|
|
24
|
-
export function HostChat({ ctx, resolvedApplications, pathname, activeAppId, visibility = null, context = null, onOpenChange, onChatStateChange, onAppLinkClick, onAppEventReceive,
|
|
24
|
+
export function HostChat({ ctx, resolvedApplications, pathname, activeAppId, visibility = null, context = null, onOpenChange, onChatStateChange, onAppLinkClick, onAppEventReceive, publisherDocumentSaved, dashboardSaved, }) {
|
|
25
25
|
const features = useHostChromeWorkspaceFeatures(resolvedApplications, ctx, pathname);
|
|
26
26
|
const shellTelemetry = useMemo(() => getAppLifecycleCallbacks()?.createTelemetryCallbacks?.("host-ui"), []);
|
|
27
27
|
const chat = useHostChromeChat({
|
|
@@ -33,7 +33,8 @@ export function HostChat({ ctx, resolvedApplications, pathname, activeAppId, vis
|
|
|
33
33
|
disabled: context?.disabled,
|
|
34
34
|
onAppLinkClick,
|
|
35
35
|
onAppEventReceive,
|
|
36
|
-
|
|
36
|
+
publisherDocumentSaved,
|
|
37
|
+
dashboardSaved,
|
|
37
38
|
});
|
|
38
39
|
const { askAiAssistant: chatAskAiAssistant, openAiAssistant: chatOpenAiAssistant, open: chatOpen, close: chatClose, toggle: chatToggle, setTags: chatSetTags, setAmbientUserContext: chatSetAmbientUserContext, setAmbientUserContextLoading: chatSetAmbientUserContextLoading, isOpen: chatIsOpen, showChatItem, } = chat;
|
|
39
40
|
// Report the chat open-state outward so the runtime can forward it to the active pluggable
|
|
@@ -23,12 +23,22 @@ export interface IPluggableApplicationRendererProps {
|
|
|
23
23
|
userContext?: IGenAIUserContext;
|
|
24
24
|
userContextLoading?: boolean;
|
|
25
25
|
}) => void;
|
|
26
|
-
/** Tell the host-owned chat that the active app saved a
|
|
27
|
-
|
|
26
|
+
/** Tell the host-owned chat that the active app saved a document the chat had drafted. */
|
|
27
|
+
onAiAssistantPublisherDocumentSaved?: (saved: {
|
|
28
28
|
conversationId: string;
|
|
29
29
|
itemId: string;
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
documentRef?: string;
|
|
31
|
+
savedDocumentId: string;
|
|
32
|
+
}) => void;
|
|
33
|
+
/** Tell the host-owned chat that the active app saved a dashboard the chat had drafted. */
|
|
34
|
+
onAiAssistantDashboardSaved?: (saved: {
|
|
35
|
+
conversationId: string;
|
|
36
|
+
originalDashboardId: string;
|
|
37
|
+
savedDashboardId: string;
|
|
38
|
+
savedInsights: ReadonlyArray<{
|
|
39
|
+
originalInsightId: string;
|
|
40
|
+
savedInsightId: string;
|
|
41
|
+
}>;
|
|
32
42
|
}) => void;
|
|
33
43
|
/**
|
|
34
44
|
* Ref the renderer populates with a handler that delegates a host-chat link click to the active
|
|
@@ -54,5 +64,5 @@ export interface IPluggableApplicationRendererProps {
|
|
|
54
64
|
onHeaderChange?: (appId: string, header: IAppHeaderOptions) => void;
|
|
55
65
|
onDocumentTitleChange?: (appId: string, pageTitle: string | undefined) => void;
|
|
56
66
|
}
|
|
57
|
-
export declare function PluggableApplicationRenderer({ app, ctx, pathname, aiAssistantOpen, onOpenAiAssistant, onCloseAiAssistant, onAiAssistantContext,
|
|
67
|
+
export declare function PluggableApplicationRenderer({ app, ctx, pathname, aiAssistantOpen, onOpenAiAssistant, onCloseAiAssistant, onAiAssistantContext, onAiAssistantPublisherDocumentSaved, onAiAssistantDashboardSaved, aiLinkClickHandlerRef, aiEventReceiveRef, navigationRequestRef, onHeaderChange, onDocumentTitleChange, }: IPluggableApplicationRendererProps): import("react/jsx-runtime").JSX.Element;
|
|
58
68
|
//# sourceMappingURL=PluggableApplicationRenderer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PluggableApplicationRenderer.d.ts","sourceRoot":"","sources":["../../src/ui/PluggableApplicationRenderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAsE,MAAM,OAAO,CAAC;AAI3G,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,gCAAgC,EAAE,MAAM,qBAAqB,CAAC;AACpG,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,
|
|
1
|
+
{"version":3,"file":"PluggableApplicationRenderer.d.ts","sourceRoot":"","sources":["../../src/ui/PluggableApplicationRenderer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
// (C) 2026 GoodData Corporation
|
|
3
3
|
import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
4
4
|
import { FormattedMessage, defineMessage, useIntl } from "react-intl";
|
|
5
|
-
import { isAiAssistantContextChangedEvent,
|
|
5
|
+
import { isAiAssistantContextChangedEvent, isAiAssistantDashboardSavedEvent, isAiAssistantPublisherDocumentSavedEvent, isCloseAiAssistantRequestedEvent, isDocumentTitleChangedEvent, isOpenAiAssistantRequestedEvent, isReloadPlatformContextRequestedEvent, } from "@gooddata/sdk-pluggable-application-model";
|
|
6
6
|
import { LoadingComponent, useAutoupdateRef } from "@gooddata/sdk-ui";
|
|
7
7
|
import { bemFactory } from "@gooddata/sdk-ui-kit";
|
|
8
8
|
import { now } from "../debug.js";
|
|
@@ -22,7 +22,7 @@ const SECURITY_FAILURE_MESSAGES = {
|
|
|
22
22
|
"build-expired": defineMessage({ id: "gs.host.error.appBuildExpired" }),
|
|
23
23
|
"metadata-missing": defineMessage({ id: "gs.host.error.appSecurityMetadataMissing" }),
|
|
24
24
|
};
|
|
25
|
-
export function PluggableApplicationRenderer({ app, ctx, pathname, aiAssistantOpen, onOpenAiAssistant, onCloseAiAssistant, onAiAssistantContext,
|
|
25
|
+
export function PluggableApplicationRenderer({ app, ctx, pathname, aiAssistantOpen, onOpenAiAssistant, onCloseAiAssistant, onAiAssistantContext, onAiAssistantPublisherDocumentSaved, onAiAssistantDashboardSaved, aiLinkClickHandlerRef, aiEventReceiveRef, navigationRequestRef, onHeaderChange, onDocumentTitleChange, }) {
|
|
26
26
|
const intl = useIntl();
|
|
27
27
|
const intlRef = useAutoupdateRef(intl);
|
|
28
28
|
const ctxRef = useAutoupdateRef(ctx);
|
|
@@ -31,7 +31,8 @@ export function PluggableApplicationRenderer({ app, ctx, pathname, aiAssistantOp
|
|
|
31
31
|
const onOpenAiAssistantRef = useAutoupdateRef(onOpenAiAssistant);
|
|
32
32
|
const onCloseAiAssistantRef = useAutoupdateRef(onCloseAiAssistant);
|
|
33
33
|
const onAiAssistantContextRef = useAutoupdateRef(onAiAssistantContext);
|
|
34
|
-
const
|
|
34
|
+
const onAiAssistantPublisherDocumentSavedRef = useAutoupdateRef(onAiAssistantPublisherDocumentSaved);
|
|
35
|
+
const onAiAssistantDashboardSavedRef = useAutoupdateRef(onAiAssistantDashboardSaved);
|
|
35
36
|
const containerRef = useRef(null);
|
|
36
37
|
const mountHandleRef = useRef(undefined);
|
|
37
38
|
// The app/module pair currently mounted. Held so the context-change effect can
|
|
@@ -74,15 +75,19 @@ export function PluggableApplicationRenderer({ app, ctx, pathname, aiAssistantOp
|
|
|
74
75
|
});
|
|
75
76
|
return;
|
|
76
77
|
}
|
|
77
|
-
if (
|
|
78
|
-
|
|
78
|
+
if (isAiAssistantPublisherDocumentSavedEvent(event)) {
|
|
79
|
+
onAiAssistantPublisherDocumentSavedRef.current?.({
|
|
79
80
|
conversationId: event.payload.conversationId,
|
|
80
81
|
itemId: event.payload.itemId,
|
|
81
|
-
|
|
82
|
-
|
|
82
|
+
documentRef: event.payload.documentRef,
|
|
83
|
+
savedDocumentId: event.payload.savedDocumentId,
|
|
83
84
|
});
|
|
84
85
|
return;
|
|
85
86
|
}
|
|
87
|
+
if (isAiAssistantDashboardSavedEvent(event)) {
|
|
88
|
+
onAiAssistantDashboardSavedRef.current?.(event.payload);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
86
91
|
if (isDocumentTitleChangedEvent(event)) {
|
|
87
92
|
onDocumentTitleChangeRef.current?.(app.id, event.payload.pageTitle);
|
|
88
93
|
}
|
|
@@ -92,7 +97,8 @@ export function PluggableApplicationRenderer({ app, ctx, pathname, aiAssistantOp
|
|
|
92
97
|
onOpenAiAssistantRef,
|
|
93
98
|
onCloseAiAssistantRef,
|
|
94
99
|
onAiAssistantContextRef,
|
|
95
|
-
|
|
100
|
+
onAiAssistantPublisherDocumentSavedRef,
|
|
101
|
+
onAiAssistantDashboardSavedRef,
|
|
96
102
|
]);
|
|
97
103
|
useEffect(() => {
|
|
98
104
|
let cancelled = false;
|
|
@@ -2,7 +2,7 @@ import { type ReactNode } from "react";
|
|
|
2
2
|
import { type IGenAIUserContext } from "@gooddata/sdk-model";
|
|
3
3
|
import { type IPlatformContext, type IPluggableAppTelemetryCallbacks } from "@gooddata/sdk-pluggable-application-model";
|
|
4
4
|
import { GenAIAssistantMode } from "@gooddata/sdk-ui-gen-ai";
|
|
5
|
-
import { type
|
|
5
|
+
import { type IDashboardSaved, type IPublisherDocumentSaved } from "@gooddata/sdk-ui-gen-ai/internal";
|
|
6
6
|
import { type GenAIChatEvent } from "./GenAIChat.js";
|
|
7
7
|
import { type IHostChromeWorkspaceFeatures } from "./useHostChromeWorkspaceFeatures.js";
|
|
8
8
|
export interface IHostChromeChat {
|
|
@@ -71,8 +71,10 @@ export interface IUseHostChromeChatArgs {
|
|
|
71
71
|
}) => boolean;
|
|
72
72
|
/** Delegates a chat event receive to the active app. */
|
|
73
73
|
onAppEventReceive?: (event: GenAIChatEvent) => void;
|
|
74
|
-
/** The latest
|
|
75
|
-
|
|
74
|
+
/** The latest document of the conversation that the active app saved. */
|
|
75
|
+
publisherDocumentSaved: IPublisherDocumentSaved | undefined;
|
|
76
|
+
/** The latest dashboard save reported by the active application. */
|
|
77
|
+
dashboardSaved: IDashboardSaved | undefined;
|
|
76
78
|
}
|
|
77
79
|
/**
|
|
78
80
|
* Owns the GenAI chat state and renders the `<GenAIChat>` element for the host chrome.
|
|
@@ -81,5 +83,5 @@ export interface IUseHostChromeChatArgs {
|
|
|
81
83
|
* points, the runtime availability probe (`useGenAiChatAvailability`) and forwarding chat
|
|
82
84
|
* events to the host telemetry callbacks.
|
|
83
85
|
*/
|
|
84
|
-
export declare function useHostChromeChat({ features, ctx, telemetry, dialogPosition, embedded, disabled, onAppLinkClick, onAppEventReceive,
|
|
86
|
+
export declare function useHostChromeChat({ features, ctx, telemetry, dialogPosition, embedded, disabled, onAppLinkClick, onAppEventReceive, publisherDocumentSaved, dashboardSaved, }: IUseHostChromeChatArgs): IHostChromeChat;
|
|
85
87
|
//# sourceMappingURL=useHostChromeChat.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHostChromeChat.d.ts","sourceRoot":"","sources":["../../src/ui/useHostChromeChat.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,OAAO,CAAC;AAE9D,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EACH,KAAK,gBAAgB,EACrB,KAAK,+BAA+B,EACvC,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAA4B,MAAM,yBAAyB,CAAC;AACvF,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"useHostChromeChat.d.ts","sourceRoot":"","sources":["../../src/ui/useHostChromeChat.tsx"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ import { GenAIChat } from "./GenAIChat.js";
|
|
|
11
11
|
* points, the runtime availability probe (`useGenAiChatAvailability`) and forwarding chat
|
|
12
12
|
* events to the host telemetry callbacks.
|
|
13
13
|
*/
|
|
14
|
-
export function useHostChromeChat({ features, ctx, telemetry, dialogPosition, embedded, disabled, onAppLinkClick, onAppEventReceive,
|
|
14
|
+
export function useHostChromeChat({ features, ctx, telemetry, dialogPosition, embedded, disabled, onAppLinkClick, onAppEventReceive, publisherDocumentSaved, dashboardSaved, }) {
|
|
15
15
|
const [isChatOpen, setIsChatOpen] = useState(false);
|
|
16
16
|
const [askedQuestion, setAskedQuestion] = useState(null);
|
|
17
17
|
const [appendToChat, setAppendToChat] = useState(false);
|
|
@@ -69,7 +69,7 @@ export function useHostChromeChat({ features, ctx, telemetry, dialogPosition, em
|
|
|
69
69
|
onAppEventReceive?.(event);
|
|
70
70
|
}, [telemetry, onAppEventReceive]);
|
|
71
71
|
const showChatItem = useGenAiChatAvailability(getBackend(), features.workspaceId, features.showChat, features.canManageProject);
|
|
72
|
-
const element = features.showChat && features.workspaceId ? (_jsx(GenAIChat, { workspaceId: features.workspaceId, open: isChatOpen, disabled: disabled, onOpen: open, onClose: close, askedQuestion: askedQuestion, appendToChat: appendToChat, agentId: agentId, replaceUserContext: replaceUserContext, askSeq: askSeq, userContext: userContext, ambientUserContext: ambientUserContext, ambientUserContextLoading: ambientUserContextLoading,
|
|
72
|
+
const element = features.showChat && features.workspaceId ? (_jsx(GenAIChat, { workspaceId: features.workspaceId, open: isChatOpen, disabled: disabled, onOpen: open, onClose: close, askedQuestion: askedQuestion, appendToChat: appendToChat, agentId: agentId, replaceUserContext: replaceUserContext, askSeq: askSeq, userContext: userContext, ambientUserContext: ambientUserContext, ambientUserContextLoading: ambientUserContextLoading, publisherDocumentSaved: publisherDocumentSaved, dashboardSaved: dashboardSaved, includeTags: includeTags, excludeTags: excludeTags, canManageProject: features.canManageProject, canAnalyzeProject: features.canAnalyzeWorkspace, canFullControl: features.canFullControl, settings: ctx.workspaceSettings, dialogPosition: dialogPosition, embedded: embedded, onAppLinkClick: onAppLinkClick, onEvent: handleChatEvent })) : null;
|
|
73
73
|
return {
|
|
74
74
|
element,
|
|
75
75
|
isOpen: isChatOpen,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gooddata/sdk-ui-pluggable-host",
|
|
3
|
-
"version": "11.62.0-alpha.
|
|
3
|
+
"version": "11.62.0-alpha.2",
|
|
4
4
|
"description": "GoodData SDK runtime for hosting pluggable applications — registry, loader, routing, platform context, default UI chrome",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "GoodData Corporation",
|
|
@@ -29,20 +29,20 @@
|
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@module-federation/runtime": "2.6.0",
|
|
31
31
|
"lodash-es": "^4.17.23",
|
|
32
|
-
"@gooddata/sdk-backend-
|
|
33
|
-
"@gooddata/sdk-backend-
|
|
34
|
-
"@gooddata/sdk-backend-tiger": "11.62.0-alpha.
|
|
35
|
-
"@gooddata/sdk-embedding": "11.62.0-alpha.
|
|
36
|
-
"@gooddata/sdk-model": "11.62.0-alpha.
|
|
37
|
-
"@gooddata/sdk-pluggable-application-model": "11.62.0-alpha.
|
|
38
|
-
"@gooddata/sdk-ui": "11.62.0-alpha.
|
|
39
|
-
"@gooddata/sdk-ui-application-header": "11.62.0-alpha.
|
|
40
|
-
"@gooddata/sdk-ui-ext": "11.62.0-alpha.
|
|
41
|
-
"@gooddata/sdk-ui-kit": "11.62.0-alpha.
|
|
42
|
-
"@gooddata/sdk-ui-gen-ai": "11.62.0-alpha.
|
|
43
|
-
"@gooddata/sdk-ui-
|
|
44
|
-
"@gooddata/sdk-ui-
|
|
45
|
-
"@gooddata/util": "11.62.0-alpha.
|
|
32
|
+
"@gooddata/sdk-backend-base": "11.62.0-alpha.2",
|
|
33
|
+
"@gooddata/sdk-backend-spi": "11.62.0-alpha.2",
|
|
34
|
+
"@gooddata/sdk-backend-tiger": "11.62.0-alpha.2",
|
|
35
|
+
"@gooddata/sdk-embedding": "11.62.0-alpha.2",
|
|
36
|
+
"@gooddata/sdk-model": "11.62.0-alpha.2",
|
|
37
|
+
"@gooddata/sdk-pluggable-application-model": "11.62.0-alpha.2",
|
|
38
|
+
"@gooddata/sdk-ui": "11.62.0-alpha.2",
|
|
39
|
+
"@gooddata/sdk-ui-application-header": "11.62.0-alpha.2",
|
|
40
|
+
"@gooddata/sdk-ui-ext": "11.62.0-alpha.2",
|
|
41
|
+
"@gooddata/sdk-ui-kit": "11.62.0-alpha.2",
|
|
42
|
+
"@gooddata/sdk-ui-gen-ai": "11.62.0-alpha.2",
|
|
43
|
+
"@gooddata/sdk-ui-theme-provider": "11.62.0-alpha.2",
|
|
44
|
+
"@gooddata/sdk-ui-semantic-search": "11.62.0-alpha.2",
|
|
45
|
+
"@gooddata/util": "11.62.0-alpha.2"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@microsoft/api-documenter": "7.30.16",
|
|
@@ -81,8 +81,8 @@
|
|
|
81
81
|
"vite": "8.0.16",
|
|
82
82
|
"vitest": "4.1.11",
|
|
83
83
|
"vitest-dom": "0.1.1",
|
|
84
|
-
"@gooddata/eslint-config": "11.62.0-alpha.
|
|
85
|
-
"@gooddata/oxlint-config": "11.62.0-alpha.
|
|
84
|
+
"@gooddata/eslint-config": "11.62.0-alpha.2",
|
|
85
|
+
"@gooddata/oxlint-config": "11.62.0-alpha.2"
|
|
86
86
|
},
|
|
87
87
|
"peerDependencies": {
|
|
88
88
|
"react": ">=18.3.1",
|