@burdenoff/website-sdk 2026.922.2 → 2026.922.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -82,10 +82,44 @@ var EN = {
82
82
  noAnswer: "I couldn't find this in our documentation, so the answer below is not grounded in a source. Try rephrasing, or",
83
83
  answerDidNotArrive: "That answer didn't come through. Try asking again.",
84
84
  askHuman: "ask a human",
85
+ // An offer, not a demand: this row sits under every answer on 38 marketing sites, so the
86
+ // wording has to be shruggable. "Was this helpful?" invites; "Please rate this answer"
87
+ // conscripts.
88
+ feedbackPrompt: "Was this helpful?",
89
+ feedbackHelpful: "Helpful",
90
+ feedbackNotHelpful: "Not helpful",
91
+ feedbackReasonTitle: "What was off?",
92
+ feedbackReasonInaccurate: "Inaccurate",
93
+ feedbackReasonIncomplete: "Incomplete",
94
+ feedbackReasonOffTopic: "Off topic",
95
+ feedbackReasonHardToFollow: "Hard to follow",
96
+ feedbackReasonOther: "Something else",
97
+ feedbackCommentPlaceholder: "Add a detail (optional)",
98
+ feedbackSend: "Send",
99
+ feedbackDismiss: "Dismiss",
100
+ feedbackThanks: "Thanks \u2014 that helps.",
101
+ feedbackNotSent: "That didn't send.",
85
102
  prevSuggestion: "Previous suggestion",
86
103
  nextSuggestion: "Next suggestion",
87
104
  conceptIllustration: "Concept illustration",
88
105
  opensInNewTab: "opens in a new tab",
106
+ conceptStripTitle: "Or start from a concept",
107
+ conceptStripLabel: "Concepts you can ask about",
108
+ conceptAsk: "Ask about {title} in {product}",
109
+ conceptAskQuestion: "How does {title} work in {product}?",
110
+ copyAnswer: "Copy answer",
111
+ copyFailed: "Couldn't copy",
112
+ groundedIn: "What this answer is based on",
113
+ sourceCountOne: "1 source",
114
+ sourceCountMany: "{count} sources",
115
+ sourceKindConcept: "Concept",
116
+ sourceKindDocs: "Documentation",
117
+ sourceKindPricing: "Pricing",
118
+ sourceKindUseCase: "Use case",
119
+ sourceKindPage: "Product page",
120
+ seoTitle: "Describe a problem, get an answer",
121
+ seoDescription: "Describe the problem you're facing in your own words and get an answer drawn from our product documentation, with links to the exact pages it came from.",
122
+ seoDescriptionProduct: "Describe the problem you're facing in your own words and get an answer drawn from {product}'s documentation \u2014 and every other product we build \u2014 with links to the exact pages it came from.",
89
123
  capabilities: [
90
124
  "Grounded in our own docs",
91
125
  "Compare across the ecosystem",
@@ -133,10 +167,41 @@ var ZH = {
133
167
  noAnswer: "\u6211\u5728\u6587\u6863\u4E2D\u6CA1\u6709\u627E\u5230\u76F8\u5173\u5185\u5BB9\uFF0C\u4E0B\u9762\u7684\u56DE\u7B54\u6CA1\u6709\u6765\u6E90\u652F\u6301\u3002\u8BF7\u6362\u4E2A\u8BF4\u6CD5\uFF0C\u6216",
134
168
  answerDidNotArrive: "\u8FD9\u6761\u56DE\u7B54\u6CA1\u6709\u8FD4\u56DE\u3002\u8BF7\u518D\u95EE\u4E00\u6B21\u3002",
135
169
  askHuman: "\u8054\u7CFB\u6211\u4EEC",
170
+ feedbackPrompt: "\u8FD9\u4E2A\u56DE\u7B54\u6709\u5E2E\u52A9\u5417\uFF1F",
171
+ feedbackHelpful: "\u6709\u5E2E\u52A9",
172
+ feedbackNotHelpful: "\u6CA1\u6709\u5E2E\u52A9",
173
+ feedbackReasonTitle: "\u54EA\u91CC\u4E0D\u5BF9\uFF1F",
174
+ feedbackReasonInaccurate: "\u4E0D\u51C6\u786E",
175
+ feedbackReasonIncomplete: "\u4E0D\u5B8C\u6574",
176
+ feedbackReasonOffTopic: "\u7B54\u975E\u6240\u95EE",
177
+ feedbackReasonHardToFollow: "\u770B\u4E0D\u592A\u61C2",
178
+ feedbackReasonOther: "\u5176\u4ED6\u539F\u56E0",
179
+ feedbackCommentPlaceholder: "\u8865\u5145\u8BF4\u660E\uFF08\u53EF\u9009\uFF09",
180
+ feedbackSend: "\u63D0\u4EA4",
181
+ feedbackDismiss: "\u5173\u95ED",
182
+ feedbackThanks: "\u8C22\u8C22\uFF0C\u8FD9\u5BF9\u6211\u4EEC\u5F88\u6709\u5E2E\u52A9\u3002",
183
+ feedbackNotSent: "\u6CA1\u6709\u63D0\u4EA4\u6210\u529F\u3002",
136
184
  prevSuggestion: "\u4E0A\u4E00\u4E2A\u5EFA\u8BAE",
137
185
  nextSuggestion: "\u4E0B\u4E00\u4E2A\u5EFA\u8BAE",
138
186
  conceptIllustration: "\u6982\u5FF5\u793A\u610F\u56FE",
139
187
  opensInNewTab: "\u5728\u65B0\u6807\u7B7E\u9875\u4E2D\u6253\u5F00",
188
+ conceptStripTitle: "\u6216\u8005\u4ECE\u4E00\u4E2A\u6982\u5FF5\u5F00\u59CB",
189
+ conceptStripLabel: "\u4F60\u53EF\u4EE5\u8BE2\u95EE\u7684\u6982\u5FF5",
190
+ conceptAsk: "\u8BE2\u95EE {product} \u4E2D\u7684 {title}",
191
+ conceptAskQuestion: "{product} \u7684 {title} \u662F\u600E\u4E48\u8FD0\u4F5C\u7684\uFF1F",
192
+ copyAnswer: "\u590D\u5236\u56DE\u7B54",
193
+ copyFailed: "\u590D\u5236\u5931\u8D25",
194
+ groundedIn: "\u8FD9\u4E2A\u56DE\u7B54\u7684\u4F9D\u636E",
195
+ sourceCountOne: "1 \u4E2A\u6765\u6E90",
196
+ sourceCountMany: "{count} \u4E2A\u6765\u6E90",
197
+ sourceKindConcept: "\u6982\u5FF5",
198
+ sourceKindDocs: "\u6587\u6863",
199
+ sourceKindPricing: "\u4EF7\u683C",
200
+ sourceKindUseCase: "\u5E94\u7528\u573A\u666F",
201
+ sourceKindPage: "\u4EA7\u54C1\u9875\u9762",
202
+ seoTitle: "\u63CF\u8FF0\u95EE\u9898\uFF0C\u83B7\u5F97\u7B54\u6848",
203
+ seoDescription: "\u7528\u4F60\u81EA\u5DF1\u7684\u8BDD\u63CF\u8FF0\u9047\u5230\u7684\u95EE\u9898\uFF0C\u5373\u53EF\u83B7\u5F97\u6765\u81EA\u6211\u4EEC\u4EA7\u54C1\u6587\u6863\u7684\u56DE\u7B54\uFF0C\u5E76\u9644\u4E0A\u7B54\u6848\u51FA\u5904\u7684\u9875\u9762\u94FE\u63A5\u3002",
204
+ seoDescriptionProduct: "\u7528\u4F60\u81EA\u5DF1\u7684\u8BDD\u63CF\u8FF0\u9047\u5230\u7684\u95EE\u9898\uFF0C\u5373\u53EF\u83B7\u5F97\u6765\u81EA {product} \u53CA\u6211\u4EEC\u5176\u4ED6\u4EA7\u54C1\u6587\u6863\u7684\u56DE\u7B54\uFF0C\u5E76\u9644\u4E0A\u7B54\u6848\u51FA\u5904\u7684\u9875\u9762\u94FE\u63A5\u3002",
140
205
  capabilities: ["\u57FA\u4E8E\u6211\u4EEC\u81EA\u5DF1\u7684\u6587\u6863", "\u8DE8\u4EA7\u54C1\u5BF9\u6BD4", "\u76F4\u8FBE\u6B63\u786E\u7684\u9875\u9762"],
141
206
  prompts: [
142
207
  "\u6BCF\u95E8\u8BFE\u7A0B\u90FD\u8BB0\u5728\u4E0D\u540C\u7684\u8868\u683C\u91CC\u3002",
@@ -180,10 +245,41 @@ var HI = {
180
245
  noAnswer: "\u092F\u0939 \u092E\u0941\u091D\u0947 \u0939\u092E\u093E\u0930\u0947 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C\u094B\u0902 \u092E\u0947\u0902 \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E, \u0907\u0938\u0932\u093F\u090F \u0928\u0940\u091A\u0947 \u0926\u093F\u092F\u093E \u0909\u0924\u094D\u0924\u0930 \u0915\u093F\u0938\u0940 \u0938\u094D\u0930\u094B\u0924 \u092A\u0930 \u0906\u0927\u093E\u0930\u093F\u0924 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u0926\u0942\u0938\u0930\u0947 \u0936\u092C\u094D\u0926\u094B\u0902 \u092E\u0947\u0902 \u092A\u0942\u091B\u0947\u0902, \u092F\u093E",
181
246
  answerDidNotArrive: "\u0935\u0939 \u0909\u0924\u094D\u0924\u0930 \u0928\u0939\u0940\u0902 \u0906 \u0938\u0915\u093E\u0964 \u0915\u0943\u092A\u092F\u093E \u0926\u094B\u092C\u093E\u0930\u093E \u092A\u0942\u091B\u0947\u0902\u0964",
182
247
  askHuman: "\u0939\u092E\u0938\u0947 \u0938\u0902\u092A\u0930\u094D\u0915 \u0915\u0930\u0947\u0902",
248
+ feedbackPrompt: "\u0915\u094D\u092F\u093E \u092F\u0939 \u0909\u0924\u094D\u0924\u0930 \u092E\u0926\u0926\u0917\u093E\u0930 \u0925\u093E?",
249
+ feedbackHelpful: "\u092E\u0926\u0926\u0917\u093E\u0930",
250
+ feedbackNotHelpful: "\u092E\u0926\u0926\u0917\u093E\u0930 \u0928\u0939\u0940\u0902",
251
+ feedbackReasonTitle: "\u0915\u094D\u092F\u093E \u0920\u0940\u0915 \u0928\u0939\u0940\u0902 \u0925\u093E?",
252
+ feedbackReasonInaccurate: "\u0917\u093C\u0932\u0924 \u091C\u093E\u0928\u0915\u093E\u0930\u0940",
253
+ feedbackReasonIncomplete: "\u0905\u0927\u0942\u0930\u093E",
254
+ feedbackReasonOffTopic: "\u0935\u093F\u0937\u092F \u0938\u0947 \u0939\u091F\u0915\u0930",
255
+ feedbackReasonHardToFollow: "\u0938\u092E\u091D\u0928\u0947 \u092E\u0947\u0902 \u092E\u0941\u0936\u094D\u0915\u093F\u0932",
256
+ feedbackReasonOther: "\u0915\u0941\u091B \u0914\u0930",
257
+ feedbackCommentPlaceholder: "\u0915\u0941\u091B \u0914\u0930 \u092C\u0924\u093E\u090F\u0902 (\u0935\u0948\u0915\u0932\u094D\u092A\u093F\u0915)",
258
+ feedbackSend: "\u092D\u0947\u091C\u0947\u0902",
259
+ feedbackDismiss: "\u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
260
+ feedbackThanks: "\u0927\u0928\u094D\u092F\u0935\u093E\u0926, \u0907\u0938\u0938\u0947 \u092E\u0926\u0926 \u092E\u093F\u0932\u0924\u0940 \u0939\u0948\u0964",
261
+ feedbackNotSent: "\u092F\u0939 \u092D\u0947\u091C\u093E \u0928\u0939\u0940\u0902 \u091C\u093E \u0938\u0915\u093E\u0964",
183
262
  prevSuggestion: "\u092A\u093F\u091B\u0932\u093E \u0938\u0941\u091D\u093E\u0935",
184
263
  nextSuggestion: "\u0905\u0917\u0932\u093E \u0938\u0941\u091D\u093E\u0935",
185
264
  conceptIllustration: "\u0905\u0935\u0927\u093E\u0930\u0923\u093E \u091A\u093F\u0924\u094D\u0930\u0923",
186
265
  opensInNewTab: "\u0928\u090F \u091F\u0948\u092C \u092E\u0947\u0902 \u0916\u0941\u0932\u0924\u093E \u0939\u0948",
266
+ conceptStripTitle: "\u092F\u093E \u0915\u093F\u0938\u0940 \u0905\u0935\u0927\u093E\u0930\u0923\u093E \u0938\u0947 \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902",
267
+ conceptStripLabel: "\u091C\u093F\u0928 \u0905\u0935\u0927\u093E\u0930\u0923\u093E\u0913\u0902 \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u0906\u092A \u092A\u0942\u091B \u0938\u0915\u0924\u0947 \u0939\u0948\u0902",
268
+ conceptAsk: "{product} \u092E\u0947\u0902 {title} \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u092A\u0942\u091B\u0947\u0902",
269
+ conceptAskQuestion: "{product} \u092E\u0947\u0902 {title} \u0915\u0948\u0938\u0947 \u0915\u093E\u092E \u0915\u0930\u0924\u093E \u0939\u0948?",
270
+ copyAnswer: "\u0909\u0924\u094D\u0924\u0930 \u0915\u0949\u092A\u0940 \u0915\u0930\u0947\u0902",
271
+ copyFailed: "\u0915\u0949\u092A\u0940 \u0928\u0939\u0940\u0902 \u0939\u094B \u0938\u0915\u093E",
272
+ groundedIn: "\u092F\u0939 \u0909\u0924\u094D\u0924\u0930 \u0915\u093F\u0938 \u092A\u0930 \u0906\u0927\u093E\u0930\u093F\u0924 \u0939\u0948",
273
+ sourceCountOne: "1 \u0938\u094D\u0930\u094B\u0924",
274
+ sourceCountMany: "{count} \u0938\u094D\u0930\u094B\u0924",
275
+ sourceKindConcept: "\u0905\u0935\u0927\u093E\u0930\u0923\u093E",
276
+ sourceKindDocs: "\u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C",
277
+ sourceKindPricing: "\u092E\u0942\u0932\u094D\u092F",
278
+ sourceKindUseCase: "\u0909\u092A\u092F\u094B\u0917 \u0915\u093E \u0909\u0926\u093E\u0939\u0930\u0923",
279
+ sourceKindPage: "\u0909\u0924\u094D\u092A\u093E\u0926 \u092A\u0947\u091C",
280
+ seoTitle: "\u0938\u092E\u0938\u094D\u092F\u093E \u092C\u0924\u093E\u090F\u0902, \u091C\u0935\u093E\u092C \u092A\u093E\u090F\u0902",
281
+ seoDescription: "\u0905\u092A\u0928\u0940 \u0938\u092E\u0938\u094D\u092F\u093E \u0905\u092A\u0928\u0947 \u0936\u092C\u094D\u0926\u094B\u0902 \u092E\u0947\u0902 \u092C\u0924\u093E\u090F\u0902 \u0914\u0930 \u0939\u092E\u093E\u0930\u0947 \u0909\u0924\u094D\u092A\u093E\u0926 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C\u094B\u0902 \u0938\u0947 \u0932\u093F\u092F\u093E \u0917\u092F\u093E \u091C\u0935\u093E\u092C \u092A\u093E\u090F\u0902, \u0938\u093E\u0925 \u092E\u0947\u0902 \u0909\u0928\u094D\u0939\u0940\u0902 \u092A\u0928\u094D\u0928\u094B\u0902 \u0915\u0947 \u0932\u093F\u0902\u0915 \u091C\u0939\u093E\u0901 \u0938\u0947 \u0935\u0939 \u0906\u092F\u093E \u0939\u0948\u0964",
282
+ seoDescriptionProduct: "\u0905\u092A\u0928\u0940 \u0938\u092E\u0938\u094D\u092F\u093E \u0905\u092A\u0928\u0947 \u0936\u092C\u094D\u0926\u094B\u0902 \u092E\u0947\u0902 \u092C\u0924\u093E\u090F\u0902 \u0914\u0930 {product} \u0924\u0925\u093E \u0939\u092E\u093E\u0930\u0947 \u092C\u093E\u0915\u0940 \u0909\u0924\u094D\u092A\u093E\u0926\u094B\u0902 \u0915\u0947 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C\u094B\u0902 \u0938\u0947 \u0932\u093F\u092F\u093E \u0917\u092F\u093E \u091C\u0935\u093E\u092C \u092A\u093E\u090F\u0902, \u0938\u093E\u0925 \u092E\u0947\u0902 \u0909\u0928\u094D\u0939\u0940\u0902 \u092A\u0928\u094D\u0928\u094B\u0902 \u0915\u0947 \u0932\u093F\u0902\u0915 \u091C\u0939\u093E\u0901 \u0938\u0947 \u0935\u0939 \u0906\u092F\u093E \u0939\u0948\u0964",
187
283
  capabilities: [
188
284
  "\u0939\u092E\u093E\u0930\u0947 \u0905\u092A\u0928\u0947 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C\u094B\u0902 \u092A\u0930 \u0906\u0927\u093E\u0930\u093F\u0924",
189
285
  "\u0938\u092D\u0940 \u0909\u0924\u094D\u092A\u093E\u0926\u094B\u0902 \u0915\u0940 \u0924\u0941\u0932\u0928\u093E \u0915\u0930\u0947\u0902",
@@ -231,10 +327,41 @@ var ES = {
231
327
  noAnswer: "No he encontrado esto en nuestra documentaci\xF3n, as\xED que la respuesta de abajo no se apoya en ninguna fuente. Prueba a reformularla, o",
232
328
  answerDidNotArrive: "Esa respuesta no lleg\xF3. Int\xE9ntalo de nuevo.",
233
329
  askHuman: "habla con una persona",
330
+ feedbackPrompt: "\xBFTe ha servido?",
331
+ feedbackHelpful: "Me sirve",
332
+ feedbackNotHelpful: "No me sirve",
333
+ feedbackReasonTitle: "\xBFQu\xE9 ha fallado?",
334
+ feedbackReasonInaccurate: "Es inexacta",
335
+ feedbackReasonIncomplete: "Est\xE1 incompleta",
336
+ feedbackReasonOffTopic: "No viene al caso",
337
+ feedbackReasonHardToFollow: "Cuesta seguirla",
338
+ feedbackReasonOther: "Otra cosa",
339
+ feedbackCommentPlaceholder: "A\xF1ade un detalle (opcional)",
340
+ feedbackSend: "Enviar",
341
+ feedbackDismiss: "Cerrar",
342
+ feedbackThanks: "Gracias, nos sirve.",
343
+ feedbackNotSent: "No se ha podido enviar.",
234
344
  prevSuggestion: "Sugerencia anterior",
235
345
  nextSuggestion: "Sugerencia siguiente",
236
346
  conceptIllustration: "Ilustraci\xF3n del concepto",
237
347
  opensInNewTab: "se abre en una pesta\xF1a nueva",
348
+ conceptStripTitle: "O empieza por un concepto",
349
+ conceptStripLabel: "Conceptos sobre los que puedes preguntar",
350
+ conceptAsk: "Preguntar por {title} en {product}",
351
+ conceptAskQuestion: "\xBFC\xF3mo funciona {title} en {product}?",
352
+ copyAnswer: "Copiar respuesta",
353
+ copyFailed: "No se pudo copiar",
354
+ groundedIn: "En qu\xE9 se basa esta respuesta",
355
+ sourceCountOne: "1 fuente",
356
+ sourceCountMany: "{count} fuentes",
357
+ sourceKindConcept: "Concepto",
358
+ sourceKindDocs: "Documentaci\xF3n",
359
+ sourceKindPricing: "Precios",
360
+ sourceKindUseCase: "Caso de uso",
361
+ sourceKindPage: "P\xE1gina de producto",
362
+ seoTitle: "Describe un problema y obt\xE9n una respuesta",
363
+ seoDescription: "Describe con tus palabras el problema que tienes y recibe una respuesta extra\xEDda de la documentaci\xF3n de nuestros productos, con enlaces a las p\xE1ginas exactas de las que procede.",
364
+ seoDescriptionProduct: "Describe con tus palabras el problema que tienes y recibe una respuesta extra\xEDda de la documentaci\xF3n de {product} y del resto de nuestros productos, con enlaces a las p\xE1ginas exactas de las que procede.",
238
365
  capabilities: [
239
366
  "Basado en nuestra documentaci\xF3n",
240
367
  "Compara todo el ecosistema",
@@ -282,10 +409,41 @@ var AR = {
282
409
  noAnswer: "\u0644\u0645 \u0623\u062C\u062F \u0647\u0630\u0627 \u0641\u064A \u0648\u062B\u0627\u0626\u0642\u0646\u0627\u060C \u0644\u0630\u0627 \u0641\u0627\u0644\u0625\u062C\u0627\u0628\u0629 \u0623\u062F\u0646\u0627\u0647 \u063A\u064A\u0631 \u0645\u0633\u062A\u0646\u062F\u0629 \u0625\u0644\u0649 \u0645\u0635\u062F\u0631. \u062D\u0627\u0648\u0644 \u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0635\u064A\u0627\u063A\u0629\u060C \u0623\u0648",
283
410
  answerDidNotArrive: "\u0644\u0645 \u062A\u0635\u0644 \u0647\u0630\u0647 \u0627\u0644\u0625\u062C\u0627\u0628\u0629. \u064A\u0631\u062C\u0649 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649.",
284
411
  askHuman: "\u062A\u062D\u062F\u0651\u062B \u0625\u0644\u0649 \u0634\u062E\u0635",
412
+ feedbackPrompt: "\u0647\u0644 \u0643\u0627\u0646\u062A \u0647\u0630\u0647 \u0627\u0644\u0625\u062C\u0627\u0628\u0629 \u0645\u0641\u064A\u062F\u0629\u061F",
413
+ feedbackHelpful: "\u0645\u0641\u064A\u062F\u0629",
414
+ feedbackNotHelpful: "\u063A\u064A\u0631 \u0645\u0641\u064A\u062F\u0629",
415
+ feedbackReasonTitle: "\u0645\u0627 \u0627\u0644\u062E\u0637\u0623 \u0641\u064A\u0647\u0627\u061F",
416
+ feedbackReasonInaccurate: "\u063A\u064A\u0631 \u062F\u0642\u064A\u0642\u0629",
417
+ feedbackReasonIncomplete: "\u0646\u0627\u0642\u0635\u0629",
418
+ feedbackReasonOffTopic: "\u062E\u0627\u0631\u062C \u0627\u0644\u0645\u0648\u0636\u0648\u0639",
419
+ feedbackReasonHardToFollow: "\u0635\u0639\u0628\u0629 \u0627\u0644\u0641\u0647\u0645",
420
+ feedbackReasonOther: "\u0634\u064A\u0621 \u0622\u062E\u0631",
421
+ feedbackCommentPlaceholder: "\u0623\u0636\u0641 \u062A\u0641\u0635\u064A\u0644\u0627\u064B (\u0627\u062E\u062A\u064A\u0627\u0631\u064A)",
422
+ feedbackSend: "\u0625\u0631\u0633\u0627\u0644",
423
+ feedbackDismiss: "\u0625\u063A\u0644\u0627\u0642",
424
+ feedbackThanks: "\u0634\u0643\u0631\u064B\u0627\u060C \u0647\u0630\u0627 \u064A\u0633\u0627\u0639\u062F\u0646\u0627.",
425
+ feedbackNotSent: "\u0644\u0645 \u064A\u062A\u0645 \u0627\u0644\u0625\u0631\u0633\u0627\u0644.",
285
426
  prevSuggestion: "\u0627\u0644\u0627\u0642\u062A\u0631\u0627\u062D \u0627\u0644\u0633\u0627\u0628\u0642",
286
427
  nextSuggestion: "\u0627\u0644\u0627\u0642\u062A\u0631\u0627\u062D \u0627\u0644\u062A\u0627\u0644\u064A",
287
428
  conceptIllustration: "\u0631\u0633\u0645 \u062A\u0648\u0636\u064A\u062D\u064A \u0644\u0644\u0645\u0641\u0647\u0648\u0645",
288
429
  opensInNewTab: "\u064A\u064F\u0641\u062A\u062D \u0641\u064A \u0639\u0644\u0627\u0645\u0629 \u062A\u0628\u0648\u064A\u0628 \u062C\u062F\u064A\u062F\u0629",
430
+ conceptStripTitle: "\u0623\u0648 \u0627\u0628\u062F\u0623 \u0645\u0646 \u0645\u0641\u0647\u0648\u0645",
431
+ conceptStripLabel: "\u0645\u0641\u0627\u0647\u064A\u0645 \u064A\u0645\u0643\u0646\u0643 \u0627\u0644\u0633\u0624\u0627\u0644 \u0639\u0646\u0647\u0627",
432
+ conceptAsk: "\u0627\u0633\u0623\u0644 \u0639\u0646 {title} \u0641\u064A {product}",
433
+ conceptAskQuestion: "\u0643\u064A\u0641 \u064A\u0639\u0645\u0644 {title} \u0641\u064A {product}\u061F",
434
+ copyAnswer: "\u0646\u0633\u062E \u0627\u0644\u0625\u062C\u0627\u0628\u0629",
435
+ copyFailed: "\u062A\u0639\u0630\u0651\u0631 \u0627\u0644\u0646\u0633\u062E",
436
+ groundedIn: "\u0639\u0644\u0649 \u0645\u0627\u0630\u0627 \u062A\u0633\u062A\u0646\u062F \u0647\u0630\u0647 \u0627\u0644\u0625\u062C\u0627\u0628\u0629",
437
+ sourceCountOne: "\u0645\u0635\u062F\u0631 \u0648\u0627\u062D\u062F",
438
+ sourceCountMany: "{count} \u0645\u0635\u0627\u062F\u0631",
439
+ sourceKindConcept: "\u0645\u0641\u0647\u0648\u0645",
440
+ sourceKindDocs: "\u0627\u0644\u062A\u0648\u062B\u064A\u0642",
441
+ sourceKindPricing: "\u0627\u0644\u0623\u0633\u0639\u0627\u0631",
442
+ sourceKindUseCase: "\u062D\u0627\u0644\u0629 \u0627\u0633\u062A\u062E\u062F\u0627\u0645",
443
+ sourceKindPage: "\u0635\u0641\u062D\u0629 \u0627\u0644\u0645\u0646\u062A\u062C",
444
+ seoTitle: "\u0635\u0641 \u0645\u0634\u0643\u0644\u062A\u0643 \u0648\u0627\u062D\u0635\u0644 \u0639\u0644\u0649 \u0625\u062C\u0627\u0628\u0629",
445
+ seoDescription: "\u0635\u0641 \u0627\u0644\u0645\u0634\u0643\u0644\u0629 \u0627\u0644\u062A\u064A \u062A\u0648\u0627\u062C\u0647\u0647\u0627 \u0628\u0643\u0644\u0645\u0627\u062A\u0643 \u0648\u0627\u062D\u0635\u0644 \u0639\u0644\u0649 \u0625\u062C\u0627\u0628\u0629 \u0645\u0633\u062A\u0645\u062F\u0629 \u0645\u0646 \u0648\u062B\u0627\u0626\u0642 \u0645\u0646\u062A\u062C\u0627\u062A\u0646\u0627\u060C \u0645\u0639 \u0631\u0648\u0627\u0628\u0637 \u0625\u0644\u0649 \u0627\u0644\u0635\u0641\u062D\u0627\u062A \u0627\u0644\u062A\u064A \u062C\u0627\u0621\u062A \u0645\u0646\u0647\u0627.",
446
+ seoDescriptionProduct: "\u0635\u0641 \u0627\u0644\u0645\u0634\u0643\u0644\u0629 \u0627\u0644\u062A\u064A \u062A\u0648\u0627\u062C\u0647\u0647\u0627 \u0628\u0643\u0644\u0645\u0627\u062A\u0643 \u0648\u0627\u062D\u0635\u0644 \u0639\u0644\u0649 \u0625\u062C\u0627\u0628\u0629 \u0645\u0633\u062A\u0645\u062F\u0629 \u0645\u0646 \u0648\u062B\u0627\u0626\u0642 {product} \u0648\u0628\u0642\u064A\u0629 \u0645\u0646\u062A\u062C\u0627\u062A\u0646\u0627\u060C \u0645\u0639 \u0631\u0648\u0627\u0628\u0637 \u0625\u0644\u0649 \u0627\u0644\u0635\u0641\u062D\u0627\u062A \u0627\u0644\u062A\u064A \u062C\u0627\u0621\u062A \u0645\u0646\u0647\u0627.",
289
447
  capabilities: [
290
448
  "\u0645\u0628\u0646\u064A \u0639\u0644\u0649 \u0648\u062B\u0627\u0626\u0642\u0646\u0627",
291
449
  "\u0642\u0627\u0631\u0646 \u0639\u0628\u0631 \u0627\u0644\u0645\u0646\u0638\u0648\u0645\u0629",
@@ -333,10 +491,41 @@ var TA = {
333
491
  noAnswer: "\u0B87\u0BA4\u0BC1 \u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B86\u0BB5\u0BA3\u0B99\u0BCD\u0B95\u0BB3\u0BBF\u0BB2\u0BCD \u0B95\u0BBF\u0B9F\u0BC8\u0B95\u0BCD\u0B95\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8, \u0B8E\u0BA9\u0BB5\u0BC7 \u0B95\u0BC0\u0BB4\u0BC7 \u0B89\u0BB3\u0BCD\u0BB3 \u0BAA\u0BA4\u0BBF\u0BB2\u0BC1\u0B95\u0BCD\u0B95\u0BC1 \u0BAE\u0BC2\u0BB2\u0BAE\u0BCD \u0B87\u0BB2\u0BCD\u0BB2\u0BC8. \u0BB5\u0BC7\u0BB1\u0BC1 \u0BB5\u0B95\u0BC8\u0BAF\u0BBF\u0BB2\u0BCD \u0B95\u0BC7\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD, \u0B85\u0BB2\u0BCD\u0BB2\u0BA4\u0BC1",
334
492
  answerDidNotArrive: "\u0B85\u0BA8\u0BCD\u0BA4\u0BAA\u0BCD \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD \u0BB5\u0BB0\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8. \u0BAE\u0BC0\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B9F\u0BC1\u0BAA\u0BCD \u0BAA\u0BBE\u0BB0\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD.",
335
493
  askHuman: "\u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BC8\u0BA4\u0BCD \u0BA4\u0BCA\u0B9F\u0BB0\u0BCD\u0BAA\u0BC1 \u0B95\u0BCA\u0BB3\u0BCD\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
494
+ feedbackPrompt: "\u0B87\u0BA8\u0BCD\u0BA4\u0BAA\u0BCD \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD \u0BAA\u0BAF\u0BA9\u0BC1\u0BB3\u0BCD\u0BB3\u0BA4\u0BBE\u0B95 \u0B87\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BA4\u0BBE?",
495
+ feedbackHelpful: "\u0BAA\u0BAF\u0BA9\u0BC1\u0BB3\u0BCD\u0BB3\u0BA4\u0BC1",
496
+ feedbackNotHelpful: "\u0BAA\u0BAF\u0BA9\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8",
497
+ feedbackReasonTitle: "\u0B8E\u0BA9\u0BCD\u0BA9 \u0B9A\u0BB0\u0BBF\u0BAF\u0BBE\u0B95 \u0B87\u0BB2\u0BCD\u0BB2\u0BC8?",
498
+ feedbackReasonInaccurate: "\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0BA4\u0B95\u0BB5\u0BB2\u0BCD",
499
+ feedbackReasonIncomplete: "\u0BAE\u0BC1\u0BB4\u0BC1\u0BAE\u0BC8\u0BAF\u0BB1\u0BCD\u0BB1\u0BA4\u0BC1",
500
+ feedbackReasonOffTopic: "\u0BA4\u0BB2\u0BC8\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BCD\u0B95\u0BC1 \u0B85\u0BAA\u0BCD\u0BAA\u0BBE\u0BB1\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1",
501
+ feedbackReasonHardToFollow: "\u0BAA\u0BC1\u0BB0\u0BBF\u0BA8\u0BCD\u0BA4\u0BC1\u0B95\u0BCA\u0BB3\u0BCD\u0BB3 \u0B95\u0B9F\u0BBF\u0BA9\u0BAE\u0BCD",
502
+ feedbackReasonOther: "\u0BB5\u0BC7\u0BB1\u0BC1 \u0B8F\u0BA4\u0BCB",
503
+ feedbackCommentPlaceholder: "\u0BAE\u0BC7\u0BB2\u0BC1\u0BAE\u0BCD \u0BB5\u0BBF\u0BB5\u0BB0\u0BAE\u0BCD (\u0BB5\u0BBF\u0BB0\u0BC1\u0BAA\u0BCD\u0BAA\u0BAE\u0BCD)",
504
+ feedbackSend: "\u0B85\u0BA9\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1",
505
+ feedbackDismiss: "\u0BAE\u0BC2\u0B9F\u0BC1",
506
+ feedbackThanks: "\u0BA8\u0BA9\u0BCD\u0BB1\u0BBF, \u0B87\u0BA4\u0BC1 \u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BC1\u0B95\u0BCD\u0B95\u0BC1 \u0B89\u0BA4\u0BB5\u0BC1\u0B95\u0BBF\u0BB1\u0BA4\u0BC1.",
507
+ feedbackNotSent: "\u0B85\u0BA9\u0BC1\u0BAA\u0BCD\u0BAA \u0BAE\u0BC1\u0B9F\u0BBF\u0BAF\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8.",
336
508
  prevSuggestion: "\u0BAE\u0BC1\u0BA8\u0BCD\u0BA4\u0BC8\u0BAF \u0BAA\u0BB0\u0BBF\u0BA8\u0BCD\u0BA4\u0BC1\u0BB0\u0BC8",
337
509
  nextSuggestion: "\u0B85\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4 \u0BAA\u0BB0\u0BBF\u0BA8\u0BCD\u0BA4\u0BC1\u0BB0\u0BC8",
338
510
  conceptIllustration: "\u0B95\u0BB0\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1 \u0BB5\u0BBF\u0BB3\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BAE\u0BCD",
339
511
  opensInNewTab: "\u0BAA\u0BC1\u0BA4\u0BBF\u0BAF \u0BA4\u0BBE\u0BB5\u0BB2\u0BBF\u0BB2\u0BCD \u0BA4\u0BBF\u0BB1\u0B95\u0BCD\u0B95\u0BC1\u0BAE\u0BCD",
512
+ conceptStripTitle: "\u0B85\u0BB2\u0BCD\u0BB2\u0BA4\u0BC1 \u0B92\u0BB0\u0BC1 \u0B95\u0BB0\u0BC1\u0BA4\u0BCD\u0BA4\u0BBF\u0BB2\u0BBF\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1 \u0BA4\u0BCA\u0B9F\u0B99\u0BCD\u0B95\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
513
+ conceptStripLabel: "\u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B95\u0B95\u0BCD\u0B95\u0BC2\u0B9F\u0BBF\u0BAF \u0B95\u0BB0\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1\u0B95\u0BB3\u0BCD",
514
+ conceptAsk: "{product} \u0B87\u0BB2\u0BCD {title} \u0BAA\u0BB1\u0BCD\u0BB1\u0BBF\u0B95\u0BCD \u0B95\u0BC7\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
515
+ conceptAskQuestion: "{product} \u0B87\u0BB2\u0BCD {title} \u0B8E\u0BAA\u0BCD\u0BAA\u0B9F\u0BBF \u0BB5\u0BC7\u0BB2\u0BC8 \u0B9A\u0BC6\u0BAF\u0BCD\u0B95\u0BBF\u0BB1\u0BA4\u0BC1?",
516
+ copyAnswer: "\u0BAA\u0BA4\u0BBF\u0BB2\u0BC8 \u0BA8\u0B95\u0BB2\u0BC6\u0B9F\u0BC1",
517
+ copyFailed: "\u0BA8\u0B95\u0BB2\u0BC6\u0B9F\u0BC1\u0B95\u0BCD\u0B95 \u0BAE\u0BC1\u0B9F\u0BBF\u0BAF\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8",
518
+ groundedIn: "\u0B87\u0BA8\u0BCD\u0BA4\u0BAA\u0BCD \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD \u0B8E\u0BA4\u0BC8 \u0B85\u0B9F\u0BBF\u0BAA\u0BCD\u0BAA\u0B9F\u0BC8\u0BAF\u0BBE\u0B95\u0B95\u0BCD \u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BA4\u0BC1",
519
+ sourceCountOne: "1 \u0BAE\u0BC2\u0BB2\u0BAE\u0BCD",
520
+ sourceCountMany: "{count} \u0BAE\u0BC2\u0BB2\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
521
+ sourceKindConcept: "\u0B95\u0BB0\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1",
522
+ sourceKindDocs: "\u0B86\u0BB5\u0BA3\u0BAE\u0BCD",
523
+ sourceKindPricing: "\u0BB5\u0BBF\u0BB2\u0BC8",
524
+ sourceKindUseCase: "\u0BAA\u0BAF\u0BA9\u0BCD\u0BAA\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1 \u0BA8\u0BBF\u0BB2\u0BC8",
525
+ sourceKindPage: "\u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0BAA\u0BCD \u0BAA\u0B95\u0BCD\u0B95\u0BAE\u0BCD",
526
+ seoTitle: "\u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB2\u0BC8 \u0BB5\u0BBF\u0BB5\u0BB0\u0BBF\u0BAF\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD, \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD \u0BAA\u0BC6\u0BB1\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
527
+ seoDescription: "\u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0B95\u0BCA\u0BB3\u0BCD\u0BB3\u0BC1\u0BAE\u0BCD \u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB2\u0BC8 \u0B89\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B9A\u0BCA\u0BA8\u0BCD\u0BA4 \u0BB5\u0BBE\u0BB0\u0BCD\u0BA4\u0BCD\u0BA4\u0BC8\u0B95\u0BB3\u0BBF\u0BB2\u0BCD \u0BB5\u0BBF\u0BB5\u0BB0\u0BBF\u0BAF\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD; \u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1 \u0B86\u0BB5\u0BA3\u0B99\u0BCD\u0B95\u0BB3\u0BBF\u0BB2\u0BBF\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1 \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD \u0B95\u0BBF\u0B9F\u0BC8\u0B95\u0BCD\u0B95\u0BC1\u0BAE\u0BCD, \u0B85\u0BA4\u0BC1 \u0BB5\u0BA8\u0BCD\u0BA4 \u0BAA\u0B95\u0BCD\u0B95\u0B99\u0BCD\u0B95\u0BB3\u0BC1\u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0B87\u0BA3\u0BC8\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BC1\u0B9F\u0BA9\u0BCD.",
528
+ seoDescriptionProduct: "{product} \u0BAE\u0BB1\u0BCD\u0BB1\u0BC1\u0BAE\u0BCD \u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0BAA\u0BBF\u0BB1 \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BBF\u0BA9\u0BCD \u0B86\u0BB5\u0BA3\u0B99\u0BCD\u0B95\u0BB3\u0BBF\u0BB2\u0BBF\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1 \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD \u0BAA\u0BC6\u0BB1, \u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0B95\u0BCA\u0BB3\u0BCD\u0BB3\u0BC1\u0BAE\u0BCD \u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB2\u0BC8 \u0B89\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B9A\u0BCA\u0BA8\u0BCD\u0BA4 \u0BB5\u0BBE\u0BB0\u0BCD\u0BA4\u0BCD\u0BA4\u0BC8\u0B95\u0BB3\u0BBF\u0BB2\u0BCD \u0BB5\u0BBF\u0BB5\u0BB0\u0BBF\u0BAF\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u2014 \u0B85\u0BA4\u0BC1 \u0BB5\u0BA8\u0BCD\u0BA4 \u0BAA\u0B95\u0BCD\u0B95\u0B99\u0BCD\u0B95\u0BB3\u0BC1\u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0B87\u0BA3\u0BC8\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BC1\u0B9F\u0BA9\u0BCD.",
340
529
  capabilities: [
341
530
  "\u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B9A\u0BCA\u0BA8\u0BCD\u0BA4 \u0B86\u0BB5\u0BA3\u0B99\u0BCD\u0B95\u0BB3\u0BBF\u0BA9\u0BCD \u0B85\u0B9F\u0BBF\u0BAA\u0BCD\u0BAA\u0B9F\u0BC8\u0BAF\u0BBF\u0BB2\u0BCD",
342
531
  "\u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BC8 \u0B92\u0BAA\u0BCD\u0BAA\u0BBF\u0B9F\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
@@ -377,6 +566,193 @@ function exploreStrings(locale) {
377
566
  function fill(template, values) {
378
567
  return template.replace(/\{(\w+)\}/g, (match, key) => values[key] ?? match);
379
568
  }
569
+
570
+ // src/components/explore-types.ts
571
+ var EXPLORE_FEEDBACK_REASONS = [
572
+ "INACCURATE",
573
+ "INCOMPLETE",
574
+ "OFF_TOPIC",
575
+ "HARD_TO_FOLLOW",
576
+ "OTHER"
577
+ ];
578
+ var EXPLORE_MESSAGE_FIELDS = (
579
+ /* GraphQL */
580
+ `
581
+ id
582
+ conversationId
583
+ role
584
+ status
585
+ content
586
+ partialContent
587
+ activity
588
+ references {
589
+ url
590
+ title
591
+ description
592
+ product
593
+ imageUrl
594
+ index
595
+ }
596
+ ctas {
597
+ kind
598
+ label
599
+ url
600
+ product
601
+ }
602
+ followUps
603
+ answered
604
+ attachments {
605
+ name
606
+ mimeType
607
+ size
608
+ textExtracted
609
+ }
610
+ errorCode
611
+ createdAt
612
+ completedAt
613
+ `
614
+ );
615
+ var EXPLORE_OWN_MESSAGE_FIELDS = (
616
+ /* GraphQL */
617
+ `
618
+ ${EXPLORE_MESSAGE_FIELDS}
619
+ feedback {
620
+ rating
621
+ reason
622
+ comment
623
+ createdAt
624
+ }
625
+ `
626
+ );
627
+ var EXPLORE_CATALOG_ESTABLISHED_FIELDS = (
628
+ /* GraphQL */
629
+ `
630
+ enabled
631
+ products {
632
+ slug
633
+ name
634
+ tagline
635
+ website
636
+ }
637
+ examplePrompts
638
+ welcomeTitle
639
+ welcomeBody
640
+ limits {
641
+ maxMessageLength
642
+ maxTurnsPerConversation
643
+ messagesPerDay
644
+ historyTurns
645
+ }
646
+ captchaRequired
647
+ recaptchaSiteKey`
648
+ );
649
+ var EXPLORE_CATALOG_HIGHLIGHT_FIELD = (
650
+ /* GraphQL */
651
+ `
652
+ conceptHighlights {
653
+ product
654
+ productName
655
+ title
656
+ url
657
+ imageUrl
658
+ alt
659
+ }`
660
+ );
661
+ function exploreCatalogDocument(extraFields) {
662
+ return (
663
+ /* GraphQL */
664
+ `
665
+ query ExploreCatalog($productSlug: String) {
666
+ exploreCatalog(productSlug: $productSlug) {${EXPLORE_CATALOG_ESTABLISHED_FIELDS}${extraFields}
667
+ }
668
+ }
669
+ `
670
+ );
671
+ }
672
+ var EXPLORE_CATALOG_QUERY = exploreCatalogDocument(
673
+ EXPLORE_CATALOG_HIGHLIGHT_FIELD
674
+ );
675
+ var EXPLORE_CATALOG_QUERY_WITHOUT_HIGHLIGHTS = exploreCatalogDocument("");
676
+ var EXPLORE_MESSAGE_QUERY = (
677
+ /* GraphQL */
678
+ `
679
+ query ExploreMessage($conversationToken: String!, $id: ID!) {
680
+ exploreMessage(conversationToken: $conversationToken, id: $id) {
681
+ ${EXPLORE_OWN_MESSAGE_FIELDS}
682
+ }
683
+ }
684
+ `
685
+ );
686
+ var SEND_EXPLORE_MESSAGE_MUTATION = (
687
+ /* GraphQL */
688
+ `
689
+ mutation SendExploreMessage($input: SendExploreMessageInput!) {
690
+ sendExploreMessage(input: $input) {
691
+ conversation {
692
+ id
693
+ token
694
+ productSlug
695
+ turnCount
696
+ createdAt
697
+ }
698
+ userMessage {
699
+ ${EXPLORE_OWN_MESSAGE_FIELDS}
700
+ }
701
+ assistantMessage {
702
+ ${EXPLORE_OWN_MESSAGE_FIELDS}
703
+ }
704
+ remainingToday
705
+ }
706
+ }
707
+ `
708
+ );
709
+ var RECORD_EXPLORE_CLICK_MUTATION = (
710
+ /* GraphQL */
711
+ `
712
+ mutation RecordExploreClick($input: RecordExploreClickInput!) {
713
+ recordExploreClick(input: $input) {
714
+ recorded
715
+ }
716
+ }
717
+ `
718
+ );
719
+ var SUBMIT_EXPLORE_FEEDBACK_MUTATION = (
720
+ /* GraphQL */
721
+ `
722
+ mutation SubmitExploreFeedback($input: SubmitExploreFeedbackInput!) {
723
+ submitExploreFeedback(input: $input) {
724
+ recorded
725
+ feedback {
726
+ rating
727
+ reason
728
+ comment
729
+ createdAt
730
+ }
731
+ }
732
+ }
733
+ `
734
+ );
735
+ var EXPLORE_FEEDBACK_COMMENT_SOFT_MAX = 500;
736
+ var CREATE_EXPLORE_SHARE_LINK_MUTATION = (
737
+ /* GraphQL */
738
+ `
739
+ mutation CreateExploreShareLink($conversationToken: String!) {
740
+ createExploreShareLink(conversationToken: $conversationToken) {
741
+ shareToken
742
+ }
743
+ }
744
+ `
745
+ );
746
+ var EXPLORE_SHARED_CONVERSATION_QUERY = (
747
+ /* GraphQL */
748
+ `
749
+ query ExploreSharedConversation($shareToken: String!) {
750
+ exploreSharedConversation(shareToken: $shareToken) {
751
+ ${EXPLORE_MESSAGE_FIELDS}
752
+ }
753
+ }
754
+ `
755
+ );
380
756
  function MarkdownLink({
381
757
  href,
382
758
  children,
@@ -816,135 +1192,6 @@ function useWebSDK() {
816
1192
  return client;
817
1193
  }
818
1194
 
819
- // src/components/explore-types.ts
820
- var EXPLORE_MESSAGE_FIELDS = (
821
- /* GraphQL */
822
- `
823
- id
824
- conversationId
825
- role
826
- status
827
- content
828
- partialContent
829
- activity
830
- references {
831
- url
832
- title
833
- description
834
- product
835
- imageUrl
836
- index
837
- }
838
- ctas {
839
- kind
840
- label
841
- url
842
- product
843
- }
844
- followUps
845
- answered
846
- attachments {
847
- name
848
- mimeType
849
- size
850
- textExtracted
851
- }
852
- errorCode
853
- createdAt
854
- completedAt
855
- `
856
- );
857
- var EXPLORE_CATALOG_QUERY = (
858
- /* GraphQL */
859
- `
860
- query ExploreCatalog($productSlug: String) {
861
- exploreCatalog(productSlug: $productSlug) {
862
- enabled
863
- products {
864
- slug
865
- name
866
- tagline
867
- website
868
- }
869
- examplePrompts
870
- welcomeTitle
871
- welcomeBody
872
- limits {
873
- maxMessageLength
874
- maxTurnsPerConversation
875
- messagesPerDay
876
- historyTurns
877
- }
878
- captchaRequired
879
- recaptchaSiteKey
880
- }
881
- }
882
- `
883
- );
884
- var EXPLORE_MESSAGE_QUERY = (
885
- /* GraphQL */
886
- `
887
- query ExploreMessage($conversationToken: String!, $id: ID!) {
888
- exploreMessage(conversationToken: $conversationToken, id: $id) {
889
- ${EXPLORE_MESSAGE_FIELDS}
890
- }
891
- }
892
- `
893
- );
894
- var SEND_EXPLORE_MESSAGE_MUTATION = (
895
- /* GraphQL */
896
- `
897
- mutation SendExploreMessage($input: SendExploreMessageInput!) {
898
- sendExploreMessage(input: $input) {
899
- conversation {
900
- id
901
- token
902
- productSlug
903
- turnCount
904
- createdAt
905
- }
906
- userMessage {
907
- ${EXPLORE_MESSAGE_FIELDS}
908
- }
909
- assistantMessage {
910
- ${EXPLORE_MESSAGE_FIELDS}
911
- }
912
- remainingToday
913
- }
914
- }
915
- `
916
- );
917
- var RECORD_EXPLORE_CLICK_MUTATION = (
918
- /* GraphQL */
919
- `
920
- mutation RecordExploreClick($input: RecordExploreClickInput!) {
921
- recordExploreClick(input: $input) {
922
- recorded
923
- }
924
- }
925
- `
926
- );
927
- var CREATE_EXPLORE_SHARE_LINK_MUTATION = (
928
- /* GraphQL */
929
- `
930
- mutation CreateExploreShareLink($conversationToken: String!) {
931
- createExploreShareLink(conversationToken: $conversationToken) {
932
- shareToken
933
- }
934
- }
935
- `
936
- );
937
- var EXPLORE_SHARED_CONVERSATION_QUERY = (
938
- /* GraphQL */
939
- `
940
- query ExploreSharedConversation($shareToken: String!) {
941
- exploreSharedConversation(shareToken: $shareToken) {
942
- ${EXPLORE_MESSAGE_FIELDS}
943
- }
944
- }
945
- `
946
- );
947
-
948
1195
  // src/data/products.ts
949
1196
  var ECOSYSTEM_PRODUCTS = [
950
1197
  {
@@ -1228,7 +1475,12 @@ function buildFallbackCatalog(examplePrompts, welcome) {
1228
1475
  welcomeBody: welcome?.body ?? FALLBACK_WELCOME_BODY,
1229
1476
  limits: FALLBACK_EXPLORE_LIMITS,
1230
1477
  captchaRequired: false,
1231
- recaptchaSiteKey: null
1478
+ recaptchaSiteKey: null,
1479
+ // Empty, and deliberately not synthesised from `ECOSYSTEM_PRODUCTS`: a concept highlight
1480
+ // needs a real published illustration URL, and this SDK has no registry of them. An
1481
+ // invented path would render 38 broken frames on the one screen every prerender captures.
1482
+ // The strip renders nothing at all when the list is empty, which is the honest fallback.
1483
+ conceptHighlights: []
1232
1484
  };
1233
1485
  }
1234
1486
  function normalizeCatalog(raw, fallback) {
@@ -1245,9 +1497,27 @@ function normalizeCatalog(raw, fallback) {
1245
1497
  historyTurns: raw.limits?.historyTurns || fallback.limits.historyTurns
1246
1498
  },
1247
1499
  captchaRequired: raw.captchaRequired === true,
1248
- recaptchaSiteKey: raw.recaptchaSiteKey ?? null
1500
+ recaptchaSiteKey: raw.recaptchaSiteKey ?? null,
1501
+ // `[ExploreConceptHighlight!]!` on the wire, so a gateway that KNOWS the field always
1502
+ // sends an array. The one response that arrives without it is the retry against an older
1503
+ // supergraph (`EXPLORE_CATALOG_QUERY_WITHOUT_HIGHLIGHTS`) — that gateway does not answer
1504
+ // the full document at all, it refuses it. Either way
1505
+ // `catalog.conceptHighlights.filter(...)` on `undefined` would throw inside render,
1506
+ // blanking the welcome screen over a decorative strip.
1507
+ conceptHighlights: raw.conceptHighlights?.length ? raw.conceptHighlights : fallback.conceptHighlights
1249
1508
  };
1250
1509
  }
1510
+ var CATALOG_DOCUMENT_REJECTED_CODES = /* @__PURE__ */ new Set([
1511
+ "GRAPHQL_VALIDATION_FAILED",
1512
+ "HTTP_400"
1513
+ ]);
1514
+ function catalogRejectedTheHighlightField(res) {
1515
+ if (res.data?.exploreCatalog) return false;
1516
+ return (res.errors ?? []).some((error) => {
1517
+ const code = error.extensions?.code;
1518
+ return typeof code === "string" && CATALOG_DOCUMENT_REJECTED_CODES.has(code) || error.message.includes("conceptHighlights");
1519
+ });
1520
+ }
1251
1521
  var RATE_LIMIT_CODES = /* @__PURE__ */ new Set([
1252
1522
  "RATE_LIMITED",
1253
1523
  "HTTP_429",
@@ -1587,11 +1857,19 @@ function useExploreChat(options = {}) {
1587
1857
  React.useEffect(() => {
1588
1858
  let cancelled = false;
1589
1859
  const load = async () => {
1590
- const res = await client.query(
1860
+ const variables = { productSlug: productSlug ?? null };
1861
+ let res = await client.query(
1591
1862
  EXPLORE_CATALOG_QUERY,
1592
- { productSlug: productSlug ?? null }
1863
+ variables
1593
1864
  );
1594
1865
  if (cancelled || !mountedRef.current) return;
1866
+ if (catalogRejectedTheHighlightField(res)) {
1867
+ res = await client.query(
1868
+ EXPLORE_CATALOG_QUERY_WITHOUT_HIGHLIGHTS,
1869
+ variables
1870
+ );
1871
+ if (cancelled || !mountedRef.current) return;
1872
+ }
1595
1873
  const raw = res.data?.exploreCatalog;
1596
1874
  if (res.errors?.length || !raw) {
1597
1875
  console.warn(
@@ -1972,6 +2250,42 @@ function useExploreChat(options = {}) {
1972
2250
  },
1973
2251
  [client]
1974
2252
  );
2253
+ const submitFeedback = React.useCallback(
2254
+ async (messageId, rating, detail) => {
2255
+ const token = conversationTokenRef.current;
2256
+ if (!token) return false;
2257
+ const comment = detail?.comment?.trim();
2258
+ const input = {
2259
+ conversationToken: token,
2260
+ messageId,
2261
+ rating,
2262
+ // Only meaningful with NOT_HELPFUL. The server stores null for HELPFUL either
2263
+ // way; sending it would just be noise the backend has to defend against.
2264
+ reason: rating === "NOT_HELPFUL" ? detail?.reason ?? null : null,
2265
+ comment: comment ? comment : null
2266
+ };
2267
+ try {
2268
+ const res = await client.mutate(
2269
+ SUBMIT_EXPLORE_FEEDBACK_MUTATION,
2270
+ { input }
2271
+ );
2272
+ const result = res?.data?.submitExploreFeedback;
2273
+ if (!result?.recorded) return false;
2274
+ const recorded = result.feedback;
2275
+ if (recorded && mountedRef.current) {
2276
+ setMessages(
2277
+ (current) => current.map(
2278
+ (message) => message.id === messageId ? { ...message, feedback: recorded } : message
2279
+ )
2280
+ );
2281
+ }
2282
+ return true;
2283
+ } catch {
2284
+ return false;
2285
+ }
2286
+ },
2287
+ [client]
2288
+ );
1975
2289
  return {
1976
2290
  phase,
1977
2291
  catalog,
@@ -1991,6 +2305,7 @@ function useExploreChat(options = {}) {
1991
2305
  deleteConversation,
1992
2306
  clearHistory,
1993
2307
  recordClick,
2308
+ submitFeedback,
1994
2309
  createShareLink,
1995
2310
  isSharedView
1996
2311
  };
@@ -2849,6 +3164,122 @@ function isInlineImageAllowed(src, origins) {
2849
3164
  if (url.protocol !== "https:" || url.username || url.password) return false;
2850
3165
  return origins.has(url.origin);
2851
3166
  }
3167
+ var REFERENCE_KIND_ORDER = [
3168
+ "CONCEPT",
3169
+ "DOCS",
3170
+ "PRICING",
3171
+ "USE_CASE",
3172
+ "PAGE"
3173
+ ];
3174
+ var PRODUCT_SUBDOMAINS = [
3175
+ "alphadocs.",
3176
+ "alphaapp.",
3177
+ "docs.",
3178
+ "alpha.",
3179
+ "app.",
3180
+ "www."
3181
+ ];
3182
+ function readCatalogUrl(raw) {
3183
+ let parsed;
3184
+ try {
3185
+ parsed = new URL(raw);
3186
+ } catch {
3187
+ return null;
3188
+ }
3189
+ if (parsed.protocol !== "https:") return null;
3190
+ const host = parsed.hostname.toLowerCase();
3191
+ const prefix = PRODUCT_SUBDOMAINS.find(
3192
+ (candidate) => host.startsWith(candidate)
3193
+ );
3194
+ const apex = prefix === void 0 ? host : host.slice(prefix.length);
3195
+ const port = parsed.port ? `:${parsed.port}` : "";
3196
+ return {
3197
+ origin: `https://${apex}${port}`,
3198
+ prefix,
3199
+ pathname: parsed.pathname
3200
+ };
3201
+ }
3202
+ function referenceKindOf(url, origins) {
3203
+ const parsed = readCatalogUrl(url);
3204
+ if (parsed === null || !origins.has(parsed.origin)) return null;
3205
+ if (parsed.prefix === "docs." || parsed.prefix === "alphadocs.")
3206
+ return "DOCS";
3207
+ const segment = parsed.pathname.toLowerCase().split("/").filter(Boolean)[0] ?? "";
3208
+ if (segment === "concept" || segment === "concepts") return "CONCEPT";
3209
+ if (segment === "docs") return "DOCS";
3210
+ if (segment === "pricing" || segment === "plans") return "PRICING";
3211
+ if (segment === "use-case" || segment === "use-cases" || segment === "solutions") {
3212
+ return "USE_CASE";
3213
+ }
3214
+ return "PAGE";
3215
+ }
3216
+ function productNamesByOrigin(products) {
3217
+ const names = /* @__PURE__ */ new Map();
3218
+ for (const product of products) {
3219
+ let url;
3220
+ try {
3221
+ url = new URL(product.website);
3222
+ } catch {
3223
+ continue;
3224
+ }
3225
+ if (url.protocol !== "https:") continue;
3226
+ const apex = url.hostname.replace(/^www\./, "");
3227
+ const port = url.port ? `:${url.port}` : "";
3228
+ const key = `https://${apex}${port}`;
3229
+ if (!names.has(key)) names.set(key, product.name);
3230
+ }
3231
+ return names;
3232
+ }
3233
+ function summariseReferences(references, origins, productNames) {
3234
+ const counts = /* @__PURE__ */ new Map();
3235
+ const products = [];
3236
+ for (const reference of references) {
3237
+ const kind = referenceKindOf(reference.url, origins);
3238
+ if (kind !== null) counts.set(kind, (counts.get(kind) ?? 0) + 1);
3239
+ const parsed = readCatalogUrl(reference.url);
3240
+ const name = (parsed === null ? void 0 : productNames.get(parsed.origin)) ?? (reference.product || null);
3241
+ if (name != null && !products.includes(name)) products.push(name);
3242
+ }
3243
+ return {
3244
+ total: references.length,
3245
+ kinds: REFERENCE_KIND_ORDER.filter((kind) => counts.has(kind)).map(
3246
+ (kind) => ({ kind, count: counts.get(kind) ?? 0 })
3247
+ ),
3248
+ products
3249
+ };
3250
+ }
3251
+ var CODE_FENCE = /^\s*(?:```|~~~)/;
3252
+ function answerPlainText(markdown) {
3253
+ const lines = [];
3254
+ let inFence = false;
3255
+ for (const raw of markdown.split("\n")) {
3256
+ if (CODE_FENCE.test(raw)) {
3257
+ inFence = !inFence;
3258
+ continue;
3259
+ }
3260
+ if (inFence) {
3261
+ lines.push(raw);
3262
+ continue;
3263
+ }
3264
+ let line = raw;
3265
+ line = line.replace(/!\[[^\]]*\]\([^)\s]*(?:\s+"[^"]*")?\)/g, "");
3266
+ line = line.replace(/\[([^\]]+)\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g, "$1 ($2)");
3267
+ line = line.replace(/<(https?:\/\/[^>\s]+)>/g, "$1");
3268
+ line = line.replace(/^\s{0,3}#{1,6}\s+/, "");
3269
+ line = line.replace(/^\s{0,3}>\s?/, "");
3270
+ if (/^\s{0,3}([-*_])[ \t]*(?:\1[ \t]*){2,}$/.test(line)) {
3271
+ lines.push("");
3272
+ continue;
3273
+ }
3274
+ line = line.replace(/`([^`]+)`/g, "$1");
3275
+ line = line.replace(/\*\*([^*]+)\*\*/g, "$1");
3276
+ line = line.replace(/__([^_]+)__/g, "$1");
3277
+ line = line.replace(/(^|[^*\w])\*([^*\n]+)\*(?![*\w])/g, "$1$2");
3278
+ line = line.replace(/(^|[^_\w])_([^_\n]+)_(?![_\w])/g, "$1$2");
3279
+ lines.push(line.replace(/[ \t]+$/, ""));
3280
+ }
3281
+ return lines.join("\n").replace(/\n{3,}/g, "\n\n").trim();
3282
+ }
2852
3283
  var InlineImageScopeContext = React.createContext(null);
2853
3284
  var InsideLinkContext = React.createContext(false);
2854
3285
  function AnswerLink(props) {
@@ -3046,6 +3477,315 @@ function ThinkingIndicator({ activity }) {
3046
3477
  }
3047
3478
  );
3048
3479
  }
3480
+ function AnswerFeedback({
3481
+ strings: T,
3482
+ messageId,
3483
+ feedback,
3484
+ onSubmit
3485
+ }) {
3486
+ const [local, setLocal] = React.useState(null);
3487
+ const [failed, setFailed] = React.useState(false);
3488
+ const [sending, setSending] = React.useState(false);
3489
+ const [chooserOpen, setChooserOpen] = React.useState(false);
3490
+ const [reason, setReason] = React.useState(null);
3491
+ const [comment, setComment] = React.useState("");
3492
+ const downRef = React.useRef(null);
3493
+ const firstReasonRef = React.useRef(null);
3494
+ const inFlightRef = React.useRef(false);
3495
+ const panelId = `boff-explore-feedback-${messageId}`;
3496
+ const rating = local ?? feedback?.rating ?? null;
3497
+ const rated = rating !== null;
3498
+ const reasonLabels = {
3499
+ INACCURATE: T.feedbackReasonInaccurate,
3500
+ INCOMPLETE: T.feedbackReasonIncomplete,
3501
+ OFF_TOPIC: T.feedbackReasonOffTopic,
3502
+ HARD_TO_FOLLOW: T.feedbackReasonHardToFollow,
3503
+ OTHER: T.feedbackReasonOther
3504
+ };
3505
+ const closeChooser = React.useCallback(() => {
3506
+ setChooserOpen(false);
3507
+ downRef.current?.focus();
3508
+ }, []);
3509
+ const submit = React.useCallback(
3510
+ async (next, detail) => {
3511
+ if (inFlightRef.current) return;
3512
+ inFlightRef.current = true;
3513
+ setSending(true);
3514
+ setFailed(false);
3515
+ setLocal(next);
3516
+ const recorded = await onSubmit(next, detail);
3517
+ inFlightRef.current = false;
3518
+ setSending(false);
3519
+ if (recorded) return;
3520
+ setLocal(null);
3521
+ setFailed(true);
3522
+ },
3523
+ [onSubmit]
3524
+ );
3525
+ const onThumbUp = React.useCallback(() => {
3526
+ setChooserOpen(false);
3527
+ void submit("HELPFUL");
3528
+ }, [submit]);
3529
+ const onThumbDown = React.useCallback(() => {
3530
+ setChooserOpen((open) => !open);
3531
+ }, []);
3532
+ const onSendReason = React.useCallback(() => {
3533
+ setChooserOpen(false);
3534
+ void submit("NOT_HELPFUL", { reason, comment });
3535
+ }, [comment, reason, submit]);
3536
+ React.useEffect(() => {
3537
+ if (!chooserOpen) return;
3538
+ firstReasonRef.current?.focus();
3539
+ }, [chooserOpen]);
3540
+ const thumbClass = (active) => cn(
3541
+ "inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full border transition-colors",
3542
+ "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
3543
+ "disabled:pointer-events-none disabled:opacity-50",
3544
+ active ? "border-primary/40 bg-accent text-primary" : "border-border bg-card text-muted-foreground hover:border-primary/40 hover:bg-accent hover:text-foreground"
3545
+ );
3546
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3547
+ "div",
3548
+ {
3549
+ "data-boff-explore": "feedback",
3550
+ "data-rating": rating ?? "none",
3551
+ className: "pt-0.5",
3552
+ children: [
3553
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-2 gap-y-1", children: [
3554
+ /* @__PURE__ */ jsxRuntime.jsx(
3555
+ "p",
3556
+ {
3557
+ "data-boff-explore": "feedback-status",
3558
+ role: "status",
3559
+ className: "text-xs text-muted-foreground",
3560
+ children: failed ? T.feedbackNotSent : rated ? T.feedbackThanks : T.feedbackPrompt
3561
+ }
3562
+ ),
3563
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [
3564
+ /* @__PURE__ */ jsxRuntime.jsx(
3565
+ "button",
3566
+ {
3567
+ "data-boff-explore": "feedback-up",
3568
+ type: "button",
3569
+ disabled: sending,
3570
+ "aria-label": T.feedbackHelpful,
3571
+ title: T.feedbackHelpful,
3572
+ "aria-pressed": rating === "HELPFUL",
3573
+ onClick: onThumbUp,
3574
+ className: thumbClass(rating === "HELPFUL"),
3575
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ThumbsUp, { className: "h-3.5 w-3.5", "aria-hidden": "true" })
3576
+ }
3577
+ ),
3578
+ /* @__PURE__ */ jsxRuntime.jsx(
3579
+ "button",
3580
+ {
3581
+ ref: downRef,
3582
+ "data-boff-explore": "feedback-down",
3583
+ type: "button",
3584
+ disabled: sending,
3585
+ "aria-label": T.feedbackNotHelpful,
3586
+ title: T.feedbackNotHelpful,
3587
+ "aria-pressed": rating === "NOT_HELPFUL",
3588
+ "aria-expanded": chooserOpen,
3589
+ "aria-controls": chooserOpen ? panelId : void 0,
3590
+ onClick: onThumbDown,
3591
+ className: thumbClass(rating === "NOT_HELPFUL" || chooserOpen),
3592
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ThumbsDown, { className: "h-3.5 w-3.5", "aria-hidden": "true" })
3593
+ }
3594
+ )
3595
+ ] })
3596
+ ] }),
3597
+ chooserOpen ? /* @__PURE__ */ jsxRuntime.jsxs(
3598
+ "div",
3599
+ {
3600
+ id: panelId,
3601
+ "data-boff-explore": "feedback-reasons",
3602
+ role: "group",
3603
+ "aria-label": T.feedbackReasonTitle,
3604
+ onKeyDown: (event) => {
3605
+ if (event.key !== "Escape") return;
3606
+ event.stopPropagation();
3607
+ closeChooser();
3608
+ },
3609
+ className: "boff-explore-fade mt-2 rounded-xl border border-border bg-card p-3",
3610
+ children: [
3611
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-medium text-card-foreground", children: T.feedbackReasonTitle }),
3612
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1.5", children: EXPLORE_FEEDBACK_REASONS.map((code, index) => /* @__PURE__ */ jsxRuntime.jsx(
3613
+ "button",
3614
+ {
3615
+ ref: index === 0 ? firstReasonRef : void 0,
3616
+ "data-boff-explore": "feedback-reason",
3617
+ "data-reason": code,
3618
+ type: "button",
3619
+ "aria-pressed": reason === code,
3620
+ onClick: () => setReason((current) => current === code ? null : code),
3621
+ className: cn(
3622
+ "inline-flex max-w-full items-center rounded-full border px-3 py-1 text-xs transition-colors",
3623
+ "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
3624
+ reason === code ? "border-primary/40 bg-accent text-primary" : "border-border bg-background text-muted-foreground hover:border-primary/40 hover:bg-accent hover:text-foreground"
3625
+ ),
3626
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: reasonLabels[code] })
3627
+ },
3628
+ code
3629
+ )) }),
3630
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex flex-wrap items-center gap-2", children: [
3631
+ /* @__PURE__ */ jsxRuntime.jsx(
3632
+ "input",
3633
+ {
3634
+ "data-boff-explore": "feedback-comment",
3635
+ type: "text",
3636
+ value: comment,
3637
+ onChange: (event) => setComment(event.target.value),
3638
+ onKeyDown: (event) => {
3639
+ if (event.key !== "Enter") return;
3640
+ event.preventDefault();
3641
+ onSendReason();
3642
+ },
3643
+ "aria-label": T.feedbackCommentPlaceholder,
3644
+ placeholder: T.feedbackCommentPlaceholder,
3645
+ maxLength: EXPLORE_FEEDBACK_COMMENT_SOFT_MAX,
3646
+ className: "min-w-0 flex-1 rounded-md border border-border bg-background px-2 py-1 text-base text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring sm:text-sm"
3647
+ }
3648
+ ),
3649
+ /* @__PURE__ */ jsxRuntime.jsx(
3650
+ Button,
3651
+ {
3652
+ "data-boff-explore": "feedback-send",
3653
+ type: "button",
3654
+ size: "sm",
3655
+ disabled: sending,
3656
+ onClick: onSendReason,
3657
+ children: T.feedbackSend
3658
+ }
3659
+ ),
3660
+ /* @__PURE__ */ jsxRuntime.jsx(
3661
+ Button,
3662
+ {
3663
+ "data-boff-explore": "feedback-dismiss",
3664
+ type: "button",
3665
+ size: "sm",
3666
+ variant: "ghost",
3667
+ className: "text-muted-foreground",
3668
+ onClick: closeChooser,
3669
+ children: T.feedbackDismiss
3670
+ }
3671
+ )
3672
+ ] })
3673
+ ]
3674
+ }
3675
+ ) : null
3676
+ ]
3677
+ }
3678
+ );
3679
+ }
3680
+ var PROVENANCE_CHIP = "inline-flex max-w-full items-center gap-1 rounded-full border border-border bg-muted/60 px-2 py-0.5 text-[11px] leading-5 text-muted-foreground";
3681
+ function ProvenanceChips({
3682
+ strings: T,
3683
+ provenance
3684
+ }) {
3685
+ if (provenance.total === 0) return null;
3686
+ const kindLabels = {
3687
+ CONCEPT: T.sourceKindConcept,
3688
+ DOCS: T.sourceKindDocs,
3689
+ PRICING: T.sourceKindPricing,
3690
+ USE_CASE: T.sourceKindUseCase,
3691
+ PAGE: T.sourceKindPage
3692
+ };
3693
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3694
+ "ul",
3695
+ {
3696
+ "data-boff-explore": "provenance",
3697
+ "aria-label": T.groundedIn,
3698
+ className: "flex flex-wrap items-center gap-1.5",
3699
+ children: [
3700
+ /* @__PURE__ */ jsxRuntime.jsxs("li", { "data-boff-explore": "provenance-count", className: PROVENANCE_CHIP, children: [
3701
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BookOpenText, { className: "h-3 w-3 shrink-0", "aria-hidden": "true" }),
3702
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: provenance.total === 1 ? T.sourceCountOne : fill(T.sourceCountMany, { count: String(provenance.total) }) })
3703
+ ] }),
3704
+ provenance.kinds.map(({ kind, count }) => /* @__PURE__ */ jsxRuntime.jsx(
3705
+ "li",
3706
+ {
3707
+ "data-boff-explore": "provenance-kind",
3708
+ "data-kind": kind,
3709
+ "data-count": count,
3710
+ className: PROVENANCE_CHIP,
3711
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: count > 1 ? `${kindLabels[kind]} \xB7 ${count}` : kindLabels[kind] })
3712
+ },
3713
+ kind
3714
+ )),
3715
+ provenance.products.map((name) => /* @__PURE__ */ jsxRuntime.jsx(
3716
+ "li",
3717
+ {
3718
+ "data-boff-explore": "provenance-product",
3719
+ className: PROVENANCE_CHIP,
3720
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: name })
3721
+ },
3722
+ name
3723
+ ))
3724
+ ]
3725
+ }
3726
+ );
3727
+ }
3728
+ var COPY_FEEDBACK_MS = 2500;
3729
+ function AnswerActions({
3730
+ strings: T,
3731
+ text
3732
+ }) {
3733
+ const [outcome, setOutcome] = React.useState("idle");
3734
+ const resetRef = React.useRef(null);
3735
+ React.useEffect(
3736
+ () => () => {
3737
+ if (resetRef.current !== null) clearTimeout(resetRef.current);
3738
+ },
3739
+ []
3740
+ );
3741
+ const copy = React.useCallback(async () => {
3742
+ let copied = false;
3743
+ try {
3744
+ const clipboard = typeof navigator === "undefined" ? void 0 : navigator.clipboard;
3745
+ if (typeof clipboard?.writeText === "function") {
3746
+ await clipboard.writeText(text);
3747
+ copied = true;
3748
+ }
3749
+ } catch {
3750
+ copied = false;
3751
+ }
3752
+ setOutcome(copied ? "copied" : "failed");
3753
+ if (resetRef.current !== null) clearTimeout(resetRef.current);
3754
+ resetRef.current = setTimeout(() => setOutcome("idle"), COPY_FEEDBACK_MS);
3755
+ }, [text]);
3756
+ const label = outcome === "copied" ? T.copied : outcome === "failed" ? T.copyFailed : T.copyAnswer;
3757
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3758
+ "div",
3759
+ {
3760
+ "data-boff-explore": "answer-actions",
3761
+ className: "flex flex-wrap items-center gap-2 pt-0.5",
3762
+ children: [
3763
+ /* @__PURE__ */ jsxRuntime.jsxs(
3764
+ "button",
3765
+ {
3766
+ "data-boff-explore": "copy-answer",
3767
+ "data-outcome": outcome,
3768
+ type: "button",
3769
+ title: label,
3770
+ onClick: () => {
3771
+ void copy();
3772
+ },
3773
+ className: cn(
3774
+ "inline-flex max-w-full items-center gap-1.5 rounded-full border px-2.5 py-1 text-xs transition-colors",
3775
+ "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
3776
+ outcome === "failed" ? "border-destructive/40 bg-card text-destructive" : "border-border bg-card text-muted-foreground hover:border-primary/40 hover:bg-accent hover:text-foreground"
3777
+ ),
3778
+ children: [
3779
+ outcome === "copied" ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "h-3 w-3 shrink-0", "aria-hidden": "true" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Copy, { className: "h-3 w-3 shrink-0", "aria-hidden": "true" }),
3780
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: label })
3781
+ ]
3782
+ }
3783
+ ),
3784
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "data-boff-explore": "copy-status", role: "status", className: "sr-only", children: outcome === "idle" ? "" : label })
3785
+ ]
3786
+ }
3787
+ );
3788
+ }
3049
3789
  function UserBubble({
3050
3790
  strings: T,
3051
3791
  message
@@ -3091,10 +3831,12 @@ function AssistantBubble({
3091
3831
  message,
3092
3832
  activity,
3093
3833
  imageOrigins,
3834
+ productNames,
3094
3835
  onNavigate,
3095
3836
  anchorRef,
3096
3837
  onFollow,
3097
- onFollowUp
3838
+ onFollowUp,
3839
+ onFeedback
3098
3840
  }) {
3099
3841
  const streaming = message.status === "PENDING" || message.status === "RUNNING";
3100
3842
  const body = message.content || message.partialContent || "";
@@ -3118,6 +3860,15 @@ function AssistantBubble({
3118
3860
  }),
3119
3861
  [T, completed, imageOrigins, failedImages, markImageFailed]
3120
3862
  );
3863
+ const provenance = React.useMemo(
3864
+ () => summariseReferences(message.references, imageOrigins, productNames),
3865
+ [message.references, imageOrigins, productNames]
3866
+ );
3867
+ const copyText = React.useMemo(
3868
+ () => answerPlainText(message.content),
3869
+ [message.content]
3870
+ );
3871
+ const grounded = completed && message.answered !== false;
3121
3872
  return /* @__PURE__ */ jsxRuntime.jsxs(
3122
3873
  "div",
3123
3874
  {
@@ -3167,6 +3918,7 @@ function AssistantBubble({
3167
3918
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "boff-prose boff-prose-sm boff-explore-body min-w-0 text-card-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(InlineImageScopeContext.Provider, { value: imageScope, children: /* @__PURE__ */ jsxRuntime.jsx(Markdown, { components: ANSWER_MARKDOWN_COMPONENTS, children: body }) }) }),
3168
3919
  streaming ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "boff-explore-caret", "aria-hidden": "true" }) : null
3169
3920
  ] }) : null,
3921
+ grounded && provenance.total > 0 ? /* @__PURE__ */ jsxRuntime.jsx(ProvenanceChips, { strings: T, provenance }) : null,
3170
3922
  streaming ? /* @__PURE__ */ jsxRuntime.jsx(ThinkingIndicator, { activity }) : null,
3171
3923
  failed && !body ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-2xl rounded-tl-md border border-border bg-muted px-4 py-3 text-sm text-muted-foreground", children: T.answerDidNotArrive }) : null,
3172
3924
  message.references.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
@@ -3205,7 +3957,17 @@ function AssistantBubble({
3205
3957
  },
3206
3958
  question
3207
3959
  )) })
