@gooddata/sdk-ui-gen-ai 11.52.0 → 11.53.0-alpha.1

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 (144) hide show
  1. package/NOTICE +59 -9
  2. package/esm/components/ConfigContext.d.ts +1 -0
  3. package/esm/components/ConfigContext.d.ts.map +1 -1
  4. package/esm/components/GenAIChat.d.ts.map +1 -1
  5. package/esm/components/GenAIChat.js +2 -2
  6. package/esm/components/GenAiStore.d.ts +9 -0
  7. package/esm/components/GenAiStore.d.ts.map +1 -1
  8. package/esm/components/GenAiStore.js +2 -1
  9. package/esm/components/intelligence/GenAiInteractionIntelligence.d.ts +21 -0
  10. package/esm/components/intelligence/GenAiInteractionIntelligence.d.ts.map +1 -0
  11. package/esm/components/intelligence/GenAiInteractionIntelligence.js +57 -0
  12. package/esm/components/intelligence/InteractionIntelligenceTrigger.d.ts +15 -0
  13. package/esm/components/intelligence/InteractionIntelligenceTrigger.d.ts.map +1 -0
  14. package/esm/components/intelligence/InteractionIntelligenceTrigger.js +19 -0
  15. package/esm/components/intelligence/data/categoryDetailRows.d.ts +12 -0
  16. package/esm/components/intelligence/data/categoryDetailRows.d.ts.map +1 -0
  17. package/esm/components/intelligence/data/categoryDetailRows.js +206 -0
  18. package/esm/components/intelligence/data/constants.d.ts +22 -0
  19. package/esm/components/intelligence/data/constants.d.ts.map +1 -0
  20. package/esm/components/intelligence/data/constants.js +27 -0
  21. package/esm/components/intelligence/data/deriveInteractionIntelligenceFromSteps.d.ts +23 -0
  22. package/esm/components/intelligence/data/deriveInteractionIntelligenceFromSteps.d.ts.map +1 -0
  23. package/esm/components/intelligence/data/deriveInteractionIntelligenceFromSteps.js +109 -0
  24. package/esm/components/intelligence/data/mergeDetailRows.d.ts +15 -0
  25. package/esm/components/intelligence/data/mergeDetailRows.d.ts.map +1 -0
  26. package/esm/components/intelligence/data/mergeDetailRows.js +91 -0
  27. package/esm/components/intelligence/data/timeline.d.ts +18 -0
  28. package/esm/components/intelligence/data/timeline.d.ts.map +1 -0
  29. package/esm/components/intelligence/data/timeline.js +40 -0
  30. package/esm/components/intelligence/data/types.d.ts +159 -0
  31. package/esm/components/intelligence/data/types.d.ts.map +1 -0
  32. package/esm/components/intelligence/data/types.js +2 -0
  33. package/esm/components/intelligence/data/useInteractionIntelligenceData.d.ts +9 -0
  34. package/esm/components/intelligence/data/useInteractionIntelligenceData.d.ts.map +1 -0
  35. package/esm/components/intelligence/data/useInteractionIntelligenceData.js +20 -0
  36. package/esm/components/intelligence/data/useInteractionIntelligenceTotals.d.ts +9 -0
  37. package/esm/components/intelligence/data/useInteractionIntelligenceTotals.d.ts.map +1 -0
  38. package/esm/components/intelligence/data/useInteractionIntelligenceTotals.js +20 -0
  39. package/esm/components/intelligence/detail/DetailRowValue.d.ts +10 -0
  40. package/esm/components/intelligence/detail/DetailRowValue.d.ts.map +1 -0
  41. package/esm/components/intelligence/detail/DetailRowValue.js +23 -0
  42. package/esm/components/intelligence/detail/IntelligenceCategoryDetail.d.ts +17 -0
  43. package/esm/components/intelligence/detail/IntelligenceCategoryDetail.d.ts.map +1 -0
  44. package/esm/components/intelligence/detail/IntelligenceCategoryDetail.js +21 -0
  45. package/esm/components/intelligence/detail/IntelligenceDetailHeader.d.ts +12 -0
  46. package/esm/components/intelligence/detail/IntelligenceDetailHeader.d.ts.map +1 -0
  47. package/esm/components/intelligence/detail/IntelligenceDetailHeader.js +19 -0
  48. package/esm/components/intelligence/detail/IntelligenceDetailRows.d.ts +11 -0
  49. package/esm/components/intelligence/detail/IntelligenceDetailRows.d.ts.map +1 -0
  50. package/esm/components/intelligence/detail/IntelligenceDetailRows.js +16 -0
  51. package/esm/components/intelligence/detail/IntelligenceStepCarousel.d.ts +12 -0
  52. package/esm/components/intelligence/detail/IntelligenceStepCarousel.d.ts.map +1 -0
  53. package/esm/components/intelligence/detail/IntelligenceStepCarousel.js +21 -0
  54. package/esm/components/intelligence/format/formatDuration.d.ts +23 -0
  55. package/esm/components/intelligence/format/formatDuration.d.ts.map +1 -0
  56. package/esm/components/intelligence/format/formatDuration.js +38 -0
  57. package/esm/components/intelligence/format/formatTokens.d.ts +8 -0
  58. package/esm/components/intelligence/format/formatTokens.d.ts.map +1 -0
  59. package/esm/components/intelligence/format/formatTokens.js +10 -0
  60. package/esm/components/intelligence/format/resolveMessage.d.ts +9 -0
  61. package/esm/components/intelligence/format/resolveMessage.d.ts.map +1 -0
  62. package/esm/components/intelligence/format/resolveMessage.js +10 -0
  63. package/esm/components/intelligence/intelligenceBem.d.ts +7 -0
  64. package/esm/components/intelligence/intelligenceBem.d.ts.map +1 -0
  65. package/esm/components/intelligence/intelligenceBem.js +8 -0
  66. package/esm/components/intelligence/panel/IconCircle.d.ts +10 -0
  67. package/esm/components/intelligence/panel/IconCircle.d.ts.map +1 -0
  68. package/esm/components/intelligence/panel/IconCircle.js +12 -0
  69. package/esm/components/intelligence/panel/IntelligenceCategoryList.d.ts +13 -0
  70. package/esm/components/intelligence/panel/IntelligenceCategoryList.d.ts.map +1 -0
  71. package/esm/components/intelligence/panel/IntelligenceCategoryList.js +10 -0
  72. package/esm/components/intelligence/panel/IntelligenceCategoryRow.d.ts +14 -0
  73. package/esm/components/intelligence/panel/IntelligenceCategoryRow.d.ts.map +1 -0
  74. package/esm/components/intelligence/panel/IntelligenceCategoryRow.js +19 -0
  75. package/esm/components/intelligence/panel/IntelligenceDurationTokens.d.ts +12 -0
  76. package/esm/components/intelligence/panel/IntelligenceDurationTokens.d.ts.map +1 -0
  77. package/esm/components/intelligence/panel/IntelligenceDurationTokens.js +19 -0
  78. package/esm/components/intelligence/panel/IntelligenceFooter.d.ts +10 -0
  79. package/esm/components/intelligence/panel/IntelligenceFooter.d.ts.map +1 -0
  80. package/esm/components/intelligence/panel/IntelligenceFooter.js +20 -0
  81. package/esm/components/intelligence/panel/IntelligenceHeader.d.ts +8 -0
  82. package/esm/components/intelligence/panel/IntelligenceHeader.d.ts.map +1 -0
  83. package/esm/components/intelligence/panel/IntelligenceHeader.js +15 -0
  84. package/esm/components/intelligence/panel/IntelligenceStepTooltip.d.ts +12 -0
  85. package/esm/components/intelligence/panel/IntelligenceStepTooltip.d.ts.map +1 -0
  86. package/esm/components/intelligence/panel/IntelligenceStepTooltip.js +18 -0
  87. package/esm/components/intelligence/panel/IntelligenceTimeline.d.ts +15 -0
  88. package/esm/components/intelligence/panel/IntelligenceTimeline.d.ts.map +1 -0
  89. package/esm/components/intelligence/panel/IntelligenceTimeline.js +16 -0
  90. package/esm/components/intelligence/panel/TimelineBar.d.ts +19 -0
  91. package/esm/components/intelligence/panel/TimelineBar.d.ts.map +1 -0
  92. package/esm/components/intelligence/panel/TimelineBar.js +34 -0
  93. package/esm/components/messages/AssistantItem.d.ts.map +1 -1
  94. package/esm/components/messages/AssistantItem.js +15 -1
  95. package/esm/components/messages/AssistantItemFeedback.d.ts +6 -1
  96. package/esm/components/messages/AssistantItemFeedback.d.ts.map +1 -1
  97. package/esm/components/messages/AssistantItemFeedback.js +9 -2
  98. package/esm/components/messages/ConversationItemContents.d.ts.map +1 -1
  99. package/esm/components/messages/ConversationItemContents.js +1 -1
  100. package/esm/components/messages/conversationContents/ConversationDashboardContent.d.ts +2 -1
  101. package/esm/components/messages/conversationContents/ConversationDashboardContent.d.ts.map +1 -1
  102. package/esm/components/messages/conversationContents/ConversationDashboardContent.js +3 -2
  103. package/esm/context/dashboard.d.ts +2 -2
  104. package/esm/context/dashboard.d.ts.map +1 -1
  105. package/esm/context/dashboard.js +5 -2
  106. package/esm/hooks/useGenAIStore.d.ts +1 -0
  107. package/esm/hooks/useGenAIStore.d.ts.map +1 -1
  108. package/esm/hooks/useGenAIStore.js +3 -3
  109. package/esm/index.d.ts +2 -0
  110. package/esm/index.d.ts.map +1 -1
  111. package/esm/index.js +2 -0
  112. package/esm/localization/bundles/en-US.localization-bundle.d.ts +184 -0
  113. package/esm/localization/bundles/en-US.localization-bundle.d.ts.map +1 -1
  114. package/esm/localization/bundles/en-US.localization-bundle.js +184 -0
  115. package/esm/sdk-ui-gen-ai.d.ts +37 -0
  116. package/esm/store/chatWindow/chatWindowSelectors.d.ts +2 -0
  117. package/esm/store/chatWindow/chatWindowSelectors.d.ts.map +1 -1
  118. package/esm/store/chatWindow/chatWindowSelectors.js +5 -0
  119. package/esm/store/chatWindow/chatWindowSlice.d.ts +7 -1
  120. package/esm/store/chatWindow/chatWindowSlice.d.ts.map +1 -1
  121. package/esm/store/chatWindow/chatWindowSlice.js +3 -1
  122. package/esm/store/messages/messagesSelectors.d.ts +6 -0
  123. package/esm/store/messages/messagesSelectors.d.ts.map +1 -1
  124. package/esm/store/messages/messagesSelectors.js +9 -0
  125. package/esm/store/messages/messagesSlice.d.ts +11 -3
  126. package/esm/store/messages/messagesSlice.d.ts.map +1 -1
  127. package/esm/store/messages/messagesSlice.js +34 -1
  128. package/esm/store/sideEffects/onUserMessage.d.ts.map +1 -1
  129. package/esm/store/sideEffects/onUserMessage.js +40 -6
  130. package/esm/store/store.d.ts +1 -1
  131. package/esm/store/store.d.ts.map +1 -1
  132. package/esm/store/store.js +2 -2
  133. package/esm/types.d.ts +33 -1
  134. package/esm/types.d.ts.map +1 -1
  135. package/package.json +20 -20
  136. package/styles/css/intelligence.css +302 -0
  137. package/styles/css/intelligence.css.map +1 -0
  138. package/styles/css/main.css +306 -1
  139. package/styles/css/main.css.map +1 -1
  140. package/styles/css/messages.css +5 -1
  141. package/styles/css/messages.css.map +1 -1
  142. package/styles/scss/intelligence.scss +330 -0
  143. package/styles/scss/main.scss +1 -0
  144. package/styles/scss/messages.scss +10 -1
