@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.
- package/LICENSE +61 -0
- package/README.md +232 -0
- package/dist/assistant-fe.css +1 -0
- package/dist/chat/api.d.ts +87 -0
- package/dist/chat/api.d.ts.map +1 -0
- package/dist/chat/attachment-utils.d.ts +10 -0
- package/dist/chat/attachment-utils.d.ts.map +1 -0
- package/dist/chat/catalog.d.ts +1114 -0
- package/dist/chat/catalog.d.ts.map +1 -0
- package/dist/chat/components/AIGroupingCards.d.ts +4 -0
- package/dist/chat/components/AIGroupingCards.d.ts.map +1 -0
- package/dist/chat/components/AISuggestedSearchCards.d.ts +4 -0
- package/dist/chat/components/AISuggestedSearchCards.d.ts.map +1 -0
- package/dist/chat/components/AITopPicks.d.ts +4 -0
- package/dist/chat/components/AITopPicks.d.ts.map +1 -0
- package/dist/chat/components/CategoriesContainer.d.ts +4 -0
- package/dist/chat/components/CategoriesContainer.d.ts.map +1 -0
- package/dist/chat/components/ChatDrawer.d.ts +140 -0
- package/dist/chat/components/ChatDrawer.d.ts.map +1 -0
- package/dist/chat/components/ChoicePrompter.d.ts +16 -0
- package/dist/chat/components/ChoicePrompter.d.ts.map +1 -0
- package/dist/chat/components/ComparisonTable.d.ts +47 -0
- package/dist/chat/components/ComparisonTable.d.ts.map +1 -0
- package/dist/chat/components/FloatingComparisonButton.d.ts +11 -0
- package/dist/chat/components/FloatingComparisonButton.d.ts.map +1 -0
- package/dist/chat/components/GroundingReviewCard.d.ts +4 -0
- package/dist/chat/components/GroundingReviewCard.d.ts.map +1 -0
- package/dist/chat/components/KvkkBanner.d.ts +6 -0
- package/dist/chat/components/KvkkBanner.d.ts.map +1 -0
- package/dist/chat/components/Launcher.d.ts +25 -0
- package/dist/chat/components/Launcher.d.ts.map +1 -0
- package/dist/chat/components/PanelTopBar.d.ts +20 -0
- package/dist/chat/components/PanelTopBar.d.ts.map +1 -0
- package/dist/chat/components/ProactivePopup.d.ts +11 -0
- package/dist/chat/components/ProactivePopup.d.ts.map +1 -0
- package/dist/chat/components/ProsAndCons.d.ts +9 -0
- package/dist/chat/components/ProsAndCons.d.ts.map +1 -0
- package/dist/chat/components/ReviewHighlights.d.ts +3 -0
- package/dist/chat/components/ReviewHighlights.d.ts.map +1 -0
- package/dist/chat/components/ThumbnailsColumn.d.ts +23 -0
- package/dist/chat/components/ThumbnailsColumn.d.ts.map +1 -0
- package/dist/chat/components/actionClassifier.d.ts +13 -0
- package/dist/chat/components/actionClassifier.d.ts.map +1 -0
- package/dist/chat/components/productMentionLinker.d.ts +26 -0
- package/dist/chat/components/productMentionLinker.d.ts.map +1 -0
- package/dist/chat/components/renderUISpec.d.ts +15 -0
- package/dist/chat/components/renderUISpec.d.ts.map +1 -0
- package/dist/chat/components/typewriter.d.ts +25 -0
- package/dist/chat/components/typewriter.d.ts.map +1 -0
- package/dist/chat/extendedModeManager.d.ts +33 -0
- package/dist/chat/extendedModeManager.d.ts.map +1 -0
- package/dist/chat/index.d.ts +192 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/locales/en.d.ts +3 -0
- package/dist/chat/locales/en.d.ts.map +1 -0
- package/dist/chat/locales/index.d.ts +6 -0
- package/dist/chat/locales/index.d.ts.map +1 -0
- package/dist/chat/locales/tr.d.ts +3 -0
- package/dist/chat/locales/tr.d.ts.map +1 -0
- package/dist/chat/types.d.ts +212 -0
- package/dist/chat/types.d.ts.map +1 -0
- package/dist/chat.cjs +2 -0
- package/dist/chat.cjs.map +1 -0
- package/dist/chat.iife.js +59 -0
- package/dist/chat.iife.js.map +1 -0
- package/dist/chat.js +11 -0
- package/dist/chat.js.map +1 -0
- package/dist/common/action-router.d.ts +30 -0
- package/dist/common/action-router.d.ts.map +1 -0
- package/dist/common/activity-tracker.d.ts +38 -0
- package/dist/common/activity-tracker.d.ts.map +1 -0
- package/dist/common/analytics-events.d.ts +90 -0
- package/dist/common/analytics-events.d.ts.map +1 -0
- package/dist/common/analytics.d.ts +58 -0
- package/dist/common/analytics.d.ts.map +1 -0
- package/dist/common/api-paths.d.ts +14 -0
- package/dist/common/api-paths.d.ts.map +1 -0
- package/dist/common/client.d.ts +20 -0
- package/dist/common/client.d.ts.map +1 -0
- package/dist/common/communication-bridge.d.ts +51 -0
- package/dist/common/communication-bridge.d.ts.map +1 -0
- package/dist/common/config-schema.d.ts +241 -0
- package/dist/common/config-schema.d.ts.map +1 -0
- package/dist/common/context.d.ts +28 -0
- package/dist/common/context.d.ts.map +1 -0
- package/dist/common/customization-factories.d.ts +63 -0
- package/dist/common/customization-factories.d.ts.map +1 -0
- package/dist/common/events.d.ts +47 -0
- package/dist/common/events.d.ts.map +1 -0
- package/dist/common/global-error-toast.d.ts +6 -0
- package/dist/common/global-error-toast.d.ts.map +1 -0
- package/dist/common/index.d.ts +36 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/indexed-db.d.ts +74 -0
- package/dist/common/indexed-db.d.ts.map +1 -0
- package/dist/common/overlay.d.ts +64 -0
- package/dist/common/overlay.d.ts.map +1 -0
- package/dist/common/preflight.d.ts +12 -0
- package/dist/common/preflight.d.ts.map +1 -0
- package/dist/common/renderer/dom.d.ts +4 -0
- package/dist/common/renderer/dom.d.ts.map +1 -0
- package/dist/common/renderer/index.d.ts +5 -0
- package/dist/common/renderer/index.d.ts.map +1 -0
- package/dist/common/renderer/overrides.d.ts +24 -0
- package/dist/common/renderer/overrides.d.ts.map +1 -0
- package/dist/common/renderer/registry.d.ts +3 -0
- package/dist/common/renderer/registry.d.ts.map +1 -0
- package/dist/common/renderer/types.d.ts +20 -0
- package/dist/common/renderer/types.d.ts.map +1 -0
- package/dist/common/safe-html.d.ts +19 -0
- package/dist/common/safe-html.d.ts.map +1 -0
- package/dist/common/streaming.d.ts +32 -0
- package/dist/common/streaming.d.ts.map +1 -0
- package/dist/common/theme-utils.d.ts +16 -0
- package/dist/common/theme-utils.d.ts.map +1 -0
- package/dist/common/types.d.ts +298 -0
- package/dist/common/types.d.ts.map +1 -0
- package/dist/common/ui-theme.d.ts +10 -0
- package/dist/common/ui-theme.d.ts.map +1 -0
- package/dist/common/uuidv7.d.ts +8 -0
- package/dist/common/uuidv7.d.ts.map +1 -0
- package/dist/common/v1-protocol-adapter.d.ts +66 -0
- package/dist/common/v1-protocol-adapter.d.ts.map +1 -0
- package/dist/common/widget-base.d.ts +75 -0
- package/dist/common/widget-base.d.ts.map +1 -0
- package/dist/common.cjs +2 -0
- package/dist/common.cjs.map +1 -0
- package/dist/common.js +584 -0
- package/dist/common.js.map +1 -0
- package/dist/index-CFA70IGF.js +3626 -0
- package/dist/index-CFA70IGF.js.map +1 -0
- package/dist/index-Dfl89zpe.cjs +13 -0
- package/dist/index-Dfl89zpe.cjs.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/qna/api.d.ts +22 -0
- package/dist/qna/api.d.ts.map +1 -0
- package/dist/qna/catalog.d.ts +140 -0
- package/dist/qna/catalog.d.ts.map +1 -0
- package/dist/qna/components/ButtonRow.d.ts +16 -0
- package/dist/qna/components/ButtonRow.d.ts.map +1 -0
- package/dist/qna/components/TextInput.d.ts +12 -0
- package/dist/qna/components/TextInput.d.ts.map +1 -0
- package/dist/qna/components/renderUISpec.d.ts +8 -0
- package/dist/qna/components/renderUISpec.d.ts.map +1 -0
- package/dist/qna/index.d.ts +34 -0
- package/dist/qna/index.d.ts.map +1 -0
- package/dist/qna/locales/en.d.ts +3 -0
- package/dist/qna/locales/en.d.ts.map +1 -0
- package/dist/qna/locales/index.d.ts +6 -0
- package/dist/qna/locales/index.d.ts.map +1 -0
- package/dist/qna/locales/tr.d.ts +3 -0
- package/dist/qna/locales/tr.d.ts.map +1 -0
- package/dist/qna/types.d.ts +62 -0
- package/dist/qna/types.d.ts.map +1 -0
- package/dist/qna.cjs +2 -0
- package/dist/qna.cjs.map +1 -0
- package/dist/qna.css +1 -0
- package/dist/qna.iife.js +48 -0
- package/dist/qna.iife.js.map +1 -0
- package/dist/qna.js +435 -0
- package/dist/qna.js.map +1 -0
- package/dist/simrel/api.d.ts +26 -0
- package/dist/simrel/api.d.ts.map +1 -0
- package/dist/simrel/catalog.d.ts +319 -0
- package/dist/simrel/catalog.d.ts.map +1 -0
- package/dist/simrel/components/GroupTabs.d.ts +17 -0
- package/dist/simrel/components/GroupTabs.d.ts.map +1 -0
- package/dist/simrel/components/ProductCard.d.ts +17 -0
- package/dist/simrel/components/ProductCard.d.ts.map +1 -0
- package/dist/simrel/components/ProductGrid.d.ts +17 -0
- package/dist/simrel/components/ProductGrid.d.ts.map +1 -0
- package/dist/simrel/components/renderUISpec.d.ts +8 -0
- package/dist/simrel/components/renderUISpec.d.ts.map +1 -0
- package/dist/simrel/index.d.ts +36 -0
- package/dist/simrel/index.d.ts.map +1 -0
- package/dist/simrel/locales/en.d.ts +3 -0
- package/dist/simrel/locales/en.d.ts.map +1 -0
- package/dist/simrel/locales/index.d.ts +6 -0
- package/dist/simrel/locales/index.d.ts.map +1 -0
- package/dist/simrel/locales/tr.d.ts +3 -0
- package/dist/simrel/locales/tr.d.ts.map +1 -0
- package/dist/simrel/types.d.ts +111 -0
- package/dist/simrel/types.d.ts.map +1 -0
- package/dist/simrel.cjs +2 -0
- package/dist/simrel.cjs.map +1 -0
- package/dist/simrel.css +1 -0
- package/dist/simrel.iife.js +48 -0
- package/dist/simrel.iife.js.map +1 -0
- package/dist/simrel.js +620 -0
- package/dist/simrel.js.map +1 -0
- package/dist/types-CeON7iBO.cjs +48 -0
- package/dist/types-CeON7iBO.cjs.map +1 -0
- package/dist/types-yxW8WA7u.js +4132 -0
- package/dist/types-yxW8WA7u.js.map +1 -0
- package/package.json +100 -0
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core shared types for all Gengage widgets.
|
|
3
|
+
*
|
|
4
|
+
* These types define the public contract between:
|
|
5
|
+
* - The host page and widgets (PageContext, WidgetConfig)
|
|
6
|
+
* - The backend wire protocol and widgets (StreamEvent, UISpec)
|
|
7
|
+
* - Widgets and each other (GengageEvent, SessionContext)
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Describes the current page's context.
|
|
11
|
+
* Widgets use this to tailor their behaviour (e.g. show/hide, fetch the right SKU).
|
|
12
|
+
*
|
|
13
|
+
* CSR/SPA: call widget.update(context) on every navigation.
|
|
14
|
+
* SSR: set window.gengage.pageContext before loading widget scripts.
|
|
15
|
+
*/
|
|
16
|
+
export interface PageContext {
|
|
17
|
+
/** The current page type. Determines which features activate. */
|
|
18
|
+
pageType: 'pdp' | 'plp' | 'home' | 'cart' | 'search' | 'other';
|
|
19
|
+
/** Product SKU — required on PDP pages for QNA and Similar Products. */
|
|
20
|
+
sku?: string;
|
|
21
|
+
/** Product price, formatted as a string (e.g. "149.99"). */
|
|
22
|
+
price?: string;
|
|
23
|
+
/** Category path array, from broad to specific (e.g. ["Electronics", "TVs"]). */
|
|
24
|
+
categoryTree?: string[];
|
|
25
|
+
/** Raw page URL (defaults to window.location.href). */
|
|
26
|
+
url?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Arbitrary key/value metadata the host page wants to pass through to the
|
|
29
|
+
* backend for analytics or personalisation purposes.
|
|
30
|
+
*/
|
|
31
|
+
extra?: Record<string, unknown>;
|
|
32
|
+
}
|
|
33
|
+
export interface SessionContext {
|
|
34
|
+
/**
|
|
35
|
+
* A UUID created once per browser session, shared across all widgets.
|
|
36
|
+
* Used as correlation_id in analytics and backend logging.
|
|
37
|
+
*
|
|
38
|
+
* Bootstrap:
|
|
39
|
+
* window.__gengageSessionId =
|
|
40
|
+
* window.__gengageSessionId
|
|
41
|
+
* ?? sessionStorage.getItem('gengage_session_id')
|
|
42
|
+
* ?? crypto.randomUUID();
|
|
43
|
+
* sessionStorage.setItem('gengage_session_id', window.__gengageSessionId);
|
|
44
|
+
*/
|
|
45
|
+
sessionId: string;
|
|
46
|
+
/** Opaque user identifier set by the host site's auth system. */
|
|
47
|
+
userId?: string;
|
|
48
|
+
/** View/visit identifier (e.g. from analytics platform). */
|
|
49
|
+
viewId?: string;
|
|
50
|
+
}
|
|
51
|
+
export interface BaseWidgetConfig {
|
|
52
|
+
/** Your Gengage account identifier. */
|
|
53
|
+
accountId: string;
|
|
54
|
+
/** Backend middleware URL — must be explicitly provided, no default. */
|
|
55
|
+
middlewareUrl: string;
|
|
56
|
+
/** Session context for analytics correlation. */
|
|
57
|
+
session?: SessionContext;
|
|
58
|
+
/** Initial page context. Can be updated later via widget.update(). */
|
|
59
|
+
pageContext?: PageContext;
|
|
60
|
+
/** Where to mount the widget's root element. */
|
|
61
|
+
mountTarget?: HTMLElement | string;
|
|
62
|
+
/**
|
|
63
|
+
* Theme tokens applied as CSS custom properties on the widget root.
|
|
64
|
+
* Consumers can override these in their own CSS; these are just the defaults.
|
|
65
|
+
*/
|
|
66
|
+
theme?: WidgetTheme;
|
|
67
|
+
/**
|
|
68
|
+
* Analytics client instance. When provided, widgets emit stream lifecycle,
|
|
69
|
+
* metering, and commerce attribution events automatically.
|
|
70
|
+
*/
|
|
71
|
+
analyticsClient?: import('./analytics.js').AnalyticsClient;
|
|
72
|
+
}
|
|
73
|
+
export interface WidgetTheme {
|
|
74
|
+
primaryColor?: string;
|
|
75
|
+
primaryForeground?: string;
|
|
76
|
+
backgroundColor?: string;
|
|
77
|
+
foregroundColor?: string;
|
|
78
|
+
borderRadius?: string;
|
|
79
|
+
fontFamily?: string;
|
|
80
|
+
fontSize?: string;
|
|
81
|
+
/** Arbitrary additional CSS custom properties */
|
|
82
|
+
[cssVar: string]: string | undefined;
|
|
83
|
+
}
|
|
84
|
+
export interface GengageWidget<TConfig extends BaseWidgetConfig = BaseWidgetConfig> {
|
|
85
|
+
/** Mount the widget and fetch initial data. Must be called once. */
|
|
86
|
+
init(config: TConfig): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Update page context after SPA navigation or page state changes.
|
|
89
|
+
* Widgets re-fetch relevant data (e.g. QNA buttons for new SKU).
|
|
90
|
+
*/
|
|
91
|
+
update(context: Partial<PageContext>): void;
|
|
92
|
+
/** Make the widget visible. No-op if already visible. */
|
|
93
|
+
show(): void;
|
|
94
|
+
/** Hide the widget. Preserves state (conversation history, etc.). */
|
|
95
|
+
hide(): void;
|
|
96
|
+
/** Fully remove the widget from the DOM and release all resources. */
|
|
97
|
+
destroy(): void;
|
|
98
|
+
/**
|
|
99
|
+
* Subscribe to widget events.
|
|
100
|
+
* Returns an unsubscribe function.
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* const off = widget.on('open', () => console.log('chat opened'));
|
|
104
|
+
* // later:
|
|
105
|
+
* off();
|
|
106
|
+
*/
|
|
107
|
+
on(event: string, handler: (...args: unknown[]) => void): () => void;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Every event sent over the stream has a `type` discriminant.
|
|
111
|
+
* Events are newline-delimited JSON (NDJSON) over a streaming HTTP response.
|
|
112
|
+
*/
|
|
113
|
+
export type StreamEvent = StreamEventMetadata | StreamEventTextChunk | StreamEventUISpec | StreamEventAction | StreamEventError | StreamEventDone;
|
|
114
|
+
/** First event in every stream — session and model info. */
|
|
115
|
+
export interface StreamEventMetadata {
|
|
116
|
+
type: 'metadata';
|
|
117
|
+
sessionId: string;
|
|
118
|
+
model: string;
|
|
119
|
+
/** Any extra server-side metadata the backend wants to forward. */
|
|
120
|
+
meta?: Record<string, unknown>;
|
|
121
|
+
}
|
|
122
|
+
/** A chunk of assistant text (streamed word-by-word or sentence-by-sentence). */
|
|
123
|
+
export interface StreamEventTextChunk {
|
|
124
|
+
type: 'text_chunk';
|
|
125
|
+
content: string;
|
|
126
|
+
/** If true this chunk closes the current text block. */
|
|
127
|
+
final?: boolean;
|
|
128
|
+
/** Product mentions referenced in the text (for in-text product linking). */
|
|
129
|
+
productMentions?: Array<{
|
|
130
|
+
sku: string;
|
|
131
|
+
short_name: string;
|
|
132
|
+
}>;
|
|
133
|
+
/** Map from SKU to full product data (for enriching product mention links). */
|
|
134
|
+
skuToProductItem?: Record<string, Record<string, unknown>>;
|
|
135
|
+
/** Current conversation mode from outputText (e.g., 'product_search'). */
|
|
136
|
+
conversationMode?: string;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* A json-render UI spec sent from the backend.
|
|
140
|
+
* The frontend renders it using the active widget registry.
|
|
141
|
+
* Backend can send UI specs mid-stream to show product cards,
|
|
142
|
+
* action buttons, or any structured component alongside text.
|
|
143
|
+
*/
|
|
144
|
+
export interface StreamEventUISpec {
|
|
145
|
+
type: 'ui_spec';
|
|
146
|
+
/** Which widget catalog this spec targets. */
|
|
147
|
+
widget: 'chat' | 'qna' | 'simrel';
|
|
148
|
+
/** The json-render spec: root + elements map. */
|
|
149
|
+
spec: UISpec;
|
|
150
|
+
/** Routing hint for two-panel layout: 'panel' = detail/results panel, default = chat thread. */
|
|
151
|
+
panelHint?: 'panel';
|
|
152
|
+
}
|
|
153
|
+
/** A discrete action the backend instructs the widget to perform. */
|
|
154
|
+
export interface StreamEventAction {
|
|
155
|
+
type: 'action';
|
|
156
|
+
action: {
|
|
157
|
+
kind: 'open_chat';
|
|
158
|
+
payload?: ActionPayload;
|
|
159
|
+
} | {
|
|
160
|
+
kind: 'navigate';
|
|
161
|
+
url: string;
|
|
162
|
+
newTab?: boolean;
|
|
163
|
+
} | {
|
|
164
|
+
kind: 'save_session';
|
|
165
|
+
sessionId: string;
|
|
166
|
+
sku: string;
|
|
167
|
+
} | {
|
|
168
|
+
kind: 'add_to_cart';
|
|
169
|
+
sku: string;
|
|
170
|
+
quantity: number;
|
|
171
|
+
cartCode: string;
|
|
172
|
+
} | {
|
|
173
|
+
kind: 'script_call';
|
|
174
|
+
name: string;
|
|
175
|
+
payload?: Record<string, unknown>;
|
|
176
|
+
} | {
|
|
177
|
+
kind: string;
|
|
178
|
+
[key: string]: unknown;
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
export interface StreamEventError {
|
|
182
|
+
type: 'error';
|
|
183
|
+
code: string;
|
|
184
|
+
message: string;
|
|
185
|
+
}
|
|
186
|
+
export interface StreamEventDone {
|
|
187
|
+
type: 'done';
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* A json-render spec is a flat map of element IDs to element definitions
|
|
191
|
+
* plus a root element ID.
|
|
192
|
+
*
|
|
193
|
+
* See: https://github.com/vercel-labs/json-render
|
|
194
|
+
*/
|
|
195
|
+
export interface UISpec {
|
|
196
|
+
root: string;
|
|
197
|
+
elements: Record<string, UIElement>;
|
|
198
|
+
}
|
|
199
|
+
export interface UIElement {
|
|
200
|
+
type: string;
|
|
201
|
+
props?: Record<string, unknown>;
|
|
202
|
+
children?: string[];
|
|
203
|
+
}
|
|
204
|
+
export interface ActionPayload {
|
|
205
|
+
/** Display label shown to the user. */
|
|
206
|
+
title: string;
|
|
207
|
+
/** Backend action type identifier. */
|
|
208
|
+
type: string;
|
|
209
|
+
/** Arbitrary action data passed to the backend as-is. */
|
|
210
|
+
payload?: unknown;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* All inter-widget and host-page events follow this naming convention:
|
|
214
|
+
* gengage:<widget>:<action>
|
|
215
|
+
*
|
|
216
|
+
* Widgets dispatch these; host pages and other widgets listen.
|
|
217
|
+
*/
|
|
218
|
+
export type GengageEventName = 'gengage:chat:open' | 'gengage:chat:close' | 'gengage:chat:ready' | 'gengage:chat:metadata' | 'gengage:chat:voice' | 'gengage:chat:redirect' | 'gengage:chat:script-call' | 'gengage:chat:add-to-cart' | 'gengage:qna:action' | 'gengage:qna:open-chat' | 'gengage:similar:product-click' | 'gengage:similar:add-to-cart' | 'gengage:global:error' | 'gengage:checkout:start' | 'gengage:checkout:complete' | 'gengage:context:update';
|
|
219
|
+
export type GengageEventDetailMap = {
|
|
220
|
+
'gengage:chat:open': {
|
|
221
|
+
state?: 'full' | 'half';
|
|
222
|
+
};
|
|
223
|
+
'gengage:chat:close': Record<string, never>;
|
|
224
|
+
'gengage:chat:ready': Record<string, never>;
|
|
225
|
+
'gengage:chat:metadata': {
|
|
226
|
+
payload: Record<string, unknown>;
|
|
227
|
+
};
|
|
228
|
+
'gengage:chat:voice': {
|
|
229
|
+
payload: unknown;
|
|
230
|
+
};
|
|
231
|
+
'gengage:chat:redirect': {
|
|
232
|
+
target: unknown;
|
|
233
|
+
payload: unknown;
|
|
234
|
+
};
|
|
235
|
+
'gengage:chat:script-call': {
|
|
236
|
+
name: string;
|
|
237
|
+
payload?: Record<string, unknown>;
|
|
238
|
+
};
|
|
239
|
+
'gengage:chat:add-to-cart': {
|
|
240
|
+
sku: string;
|
|
241
|
+
cartCode: string;
|
|
242
|
+
quantity: number;
|
|
243
|
+
sessionId: string | null;
|
|
244
|
+
};
|
|
245
|
+
'gengage:qna:action': ActionPayload;
|
|
246
|
+
'gengage:qna:open-chat': Record<string, never>;
|
|
247
|
+
'gengage:similar:product-click': {
|
|
248
|
+
sku: string;
|
|
249
|
+
url: string;
|
|
250
|
+
sessionId: string | null;
|
|
251
|
+
};
|
|
252
|
+
'gengage:similar:add-to-cart': {
|
|
253
|
+
sku: string;
|
|
254
|
+
quantity: number;
|
|
255
|
+
cartCode: string;
|
|
256
|
+
};
|
|
257
|
+
'gengage:global:error': {
|
|
258
|
+
source: 'chat' | 'qna' | 'simrel' | 'sdk';
|
|
259
|
+
message: string;
|
|
260
|
+
code?: string;
|
|
261
|
+
durationMs?: number;
|
|
262
|
+
};
|
|
263
|
+
'gengage:checkout:start': {
|
|
264
|
+
attribution_source: 'chat' | 'qna' | 'simrel';
|
|
265
|
+
attribution_action_id: string;
|
|
266
|
+
cart_value: number;
|
|
267
|
+
currency: string;
|
|
268
|
+
line_items: number;
|
|
269
|
+
};
|
|
270
|
+
'gengage:checkout:complete': {
|
|
271
|
+
attribution_source: 'chat' | 'qna' | 'simrel';
|
|
272
|
+
attribution_action_id: string;
|
|
273
|
+
cart_value: number;
|
|
274
|
+
currency: string;
|
|
275
|
+
line_items: number;
|
|
276
|
+
};
|
|
277
|
+
'gengage:context:update': Partial<PageContext>;
|
|
278
|
+
};
|
|
279
|
+
declare global {
|
|
280
|
+
interface Window {
|
|
281
|
+
/**
|
|
282
|
+
* Set this before loading widget scripts for SSR / static pages.
|
|
283
|
+
* CSR/SPA: call widget.update() instead.
|
|
284
|
+
*/
|
|
285
|
+
gengage?: {
|
|
286
|
+
pageContext?: PageContext;
|
|
287
|
+
/** Shared session ID — set once at page bootstrap. */
|
|
288
|
+
sessionId?: string;
|
|
289
|
+
/** Chat widget public API, available after chat widget init(). */
|
|
290
|
+
chat?: import('./widget-base').ChatPublicAPI;
|
|
291
|
+
/** Overlay orchestration API, available after initOverlayWidgets(). */
|
|
292
|
+
overlay?: import('./overlay.js').OverlayWidgetsController;
|
|
293
|
+
};
|
|
294
|
+
/** @internal Legacy compat — do not use in new integrations. */
|
|
295
|
+
__gengageSessionId?: string;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/common/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { WidgetTheme } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Shared SDK-wide visual tokens.
|
|
4
|
+
*
|
|
5
|
+
* Applied to every widget root by default so account customizations only
|
|
6
|
+
* override what they need.
|
|
7
|
+
*/
|
|
8
|
+
export declare const DEFAULT_WIDGET_THEME_TOKENS: WidgetTheme;
|
|
9
|
+
export declare function withDefaultWidgetTheme(theme?: WidgetTheme): WidgetTheme;
|
|
10
|
+
//# sourceMappingURL=ui-theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-theme.d.ts","sourceRoot":"","sources":["../../src/common/ui-theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,EAAE,WAezC,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,KAAK,CAAC,EAAE,WAAW,GAAG,WAAW,CAKvE"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zero-dependency UUIDv7 generator.
|
|
3
|
+
*
|
|
4
|
+
* 48-bit Unix-ms timestamp + random bits, version nibble 0x7, variant 0b10.
|
|
5
|
+
* Lexicographically sortable — critical for thread ordering (threadA < threadB).
|
|
6
|
+
*/
|
|
7
|
+
export declare function uuidv7(): string;
|
|
8
|
+
//# sourceMappingURL=uuidv7.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuidv7.d.ts","sourceRoot":"","sources":["../../src/common/uuidv7.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wBAAgB,MAAM,IAAI,MAAM,CAqB/B"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { StreamEvent } from './types.js';
|
|
2
|
+
export interface V1Product {
|
|
3
|
+
sku: string;
|
|
4
|
+
name: string;
|
|
5
|
+
brand?: string;
|
|
6
|
+
images?: string[];
|
|
7
|
+
price?: number;
|
|
8
|
+
price_discounted?: number;
|
|
9
|
+
price_currency?: string;
|
|
10
|
+
discount_reason?: string;
|
|
11
|
+
url?: string;
|
|
12
|
+
rating?: number;
|
|
13
|
+
review_count?: number;
|
|
14
|
+
cart_code?: string;
|
|
15
|
+
in_stock?: boolean;
|
|
16
|
+
category_ids?: string[];
|
|
17
|
+
category_names?: string[];
|
|
18
|
+
variants?: Array<Record<string, unknown>>;
|
|
19
|
+
facet_hits?: Record<string, unknown> | null;
|
|
20
|
+
promotions?: string[];
|
|
21
|
+
}
|
|
22
|
+
export declare function adaptV1Event(raw: Record<string, unknown>): StreamEvent | null;
|
|
23
|
+
export interface NormalizedProduct {
|
|
24
|
+
sku: string;
|
|
25
|
+
name: string;
|
|
26
|
+
imageUrl?: string;
|
|
27
|
+
images?: string[];
|
|
28
|
+
price?: string;
|
|
29
|
+
originalPrice?: string;
|
|
30
|
+
discountPercent?: number;
|
|
31
|
+
url: string;
|
|
32
|
+
brand?: string;
|
|
33
|
+
rating?: number;
|
|
34
|
+
reviewCount?: number;
|
|
35
|
+
cartCode?: string;
|
|
36
|
+
inStock?: boolean;
|
|
37
|
+
variants?: Array<Record<string, unknown>>;
|
|
38
|
+
discountReason?: string;
|
|
39
|
+
promotions?: string[];
|
|
40
|
+
}
|
|
41
|
+
export declare function productToNormalized(p: V1Product): NormalizedProduct;
|
|
42
|
+
export interface SimilarProductsJsonResponse {
|
|
43
|
+
results: V1Product[];
|
|
44
|
+
count: number;
|
|
45
|
+
source_sku?: string;
|
|
46
|
+
}
|
|
47
|
+
export interface ProductGroupingsJsonResponse {
|
|
48
|
+
intro_message?: string;
|
|
49
|
+
product_groupings: Array<{
|
|
50
|
+
name: string;
|
|
51
|
+
description?: string;
|
|
52
|
+
highlight?: string;
|
|
53
|
+
repr_sku?: string;
|
|
54
|
+
repr_image?: string;
|
|
55
|
+
group_skus?: string[];
|
|
56
|
+
group_products?: V1Product[];
|
|
57
|
+
}>;
|
|
58
|
+
count: number;
|
|
59
|
+
}
|
|
60
|
+
export declare function normalizeSimilarProductsResponse(json: SimilarProductsJsonResponse): NormalizedProduct[];
|
|
61
|
+
export declare function normalizeProductGroupingsResponse(json: ProductGroupingsJsonResponse): Array<{
|
|
62
|
+
name: string;
|
|
63
|
+
highlight?: string;
|
|
64
|
+
products: NormalizedProduct[];
|
|
65
|
+
}>;
|
|
66
|
+
//# sourceMappingURL=v1-protocol-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v1-protocol-adapter.d.ts","sourceRoot":"","sources":["../../src/common/v1-protocol-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,WAAW,EAQZ,MAAM,YAAY,CAAC;AAkDpB,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAsSD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,GAAG,IAAI,CAkF7E;AAqhCD,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,SAAS,GAAG,iBAAiB,CAmCnE;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,KAAK,CAAC;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC;KAC9B,CAAC,CAAC;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,2BAA2B,GAAG,iBAAiB,EAAE,CAEvG;AAED,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,4BAA4B,GAAG,KAAK,CAAC;IAC3F,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B,CAAC,CASD"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { BaseWidgetConfig, GengageWidget, PageContext } from './types.js';
|
|
2
|
+
import { AnalyticsInput } from './analytics.js';
|
|
3
|
+
import { AnalyticsContext } from './analytics-events.js';
|
|
4
|
+
type AnyHandler = (...args: unknown[]) => void;
|
|
5
|
+
export declare abstract class BaseWidget<TConfig extends BaseWidgetConfig = BaseWidgetConfig> implements GengageWidget<TConfig> {
|
|
6
|
+
protected config: TConfig;
|
|
7
|
+
protected root: HTMLElement;
|
|
8
|
+
protected isVisible: boolean;
|
|
9
|
+
protected isInitialised: boolean;
|
|
10
|
+
private readonly _handlers;
|
|
11
|
+
private readonly _cleanups;
|
|
12
|
+
private _ownsRoot;
|
|
13
|
+
init(config: TConfig): Promise<void>;
|
|
14
|
+
update(context: Partial<PageContext>): void;
|
|
15
|
+
show(): void;
|
|
16
|
+
hide(): void;
|
|
17
|
+
destroy(): void;
|
|
18
|
+
on(event: string, handler: AnyHandler): () => void;
|
|
19
|
+
/** Track a checkout start event. Called by host page to attribute checkout to widget interaction. */
|
|
20
|
+
trackCheckout(type: 'start' | 'complete', data: {
|
|
21
|
+
attribution_source: 'chat' | 'qna' | 'simrel';
|
|
22
|
+
attribution_action_id: string;
|
|
23
|
+
cart_value: number;
|
|
24
|
+
currency: string;
|
|
25
|
+
line_items: number;
|
|
26
|
+
}): void;
|
|
27
|
+
/** Track a metering summary event. Called by host page for session-level aggregation. */
|
|
28
|
+
flushMeteringSummary(data: {
|
|
29
|
+
meter_key: string;
|
|
30
|
+
quantity: number;
|
|
31
|
+
unit: string;
|
|
32
|
+
}): void;
|
|
33
|
+
protected abstract onInit(config: TConfig): Promise<void>;
|
|
34
|
+
protected abstract onUpdate(context: Partial<PageContext>): void;
|
|
35
|
+
protected abstract onShow(): void;
|
|
36
|
+
protected abstract onHide(): void;
|
|
37
|
+
protected abstract onDestroy(): void;
|
|
38
|
+
/** Emit a widget event to all registered handlers. */
|
|
39
|
+
protected emit(event: string, ...args: unknown[]): void;
|
|
40
|
+
/** Register a cleanup function to run on destroy(). */
|
|
41
|
+
protected addCleanup(fn: () => void): void;
|
|
42
|
+
/** Track an analytics event (no-op if analyticsClient is not configured). */
|
|
43
|
+
protected track(input: AnalyticsInput): void;
|
|
44
|
+
/** Build the shared analytics context from widget config. */
|
|
45
|
+
protected analyticsContext(): AnalyticsContext;
|
|
46
|
+
private _resolveMount;
|
|
47
|
+
private _applyTheme;
|
|
48
|
+
}
|
|
49
|
+
export interface ChatPublicAPI {
|
|
50
|
+
open(options?: {
|
|
51
|
+
state?: 'full' | 'half';
|
|
52
|
+
initialMessage?: string;
|
|
53
|
+
}): void;
|
|
54
|
+
openWithAction(action: import('./types.js').ActionPayload, options?: {
|
|
55
|
+
sku?: string;
|
|
56
|
+
}): void;
|
|
57
|
+
close(): void;
|
|
58
|
+
saveSession(sessionId: string, sku: string): void;
|
|
59
|
+
readonly isOpen: boolean;
|
|
60
|
+
on(event: 'open' | 'close' | 'ready', handler: () => void): () => void;
|
|
61
|
+
trackCheckout(type: 'start' | 'complete', data: {
|
|
62
|
+
attribution_source: 'chat' | 'qna' | 'simrel';
|
|
63
|
+
attribution_action_id: string;
|
|
64
|
+
cart_value: number;
|
|
65
|
+
currency: string;
|
|
66
|
+
line_items: number;
|
|
67
|
+
}): void;
|
|
68
|
+
flushMeteringSummary(data: {
|
|
69
|
+
meter_key: string;
|
|
70
|
+
quantity: number;
|
|
71
|
+
unit: string;
|
|
72
|
+
}): void;
|
|
73
|
+
}
|
|
74
|
+
export {};
|
|
75
|
+
//# sourceMappingURL=widget-base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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
ADDED
|
@@ -0,0 +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;
|
|
2
|
+
//# sourceMappingURL=common.cjs.map
|