3208
- ] }) : null
3960
+ ] }) : null,
3961
+ completed && copyText !== "" ? /* @__PURE__ */ jsxRuntime.jsx(AnswerActions, { strings: T, text: copyText }) : null,
3962
+ completed && onFeedback ? /* @__PURE__ */ jsxRuntime.jsx(
3963
+ AnswerFeedback,
3964
+ {
3965
+ strings: T,
3966
+ messageId: message.id,
3967
+ feedback: message.feedback,
3968
+ onSubmit: onFeedback
3969
+ }
3970
+ ) : null
3209
3971
  ] })
3210
3972
  ]
3211
3973
  }
@@ -3409,6 +4171,96 @@ function ProductStrip({
3409
4171
  }
3410
4172
  );
3411
4173
  }
4174
+ var MAX_CONCEPT_CARDS = 6;
4175
+ function ConceptStrip({
4176
+ strings: T,
4177
+ highlights,
4178
+ onAsk,
4179
+ disabled
4180
+ }) {
4181
+ const [failed, setFailed] = React.useState(() => /* @__PURE__ */ new Set());
4182
+ const markFailed = React.useCallback((src) => {
4183
+ setFailed(
4184
+ (current) => current.has(src) ? current : new Set(current).add(src)
4185
+ );
4186
+ }, []);
4187
+ const visible = highlights.filter(
4188
+ (highlight) => highlight.imageUrl !== "" && !failed.has(highlight.imageUrl)
4189
+ ).slice(0, MAX_CONCEPT_CARDS);
4190
+ if (visible.length === 0) return null;
4191
+ return /* @__PURE__ */ jsxRuntime.jsxs(
4192
+ "div",
4193
+ {
4194
+ "data-boff-explore": "concept-strip-block",
4195
+ className: "boff-explore-rise boff-explore-rise-3 mt-6",
4196
+ children: [
4197
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: T.conceptStripTitle }),
4198
+ /* @__PURE__ */ jsxRuntime.jsx(
4199
+ "ul",
4200
+ {
4201
+ "data-boff-explore": "concept-strip",
4202
+ "aria-label": T.conceptStripLabel,
4203
+ className: "boff-explore-strip flex min-w-0 snap-x gap-3 overflow-x-auto pb-1",
4204
+ children: visible.map((highlight) => /* @__PURE__ */ jsxRuntime.jsx(
4205
+ "li",
4206
+ {
4207
+ className: "shrink-0 snap-start",
4208
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
4209
+ "button",
4210
+ {
4211
+ "data-boff-explore": "concept-card",
4212
+ "data-product": highlight.product,
4213
+ type: "button",
4214
+ disabled,
4215
+ "aria-label": fill(T.conceptAsk, {
4216
+ title: highlight.title,
4217
+ product: highlight.productName
4218
+ }),
4219
+ onClick: () => onAsk(
4220
+ fill(T.conceptAskQuestion, {
4221
+ title: highlight.title,
4222
+ product: highlight.productName
4223
+ })
4224
+ ),
4225
+ className: "group flex w-40 flex-col overflow-hidden rounded-xl border border-border bg-card text-left shadow-sm transition-colors hover:border-primary/50 hover:bg-accent disabled:cursor-not-allowed disabled:opacity-50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring sm:w-48",
4226
+ children: [
4227
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "relative block aspect-[16/9] w-full overflow-hidden bg-muted", children: [
4228
+ /* @__PURE__ */ jsxRuntime.jsx(
4229
+ "img",
4230
+ {
4231
+ src: highlight.imageUrl,
4232
+ alt: highlight.alt,
4233
+ loading: "lazy",
4234
+ decoding: "async",
4235
+ onError: () => markFailed(highlight.imageUrl),
4236
+ className: "h-full w-full object-cover transition-transform duration-300 group-hover:scale-105"
4237
+ }
4238
+ ),
4239
+ /* @__PURE__ */ jsxRuntime.jsx(
4240
+ "span",
4241
+ {
4242
+ "aria-hidden": "true",
4243
+ className: "pointer-events-none absolute left-1.5 top-1.5 rounded-full border border-border bg-background/90 px-1.5 py-0.5 text-[9px] font-semibold uppercase tracking-wide text-foreground",
4244
+ children: T.conceptIllustration
4245
+ }
4246
+ )
4247
+ ] }),
4248
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-col gap-0.5 p-2.5", children: [
4249
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "line-clamp-2 text-xs font-semibold leading-snug text-card-foreground", children: highlight.title }),
4250
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-[11px] text-muted-foreground", children: highlight.productName })
4251
+ ] })
4252
+ ]
4253
+ }
4254
+ )
4255
+ },
4256
+ `${highlight.product}:${highlight.url}`
4257
+ ))
4258
+ }
4259
+ )
4260
+ ]
4261
+ }
4262
+ );
4263
+ }
3412
4264
  function DisclaimerDialog({
3413
4265
  open,
3414
4266
  onClose,
@@ -3515,6 +4367,7 @@ function WelcomeState({
3515
4367
  body,
3516
4368
  prompts,
3517
4369
  products,
4370
+ conceptHighlights,
3518
4371
  focusProduct,
3519
4372
  onPrompt,
3520
4373
  onFocus,
@@ -3553,6 +4406,15 @@ function WelcomeState({
3553
4406
  }
3554
4407
  )
3555
4408
  ] }) : null,
4409
+ /* @__PURE__ */ jsxRuntime.jsx(
4410
+ ConceptStrip,
4411
+ {
4412
+ strings: T,
4413
+ highlights: conceptHighlights,
4414
+ onAsk: onPrompt,
4415
+ disabled
4416
+ }
4417
+ ),
3556
4418
  products.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "boff-explore-rise boff-explore-rise-3 mt-6", children: [
3557
4419
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: T.focusProduct }),
3558
4420
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -3609,6 +4471,7 @@ function ExplorePage({
3609
4471
  deleteConversation,
3610
4472
  clearHistory,
3611
4473
  recordClick,
4474
+ submitFeedback,
3612
4475
  createShareLink,
3613
4476
  isSharedView
3614
4477
  } = useExploreChat({
@@ -3665,10 +4528,18 @@ function ExplorePage({
3665
4528
  () => catalog.products.find((p) => p.slug === focusProduct)?.name ?? null,
3666
4529
  [catalog.products, focusProduct]
3667
4530
  );
4531
+ const headProductName = React.useMemo(
4532
+ () => productSlug ? catalog.products.find((p) => p.slug === productSlug)?.name ?? null : null,
4533
+ [catalog.products, productSlug]
4534
+ );
3668
4535
  const imageOrigins = React.useMemo(
3669
4536
  () => inlineImageOrigins(catalog.products),
3670
4537
  [catalog.products]
3671
4538
  );
4539
+ const productNames = React.useMemo(
4540
+ () => productNamesByOrigin(catalog.products),
4541
+ [catalog.products]
4542
+ );
3672
4543
  React.useEffect(() => {
3673
4544
  const el = textareaRef.current;
3674
4545
  if (!el) return;
@@ -4029,16 +4900,17 @@ function ExplorePage({
4029
4900
  ),
4030
4901
  style: rootStyle,
4031
4902
  children: [
4032
- seo ? /* @__PURE__ */ jsxRuntime.jsx(
4903
+ /* @__PURE__ */ jsxRuntime.jsx(
4033
4904
  PageHead,
4034
4905
  {
4035
- title: seo.title ?? "Explore \u2014 ask anything about our products",
4036
- description: seo.description ?? "Ask questions in plain English and get answers drawn from our product documentation, with links to the exact pages they came from.",
4037
- keywords: seo.keywords,
4038
- image: seo.image,
4039
- url: seo.url
4906
+ title: seo?.title ?? T.seoTitle,
4907
+ description: seo?.description ?? (headProductName ? fill(T.seoDescriptionProduct, { product: headProductName }) : T.seoDescription),
4908
+ productName: seo?.title ? void 0 : headProductName ?? void 0,
4909
+ keywords: seo?.keywords,
4910
+ image: seo?.image,
4911
+ url: seo?.url
4040
4912
  }
4041
- ) : null,
4913
+ ),
4042
4914
  /* @__PURE__ */ jsxRuntime.jsx(ProseStyles, {}),
4043
4915
  /* @__PURE__ */ jsxRuntime.jsx(ExploreStyles, {}),
4044
4916
  !showWelcome ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2.5 border-b border-border px-4 py-2.5", children: [
@@ -4199,6 +5071,7 @@ function ExplorePage({
4199
5071
  body: resolvedBody,
4200
5072
  prompts,
4201
5073
  products: catalog.products,
5074
+ conceptHighlights: catalog.conceptHighlights,
4202
5075
  focusProduct,
4203
5076
  onPrompt: sendPrompt,
4204
5077
  onFocus: setFocusProduct,
@@ -4212,10 +5085,12 @@ function ExplorePage({
4212
5085
  message,
4213
5086
  activity,
4214
5087
  imageOrigins,
5088
+ productNames,
4215
5089
  onNavigate,
4216
5090
  anchorRef: message.id === latestAssistantId ? latestAssistantRef : void 0,
4217
5091
  onFollow: (kind, url) => recordClick(message.id, kind, url),
4218
- onFollowUp: sendPrompt
5092
+ onFollowUp: sendPrompt,
5093
+ onFeedback: isSharedView ? void 0 : (rating, detail) => submitFeedback(message.id, rating, detail)
4219
5094
  },
4220
5095
  message.id
4221
5096
  )
@@ -4514,8 +5389,12 @@ function ExplorePage({
4514
5389
  }
4515
5390
 
4516
5391
  exports.ExplorePage = ExplorePage;
5392
+ exports.answerPlainText = answerPlainText;
4517
5393
  exports.inlineImageOrigins = inlineImageOrigins;
4518
5394
  exports.isInlineImageAllowed = isInlineImageAllowed;
4519
5395
  exports.logoUrlOf = logoUrlOf;
5396
+ exports.productNamesByOrigin = productNamesByOrigin;
5397
+ exports.referenceKindOf = referenceKindOf;
5398
+ exports.summariseReferences = summariseReferences;
4520
5399
  //# sourceMappingURL=explore.js.map
4521
5400
  //# sourceMappingURL=explore.js.map