@thoughtspot/visual-embed-sdk 1.52.2-beta.2 → 1.53.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 (281) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/contracts/contracts.spec.js +4 -0
  3. package/cjs/src/contracts/contracts.spec.js.map +1 -1
  4. package/cjs/src/contracts/host-event-contracts.d.ts +10 -0
  5. package/cjs/src/contracts/host-event-contracts.d.ts.map +1 -1
  6. package/cjs/src/css-variables.d.ts +373 -5
  7. package/cjs/src/css-variables.d.ts.map +1 -1
  8. package/cjs/src/embed/app.d.ts +15 -0
  9. package/cjs/src/embed/app.d.ts.map +1 -1
  10. package/cjs/src/embed/app.js +6 -3
  11. package/cjs/src/embed/app.js.map +1 -1
  12. package/cjs/src/embed/app.spec.js +28 -0
  13. package/cjs/src/embed/app.spec.js.map +1 -1
  14. package/cjs/src/embed/auto-frame-renderer.d.ts.map +1 -1
  15. package/cjs/src/embed/auto-frame-renderer.js +244 -4
  16. package/cjs/src/embed/auto-frame-renderer.js.map +1 -1
  17. package/cjs/src/embed/auto-frame-renderer.spec.js +389 -0
  18. package/cjs/src/embed/auto-frame-renderer.spec.js.map +1 -1
  19. package/cjs/src/embed/bodyless-conversation.js +1 -1
  20. package/cjs/src/embed/bodyless-conversation.js.map +1 -1
  21. package/cjs/src/embed/conversation.d.ts +29 -0
  22. package/cjs/src/embed/conversation.d.ts.map +1 -1
  23. package/cjs/src/embed/conversation.js +7 -3
  24. package/cjs/src/embed/conversation.js.map +1 -1
  25. package/cjs/src/embed/conversation.spec.js +88 -0
  26. package/cjs/src/embed/conversation.spec.js.map +1 -1
  27. package/cjs/src/embed/host-events.spec.js +32 -0
  28. package/cjs/src/embed/host-events.spec.js.map +1 -1
  29. package/cjs/src/embed/liveboard-override-utils.d.ts +59 -0
  30. package/cjs/src/embed/liveboard-override-utils.d.ts.map +1 -0
  31. package/cjs/src/embed/liveboard-override-utils.js +19 -0
  32. package/cjs/src/embed/liveboard-override-utils.js.map +1 -0
  33. package/cjs/src/embed/liveboard-override-utils.spec.d.ts +2 -0
  34. package/cjs/src/embed/liveboard-override-utils.spec.d.ts.map +1 -0
  35. package/cjs/src/embed/liveboard-override-utils.spec.js +34 -0
  36. package/cjs/src/embed/liveboard-override-utils.spec.js.map +1 -0
  37. package/cjs/src/embed/liveboard.d.ts +44 -13
  38. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  39. package/cjs/src/embed/liveboard.js +19 -23
  40. package/cjs/src/embed/liveboard.js.map +1 -1
  41. package/cjs/src/embed/liveboard.spec.js +122 -0
  42. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  43. package/cjs/src/embed/search-bar.js +1 -1
  44. package/cjs/src/embed/search-bar.js.map +1 -1
  45. package/cjs/src/embed/search.js +1 -1
  46. package/cjs/src/embed/search.js.map +1 -1
  47. package/cjs/src/embed/search.spec.js +20 -0
  48. package/cjs/src/embed/search.spec.js.map +1 -1
  49. package/cjs/src/embed/spotter-utils.d.ts +12 -0
  50. package/cjs/src/embed/spotter-utils.d.ts.map +1 -1
  51. package/cjs/src/embed/spotter-utils.js +20 -2
  52. package/cjs/src/embed/spotter-utils.js.map +1 -1
  53. package/cjs/src/embed/spotter-utils.spec.js +19 -0
  54. package/cjs/src/embed/spotter-utils.spec.js.map +1 -1
  55. package/cjs/src/embed/spotter-viz-utils.d.ts +15 -0
  56. package/cjs/src/embed/spotter-viz-utils.d.ts.map +1 -1
  57. package/cjs/src/embed/spotter-viz-utils.js.map +1 -1
  58. package/cjs/src/embed/spotter-viz-utils.spec.js +11 -0
  59. package/cjs/src/embed/spotter-viz-utils.spec.js.map +1 -1
  60. package/cjs/src/embed/ts-embed.d.ts +18 -20
  61. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  62. package/cjs/src/embed/ts-embed.js +181 -45
  63. package/cjs/src/embed/ts-embed.js.map +1 -1
  64. package/cjs/src/embed/ts-embed.spec.d.ts.map +1 -1
  65. package/cjs/src/embed/ts-embed.spec.js +610 -0
  66. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  67. package/cjs/src/index.d.ts +5 -3
  68. package/cjs/src/index.d.ts.map +1 -1
  69. package/cjs/src/index.js +4 -2
  70. package/cjs/src/index.js.map +1 -1
  71. package/cjs/src/mixpanel-service.d.ts +1 -0
  72. package/cjs/src/mixpanel-service.d.ts.map +1 -1
  73. package/cjs/src/mixpanel-service.js +1 -0
  74. package/cjs/src/mixpanel-service.js.map +1 -1
  75. package/cjs/src/react/all-types-export.d.ts +1 -1
  76. package/cjs/src/react/all-types-export.d.ts.map +1 -1
  77. package/cjs/src/react/all-types-export.js +2 -1
  78. package/cjs/src/react/all-types-export.js.map +1 -1
  79. package/cjs/src/types.d.ts +251 -4
  80. package/cjs/src/types.d.ts.map +1 -1
  81. package/cjs/src/types.js +176 -0
  82. package/cjs/src/types.js.map +1 -1
  83. package/cjs/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
  84. package/cjs/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
  85. package/cjs/src/utils/graphql/answerService/answer-queries.js +8 -1
  86. package/cjs/src/utils/graphql/answerService/answer-queries.js.map +1 -1
  87. package/cjs/src/utils/graphql/answerService/answerService.d.ts +28 -4
  88. package/cjs/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  89. package/cjs/src/utils/graphql/answerService/answerService.js +39 -4
  90. package/cjs/src/utils/graphql/answerService/answerService.js.map +1 -1
  91. package/cjs/src/utils/graphql/answerService/answerService.spec.js +124 -0
  92. package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  93. package/cjs/src/utils/runtimeTelemetry.d.ts +11 -0
  94. package/cjs/src/utils/runtimeTelemetry.d.ts.map +1 -0
  95. package/cjs/src/utils/runtimeTelemetry.js +34 -0
  96. package/cjs/src/utils/runtimeTelemetry.js.map +1 -0
  97. package/cjs/src/utils/runtimeTelemetry.spec.d.ts +2 -0
  98. package/cjs/src/utils/runtimeTelemetry.spec.d.ts.map +1 -0
  99. package/cjs/src/utils/runtimeTelemetry.spec.js +124 -0
  100. package/cjs/src/utils/runtimeTelemetry.spec.js.map +1 -0
  101. package/dist/{index-CnHREfvN.js → index-CrBnZBZv.js} +1 -1
  102. package/dist/src/contracts/host-event-contracts.d.ts +10 -0
  103. package/dist/src/contracts/host-event-contracts.d.ts.map +1 -1
  104. package/dist/src/css-variables.d.ts +373 -5
  105. package/dist/src/css-variables.d.ts.map +1 -1
  106. package/dist/src/embed/app.d.ts +15 -0
  107. package/dist/src/embed/app.d.ts.map +1 -1
  108. package/dist/src/embed/auto-frame-renderer.d.ts.map +1 -1
  109. package/dist/src/embed/conversation.d.ts +29 -0
  110. package/dist/src/embed/conversation.d.ts.map +1 -1
  111. package/dist/src/embed/liveboard-override-utils.d.ts +59 -0
  112. package/dist/src/embed/liveboard-override-utils.d.ts.map +1 -0
  113. package/dist/src/embed/liveboard-override-utils.spec.d.ts +2 -0
  114. package/dist/src/embed/liveboard-override-utils.spec.d.ts.map +1 -0
  115. package/dist/src/embed/liveboard.d.ts +44 -13
  116. package/dist/src/embed/liveboard.d.ts.map +1 -1
  117. package/dist/src/embed/spotter-utils.d.ts +12 -0
  118. package/dist/src/embed/spotter-utils.d.ts.map +1 -1
  119. package/dist/src/embed/spotter-viz-utils.d.ts +15 -0
  120. package/dist/src/embed/spotter-viz-utils.d.ts.map +1 -1
  121. package/dist/src/embed/ts-embed.d.ts +18 -20
  122. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  123. package/dist/src/embed/ts-embed.spec.d.ts.map +1 -1
  124. package/dist/src/index.d.ts +5 -3
  125. package/dist/src/index.d.ts.map +1 -1
  126. package/dist/src/mixpanel-service.d.ts +1 -0
  127. package/dist/src/mixpanel-service.d.ts.map +1 -1
  128. package/dist/src/react/all-types-export.d.ts +1 -1
  129. package/dist/src/react/all-types-export.d.ts.map +1 -1
  130. package/dist/src/types.d.ts +251 -4
  131. package/dist/src/types.d.ts.map +1 -1
  132. package/dist/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
  133. package/dist/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
  134. package/dist/src/utils/graphql/answerService/answerService.d.ts +28 -4
  135. package/dist/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  136. package/dist/src/utils/runtimeTelemetry.d.ts +11 -0
  137. package/dist/src/utils/runtimeTelemetry.d.ts.map +1 -0
  138. package/dist/src/utils/runtimeTelemetry.spec.d.ts +2 -0
  139. package/dist/src/utils/runtimeTelemetry.spec.d.ts.map +1 -0
  140. package/dist/tsembed-react.es.js +500 -85
  141. package/dist/tsembed-react.js +499 -84
  142. package/dist/tsembed.es.js +743 -90
  143. package/dist/tsembed.js +741 -88
  144. package/dist/visual-embed-sdk-react-full.d.ts +788 -44
  145. package/dist/visual-embed-sdk-react.d.ts +783 -44
  146. package/dist/visual-embed-sdk.d.ts +815 -45
  147. package/lib/package.json +1 -1
  148. package/lib/src/contracts/contracts.spec.js +4 -0
  149. package/lib/src/contracts/contracts.spec.js.map +1 -1
  150. package/lib/src/contracts/host-event-contracts.d.ts +10 -0
  151. package/lib/src/contracts/host-event-contracts.d.ts.map +1 -1
  152. package/lib/src/css-variables.d.ts +373 -5
  153. package/lib/src/css-variables.d.ts.map +1 -1
  154. package/lib/src/embed/app.d.ts +15 -0
  155. package/lib/src/embed/app.d.ts.map +1 -1
  156. package/lib/src/embed/app.js +7 -4
  157. package/lib/src/embed/app.js.map +1 -1
  158. package/lib/src/embed/app.spec.js +28 -0
  159. package/lib/src/embed/app.spec.js.map +1 -1
  160. package/lib/src/embed/auto-frame-renderer.d.ts.map +1 -1
  161. package/lib/src/embed/auto-frame-renderer.js +244 -4
  162. package/lib/src/embed/auto-frame-renderer.js.map +1 -1
  163. package/lib/src/embed/auto-frame-renderer.spec.js +389 -0
  164. package/lib/src/embed/auto-frame-renderer.spec.js.map +1 -1
  165. package/lib/src/embed/bodyless-conversation.js +1 -1
  166. package/lib/src/embed/bodyless-conversation.js.map +1 -1
  167. package/lib/src/embed/conversation.d.ts +29 -0
  168. package/lib/src/embed/conversation.d.ts.map +1 -1
  169. package/lib/src/embed/conversation.js +8 -4
  170. package/lib/src/embed/conversation.js.map +1 -1
  171. package/lib/src/embed/conversation.spec.js +89 -1
  172. package/lib/src/embed/conversation.spec.js.map +1 -1
  173. package/lib/src/embed/host-events.spec.js +32 -0
  174. package/lib/src/embed/host-events.spec.js.map +1 -1
  175. package/lib/src/embed/liveboard-override-utils.d.ts +59 -0
  176. package/lib/src/embed/liveboard-override-utils.d.ts.map +1 -0
  177. package/lib/src/embed/liveboard-override-utils.js +15 -0
  178. package/lib/src/embed/liveboard-override-utils.js.map +1 -0
  179. package/lib/src/embed/liveboard-override-utils.spec.d.ts +2 -0
  180. package/lib/src/embed/liveboard-override-utils.spec.d.ts.map +1 -0
  181. package/lib/src/embed/liveboard-override-utils.spec.js +32 -0
  182. package/lib/src/embed/liveboard-override-utils.spec.js.map +1 -0
  183. package/lib/src/embed/liveboard.d.ts +44 -13
  184. package/lib/src/embed/liveboard.d.ts.map +1 -1
  185. package/lib/src/embed/liveboard.js +19 -23
  186. package/lib/src/embed/liveboard.js.map +1 -1
  187. package/lib/src/embed/liveboard.spec.js +122 -0
  188. package/lib/src/embed/liveboard.spec.js.map +1 -1
  189. package/lib/src/embed/search-bar.js +1 -1
  190. package/lib/src/embed/search-bar.js.map +1 -1
  191. package/lib/src/embed/search.js +1 -1
  192. package/lib/src/embed/search.js.map +1 -1
  193. package/lib/src/embed/search.spec.js +20 -0
  194. package/lib/src/embed/search.spec.js.map +1 -1
  195. package/lib/src/embed/spotter-utils.d.ts +12 -0
  196. package/lib/src/embed/spotter-utils.d.ts.map +1 -1
  197. package/lib/src/embed/spotter-utils.js +19 -1
  198. package/lib/src/embed/spotter-utils.js.map +1 -1
  199. package/lib/src/embed/spotter-utils.spec.js +19 -0
  200. package/lib/src/embed/spotter-utils.spec.js.map +1 -1
  201. package/lib/src/embed/spotter-viz-utils.d.ts +15 -0
  202. package/lib/src/embed/spotter-viz-utils.d.ts.map +1 -1
  203. package/lib/src/embed/spotter-viz-utils.js.map +1 -1
  204. package/lib/src/embed/spotter-viz-utils.spec.js +11 -0
  205. package/lib/src/embed/spotter-viz-utils.spec.js.map +1 -1
  206. package/lib/src/embed/ts-embed.d.ts +18 -20
  207. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  208. package/lib/src/embed/ts-embed.js +181 -45
  209. package/lib/src/embed/ts-embed.js.map +1 -1
  210. package/lib/src/embed/ts-embed.spec.d.ts.map +1 -1
  211. package/lib/src/embed/ts-embed.spec.js +611 -1
  212. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  213. package/lib/src/index.d.ts +5 -3
  214. package/lib/src/index.d.ts.map +1 -1
  215. package/lib/src/index.js +3 -2
  216. package/lib/src/index.js.map +1 -1
  217. package/lib/src/mixpanel-service.d.ts +1 -0
  218. package/lib/src/mixpanel-service.d.ts.map +1 -1
  219. package/lib/src/mixpanel-service.js +1 -0
  220. package/lib/src/mixpanel-service.js.map +1 -1
  221. package/lib/src/react/all-types-export.d.ts +1 -1
  222. package/lib/src/react/all-types-export.d.ts.map +1 -1
  223. package/lib/src/react/all-types-export.js +1 -1
  224. package/lib/src/react/all-types-export.js.map +1 -1
  225. package/lib/src/types.d.ts +251 -4
  226. package/lib/src/types.d.ts.map +1 -1
  227. package/lib/src/types.js +176 -0
  228. package/lib/src/types.js.map +1 -1
  229. package/lib/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
  230. package/lib/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
  231. package/lib/src/utils/graphql/answerService/answer-queries.js +7 -0
  232. package/lib/src/utils/graphql/answerService/answer-queries.js.map +1 -1
  233. package/lib/src/utils/graphql/answerService/answerService.d.ts +28 -4
  234. package/lib/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  235. package/lib/src/utils/graphql/answerService/answerService.js +39 -4
  236. package/lib/src/utils/graphql/answerService/answerService.js.map +1 -1
  237. package/lib/src/utils/graphql/answerService/answerService.spec.js +125 -1
  238. package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  239. package/lib/src/utils/runtimeTelemetry.d.ts +11 -0
  240. package/lib/src/utils/runtimeTelemetry.d.ts.map +1 -0
  241. package/lib/src/utils/runtimeTelemetry.js +28 -0
  242. package/lib/src/utils/runtimeTelemetry.js.map +1 -0
  243. package/lib/src/utils/runtimeTelemetry.spec.d.ts +2 -0
  244. package/lib/src/utils/runtimeTelemetry.spec.d.ts.map +1 -0
  245. package/lib/src/utils/runtimeTelemetry.spec.js +122 -0
  246. package/lib/src/utils/runtimeTelemetry.spec.js.map +1 -0
  247. package/lib/src/visual-embed-sdk.d.ts +815 -45
  248. package/package.json +1 -1
  249. package/src/contracts/contracts.spec.ts +4 -0
  250. package/src/contracts/host-event-contracts.ts +13 -0
  251. package/src/css-variables.ts +475 -26
  252. package/src/embed/app.spec.ts +32 -0
  253. package/src/embed/app.ts +29 -4
  254. package/src/embed/auto-frame-renderer.spec.ts +464 -0
  255. package/src/embed/auto-frame-renderer.ts +305 -6
  256. package/src/embed/bodyless-conversation.ts +1 -1
  257. package/src/embed/conversation.spec.ts +118 -1
  258. package/src/embed/conversation.ts +42 -3
  259. package/src/embed/host-events.spec.ts +44 -0
  260. package/src/embed/liveboard-override-utils.spec.ts +38 -0
  261. package/src/embed/liveboard-override-utils.ts +71 -0
  262. package/src/embed/liveboard.spec.ts +138 -0
  263. package/src/embed/liveboard.ts +64 -24
  264. package/src/embed/search-bar.tsx +1 -1
  265. package/src/embed/search.spec.ts +23 -0
  266. package/src/embed/search.ts +1 -1
  267. package/src/embed/spotter-utils.spec.ts +20 -0
  268. package/src/embed/spotter-utils.ts +24 -1
  269. package/src/embed/spotter-viz-utils.spec.ts +11 -0
  270. package/src/embed/spotter-viz-utils.ts +15 -0
  271. package/src/embed/ts-embed.spec.ts +767 -0
  272. package/src/embed/ts-embed.ts +186 -41
  273. package/src/index.ts +18 -1
  274. package/src/mixpanel-service.ts +1 -0
  275. package/src/react/all-types-export.ts +7 -0
  276. package/src/types.ts +254 -5
  277. package/src/utils/graphql/answerService/answer-queries.ts +8 -0
  278. package/src/utils/graphql/answerService/answerService.spec.ts +145 -1
  279. package/src/utils/graphql/answerService/answerService.ts +65 -3
  280. package/src/utils/runtimeTelemetry.spec.ts +148 -0
  281. package/src/utils/runtimeTelemetry.ts +50 -0