package/NOTICE CHANGED
@@ -7,9 +7,9 @@
7
7
 
8
8
  The following 3rd-party software packages may be used by or distributed with gooddata-ui-sdk. Any information relevant to third-party vendors listed below are collected using common, reasonable means.
9
9
 
10
- Date generated: 2026-8-10
10
+ Date generated: 2026-8-13
11
11
 
12
- Revision ID: df24fd6388dc31e841cd593b9a048731ec44afec
12
+ Revision ID: 03b276147864f291b2ed2694a19ccbfa1d69ce6b
13
13
 
14
14
  ================================================================================
15
15
  ================================================================================
@@ -126,6 +126,7 @@ Revision ID: df24fd6388dc31e841cd593b9a048731ec44afec
126
126
  - @cacheable/utils (2.5.0) [MIT]
127
127
  - @codemirror/autocomplete (6.20.0) [MIT]
128
128
  - @codemirror/commands (6.10.1) [MIT]
129
+ - @codemirror/lang-json (6.0.2) [MIT]
129
130
  - @codemirror/lang-yaml (6.1.3) [MIT]
130
131
  - @codemirror/language (6.12.1) [MIT]
131
132
  - @codemirror/lint (6.9.2) [MIT]
@@ -219,6 +220,7 @@ Revision ID: df24fd6388dc31e841cd593b9a048731ec44afec
219
220
  - @leichtgewicht/ip-codec (2.0.5) [MIT]
