@gooddata/sdk-ui-gen-ai 11.43.0-alpha.3 → 11.43.0-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/NOTICE +641 -841
  2. package/esm/components/ConfigContext.d.ts +5 -5
  3. package/esm/components/ConfigContext.d.ts.map +1 -1
  4. package/esm/components/ConfigContext.js +17 -8
  5. package/esm/components/GenAIChat.d.ts +1 -1
  6. package/esm/components/GenAIChat.d.ts.map +1 -1
  7. package/esm/components/GenAIChat.js +5 -4
  8. package/esm/components/GenAIChatDialog.d.ts +2 -2
  9. package/esm/components/GenAIChatDialog.d.ts.map +1 -1
  10. package/esm/components/GenAIChatDialog.js +4 -4
  11. package/esm/components/GenAiConversations.d.ts.map +1 -1
  12. package/esm/components/GenAiConversations.js +2 -2
  13. package/esm/components/GenAiStore.d.ts +9 -0
  14. package/esm/components/GenAiStore.d.ts.map +1 -1
  15. package/esm/components/GenAiStore.js +7 -4
  16. package/esm/components/hooks/useEndpointCheck.d.ts +1 -1
  17. package/esm/components/hooks/useEndpointCheck.d.ts.map +1 -1
  18. package/esm/components/messages/AssistantItem.d.ts +1 -1
  19. package/esm/components/messages/AssistantItem.d.ts.map +1 -1
  20. package/esm/components/messages/AssistantItem.js +8 -0
  21. package/esm/components/messages/AssistantItemFeedback.d.ts.map +1 -1
  22. package/esm/components/messages/AssistantItemFeedback.js +3 -0
  23. package/esm/components/messages/ItemsGroup.js +8 -10
  24. package/esm/components/messages/ToolItem.d.ts +1 -1
  25. package/esm/components/messages/ToolItem.d.ts.map +1 -1
  26. package/esm/components/messages/ToolItem.js +28 -14
  27. package/esm/components/messages/components/SemanticSearchTreeView.d.ts.map +1 -1
  28. package/esm/components/messages/components/SemanticSearchTreeView.js +2 -0
  29. package/esm/components/messages/contents/VisualizationContents.d.ts.map +1 -1
  30. package/esm/components/messages/contents/VisualizationContents.js +18 -3
  31. package/esm/components/messages/conversationContents/ConversationReasoningContent.d.ts.map +1 -1
  32. package/esm/components/messages/conversationContents/ConversationReasoningContent.js +1 -3
  33. package/esm/components/messages/conversationContents/ConversationVisualizationContent.d.ts.map +1 -1
  34. package/esm/components/messages/conversationContents/ConversationVisualizationContent.js +20 -5
  35. package/esm/hooks/useGenAIStore.d.ts +3 -0
  36. package/esm/hooks/useGenAIStore.d.ts.map +1 -1
  37. package/esm/hooks/useGenAIStore.js +4 -1
  38. package/esm/localization/bundles/de-DE.localization-bundle.d.ts +0 -4
  39. package/esm/localization/bundles/de-DE.localization-bundle.d.ts.map +1 -1
  40. package/esm/localization/bundles/de-DE.localization-bundle.js +0 -4
  41. package/esm/localization/bundles/en-AU.localization-bundle.d.ts +0 -4
  42. package/esm/localization/bundles/en-AU.localization-bundle.d.ts.map +1 -1
  43. package/esm/localization/bundles/en-AU.localization-bundle.js +0 -4
  44. package/esm/localization/bundles/en-GB.localization-bundle.d.ts +0 -4
  45. package/esm/localization/bundles/en-GB.localization-bundle.d.ts.map +1 -1
  46. package/esm/localization/bundles/en-GB.localization-bundle.js +0 -4
  47. package/esm/localization/bundles/en-US.localization-bundle.d.ts +0 -16
  48. package/esm/localization/bundles/en-US.localization-bundle.d.ts.map +1 -1
  49. package/esm/localization/bundles/en-US.localization-bundle.js +0 -16
  50. package/esm/localization/bundles/es-419.localization-bundle.d.ts +0 -4
  51. package/esm/localization/bundles/es-419.localization-bundle.d.ts.map +1 -1
  52. package/esm/localization/bundles/es-419.localization-bundle.js +0 -4
  53. package/esm/localization/bundles/es-ES.localization-bundle.d.ts +0 -4
  54. package/esm/localization/bundles/es-ES.localization-bundle.d.ts.map +1 -1
  55. package/esm/localization/bundles/es-ES.localization-bundle.js +0 -4
  56. package/esm/localization/bundles/fi-FI.localization-bundle.d.ts +0 -4
  57. package/esm/localization/bundles/fi-FI.localization-bundle.d.ts.map +1 -1
  58. package/esm/localization/bundles/fi-FI.localization-bundle.js +0 -4
  59. package/esm/localization/bundles/fr-CA.localization-bundle.d.ts +0 -4
  60. package/esm/localization/bundles/fr-CA.localization-bundle.d.ts.map +1 -1
  61. package/esm/localization/bundles/fr-CA.localization-bundle.js +0 -4
  62. package/esm/localization/bundles/fr-FR.localization-bundle.d.ts +0 -4
  63. package/esm/localization/bundles/fr-FR.localization-bundle.d.ts.map +1 -1
  64. package/esm/localization/bundles/fr-FR.localization-bundle.js +0 -4
  65. package/esm/localization/bundles/id-ID.localization-bundle.d.ts +0 -4
  66. package/esm/localization/bundles/id-ID.localization-bundle.d.ts.map +1 -1
  67. package/esm/localization/bundles/id-ID.localization-bundle.js +0 -4
  68. package/esm/localization/bundles/it-IT.localization-bundle.d.ts +0 -4
  69. package/esm/localization/bundles/it-IT.localization-bundle.d.ts.map +1 -1
  70. package/esm/localization/bundles/it-IT.localization-bundle.js +0 -4
  71. package/esm/localization/bundles/ja-JP.localization-bundle.d.ts +0 -4
  72. package/esm/localization/bundles/ja-JP.localization-bundle.d.ts.map +1 -1
  73. package/esm/localization/bundles/ja-JP.localization-bundle.js +0 -4
  74. package/esm/localization/bundles/ko-KR.localization-bundle.d.ts +0 -4
  75. package/esm/localization/bundles/ko-KR.localization-bundle.d.ts.map +1 -1
  76. package/esm/localization/bundles/ko-KR.localization-bundle.js +0 -4
  77. package/esm/localization/bundles/nl-NL.localization-bundle.d.ts +0 -4
  78. package/esm/localization/bundles/nl-NL.localization-bundle.d.ts.map +1 -1
  79. package/esm/localization/bundles/nl-NL.localization-bundle.js +0 -4
  80. package/esm/localization/bundles/pl-PL.localization-bundle.d.ts +0 -4
  81. package/esm/localization/bundles/pl-PL.localization-bundle.d.ts.map +1 -1
  82. package/esm/localization/bundles/pl-PL.localization-bundle.js +0 -4
  83. package/esm/localization/bundles/pt-BR.localization-bundle.d.ts +0 -4
  84. package/esm/localization/bundles/pt-BR.localization-bundle.d.ts.map +1 -1
  85. package/esm/localization/bundles/pt-BR.localization-bundle.js +0 -4
  86. package/esm/localization/bundles/pt-PT.localization-bundle.d.ts +0 -4
  87. package/esm/localization/bundles/pt-PT.localization-bundle.d.ts.map +1 -1
  88. package/esm/localization/bundles/pt-PT.localization-bundle.js +0 -4
  89. package/esm/localization/bundles/ru-RU.localization-bundle.d.ts +0 -4
  90. package/esm/localization/bundles/ru-RU.localization-bundle.d.ts.map +1 -1
  91. package/esm/localization/bundles/ru-RU.localization-bundle.js +0 -4
  92. package/esm/localization/bundles/sl-SI.localization-bundle.d.ts +0 -4
  93. package/esm/localization/bundles/sl-SI.localization-bundle.d.ts.map +1 -1
  94. package/esm/localization/bundles/sl-SI.localization-bundle.js +0 -4
  95. package/esm/localization/bundles/th-TH.localization-bundle.d.ts +0 -4
  96. package/esm/localization/bundles/th-TH.localization-bundle.d.ts.map +1 -1
  97. package/esm/localization/bundles/th-TH.localization-bundle.js +0 -4
  98. package/esm/localization/bundles/tr-TR.localization-bundle.d.ts +0 -4
  99. package/esm/localization/bundles/tr-TR.localization-bundle.d.ts.map +1 -1
  100. package/esm/localization/bundles/tr-TR.localization-bundle.js +0 -4
  101. package/esm/localization/bundles/uk-UA.localization-bundle.d.ts +0 -4
  102. package/esm/localization/bundles/uk-UA.localization-bundle.d.ts.map +1 -1
  103. package/esm/localization/bundles/uk-UA.localization-bundle.js +0 -4
  104. package/esm/localization/bundles/vi-VN.localization-bundle.d.ts +0 -4
  105. package/esm/localization/bundles/vi-VN.localization-bundle.d.ts.map +1 -1
  106. package/esm/localization/bundles/vi-VN.localization-bundle.js +0 -4
  107. package/esm/localization/bundles/zh-HK.localization-bundle.d.ts +0 -4
  108. package/esm/localization/bundles/zh-HK.localization-bundle.d.ts.map +1 -1
  109. package/esm/localization/bundles/zh-HK.localization-bundle.js +0 -4
  110. package/esm/localization/bundles/zh-Hans.localization-bundle.d.ts +0 -4
  111. package/esm/localization/bundles/zh-Hans.localization-bundle.d.ts.map +1 -1
  112. package/esm/localization/bundles/zh-Hans.localization-bundle.js +0 -4
  113. package/esm/localization/bundles/zh-Hant.localization-bundle.d.ts +0 -4
  114. package/esm/localization/bundles/zh-Hant.localization-bundle.d.ts.map +1 -1
  115. package/esm/localization/bundles/zh-Hant.localization-bundle.js +0 -4
  116. package/esm/sdk-ui-gen-ai.d.ts +9 -1
  117. package/esm/store/messages/messagesSlice.d.ts +3 -1
  118. package/esm/store/messages/messagesSlice.d.ts.map +1 -1
  119. package/esm/store/messages/messagesSlice.js +37 -1
  120. package/esm/store/options.d.ts +8 -0
  121. package/esm/store/options.d.ts.map +1 -1
  122. package/esm/store/options.js +12 -0
  123. package/esm/store/sideEffects/onThreadLoad.d.ts +8 -3
  124. package/esm/store/sideEffects/onThreadLoad.d.ts.map +1 -1
  125. package/esm/store/sideEffects/onThreadLoad.js +24 -1
  126. package/esm/store/sideEffects/onVisualizationSuccessSave.d.ts +2 -1
  127. package/esm/store/sideEffects/onVisualizationSuccessSave.d.ts.map +1 -1
  128. package/esm/store/sideEffects/onVisualizationSuccessSave.js +29 -2
  129. package/package.json +20 -20
  130. package/styles/css/main.css +32 -663
  131. package/styles/css/main.css.map +1 -1
  132. package/styles/css/messages.css +18 -0
  133. package/styles/css/messages.css.map +1 -1
  134. package/styles/scss/messages.scss +23 -0