@@ -1,4 +1,4 @@
1
- /* @thoughtspot/visual-embed-sdk version 1.52.2-beta.2 */
1
+ /* @thoughtspot/visual-embed-sdk version 1.53.1 */
2
2
  'use client';
3
3
  (function (global, factory) {
4
4
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) :
@@ -1415,6 +1415,36 @@
1415
1415
  * ```
1416
1416
  */
1417
1417
  EmbedEvent["Edit"] = "edit";
1418
+ /**
1419
+ * Emitted when a user clicks **Edit** on a Liveboard.
1420
+ *
1421
+ * Fired alongside {@link EmbedEvent.Edit} for backward compatibility;
1422
+ * listen to this instead of `Edit` to target the Liveboard surface only.
1423
+ * @version SDK: 1.54.0 | ThoughtSpot Cloud: 26.11.0.cl
1424
+ * @example
1425
+ * ```js
1426
+ * liveboardEmbed.on(EmbedEvent.EditLiveboard, payload => {
1427
+ * console.log('Liveboard edit', payload);
1428
+ * })
1429
+ * ```
1430
+ */
1431
+ EmbedEvent["EditLiveboard"] = "editLiveboard";
1432
+ /**
1433
+ * Emitted when a user clicks **Edit** on a visualization inside a
1434
+ * Liveboard.
1435
+ *
1436
+ * Fired alongside {@link EmbedEvent.Edit} for backward compatibility;
1437
+ * listen to this instead of `Edit` to target the visualization surface
1438
+ * only.
1439
+ * @version SDK: 1.54.0 | ThoughtSpot Cloud: 26.11.0.cl
1440
+ * @example
1441
+ * ```js
1442
+ * liveboardEmbed.on(EmbedEvent.EditVisualization, payload => {
1443
+ * console.log('visualization edit', payload);
1444
+ * })
1445
+ * ```
1446
+ */
1447
+ EmbedEvent["EditVisualization"] = "editVisualization";
1418
1448
  /**
1419
1449
  * Emitted when a user clicks *Make a copy* on a Liveboard
1420
1450
  * @version SDK: 1.15.0 | ThoughtSpot: 8.7.0.cl, 8.8.1.sw
@@ -3386,6 +3416,46 @@
3386
3416
  * @version SDK: 1.15.0 | ThoughtSpot: 8.7.0.cl, 8.8.1.sw
3387
3417
  */
3388
3418
  HostEvent["Edit"] = "edit";
3419
+ /**
3420
+ * Trigger the **Edit** action on a Liveboard only — does not affect a
3421
+ * visualization's edit surface.
3422
+ *
3423
+ * Behaves like {@link HostEvent.Edit} restricted to the Liveboard
3424
+ * surface. Use {@link HostEvent.EditVisualization} to target a
3425
+ * visualization instead, or `HostEvent.Edit` to control whichever
3426
+ * surface applies contextually (unchanged, existing behavior).
3427
+ * @example
3428
+ * ```js
3429
+ * liveboardEmbed.trigger(HostEvent.EditLiveboard)
3430
+ * ```
3431
+ * @version SDK: 1.54.0 | ThoughtSpot Cloud: 26.11.0.cl
3432
+ */
3433
+ HostEvent["EditLiveboard"] = "editLiveboard";
3434
+ /**
3435
+ * Trigger the **Edit** action on a specific visualization inside a
3436
+ * Liveboard only — does not affect the Liveboard-level edit surface.
3437
+ * @param - Object parameter. Includes the following keys:
3438
+ * - `vizId`: **Required.** The visualization to edit.
3439
+ *
3440
+ * @example
3441
+ * ```js
3442
+ * liveboardEmbed.trigger(HostEvent.EditVisualization, {vizId:
3443
+ * '730496d6-6903-4601-937e-2c691821af3c'})
3444
+ * ```
3445
+ * @version SDK: 1.54.0 | ThoughtSpot Cloud: 26.11.0.cl
3446
+ */
3447
+ HostEvent["EditVisualization"] = "editVisualization";
3448
+ /**
3449
+ * Exits Liveboard edit mode , equivalent to clicking the
3450
+ * *Cancel* button in the Liveboard edit header. The Liveboard returns to
3451
+ * view mode and the embedded app emits the {@link EmbedEvent.Cancel} event.
3452
+ * @version SDK: 1.55.0 | ThoughtSpot Cloud: 26.12.0.cl
3453
+ * @example
3454
+ * ```js
3455
+ * liveboardEmbed.trigger(HostEvent.ExitEditMode);
3456
+ * ```
3457
+ */
3458
+ HostEvent["ExitEditMode"] = "exitEditMode";
3389
3459
  /**
3390
3460
  * Trigger the **Copy link** action on a Liveboard or visualization
3391
3461
  * Payload: {@link VizScopedRequest}.
@@ -4921,6 +4991,39 @@
4921
4991
  * @version SDK: 1.49.0 | ThoughtSpot Cloud: 26.6.0.cl
4922
4992
  */
4923
4993
  HostEvent["RefreshLiveboardBrowserCache"] = "refreshLiveboardBrowserCache";
4994
+ /**
4995
+ * Switch the embed between dark appearance and its default appearance
4996
+ * while it is open, without reloading it.
4997
+ * Payload: {@link UpdateThemeRequest}.
4998
+ *
4999
+ * Use it to keep the embed in step with a theme switch in your
5000
+ * application; the appearance the embed loads with is set by `isDarkMode`.
5001
+ * The event resolves with the applied value, such as `{ isDarkMode: true }`.
5002
+ * When dark appearance is not available in the embed, the embed does not
5003
+ * change and the event rejects with an error message instead.
5004
+ * @version SDK: 1.55.0 | ThoughtSpot Cloud: 26.12.0.cl
5005
+ * @param - `isDarkMode` - `true` for dark appearance, `false` for the
5006
+ * default appearance.
5007
+ * @example
5008
+ * ```js
5009
+ * appEmbed.trigger(HostEvent.UpdateTheme, { isDarkMode: true });
5010
+ * ```
5011
+ * @example
5012
+ * ```js
5013
+ * // Follow a theme switch in your application
5014
+ * const themeSwitch = document.querySelector('#theme-switch');
5015
+ * themeSwitch.addEventListener('change', async (event) => {
5016
+ * try {
5017
+ * await appEmbed.trigger(HostEvent.UpdateTheme, {
5018
+ * isDarkMode: event.target.checked,
5019
+ * });
5020
+ * } catch (error) {
5021
+ * console.warn(error);
5022
+ * }
5023
+ * });
5024
+ * ```
5025
+ */
5026
+ HostEvent["UpdateTheme"] = "UpdateTheme";
4924
5027
  })(exports.HostEvent || (exports.HostEvent = {}));
4925
5028
  /**
4926
5029
  * The different visual modes that the data sources panel within
@@ -4948,6 +5051,22 @@
4948
5051
  var Param;
4949
5052
  (function (Param) {
4950
5053
  Param["Tsmcp"] = "tsmcp";
5054
+ /**
5055
+ * Marker added by a host app replaying a stored conversation. Carries the
5056
+ * analytical session (conversation) identifier, from which the renderer
5057
+ * resolves the answer's current session parameters. Stripped before the
5058
+ * URL reaches the ThoughtSpot application.
5059
+ * @version SDK: 1.52.2 | ThoughtSpot Cloud: 26.9.0.cl
5060
+ */
5061
+ Param["TsmcpConversationId"] = "tsmcpConversationId";
5062
+ /**
5063
+ * Zero-based position of the answer within the conversation, counting only
5064
+ * non-thinking answer items in message order. Accompanies
5065
+ * {@link TsmcpConversationId}; defaults to 0 when absent. Stripped before
5066
+ * the URL reaches the ThoughtSpot application.
5067
+ * @version SDK: 1.52.2 | ThoughtSpot Cloud: 26.9.0.cl
5068
+ */
5069
+ Param["TsmcpAnswerIndex"] = "tsmcpAnswerIndex";
4951
5070
  Param["EmbedApp"] = "embedApp";
4952
5071
  Param["DataSources"] = "dataSources";
4953
5072
  Param["DataSourceMode"] = "dataSourceMode";
@@ -5111,6 +5230,9 @@
5111
5230
  Param["SpotterDataSources"] = "spotterDataSources";
5112
5231
  Param["OpenSpotterOnLiveboardByDefault"] = "openSpotterOnLiveboardByDefault";
5113
5232
  Param["ShowAnswerEditPanel"] = "showAnswerEditPanel";
5233
+ Param["IsDarkMode"] = "isDarkMode";
5234
+ Param["RadiantThemeEnabled"] = "radiantThemeEnabled";
5235
+ Param["SpotterExperienceVersion"] = "spotterExperienceVersion";
5114
5236
  })(Param || (Param = {}));
5115
5237
  /**
5116
5238
  * ThoughtSpot application pages include actions and menu commands
@@ -5565,12 +5687,43 @@
5565
5687
  * The *Edit* action on the Liveboard page and in the
5566
5688
  * visualization menu.
5567
5689
  * Opens a Liveboard or visualization in edit mode.
5690
+ *
5691
+ * Controls both surfaces together. To target one surface only, use
5692
+ * {@link Action.EditLiveboard} or {@link Action.EditVisualization}.
5568
5693
  * @example
5569
5694
  * ```js
5570
5695
  * disabledActions: [Action.Edit]
5571
5696
  * ```
5572
5697
  */
5573
5698
  Action["Edit"] = "edit";
5699
+ /**
5700
+ * The *Edit* action on the Liveboard page only.
5701
+ * Opens a Liveboard in edit mode.
5702
+ *
5703
+ * Does not affect the *Edit* action in the visualization menu; use
5704
+ * {@link Action.EditVisualization} for that, or {@link Action.Edit} to
5705
+ * control both surfaces together.
5706
+ * @version SDK: 1.54.0 | ThoughtSpot Cloud: 26.11.0.cl
5707
+ * @example
5708
+ * ```js
5709
+ * disabledActions: [Action.EditLiveboard]
5710
+ * ```
5711
+ */
5712
+ Action["EditLiveboard"] = "editLiveboard";
5713
+ /**
5714
+ * The *Edit* action in the visualization `...` menu only.
5715
+ * Opens a visualization in the editor.
5716
+ *
5717
+ * Does not affect the *Edit* action on the Liveboard page; use
5718
+ * {@link Action.EditLiveboard} for that, or {@link Action.Edit} to
5719
+ * control both surfaces together.
5720
+ * @version SDK: 1.54.0 | ThoughtSpot Cloud: 26.11.0.cl
5721
+ * @example
5722
+ * ```js
5723
+ * disabledActions: [Action.EditVisualization]
5724
+ * ```
5725
+ */
5726
+ Action["EditVisualization"] = "editVisualization";
5574
5727
  /**
5575
5728
  * The text edit option for Liveboard and visualization titles.
5576
5729
  * @example
@@ -7346,6 +7499,29 @@
7346
7499
  * ```
7347
7500
  */
7348
7501
  Action["CustomizeHomepage"] = "customizeHomepage";
7502
+ /**
7503
+ * Controls the visibility and disabled state of the *Cancel* button in the
7504
+ * Liveboard edit header, the button that discards the changes made in edit
7505
+ * mode and returns the Liveboard to view mode. The button is shown only
7506
+ * while the Liveboard is in edit mode.
7507
+ * @version SDK: 1.55.0 | ThoughtSpot Cloud: 26.12.0.cl
7508
+ * @example
7509
+ * ```js
7510
+ * const liveboardEmbed = new LiveboardEmbed('#tsEmbed', {
7511
+ * ... // other embed view config
7512
+ * hiddenActions: [Action.Cancel],
7513
+ * });
7514
+ * ```
7515
+ * @example
7516
+ * ```js
7517
+ * const liveboardEmbed = new LiveboardEmbed('#tsEmbed', {
7518
+ * ... // other embed view config
7519
+ * disabledActions: [Action.Cancel],
7520
+ * disabledActionReason: 'Save your changes to leave edit mode',
7521
+ * });
7522
+ * ```
7523
+ */
7524
+ Action["Cancel"] = "cancel";
7349
7525
  })(exports.Action || (exports.Action = {}));