220
221
  - @lezer/common (1.5.2) [MIT]
221
222
  - @lezer/highlight (1.2.3) [MIT]
223
+ - @lezer/json (1.0.3) [MIT]
222
224
  - @lezer/lr (1.4.10) [MIT]
223
225
  - @lezer/yaml (1.0.4) [MIT]
224
226
  - @mapbox/geojson-rewind (0.5.2) [ISC]
@@ -945,7 +947,7 @@ Revision ID: df24fd6388dc31e841cd593b9a048731ec44afec
945
947
  - source-map-js (1.2.1) [BSD-3-Clause]
946
948
  - source-map-support (0.5.21) [MIT]
947
949
  - space-separated-tokens (2.0.2) [MIT]
948
- - spark-md5 (3.0.2) [Multi-license: MIT OR WTFPL]
950
+ - spark-md5 (3.0.2) [Multi-license: WTFPL OR MIT]
949
951
  - spdy (4.0.2) [MIT]
950
952
  - spdy-transport (3.0.0) [MIT]
951
953
  - statuses (1.5.0) [MIT]
@@ -978,7 +980,7 @@ Revision ID: df24fd6388dc31e841cd593b9a048731ec44afec
978
980
  - tar (7.5.22) [ISC]
979
981
  - terser (5.49.0) [BSD-2-Clause]
980
982
  - terser-webpack-plugin (5.6.1) [MIT]
981
- - text-encoding (0.7.0) [Multi-license: Apache-2.0 OR Unlicense]
983
+ - text-encoding (0.7.0) [Multi-license: Unlicense OR Apache-2.0]
982
984
  - thingies (2.6.1) [MIT]
983
985
  - thunky (1.1.0) [MIT]
984
986
  - tinycolor2 (1.6.0) [MIT]
@@ -999,7 +1001,7 @@ Revision ID: df24fd6388dc31e841cd593b9a048731ec44afec
999
1001
  - tslib (2.8.1) [ISC]
1000
1002
  - tslib (1.14.1) [ISC]
1001
1003
  - tsyringe (4.10.0) [MIT]
1002
- - type-fest (0.21.3) [Multi-license: MIT OR CC0-1.0]
1004
+ - type-fest (0.21.3) [Multi-license: CC0-1.0 OR MIT]
1003
1005
  - type-is (1.6.18) [MIT]
1004
1006
  - typescript (5.9.3) [Apache-2.0, MIT, Unicode-DFS-2020, CC-BY-4.0, BSD-3-Clause, W3C-20150513]
1005
1007
  - undici-types (6.21.0) [MIT]
@@ -2288,6 +2290,18 @@ Package Depth: Direct
2288
2290
  MIT
2289
2291
 
2290
2292
 
2293
+ --------------------------------------------------------------------------------
2294
+ Package Title: @codemirror/lang-json (6.0.2)
2295
+
2296
+ Package Locator: npm+@codemirror/lang-json$6.0.2
2297
+
2298
+ Package Depth: Direct
2299
+ --------------------------------------------------------------------------------
2300
+
2301
+ * Declared Licenses *
2302
+ MIT
2303
+
2304
+
2291
2305
  --------------------------------------------------------------------------------
2292
2306
  Package Title: @codemirror/lang-yaml (6.1.3)
2293
2307
 
@@ -3416,6 +3430,18 @@ Package Depth: Direct
3416
3430
  MIT
3417
3431
 
3418
3432
 
3433
+ --------------------------------------------------------------------------------
3434
+ Package Title: @lezer/json (1.0.3)
3435
+
3436
+ Package Locator: npm+@lezer/json$1.0.3
3437
+
3438
+ Package Depth: Transitive
3439
+ --------------------------------------------------------------------------------
3440
+
3441
+ * Declared Licenses *
3442
+ MIT
3443
+
3444
+
3419
3445
  --------------------------------------------------------------------------------
3420
3446
  Package Title: @lezer/lr (1.4.10)
3421
3447
 
@@ -12217,7 +12243,7 @@ Package Depth: Direct
12217
12243
  --------------------------------------------------------------------------------
12218
12244
 
12219
12245
  * Declared Licenses *
12220
- Multi-license: MIT OR WTFPL
12246
+ Multi-license: WTFPL OR MIT
12221
12247
 
12222
12248
 
12223
12249
  --------------------------------------------------------------------------------
@@ -12613,7 +12639,7 @@ Package Depth: Transitive
12613
12639
  --------------------------------------------------------------------------------
12614
12640
 
12615
12641
  * Declared Licenses *
12616
- Multi-license: Apache-2.0 OR Unlicense
12642
+ Multi-license: Unlicense OR Apache-2.0
12617
12643
 
