@thoughtspot/visual-embed-sdk 1.52.2-beta.1 → 1.53.0

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 (237) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/css-variables.d.ts +373 -5
  3. package/cjs/src/css-variables.d.ts.map +1 -1
  4. package/cjs/src/embed/app.d.ts +14 -0
  5. package/cjs/src/embed/app.d.ts.map +1 -1
  6. package/cjs/src/embed/app.js +6 -3
  7. package/cjs/src/embed/app.js.map +1 -1
  8. package/cjs/src/embed/app.spec.js +28 -0
  9. package/cjs/src/embed/app.spec.js.map +1 -1
  10. package/cjs/src/embed/auto-frame-renderer.d.ts.map +1 -1
  11. package/cjs/src/embed/auto-frame-renderer.js +244 -4
  12. package/cjs/src/embed/auto-frame-renderer.js.map +1 -1
  13. package/cjs/src/embed/auto-frame-renderer.spec.js +389 -0
  14. package/cjs/src/embed/auto-frame-renderer.spec.js.map +1 -1
  15. package/cjs/src/embed/bodyless-conversation.js +1 -1
  16. package/cjs/src/embed/bodyless-conversation.js.map +1 -1
  17. package/cjs/src/embed/conversation.d.ts +15 -0
  18. package/cjs/src/embed/conversation.d.ts.map +1 -1
  19. package/cjs/src/embed/conversation.js +7 -3
  20. package/cjs/src/embed/conversation.js.map +1 -1
  21. package/cjs/src/embed/conversation.spec.js +66 -0
  22. package/cjs/src/embed/conversation.spec.js.map +1 -1
  23. package/cjs/src/embed/liveboard-override-utils.d.ts +59 -0
  24. package/cjs/src/embed/liveboard-override-utils.d.ts.map +1 -0
  25. package/cjs/src/embed/liveboard-override-utils.js +19 -0
  26. package/cjs/src/embed/liveboard-override-utils.js.map +1 -0
  27. package/cjs/src/embed/liveboard-override-utils.spec.d.ts +2 -0
  28. package/cjs/src/embed/liveboard-override-utils.spec.d.ts.map +1 -0
  29. package/cjs/src/embed/liveboard-override-utils.spec.js +34 -0
  30. package/cjs/src/embed/liveboard-override-utils.spec.js.map +1 -0
  31. package/cjs/src/embed/liveboard.d.ts +43 -1
  32. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  33. package/cjs/src/embed/liveboard.js +11 -18
  34. package/cjs/src/embed/liveboard.js.map +1 -1
  35. package/cjs/src/embed/liveboard.spec.js +104 -54
  36. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  37. package/cjs/src/embed/search-bar.js +1 -1
  38. package/cjs/src/embed/search-bar.js.map +1 -1
  39. package/cjs/src/embed/search.js +1 -1
  40. package/cjs/src/embed/search.js.map +1 -1
  41. package/cjs/src/embed/search.spec.js +20 -0
  42. package/cjs/src/embed/search.spec.js.map +1 -1
  43. package/cjs/src/embed/spotter-utils.d.ts +11 -0
  44. package/cjs/src/embed/spotter-utils.d.ts.map +1 -1
  45. package/cjs/src/embed/spotter-utils.js +13 -1
  46. package/cjs/src/embed/spotter-utils.js.map +1 -1
  47. package/cjs/src/embed/spotter-viz-utils.d.ts +15 -0
  48. package/cjs/src/embed/spotter-viz-utils.d.ts.map +1 -1
  49. package/cjs/src/embed/spotter-viz-utils.js.map +1 -1
  50. package/cjs/src/embed/spotter-viz-utils.spec.js +11 -0
  51. package/cjs/src/embed/spotter-viz-utils.spec.js.map +1 -1
  52. package/cjs/src/embed/ts-embed.d.ts +27 -34
  53. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  54. package/cjs/src/embed/ts-embed.js +224 -102
  55. package/cjs/src/embed/ts-embed.js.map +1 -1
  56. package/cjs/src/embed/ts-embed.spec.d.ts.map +1 -1
  57. package/cjs/src/embed/ts-embed.spec.js +543 -171
  58. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  59. package/cjs/src/index.d.ts +4 -2
  60. package/cjs/src/index.d.ts.map +1 -1
  61. package/cjs/src/index.js +4 -2
  62. package/cjs/src/index.js.map +1 -1
  63. package/cjs/src/mixpanel-service.d.ts +1 -0
  64. package/cjs/src/mixpanel-service.d.ts.map +1 -1
  65. package/cjs/src/mixpanel-service.js +1 -0
  66. package/cjs/src/mixpanel-service.js.map +1 -1
  67. package/cjs/src/react/all-types-export.d.ts +1 -1
  68. package/cjs/src/react/all-types-export.d.ts.map +1 -1
  69. package/cjs/src/react/all-types-export.js +2 -1
  70. package/cjs/src/react/all-types-export.js.map +1 -1
  71. package/cjs/src/types.d.ts +182 -2
  72. package/cjs/src/types.d.ts.map +1 -1
  73. package/cjs/src/types.js +109 -0
  74. package/cjs/src/types.js.map +1 -1
  75. package/cjs/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
  76. package/cjs/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
  77. package/cjs/src/utils/graphql/answerService/answer-queries.js +8 -1
  78. package/cjs/src/utils/graphql/answerService/answer-queries.js.map +1 -1
  79. package/cjs/src/utils/graphql/answerService/answerService.d.ts +28 -4
  80. package/cjs/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  81. package/cjs/src/utils/graphql/answerService/answerService.js +39 -4
  82. package/cjs/src/utils/graphql/answerService/answerService.js.map +1 -1
  83. package/cjs/src/utils/graphql/answerService/answerService.spec.js +124 -0
  84. package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  85. package/dist/{index-Bt56pC82.js → index-CyDR8j_0.js} +1 -1
  86. package/dist/src/css-variables.d.ts +373 -5
  87. package/dist/src/css-variables.d.ts.map +1 -1
  88. package/dist/src/embed/app.d.ts +14 -0
  89. package/dist/src/embed/app.d.ts.map +1 -1
  90. package/dist/src/embed/auto-frame-renderer.d.ts.map +1 -1
  91. package/dist/src/embed/conversation.d.ts +15 -0
  92. package/dist/src/embed/conversation.d.ts.map +1 -1
  93. package/dist/src/embed/liveboard-override-utils.d.ts +59 -0
  94. package/dist/src/embed/liveboard-override-utils.d.ts.map +1 -0
  95. package/dist/src/embed/liveboard-override-utils.spec.d.ts +2 -0
  96. package/dist/src/embed/liveboard-override-utils.spec.d.ts.map +1 -0
  97. package/dist/src/embed/liveboard.d.ts +43 -1
  98. package/dist/src/embed/liveboard.d.ts.map +1 -1
  99. package/dist/src/embed/spotter-utils.d.ts +11 -0
  100. package/dist/src/embed/spotter-utils.d.ts.map +1 -1
  101. package/dist/src/embed/spotter-viz-utils.d.ts +15 -0
  102. package/dist/src/embed/spotter-viz-utils.d.ts.map +1 -1
  103. package/dist/src/embed/ts-embed.d.ts +27 -34
  104. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  105. package/dist/src/embed/ts-embed.spec.d.ts.map +1 -1
  106. package/dist/src/index.d.ts +4 -2
  107. package/dist/src/index.d.ts.map +1 -1
  108. package/dist/src/mixpanel-service.d.ts +1 -0
  109. package/dist/src/mixpanel-service.d.ts.map +1 -1
  110. package/dist/src/react/all-types-export.d.ts +1 -1
  111. package/dist/src/react/all-types-export.d.ts.map +1 -1
  112. package/dist/src/types.d.ts +182 -2
  113. package/dist/src/types.d.ts.map +1 -1
  114. package/dist/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
  115. package/dist/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
  116. package/dist/src/utils/graphql/answerService/answerService.d.ts +28 -4
  117. package/dist/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  118. package/dist/tsembed-react.es.js +437 -175
  119. package/dist/tsembed-react.js +436 -174
  120. package/dist/tsembed.es.js +680 -180
  121. package/dist/tsembed.js +678 -178
  122. package/dist/visual-embed-sdk-react-full.d.ts +702 -44
  123. package/dist/visual-embed-sdk-react.d.ts +697 -44
  124. package/dist/visual-embed-sdk.d.ts +729 -45
  125. package/lib/package.json +1 -1
  126. package/lib/src/css-variables.d.ts +373 -5
  127. package/lib/src/css-variables.d.ts.map +1 -1
  128. package/lib/src/embed/app.d.ts +14 -0
  129. package/lib/src/embed/app.d.ts.map +1 -1
  130. package/lib/src/embed/app.js +7 -4
  131. package/lib/src/embed/app.js.map +1 -1
  132. package/lib/src/embed/app.spec.js +28 -0
  133. package/lib/src/embed/app.spec.js.map +1 -1
  134. package/lib/src/embed/auto-frame-renderer.d.ts.map +1 -1
  135. package/lib/src/embed/auto-frame-renderer.js +244 -4
  136. package/lib/src/embed/auto-frame-renderer.js.map +1 -1
  137. package/lib/src/embed/auto-frame-renderer.spec.js +389 -0
  138. package/lib/src/embed/auto-frame-renderer.spec.js.map +1 -1
  139. package/lib/src/embed/bodyless-conversation.js +1 -1
  140. package/lib/src/embed/bodyless-conversation.js.map +1 -1
  141. package/lib/src/embed/conversation.d.ts +15 -0
  142. package/lib/src/embed/conversation.d.ts.map +1 -1
  143. package/lib/src/embed/conversation.js +8 -4
  144. package/lib/src/embed/conversation.js.map +1 -1
  145. package/lib/src/embed/conversation.spec.js +67 -1
  146. package/lib/src/embed/conversation.spec.js.map +1 -1
  147. package/lib/src/embed/liveboard-override-utils.d.ts +59 -0
  148. package/lib/src/embed/liveboard-override-utils.d.ts.map +1 -0
  149. package/lib/src/embed/liveboard-override-utils.js +15 -0
  150. package/lib/src/embed/liveboard-override-utils.js.map +1 -0
  151. package/lib/src/embed/liveboard-override-utils.spec.d.ts +2 -0
  152. package/lib/src/embed/liveboard-override-utils.spec.d.ts.map +1 -0
  153. package/lib/src/embed/liveboard-override-utils.spec.js +32 -0
  154. package/lib/src/embed/liveboard-override-utils.spec.js.map +1 -0
  155. package/lib/src/embed/liveboard.d.ts +43 -1
  156. package/lib/src/embed/liveboard.d.ts.map +1 -1
  157. package/lib/src/embed/liveboard.js +11 -17
  158. package/lib/src/embed/liveboard.js.map +1 -1
  159. package/lib/src/embed/liveboard.spec.js +104 -54
  160. package/lib/src/embed/liveboard.spec.js.map +1 -1
  161. package/lib/src/embed/search-bar.js +1 -1
  162. package/lib/src/embed/search-bar.js.map +1 -1
  163. package/lib/src/embed/search.js +1 -1
  164. package/lib/src/embed/search.js.map +1 -1
  165. package/lib/src/embed/search.spec.js +20 -0
  166. package/lib/src/embed/search.spec.js.map +1 -1
  167. package/lib/src/embed/spotter-utils.d.ts +11 -0
  168. package/lib/src/embed/spotter-utils.d.ts.map +1 -1
  169. package/lib/src/embed/spotter-utils.js +12 -0
  170. package/lib/src/embed/spotter-utils.js.map +1 -1
  171. package/lib/src/embed/spotter-viz-utils.d.ts +15 -0
  172. package/lib/src/embed/spotter-viz-utils.d.ts.map +1 -1
  173. package/lib/src/embed/spotter-viz-utils.js.map +1 -1
  174. package/lib/src/embed/spotter-viz-utils.spec.js +11 -0
  175. package/lib/src/embed/spotter-viz-utils.spec.js.map +1 -1
  176. package/lib/src/embed/ts-embed.d.ts +27 -34
  177. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  178. package/lib/src/embed/ts-embed.js +224 -102
  179. package/lib/src/embed/ts-embed.js.map +1 -1
  180. package/lib/src/embed/ts-embed.spec.d.ts.map +1 -1
  181. package/lib/src/embed/ts-embed.spec.js +544 -172
  182. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  183. package/lib/src/index.d.ts +4 -2
  184. package/lib/src/index.d.ts.map +1 -1
  185. package/lib/src/index.js +3 -2
  186. package/lib/src/index.js.map +1 -1
  187. package/lib/src/mixpanel-service.d.ts +1 -0
  188. package/lib/src/mixpanel-service.d.ts.map +1 -1
  189. package/lib/src/mixpanel-service.js +1 -0
  190. package/lib/src/mixpanel-service.js.map +1 -1
  191. package/lib/src/react/all-types-export.d.ts +1 -1
  192. package/lib/src/react/all-types-export.d.ts.map +1 -1
  193. package/lib/src/react/all-types-export.js +1 -1
  194. package/lib/src/react/all-types-export.js.map +1 -1
  195. package/lib/src/types.d.ts +182 -2
  196. package/lib/src/types.d.ts.map +1 -1
  197. package/lib/src/types.js +109 -0
  198. package/lib/src/types.js.map +1 -1
  199. package/lib/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
  200. package/lib/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
  201. package/lib/src/utils/graphql/answerService/answer-queries.js +7 -0
  202. package/lib/src/utils/graphql/answerService/answer-queries.js.map +1 -1
  203. package/lib/src/utils/graphql/answerService/answerService.d.ts +28 -4
  204. package/lib/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  205. package/lib/src/utils/graphql/answerService/answerService.js +39 -4
  206. package/lib/src/utils/graphql/answerService/answerService.js.map +1 -1
  207. package/lib/src/utils/graphql/answerService/answerService.spec.js +125 -1
  208. package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  209. package/lib/src/visual-embed-sdk.d.ts +729 -45
  210. package/package.json +1 -1
  211. package/src/css-variables.ts +475 -26
  212. package/src/embed/app.spec.ts +32 -0
  213. package/src/embed/app.ts +28 -4
  214. package/src/embed/auto-frame-renderer.spec.ts +464 -0
  215. package/src/embed/auto-frame-renderer.ts +305 -6
  216. package/src/embed/bodyless-conversation.ts +1 -1
  217. package/src/embed/conversation.spec.ts +94 -1
  218. package/src/embed/conversation.ts +28 -3
  219. package/src/embed/liveboard-override-utils.spec.ts +38 -0
  220. package/src/embed/liveboard-override-utils.ts +71 -0
  221. package/src/embed/liveboard.spec.ts +119 -62
  222. package/src/embed/liveboard.ts +56 -21
  223. package/src/embed/search-bar.tsx +1 -1
  224. package/src/embed/search.spec.ts +23 -0
  225. package/src/embed/search.ts +1 -1
  226. package/src/embed/spotter-utils.ts +12 -0
  227. package/src/embed/spotter-viz-utils.spec.ts +11 -0
  228. package/src/embed/spotter-viz-utils.ts +15 -0
  229. package/src/embed/ts-embed.spec.ts +684 -213
  230. package/src/embed/ts-embed.ts +227 -97
  231. package/src/index.ts +16 -1
  232. package/src/mixpanel-service.ts +1 -0
  233. package/src/react/all-types-export.ts +6 -0
  234. package/src/types.ts +186 -5
  235. package/src/utils/graphql/answerService/answer-queries.ts +8 -0
  236. package/src/utils/graphql/answerService/answerService.spec.ts +145 -1
  237. package/src/utils/graphql/answerService/answerService.ts +65 -3
