@thoughtspot/visual-embed-sdk 1.45.2 → 1.45.3

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 (140) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/css-variables.d.ts +48 -0
  3. package/cjs/src/css-variables.d.ts.map +1 -1
  4. package/cjs/src/embed/app.d.ts +37 -0
  5. package/cjs/src/embed/app.d.ts.map +1 -1
  6. package/cjs/src/embed/app.js +37 -1
  7. package/cjs/src/embed/app.js.map +1 -1
  8. package/cjs/src/embed/app.spec.js +24 -0
  9. package/cjs/src/embed/app.spec.js.map +1 -1
  10. package/cjs/src/embed/conversation.d.ts +127 -9
  11. package/cjs/src/embed/conversation.d.ts.map +1 -1
  12. package/cjs/src/embed/conversation.js +41 -18
  13. package/cjs/src/embed/conversation.js.map +1 -1
  14. package/cjs/src/embed/conversation.spec.js +96 -3
  15. package/cjs/src/embed/conversation.spec.js.map +1 -1
  16. package/cjs/src/embed/liveboard.d.ts +38 -1
  17. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  18. package/cjs/src/embed/liveboard.js +38 -10
  19. package/cjs/src/embed/liveboard.js.map +1 -1
  20. package/cjs/src/embed/liveboard.spec.js +179 -7
  21. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  22. package/cjs/src/errors.d.ts +1 -0
  23. package/cjs/src/errors.d.ts.map +1 -1
  24. package/cjs/src/errors.js +1 -0
  25. package/cjs/src/errors.js.map +1 -1
  26. package/cjs/src/index.d.ts +3 -3
  27. package/cjs/src/index.d.ts.map +1 -1
  28. package/cjs/src/index.js.map +1 -1
  29. package/cjs/src/types.d.ts +192 -40
  30. package/cjs/src/types.d.ts.map +1 -1
  31. package/cjs/src/types.js +184 -19
  32. package/cjs/src/types.js.map +1 -1
  33. package/cjs/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
  34. package/cjs/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
  35. package/cjs/src/utils/graphql/answerService/answer-queries.js +23 -1
  36. package/cjs/src/utils/graphql/answerService/answer-queries.js.map +1 -1
  37. package/cjs/src/utils/graphql/answerService/answerService.d.ts +2 -1
  38. package/cjs/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  39. package/cjs/src/utils/graphql/answerService/answerService.js +9 -1
  40. package/cjs/src/utils/graphql/answerService/answerService.js.map +1 -1
  41. package/cjs/src/utils/graphql/answerService/answerService.spec.js +73 -0
  42. package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  43. package/cjs/src/utils.d.ts +15 -0
  44. package/cjs/src/utils.d.ts.map +1 -1
  45. package/cjs/src/utils.js +33 -1
  46. package/cjs/src/utils.js.map +1 -1
  47. package/cjs/src/utils.spec.js +49 -0
  48. package/cjs/src/utils.spec.js.map +1 -1
  49. package/dist/{index-BdkKLLo1.js → index-BuwECGdm.js} +1 -1
  50. package/dist/src/css-variables.d.ts +48 -0
  51. package/dist/src/css-variables.d.ts.map +1 -1
  52. package/dist/src/embed/app.d.ts +37 -0
  53. package/dist/src/embed/app.d.ts.map +1 -1
  54. package/dist/src/embed/conversation.d.ts +127 -9
  55. package/dist/src/embed/conversation.d.ts.map +1 -1
  56. package/dist/src/embed/liveboard.d.ts +38 -1
  57. package/dist/src/embed/liveboard.d.ts.map +1 -1
  58. package/dist/src/errors.d.ts +1 -0
  59. package/dist/src/errors.d.ts.map +1 -1
  60. package/dist/src/index.d.ts +3 -3
  61. package/dist/src/index.d.ts.map +1 -1
  62. package/dist/src/types.d.ts +192 -40
  63. package/dist/src/types.d.ts.map +1 -1
  64. package/dist/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
  65. package/dist/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
  66. package/dist/src/utils/graphql/answerService/answerService.d.ts +2 -1
  67. package/dist/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  68. package/dist/src/utils.d.ts +15 -0
  69. package/dist/src/utils.d.ts.map +1 -1
  70. package/dist/tsembed-react.es.js +364 -52
  71. package/dist/tsembed-react.js +363 -51
  72. package/dist/tsembed.es.js +364 -52
  73. package/dist/tsembed.js +363 -51
  74. package/dist/visual-embed-sdk-react-full.d.ts +696 -342
  75. package/dist/visual-embed-sdk-react.d.ts +685 -331
  76. package/dist/visual-embed-sdk.d.ts +757 -379
  77. package/lib/package.json +1 -1
  78. package/lib/src/css-variables.d.ts +48 -0
  79. package/lib/src/css-variables.d.ts.map +1 -1
  80. package/lib/src/embed/app.d.ts +37 -0
  81. package/lib/src/embed/app.d.ts.map +1 -1
  82. package/lib/src/embed/app.js +39 -3
  83. package/lib/src/embed/app.js.map +1 -1
  84. package/lib/src/embed/app.spec.js +24 -0
  85. package/lib/src/embed/app.spec.js.map +1 -1
  86. package/lib/src/embed/conversation.d.ts +127 -9
  87. package/lib/src/embed/conversation.d.ts.map +1 -1
  88. package/lib/src/embed/conversation.js +42 -19
  89. package/lib/src/embed/conversation.js.map +1 -1
  90. package/lib/src/embed/conversation.spec.js +96 -3
  91. package/lib/src/embed/conversation.spec.js.map +1 -1
  92. package/lib/src/embed/liveboard.d.ts +38 -1
  93. package/lib/src/embed/liveboard.d.ts.map +1 -1
  94. package/lib/src/embed/liveboard.js +39 -11
  95. package/lib/src/embed/liveboard.js.map +1 -1
  96. package/lib/src/embed/liveboard.spec.js +179 -7
  97. package/lib/src/embed/liveboard.spec.js.map +1 -1
  98. package/lib/src/errors.d.ts +1 -0
  99. package/lib/src/errors.d.ts.map +1 -1
  100. package/lib/src/errors.js +1 -0
  101. package/lib/src/errors.js.map +1 -1
  102. package/lib/src/index.d.ts +3 -3
  103. package/lib/src/index.d.ts.map +1 -1
  104. package/lib/src/index.js.map +1 -1
  105. package/lib/src/types.d.ts +192 -40
  106. package/lib/src/types.d.ts.map +1 -1
  107. package/lib/src/types.js +184 -19
  108. package/lib/src/types.js.map +1 -1
  109. package/lib/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
  110. package/lib/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
  111. package/lib/src/utils/graphql/answerService/answer-queries.js +22 -0
  112. package/lib/src/utils/graphql/answerService/answer-queries.js.map +1 -1
  113. package/lib/src/utils/graphql/answerService/answerService.d.ts +2 -1
  114. package/lib/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  115. package/lib/src/utils/graphql/answerService/answerService.js +9 -1
  116. package/lib/src/utils/graphql/answerService/answerService.js.map +1 -1
  117. package/lib/src/utils/graphql/answerService/answerService.spec.js +73 -0
  118. package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  119. package/lib/src/utils.d.ts +15 -0
  120. package/lib/src/utils.d.ts.map +1 -1
  121. package/lib/src/utils.js +30 -0
  122. package/lib/src/utils.js.map +1 -1
  123. package/lib/src/utils.spec.js +50 -1
  124. package/lib/src/utils.spec.js.map +1 -1
  125. package/package.json +1 -1
  126. package/src/css-variables.ts +60 -0
  127. package/src/embed/app.spec.ts +32 -0
  128. package/src/embed/app.ts +97 -1
  129. package/src/embed/conversation.spec.ts +117 -3
  130. package/src/embed/conversation.ts +188 -29
  131. package/src/embed/liveboard.spec.ts +264 -10
  132. package/src/embed/liveboard.ts +100 -11
  133. package/src/errors.ts +1 -0
  134. package/src/index.ts +5 -1
  135. package/src/types.ts +193 -40
  136. package/src/utils/graphql/answerService/answer-queries.ts +23 -0
  137. package/src/utils/graphql/answerService/answerService.spec.ts +87 -0
  138. package/src/utils/graphql/answerService/answerService.ts +13 -1
  139. package/src/utils.spec.ts +56 -0
  140. package/src/utils.ts +36 -0