12618
12644
 
12619
12645
  --------------------------------------------------------------------------------
@@ -12869,7 +12895,7 @@ Package Depth: Transitive
12869
12895
  --------------------------------------------------------------------------------
12870
12896
 
12871
12897
  * Declared Licenses *
12872
- Multi-license: MIT OR CC0-1.0
12898
+ Multi-license: CC0-1.0 OR MIT
12873
12899
 
12874
12900
 
12875
12901
  --------------------------------------------------------------------------------
@@ -22283,6 +22309,30 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22283
22309
  THE SOFTWARE.
22284
22310
 
22285
22311
 
22312
+ * MIT *
22313
+
22314
+ MIT License
22315
+
22316
+ Copyright (C) 2020 by Marijn Haverbeke <marijn@haverbeke.berlin>, Arun Srinivasan <rulfzid@gmail.com>, and others
22317
+
22318
+ Permission is hereby granted, free of charge, to any person obtaining a copy
22319
+ of this software and associated documentation files (the "Software"), to deal
22320
+ in the Software without restriction, including without limitation the rights
22321
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
22322
+ copies of the Software, and to permit persons to whom the Software is
22323
+ furnished to do so, subject to the following conditions:
22324
+
22325
+ The above copyright notice and this permission notice shall be included in
22326
+ all copies or substantial portions of the Software.
22327
+
22328
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22329
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22330
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22331
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22332
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22333
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22334
+ THE SOFTWARE.
22335
+
22286
22336
  * MIT *
22287
22337
 
22288
22338
  MIT License
@@ -29357,4 +29407,4 @@ POSSIBILITY OF SUCH DAMAGE.
29357
29407
  --------------------------------------------------------------------------------
29358
29408
  --------------------------------------------------------------------------------
29359
29409
 
