@burdenoff/website-sdk 2026.1102.2 → 2026.1102.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +41 -2
  2. package/dist/avatar-live-view/index.d.mts +13 -4
  3. package/dist/avatar-live-view/index.d.ts +13 -4
  4. package/dist/avatar-live-view/index.js +1262 -257
  5. package/dist/avatar-live-view/index.js.map +1 -1
  6. package/dist/avatar-live-view/index.mjs +1260 -255
  7. package/dist/avatar-live-view/index.mjs.map +1 -1
  8. package/dist/{chunk-FQH3AJN3.js → chunk-7O2I32ZN.js} +2 -2
  9. package/dist/chunk-7O2I32ZN.js.map +1 -0
  10. package/dist/{chunk-R742FS5E.js → chunk-DZLUZKOX.js} +19 -17
  11. package/dist/{chunk-R742FS5E.js.map → chunk-DZLUZKOX.js.map} +1 -1
  12. package/dist/{chunk-SFT3WHN5.mjs → chunk-K3QZGJEH.mjs} +2 -2
  13. package/dist/chunk-K3QZGJEH.mjs.map +1 -0
  14. package/dist/{chunk-SK5UGG6A.js → chunk-P5GMVPR6.js} +76 -20
  15. package/dist/chunk-P5GMVPR6.js.map +1 -0
  16. package/dist/{chunk-EUPFS6MZ.mjs → chunk-SMD7MEEA.mjs} +76 -20
  17. package/dist/chunk-SMD7MEEA.mjs.map +1 -0
  18. package/dist/{chunk-ETI2HQEC.mjs → chunk-ZWEEBHXJ.mjs} +4 -4
  19. package/dist/{chunk-ETI2HQEC.mjs.map → chunk-ZWEEBHXJ.mjs.map} +1 -1
  20. package/dist/components/explore.d.mts +2 -2
  21. package/dist/components/explore.d.ts +2 -2
  22. package/dist/components/explore.js +14 -14
  23. package/dist/components/explore.mjs +2 -2
  24. package/dist/{explore-DUTNYUOm.d.mts → explore-DaSNdm4O.d.mts} +1 -1
  25. package/dist/{explore-DjQE7Xia.d.ts → explore-DtSPdlEy.d.ts} +1 -1
  26. package/dist/{explore-avatar-live-config-Cetx8-Zu.d.ts → explore-avatar-live-config-CAfN5eAX.d.ts} +6 -3
  27. package/dist/{explore-avatar-live-config-Bp3kQbU2.d.mts → explore-avatar-live-config-N4WhJzgS.d.mts} +6 -3
  28. package/dist/{explore-types-Bb2Ih3d8.d.mts → explore-types-Ol1Mm3dW.d.mts} +12 -1
  29. package/dist/{explore-types-Bb2Ih3d8.d.ts → explore-types-Ol1Mm3dW.d.ts} +12 -1
  30. package/dist/hooks/index.d.mts +2 -2
  31. package/dist/hooks/index.d.ts +2 -2
  32. package/dist/hooks/index.js +9 -9
  33. package/dist/hooks/index.mjs +1 -1
  34. package/dist/index.d.mts +15 -9
  35. package/dist/index.d.ts +15 -9
  36. package/dist/index.js +92 -63
  37. package/dist/index.js.map +1 -1
  38. package/dist/index.mjs +35 -6
  39. package/dist/index.mjs.map +1 -1
  40. package/dist/{use-explore-chat-DunjG-3p.d.ts → use-explore-chat-B3dOOvJN.d.ts} +43 -3
  41. package/dist/{use-explore-chat-zRuoAin6.d.mts → use-explore-chat-CbfohA9O.d.mts} +43 -3
  42. package/package.json +1 -1
  43. package/dist/chunk-EUPFS6MZ.mjs.map +0 -1
  44. package/dist/chunk-FQH3AJN3.js.map +0 -1
  45. package/dist/chunk-SFT3WHN5.mjs.map +0 -1
  46. package/dist/chunk-SK5UGG6A.js.map +0 -1
@@ -54,5 +54,5 @@ exports.isAvatarVersion = isAvatarVersion;
54
54
  exports.isRealTurnstileSiteKey = isRealTurnstileSiteKey;
55
55
  exports.liveConfigComplete = liveConfigComplete;
56
56
  exports.turnstileSiteKeyOf = turnstileSiteKeyOf;
