@gooddata/sdk-ui-gen-ai 11.43.0-alpha.2 → 11.43.0-alpha.4

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 +4826 -13873
  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 +23 -11
  39. package/esm/localization/bundles/de-DE.localization-bundle.d.ts.map +1 -1
  40. package/esm/localization/bundles/de-DE.localization-bundle.js +23 -11
  41. package/esm/localization/bundles/en-AU.localization-bundle.d.ts +23 -11
  42. package/esm/localization/bundles/en-AU.localization-bundle.d.ts.map +1 -1
  43. package/esm/localization/bundles/en-AU.localization-bundle.js +23 -11
  44. package/esm/localization/bundles/en-GB.localization-bundle.d.ts +23 -11
  45. package/esm/localization/bundles/en-GB.localization-bundle.d.ts.map +1 -1
  46. package/esm/localization/bundles/en-GB.localization-bundle.js +23 -11
  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 +23 -11
  51. package/esm/localization/bundles/es-419.localization-bundle.d.ts.map +1 -1
  52. package/esm/localization/bundles/es-419.localization-bundle.js +23 -11
  53. package/esm/localization/bundles/es-ES.localization-bundle.d.ts +23 -11
  54. package/esm/localization/bundles/es-ES.localization-bundle.d.ts.map +1 -1
  55. package/esm/localization/bundles/es-ES.localization-bundle.js +23 -11
  56. package/esm/localization/bundles/fi-FI.localization-bundle.d.ts +23 -11
  57. package/esm/localization/bundles/fi-FI.localization-bundle.d.ts.map +1 -1
  58. package/esm/localization/bundles/fi-FI.localization-bundle.js +23 -11
  59. package/esm/localization/bundles/fr-CA.localization-bundle.d.ts +23 -11
  60. package/esm/localization/bundles/fr-CA.localization-bundle.d.ts.map +1 -1
  61. package/esm/localization/bundles/fr-CA.localization-bundle.js +23 -11
  62. package/esm/localization/bundles/fr-FR.localization-bundle.d.ts +23 -11
  63. package/esm/localization/bundles/fr-FR.localization-bundle.d.ts.map +1 -1
  64. package/esm/localization/bundles/fr-FR.localization-bundle.js +23 -11
  65. package/esm/localization/bundles/id-ID.localization-bundle.d.ts +23 -11
  66. package/esm/localization/bundles/id-ID.localization-bundle.d.ts.map +1 -1
  67. package/esm/localization/bundles/id-ID.localization-bundle.js +23 -11
  68. package/esm/localization/bundles/it-IT.localization-bundle.d.ts +23 -11
  69. package/esm/localization/bundles/it-IT.localization-bundle.d.ts.map +1 -1
  70. package/esm/localization/bundles/it-IT.localization-bundle.js +23 -11
  71. package/esm/localization/bundles/ja-JP.localization-bundle.d.ts +23 -11
  72. package/esm/localization/bundles/ja-JP.localization-bundle.d.ts.map +1 -1
  73. package/esm/localization/bundles/ja-JP.localization-bundle.js +23 -11
  74. package/esm/localization/bundles/ko-KR.localization-bundle.d.ts +23 -11
  75. package/esm/localization/bundles/ko-KR.localization-bundle.d.ts.map +1 -1
  76. package/esm/localization/bundles/ko-KR.localization-bundle.js +23 -11
  77. package/esm/localization/bundles/nl-NL.localization-bundle.d.ts +23 -11
  78. package/esm/localization/bundles/nl-NL.localization-bundle.d.ts.map +1 -1
  79. package/esm/localization/bundles/nl-NL.localization-bundle.js +24 -12
  80. package/esm/localization/bundles/pl-PL.localization-bundle.d.ts +23 -11
  81. package/esm/localization/bundles/pl-PL.localization-bundle.d.ts.map +1 -1
  82. package/esm/localization/bundles/pl-PL.localization-bundle.js +23 -11
  83. package/esm/localization/bundles/pt-BR.localization-bundle.d.ts +23 -11
  84. package/esm/localization/bundles/pt-BR.localization-bundle.d.ts.map +1 -1
  85. package/esm/localization/bundles/pt-BR.localization-bundle.js +23 -11
  86. package/esm/localization/bundles/pt-PT.localization-bundle.d.ts +23 -11
  87. package/esm/localization/bundles/pt-PT.localization-bundle.d.ts.map +1 -1
  88. package/esm/localization/bundles/pt-PT.localization-bundle.js +23 -11
  89. package/esm/localization/bundles/ru-RU.localization-bundle.d.ts +23 -11
  90. package/esm/localization/bundles/ru-RU.localization-bundle.d.ts.map +1 -1
  91. package/esm/localization/bundles/ru-RU.localization-bundle.js +23 -11
  92. package/esm/localization/bundles/sl-SI.localization-bundle.d.ts +23 -11
  93. package/esm/localization/bundles/sl-SI.localization-bundle.d.ts.map +1 -1
  94. package/esm/localization/bundles/sl-SI.localization-bundle.js +23 -11
  95. package/esm/localization/bundles/th-TH.localization-bundle.d.ts +23 -11
  96. package/esm/localization/bundles/th-TH.localization-bundle.d.ts.map +1 -1
  97. package/esm/localization/bundles/th-TH.localization-bundle.js +23 -11
  98. package/esm/localization/bundles/tr-TR.localization-bundle.d.ts +23 -11
  99. package/esm/localization/bundles/tr-TR.localization-bundle.d.ts.map +1 -1
  100. package/esm/localization/bundles/tr-TR.localization-bundle.js +23 -11
  101. package/esm/localization/bundles/uk-UA.localization-bundle.d.ts +23 -11
  102. package/esm/localization/bundles/uk-UA.localization-bundle.d.ts.map +1 -1
  103. package/esm/localization/bundles/uk-UA.localization-bundle.js +23 -11
  104. package/esm/localization/bundles/vi-VN.localization-bundle.d.ts +23 -11
  105. package/esm/localization/bundles/vi-VN.localization-bundle.d.ts.map +1 -1
  106. package/esm/localization/bundles/vi-VN.localization-bundle.js +23 -11
  107. package/esm/localization/bundles/zh-HK.localization-bundle.d.ts +23 -11
  108. package/esm/localization/bundles/zh-HK.localization-bundle.d.ts.map +1 -1
  109. package/esm/localization/bundles/zh-HK.localization-bundle.js +23 -11
  110. package/esm/localization/bundles/zh-Hans.localization-bundle.d.ts +23 -11
  111. package/esm/localization/bundles/zh-Hans.localization-bundle.d.ts.map +1 -1
  112. package/esm/localization/bundles/zh-Hans.localization-bundle.js +23 -11
  113. package/esm/localization/bundles/zh-Hant.localization-bundle.d.ts +23 -11
  114. package/esm/localization/bundles/zh-Hant.localization-bundle.d.ts.map +1 -1
  115. package/esm/localization/bundles/zh-Hant.localization-bundle.js +23 -11
  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 +18 -0
  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 +1 @@