7350
7526
  var PrefetchFeatures;
7351
7527
  (function (PrefetchFeatures) {
@@ -7850,7 +8026,7 @@
7850
8026
  TableContentDensity["Compact"] = "COMPACT";
7851
8027
  })(TableContentDensity || (TableContentDensity = {}));
7852
8028
 
7853
- var version$1="1.52.2-beta.2";var pkg = {version:version$1};
8029
+ var version$1="1.53.1";var pkg = {version:version$1};
7854
8030
 
7855
8031
  const { version } = pkg;
7856
8032
 
@@ -10118,6 +10294,13 @@ mutation RemoveColumns($session: BachSessionIdInput!, $logicalColumnIds: [GUID!]
10118
10294
  ${bachSessionId}
10119
10295
  }
10120
10296
  }
10297
+ `;
10298
+ const updateSort = `
10299
+ mutation UpdateSort($session: BachSessionIdInput!, $sortOrder: [AnswerColumnSortInput!]!) {
10300
+ Answer__updateSort(session: $session, sortOrder: $sortOrder) {
10301
+ ${bachSessionId}
10302
+ }
10303
+ }
10121
10304
  `;
10122
10305
  const getAnswer = `
10123
10306
  query GetAnswer($session: BachSessionIdInput!) {
@@ -10423,6 +10606,26 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
10423
10606
  },
