@gengage/assistant-fe 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/LICENSE +2 -2
  2. package/README.md +2 -2
  3. package/dist/assistant-fe.css +1 -1
  4. package/dist/chat/api.d.ts +12 -2
  5. package/dist/chat/api.d.ts.map +1 -1
  6. package/dist/chat/catalog.d.ts +246 -896
  7. package/dist/chat/catalog.d.ts.map +1 -1
  8. package/dist/chat/components/AIGroupingCards.d.ts.map +1 -1
  9. package/dist/chat/components/AISuggestedSearchCards.d.ts.map +1 -1
  10. package/dist/chat/components/AITopPicks.d.ts.map +1 -1
  11. package/dist/chat/components/CategoriesContainer.d.ts.map +1 -1
  12. package/dist/chat/components/ChatDrawer.d.ts +11 -2
  13. package/dist/chat/components/ChatDrawer.d.ts.map +1 -1
  14. package/dist/chat/components/ComparisonTable.d.ts +9 -0
  15. package/dist/chat/components/ComparisonTable.d.ts.map +1 -1
  16. package/dist/chat/components/GroundingReviewCard.d.ts.map +1 -1
  17. package/dist/chat/components/HandoffNotice.d.ts +5 -0
  18. package/dist/chat/components/HandoffNotice.d.ts.map +1 -0
  19. package/dist/chat/components/KvkkBanner.d.ts +1 -0
  20. package/dist/chat/components/KvkkBanner.d.ts.map +1 -1
  21. package/dist/chat/components/ProactivePopup.d.ts +2 -0
  22. package/dist/chat/components/ProactivePopup.d.ts.map +1 -1
  23. package/dist/chat/components/ProductSummaryCard.d.ts +4 -0
  24. package/dist/chat/components/ProductSummaryCard.d.ts.map +1 -0
  25. package/dist/chat/components/ReviewHighlights.d.ts +3 -1
  26. package/dist/chat/components/ReviewHighlights.d.ts.map +1 -1
  27. package/dist/chat/components/ThumbnailsColumn.d.ts.map +1 -1
  28. package/dist/chat/components/renderUISpec.d.ts +4 -3
  29. package/dist/chat/components/renderUISpec.d.ts.map +1 -1
  30. package/dist/chat/heartbeat.d.ts +71 -0
  31. package/dist/chat/heartbeat.d.ts.map +1 -0
  32. package/dist/chat/index.d.ts +33 -78
  33. package/dist/chat/index.d.ts.map +1 -1
  34. package/dist/chat/kvkk.d.ts +21 -0
  35. package/dist/chat/kvkk.d.ts.map +1 -0
  36. package/dist/chat/locales/en.d.ts.map +1 -1
  37. package/dist/chat/locales/tr.d.ts.map +1 -1
  38. package/dist/chat/panel-manager.d.ts +81 -0
  39. package/dist/chat/panel-manager.d.ts.map +1 -0
  40. package/dist/chat/session-persistence.d.ts +52 -0
  41. package/dist/chat/session-persistence.d.ts.map +1 -0
  42. package/dist/chat/types.d.ts +33 -1
  43. package/dist/chat/types.d.ts.map +1 -1
  44. package/dist/chat.cjs +1 -1
  45. package/dist/chat.iife.js +48 -10
  46. package/dist/chat.iife.js.map +1 -1
  47. package/dist/chat.js +9 -8
  48. package/dist/chat.js.map +1 -1
  49. package/dist/common/analytics-events.d.ts +2 -0
  50. package/dist/common/analytics-events.d.ts.map +1 -1
  51. package/dist/common/analytics.d.ts.map +1 -1
  52. package/dist/common/api-paths.d.ts +5 -0
  53. package/dist/common/api-paths.d.ts.map +1 -1
  54. package/dist/common/client.d.ts +4 -1
  55. package/dist/common/client.d.ts.map +1 -1
  56. package/dist/common/communication-bridge.d.ts.map +1 -1
  57. package/dist/common/config-schema.d.ts +33 -195
  58. package/dist/common/config-schema.d.ts.map +1 -1
  59. package/dist/common/ga-datalayer.d.ts +62 -0
  60. package/dist/common/ga-datalayer.d.ts.map +1 -0
  61. package/dist/common/index.d.ts +7 -0
  62. package/dist/common/index.d.ts.map +1 -1
  63. package/dist/common/indexed-db.d.ts +1 -1
  64. package/dist/common/indexed-db.d.ts.map +1 -1
  65. package/dist/common/merchant-configs.d.ts +22 -0
  66. package/dist/common/merchant-configs.d.ts.map +1 -0
  67. package/dist/common/overlay.d.ts +5 -0
  68. package/dist/common/overlay.d.ts.map +1 -1
  69. package/dist/common/page-detect.d.ts +31 -0
  70. package/dist/common/page-detect.d.ts.map +1 -0
  71. package/dist/common/preflight.d.ts +3 -1
  72. package/dist/common/preflight.d.ts.map +1 -1
  73. package/dist/common/price-formatter.d.ts +33 -0
  74. package/dist/common/price-formatter.d.ts.map +1 -0
  75. package/dist/common/product-utils.d.ts +26 -0
  76. package/dist/common/product-utils.d.ts.map +1 -0
  77. package/dist/common/quantity-stepper.d.ts +22 -0
  78. package/dist/common/quantity-stepper.d.ts.map +1 -0
  79. package/dist/common/safe-html.d.ts +10 -6
  80. package/dist/common/safe-html.d.ts.map +1 -1
  81. package/dist/common/streaming.d.ts.map +1 -1
  82. package/dist/common/tts-player.d.ts +12 -0
  83. package/dist/common/tts-player.d.ts.map +1 -0
  84. package/dist/common/types.d.ts +51 -0
  85. package/dist/common/types.d.ts.map +1 -1
  86. package/dist/common/v1-protocol-adapter.d.ts +9 -0
  87. package/dist/common/v1-protocol-adapter.d.ts.map +1 -1
  88. package/dist/common/voice-input.d.ts +74 -0
  89. package/dist/common/voice-input.d.ts.map +1 -0
  90. package/dist/common/widget-base.d.ts +17 -1
  91. package/dist/common/widget-base.d.ts.map +1 -1
  92. package/dist/common.cjs +1 -1
  93. package/dist/common.cjs.map +1 -1
  94. package/dist/common.js +564 -244
  95. package/dist/common.js.map +1 -1
  96. package/dist/index-CmlYMq-h.js +4218 -0
  97. package/dist/index-CmlYMq-h.js.map +1 -0
  98. package/dist/index-DK4lqi85.cjs +13 -0
  99. package/dist/index-DK4lqi85.cjs.map +1 -0
  100. package/dist/index.cjs +1 -1
  101. package/dist/index.d.ts +2 -2
  102. package/dist/index.d.ts.map +1 -1
  103. package/dist/index.js +61 -53
  104. package/dist/qna/catalog.d.ts +30 -96
  105. package/dist/qna/catalog.d.ts.map +1 -1
  106. package/dist/qna/components/TextInput.d.ts.map +1 -1
  107. package/dist/qna/index.d.ts +2 -0
  108. package/dist/qna/index.d.ts.map +1 -1
  109. package/dist/qna.cjs +1 -1
  110. package/dist/qna.cjs.map +1 -1
  111. package/dist/qna.iife.js +46 -8
  112. package/dist/qna.iife.js.map +1 -1
  113. package/dist/qna.js +90 -83
  114. package/dist/qna.js.map +1 -1
  115. package/dist/quantity-stepper-B8kX8GbN.js +209 -0
  116. package/dist/quantity-stepper-B8kX8GbN.js.map +1 -0
  117. package/dist/quantity-stepper-UbAp53Ow.cjs +2 -0
  118. package/dist/quantity-stepper-UbAp53Ow.cjs.map +1 -0
  119. package/dist/schemas-DbbfBnZe.cjs +86 -0
  120. package/dist/schemas-DbbfBnZe.cjs.map +1 -0
  121. package/dist/schemas-SGuXpngy.js +4558 -0
  122. package/dist/schemas-SGuXpngy.js.map +1 -0
  123. package/dist/simrel/api.d.ts.map +1 -1
  124. package/dist/simrel/catalog.d.ts +32 -240
  125. package/dist/simrel/catalog.d.ts.map +1 -1
  126. package/dist/simrel/components/GroupTabs.d.ts.map +1 -1
  127. package/dist/simrel/components/ProductCard.d.ts +2 -0
  128. package/dist/simrel/components/ProductCard.d.ts.map +1 -1
  129. package/dist/simrel/components/renderUISpec.d.ts.map +1 -1
  130. package/dist/simrel/index.d.ts.map +1 -1
  131. package/dist/simrel/types.d.ts +5 -0
  132. package/dist/simrel/types.d.ts.map +1 -1
  133. package/dist/simrel.cjs +1 -1
  134. package/dist/simrel.cjs.map +1 -1
  135. package/dist/simrel.css +1 -1
  136. package/dist/simrel.iife.js +46 -8
  137. package/dist/simrel.iife.js.map +1 -1
  138. package/dist/simrel.js +319 -279
  139. package/dist/simrel.js.map +1 -1
  140. package/package.json +26 -7
  141. package/dist/index-CFA70IGF.js +0 -3626
  142. package/dist/index-CFA70IGF.js.map +0 -1
  143. package/dist/index-Dfl89zpe.cjs +0 -13
  144. package/dist/index-Dfl89zpe.cjs.map +0 -1
  145. package/dist/types-CeON7iBO.cjs +0 -48
  146. package/dist/types-CeON7iBO.cjs.map +0 -1
  147. package/dist/types-yxW8WA7u.js +0 -4132
  148. package/dist/types-yxW8WA7u.js.map +0 -1
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Configurable price formatting.
3
+ *
4
+ * Defaults to Turkish locale (dot thousands, comma decimal, TL suffix).
5
+ * Configure via widget config `pricing` field for any locale/currency.
6
+ */
7
+ export interface PriceFormatConfig {
8
+ /** Currency symbol. Default: 'TL' */
9
+ currencySymbol?: string;
10
+ /** Where to place the symbol. Default: 'suffix' */
11
+ currencyPosition?: 'prefix' | 'suffix';
12
+ /** Separator between thousands. Default: '.' (Turkish) */
13
+ thousandsSeparator?: string;
14
+ /** Decimal point character. Default: ',' (Turkish) */
15
+ decimalSeparator?: string;
16
+ /** Whether to show decimal part for whole numbers. Default: false */
17
+ alwaysShowDecimals?: boolean;
18
+ }
19
+ /**
20
+ * Formats a raw numeric price string into the configured locale format.
21
+ *
22
+ * Examples (default Turkish):
23
+ * "17990" → "17.990 TL"
24
+ * "17990.5" → "17.990,50 TL"
25
+ *
26
+ * Examples (GBP prefix):
27
+ * "17990" with { currencySymbol: '£', currencyPosition: 'prefix', thousandsSeparator: ',', decimalSeparator: '.' }
28
+ * → "£17,990"
29
+ *
30
+ * Returns the input as-is if it's not a valid number.
31
+ */
32
+ export declare function formatPrice(raw: string, config?: PriceFormatConfig): string;
33
+ //# sourceMappingURL=price-formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"price-formatter.d.ts","sourceRoot":"","sources":["../../src/common/price-formatter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,iBAAiB;IAChC,qCAAqC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,gBAAgB,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACvC,0DAA0D;IAC1D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAUD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,MAAM,CA8B3E"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Shared product rendering utilities.
3
+ *
4
+ * Extracted from chat/renderUISpec and simrel/ProductCard to eliminate
5
+ * duplication and provide consistent behavior across all widgets.
6
+ */
7
+ /** Clamp a rating value to the 0–5 range. Returns 0 for NaN/non-finite. */
8
+ export declare function clampRating(value: number): number;
9
+ /** Clamp a discount percentage to the 0–100 range, rounded to integer. Returns 0 for NaN/non-finite. */
10
+ export declare function clampDiscount(value: number): number;
11
+ /**
12
+ * Render a star rating string with full, half, and empty stars.
13
+ *
14
+ * @param rating - A numeric rating (will be clamped to 0–5).
15
+ * @param halfStars - Whether to render half-star characters. Defaults to true.
16
+ * @returns A string like "★★★½☆" or "★★★☆☆" (without half-stars).
17
+ */
18
+ export declare function renderStarRating(rating: number, halfStars?: boolean): string;
19
+ /**
20
+ * Attach a one-time error handler that hides the image on load failure.
21
+ *
22
+ * Works with any HTMLImageElement. Hides the element by setting
23
+ * `display: none` so layout doesn't break from broken images.
24
+ */
25
+ export declare function addImageErrorHandler(img: HTMLImageElement): void;
26
+ //# sourceMappingURL=product-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-utils.d.ts","sourceRoot":"","sources":["../../src/common/product-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,wGAAwG;AACxG,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,OAAc,GAAG,MAAM,CAUlF;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAQhE"}
@@ -0,0 +1,22 @@
1
+ export interface QuantityStepperOptions {
2
+ min?: number;
3
+ max?: number;
4
+ initial?: number;
5
+ label?: string;
6
+ compact?: boolean;
7
+ decreaseLabel?: string;
8
+ increaseLabel?: string;
9
+ /** Symbol for decrease button (default: '\u2212' minus sign). */
10
+ decreaseSymbol?: string;
11
+ /** Symbol for increase button (default: '+'). */
12
+ increaseSymbol?: string;
13
+ /** Icon/text for compact mode submit button (default: shopping cart emoji). */
14
+ submitIcon?: string;
15
+ onSubmit: (quantity: number) => void;
16
+ }
17
+ /**
18
+ * Creates a quantity stepper with [−] [value] [+] and a submit button.
19
+ * Compact mode renders a cart icon button; full mode renders a labeled button.
20
+ */
21
+ export declare function createQuantityStepper(options: QuantityStepperOptions): HTMLElement;
22
+ //# sourceMappingURL=quantity-stepper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quantity-stepper.d.ts","sourceRoot":"","sources":["../../src/common/quantity-stepper.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,WAAW,CAoFlF"}
@@ -7,13 +7,17 @@
7
7
  *