@@ -1,11 +1,11 @@
1
1
  import { type PropsWithChildren } from "react";
2
2
  import { type CatalogItem, type GenAIObjectType } from "@gooddata/sdk-model";
3
3
  export type ConfigContext = {
4
- allowNativeLinks: boolean;
5
- canManage: boolean;
6
- canAnalyze: boolean;
7
- canFullControl: boolean;
8
- linkHandler?: (linkClickEvent: LinkHandlerEvent) => void;
4
+ allowNativeLinks?: boolean;
5
+ canManage?: boolean;
6
+ canAnalyze?: boolean;
7
+ canFullControl?: boolean;
8
+ linkHandler?: (linkClickEvent: LinkHandlerEvent) => string | undefined;
9
9
  catalogItems?: CatalogItem[];
10
10
  };
11
11
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ConfigContext.d.ts","sourceRoot":"","sources":["../../src/components/ConfigContext.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,iBAAiB,EAAsC,MAAM,OAAO,CAAC;AAEnF,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE7E,MAAM,MAAM,aAAa,GAAG;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACzD,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;CAChC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC3B,IAAI,EAAE,SAAS,GAAG,eAAe,CAAC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,IAAI,CAAC;CAClB,CAAC;AASF,wBAAgB,cAAc,CAAC,EAC3B,QAAQ,EACR,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,SAAS,EACT,UAAU,EACV,cAAc,EACjB,EAAE,iBAAiB,CAAC,aAAa,CAAC,2CAclC;AAED,eAAO,MAAM,SAAS,qBAErB,CAAC"}
1
+ {"version":3,"file":"ConfigContext.d.ts","sourceRoot":"","sources":["../../src/components/ConfigContext.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,iBAAiB,EAAsC,MAAM,OAAO,CAAC;AAEnF,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE7E,MAAM,MAAM,aAAa,GAAG;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,KAAK,MAAM,GAAG,SAAS,CAAC;IACvE,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;CAChC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC3B,IAAI,EAAE,SAAS,GAAG,eAAe,CAAC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,IAAI,CAAC;CAClB,CAAC;AAIF,wBAAgB,cAAc,CAAC,EAC3B,QAAQ,EACR,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,SAAS,EACT,UAAU,EACV,cAAc,EACjB,EAAE,iBAAiB,CAAC,aAAa,CAAC,2CA6BlC;AAED,eAAO,MAAM,SAAS,qBAErB,CAAC"}
@@ -1,21 +1,30 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- // (C) 2024-2025 GoodData Corporation
2
+ // (C) 2024-2026 GoodData Corporation
3
3
  import { createContext, useContext, useMemo } from "react";
4
- const configContext = createContext({
5
- allowNativeLinks: false,
6
- canManage: false,
7
- canAnalyze: false,
8
- canFullControl: false,
9
- });
4
+ const configContext = createContext({});
10
5
  export function ConfigProvider({ children, allowNativeLinks, linkHandler, catalogItems, canManage, canAnalyze, canFullControl, }) {
6
+ const parentConfig = useConfig();
11
7
  const value = useMemo(() => ({
8
+ allowNativeLinks: allowNativeLinks ?? parentConfig.allowNativeLinks,
9
+ linkHandler: linkHandler ?? parentConfig.linkHandler,
10
+ catalogItems: catalogItems ?? parentConfig.catalogItems,
11
+ canManage: canManage ?? parentConfig.canManage,
12
+ canAnalyze: canAnalyze ?? parentConfig.canAnalyze,
13
+ canFullControl: canFullControl ?? parentConfig.canFullControl,
14
+ }), [
12
15
  allowNativeLinks,
16
+ parentConfig.allowNativeLinks,
17
+ parentConfig.linkHandler,
18
+ parentConfig.catalogItems,
19
+ parentConfig.canManage,
20
+ parentConfig.canAnalyze,
21
+ parentConfig.canFullControl,
13
22
  linkHandler,
14
23
  catalogItems,
15
24
  canManage,
16
25
  canAnalyze,
17
26
  canFullControl,
18
- }), [allowNativeLinks, linkHandler, catalogItems, canManage, canAnalyze, canFullControl]);
27
+ ]);
19
28
  return _jsx(configContext.Provider, { value: value, children: children });
20
29
  }