57
- //# sourceMappingURL=chunk-FQH3AJN3.js.map
58
- //# sourceMappingURL=chunk-FQH3AJN3.js.map
57
+ //# sourceMappingURL=chunk-7O2I32ZN.js.map
58
+ //# sourceMappingURL=chunk-7O2I32ZN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/explore-avatar-live-config.ts"],"names":[],"mappings":";;;AAmEO,IAAM,mBAAA,GAAsB,oBAAA;AAEnC,IAAM,IAAA,GAAO,wBAAA;AACb,IAAM,OAAA,GAAU,wBAAA;AAChB,IAAM,QAAA,GAAW,wBAAA;AAKjB,IAAM,aAAA,GAAgB,wBAAA;AAMtB,IAAM,aAAA,GAAgB,0BAAA;AACtB,IAAM,iCAAiB,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,WAAA,EAAa,OAAO,CAAC,CAAA;AAG3D,SAAS,aAAa,KAAA,EAAwB;AACnD,EAAA,OAAO,IAAA,CAAK,KAAK,KAAK,CAAA;AACxB;AAGO,SAAS,gBAAgB,KAAA,EAAwB;AACtD,EAAA,OAAO,OAAA,CAAQ,KAAK,KAAK,CAAA;AAC3B;AAOO,SAAS,cAAc,UAAA,EAA+C;AAC3E,EAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,IAAI,IAAI,UAAU,CAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GACJ,IAAI,QAAA,KAAa,OAAA,IAAW,eAAe,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,WAAA,EAAa,CAAA;AAC3E,EAAA,IAAI,GAAA,CAAI,QAAA,KAAa,QAAA,IAAY,CAAC,OAAO,OAAO,IAAA;AAChD,EAAA,OAAO,CAAA,EAAG,GAAA,CAAI,MAAM,CAAA,EAAG,mBAAmB,CAAA,CAAA;AAC5C;AAGO,SAAS,uBAAuB,GAAA,EAAsB;AAC3D,EAAA,OAAO,cAAc,IAAA,CAAK,GAAG,KAAK,CAAC,aAAA,CAAc,KAAK,GAAG,CAAA;AAC3D;AAMO,SAAS,mBAAmB,IAAA,EAAuC;AACxE,EAAA,MAAM,MAAe,IAAA,CAAK,gBAAA;AAC1B,EAAA,MAAM,YAAqB,IAAA,CAAK,gBAAA;AAChC,EAAA,OACE,OAAO,IAAA,CAAK,IAAA,KAAS,UAAA,IACrB,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,IACrB,YAAA,CAAa,KAAK,IAAI,CAAA,IACtB,OAAO,IAAA,CAAK,oBAAoB,QAAA,IAChC,eAAA,CAAgB,IAAA,CAAK,eAAe,CAAA,KACnC,GAAA,KAAQ,MAAA,IACP,GAAA,KAAQ,MACP,OAAO,GAAA,KAAQ,QAAA,IAAY,QAAA,CAAS,KAAK,GAAG,CAAA,CAAA,KAC9C,SAAA,KAAc,MAAA,IAAa,OAAO,SAAA,KAAc,SAAA,CAAA;AAErD;AAMO,SAAS,mBACd,IAAA,EACe;AACf,EAAA,MAAM,MAAM,IAAA,CAAK,gBAAA;AACjB,EAAA,IAAI,OAAO,QAAQ,QAAA,IAAY,CAAC,SAAS,IAAA,CAAK,GAAG,GAAG,OAAO,IAAA;AAC3D,EAAA,IAAI,KAAK,gBAAA,KAAqB,KAAA,IAAS,CAAC,sBAAA,CAAuB,GAAG,CAAA,EAAG;AACnE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA;AACT;AAMA,IAAM,QAAA,mBAAuC,IAAI,GAAA,CAAmB,CAAC,IAAI,CAAC,CAAA;AAGnE,SAAS,2BAA2B,MAAA,EAAgC;AACzE,EAAA,OAAO,QAAA,CAAS,IAAI,MAAM,CAAA;AAC5B","file":"chunk-7O2I32ZN.js","sourcesContent":["/**\n * BOFF-9797. The small part of the live avatar that the panel itself needs, whether or not it is ever opened: what a\n * host's `avatar.live` is, whether the live avatar can run on this page at all, and where its requests go.\n *\n * Everything else (the view, its state machine, the requests, the words, the bot check) is a separate chunk that a\n * site only downloads when its visitor first opens the Avatar view (see `explore-avatar-live.tsx`). That is why this\n * file is separate and kept to a few lines: it is the only part of the live avatar in the package root for a site that\n * does not pass `avatar.live`, and the part of it that decides, without loading anything, whether the chunk is wanted.\n * Types only, plus plain functions: nothing here imports a component, a context or a string table.\n */\nimport type { ExploreLocale } from \"./explore-i18n\";\nimport type { AvatarLiveModule } from \"../avatar-live/types\";\nimport type { UseExploreChatResult } from \"../hooks/use-explore-chat\";\n\n/**\n * BOFF-9797. A host's opt-in to the live avatar on its panel's Avatar tab. `site`, `load` and `manifestVersion` are\n * required; a config that is incomplete, or has an optional field of the wrong shape, leaves the tab as it was (and a\n * warning in the console).\n */\nexport interface ExplorePanelAvatarLive {\n /** The site, as the live avatar service knows it: `healthybowl`. */\n site: string;\n /**\n * Loads the live avatar's room module: `() => import('@burdenoff/website-sdk/avatar-live')`. Called only after the\n * visitor presses Start on the consent card, never on page load or on opening the tab. That entry needs the\n * package's optional peer dependency for media rooms (see the README).\n */\n load: () => Promise<AvatarLiveModule>;\n /**\n * The site's Cloudflare Turnstile site key, for the bot check that runs when the visitor presses Start. Used only when\n * the server says it checks for bots (its availability's `botCheck`, contract v1.2), or says nothing of it (a server\n * older than v1.2, which always checks): such a server's live avatar then needs a key, and without one the tab stays\n * as it was. A server that runs no bot check needs none, and no Cloudflare script is loaded for it, key or not.\n */\n turnstileSiteKey?: string;\n /**\n * Whether `turnstileSiteKey` may be one of Cloudflare's test keys (`1x00000000000000000000AA` and keys of their\n * shape). `websiteAvatarLive` sets it: true on alpha only, false everywhere else, so a production page never runs a\n * test widget. Unset (a config made by hand): any key of a valid shape, as before.\n */\n allowTestSiteKey?: boolean;\n /** The version of the suggested-question list the panel shows (its `examplePrompts`), such as `hb-en-1`. */\n manifestVersion: string;\n}\n\n/**\n * What the live avatar reads of the panel's conversation: the transcript, whether it is read-only and the token, and\n * `reset` (the chat's own New chat) for its New chat button where the conversation can never be read. Where the server\n * reads typed questions too (contract v1.3), the Avatar tab's own question box asks through the same conversation:\n * `send` (with `surface: \"AVATAR\"`), and `canSend`, `phase`, `activity` and `catalog` to say when it can and what the\n * answer is doing, and `resent` to follow a question asked there that Chat's Retry sent again.\n */\nexport type AvatarConversation = Pick<\n UseExploreChatResult,\n | \"messages\"\n | \"isSharedView\"\n | \"getConversationToken\"\n | \"reset\"\n | \"send\"\n | \"canSend\"\n | \"phase\"\n | \"activity\"\n | \"catalog\"\n | \"resent\"\n>;\n\n/** The web branch's routes, under the gateway's origin. */\nexport const AVATAR_WEB_API_PATH = \"/api/web-avatar/v1\";\n\nconst SITE = /^[a-z][a-z0-9-]{1,31}$/;\nconst VERSION = /^[A-Za-z0-9._-]{1,32}$/;\nconst SITE_KEY = /^[A-Za-z0-9_-]{1,128}$/;\n/**\n * The shape of Cloudflare's dummy site keys: a digit, `x`, a run of zeros and two letters (`1x00000000000000000000AA`,\n * `2x00000000000000000000AB`, `3x00000000000000000000FF`, …). Also catches an all-zero `0x…` placeholder.\n */\nconst TEST_SITE_KEY = /^\\dx0{16,}[A-Za-z]{2}$/;\n/**\n * A real-looking site key. Cloudflare documents no format for real keys; every key it issues starts `0x` (in practice\n * `0x4AAAAAAA…`, about 24 characters), in letters, digits, `_` and `-`. The length is kept loose (18 to 64 in all) so a\n * longer key Cloudflare might issue later still passes, and the charset matches what the panel accepts.\n */\nconst REAL_SITE_KEY = /^0x[A-Za-z0-9_-]{16,62}$/;\nconst LOOPBACK_HOSTS = new Set([\"localhost\", \"127.0.0.1\", \"[::1]\"]);\n\n/** A site slug the contract accepts (`healthybowl`). */\nexport function isAvatarSite(value: string): boolean {\n return SITE.test(value);\n}\n\n/** A consent or manifest version the contract accepts (`hb-en-1`). */\nexport function isAvatarVersion(value: string): boolean {\n return VERSION.test(value);\n}\n\n/**\n * The web branch's base URL on the SDK's configured gateway: the gateway URL's origin, plus\n * {@link AVATAR_WEB_API_PATH}. Null for anything that is not an `https:` URL (or `http:` on this machine, for local\n * development).\n */\nexport function avatarApiBase(gatewayUrl: string | undefined): string | null {\n if (!gatewayUrl) return null;\n let url: URL;\n try {\n url = new URL(gatewayUrl);\n } catch {\n return null;\n }\n const local =\n url.protocol === \"http:\" && LOOPBACK_HOSTS.has(url.hostname.toLowerCase());\n if (url.protocol !== \"https:\" && !local) return null;\n return `${url.origin}${AVATAR_WEB_API_PATH}`;\n}\n\n/** A real-looking Turnstile site key: `0x…`, and not of the shape of Cloudflare's test keys. */\nexport function isRealTurnstileSiteKey(key: string): boolean {\n return REAL_SITE_KEY.test(key) && !TEST_SITE_KEY.test(key);\n}\n\n/**\n * Whether a host's `avatar.live` has everything the live avatar needs, in the shapes the contract accepts. The site\n * key is optional (an empty one is none), and checked only when it is there.\n */\nexport function liveConfigComplete(live: ExplorePanelAvatarLive): boolean {\n const key: unknown = live.turnstileSiteKey;\n const allowTest: unknown = live.allowTestSiteKey;\n return (\n typeof live.load === \"function\" &&\n typeof live.site === \"string\" &&\n isAvatarSite(live.site) &&\n typeof live.manifestVersion === \"string\" &&\n isAvatarVersion(live.manifestVersion) &&\n (key === undefined ||\n key === \"\" ||\n (typeof key === \"string\" && SITE_KEY.test(key))) &&\n (allowTest === undefined || typeof allowTest === \"boolean\")\n );\n}\n\n/**\n * The site key a bot check at Start may use, or null when there is none: no key, one of no valid shape, or one of\n * Cloudflare's test keys where `allowTestSiteKey` is false.\n */\nexport function turnstileSiteKeyOf(\n live: ExplorePanelAvatarLive,\n): string | null {\n const key = live.turnstileSiteKey;\n if (typeof key !== \"string\" || !SITE_KEY.test(key)) return null;\n if (live.allowTestSiteKey === false && !isRealTurnstileSiteKey(key)) {\n return null;\n }\n return key;\n}\n\n/**\n * The locales whose live-avatar strings have been reviewed. The live avatar runs only in these; see\n * `explore-avatar-i18n.ts`. English only, until a named reviewer signs off on another.\n */\nconst REVIEWED: ReadonlySet<ExploreLocale> = new Set<ExploreLocale>([\"en\"]);\n\n/** Whether the live avatar may run in `locale`: its strings have been reviewed. */\nexport function isAvatarLiveLocaleReviewed(locale: ExploreLocale): boolean {\n return REVIEWED.has(locale);\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkO4GS3XPZ_js = require('./chunk-O4GS3XPZ.js');
4
- var chunkSK5UGG6A_js = require('./chunk-SK5UGG6A.js');
4
+ var chunkP5GMVPR6_js = require('./chunk-P5GMVPR6.js');
5
5
  var chunk3LFFY7AZ_js = require('./chunk-3LFFY7AZ.js');