8
8
  * WARNING: Any new injection point that uses innerHTML must call this function first.
9
9
  */
10
+ /** Check if a URL uses a safe protocol (http or https). */
11
+ export declare function isSafeImageUrl(url: string): boolean;
10
12
  /**
11
- * Sanitize an HTML string for safe insertion via innerHTML.
12
- *
13
- * - Allowed tags are preserved; disallowed tags are removed entirely.
14
- * - Unknown tags are unwrapped (children promoted).
15
- * - `<a>` tags are forced to `target="_blank" rel="noopener noreferrer"`.
16
- * - Only `https://` is allowed for `<img src>`.
13
+ * Check if a URL is safe for use in href/src attributes.
14
+ * Allows http:, https:, and relative paths (starting with `/`).
15
+ */
16
+ export declare function isSafeUrl(url: string): boolean;
17
+ /**
18
+ * Safely set an attribute on an element.
19
+ * For `href` and `src` attributes, validates the URL against safe protocols.
17
20
  */
21
+ export declare function safeSetAttribute(el: HTMLElement, attr: string, value: string): void;
18
22
  export declare function sanitizeHtml(raw: string): string;
19
23
  //# sourceMappingURL=safe-html.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"safe-html.d.ts","sourceRoot":"","sources":["../../src/common/safe-html.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAsJH;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAYhD"}