10424
10607
  });
10425
10608
  }
10609
+ /**
10610
+ * Adapt the sort options into the `updateSort` payload and send it.
10611
+ * @param sortOptions Columns to sort by, each with a direction.
10612
+ * @param sourceDetail
10613
+ */
10614
+ async adaptSorting(sortOptions, sourceDetail) {
10615
+ const { answer } = await this.executeQuery(getAnswer, {});
10616
+ const guidToColumnId = getGuidToColumnIdMap(answer);
10617
+ const sortOrder = sortOptions.map((sort) => {
10618
+ const guid = getGuidsFromColumnNames(sourceDetail, [sort.columnName])
10619
+ .values().next().value;
10620
+ return {
10621
+ columnId: guidToColumnId.get(guid),
10622
+ sortType: sort.ascending ? 'ASCENDING' : 'DESCENDING',
10623
+ };
10624
+ });
10625
+ return this.executeQuery(updateSort, {
10626
+ sortOrder,
10627
+ });
10628
+ }
10426
10629
  async updateDisplayMode(displayMode = "TABLE_MODE") {
10427
10630
  return this.executeQuery(updateDisplayMode, {
10428
10631
  displayMode,
@@ -10510,18 +10713,21 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
10510
10713
  * automatically passed.
10511
10714
  * @param outputColumnNames
10512
10715
  * @param selectedPoints
10716
+ * @param sortOptions Optional columns to sort the underlying data by.
10513
10717
  * @example
10514
10718
  * ```js
10515
10719
  * embed.on(EmbedEvent.CustomAction, e => {
10516
- * const underlying = await e.answerService.getUnderlyingDataForPoint([
10517
- * 'col name 1' // The column should exist in the data source.
10518
- * ]);
10720
+ * const underlying = await e.answerService.getUnderlyingDataForPoint(
10721
+ * ['col name 1'], // The column should exist in the data source.
10722
+ * undefined,
10723
+ * [{ columnName: 'col name 1', ascending: true }],
10724
+ * );
10519
10725
  * const data = await underlying.fetchData(0, 100);
10520
10726
  * })
10521
10727
  * ```
10522
10728
  * @version SDK: 1.25.0 | ThoughtSpot: 9.10.0.cl
10523
10729
  */
10524
- async getUnderlyingDataForPoint(outputColumnNames, selectedPoints) {
10730
+ async getUnderlyingDataForPoint(outputColumnNames, selectedPoints, sortOptions) {
10525
10731
  if (!selectedPoints && !this.selectedPoints) {
10526
10732
  throw new Error('Needs to be triggered in context of a point');
10527
10733
  }
@@ -10549,6 +10755,9 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
10549
10755
  if (columnsToRemove.length) {
10550
10756
  await unaggAnswerSession.removeColumns(columnsToRemove);
10551
10757
  }
10758
+ if (sortOptions === null || sortOptions === void 0 ? void 0 : sortOptions.length) {
10759
+ await unaggAnswerSession.adaptSorting(sortOptions, sourceDetail);
10760
+ }
10552
10761
  return unaggAnswerSession;
10553
10762
  }
10554
10763
  /**
@@ -10608,6 +10817,15 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
10608
10817
  this.tmlOverride = override;
10609
10818
  }
10610
10819
  }
10820
+ /**
10821
+ * Build a map from a source column guid to the answer's viz column id, using
10822
+ * the `referencedColumns` link on each viz column.
10823
+ * @param answer
10824
+ */
10825
+ function getGuidToColumnIdMap(answer) {
10826
+ const tableViz = answer.visualizations.find((viz) => viz.columns);
10827
+ return new Map(tableViz.columns.map((col) => [col.column.referencedColumns[0].guid, col.column.id]));
10828
+ }
10611
10829
  /**
10612
10830
  *
10613
10831
  * @param sourceDetail
@@ -19688,6 +19906,7 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
19688
19906
  const MIXPANEL_EVENT = {
19689
19907
  VISUAL_SDK_RENDER_START: 'visual-sdk-render-start',
19690
19908
  VISUAL_SDK_CALLED_INIT: 'visual-sdk-called-init',
19909
+ VISUAL_SDK_INIT_ACTIONS: 'visual-sdk-init-actions',
19691
19910
  VISUAL_SDK_RENDER_COMPLETE: 'visual-sdk-render-complete',
19692
19911
  VISUAL_SDK_RENDER_FAILED: 'visual-sdk-render-failed',
19693
19912
  VISUAL_SDK_TRIGGER: 'visual-sdk-trigger',
@@ -19760,6 +19979,32 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
19760
19979
  }
19761
19980
  }
19762
19981
 
19982
+ // Membership is checked, not just the key: a bare key allowlist would upload an
19983
+ // arbitrary customer string sitting under `operator` verbatim.
19984
+ const isEnumMember = (enumObject, value) => typeof value === 'string' && Object.values(enumObject).includes(value);
19985
+ const uniqueEnumMembers = (enumObject, values) => Array.from(new Set(values.filter((v) => isEnumMember(enumObject, v))));
19986
+ const describeRuntimeFilters = (runtimeFilters) => ({
19987
+ count: runtimeFilters.length,
19988
+ operators: uniqueEnumMembers(exports.RuntimeFilterOp, runtimeFilters.map((filter) => filter === null || filter === void 0 ? void 0 : filter.operator)),
19989
+ });
19990
+ const describeRuntimeParameters = (runtimeParameters) => ({
19991
+ count: runtimeParameters.length,
19992
+ applicabilityLevels: uniqueEnumMembers(ApplicabilityLevel, runtimeParameters.map((parameter) => { var _a; return (_a = parameter === null || parameter === void 0 ? void 0 : parameter.applicability) === null || _a === void 0 ? void 0 : _a.level; })),
19993
+ });
19994
+ // Column names, parameter names and operands are customer data and must never
19995
+ // reach Mixpanel; an unrecognized shape is dropped rather than forwarded.
19996
+ const summarizeRuntimeDataForTelemetry = (viewConfig) => {
19997
+ const { runtimeFilters, runtimeParameters, ...rest } = viewConfig !== null && viewConfig !== void 0 ? viewConfig : {};
19998
+ const telemetryProps = { ...rest };
19999
+ if (Array.isArray(runtimeFilters)) {
20000
+ telemetryProps.runtimeFilters = describeRuntimeFilters(runtimeFilters);
20001
+ }
20002
+ if (Array.isArray(runtimeParameters)) {
20003
+ telemetryProps.runtimeParameters = describeRuntimeParameters(runtimeParameters);
20004
+ }
20005
+ return telemetryProps;
20006
+ };
20007
+
19763
20008
  var eventemitter3 = createCommonjsModule(function (module) {
19764
20009
 
19765
20010
  var has = Object.prototype.hasOwnProperty
@@ -21899,6 +22144,97 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
21899
22144
  // truthy, so null or '' leaves the previous embed's values in place. '&' is
21900
22145
  // truthy and parses to {}.
21901
22146
  const NO_RUNTIME_PARAMS = '&';
22147
+ /**
22148
+ * Params kept on the iframe `src` when `excludeConfigFromURL` is set. The rest
22149
+ * are sent in the APP_INIT payload.
22150
+ * @internal
22151
+ */
22152
+ const BOOTSTRAP_URL_PARAMS = new Set([
22153
+ // Marks the app as embedded.
22154
+ Param.EmbedApp,
22155
+ // The host page URL, used to validate the postMessage origin.
22156
+ Param.HostAppUrl,
22157
+ // The SDK version.
22158
+ Param.Version,
22159
+ // The authentication type set in init.
22160
+ Param.AuthType,
22161
+ // Whether the app signs the user in automatically.
22162
+ Param.AutoLogin,
22163
+ // Stops the app from redirecting to its login page.
22164
+ Param.DisableLoginRedirect,
22165
+ // Forces the SAML redirect for EmbeddedSSO.
22166
+ Param.ForceSAMLAutoRedirect,
22167
+ // Set for cookieless trusted authentication.
22168
+ Param.cookieless,
22169
+ // Lets the app use the pre-fetched auth info.
22170
+ Param.preAuthCache,
22171
+ // Blocks access to the full app outside the embed.
22172
+ Param.blockNonEmbedFullAppAccess,
22173
+ // The org to load, which the auth info depends on.
22174
+ Param.OverrideOrgId,
22175
+ // The host window height when the iframe loads.
22176
+ Param.ViewPortHeight,
22177
+ // The host window width when the iframe loads.
22178
+ Param.ViewPortWidth,
22179
+ // The app's client log level.
22180
+ Param.ClientLogLevel,
22181
+ // Lets the app override the native console.
22182
+ Param.OverrideNativeConsole,
22183
+ // An extra Pendo tracking key.
22184
+ Param.PendoTrackingKey,
22185
+ // The locale for number formatting.
22186
+ Param.NumberFormatLocale,
22187
+ // The locale for date formatting.
22188
+ Param.DateFormatLocale,
22189
+ // The currency format.
22190
+ Param.CurrencyFormat,
22191
+ // The UI language.
22192
+ Param.Locale,
22193
+ // Turns on dark mode.
22194
+ Param.IsDarkMode,
22195
+ // Turns on the radiant theme that dark mode needs.
22196
+ Param.RadiantThemeEnabled,
22197
+ // Marks a SearchEmbed or SearchBarEmbed.
22198
+ Param.searchEmbed,
22199
+ // Marks a LiveboardEmbed.
22200
+ Param.livedBoardEmbed,
22201
+ // Marks a SpotterAgentEmbed.
22202
+ Param.isSpotterAgentEmbed,
22203
+ // Marks a SpotterEmbed.
22204
+ Param.SpotterEnabled,
22205
+ // Marks an AppEmbed.
22206
+ Param.IsFullAppEmbed,
22207
+ // Legacy flag for the onBeforeGetVizData API intercept.
22208
+ Param.IsOnBeforeGetVizDataInterceptEnabled,
22209
+ // Lets the host override links in the app.
22210
+ Param.LinkOverride,
22211
+ // Turns on version 2 of the link overrides.
22212
+ Param.EnableLinkOverridesV2,
22213
+ // Stops links from opening in a new tab.
22214
+ Param.DisableRedirectionLinksInNewTab,
22215
+ // Uses replaceState instead of pushState for app navigation.
22216
+ Param.OverrideHistoryState,
22217
+ // Shows search results as a table.
22218
+ Param.ForceTable,
22219
+ // The URL of the custom string IDs file.
22220
+ Param.StringIDsUrl,
22221
+ // The data sources that search opens with.
22222
+ Param.DataSources,
22223
+ // Exposes translation IDs in the app.
22224
+ Param.ExposeTranslationIDs,
22225
+ // The URL of the custom icon sprite.
22226
+ Param.IconSpriteUrl,
22227
+ // The tag that filters the metadata lists in an AppEmbed.
22228
+ Param.Tag,
22229
+ // Set when a Liveboard embed shows a single visualization (vizId).
22230
+ Param.vizEmbed,
22231
+ // Whether search opens with the last-selected data sources.
22232
+ Param.UseLastSelectedDataSource,
22233
+ // The query mode Spotter opens in.
22234
+ Param.DefaultQueryMode,
22235
+ // The initial search query. Omitted with excludeSearchTokenStringFromURL.
22236
+ Param.searchTokenString,
22237
+ ]);
21902
22238
  /**
21903
22239
  * The event id map from v2 event names to v1 event id
21904
22240
  * v1 events are the classic embed events implemented in Blink v1
@@ -21927,6 +22263,7 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
21927
22263
  this.embedNodeKey = '__tsEmbed';
21928
22264
  this.embedContainerLoadedKey = '__tsEmbedContainerLoaded';
21929
22265
  this.isAppInitialized = false;
22266
+ this.initDataParams = {};
21930
22267
  /**
21931
22268
  * Should we encode URL Query Params using base64 encoding which ThoughtSpot
21932
22269
  * will generate for embedding. This provides additional security to
@@ -21961,7 +22298,7 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
21961
22298
  */
21962
22299
  this.appInitCb = async (_, responder) => {
21963
22300
  try {
21964
- const appInitData = await this.getAppInitData();
22301
+ const appInitData = this.withInitDataParams(await this.getAppInitData());
21965
22302
  this.isAppInitialized = true;
21966
22303
  responder({
21967
22304
  type: exports.EmbedEvent.APP_INIT,
@@ -22115,9 +22452,7 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
22115
22452
  ...viewConfig,
22116
22453
  };
22117
22454
  this.registerAppInit();
22118
- uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_EMBED_CREATE, {
22119
- ...viewConfig,
22120
- });
22455
+ uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_EMBED_CREATE, summarizeRuntimeDataForTelemetry(viewConfig));
22121
22456
  const embedConfig = getEmbedConfig();
22122
22457
  if (embedConfig) {
22123
22458
  this.embedConfig = embedConfig;
@@ -22389,6 +22724,18 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
22389
22724
  async getAppInitData() {
22390
22725
  return this.getDefaultAppInitData();
22391
22726
  }
22727
+ withInitDataParams(appInitData) {
22728
+ if (isEmpty_1(this.initDataParams)) {
22729
+ return appInitData;
22730
+ }
22731
+ return {
22732
+ ...appInitData,
22733
+ embedParams: {
22734
+ ...this.initDataParams,
22735
+ ...(appInitData.embedParams || {}),
22736
+ },
22737
+ };
22738
+ }
22392
22739
  /**
22393
22740
  * Helper method to refresh/update auth token for TrustedAuthTokenCookieless auth type
22394
22741
  * @param responder - Function to send response back
@@ -22448,7 +22795,7 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
22448
22795
  * @returns queryParams
22449
22796
  */
22450
22797
  getBaseQueryParams(queryParams = {}) {
22451
- var _a, _b, _c, _d;
22798
+ var _a, _b, _c, _d, _e;
22452
22799
  let hostAppUrl = ((_a = window === null || window === void 0 ? void 0 : window.location) === null || _a === void 0 ? void 0 : _a.host) || '';
22453
22800
  // The below check is needed because TS Cloud firewall, blocks
22454
22801
  // localhost/127.0.0.1 in any url param.
@@ -22485,6 +22832,15 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
22485
22832
  if (this.embedConfig.currencyFormat) {
22486
22833
  queryParams[Param.CurrencyFormat] = this.embedConfig.currencyFormat;
22487
22834
  }
22835
+ // The view config wins over init, so an embed can opt out of a dark
22836
+ // mode set in `init`. `??` and not `||`, so that an explicit `false`
22837
+ // overrides an init-level `true`.
22838
+ const isDarkMode = (_c = this.viewConfig.isDarkMode) !== null && _c !== void 0 ? _c : this.embedConfig.isDarkMode;
22839
+ setParamIfDefined(queryParams, Param.IsDarkMode, isDarkMode, true);
22840
+ // The app's dark mode lives in its radiant theme, so turn that on too.
22841
+ if (isDarkMode) {
22842
+ queryParams[Param.RadiantThemeEnabled] = true;
22843
+ }
22488
22844
  const { disabledActions, disabledActionReason, hiddenActions, visibleActions, hiddenTabs, visibleTabs, showAlerts, additionalFlags: additionalFlagsFromView, locale, customizations, contextMenuTrigger, linkOverride, enableLinkOverridesV2, insertInToSlide, disableRedirectionLinksInNewTab, overrideOrgId, overrideHistoryState, exposeTranslationIDs, primaryAction, } = this.viewConfig;
22489
22845
  const { additionalFlags: additionalFlagsFromInit } = this.embedConfig;
22490
22846
  const additionalFlags = {
@@ -22550,7 +22906,7 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
22550
22906
  if (spriteUrl) {
22551
22907
  queryParams[Param.IconSpriteUrl] = spriteUrl.replace('https://', '');
22552
22908
  }
22553
- const stringIDsUrl = ((_c = customizations === null || customizations === void 0 ? void 0 : customizations.content) === null || _c === void 0 ? void 0 : _c.stringIDsUrl) || ((_d = embedCustomizations === null || embedCustomizations === void 0 ? void 0 : embedCustomizations.content) === null || _d === void 0 ? void 0 : _d.stringIDsUrl);
22909
+ const stringIDsUrl = ((_d = customizations === null || customizations === void 0 ? void 0 : customizations.content) === null || _d === void 0 ? void 0 : _d.stringIDsUrl) || ((_e = embedCustomizations === null || embedCustomizations === void 0 ? void 0 : embedCustomizations.content) === null || _e === void 0 ? void 0 : _e.stringIDsUrl);
22554
22910
  if (stringIDsUrl) {
22555
22911
  queryParams[Param.StringIDsUrl] = stringIDsUrl;
22556
22912
  }
@@ -22604,13 +22960,32 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
22604
22960
  return path;
22605
22961
  }
22606
22962
  getEmbedParams() {
22607
- const queryParams = this.getEmbedParamsObject();
22963
+ const queryParams = this.getUrlQueryParamsObject();
22608
22964
  return getQueryParamString(queryParams);
22609
22965
  }
22610
22966
  getEmbedParamsObject() {
22611
22967
  const params = this.getBaseQueryParams();
22612
22968
  return params;
22613
22969
  }
22970
+ getUrlQueryParamsObject() {
22971
+ const queryParams = this.getEmbedParamsObject();
22972
+ if (!this.isConfigExcludedFromUrl()) {
22973
+ this.initDataParams = {};
22974
+ return queryParams;
22975
+ }
22976
+ const urlParams = {};
22977
+ const excludedParams = {};
22978
+ Object.entries(queryParams).forEach(([key, value]) => {
22979
+ if (BOOTSTRAP_URL_PARAMS.has(key)) {
22980
+ urlParams[key] = value;
22981
+ }
22982
+ else {
22983
+ excludedParams[key] = deserializeParam(value);
22984
+ }
22985
+ });
22986
+ this.initDataParams = excludedParams;
22987
+ return urlParams;
22988
+ }
22614
22989
  getRootIframeSrc() {
22615
22990
  const query = this.getEmbedParams();
22616
22991
  return this.getEmbedBasePath(query);
@@ -22849,26 +23224,12 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
22849
23224
  return placeholder;
22850
23225
  }
22851
23226
  /**
22852
- * Resolves the configured preRenderContainer to a live element. A string
22853
- * selector is re-queried on every call so a remounted container (E.g.: React
22854
- * replacing the node) resolves to the fresh element; an element passed
22855
- * directly cannot be re-resolved.
22856
- *
22857
- * With nothing configured the frame goes into the host element's nearest
22858
- * scrolling ancestor, falling back to `document.body`.
22859
- *
22860
- * The wrapper is absolutely positioned, so it follows the page for free —
22861
- * but only while it sits inside whatever scrolls. `document.body` is right
22862
- * only when the document itself is the scroller; an app that scrolls an
22863
- * inner element instead left the frame pinned to the viewport while the page
22864
- * moved under it (SCAL-338563). Being inside the scroller also lets wheel
22865
- * events chain out of the frame into it, which they cannot do from
22866
- * `document.body`.
22867
- *
22868
- * A scrolling ancestor is layout chrome rather than route content, so it
22869
- * outlives the embed in practice; and if it does go, the host element goes
22870
- * with it and this instance is remounting anyway.
22871
- * `reconcilePreRenderContainer` re-runs this on a detached container.
23227
+ * Resolves the configured preRenderContainer, or defaults to the host's
23228
+ * nearest scrolling ancestor (document.body if none). The absolutely
23229
+ * positioned wrapper only follows the page while it sits inside what
23230
+ * scrolls, so body is right only when the document itself scrolls — an inner
23231
+ * scroller left the frame pinned to the viewport (SCAL-338563). A string
23232
+ * selector is re-queried each call so a remounted container resolves fresh.
22872
23233
  */
22873
23234
  resolvePreRenderContainerTarget() {
22874
23235
  var _a;
@@ -23310,9 +23671,16 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
23310
23671
  * @param args
23311
23672
  */
23312
23673
  async render() {
23674
+ var _a, _b, _c;
23313
23675
  uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_RENDER_CALLED, {
23314
23676
  embedComponentType: this.viewConfig.embedComponentType,
23315
23677
  });
23678
+ uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_INIT_ACTIONS, {
23679
+ embedComponentType: this.viewConfig.embedComponentType,
23680
+ hiddenActions: (_a = this.viewConfig.hiddenActions) !== null && _a !== void 0 ? _a : [],
23681
+ visibleActions: (_b = this.viewConfig.visibleActions) !== null && _b !== void 0 ? _b : [],
23682
+ disabledActions: (_c = this.viewConfig.disabledActions) !== null && _c !== void 0 ? _c : [],
23683
+ });
23316
23684
  if (!getIsInitCalled()) {
23317
23685
  logger$3.error(ERROR_MESSAGE.RENDER_CALLED_BEFORE_INIT);
23318
23686
  }
@@ -23547,6 +23915,26 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
23547
23915
  this.isRendered = true;
23548
23916
  return this.renderIFrame(prerenderFrameSrc);
23549
23917
  }
23918
+ isConfigExcludedFromUrl() {
23919
+ var _a, _b, _c;
23920
+ const flag = (_b = (_a = this.viewConfig.additionalFlags) === null || _a === void 0 ? void 0 : _a.excludeConfigFromURL) !== null && _b !== void 0 ? _b : (_c = this.embedConfig.additionalFlags) === null || _c === void 0 ? void 0 : _c.excludeConfigFromURL;
23921
+ return flag === true || flag === 'true';
23922
+ }
23923
+ async triggerUpdateEmbedParams() {
23924
+ try {
23925
+ const params = await this.getUpdateEmbedParamsObject();
23926
+ this.trigger(exports.HostEvent.UpdateEmbedParams, params);
23927
+ }
23928
+ catch (error) {
23929
+ logger$3.error(ERROR_MESSAGE.UPDATE_PARAMS_FAILED, error);
23930
+ this.handleError({
23931
+ errorType: ErrorDetailsTypes.API,
23932
+ message: (error === null || error === void 0 ? void 0 : error.message) || ERROR_MESSAGE.UPDATE_PARAMS_FAILED,
23933
+ code: EmbedErrorCodes.UPDATE_PARAMS_FAILED,
23934
+ error: (error === null || error === void 0 ? void 0 : error.message) || error,
23935
+ });
23936
+ }
23937
+ }
23550
23938
  beforePrerenderVisible() {
23551
23939
  // We can ignore this as its a bit expensive and the newer customers
23552
23940
  // have moved on to UpdateEmbedParams supported clusters
@@ -23557,17 +23945,7 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
23557
23945
  this.preRenderParamsApplied = new Promise((resolve) => {
23558
23946
  this.executeAfterEmbedContainerLoaded(async () => {
23559
23947
  try {
23560
- const params = await this.getUpdateEmbedParamsObject();
23561
- this.trigger(exports.HostEvent.UpdateEmbedParams, params);
23562
- }
23563
- catch (error) {
23564
- logger$3.error(ERROR_MESSAGE.UPDATE_PARAMS_FAILED, error);
23565
- this.handleError({
23566
- errorType: ErrorDetailsTypes.API,
23567
- message: (error === null || error === void 0 ? void 0 : error.message) || ERROR_MESSAGE.UPDATE_PARAMS_FAILED,
23568
- code: EmbedErrorCodes.UPDATE_PARAMS_FAILED,
23569
- error: (error === null || error === void 0 ? void 0 : error.message) || error,
23570
- });
23948
+ await this.triggerUpdateEmbedParams();
23571
23949
  }
23572
23950
  finally {
23573
23951
  setTimeout(resolve, UPDATE_EMBED_PARAMS_SETTLE_MS);
@@ -23701,19 +24079,21 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
23701
24079
  return;
23702
24080
  }
23703
24081
  const { zIndex } = this.getPreRenderConfig();
24082
+ // A hidden pre-render frame must add no scroll space to the host page.
23704
24083
  const preRenderHideStyles = {
23705
24084
  opacity: '0',
23706
24085
  pointerEvents: 'none',
23707
24086
  zIndex: zIndex !== undefined ? String(zIndex) : '-1000',
23708
- position: 'absolute',
24087
+ // Resolves to the viewport, so the hidden frame belongs to no
24088
+ // scroll container's overflow; syncPreRenderStyle restores absolute
24089
+ // on show.
24090
+ position: 'fixed',
23709
24091
  top: '0',
23710
24092
  left: '0',
23711
24093
  overflow: 'hidden',
23712
- // Keeps the measured size — so the next show needs no resize, which
23713
- // is the point of pre-rendering — while lifting the box out of
23714
- // the container's scrollable area. Overflow only extends
23715
- // downwards, so a hidden frame parked above the top edge adds
23716
- // none, where one left at full height shows as blank scroll space.
24094
+ // The one exception: a transformed or contained ancestor captures
24095
+ // `fixed`; parking above the top edge keeps it out of that
24096
+ // overflow.
23717
24097
  transform: PRERENDER_PARKED_TRANSFORM,
23718
24098
  };
23719
24099
  setStyleProperties(this.preRenderWrapper, preRenderHideStyles);
@@ -23902,7 +24282,7 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
23902
24282
  * @param dataSources A list of data source GUIDs
23903
24283
  */
23904
24284
  getIFrameSrc() {
23905
- const queryParams = this.getEmbedParamsObject();
24285
+ const queryParams = this.getUrlQueryParamsObject();
23906
24286
  const path = 'search-bar-embed';
23907
24287
  let query = '';
23908
24288
  const queryParamsString = getQueryParamString(queryParams, true);
@@ -24089,7 +24469,7 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
24089
24469
  }
24090
24470
  getEmbedParams() {
24091
24471
  const { runtimeParameters, runtimeFilters, excludeRuntimeParametersfromURL, excludeRuntimeFiltersfromURL, } = this.viewConfig;
24092
- const queryParams = this.getEmbedParamsObject();
24472
+ const queryParams = this.getUrlQueryParamsObject();
24093
24473
  let query = '';
24094
24474
  const queryParamsString = getQueryParamString(queryParams, true);
24095
24475
  if (queryParamsString) {
@@ -24422,8 +24802,11 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
24422
24802
  embedParams: { visualOverridesParams: visualOverrides },
24423
24803
  };
24424
24804
  }
24805
+ // The app reads enableSpotterInstructionAndMoreSettings from the top level
24806
+ // of embedParams, so lift it out of the sidebar config.
24807
+ const { enableSpotterInstructionAndMoreSettings, ...sidebarConfigRest } = spotterSidebarConfig || {};
24425
24808
  const resolvedSidebarConfig = {
24426
- ...spotterSidebarConfig,
24809
+ ...sidebarConfigRest,
24427
24810
  ...(resolvedEnablePastConversations !== undefined && {
24428
24811
  enablePastConversationsSidebar: resolvedEnablePastConversations,
24429
24812
  }),
@@ -24445,6 +24828,9 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
24445
24828
  embedParams: {
24446
24829
  ...(defaultAppInitData.embedParams || {}),
24447
24830
  spotterSidebarConfig: resolvedSidebarConfig,
24831
+ ...(enableSpotterInstructionAndMoreSettings !== undefined
24832
+ ? { enableSpotterInstructionAndMoreSettings }
24833
+ : {}),
24448
24834
  ...(visualOverrides !== undefined ? { visualOverridesParams: visualOverrides } : {}),
24449
24835
  },
24450
24836
  };
@@ -24485,7 +24871,19 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
24485
24871
  spotterAnalystConfig,
24486
24872
  },
24487
24873
  };
24488
- }
24874
+ }
24875
+ /**
24876
+ * The Spotter experience version to load in the embedded view.
24877
+ * @version SDK: 1.53.0 | ThoughtSpot Cloud: 26.11.0.cl
24878
+ * @group Embed components
24879
+ */
24880
+ var SpotterExperienceVersion;
24881
+ (function (SpotterExperienceVersion) {
24882
+ /**
24883
+ * The Spotter experience version introduced in ThoughtSpot 26.11.
24884
+ */
24885
+ SpotterExperienceVersion["SPOTTER_2026_11"] = "spotter_2026_11";
24886
+ })(SpotterExperienceVersion || (SpotterExperienceVersion = {}));
24489
24887
 
24490
24888
  function buildSpotterVizAppInitData(initData, viewConfig) {
24491
24889
  const { spotterViz } = viewConfig;
@@ -24682,12 +25080,12 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
24682
25080
  * embedded Liveboard or visualization.
24683
25081
  */
24684
25082
  getEmbedParams() {
24685
- const params = this.getEmbedParamsObject();
25083
+ const params = this.getUrlQueryParamsObject();
24686
25084
  return getQueryParamString(params, true);
24687
25085
  }
24688
25086
  getEmbedParamsObject() {
24689
25087
  var _a;
24690
- const { tag, hideTagFilterChips, hideObjects, liveboardV2, showPrimaryNavbar, disableProfileAndHelp, hideHamburger, hideObjectSearch, hideNotification, hideApplicationSwitcher, hideOrgSwitcher, enableSearchAssist, newConnectionsExperience, dataPanelV2 = true, updatedSpotterExperience, hideLiveboardHeader = false, showLiveboardTitle = true, showLiveboardDescription = true, showMaskedFilterChip = false, isLiveboardMasterpiecesEnabled, newChartsLibrary, hideHomepageLeftNav = false, modularHomeExperience, isLiveboardHeaderSticky = true, enableAskSage, collapseSearchBarInitially = false, enable2ColumnLayout, isLiveboardAlwaysOn12ColLayout, enableCustomColumnGroups = false, dataPanelCustomGroupsAccordionInitialState = DataPanelCustomColumnGroupsAccordionState.EXPAND_ALL, collapseSearchBar = true, isLiveboardCompactHeaderEnabled, showLiveboardVerifiedBadge = true, showLiveboardReverifyBanner = true, hideIrrelevantChipsInLiveboardTabs, isEnhancedFilterInteractivityEnabled, homePageSearchBarMode, isUnifiedSearchExperienceEnabled = true, enablePendoHelp = true, discoveryExperience, coverAndFilterOptionInPDF, isLiveboardStylingAndGroupingEnabled, liveboardGutter, isPNGInScheduledEmailsEnabled = false, isLiveboardXLSXCSVDownloadEnabled, isGranularXLSXCSVSchedulesEnabled, isCentralizedLiveboardFilterUXEnabled = false, isScopedLiveboardFilteringEnabled, isLinkParametersEnabled, updatedSpotterChatPrompt, showSpotterRadiance, defaultQueryMode, enableStopAnswerGenerationEmbed, spotterChatConfig, spotterDataSources, isThisPeriodInDateFiltersEnabled, enableHomepageAnnouncement = false, isContinuousLiveboardPDFEnabled, enableLiveboardDataCache, hideAnswerEditPanel, } = this.viewConfig;
25088
+ const { tag, hideTagFilterChips, hideObjects, liveboardV2, showPrimaryNavbar, disableProfileAndHelp, hideHamburger, hideObjectSearch, hideNotification, hideApplicationSwitcher, hideOrgSwitcher, enableSearchAssist, newConnectionsExperience, dataPanelV2 = true, updatedSpotterExperience, hideLiveboardHeader = false, showLiveboardTitle = true, showLiveboardDescription = true, showMaskedFilterChip = false, isLiveboardMasterpiecesEnabled, newChartsLibrary, hideHomepageLeftNav = false, modularHomeExperience, isLiveboardHeaderSticky = true, enableAskSage, collapseSearchBarInitially = false, enable2ColumnLayout, isLiveboardAlwaysOn12ColLayout, enableCustomColumnGroups = false, dataPanelCustomGroupsAccordionInitialState = DataPanelCustomColumnGroupsAccordionState.EXPAND_ALL, collapseSearchBar = true, isLiveboardCompactHeaderEnabled, showLiveboardVerifiedBadge = true, showLiveboardReverifyBanner = true, hideIrrelevantChipsInLiveboardTabs, isEnhancedFilterInteractivityEnabled, homePageSearchBarMode, isUnifiedSearchExperienceEnabled = true, enablePendoHelp = true, discoveryExperience, coverAndFilterOptionInPDF, isLiveboardStylingAndGroupingEnabled, liveboardGutter, isPNGInScheduledEmailsEnabled = false, isLiveboardXLSXCSVDownloadEnabled, isGranularXLSXCSVSchedulesEnabled, isCentralizedLiveboardFilterUXEnabled = false, isScopedLiveboardFilteringEnabled, isLinkParametersEnabled, updatedSpotterChatPrompt, showSpotterRadiance, defaultQueryMode, enableStopAnswerGenerationEmbed, spotterChatConfig, spotterDataSources, isThisPeriodInDateFiltersEnabled, enableHomepageAnnouncement = false, isContinuousLiveboardPDFEnabled, enableLiveboardDataCache, hideAnswerEditPanel, spotterExperienceVersion, } = this.viewConfig;
24691
25089
  let params = {};
24692
25090
  params[Param.PrimaryNavHidden] = !showPrimaryNavbar;
24693
25091
  params[Param.HideProfleAndHelp] = !!disableProfileAndHelp;
@@ -24742,6 +25140,9 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
24742
25140
  if (spotterDataSources && spotterDataSources.length) {
24743
25141
  params[Param.SpotterDataSources] = JSON.stringify(spotterDataSources);
24744
25142
  }
25143
+ if (spotterExperienceVersion !== undefined) {
25144
+ params[Param.SpotterExperienceVersion] = spotterExperienceVersion;
25145
+ }
24745
25146
  // Handle spotterChatConfig params
24746
25147
  if (spotterChatConfig) {
24747
25148
  const { hideToolResponseCardBranding, toolResponseCardBrandingLabel, spotterFileUploadEnabled, spotterFileUploadFileTypes, enableStarterPrompts, openSpotterOnLiveboardByDefault, } = spotterChatConfig;
@@ -24860,7 +25261,7 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
24860
25261
  }
24861
25262
  // Navigation V1/V2 and home page V1/V2 are deprecated. V3 is now the
24862
25263
  // default experience, Need to send navigationVersion=v3 and
24863
- // homepageVersion=v3 even when the no discoveryExperience /
25264
+ // homepageVersion=v3 even when the no discoveryExperience /
24864
25265
  // modularHomeExperience config is set. Without these
24865
25266
  // params, older TSA versions (< 26.7) fall back to V2 for nav and
24866
25267
  // home page, so the defaults must be sent explicitly from the SDK.
@@ -25109,6 +25510,21 @@ query GetEurekaVizSnapshots(
25109
25510
  document.head.insertAdjacentHTML('beforeend', previewStyles);
25110
25511
  };
25111
25512
 
25513
+ function buildLiveboardOverrideAppInitData(initData, viewConfig) {
25514
+ var _a;
25515
+ const { liveboardOverride } = viewConfig;
25516
+ // ThoughtSpot ignores an override with no data source entries; skip it.
25517
+ if (!((_a = liveboardOverride === null || liveboardOverride === void 0 ? void 0 : liveboardOverride.dataSourceOverride) === null || _a === void 0 ? void 0 : _a.length))
25518
+ return initData;
25519
+ return {
25520
+ ...initData,
25521
+ embedParams: {
25522
+ ...(initData.embedParams || {}),
25523
+ liveboardOverride,
25524
+ },
25525
+ };
25526
+ }
25527
+
25112
25528
  /**
25113
25529
  * Copyright (c) 2022
25114
25530
  *
@@ -25178,14 +25594,15 @@ query GetEurekaVizSnapshots(
25178
25594
  async getAppInitData() {
25179
25595
  const defaultAppInitData = await super.getAppInitData();
25180
25596
  const vizInitData = buildSpotterVizAppInitData(defaultAppInitData, this.viewConfig);
25181
- return buildStarterPromptsAppInitData(vizInitData, this.viewConfig);
25597
+ const starterPromptsInitData = buildStarterPromptsAppInitData(vizInitData, this.viewConfig);
25598
+ return buildLiveboardOverrideAppInitData(starterPromptsInitData, this.viewConfig);
25182
25599
  }
25183
25600
  /**
25184
25601
  * Construct a map of params to be passed on to the
25185
25602
  * embedded Liveboard or visualization.
25186
25603
  */
25187
25604
  getEmbedParams() {
25188
- const params = this.getEmbedParamsObject();
25605
+ const params = this.getUrlQueryParamsObject();
25189
25606
  const queryParams = getQueryParamString(params, true);
25190
25607
  return queryParams;
25191
25608
  }
@@ -25193,7 +25610,7 @@ query GetEurekaVizSnapshots(
25193
25610
  var _a;
25194
25611
  let params = {};
25195
25612
  params = this.getBaseQueryParams(params);
25196
- const { enableVizTransformations, visibleVizs, liveboardV2, vizId, hideTabPanel, activeTabId, hideLiveboardHeader, showLiveboardDescription, showLiveboardTitle, isLiveboardHeaderSticky = true, isLiveboardCompactHeaderEnabled, showLiveboardVerifiedBadge = true, showLiveboardReverifyBanner = true, hideIrrelevantChipsInLiveboardTabs, showMaskedFilterChip = false, isLiveboardMasterpiecesEnabled, newChartsLibrary, isEnhancedFilterInteractivityEnabled, enableAskSage, enable2ColumnLayout, isLiveboardAlwaysOn12ColLayout, dataPanelV2 = true, updatedSpotterExperience, enableCustomColumnGroups = false, oAuthPollingInterval, isForceRedirect, dataSourceId, coverAndFilterOptionInPDF, isLiveboardStylingAndGroupingEnabled, liveboardGutter, isPNGInScheduledEmailsEnabled = false, isLiveboardXLSXCSVDownloadEnabled, isGranularXLSXCSVSchedulesEnabled, showSpotterLimitations, isCentralizedLiveboardFilterUXEnabled = false, isScopedLiveboardFilteringEnabled, isLinkParametersEnabled, updatedSpotterChatPrompt, showSpotterRadiance, enableStopAnswerGenerationEmbed, spotterChatConfig, isThisPeriodInDateFiltersEnabled, isContinuousLiveboardPDFEnabled, enableLiveboardDataCache, } = this.viewConfig;
25613
+ const { enableVizTransformations, visibleVizs, liveboardV2, vizId, hideTabPanel, activeTabId, hideLiveboardHeader, showLiveboardDescription, showLiveboardTitle, isLiveboardHeaderSticky = true, isLiveboardCompactHeaderEnabled, showLiveboardVerifiedBadge = true, showLiveboardReverifyBanner = true, hideIrrelevantChipsInLiveboardTabs, showMaskedFilterChip = false, isLiveboardMasterpiecesEnabled, newChartsLibrary, isEnhancedFilterInteractivityEnabled, enableAskSage, enable2ColumnLayout, isLiveboardAlwaysOn12ColLayout, dataPanelV2 = true, updatedSpotterExperience, enableCustomColumnGroups = false, oAuthPollingInterval, isForceRedirect, dataSourceId, coverAndFilterOptionInPDF, isLiveboardStylingAndGroupingEnabled, liveboardGutter, isPNGInScheduledEmailsEnabled = false, isLiveboardXLSXCSVDownloadEnabled, isGranularXLSXCSVSchedulesEnabled, showSpotterLimitations, isCentralizedLiveboardFilterUXEnabled = false, isScopedLiveboardFilteringEnabled, isLinkParametersEnabled, updatedSpotterChatPrompt, showSpotterRadiance, enableStopAnswerGenerationEmbed, spotterChatConfig, isThisPeriodInDateFiltersEnabled, isContinuousLiveboardPDFEnabled, enableLiveboardDataCache, spotterExperienceVersion, } = this.viewConfig;
25197
25614
  const preventLiveboardFilterRemoval = this.viewConfig.preventLiveboardFilterRemoval
25198
25615
  || this.viewConfig.preventPinboardFilterRemoval;
25199
25616
  (_a = this.fullHeightController) === null || _a === void 0 ? void 0 : _a.addQueryParams(params);
@@ -25255,6 +25672,9 @@ query GetEurekaVizSnapshots(
25255
25672
  if (isLiveboardStylingAndGroupingEnabled !== undefined) {
25256
25673
  params[Param.IsLiveboardStylingAndGroupingEnabled] = isLiveboardStylingAndGroupingEnabled;
25257
25674
  }
25675
+ if (spotterExperienceVersion !== undefined) {
25676
+ params[Param.SpotterExperienceVersion] = spotterExperienceVersion;
25677
+ }
25258
25678
  if (liveboardGutter !== undefined) {
25259
25679
  params[Param.LiveboardGutter] = liveboardGutter;
25260
25680
  }
@@ -25427,7 +25847,7 @@ query GetEurekaVizSnapshots(
25427
25847
  // instance. React builds a new instance per mount, so an equal config
25428
25848
  // is a hide/show, not a hand-over: there is nothing stale to clear.
25429
25849
  const previous = this.getPreRenderObj();
25430
- const showing = this.isSameEmbedConfig(previous)
25850
+ const previousRoute = this.isSameEmbedConfig(previous)
25431
25851
  ? undefined
25432
25852
  : previous === null || previous === void 0 ? void 0 : previous.currentLiveboardState;
25433
25853
  this.executeAfterEmbedContainerLoaded(async () => {
@@ -25435,7 +25855,7 @@ query GetEurekaVizSnapshots(
25435
25855
  // Navigate goes out first, so the container loads with the previous
25436
25856
  // config's filters.
25437
25857
  await this.preRenderParamsApplied;
25438
- if (this.isShowingLiveboardRoute(showing)) {
25858
+ if (this.isAlreadyOnSameRoute(previousRoute)) {
25439
25859
  // Navigate to the route we are already on is a no-op, so the
25440
25860
  // liveboard keeps its state. Home unmounts the container, which
25441
25861
  // clears it.
@@ -25456,18 +25876,9 @@ query GetEurekaVizSnapshots(
25456
25876
  };
25457
25877
  });
25458
25878
  }
25459
- /**
25460
- * Whether `previous` was showing what this instance is about to show.
25461
- *
25462
- * Undefined-valued keys are dropped before comparing. `navigateToLiveboard`
25463
- * assigns `vizId`, `activeTabId` and `personalizedViewId` unconditionally,
25464
- * so an instance that has been shown once carries those keys as `undefined`
25465
- * while a freshly constructed one does not have them at all. `isEqual`
25466
- * counts own keys, so without this the comparison can never be true after
25467
- * the first show — which is the whole case this exists for.
25468
- *
25469
- * Callbacks compare as equal: React passes a fresh closure per render.
25470
- */
25879
+ // definedEntries drops undefined-valued keys: a shown instance carries
25880
+ // vizId/activeTabId/etc as undefined, so a raw isEqual never matches again.
25881
+ // Functions compare equal, since React passes a fresh closure per render.
25471
25882
  isSameEmbedConfig(previous) {
25472
25883
  if (!previous)
25473
25884
  return false;
@@ -25478,14 +25889,14 @@ query GetEurekaVizSnapshots(
25478
25889
  // The whole route, not just the liveboard id: the path is built from the
25479
25890
  // viz, tab and view too, so a same-liveboard show onto another tab is a
25480
25891
  // real navigation.
25481
- isShowingLiveboardRoute(showing) {
25482
- if (!(showing === null || showing === void 0 ? void 0 : showing.liveboardId))
25892
+ isAlreadyOnSameRoute(previousRoute) {
25893
+ if (!(previousRoute === null || previousRoute === void 0 ? void 0 : previousRoute.liveboardId))
25483
25894
  return false;
25484
25895
  const { liveboardId, vizId, activeTabId, personalizedViewId, } = this.viewConfig;
25485
- return showing.liveboardId === liveboardId
25486
- && showing.vizId === vizId
25487
- && showing.activeTabId === activeTabId
25488
- && showing.personalizedViewId === personalizedViewId;
25896
+ return previousRoute.liveboardId === liveboardId
25897
+ && previousRoute.vizId === vizId
25898
+ && previousRoute.activeTabId === activeTabId
25899
+ && previousRoute.personalizedViewId === personalizedViewId;
25489
25900
  }
25490
25901
  async handleRenderForPrerender() {
25491
25902
  if (isUndefined$1(this.viewConfig.liveboardId)) {
@@ -25979,7 +26390,7 @@ query SendMessage($params: Input_convassist_SendMessageRequest) {
25979
26390
  getIframeSrc() {
25980
26391
  const { sessionId, genNo, acSessionId, acGenNo, convId, messageId, } = this.viewConfig;
25981
26392
  const path = 'conv-assist-answer';
25982
- const queryParams = this.getEmbedParamsObject();
26393
+ const queryParams = this.getUrlQueryParamsObject();
25983
26394
  let query = '';
25984
26395
  const queryParamsString = getQueryParamString(queryParams, true);
25985
26396
  if (queryParamsString) {
@@ -26171,18 +26582,22 @@ query SendMessage($params: Input_convassist_SendMessageRequest) {
26171
26582
  }
26172
26583
  }
26173
26584
  setParamIfDefined(queryParams, Param.UpdatedSpotterExperience, updatedSpotterExperience, true);
26585
+ setParamIfDefined(queryParams, Param.SpotterExperienceVersion, this.viewConfig.spotterExperienceVersion);
26174
26586
  return queryParams;
26175
26587
  }
26176
26588
  getIframeSrc() {
26177
- const { worksheetId, searchOptions, runtimeFilters, excludeRuntimeFiltersfromURL, runtimeParameters, excludeRuntimeParametersfromURL, sharedConversationId, dataSources, } = this.viewConfig;
26589
+ const { worksheetId, searchOptions, runtimeFilters, excludeRuntimeFiltersfromURL, runtimeParameters, excludeRuntimeParametersfromURL, sharedConversationId, dataSources, spotterExperienceVersion, } = this.viewConfig;
26178
26590
  // Deep-link into the read-only shared-conversation reader view when a
26179
26591
  // shared conversation id is supplied (e.g. a recipient landing from a
26180
26592
  // host-configured CONVERSATION_URL share link); otherwise the normal
26181
26593
  // Spotter conversation surface.
26182
- const path = sharedConversationId
26594
+ let path = sharedConversationId
26183
26595
  ? `insights/conv-assist/s/${encodeURIComponent(sharedConversationId)}`
26184
26596
  : 'insights/conv-assist';
26185
- const queryParams = this.getEmbedParamsObject();
26597
+ if (spotterExperienceVersion === SpotterExperienceVersion.SPOTTER_2026_11) {
26598
+ path = path.replace('insights/conv-assist', 'insights/spotter');
26599
+ }
26600
+ const queryParams = this.getUrlQueryParamsObject();
26186
26601
  let query = '';
26187
26602
  const queryParamsString = getQueryParamString(queryParams, true);
26188
26603
  if (queryParamsString) {