1
- {"version":3,"file":"zh-Hans.localization-bundle.d.ts","sourceRoot":"","sources":["../../../src/localization/bundles/zh-Hans.localization-bundle.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsKnB,CAAC"}
1
+ {"version":3,"file":"zh-Hans.localization-bundle.d.ts","sourceRoot":"","sources":["../../../src/localization/bundles/zh-Hans.localization-bundle.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkLnB,CAAC"}
@@ -25,6 +25,7 @@ export const zh_Hans = {
25
25
  "gd.gen-ai.visualization.error.forecast": "<b>未收到预测:</b> {error}",
26
26
  "gd.gen-ai.visualization.error.clustering": "<b>未收到聚类结果:</b> {error}",
27
27
  "gd.gen-ai.visualization.error.data_too_large": "<b>数据过大。</b> 请通过应用筛选来减少数据量。",
28
+ "gd.gen-ai.visualization.unavailable": "无法显示可视化。",
28
29
  "gd.gen-ai.permission-error": "权限不足",
29
30
  "gd.gen-ai.permission-error.description": "您无权访问聊天机器人。请联系您的管理员申请访问权限。",
30
31
  "gd.gen-ai.input-placeholder": "在这里询问…",
@@ -35,7 +36,6 @@ export const zh_Hans = {
35
36
  "gd.gen-ai.agent.unavailable": "无可用智能体",
36
37
  "gd.gen-ai.agent.unavailable.disabled-tooltip": "已禁用——无可用智能体。",
37
38
  "gd.gen-ai.agent.switched": "已切换到 {title} 智能体",
38
- "gd.gen-ai.agent.unknown": "未知",
39
39
  "gd.gen-ai.feedback.like": "将此消息标记为有用",
40
40
  "gd.gen-ai.feedback.dislike": "将此消息标记为无帮助",
41
41
  "gd.gen-ai.feedback.popup.title": "我们已收到您的反馈",
@@ -69,20 +69,32 @@ export const zh_Hans = {
69
69
  "gd.gen-ai.alert-proposal.summary.title": "标题",
70
70
  "gd.gen-ai.alert-proposal.summary.attributes": "属性",
71
71
  "gd.gen-ai.alert-proposal.summary.filters": "筛选器",
72
- "gd.gen-ai.alert-proposal.summary.metric": "指标",
73
- "gd.gen-ai.alert-proposal.summary.metric-compared": "相比",
74
72
  "gd.gen-ai.alert-proposal.summary.date": "日期",
75
73
  "gd.gen-ai.alert-proposal.summary.notification-channel": "渠道",
76
74
  "gd.gen-ai.alert-proposal.summary.dashboard": "控制面板",
77
- "gd.gen-ai.alert-proposal.summary.operator": "运算符",
78
- "gd.gen-ai.alert-proposal.summary.arithmeticOperator": "算术运算符",
79
- "gd.gen-ai.alert-proposal.summary.threshold": "临界点",
80
- "gd.gen-ai.alert-proposal.summary.range": "范围",
81
- "gd.gen-ai.alert-proposal.summary.from": "从",
82
- "gd.gen-ai.alert-proposal.summary.to": "到",
83
- "gd.gen-ai.alert-proposal.summary.granularity": "精细度",
84
- "gd.gen-ai.alert-proposal.summary.sensitivity": "敏感性",
85
75
  "gd.gen-ai.alert-proposal.summary.recipients": "收件人",
76
+ "gd.gen-ai.alert-proposal.summary.condition-comparison": "比较",
77
+ "gd.gen-ai.alert-proposal.summary.condition-relative": "相对",
78
+ "gd.gen-ai.alert-proposal.summary.condition-anomalyDetection": "异常检测",
79
+ "sdk.ui.genAi.alertProposal.operator.lessThan": "<",
80
+ "sdk.ui.genAi.alertProposal.operator.lessThanOrEqualTo": "<=",
81
+ "sdk.ui.genAi.alertProposal.operator.greaterThan": ">",
82
+ "sdk.ui.genAi.alertProposal.operator.greaterThanOrEqualTo": ">=",
83
+ "sdk.ui.genAi.alertProposal.operator.equalTo": "=",
84
+ "sdk.ui.genAi.alertProposal.operator.increasesBy": "增加",
85
+ "sdk.ui.genAi.alertProposal.operator.decreasesBy": "减少",
86
+ "sdk.ui.genAi.alertProposal.operator.changesBy": "变化",
87
+ "sdk.ui.genAi.alertProposal.operator.change": "-",
88
+ "sdk.ui.genAi.alertProposal.operator.difference": "%",
89
+ "sdk.ui.genAi.alertProposal.granularity.hour": "按<b>小时</b>计算",
90
+ "sdk.ui.genAi.alertProposal.granularity.day": "按<b>每日</b>计算",
91
+ "sdk.ui.genAi.alertProposal.granularity.week": "按<b>每周</b>计算",
92
+ "sdk.ui.genAi.alertProposal.granularity.month": "按<b>每月</b>计算",
93
+ "sdk.ui.genAi.alertProposal.granularity.quarter": "按<b>每季度</b>计算",
94
+ "sdk.ui.genAi.alertProposal.granularity.year": "按<b>每年</b>计算",
95
+ "sdk.ui.genAi.alertProposal.senstivity.low": "具有<b>低</b>敏感度",
96
+ "sdk.ui.genAi.alertProposal.senstivity.medium": "具有<b>中</b>敏感度",
97
+ "sdk.ui.genAi.alertProposal.senstivity.high": "具有<b>高</b>敏感度",
86
98
  "gd.gen-ai.alert-proposal.summary.trigger": "扳机",
87
99
  "gd.gen-ai.alert-proposal.summary.trigger.mode": "模式",
88
100
  "gd.gen-ai.alert-proposal.summary.trigger.interval": "间隔",
@@ -23,6 +23,7 @@ export declare const zh_Hant: {
23
23
  "gd.gen-ai.visualization.error.forecast": string;
24
24
  "gd.gen-ai.visualization.error.clustering": string;
25
25
  "gd.gen-ai.visualization.error.data_too_large": string;
26
+ "gd.gen-ai.visualization.unavailable": string;
26
27
  "gd.gen-ai.permission-error": string;
27
28
  "gd.gen-ai.permission-error.description": string;
28
29
  "gd.gen-ai.input-placeholder": string;
@@ -33,7 +34,6 @@ export declare const zh_Hant: {
33
34
  "gd.gen-ai.agent.unavailable": string;
34
35
  "gd.gen-ai.agent.unavailable.disabled-tooltip": string;
35
36
  "gd.gen-ai.agent.switched": string;
36
- "gd.gen-ai.agent.unknown": string;
37
37
  "gd.gen-ai.feedback.like": string;
38
38
  "gd.gen-ai.feedback.dislike": string;
39
39
  "gd.gen-ai.feedback.popup.title": string;
@@ -67,20 +67,32 @@ export declare const zh_Hant: {
67
67
  "gd.gen-ai.alert-proposal.summary.title": string;
68
68
  "gd.gen-ai.alert-proposal.summary.attributes": string;
69
69
  "gd.gen-ai.alert-proposal.summary.filters": string;
70
- "gd.gen-ai.alert-proposal.summary.metric": string;
71
- "gd.gen-ai.alert-proposal.summary.metric-compared": string;
72
70
  "gd.gen-ai.alert-proposal.summary.date": string;
73
71
  "gd.gen-ai.alert-proposal.summary.notification-channel": string;
74
72
  "gd.gen-ai.alert-proposal.summary.dashboard": string;
75
- "gd.gen-ai.alert-proposal.summary.operator": string;
76
- "gd.gen-ai.alert-proposal.summary.arithmeticOperator": string;
77
- "gd.gen-ai.alert-proposal.summary.threshold": string;
78
- "gd.gen-ai.alert-proposal.summary.range": string;
79
- "gd.gen-ai.alert-proposal.summary.from": string;
80
- "gd.gen-ai.alert-proposal.summary.to": string;
81
- "gd.gen-ai.alert-proposal.summary.granularity": string;
82
- "gd.gen-ai.alert-proposal.summary.sensitivity": string;
83
73
  "gd.gen-ai.alert-proposal.summary.recipients": string;
74
+ "gd.gen-ai.alert-proposal.summary.condition-comparison": string;
75
+ "gd.gen-ai.alert-proposal.summary.condition-relative": string;
76
+ "gd.gen-ai.alert-proposal.summary.condition-anomalyDetection": string;
77
+ "sdk.ui.genAi.alertProposal.operator.lessThan": string;
78
+ "sdk.ui.genAi.alertProposal.operator.lessThanOrEqualTo": string;
79
+ "sdk.ui.genAi.alertProposal.operator.greaterThan": string;
80
+ "sdk.ui.genAi.alertProposal.operator.greaterThanOrEqualTo": string;
81
+ "sdk.ui.genAi.alertProposal.operator.equalTo": string;
82
+ "sdk.ui.genAi.alertProposal.operator.increasesBy": string;
83
+ "sdk.ui.genAi.alertProposal.operator.decreasesBy": string;
84
+ "sdk.ui.genAi.alertProposal.operator.changesBy": string;
85
+ "sdk.ui.genAi.alertProposal.operator.change": string;
86
+ "sdk.ui.genAi.alertProposal.operator.difference": string;
87
+ "sdk.ui.genAi.alertProposal.granularity.hour": string;
88
+ "sdk.ui.genAi.alertProposal.granularity.day": string;
89
+ "sdk.ui.genAi.alertProposal.granularity.week": string;
90
+ "sdk.ui.genAi.alertProposal.granularity.month": string;
91
+ "sdk.ui.genAi.alertProposal.granularity.quarter": string;
92
+ "sdk.ui.genAi.alertProposal.granularity.year": string;
93
+ "sdk.ui.genAi.alertProposal.senstivity.low": string;
94
+ "sdk.ui.genAi.alertProposal.senstivity.medium": string;
95
+ "sdk.ui.genAi.alertProposal.senstivity.high": string;
84
96
  "gd.gen-ai.alert-proposal.summary.trigger": string;
85
97
  "gd.gen-ai.alert-proposal.summary.trigger.mode": string;
86
98
  "gd.gen-ai.alert-proposal.summary.trigger.interval": string;
@@ -1 +1 @@
1
- {"version":3,"file":"zh-Hant.localization-bundle.d.ts","sourceRoot":"","sources":["../../../src/localization/bundles/zh-Hant.localization-bundle.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsKnB,CAAC"}
1
+ {"version":3,"file":"zh-Hant.localization-bundle.d.ts","sourceRoot":"","sources":["../../../src/localization/bundles/zh-Hant.localization-bundle.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkLnB,CAAC"}
@@ -25,6 +25,7 @@ export const zh_Hant = {
25
25
  "gd.gen-ai.visualization.error.forecast": "<b>未收到預測:</b> {error}",
26
26
  "gd.gen-ai.visualization.error.clustering": "<b>未收到分群:</b> {error}",
27
27
  "gd.gen-ai.visualization.error.data_too_large": "<b>資料過大。</b> 請套用篩選條件以減少資料量。",
28
+ "gd.gen-ai.visualization.unavailable": "無法顯示可視化。",
28
29
  "gd.gen-ai.permission-error": "權限不足",
29
30
  "gd.gen-ai.permission-error.description": "您無權存取聊天機器人。請聯絡您的管理員申請存取權限。",
30
31
  "gd.gen-ai.input-placeholder": "在這裡詢問…",
@@ -35,7 +36,6 @@ export const zh_Hant = {
35
36
  "gd.gen-ai.agent.unavailable": "沒有可用的智能體",
36
37
  "gd.gen-ai.agent.unavailable.disabled-tooltip": "已停用 — 沒有可用的智能體。",
37
38
  "gd.gen-ai.agent.switched": "已切換至 {title} 智能體",
38
- "gd.gen-ai.agent.unknown": "未知",
39
39
  "gd.gen-ai.feedback.like": "將此訊息標記為有用",
40
40
  "gd.gen-ai.feedback.dislike": "將此訊息標記為無幫助",
41
41
  "gd.gen-ai.feedback.popup.title": "我們已收到您的回饋",
@@ -69,20 +69,32 @@ export const zh_Hant = {
69
69
  "gd.gen-ai.alert-proposal.summary.title": "標題",
70
70
  "gd.gen-ai.alert-proposal.summary.attributes": "屬性",
71
71
  "gd.gen-ai.alert-proposal.summary.filters": "過濾器",
72
- "gd.gen-ai.alert-proposal.summary.metric": "指標",
73
- "gd.gen-ai.alert-proposal.summary.metric-compared": "相比",
74
72
  "gd.gen-ai.alert-proposal.summary.date": "日期",
75
73
  "gd.gen-ai.alert-proposal.summary.notification-channel": "管道",
76
74
  "gd.gen-ai.alert-proposal.summary.dashboard": "儀表板",
77
- "gd.gen-ai.alert-proposal.summary.operator": "運算子",
78
- "gd.gen-ai.alert-proposal.summary.arithmeticOperator": "算術運算子",
79
- "gd.gen-ai.alert-proposal.summary.threshold": "臨界點",
80
- "gd.gen-ai.alert-proposal.summary.range": "範圍",
81
- "gd.gen-ai.alert-proposal.summary.from": "從",
82
- "gd.gen-ai.alert-proposal.summary.to": "到",
83
- "gd.gen-ai.alert-proposal.summary.granularity": "粒徑",
84
- "gd.gen-ai.alert-proposal.summary.sensitivity": "敏感度",
85
75
  "gd.gen-ai.alert-proposal.summary.recipients": "收件者",
76
+ "gd.gen-ai.alert-proposal.summary.condition-comparison": "比較",
77
+ "gd.gen-ai.alert-proposal.summary.condition-relative": "相對",
78
+ "gd.gen-ai.alert-proposal.summary.condition-anomalyDetection": "異常偵測",
79
+ "sdk.ui.genAi.alertProposal.operator.lessThan": "<",
80
+ "sdk.ui.genAi.alertProposal.operator.lessThanOrEqualTo": "<=",
81
+ "sdk.ui.genAi.alertProposal.operator.greaterThan": ">",
82
+ "sdk.ui.genAi.alertProposal.operator.greaterThanOrEqualTo": ">=",
83
+ "sdk.ui.genAi.alertProposal.operator.equalTo": "=",
84
+ "sdk.ui.genAi.alertProposal.operator.increasesBy": "增加",
85
+ "sdk.ui.genAi.alertProposal.operator.decreasesBy": "減少",
86
+ "sdk.ui.genAi.alertProposal.operator.changesBy": "變化",
87
+ "sdk.ui.genAi.alertProposal.operator.change": "-",
88
+ "sdk.ui.genAi.alertProposal.operator.difference": "%",
89
+ "sdk.ui.genAi.alertProposal.granularity.hour": "以<b>每小時</b>為基準",
90
+ "sdk.ui.genAi.alertProposal.granularity.day": "以<b>每日</b>為基準",
91
+ "sdk.ui.genAi.alertProposal.granularity.week": "以<b>每週</b>為基準",
92
+ "sdk.ui.genAi.alertProposal.granularity.month": "以<b>每月</b>為基準",
93
+ "sdk.ui.genAi.alertProposal.granularity.quarter": "以<b>每季</b>為基準",
94
+ "sdk.ui.genAi.alertProposal.granularity.year": "以<b>每年</b>為基準",
95
+ "sdk.ui.genAi.alertProposal.senstivity.low": "具有<b>低</b>敏感度",
96
+ "sdk.ui.genAi.alertProposal.senstivity.medium": "具有<b>中</b>敏感度",
97
+ "sdk.ui.genAi.alertProposal.senstivity.high": "具有<b>高</b>敏感度",
86
98
  "gd.gen-ai.alert-proposal.summary.trigger": "扳機",
87
99
  "gd.gen-ai.alert-proposal.summary.trigger.mode": "模式",
88
100
  "gd.gen-ai.alert-proposal.summary.trigger.interval": "間隔",
@@ -369,7 +369,7 @@ export declare type GenAIAssistantProps = Omit<GenAiStoreProps, "children"> & {
369
369
  * When provided, references to the metadata objects will be rendered as clickable links.
370
370
  * Otherwise, the metadata objects will be rendered as plain text (using object title).
371
371
  */
372
- onLinkClick?: (linkClickEvent: LinkHandlerEvent) => void;
372
+ onLinkClick?: (linkClickEvent: LinkHandlerEvent) => string | undefined;
373
373
  /**
374
374
  * When true, allows the chat to render links that open in a new tab or window. This
375
375
  * is handy only when embedding the chat in same environment where GD platform is running because
@@ -473,6 +473,14 @@ export declare type GenAiStoreProps = {
473
473
  * User settings to use for the chat UI.
474
474
  */
475
475
  settings?: IUserWorkspaceSettings;
476
+ /**
477
+ * Callback to handle link clicks.
478
+ */
479
+ onLinkClick?: (linkClickEvent: LinkHandlerEvent) => string | undefined;
480
+ /**
481
+ * Whether to allow native links to be opened in a new tab.
482
+ */
483
+ allowNativeLinks?: boolean;
476
484
  /**
477
485
  * Event handlers to subscribe to chat events.
478
486
  */
@@ -123,7 +123,9 @@ export declare const loadThreadAction: import("@reduxjs/toolkit").ActionCreatorW
123
123
  verbose: boolean;
124
124
  }, "messages/setVerboseAction">, setGlobalErrorAction: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
125
125
  error: Error;
126
- }, "messages/setGlobalErrorAction">, cancelAsyncAction: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"messages/cancelAsyncAction">, setUserFeedback: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
126
+ }, "messages/setGlobalErrorAction">, cancelAsyncAction: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"messages/cancelAsyncAction">, clearConversationLoadingAction: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
127
+ conversationLocalId?: string | undefined;
128
+ }, "messages/clearConversationLoadingAction">, setUserFeedback: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
127
129
  assistantMessageId: string;
128
130
  feedback: GenAIChatInteractionUserFeedback;
129
131
  userTextFeedback?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"messagesSlice.d.ts","sourceRoot":"","sources":["../../../src/store/messages/messagesSlice.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messagesSlice.d.ts","sourceRoot":"","sources":["../../../src/store/messages/messagesSlice.ts"],"names":[],"mappings":"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"}
@@ -563,6 +563,23 @@ const messagesSlice = createSlice({
563
563
  state.globalError = errorToObject(error);
564
564
  },
565
565
  cancelAsyncAction: (state) => {
566
+ // Aborting the in-flight thread load. A conversation switch can move
567
+ // currentConversation between load-start (loadThreadAction) and this cancel
568
+ // (the useThreadLoading cleanup runs after the new conversation is already
569
+ // current), so keying the clear only to the live current conversation would
570
+ // orphan the "loading" flag on the conversation that was actually loading -
571
+ // its skeleton then spins forever when it is reopened (LX-2577). Clear the
572
+ // load flag wherever it sits; there is only ever one load in flight.
573
+ if (state.messageAsyncProcess === "loading" || state.messageAsyncProcess === "restoring") {
574
+ delete state.messageAsyncProcess;
575
+ }
576
+ for (const data of Object.values(state.conversationsData)) {
577
+ if (data.asyncProcess === "loading" || data.asyncProcess === "restoring") {
578
+ delete data.asyncProcess;
579
+ }
580
+ }
581
+ // Preserve the original behaviour for the current conversation's non-load
582
+ // async states (e.g. "evaluating"/"clearing").
566
583
  if (state.currentConversation) {
567
584
  const data = getConversationData(state.conversationsData, state.currentConversation.localId);
568
585
  delete data?.asyncProcess;
@@ -571,6 +588,25 @@ const messagesSlice = createSlice({
571
588
  delete state.messageAsyncProcess;
572
589
  }
573
590
  },
591
+ /**
592
+ * Clear the "loading"/"restoring" flag for a specific conversation.
593
+ *
594
+ * Used when a thread load is superseded by a newer one (takeLatest cancels the
595
+ * running onThreadLoad saga without dispatching cancelAsyncAction). The clear must
596
+ * target the conversation that was actually loading - identified by its localId -
597
+ * rather than whichever conversation is current now, which may already have changed.
598
+ */
599
+ clearConversationLoadingAction: (state, { payload: { conversationLocalId } }) => {
600
+ if (conversationLocalId) {
601
+ const data = state.conversationsData[conversationLocalId];
602
+ if (data?.asyncProcess === "loading" || data?.asyncProcess === "restoring") {
603
+ delete data.asyncProcess;
604
+ }
605
+ }
606
+ else if (state.messageAsyncProcess === "loading" || state.messageAsyncProcess === "restoring") {
607
+ delete state.messageAsyncProcess;
608
+ }
609
+ },
574
610
  setUserFeedback: (state, { payload, }) => {
575
611
  const conversationId = getConversationLocalId(state.currentConversation);
576
612
  const assistantMessage = getAssistantMessageStrict(state, payload.assistantMessageId, conversationId);
@@ -818,7 +854,7 @@ const messagesSlice = createSlice({
818
854
  });
819
855
  const errorToObject = (error) => Object.fromEntries(Object.getOwnPropertyNames(error).map((key) => [key, error[key]]));
820
856
  export const messagesSliceReducer = messagesSlice.reducer;
821
- export const { loadThreadAction, loadThreadErrorAction, loadThreadSuccessAction, loadConversationsSuccessAction, loadConversationSuccessAction, restoreCachedMessagesAction, clearThreadErrorAction, clearThreadSuccessAction, clearConversationSuccessAction, evaluateConversationTitleAction, evaluateMessageAction, evaluateMessageErrorAction, evaluateMessageStreamingAction, evaluateMessageUpdateAction, evaluateMessageCompleteAction, setMessagesAction, setVerboseAction, setGlobalErrorAction, cancelAsyncAction, setUserFeedback, setUserFeedbackError, clearUserFeedbackError, saveVisualizationAction, savedVisualizationAction, saveVisualizationErrorAction, saveVisualizationSuccessAction, saveVisualisationRenderStatusAction, saveVisualisationRenderStatusSuccessAction, visualizationErrorAction, setSelectedAgentAction, applyPendingAgentSwitchAction, revertAgentSwitchAction, setAgentsAction, pinConversationAction, pinConversationSuccessAction, pinConversationFailureAction, renameConversationAction, renameConversationSuccessAction, renameConversationFailureAction, deleteConversationAction, deleteConversationStartAction, deleteConversationSuccessAction, deleteConversationFailureAction,
857
+ export const { loadThreadAction, loadThreadErrorAction, loadThreadSuccessAction, loadConversationsSuccessAction, loadConversationSuccessAction, restoreCachedMessagesAction, clearThreadErrorAction, clearThreadSuccessAction, clearConversationSuccessAction, evaluateConversationTitleAction, evaluateMessageAction, evaluateMessageErrorAction, evaluateMessageStreamingAction, evaluateMessageUpdateAction, evaluateMessageCompleteAction, setMessagesAction, setVerboseAction, setGlobalErrorAction, cancelAsyncAction, clearConversationLoadingAction, setUserFeedback, setUserFeedbackError, clearUserFeedbackError, saveVisualizationAction, savedVisualizationAction, saveVisualizationErrorAction, saveVisualizationSuccessAction, saveVisualisationRenderStatusAction, saveVisualisationRenderStatusSuccessAction, visualizationErrorAction, setSelectedAgentAction, applyPendingAgentSwitchAction, revertAgentSwitchAction, setAgentsAction, pinConversationAction, pinConversationSuccessAction, pinConversationFailureAction, renameConversationAction, renameConversationSuccessAction, renameConversationFailureAction, deleteConversationAction, deleteConversationStartAction, deleteConversationSuccessAction, deleteConversationFailureAction,
822
858
  /**
823
859
  * @public
824
860
  */
@@ -1,5 +1,6 @@
1
1
  import { 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
  /**
4
5
  * A dispatcher for chat events.
5
6
  * @internal
@@ -11,8 +12,15 @@ export declare class OptionsDispatcher {
11
12
  private includeTags;
12
13
  private excludeTags;
13
14
  private catalogItems;
15
+ private onLinkClick;
16
+ private allowNativeLinks;
14
17
  setColorPalette(colorPalette: IColorPalette | undefined): void;
15
18
  getColorPalette(): IColorPalette | undefined;
19
+ setOnLinkClick(onLinkClick?: (linkClickEvent: LinkHandlerEvent) => string | undefined, allowNativeLinks?: boolean): void;
20
+ getOnLinkClick(): {
21
+ onLinkClick?: (linkClickEvent: LinkHandlerEvent) => string | undefined;
22
+ allowNativeLinks?: boolean;
23
+ };
16
24
  setSettings(settings: IUserWorkspaceSettings | undefined): void;
17
25
  getSettings(): IUserWorkspaceSettings | undefined;
18
26
  setObjectTypes(objectTypes: GenAIObjectType[] | undefined): void;
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/store/options.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEjG;;;GAGG;AACH,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,QAAQ,CAAiD;IACjE,OAAO,CAAC,WAAW,CAA4C;IAC/D,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,YAAY,CAAwC;IAErD,eAAe,CAAC,YAAY,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI,CAEpE;IAEM,eAAe,IAAI,aAAa,GAAG,SAAS,CAElD;IAEM,WAAW,CAAC,QAAQ,EAAE,sBAAsB,GAAG,SAAS,GAAG,IAAI,CAErE;IAEM,WAAW,IAAI,sBAAsB,GAAG,SAAS,CAEvD;IAEM,cAAc,CAAC,WAAW,EAAE,eAAe,EAAE,GAAG,SAAS,GAAG,IAAI,CAEtE;IAEM,cAAc,IAAI,eAAe,EAAE,GAAG,SAAS,CAErD;IAEM,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,CAGzF;IAEM,OAAO,IAAI;QAAE,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;KAAE,CAKzF;IAEM,eAAe,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,SAAS,GAAG,IAAI,CAEpE;IAEM,eAAe,IAAI,WAAW,EAAE,GAAG,SAAS,CAElD;CACJ"}
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/store/options.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEjG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAEvE;;;GAGG;AACH,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,QAAQ,CAAiD;IACjE,OAAO,CAAC,WAAW,CAA4C;IAC/D,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,WAAW,CAAqF;IACxG,OAAO,CAAC,gBAAgB,CAAkC;IAEnD,eAAe,CAAC,YAAY,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI,CAEpE;IAEM,eAAe,IAAI,aAAa,GAAG,SAAS,CAElD;IAEM,cAAc,CACjB,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,KAAK,MAAM,GAAG,SAAS,EACtE,gBAAgB,CAAC,EAAE,OAAO,GAC3B,IAAI,CAGN;IAEM,cAAc,IAAI;QACrB,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,KAAK,MAAM,GAAG,SAAS,CAAC;QACvE,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC9B,CAKA;IAEM,WAAW,CAAC,QAAQ,EAAE,sBAAsB,GAAG,SAAS,GAAG,IAAI,CAErE;IAEM,WAAW,IAAI,sBAAsB,GAAG,SAAS,CAEvD;IAEM,cAAc,CAAC,WAAW,EAAE,eAAe,EAAE,GAAG,SAAS,GAAG,IAAI,CAEtE;IAEM,cAAc,IAAI,eAAe,EAAE,GAAG,SAAS,CAErD;IAEM,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,CAGzF;IAEM,OAAO,IAAI;QAAE,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;KAAE,CAKzF;IAEM,eAAe,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,SAAS,GAAG,IAAI,CAEpE;IAEM,eAAe,IAAI,WAAW,EAAE,GAAG,SAAS,CAElD;CACJ"}
@@ -10,12 +10,24 @@ export class OptionsDispatcher {
10
10
  includeTags = undefined;
11
11
  excludeTags = undefined;
12
12
  catalogItems = undefined;
13
+ onLinkClick = undefined;
14
+ allowNativeLinks = undefined;
13
15
  setColorPalette(colorPalette) {
14
16
  this.colorPalette = colorPalette;
15
17
  }
16
18
  getColorPalette() {
17
19
  return this.colorPalette;
18
20
  }
21
+ setOnLinkClick(onLinkClick, allowNativeLinks) {
22
+ this.onLinkClick = onLinkClick;
23
+ this.allowNativeLinks = allowNativeLinks;
24
+ }
25
+ getOnLinkClick() {
26
+ return {
27
+ onLinkClick: this.onLinkClick,
28
+ allowNativeLinks: this.allowNativeLinks,
29
+ };
30
+ }
19
31
  setSettings(settings) {
20
32
  this.settings = settings;
21
33
  }
@@ -1,10 +1,10 @@
1
1
  import { type IAnalyticalBackend, type IChatThreadHistory, type IUserWorkspaceSettings } from "@gooddata/sdk-backend-spi";
2
- import { type Message } from "../../model.js";
2
+ import { type IChatConversationLocal, type Message } from "../../model.js";
3
3
  /**
4
4
  * Load thread history and put it to the store.
5
5
  * @internal
6
6
  */
7
- export declare function onThreadLoad(): Generator<Generator<import("redux-saga/effects").CallEffect<void>, void, unknown> | Generator<import("redux-saga/effects").GetContextEffect | import("redux-saga/effects").PutEffect<{
7
+ export declare function onThreadLoad(): Generator<import("redux-saga/effects").CancelledEffect | Generator<import("redux-saga/effects").CallEffect<void>, void, unknown> | Generator<import("redux-saga/effects").GetContextEffect | import("redux-saga/effects").PutEffect<{
8
8
  payload: {
9
9
  messages: Message[];
10
10
  threadId: string;
@@ -23,7 +23,12 @@ export declare function onThreadLoad(): Generator<Generator<import("redux-saga/e
23
23
  error: Error;
24
24
  };
25
25
  type: "messages/loadThreadErrorAction";
26
- }> | import("redux-saga/effects").SelectEffect, void, IUserWorkspaceSettings | undefined>;
26
+ }> | import("redux-saga/effects").PutEffect<{
27
+ payload: {
28
+ conversationLocalId?: string | undefined;
29
+ };
30
+ type: "messages/clearConversationLoadingAction";
31
+ }> | import("redux-saga/effects").SelectEffect, void, (IChatConversationLocal | undefined) & ((IUserWorkspaceSettings & false) | (IUserWorkspaceSettings & true))>;
27
32
  /**
28
33
  * Merge backend-loaded messages with cached messages.
29
34
  * For each assistant message from the backend, if its content is missing semanticSearch
@@ -1 +1 @@
1
- {"version":3,"file":"onThreadLoad.d.ts","sourceRoot":"","sources":["../../../src/store/sideEffects/onThreadLoad.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,KAAK,kBAAkB,EAKvB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC9B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAKH,KAAK,OAAO,EAIf,MAAM,gBAAgB,CAAC;AAsBxB;;;GAGG;AACH,wBAAiB,YAAY;;;;;;;;;;;;;;;;;;;0FAW5B;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,eAAe,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CA+B/F"}
1
+ {"version":3,"file":"onThreadLoad.d.ts","sourceRoot":"","sources":["../../../src/store/sideEffects/onThreadLoad.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,KAAK,kBAAkB,EAKvB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC9B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAGH,KAAK,sBAAsB,EAE3B,KAAK,OAAO,EAIf,MAAM,gBAAgB,CAAC;AAuBxB;;;GAGG;AACH,wBAAiB,YAAY;;;;;;;;;;;;;;;;;;;;;;;;mKAoC5B;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,eAAe,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CA+B/F"}
@@ -4,7 +4,7 @@ import { isAssistantMessage, isSemanticSearchContents, makeConversationItem, } f
4
4
  import { settingsSelector } from "../chatWindow/chatWindowSelectors.js";
5
5
  import { loadMessages } from "../localStorage.js";
6
6
  import { conversationMessagesByIdSelector, conversationSelector, conversationsLoadedSelector, conversationsSelector, } from "../messages/messagesSelectors.js";
7
- import { cancelAsyncAction, loadConversationSuccessAction, loadConversationsSuccessAction, loadThreadErrorAction, loadThreadSuccessAction, restoreCachedMessagesAction, } from "../messages/messagesSlice.js";
7
+ import { cancelAsyncAction, clearConversationLoadingAction, loadConversationSuccessAction, loadConversationsSuccessAction, loadThreadErrorAction, loadThreadSuccessAction, restoreCachedMessagesAction, } from "../messages/messagesSlice.js";
8
8
  import { createEmptyConversation } from "../utils.js";
9
9
  import { interactionsToMessages } from "./converters/interactionsToMessages.js";
10
10
  import { convertToLocalContent } from "./converters/toLocalContent.js";
@@ -13,6 +13,13 @@ import { convertToLocalContent } from "./converters/toLocalContent.js";
13
13
  * @internal
14
14
  */
15
15
  export function* onThreadLoad() {
16
+ // Remember which conversation this load marked as "loading" (loadThreadAction keyed the
17
+ // flag to the conversation that was current when this saga was dispatched). If a newer
18
+ // load supersedes us, takeLatest cancels this saga without dispatching cancelAsyncAction,
19
+ // so we must clear that conversation's flag ourselves - otherwise its skeleton spins
20
+ // forever when reopened (LX-2577).
21
+ const loadingConversation = yield select(conversationSelector);
22
+ const loadingConversationLocalId = loadingConversation?.localId;
16
23
  try {
17
24
  const settings = yield select(settingsSelector);
18
25
  if (settings?.enableAiAgenticConversations) {
@@ -25,6 +32,22 @@ export function* onThreadLoad() {
25
32
  catch (e) {
26
33
  yield put(loadThreadErrorAction({ error: e }));
27
34
  }
35
+ finally {
36
+ const wasCancelled = yield cancelled();
37
+ if (wasCancelled) {
38
+ // Only clear when the load was genuinely orphaned, i.e. the conversation we were
39
+ // loading is no longer the current one (the user switched away mid-load). When a
40
+ // newer load supersedes us on the SAME conversation - e.g. a split layout mounts
41
+ // both GenAIConversations and GenAIAssistant and each useThreadLoading dispatches
42
+ // loadThreadAction - the replacement saga has already re-set the "loading" flag and
43
+ // is still fetching, so clearing it here would prematurely hide the skeleton and
44
+ // re-enable the input.
45
+ const currentConversation = yield select(conversationSelector);
46
+ if (currentConversation?.localId !== loadingConversationLocalId) {
47
+ yield put(clearConversationLoadingAction({ conversationLocalId: loadingConversationLocalId }));
48
+ }
49
+ }
50
+ }
28
51
  }
29
52
  /**
30
53
  * Merge backend-loaded messages with cached messages.
@@ -1,12 +1,13 @@
1
1
  import { type PayloadAction } from "@reduxjs/toolkit";
2
2
  import { type IAnalyticalBackend, type IUserWorkspaceSettings } from "@gooddata/sdk-backend-spi";
3
3
  import { type Message } from "../../model.js";
4
+ import { type OptionsDispatcher } from "../options.js";
4
5
  export declare function onVisualizationSuccessSave({ payload }: PayloadAction<{
5
6
  visualizationId: string;
6
7
  assistantMessageId: string;
7
8
  savedVisualizationId: string;
8
9
  explore: boolean;
9
- }>): Generator<import("redux-saga/effects").CallEffect<void> | import("redux-saga/effects").GetContextEffect | import("redux-saga/effects").SelectEffect, void, IAnalyticalBackend & string & import("@gooddata/sdk-backend-spi").IChatConversation & {
10
+ }>): Generator<import("redux-saga/effects").CallEffect<void> | import("redux-saga/effects").GetContextEffect | import("redux-saga/effects").SelectEffect, void, IAnalyticalBackend & string & OptionsDispatcher & import("@gooddata/sdk-backend-spi").IChatConversation & {
10
11
  localId: string;
11
12
  generatingTitle?: boolean | undefined;
12
13
  inProgress?: boolean | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"onVisualizationSuccessSave.d.ts","sourceRoot":"","sources":["../../../src/store/sideEffects/onVisualizationSuccessSave.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGtD,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAGjG,OAAO,EAA+B,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAK3E,wBAAiB,0BAA0B,CAAC,EACxC,OAAO,EACV,EAAE,aAAa,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;CACpB,CAAC;;;;wCAyCD"}
1
+ {"version":3,"file":"onVisualizationSuccessSave.d.ts","sourceRoot":"","sources":["../../../src/store/sideEffects/onVisualizationSuccessSave.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAItD,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAGjG,OAAO,EAA+B,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAI3E,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,wBAAiB,0BAA0B,CAAC,EACxC,OAAO,EACV,EAAE,aAAa,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;CACpB,CAAC;;;;wCA0ED"}
@@ -1,4 +1,5 @@
1
1
  // (C) 2025-2026 GoodData Corporation
2
+ import noop from "lodash-es/noop.js";
2
3
  import { call, getContext, select } from "redux-saga/effects";
3
4
  import { getVisualizationHref } from "../../utils.js";
4
5
  import { settingsSelector } from "../chatWindow/chatWindowSelectors.js";
@@ -7,12 +8,26 @@ export function* onVisualizationSuccessSave({ payload, }) {
7
8
  // Retrieve backend from context
8
9
  const backend = yield getContext("backend");
9
10
  const workspace = yield getContext("workspace");
11
+ const options = yield getContext("optionsDispatcher");
10
12
  const conversation = yield select(conversationSelector);
11
13
  const settings = yield select(settingsSelector);
12
14
  const useHostedAnalyticalDesigner = Boolean(settings?.enableShellApplication_analyticalDesigner);
15
+ const { onLinkClick, allowNativeLinks } = options.getOnLinkClick();
13
16
  if (conversation) {
14
17
  if (payload.explore) {
15
- window.location.href = getVisualizationHref(workspace, payload.savedVisualizationId, useHostedAnalyticalDesigner);
18
+ if (allowNativeLinks) {
19
+ window.location.href = getVisualizationHref(workspace, payload.savedVisualizationId, useHostedAnalyticalDesigner);
20
+ }
21
+ else {
22
+ onLinkClick?.({
23
+ id: payload.savedVisualizationId,
24
+ type: "visualization",
25
+ workspaceId: workspace,
26
+ newTab: true,
27
+ preventDefault: noop,
28
+ itemUrl: getVisualizationHref(workspace, payload.savedVisualizationId, useHostedAnalyticalDesigner),
29
+ });
30
+ }
16
31
  }
17
32
  //NOTE: In new conversations, save call is already done before
18
33
  }
@@ -20,7 +35,19 @@ export function* onVisualizationSuccessSave({ payload, }) {
20
35
  const messages = yield select(messagesSelector);
21
36
  const message = messages.find((message) => message.localId === payload.assistantMessageId);
22
37
  if (payload.explore) {
23
- window.location.href = getVisualizationHref(workspace, payload.savedVisualizationId, useHostedAnalyticalDesigner);
38
+ if (allowNativeLinks) {
39
+ window.location.href = getVisualizationHref(workspace, payload.savedVisualizationId, useHostedAnalyticalDesigner);
40
+ }
41
+ else {
42
+ onLinkClick?.({
43
+ id: payload.savedVisualizationId,
44
+ type: "visualization",
45
+ workspaceId: workspace,
46
+ newTab: true,
47
+ preventDefault: noop,
48
+ itemUrl: getVisualizationHref(workspace, payload.savedVisualizationId, useHostedAnalyticalDesigner),
49
+ });
50
+ }
24
51
  }
25
52
  if (!message?.id) {
26
53
  return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gooddata/sdk-ui-gen-ai",
3
- "version": "11.43.0-alpha.2",
3
+ "version": "11.43.0-alpha.4",
4
4
  "description": "GoodData GenAI SDK",
5
5
  "license": "MIT",
6
6
  "author": "GoodData Corporation",
@@ -56,18 +56,18 @@
56
56
  "reselect": "5.1.1",
57
57
  "tslib": "2.8.1",
58
58
  "uuid": "11.1.1",
59
- "@gooddata/api-client-tiger": "11.43.0-alpha.2",
60
- "@gooddata/sdk-ui": "11.43.0-alpha.2",
61
- "@gooddata/sdk-backend-spi": "11.43.0-alpha.2",
62
- "@gooddata/sdk-ui-charts": "11.43.0-alpha.2",
63
- "@gooddata/sdk-model": "11.43.0-alpha.2",
64
- "@gooddata/sdk-ui-dashboard": "11.43.0-alpha.2",
65
- "@gooddata/sdk-ui-filters": "11.43.0-alpha.2",
66
- "@gooddata/sdk-ui-kit": "11.43.0-alpha.2",
67
- "@gooddata/sdk-ui-semantic-search": "11.43.0-alpha.2",
68
- "@gooddata/sdk-ui-theme-provider": "11.43.0-alpha.2",
69
- "@gooddata/sdk-ui-pivot": "11.43.0-alpha.2",
70
- "@gooddata/util": "11.43.0-alpha.2"
59
+ "@gooddata/api-client-tiger": "11.43.0-alpha.4",
60
+ "@gooddata/sdk-backend-spi": "11.43.0-alpha.4",
61
+ "@gooddata/sdk-model": "11.43.0-alpha.4",
62
+ "@gooddata/sdk-ui": "11.43.0-alpha.4",
63
+ "@gooddata/sdk-ui-charts": "11.43.0-alpha.4",
64
+ "@gooddata/sdk-ui-dashboard": "11.43.0-alpha.4",
65
+ "@gooddata/sdk-ui-filters": "11.43.0-alpha.4",
66
+ "@gooddata/sdk-ui-kit": "11.43.0-alpha.4",
67
+ "@gooddata/sdk-ui-semantic-search": "11.43.0-alpha.4",
68
+ "@gooddata/sdk-ui-pivot": "11.43.0-alpha.4",
69
+ "@gooddata/sdk-ui-theme-provider": "11.43.0-alpha.4",
70
+ "@gooddata/util": "11.43.0-alpha.4"
71
71
  },
72
72
  "devDependencies": {
73
73
  "@microsoft/api-documenter": "^7.17.0",
@@ -110,13 +110,13 @@
110
110
  "typescript": "5.9.3",
111
111
  "vitest": "4.1.8",
112
112
  "vitest-dom": "0.1.1",
113
- "@gooddata/eslint-config": "11.43.0-alpha.2",
114
- "@gooddata/i18n-toolkit": "11.43.0-alpha.2",
115
- "@gooddata/reference-workspace": "11.43.0-alpha.2",
116
- "@gooddata/oxlint-config": "11.43.0-alpha.2",
117
- "@gooddata/sdk-ui-theme-provider": "11.43.0-alpha.2",
118
- "@gooddata/stylelint-config": "11.43.0-alpha.2",
119
- "@gooddata/sdk-backend-mockingbird": "11.43.0-alpha.2"
113
+ "@gooddata/eslint-config": "11.43.0-alpha.4",
114
+ "@gooddata/i18n-toolkit": "11.43.0-alpha.4",
115
+ "@gooddata/oxlint-config": "11.43.0-alpha.4",
116
+ "@gooddata/reference-workspace": "11.43.0-alpha.4",
117
+ "@gooddata/sdk-backend-mockingbird": "11.43.0-alpha.4",
118
+ "@gooddata/sdk-ui-theme-provider": "11.43.0-alpha.4",
119
+ "@gooddata/stylelint-config": "11.43.0-alpha.4"
120
120
  },
121
121
  "peerDependencies": {
122
122
  "react": "^18.0.0 || ^19.0.0",
@@ -13852,6 +13852,24 @@ body.gd-kda-dialog-opened .highcharts-tooltip-container {
13852
13852
  .gd-gen-ai-chat__messages__conversation-group--content .gd-gen-ai-chat__messages__conversation--isLast .gd-gen-ai-chat__icon .gd-gen-ai-chat__icon__special {
13853
13853
  animation: pulsate-opacity 1s infinite ease-in-out;
13854
13854
  }
13855
+ .gd-gen-ai-chat__messages__conversation-group--content--loading {
13856
+ position: relative;
13857
+ padding-left: 15px;
13858
+ }
13859
+ .gd-gen-ai-chat__messages__conversation-group--content--loading::before {
13860
+ content: "";
13861
+ position: absolute;
13862
+ left: 5px;
13863
+ top: 0;
13864
+ bottom: 16px;
13865
+ width: 1px;
13866
+ background-color: var(--gd-palette-complementary-6, #94a1ad);
13867
+ opacity: 0.3;
13868
+ }
13869
+ .gd-gen-ai-chat__messages__conversation-group--content--loading--spinner svg {
13870
+ width: 16px;
13871
+ height: 16px;
13872
+ }
13855
13873
 
13856
13874
  .gd-gen-ai-chat__messages__conversation {
13857
13875
  display: flex;