@wireai/activation 0.1.0 → 0.2.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 (57) hide show
  1. package/AGENTS.md +82 -40
  2. package/CHANGELOG.md +17 -2
  3. package/INTEGRATION_PROMPT.md +8 -8
  4. package/README.md +38 -38
  5. package/dist/analytics/index.d.mts +92 -0
  6. package/dist/analytics/index.d.ts +92 -0
  7. package/dist/analytics/index.js +439 -0
  8. package/dist/analytics/index.js.map +1 -0
  9. package/dist/analytics/index.mjs +426 -0
  10. package/dist/analytics/index.mjs.map +1 -0
  11. package/dist/coachmarks/index.js.map +1 -1
  12. package/dist/coachmarks/index.mjs.map +1 -1
  13. package/dist/decision-BzbiKwk3.d.mts +79 -0
  14. package/dist/decision-plDEOCkt.d.ts +79 -0
  15. package/dist/eventQueue-CxKi7Qd5.d.mts +546 -0
  16. package/dist/eventQueue-rV1dtJJR.d.ts +546 -0
  17. package/dist/index.d.mts +162 -418
  18. package/dist/index.d.ts +162 -418
  19. package/dist/index.js +407 -4
  20. package/dist/index.js.map +1 -1
  21. package/dist/index.mjs +402 -5
  22. package/dist/index.mjs.map +1 -1
  23. package/dist/questionnaire/index.d.mts +2 -1
  24. package/dist/questionnaire/index.d.ts +2 -1
  25. package/dist/questionnaire/index.js.map +1 -1
  26. package/dist/questionnaire/index.mjs.map +1 -1
  27. package/dist/reviews/index.d.mts +5 -40
  28. package/dist/reviews/index.d.ts +5 -40
  29. package/dist/reviews/index.js.map +1 -1
  30. package/dist/reviews/index.mjs.map +1 -1
  31. package/dist/showcase/index.js.map +1 -1
  32. package/dist/showcase/index.mjs.map +1 -1
  33. package/dist/transport-BeO_Brcu.d.mts +40 -0
  34. package/dist/transport-DLpd1v5_.d.ts +40 -0
  35. package/dist/{decision-Cl8OFYzu.d.mts → types-A6pTxIZV.d.mts} +1 -77
  36. package/dist/{decision-CFvGY6nP.d.ts → types-BhpXJGlg.d.ts} +1 -77
  37. package/llms.txt +7 -7
  38. package/metro/index.d.ts +3 -3
  39. package/metro/index.js +3 -3
  40. package/package.json +15 -1
  41. package/src/analytics/contextEnvelope.ts +72 -0
  42. package/src/analytics/eventQueue.ts +331 -0
  43. package/src/analytics/index.ts +47 -0
  44. package/src/analytics/screenTracking.ts +122 -0
  45. package/src/analytics/useScreenTracking.ts +48 -0
  46. package/src/coachmarks/index.ts +2 -2
  47. package/src/features/WireFeaturesProvider.tsx +1 -1
  48. package/src/features/index.ts +2 -2
  49. package/src/index.ts +18 -1
  50. package/src/questionnaire/index.ts +2 -2
  51. package/src/reviews/index.ts +2 -2
  52. package/src/session-analytics/index.ts +20 -0
  53. package/src/session-analytics/lifecycle.ts +236 -0
  54. package/src/session-analytics/reportSessionStart.ts +27 -7
  55. package/src/session-analytics/useLifecycleEvents.ts +184 -0
  56. package/src/showcase/index.ts +2 -2
  57. package/src/types.ts +1 -1