29360
- Report Generated by FOSSA on 2026-8-10
29410
+ Report Generated by FOSSA on 2026-8-13
@@ -20,6 +20,7 @@ export type LinkHandlerEvent = {
20
20
  preventDefault: () => void;
21
21
  section?: "ai";
22
22
  dashboard?: IDashboard;
23
+ insights?: IInsight[];
23
24
  dashboardStatus?: "saved" | "draft";
24
25
  visualization?: IInsight;
25
26
  visualizationStatus?: "saved" | "draft";
@@ -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,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE7G,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;IACf,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACpC,aAAa,CAAC,EAAE,QAAQ,CAAC;IACzB,mBAAmB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;CAC3C,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,YAAY,CAAC;AAIzD,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
+ {"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,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE7G,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;IACf,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACpC,aAAa,CAAC,EAAE,QAAQ,CAAC;IACzB,mBAAmB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;CAC3C,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,YAAY,CAAC;AAIzD,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 +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,EAEH,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EAExB,MAAM,oBAAoB,CAAC;AAG5B,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;IAEnB;;;;OAIG;IACH,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAE1B;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACrD,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,2CAmDxD;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,EAEH,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EAExB,MAAM,oBAAoB,CAAC;AAG5B,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;IAEnB;;;;OAIG;IACH,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAE1B;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACrD,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,2CAqDxD;AAED;;;;GAIG;AACH,eAAO,MAAM,SAAS,uBAAiB,CAAC"}
@@ -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, onLinkClick, mode, allowNativeLinks, } = props;
15
+ const { backend, workspace, locale, colorPalette, eventHandlers, settings, objectTypes, catalogItems, includeTags, excludeTags, isPreview, allowInteractionIntelligence, providedStore, onDispatcher, onLinkClick, mode, 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, mode: mode, 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 }) }) }) }) }) }));
18
+ return (_jsx(IntlWrapper, { locale: locale, children: _jsx(GenAiStore, { backend: effectiveBackend, workspace: effectiveWorkspace, onDispatcher: onDispatcher, colorPalette: colorPalette, mode: mode, eventHandlers: eventHandlers, allowNativeLinks: allowNativeLinks, onLinkClick: onLinkClick, settings: settings, objectTypes: objectTypes, includeTags: includeTags, excludeTags: excludeTags, catalogItems: catalogItems, isPreview: isPreview, allowInteractionIntelligence: allowInteractionIntelligence, 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.
@@ -86,6 +86,15 @@ export type GenAiStoreProps = {
86
86
  * @internal
87
87
  */
88
88
  isPreview?: boolean;
89
+ /**
90
+ * Enables the Interaction Intelligence panel on assistant messages. Agent builder
91
+ * passes `true`; regular assistants leave this off. Also requires
92
+ * `settings.enableGenAiInteractionIntelligence` to be enabled — both must be true for the
93
+ * panel to be usable.
94
+ *
95
+ * @internal
96
+ */
97
+ allowInteractionIntelligence?: boolean;
89
98
  };
90
99
  /**
91
100
  * Provides the Gen AI store to the application.
@@ -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,OAAO,EAAkB,KAAK,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEpG;;;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;;;;OAIG;IACH,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B;;;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"}
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,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEpG;;;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;;;;OAIG;IACH,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B;;;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;IAEpB;;;;;;;OAOG;IACH,4BAA4B,CAAC,EAAE,OAAO,CAAC;CAC1C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,kDAmDhD"}
@@ -59,7 +59,7 @@ function InjectedStore({ onDispatcher, children, currentStore, }) {
59
59
  const content = typeof children === "function" ? children(currentStore) : children;
60
60
  return _jsx(StoreProvider, { store: currentStore, children: content });
61
61
  }
62
- function InternalStore({ backend, workspace, onDispatcher, children, eventHandlers, settings, catalogItems, includeTags, excludeTags, objectTypes, allowNativeLinks, onLinkClick, mode, isPreview, colorPalette, }) {
62
+ function InternalStore({ backend, workspace, onDispatcher, children, eventHandlers, settings, catalogItems, includeTags, excludeTags, objectTypes, allowNativeLinks, onLinkClick, mode, isPreview, allowInteractionIntelligence, colorPalette, }) {
63
63
  const effectiveBackend = useBackendStrict(backend);
64
64
  const effectiveWorkspace = useWorkspaceStrict(workspace);
65
65
  const genAIStore = useGenAIStore(effectiveBackend, effectiveWorkspace, {
@@ -71,6 +71,7 @@ function InternalStore({ backend, workspace, onDispatcher, children, eventHandle
71
71
  excludeTags,
72
72
  catalogItems,
73
73
  isPreview,
74
+ allowInteractionIntelligence,
74
75
  allowNativeLinks,
75
76
  onLinkClick,
76
77
  mode,
@@ -0,0 +1,21 @@
1
+ import type { InteractionIntelligenceMode } from "./data/types.js";
2
+ /**
3
+ * Props for the {@link GenAiInteractionIntelligence} component.
4
+ * @public
5
+ */
6
+ export interface IGenAiInteractionIntelligenceProps {
7
+ responseId: string;
8
+ onClose: () => void;
9
+ /** Lets a consumer render directly into a specific category's detail view. */
10
+ initialMode?: InteractionIntelligenceMode;
11
+ /** Category id to open when `initialMode === "detail"`. Falls back to list mode if unknown. */
12
+ initialCategory?: string;
13
+ }
14
+ /**
15
+ * The Interaction Intelligence panel: a single timeline of the processing steps behind one
16
+ * assistant response, with a list view and a per-category detail view. Loads its own data on
17
+ * mount and owns which view/category is currently shown.
18
+ * @public
19
+ */
20
+ export declare function GenAiInteractionIntelligence({ responseId, onClose, initialMode, initialCategory }: IGenAiInteractionIntelligenceProps): import("react/jsx-runtime").JSX.Element | null;
21
+ //# sourceMappingURL=GenAiInteractionIntelligence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenAiInteractionIntelligence.d.ts","sourceRoot":"","sources":["../../../src/components/intelligence/GenAiInteractionIntelligence.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAwB,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AASzF;;;GAGG;AACH,MAAM,WAAW,kCAAkC;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,2BAA2B,CAAC;IAC1C,+FAA+F;IAC/F,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,EACzC,UAAU,EACV,OAAO,EACP,WAAoB,EACpB,eAAe,EAClB,EAAE,kCAAkC,kDAmEpC"}
@@ -0,0 +1,57 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // (C) 2026 GoodData Corporation
3
+ import { useCallback, useEffect, useRef, useState } from "react";
4
+ import { useSelector } from "react-redux";
5
+ import { interactionIntelligenceEnabledSelector } from "../../store/chatWindow/chatWindowSelectors.js";
6
+ import { useInteractionIntelligenceData } from "./data/useInteractionIntelligenceData.js";
7
+ import { IntelligenceCategoryDetail } from "./detail/IntelligenceCategoryDetail.js";
8
+ import { b } from "./intelligenceBem.js";
9
+ import { IntelligenceCategoryList } from "./panel/IntelligenceCategoryList.js";
10
+ import { IntelligenceFooter } from "./panel/IntelligenceFooter.js";
11
+ import { IntelligenceHeader } from "./panel/IntelligenceHeader.js";
12
+ import { IntelligenceTimeline } from "./panel/IntelligenceTimeline.js";
13
+ /**
14
+ * The Interaction Intelligence panel: a single timeline of the processing steps behind one
15
+ * assistant response, with a list view and a per-category detail view. Loads its own data on
16
+ * mount and owns which view/category is currently shown.
17
+ * @public
18
+ */
19
+ export function GenAiInteractionIntelligence({ responseId, onClose, initialMode = "list", initialCategory, }) {
20
+ // Self-gated on the feature flag/prop, not just by whoever mounts this component — it is a
21
+ // public export, so a caller other than AssistantItem must not be able to show it by omission.
22
+ const interactionIntelligenceEnabled = useSelector(interactionIntelligenceEnabledSelector);
23
+ const data = useInteractionIntelligenceData(responseId, interactionIntelligenceEnabled);
24
+ const [view, setView] = useState();
25
+ const [hoveredStepIndexes, setHoveredStepIndexes] = useState(undefined);
26
+ const panelRef = useRef(null);
27
+ // Mounted from AssistantItem the trace is already in the store, so this resolves on the first
28
+ // render. A consumer that mounts the panel while the response still streams gets it as soon as
29
+ // the trace lands instead, which is why the initial view is derived rather than seeded.
30
+ const resolvedView = view ??
31
+ (data
32
+ ? resolveInitialView(data.categories, initialMode, initialCategory)
33
+ : { mode: "list", categoryIndex: 0 });
34
+ const openCategory = useCallback((categoryIndex) => {
35
+ setView({ mode: "detail", categoryIndex });
36
+ }, []);
37
+ const backToList = useCallback(() => setView({ mode: "list", categoryIndex: 0 }), []);
38
+ const hasData = !!data;
39
+ // The panel opens below the message and the detail view is taller than the list, so both
40
+ // opening it and switching views can push its bottom out of the viewport. Scroll it back into
41
+ // view once it has something to show, and on every view change after that.
42
+ useEffect(() => {
43
+ panelRef.current?.scrollIntoView({ block: "nearest" });
44
+ }, [resolvedView.mode, hasData]);
45
+ if (!data) {
46
+ return null;
47
+ }
48
+ return (_jsx("div", { className: b(), ref: panelRef, children: resolvedView.mode === "detail" ? (_jsx(IntelligenceCategoryDetail, { data: data, categoryIndex: resolvedView.categoryIndex, onBack: backToList, onClose: onClose, onSelectCategory: openCategory })) : (_jsxs(_Fragment, { children: [
49
+ _jsx(IntelligenceHeader, { onClose: onClose }), _jsx(IntelligenceTimeline, { steps: data.steps, totalDurationMs: data.totals.durationMs, categories: data.categories, highlightedStepIndexes: hoveredStepIndexes }), _jsx(IntelligenceCategoryList, { categories: data.categories, onSelectCategory: openCategory, onHoveredStepIndexesChange: setHoveredStepIndexes }), data.traceId ? _jsx(IntelligenceFooter, { traceId: data.traceId }) : null] })) }));
50
+ }
51
+ /** Opens on `initialCategory`'s detail when asked for one that exists, else on the list. */
52
+ function resolveInitialView(categories, initialMode, initialCategory) {
53
+ const categoryIndex = categories.findIndex((category) => category.category === initialCategory);
54
+ return initialMode === "detail" && categoryIndex >= 0
55
+ ? { mode: "detail", categoryIndex }
56
+ : { mode: "list", categoryIndex: 0 };
57
+ }
@@ -0,0 +1,15 @@
1
+ import type { IInteractionIntelligenceTotals } from "./data/types.js";
2
+ export interface IInteractionIntelligenceTriggerProps {
3
+ /** The turn's duration/tokens, shown as the trigger's own content. Renders nothing until available. */
4
+ totals?: IInteractionIntelligenceTotals;
5
+ isOpen: boolean;
6
+ onToggle: () => void;
7
+ }
8
+ /**
9
+ * The Interaction Intelligence trigger shown next to an assistant message: the turn's
10
+ * duration/tokens, styled like the panel's own summary stats, acting as the clickable trigger.
11
+ * Renders nothing until `totals` is available. A plain toggle — it holds no state and renders no
12
+ * panel itself.
13
+ */
14
+ export declare function InteractionIntelligenceTrigger({ totals, isOpen, onToggle }: IInteractionIntelligenceTriggerProps): import("react/jsx-runtime").JSX.Element | null;
15
+ //# sourceMappingURL=InteractionIntelligenceTrigger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InteractionIntelligenceTrigger.d.ts","sourceRoot":"","sources":["../../../src/components/intelligence/InteractionIntelligenceTrigger.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AAItE,MAAM,WAAW,oCAAoC;IACjD,uGAAuG;IACvG,MAAM,CAAC,EAAE,8BAA8B,CAAC;IACxC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,EAC3C,MAAM,EACN,MAAM,EACN,QAAQ,EACX,EAAE,oCAAoC,kDAoBtC"}
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // (C) 2026 GoodData Corporation
3
+ import { useIntl } from "react-intl";
4
+ import { e } from "./intelligenceBem.js";
5
+ import { IntelligenceDurationTokens } from "./panel/IntelligenceDurationTokens.js";
6
+ /**
7
+ * The Interaction Intelligence trigger shown next to an assistant message: the turn's
8
+ * duration/tokens, styled like the panel's own summary stats, acting as the clickable trigger.
9
+ * Renders nothing until `totals` is available. A plain toggle — it holds no state and renders no
10
+ * panel itself.
11
+ */
12
+ export function InteractionIntelligenceTrigger({ totals, isOpen, onToggle, }) {
13
+ const intl = useIntl();
14
+ if (!totals) {
15
+ return null;
16
+ }
17
+ const label = intl.formatMessage({ id: "gd.gen-ai.interactionIntelligence.explain" });
18
+ return (_jsx("button", { type: "button", className: e("trigger"), onClick: onToggle, "aria-label": label, "aria-expanded": isOpen, children: _jsx(IntelligenceDurationTokens, { totals: totals }) }));
19
+ }
@@ -0,0 +1,12 @@
1
+ import type { IChatConversationItemDetail } from "@gooddata/sdk-backend-spi";
2
+ import type { IInteractionCategoryExcerptFragment, IInteractionStepDetailRow } from "./types.js";
3
+ /**
4
+ * The list row's right-hand excerpt for one occurrence of a category, built from the same
5
+ * `detail` its rows come from. At most two fragments (e.g. "2 found" + "1 used"). Counts are
6
+ * summed across a category's occurrences by the caller — this only reports one occurrence's own.
7
+ * @internal
8
+ */
9
+ export declare function excerptForDetail(detail: IChatConversationItemDetail): IInteractionCategoryExcerptFragment[];
10
+ /** The category's detail rows, built from one action's detail body. */
11
+ export declare function rowsForDetail(detail: IChatConversationItemDetail): IInteractionStepDetailRow[];
12
+ //# sourceMappingURL=categoryDetailRows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categoryDetailRows.d.ts","sourceRoot":"","sources":["../../../../src/components/intelligence/data/categoryDetailRows.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAIR,2BAA2B,EAG9B,MAAM,2BAA2B,CAAC;AAGnC,OAAO,KAAK,EACR,mCAAmC,EAEnC,yBAAyB,EAC5B,MAAM,YAAY,CAAC;AAsCpB;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,2BAA2B,GAAG,mCAAmC,EAAE,CAe3G;AA2CD,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,MAAM,EAAE,2BAA2B,GAAG,yBAAyB,EAAE,CAe9F"}
@@ -0,0 +1,206 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { defineMessages } from "react-intl";
3
+ import { MAX_DETAIL_LIST_ITEMS } from "./constants.js";
4
+ /** i18n message id per {@link GenAIAnswerOutput} value. */
5
+ const ANSWER_OUTPUT_LABEL_MESSAGES = defineMessages({
6
+ text: { id: "gd.gen-ai.interactionIntelligence.detail.output.text" },
7
+ visualization: { id: "gd.gen-ai.interactionIntelligence.detail.output.visualization" },
8
+ dashboard: { id: "gd.gen-ai.interactionIntelligence.detail.output.dashboard" },
9
+ keyDriverAnalysis: { id: "gd.gen-ai.interactionIntelligence.detail.output.keyDriverAnalysis" },
10
+ whatIf: { id: "gd.gen-ai.interactionIntelligence.detail.output.whatIf" },
11
+ searchResults: { id: "gd.gen-ai.interactionIntelligence.detail.output.searchResults" },
12
+ alertProposal: { id: "gd.gen-ai.interactionIntelligence.detail.output.alertProposal" },
13
+ });
14
+ /**
15
+ * Every message this file authors: the detail rows' labels, the count lines above their lists,
16
+ * the match-score suffix, and the excerpt fragments shown on a category's list row.
17
+ */
18
+ const MESSAGES = defineMessages({
19
+ query: { id: "gd.gen-ai.interactionIntelligence.detail.query" },
20
+ documents: { id: "gd.gen-ai.interactionIntelligence.detail.documents" },
21
+ bestMatch: { id: "gd.gen-ai.interactionIntelligence.detail.bestMatch" },
22
+ available: { id: "gd.gen-ai.interactionIntelligence.detail.available" },
23
+ activated: { id: "gd.gen-ai.interactionIntelligence.detail.activated" },
24
+ output: { id: "gd.gen-ai.interactionIntelligence.detail.output" },
25
+ model: { id: "gd.gen-ai.interactionIntelligence.detail.model" },
26
+ suggestedActions: { id: "gd.gen-ai.interactionIntelligence.detail.suggestedActions" },
27
+ searched: { id: "gd.gen-ai.interactionIntelligence.detail.searched" },
28
+ found: { id: "gd.gen-ai.interactionIntelligence.detail.found" },
29
+ used: { id: "gd.gen-ai.interactionIntelligence.detail.used" },
30
+ skillsCount: { id: "gd.gen-ai.interactionIntelligence.detail.skillsCount" },
31
+ foundGroup: { id: "gd.gen-ai.interactionIntelligence.detail.foundGroup" },
32
+ matchScore: { id: "gd.gen-ai.interactionIntelligence.detail.matchScore" },
33
+ excerptFound: { id: "gd.gen-ai.interactionIntelligence.excerpt.found" },
34
+ excerptUsed: { id: "gd.gen-ai.interactionIntelligence.excerpt.used" },
35
+ excerptDocuments: { id: "gd.gen-ai.interactionIntelligence.excerpt.documents" },
36
+ excerptActivated: { id: "gd.gen-ai.interactionIntelligence.excerpt.activated" },
37
+ });
38
+ /**
39
+ * The list row's right-hand excerpt for one occurrence of a category, built from the same
40
+ * `detail` its rows come from. At most two fragments (e.g. "2 found" + "1 used"). Counts are
41
+ * summed across a category's occurrences by the caller — this only reports one occurrence's own.
42
+ * @internal
43
+ */
44
+ export function excerptForDetail(detail) {
45
+ switch (detail.category) {
46
+ case "catalogSearch":
47
+ return catalogSearchExcerpt(detail);
48
+ case "knowledgeSearch":
49
+ return knowledgeSearchExcerpt(detail);
50
+ case "skillRouting":
51
+ return skillRoutingExcerpt(detail);
52
+ case "composeAnswer":
53
+ return composeAnswerExcerpt(detail);
54
+ // A category newer than this client contributes no excerpt rather than breaking the
55
+ // whole render model.
56
+ default:
57
+ return [];
58
+ }
59
+ }
60
+ function countFragment(id, count) {
61
+ return count > 0 ? [{ id, values: { count } }] : [];
62
+ }
63
+ function catalogSearchExcerpt(detail) {
64
+ const foundCount = detail.found.reduce((sum, group) => sum + group.titles.length, 0);
65
+ return [
66
+ ...countFragment(MESSAGES.excerptFound.id, foundCount),
67
+ ...countFragment(MESSAGES.excerptUsed.id, detail.used.length),
68
+ ];
69
+ }
70
+ function knowledgeSearchExcerpt(detail) {
71
+ return countFragment(MESSAGES.excerptDocuments.id, detail.documents.length);
72
+ }
73
+ function skillRoutingExcerpt(detail) {
74
+ return countFragment(MESSAGES.excerptActivated.id, detail.activated.length);
75
+ }
76
+ /**
77
+ * The message id for an output type, or `undefined` for one this client version does not know —
78
+ * a newer backend's value must degrade, not throw partway through building the render model.
79
+ */
80
+ function outputLabelId(output) {
81
+ return output ? ANSWER_OUTPUT_LABEL_MESSAGES[output]?.id : undefined;
82
+ }
83
+ function composeAnswerExcerpt(detail) {
84
+ const id = outputLabelId(detail.output);
85
+ return id ? [{ id }] : [];
86
+ }
87
+ /** The category's detail rows, built from one action's detail body. */
88
+ export function rowsForDetail(detail) {
89
+ switch (detail.category) {
90
+ case "catalogSearch":
91
+ return catalogSearchRows(detail);
92
+ case "knowledgeSearch":
93
+ return knowledgeSearchRows(detail);
94
+ case "skillRouting":
95
+ return skillRoutingRows(detail);
96
+ case "composeAnswer":
97
+ return composeAnswerRows(detail);
98
+ // A category newer than this client shows as a row with no detail content rather than
99
+ // breaking the whole render model.
100
+ default:
101
+ return [];
102
+ }
103
+ }
104
+ /**
105
+ * A row with a plain text value, or nothing when there is no text to show. `textId` is for a
106
+ * `text` drawn from a known/stable set (e.g. {@link ANSWER_OUTPUT_LABEL_MESSAGES}) — absent
107
+ * otherwise, when the text is never translated.
108
+ */
109
+ function textRow(labelId, text, textId) {
110
+ return text === undefined || text === ""
111
+ ? []
112
+ : [{ labelId, value: { kind: "text", text: String(text), textId } }];
113
+ }
114
+ /**
115
+ * A row listing `items`, truncated past {@link MAX_DETAIL_LIST_ITEMS}, or nothing when the list
116
+ * is empty. Without a `heading` the list renders unbulleted — the "plain stacked list" look used
117
+ * for match lists.
118
+ */
119
+ function listRow(labelId, items, heading) {
120
+ if (items.length === 0) {
121
+ return [];
122
+ }
123
+ return [
124
+ {
125
+ labelId,
126
+ value: {
127
+ kind: "list",
128
+ ...(heading === undefined
129
+ ? { bulleted: false }
130
+ : "id" in heading
131
+ ? { heading: heading.id, headingId: heading.id, headingValues: heading.values }
132
+ : { heading: heading.text }),
133
+ ...truncate(items),
134
+ },
135
+ },
136
+ ];
137
+ }
138
+ /** A relevance score as the card shows it, or no suffix when the action did not rank. */
139
+ function scoreMeta(score) {
140
+ return score === undefined
141
+ ? undefined
142
+ : { id: MESSAGES.matchScore.id, values: { percent: Math.round(score * 100) } };
143
+ }
144
+ function knowledgeSearchRows(detail) {
145
+ return [
146
+ ...textRow(MESSAGES.query.id, detail.query),
147
+ ...listRow(MESSAGES.documents.id, detail.documents.map((document) => ({ label: document.title, meta: scoreMeta(document.score) }))),
148
+ ...textRow(MESSAGES.bestMatch.id, detail.bestMatch),
149
+ ];
150
+ }
151
+ function skillRoutingRows(detail) {
152
+ const availableCount = detail.available.length;
153
+ return [
154
+ ...listRow(MESSAGES.available.id, detail.available.map((skill) => ({ label: skill })), { id: MESSAGES.skillsCount.id, values: { count: availableCount } }),
155
+ ...listRow(MESSAGES.activated.id, detail.activated.map((skill) => ({ label: skill }))),
156
+ ];
157
+ }
158
+ function composeAnswerRows(detail) {
159
+ return [
160
+ ...textRow(MESSAGES.output.id,
161
+ // `detail.output` is only shown verbatim if a future output type arrives with no
162
+ // matching message yet — never for an output type we already know.
163
+ detail.output, outputLabelId(detail.output)),
164
+ ...textRow(MESSAGES.model.id, detail.modelId),
165
+ ...textRow(MESSAGES.suggestedActions.id, detail.suggestedActions),
166
+ ];
167
+ }
168
+ function catalogSearchRows(detail) {
169
+ const found = detail.found.filter((group) => group.titles.length > 0);
170
+ return [
171
+ ...listRow(MESSAGES.query.id, detail.query.map((keyword) => ({ label: keyword }))),
172
+ ...listRow(MESSAGES.searched.id, detail.requestedTypes.map((type) => ({ label: type }))),
173
+ ...(found.length === 0
174
+ ? []
175
+ : [
176
+ {
177
+ labelId: MESSAGES.found.id,
178
+ value: {
179
+ kind: "groups",
180
+ // The count/type composition is translated; `objectType` (e.g. "metric")
181
+ // is a backend value, interpolated verbatim.
182
+ groups: found.map((group) => ({
183
+ heading: MESSAGES.foundGroup.id,
184
+ headingId: MESSAGES.foundGroup.id,
185
+ headingValues: {
186
+ count: group.titles.length,
187
+ objectType: group.objectType,
188
+ },
189
+ ...truncate(group.titles.map((title) => ({ label: title }))),
190
+ })),
191
+ },
192
+ },
193
+ ]),
194
+ ...listRow(MESSAGES.used.id, detail.used.map((match) => ({ label: match.title, meta: scoreMeta(match.score) }))),
195
+ ];
196
+ }
197
+ /** Caps a list at {@link MAX_DETAIL_LIST_ITEMS}, reporting the remainder as `truncatedCount`. */
198
+ function truncate(items) {
199
+ if (items.length <= MAX_DETAIL_LIST_ITEMS) {
200
+ return { items };
201
+ }
202
+ return {
203
+ items: items.slice(0, MAX_DETAIL_LIST_ITEMS),
204
+ truncatedCount: items.length - MAX_DETAIL_LIST_ITEMS,
205
+ };
206
+ }
@@ -0,0 +1,22 @@
1
+ import type { GenAIInteractionStepCategory } from "@gooddata/sdk-backend-spi";
2
+ import type { IconType } from "@gooddata/sdk-ui-kit";
3
+ /**
4
+ * Default icon shown for a category with no explicit mapping in {@link CATEGORY_ICONS}.
5
+ * @internal
6
+ */
7
+ export declare const DEFAULT_STEP_ICON: IconType;
8
+ /**
9
+ * Longest list rendered in a detail row before the rest collapse into a "…and N more". Applied
10
+ * both when a row is built and again after merging a category's occurrences.
11
+ * @internal
12
+ */
13
+ export declare const MAX_DETAIL_LIST_ITEMS = 5;
14
+ /**
15
+ * Category -> icon mapping. Typed by {@link GenAIInteractionStepCategory}, so adding a category to
16
+ * the backend's vocabulary fails to compile until its icon is chosen here. A category still
17
+ * missing at runtime (an older client meeting a newer backend) falls back to
18
+ * {@link DEFAULT_STEP_ICON}.
19
+ * @internal
20
+ */
21
+ export declare const CATEGORY_ICONS: Record<GenAIInteractionStepCategory, IconType>;
22
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/components/intelligence/data/constants.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,QAAyB,CAAC;AAE1D;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAEvC;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,4BAA4B,EAAE,QAAQ,CAOzE,CAAC"}
@@ -0,0 +1,27 @@
1
+ // (C) 2026 GoodData Corporation
2
+ /**
3
+ * Default icon shown for a category with no explicit mapping in {@link CATEGORY_ICONS}.
4
+ * @internal
5
+ */
6
+ export const DEFAULT_STEP_ICON = "questionMark";
7
+ /**
8
+ * Longest list rendered in a detail row before the rest collapse into a "…and N more". Applied
9
+ * both when a row is built and again after merging a category's occurrences.
10
+ * @internal
11
+ */
12
+ export const MAX_DETAIL_LIST_ITEMS = 5;
13
+ /**
14
+ * Category -> icon mapping. Typed by {@link GenAIInteractionStepCategory}, so adding a category to
15
+ * the backend's vocabulary fails to compile until its icon is chosen here. A category still
16
+ * missing at runtime (an older client meeting a newer backend) falls back to
17
+ * {@link DEFAULT_STEP_ICON}.
18
+ * @internal
19
+ */
20
+ export const CATEGORY_ICONS = {
21
+ applyMemory: "brain",
22
+ skillRouting: "genai2",
23
+ knowledgeSearch: "search",
24
+ catalogSearch: "search",
25
+ metricQuery: "metric",
26
+ composeAnswer: "speechBubble",
27
+ };