@@ -295,7 +295,9 @@ describe('ConversationEmbed', () => {
295
295
  searchOptions: {
296
296
  searchQuery: 'searchQuery',
297
297
  },
298
- enablePastConversationsSidebar: true,
298
+ spotterSidebarConfig: {
299
+ enablePastConversationsSidebar: true,
300
+ },
299
301
  };
300
302
 
301
303
  const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
@@ -312,7 +314,9 @@ describe('ConversationEmbed', () => {
312
314
  searchOptions: {
313
315
  searchQuery: 'searchQuery',
314
316
  },
315
- enablePastConversationsSidebar: false,
317
+ spotterSidebarConfig: {
318
+ enablePastConversationsSidebar: false,
319
+ },
316
320
  };
317
321
 
318
322
  const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
@@ -334,7 +338,9 @@ describe('ConversationEmbed', () => {
334
338
  dataPanelV2: true,
335
339
  showSpotterLimitations: true,
336
340
  hideSampleQuestions: true,
337
- enablePastConversationsSidebar: true,
341
+ spotterSidebarConfig: {
342
+ enablePastConversationsSidebar: true,
343
+ },
338
344
  };
339
345
 
340
346
  const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
@@ -345,6 +351,44 @@ describe('ConversationEmbed', () => {
345
351
  );
346
352
  });
347
353
 
354
+ it('should render the conversation embed with tool response card branding hidden', async () => {
355
+ const viewConfig: SpotterEmbedViewConfig = {
356
+ worksheetId: 'worksheetId',
357
+ searchOptions: {
358
+ searchQuery: 'searchQuery',
359
+ },
360
+ spotterChatConfig: {
361
+ hideToolResponseCardBranding: true,
362
+ },
363
+ };
364
+
365
+ const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
366
+ await conversationEmbed.render();
367
+ expectUrlMatchesWithParams(
368
+ getIFrameSrc(),
369
+ `http://${thoughtSpotHost}/v2/?${defaultParams}&isSpotterExperienceEnabled=true&hideToolResponseCardBranding=true#/embed/insights/conv-assist?worksheet=worksheetId&query=searchQuery`,
370
+ );
371
+ });
372
+
373
+ it('should render the conversation embed with custom tool response card branding label', async () => {
374
+ const viewConfig: SpotterEmbedViewConfig = {
375
+ worksheetId: 'worksheetId',
376
+ searchOptions: {
377
+ searchQuery: 'searchQuery',
378
+ },
379
+ spotterChatConfig: {
380
+ toolResponseCardBrandingLabel: 'MyBrand',
381
+ },
382
+ };
383
+
384
+ const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
385
+ await conversationEmbed.render();
386
+ expectUrlMatchesWithParams(
387
+ getIFrameSrc(),
388
+ `http://${thoughtSpotHost}/v2/?${defaultParams}&isSpotterExperienceEnabled=true&toolResponseCardBrandingLabel=MyBrand#/embed/insights/conv-assist?worksheet=worksheetId&query=searchQuery`,
389
+ );
390
+ });
391
+
348
392
  it('should ensure deprecated ConversationEmbed class maintains same functionality as SpotterEmbed', async () => {
349
393
  const viewConfig: SpotterEmbedViewConfig = {
350
394
  worksheetId: 'worksheetId',
@@ -402,4 +446,74 @@ describe('ConversationEmbed', () => {
402
446
  `http://${thoughtSpotHost}/v2/?${defaultParams}&isSpotterExperienceEnabled=true&updatedSpotterChatPrompt=false#/embed/insights/conv-assist?worksheet=worksheetId&query=searchQuery`,
403
447
  );
404
448
  });
449
+
450
+ describe('spotter sidebar config params', () => {
451
+ it.each([
452
+ ['enablePastConversationsSidebar', true, 'enablePastConversationsSidebar=true'],
453
+ ['spotterSidebarTitle', 'My Conversations', 'spotterSidebarTitle=My%20Conversations'],
454
+ ['spotterSidebarDefaultExpanded', true, 'spotterSidebarDefaultExpanded=true'],
455
+ ['spotterChatRenameLabel', 'Edit Name', 'spotterChatRenameLabel=Edit%20Name'],
456
+ ['spotterChatDeleteLabel', 'Remove', 'spotterChatDeleteLabel=Remove'],
457
+ ['spotterDeleteConversationModalTitle', 'Remove Conversation', 'spotterDeleteConversationModalTitle=Remove%20Conversation'],
458
+ ['spotterPastConversationAlertMessage', 'Viewing past conversation', 'spotterPastConversationAlertMessage=Viewing%20past%20conversation'],
459
+ ['spotterBestPracticesLabel', 'Help Tips', 'spotterBestPracticesLabel=Help%20Tips'],
460
+ ['spotterConversationsBatchSize', 50, 'spotterConversationsBatchSize=50'],
461
+ ['spotterNewChatButtonTitle', 'Start New Conversation', 'spotterNewChatButtonTitle=Start%20New%20Conversation'],
462
+ ['spotterDocumentationUrl', 'https://docs.example.com/spotter', 'spotterDocumentationUrl=https%3A%2F%2Fdocs.example.com%2Fspotter'],
463
+ ])('should render with spotterSidebarConfig.%s', async (configKey, configValue, expectedParam) => {
464
+ const viewConfig: SpotterEmbedViewConfig = {
465
+ worksheetId: 'worksheetId',
466
+ spotterSidebarConfig: {
467
+ [configKey]: configValue,
468
+ },
469
+ };
470
+ const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
471
+ await conversationEmbed.render();
472
+ expectUrlMatchesWithParams(
473
+ getIFrameSrc(),
474
+ `http://${thoughtSpotHost}/v2/?${defaultParams}&isSpotterExperienceEnabled=true&${expectedParam}#/embed/insights/conv-assist?worksheet=worksheetId&query=`,
475
+ );
476
+ });
477
+
478
+ it.each([
479
+ ['invalid URL format', 'invalid-url'],
480
+ ['invalid protocol (ftp)', 'ftp://docs.example.com/spotter'],
481
+ ])('should handle error for spotterSidebarConfig.spotterDocumentationUrl with %s', async (_, invalidUrl) => {
482
+ const viewConfig: SpotterEmbedViewConfig = {
483
+ worksheetId: 'worksheetId',
484
+ spotterSidebarConfig: {
485
+ spotterDocumentationUrl: invalidUrl,
486
+ },
487
+ };
488
+ const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
489
+ (conversationEmbed as any).handleError = jest.fn();
490
+ await conversationEmbed.render();
491
+ expect((conversationEmbed as any).handleError).toHaveBeenCalledWith(
492
+ expect.objectContaining({
493
+ errorType: ErrorDetailsTypes.VALIDATION_ERROR,
494
+ message: ERROR_MESSAGE.INVALID_SPOTTER_DOCUMENTATION_URL,
495
+ code: EmbedErrorCodes.INVALID_URL,
496
+ }),
497
+ );
498
+ });
499
+
500
+ it('should render with multiple spotterSidebarConfig options', async () => {
501
+ const viewConfig: SpotterEmbedViewConfig = {
502
+ worksheetId: 'worksheetId',
503
+ spotterSidebarConfig: {
504
+ enablePastConversationsSidebar: true,
505
+ spotterSidebarTitle: 'Chats',
506
+ spotterSidebarDefaultExpanded: true,
507
+ spotterNewChatButtonTitle: 'New',
508
+ spotterConversationsBatchSize: 25,
509
+ },
510
+ };
511
+ const conversationEmbed = new SpotterEmbed(getRootEl(), viewConfig);
512
+ await conversationEmbed.render();
513
+ expectUrlMatchesWithParams(
514
+ getIFrameSrc(),
515
+ `http://${thoughtSpotHost}/v2/?${defaultParams}&isSpotterExperienceEnabled=true&enablePastConversationsSidebar=true&spotterSidebarDefaultExpanded=true&spotterSidebarTitle=Chats&spotterConversationsBatchSize=25&spotterNewChatButtonTitle=New#/embed/insights/conv-assist?worksheet=worksheetId&query=`,
516
+ );
517
+ });
518
+ });
405
519
  });
@@ -2,7 +2,7 @@ import isUndefined from 'lodash/isUndefined';
2
2
  import { ERROR_MESSAGE } from '../errors';
3
3
  import { Param, BaseViewConfig, RuntimeFilter, RuntimeParameter, ErrorDetailsTypes, EmbedErrorCodes } from '../types';
4
4
  import { TsEmbed } from './ts-embed';
5
- import { getQueryParamString, getFilterQuery, getRuntimeParameters } from '../utils';
5
+ import { getQueryParamString, getFilterQuery, getRuntimeParameters, validateHttpUrl, setParamIfDefined } from '../utils';
6
6
 
7
7
  /**
8
8
  * Configuration for search options
@@ -14,6 +14,106 @@ export interface SearchOptions {
14
14
  searchQuery: string;
15
15
  }
16
16
 
17
+ /**
18
+ * Configuration for the Spotter sidebar.
19
+ * Can be used in SpotterEmbed and AppEmbed.
20
+ * @group Embed components
21
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
22
+ */
23
+ export interface SpotterSidebarViewConfig {
24
+ /**
25
+ * Controls the visibility of the past conversations sidebar.
26
+ * @default false
27
+ * @version SDK: 1.45.0 | ThoughtSpot: 26.2.0.cl
28
+ */
29
+ enablePastConversationsSidebar?: boolean;
30
+ /**
31
+ * Custom title text for the sidebar header.
32
+ * Defaults to translated "Spotter" text.
33
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
34
+ */
35
+ spotterSidebarTitle?: string;
36
+ /**
37
+ * Boolean to set the default expanded state of the sidebar.
38
+ * @default false
39
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
40
+ */
41
+ spotterSidebarDefaultExpanded?: boolean;
42
+ /**
43
+ * Custom label text for the rename action in the conversation edit menu.
44
+ * Defaults to translated "Rename" text.
45
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
46
+ */
47
+ spotterChatRenameLabel?: string;
48
+ /**
49
+ * Custom label text for the delete action in the conversation edit menu.
50
+ * Defaults to translated "DELETE" text.
51
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
52
+ */
53
+ spotterChatDeleteLabel?: string;
54
+ /**
55
+ * Custom title text for the delete conversation confirmation modal.
56
+ * Defaults to translated "Delete chat" text.
57
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
58
+ */
59
+ spotterDeleteConversationModalTitle?: string;
60
+ /**
61
+ * Custom message text for the past conversation banner alert.
62
+ * Defaults to translated alert message.
63
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
64
+ */
65
+ spotterPastConversationAlertMessage?: string;
66
+ /**
67
+ * Custom URL for the documentation/best practices link.
68
+ * Defaults to ThoughtSpot docs URL based on release version.
69
+ * Note: URL must include the protocol (e.g., `https://www.example.com`).
70
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
71
+ */
72
+ spotterDocumentationUrl?: string;
73
+ /**
74
+ * Custom label text for the best practices button in the footer.
75
+ * Defaults to translated "Best Practices" text.
76
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
77
+ */
78
+ spotterBestPracticesLabel?: string;
79
+ /**
80
+ * Number of conversations to fetch per batch when loading conversation history.
81
+ * @default 30
82
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
83
+ */
84
+ spotterConversationsBatchSize?: number;
85
+ /**
86
+ * Custom title text for the "New Chat" button in the sidebar.
87
+ * Defaults to translated "New Chat" text.
88
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
89
+ */
90
+ spotterNewChatButtonTitle?: string;
91
+ }
92
+
93
+ /**
94
+ * Configuration for customizing Spotter chat UI branding.
95
+ * @group Embed components
96
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.4.0.cl
97
+ */
98
+ export interface SpotterChatViewConfig {
99
+ /**
100
+ * Hides the ThoughtSpot logo/icon in tool response
101
+ * cards. The branding label prefix is controlled
102
+ * separately via `toolResponseCardBrandingLabel`.
103
+ * External MCP tool branding is not affected.
104
+ * @default false
105
+ */
106
+ hideToolResponseCardBranding?: boolean;
107
+ /**
108
+ * Custom label to replace the "ThoughtSpot" prefix
109
+ * in tool response cards. Set to an empty string
110
+ * `''` to hide the prefix entirely. Works
111
+ * independently of `hideToolResponseCardBranding`.
112
+ * External MCP tool branding is not affected.
113
+ */
114
+ toolResponseCardBrandingLabel?: string;
115
+ }
116
+
17
117
  /**
18
118
  * The configuration for the embedded spotterEmbed options.
19
119
  * @group Embed components
@@ -169,8 +269,7 @@ export interface SpotterEmbedViewConfig extends Omit<BaseViewConfig, 'primaryAct
169
269
  */
170
270
  excludeRuntimeParametersfromURL?: boolean;
171
271
  /**
172
- * enablePastConversationsSidebar : Controls the visibility of the past conversations
173
- * sidebar.
272
+ * updatedSpotterChatPrompt : Controls the updated spotter chat prompt.
174
273
  *
175
274
  * Supported embed types: `SpotterEmbed`
176
275
  * @default false
@@ -178,28 +277,48 @@ export interface SpotterEmbedViewConfig extends Omit<BaseViewConfig, 'primaryAct
178
277
  * ```js
179
278
  * const embed = new SpotterEmbed('#tsEmbed', {
180
279
  * ... //other embed view config
181
- * enablePastConversationsSidebar : true,
280
+ * updatedSpotterChatPrompt : true,
182
281
  * })
183
282
  * ```
184
283
  * @version SDK: 1.45.0 | ThoughtSpot: 26.2.0.cl
185
284
  */
186
- enablePastConversationsSidebar?: boolean;
187
-
285
+ updatedSpotterChatPrompt?: boolean;
188
286
  /**
189
- * updatedSpotterChatPrompt : Controls the updated spotter chat prompt.
287
+ * Configuration for the Spotter sidebar UI customization.
288
+ *
289
+ * Supported embed types: `SpotterEmbed`, `AppEmbed`
290
+ * @example
291
+ * ```js
292
+ * const embed = new SpotterEmbed('#tsEmbed', {
293
+ * ... //other embed view config
294
+ * spotterSidebarConfig: {
295
+ * enablePastConversationsSidebar: true,
296
+ * spotterSidebarTitle: 'My Conversations',
297
+ * spotterSidebarDefaultExpanded: true,
298
+ * },
299
+ * })
300
+ * ```
301
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.3.0.cl
302
+ */
303
+ spotterSidebarConfig?: SpotterSidebarViewConfig;
304
+ /**
305
+ * Configuration for customizing Spotter chat UI
306
+ * branding in tool response cards.
190
307
  *
191
308
  * Supported embed types: `SpotterEmbed`
192
- * @default false
193
309
  * @example
194
310
  * ```js
195
311
  * const embed = new SpotterEmbed('#tsEmbed', {
196
312
  * ... //other embed view config
197
- * updatedSpotterChatPrompt : true,
313
+ * spotterChatConfig: {
314
+ * hideToolResponseCardBranding: true,
315
+ * toolResponseCardBrandingLabel: 'MyBrand',
316
+ * },
198
317
  * })
199
318
  * ```
200
- * @version SDK: 1.45.0 | ThoughtSpot: 26.2.0.cl
319
+ * @version SDK: 1.46.0 | ThoughtSpot: 26.4.0.cl
201
320
  */
202
- updatedSpotterChatPrompt?: boolean;
321
+ spotterChatConfig?: SpotterChatViewConfig;
203
322
  }
204
323
 
205
324
  /**
@@ -246,14 +365,30 @@ export class SpotterEmbed extends TsEmbed {
246
365
  dataPanelV2,
247
366
  showSpotterLimitations,
248
367
  hideSampleQuestions,
249
- enablePastConversationsSidebar,
250
368
  runtimeFilters,
251
369
  excludeRuntimeFiltersfromURL,
252
370
  runtimeParameters,
253
371
  excludeRuntimeParametersfromURL,
254
372
  updatedSpotterChatPrompt,
373
+ spotterSidebarConfig,
374
+ spotterChatConfig,
255
375
  } = this.viewConfig;
256
376
 
377
+ // Extract sidebar config properties
378
+ const {
379
+ enablePastConversationsSidebar,
380
+ spotterSidebarTitle,
381
+ spotterSidebarDefaultExpanded,
382
+ spotterChatRenameLabel,
383
+ spotterChatDeleteLabel,
384
+ spotterDeleteConversationModalTitle,
385
+ spotterPastConversationAlertMessage,
386
+ spotterDocumentationUrl,
387
+ spotterBestPracticesLabel,
388
+ spotterConversationsBatchSize,
389
+ spotterNewChatButtonTitle,
390
+ } = spotterSidebarConfig || {};
391
+
257
392
  if (!worksheetId) {
258
393
  this.handleError({
259
394
  errorType: ErrorDetailsTypes.VALIDATION_ERROR,
@@ -264,27 +399,50 @@ export class SpotterEmbed extends TsEmbed {
264
399
  }
265
400
  const queryParams = this.getBaseQueryParams();
266
401
  queryParams[Param.SpotterEnabled] = true;
267
- if (!isUndefined(disableSourceSelection)) {
268
- queryParams[Param.DisableSourceSelection] = !!disableSourceSelection;
269
- }
270
- if (!isUndefined(hideSourceSelection)) {
271
- queryParams[Param.HideSourceSelection] = !!hideSourceSelection;
272
- }
273
402
 
274
- if (!isUndefined(dataPanelV2)) {
275
- queryParams[Param.DataPanelV2Enabled] = !!dataPanelV2;
276
- }
403
+ // Boolean params
404
+ setParamIfDefined(queryParams, Param.DisableSourceSelection, disableSourceSelection, true);
405
+ setParamIfDefined(queryParams, Param.HideSourceSelection, hideSourceSelection, true);
406
+ setParamIfDefined(queryParams, Param.DataPanelV2Enabled, dataPanelV2, true);
407
+ setParamIfDefined(queryParams, Param.ShowSpotterLimitations, showSpotterLimitations, true);
408
+ setParamIfDefined(queryParams, Param.HideSampleQuestions, hideSampleQuestions, true);
409
+ setParamIfDefined(queryParams, Param.UpdatedSpotterChatPrompt, updatedSpotterChatPrompt, true);
410
+ setParamIfDefined(queryParams, Param.SpotterSidebarDefaultExpanded, spotterSidebarDefaultExpanded, true);
277
411
 
278
- if (!isUndefined(showSpotterLimitations)) {
279
- queryParams[Param.ShowSpotterLimitations] = !!showSpotterLimitations;
280
- }
412
+ // String params
413
+ setParamIfDefined(queryParams, Param.SpotterSidebarTitle, spotterSidebarTitle);
414
+ setParamIfDefined(queryParams, Param.SpotterChatRenameLabel, spotterChatRenameLabel);
415
+ setParamIfDefined(queryParams, Param.SpotterChatDeleteLabel, spotterChatDeleteLabel);
416
+ setParamIfDefined(queryParams, Param.SpotterDeleteConversationModalTitle, spotterDeleteConversationModalTitle);
417
+ setParamIfDefined(queryParams, Param.SpotterPastConversationAlertMessage, spotterPastConversationAlertMessage);
418
+ setParamIfDefined(queryParams, Param.SpotterBestPracticesLabel, spotterBestPracticesLabel);
419
+ setParamIfDefined(queryParams, Param.SpotterConversationsBatchSize, spotterConversationsBatchSize);
420
+ setParamIfDefined(queryParams, Param.SpotterNewChatButtonTitle, spotterNewChatButtonTitle);
281
421
 
282
- if (!isUndefined(hideSampleQuestions)) {
283
- queryParams[Param.HideSampleQuestions] = !!hideSampleQuestions;
422
+ // URL param with validation
423
+ if (spotterDocumentationUrl !== undefined) {
424
+ const [isValid, validationError] = validateHttpUrl(spotterDocumentationUrl);
425
+ if (isValid) {
426
+ queryParams[Param.SpotterDocumentationUrl] = spotterDocumentationUrl;
427
+ } else {
428
+ this.handleError({
429
+ errorType: ErrorDetailsTypes.VALIDATION_ERROR,
430
+ message: ERROR_MESSAGE.INVALID_SPOTTER_DOCUMENTATION_URL,
431
+ code: EmbedErrorCodes.INVALID_URL,
432
+ error: validationError?.message || ERROR_MESSAGE.INVALID_SPOTTER_DOCUMENTATION_URL,
433
+ });
434
+ }
284
435
  }
285
436
 
286
- if (!isUndefined(updatedSpotterChatPrompt)) {
287
- queryParams[Param.UpdatedSpotterChatPrompt] = !!updatedSpotterChatPrompt;
437
+ // Handle spotterChatConfig params
438
+ if (spotterChatConfig) {
439
+ const {
440
+ hideToolResponseCardBranding,
441
+ toolResponseCardBrandingLabel,
442
+ } = spotterChatConfig;
443
+
444
+ setParamIfDefined(queryParams, Param.HideToolResponseCardBranding, hideToolResponseCardBranding, true);
445
+ setParamIfDefined(queryParams, Param.ToolResponseCardBrandingLabel, toolResponseCardBrandingLabel);
288
446
  }
289
447
 
290
448
  return queryParams;
@@ -298,11 +456,12 @@ export class SpotterEmbed extends TsEmbed {
298
456
  excludeRuntimeFiltersfromURL,
299
457
  runtimeParameters,
300
458
  excludeRuntimeParametersfromURL,
301
- enablePastConversationsSidebar,
459
+ spotterSidebarConfig,
302
460
  } = this.viewConfig;
303
461
  const path = 'insights/conv-assist';
304
462
  const queryParams = this.getEmbedParamsObject();
305
463
 
464
+ const enablePastConversationsSidebar = spotterSidebarConfig?.enablePastConversationsSidebar;
306
465
  if (!isUndefined(enablePastConversationsSidebar)) {
307
466
  queryParams[Param.EnablePastConversationsSidebar] = !!enablePastConversationsSidebar;
308
467
  }