@gengage/assistant-fe 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/LICENSE +61 -0
  2. package/README.md +232 -0
  3. package/dist/assistant-fe.css +1 -0
  4. package/dist/chat/api.d.ts +87 -0
  5. package/dist/chat/api.d.ts.map +1 -0
  6. package/dist/chat/attachment-utils.d.ts +10 -0
  7. package/dist/chat/attachment-utils.d.ts.map +1 -0
  8. package/dist/chat/catalog.d.ts +1114 -0
  9. package/dist/chat/catalog.d.ts.map +1 -0
  10. package/dist/chat/components/AIGroupingCards.d.ts +4 -0
  11. package/dist/chat/components/AIGroupingCards.d.ts.map +1 -0
  12. package/dist/chat/components/AISuggestedSearchCards.d.ts +4 -0
  13. package/dist/chat/components/AISuggestedSearchCards.d.ts.map +1 -0
  14. package/dist/chat/components/AITopPicks.d.ts +4 -0
  15. package/dist/chat/components/AITopPicks.d.ts.map +1 -0
  16. package/dist/chat/components/CategoriesContainer.d.ts +4 -0
  17. package/dist/chat/components/CategoriesContainer.d.ts.map +1 -0
  18. package/dist/chat/components/ChatDrawer.d.ts +140 -0
  19. package/dist/chat/components/ChatDrawer.d.ts.map +1 -0
  20. package/dist/chat/components/ChoicePrompter.d.ts +16 -0
  21. package/dist/chat/components/ChoicePrompter.d.ts.map +1 -0
  22. package/dist/chat/components/ComparisonTable.d.ts +47 -0
  23. package/dist/chat/components/ComparisonTable.d.ts.map +1 -0
  24. package/dist/chat/components/FloatingComparisonButton.d.ts +11 -0
  25. package/dist/chat/components/FloatingComparisonButton.d.ts.map +1 -0
  26. package/dist/chat/components/GroundingReviewCard.d.ts +4 -0
  27. package/dist/chat/components/GroundingReviewCard.d.ts.map +1 -0
  28. package/dist/chat/components/KvkkBanner.d.ts +6 -0
  29. package/dist/chat/components/KvkkBanner.d.ts.map +1 -0
  30. package/dist/chat/components/Launcher.d.ts +25 -0
  31. package/dist/chat/components/Launcher.d.ts.map +1 -0
  32. package/dist/chat/components/PanelTopBar.d.ts +20 -0
  33. package/dist/chat/components/PanelTopBar.d.ts.map +1 -0
  34. package/dist/chat/components/ProactivePopup.d.ts +11 -0
  35. package/dist/chat/components/ProactivePopup.d.ts.map +1 -0
  36. package/dist/chat/components/ProsAndCons.d.ts +9 -0
  37. package/dist/chat/components/ProsAndCons.d.ts.map +1 -0
  38. package/dist/chat/components/ReviewHighlights.d.ts +3 -0
  39. package/dist/chat/components/ReviewHighlights.d.ts.map +1 -0
  40. package/dist/chat/components/ThumbnailsColumn.d.ts +23 -0
  41. package/dist/chat/components/ThumbnailsColumn.d.ts.map +1 -0
  42. package/dist/chat/components/actionClassifier.d.ts +13 -0
  43. package/dist/chat/components/actionClassifier.d.ts.map +1 -0
  44. package/dist/chat/components/productMentionLinker.d.ts +26 -0
  45. package/dist/chat/components/productMentionLinker.d.ts.map +1 -0
  46. package/dist/chat/components/renderUISpec.d.ts +15 -0
  47. package/dist/chat/components/renderUISpec.d.ts.map +1 -0
  48. package/dist/chat/components/typewriter.d.ts +25 -0
  49. package/dist/chat/components/typewriter.d.ts.map +1 -0
  50. package/dist/chat/extendedModeManager.d.ts +33 -0
  51. package/dist/chat/extendedModeManager.d.ts.map +1 -0
  52. package/dist/chat/index.d.ts +192 -0
  53. package/dist/chat/index.d.ts.map +1 -0
  54. package/dist/chat/locales/en.d.ts +3 -0
  55. package/dist/chat/locales/en.d.ts.map +1 -0
  56. package/dist/chat/locales/index.d.ts +6 -0
  57. package/dist/chat/locales/index.d.ts.map +1 -0
  58. package/dist/chat/locales/tr.d.ts +3 -0
  59. package/dist/chat/locales/tr.d.ts.map +1 -0
  60. package/dist/chat/types.d.ts +212 -0
  61. package/dist/chat/types.d.ts.map +1 -0
  62. package/dist/chat.cjs +2 -0
  63. package/dist/chat.cjs.map +1 -0
  64. package/dist/chat.iife.js +59 -0
  65. package/dist/chat.iife.js.map +1 -0
  66. package/dist/chat.js +11 -0
  67. package/dist/chat.js.map +1 -0
  68. package/dist/common/action-router.d.ts +30 -0
  69. package/dist/common/action-router.d.ts.map +1 -0
  70. package/dist/common/activity-tracker.d.ts +38 -0
  71. package/dist/common/activity-tracker.d.ts.map +1 -0
  72. package/dist/common/analytics-events.d.ts +90 -0
  73. package/dist/common/analytics-events.d.ts.map +1 -0
  74. package/dist/common/analytics.d.ts +58 -0
  75. package/dist/common/analytics.d.ts.map +1 -0
  76. package/dist/common/api-paths.d.ts +14 -0
  77. package/dist/common/api-paths.d.ts.map +1 -0
  78. package/dist/common/client.d.ts +20 -0
  79. package/dist/common/client.d.ts.map +1 -0
  80. package/dist/common/communication-bridge.d.ts +51 -0
  81. package/dist/common/communication-bridge.d.ts.map +1 -0
  82. package/dist/common/config-schema.d.ts +241 -0
  83. package/dist/common/config-schema.d.ts.map +1 -0
  84. package/dist/common/context.d.ts +28 -0
  85. package/dist/common/context.d.ts.map +1 -0
  86. package/dist/common/customization-factories.d.ts +63 -0
  87. package/dist/common/customization-factories.d.ts.map +1 -0
  88. package/dist/common/events.d.ts +47 -0
  89. package/dist/common/events.d.ts.map +1 -0
  90. package/dist/common/global-error-toast.d.ts +6 -0
  91. package/dist/common/global-error-toast.d.ts.map +1 -0
  92. package/dist/common/index.d.ts +36 -0
  93. package/dist/common/index.d.ts.map +1 -0
  94. package/dist/common/indexed-db.d.ts +74 -0
  95. package/dist/common/indexed-db.d.ts.map +1 -0
  96. package/dist/common/overlay.d.ts +64 -0
  97. package/dist/common/overlay.d.ts.map +1 -0
  98. package/dist/common/preflight.d.ts +12 -0
  99. package/dist/common/preflight.d.ts.map +1 -0
  100. package/dist/common/renderer/dom.d.ts +4 -0
  101. package/dist/common/renderer/dom.d.ts.map +1 -0
  102. package/dist/common/renderer/index.d.ts +5 -0
  103. package/dist/common/renderer/index.d.ts.map +1 -0
  104. package/dist/common/renderer/overrides.d.ts +24 -0
  105. package/dist/common/renderer/overrides.d.ts.map +1 -0
  106. package/dist/common/renderer/registry.d.ts +3 -0
  107. package/dist/common/renderer/registry.d.ts.map +1 -0
  108. package/dist/common/renderer/types.d.ts +20 -0
  109. package/dist/common/renderer/types.d.ts.map +1 -0
  110. package/dist/common/safe-html.d.ts +19 -0
  111. package/dist/common/safe-html.d.ts.map +1 -0
  112. package/dist/common/streaming.d.ts +32 -0
  113. package/dist/common/streaming.d.ts.map +1 -0
  114. package/dist/common/theme-utils.d.ts +16 -0
  115. package/dist/common/theme-utils.d.ts.map +1 -0
  116. package/dist/common/types.d.ts +298 -0
  117. package/dist/common/types.d.ts.map +1 -0
  118. package/dist/common/ui-theme.d.ts +10 -0
  119. package/dist/common/ui-theme.d.ts.map +1 -0
  120. package/dist/common/uuidv7.d.ts +8 -0
  121. package/dist/common/uuidv7.d.ts.map +1 -0
  122. package/dist/common/v1-protocol-adapter.d.ts +66 -0
  123. package/dist/common/v1-protocol-adapter.d.ts.map +1 -0
  124. package/dist/common/widget-base.d.ts +75 -0
  125. package/dist/common/widget-base.d.ts.map +1 -0
  126. package/dist/common.cjs +2 -0
  127. package/dist/common.cjs.map +1 -0
  128. package/dist/common.js +584 -0
  129. package/dist/common.js.map +1 -0
  130. package/dist/index-CFA70IGF.js +3626 -0
  131. package/dist/index-CFA70IGF.js.map +1 -0
  132. package/dist/index-Dfl89zpe.cjs +13 -0
  133. package/dist/index-Dfl89zpe.cjs.map +1 -0
  134. package/dist/index.cjs +2 -0
  135. package/dist/index.cjs.map +1 -0
  136. package/dist/index.d.ts +24 -0
  137. package/dist/index.d.ts.map +1 -0
  138. package/dist/index.js +59 -0
  139. package/dist/index.js.map +1 -0
  140. package/dist/qna/api.d.ts +22 -0
  141. package/dist/qna/api.d.ts.map +1 -0
  142. package/dist/qna/catalog.d.ts +140 -0
  143. package/dist/qna/catalog.d.ts.map +1 -0
  144. package/dist/qna/components/ButtonRow.d.ts +16 -0
  145. package/dist/qna/components/ButtonRow.d.ts.map +1 -0
  146. package/dist/qna/components/TextInput.d.ts +12 -0
  147. package/dist/qna/components/TextInput.d.ts.map +1 -0
  148. package/dist/qna/components/renderUISpec.d.ts +8 -0
  149. package/dist/qna/components/renderUISpec.d.ts.map +1 -0
  150. package/dist/qna/index.d.ts +34 -0
  151. package/dist/qna/index.d.ts.map +1 -0
  152. package/dist/qna/locales/en.d.ts +3 -0
  153. package/dist/qna/locales/en.d.ts.map +1 -0
  154. package/dist/qna/locales/index.d.ts +6 -0
  155. package/dist/qna/locales/index.d.ts.map +1 -0
  156. package/dist/qna/locales/tr.d.ts +3 -0
  157. package/dist/qna/locales/tr.d.ts.map +1 -0
  158. package/dist/qna/types.d.ts +62 -0
  159. package/dist/qna/types.d.ts.map +1 -0
  160. package/dist/qna.cjs +2 -0
  161. package/dist/qna.cjs.map +1 -0
  162. package/dist/qna.css +1 -0
  163. package/dist/qna.iife.js +48 -0
  164. package/dist/qna.iife.js.map +1 -0
  165. package/dist/qna.js +435 -0
  166. package/dist/qna.js.map +1 -0
  167. package/dist/simrel/api.d.ts +26 -0
  168. package/dist/simrel/api.d.ts.map +1 -0
  169. package/dist/simrel/catalog.d.ts +319 -0
  170. package/dist/simrel/catalog.d.ts.map +1 -0
  171. package/dist/simrel/components/GroupTabs.d.ts +17 -0
  172. package/dist/simrel/components/GroupTabs.d.ts.map +1 -0
  173. package/dist/simrel/components/ProductCard.d.ts +17 -0
  174. package/dist/simrel/components/ProductCard.d.ts.map +1 -0
  175. package/dist/simrel/components/ProductGrid.d.ts +17 -0
  176. package/dist/simrel/components/ProductGrid.d.ts.map +1 -0
  177. package/dist/simrel/components/renderUISpec.d.ts +8 -0
  178. package/dist/simrel/components/renderUISpec.d.ts.map +1 -0
  179. package/dist/simrel/index.d.ts +36 -0
  180. package/dist/simrel/index.d.ts.map +1 -0
  181. package/dist/simrel/locales/en.d.ts +3 -0
  182. package/dist/simrel/locales/en.d.ts.map +1 -0
  183. package/dist/simrel/locales/index.d.ts +6 -0
  184. package/dist/simrel/locales/index.d.ts.map +1 -0
  185. package/dist/simrel/locales/tr.d.ts +3 -0
  186. package/dist/simrel/locales/tr.d.ts.map +1 -0
  187. package/dist/simrel/types.d.ts +111 -0
  188. package/dist/simrel/types.d.ts.map +1 -0
  189. package/dist/simrel.cjs +2 -0
  190. package/dist/simrel.cjs.map +1 -0
  191. package/dist/simrel.css +1 -0
  192. package/dist/simrel.iife.js +48 -0
  193. package/dist/simrel.iife.js.map +1 -0
  194. package/dist/simrel.js +620 -0
  195. package/dist/simrel.js.map +1 -0
  196. package/dist/types-CeON7iBO.cjs +48 -0
  197. package/dist/types-CeON7iBO.cjs.map +1 -0
  198. package/dist/types-yxW8WA7u.js +4132 -0
  199. package/dist/types-yxW8WA7u.js.map +1 -0
  200. package/package.json +100 -0
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("./index-Dfl89zpe.cjs"),a=require("./qna.cjs"),i=require("./simrel.cjs"),t=require("./types-CeON7iBO.cjs"),e=require("./common.cjs");exports.GengageChat=n.GengageChat;exports.createChatWidget=n.createChatWidget;exports.createDefaultChatUISpecRegistry=n.createDefaultChatUISpecRegistry;exports.defaultChatUnknownUISpecRenderer=n.defaultChatUnknownUISpecRenderer;exports.renderChatUISpec=n.renderUISpec;exports.routeStreamAction=n.routeStreamAction;exports.GengageQNA=a.GengageQNA;exports.createDefaultQnaUISpecRegistry=a.createDefaultQnaUISpecRegistry;exports.createQNAWidget=a.createQNAWidget;exports.defaultQnaUnknownUISpecRenderer=a.defaultQnaUnknownUISpecRenderer;exports.renderQnaUISpec=a.renderQnaUISpec;exports.GengageSimRel=i.GengageSimRel;exports.createDefaultSimRelUISpecRegistry=i.createDefaultSimRelUISpecRegistry;exports.createSimRelWidget=i.createSimRelWidget;exports.defaultSimRelUnknownUISpecRenderer=i.defaultSimRelUnknownUISpecRenderer;exports.renderSimRelUISpec=i.renderSimRelUISpec;exports.DEFAULT_WIDGET_THEME_TOKENS=t.DEFAULT_WIDGET_THEME_TOKENS;exports.bootstrapSession=t.bootstrapSession;exports.buildChatEndpointUrl=t.buildChatEndpointUrl;exports.consumeStream=t.consumeStream;exports.defaultUnknownUISpecRenderer=t.defaultUnknownUISpecRenderer;exports.dispatch=t.dispatch;exports.listen=t.listen;exports.normalizeMiddlewareUrl=t.normalizeMiddlewareUrl;exports.renderUISpecWithRegistry=t.renderUISpecWithRegistry;exports.streamPost=t.streamPost;exports.updatePageContext=t.updatePageContext;exports.wireQNAToChat=t.wireQNAToChat;exports.wireSimilarToChat=t.wireSimilarToChat;exports.withDefaultWidgetTheme=t.withDefaultWidgetTheme;exports.AccountRuntimeConfigSchema=e.AccountRuntimeConfigSchema;exports.AnalyticsAuthModeSchema=e.AnalyticsAuthModeSchema;exports.BASE_WIDGET_THEME=e.BASE_WIDGET_THEME;exports.DEFAULT_CUSTOMIZATION_LOCALE=e.DEFAULT_CUSTOMIZATION_LOCALE;exports.UnknownActionPolicySchema=e.UnknownActionPolicySchema;exports.buildOverlayIdempotencyKey=e.buildOverlayIdempotencyKey;exports.createAccountIdentity=e.createAccountIdentity;exports.createAnalyticsClient=e.createAnalyticsClient;exports.createDefaultAccountRuntimeConfig=e.createDefaultAccountRuntimeConfig;exports.createDefaultAnalyticsConfig=e.createDefaultAnalyticsConfig;exports.createFloatingChatConfig=e.createFloatingChatConfig;exports.createPdpQnaConfig=e.createPdpQnaConfig;exports.createPdpSimRelConfig=e.createPdpSimRelConfig;exports.destroyOverlayWidgets=e.destroyOverlayWidgets;exports.getOverlayWidgets=e.getOverlayWidgets;exports.initGengageClient=e.initGengageClient;exports.initOverlayWidgets=e.initOverlayWidgets;exports.parseAccountRuntimeConfig=e.parseAccountRuntimeConfig;exports.preflightDiagnostics=e.preflightDiagnostics;exports.safeParseAccountRuntimeConfig=e.safeParseAccountRuntimeConfig;exports.withBaseTheme=e.withBaseTheme;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * gengage-assistant-fe — top-level barrel export.
3
+ *
4
+ * Import the whole library:
5
+ * import { GengageChat, GengageQNA, GengageSimRel, bootstrapSession } from '@gengage/assistant-fe';
6
+ *
7
+ * Or import individual widgets for smaller bundles:
8
+ * import { GengageChat } from '@gengage/assistant-fe/chat';
9
+ * import { GengageQNA } from '@gengage/assistant-fe/qna';
10
+ * import { GengageSimRel } from '@gengage/assistant-fe/simrel';
11
+ */
12
+ export { GengageChat, createChatWidget } from './chat/index.js';
13
+ export { GengageQNA, createQNAWidget } from './qna/index.js';
14
+ export { GengageSimRel, createSimRelWidget } from './simrel/index.js';
15
+ export { renderUISpec as renderChatUISpec, createDefaultChatUISpecRegistry, defaultChatUnknownUISpecRenderer, } from './chat/index.js';
16
+ export { renderQnaUISpec, createDefaultQnaUISpecRegistry, defaultQnaUnknownUISpecRenderer } from './qna/index.js';
17
+ export { renderSimRelUISpec, createDefaultSimRelUISpecRegistry, defaultSimRelUnknownUISpecRenderer, } from './simrel/index.js';
18
+ export { bootstrapSession, updatePageContext, initOverlayWidgets, getOverlayWidgets, destroyOverlayWidgets, buildOverlayIdempotencyKey, wireQNAToChat, wireSimilarToChat, dispatch, listen, consumeStream, streamPost, buildChatEndpointUrl, normalizeMiddlewareUrl, routeStreamAction, createAnalyticsClient, renderUISpecWithRegistry, defaultUnknownUISpecRenderer, BASE_WIDGET_THEME, withBaseTheme, DEFAULT_WIDGET_THEME_TOKENS, withDefaultWidgetTheme, DEFAULT_CUSTOMIZATION_LOCALE, createAccountIdentity, createFloatingChatConfig, createPdpQnaConfig, createPdpSimRelConfig, createDefaultAnalyticsConfig, parseAccountRuntimeConfig, safeParseAccountRuntimeConfig, createDefaultAccountRuntimeConfig, AccountRuntimeConfigSchema, AnalyticsAuthModeSchema, UnknownActionPolicySchema, initGengageClient, preflightDiagnostics, } from './common/index.js';
19
+ export type { PageContext, SessionContext, BaseWidgetConfig, GengageWidget, StreamEvent, UISpec, UIElement, ActionPayload, GengageEventName, ChatPublicAPI, ChatTransportConfig, ChatEndpointName, AccountRuntimeConfig, AnalyticsAuthMode, UnknownActionPolicy, HostActionHandlers, ActionRouterOptions, AnalyticsEnvelope, AnalyticsInput, AnalyticsAuthConfig, AnalyticsClientConfig, UISpecDomComponentRenderParams, UISpecDomComponentRenderer, UISpecDomRegistry, UISpecDomUnknownRendererParams, UISpecDomUnknownRenderer, RenderUISpecWithRegistryOptions, OverlayWidgetsController, OverlayWidgetsOptions, OverlayChatOptions, OverlayQNAOptions, OverlaySimRelOptions, AccountIdentityConfig, AccountIdentity, GengageClientOptions, HostActions, PreflightResult, PreflightWarning, WireQNAToChatOptions, } from './common/index.js';
20
+ export type { ChatWidgetConfig, ChatMessage, ChatSession, ChatI18n, ChatRendererConfig } from './chat/index.js';
21
+ export type { ChatUISpecRegistry, UISpecRenderContext as ChatUISpecRenderContext } from './chat/index.js';
22
+ export type { QNAWidgetConfig, QNAI18n, QNAUISpecRenderContext, QNAUISpecRegistry, QNARendererConfig, } from './qna/index.js';
23
+ export type { SimRelWidgetConfig, SimilarProduct, SimRelI18n, SimRelUISpecRenderContext, SimRelUISpecRegistry, SimRelRendererConfig, } from './simrel/index.js';
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EACL,YAAY,IAAI,gBAAgB,EAChC,+BAA+B,EAC/B,gCAAgC,GACjC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,8BAA8B,EAAE,+BAA+B,EAAE,MAAM,gBAAgB,CAAC;AAClH,OAAO,EACL,kBAAkB,EAClB,iCAAiC,EACjC,kCAAkC,GACnC,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,0BAA0B,EAC1B,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,MAAM,EACN,aAAa,EACb,UAAU,EACV,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,EACxB,4BAA4B,EAC5B,iBAAiB,EACjB,aAAa,EACb,2BAA2B,EAC3B,sBAAsB,EACtB,4BAA4B,EAC5B,qBAAqB,EACrB,wBAAwB,EACxB,kBAAkB,EAClB,qBAAqB,EACrB,4BAA4B,EAC5B,yBAAyB,EACzB,6BAA6B,EAC7B,iCAAiC,EACjC,0BAA0B,EAC1B,uBAAuB,EACvB,yBAAyB,EACzB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAG3B,YAAY,EACV,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,MAAM,EACN,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,8BAA8B,EAC9B,0BAA0B,EAC1B,iBAAiB,EACjB,8BAA8B,EAC9B,wBAAwB,EACxB,+BAA+B,EAC/B,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAChH,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,IAAI,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1G,YAAY,EACV,eAAe,EACf,OAAO,EACP,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,kBAAkB,EAClB,cAAc,EACd,UAAU,EACV,yBAAyB,EACzB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,59 @@
1
+ import { G as a, c as n, a as r, d as i, b as c, r as o } from "./index-CFA70IGF.js";
2
+ import { GengageQNA as l, createDefaultQnaUISpecRegistry as d, createQNAWidget as g, defaultQnaUnknownUISpecRenderer as m, renderQnaUISpec as S } from "./qna.js";
3
+ import { GengageSimRel as p, createDefaultSimRelUISpecRegistry as u, createSimRelWidget as C, defaultSimRelUnknownUISpecRenderer as U, renderSimRelUISpec as h } from "./simrel.js";
4
+ import { H as I, I as R, b as y, c as T, L as E, j as D, O as W, G as w, r as O, T as G, U as Q, F as _, V as x, W as P } from "./types-yxW8WA7u.js";
5
+ import { AccountRuntimeConfigSchema as k, AnalyticsAuthModeSchema as L, BASE_WIDGET_THEME as M, DEFAULT_CUSTOMIZATION_LOCALE as N, UnknownActionPolicySchema as v, buildOverlayIdempotencyKey as F, createAccountIdentity as H, createAnalyticsClient as B, createDefaultAccountRuntimeConfig as K, createDefaultAnalyticsConfig as j, createFloatingChatConfig as z, createPdpQnaConfig as V, createPdpSimRelConfig as Z, destroyOverlayWidgets as q, getOverlayWidgets as J, initGengageClient as X, initOverlayWidgets as Y, parseAccountRuntimeConfig as $, preflightDiagnostics as ee, safeParseAccountRuntimeConfig as te, withBaseTheme as ae } from "./common.js";
6
+ export {
7
+ k as AccountRuntimeConfigSchema,
8
+ L as AnalyticsAuthModeSchema,
9
+ M as BASE_WIDGET_THEME,
10
+ N as DEFAULT_CUSTOMIZATION_LOCALE,
11
+ I as DEFAULT_WIDGET_THEME_TOKENS,
12
+ a as GengageChat,
13
+ l as GengageQNA,
14
+ p as GengageSimRel,
15
+ v as UnknownActionPolicySchema,
16
+ R as bootstrapSession,
17
+ y as buildChatEndpointUrl,
18
+ F as buildOverlayIdempotencyKey,
19
+ T as consumeStream,
20
+ H as createAccountIdentity,
21
+ B as createAnalyticsClient,
22
+ n as createChatWidget,
23
+ K as createDefaultAccountRuntimeConfig,
24
+ j as createDefaultAnalyticsConfig,
25
+ r as createDefaultChatUISpecRegistry,
26
+ d as createDefaultQnaUISpecRegistry,
27
+ u as createDefaultSimRelUISpecRegistry,
28
+ z as createFloatingChatConfig,
29
+ V as createPdpQnaConfig,
30
+ Z as createPdpSimRelConfig,
31
+ g as createQNAWidget,
32
+ C as createSimRelWidget,
33
+ i as defaultChatUnknownUISpecRenderer,
34
+ m as defaultQnaUnknownUISpecRenderer,
35
+ U as defaultSimRelUnknownUISpecRenderer,
36
+ E as defaultUnknownUISpecRenderer,
37
+ q as destroyOverlayWidgets,
38
+ D as dispatch,
39
+ J as getOverlayWidgets,
40
+ X as initGengageClient,
41
+ Y as initOverlayWidgets,
42
+ W as listen,
43
+ w as normalizeMiddlewareUrl,
44
+ $ as parseAccountRuntimeConfig,
45
+ ee as preflightDiagnostics,
46
+ c as renderChatUISpec,
47
+ S as renderQnaUISpec,
48
+ h as renderSimRelUISpec,
49
+ O as renderUISpecWithRegistry,
50
+ o as routeStreamAction,
51
+ te as safeParseAccountRuntimeConfig,
52
+ G as streamPost,
53
+ Q as updatePageContext,
54
+ _ as wireQNAToChat,
55
+ x as wireSimilarToChat,
56
+ ae as withBaseTheme,
57
+ P as withDefaultWidgetTheme
58
+ };
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
@@ -0,0 +1,22 @@
1
+ import { UISpec } from '../common/types.js';
2
+ import { ChatTransportConfig } from '../common/api-paths.js';
3
+ export interface LauncherActionRequest {
4
+ account_id: string;
5
+ session_id: string;
6
+ correlation_id: string;
7
+ sku: string;
8
+ page_type?: string;
9
+ locale?: string;
10
+ output_language?: string;
11
+ mode?: string;
12
+ }
13
+ export interface LauncherActionResult {
14
+ uiSpecs: UISpec[];
15
+ actions: Array<{
16
+ title: string;
17
+ type: string;
18
+ payload?: unknown;
19
+ }>;
20
+ }
21
+ export declare function fetchLauncherActions(request: LauncherActionRequest, transport: ChatTransportConfig, signal?: AbortSignal): Promise<LauncherActionResult>;
22
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/qna/api.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAe,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACpE;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,qBAAqB,EAC9B,SAAS,EAAE,mBAAmB,EAC9B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,oBAAoB,CAAC,CAyC/B"}
@@ -0,0 +1,140 @@
1
+ import { z } from 'zod';
2
+ export declare const ActionButtonSchema: z.ZodObject<{
3
+ label: z.ZodString;
4
+ action: z.ZodObject<{
5
+ title: z.ZodString;
6
+ type: z.ZodString;
7
+ payload: z.ZodOptional<z.ZodUnknown>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ type: string;
10
+ title: string;
11
+ payload?: unknown;
12
+ }, {
13
+ type: string;
14
+ title: string;
15
+ payload?: unknown;
16
+ }>;
17
+ variant: z.ZodOptional<z.ZodEnum<["primary", "outline", "ghost"]>>;
18
+ }, "strip", z.ZodTypeAny, {
19
+ label: string;
20
+ action: {
21
+ type: string;
22
+ title: string;
23
+ payload?: unknown;
24
+ };
25
+ variant?: "primary" | "outline" | "ghost" | undefined;
26
+ }, {
27
+ label: string;
28
+ action: {
29
+ type: string;
30
+ title: string;
31
+ payload?: unknown;
32
+ };
33
+ variant?: "primary" | "outline" | "ghost" | undefined;
34
+ }>;
35
+ export declare const ButtonRowSchema: z.ZodObject<{
36
+ orientation: z.ZodOptional<z.ZodEnum<["horizontal", "vertical"]>>;
37
+ wrap: z.ZodOptional<z.ZodBoolean>;
38
+ }, "strip", z.ZodTypeAny, {
39
+ orientation?: "horizontal" | "vertical" | undefined;
40
+ wrap?: boolean | undefined;
41
+ }, {
42
+ orientation?: "horizontal" | "vertical" | undefined;
43
+ wrap?: boolean | undefined;
44
+ }>;
45
+ export declare const TextInputSchema: z.ZodObject<{
46
+ placeholder: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>>;
47
+ ctaLabel: z.ZodOptional<z.ZodString>;
48
+ }, "strip", z.ZodTypeAny, {
49
+ placeholder?: string | string[] | undefined;
50
+ ctaLabel?: string | undefined;
51
+ }, {
52
+ placeholder?: string | string[] | undefined;
53
+ ctaLabel?: string | undefined;
54
+ }>;
55
+ export declare const QuestionHeadingSchema: z.ZodObject<{
56
+ text: z.ZodString;
57
+ }, "strip", z.ZodTypeAny, {
58
+ text: string;
59
+ }, {
60
+ text: string;
61
+ }>;
62
+ export declare const qnaCatalog: {
63
+ readonly components: {
64
+ readonly ActionButton: {
65
+ readonly schema: z.ZodObject<{
66
+ label: z.ZodString;
67
+ action: z.ZodObject<{
68
+ title: z.ZodString;
69
+ type: z.ZodString;
70
+ payload: z.ZodOptional<z.ZodUnknown>;
71
+ }, "strip", z.ZodTypeAny, {
72
+ type: string;
73
+ title: string;
74
+ payload?: unknown;
75
+ }, {
76
+ type: string;
77
+ title: string;
78
+ payload?: unknown;
79
+ }>;
80
+ variant: z.ZodOptional<z.ZodEnum<["primary", "outline", "ghost"]>>;
81
+ }, "strip", z.ZodTypeAny, {
82
+ label: string;
83
+ action: {
84
+ type: string;
85
+ title: string;
86
+ payload?: unknown;
87
+ };
88
+ variant?: "primary" | "outline" | "ghost" | undefined;
89
+ }, {
90
+ label: string;
91
+ action: {
92
+ type: string;
93
+ title: string;
94
+ payload?: unknown;
95
+ };
96
+ variant?: "primary" | "outline" | "ghost" | undefined;
97
+ }>;
98
+ readonly description: "A single clickable QNA action button.";
99
+ };
100
+ readonly ButtonRow: {
101
+ readonly schema: z.ZodObject<{
102
+ orientation: z.ZodOptional<z.ZodEnum<["horizontal", "vertical"]>>;
103
+ wrap: z.ZodOptional<z.ZodBoolean>;
104
+ }, "strip", z.ZodTypeAny, {
105
+ orientation?: "horizontal" | "vertical" | undefined;
106
+ wrap?: boolean | undefined;
107
+ }, {
108
+ orientation?: "horizontal" | "vertical" | undefined;
109
+ wrap?: boolean | undefined;
110
+ }>;
111
+ readonly description: "Container for a group of QNA action buttons.";
112
+ };
113
+ readonly TextInput: {
114
+ readonly schema: z.ZodObject<{
115
+ placeholder: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>>;
116
+ ctaLabel: z.ZodOptional<z.ZodString>;
117
+ }, "strip", z.ZodTypeAny, {
118
+ placeholder?: string | string[] | undefined;
119
+ ctaLabel?: string | undefined;
120
+ }, {
121
+ placeholder?: string | string[] | undefined;
122
+ ctaLabel?: string | undefined;
123
+ }>;
124
+ readonly description: "Free-text input with rotating placeholder and CTA button.";
125
+ };
126
+ readonly QuestionHeading: {
127
+ readonly schema: z.ZodObject<{
128
+ text: z.ZodString;
129
+ }, "strip", z.ZodTypeAny, {
130
+ text: string;
131
+ }, {
132
+ text: string;
133
+ }>;
134
+ readonly description: "A heading displayed above the QNA button group.";
135
+ };
136
+ };
137
+ };
138
+ export type QNACatalog = typeof qnaCatalog;
139
+ export type QNAComponentName = keyof QNACatalog['components'];
140
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/qna/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI7B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;EAG1B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;EAG1B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;EAEhC,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmBb,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC;AAC3C,MAAM,MAAM,gBAAgB,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { ActionPayload } from '../../common/types.js';
2
+ export interface ButtonRowOptions {
3
+ actions: Array<{
4
+ title: string;
5
+ type: string;
6
+ payload?: unknown;
7
+ }>;
8
+ onAction: (action: ActionPayload) => void;
9
+ ctaText?: string;
10
+ defaultCtaText?: string;
11
+ onOpenChat?: () => void;
12
+ orientation?: 'horizontal' | 'vertical';
13
+ quickQuestionsAriaLabel?: string;
14
+ }
15
+ export declare function renderButtonRow(options: ButtonRowOptions): HTMLElement;
16
+ //# sourceMappingURL=ButtonRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ButtonRow.d.ts","sourceRoot":"","sources":["../../../src/qna/components/ButtonRow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACnE,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACxC,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,WAAW,CAsCtE"}
@@ -0,0 +1,12 @@
1
+ import { ActionPayload } from '../../common/types.js';
2
+ export interface TextInputOptions {
3
+ placeholders?: string | string[];
4
+ ctaLabel?: string;
5
+ defaultInputPlaceholder?: string;
6
+ askQuestionAriaLabel?: string;
7
+ sendButtonText?: string;
8
+ sendQuestionAriaLabel?: string;
9
+ onSubmit: (action: ActionPayload) => void;
10
+ }
11
+ export declare function renderTextInput(options: TextInputOptions): HTMLElement;
12
+ //# sourceMappingURL=TextInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextInput.d.ts","sourceRoot":"","sources":["../../../src/qna/components/TextInput.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;CAC3C;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,WAAW,CAiEtE"}
@@ -0,0 +1,8 @@
1
+ import { UISpecDomRegistry, UISpecDomUnknownRenderer } from '../../common/renderer/index.js';
2
+ import { UISpec } from '../../common/types.js';
3
+ import { QNAUISpecRenderContext } from '../types.js';
4
+ export type QNAUISpecRegistry = UISpecDomRegistry<QNAUISpecRenderContext>;
5
+ export declare const defaultQnaUnknownUISpecRenderer: UISpecDomUnknownRenderer<QNAUISpecRenderContext>;
6
+ export declare function createDefaultQnaUISpecRegistry(): QNAUISpecRegistry;
7
+ export declare function renderQnaUISpec(spec: UISpec, context: QNAUISpecRenderContext, registry?: QNAUISpecRegistry, unknownRenderer?: UISpecDomUnknownRenderer<QNAUISpecRenderContext>): HTMLElement;
8
+ //# sourceMappingURL=renderUISpec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderUISpec.d.ts","sourceRoot":"","sources":["../../../src/qna/components/renderUISpec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAClG,OAAO,KAAK,EAAE,MAAM,EAA4B,MAAM,uBAAuB,CAAC;AAC9E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAI1D,MAAM,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;AAoJ1E,eAAO,MAAM,+BAA+B,EAAE,wBAAwB,CAAC,sBAAsB,CAgB5F,CAAC;AAEF,wBAAgB,8BAA8B,IAAI,iBAAiB,CAElE;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,sBAAsB,EAC/B,QAAQ,oBAA+B,EACvC,eAAe,GAAE,wBAAwB,CAAC,sBAAsB,CAAmC,GAClG,WAAW,CAQb"}
@@ -0,0 +1,34 @@
1
+ import { ActionPayload, PageContext } from '../common/types.js';
2
+ import { BaseWidget } from '../common/widget-base.js';
3
+ import { QNAWidgetConfig } from './types.js';
4
+ export declare class GengageQNA extends BaseWidget<QNAWidgetConfig> {
5
+ private _abortController;
6
+ private _debounceTimer;
7
+ private _contentEl;
8
+ private _lastSku;
9
+ private _i18n;
10
+ protected onInit(config: QNAWidgetConfig): Promise<void>;
11
+ protected onUpdate(context: Partial<PageContext>): void;
12
+ protected onShow(): void;
13
+ protected onHide(): void;
14
+ protected onDestroy(): void;
15
+ private _abort;
16
+ private _fetchAndRender;
17
+ private _createLoadingIndicator;
18
+ private _resolveI18n;
19
+ private _resolveUISpecRegistry;
20
+ private _renderUISpec;
21
+ private _specIncludesType;
22
+ private _buildFallbackActionsSpec;
23
+ private _handleAction;
24
+ private _handleOpenChat;
25
+ _actionHandler: (action: ActionPayload) => void;
26
+ _openChatHandler: () => void;
27
+ }
28
+ export declare function createQNAWidget(): GengageQNA;
29
+ export type { QNAWidgetConfig, QNAUIComponents, QNAI18n, QNAUISpecRenderContext, QNARendererConfig } from './types.js';
30
+ export { renderQnaUISpec, createDefaultQnaUISpecRegistry, defaultQnaUnknownUISpecRenderer, } from './components/renderUISpec.js';
31
+ export type { QNAUISpecRegistry } from './components/renderUISpec.js';
32
+ export { qnaCatalog } from './catalog.js';
33
+ export type { QNACatalog, QNAComponentName } from './catalog.js';
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/qna/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAqB,MAAM,oBAAoB,CAAC;AAIxF,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAetD,OAAO,KAAK,EAAE,eAAe,EAAmC,MAAM,YAAY,CAAC;AAInF,OAAO,sBAAsB,CAAC;AAE9B,qBAAa,UAAW,SAAQ,UAAU,CAAC,eAAe,CAAC;IACzD,OAAO,CAAC,gBAAgB,CAAgC;IACxD,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,KAAK,CAAwB;cAErB,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB9D,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAavD,SAAS,CAAC,MAAM,IAAI,IAAI;IAUxB,SAAS,CAAC,MAAM,IAAI,IAAI;IAIxB,SAAS,CAAC,SAAS,IAAI,IAAI;IAqB3B,OAAO,CAAC,MAAM;YAKA,eAAe;IA6I7B,OAAO,CAAC,uBAAuB;IAW/B,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,yBAAyB;IAiCjC,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,eAAe;IAKvB,cAAc,WAVgB,aAAa,KAAG,IAAI,CAUH;IAC/C,gBAAgB,QANW,IAAI,CAMoB;CACpD;AAED,wBAAgB,eAAe,IAAI,UAAU,CAE5C;AAED,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACvH,OAAO,EACL,eAAe,EACf,8BAA8B,EAC9B,+BAA+B,GAChC,MAAM,8BAA8B,CAAC;AACtC,YAAY,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { QNAI18n } from '../types.js';
2
+ export declare const QNA_I18N_EN: QNAI18n;
3
+ //# sourceMappingURL=en.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../src/qna/locales/en.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,eAAO,MAAM,WAAW,EAAE,OAOzB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { QNAI18n } from '../types.js';
2
+ import { QNA_I18N_TR } from './tr.js';
3
+ import { QNA_I18N_EN } from './en.js';
4
+ export declare function resolveQnaLocale(locale?: string): QNAI18n;
5
+ export { QNA_I18N_TR, QNA_I18N_EN };
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/qna/locales/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAOtC,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAOzD;AAED,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { QNAI18n } from '../types.js';
2
+ export declare const QNA_I18N_TR: QNAI18n;
3
+ //# sourceMappingURL=tr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tr.d.ts","sourceRoot":"","sources":["../../../src/qna/locales/tr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,eAAO,MAAM,WAAW,EAAE,OAOzB,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { BaseWidgetConfig, ActionPayload } from '../common/types.js';
2
+ import { UISpecRendererOverrides } from '../common/renderer/index.js';
3
+ export interface QNAWidgetConfig extends BaseWidgetConfig {
4
+ /** Where to mount the QNA buttons container. Required. */
5
+ mountTarget: HTMLElement | string;
6
+ /** CTA label for the "ask anything" input (default: 'Başka bir şey sor'). */
7
+ ctaText?: string;
8
+ /** Placeholder text cycling inside the free-text input.
9
+ * Set to `true` to use fetched action titles as rotating placeholders. */
10
+ inputPlaceholder?: string | string[] | true;
11
+ /** Locale key for SDK defaults (for example 'tr', 'en'). */
12
+ locale?: string;
13
+ i18n?: Partial<QNAI18n>;
14
+ renderer?: QNARendererConfig;
15
+ /** Show a static question above the rotating buttons. */
16
+ showStaticQuestion?: boolean;
17
+ staticQuestionText?: string;
18
+ /** Called when a QNA action button is clicked. */
19
+ onActionSelected?: (action: ActionPayload) => void;
20
+ /** Called when "Başka bir şey sor" / open-chat CTA is clicked. */
21
+ onOpenChat?: () => void;
22
+ }
23
+ export interface QNAI18n {
24
+ quickQuestionsAriaLabel: string;
25
+ askQuestionAriaLabel: string;
26
+ defaultInputPlaceholder: string;
27
+ sendButton: string;
28
+ sendQuestionAriaLabel: string;
29
+ defaultCtaText: string;
30
+ }
31
+ export interface QNAUISpecRenderContext {
32
+ onAction: (action: ActionPayload) => void;
33
+ onOpenChat?: () => void;
34
+ ctaText?: string;
35
+ inputPlaceholder?: string | string[];
36
+ i18n: QNAI18n;
37
+ }
38
+ export type QNARendererConfig = UISpecRendererOverrides<QNAUISpecRenderContext>;
39
+ export interface QNAUIComponents {
40
+ /** A single QNA action button. */
41
+ ActionButton: {
42
+ label: string;
43
+ action: ActionPayload;
44
+ /** Visual variant for the button. */
45
+ variant?: 'primary' | 'outline' | 'ghost';
46
+ };
47
+ /** The container holding all action buttons. */
48
+ ButtonRow: {
49
+ orientation?: 'horizontal' | 'vertical';
50
+ wrap?: boolean;
51
+ };
52
+ /** Free-text input field with rotating placeholder text. */
53
+ TextInput: {
54
+ placeholder?: string | string[];
55
+ ctaLabel?: string;
56
+ };
57
+ /** A heading or label above the buttons. */
58
+ QuestionHeading: {
59
+ text: string;
60
+ };
61
+ }
62
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/qna/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAE3E,MAAM,WAAW,eAAgB,SAAQ,gBAAgB;IACvD,0DAA0D;IAC1D,WAAW,EAAE,WAAW,GAAG,MAAM,CAAC;IAElC,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;+EAC2E;IAC3E,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IAE5C,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACxB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAE7B,yDAAyD;IACzD,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAM5B,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAEnD,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,OAAO;IACtB,uBAAuB,EAAE,MAAM,CAAC;IAChC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,uBAAuB,EAAE,MAAM,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACrC,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,sBAAsB,CAAC,CAAC;AAMhF,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,YAAY,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,aAAa,CAAC;QACtB,qCAAqC;QACrC,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;KAC3C,CAAC;IAEF,gDAAgD;IAChD,SAAS,EAAE;QACT,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;QACxC,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;IAEF,4DAA4D;IAC5D,SAAS,EAAE;QACT,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IAEF,4CAA4C;IAC5C,eAAe,EAAE;QACf,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH"}
package/dist/qna.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("./types-CeON7iBO.cjs");async function q(n,e,t){const i=s.buildChatEndpointUrl("launcher_action",e),o={uiSpecs:[],actions:[]},r={method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)};t!==void 0&&(r.signal=t);const a=await fetch(i,r);if(!a.ok)throw new Error(`HTTP ${a.status}: ${a.statusText}`);const c={onEvent:l=>{const u=s.adaptV1Event(l);if(u&&(u.type==="ui_spec"&&o.uiSpecs.push(u.spec),u.type==="ui_spec"&&u.spec.elements)){for(const p of Object.values(u.spec.elements))if(p.type==="ActionButton"&&p.props?.action){const h=p.props.action;o.actions.push(h)}}}};return t!==void 0&&(c.signal=t),await s.consumeStream(a,c),o}function _(n){const e=document.createElement("div");e.className="gengage-qna-buttons",e.setAttribute("role","group"),e.setAttribute("aria-label",n.quickQuestionsAriaLabel??"Quick questions"),n.orientation==="vertical"&&(e.style.flexDirection="column");for(const t of n.actions){const i=document.createElement("button");i.className="gengage-qna-button",i.textContent=t.title,i.type="button",i.addEventListener("click",()=>{const o={title:t.title,type:t.type};t.payload!==void 0&&(o.payload=t.payload),n.onAction(o)}),e.appendChild(i)}if(n.ctaText||n.onOpenChat){const t=document.createElement("button");t.className="gengage-qna-cta",t.textContent=n.ctaText??n.defaultCtaText??"Başka bir şey sor",t.type="button",t.addEventListener("click",()=>{n.onOpenChat?.()}),e.appendChild(t)}return e}function w(n){const e=document.createElement("div");e.className="gengage-qna-input-wrapper";const t=document.createElement("input");t.type="text",t.className="gengage-qna-input",t.setAttribute("aria-label",n.askQuestionAriaLabel??"Ask a question");const i=Array.isArray(n.placeholders)?n.placeholders:n.placeholders?[n.placeholders]:[n.defaultInputPlaceholder??"Bir soru sorun..."];let o=0;t.placeholder=i[0]??"";let r=null;i.length>1&&(r=setInterval(()=>{t.classList.add("gengage-qna-input--fade"),setTimeout(()=>{o=(o+1)%i.length,t.placeholder=i[o]??"",t.classList.remove("gengage-qna-input--fade")},180)},3e3));const a=document.createElement("button");a.className="gengage-qna-send",a.type="button",a.textContent=n.ctaLabel??n.sendButtonText??"Sor",a.setAttribute("aria-label",n.sendQuestionAriaLabel??"Send question");const c=()=>{const l=t.value.trim();l&&(n.onSubmit({title:l,type:"user_message",payload:l}),t.value="")};return a.addEventListener("click",c),t.addEventListener("keydown",l=>{l.key==="Enter"&&(l.preventDefault(),c())}),e.appendChild(t),e.appendChild(a),e._cleanup=()=>{r&&clearInterval(r)},e}function f(n,e){if(!n||typeof n!="object")return null;const t=n,i=t.type;if(typeof i!="string"||i.length===0)return null;const o=t.title,r=t.payload,a=typeof o=="string"&&o.length>0?o:e;if(!a)return null;const c={title:a,type:i};return r!==void 0&&(c.payload=r),c}function A(n){const e={title:n.title,type:n.type};return n.payload!==void 0&&(e.payload=n.payload),e}function T(n,e){const t=[],i=n.props?.actions;if(Array.isArray(i))for(const a of i){const c=f(a);c&&t.push(c)}const o=n.props?.buttons;if(Array.isArray(o))for(const a of o){if(!a||typeof a!="object")continue;const c=a,l=typeof c.label=="string"?c.label:void 0,u=f(c.action,l);u&&t.push(u)}if(n.children)for(const a of n.children){const c=e.elements[a];if(!c||c.type!=="ActionButton")continue;const l=typeof c.props?.label=="string"?c.props.label:void 0,u=f(c.props?.action,l);u&&t.push(u)}const r=new Set;return t.filter(a=>r.has(a.title)?!1:(r.add(a.title),!0))}const C={ButtonRow:({element:n,spec:e,context:t})=>{const i=T(n,e).map(A),o=n.props?.orientation,r={actions:i,onAction:t.onAction,defaultCtaText:t.i18n.defaultCtaText,quickQuestionsAriaLabel:t.i18n.quickQuestionsAriaLabel};return t.onOpenChat!==void 0&&(r.onOpenChat=t.onOpenChat),t.ctaText!==void 0&&(r.ctaText=t.ctaText),(o==="horizontal"||o==="vertical")&&(r.orientation=o),_(r)},ActionButtons:({element:n,spec:e,context:t})=>{const o={actions:T(n,e).map(A),onAction:t.onAction,defaultCtaText:t.i18n.defaultCtaText,quickQuestionsAriaLabel:t.i18n.quickQuestionsAriaLabel};return t.onOpenChat!==void 0&&(o.onOpenChat=t.onOpenChat),t.ctaText!==void 0&&(o.ctaText=t.ctaText),_(o)},ActionButton:({element:n,context:e})=>{const t=document.createElement("button");t.className="gengage-qna-button",t.type="button";const i=n.props?.label;typeof i=="string"?t.textContent=i:t.textContent=e.i18n.defaultCtaText;const o=f(n.props?.action,typeof i=="string"?i:void 0);return o&&t.addEventListener("click",()=>e.onAction(o)),t},TextInput:({element:n,context:e})=>{const t=n.props?.placeholder,i=typeof t=="string"||Array.isArray(t)?t:e.inputPlaceholder,o=typeof n.props?.ctaLabel=="string"?n.props.ctaLabel:e.ctaText,r={onSubmit:e.onAction,askQuestionAriaLabel:e.i18n.askQuestionAriaLabel,defaultInputPlaceholder:e.i18n.defaultInputPlaceholder,sendButtonText:e.i18n.sendButton,sendQuestionAriaLabel:e.i18n.sendQuestionAriaLabel};return i!==void 0&&(r.placeholders=i),o!==void 0&&(r.ctaLabel=o),w(r)},QuestionHeading:({element:n})=>{const e=document.createElement("h3");e.className="gengage-qna-heading";const t=n.props?.text;return e.textContent=typeof t=="string"?t:"",e}},b=({element:n,renderElement:e})=>{if(!n.children||n.children.length===0)return null;const t=document.createElement("div");for(const i of n.children){const o=e(i);o&&t.appendChild(o)}return t};function E(){return{...C}}function v(n,e,t=C,i=b){return s.renderUISpecWithRegistry({spec:n,context:e,registry:t,containerClassName:"gengage-qna-uispec",unknownRenderer:i})}const S={quickQuestionsAriaLabel:"Hızlı sorular",askQuestionAriaLabel:"Soru sorun",defaultInputPlaceholder:"Bir soru sorun...",sendButton:"Sor",sendQuestionAriaLabel:"Soruyu gönder",defaultCtaText:"Başka bir şey sor"},Q={quickQuestionsAriaLabel:"Quick questions",askQuestionAriaLabel:"Ask a question",defaultInputPlaceholder:"Ask a question...",sendButton:"Ask",sendQuestionAriaLabel:"Send question",defaultCtaText:"Ask something else"};function L(n){return n?n.toLowerCase().split("-")[0]??"tr":"tr"}function R(n){return L(n)==="en"?Q:S}const x=s.objectType({title:s.stringType(),type:s.stringType(),payload:s.unknownType().optional()}),N=s.objectType({label:s.stringType(),action:x,variant:s.enumType(["primary","outline","ghost"]).optional()}),B=s.objectType({orientation:s.enumType(["horizontal","vertical"]).optional(),wrap:s.booleanType().optional()}),U=s.objectType({placeholder:s.unionType([s.stringType(),s.arrayType(s.stringType())]).optional(),ctaLabel:s.stringType().optional()}),O=s.objectType({text:s.stringType()}),P={components:{ActionButton:{schema:N,description:"A single clickable QNA action button."},ButtonRow:{schema:B,description:"Container for a group of QNA action buttons."},TextInput:{schema:U,description:"Free-text input with rotating placeholder and CTA button."},QuestionHeading:{schema:O,description:"A heading displayed above the QNA button group."}}};class I extends s.BaseWidget{constructor(){super(...arguments),this._abortController=null,this._debounceTimer=null,this._contentEl=null,this._i18n=S,this._actionHandler=this._handleAction.bind(this),this._openChatHandler=this._handleOpenChat.bind(this)}async onInit(e){this._i18n=this._resolveI18n(e),this._contentEl=document.createElement("div"),this._contentEl.className="gengage-qna-container",this.root.appendChild(this._contentEl);const t=e.pageContext?.sku;t&&(this._lastSku=t,await this._fetchAndRender(t)),this.isVisible=!0}onUpdate(e){const t=e.sku;!t||t===this._lastSku||(this._debounceTimer&&clearTimeout(this._debounceTimer),this._debounceTimer=setTimeout(()=>{this._debounceTimer=null,this._lastSku=t,this._fetchAndRender(t)},50))}onShow(){this._contentEl&&(this._contentEl.style.opacity="0",this._contentEl.style.transition="opacity 0.2s ease-in",requestAnimationFrame(()=>{this._contentEl&&(this._contentEl.style.opacity="1")}))}onHide(){}onDestroy(){this._abort(),this._debounceTimer&&(clearTimeout(this._debounceTimer),this._debounceTimer=null),this._contentEl&&(this._contentEl.querySelector(".gengage-qna-input-wrapper")?._cleanup?.(),this._contentEl.remove(),this._contentEl=null)}_abort(){this._abortController?.abort(),this._abortController=null}async _fetchAndRender(e){if(this._abort(),this._abortController=new AbortController,!this._contentEl)return;this._contentEl.innerHTML="";const t=this._createLoadingIndicator();this._contentEl.appendChild(t);const i={middlewareUrl:this.config.middlewareUrl},o=crypto.randomUUID(),r=Date.now();this.track(s.streamStartEvent(this.analyticsContext(),{endpoint:"launcher_action",request_id:o,widget:"qna"}));try{const a={account_id:this.config.accountId,session_id:this.config.session?.sessionId??"",correlation_id:this.config.session?.sessionId??"",sku:e,locale:this.config.locale??"tr"},c=this.config.pageContext?.pageType;c!==void 0&&(a.page_type=c);const l=await q(a,i,this._abortController.signal);if(this.track(s.streamDoneEvent(this.analyticsContext(),{request_id:o,latency_ms:Date.now()-r,chunk_count:l.actions.length,widget:"qna"})),this.track(s.widgetHistorySnapshotEvent(this.analyticsContext(),{message_count:l.actions.length,history_ref:o,redaction_level:"none",widget:"qna"})),!this._contentEl)return;if(this._contentEl.innerHTML="",!this._specIncludesType(l.uiSpecs,"QuestionHeading")&&this.config.showStaticQuestion&&this.config.staticQuestionText){const d=document.createElement("h3");d.className="gengage-qna-heading",d.textContent=this.config.staticQuestionText,this._contentEl.appendChild(d)}const p=this.config.inputPlaceholder,h=l.actions.length>0&&p===!0?l.actions.map(d=>d.title):p===!0?this._i18n.defaultInputPlaceholder:p,g={onAction:this._actionHandler,i18n:this._i18n};p===void 0&&(g.onOpenChat=this._openChatHandler,this.config.ctaText!==void 0&&(g.ctaText=this.config.ctaText)),h!==void 0&&(g.inputPlaceholder=h);const k=this._buildFallbackActionsSpec(l.actions),m=(l.uiSpecs.length>0?l.uiSpecs:[k]).filter(d=>Object.keys(d.elements).length>0);for(const d of m){const y=this._renderUISpec(d,g);this._contentEl.appendChild(y)}if(p!==void 0&&!this._specIncludesType(m,"TextInput")){const d={root:"root",elements:{root:{type:"TextInput",props:{placeholder:h,ctaLabel:this.config.ctaText}}}},y=this._renderUISpec(d,g);this._contentEl.appendChild(y)}}catch(a){if(a instanceof DOMException&&a.name==="AbortError")return;s.dispatch("gengage:global:error",{source:"qna",code:"FETCH_ERROR",message:s.getGlobalErrorMessage(this.config.locale)}),this.track(s.streamErrorEvent(this.analyticsContext(),{request_id:o,error_code:"FETCH_ERROR",error_message:a instanceof Error?a.message:String(a),widget:"qna"}))}}_createLoadingIndicator(){const e=document.createElement("div");e.className="gengage-qna-loading";for(let t=0;t<3;t++){const i=document.createElement("div");i.className="gengage-qna-loading-dot",e.appendChild(i)}return e}_resolveI18n(e){return{...R(e.locale),...e.i18n}}_resolveUISpecRegistry(){const e=E();return s.mergeUISpecRegistry(e,this.config.renderer?.registry)}_renderUISpec(e,t){const i=this._resolveUISpecRegistry(),o=this.config.renderer?.unknownRenderer??b,r=(l,u)=>v(l,u,i,o),a=this.config.renderer?.renderUISpec;return a?a(e,t,{registry:i,unknownRenderer:o,defaultRender:r}):r(e,t)}_specIncludesType(e,t){for(const i of e)for(const o of Object.values(i.elements))if(o.type===t)return!0;return!1}_buildFallbackActionsSpec(e){if(e.length===0)return{root:"root",elements:{}};const t={},i=[];for(let o=0;o<e.length;o++){const r=e[o],a=`action-${o}`;i.push(a),t[a]={type:"ActionButton",props:{label:r.title,action:{title:r.title,type:r.type,payload:r.payload}}}}return t.root={type:"ButtonRow",children:i},{root:"root",elements:t}}_handleAction(e){this.config.onActionSelected?.(e),s.dispatch("gengage:qna:action",e)}_handleOpenChat(){this.config.onOpenChat?.(),s.dispatch("gengage:qna:open-chat",{})}}function H(){return new I}exports.GengageQNA=I;exports.createDefaultQnaUISpecRegistry=E;exports.createQNAWidget=H;exports.defaultQnaUnknownUISpecRenderer=b;exports.qnaCatalog=P;exports.renderQnaUISpec=v;
2
+ //# sourceMappingURL=qna.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qna.cjs","sources":["../src/qna/api.ts","../src/qna/components/ButtonRow.ts","../src/qna/components/TextInput.ts","../src/qna/components/renderUISpec.ts","../src/qna/locales/tr.ts","../src/qna/locales/en.ts","../src/qna/locales/index.ts","../src/qna/catalog.ts","../src/qna/index.ts"],"sourcesContent":["import { consumeStream } from '../common/streaming.js';\nimport { buildChatEndpointUrl } from '../common/api-paths.js';\nimport { adaptV1Event } from '../common/v1-protocol-adapter.js';\nimport type { StreamEvent, UISpec } from '../common/types.js';\nimport type { ChatTransportConfig } from '../common/api-paths.js';\n\nexport interface LauncherActionRequest {\n account_id: string;\n session_id: string;\n correlation_id: string;\n sku: string;\n page_type?: string;\n locale?: string;\n output_language?: string;\n mode?: string;\n}\n\nexport interface LauncherActionResult {\n uiSpecs: UISpec[];\n actions: Array<{ title: string; type: string; payload?: unknown }>;\n}\n\nexport async function fetchLauncherActions(\n request: LauncherActionRequest,\n transport: ChatTransportConfig,\n signal?: AbortSignal,\n): Promise<LauncherActionResult> {\n const url = buildChatEndpointUrl('launcher_action', transport);\n const result: LauncherActionResult = { uiSpecs: [], actions: [] };\n\n const fetchInit: RequestInit = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n };\n if (signal !== undefined) fetchInit.signal = signal;\n const response = await fetch(url, fetchInit);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const streamOpts: import('../common/streaming.js').StreamOptions = {\n onEvent: (event: StreamEvent) => {\n const normalized = adaptV1Event(event as unknown as Record<string, unknown>);\n\n if (!normalized) return;\n\n if (normalized.type === 'ui_spec') {\n result.uiSpecs.push(normalized.spec);\n }\n\n if (normalized.type === 'ui_spec' && normalized.spec.elements) {\n for (const el of Object.values(normalized.spec.elements)) {\n if (el.type === 'ActionButton' && el.props?.['action']) {\n const action = el.props['action'] as { title: string; type: string; payload?: unknown };\n result.actions.push(action);\n }\n }\n }\n },\n };\n if (signal !== undefined) streamOpts.signal = signal;\n\n await consumeStream(response, streamOpts);\n\n return result;\n}\n","import type { ActionPayload } from '../../common/types.js';\n\nexport interface ButtonRowOptions {\n actions: Array<{ title: string; type: string; payload?: unknown }>;\n onAction: (action: ActionPayload) => void;\n ctaText?: string;\n defaultCtaText?: string;\n onOpenChat?: () => void;\n orientation?: 'horizontal' | 'vertical';\n quickQuestionsAriaLabel?: string;\n}\n\nexport function renderButtonRow(options: ButtonRowOptions): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-qna-buttons';\n container.setAttribute('role', 'group');\n container.setAttribute('aria-label', options.quickQuestionsAriaLabel ?? 'Quick questions');\n\n if (options.orientation === 'vertical') {\n container.style.flexDirection = 'column';\n }\n\n for (const action of options.actions) {\n const button = document.createElement('button');\n button.className = 'gengage-qna-button';\n button.textContent = action.title;\n button.type = 'button';\n button.addEventListener('click', () => {\n const actionPayload: ActionPayload = {\n title: action.title,\n type: action.type,\n };\n if (action.payload !== undefined) actionPayload.payload = action.payload;\n options.onAction(actionPayload);\n });\n container.appendChild(button);\n }\n\n if (options.ctaText || options.onOpenChat) {\n const cta = document.createElement('button');\n cta.className = 'gengage-qna-cta';\n cta.textContent = options.ctaText ?? options.defaultCtaText ?? 'Başka bir şey sor';\n cta.type = 'button';\n cta.addEventListener('click', () => {\n options.onOpenChat?.();\n });\n container.appendChild(cta);\n }\n\n return container;\n}\n","import type { ActionPayload } from '../../common/types.js';\n\nexport interface TextInputOptions {\n placeholders?: string | string[];\n ctaLabel?: string;\n defaultInputPlaceholder?: string;\n askQuestionAriaLabel?: string;\n sendButtonText?: string;\n sendQuestionAriaLabel?: string;\n onSubmit: (action: ActionPayload) => void;\n}\n\nexport function renderTextInput(options: TextInputOptions): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-qna-input-wrapper';\n\n const input = document.createElement('input');\n input.type = 'text';\n input.className = 'gengage-qna-input';\n input.setAttribute('aria-label', options.askQuestionAriaLabel ?? 'Ask a question');\n\n // Rotating placeholders\n const placeholders = Array.isArray(options.placeholders)\n ? options.placeholders\n : options.placeholders\n ? [options.placeholders]\n : [options.defaultInputPlaceholder ?? 'Bir soru sorun...'];\n\n let placeholderIndex = 0;\n input.placeholder = placeholders[0] ?? '';\n\n let rotateTimer: ReturnType<typeof setInterval> | null = null;\n if (placeholders.length > 1) {\n rotateTimer = setInterval(() => {\n input.classList.add('gengage-qna-input--fade');\n setTimeout(() => {\n placeholderIndex = (placeholderIndex + 1) % placeholders.length;\n input.placeholder = placeholders[placeholderIndex] ?? '';\n input.classList.remove('gengage-qna-input--fade');\n }, 180);\n }, 3000);\n }\n\n const sendBtn = document.createElement('button');\n sendBtn.className = 'gengage-qna-send';\n sendBtn.type = 'button';\n sendBtn.textContent = options.ctaLabel ?? options.sendButtonText ?? 'Sor';\n sendBtn.setAttribute('aria-label', options.sendQuestionAriaLabel ?? 'Send question');\n\n const submit = () => {\n const text = input.value.trim();\n if (!text) return;\n options.onSubmit({\n title: text,\n type: 'user_message',\n payload: text,\n });\n input.value = '';\n };\n\n sendBtn.addEventListener('click', submit);\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n submit();\n }\n });\n\n container.appendChild(input);\n container.appendChild(sendBtn);\n\n // Cleanup method\n (container as HTMLElement & { _cleanup?: () => void })._cleanup = () => {\n if (rotateTimer) clearInterval(rotateTimer);\n };\n\n return container;\n}\n","import { renderUISpecWithRegistry } from '../../common/renderer/index.js';\nimport type { UISpecDomRegistry, UISpecDomUnknownRenderer } from '../../common/renderer/index.js';\nimport type { UISpec, UIElement, ActionPayload } from '../../common/types.js';\nimport type { QNAUISpecRenderContext } from '../types.js';\nimport { renderButtonRow } from './ButtonRow.js';\nimport { renderTextInput } from './TextInput.js';\n\nexport type QNAUISpecRegistry = UISpecDomRegistry<QNAUISpecRenderContext>;\n\nfunction toActionPayload(raw: unknown, labelFallback?: string): ActionPayload | null {\n if (!raw || typeof raw !== 'object') return null;\n const obj = raw as Record<string, unknown>;\n const type = obj['type'];\n if (typeof type !== 'string' || type.length === 0) return null;\n\n const titleRaw = obj['title'];\n const payload = obj['payload'];\n const title = typeof titleRaw === 'string' && titleRaw.length > 0 ? titleRaw : labelFallback;\n if (!title) return null;\n\n const action: ActionPayload = { title, type };\n if (payload !== undefined) action.payload = payload;\n return action;\n}\n\nfunction actionPayloadToRowAction(action: ActionPayload): { title: string; type: string; payload?: unknown } {\n const rowAction: { title: string; type: string; payload?: unknown } = {\n title: action.title,\n type: action.type,\n };\n if (action.payload !== undefined) rowAction.payload = action.payload;\n return rowAction;\n}\n\nfunction collectButtonRowActions(element: UIElement, spec: UISpec): ActionPayload[] {\n const actions: ActionPayload[] = [];\n\n const directActions = element.props?.['actions'];\n if (Array.isArray(directActions)) {\n for (const rawAction of directActions) {\n const normalized = toActionPayload(rawAction);\n if (normalized) actions.push(normalized);\n }\n }\n\n const directButtons = element.props?.['buttons'];\n if (Array.isArray(directButtons)) {\n for (const rawButton of directButtons) {\n if (!rawButton || typeof rawButton !== 'object') continue;\n const obj = rawButton as Record<string, unknown>;\n const label = typeof obj['label'] === 'string' ? obj['label'] : undefined;\n const action = toActionPayload(obj['action'], label);\n if (action) actions.push(action);\n }\n }\n\n if (element.children) {\n for (const childId of element.children) {\n const child = spec.elements[childId];\n if (!child || child.type !== 'ActionButton') continue;\n const label = typeof child.props?.['label'] === 'string' ? child.props['label'] : undefined;\n const action = toActionPayload(child.props?.['action'], label);\n if (action) actions.push(action);\n }\n }\n\n // Deduplicate by title — backend may provide same actions via props and children\n const seen = new Set<string>();\n return actions.filter((a) => {\n if (seen.has(a.title)) return false;\n seen.add(a.title);\n return true;\n });\n}\n\nconst DEFAULT_QNA_UI_SPEC_REGISTRY: QNAUISpecRegistry = {\n ButtonRow: ({ element, spec, context }) => {\n const rowActions = collectButtonRowActions(element, spec).map(actionPayloadToRowAction);\n const orientation = element.props?.['orientation'];\n\n const options: import('./ButtonRow.js').ButtonRowOptions = {\n actions: rowActions,\n onAction: context.onAction,\n defaultCtaText: context.i18n.defaultCtaText,\n quickQuestionsAriaLabel: context.i18n.quickQuestionsAriaLabel,\n };\n if (context.onOpenChat !== undefined) options.onOpenChat = context.onOpenChat;\n if (context.ctaText !== undefined) options.ctaText = context.ctaText;\n if (orientation === 'horizontal' || orientation === 'vertical') options.orientation = orientation;\n return renderButtonRow(options);\n },\n\n ActionButtons: ({ element, spec, context }) => {\n const rowActions = collectButtonRowActions(element, spec).map(actionPayloadToRowAction);\n const options: import('./ButtonRow.js').ButtonRowOptions = {\n actions: rowActions,\n onAction: context.onAction,\n defaultCtaText: context.i18n.defaultCtaText,\n quickQuestionsAriaLabel: context.i18n.quickQuestionsAriaLabel,\n };\n if (context.onOpenChat !== undefined) options.onOpenChat = context.onOpenChat;\n if (context.ctaText !== undefined) options.ctaText = context.ctaText;\n return renderButtonRow(options);\n },\n\n ActionButton: ({ element, context }) => {\n const button = document.createElement('button');\n button.className = 'gengage-qna-button';\n button.type = 'button';\n\n const label = element.props?.['label'];\n if (typeof label === 'string') {\n button.textContent = label;\n } else {\n button.textContent = context.i18n.defaultCtaText;\n }\n\n const action = toActionPayload(element.props?.['action'], typeof label === 'string' ? label : undefined);\n if (action) {\n button.addEventListener('click', () => context.onAction(action));\n }\n return button;\n },\n\n TextInput: ({ element, context }) => {\n const placeholder = element.props?.['placeholder'];\n const placeholders =\n typeof placeholder === 'string' || Array.isArray(placeholder) ? placeholder : context.inputPlaceholder;\n const ctaLabel = typeof element.props?.['ctaLabel'] === 'string' ? element.props['ctaLabel'] : context.ctaText;\n\n const options: import('./TextInput.js').TextInputOptions = {\n onSubmit: context.onAction,\n askQuestionAriaLabel: context.i18n.askQuestionAriaLabel,\n defaultInputPlaceholder: context.i18n.defaultInputPlaceholder,\n sendButtonText: context.i18n.sendButton,\n sendQuestionAriaLabel: context.i18n.sendQuestionAriaLabel,\n };\n if (placeholders !== undefined) options.placeholders = placeholders;\n if (ctaLabel !== undefined) options.ctaLabel = ctaLabel;\n return renderTextInput(options);\n },\n\n QuestionHeading: ({ element }) => {\n const heading = document.createElement('h3');\n heading.className = 'gengage-qna-heading';\n const text = element.props?.['text'];\n heading.textContent = typeof text === 'string' ? text : '';\n return heading;\n },\n\n /* ProductCard intentionally omitted — QNA renders only question pills + text input.\n If the backend sends a ProductCard element, the unknownRenderer will render its\n children (if any) or return null. */\n};\n\nexport const defaultQnaUnknownUISpecRenderer: UISpecDomUnknownRenderer<QNAUISpecRenderContext> = ({\n element,\n renderElement,\n}) => {\n if (import.meta.env?.DEV) {\n console.warn(`[gengage:qna] Unknown ui_spec component type: ${element.type}`);\n }\n if (!element.children || element.children.length === 0) {\n return null;\n }\n const wrapper = document.createElement('div');\n for (const childId of element.children) {\n const rendered = renderElement(childId);\n if (rendered) wrapper.appendChild(rendered);\n }\n return wrapper;\n};\n\nexport function createDefaultQnaUISpecRegistry(): QNAUISpecRegistry {\n return { ...DEFAULT_QNA_UI_SPEC_REGISTRY };\n}\n\nexport function renderQnaUISpec(\n spec: UISpec,\n context: QNAUISpecRenderContext,\n registry = DEFAULT_QNA_UI_SPEC_REGISTRY,\n unknownRenderer: UISpecDomUnknownRenderer<QNAUISpecRenderContext> = defaultQnaUnknownUISpecRenderer,\n): HTMLElement {\n return renderUISpecWithRegistry({\n spec,\n context,\n registry,\n containerClassName: 'gengage-qna-uispec',\n unknownRenderer,\n });\n}\n","import type { QNAI18n } from '../types.js';\n\nexport const QNA_I18N_TR: QNAI18n = {\n quickQuestionsAriaLabel: 'Hızlı sorular',\n askQuestionAriaLabel: 'Soru sorun',\n defaultInputPlaceholder: 'Bir soru sorun...',\n sendButton: 'Sor',\n sendQuestionAriaLabel: 'Soruyu gönder',\n defaultCtaText: 'Başka bir şey sor',\n};\n","import type { QNAI18n } from '../types.js';\n\nexport const QNA_I18N_EN: QNAI18n = {\n quickQuestionsAriaLabel: 'Quick questions',\n askQuestionAriaLabel: 'Ask a question',\n defaultInputPlaceholder: 'Ask a question...',\n sendButton: 'Ask',\n sendQuestionAriaLabel: 'Send question',\n defaultCtaText: 'Ask something else',\n};\n","import type { QNAI18n } from '../types.js';\nimport { QNA_I18N_TR } from './tr.js';\nimport { QNA_I18N_EN } from './en.js';\n\nfunction normalizeLocale(locale?: string): string {\n if (!locale) return 'tr';\n return locale.toLowerCase().split('-')[0] ?? 'tr';\n}\n\nexport function resolveQnaLocale(locale?: string): QNAI18n {\n switch (normalizeLocale(locale)) {\n case 'en':\n return QNA_I18N_EN;\n default:\n return QNA_I18N_TR;\n }\n}\n\nexport { QNA_I18N_TR, QNA_I18N_EN };\n","/**\n * QNA widget — json-render catalog definition.\n *\n * Backend endpoint: POST /chat/launcher_action\n * Response format: NDJSON stream, each line a StreamEvent.\n *\n * The backend returns a `ui_spec` event whose elements are typed to the\n * component names defined below. The frontend renders them via ./registry.\n *\n * Customising:\n * Fork this repo and replace ./registry implementations with your own.\n * The catalog schema (component names + prop types) is the API contract\n * with the backend — do not rename components without a backend release.\n */\n\nimport { z } from 'zod';\n\nconst ActionPayloadSchema = z.object({\n title: z.string(),\n type: z.string(),\n payload: z.unknown().optional(),\n});\n\nexport const ActionButtonSchema = z.object({\n label: z.string(),\n action: ActionPayloadSchema,\n variant: z.enum(['primary', 'outline', 'ghost']).optional(),\n});\n\nexport const ButtonRowSchema = z.object({\n orientation: z.enum(['horizontal', 'vertical']).optional(),\n wrap: z.boolean().optional(),\n});\n\nexport const TextInputSchema = z.object({\n placeholder: z.union([z.string(), z.array(z.string())]).optional(),\n ctaLabel: z.string().optional(),\n});\n\nexport const QuestionHeadingSchema = z.object({\n text: z.string(),\n});\n\nexport const qnaCatalog = {\n components: {\n ActionButton: {\n schema: ActionButtonSchema,\n description: 'A single clickable QNA action button.',\n },\n ButtonRow: {\n schema: ButtonRowSchema,\n description: 'Container for a group of QNA action buttons.',\n },\n TextInput: {\n schema: TextInputSchema,\n description: 'Free-text input with rotating placeholder and CTA button.',\n },\n QuestionHeading: {\n schema: QuestionHeadingSchema,\n description: 'A heading displayed above the QNA button group.',\n },\n },\n} as const;\n\nexport type QNACatalog = typeof qnaCatalog;\nexport type QNAComponentName = keyof QNACatalog['components'];\n","/**\n * QNA widget -- public entry point.\n *\n * Renders contextual action buttons (and an optional free-text input) on\n * product or content pages. When a user taps a button, the widget opens\n * the Chat widget with that action pre-loaded.\n *\n * Backend: POST /chat/launcher_action\n * Protocol: NDJSON stream -> json-render UISpec -> ActionButton / ButtonRow / TextInput\n */\n\nimport type { ActionPayload, PageContext, UISpec, UIElement } from '../common/types.js';\nimport type { ChatTransportConfig } from '../common/api-paths.js';\nimport type { UISpecRenderHelpers } from '../common/renderer/index.js';\nimport { mergeUISpecRegistry } from '../common/renderer/index.js';\nimport { BaseWidget } from '../common/widget-base.js';\nimport { dispatch } from '../common/events.js';\nimport { getGlobalErrorMessage } from '../common/global-error-toast.js';\nimport {\n streamStartEvent,\n streamDoneEvent,\n streamErrorEvent,\n widgetHistorySnapshotEvent,\n} from '../common/analytics-events.js';\nimport { fetchLauncherActions } from './api.js';\nimport {\n createDefaultQnaUISpecRegistry,\n defaultQnaUnknownUISpecRenderer,\n renderQnaUISpec,\n} from './components/renderUISpec.js';\nimport type { QNAWidgetConfig, QNAI18n, QNAUISpecRenderContext } from './types.js';\nimport { QNA_I18N_TR, resolveQnaLocale } from './locales/index.js';\n\n// Inline CSS import marker - Vite will bundle this\nimport './components/qna.css';\n\nexport class GengageQNA extends BaseWidget<QNAWidgetConfig> {\n private _abortController: AbortController | null = null;\n private _debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private _contentEl: HTMLElement | null = null;\n private _lastSku: string | undefined;\n private _i18n: QNAI18n = QNA_I18N_TR;\n\n protected async onInit(config: QNAWidgetConfig): Promise<void> {\n this._i18n = this._resolveI18n(config);\n\n this._contentEl = document.createElement('div');\n this._contentEl.className = 'gengage-qna-container';\n this.root.appendChild(this._contentEl);\n\n const sku = config.pageContext?.sku;\n if (sku) {\n this._lastSku = sku;\n await this._fetchAndRender(sku);\n }\n\n this.isVisible = true;\n }\n\n protected onUpdate(context: Partial<PageContext>): void {\n const newSku = context.sku;\n if (!newSku || newSku === this._lastSku) return;\n\n // Debounce rapid SPA navigations\n if (this._debounceTimer) clearTimeout(this._debounceTimer);\n this._debounceTimer = setTimeout(() => {\n this._debounceTimer = null;\n this._lastSku = newSku;\n void this._fetchAndRender(newSku);\n }, 50);\n }\n\n protected onShow(): void {\n if (this._contentEl) {\n this._contentEl.style.opacity = '0';\n this._contentEl.style.transition = 'opacity 0.2s ease-in';\n requestAnimationFrame(() => {\n if (this._contentEl) this._contentEl.style.opacity = '1';\n });\n }\n }\n\n protected onHide(): void {\n // Preserve fetched data for re-show\n }\n\n protected onDestroy(): void {\n this._abort();\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n this._debounceTimer = null;\n }\n if (this._contentEl) {\n // Cleanup text input timers\n const inputWrapper = this._contentEl.querySelector('.gengage-qna-input-wrapper') as\n | (HTMLElement & { _cleanup?: () => void })\n | null;\n inputWrapper?._cleanup?.();\n this._contentEl.remove();\n this._contentEl = null;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Internal\n // ---------------------------------------------------------------------------\n\n private _abort(): void {\n this._abortController?.abort();\n this._abortController = null;\n }\n\n private async _fetchAndRender(sku: string): Promise<void> {\n this._abort();\n this._abortController = new AbortController();\n\n if (!this._contentEl) return;\n this._contentEl.innerHTML = '';\n\n // Show loading dots\n const loading = this._createLoadingIndicator();\n this._contentEl.appendChild(loading);\n\n const transport: ChatTransportConfig = {\n middlewareUrl: this.config.middlewareUrl,\n };\n\n const requestId = crypto.randomUUID();\n const fetchStart = Date.now();\n\n this.track(\n streamStartEvent(this.analyticsContext(), {\n endpoint: 'launcher_action',\n request_id: requestId,\n widget: 'qna',\n }),\n );\n\n try {\n const launcherReq: import('./api.js').LauncherActionRequest = {\n account_id: this.config.accountId,\n session_id: this.config.session?.sessionId ?? '',\n correlation_id: this.config.session?.sessionId ?? '',\n sku,\n locale: this.config.locale ?? 'tr',\n };\n const pageType = this.config.pageContext?.pageType;\n if (pageType !== undefined) launcherReq.page_type = pageType;\n\n const result = await fetchLauncherActions(launcherReq, transport, this._abortController.signal);\n\n this.track(\n streamDoneEvent(this.analyticsContext(), {\n request_id: requestId,\n latency_ms: Date.now() - fetchStart,\n chunk_count: result.actions.length,\n widget: 'qna',\n }),\n );\n\n this.track(\n widgetHistorySnapshotEvent(this.analyticsContext(), {\n message_count: result.actions.length,\n history_ref: requestId,\n redaction_level: 'none',\n widget: 'qna',\n }),\n );\n\n if (!this._contentEl) return;\n this._contentEl.innerHTML = '';\n\n const hasQuestionHeading = this._specIncludesType(result.uiSpecs, 'QuestionHeading');\n\n // Render heading if configured and backend didn't provide one\n if (!hasQuestionHeading && this.config.showStaticQuestion && this.config.staticQuestionText) {\n const heading = document.createElement('h3');\n heading.className = 'gengage-qna-heading';\n heading.textContent = this.config.staticQuestionText;\n this._contentEl.appendChild(heading);\n }\n\n const cfgPlaceholders = this.config.inputPlaceholder;\n const effectivePlaceholders =\n result.actions.length > 0 && cfgPlaceholders === true\n ? result.actions.map((a) => a.title)\n : cfgPlaceholders === true\n ? this._i18n.defaultInputPlaceholder\n : cfgPlaceholders;\n\n const renderContext: QNAUISpecRenderContext = {\n onAction: this._actionHandler,\n i18n: this._i18n,\n };\n // When a standalone TextInput will be rendered (inputPlaceholder is set),\n // its submit button takes over the CTA role — don't duplicate in ButtonRow.\n if (cfgPlaceholders === undefined) {\n renderContext.onOpenChat = this._openChatHandler;\n if (this.config.ctaText !== undefined) renderContext.ctaText = this.config.ctaText;\n }\n if (effectivePlaceholders !== undefined) renderContext.inputPlaceholder = effectivePlaceholders;\n\n const fallbackSpec = this._buildFallbackActionsSpec(result.actions);\n const specsToRender = result.uiSpecs.length > 0 ? result.uiSpecs : [fallbackSpec];\n const nonEmptySpecs = specsToRender.filter((spec) => Object.keys(spec.elements).length > 0);\n\n for (const spec of nonEmptySpecs) {\n const rendered = this._renderUISpec(spec, renderContext);\n this._contentEl.appendChild(rendered);\n }\n\n const shouldRenderStandaloneInput =\n cfgPlaceholders !== undefined && !this._specIncludesType(nonEmptySpecs, 'TextInput');\n if (shouldRenderStandaloneInput) {\n const inputSpec: UISpec = {\n root: 'root',\n elements: {\n root: {\n type: 'TextInput',\n props: {\n placeholder: effectivePlaceholders,\n ctaLabel: this.config.ctaText,\n },\n },\n },\n };\n const renderedInput = this._renderUISpec(inputSpec, renderContext);\n this._contentEl.appendChild(renderedInput);\n }\n } catch (err) {\n if (err instanceof DOMException && err.name === 'AbortError') return;\n\n dispatch('gengage:global:error', {\n source: 'qna',\n code: 'FETCH_ERROR',\n message: getGlobalErrorMessage(this.config.locale),\n });\n\n this.track(\n streamErrorEvent(this.analyticsContext(), {\n request_id: requestId,\n error_code: 'FETCH_ERROR',\n error_message: err instanceof Error ? err.message : String(err),\n widget: 'qna',\n }),\n );\n\n if (import.meta.env?.DEV) {\n console.error('[gengage:qna] Failed to fetch launcher actions:', err);\n }\n }\n }\n\n private _createLoadingIndicator(): HTMLElement {\n const el = document.createElement('div');\n el.className = 'gengage-qna-loading';\n for (let i = 0; i < 3; i++) {\n const dot = document.createElement('div');\n dot.className = 'gengage-qna-loading-dot';\n el.appendChild(dot);\n }\n return el;\n }\n\n private _resolveI18n(config: QNAWidgetConfig): QNAI18n {\n const base = resolveQnaLocale(config.locale);\n return { ...base, ...config.i18n };\n }\n\n private _resolveUISpecRegistry() {\n const baseRegistry = createDefaultQnaUISpecRegistry();\n return mergeUISpecRegistry(baseRegistry, this.config.renderer?.registry);\n }\n\n private _renderUISpec(spec: UISpec, context: QNAUISpecRenderContext): HTMLElement {\n const registry = this._resolveUISpecRegistry();\n const unknownRenderer = this.config.renderer?.unknownRenderer ?? defaultQnaUnknownUISpecRenderer;\n const defaultRender = (inputSpec: UISpec, inputContext: QNAUISpecRenderContext) =>\n renderQnaUISpec(inputSpec, inputContext, registry, unknownRenderer);\n\n const override = this.config.renderer?.renderUISpec;\n if (!override) return defaultRender(spec, context);\n\n const helpers: UISpecRenderHelpers<QNAUISpecRenderContext> = {\n registry,\n unknownRenderer,\n defaultRender,\n };\n return override(spec, context, helpers);\n }\n\n private _specIncludesType(specs: UISpec[], type: string): boolean {\n for (const spec of specs) {\n for (const element of Object.values(spec.elements)) {\n if (element.type === type) return true;\n }\n }\n return false;\n }\n\n private _buildFallbackActionsSpec(actions: Array<{ title: string; type: string; payload?: unknown }>): UISpec {\n if (actions.length === 0) {\n return { root: 'root', elements: {} };\n }\n\n const elements: Record<string, UIElement> = {};\n const childIds: string[] = [];\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i]!;\n const id = `action-${i}`;\n childIds.push(id);\n elements[id] = {\n type: 'ActionButton',\n props: {\n label: action.title,\n action: {\n title: action.title,\n type: action.type,\n payload: action.payload,\n },\n },\n };\n }\n elements['root'] = {\n type: 'ButtonRow',\n children: childIds,\n };\n return {\n root: 'root',\n elements,\n };\n }\n\n private _handleAction(action: ActionPayload): void {\n this.config.onActionSelected?.(action);\n dispatch('gengage:qna:action', action);\n }\n\n private _handleOpenChat(): void {\n this.config.onOpenChat?.();\n dispatch('gengage:qna:open-chat', {});\n }\n\n _actionHandler = this._handleAction.bind(this);\n _openChatHandler = this._handleOpenChat.bind(this);\n}\n\nexport function createQNAWidget(): GengageQNA {\n return new GengageQNA();\n}\n\nexport type { QNAWidgetConfig, QNAUIComponents, QNAI18n, QNAUISpecRenderContext, QNARendererConfig } from './types.js';\nexport {\n renderQnaUISpec,\n createDefaultQnaUISpecRegistry,\n defaultQnaUnknownUISpecRenderer,\n} from './components/renderUISpec.js';\nexport type { QNAUISpecRegistry } from './components/renderUISpec.js';\nexport { qnaCatalog } from './catalog.js';\nexport type { QNACatalog, QNAComponentName } from './catalog.js';\n"],"names":["fetchLauncherActions","request","transport","signal","url","buildChatEndpointUrl","result","fetchInit","response","streamOpts","event","normalized","adaptV1Event","el","action","consumeStream","renderButtonRow","options","container","button","actionPayload","cta","renderTextInput","input","placeholders","placeholderIndex","rotateTimer","sendBtn","submit","text","e","toActionPayload","raw","labelFallback","obj","type","titleRaw","payload","title","actionPayloadToRowAction","rowAction","collectButtonRowActions","element","spec","actions","directActions","rawAction","directButtons","rawButton","label","childId","child","seen","DEFAULT_QNA_UI_SPEC_REGISTRY","context","rowActions","orientation","placeholder","ctaLabel","heading","defaultQnaUnknownUISpecRenderer","renderElement","wrapper","rendered","createDefaultQnaUISpecRegistry","renderQnaUISpec","registry","unknownRenderer","renderUISpecWithRegistry","QNA_I18N_TR","QNA_I18N_EN","normalizeLocale","locale","resolveQnaLocale","ActionPayloadSchema","z.object","z.string","z.unknown","ActionButtonSchema","z.enum","ButtonRowSchema","z.boolean","TextInputSchema","z.union","z.array","QuestionHeadingSchema","qnaCatalog","GengageQNA","BaseWidget","config","sku","newSku","loading","requestId","fetchStart","streamStartEvent","launcherReq","pageType","streamDoneEvent","widgetHistorySnapshotEvent","cfgPlaceholders","effectivePlaceholders","a","renderContext","fallbackSpec","nonEmptySpecs","inputSpec","renderedInput","err","dispatch","getGlobalErrorMessage","streamErrorEvent","i","dot","baseRegistry","mergeUISpecRegistry","defaultRender","inputContext","override","specs","elements","childIds","id","createQNAWidget"],"mappings":"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"}