@active-reach/web-sdk 1.43.0 → 1.43.2

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 (185) hide show
  1. package/dist/aegis-push.min.js +2 -0
  2. package/dist/aegis-push.min.js.map +1 -0
  3. package/dist/aegis-sw.js +1 -0
  4. package/dist/aegis.min.js +2 -0
  5. package/dist/aegis.min.js.map +1 -0
  6. package/dist/analytics-C-Go3Pm5.mjs +3509 -0
  7. package/dist/analytics-C-Go3Pm5.mjs.map +1 -0
  8. package/dist/cdn.d.ts +26 -0
  9. package/dist/cdn.d.ts.map +1 -0
  10. package/dist/chat/AegisChat.d.ts +169 -0
  11. package/dist/chat/AegisChat.d.ts.map +1 -0
  12. package/dist/chat/index.d.ts +3 -0
  13. package/dist/chat/index.d.ts.map +1 -0
  14. package/dist/core/analytics.d.ts +320 -0
  15. package/dist/core/analytics.d.ts.map +1 -0
  16. package/dist/core/bootstrap.d.ts +96 -0
  17. package/dist/core/bootstrap.d.ts.map +1 -0
  18. package/dist/core/prefetch-bundle-client.d.ts +175 -0
  19. package/dist/core/prefetch-bundle-client.d.ts.map +1 -0
  20. package/dist/core/queue.d.ts +35 -0
  21. package/dist/core/queue.d.ts.map +1 -0
  22. package/dist/core/rate-limiter.d.ts +45 -0
  23. package/dist/core/rate-limiter.d.ts.map +1 -0
  24. package/dist/core/sdk-config-poller.d.ts +59 -0
  25. package/dist/core/sdk-config-poller.d.ts.map +1 -0
  26. package/dist/core/session.d.ts +52 -0
  27. package/dist/core/session.d.ts.map +1 -0
  28. package/dist/core/transport.d.ts +50 -0
  29. package/dist/core/transport.d.ts.map +1 -0
  30. package/dist/core/user-namespace.d.ts +48 -0
  31. package/dist/core/user-namespace.d.ts.map +1 -0
  32. package/dist/ecommerce/index.d.ts +94 -0
  33. package/dist/ecommerce/index.d.ts.map +1 -0
  34. package/dist/ecommerce/types.d.ts +81 -0
  35. package/dist/ecommerce/types.d.ts.map +1 -0
  36. package/dist/governance/bloom-filter.d.ts +47 -0
  37. package/dist/governance/bloom-filter.d.ts.map +1 -0
  38. package/dist/governance/index.d.ts +8 -0
  39. package/dist/governance/index.d.ts.map +1 -0
  40. package/dist/governance/murmur3.d.ts +43 -0
  41. package/dist/governance/murmur3.d.ts.map +1 -0
  42. package/dist/governance/name-governor.d.ts +98 -0
  43. package/dist/governance/name-governor.d.ts.map +1 -0
  44. package/dist/governance/trait-governor.d.ts +63 -0
  45. package/dist/governance/trait-governor.d.ts.map +1 -0
  46. package/dist/inapp/AegisInAppManager.d.ts +894 -0
  47. package/dist/inapp/AegisInAppManager.d.ts.map +1 -0
  48. package/dist/inapp/actions.d.ts +91 -0
  49. package/dist/inapp/actions.d.ts.map +1 -0
  50. package/dist/inapp/devicePairing.d.ts +70 -0
  51. package/dist/inapp/devicePairing.d.ts.map +1 -0
  52. package/dist/inapp/eval-throttle.d.ts +33 -0
  53. package/dist/inapp/eval-throttle.d.ts.map +1 -0
  54. package/dist/inapp/font.d.ts +16 -0
  55. package/dist/inapp/font.d.ts.map +1 -0
  56. package/dist/inapp/index.d.ts +8 -0
  57. package/dist/inapp/index.d.ts.map +1 -0
  58. package/dist/inapp/lucide-svg.d.ts +46 -0
  59. package/dist/inapp/lucide-svg.d.ts.map +1 -0
  60. package/dist/inapp/renderPreview.d.ts +40 -0
  61. package/dist/inapp/renderPreview.d.ts.map +1 -0
  62. package/dist/inapp/renderers/active-web-chat.d.ts +45 -0
  63. package/dist/inapp/renderers/active-web-chat.d.ts.map +1 -0
  64. package/dist/inapp/renderers/card-style.d.ts +31 -0
  65. package/dist/inapp/renderers/card-style.d.ts.map +1 -0
  66. package/dist/inapp/renderers/card-template.d.ts +233 -0
  67. package/dist/inapp/renderers/card-template.d.ts.map +1 -0
  68. package/dist/inapp/renderers/carousel-cards.d.ts +15 -0
  69. package/dist/inapp/renderers/carousel-cards.d.ts.map +1 -0
  70. package/dist/inapp/renderers/coachmark-tour.d.ts +24 -0
  71. package/dist/inapp/renderers/coachmark-tour.d.ts.map +1 -0
  72. package/dist/inapp/renderers/games.d.ts +27 -0
  73. package/dist/inapp/renderers/games.d.ts.map +1 -0
  74. package/dist/inapp/renderers/hero.d.ts +23 -0
  75. package/dist/inapp/renderers/hero.d.ts.map +1 -0
  76. package/dist/inapp/renderers/index.d.ts +22 -0
  77. package/dist/inapp/renderers/index.d.ts.map +1 -0
  78. package/dist/inapp/renderers/interactive-contract.d.ts +48 -0
  79. package/dist/inapp/renderers/interactive-contract.d.ts.map +1 -0
  80. package/dist/inapp/renderers/product-recommendation.d.ts +37 -0
  81. package/dist/inapp/renderers/product-recommendation.d.ts.map +1 -0
  82. package/dist/inapp/renderers/progress-bar.d.ts +38 -0
  83. package/dist/inapp/renderers/progress-bar.d.ts.map +1 -0
  84. package/dist/inapp/renderers/progress-core.d.ts +80 -0
  85. package/dist/inapp/renderers/progress-core.d.ts.map +1 -0
  86. package/dist/inapp/renderers/reviews.d.ts +38 -0
  87. package/dist/inapp/renderers/reviews.d.ts.map +1 -0
  88. package/dist/inapp/renderers/scratch-engine.d.ts +66 -0
  89. package/dist/inapp/renderers/scratch-engine.d.ts.map +1 -0
  90. package/dist/inapp/renderers/sticky-bar.d.ts +14 -0
  91. package/dist/inapp/renderers/sticky-bar.d.ts.map +1 -0
  92. package/dist/inapp/renderers/stories.d.ts +31 -0
  93. package/dist/inapp/renderers/stories.d.ts.map +1 -0
  94. package/dist/inapp/renderers/types.d.ts +152 -0
  95. package/dist/inapp/renderers/types.d.ts.map +1 -0
  96. package/dist/inapp/renderers/video.d.ts +20 -0
  97. package/dist/inapp/renderers/video.d.ts.map +1 -0
  98. package/dist/inbox/AegisInbox.d.ts +106 -0
  99. package/dist/inbox/AegisInbox.d.ts.map +1 -0
  100. package/dist/inbox/index.d.ts +3 -0
  101. package/dist/inbox/index.d.ts.map +1 -0
  102. package/dist/index.d.ts +42 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +15478 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/integrations/react.d.ts +19 -0
  107. package/dist/integrations/react.d.ts.map +1 -0
  108. package/dist/loyalty/AegisLoyaltyManager.d.ts +120 -0
  109. package/dist/loyalty/AegisLoyaltyManager.d.ts.map +1 -0
  110. package/dist/loyalty/index.d.ts +3 -0
  111. package/dist/loyalty/index.d.ts.map +1 -0
  112. package/dist/plugins/registry.d.ts +13 -0
  113. package/dist/plugins/registry.d.ts.map +1 -0
  114. package/dist/push/AegisWebPush.d.ts +199 -0
  115. package/dist/push/AegisWebPush.d.ts.map +1 -0
  116. package/dist/push/AegisWebPush.js +542 -0
  117. package/dist/push/AegisWebPush.js.map +1 -0
  118. package/dist/push/cdn-push.d.ts +21 -0
  119. package/dist/push/cdn-push.d.ts.map +1 -0
  120. package/dist/react.js +70 -0
  121. package/dist/react.js.map +1 -0
  122. package/dist/runtime/AegisMessageRuntime.d.ts +276 -0
  123. package/dist/runtime/AegisMessageRuntime.d.ts.map +1 -0
  124. package/dist/runtime/index.d.ts +3 -0
  125. package/dist/runtime/index.d.ts.map +1 -0
  126. package/dist/snippet.min.js +1 -0
  127. package/dist/state/intent_ledger.d.ts +136 -0
  128. package/dist/state/intent_ledger.d.ts.map +1 -0
  129. package/dist/triggers/ContactScoresFetcher.d.ts +113 -0
  130. package/dist/triggers/ContactScoresFetcher.d.ts.map +1 -0
  131. package/dist/triggers/IntentRuleEvaluator.d.ts +213 -0
  132. package/dist/triggers/IntentRuleEvaluator.d.ts.map +1 -0
  133. package/dist/triggers/IntentSnapshotCollector.d.ts +83 -0
  134. package/dist/triggers/IntentSnapshotCollector.d.ts.map +1 -0
  135. package/dist/triggers/SelectorBinder.d.ts +118 -0
  136. package/dist/triggers/SelectorBinder.d.ts.map +1 -0
  137. package/dist/triggers/TriggerEngine.d.ts +296 -0
  138. package/dist/triggers/TriggerEngine.d.ts.map +1 -0
  139. package/dist/triggers/behaviouralTriggers.d.ts +44 -0
  140. package/dist/triggers/behaviouralTriggers.d.ts.map +1 -0
  141. package/dist/triggers/index.d.ts +11 -0
  142. package/dist/triggers/index.d.ts.map +1 -0
  143. package/dist/triggers/microIntentTriggers.d.ts +80 -0
  144. package/dist/triggers/microIntentTriggers.d.ts.map +1 -0
  145. package/dist/types/config.d.ts +77 -0
  146. package/dist/types/config.d.ts.map +1 -0
  147. package/dist/types/events.d.ts +147 -0
  148. package/dist/types/events.d.ts.map +1 -0
  149. package/dist/types/index.d.ts +5 -0
  150. package/dist/types/index.d.ts.map +1 -0
  151. package/dist/types/plugin.d.ts +21 -0
  152. package/dist/types/plugin.d.ts.map +1 -0
  153. package/dist/types/type-safe-events.d.ts +14 -0
  154. package/dist/types/type-safe-events.d.ts.map +1 -0
  155. package/dist/utils/canonical-identity.d.ts +29 -0
  156. package/dist/utils/canonical-identity.d.ts.map +1 -0
  157. package/dist/utils/consent.d.ts +40 -0
  158. package/dist/utils/consent.d.ts.map +1 -0
  159. package/dist/utils/debounce.d.ts +3 -0
  160. package/dist/utils/debounce.d.ts.map +1 -0
  161. package/dist/utils/device.d.ts +6 -0
  162. package/dist/utils/device.d.ts.map +1 -0
  163. package/dist/utils/identity.d.ts +27 -0
  164. package/dist/utils/identity.d.ts.map +1 -0
  165. package/dist/utils/index.d.ts +7 -0
  166. package/dist/utils/index.d.ts.map +1 -0
  167. package/dist/utils/logger.d.ts +15 -0
  168. package/dist/utils/logger.d.ts.map +1 -0
  169. package/dist/utils/meta-cookies.d.ts +65 -0
  170. package/dist/utils/meta-cookies.d.ts.map +1 -0
  171. package/dist/utils/redact-url.d.ts +56 -0
  172. package/dist/utils/redact-url.d.ts.map +1 -0
  173. package/dist/utils/storage.d.ts +20 -0
  174. package/dist/utils/storage.d.ts.map +1 -0
  175. package/dist/utils/url-parser.d.ts +61 -0
  176. package/dist/utils/url-parser.d.ts.map +1 -0
  177. package/dist/utils/uuid.d.ts +4 -0
  178. package/dist/utils/uuid.d.ts.map +1 -0
  179. package/dist/utils/visitor.d.ts +43 -0
  180. package/dist/utils/visitor.d.ts.map +1 -0
  181. package/dist/widgets/AegisWidgetManager.d.ts +209 -0
  182. package/dist/widgets/AegisWidgetManager.d.ts.map +1 -0
  183. package/dist/widgets/index.d.ts +3 -0
  184. package/dist/widgets/index.d.ts.map +1 -0
  185. package/package.json +2 -1