6
6
  var chunkGEXC4LRP_js = require('./chunk-GEXC4LRP.js');
7
7
  var chunkR6J7IULF_js = require('./chunk-R6J7IULF.js');
@@ -1728,7 +1728,7 @@ function useExploreConversation(options = {}) {
1728
1728
  () => exploreStrings(resolveExploreLocale(locale)),
1729
1729
  [locale]
1730
1730
  );
1731
- const chat = chunkSK5UGG6A_js.useExploreChat({
1731
+ const chat = chunkP5GMVPR6_js.useExploreChat({
1732
1732
  productSlug,
1733
1733
  pageUrl: pageUrl ?? urlAtMount,
1734
1734
  onSend,
@@ -2803,7 +2803,7 @@ function AnswerFeedback({
2803
2803
  className: "boff-explore-fade mt-2 rounded-xl border border-border bg-card p-3",
2804
2804
  children: [
2805
2805
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-medium text-card-foreground", children: T.feedbackReasonTitle }),
2806
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1.5", children: chunkSK5UGG6A_js.EXPLORE_FEEDBACK_REASONS.map((code, index) => /* @__PURE__ */ jsxRuntime.jsx(
2806
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1.5", children: chunkP5GMVPR6_js.EXPLORE_FEEDBACK_REASONS.map((code, index) => /* @__PURE__ */ jsxRuntime.jsx(
2807
2807
  "button",
2808
2808
  {
2809
2809
  ref: index === 0 ? firstReasonRef : void 0,
@@ -2836,7 +2836,7 @@ function AnswerFeedback({
2836
2836
  },
2837
2837
  "aria-label": T.feedbackCommentPlaceholder,
2838
2838
  placeholder: T.feedbackCommentPlaceholder,
2839
- maxLength: chunkSK5UGG6A_js.EXPLORE_FEEDBACK_COMMENT_SOFT_MAX,
2839
+ maxLength: chunkP5GMVPR6_js.EXPLORE_FEEDBACK_COMMENT_SOFT_MAX,
2840
2840
  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"
2841
2841
  }
2842
2842
  ),
@@ -2901,7 +2901,7 @@ function EscalateForm({
2901
2901
  event.preventDefault();
2902
2902
  if (inFlightRef.current) return;
2903
2903
  const address = email.trim();
2904
- if (!chunkSK5UGG6A_js.looksLikeDeliverableEmail(address)) {
2904
+ if (!chunkP5GMVPR6_js.looksLikeDeliverableEmail(address)) {
2905
2905
  setError(T.escalateInvalidEmail);
2906
2906
  emailRef.current?.focus();
2907
2907
  return;
@@ -3016,7 +3016,7 @@ function EscalateForm({
3016
3016
  rows: 2,
3017
3017
  value: note,
3018
3018
  onChange: (event) => setNote(event.target.value),
3019
- maxLength: chunkSK5UGG6A_js.EXPLORE_ESCALATION_NOTE_SOFT_MAX,
3019
+ maxLength: chunkP5GMVPR6_js.EXPLORE_ESCALATION_NOTE_SOFT_MAX,
3020
3020
  className: "min-h-0 border-border bg-background"
3021
3021
  }
3022
3022
  )
@@ -3117,7 +3117,7 @@ function ReadAloudButton({
3117
3117
  text,
3118
3118
  lang
3119
3119
  }) {
3120
- const speech = chunkSK5UGG6A_js.useSpeechOutput({ lang });
3120
+ const speech = chunkP5GMVPR6_js.useSpeechOutput({ lang });
3121
3121
  if (!speech.supported) return null;
3122
3122
  const label = speech.speaking ? T.stopReading : T.readAloud;
3123
3123
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -3262,7 +3262,7 @@ function AssistantBubble({
3262
3262
  const body = message.content || message.partialContent || "";
3263
3263
  const failed = message.status === "FAILED";
3264
3264
  const completed = message.status === "COMPLETED";
3265
- const visible = chunkSK5UGG6A_js.useProgressiveReveal(body, !streaming);
3265
+ const visible = chunkP5GMVPR6_js.useProgressiveReveal(body, !streaming);
3266
3266
  const provenance = react.useMemo(
3267
3267
  () => summariseReferences(message.references, imageOrigins, productNames),
3268
3268
  [message.references, imageOrigins, productNames]
@@ -4099,7 +4099,7 @@ function ExploreView({
4099
4099
  const stopDictation = react.useCallback(() => {
4100
4100
  speechStopRef.current();
4101
4101
  }, []);
4102
- const speech = chunkSK5UGG6A_js.useSpeechInput({
4102
+ const speech = chunkP5GMVPR6_js.useSpeechInput({
4103
4103
  onFinalTranscript: (text) => {
4104
4104
  setDraft((current) => {
4105
4105
  const joined = current.trim() === "" ? text.trimStart() : `${current.trimEnd()} ${text.trim()}`;
@@ -4112,7 +4112,7 @@ function ExploreView({
4112
4112
  react.useEffect(() => {
4113
4113
  if (active) return;
4114
4114
  stopDictation();
4115
- chunkSK5UGG6A_js.stopSpeaking();
4115
+ chunkP5GMVPR6_js.stopSpeaking();
4116
4116
  }, [active, stopDictation]);
4117
4117
  const [disclaimerOpen, setDisclaimerOpen] = react.useState(false);
4118
4118
  const [attachmentNotice, setAttachmentNotice] = react.useState(null);
@@ -4505,7 +4505,7 @@ function ExploreView({
4505
4505
  const text = draft.trim();
4506
4506
  if (!text || overLimit || busy || !canSend) return;
4507
4507
  stopDictation();
4508
- chunkSK5UGG6A_js.stopSpeaking();
4508
+ chunkP5GMVPR6_js.stopSpeaking();
4509
4509
  setDraft("");
4510
4510
  stickToBottomRef.current = true;
4511
4511
  pinFocus();
@@ -4527,7 +4527,7 @@ function ExploreView({
4527
4527
  const sendPrompt = react.useCallback(
4528
4528
  (prompt) => {
4529
4529
  if (!canSend || busy) return;
4530
- chunkSK5UGG6A_js.stopSpeaking();
4530
+ chunkP5GMVPR6_js.stopSpeaking();
4531
4531
  setDraft("");
4532
4532
  stickToBottomRef.current = true;
4533
4533
  pinFocus();
@@ -4553,7 +4553,7 @@ function ExploreView({
4553
4553
  catalog.captchaRequired && catalog.recaptchaSiteKey
4554
4554
  );
4555
4555
  const bakedCatalogJson = react.useMemo(
4556
- () => serverCatalogRaw && serverCatalogRaw.enabled !== false ? chunkSK5UGG6A_js.serializeBakedCatalog(serverCatalogRaw) : null,
4556
+ () => serverCatalogRaw && serverCatalogRaw.enabled !== false ? chunkP5GMVPR6_js.serializeBakedCatalog(serverCatalogRaw) : null,
4557
4557
  [serverCatalogRaw]
4558
4558
  );
4559
4559
  const rootStyle = {};
@@ -4608,10 +4608,10 @@ function ExploreView({
4608
4608
  !panel && bakedCatalogJson ? /* @__PURE__ */ jsxRuntime.jsx(
4609
4609
  "script",
4610
4610
  {
4611
- id: chunkSK5UGG6A_js.BAKED_CATALOG_ELEMENT_ID,
4611
+ id: chunkP5GMVPR6_js.BAKED_CATALOG_ELEMENT_ID,
4612
4612
  type: "application/json",
4613
4613
  "data-product": productSlug ?? "",
4614
- "data-locale": chunkSK5UGG6A_js.bakedCatalogLocale(),
4614
+ "data-locale": chunkP5GMVPR6_js.bakedCatalogLocale(),
4615
4615
  dangerouslySetInnerHTML: { __html: bakedCatalogJson }
4616
4616
  }
4617
4617
  ) : null,
@@ -5135,6 +5135,7 @@ exports.ExploreChatProvider = ExploreChatProvider;
5135
5135
  exports.ExploreConversationContext = ExploreConversationContext;
5136
5136
  exports.ExploreConversationStartContext = ExploreConversationStartContext;
5137
5137
  exports.ExplorePage = ExplorePage;
5138
+ exports.anotherProductMatcher = anotherProductMatcher;
5138
5139
  exports.answerPlainText = answerPlainText;
5139
5140
  exports.answerSpeechText = answerSpeechText;
5140
5141
  exports.exploreQuestionHref = exploreQuestionHref;
@@ -5148,11 +5149,12 @@ exports.logoUrlOf = logoUrlOf;
5148
5149
  exports.pinnedProductSlug = pinnedProductSlug;
5149
5150
  exports.productNameFor = productNameFor;
5150
5151
  exports.productNamesByOrigin = productNamesByOrigin;
5152
+ exports.productScopedPrompts = productScopedPrompts;
5151
5153
  exports.productSlugsByOrigin = productSlugsByOrigin;
5152
5154
  exports.referenceKindOf = referenceKindOf;
5153
5155
  exports.resolveExploreLocale = resolveExploreLocale;
5154
5156
  exports.speechLocaleOf = speechLocaleOf;
5155
5157
  exports.summariseReferences = summariseReferences;
5156
5158
  exports.useExploreConversation = useExploreConversation;
5157
- //# sourceMappingURL=chunk-R742FS5E.js.map
5158
- //# sourceMappingURL=chunk-R742FS5E.js.map
5159
+ //# sourceMappingURL=chunk-DZLUZKOX.js.map
5160
+ //# sourceMappingURL=chunk-DZLUZKOX.js.map