21
30
  export const useConfig = () => {
@@ -14,7 +14,7 @@ export type GenAIAssistantProps = Omit<GenAiStoreProps, "children"> & {
14
14
  * When provided, references to the metadata objects will be rendered as clickable links.
15
15
  * Otherwise, the metadata objects will be rendered as plain text (using object title).
16
16
  */
17
- onLinkClick?: (linkClickEvent: LinkHandlerEvent) => void;
17
+ onLinkClick?: (linkClickEvent: LinkHandlerEvent) => string | undefined;
18
18
  /**
19
19
  * When true, allows the chat to render links that open in a new tab or window. This
20
20
  * is handy only when embedding the chat in same environment where GD platform is running because
@@ -1 +1 @@
1
- {"version":3,"file":"GenAIChat.d.ts","sourceRoot":"","sources":["../../src/components/GenAIChat.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAQ3C,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG3E,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEnE;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,GAAG;IAClE;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAEzD;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;OAEG;IACH,8BAA8B,CAAC,EAAE,MAAM,aAAa,CAAC;IAErD;;OAEG;IACH,2BAA2B,CAAC,EAAE,MAAM,aAAa,GAAG,IAAI,CAAC;IAEzD;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,2CA6CxD;AAED;;;;GAIG;AACH,eAAO,MAAM,SAAS,uBAAiB,CAAC"}
1
+ {"version":3,"file":"GenAIChat.d.ts","sourceRoot":"","sources":["../../src/components/GenAIChat.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAQ3C,OAAO,EAAkB,KAAK,gBAAgB,EAAa,MAAM,oBAAoB,CAAC;AAGtF,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEnE;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,GAAG;IAClE;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,KAAK,MAAM,GAAG,SAAS,CAAC;IAEvE;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;OAEG;IACH,8BAA8B,CAAC,EAAE,MAAM,aAAa,CAAC;IAErD;;OAEG;IACH,2BAA2B,CAAC,EAAE,MAAM,aAAa,GAAG,IAAI,CAAC;IAEzD;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,2CAiDxD;AAED;;;;GAIG;AACH,eAAO,MAAM,SAAS,uBAAiB,CAAC"}
@@ -3,7 +3,7 @@ import { BackendProvider, WorkspaceProvider, useBackendStrict, useWorkspaceStric
3
3
  import { IntlWrapper } from "../localization/IntlWrapper.js";
4
4
  import { PermissionsProvider } from "../permissions/PermissionsContext.js";
5
5
  import { usePermissions } from "../permissions/usePermissions.js";
6
- import { ConfigProvider } from "./ConfigContext.js";
6
+ import { ConfigProvider, useConfig } from "./ConfigContext.js";
7
7
  import { CustomizationProvider } from "./CustomizationProvider.js";
8
8
  import { GenAIChatWrapper } from "./GenAIChatWrapper.js";
9
9
  import { GenAiStore } from "./GenAiStore.js";
@@ -12,10 +12,10 @@ import { GenAiStore } from "./GenAiStore.js";
12
12
  * @public
13
13
  */
14
14
  export function GenAIAssistant(props) {
15
- const { backend, workspace, locale, colorPalette, eventHandlers, settings, objectTypes, catalogItems, includeTags, excludeTags, isPreview, providedStore, onDispatcher, } = props;
15
+ const { backend, workspace, locale, colorPalette, eventHandlers, settings, objectTypes, catalogItems, includeTags, excludeTags, isPreview, providedStore, onDispatcher, onLinkClick, allowNativeLinks, } = props;
16
16
  const effectiveBackend = useBackendStrict(backend);
17
17
  const effectiveWorkspace = useWorkspaceStrict(workspace);
18
- return (_jsx(IntlWrapper, { locale: locale, children: _jsx(GenAiStore, { backend: effectiveBackend, workspace: effectiveWorkspace, onDispatcher: onDispatcher, colorPalette: colorPalette, eventHandlers: eventHandlers, settings: settings, objectTypes: objectTypes, includeTags: includeTags, excludeTags: excludeTags, catalogItems: catalogItems, isPreview: isPreview, providedStore: providedStore, children: _jsx(BackendProvider, { backend: effectiveBackend, children: _jsx(WorkspaceProvider, { workspace: effectiveWorkspace, children: _jsx(PermissionsProvider, { children: _jsx(GenAIContent, { ...props }) }) }) }) }) }));
18
+ return (_jsx(IntlWrapper, { locale: locale, children: _jsx(GenAiStore, { backend: effectiveBackend, workspace: effectiveWorkspace, onDispatcher: onDispatcher, colorPalette: colorPalette, eventHandlers: eventHandlers, allowNativeLinks: allowNativeLinks, onLinkClick: onLinkClick, settings: settings, objectTypes: objectTypes, includeTags: includeTags, excludeTags: excludeTags, catalogItems: catalogItems, isPreview: isPreview, providedStore: providedStore, children: _jsx(BackendProvider, { backend: effectiveBackend, children: _jsx(WorkspaceProvider, { workspace: effectiveWorkspace, children: _jsx(PermissionsProvider, { children: _jsx(GenAIContent, { ...props }) }) }) }) }) }));
19
19
  }
20
20
  /**
21
21
  * UI component that renders the Gen AI chat.
@@ -26,5 +26,6 @@ export const GenAIChat = GenAIAssistant;
26
26
  function GenAIContent(props) {
27
27
  const { onLinkClick, catalogItems, LandingScreenComponentProvider, DisclaimerComponentProvider, className, } = props;
28
28
  const { permissions, loading } = usePermissions();
29
- return (_jsx(ConfigProvider, { linkHandler: onLinkClick, catalogItems: catalogItems, allowNativeLinks: props.allowNativeLinks ?? false, canFullControl: props.disableFullControl ? false : (permissions.canManageProject ?? false), canManage: props.disableManage ? false : (permissions.canManageProject ?? false), canAnalyze: props.disableAnalyze ? false : (permissions.canCreateVisualization ?? false), children: _jsx(CustomizationProvider, { landingScreenComponentProvider: LandingScreenComponentProvider, disclaimerComponentProvider: DisclaimerComponentProvider, children: _jsx(GenAIChatWrapper, { initializing: loading, className: className }) }) }));
29
+ const { allowNativeLinks } = useConfig();
30
+ return (_jsx(ConfigProvider, { linkHandler: onLinkClick, catalogItems: catalogItems, allowNativeLinks: allowNativeLinks ?? props.allowNativeLinks, canFullControl: props.disableFullControl ? false : (permissions.canManageProject ?? false), canManage: props.disableManage ? false : (permissions.canManageProject ?? false), canAnalyze: props.disableAnalyze ? false : (permissions.canCreateVisualization ?? false), children: _jsx(CustomizationProvider, { landingScreenComponentProvider: LandingScreenComponentProvider, disclaimerComponentProvider: DisclaimerComponentProvider, children: _jsx(GenAIChatWrapper, { initializing: loading, className: className }) }) }));
30
31
  }
@@ -12,8 +12,8 @@ export type GenAIChatDialogProps = Omit<GenAiStoreProps, "children"> & {
12
12
  onOpen: () => void;
13
13
  onClose: () => void;
14
14
  returnFocusTo?: RefObject<HTMLElement | null> | string;
15
- onLinkClick?: (linkClickEvent: LinkHandlerEvent) => void;
15
+ onLinkClick?: (linkClickEvent: LinkHandlerEvent) => string | undefined;
16
16
  LandingScreenComponentProvider?: () => ComponentType;
17
17
  };
18
- export declare function GenAIChatDialog({ backend, workspace, locale, isOpen, onOpen, onClose, settings, className, dialogPosition, returnFocusTo, objectTypes, includeTags, excludeTags, canManage, canAnalyze, canFullControl, eventHandlers, catalogItems, colorPalette, onLinkClick, onDispatcher, LandingScreenComponentProvider }: GenAIChatDialogProps): import("react/jsx-runtime").JSX.Element;
18
+ export declare function GenAIChatDialog({ backend, workspace, locale, isOpen, onOpen, onClose, settings, className, dialogPosition, allowNativeLinks, returnFocusTo, objectTypes, includeTags, excludeTags, canManage, canAnalyze, canFullControl, eventHandlers, catalogItems, colorPalette, onLinkClick, onDispatcher, LandingScreenComponentProvider }: GenAIChatDialogProps): import("react/jsx-runtime").JSX.Element;
19
19
  //# sourceMappingURL=GenAIChatDialog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GenAIChatDialog.d.ts","sourceRoot":"","sources":["../../src/components/GenAIChatDialog.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAA2C,MAAM,OAAO,CAAC;AAcpG,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG3E,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,GAAG;IACnE,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC;IACvD,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACzD,8BAA8B,CAAC,EAAE,MAAM,aAAa,CAAC;CACxD,CAAC;AAOF,wBAAgB,eAAe,CAAC,EAC5B,OAAO,EACP,SAAS,EACT,MAAM,EACN,MAAM,EACN,MAAM,EACN,OAAO,EACP,QAAQ,EACR,SAAS,EACT,cAAc,EACd,aAAa,EACb,WAAW,EACX,WAAW,EACX,WAAW,EACX,SAAiB,EACjB,UAAkB,EAClB,cAAsB,EACtB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,8BAA8B,EACjC,EAAE,oBAAoB,2CAwCtB"}
1
+ {"version":3,"file":"GenAIChatDialog.d.ts","sourceRoot":"","sources":["../../src/components/GenAIChatDialog.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAA2C,MAAM,OAAO,CAAC;AAcpG,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG3E,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,GAAG;IACnE,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC;IACvD,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,KAAK,MAAM,GAAG,SAAS,CAAC;IACvE,8BAA8B,CAAC,EAAE,MAAM,aAAa,CAAC;CACxD,CAAC;AAOF,wBAAgB,eAAe,CAAC,EAC5B,OAAO,EACP,SAAS,EACT,MAAM,EACN,MAAM,EACN,MAAM,EACN,OAAO,EACP,QAAQ,EACR,SAAS,EACT,cAAc,EACd,gBAAuB,EACvB,aAAa,EACb,WAAW,EACX,WAAW,EACX,WAAW,EACX,SAAiB,EACjB,UAAkB,EAClB,cAAsB,EACtB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,8BAA8B,EACjC,EAAE,oBAAoB,2CA2CtB"}
@@ -15,12 +15,12 @@ import { GenAiStore } from "./GenAiStore.js";
15
15
  // - High enough to be over other dialogs
16
16
  // - Below chart tooltips
17
17
  const DEFAULT_CHAT_Z_INDEX = 3000;
18
- export function GenAIChatDialog({ backend, workspace, locale, isOpen, onOpen, onClose, settings, className, dialogPosition, returnFocusTo, objectTypes, includeTags, excludeTags, canManage = false, canAnalyze = false, canFullControl = false, eventHandlers, catalogItems, colorPalette, onLinkClick, onDispatcher, LandingScreenComponentProvider, }) {
18
+ export function GenAIChatDialog({ backend, workspace, locale, isOpen, onOpen, onClose, settings, className, dialogPosition, allowNativeLinks = true, returnFocusTo, objectTypes, includeTags, excludeTags, canManage = false, canAnalyze = false, canFullControl = false, eventHandlers, catalogItems, colorPalette, onLinkClick, onDispatcher, LandingScreenComponentProvider, }) {
19
19
  const effectiveBackend = useBackendStrict(backend);
20
20
  const effectiveWorkspace = useWorkspaceStrict(workspace);
21
- return (_jsx(IntlWrapper, { locale: locale, children: _jsx(GenAiStore, { backend: effectiveBackend, workspace: effectiveWorkspace, onDispatcher: onDispatcher, eventHandlers: eventHandlers, colorPalette: colorPalette, settings: settings, objectTypes: objectTypes, includeTags: includeTags, excludeTags: excludeTags, catalogItems: catalogItems, children: (genAIStore) => (_jsx(GenAIChatDialogContent, { genAIStore: genAIStore, backend: effectiveBackend, workspace: effectiveWorkspace, className: className, dialogPosition: dialogPosition, isOpen: isOpen, onOpen: onOpen, onClose: onClose, returnFocusTo: returnFocusTo, onLinkClick: onLinkClick, catalogItems: catalogItems, canManage: canManage, canAnalyze: canAnalyze, canFullControl: canFullControl, LandingScreenComponentProvider: LandingScreenComponentProvider })) }) }));
21
+ return (_jsx(IntlWrapper, { locale: locale, children: _jsx(GenAiStore, { backend: effectiveBackend, workspace: effectiveWorkspace, onDispatcher: onDispatcher, eventHandlers: eventHandlers, colorPalette: colorPalette, allowNativeLinks: allowNativeLinks, onLinkClick: onLinkClick, settings: settings, objectTypes: objectTypes, includeTags: includeTags, excludeTags: excludeTags, catalogItems: catalogItems, children: (genAIStore) => (_jsx(GenAIChatDialogContent, { genAIStore: genAIStore, backend: effectiveBackend, workspace: effectiveWorkspace, className: className, dialogPosition: dialogPosition, isOpen: isOpen, onOpen: onOpen, onClose: onClose, returnFocusTo: returnFocusTo, allowNativeLinks: allowNativeLinks, onLinkClick: onLinkClick, catalogItems: catalogItems, canManage: canManage, canAnalyze: canAnalyze, canFullControl: canFullControl, LandingScreenComponentProvider: LandingScreenComponentProvider })) }) }));
22
22
  }
23
- function GenAIChatDialogContent({ genAIStore, backend, workspace, className, dialogPosition, isOpen, onOpen, onClose, returnFocusTo, onLinkClick, catalogItems, canManage, canAnalyze, canFullControl, LandingScreenComponentProvider, }) {
23
+ function GenAIChatDialogContent({ genAIStore, backend, workspace, className, dialogPosition, isOpen, onOpen, onClose, returnFocusTo, onLinkClick, allowNativeLinks, catalogItems, canManage, canAnalyze, canFullControl, LandingScreenComponentProvider, }) {
24
24
  const open = useRef(onOpen);
25
25
  open.current = onOpen;
26
26
  const close = useRef(onClose);
@@ -58,5 +58,5 @@ function GenAIChatDialogContent({ genAIStore, backend, workspace, className, dia
58
58
  const chatOverlayController = useMemo(() => parentOverlayController ?? OverlayController.getInstance(DEFAULT_CHAT_Z_INDEX), [parentOverlayController]);
59
59
  if (!isOpen)
60
60
  return null;
61
- return (_jsx(BackendProvider, { backend: backend, children: _jsx(WorkspaceProvider, { workspace: workspace, children: _jsx(OverlayControllerProvider, { overlayController: chatOverlayController, children: _jsx(ConfigProvider, { allowNativeLinks: true, linkHandler: onLinkClick, catalogItems: catalogItems, canManage: canManage, canAnalyze: canAnalyze, canFullControl: canFullControl, children: _jsx(CustomizationProvider, { landingScreenComponentProvider: LandingScreenComponentProvider, children: _jsx(GenAIChatOverlay, { className: className, dialogPosition: dialogPosition, returnFocusTo: returnFocusTo, onClose: onCloseHandler }) }) }) }) }) }));
61
+ return (_jsx(BackendProvider, { backend: backend, children: _jsx(WorkspaceProvider, { workspace: workspace, children: _jsx(OverlayControllerProvider, { overlayController: chatOverlayController, children: _jsx(ConfigProvider, { allowNativeLinks: allowNativeLinks, linkHandler: onLinkClick, catalogItems: catalogItems, canManage: canManage, canAnalyze: canAnalyze, canFullControl: canFullControl, children: _jsx(CustomizationProvider, { landingScreenComponentProvider: LandingScreenComponentProvider, children: _jsx(GenAIChatOverlay, { className: className, dialogPosition: dialogPosition, returnFocusTo: returnFocusTo, onClose: onCloseHandler }) }) }) }) }) }));
62
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GenAiConversations.d.ts","sourceRoot":"","sources":["../../src/components/GenAiConversations.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAc1D,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGnE;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,GAAG;IACtE;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,CAAC,YAAY,EAAE,sBAAsB,KAAK,IAAI,CAAC;IACtE;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,2CA6ChE"}
1
+ {"version":3,"file":"GenAiConversations.d.ts","sourceRoot":"","sources":["../../src/components/GenAiConversations.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAc1D,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGnE;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,GAAG;IACtE;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,CAAC,YAAY,EAAE,sBAAsB,KAAK,IAAI,CAAC;IACtE;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,2CAiDhE"}
@@ -20,10 +20,10 @@ import { useThreadLoading } from "./hooks/useThreadLoading.js";
20
20
  * @public
21
21
  */
22
22
  export function GenAIConversations(props) {
23
- const { backend, workspace, locale, eventHandlers, settings, catalogItems, onDispatcher, isPreview, objectTypes, includeTags, excludeTags, colorPalette, providedStore, } = props;
23
+ const { backend, workspace, locale, eventHandlers, settings, catalogItems, onDispatcher, isPreview, objectTypes, includeTags, excludeTags, colorPalette, providedStore, allowNativeLinks, onLinkClick, } = props;
24
24
  const effectiveBackend = useBackendStrict(backend);
25
25
  const effectiveWorkspace = useWorkspaceStrict(workspace);
26
- return (_jsx(IntlWrapper, { locale: locale, children: _jsx(GenAiStore, { providedStore: providedStore, backend: effectiveBackend, workspace: effectiveWorkspace, onDispatcher: onDispatcher, eventHandlers: eventHandlers, settings: settings, catalogItems: catalogItems, isPreview: isPreview, excludeTags: excludeTags, includeTags: includeTags, colorPalette: colorPalette, objectTypes: objectTypes, children: _jsx(BackendProvider, { backend: effectiveBackend, children: _jsx(WorkspaceProvider, { workspace: effectiveWorkspace, children: _jsx(PermissionsProvider, { children: _jsx(GenAIConversationsContent, { ...props }) }) }) }) }) }));
26
+ return (_jsx(IntlWrapper, { locale: locale, children: _jsx(GenAiStore, { providedStore: providedStore, backend: effectiveBackend, workspace: effectiveWorkspace, onDispatcher: onDispatcher, eventHandlers: eventHandlers, allowNativeLinks: allowNativeLinks, onLinkClick: onLinkClick, settings: settings, catalogItems: catalogItems, isPreview: isPreview, excludeTags: excludeTags, includeTags: includeTags, colorPalette: colorPalette, objectTypes: objectTypes, children: _jsx(BackendProvider, { backend: effectiveBackend, children: _jsx(WorkspaceProvider, { workspace: effectiveWorkspace, children: _jsx(PermissionsProvider, { children: _jsx(GenAIConversationsContent, { ...props }) }) }) }) }) }));
27
27
  }
28
28
  const mapDispatchToProps = {
29
29
  loadConversation: setCurrentConversationAction,
@@ -3,6 +3,7 @@ import { type EnhancedStore, type Store } from "@reduxjs/toolkit";
3
3
  import { type IAnalyticalBackend, type IUserWorkspaceSettings } from "@gooddata/sdk-backend-spi";
4
4
  import { type CatalogItem, type GenAIObjectType, type IColorPalette } from "@gooddata/sdk-model";
5
5
  import { type ChatEventHandler } from "../store/events.js";
6
+ import { type LinkHandlerEvent } from "./ConfigContext.js";
6
7
  /**
7
8
  * Props for the GenAiStore component.
8
9
  * @public
@@ -28,6 +29,14 @@ export type GenAiStoreProps = {
28
29
  * User settings to use for the chat UI.
29
30
  */
30
31
  settings?: IUserWorkspaceSettings;
32
+ /**
33
+ * Callback to handle link clicks.
34
+ */
35
+ onLinkClick?: (linkClickEvent: LinkHandlerEvent) => string | undefined;
36
+ /**
37
+ * Whether to allow native links to be opened in a new tab.
38
+ */
39
+ allowNativeLinks?: boolean;
31
40
  /**
32
41
  * Event handlers to subscribe to chat events.
33
42
  */
@@ -1 +1 @@
1
- {"version":3,"file":"GenAiStore.d.ts","sourceRoot":"","sources":["../../src/components/GenAiStore.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAmC,MAAM,OAAO,CAAC;AAExE,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAGlE,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKjG,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG3D;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC1B;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/B;;OAEG;IACH,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC;;OAEG;IACH,aAAa,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACnC;;OAEG;IACH,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;OAEG;IACH,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;IAC7D;;OAEG;IACH,QAAQ,EAAE,SAAS,GAAG,CAAC,CAAC,UAAU,EAAE,aAAa,KAAK,SAAS,CAAC,CAAC;IAEjE;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,kDA2ChD"}
1
+ {"version":3,"file":"GenAiStore.d.ts","sourceRoot":"","sources":["../../src/components/GenAiStore.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAmC,MAAM,OAAO,CAAC;AAExE,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAGlE,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKjG,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG3D,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3E;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC1B;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/B;;OAEG;IACH,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAElC;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,KAAK,MAAM,GAAG,SAAS,CAAC;IACvE;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;OAEG;IACH,aAAa,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACnC;;OAEG;IACH,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;OAEG;IACH,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;IAC7D;;OAEG;IACH,QAAQ,EAAE,SAAS,GAAG,CAAC,CAAC,UAAU,EAAE,aAAa,KAAK,SAAS,CAAC,CAAC;IAEjE;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,kDAmDhD"}
@@ -6,6 +6,7 @@ import { useBackendStrict, useWorkspaceStrict } from "@gooddata/sdk-ui";
6
6
  import { useGenAIStore } from "../hooks/useGenAIStore.js";
7
7
  import { chatWindowSliceName } from "../store/chatWindow/chatWindowSlice.js";
8
8
  import { messagesSliceName } from "../store/messages/messagesSlice.js";
9
+ import { ConfigProvider } from "./ConfigContext.js";
9
10
  /**
10
11
  * Provides the Gen AI store to the application.
11
12
  * @public
@@ -37,12 +38,12 @@ export function GenAiStore(props) {
37
38
  return null;
38
39
  }
39
40
  if (externalStore) {
40
- return (_jsx(ExternalStore, { ...props, currentStore: externalStore, children: children }));
41
+ return (_jsx(ConfigProvider, { allowNativeLinks: props.allowNativeLinks, linkHandler: props.onLinkClick, children: _jsx(ExternalStore, { ...props, currentStore: externalStore, children: children }) }));
41
42
  }
42
43
  if (injectedStore) {
43
- return (_jsx(InjectedStore, { ...props, currentStore: injectedStore, children: children }));
44
+ return (_jsx(ConfigProvider, { allowNativeLinks: props.allowNativeLinks, linkHandler: props.onLinkClick, children: _jsx(InjectedStore, { ...props, currentStore: injectedStore, children: children }) }));
44
45
  }
45
- return _jsx(InternalStore, { ...props, children: children });
46
+ return (_jsx(ConfigProvider, { allowNativeLinks: props.allowNativeLinks, linkHandler: props.onLinkClick, children: _jsx(InternalStore, { ...props, children: children }) }));
46
47
  }
47
48
  function ExternalStore({ onDispatcher, children, currentStore, }) {
48
49
  useEffect(() => {
@@ -58,7 +59,7 @@ function InjectedStore({ onDispatcher, children, currentStore, }) {
58
59
  const content = typeof children === "function" ? children(currentStore) : children;
59
60
  return _jsx(StoreProvider, { store: currentStore, children: content });
60
61
  }
61
- function InternalStore({ backend, workspace, onDispatcher, children, eventHandlers, settings, catalogItems, includeTags, excludeTags, objectTypes, isPreview, colorPalette, }) {
62
+ function InternalStore({ backend, workspace, onDispatcher, children, eventHandlers, settings, catalogItems, includeTags, excludeTags, objectTypes, allowNativeLinks, onLinkClick, isPreview, colorPalette, }) {
62
63
  const effectiveBackend = useBackendStrict(backend);
63
64
  const effectiveWorkspace = useWorkspaceStrict(workspace);
64
65
  const genAIStore = useGenAIStore(effectiveBackend, effectiveWorkspace, {
@@ -70,6 +71,8 @@ function InternalStore({ backend, workspace, onDispatcher, children, eventHandle
70
71
  excludeTags,
71
72
  catalogItems,
72
73
  isPreview,
74
+ allowNativeLinks,
75
+ onLinkClick,
73
76
  });
74
77
  useEffect(() => {
75
78
  onDispatcher?.(genAIStore.dispatch);
@@ -1,5 +1,5 @@
1
1
  import { type IUserWorkspaceSettings } from "@gooddata/sdk-backend-spi";
2
- export declare function useEndpointCheck(settings: IUserWorkspaceSettings | undefined, canFullControl: boolean): {
2
+ export declare function useEndpointCheck(settings: IUserWorkspaceSettings | undefined, canFullControl?: boolean): {
3
3
  checking: boolean;
4
4
  count: number;
5
5
  evaluated: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"useEndpointCheck.d.ts","sourceRoot":"","sources":["../../../src/components/hooks/useEndpointCheck.ts"],"names":[],"mappings":"AAIA,OAAO,EAA2B,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAKjG,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,SAAS,EAAE,cAAc,EAAE,OAAO;;;;;;EAgCrG"}
1
+ {"version":3,"file":"useEndpointCheck.d.ts","sourceRoot":"","sources":["../../../src/components/hooks/useEndpointCheck.ts"],"names":[],"mappings":"AAIA,OAAO,EAA2B,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAKjG,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,SAAS,EAAE,cAAc,CAAC,EAAE,OAAO;;;;;;EAgCtG"}
@@ -5,6 +5,6 @@ type AssistantItemProps = {
5
5
  message: IChatConversationLocalItem;
6
6
  isLast?: boolean;
7
7
  };
8
- export declare function AssistantItemComponent({ message, groups, isLast }: AssistantItemProps): import("react/jsx-runtime").JSX.Element;
8
+ export declare function AssistantItemComponent({ message, groups, isLast }: AssistantItemProps): import("react/jsx-runtime").JSX.Element | null;
9
9
  export {};
10
10
  //# sourceMappingURL=AssistantItem.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantItem.d.ts","sourceRoot":"","sources":["../../../src/components/messages/AssistantItem.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAEjE,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAQnE,KAAK,kBAAkB,GAAG;IACtB,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,OAAO,EAAE,0BAA0B,CAAC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,kBAAkB,2CA0CrF"}
1
+ {"version":3,"file":"AssistantItem.d.ts","sourceRoot":"","sources":["../../../src/components/messages/AssistantItem.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAEjE,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAQnE,KAAK,kBAAkB,GAAG;IACtB,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,OAAO,EAAE,0BAA0B,CAAC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,kBAAkB,kDAmDrF"}
@@ -14,6 +14,14 @@ export function AssistantItemComponent({ message, groups, isLast }) {
14
14
  const messageState = getItemState(message);
15
15
  const references = useToolsReferences(groups);
16
16
  const classNames = cx("gd-gen-ai-chat__messages__conversation", "gd-gen-ai-chat__messages__conversation--assistant", `gd-gen-ai-chat__messages__conversation--${message.content.type}`, messageState === "cancelled" && "gd-gen-ai-chat__messages__conversation--cancelled", isLast && "gd-gen-ai-chat__messages__conversation--isLast");
17
+ //NOTE: For now we want to hide all tool calls
18
+ if (message.content.type === "toolCall" || message.content.type === "toolResult") {
19
+ return null;
20
+ }
21
+ //NOTE: For now we want to hide all reasoning messages without summary
22
+ if (message.content.type === "reasoning" && !message.content.summary) {
23
+ return null;
24
+ }
17
25
  return (_jsxs("div", { className: classNames, "data-state": messageState, "data-testid": "gen-ai-conversation-assistant-message", children: [
18
26
  _jsx("span", { className: "gd-gen-ai-chat__visually__hidden", children: intl.formatMessage({ id: "gd.gen-ai.message.label.assistant" }) }), _jsx(ReasoningIcon, { content: message.content }), _jsx(ConversationItemContents, { role: "assistant", message: message, references: references, isLoading: messageState === "loading", isLast: isLast }), _jsx(AssistantItemSuggestions, { type: "followUp", content: message.content, showSuggestions: true, references: references }), _jsx(AssistantItemFeedback, { group: group, message: message, isLast: isLast }), _jsx(AssistantItemSuggestions, { type: "actions", content: message.content, showSuggestions: isLast })
19
27
  ] }));
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantItemFeedback.d.ts","sourceRoot":"","sources":["../../../src/components/messages/AssistantItemFeedback.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAKnE,MAAM,WAAW,2BAA2B;IACxC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,OAAO,EAAE,0BAA0B,CAAC;IACpC,eAAe,EAAE,OAAO,eAAe,CAAC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AA2ED,eAAO,MAAM,qBAAqB,EAAE,GAAkE,CAAC"}
1
+ {"version":3,"file":"AssistantItemFeedback.d.ts","sourceRoot":"","sources":["../../../src/components/messages/AssistantItemFeedback.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAKnE,MAAM,WAAW,2BAA2B;IACxC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,OAAO,EAAE,0BAA0B,CAAC;IACpC,eAAe,EAAE,OAAO,eAAe,CAAC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AA8ED,eAAO,MAAM,qBAAqB,EAAE,GAAkE,CAAC"}
@@ -13,6 +13,9 @@ function AssistantItemFeedbackCore({ message, group, isLast, setUserFeedback })
13
13
  if (group.type !== "assistant" || !message.complete) {
14
14
  return null;
15
15
  }
16
+ if (message.content.type === "reasoning") {
17
+ return null;
18
+ }
16
19
  const thumbsUpLabel = intl.formatMessage({ id: "gd.gen-ai.feedback.like" });
17
20
  const thumbsDownLabel = intl.formatMessage({ id: "gd.gen-ai.feedback.dislike" });
18
21
  const type = message.feedback?.feedback;
@@ -3,7 +3,7 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
3
3
  import { useMemo, useState } from "react";
4
4
  import cx from "classnames";
5
5
  import { defineMessages, useIntl } from "react-intl";
6
- import { UiButton } from "@gooddata/sdk-ui-kit";
6
+ import { LoadingSpinner, UiButton } from "@gooddata/sdk-ui-kit";
7
7
  import { removeMarkdown } from "../utils/markdownUtils.js";
8
8
  export function ItemsGroup({ group, previousGroup, children }) {
9
9
  const classNames = cx("gd-gen-ai-chat__messages__conversation-group", {
@@ -26,7 +26,7 @@ function ReasoningItemsGroup({ classNames, group, previousGroup, children }) {
26
26
  _jsxs("div", { className: cx("gd-gen-ai-chat__messages__conversation-group--header", {
27
27
  "gd-gen-ai-chat__messages__conversation-group--header--completed": isCompleted,
28
28
  }), children: [
29
- _jsx("span", { className: "gd-gen-ai-chat__visually__hidden", "aria-live": "polite", "aria-atomic": "true", children: lastMessage }), isCompleted && isEmpty ? (_jsx(UiButton, { isDisabled: true, label: lastMessage, dataTestId: "reasoning", accessibilityConfig: { ariaExpanded: false }, iconBefore: "brain", iconBeforeSize: 12, variant: "tertiary" })) : (_jsx(UiButton, { label: lastMessage, dataTestId: "reasoning", onClick: () => setIsExpanded(!isExpanded), accessibilityConfig: { ariaExpanded: isExpanded }, iconBefore: isExpanded ? "navigateDown" : "navigateRight", iconBeforeSize: 12, variant: "tertiary" })), isCompleted && duration ? (_jsx("div", { className: "gd-gen-ai-chat__messages__conversation-group--header--duration", children: duration })) : null] }), isExpanded ? (_jsx("div", { className: "gd-gen-ai-chat__messages__conversation-group--content", "data-testid": "gen-ai-reasoning-group-content", children: children })) : null] }));
29
+ _jsx("span", { className: "gd-gen-ai-chat__visually__hidden", "aria-live": "polite", "aria-atomic": "true", children: lastMessage }), isCompleted && isEmpty ? (_jsx(UiButton, { isDisabled: true, label: lastMessage, dataTestId: "reasoning", accessibilityConfig: { ariaExpanded: false }, iconBefore: "brain", iconBeforeSize: 12, variant: "tertiary" })) : (_jsx(UiButton, { label: lastMessage, dataTestId: "reasoning", onClick: () => setIsExpanded(!isExpanded), accessibilityConfig: { ariaExpanded: isExpanded }, iconBefore: isExpanded ? "navigateDown" : "navigateRight", iconBeforeSize: 12, variant: "tertiary" })), isCompleted && duration ? (_jsx("div", { className: "gd-gen-ai-chat__messages__conversation-group--header--duration", children: duration })) : null] }), isExpanded ? (_jsxs("div", { className: "gd-gen-ai-chat__messages__conversation-group--content", "data-testid": "gen-ai-reasoning-group-content", children: [children, isCompleted ? null : (_jsx("div", { className: "gd-gen-ai-chat__messages__conversation-group--content--loading", children: _jsx(LoadingSpinner, { className: "gd-gen-ai-chat__messages__conversation-group--content--loading--spinner" }) }))] })) : null] }));
30
30
  }
31
31
  function useReasoningGroup(previousGroup, group) {
32
32
  const intl = useIntl();
@@ -47,22 +47,20 @@ function useReasoningGroup(previousGroup, group) {
47
47
  }));
48
48
  }, [group.messages]);
49
49
  const messages = useMemo(() => {
50
+ let last = "";
50
51
  return group.messages.map((m) => {
51
- if (m.complete) {
52
- return undefined;
53
- }
54
52
  switch (m.content.type) {
55
53
  case "reasoning":
56
- return m.content.summary
54
+ last = m.content.summary
57
55
  ? removeMarkdown(m.content.summary.slice(0, 40))
58
56
  : intl.formatMessage({ id: "gd.gen-ai.state.thinking" });
57
+ break;
59
58
  case "toolCall":
60
- return intl.formatMessage({ id: "gd.gen-ai.message.reasoning.tool-call.plain" }, { name: m.content.name });
61
59
  case "toolResult":
62
- return intl.formatMessage({ id: "gd.gen-ai.message.reasoning.tool-result.plain" });
63
60
  default:
64
- return undefined;
61
+ break;
65
62
  }
63
+ return last;
66
64
  });
67
65
  }, [group.messages, intl]);
68
66
  const lastMessage = useMemo(() => {
@@ -70,7 +68,7 @@ function useReasoningGroup(previousGroup, group) {
70
68
  return intl.formatMessage({ id: "gd.gen-ai.routing.thinking-process" });
71
69
  }
72
70
  const lastMessageContent = messages[messages.length - 1];
73
- return `${lastMessageContent ?? intl.formatMessage({ id: "gd.gen-ai.state.thinking" })}...`;
71
+ return `${lastMessageContent || intl.formatMessage({ id: "gd.gen-ai.state.thinking" })}...`;
74
72
  }, [intl, isCompleted, messages]);
75
73
  const duration = useMemo(() => {
76
74
  if (!previousGroup) {
@@ -5,6 +5,6 @@ type ToolItemProps = {
5
5
  groups: IChatMessagesGroup[];
6
6
  isLast?: boolean;
7
7
  };
8
- export declare function ToolItemComponent({ message, groups, isLast }: ToolItemProps): import("react/jsx-runtime").JSX.Element;
8
+ export declare function ToolItemComponent(_: ToolItemProps): null;
9
9
  export {};
10
10
  //# sourceMappingURL=ToolItem.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolItem.d.ts","sourceRoot":"","sources":["../../../src/components/messages/ToolItem.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAEjE,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAKnE,KAAK,aAAa,GAAG;IACjB,OAAO,EAAE,0BAA0B,CAAC;IACpC,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,aAAa,2CA0B3E"}
1
+ {"version":3,"file":"ToolItem.d.ts","sourceRoot":"","sources":["../../../src/components/messages/ToolItem.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,KAAK,aAAa,GAAG;IACjB,OAAO,EAAE,0BAA0B,CAAC;IACpC,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,aAAa,QA6BjD"}
@@ -1,16 +1,30 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
1
  // (C) 2024-2026 GoodData Corporation
3
- import cx from "classnames";
4
- import { useIntl } from "react-intl";
5
- import { useToolsReferences } from "../completion/useToolsReferences.js";
6
- import { ConversationItemContents } from "./ConversationItemContents.js";
7
- import { getItemState } from "./itemState.js";
8
- export function ToolItemComponent({ message, groups, isLast }) {
9
- const intl = useIntl();
10
- const messageState = getItemState(message);
11
- const references = useToolsReferences(groups);
12
- const classNames = cx("gd-gen-ai-chat__messages__conversation", "gd-gen-ai-chat__messages__conversation--tool", messageState === "cancelled" && "gd-gen-ai-chat__messages__conversation--cancelled");
13
- return (_jsxs("div", { className: classNames, "data-state": messageState, children: [
14
- _jsx("span", { className: "gd-gen-ai-chat__visually__hidden", children: intl.formatMessage({ id: "gd.gen-ai.message.label.tool" }) }), _jsx(ConversationItemContents, { role: "tool", isLast: isLast, message: message, references: references, isLoading: messageState === "loading" })
15
- ] }));
2
+ export function ToolItemComponent(_) {
3
+ return null;
4
+ //NOTE: For now we want to hide all tool calls but keep content for future use
5
+ // const intl = useIntl();
6
+ //
7
+ // const messageState = getItemState(message);
8
+ // const references = useToolsReferences(groups);
9
+ //
10
+ // const classNames = cx(
11
+ // "gd-gen-ai-chat__messages__conversation",
12
+ // "gd-gen-ai-chat__messages__conversation--tool",
13
+ // messageState === "cancelled" && "gd-gen-ai-chat__messages__conversation--cancelled",
14
+ // );
15
+ //
16
+ // return (
17
+ // <div className={classNames} data-state={messageState}>
18
+ // <span className="gd-gen-ai-chat__visually__hidden">
19
+ // {intl.formatMessage({ id: "gd.gen-ai.message.label.tool" })}
20
+ // </span>
21
+ // <ConversationItemContents
22
+ // role="tool"
23
+ // isLast={isLast}
24
+ // message={message}
25
+ // references={references}
26
+ // isLoading={messageState === "loading"}
27
+ // />
28
+ // </div>
29
+ // );
16
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SemanticSearchTreeView.d.ts","sourceRoot":"","sources":["../../../../src/components/messages/components/SemanticSearchTreeView.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAIhE,KAAK,2BAA2B,GAAG;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,sBAAsB,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,2CAQxE;AAED,wBAAgB,0BAA0B,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,2BAA2B,kDAwExG"}
1
+ {"version":3,"file":"SemanticSearchTreeView.d.ts","sourceRoot":"","sources":["../../../../src/components/messages/components/SemanticSearchTreeView.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAIhE,KAAK,2BAA2B,GAAG;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,sBAAsB,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,2CAQxE;AAED,wBAAgB,0BAA0B,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,2BAA2B,kDA0ExG"}
@@ -18,6 +18,7 @@ export function SemanticSearchTreeViewImpl({ workspace, content, maxHeight }) {
18
18
  const canEdit = canFullControl || canManage || canAnalyze;
19
19
  const useHostMetricEditor = Boolean(settings?.enableShellApplication_metricEditor);
20
20
  const useHostAnalyticalDesigner = Boolean(settings?.enableShellApplication_analyticalDesigner);
21
+ const useHostLdmModeler = Boolean(settings?.enableShellApplication_ldmModeler);
21
22
  const useHostDashboards = Boolean(settings?.enableShellApplication_dashboards);
22
23
  const items = buildSemanticSearchTreeViewItems({
23
24
  intl,
@@ -29,6 +30,7 @@ export function SemanticSearchTreeViewImpl({ workspace, content, maxHeight }) {
29
30
  uiPathOptions: {
30
31
  useHostedMetricEditor: useHostMetricEditor,
31
32
  useHostedAnalyticalDesigner: useHostAnalyticalDesigner,
33
+ useHostedLdmModeler: useHostLdmModeler,
32
34
  useHostedDashboards: useHostDashboards,
33
35
  },
34
36
  });
@@ -1 +1 @@
1
- {"version":3,"file":"VisualizationContents.d.ts","sourceRoot":"","sources":["../../../../src/components/messages/contents/VisualizationContents.tsx"],"names":[],"mappings":"AAkBA,OAAO,EAEH,KAAK,aAAa,EAYrB,MAAM,qBAAqB,CAAC;AAgD7B,OAAO,EAAE,KAAK,qBAAqB,EAAqC,MAAM,mBAAmB,CAAC;AAMlG,OAAO,EAEH,0BAA0B,EAC7B,MAAM,8CAA8C,CAAC;AA+BtD,MAAM,MAAM,0BAA0B,GAAG;IACrC,OAAO,EAAE,qBAAqB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACxD,oBAAoB,CAAC,EAAE,OAAO,0BAA0B,CAAC;CAC5D,CAAC;AAEF,iBAAS,kCAAkC,CAAC,EACxC,OAAO,EACP,SAAS,EACT,WAAW,EACX,YAAY,EACZ,mBAA0B,EAC1B,4BAAoC,EACpC,oBAA4B,EAC5B,oBAA4B,EAC5B,WAAW,EACX,eAAe,EACf,eAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EACvB,EAAE,0BAA0B,2CAgrB5B;AA2XD,eAAO,MAAM,8BAA8B;;;;;;;EAGN,CAAC"}
1
+ {"version":3,"file":"VisualizationContents.d.ts","sourceRoot":"","sources":["../../../../src/components/messages/contents/VisualizationContents.tsx"],"names":[],"mappings":"AAkBA,OAAO,EAEH,KAAK,aAAa,EAYrB,MAAM,qBAAqB,CAAC;AAgD7B,OAAO,EAAE,KAAK,qBAAqB,EAAqC,MAAM,mBAAmB,CAAC;AAMlG,OAAO,EAEH,0BAA0B,EAC7B,MAAM,8CAA8C,CAAC;AA+BtD,MAAM,MAAM,0BAA0B,GAAG;IACrC,OAAO,EAAE,qBAAqB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACxD,oBAAoB,CAAC,EAAE,OAAO,0BAA0B,CAAC;CAC5D,CAAC;AAEF,iBAAS,kCAAkC,CAAC,EACxC,OAAO,EACP,SAAS,EACT,WAAW,EACX,YAAY,EACZ,mBAA0B,EAC1B,4BAAoC,EACpC,oBAA4B,EAC5B,oBAA4B,EAC5B,WAAW,EACX,eAAe,EACf,eAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EACvB,EAAE,0BAA0B,2CAksB5B;AA2XD,eAAO,MAAM,8BAA8B;;;;;;;EAGN,CAAC"}
@@ -161,9 +161,24 @@ function VisualizationContentsComponentCore({ content, messageId, useMarkdown, c
161
161
  break;
162
162
  case "button-copy":
163
163
  if (visualization?.savedVisualizationId) {
164
- const link = getAbsoluteVisualizationHref(workspaceId, visualization.savedVisualizationId, useHostedAnalyticalDesigner);
165
- copy(link);
166
- onCopyToClipboard?.({ content: link });
164
+ let link = undefined;
165
+ if (config.allowNativeLinks) {
166
+ link = getAbsoluteVisualizationHref(workspaceId, visualization.savedVisualizationId, useHostedAnalyticalDesigner);
167
+ }
168
+ else {
169
+ link = config.linkHandler?.({
170
+ id: visualization.savedVisualizationId,
171
+ type: "visualization",
172
+ workspaceId,
173
+ newTab: e.metaKey,
174
+ preventDefault: e.preventDefault.bind(e),
175
+ itemUrl: getAbsoluteVisualizationHref(workspaceId, visualization.savedVisualizationId, useHostedAnalyticalDesigner),
176
+ });
177
+ }
178
+ if (link) {
179
+ copy(link);
180
+ onCopyToClipboard?.({ content: link });
181
+ }
167
182
  }
168
183
  setMenuButtonOpen(false);
169
184
  break;
@@ -1 +1 @@
1
- {"version":3,"file":"ConversationReasoningContent.d.ts","sourceRoot":"","sources":["../../../../src/components/messages/conversationContents/ConversationReasoningContent.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,MAAM,MAAM,iCAAiC,GAAG;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,wBAAgB,4BAA4B,CAAC,EACzC,OAAO,EACP,SAAS,EACT,WAAW,EACd,EAAE,iCAAiC,2CAkBnC"}
1
+ {"version":3,"file":"ConversationReasoningContent.d.ts","sourceRoot":"","sources":["../../../../src/components/messages/conversationContents/ConversationReasoningContent.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,MAAM,MAAM,iCAAiC,GAAG;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,wBAAgB,4BAA4B,CAAC,EACzC,OAAO,EACP,SAAS,EACT,WAAW,EACd,EAAE,iCAAiC,2CAenC"}
@@ -1,12 +1,10 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  // (C) 2024-2026 GoodData Corporation
3
3
  import cx from "classnames";
4
- import { useIntl } from "react-intl";
5
4
  import { MarkdownComponent } from "../contents/Markdown.js";
6
5
  export function ConversationReasoningContent({ summary, className, useMarkdown, }) {
7
- const intl = useIntl();
8
6
  const classNames = cx("gd-gen-ai-chat__conversation__item__content", "gd-gen-ai-chat__conversation__item__content--reasoning", {
9
7
  "gd-gen-ai-chat__summary__empty": !summary,
10
8
  }, className);
11
- return (_jsx("div", { className: classNames, children: _jsx(MarkdownComponent, { allowMarkdown: useMarkdown, children: summary || intl.formatMessage({ id: "gd.gen-ai.message.reasoning.waiting_for_server" }) }) }));
9
+ return (_jsx("div", { className: classNames, children: _jsx(MarkdownComponent, { allowMarkdown: useMarkdown, children: summary }) }));
12
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ConversationVisualizationContent.d.ts","sourceRoot":"","sources":["../../../../src/components/messages/conversationContents/ConversationVisualizationContent.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAAE,KAAK,qCAAqC,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,EAAE,KAAK,aAAa,EAAgD,MAAM,qBAAqB,CAAC;AAwBvG,OAAO,EAAE,KAAK,0BAA0B,EAAE,KAAK,mCAAmC,EAAE,MAAM,mBAAmB,CAAC;AAM9G,OAAO,EAEH,0BAA0B,EAC7B,MAAM,8CAA8C,CAAC;AAGtD,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAwBlF,MAAM,MAAM,qCAAqC,GAAG;IAChD,OAAO,EAAE,0BAA0B,CAAC;IACpC,IAAI,EAAE,mCAAmC,CAAC;IAC1C,QAAQ,CAAC,EAAE,yBAAyB,CAAC;IACrC,aAAa,EAAE,WAAW,CAAC,qCAAqC,CAAC,eAAe,CAAC,CAAC,CAAC;IACnF,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACxD,oBAAoB,CAAC,EAAE,OAAO,0BAA0B,CAAC;IACzD,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,4BAA4B,CAAC,EAAE,OAAO,CAAC;CAC1C,CAAC;AAEF,iBAAS,oCAAoC,CAAC,EAC1C,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,SAAS,EACT,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,mBAAmB,EACnB,4BAA4B,EAC/B,EAAE,qCAAqC,2CAmGvC;AAmlBD,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;EAGN,CAAC"}
1
+ {"version":3,"file":"ConversationVisualizationContent.d.ts","sourceRoot":"","sources":["../../../../src/components/messages/conversationContents/ConversationVisualizationContent.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAAE,KAAK,qCAAqC,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,EAAE,KAAK,aAAa,EAAgD,MAAM,qBAAqB,CAAC;AAwBvG,OAAO,EAAE,KAAK,0BAA0B,EAAE,KAAK,mCAAmC,EAAE,MAAM,mBAAmB,CAAC;AAM9G,OAAO,EAEH,0BAA0B,EAC7B,MAAM,8CAA8C,CAAC;AAGtD,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAwBlF,MAAM,MAAM,qCAAqC,GAAG;IAChD,OAAO,EAAE,0BAA0B,CAAC;IACpC,IAAI,EAAE,mCAAmC,CAAC;IAC1C,QAAQ,CAAC,EAAE,yBAAyB,CAAC;IACrC,aAAa,EAAE,WAAW,CAAC,qCAAqC,CAAC,eAAe,CAAC,CAAC,CAAC;IACnF,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACxD,oBAAoB,CAAC,EAAE,OAAO,0BAA0B,CAAC;IACzD,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,4BAA4B,CAAC,EAAE,OAAO,CAAC;CAC1C,CAAC;AAEF,iBAAS,oCAAoC,CAAC,EAC1C,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,SAAS,EACT,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,mBAAmB,EACnB,4BAA4B,EAC/B,EAAE,qCAAqC,2CAmGvC;AAymBD,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;EAGN,CAAC"}
@@ -302,14 +302,29 @@ function useHandlers({ visualization, setSaveDialogOpen, onCopyToClipboard }) {
302
302
  setSaveDialogOpen("explore");
303
303
  }
304
304
  }, [config, setSaveDialogOpen, visualization, workspaceId, useHostedAnalyticalDesigner]);
305
- const onCopy = useCallback(() => {
305
+ const onCopy = useCallback((e) => {
306
306
  if (!visualization) {
307
307
  return;
308
308
  }
309
- const link = getAbsoluteVisualizationHref(workspaceId, visualization.insight.identifier, useHostedAnalyticalDesigner);
310
- copy(link);
311
- onCopyToClipboard?.({ content: link });
312
- }, [onCopyToClipboard, visualization, workspaceId, useHostedAnalyticalDesigner]);
309
+ let link = undefined;
310
+ if (config.allowNativeLinks) {
311
+ link = getAbsoluteVisualizationHref(workspaceId, visualization.insight.identifier, useHostedAnalyticalDesigner);
312
+ }
313
+ else {
314
+ link = config.linkHandler?.({
315
+ id: visualization.insight.identifier,
316
+ type: "visualization",
317
+ workspaceId,
318
+ newTab: e.metaKey,
319
+ preventDefault: e.preventDefault.bind(e),
320
+ itemUrl: getAbsoluteVisualizationHref(workspaceId, visualization.insight.identifier, useHostedAnalyticalDesigner),
321
+ });
322
+ }
323
+ if (link) {
324
+ copy(link);
325
+ onCopyToClipboard?.({ content: link });
326
+ }
327
+ }, [visualization, config, workspaceId, useHostedAnalyticalDesigner, onCopyToClipboard]);
313
328
  return {
314
329
  onSave,
315
330
  onOpen,
@@ -1,5 +1,6 @@
1
1
  import { type IAnalyticalBackend, type IUserWorkspaceSettings } from "@gooddata/sdk-backend-spi";
2
2
  import { type CatalogItem, type GenAIObjectType, type IColorPalette } from "@gooddata/sdk-model";
3
+ import type { LinkHandlerEvent } from "../components/ConfigContext.js";
3
4
  import { type ChatEventHandler } from "../store/events.js";
4
5
  export declare const useGenAIStore: (backend: IAnalyticalBackend, workspace: string, opts: {
5
6
  eventHandlers?: ChatEventHandler[] | undefined;
@@ -10,5 +11,7 @@ export declare const useGenAIStore: (backend: IAnalyticalBackend, workspace: str
10
11
  excludeTags?: string[] | undefined;
11
12
  catalogItems?: CatalogItem[] | undefined;
12
13
  isPreview?: boolean | undefined;
14
+ onLinkClick?: ((linkClickEvent: LinkHandlerEvent) => string | undefined) | undefined;
15
+ allowNativeLinks?: boolean | undefined;
13
16
  }) => import("redux").Store<any, import("redux").UnknownAction, unknown>;
14
17
  //# sourceMappingURL=useGenAIStore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useGenAIStore.d.ts","sourceRoot":"","sources":["../../src/hooks/useGenAIStore.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAUjG,OAAO,EAAE,KAAK,gBAAgB,EAAmB,MAAM,oBAAoB,CAAC;AAI5E,eAAO,MAAM,aAAa;;;;;;;;;wEAsGzB,CAAC"}
1
+ {"version":3,"file":"useGenAIStore.d.ts","sourceRoot":"","sources":["../../src/hooks/useGenAIStore.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEjG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AASvE,OAAO,EAAE,KAAK,gBAAgB,EAAmB,MAAM,oBAAoB,CAAC;AAI5E,eAAO,MAAM,aAAa;;;;;;;;;;;wEA8GzB,CAAC"}