@@ -0,0 +1,175 @@
1
+ /**
2
+ * PrefetchBundleClient — unified init-time resolver for in-app state.
3
+ *
4
+ * Fetches /v1/sdk/prefetch-bundle at SDK init and on a 5-minute ETag
5
+ * refresh cadence. The bundle payload carries:
6
+ * • `campaigns[]` — eligible, property-scoped, A/B-assigned campaigns
7
+ * armed for this contact. EVERY in-app type is in
8
+ * here (modal, banner, spin_wheel, carousel_cards,
9
+ * sticky_bar, progress_bar, coachmark_tour, etc.).
10
+ * • `inbox` — first page + unread count for the notification
11
+ * drawer; lets AegisInbox hydrate without a second
12
+ * round-trip.
13
+ * • `etag` — content-hashed, stable when state is unchanged;
14
+ * 304 responses cost ~50ms and consume no body.
15
+ * • `invalidation_topic` — SSE channel name the cell-plane publishes
16
+ * to when a playbook arms a campaign mid-session.
17
+ * The SDK does NOT open SSE on that topic today —
18
+ * we rely on the 5-minute poll + an explicit
19
+ * `refresh()` hook that app code (AegisInAppManager,
20
+ * AegisInbox) call on relevant user actions.
21
+ *
22
+ * This is the cornerstone of the preload-first contract from
23
+ * docs/architecture/IN_APP_MESSAGES_EXPANSION_PLAN.md §1. The render
24
+ * path must NEVER hit the network at trigger time — the bundle is
25
+ * populated at init, and everything renders from memory.
26
+ */
27
+ export interface PrefetchBundleCampaign {
28
+ id: string;
29
+ type: string;
30
+ sub_type?: string;
31
+ title: string;
32
+ body: string;
33
+ image_url?: string;
34
+ action_url?: string;
35
+ button_text?: string;
36
+ background_color?: string;
37
+ text_color?: string;
38
+ priority: number;
39
+ expires_at?: string | null;
40
+ frequency?: {
41
+ max_impressions?: number;
42
+ max_impressions_per_day?: number;
43
+ cooldown_seconds?: number;
44
+ };
45
+ interactive_config?: Record<string, unknown>;
46
+ client_trigger?: {
47
+ type: string;
48
+ config?: Record<string, unknown>;
49
+ };
50
+ assigned_variant_id?: string;
51
+ inbox_enabled?: boolean;
52
+ }
53
+ export interface PrefetchBundleInboxEntry {
54
+ id: string;
55
+ source: string;
56
+ campaign_id: string | null;
57
+ title: string;
58
+ body: string;
59
+ media_url: string | null;
60
+ cta_url: string | null;
61
+ metadata: Record<string, unknown> | null;
62
+ read: boolean;
63
+ read_at: string | null;
64
+ created_at: string | null;
65
+ expires_at: string | null;
66
+ }
67
+ export interface PrefetchBundleInbox {
68
+ unread_count: number;
69
+ page: PrefetchBundleInboxEntry[];
70
+ cursor: string | null;
71
+ }
72
+ export interface PrefetchBundle {
73
+ etag: string;
74
+ generated_at: string;
75
+ ttl_seconds: number;
76
+ invalidation_topic: string;
77
+ campaigns: PrefetchBundleCampaign[];
78
+ inbox: PrefetchBundleInbox;
79
+ }
80
+ export interface PrefetchBundleContext {
81
+ device_type?: string;
82
+ page_url?: string;
83
+ geo?: string;
84
+ /** Omit to use the SDK's session-stable new-visitor verdict. */
85
+ is_new_user?: boolean;
86
+ }
87
+ export interface PrefetchBundleClientOptions {
88
+ apiHost: string;
89
+ writeKey: string;
90
+ organizationId?: string;
91
+ contactId?: string;
92
+ contactToken?: string;
93
+ userId?: string;
94
+ propertyId?: string;
95
+ /** Cached AB assignments from localStorage, base64-json. */
96
+ abAssignments?: Record<string, string>;
97
+ /** Polling cadence; defaults to the bundle's own `ttl_seconds` (300s). */
98
+ pollIntervalMs?: number;
99
+ /** Factory for client context — re-evaluated on each fetch so device/page
100
+ * state stays fresh without forcing callers to re-instantiate the client. */
101
+ contextProvider?: () => PrefetchBundleContext;
102
+ }
103
+ export type PrefetchBundleListener = (bundle: PrefetchBundle) => void;
104
+ export declare class PrefetchBundleClient {
105
+ private apiHost;
106
+ private writeKey;
107
+ private organizationId?;
108
+ private contactId?;
109
+ private contactToken?;
110
+ private userId?;
111
+ private propertyId?;
112
+ private abAssignments;
113
+ private pollIntervalMs;
114
+ private contextProvider;
115
+ private currentETag;
116
+ private currentBundle;
117
+ private pollTimer;
118
+ private listeners;
119
+ private inflightRefetch;
120
+ constructor(options: PrefetchBundleClientOptions);
121
+ /**
122
+ * Initial fetch + start the background ETag poll. Resolves to the bundle
123
+ * (or `null` if the first fetch failed — callers should fall back to an
124
+ * empty campaign list, not abort SDK init).
125
+ */
126
+ start(): Promise<PrefetchBundle | null>;
127
+ stop(): void;
128
+ getBundle(): PrefetchBundle | null;
129
+ getCampaigns(): PrefetchBundleCampaign[];
130
+ getInbox(): PrefetchBundleInbox;
131
+ /** Force a refresh (dedupes concurrent calls). Exposed so inbox mutations
132
+ * and campaign-activation SSE messages can trigger a refetch on demand. */
133
+ refresh(): Promise<PrefetchBundle | null>;
134
+ /** Subscribe to bundle changes (emits on first fetch + on any content
135
+ * change — ETag 304 does NOT fire the listener). Returns an unsubscribe. */
136
+ onChange(listener: PrefetchBundleListener): () => void;
137
+ /**
138
+ * Update the identity tuple — called by AegisInAppManager when the host
139
+ * app resolves a contactId post-init (e.g., after login). Triggers an
140
+ * immediate refresh since the eligible campaigns + inbox will differ.
141
+ */
142
+ updateIdentity(partial: {
143
+ contactId?: string;
144
+ contactToken?: string;
145
+ userId?: string;
146
+ organizationId?: string;
147
+ propertyId?: string;
148
+ }): void;
149
+ /** Update cached AB assignments. Called by downstream renderers after
150
+ * they display a variant. Persisted to localStorage by higher layers. */
151
+ setAbAssignments(assignments: Record<string, string>): void;
152
+ /**
153
+ * Wire an already-open realtime subscriber (from `aegis.realtime.subscribe`
154
+ * or a caller-provided EventSource) so the prefetch bundle refreshes
155
+ * instantly when the cell-plane signals `bundle.invalidate` — covering
156
+ * the window between an event (cart abandon, inbox write) and the
157
+ * 5-min ETag poll.
158
+ *
159
+ * `subscriber.onMessage(handler)` must fire with parsed message bodies
160
+ * from the contact's SSE stream. The handler filters for
161
+ * `type === 'bundle.invalidate'` and calls `refresh()`. Returns an
162
+ * unsubscribe function.
163
+ *
164
+ * Degrades gracefully: if the subscriber is missing or throws, the
165
+ * 5-min poll still keeps state converging.
166
+ */
167
+ subscribeInvalidations(subscriber: {
168
+ onMessage: (handler: (msg: {
169
+ type?: string;
170
+ [k: string]: unknown;
171
+ }) => void) => () => void;
172
+ }): () => void;
173
+ private fetch;
174
+ }
175
+ //# sourceMappingURL=prefetch-bundle-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefetch-bundle-client.d.ts","sourceRoot":"","sources":["../../src/core/prefetch-bundle-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { AegisEvent } from '../types/events';
2
+ import { Transport } from './transport';
3
+ import { Storage } from '../utils/storage';
4
+ export interface QueueConfig {
5
+ batchSize: number;
6
+ batchInterval: number;
7
+ enableOfflineMode: boolean;
8
+ maxOfflineEvents: number;
9
+ }
10
+ export declare class EventQueue {
11
+ private buffer;
12
+ private config;
13
+ private transport;
14
+ private storage;
15
+ private flushInterval;
16
+ private isFlushing;
17
+ private offlineQueue;
18
+ private isOnline;
19
+ constructor(config: QueueConfig, transport: Transport, storage: Storage);
20
+ private loadOfflineQueue;
21
+ private saveOfflineQueue;
22
+ private setupOnlineListener;
23
+ private flushOfflineQueue;
24
+ push(event: AegisEvent): void;
25
+ private addToOfflineQueue;
26
+ flush(): Promise<void>;
27
+ private startFlushTimer;
28
+ private setupUnloadHandlers;
29
+ private persistBufferToOfflineQueue;
30
+ getQueueSize(): number;
31
+ getOfflineQueueSize(): number;
32
+ clear(): void;
33
+ destroy(): void;
34
+ }
35
+ //# sourceMappingURL=queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/core/queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAI3C,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,QAAQ,CAA6B;gBAEjC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO;IAcvE,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,mBAAmB;YAcb,iBAAiB;IAyB/B,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAc7B,OAAO,CAAC,iBAAiB;IAWnB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoD5B,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,2BAA2B;IAenC,YAAY,IAAI,MAAM;IAItB,mBAAmB,IAAI,MAAM;IAI7B,KAAK,IAAI,IAAI;IAOb,OAAO,IAAI,IAAI;CAQhB"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Token bucket rate limiter for client-side event throttling.
3
+ *
4
+ * Limits per session: burst (default 100) + sustained (default 20/sec).
5
+ * Drops events with a console warning once a burst sustains. Drops are
6
+ * emitted as a single coalesced `aegis.client.rate_limited` meta-event
7
+ * per second so we don't flood ingress with drop notifications.
8
+ *
9
+ * Defaults are deliberately generous — the goal is to prevent runaway
10
+ * loops (a buggy app firing 10k events/sec) without affecting normal use.
11
+ */
12
+ export interface RateLimiterOptions {
13
+ /** Max tokens (burst size). Default 100. */
14
+ burstCapacity?: number;
15
+ /** Sustained rate per second. Default 20. */
16
+ refillPerSecond?: number;
17
+ /** Window in ms over which dropped events are coalesced. Default 1000. */
18
+ dropCoalesceWindowMs?: number;
19
+ /** Optional callback fired with the count of dropped events per coalesce window. */
20
+ onDropBatch?: (droppedCount: number, sampleEventName: string | null) => void;
21
+ }
22
+ export declare class RateLimiter {
23
+ private tokens;
24
+ private readonly capacity;
25
+ private readonly refillPerSecond;
26
+ private lastRefillMs;
27
+ private droppedThisWindow;
28
+ private firstDroppedName;
29
+ private windowFlushTimer;
30
+ private readonly windowMs;
31
+ private readonly onDropBatch?;
32
+ constructor(options?: RateLimiterOptions);
33
+ /**
34
+ * Try to consume 1 token. Returns true if allowed, false if throttled.
35
+ * Throttled events are coalesced into a single onDropBatch callback per window.
36
+ */
37
+ tryConsume(eventName: string): boolean;
38
+ /** Diagnostics — current token count (rounded down). */
39
+ getAvailableTokens(): number;
40
+ /** Cleanup. Idempotent. */
41
+ destroy(): void;
42
+ private refill;
43
+ private flushWindow;
44
+ }
45
+ //# sourceMappingURL=rate-limiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/core/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6CAA6C;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0EAA0E;IAC1E,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oFAAoF;IACpF,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC9E;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,gBAAgB,CAA8C;IACtE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAiE;gBAElF,OAAO,GAAE,kBAAuB;IAS5C;;;OAGG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAuBtC,wDAAwD;IACxD,kBAAkB,IAAI,MAAM;IAK5B,2BAA2B;IAC3B,OAAO,IAAI,IAAI;IAUf,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,WAAW;CAepB"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * SDK Config Poller
3
+ *
4
+ * Fetches non-sensitive SDK configuration from GET /v1/sdk/config
5
+ * with ETag/If-None-Match support for 304 responses.
6
+ *
7
+ * Polls every 5 minutes by default. Config changes are applied
8
+ * to push/in-app managers without re-initialization.
9
+ */
10
+ export interface SdkConfig {
11
+ version: string;
12
+ push: {
13
+ enabled: boolean;
14
+ vapid_public_key: string | null;
15
+ platforms: string[];
16
+ };
17
+ in_app: {
18
+ enabled: boolean;
19
+ };
20
+ consent: {
21
+ channels_requiring_opt_in: string[];
22
+ };
23
+ }
24
+ export interface SdkConfigPollerOptions {
25
+ apiHost: string;
26
+ writeKey: string;
27
+ organizationId?: string;
28
+ pollIntervalMs?: number;
29
+ }
30
+ export type ConfigChangeCallback = (config: SdkConfig) => void;
31
+ export declare class SdkConfigPoller {
32
+ private options;
33
+ private currentETag;
34
+ private currentConfig;
35
+ private pollTimer;
36
+ private listeners;
37
+ constructor(options: SdkConfigPollerOptions);
38
+ /**
39
+ * Fetch config once (on init) and start polling.
40
+ */
41
+ start(): Promise<SdkConfig | null>;
42
+ /**
43
+ * Stop polling.
44
+ */
45
+ stop(): void;
46
+ /**
47
+ * Register a callback for config changes.
48
+ */
49
+ onChange(callback: ConfigChangeCallback): () => void;
50
+ /**
51
+ * Get current cached config.
52
+ */
53
+ getConfig(): SdkConfig | null;
54
+ /**
55
+ * Fetch config with ETag/304 support.
56
+ */
57
+ private fetchConfig;
58
+ }
59
+ //# sourceMappingURL=sdk-config-poller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-config-poller.d.ts","sourceRoot":"","sources":["../../src/core/sdk-config-poller.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,OAAO,EAAE,OAAO,CAAC;QACjB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,MAAM,EAAE;QACN,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,OAAO,EAAE;QACP,yBAAyB,EAAE,MAAM,EAAE,CAAC;KACrC,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC;AAE/D,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAyF;IACxG,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,SAAS,CAA8B;gBAEnC,OAAO,EAAE,sBAAsB;IAO3C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAYxC;;OAEG;IACH,IAAI,IAAI,IAAI;IAOZ;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,IAAI;IAQpD;;OAEG;IACH,SAAS,IAAI,SAAS,GAAG,IAAI;IAI7B;;OAEG;YACW,WAAW;CA2D1B"}
@@ -0,0 +1,52 @@
1
+ import { Storage } from '../utils/storage';
2
+ import { AdClickIDs, LinkAttribution } from '../utils/url-parser';
3
+ export interface SessionState {
4
+ sessionId: string;
5
+ startTime: number;
6
+ lastActivityTime: number;
7
+ eventCount: number;
8
+ adClickIDs?: AdClickIDs;
9
+ landingPage?: string;
10
+ linkAttribution?: LinkAttribution;
11
+ }
12
+ export declare class SessionManager {
13
+ private storage;
14
+ private sessionId;
15
+ private sessionTimeout;
16
+ private lastActivityTime;
17
+ private sessionStartTime;
18
+ private eventCount;
19
+ private checkInterval;
20
+ private activityThrottle;
21
+ private lastActivityUpdate;
22
+ private adClickIDs;
23
+ private landingPage?;
24
+ private linkAttribution;
25
+ constructor(storage: Storage, sessionTimeoutMinutes?: number);
26
+ private loadSession;
27
+ private createNewSession;
28
+ private persistSession;
29
+ private startActivityTracking;
30
+ private startExpiryCheck;
31
+ private onActivity;
32
+ private checkSessionExpiry;
33
+ getSessionId(): string;
34
+ incrementEventCount(): void;
35
+ getSessionDuration(): number;
36
+ getEventCount(): number;
37
+ getState(): SessionState;
38
+ setAdClickIDs(adClickIDs: AdClickIDs, landingPage?: string): void;
39
+ getAdClickIDs(): AdClickIDs;
40
+ getLandingPage(): string | undefined;
41
+ /**
42
+ * Record the landing's Aegis link attribution. LAST touch: a new `aegis_code`
43
+ * replaces the previous set whole — never merged, because the fields are the
44
+ * attributes of ONE link and a mix of two links describes neither.
45
+ * Session + durable (30d, the server's short-link attribution window) so a
46
+ * checkout in a later session can still name the send that brought them.
47
+ */
48
+ setLinkAttribution(attribution: LinkAttribution): void;
49
+ getLinkAttribution(): LinkAttribution;
50
+ destroy(): void;
51
+ }
52
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAG3C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAUlE,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,eAAe,CAAuB;gBAElC,OAAO,EAAE,OAAO,EAAE,qBAAqB,GAAE,MAAW;IAwBhE,OAAO,CAAC,WAAW;IAyBnB,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,UAAU;IAoBlB,OAAO,CAAC,kBAAkB;IAS1B,YAAY,IAAI,MAAM;IAItB,mBAAmB,IAAI,IAAI;IAM3B,kBAAkB,IAAI,MAAM;IAI5B,aAAa,IAAI,MAAM;IAIvB,QAAQ,IAAI,YAAY;IAYxB,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IA0BjE,aAAa,IAAI,UAAU;IAsB3B,cAAc,IAAI,MAAM,GAAG,SAAS;IAIpC;;;;;;OAMG;IACH,kBAAkB,CAAC,WAAW,EAAE,eAAe,GAAG,IAAI;IAetD,kBAAkB,IAAI,eAAe;IAiBrC,OAAO,IAAI,IAAI;CAMhB"}
@@ -0,0 +1,50 @@
1
+ import { AegisEvent, BatchResponse } from '../types/events';
2
+ import { CellEndpoint, CellRegion } from '../types/config';
3
+ import { Storage } from '../utils/storage';
4
+ export interface TransportConfig {
5
+ writeKey: string;
6
+ apiHost: string | null;
7
+ cellEndpoints: CellEndpoint[];
8
+ preferredRegion: CellRegion | null;
9
+ autoRegionDetection: boolean;
10
+ requestTimeout: number;
11
+ retryFailedRequests: boolean;
12
+ maxRetries: number;
13
+ retryBackoffMultiplier: number;
14
+ }
15
+ export interface SendResult {
16
+ success: boolean;
17
+ response?: BatchResponse;
18
+ error?: Error;
19
+ endpoint?: string;
20
+ }
21
+ export declare class Transport {
22
+ private config;
23
+ private storage;
24
+ private activeCell;
25
+ private healthCheckInterval;
26
+ private regionLatencyMap;
27
+ constructor(config: TransportConfig, storage: Storage);
28
+ private initializeCellularArchitecture;
29
+ private loadCachedCell;
30
+ private saveCachedCell;
31
+ private isCellHealthy;
32
+ private selectOptimalCell;
33
+ private detectOptimalRegion;
34
+ private measureLatency;
35
+ private selectCellByPriority;
36
+ private startHealthChecks;
37
+ private performHealthChecks;
38
+ private checkCellHealth;
39
+ send(events: AegisEvent[]): Promise<SendResult>;
40
+ private getActiveEndpoint;
41
+ private buildPayload;
42
+ private sendViaBeacon;
43
+ private sendViaFetch;
44
+ private shouldRetry;
45
+ private retryRequest;
46
+ getActiveCell(): CellEndpoint | null;
47
+ getRegionLatencies(): Map<string, number>;
48
+ destroy(): void;
49
+ }
50
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/core/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAgB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,eAAe,EAAE,UAAU,GAAG,IAAI,CAAC;IACnC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,gBAAgB,CAAkC;gBAE9C,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO;YASvC,8BAA8B;IAa5C,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,aAAa;YASP,iBAAiB;YAuBjB,mBAAmB;YA2BnB,cAAc;IAyB5B,OAAO,CAAC,oBAAoB;IAc5B,OAAO,CAAC,iBAAiB;YAMX,mBAAmB;YAiBnB,eAAe;IAiBvB,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAkBrD,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,aAAa;YAyBP,YAAY;IA0D1B,OAAO,CAAC,WAAW;YAgBL,YAAY;IAe1B,aAAa,IAAI,YAAY,GAAG,IAAI;IAIpC,kBAAkB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAIzC,OAAO,IAAI,IAAI;CAMhB"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * UserNamespace — typed PII + per-channel opt-in setters that delegate to
3
+ * `Aegis.identify()`. WebEngage-/CleverTap-parity ergonomics.
4
+ *
5
+ * Pre-login `setX` calls accumulate in `pendingTraits` and flush as one
6
+ * identify() when `login()` fires — avoids polluting the contact graph
7
+ * with anonymous-id-as-userId rows.
8
+ *
9
+ * See docs/architecture/SDK_USER_NAMESPACE_AND_SCREEN.md.
10
+ */
11
+ import type { Aegis } from './analytics';
12
+ export type OptInChannel = 'email' | 'sms' | 'push' | 'webpush' | 'whatsapp' | 'rcs' | 'inapp';
13
+ export declare class UserNamespace {
14
+ private readonly aegis;
15
+ private pendingTraits;
16
+ constructor(aegis: Aegis);
17
+ /**
18
+ * Authoritative identity write. Flushes any pending pre-login traits
19
+ * along with the supplied `traits` argument as a single identify call.
20
+ */
21
+ login(userId: string, traits?: Record<string, unknown>): void;
22
+ /**
23
+ * Drops the current userId and any pending pre-login traits. Does NOT
24
+ * fire a server-side logout event — that's a separate explicit `track`.
25
+ */
26
+ logout(): void;
27
+ setAttribute(key: string, value: unknown): void;
28
+ setAttributes(map: Record<string, unknown>): void;
29
+ setEmail(email: string): void;
30
+ setPhone(phone: string): void;
31
+ setHashedEmail(sha256Hex: string): void;
32
+ setHashedPhone(sha256Hex: string): void;
33
+ setBirthDate(iso: string): void;
34
+ setOptIn(channel: OptInChannel, granted: boolean): void;
35
+ /**
36
+ * HMAC-signed identity token. Ingress-side verification not yet wired —
37
+ * the trait is forwarded as-is and persisted on the contact record
38
+ * until that lands.
39
+ */
40
+ setSecureToken(token: string): void;
41
+ /**
42
+ * Test/inspection hook — returns a copy of the pending traits buffer.
43
+ * Used by the e2e smoke test to assert pre-login accumulation.
44
+ */
45
+ _getPendingTraits(): Record<string, unknown>;
46
+ private writeTraits;
47
+ }
48
+ //# sourceMappingURL=user-namespace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-namespace.d.ts","sourceRoot":"","sources":["../../src/core/user-namespace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,MAAM,YAAY,GACpB,OAAO,GACP,KAAK,GACL,MAAM,GACN,SAAS,GACT,UAAU,GACV,KAAK,GACL,OAAO,CAAC;AAuBZ,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,aAAa,CAA+B;gBAExC,KAAK,EAAE,KAAK;IAIxB;;;OAGG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAU7D;;;OAGG;IACH,MAAM,IAAI,IAAI;IAKd,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAQ/C,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAQjD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ7B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ7B,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQvC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQvC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQ/B,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAYvD;;;;OAIG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQnC;;;OAGG;IACH,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAM5C,OAAO,CAAC,WAAW;CAQpB"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * E-Commerce helper methods for the Active Reach SDK.
3
+ *
4
+ * Provides standardized e-commerce event tracking that maps to the
5
+ * Active Reach Intelligence data governance pipeline.
6
+ *
7
+ * Event names follow the canonical mapper (libs/gateway-core/src/canonical-event.ts).
8
+ * The dotted-vs-flat split is intentional, not accidental: HIGH-VALUE lifecycle
9
+ * moments are namespaced `domain.action` (transaction.*, engagement.*); raw
10
+ * funnel telemetry that maps 1:1 to a Meta-standard event stays flat snake_case
11
+ * (its name is a frozen contract with the Meta CAPI/pixel maps). Don't "tidy"
12
+ * either side — see the convention block in canonical-event.ts.
13
+ * product_viewed → product_viewed (flat)
14
+ * product_list_viewed → product_list_viewed (flat)
15
+ * product_clicked → engagement.product_click (dotted)
16
+ * cart_item_added → cart_item_added (flat)
17
+ * cart_item_removed → cart_item_removed (flat)
18
+ * cart_viewed → cart_viewed (flat)
19
+ * checkout_started → checkout_started (flat)
20
+ * order_completed → transaction.purchase (dotted)
21
+ * order_refunded → transaction.refund (dotted)
22
+ * coupon_applied → coupon_applied (flat)
23
+ * search_performed → engagement.search (dotted)
24
+ * wishlist_item_added → wishlist_item_added (flat)
25
+ * product_waitlisted → product_waitlisted (back-in-stock waitlist opt-in;
26
+ * consumed by product_event_trigger_service
27
+ * _get_waitlisted_contacts; fires catalog.back_in_stock
28
+ * journey trigger on the next ON_STOCK flip)
29
+ * promotion_viewed → promotion_viewed
30
+ * promotion_clicked → promotion_clicked
31
+ */
32
+ import type { Aegis } from '../core/analytics';
33
+ import type { EcommerceProduct, EcommerceCart, EcommerceCheckout, EcommerceOrder, EcommerceCoupon, EcommerceSearch, EcommerceProductList, EcommerceWishlist, EcommerceWaitlist, EcommercePromotion } from './types';
34
+ export declare class EcommerceTracker {
35
+ private aegis;
36
+ constructor(aegis: Aegis);
37
+ private _cart;
38
+ private _cartSink;
39
+ /** Register a sink that receives the derived cart on every cart event.
40
+ * Wired once by `AegisMessageRuntime.bindEcommerce(...)`. Emits the current
41
+ * snapshot immediately so a late binding still gets the latest cart. */
42
+ onCartChange(sink: (c: {
43
+ total: number;
44
+ itemCount: number;
45
+ currency: string;
46
+ }) => void): void;
47
+ private _emitCart;
48
+ productViewed(product: EcommerceProduct): void;
49
+ productListViewed(list: EcommerceProductList): void;
50
+ productClicked(product: EcommerceProduct, source?: {
51
+ list_id?: string;
52
+ position?: number;
53
+ section?: string;
54
+ }): void;
55
+ productImpressed(product: EcommerceProduct, source?: {
56
+ list_id?: string;
57
+ position?: number;
58
+ section?: string;
59
+ }): void;
60
+ categoryFiltered(category: string, options?: {
61
+ previous_category?: string;
62
+ result_count?: number;
63
+ }): void;
64
+ searchPerformed(search: EcommerceSearch): void;
65
+ addToCart(product: EcommerceProduct): void;
66
+ removeFromCart(product: EcommerceProduct): void;
67
+ cartViewed(cart: EcommerceCart): void;
68
+ checkoutStarted(checkout: EcommerceCheckout): void;
69
+ checkoutStep(step: number, options?: Record<string, unknown>): void;
70
+ checkoutOption(option: {
71
+ step?: number;
72
+ payment_method?: string;
73
+ shipping_method?: string;
74
+ option_id?: string;
75
+ option_label?: string;
76
+ }): void;
77
+ orderCompleted(order: EcommerceOrder): void;
78
+ orderRefunded(orderId: string, value?: number, products?: EcommerceProduct[]): void;
79
+ orderShipped(orderId: string, tracking?: {
80
+ carrier?: string;
81
+ tracking_code?: string;
82
+ tracking_url?: string;
83
+ }): void;
84
+ couponApplied(coupon: EcommerceCoupon): void;
85
+ couponRemoved(coupon: EcommerceCoupon): void;
86
+ couponDenied(coupon: EcommerceCoupon, reason?: string): void;
87
+ wishlistItemAdded(wishlist: EcommerceWishlist): void;
88
+ productRemovedFromWishlist(wishlist: EcommerceWishlist): void;
89
+ productWaitlisted(waitlist: EcommerceWaitlist): void;
90
+ promotionViewed(promo: EcommercePromotion): void;
91
+ promotionClicked(promo: EcommercePromotion): void;
92
+ }
93
+ export type { EcommerceProduct, EcommerceCart, EcommerceCheckout, EcommerceOrder, EcommerceCoupon, EcommerceSearch, EcommerceProductList, EcommerceWishlist, EcommerceWaitlist, EcommercePromotion, } from './types';
94
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ecommerce/index.ts"],"names":[],"mappings":"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"}