@@ -1,6 +1,22 @@
1
1
  import { Param } from "../types";
2
2
  import { TsEmbed } from "./ts-embed";
3
3
  import { getQueryParamString } from "../utils";
4
+ import { tokenizedFetch } from "../tokenizedFetch";
5
+ import { logger } from "../utils/logger";
6
+ /**
7
+ * Route the ThoughtSpot application uses to render a single conversational
8
+ * answer. Used when a replayed frame carries no route of its own.
9
+ */
10
+ const CONV_ASSIST_ANSWER_ROUTE = '/embed/conv-assist-answer';
11
+ /**
12
+ * Base path of the conversation service, proxied by the cluster's nginx as
13
+ * the `convex` upstream. These are the same handlers the public
14
+ * `/api/rest/2.0/ai/agent/conversations/...` endpoints proxy to, so the
15
+ * response shapes are identical, but calling them directly skips the prism
16
+ * hop and its error re-wrapping.
17
+ */
18
+ const CONVERSATION_SERVICE_PATH = '/conversation/v2';
19
+ const DEFAULT_STALE_ANSWER_NOTICE = 'This data may have changed since the last time you had a chat.';
4
20
  /**
5
21
  * Starts an automatic renderer that watches the DOM for iframes containing
6
22
  * the `tsmcp=true` query parameter and replaces them with fully configured
@@ -63,6 +79,111 @@ export function startAutoMCPFrameRenderer(viewConfig = {}) {
63
79
  observer.observe(document.body, { childList: true, subtree: true });
64
80
  return observer;
65
81
  }
82
+ /**
83
+ * Writes resolved session parameters into the route's hash query string,
84
+ * preserving the route and any other hash params the source URL carried.
85
+ *
86
+ * @param sourceHash - The source URL's hash, with or without a leading `#`.
87
+ * Falls back to the conversational-answer route when empty, so a host app
88
+ * replaying a chat need only supply the conversation identifier.
89
+ */
90
+ function buildAnswerHash(sourceHash, resolved) {
91
+ const withoutHash = (sourceHash || '').replace('#', '');
92
+ const [route, existingQuery] = withoutHash.split('?');
93
+ const params = new URLSearchParams(existingQuery || '');
94
+ Object.entries(resolved).forEach(([key, value]) => params.set(key, value));
95
+ return `${route || CONV_ASSIST_ANSWER_ROUTE}?${params.toString()}`;
96
+ }
97
+ /**
98
+ * Reads {@link Param.TsmcpAnswerIndex} as a whole, non-negative array index.
99
+ *
100
+ * Anything else - absent, malformed, fractional, negative - falls back to the
101
+ * first answer rather than indexing with a value that can never match.
102
+ */
103
+ function answerIndexFromParam(raw) {
104
+ const parsed = Number(raw);
105
+ return Number.isInteger(parsed) && parsed >= 0 ? parsed : 0;
106
+ }
107
+ /**
108
+ * In-flight answer-id list requests, keyed by conversation-service URL.
109
+ *
110
+ * Replaying a stored chat mounts every one of its frames at once, and each
111
+ * frame resolves on its own. Without this, N frames from one conversation make
112
+ * N identical list calls. Sharing the in-flight request collapses them to one.
113
+ *
114
+ * Only the id list is shared, and only while its request is in flight: the
115
+ * entry is dropped once the request settles, whether it succeeded or not. A
116
+ * failed response is therefore never reused, and a frame mounted later always
117
+ * reads a fresh list. The per-answer load call is never shared - it returns
118
+ * live session state with its own expiry.
119
+ */
120
+ const answerIdListRequests = new Map();
121
+ /**
122
+ * Lists a conversation's answer ids: its non-thinking `answer` items, in
123
+ * message order. The host app counts answers the same way, so the Nth id here
124
+ * is the Nth stored answer.
125
+ *
126
+ * @param conversationUrl - The conversation's base URL on the conversation
127
+ * service, `{host}/conversation/v2/{encoded id}`.
128
+ * @param conversationId - The conversation identifier, used in log messages.
129
+ * @returns The ids, or `null` when the conversation cannot be read. Never
130
+ * rejects, so callers sharing the request need no error handling of their own.
131
+ */
132
+ async function fetchAnswerIds(conversationUrl, conversationId) {
133
+ try {
134
+ const messagesResponse = await tokenizedFetch(`${conversationUrl}/public`, {
135
+ credentials: 'include',
136
+ headers: { Accept: 'application/json' },
137
+ });
138
+ if (!messagesResponse.ok) {
139
+ logger.warn(`[AutoFrameRenderer] Conversation fetch failed for ${conversationId}: ${messagesResponse.status}`);
140
+ return null;
141
+ }
142
+ const messagesBody = await messagesResponse.json();
143
+ const messages = messagesBody === null || messagesBody === void 0 ? void 0 : messagesBody.messages;
144
+ const answerIds = [];
145
+ for (const message of Array.isArray(messages) ? messages : []) {
146
+ for (const item of (message === null || message === void 0 ? void 0 : message.response_items) || []) {
147
+ if ((item === null || item === void 0 ? void 0 : item.type) === 'answer' && (item === null || item === void 0 ? void 0 : item.is_thinking) === false && (item === null || item === void 0 ? void 0 : item.answer_id)) {
148
+ answerIds.push(item.answer_id);
149
+ }
150
+ }
151
+ }
152
+ return answerIds;
153
+ }
154
+ catch (e) {
155
+ logger.warn(`[AutoFrameRenderer] Failed to list answers for ${conversationId}: ${e}`);
156
+ return null;
157
+ }
158
+ }
159
+ /**
160
+ * The answer-id list for a conversation, joining a request already in flight
161
+ * for it.
162
+ *
163
+ * @param conversationUrl - The conversation's base URL on the conversation
164
+ * service. Also the key requests are shared under.
165
+ * @param conversationId - The conversation identifier, used in log messages.
166
+ * @param stale - A request the caller already read and found too short. It is
167
+ * not reused; the first caller to pass it starts a new request, and the
168
+ * others join that one.
169
+ * @returns The shared request: the ids, or `null` when the conversation cannot
170
+ * be read. Never rejects.
171
+ */
172
+ function getAnswerIds(conversationUrl, conversationId, stale) {
173
+ const inFlight = answerIdListRequests.get(conversationUrl);
174
+ if (inFlight && inFlight !== stale) {
175
+ return inFlight;
176
+ }
177
+ const request = fetchAnswerIds(conversationUrl, conversationId);
178
+ answerIdListRequests.set(conversationUrl, request);
179
+ const release = () => {
180
+ if (answerIdListRequests.get(conversationUrl) === request) {
181
+ answerIdListRequests.delete(conversationUrl);
182
+ }
183
+ };
184
+ request.then(release, release);
185
+ return request;
186
+ }
66
187
  function isTSMCPIframe(iframe) {
67
188
  try {
68
189
  const url = new URL(iframe.src);
@@ -96,20 +217,112 @@ class AutoFrameRenderer extends TsEmbed {
96
217
  * ThoughtSpot application.
97
218
  *
98
219
  * @param sourceSrc - The original iframe's `src` URL string.
220
+ * @param preserveSourceUrl - When true, return the source URL unchanged.
99
221
  * @returns The constructed URL to use for the ThoughtSpot embed iframe.
100
222
  */
101
- getMCPIframeSrc(sourceSrc) {
102
- const queryParams = this.getEmbedParamsObject();
223
+ getMCPIframeSrc(sourceSrc, resolved, preserveSourceUrl = false) {
224
+ if (preserveSourceUrl) {
225
+ return sourceSrc;
226
+ }
227
+ const queryParams = this.getUrlQueryParamsObject();
103
228
  const sourceURL = new URL(sourceSrc);
104
229
  const existingQueryParams = sourceURL.searchParams;
105
230
  const existingQueryParamsObject = Object.fromEntries(existingQueryParams);
106
231
  delete existingQueryParamsObject[Param.Tsmcp];
232
+ // Replay markers address the SDK, not the ThoughtSpot application.
233
+ delete existingQueryParamsObject[Param.TsmcpConversationId];
234
+ delete existingQueryParamsObject[Param.TsmcpAnswerIndex];
107
235
  const mergedQueryParams = { ...queryParams, ...existingQueryParamsObject };
108
236
  const mergedQueryParamsString = getQueryParamString(mergedQueryParams, true);
109
237
  const queryString = mergedQueryParamsString ? `?${mergedQueryParamsString}` : '';
110
- const frameSrc = `${this.getEmbedBasePath(queryString)}${sourceURL.hash.replace('#', '')}`;
238
+ const hash = resolved
239
+ ? buildAnswerHash(sourceURL.hash, resolved)
240
+ : sourceURL.hash.replace('#', '');
241
+ const frameSrc = `${this.getEmbedBasePath(queryString)}${hash}`;
111
242
  return frameSrc;
112
243
  }
244
+ /**
245
+ * Resolves the current session parameters for an answer stored only as a
246
+ * conversation identifier plus an ordinal position.
247
+ *
248
+ * The answer object behind `sessionId`/`genNo` expires (roughly 8 hours),
249
+ * so a host app replaying a stored chat cannot persist those values. It
250
+ * persists the conversation identifier instead, and this walks the two
251
+ * conversation-service APIs to rebuild them:
252
+ *
253
+ * 1. `GET {conv}/public` lists the conversation's messages; the
254
+ * non-thinking `answer` items, in message order, give the answer ids.
255
+ * Frames from the same conversation share one in-flight call - see
256
+ * {@link getAnswerIds}.
257
+ * 2. `POST {conv}/message/{id}/load/public` turns the answer id at
258
+ * `answerIndex` into a live session identifier, generation number and
259
+ * agent-context state.
260
+ *
261
+ * @returns The resolved parameters, or `null` when resolution fails - the
262
+ * caller then falls back to whatever the source URL already carried.
263
+ */
264
+ async resolveAnswerSessionParams(conversationId, answerIndex) {
265
+ const base = `${this.thoughtSpotHost}${CONVERSATION_SERVICE_PATH}/${encodeURIComponent(conversationId)}`;
266
+ try {
267
+ const listRequest = getAnswerIds(base, conversationId);
268
+ let answerIds = await listRequest;
269
+ if (answerIds && !answerIds[answerIndex]) {
270
+ // The list only grows, so a short one may predate this answer:
271
+ // a frame that joined a request started before it was added.
272
+ // Read the list once more before giving up.
273
+ answerIds = await getAnswerIds(base, conversationId, listRequest);
274
+ }
275
+ if (!answerIds) {
276
+ return null;
277
+ }
278
+ const answerId = answerIds[answerIndex];
279
+ if (!answerId) {
280
+ logger.warn(`[AutoFrameRenderer] No answer at index ${answerIndex} in conversation ${conversationId} (found ${answerIds.length}).`);
281
+ return null;
282
+ }
283
+ // The load handler is a POST upstream; the public REST endpoint
284
+ // exposed it as a GET and supplied this body on the caller's
285
+ // behalf.
286
+ const detailsResponse = await tokenizedFetch(`${base}/message/${encodeURIComponent(answerId)}/load/public`, {
287
+ credentials: 'include',
288
+ method: 'POST',
289
+ headers: {
290
+ Accept: 'application/json',
291
+ 'Content-Type': 'application/json',
292
+ 'x-requested-by': 'ThoughtSpot',
293
+ },
294
+ body: JSON.stringify({ type: 'TS_ANSWER' }),
295
+ });
296
+ if (!detailsResponse.ok) {
297
+ logger.warn(`[AutoFrameRenderer] Answer load failed for ${answerId}: ${detailsResponse.status}`);
298
+ return null;
299
+ }
300
+ const detailsBody = await detailsResponse.json();
301
+ const answer = detailsBody === null || detailsBody === void 0 ? void 0 : detailsBody.answer;
302
+ const acState = answer === null || answer === void 0 ? void 0 : answer.ac_state;
303
+ // All four are nullable in the load-answer response. A missing
304
+ // generation number is as unusable as a missing session id:
305
+ // stringifying it would put a literal "null" in the hash. Fail
306
+ // the resolve instead and let the caller fall back.
307
+ if (!(answer === null || answer === void 0 ? void 0 : answer.session_identifier)
308
+ || !(acState === null || acState === void 0 ? void 0 : acState.transaction_identifier)
309
+ || !(Number.isInteger(answer.generation_number) && answer.generation_number > 0)
310
+ || !(Number.isInteger(acState.generation_number) && acState.generation_number > 0)) {
311
+ logger.warn(`[AutoFrameRenderer] Answer load returned incomplete session state for ${answerId}.`);
312
+ return null;
313
+ }
314
+ return {
315
+ sessionId: answer.session_identifier,
316
+ genNo: String(answer.generation_number),
317
+ acSessionId: acState.transaction_identifier,
318
+ acGenNo: String(acState.generation_number),
319
+ };
320
+ }
321
+ catch (e) {
322
+ logger.warn(`[AutoFrameRenderer] Failed to resolve stored answer: ${e}`);
323
+ return null;
324
+ }
325
+ }
113
326
  /**
114
327
  * Overrides the base insertion behavior so the new embed iframe
115
328
  * replaces the original iframe in-place rather than being appended
@@ -138,9 +351,36 @@ class AutoFrameRenderer extends TsEmbed {
138
351
  if (this.shouldWaitForRenderPromise) {
139
352
  await this.isReadyForRenderPromise;
140
353
  }
141
- const src = this.getMCPIframeSrc(iframe.src);
354
+ // Only frames that ask for it take the replay path. A frame straight
355
+ // from the MCP server carries its own session params and no
356
+ // conversation id, so it renders exactly as it always has.
357
+ const sourceParams = new URL(iframe.src).searchParams;
358
+ const conversationId = sourceParams.get(Param.TsmcpConversationId);
359
+ let resolved = null;
360
+ if (conversationId) {
361
+ resolved = await this.resolveAnswerSessionParams(conversationId, answerIndexFromParam(sourceParams.get(Param.TsmcpAnswerIndex)));
362
+ }
363
+ const src = this.getMCPIframeSrc(iframe.src, resolved !== null && resolved !== void 0 ? resolved : undefined, Boolean(conversationId) && !resolved);
142
364
  await this.renderIFrame(src);
365
+ // Mark only answers actually re-resolved: their numbers were computed
366
+ // now, not when the conversation happened.
367
+ if (resolved && !this.viewConfig.suppressStaleAnswerNotice) {
368
+ this.markAsStaleAnswer();
369
+ }
143
370
  this.isRendered = true;
144
371
  }
372
+ /**
373
+ * Adds the "data may have changed" notice to the rendered frame as a
374
+ * native tooltip, so it needs no stylesheet and cannot disturb the host
375
+ * app's layout.
376
+ */
377
+ markAsStaleAnswer() {
378
+ if (!this.iFrame) {
379
+ return;
380
+ }
381
+ this.iFrame.title = this.viewConfig.staleAnswerNoticeText || DEFAULT_STALE_ANSWER_NOTICE;
382
+ // Exposed so a host app can style or replace the native tooltip.
383
+ this.iFrame.dataset.tsStaleAnswer = 'true';
384
+ }
145
385
  }
146
386
  //# sourceMappingURL=auto-frame-renderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auto-frame-renderer.js","sourceRoot":"","sources":["../../../src/embed/auto-frame-renderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auto-frame-renderer.js","sourceRoot":"","sources":["../../../src/embed/auto-frame-renderer.ts"],"names":[],"mappings":"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"}