1
+ {"version":3,"file":"safe-html.d.ts","sourceRoot":"","sources":["../../src/common/safe-html.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA6KH,2DAA2D;AAC3D,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAMnD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAS9C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAKnF;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAYhD"}
@@ -1 +1 @@
1
- {"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../src/common/streaming.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AA0C9D,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,OAAO,EAAE,kBAAkB,CAAC;IAC5B,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAC/B,mDAAmD;IACnD,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAmDD;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA4C7F;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,aAAa,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC5D,eAAe,CAoBjB"}
1
+ {"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../src/common/streaming.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AA+C9D,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,OAAO,EAAE,kBAAkB,CAAC;IAC5B,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAC/B,mDAAmD;IACnD,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AA0DD;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA8C7F;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,aAAa,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC5D,eAAe,CAoBjB"}
@@ -0,0 +1,12 @@
1
+ /** Returned by `playTtsAudio` on successful playback initiation. */
2
+ export interface AudioHandle {
3
+ /** Stop playback immediately. Safe to call multiple times. */
4
+ stop: () => void;
5
+ }
6
+ /**
7
+ * Plays a base64-encoded audio clip.
8
+ * Returns an `AudioHandle` that can stop playback, or `null` if playback
9
+ * could not be initiated (blocked by browser, unsupported environment, etc.).
10
+ */
11
+ export declare function playTtsAudio(base64: string, contentType?: string): AudioHandle | null;
12
+ //# sourceMappingURL=tts-player.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tts-player.d.ts","sourceRoot":"","sources":["../../src/common/tts-player.ts"],"names":[],"mappings":"AAUA,oEAAoE;AACpE,MAAM,WAAW,WAAW;IAC1B,8DAA8D;IAC9D,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,SAAc,GAAG,WAAW,GAAG,IAAI,CAmB1F"}
@@ -47,6 +47,10 @@ export interface SessionContext {
47
47
  userId?: string;
48
48
  /** View/visit identifier (e.g. from analytics platform). */
49
49
  viewId?: string;
50
+ /** AB test variant assignment (e.g. 'control', 'treatment'). */
51
+ abTestVariant?: string;
52
+ /** AB test experiment identifier (e.g. 'exp_chat_v2'). */
53
+ abTestExperimentId?: string;
50
54
  }
51
55
  export interface BaseWidgetConfig {
52
56
  /** Your Gengage account identifier. */
@@ -69,6 +73,8 @@ export interface BaseWidgetConfig {
69
73
  * metering, and commerce attribution events automatically.
70
74
  */
71
75
  analyticsClient?: import('./analytics.js').AnalyticsClient;
76
+ /** Price formatting options. Defaults to Turkish locale (TL, dot thousands, comma decimal). */
77
+ pricing?: import('./price-formatter.js').PriceFormatConfig;
72
78
  }
73
79
  export interface WidgetTheme {
74
80
  primaryColor?: string;
@@ -201,6 +207,51 @@ export interface UIElement {
201
207
  props?: Record<string, unknown>;
202
208
  children?: string[];
203
209
  }
210
+ /**
211
+ * Shape of `context.panel` as returned by the backend's `context` event
212
+ * and sent back with each request. Field names match the V2 `SessionContext`.
213
+ *
214
+ * This is intentionally extensible (index signature) because the backend
215
+ * may add fields without a frontend release.
216
+ */
217
+ export interface BackendPanelContext {
218
+ screen_type?: 'product_list' | 'product_details' | 'comparison_table';
219
+ screen_summary?: string;
220
+ screen_sku_list?: string[];
221
+ chat_mentioned_skus?: string[];
222
+ conversation_stage?: 'exploring' | 'evaluating' | 'deciding' | 'refining';
223
+ last_search_query?: string;
224
+ last_search_offset?: number;
225
+ last_search_page_size?: number;
226
+ last_search_end_of_list?: boolean;
227
+ last_search_category_id?: string;
228
+ last_search_title?: string;
229
+ last_search_max_budget?: number;
230
+ product_refs?: Array<{
231
+ ref: string;
232
+ sku: string;
233
+ name: string;
234
+ brand?: string;
235
+ price?: number;
236
+ }>;
237
+ session_memory?: Record<string, unknown>;
238
+ suggested_action_titles?: string[];
239
+ [key: string]: unknown;
240
+ }
241
+ /**
242
+ * The full backend context object stored between turns.
243
+ * Contains `panel` (session state), `messages` (conversation history),
244
+ * and `message_id` (last message identifier).
245
+ */
246
+ export interface BackendContext {
247
+ panel?: BackendPanelContext;
248
+ messages?: Array<{
249
+ role?: string;
250
+ content?: string;
251
+ }>;
252
+ message_id?: string;
253
+ [key: string]: unknown;
254
+ }
204
255
  export interface ActionPayload {
205
256
  /** Display label shown to the user. */
206
257
  title: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/common/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/common/types.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,15 @@ export interface V1Product {
19
19
  facet_hits?: Record<string, unknown> | null;
20
20
  promotions?: string[];
21
21
  }
22
+ export interface V1ProsAndCons {
23
+ type: 'prosAndCons';
24
+ payload: {
25
+ pros?: string[];
26
+ cons?: string[];
27
+ product_name?: string;
28
+ [key: string]: unknown;
29
+ };
30
+ }
22
31
  export declare function adaptV1Event(raw: Record<string, unknown>): StreamEvent | null;
23
32
  export interface NormalizedProduct {
24
33
  sku: string;
@@ -1 +1 @@
1
- {"version":3,"file":"v1-protocol-adapter.d.ts","sourceRoot":"","sources":["../../src/common/v1-protocol-adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"v1-protocol-adapter.d.ts","sourceRoot":"","sources":["../../src/common/v1-protocol-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Browser-native Web Speech API voice input.
3
+ *
4
+ * Uses the SpeechRecognition API for real-time speech-to-text.
5
+ * The frontend sends transcribed text directly — no audio blobs
6
+ * are sent to the backend. This replaces server-side Groq Whisper.
7
+ *
8
+ * Supports:
9
+ * - Real-time transcription with interim results
10
+ * - Turkish (`tr-TR`) and English (`en-US`) language support
11
+ * - Auto-submit on silence (configurable timeout)
12
+ * - Microphone permission handling with descriptive errors
13
+ *
14
+ * Browser support:
15
+ * - Chrome 33+, Edge 79+, Safari 14.1+ (via webkitSpeechRecognition)
16
+ * - Firefox: NOT SUPPORTED (no SpeechRecognition API)
17
+ */
18
+ export type VoiceInputState = 'idle' | 'listening' | 'error';
19
+ export type VoiceInputErrorCode = 'not-supported' | 'not-allowed' | 'no-microphone' | 'no-speech' | 'network' | 'aborted' | 'unknown';
20
+ export interface VoiceInputCallbacks {
21
+ /** Called with interim transcript while the user speaks. */
22
+ onInterim?: (text: string) => void;
23
+ /** Called with final transcript when a phrase is recognized. */
24
+ onFinal?: (text: string) => void;
25
+ /** Called when auto-submit fires (silence timeout reached with final text). */
26
+ onAutoSubmit?: (text: string) => void;
27
+ /** Called when voice input state changes. */
28
+ onStateChange?: (state: VoiceInputState) => void;
29
+ /** Called on recognition error. */
30
+ onError?: (code: VoiceInputErrorCode, message: string) => void;
31
+ }
32
+ export interface VoiceInputOptions {
33
+ /** BCP 47 language tag. Default: 'tr-TR'. */
34
+ lang?: string;
35
+ /** Silence duration in ms before auto-submit. Default: 1500. */
36
+ silenceTimeoutMs?: number;
37
+ /** Whether to auto-submit on silence. Default: true. */
38
+ autoSubmit?: boolean;
39
+ }
40
+ /**
41
+ * Check whether the browser supports the Web Speech API.
42
+ */
43
+ export declare function isVoiceInputSupported(): boolean;
44
+ export declare class VoiceInput {
45
+ private recognition;
46
+ private _state;
47
+ private silenceTimer;
48
+ private accumulatedTranscript;
49
+ private readonly callbacks;
50
+ private readonly lang;
51
+ private readonly silenceTimeoutMs;
52
+ private readonly autoSubmit;
53
+ private intentionalStop;
54
+ constructor(callbacks: VoiceInputCallbacks, options?: VoiceInputOptions);
55
+ get state(): VoiceInputState;
56
+ /**
57
+ * Start listening. Requests microphone permission on first call.
58
+ */
59
+ start(): void;
60
+ /**
61
+ * Stop listening. Returns the accumulated transcript.
62
+ */
63
+ stop(): string;
64
+ /**
65
+ * Abort listening. Discards any accumulated transcript.
66
+ */
67
+ abort(): void;
68
+ /** Destroy the instance and release resources. */
69
+ destroy(): void;
70
+ private setState;
71
+ private startSilenceTimer;
72
+ private clearSilenceTimer;
73
+ }
74
+ //# sourceMappingURL=voice-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-input.d.ts","sourceRoot":"","sources":["../../src/common/voice-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA0DH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC;AAE7D,MAAM,MAAM,mBAAmB,GAC3B,eAAe,GACf,aAAa,GACb,eAAe,GACf,WAAW,GACX,SAAS,GACT,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,WAAW,mBAAmB;IAClC,4DAA4D;IAC5D,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,gEAAgE;IAChE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,+EAA+E;IAC/E,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,6CAA6C;IAC7C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IACjD,mCAAmC;IACnC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAChE;AAED,MAAM,WAAW,iBAAiB;IAChC,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wDAAwD;IACxD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAOD,qBAAa,UAAU;IACrB,OAAO,CAAC,WAAW,CAA0C;IAC7D,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,qBAAqB,CAAM;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAChD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,eAAe,CAAS;gBAEpB,SAAS,EAAE,mBAAmB,EAAE,OAAO,CAAC,EAAE,iBAAiB;IAOvE,IAAI,KAAK,IAAI,eAAe,CAE3B;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAiGb;;OAEG;IACH,IAAI,IAAI,MAAM;IAed;;OAEG;IACH,KAAK,IAAI,IAAI;IAeb,kDAAkD;IAClD,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,iBAAiB;CAM1B"}
@@ -10,6 +10,7 @@ export declare abstract class BaseWidget<TConfig extends BaseWidgetConfig = Base
10
10
  private readonly _handlers;
11
11
  private readonly _cleanups;
12
12
  private _ownsRoot;
13
+ private _destroying;
13
14
  init(config: TConfig): Promise<void>;
14
15
  update(context: Partial<PageContext>): void;
15
16
  show(): void;
@@ -54,10 +55,16 @@ export interface ChatPublicAPI {
54
55
  openWithAction(action: import('./types.js').ActionPayload, options?: {
55
56
  sku?: string;
56
57
  }): void;
58
+ /** Send a user message programmatically (same as typing + submit). */
59
+ sendMessage(text: string): void;
60
+ /** Send a backend action programmatically. */
61
+ sendAction(action: import('./types.js').ActionPayload, options?: {
62
+ silent?: boolean;
63
+ }): void;
57
64
  close(): void;
58
65
  saveSession(sessionId: string, sku: string): void;
59
66
  readonly isOpen: boolean;
60
- on(event: 'open' | 'close' | 'ready', handler: () => void): () => void;
67
+ on(event: 'open' | 'close' | 'ready' | 'message' | 'error' | 'context-update' | 'destroy', handler: (...args: unknown[]) => void): () => void;
61
68
  trackCheckout(type: 'start' | 'complete', data: {
62
69
  attribution_source: 'chat' | 'qna' | 'simrel';
63
70
  attribution_action_id: string;
@@ -70,6 +77,15 @@ export interface ChatPublicAPI {
70
77
  quantity: number;
71
78
  unit: string;
72
79
  }): void;
80
+ /**
81
+ * Register a callback for a GA4 event name.
82
+ * When the widget fires that event, the callback is invoked with the event detail.
83
+ * Callbacks that return `false` or throw signal failure — the widget reacts accordingly
84
+ * (e.g. showing an error message for add-to-cart failures).
85
+ *
86
+ * @returns unsubscribe function
87
+ */
88
+ addCallback(eventName: string, callback: (detail: Record<string, unknown>) => boolean | Promise<boolean>): () => void;
73
89
  }
74
90
  export {};
75
91
  //# sourceMappingURL=widget-base.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"widget-base.d.ts","sourceRoot":"","sources":["../../src/common/widget-base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,WAAW,EAAe,MAAM,YAAY,CAAC;AAC5F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAO9D,KAAK,UAAU,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAE/C,8BAAsB,UAAU,CAC9B,OAAO,SAAS,gBAAgB,GAAG,gBAAgB,CACnD,YAAW,aAAa,CAAC,OAAO,CAAC;IACjC,SAAS,CAAC,MAAM,EAAG,OAAO,CAAC;IAC3B,SAAS,CAAC,IAAI,EAAG,WAAW,CAAC;IAC7B,SAAS,CAAC,SAAS,UAAS;IAC5B,SAAS,CAAC,aAAa,UAAS;IAEhC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsC;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IACnD,OAAO,CAAC,SAAS,CAAS;IAMpB,IAAI,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B1C,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAa3C,IAAI,IAAI,IAAI;IAQZ,IAAI,IAAI,IAAI;IAQZ,OAAO,IAAI,IAAI;IAaf,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,IAAI;IAMlD,qGAAqG;IACrG,aAAa,CACX,IAAI,EAAE,OAAO,GAAG,UAAU,EAC1B,IAAI,EAAE;QACJ,kBAAkB,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;QAC9C,qBAAqB,EAAE,MAAM,CAAC;QAC9B,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;KACpB,GACA,IAAI;IAKP,yFAAyF;IACzF,oBAAoB,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAQvF,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IACzD,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAChE,SAAS,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI;IACjC,SAAS,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI;IACjC,SAAS,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI;IAMpC,sDAAsD;IACtD,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAIvD,uDAAuD;IACvD,SAAS,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAI1C,6EAA6E;IAC7E,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAI5C,6DAA6D;IAC7D,SAAS,CAAC,gBAAgB,IAAI,gBAAgB;IAiB9C,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,WAAW;CASpB;AAUD,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC3E,cAAc,CAAC,MAAM,EAAE,OAAO,YAAY,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7F,KAAK,IAAI,IAAI,CAAC;IACd,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAClD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IACvE,aAAa,CACX,IAAI,EAAE,OAAO,GAAG,UAAU,EAC1B,IAAI,EAAE;QACJ,kBAAkB,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;QAC9C,qBAAqB,EAAE,MAAM,CAAC;QAC9B,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;KACpB,GACA,IAAI,CAAC;IACR,oBAAoB,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACzF"}
1
+ {"version":3,"file":"widget-base.d.ts","sourceRoot":"","sources":["../../src/common/widget-base.ts"],"names":[],"mappings":"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"}
package/dist/common.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("./types-CeON7iBO.cjs"),g=require("./index-Dfl89zpe.cjs"),q=require("./qna.cjs"),U=require("./simrel.cjs"),u=n.objectType({enabled:n.booleanType().default(!0)}),R=n.objectType({chat:n.stringType().optional(),qna:n.stringType().optional(),simrel:n.stringType().optional()}),M=n.objectType({}),v=n.enumType(["none","x-api-key-header","bearer-header","body-api-key"]),P=n.objectType({mode:v.default("none"),key:n.stringType().optional(),headerName:n.stringType().optional(),bodyField:n.stringType().default("api_key")}),O=n.objectType({enabled:n.booleanType().default(!0),endpoint:n.stringType().default("/analytics"),auth:P.default({mode:"none",bodyField:"api_key"}),fireAndForget:n.booleanType().default(!0),useBeacon:n.booleanType().default(!0),keepaliveFetch:n.booleanType().default(!0),timeoutMs:n.numberType().int().positive().default(4e3),maxRetries:n.numberType().int().min(0).max(5).default(1)}),w="__gengageWidgetsInit",F=n.objectType({idempotencyKey:n.stringType().default(w),requireDomReady:n.booleanType().default(!0)}),T=n.enumType(["log-and-ignore","throw","delegate"]),D=n.objectType({unknownActionPolicy:T.default("log-and-ignore"),allowScriptCall:n.booleanType().default(!0)}),m=n.objectType({version:n.literalType("1"),accountId:n.stringType().min(1),middlewareUrl:n.stringType().url(),locale:n.stringType().optional(),widgets:n.objectType({chat:u.default({enabled:!0}),qna:u.default({enabled:!0}),simrel:u.default({enabled:!0})}),mounts:R.default({}),transport:M.default({}),analytics:O.default({enabled:!0,endpoint:"/analytics",auth:{mode:"none",bodyField:"api_key"},fireAndForget:!0,useBeacon:!0,keepaliveFetch:!0,timeoutMs:4e3,maxRetries:1}),gtm:F.default({idempotencyKey:"__gengageWidgetsInit",requireDomReady:!0}),actionHandling:D.default({unknownActionPolicy:"log-and-ignore",allowScriptCall:!0})});function _(e){return m.parse(e)}function b(e){return m.safeParse(e)}function N(e){return _({version:"1",accountId:e.accountId,middlewareUrl:e.middlewareUrl,locale:e.locale,widgets:{chat:{enabled:!0},qna:{enabled:!0},simrel:{enabled:!0}}})}const C=`${w}_overlay_`,L="#gengage-qna",W="#gengage-simrel";function h(){const e=window;return e.__gengageOverlayRegistry||(e.__gengageOverlayRegistry={instances:{},pending:{}}),e.__gengageOverlayRegistry}function B(e){const t={pageType:e.pageContext?.pageType??(e.sku!==void 0?"pdp":"other")},i=e.pageContext;return i?.sku!==void 0&&(t.sku=i.sku),i?.price!==void 0&&(t.price=i.price),i?.categoryTree!==void 0&&(t.categoryTree=i.categoryTree),i?.url!==void 0&&(t.url=i.url),i?.extra!==void 0&&(t.extra=i.extra),e.sku!==void 0&&(t.sku=e.sku),t}function $(e,t){const i={...e,...t,pageType:t.pageType??e.pageType};return t.sku===void 0&&e.sku!==void 0&&(i.sku=e.sku),i}function y(e){return e instanceof HTMLElement||document.querySelector(e)?e:null}function E(e){return e.idempotencyKey??`${C}${e.accountId}`}class G{constructor(t,i){this.options=t,this.onDestroy=i,this._chat=null,this._qna=null,this._simrel=null,this._destroyed=!1,this._queue=Promise.resolve(),this._warnedQnaMountMissing=!1,this._warnedSimRelMountMissing=!1,this.idempotencyKey=E(t),this.session=n.resolveSession(t.session),this._pageContext=B(t)}get chat(){return this._chat}get qna(){return this._qna}get simrel(){return this._simrel}async init(){window.gengage||(window.gengage={}),window.gengage.sessionId=this.session.sessionId,window.gengage.pageContext=this._pageContext,await this._initChat(),await this._syncPdpWidgets(),this.options.wireQnaToChat!==!1&&n.wireQNAToChat(),window.gengage.overlay=this}openChat(t){this._chat?.open(t)}closeChat(){this._chat?.close()}async updateContext(t){this._destroyed||await this._enqueue(async()=>{this._pageContext=$(this._pageContext,t),window.gengage||(window.gengage={}),window.gengage.pageContext=this._pageContext,this._chat?.update(t),this._qna?.update(t),this._simrel?.update(t),await this._syncPdpWidgets()})}async updateSku(t,i="pdp"){await this.updateContext({sku:t,pageType:i})}destroy(){this._destroyed||(this._destroyed=!0,this._chat?.destroy(),this._qna?.destroy(),this._simrel?.destroy(),this._chat=null,this._qna=null,this._simrel=null,window.gengage?.overlay===this&&delete window.gengage.overlay,this.onDestroy())}async _initChat(){if(this.options.chat?.enabled===!1)return;const t=this.options.middlewareUrl,i={accountId:this.options.accountId,middlewareUrl:t,session:this.session,pageContext:this._pageContext,variant:this.options.chat?.variant??"floating"};this.options.theme!==void 0&&(i.theme=this.options.theme),this.options.locale!==void 0&&(i.locale=this.options.locale),this.options.chat?.mountTarget!==void 0&&(i.mountTarget=this.options.chat.mountTarget),this.options.chat?.launcherSvg!==void 0&&(i.launcherSvg=this.options.chat.launcherSvg),this.options.chat?.hideMobileLauncher!==void 0&&(i.hideMobileLauncher=this.options.chat.hideMobileLauncher),this.options.chat?.mobileBreakpoint!==void 0&&(i.mobileBreakpoint=this.options.chat.mobileBreakpoint),this.options.chat?.mobileInitialState!==void 0&&(i.mobileInitialState=this.options.chat.mobileInitialState),this.options.chat?.i18n!==void 0&&(i.i18n=this.options.chat.i18n),this.options.chat?.actionHandling!==void 0&&(i.actionHandling=this.options.chat.actionHandling),this._chat=new g.GengageChat,await this._chat.init(i)}async _syncPdpWidgets(){if(this._destroyed)return;const t=this._pageContext.sku;if(!(this._pageContext.pageType==="pdp"&&t!==void 0&&t.length>0)){this._destroyPdpWidgets();return}const o=this.options.middlewareUrl;if(this.options.qna?.enabled!==!1){const r=this.options.qna?.mountTarget??L,s=y(r);if(s)if(this._warnedQnaMountMissing=!1,this._qna)this._qna.show(),this._qna.update({pageType:"pdp",sku:t});else{const l=new q.GengageQNA,a={accountId:this.options.accountId,middlewareUrl:o,session:this.session,pageContext:{pageType:"pdp",sku:t},mountTarget:s};this.options.theme!==void 0&&(a.theme=this.options.theme),this.options.qna?.ctaText!==void 0&&(a.ctaText=this.options.qna.ctaText),this.options.qna?.inputPlaceholder!==void 0&&(a.inputPlaceholder=this.options.qna.inputPlaceholder),await l.init(a),this._qna=l}else this._qna?.destroy(),this._qna=null,this._warnedQnaMountMissing||(console.warn(`[gengage] QNA mount target not found: ${r}`),this._warnedQnaMountMissing=!0)}else this._qna?.destroy(),this._qna=null;if(this.options.simrel?.enabled!==!1){const r=this.options.simrel?.mountTarget??W,s=y(r);if(s)if(this._warnedSimRelMountMissing=!1,this._simrel)this._simrel.show(),this._simrel.update({pageType:"pdp",sku:t});else{const l=new U.GengageSimRel,a={accountId:this.options.accountId,middlewareUrl:o,session:this.session,sku:t,mountTarget:s};this.options.theme!==void 0&&(a.theme=this.options.theme),this.options.simrel?.discountType!==void 0&&(a.discountType=this.options.simrel.discountType),this.options.onAddToCart!==void 0&&(a.onAddToCart=this.options.onAddToCart),this.options.onProductNavigate!==void 0?a.onProductNavigate=this.options.onProductNavigate:a.onProductNavigate=(c,d,p)=>{this._chat?.saveSession(p??this.session.sessionId,d),window.location.href=c},await l.init(a),this._simrel=l}else this._simrel?.destroy(),this._simrel=null,this._warnedSimRelMountMissing||(console.warn(`[gengage] SimRel mount target not found: ${r}`),this._warnedSimRelMountMissing=!0)}else this._simrel?.destroy(),this._simrel=null}_destroyPdpWidgets(){this._qna?.destroy(),this._simrel?.destroy(),this._qna=null,this._simrel=null}_enqueue(t){const i=this._queue.then(t);return this._queue=i.catch(()=>{}),i}}async function S(e){const t=E(e),i=h(),o=i.instances[t];if(o)return o;const r=i.pending[t];if(r)return r;const s=new G(e,()=>{const a=h();delete a.instances[t],delete a.pending[t]}),l=s.init().then(()=>(i.instances[t]=s,delete i.pending[t],s)).catch(a=>{throw delete i.pending[t],a});return i.pending[t]=l,l}function A(e){return h().instances[e]??null}function H(e){A(e)?.destroy()}function z(e){return`${C}${e}`}const K={enabled:!0,endpoint:"/analytics",fireAndForget:!0,useBeacon:!0,keepaliveFetch:!0,timeoutMs:4e3,maxRetries:1,batchSize:10,flushIntervalMs:250},j={mode:"none",key:"",headerName:"X-API-Key",bodyField:"api_key"};class I{constructor(t){this.queue=[],this.flushTimer=null,this.config={...K,...t,auth:{...j,...t.auth??{}}},this.onPageHideBound=()=>{this.queue.length!==0&&this.flushAll({preferBeacon:!0})},typeof window<"u"&&window.addEventListener("pagehide",this.onPageHideBound)}track(t){if(!this.config.enabled)return;const i=Y(t);if(this.queue.push(i),this.queue.length>=this.config.batchSize){this.scheduleImmediateFlush();return}this.scheduleFlush()}async flush(t={}){if(!this.config.enabled||this.queue.length===0)return;const i=this.queue.splice(0,this.config.batchSize),o=this.buildTransportBody(i),r=V(this.config.endpoint,this.config.middlewareUrl),s=t.preferBeacon??this.config.useBeacon;await this.sendWithRetry(r,o,s)}async flushAll(t={}){for(;this.queue.length>0;)await this.flush(t)}destroy(){this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),typeof window<"u"&&window.removeEventListener("pagehide",this.onPageHideBound)}scheduleFlush(){this.flushTimer||(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush()},this.config.flushIntervalMs))}scheduleImmediateFlush(){this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.flush()}buildTransportBody(t){const i={events:t};return this.config.auth.mode==="body-api-key"&&this.config.auth.key&&(i[this.config.auth.bodyField]=this.config.auth.key),i}async sendWithRetry(t,i,o){let r=0;for(;r<=this.config.maxRetries;){r+=1;try{if(await this.send(t,i,o))return}catch{}}}async send(t,i,o){const r=JSON.stringify(i);if(o&&this.config.useBeacon&&this.config.auth.mode!=="x-api-key-header"&&this.config.auth.mode!=="bearer-header"&&X()&&navigator.sendBeacon(t,r))return!0;if(typeof fetch>"u")return!1;const l={"Content-Type":"application/json"};this.config.auth.mode==="x-api-key-header"&&this.config.auth.key&&(l[this.config.auth.headerName]=this.config.auth.key),this.config.auth.mode==="bearer-header"&&this.config.auth.key&&(l.Authorization=`Bearer ${this.config.auth.key}`);const a=typeof AbortController<"u"?new AbortController:null,c=a?setTimeout(()=>a.abort(),this.config.timeoutMs):null;try{const d={method:"POST",headers:l,body:r,keepalive:this.config.keepaliveFetch&&this.config.fireAndForget};return a&&(d.signal=a.signal),(await fetch(t,d)).ok}finally{c&&clearTimeout(c)}}}function Q(e){return new I(e)}function Y(e){const t={event_name:e.event_name,event_version:e.event_version??"1",timestamp_ms:e.timestamp_ms??Date.now(),account_id:e.account_id,session_id:e.session_id,correlation_id:e.correlation_id,payload:e.payload};return e.view_id!==void 0&&(t.view_id=e.view_id),e.user_id!==void 0&&(t.user_id=e.user_id),e.widget!==void 0&&(t.widget=e.widget),e.page_type!==void 0&&(t.page_type=e.page_type),e.sku!==void 0&&(t.sku=e.sku),t}function V(e,t){if(/^https?:\/\//i.test(e))return e;const i=n.normalizeMiddlewareUrl(t),o=e.startsWith("/")?e:`/${e}`;return`${i}${o}`}function X(){return typeof navigator<"u"&&typeof navigator.sendBeacon=="function"}const k={primaryColor:"#000000",primaryForeground:"#ffffff",backgroundColor:"#ffffff",foregroundColor:"#222222",borderRadius:"8px",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',fontSize:"14px",zIndex:"1000","--glov-chatbot-width":"420px","--glov-left-spacing":"260px","--chatbot-padding":"16px","--root-wrapper-background-color":"#F2F2F2","--root-wrapper-border-color":"#E5E5E5","--gengage-chat-width":"400px","--gengage-chat-shell-radius":"12px","--gengage-chat-header-height":"60px","--gengage-chat-conversation-width":"396px","--gengage-chat-panel-min-width":"320px","--gengage-chat-panel-max-width":"860px","--gengage-chat-input-height":"48px","--gengage-qna-pill-radius":"999px","--gengage-qna-input-radius":"14px","--gengage-simrel-card-radius":"14px"};function Z(e){return{...k,...e}}const f="tr";function J(e){return{ACCOUNT_ID:e.accountId,MIDDLEWARE_URL:e.middlewareUrl,LOCALE:e.locale??f}}function ee(e,t={}){const i={accountId:e.accountId,middlewareUrl:e.middlewareUrl,session:{sessionId:e.sessionId},variant:"floating",locale:e.locale??f,...t};return e.theme!==void 0&&(i.theme=e.theme),i}function te(e,t={}){const i={accountId:e.accountId,middlewareUrl:e.middlewareUrl,session:{sessionId:e.sessionId},pageContext:{pageType:"pdp",sku:e.sku},mountTarget:e.mountTarget,...t};return e.theme!==void 0&&(i.theme=e.theme),i}function ie(e,t={}){const i={accountId:e.accountId,middlewareUrl:e.middlewareUrl,session:{sessionId:e.sessionId},sku:e.sku,mountTarget:e.mountTarget,...t};return e.theme!==void 0&&(i.theme=e.theme),i}function ne(e,t={}){return{enabled:!0,middlewareUrl:e,endpoint:"/analytics",fireAndForget:!0,useBeacon:!0,...t}}function oe(e){try{return document.querySelector(e),!0}catch{return!1}}function x(e){const t=[],i=e.mounts,o=[["qna",i.qna],["simrel",i.simrel],["chat",i.chat]];for(const[s,l]of o)if(l!==void 0){if(!oe(l)){t.push({code:"INVALID_SELECTOR",message:`[gengage preflight] ${s} mount selector is invalid CSS: "${l}"`,severity:"error"});continue}document.querySelector(l)||t.push({code:"MOUNT_NOT_FOUND",message:`[gengage preflight] ${s} mount target not found: "${l}" — widget will skip or wait for DOM`,severity:"warn"})}const r=e.gtm.idempotencyKey;window[r]!==void 0&&t.push({code:"DUPLICATE_IDEMPOTENCY",message:`[gengage preflight] window["${r}"] already exists — widgets may have already initialized`,severity:"warn"});for(const s of t)s.severity==="error"?console.error(s.message):console.warn(s.message);return{ok:t.every(s=>s.severity!=="error"),warnings:t}}function se(e){const t=b(e);if(!t.success){const i=t.error.issues.map(o=>`${o.path.join(".")}: ${o.message}`).join("; ");throw new Error(`[gengage] Invalid runtime config: ${i}`)}return t.data}function ae(e,t,i){const o={accountId:e.accountId,middlewareUrl:e.middlewareUrl,idempotencyKey:e.gtm.idempotencyKey};return e.locale!==void 0&&(o.locale=e.locale),i!==void 0&&(o.pageContext=i,i.sku!==void 0&&(o.sku=i.sku)),o.chat={enabled:e.widgets.chat.enabled},e.mounts.chat!==void 0&&(o.chat.mountTarget=e.mounts.chat),o.qna={enabled:e.widgets.qna.enabled},e.mounts.qna!==void 0&&(o.qna.mountTarget=e.mounts.qna),o.simrel={enabled:e.widgets.simrel.enabled},e.mounts.simrel!==void 0&&(o.simrel.mountTarget=e.mounts.simrel),t?.onAddToCart!==void 0&&(o.onAddToCart=t.onAddToCart),t?.onProductNavigate!==void 0&&(o.onProductNavigate=t.onProductNavigate),o}async function re(e){const t=se(e.runtimeConfig);if(e.preflight!==!1){const s=x(t);if(!s.ok){const l=s.warnings.filter(a=>a.severity==="error");throw new Error(`[gengage] Preflight failed: ${l.map(a=>a.message).join("; ")}`)}}const i=e.contextResolver?.(),o=ae(t,e.hostActions,i),r=await S(o);if(e.contextResolver!==void 0){const s=e.contextResolver;window.addEventListener("gengage:context:update",()=>{const l=s();r.updateContext(l)})}return r}exports.BaseWidget=n.BaseWidget;exports.DEFAULT_WIDGET_THEME_TOKENS=n.DEFAULT_WIDGET_THEME_TOKENS;exports.adaptV1Event=n.adaptV1Event;exports.basketAddEvent=n.basketAddEvent;exports.bootstrapSession=n.bootstrapSession;exports.buildChatEndpointUrl=n.buildChatEndpointUrl;exports.chatHistorySnapshotEvent=n.chatHistorySnapshotEvent;exports.checkoutCompleteEvent=n.checkoutCompleteEvent;exports.checkoutStartEvent=n.checkoutStartEvent;exports.consumeStream=n.consumeStream;exports.defaultUnknownUISpecRenderer=n.defaultUnknownUISpecRenderer;exports.dismissGlobalErrorToast=n.dismissGlobalErrorToast;exports.dispatch=n.dispatch;exports.getGlobalErrorMessage=n.getGlobalErrorMessage;exports.getWindowPageContext=n.getWindowPageContext;exports.listen=n.listen;exports.llmUsageEvent=n.llmUsageEvent;exports.mergeUISpecRegistry=n.mergeUISpecRegistry;exports.meteringIncrementEvent=n.meteringIncrementEvent;exports.meteringSummaryEvent=n.meteringSummaryEvent;exports.normalizeMiddlewareUrl=n.normalizeMiddlewareUrl;exports.normalizeProductGroupingsResponse=n.normalizeProductGroupingsResponse;exports.normalizeSimilarProductsResponse=n.normalizeSimilarProductsResponse;exports.productToNormalized=n.productToNormalized;exports.registerGlobalErrorToastListener=n.registerGlobalErrorToastListener;exports.renderUISpecWithRegistry=n.renderUISpecWithRegistry;exports.resolveSession=n.resolveSession;exports.showGlobalErrorToast=n.showGlobalErrorToast;exports.streamChunkEvent=n.streamChunkEvent;exports.streamDoneEvent=n.streamDoneEvent;exports.streamErrorEvent=n.streamErrorEvent;exports.streamPost=n.streamPost;exports.streamStartEvent=n.streamStartEvent;exports.streamUiSpecEvent=n.streamUiSpecEvent;exports.updatePageContext=n.updatePageContext;exports.widgetHistorySnapshotEvent=n.widgetHistorySnapshotEvent;exports.wireQNAToChat=n.wireQNAToChat;exports.wireSimilarToChat=n.wireSimilarToChat;exports.withDefaultWidgetTheme=n.withDefaultWidgetTheme;exports.routeStreamAction=g.routeStreamAction;exports.sanitizeHtml=g.sanitizeHtml;exports.AccountRuntimeConfigSchema=m;exports.AnalyticsAuthModeSchema=v;exports.AnalyticsClient=I;exports.BASE_WIDGET_THEME=k;exports.DEFAULT_CUSTOMIZATION_LOCALE=f;exports.UnknownActionPolicySchema=T;exports.buildOverlayIdempotencyKey=z;exports.createAccountIdentity=J;exports.createAnalyticsClient=Q;exports.createDefaultAccountRuntimeConfig=N;exports.createDefaultAnalyticsConfig=ne;exports.createFloatingChatConfig=ee;exports.createPdpQnaConfig=te;exports.createPdpSimRelConfig=ie;exports.destroyOverlayWidgets=H;exports.getOverlayWidgets=A;exports.initGengageClient=re;exports.initOverlayWidgets=S;exports.parseAccountRuntimeConfig=_;exports.preflightDiagnostics=x;exports.safeParseAccountRuntimeConfig=b;exports.withBaseTheme=Z;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("./schemas-DbbfBnZe.cjs"),f=require("./index-DK4lqi85.cjs"),F=require("./quantity-stepper-UbAp53Ow.cjs"),M=require("./qna.cjs"),D=require("./simrel.cjs"),g=o.object({enabled:o.boolean().default(!0)}),B=o.object({chat:o.string().optional(),qna:o.string().optional(),simrel:o.string().optional()}),L=o.object({}),v=o._enum(["none","x-api-key-header","bearer-header","body-api-key"]),O=o.object({mode:v.default("none"),key:o.string().optional(),headerName:o.string().optional(),bodyField:o.string().default("api_key")}),z=o.object({enabled:o.boolean().default(!0),endpoint:o.string().default("/analytics"),auth:O.default({mode:"none",bodyField:"api_key"}),fireAndForget:o.boolean().default(!0),useBeacon:o.boolean().default(!0),keepaliveFetch:o.boolean().default(!0),timeoutMs:o.number().int().positive().default(4e3),maxRetries:o.number().int().min(0).max(5).default(1)}),C="__gengageWidgetsInit",N=o.object({idempotencyKey:o.string().default(C),requireDomReady:o.boolean().default(!0)}),_=o._enum(["log-and-ignore","throw","delegate"]),W=o.object({unknownActionPolicy:_.default("log-and-ignore"),allowScriptCall:o.boolean().default(!1)}),p=o.object({version:o.literal("1"),accountId:o.string().min(1),middlewareUrl:o.string().url(),locale:o.string().optional(),widgets:o.object({chat:g.default({enabled:!0}),qna:g.default({enabled:!0}),simrel:g.default({enabled:!0})}),mounts:B.default({}),transport:L.default({}),analytics:z.default({enabled:!0,endpoint:"/analytics",auth:{mode:"none",bodyField:"api_key"},fireAndForget:!0,useBeacon:!0,keepaliveFetch:!0,timeoutMs:4e3,maxRetries:1}),gtm:N.default({idempotencyKey:"__gengageWidgetsInit",requireDomReady:!0}),actionHandling:W.default({unknownActionPolicy:"log-and-ignore",allowScriptCall:!1})});function b(e){return p.parse(e)}function T(e){return p.safeParse(e)}function H(e){return b({version:"1",accountId:e.accountId,middlewareUrl:e.middlewareUrl,locale:e.locale,widgets:{chat:{enabled:!0},qna:{enabled:!0},simrel:{enabled:!0}}})}const S=`${C}_overlay_`,$="#gengage-qna",G="#gengage-simrel";function m(){const e=window;return e.__gengageOverlayRegistry||(e.__gengageOverlayRegistry={instances:{},pending:{}}),e.__gengageOverlayRegistry}function K(e){const t={pageType:e.pageContext?.pageType??(e.sku!==void 0?"pdp":"other")},n=e.pageContext;return n?.sku!==void 0&&(t.sku=n.sku),n?.price!==void 0&&(t.price=n.price),n?.categoryTree!==void 0&&(t.categoryTree=n.categoryTree),n?.url!==void 0&&(t.url=n.url),n?.extra!==void 0&&(t.extra=n.extra),e.sku!==void 0&&(t.sku=e.sku),t}function j(e,t){const n={...e,...t,pageType:t.pageType??e.pageType};return t.sku===void 0&&e.sku!==void 0&&(n.sku=e.sku),n}function w(e){return e instanceof HTMLElement||document.querySelector(e)?e:null}function A(e){return e.idempotencyKey??`${S}${e.accountId}`}class Q{constructor(t,n){this.options=t,this.onDestroy=n,this._chat=null,this._qna=null,this._simrel=null,this._analyticsClient=null,this._destroyed=!1,this._queue=Promise.resolve(),this._warnedQnaMountMissing=!1,this._warnedSimRelMountMissing=!1,this.idempotencyKey=A(t),this.session=o.resolveSession(t.session),this._pageContext=K(t)}get chat(){return this._chat}get qna(){return this._qna}get simrel(){return this._simrel}get analyticsClient(){return this._analyticsClient}async init(){window.gengage||(window.gengage={}),window.gengage.sessionId=this.session.sessionId,window.gengage.pageContext=this._pageContext,await this._initChat(),await this._syncPdpWidgets(),this.options.wireQnaToChat!==!1&&o.wireQNAToChat(),window.gengage.overlay=this}openChat(t){this._chat?.open(t)}closeChat(){this._chat?.close()}async updateContext(t){this._destroyed||await this._enqueue(async()=>{this._pageContext=j(this._pageContext,t),window.gengage||(window.gengage={}),window.gengage.pageContext=this._pageContext,this._chat?.update(t),this._qna?.update(t),this._simrel?.update(t),await this._syncPdpWidgets()})}async updateSku(t,n="pdp"){await this.updateContext({sku:t,pageType:n})}destroy(){this._destroyed||(this._destroyed=!0,this._chat?.destroy(),this._qna?.destroy(),this._simrel?.destroy(),this._chat=null,this._qna=null,this._simrel=null,window.gengage?.overlay===this&&delete window.gengage.overlay,this.onDestroy())}async _initChat(){if(this.options.chat?.enabled===!1)return;const t=this.options.middlewareUrl,n={accountId:this.options.accountId,middlewareUrl:t,session:this.session,pageContext:this._pageContext,variant:this.options.chat?.variant??"floating"};this.options.theme!==void 0&&(n.theme=this.options.theme),this.options.locale!==void 0&&(n.locale=this.options.locale),this.options.pricing!==void 0&&(n.pricing=this.options.pricing),this.options.chat?.mountTarget!==void 0&&(n.mountTarget=this.options.chat.mountTarget),this.options.chat?.launcherSvg!==void 0&&(n.launcherSvg=this.options.chat.launcherSvg),this.options.chat?.hideMobileLauncher!==void 0&&(n.hideMobileLauncher=this.options.chat.hideMobileLauncher),this.options.chat?.mobileBreakpoint!==void 0&&(n.mobileBreakpoint=this.options.chat.mobileBreakpoint),this.options.chat?.mobileInitialState!==void 0&&(n.mobileInitialState=this.options.chat.mobileInitialState),this.options.chat?.i18n!==void 0&&(n.i18n=this.options.chat.i18n),this.options.chat?.actionHandling!==void 0&&(n.actionHandling=this.options.chat.actionHandling),this.options.onScriptCall!==void 0&&(n.onScriptCall=this.options.onScriptCall),this._chat=new f.GengageChat,await this._chat.init(n)}async _syncPdpWidgets(){if(this._destroyed)return;const t=this._pageContext.sku;if(!(this._pageContext.pageType==="pdp"&&t!==void 0&&t.length>0)){this._destroyPdpWidgets();return}const i=this.options.middlewareUrl;if(this.options.qna?.enabled!==!1){const a=this.options.qna?.mountTarget??$,s=w(a);if(s)if(this._warnedQnaMountMissing=!1,this._qna)this._qna.show(),this._qna.update({pageType:"pdp",sku:t});else{const l=new M.GengageQNA,r={accountId:this.options.accountId,middlewareUrl:i,session:this.session,pageContext:{pageType:"pdp",sku:t},mountTarget:s};this.options.theme!==void 0&&(r.theme=this.options.theme),this.options.qna?.ctaText!==void 0&&(r.ctaText=this.options.qna.ctaText),this.options.qna?.inputPlaceholder!==void 0&&(r.inputPlaceholder=this.options.qna.inputPlaceholder),await l.init(r),this._qna=l}else this._qna?.destroy(),this._qna=null,this._warnedQnaMountMissing||(console.warn(`[gengage] QNA mount target not found: ${a}`),this._warnedQnaMountMissing=!0)}else this._qna?.destroy(),this._qna=null;if(this.options.simrel?.enabled!==!1){const a=this.options.simrel?.mountTarget??G,s=w(a);if(s)if(this._warnedSimRelMountMissing=!1,this._simrel)this._simrel.show(),this._simrel.update({pageType:"pdp",sku:t});else{const l=new D.GengageSimRel,r={accountId:this.options.accountId,middlewareUrl:i,session:this.session,sku:t,mountTarget:s};this.options.theme!==void 0&&(r.theme=this.options.theme),this.options.pricing!==void 0&&(r.pricing=this.options.pricing),this.options.simrel?.discountType!==void 0&&(r.discountType=this.options.simrel.discountType),this.options.onAddToCart!==void 0&&(r.onAddToCart=this.options.onAddToCart),this.options.onProductNavigate!==void 0?r.onProductNavigate=this.options.onProductNavigate:r.onProductNavigate=(d,u,h)=>{this._chat?.saveSession(h??this.session.sessionId,u),window.location.href=d},await l.init(r),this._simrel=l}else this._simrel?.destroy(),this._simrel=null,this._warnedSimRelMountMissing||(console.warn(`[gengage] SimRel mount target not found: ${a}`),this._warnedSimRelMountMissing=!0)}else this._simrel?.destroy(),this._simrel=null}_destroyPdpWidgets(){this._qna?.destroy(),this._simrel?.destroy(),this._qna=null,this._simrel=null}_enqueue(t){const n=this._queue.then(t);return this._queue=n.catch(i=>{}),n}}async function I(e){const t=A(e),n=m(),i=n.instances[t];if(i)return i;const a=n.pending[t];if(a)return a;const s=new Q(e,()=>{const r=m();delete r.instances[t],delete r.pending[t]}),l=s.init().then(()=>(n.instances[t]=s,delete n.pending[t],s)).catch(r=>{throw delete n.pending[t],r});return n.pending[t]=l,l}function k(e){return m().instances[e]??null}function V(e){k(e)?.destroy()}function Y(e){return`${S}${e}`}const X={enabled:!0,endpoint:"/analytics",fireAndForget:!0,useBeacon:!0,keepaliveFetch:!0,timeoutMs:4e3,maxRetries:1,batchSize:10,flushIntervalMs:250},Z={mode:"none",key:"",headerName:"X-API-Key",bodyField:"api_key"};class E{constructor(t){this.queue=[],this.flushTimer=null,this.config={...X,...t,auth:{...Z,...t.auth??{}}},this.onPageHideBound=()=>{this.queue.length!==0&&this.flushAll({preferBeacon:!0})},typeof window<"u"&&window.addEventListener("pagehide",this.onPageHideBound)}track(t){if(!this.config.enabled)return;const n=ee(t);if(this.queue.push(n),this.queue.length>=this.config.batchSize){this.scheduleImmediateFlush();return}this.scheduleFlush()}async flush(t={}){if(!this.config.enabled||this.queue.length===0)return;const n=this.queue.splice(0,this.config.batchSize),i=this.buildTransportBody(n),a=te(this.config.endpoint,this.config.middlewareUrl),s=t.preferBeacon??this.config.useBeacon;await this.sendWithRetry(a,i,s)}async flushAll(t={}){for(;this.queue.length>0;)await this.flush(t)}destroy(){this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.queue.length>0&&this.flushAll({preferBeacon:!0}),typeof window<"u"&&window.removeEventListener("pagehide",this.onPageHideBound)}scheduleFlush(){this.flushTimer||(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush()},this.config.flushIntervalMs))}scheduleImmediateFlush(){this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.flush()}buildTransportBody(t){const n={events:t};return this.config.auth.mode==="body-api-key"&&this.config.auth.key&&(n[this.config.auth.bodyField]=this.config.auth.key),n}async sendWithRetry(t,n,i){let a=0;for(;a<=this.config.maxRetries;){a+=1;try{if(await this.send(t,n,i))return}catch{}a<=this.config.maxRetries&&await new Promise(s=>setTimeout(s,Math.min(1e3,100*Math.pow(2,a-1))))}}async send(t,n,i){const a=JSON.stringify(n);if(i&&this.config.useBeacon&&this.config.auth.mode!=="x-api-key-header"&&this.config.auth.mode!=="bearer-header"&&ne()){const u=new Blob([a],{type:"application/json"});if(navigator.sendBeacon(t,u))return!0}if(typeof fetch>"u")return!1;const l={"Content-Type":"application/json"};this.config.auth.mode==="x-api-key-header"&&this.config.auth.key&&(l[this.config.auth.headerName]=this.config.auth.key),this.config.auth.mode==="bearer-header"&&this.config.auth.key&&(l.Authorization=`Bearer ${this.config.auth.key}`);const r=typeof AbortController<"u"?new AbortController:null,d=r?setTimeout(()=>r.abort(),this.config.timeoutMs):null;try{const u={method:"POST",headers:l,body:a,keepalive:this.config.keepaliveFetch&&this.config.fireAndForget};return r&&(u.signal=r.signal),(await fetch(t,u)).ok}finally{d&&clearTimeout(d)}}}function J(e){return new E(e)}function ee(e){const t={event_name:e.event_name,event_version:e.event_version??"1",timestamp_ms:e.timestamp_ms??Date.now(),account_id:e.account_id,session_id:e.session_id,correlation_id:e.correlation_id,payload:e.payload};return e.view_id!==void 0&&(t.view_id=e.view_id),e.user_id!==void 0&&(t.user_id=e.user_id),e.widget!==void 0&&(t.widget=e.widget),e.page_type!==void 0&&(t.page_type=e.page_type),e.sku!==void 0&&(t.sku=e.sku),t}function te(e,t){if(/^https?:\/\//i.test(e))return e;const n=o.normalizeMiddlewareUrl(t),i=e.startsWith("/")?e:`/${e}`;return`${n}${i}`}function ne(){return typeof navigator<"u"&&typeof navigator.sendBeacon=="function"}const x={primaryColor:"#000000",primaryForeground:"#ffffff",backgroundColor:"#ffffff",foregroundColor:"#222222",borderRadius:"8px",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',fontSize:"14px",zIndex:"1000","--glov-chatbot-width":"420px","--glov-left-spacing":"260px","--chatbot-padding":"16px","--root-wrapper-background-color":"#F2F2F2","--root-wrapper-border-color":"#E5E5E5","--gengage-chat-width":"400px","--gengage-chat-shell-radius":"12px","--gengage-chat-header-height":"60px","--gengage-chat-conversation-width":"396px","--gengage-chat-panel-min-width":"320px","--gengage-chat-panel-max-width":"860px","--gengage-chat-input-height":"48px","--gengage-qna-pill-radius":"999px","--gengage-qna-input-radius":"14px","--gengage-simrel-card-radius":"14px"};function oe(e){return{...x,...e}}const y="tr";function ie(e){return{ACCOUNT_ID:e.accountId,MIDDLEWARE_URL:e.middlewareUrl,LOCALE:e.locale??y}}function re(e,t={}){const n={accountId:e.accountId,middlewareUrl:e.middlewareUrl,session:{sessionId:e.sessionId},variant:"floating",locale:e.locale??y,...t};return e.theme!==void 0&&(n.theme=e.theme),n}function ae(e,t={}){const n={accountId:e.accountId,middlewareUrl:e.middlewareUrl,session:{sessionId:e.sessionId},pageContext:{pageType:"pdp",sku:e.sku},mountTarget:e.mountTarget,...t};return e.theme!==void 0&&(n.theme=e.theme),n}function se(e,t={}){const n={accountId:e.accountId,middlewareUrl:e.middlewareUrl,session:{sessionId:e.sessionId},sku:e.sku,mountTarget:e.mountTarget,...t};return e.theme!==void 0&&(n.theme=e.theme),n}function le(e,t={}){return{enabled:!0,middlewareUrl:e,endpoint:"/analytics",fireAndForget:!0,useBeacon:!0,...t}}function ce(e){try{return document.querySelector(e),!0}catch{return!1}}function P(e,t){const n=[],i=e.mounts,a=[["qna",i.qna],["simrel",i.simrel],["chat",i.chat]];for(const[l,r]of a)if(r!==void 0){if(!ce(r)){n.push({code:"INVALID_SELECTOR",message:`[gengage preflight] ${l} mount selector is invalid CSS: "${r}"`,severity:"error"});continue}document.querySelector(r)||n.push({code:"MOUNT_NOT_FOUND",message:`[gengage preflight] ${l} mount target not found: "${r}" — widget will skip or wait for DOM`,severity:"warn"})}const s=e.gtm.idempotencyKey;if(window[s]!==void 0&&n.push({code:"DUPLICATE_IDEMPOTENCY",message:`[gengage preflight] window["${s}"] already exists — widgets may have already initialized`,severity:"warn"}),!t?.skipCspCheck){let l=!1;const r=d=>{d.blockedURI&&e.middlewareUrl.startsWith(d.blockedURI)&&(l=!0)};document.addEventListener("securitypolicyviolation",r);try{fetch(e.middlewareUrl,{method:"HEAD",mode:"no-cors"}).catch(()=>{})}catch{l=!0}document.removeEventListener("securitypolicyviolation",r),l&&n.push({code:"CSP_BLOCKED",message:`[gengage preflight] middleware URL may be blocked by Content-Security-Policy: "${e.middlewareUrl}". Add it to connect-src.`,severity:"warn"})}for(const l of n)l.severity==="error"?console.error(l.message):console.warn(l.message);return{ok:n.every(l=>l.severity!=="error"),warnings:n}}function de(e){const t=T(e);if(!t.success){const n=t.error.issues.map(i=>`${i.path.join(".")}: ${i.message}`).join("; ");throw new Error(`[gengage] Invalid runtime config: ${n}`)}return t.data}function ue(e,t,n){const i={accountId:e.accountId,middlewareUrl:e.middlewareUrl,idempotencyKey:e.gtm.idempotencyKey};return e.locale!==void 0&&(i.locale=e.locale),n!==void 0&&(i.pageContext=n,n.sku!==void 0&&(i.sku=n.sku)),i.chat={enabled:e.widgets.chat.enabled},e.mounts.chat!==void 0&&(i.chat.mountTarget=e.mounts.chat),i.qna={enabled:e.widgets.qna.enabled},e.mounts.qna!==void 0&&(i.qna.mountTarget=e.mounts.qna),i.simrel={enabled:e.widgets.simrel.enabled},e.mounts.simrel!==void 0&&(i.simrel.mountTarget=e.mounts.simrel),t?.onAddToCart!==void 0&&(i.onAddToCart=t.onAddToCart),t?.onProductNavigate!==void 0&&(i.onProductNavigate=t.onProductNavigate),t?.onScriptCall!==void 0&&(i.onScriptCall=t.onScriptCall),i}async function fe(e){const t=de(e.runtimeConfig);if(e.preflight!==!1){const s=P(t);if(!s.ok){const l=s.warnings.filter(r=>r.severity==="error");throw new Error(`[gengage] Preflight failed: ${l.map(r=>r.message).join("; ")}`)}}const n=e.contextResolver?.(),i=ue(t,e.hostActions,n),a=await I(i);if(e.contextResolver!==void 0){const s=e.contextResolver,l=()=>{const d=s();a.updateContext(d)};window.addEventListener("gengage:context:update",l);const r=a.destroy.bind(a);a.destroy=()=>{window.removeEventListener("gengage:context:update",l),r()}}return a}const he=[{pageType:"home",urlPatterns:["^/$","^/index\\.html?$","^/anasayfa$"]},{pageType:"search",urlPatterns:["/arama","/search","/ara\\?"],queryParam:"q"},{pageType:"cart",urlPatterns:["/sepet","/cart","/basket","/sepetim"]},{pageType:"plp",urlPatterns:["/kategori/","/category/","/c/","/koleksiyon/","/collection/"]},{pageType:"pdp",urlPatterns:["/urun/","/product/","/p/","/-p-","/-pm-"]}];function U(e,t){const n=t??(typeof window<"u"?new URL(window.location.href):null);if(!n)return"other";const i=e??he,a=n.pathname;for(const s of i)if(!(s.urlPatterns&&!s.urlPatterns.some(r=>{try{return new RegExp(r,"i").test(a)}catch{return!1}}))&&!(s.queryParam&&!n.searchParams.has(s.queryParam))&&!(s.selector&&typeof document<"u"&&!document.querySelector(s.selector)))return s.pageType;return"other"}function R(e){const t=e??(typeof window<"u"?new URL(window.location.href):null);if(!t)return;const n=t.pathname,i=n.match(/\/(?:p|urun|product)\/([^/?#]+)/i);if(i?.[1])return i[1];const a=n.match(/-p-(\d+)/i);if(a?.[1])return a[1]}function ge(e){const t=U(e),n={pageType:t};if(t==="pdp"){const i=R();i&&(n.sku=i)}return typeof window<"u"&&(n.url=window.location.href),n}const c="https://chatbe-dev.gengage.ai",q={koctascomtr:{accountId:"koctascomtr",locale:"tr",middlewareUrl:c,theme:{primaryColor:"#ec6e00",primaryForeground:"#ffffff",backgroundColor:"#ffffff",foregroundColor:"#222222",borderRadius:"8px",fontFamily:'"Source Sans Pro", "Helvetica Neue", Arial, sans-serif',fontSize:"14px"},chatI18n:{inputPlaceholder:"Ürün ara, soru sor",poweredBy:"Koçtaş AI Asistan"}},n11com:{accountId:"n11com",locale:"tr",middlewareUrl:c,theme:{primaryColor:"#ff44ef",primaryForeground:"#ffffff",backgroundColor:"#ffffff",foregroundColor:"#222222",borderRadius:"8px",fontFamily:"Arial, Helvetica, sans-serif",fontSize:"14px"},chatI18n:{inputPlaceholder:"Ne aramıştınız?",poweredBy:"n11 AI Asistan"}},hepsiburadacom:{accountId:"hepsiburadacom",locale:"tr",middlewareUrl:c,theme:{primaryColor:"#ff6000",primaryForeground:"#ffffff",backgroundColor:"#ffffff",foregroundColor:"#333333",borderRadius:"8px",fontFamily:'"Open Sans", Arial, sans-serif',fontSize:"14px"},chatI18n:{inputPlaceholder:"Ürün ara veya soru sor",poweredBy:"Hepsiburada AI Asistan"}},arcelikcomtr:{accountId:"arcelikcomtr",locale:"tr",middlewareUrl:c,theme:{primaryColor:"#e4002b",primaryForeground:"#ffffff",backgroundColor:"#ffffff",foregroundColor:"#222222",borderRadius:"8px",fontFamily:'"Arcelik Sans", "Helvetica Neue", Arial, sans-serif',fontSize:"14px"},chatI18n:{inputPlaceholder:"Size nasıl yardımcı olabilirim?",poweredBy:"Arçelik AI Asistan"}},yatasbeddingcomtr:{accountId:"yatasbeddingcomtr",locale:"tr",middlewareUrl:c,theme:{primaryColor:"#c8102e",primaryForeground:"#ffffff",backgroundColor:"#ffffff",foregroundColor:"#333333",borderRadius:"8px",fontFamily:'"Nunito Sans", Arial, sans-serif',fontSize:"14px"},chatI18n:{inputPlaceholder:"Yatak, baza veya ürün arayın",poweredBy:"Yataş AI Asistan"}},trendyolcom:{accountId:"trendyolcom",locale:"tr",middlewareUrl:c,theme:{primaryColor:"#f27a1a",primaryForeground:"#ffffff",backgroundColor:"#ffffff",foregroundColor:"#333333",borderRadius:"6px",fontFamily:'"Source Sans Pro", Arial, sans-serif',fontSize:"14px"},chatI18n:{inputPlaceholder:"Ne aramıştınız?",poweredBy:"Trendyol AI Asistan"}},boynercomtr:{accountId:"boynercomtr",locale:"tr",middlewareUrl:c,theme:{primaryColor:"#000000",primaryForeground:"#ffffff",backgroundColor:"#ffffff",foregroundColor:"#333333",borderRadius:"4px",fontFamily:'"Montserrat", Arial, sans-serif',fontSize:"14px"},chatI18n:{inputPlaceholder:"Moda, kozmetik veya ev ürünleri arayın",poweredBy:"Boyner AI Asistan"}},evideacom:{accountId:"evideacom",locale:"tr",middlewareUrl:c,theme:{primaryColor:"#e84393",primaryForeground:"#ffffff",backgroundColor:"#ffffff",foregroundColor:"#2d3436",borderRadius:"8px",fontFamily:'"Poppins", Arial, sans-serif',fontSize:"14px"},chatI18n:{inputPlaceholder:"Ev dekorasyon ürünleri arayın",poweredBy:"Evidea AI Asistan"}},aygazcomtr:{accountId:"aygazcomtr",locale:"tr",middlewareUrl:c,theme:{primaryColor:"#e30613",primaryForeground:"#ffffff",backgroundColor:"#ffffff",foregroundColor:"#333333",borderRadius:"8px",fontFamily:"Arial, Helvetica, sans-serif",fontSize:"14px"},chatI18n:{inputPlaceholder:"Aygaz ürünleri hakkında sorun",poweredBy:"Aygaz AI Asistan"}},otokoccomtr:{accountId:"otokoccomtr",locale:"tr",middlewareUrl:c,theme:{primaryColor:"#003087",primaryForeground:"#ffffff",backgroundColor:"#ffffff",foregroundColor:"#333333",borderRadius:"8px",fontFamily:'"Roboto", Arial, sans-serif',fontSize:"14px"},chatI18n:{inputPlaceholder:"Araç veya hizmet arayın",poweredBy:"Otokoç AI Asistan"}},divanpastanelericomtr:{accountId:"divanpastanelericomtr",locale:"tr",middlewareUrl:c,theme:{primaryColor:"#8b1a2d",primaryForeground:"#ffffff",backgroundColor:"#faf8f5",foregroundColor:"#3d2c2e",borderRadius:"8px",fontFamily:'"Georgia", serif',fontSize:"14px"},chatI18n:{inputPlaceholder:"Ürün veya mağaza arayın",poweredBy:"Divan AI Asistan"}},screwfixcom:{accountId:"screwfixcom",locale:"en",middlewareUrl:c,theme:{primaryColor:"#f6a623",primaryForeground:"#1a1a1a",backgroundColor:"#ffffff",foregroundColor:"#333333",borderRadius:"4px",fontFamily:'"Arial", Helvetica, sans-serif',fontSize:"14px"},pricing:{currencySymbol:"£",currencyPosition:"prefix",thousandsSeparator:",",decimalSeparator:"."},chatI18n:{inputPlaceholder:"Search products or ask a question",poweredBy:"Screwfix AI Assistant"}}};function me(e){return q[e]}function pe(){return Object.keys(q)}exports.BaseWidget=o.BaseWidget;exports.DEFAULT_WIDGET_THEME_TOKENS=o.DEFAULT_WIDGET_THEME_TOKENS;exports.adaptV1Event=o.adaptV1Event;exports.basketAddEvent=o.basketAddEvent;exports.bootstrapSession=o.bootstrapSession;exports.buildChatEndpointUrl=o.buildChatEndpointUrl;exports.chatHistorySnapshotEvent=o.chatHistorySnapshotEvent;exports.checkoutCompleteEvent=o.checkoutCompleteEvent;exports.checkoutStartEvent=o.checkoutStartEvent;exports.consumeStream=o.consumeStream;exports.defaultUnknownUISpecRenderer=o.defaultUnknownUISpecRenderer;exports.dismissGlobalErrorToast=o.dismissGlobalErrorToast;exports.dispatch=o.dispatch;exports.getGlobalErrorMessage=o.getGlobalErrorMessage;exports.getWindowPageContext=o.getWindowPageContext;exports.listen=o.listen;exports.llmUsageEvent=o.llmUsageEvent;exports.mergeUISpecRegistry=o.mergeUISpecRegistry;exports.meteringIncrementEvent=o.meteringIncrementEvent;exports.meteringSummaryEvent=o.meteringSummaryEvent;exports.normalizeMiddlewareUrl=o.normalizeMiddlewareUrl;exports.normalizeProductGroupingsResponse=o.normalizeProductGroupingsResponse;exports.normalizeSimilarProductsResponse=o.normalizeSimilarProductsResponse;exports.productToNormalized=o.productToNormalized;exports.registerGlobalErrorToastListener=o.registerGlobalErrorToastListener;exports.renderUISpecWithRegistry=o.renderUISpecWithRegistry;exports.resolveSession=o.resolveSession;exports.showGlobalErrorToast=o.showGlobalErrorToast;exports.streamChunkEvent=o.streamChunkEvent;exports.streamDoneEvent=o.streamDoneEvent;exports.streamErrorEvent=o.streamErrorEvent;exports.streamPost=o.streamPost;exports.streamStartEvent=o.streamStartEvent;exports.streamUiSpecEvent=o.streamUiSpecEvent;exports.updatePageContext=o.updatePageContext;exports.widgetHistorySnapshotEvent=o.widgetHistorySnapshotEvent;exports.wireGADataLayer=o.wireGADataLayer;exports.wireQNAToChat=o.wireQNAToChat;exports.wireSimilarToChat=o.wireSimilarToChat;exports.withDefaultWidgetTheme=o.withDefaultWidgetTheme;exports.VoiceInput=f.VoiceInput;exports.isVoiceInputSupported=f.isVoiceInputSupported;exports.routeStreamAction=f.routeStreamAction;exports.sanitizeHtml=F.sanitizeHtml;exports.AccountRuntimeConfigSchema=p;exports.AnalyticsAuthModeSchema=v;exports.AnalyticsClient=E;exports.BASE_WIDGET_THEME=x;exports.DEFAULT_CUSTOMIZATION_LOCALE=y;exports.UnknownActionPolicySchema=_;exports.autoDetectPageContext=ge;exports.buildOverlayIdempotencyKey=Y;exports.createAccountIdentity=ie;exports.createAnalyticsClient=J;exports.createDefaultAccountRuntimeConfig=H;exports.createDefaultAnalyticsConfig=le;exports.createFloatingChatConfig=re;exports.createPdpQnaConfig=ae;exports.createPdpSimRelConfig=se;exports.destroyOverlayWidgets=V;exports.detectPageType=U;exports.extractSkuFromUrl=R;exports.getMerchantConfig=me;exports.getMerchantIds=pe;exports.getOverlayWidgets=k;exports.initGengageClient=fe;exports.initOverlayWidgets=I;exports.parseAccountRuntimeConfig=b;exports.preflightDiagnostics=P;exports.safeParseAccountRuntimeConfig=T;exports.withBaseTheme=oe;
2
2
  //# sourceMappingURL=common.cjs.map