package/dist/index.mjs CHANGED
@@ -3095,7 +3095,7 @@ var resetSessionStartGuard = () => {
3095
3095
  var reportSessionStart = (opts) => {
3096
3096
  var _a;
3097
3097
  const target = opts.target;
3098
- if (!(target == null ? void 0 : target.serverUrl)) return;
3098
+ if (!opts.sink && !(target == null ? void 0 : target.serverUrl)) return;
3099
3099
  const sessionId = (_a = opts.sessionId) != null ? _a : makeSessionId();
3100
3100
  if (opts.once !== false) {
3101
3101
  if (_emitted.has(sessionId)) return;
@@ -3106,9 +3106,6 @@ var reportSessionStart = (opts) => {
3106
3106
  _emitted.add(sessionId);
3107
3107
  }
3108
3108
  try {
3109
- const url = `${target.serverUrl.replace(/\/$/, "")}/v1/events`;
3110
- const headers = { "Content-Type": "application/json" };
3111
- if (target.apiKey) headers.Authorization = `Bearer ${target.apiKey}`;
3112
3109
  const userContext = {};
3113
3110
  if (opts.deviceKey) userContext.device_key = opts.deviceKey;
3114
3111
  if (typeof opts.sessionCount === "number" && Number.isFinite(opts.sessionCount)) {
@@ -3127,6 +3124,14 @@ var reportSessionStart = (opts) => {
3127
3124
  if (Object.keys(userContext).length > 0) event.user_context = userContext;
3128
3125
  if (opts.device) event.device = opts.device;
3129
3126
  if (opts.meta && Object.keys(opts.meta).length > 0) event.meta = JSON.stringify(opts.meta);
3127
+ if (opts.sink) {
3128
+ opts.sink(event);
3129
+ return;
3130
+ }
3131
+ if (!(target == null ? void 0 : target.serverUrl)) return;
3132
+ const url = `${target.serverUrl.replace(/\/$/, "")}/v1/events`;
3133
+ const headers = { "Content-Type": "application/json" };
3134
+ if (target.apiKey) headers.Authorization = `Bearer ${target.apiKey}`;
3130
3135
  void fetch(url, {
3131
3136
  method: "POST",
3132
3137
  headers,
@@ -3181,6 +3186,398 @@ var useSessionStart = (config, options = {}) => {
3181
3186
  }, []);
3182
3187
  };
3183
3188
 
3184
- export { AnimatedSparkle, BACKGROUND_SESSION_MS, CardHandoff, CenteredModal, ChipSelectCard, CompletionView, DEFAULT_FEATURES_TTL_MS, DEFAULT_SESSION_TTL_MS, DemoOnboarding, DoneBlock, ErrorBlock, IllustrationProvider, InterstitialCard, LoadingBlock, LoadingScreen, NumberStepperCard, Button as OnboardingButton, OnboardingFlow, OnboardingScaffold, OnboardingThemeProvider, SESSION_STARTED_EVENT, SelectionCard, StatusCard, StepProgress, TextInputCard, USER_ID_MAX_LENGTH, WIRE_ONBOARDING_EVENTS, WireFeaturesProvider, WireOnboarding, attributionMetadata, clearPersistedSession, collectDeviceContext, defaultIllustrations, defaultOnboardingTheme, defaultWireFeatures, deriveAnswers, featuresCacheKey, featuresEqual, fetchWireFeatures, identifyOnboarding, isFeaturesFresh, isOnboardingEnabled, loadPersistedSession, makeSessionId, mergeTheme, motionSpec_exports as motionSpec, onboardingComponents, parseWireFeatures, peekPersistedSession, readCachedFeatures, readProgress, reportClientEvent, reportClientEvents, reportSessionStart, resetSessionStartGuard, sanitizeUserId, savePersistedSession, sessionStorageKey, themeFromBrand, toAnalyticsEvent, useIllustration, useOnboardingTheme, useReducedMotion, useResolvedFeatures, useSessionStart, useWireFeatures, useWireFeaturesContext, wireConfigFromEnv, writeCachedFeatures };
3189
+ // src/session-analytics/lifecycle.ts
3190
+ var FIRST_OPEN_EVENT = "app.first_open";
3191
+ var firstOpenStorageKey = (appId) => `wireai:first_open:${appId}`;
3192
+ var READ_TIMEOUT_MS3 = 1500;
3193
+ var withTimeout3 = (p, ms) => {
3194
+ let timer;
3195
+ const timeout = new Promise((resolve) => {
3196
+ timer = setTimeout(() => resolve(void 0), ms);
3197
+ });
3198
+ return Promise.race([p, timeout]).finally(() => clearTimeout(timer));
3199
+ };
3200
+ var _firstOpenLatched = /* @__PURE__ */ new Set();
3201
+ var resetFirstOpenLatch = () => {
3202
+ _firstOpenLatched.clear();
3203
+ };
3204
+ var buildLifecycleEvent = (questionKey, opts) => {
3205
+ var _a;
3206
+ const userContext = {};
3207
+ if (opts.deviceKey) userContext.device_key = opts.deviceKey;
3208
+ if (typeof opts.sessionCount === "number" && Number.isFinite(opts.sessionCount)) {
3209
+ userContext.session_count = opts.sessionCount;
3210
+ userContext.returning = opts.sessionCount > 1;
3211
+ }
3212
+ if (opts.appVersion) userContext.app_version = opts.appVersion;
3213
+ if (opts.platform) userContext.platform = opts.platform;
3214
+ const event = {
3215
+ event_type: "app_event",
3216
+ question_key: questionKey,
3217
+ session_id: (_a = opts.sessionId) != null ? _a : makeSessionId()
3218
+ };
3219
+ const userId = sanitizeUserId(opts.userId);
3220
+ if (userId) event.user_id = userId;
3221
+ if (Object.keys(userContext).length > 0) event.user_context = userContext;
3222
+ if (opts.device) event.device = opts.device;
3223
+ if (opts.meta && Object.keys(opts.meta).length > 0) event.meta = JSON.stringify(opts.meta);
3224
+ return event;
3225
+ };
3226
+ var routeLifecycleEvent = (event, opts) => {
3227
+ try {
3228
+ if (opts.sink) {
3229
+ opts.sink(event);
3230
+ return;
3231
+ }
3232
+ const target = opts.target;
3233
+ if (!(target == null ? void 0 : target.serverUrl)) return;
3234
+ const url = `${target.serverUrl.replace(/\/$/, "")}/v1/events`;
3235
+ const headers = { "Content-Type": "application/json" };
3236
+ if (target.apiKey) headers.Authorization = `Bearer ${target.apiKey}`;
3237
+ void fetch(url, {
3238
+ method: "POST",
3239
+ headers,
3240
+ body: JSON.stringify({ events: [event] })
3241
+ }).catch(() => {
3242
+ });
3243
+ } catch {
3244
+ }
3245
+ };
3246
+ var emitFirstOpen = (opts) => {
3247
+ routeLifecycleEvent(buildLifecycleEvent(FIRST_OPEN_EVENT, opts), opts);
3248
+ };
3249
+ var reportFirstOpen = (opts) => {
3250
+ var _a;
3251
+ const appId = (_a = opts.appId) != null ? _a : "default";
3252
+ if (_firstOpenLatched.has(appId)) return;
3253
+ _firstOpenLatched.add(appId);
3254
+ const storage = opts.storage;
3255
+ if (!storage) {
3256
+ emitFirstOpen(opts);
3257
+ return;
3258
+ }
3259
+ const key = firstOpenStorageKey(appId);
3260
+ void (async () => {
3261
+ try {
3262
+ const seen = await withTimeout3(storage.getItem(key), READ_TIMEOUT_MS3);
3263
+ if (seen) return;
3264
+ emitFirstOpen(opts);
3265
+ try {
3266
+ void storage.setItem(key, JSON.stringify({ ts: Date.now() })).catch(() => {
3267
+ });
3268
+ } catch {
3269
+ }
3270
+ } catch {
3271
+ emitFirstOpen(opts);
3272
+ }
3273
+ })();
3274
+ };
3275
+ var wireLifecycleEvents = (opts) => {
3276
+ reportFirstOpen(opts);
3277
+ reportSessionStart({
3278
+ target: opts.target,
3279
+ sink: opts.sink,
3280
+ sessionId: opts.sessionId,
3281
+ userId: opts.userId,
3282
+ deviceKey: opts.deviceKey,
3283
+ sessionCount: opts.sessionCount,
3284
+ appVersion: opts.appVersion,
3285
+ platform: opts.platform,
3286
+ device: opts.device,
3287
+ meta: opts.meta
3288
+ });
3289
+ };
3290
+
3291
+ // src/analytics/eventQueue.ts
3292
+ var DEFAULTS = {
3293
+ maxSize: 200,
3294
+ batchSize: 20,
3295
+ baseBackoffMs: 1e3,
3296
+ maxBackoffMs: 3e4,
3297
+ maxRetries: 6
3298
+ };
3299
+ var READ_TIMEOUT_MS4 = 1500;
3300
+ var withTimeout4 = (p, ms) => {
3301
+ let timer;
3302
+ const timeout = new Promise((resolve) => {
3303
+ timer = setTimeout(() => resolve(void 0), ms);
3304
+ });
3305
+ return Promise.race([p, timeout]).finally(() => clearTimeout(timer));
3306
+ };
3307
+ var unrefTimer = (timer) => {
3308
+ const t = timer;
3309
+ if (typeof t.unref === "function") t.unref();
3310
+ };
3311
+ var parsePersisted2 = (raw) => {
3312
+ if (!raw) return [];
3313
+ try {
3314
+ const parsed = JSON.parse(raw);
3315
+ if (!Array.isArray(parsed)) return [];
3316
+ const items = [];
3317
+ for (const entry of parsed) {
3318
+ if (entry && typeof entry === "object" && typeof entry.id === "number" && entry.event && typeof entry.event === "object") {
3319
+ items.push(entry);
3320
+ }
3321
+ }
3322
+ return items;
3323
+ } catch {
3324
+ return [];
3325
+ }
3326
+ };
3327
+ var createEventQueue = (options) => {
3328
+ var _a, _b, _c, _d, _e, _f, _g;
3329
+ const target = options.target;
3330
+ const storage = options.storage;
3331
+ const key = (_b = options.storageKey) != null ? _b : `wireai:evtq:${(_a = options.appId) != null ? _a : "default"}`;
3332
+ const maxSize = (_c = options.maxSize) != null ? _c : DEFAULTS.maxSize;
3333
+ const batchSize = (_d = options.batchSize) != null ? _d : DEFAULTS.batchSize;
3334
+ const baseBackoffMs = (_e = options.baseBackoffMs) != null ? _e : DEFAULTS.baseBackoffMs;
3335
+ const maxBackoffMs = (_f = options.maxBackoffMs) != null ? _f : DEFAULTS.maxBackoffMs;
3336
+ const maxRetries = (_g = options.maxRetries) != null ? _g : DEFAULTS.maxRetries;
3337
+ let pending = [];
3338
+ let nextId = 0;
3339
+ let flushing = false;
3340
+ let attempt = 0;
3341
+ let retryTimer;
3342
+ const resolveEnvelope = () => {
3343
+ try {
3344
+ return typeof options.envelope === "function" ? options.envelope() : options.envelope;
3345
+ } catch {
3346
+ return void 0;
3347
+ }
3348
+ };
3349
+ const stamp = (event) => {
3350
+ var _a2;
3351
+ const env = resolveEnvelope();
3352
+ const stamped = { ...event };
3353
+ if (!env) return stamped;
3354
+ if (!stamped.device && env.device) stamped.device = env.device;
3355
+ if (!stamped.session_id && env.sessionId) stamped.session_id = env.sessionId;
3356
+ const uc = { ...(_a2 = stamped.user_context) != null ? _a2 : {} };
3357
+ if (env.appVersion && uc.app_version === void 0) uc.app_version = env.appVersion;
3358
+ if (env.appBuild && uc.app_build === void 0) uc.app_build = env.appBuild;
3359
+ if (env.networkType && uc.network_type === void 0) uc.network_type = env.networkType;
3360
+ if (Object.keys(uc).length > 0) stamped.user_context = uc;
3361
+ return stamped;
3362
+ };
3363
+ const persist = () => {
3364
+ if (!storage) return;
3365
+ try {
3366
+ if (pending.length === 0) {
3367
+ void storage.removeItem(key).catch(() => {
3368
+ });
3369
+ return;
3370
+ }
3371
+ const payload = pending.map((item) => ({ id: item.id, event: item.event }));
3372
+ void storage.setItem(key, JSON.stringify(payload)).catch(() => {
3373
+ });
3374
+ } catch {
3375
+ }
3376
+ };
3377
+ const enforceSizeCap = () => {
3378
+ if (pending.length > maxSize) pending.splice(0, pending.length - maxSize);
3379
+ };
3380
+ const safeSig = (event) => {
3381
+ try {
3382
+ return JSON.stringify(event);
3383
+ } catch {
3384
+ return `__nosig_${nextId}_${Math.random()}`;
3385
+ }
3386
+ };
3387
+ const loadPromise = (async () => {
3388
+ if (!storage) return;
3389
+ try {
3390
+ const persistedItems = parsePersisted2(await withTimeout4(storage.getItem(key), READ_TIMEOUT_MS4));
3391
+ if (persistedItems.length === 0) return;
3392
+ const events = [...persistedItems.map((p) => p.event), ...pending.map((p) => p.event)];
3393
+ pending = [];
3394
+ nextId = 0;
3395
+ const seen = /* @__PURE__ */ new Set();
3396
+ for (const event of events) {
3397
+ const sig = safeSig(event);
3398
+ if (seen.has(sig)) continue;
3399
+ seen.add(sig);
3400
+ pending.push({ id: nextId++, event, sig });
3401
+ }
3402
+ enforceSizeCap();
3403
+ persist();
3404
+ } catch {
3405
+ }
3406
+ })();
3407
+ const postBatch = async (events) => {
3408
+ if (!(target == null ? void 0 : target.serverUrl) || events.length === 0) return false;
3409
+ try {
3410
+ const url = `${target.serverUrl.replace(/\/$/, "")}/v1/events`;
3411
+ const headers = { "Content-Type": "application/json" };
3412
+ if (target.apiKey) headers.Authorization = `Bearer ${target.apiKey}`;
3413
+ const res = await fetch(url, {
3414
+ method: "POST",
3415
+ headers,
3416
+ body: JSON.stringify({ events })
3417
+ });
3418
+ return !!(res && res.ok);
3419
+ } catch {
3420
+ return false;
3421
+ }
3422
+ };
3423
+ const clearRetry = () => {
3424
+ if (retryTimer !== void 0) {
3425
+ clearTimeout(retryTimer);
3426
+ retryTimer = void 0;
3427
+ }
3428
+ };
3429
+ const scheduleRetry = () => {
3430
+ if (attempt >= maxRetries) return;
3431
+ const delay = Math.min(baseBackoffMs * 2 ** attempt, maxBackoffMs);
3432
+ attempt++;
3433
+ clearRetry();
3434
+ retryTimer = setTimeout(() => {
3435
+ retryTimer = void 0;
3436
+ void drain();
3437
+ }, delay);
3438
+ unrefTimer(retryTimer);
3439
+ };
3440
+ const drain = async () => {
3441
+ try {
3442
+ await loadPromise;
3443
+ } catch {
3444
+ }
3445
+ if (flushing) return;
3446
+ flushing = true;
3447
+ try {
3448
+ while (pending.length > 0) {
3449
+ const batch = pending.slice(0, batchSize);
3450
+ const ok = await postBatch(batch.map((item) => item.event));
3451
+ if (!ok) {
3452
+ scheduleRetry();
3453
+ return;
3454
+ }
3455
+ const acked = new Set(batch.map((item) => item.id));
3456
+ pending = pending.filter((item) => !acked.has(item.id));
3457
+ persist();
3458
+ attempt = 0;
3459
+ clearRetry();
3460
+ }
3461
+ } finally {
3462
+ flushing = false;
3463
+ }
3464
+ };
3465
+ const flush = () => {
3466
+ try {
3467
+ void drain();
3468
+ } catch {
3469
+ }
3470
+ };
3471
+ const enqueue = (event) => {
3472
+ try {
3473
+ const stamped = stamp(event);
3474
+ const sig = safeSig(stamped);
3475
+ for (const item of pending) {
3476
+ if (item.sig === sig) return;
3477
+ }
3478
+ pending.push({ id: nextId++, event: stamped, sig });
3479
+ enforceSizeCap();
3480
+ persist();
3481
+ if (retryTimer === void 0) flush();
3482
+ } catch {
3483
+ }
3484
+ };
3485
+ const notifyOnline = () => {
3486
+ attempt = 0;
3487
+ clearRetry();
3488
+ flush();
3489
+ };
3490
+ const size = () => pending.length;
3491
+ return { enqueue, flush, notifyOnline, size };
3492
+ };
3493
+
3494
+ // src/session-analytics/useLifecycleEvents.ts
3495
+ var useLifecycleEvents = (config, options = {}) => {
3496
+ const latest = useRef({ config, options });
3497
+ latest.current = { config, options };
3498
+ const queueRef = useRef(void 0);
3499
+ useEffect(() => {
3500
+ var _a;
3501
+ const resolveSink = () => {
3502
+ var _a2, _b;
3503
+ const { config: cfg, options: opts } = latest.current;
3504
+ if (opts.sink) return opts.sink;
3505
+ if (!(cfg == null ? void 0 : cfg.serverUrl)) return void 0;
3506
+ if (!queueRef.current) {
3507
+ queueRef.current = createEventQueue({
3508
+ target: { serverUrl: cfg.serverUrl, apiKey: (_a2 = cfg.apiKey) != null ? _a2 : "" },
3509
+ storage: cfg.storage,
3510
+ // Dedicated key so the hook's internal queue never collides with a host's main queue.
3511
+ storageKey: `wireai:evtq:lifecycle:${(_b = cfg.appId) != null ? _b : "default"}`,
3512
+ envelope: opts.envelope
3513
+ });
3514
+ }
3515
+ return queueRef.current.enqueue;
3516
+ };
3517
+ const targetOf = (cfg) => {
3518
+ var _a2;
3519
+ return (cfg == null ? void 0 : cfg.serverUrl) ? { serverUrl: cfg.serverUrl, apiKey: (_a2 = cfg.apiKey) != null ? _a2 : "" } : void 0;
3520
+ };
3521
+ {
3522
+ const { config: cfg, options: opts } = latest.current;
3523
+ if (opts.enabled !== false) {
3524
+ const device = collectDeviceContext();
3525
+ if ((cfg == null ? void 0 : cfg.appVersion) && !device.appVersion) device.appVersion = cfg.appVersion;
3526
+ reportFirstOpen({
3527
+ target: targetOf(cfg),
3528
+ sink: resolveSink(),
3529
+ storage: cfg == null ? void 0 : cfg.storage,
3530
+ appId: cfg == null ? void 0 : cfg.appId,
3531
+ userId: opts.userId,
3532
+ deviceKey: opts.deviceKey,
3533
+ sessionCount: opts.sessionCount,
3534
+ appVersion: (_a = cfg == null ? void 0 : cfg.appVersion) != null ? _a : device.appVersion,
3535
+ platform: Platform.OS,
3536
+ device,
3537
+ meta: opts.meta
3538
+ });
3539
+ }
3540
+ }
3541
+ const fireSession = () => {
3542
+ var _a2;
3543
+ const { config: cfg, options: opts } = latest.current;
3544
+ if (opts.enabled === false) return;
3545
+ if (!(cfg == null ? void 0 : cfg.serverUrl) && !opts.sink) return;
3546
+ const device = collectDeviceContext();
3547
+ if ((cfg == null ? void 0 : cfg.appVersion) && !device.appVersion) device.appVersion = cfg.appVersion;
3548
+ reportSessionStart({
3549
+ target: targetOf(cfg),
3550
+ sink: resolveSink(),
3551
+ // A fresh per-open id each fire; the emitter's once-guard dedupes within the open.
3552
+ userId: opts.userId,
3553
+ deviceKey: opts.deviceKey,
3554
+ sessionCount: opts.sessionCount,
3555
+ appVersion: (_a2 = cfg == null ? void 0 : cfg.appVersion) != null ? _a2 : device.appVersion,
3556
+ platform: Platform.OS,
3557
+ device,
3558
+ meta: opts.meta
3559
+ });
3560
+ };
3561
+ fireSession();
3562
+ let backgroundedAt = null;
3563
+ const onChange = (state) => {
3564
+ if (state === "background" || state === "inactive") {
3565
+ if (backgroundedAt == null) backgroundedAt = Date.now();
3566
+ return;
3567
+ }
3568
+ if (state === "active") {
3569
+ const since = backgroundedAt;
3570
+ backgroundedAt = null;
3571
+ if (since != null && Date.now() - since >= BACKGROUND_SESSION_MS) fireSession();
3572
+ }
3573
+ };
3574
+ const sub = AppState.addEventListener("change", onChange);
3575
+ return () => {
3576
+ if (sub && typeof sub.remove === "function") sub.remove();
3577
+ };
3578
+ }, []);
3579
+ };
3580
+
3581
+ export { AnimatedSparkle, BACKGROUND_SESSION_MS, CardHandoff, CenteredModal, ChipSelectCard, CompletionView, DEFAULT_FEATURES_TTL_MS, DEFAULT_SESSION_TTL_MS, DemoOnboarding, DoneBlock, ErrorBlock, FIRST_OPEN_EVENT, IllustrationProvider, InterstitialCard, LoadingBlock, LoadingScreen, NumberStepperCard, Button as OnboardingButton, OnboardingFlow, OnboardingScaffold, OnboardingThemeProvider, SESSION_STARTED_EVENT, SelectionCard, StatusCard, StepProgress, TextInputCard, USER_ID_MAX_LENGTH, WIRE_ONBOARDING_EVENTS, WireFeaturesProvider, WireOnboarding, attributionMetadata, clearPersistedSession, collectDeviceContext, defaultIllustrations, defaultOnboardingTheme, defaultWireFeatures, deriveAnswers, featuresCacheKey, featuresEqual, fetchWireFeatures, firstOpenStorageKey, identifyOnboarding, isFeaturesFresh, isOnboardingEnabled, loadPersistedSession, makeSessionId, mergeTheme, motionSpec_exports as motionSpec, onboardingComponents, parseWireFeatures, peekPersistedSession, readCachedFeatures, readProgress, reportClientEvent, reportClientEvents, reportFirstOpen, reportSessionStart, resetFirstOpenLatch, resetSessionStartGuard, sanitizeUserId, savePersistedSession, sessionStorageKey, themeFromBrand, toAnalyticsEvent, useIllustration, useLifecycleEvents, useOnboardingTheme, useReducedMotion, useResolvedFeatures, useSessionStart, useWireFeatures, useWireFeaturesContext, wireConfigFromEnv, wireLifecycleEvents, writeCachedFeatures };
3185
3582
  //# sourceMappingURL=index.mjs.map
3186
3583
  //# sourceMappingURL=index.mjs.map