@corbado/observe 0.12.0 → 0.14.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/dist/index.d.mts CHANGED
@@ -24,6 +24,8 @@ declare enum AuthEventName {
24
24
  SubflowError = "subflow_error",
25
25
  SubflowStarted = "subflow_started",
26
26
  SubflowFinished = "subflow_finished",
27
+ /** Client-side flow enrichment (the server accepts `session_enriched` as a legacy alias). */
28
+ FlowEnriched = "flow_enriched",
27
29
  Conversion = "conversion"
28
30
  }
29
31
  interface BaseEvent {
@@ -51,6 +53,15 @@ interface BaseEvent {
51
53
  type UserReference = {
52
54
  userId?: string;
53
55
  identifier?: string;
56
+ /** Shared UUID used to link sessions across environments. */
57
+ crossEnvironmentTransactionID?: string;
58
+ };
59
+ type LegacyUserReference = {
60
+ /** @deprecated Use tracker.setUser() within the active flow instead. */
61
+ userId?: string;
62
+ /** @deprecated Use tracker.setUser() within the active flow instead. */
63
+ identifier?: string;
64
+ /** @deprecated Use tracker.setUser() within the active flow instead. */
54
65
  crossEnvironmentTransactionID?: string;
55
66
  };
56
67
  /**
@@ -83,11 +94,11 @@ type Conversion = {
83
94
  name: string;
84
95
  /** Where the conversion happened, e.g. `"checkout"` or `"product-page"`. */
85
96
  touchpoint?: string;
86
- } & UserReference;
97
+ } & LegacyUserReference;
87
98
  type FlowFinished = {
88
99
  flowName: FlowType;
89
100
  explicitOutcome?: "skipped" | "visible-auto-skip" | "invisible";
90
- } & UserReference;
101
+ } & LegacyUserReference;
91
102
  type FlowReset = {
92
103
  flowName?: FlowType;
93
104
  };
@@ -97,7 +108,7 @@ type MultiFlowReset = {
97
108
  type FlowAutoFinished = {
98
109
  flowName: FlowType;
99
110
  finishedByFlowName: FlowType;
100
- } & UserReference;
111
+ } & LegacyUserReference;
101
112
  type AuthMethodDecisionStarted = {
102
113
  decisionName: string;
103
114
  options: (AuthMethodType | (string & {}))[];
@@ -105,15 +116,16 @@ type AuthMethodDecisionStarted = {
105
116
  };
106
117
  type AuthMethodDecisionFinished = {
107
118
  decisionName: string;
108
- options: (AuthMethodType | (string & {}))[];
119
+ /** Optional — when omitted, the backend completes the open decision of the same name using its declared options (classifier follow-up). */
120
+ options?: (AuthMethodType | (string & {}))[];
109
121
  explicitDecisionValue?: string;
110
122
  };
111
123
  type ProvideIdentifierStart = {};
112
- type ProvideIdentifierError = UserReference & {
124
+ type ProvideIdentifierError = LegacyUserReference & {
113
125
  errorCode?: string;
114
126
  error?: any;
115
127
  };
116
- type ProvideIdentifierFinish = UserReference & {
128
+ type ProvideIdentifierFinish = LegacyUserReference & {
117
129
  identifierPrefillingCreated?: boolean;
118
130
  };
119
131
  type PasskeyLoginClientError = {
@@ -125,7 +137,7 @@ type PasskeyLoginStartable = {
125
137
  type PasskeyLoginSubmitted = {
126
138
  assertionResponse: string;
127
139
  };
128
- type PasskeyLoginFinish = UserReference & {};
140
+ type PasskeyLoginFinish = LegacyUserReference & {};
129
141
  type AuthDecisionStarted = {
130
142
  decisionName: string;
131
143
  options: string[];
@@ -136,6 +148,7 @@ type AuthDecisionFinished = {
136
148
  explicitDecisionValue?: string;
137
149
  };
138
150
  type StepOptions = {
151
+ /** @deprecated Use tracker.setUser() within the active flow instead. */
139
152
  userReference?: UserReference;
140
153
  explicitTimestamp?: number;
141
154
  /** Per-call experiment override (experiment key → variant), merged over the persistent assignments. */
@@ -144,6 +157,15 @@ type StepOptions = {
144
157
  type SubflowTrigger = {
145
158
  actor: "system" | "user";
146
159
  explicitSpecType?: string;
160
+ /**
161
+ * Declares this subflow_started / subflow_trigger as not user-driven, excluding it from
162
+ * interaction-evidence calculations on the backend: a started subflow that produces no step
163
+ * afterwards is classified as a "no-followup" error unless this flag is set. Set it when the
164
+ * integration fires the start programmatically (e.g. an automatic passkey attempt after
165
+ * identifier lookup) and an abandoned attempt is expected rather than an error signal.
166
+ * Optional; absent/false means the event counts (legacy behavior).
167
+ */
168
+ ignoreAsInteraction?: boolean;
147
169
  };
148
170
  interface PredefinedEvent extends BaseEvent {
149
171
  type: "predefined";
@@ -486,7 +508,15 @@ declare abstract class OperationFull {
486
508
  private tracker;
487
509
  private operationName;
488
510
  constructor(tracker: CorbadoTracker, operationName: SubflowType);
511
+ /**
512
+ * Emits an additional subflow_started; construction already emits the initial start.
513
+ * `data` supports SubflowTrigger fields (`actor`, `explicitSpecType`, `ignoreAsInteraction`)
514
+ * plus free-form extras; see SubflowTrigger for programmatic interaction suppression.
515
+ */
489
516
  subflowStart(data: any, options?: StepOptions): void;
517
+ /**
518
+ * @deprecated `subflow_trigger` will be removed in the next major version.
519
+ */
490
520
  trigger(data: SubflowTrigger, options?: StepOptions): void;
491
521
  customStep<TStart = {}, TFinished = {}>(stepName: string): StepHelper<TStart, TFinished>;
492
522
  protected subflowStepStarted(stepName: string, data: any, options?: StepOptions, ignoreAsInteraction?: boolean): void;
@@ -540,12 +570,16 @@ type PasskeyLoginPostResponseStart = {
540
570
  */
541
571
  assertionResponse?: string;
542
572
  };
573
+ type PasskeyLoginOperationConfig = {
574
+ /** The classifier drops the attempt if no spec type arrives on any of its events — supply it here or on a step's start data as soon as known. */
575
+ explicitSpecType?: PasskeyOperationLoginExplicitSpecType;
576
+ };
543
577
  declare class PasskeyLoginOperationFull extends OperationFull {
544
578
  readonly getOptions: StepHelper<PasskeyLoginGetOptionsStart, PasskeyLoginGetOptionsFinished>;
545
579
  readonly ceremony: StepHelper<PasskeyLoginCeremonyStart, PasskeyLoginCeremonyFinished>;
546
580
  readonly postResponse: StepHelper<PasskeyLoginPostResponseStart>;
547
581
  private lowEventTracker;
548
- constructor(tracker: CorbadoTracker);
582
+ constructor(tracker: CorbadoTracker, config?: PasskeyLoginOperationConfig);
549
583
  /**
550
584
  * @deprecated `subflow_trigger` is not supported for passkey-login and will be removed in the
551
585
  * next major version.
@@ -591,14 +625,29 @@ type EmailLinkOperationSendStart = {
591
625
  type EmailLinkOperationPostResponseStart = {
592
626
  explicitSpecType?: EmailLinkOperationSpecType;
593
627
  };
628
+ type EmailLinkOperationConfig = {
629
+ /** The classifier drops the attempt if no spec type arrives on any of its events — supply it here or on a step's start data as soon as known. */
630
+ explicitSpecType?: EmailLinkOperationSpecType;
631
+ };
594
632
  declare class EmailLinkOperationFull extends OperationFull {
595
633
  readonly send: StepHelper<EmailLinkOperationSendStart>;
596
634
  readonly postResponse: StepHelper<EmailLinkOperationPostResponseStart>;
597
635
  readonly resend: StepHelper;
598
- constructor(tracker: CorbadoTracker);
636
+ constructor(tracker: CorbadoTracker, config?: EmailLinkOperationConfig);
599
637
  }
600
638
 
601
- type PasskeyOperationEnrollmentExplicitSpecType = "conditional-auto-manual" | "auto-manual" | "manual";
639
+ /**
640
+ * Passkey-enrollment spec types. Two vocabularies coexist:
641
+ *
642
+ * - ATTEMPT-scoped (preferred): one subflow per attempt KIND — `"conditional"` (silent conditional
643
+ * create), `"auto"` (automatic required-mediation prompt fired by the integration) or `"manual"`
644
+ * (fired by the user's button). Create a NEW operation for every attempt; the backend opens a new
645
+ * subflow whenever the spec changes, so "auto prompt dismissed, then completed via the button" is two
646
+ * subflows and stays distinguishable from "completed by the auto prompt".
647
+ * - OFFER-scoped (legacy): one subflow per offer — `"conditional-auto-manual"` / `"auto-manual"` name
648
+ * the offer mode, and the completing ceremony's `mediation` tells the completion variants apart.
649
+ */
650
+ type PasskeyOperationEnrollmentExplicitSpecType = "conditional" | "auto" | "manual" | "conditional-auto-manual" | "auto-manual";
602
651
  type PasskeyEnrollmentGetOptionsStart = {
603
652
  explicitSpecType?: PasskeyOperationEnrollmentExplicitSpecType;
604
653
  };
@@ -626,7 +675,15 @@ type PasskeyEnrollmentPostResponseStart = {
626
675
  attestationResponse?: string;
627
676
  };
628
677
  type PasskeyEnrollmentOperationConfig = {
678
+ /** The classifier drops the attempt if no spec type arrives on any of its events — supply it here or on a step's start data as soon as known. */
629
679
  explicitSpecType?: PasskeyOperationEnrollmentExplicitSpecType;
680
+ /**
681
+ * Marks the auto-emitted `subflow_started` as not user-driven (see SubflowTrigger.ignoreAsInteraction).
682
+ * Set it for attempts the integration fires without a user gesture and without a visible surface —
683
+ * e.g. a `"conditional"` attempt — so a start that never produced a step is not read as a user asking
684
+ * to enroll.
685
+ */
686
+ ignoreAsInteraction?: boolean;
630
687
  };
631
688
  declare class PasskeyEnrollmentOperationFull extends OperationFull {
632
689
  readonly getOptions: StepHelper<PasskeyEnrollmentGetOptionsStart, PasskeyEnrollmentGetOptionsFinished>;
@@ -662,14 +719,11 @@ type PasswordLoginCUIGetOptionsFinished = {
662
719
  type PasswordLoginCUICeremonyStart = {
663
720
  explicitSpecType?: PasswordLoginCUISpecType;
664
721
  };
665
- type PasswordLoginAutoTrackConfig = {
666
- explicitSpecType: "password-known-identifier";
667
- /** The password input field. */
668
- inputHtmlField: HTMLInputElement;
669
- } | {
670
- explicitSpecType: "password-with-identifier";
671
- /** The password input field. */
672
- inputHtmlField: HTMLInputElement;
722
+ type PasswordLoginExplicitSpecType = "password-known-identifier" | "password-with-identifier";
723
+ type PasswordLoginConfig = {
724
+ explicitSpecType?: PasswordLoginExplicitSpecType;
725
+ /** The password input field. When set, low-event input tracking is attached to it. */
726
+ inputHtmlField?: HTMLInputElement;
673
727
  /**
674
728
  * The identifier (e.g. email) input field. Accepted but not tracked yet — low-event
675
729
  * tracking for a second field lands together with per-field attribution.
@@ -690,7 +744,7 @@ declare class PasswordLoginOperationFull extends OperationFull {
690
744
  postResponse: StepHelper;
691
745
  };
692
746
  private lowEventTracker?;
693
- constructor(tracker: CorbadoTracker, autoTrackConfig?: PasswordLoginAutoTrackConfig);
747
+ constructor(tracker: CorbadoTracker, config?: PasswordLoginConfig);
694
748
  /**
695
749
  * @deprecated `subflow_trigger` is not supported for password-login and will be removed in the
696
750
  * next major version.
@@ -704,15 +758,17 @@ type PasswordEnrollmentTypedError = {
704
758
  };
705
759
  type PasswordEnrollmentTypedErrorCode = "requirements_not_fulfilled";
706
760
  type PasswordEnrollmentExplicitSpecType = "password-set" | "password-reset";
707
- type PasswordEnrollmentAutoTrackConfig = {
761
+ type PasswordEnrollmentConfig = {
762
+ /** The classifier drops the attempt if no spec type arrives on any of its events — supply it here or on a step's start data as soon as known. */
708
763
  explicitSpecType?: PasswordEnrollmentExplicitSpecType;
764
+ /** The password input field. When set, low-event input tracking is attached to it. */
709
765
  inputHtmlField?: HTMLInputElement;
710
766
  };
711
767
  declare class PasswordEnrollmentOperationFull extends OperationFull {
712
768
  readonly clientValidation: StepHelper;
713
769
  readonly postResponse: StepHelper<{}, {}, PasswordEnrollmentTypedError>;
714
770
  private lowEventTracker?;
715
- constructor(tracker: CorbadoTracker, autoTrackConfig?: PasswordEnrollmentAutoTrackConfig);
771
+ constructor(tracker: CorbadoTracker, config?: PasswordEnrollmentConfig);
716
772
  destroy(): void;
717
773
  }
718
774
 
@@ -736,16 +792,15 @@ type PasskeyLoginCUIGetOptionsFinished = {
736
792
  assertionOptions: string;
737
793
  };
738
794
  type OperationFullProvideIdentifierWithCUIConfig = {
795
+ /** When set, low event collection is enabled for the input field. */
739
796
  inputHtmlField?: HTMLInputElement;
740
797
  explicitSpecType?: ProvideIdentifierSpecType;
741
798
  };
742
- declare class OperationFullProvideIdentifierWithCUI {
743
- private tracker;
799
+ declare class OperationFullProvideIdentifierWithCUI extends OperationFull {
744
800
  private lowEventTracker?;
745
801
  readonly cui: {
746
802
  /**
747
- * @deprecated `subflow_trigger` is not supported for the CUI part of provide-identifier and
748
- * will be removed in the next major version.
803
+ * @deprecated `subflow_trigger` will be removed in the next major version.
749
804
  */
750
805
  trigger: (data: SubflowTrigger, options?: StepOptions) => void;
751
806
  getOptions: StepHelper<PasskeyLoginCUIGetOptionsStart, PasskeyLoginCUIGetOptionsFinished>;
@@ -754,32 +809,34 @@ declare class OperationFullProvideIdentifierWithCUI {
754
809
  };
755
810
  readonly provideIdentifier: {
756
811
  /**
757
- * @deprecated `subflow_trigger` is not supported for provide-identifier and will be removed
758
- * in the next major version.
812
+ * @deprecated `subflow_trigger` will be removed in the next major version.
759
813
  */
760
814
  trigger: (data: SubflowTrigger, options?: StepOptions) => void;
761
815
  clientValidation: StepHelper;
762
816
  postResponse: StepHelper<ProvideIdentifierPostResponseStart>;
763
817
  };
764
818
  constructor(tracker: CorbadoTracker, config?: OperationFullProvideIdentifierWithCUIConfig);
765
- private createStep;
766
819
  destroy(): void;
767
820
  }
768
821
 
769
822
  type SocialLoginSpecType = "pre-identifier" | "post-identifier";
770
823
  type SocialLoginGetRedirectUrlStart = {
771
824
  provider?: SocialLoginProviderType;
772
- explicitSpecType: SocialLoginSpecType;
825
+ explicitSpecType?: SocialLoginSpecType;
773
826
  };
774
827
  type SocialLoginGetRedirectUrlFinished = {};
775
828
  type SocialLoginExchangeCodeStart = {
776
829
  provider?: SocialLoginProviderType;
777
830
  };
778
831
  type SocialLoginExchangeCodeFinished = {};
832
+ type SocialLoginOperationConfig = {
833
+ /** The classifier drops the attempt if no spec type arrives on any of its events — supply it here or on a step's start data as soon as known. */
834
+ explicitSpecType?: SocialLoginSpecType;
835
+ };
779
836
  declare class SocialLoginOperationFull extends OperationFull {
780
837
  readonly getRedirectUrl: StepHelper<SocialLoginGetRedirectUrlStart, SocialLoginGetRedirectUrlFinished>;
781
838
  readonly exchangeCode: StepHelper<SocialLoginExchangeCodeStart, SocialLoginExchangeCodeFinished>;
782
- constructor(tracker: CorbadoTracker);
839
+ constructor(tracker: CorbadoTracker, config?: SocialLoginOperationConfig);
783
840
  }
784
841
 
785
842
  type AppConfirmationOperationSpecType = "qr-code";
@@ -791,11 +848,14 @@ type AppConfirmationOperationCeremonyTypedError = {
791
848
  };
792
849
  type AppConfirmationOperationCeremonyTypedErrorCode = "declined" | "expired";
793
850
  type AppConfirmationOperationRetryReason = AppConfirmationOperationCeremonyTypedErrorCode | "technical-error" | "manual";
851
+ type AppConfirmationOperationConfig = {
852
+ explicitSpecType?: AppConfirmationOperationSpecType;
853
+ };
794
854
  declare class AppConfirmationOperationFull extends OperationFull {
795
855
  readonly ceremony: StepHelper<{}, {}, AppConfirmationOperationCeremonyTypedError>;
796
856
  readonly retry: StepHelper;
797
857
  readonly postResponse: StepHelper;
798
- constructor(tracker: CorbadoTracker, explicitSpecType?: AppConfirmationOperationSpecType);
858
+ constructor(tracker: CorbadoTracker, config?: AppConfirmationOperationConfig);
799
859
  }
800
860
 
801
861
  /**
@@ -819,6 +879,7 @@ type ProvideDataOperationSpecType = "signup" | "login" | "recovery" | "enrollmen
819
879
  type ProvideDataOperationStart = {
820
880
  /** Stable name of the data field collected by this subflow, when known. */
821
881
  fieldName?: string;
882
+ /** The classifier drops the attempt if no spec type arrives on any of its events — supply it here or on a step's start data as soon as known. */
822
883
  explicitSpecType?: ProvideDataOperationSpecType;
823
884
  };
824
885
  type ProvideDataOperationConfig = ProvideDataOperationStart & {
@@ -838,6 +899,7 @@ declare class ProvideDataOperationFull extends OperationFull {
838
899
  }
839
900
 
840
901
  interface TrackerOptions {
902
+ /** All persisted SDK state and cross-tab locks are isolated by this project id. */
841
903
  projectId: string;
842
904
  apiBaseUrl: string;
843
905
  apiEventPath?: string;
@@ -878,6 +940,8 @@ declare class CorbadoTracker {
878
940
  private sessionStorage;
879
941
  /** Dedicated localStorage engine for reliability state (config cache, outbox, continuity session, seq). */
880
942
  private persistentStorage;
943
+ /** Seq/continuity Web Lock name; project-scoped together with the storage keys it guards. */
944
+ private readonly seqLockName;
881
945
  /**
882
946
  * Reliability config for this load. A boot with a cached server config is a snapshot (immutable
883
947
  * mid-load); a boot on the built-in defaults upgrades once to the first server-returned config
@@ -966,12 +1030,15 @@ declare class CorbadoTracker {
966
1030
  * same browser. Rotates after `config.sessionInactivityMs` of inactivity (server-controlled,
967
1031
  * boot-snapshot like the rest of the config), resetting the seq counter.
968
1032
  *
969
- * This is the ONLY place an inactivity rotation happens. Rotating here is safe because the load
970
- * that triggers it also re-announces its flow (an integration emits `flow_started` on page load),
971
- * so the fresh session id gets a classifiable flow. Mid-page there is no such re-announcement:
972
- * rotating between two tracked events would leave the started flow unfinished in the old session
973
- * and the remaining events without a flow start in the new one — one gap counted as a drop-off,
974
- * one completion counted as nothing. `nextSeq` therefore never rotates on inactivity.
1033
+ * Inactivity rotation happens at boot only, here and on the per-tab path {@link resolveSessionId}
1034
+ * takes without continuity. Boot is chosen on an assumption, not a guarantee: that a load
1035
+ * re-announces its flow, so the fresh session id gets a classifiable flow. That holds where a
1036
+ * flow is opened per load. Where one is opened once and carried across loads it does not, and a
1037
+ * boot rotation splits that flow — such a project needs a window long enough to span the journey.
1038
+ * Mid-page the assumption is not even available: nothing re-announces between two tracked events,
1039
+ * so rotating there would leave the started flow unfinished in the old session and the remaining
1040
+ * events without a flow start in the new one — one gap counted as a drop-off, one completion
1041
+ * counted as nothing. `nextSeq` therefore never rotates on inactivity, on either path.
975
1042
  */
976
1043
  private getContinuitySessionId;
977
1044
  /**
@@ -979,6 +1046,24 @@ declare class CorbadoTracker {
979
1046
  * section measures from the last write that actually happened — whoever made it.
980
1047
  */
981
1048
  private persistContinuitySession;
1049
+ /**
1050
+ * Read the per-tab session record. A bare string is the format that predates dating: it carries no
1051
+ * `lastActiveAt`, so its window can only start on the load that reads it. That load rewrites it in
1052
+ * the dated shape, so a tab converts once and ages normally from then on, and the case drains as
1053
+ * the rollout replaces the bundles that write it.
1054
+ */
1055
+ private readPerTabSession;
1056
+ /**
1057
+ * Persist the per-tab record and remember when, sharing the throttle bookkeeping with the
1058
+ * continuity record — a load resolves its session on one path or the other, never both.
1059
+ *
1060
+ * Only a load that received a server config stamps the window; any other carries forward what the
1061
+ * tab already knows. So a defaults boot never downgrades a tab that has already learned the
1062
+ * project's threshold to the built-in one, and the window survives a rotation within the tab.
1063
+ */
1064
+ private persistPerTabSession;
1065
+ /** The window this tab measures against: what a configured load recorded, else this load's own. */
1066
+ private perTabInactivityMs;
982
1067
  /**
983
1068
  * Return the next sequence number. With session continuity the counter is persisted so ordering
984
1069
  * survives reloads/redirects; the read-increment-write runs under a cross-tab Web Lock
@@ -1008,7 +1093,11 @@ declare class CorbadoTracker {
1008
1093
  trackSubflowStepStarted(subflowType: SubflowType, stepName: string, data: Record<string, any>, options?: StepOptions, ignoreAsInteraction?: boolean): void;
1009
1094
  trackSubflowStepFinished(subflowType: SubflowType, stepName: string, data: Record<string, any>, options?: StepOptions): void;
1010
1095
  trackSubflowStepError(subflowType: SubflowType, stepName: string, data: Record<string, any>, options?: StepOptions): void;
1011
- trackSubflowFinished(subflowType: SubflowType, data: Record<string, any>, options?: StepOptions): void;
1096
+ /**
1097
+ * @remarks
1098
+ * Records an additional error occurrence against the subflow. Carries no outcome semantics —
1099
+ * step errors are the intended channel; not part of a normal integration.
1100
+ */
1012
1101
  trackSubflowError(subflowType: SubflowType, data: Record<string, any>, options?: StepOptions): void;
1013
1102
  /**
1014
1103
  * Error situations:
@@ -1028,6 +1117,9 @@ declare class CorbadoTracker {
1028
1117
  *
1029
1118
  * @param data - Flow metadata, including one flow (`flowName`) or multiple candidates (`flowNames`).
1030
1119
  * @param tags - Optional key-value tags for filtering and segmentation.
1120
+ * @param experiments - Optional per-call experiment overrides.
1121
+ * @param contexts - Optional structured event context (e.g. technical metadata that is not an
1122
+ * analytical dimension). Written to the event's `contexts` field verbatim.
1031
1123
  *
1032
1124
  * @example
1033
1125
  * ```typescript
@@ -1038,7 +1130,7 @@ declare class CorbadoTracker {
1038
1130
  * });
1039
1131
  * ```
1040
1132
  */
1041
- flowStarted(data: FlowStarted | MultiFlowStarted, tags?: Record<string, string>, experiments?: Record<string, string>): void;
1133
+ flowStarted(data: FlowStarted | MultiFlowStarted, tags?: Record<string, string>, experiments?: Record<string, string>, contexts?: Record<string, unknown>): void;
1042
1134
  /**
1043
1135
  * Track when the user commits to a specific flow.
1044
1136
  *
@@ -1062,10 +1154,12 @@ declare class CorbadoTracker {
1062
1154
  * Use this for outcomes you care about beyond auth, such as a completed purchase,
1063
1155
  * a started subscription, or a newsletter signup. Provide a stable `name` for the
1064
1156
  * conversion and (optionally) the `touchpoint` where it happened so it can be
1065
- * segmented in the same way as flows. If available, include `userId` and/or
1066
- * `identifier` to link the conversion to a user.
1157
+ * segmented in the same way as flows. Record identity separately with `setUser()`
1158
+ * while the relevant flow is still active.
1067
1159
  *
1068
- * @param data - Conversion name, optional touchpoint, and optional user reference.
1160
+ * Legacy identity fields in `data` remain supported but are deprecated.
1161
+ *
1162
+ * @param data - Conversion name, optional touchpoint, and deprecated user reference fields.
1069
1163
  * @param tags - Optional key-value tags for filtering and segmentation.
1070
1164
  *
1071
1165
  * @example
@@ -1073,7 +1167,6 @@ declare class CorbadoTracker {
1073
1167
  * tracker.conversion({
1074
1168
  * name: "purchase",
1075
1169
  * touchpoint: "checkout",
1076
- * userId: "usr_123",
1077
1170
  * });
1078
1171
  * ```
1079
1172
  */
@@ -1083,18 +1176,18 @@ declare class CorbadoTracker {
1083
1176
  *
1084
1177
  * @remarks
1085
1178
  * Fire this when the user has finished the target flow end-to-end, such as completed login,
1086
- * signup, or recovery. If available, include `userId` and/or `identifier` so the event is
1087
- * linked to a user reference.
1179
+ * signup, or recovery. Record identity separately with `setUser()` while the flow
1180
+ * is still active, before calling `flowFinished()`.
1181
+ *
1182
+ * Legacy identity fields in `data` remain supported but are deprecated.
1088
1183
  *
1089
- * @param data - Finished flow name plus optional user reference fields.
1184
+ * @param data - Finished flow name, optional explicit outcome, and deprecated user reference fields.
1090
1185
  * @param tags - Optional key-value tags for filtering and segmentation.
1091
1186
  *
1092
1187
  * @example
1093
1188
  * ```typescript
1094
1189
  * tracker.flowFinished({
1095
1190
  * flowName: "login",
1096
- * userId: "usr_123",
1097
- * identifier: "max@example.com",
1098
1191
  * });
1099
1192
  * ```
1100
1193
  */
@@ -1121,9 +1214,12 @@ declare class CorbadoTracker {
1121
1214
  * @remarks
1122
1215
  * Use this for automatic completions where no separate explicit finish action happens in the
1123
1216
  * current flow. Set `flowName` to the auto-finished flow and `finishedByFlowName` to the flow
1124
- * that caused it.
1217
+ * that caused it. Record identity with `setUser()` while the intended flow is still
1218
+ * current, before it is auto-finished.
1125
1219
  *
1126
- * @param data - Auto-finished flow, finishing flow, and optional user reference fields.
1220
+ * Legacy identity fields in `data` remain supported but are deprecated.
1221
+ *
1222
+ * @param data - Auto-finished flow, finishing flow, and deprecated user reference fields.
1127
1223
  * @param tags - Optional key-value tags for filtering and segmentation.
1128
1224
  *
1129
1225
  * @example
@@ -1131,11 +1227,32 @@ declare class CorbadoTracker {
1131
1227
  * tracker.flowAutoFinished({
1132
1228
  * flowName: "signup",
1133
1229
  * finishedByFlowName: "login",
1134
- * userId: "usr_123",
1135
1230
  * });
1136
1231
  * ```
1137
1232
  */
1138
1233
  flowAutoFinished(data: FlowAutoFinished, tags?: Record<string, string>, experiments?: Record<string, string>): void;
1234
+ /**
1235
+ * Record a newly known user reference for the current active flow.
1236
+ *
1237
+ * @remarks
1238
+ * Emits one `flow_enriched` with `match: { flowType: "*", at: "during" }` and `expFol: true` in its data.
1239
+ * Call only after the flow starts and before it finishes. The enrichment belongs
1240
+ * to the current flow at emission time.
1241
+ * Calling after `flowFinished()` cannot enrich that finished flow. If a parent or another
1242
+ * flow is current then, the enrichment belongs to that flow instead.
1243
+ * An empty reference does not clear identity. Cross-environment transaction IDs must be UUIDs;
1244
+ * both environments must report the shared ID while their respective flows are active.
1245
+ *
1246
+ * @param user - User ID, identifier, and/or cross-environment transaction UUID.
1247
+ *
1248
+ * @example
1249
+ * ```typescript
1250
+ * tracker.flowStarted({ flowName: "login" });
1251
+ * tracker.setUser({ userId: "usr_123", identifier: "max@example.com" });
1252
+ * tracker.flowFinished({ flowName: "login" });
1253
+ * ```
1254
+ */
1255
+ setUser(user: UserReference): void;
1139
1256
  /**
1140
1257
  * Track when you present authentication method choices to the user.
1141
1258
  *
@@ -1160,7 +1277,15 @@ declare class CorbadoTracker {
1160
1277
  */
1161
1278
  authMethodsDecisionStarted(data: AuthMethodDecisionStarted, tags?: Record<string, string>, experiments?: Record<string, string>, options?: Pick<StepOptions, "explicitTimestamp">): void;
1162
1279
  authMethodsDecisionFinished(data: AuthMethodDecisionFinished, tags?: Record<string, string>, experiments?: Record<string, string>): void;
1280
+ /**
1281
+ * @deprecated Use {@link CorbadoTracker.authMethodsDecisionStarted} instead (its `options`
1282
+ * already accept free-form strings).
1283
+ */
1163
1284
  authDecisionStarted(data: AuthDecisionStarted, tags?: Record<string, string>, experiments?: Record<string, string>): void;
1285
+ /**
1286
+ * @deprecated Use {@link CorbadoTracker.authMethodsDecisionFinished} instead (its `options`
1287
+ * already accept free-form strings).
1288
+ */
1164
1289
  authDecisionFinished(data: AuthDecisionFinished, tags?: Record<string, string>, experiments?: Record<string, string>): void;
1165
1290
  /**
1166
1291
  * Enqueue a "low" event (granular DOM/window/visualviewport/PWM signal) for the current session.
@@ -1219,17 +1344,17 @@ declare class CorbadoTracker {
1219
1344
  * @internal
1220
1345
  */
1221
1346
  lowEventFlushKeepalive(): void;
1222
- passkeyLoginFullOperation(): PasskeyLoginOperationFull;
1347
+ passkeyLoginFullOperation(config?: PasskeyLoginOperationConfig): PasskeyLoginOperationFull;
1223
1348
  passkeyEnrollmentFullOperation(config?: PasskeyEnrollmentOperationConfig): PasskeyEnrollmentOperationFull;
1224
- passwordLoginFullOperation(autoTrackConfig?: PasswordLoginAutoTrackConfig): PasswordLoginOperationFull;
1225
- passwordEnrollmentFullOperation(autoTrackConfig?: PasswordEnrollmentAutoTrackConfig): PasswordEnrollmentOperationFull;
1226
- emailLinkOperationFull(): EmailLinkOperationFull;
1349
+ passwordLoginFullOperation(autoTrackConfig?: PasswordLoginConfig): PasswordLoginOperationFull;
1350
+ passwordEnrollmentFullOperation(autoTrackConfig?: PasswordEnrollmentConfig): PasswordEnrollmentOperationFull;
1351
+ emailLinkOperationFull(config?: EmailLinkOperationConfig): EmailLinkOperationFull;
1227
1352
  emailOtpOperationFull(config?: EmailOTPOperationConfig): EmailOtpOperationFull;
1228
1353
  smsOtpOperationFull(config?: SmsOTPOperationConfig): SmsOtpOperationFull;
1229
1354
  provideIdentifierOperationFull(config?: OperationFullProvideIdentifierWithCUIConfig): OperationFullProvideIdentifierWithCUI;
1230
1355
  provideDataOperationFull(config?: ProvideDataOperationConfig): ProvideDataOperationFull;
1231
- socialLoginOperationFull(): SocialLoginOperationFull;
1232
- appConfirmationOperationFull(explicitSpecType?: AppConfirmationOperationSpecType): AppConfirmationOperationFull;
1356
+ socialLoginOperationFull(config?: SocialLoginOperationConfig): SocialLoginOperationFull;
1357
+ appConfirmationOperationFull(config?: AppConfirmationOperationConfig): AppConfirmationOperationFull;
1233
1358
  captchaOperationFull(config?: CaptchaOperationConfig): CaptchaOperationFull;
1234
1359
  /**
1235
1360
  * Flush any pending events and release all resources (timers, event listeners).
@@ -1303,6 +1428,28 @@ interface StorageEngine {
1303
1428
  setItem<T>(key: string, value: T): void;
1304
1429
  removeItem(key: string): void;
1305
1430
  }
1431
+ /**
1432
+ * Suffix a storage key or cross-tab lock name with a namespace. One shared helper so keys and the
1433
+ * Web Lock names guarding them can never disagree on the derived name.
1434
+ */
1435
+ declare function namespacedKey(key: string, namespace: string): string;
1436
+ /**
1437
+ * Wraps a storage engine so every key is suffixed with a fixed namespace (see {@link namespacedKey}).
1438
+ *
1439
+ * @remarks
1440
+ * All trackers use their project id as the namespace: all SDK state flows through the engines
1441
+ * created in the tracker constructor, so wrapping them scopes every persisted key (session, seq,
1442
+ * outbox, config cache, experiments, tab id, client-env handle, debug dumps) in one place. Lock
1443
+ * names are not storage keys and must be scoped separately by the call sites that own them.
1444
+ */
1445
+ declare class NamespacedStorage implements StorageEngine {
1446
+ private readonly engine;
1447
+ private readonly namespace;
1448
+ constructor(engine: StorageEngine, namespace: string);
1449
+ getItem<T>(key: string): T | null;
1450
+ setItem<T>(key: string, value: T): void;
1451
+ removeItem(key: string): void;
1452
+ }
1306
1453
  declare class LocalStorage implements StorageEngine {
1307
1454
  private logger;
1308
1455
  constructor(logger: Logger);
@@ -1402,6 +1549,11 @@ interface QueueOptions {
1402
1549
  onConfigReceived?: (config: SdkReliabilityConfig) => void;
1403
1550
  /** Whether to send the opt-in config header on the first flush of this load. Defaults to true. */
1404
1551
  requestConfig?: boolean;
1552
+ /**
1553
+ * Web Lock name for the durable outbox, scoped alongside the storage engine's keys (see
1554
+ * {@link EventStore}). Defaults to the shared {@link OUTBOX_LOCK_NAME}.
1555
+ */
1556
+ outboxLockName?: string;
1405
1557
  }
1406
1558
  /**
1407
1559
  * @remarks When `window` is defined, `visibilitychange` (when the document becomes hidden) and `pagehide`
@@ -1464,6 +1616,8 @@ declare class RequestQueue {
1464
1616
  * (config.flushOnFlowTypeFinished).
1465
1617
  */
1466
1618
  private priorityFlowTypes;
1619
+ /** Scoped Web Lock name for the durable outbox; undefined = EventStore's shared default. */
1620
+ private outboxLockName?;
1467
1621
  private store?;
1468
1622
  /**
1469
1623
  * Once the server has answered the config request with a 2xx (200 = fresh config cached for the
@@ -1696,7 +1850,7 @@ declare const DEFAULT_MAX_SERIALIZED_LENGTH: number;
1696
1850
  *
1697
1851
  * @remarks
1698
1852
  * Every mutation is a read-merge-write against storage, executed under a cross-tab Web Lock
1699
- * ({@link OUTBOX_LOCK_NAME}) so concurrent tabs sharing the same localStorage cannot interleave
1853
+ * (default {@link OUTBOX_LOCK_NAME}) so concurrent tabs sharing the same localStorage cannot interleave
1700
1854
  * between the read and the write (which would silently drop the other tab's entries). Where the
1701
1855
  * Web Locks API is unavailable the mutation runs unlocked, matching the historical best-effort
1702
1856
  * behavior. Mutations never reject; failures are logged.
@@ -1707,10 +1861,22 @@ declare class EventStore {
1707
1861
  private readonly logger;
1708
1862
  private readonly maxEntries;
1709
1863
  private readonly maxSerializedLength;
1864
+ /**
1865
+ * Web Lock name guarding mutations. Must be scoped together with the storage the engine writes
1866
+ * to: a project-scoped outbox key guarded by the shared lock would serialize unrelated trackers,
1867
+ * and a shared key guarded by scoped locks would lose the cross-tab atomicity guarantee.
1868
+ */
1869
+ private readonly lockName;
1710
1870
  private entries;
1711
1871
  /** Malformed entries are dropped on every read; report only once per instance to avoid log spam. */
1712
1872
  private reportedMalformed;
1713
- constructor(storage: StorageEngine, logger: Logger, maxEntries?: number, maxSerializedLength?: number);
1873
+ constructor(storage: StorageEngine, logger: Logger, maxEntries?: number, maxSerializedLength?: number,
1874
+ /**
1875
+ * Web Lock name guarding mutations. Must be scoped together with the storage the engine writes
1876
+ * to: a project-scoped outbox key guarded by the shared lock would serialize unrelated trackers,
1877
+ * and a shared key guarded by scoped locks would lose the cross-tab atomicity guarantee.
1878
+ */
1879
+ lockName?: string);
1714
1880
  private read;
1715
1881
  private mutate;
1716
1882
  /** Evict oldest entries until the serialized outbox fits {@link maxSerializedLength}. */
@@ -1728,7 +1894,13 @@ declare class EventStore {
1728
1894
  size(): number;
1729
1895
  }
1730
1896
 
1897
+ /**
1898
+ * Create a tracker and make it the default for all package-level helpers.
1899
+ * Each call replaces the default. For multiple projects, retain the returned instances and call
1900
+ * their methods, or construct {@link CorbadoTracker} instances directly without changing the default.
1901
+ */
1731
1902
  declare function init(options: TrackerOptions): CorbadoTracker;
1903
+ /** Return the default tracker from the most recent {@link init} call. */
1732
1904
  declare function getTracker(): CorbadoTracker | undefined;
1733
1905
  declare function resetSession(): string | undefined;
1734
1906
  /**
@@ -1736,6 +1908,12 @@ declare function resetSession(): string | undefined;
1736
1908
  * could be established. See {@link CorbadoTracker.getSessionId}.
1737
1909
  */
1738
1910
  declare function getSessionId(): string | undefined;
1911
+ /**
1912
+ * Record a user reference for the global tracker's current active flow.
1913
+ * Call after the flow starts and before it finishes; matching has no grace period.
1914
+ * See {@link CorbadoTracker.setUser}.
1915
+ */
1916
+ declare function setUser(user: UserReference): void;
1739
1917
  declare function setExperiment(key: string, variant: string): void;
1740
1918
  declare function setExperiments(assignments: Record<string, string>): void;
1741
1919
  declare function clearExperiment(key: string): void;
@@ -1746,4 +1924,4 @@ declare function logInfo(message: string): void;
1746
1924
  declare function logError(message: string): void;
1747
1925
  declare function destroy(): Promise<void>;
1748
1926
 
1749
- export { type AppConfirmationOperationCeremonyTypedError, AppConfirmationOperationFull, type AppConfirmationOperationRetryReason, type AppConfirmationOperationSpecType, type AppConfirmationOperationStart, type AuthDecisionFinished, type AuthDecisionStarted, AuthEventName, type AuthMethodDecisionFinished, type AuthMethodDecisionStarted, type AuthMethodType, type BaseEvent, CEREMONY_LOW_EVENT_TAIL_MS, CONFIG_BOUNDS, CONFIG_REQUEST_HEADER, CONFIG_STORAGE_KEY, type CaptchaOperationConfig, CaptchaOperationFull, type CaptchaOperationSpecType, type ClientCapabilities, type ClientEnvHandleMeta, type ClientEnvHandleMetaSource, type Conversion, CookieStorage, CorbadoTracker, type CreateLoggerOptions, type CustomEvent, DEFAULT_DEVICE_INFO_COLLECTOR_TIMEOUT_MS, DEFAULT_FLUSH_INTERVAL_MS, DEFAULT_MAX_ENTRIES, DEFAULT_MAX_SERIALIZED_LENGTH, DEFAULT_RELIABILITY_CONFIG, DEFAULT_SEQ_LOCK_TIMEOUT_MS, DEFAULT_SESSION_INACTIVITY_MS, type DeviceInfo, type DeviceInfoCollectionError, type DeviceInfoDataWeb, type DeviceType, EmailLinkOperationFull, type EmailLinkOperationPostResponseStart, type EmailLinkOperationSendStart, type EmailLinkOperationSpecType, type EmailOTPOperationConfig, type EmailOTPOperationPostResponseStart, type EmailOTPOperationSendOTPStart, type EmailOTPOperationSpecType, EmailOtpOperationFull, type Event, type EventBatch, type EventBatchMeta, type EventMeta, EventStore, type EventType, type FlowAutoFinished, type FlowDecided, type FlowFinished, type FlowReset, type FlowStarted, type FlowType, type FlushReason, type JavaScriptHighEntropy, LocalStorage, type Logger, type LowEvent, type MultiFlowReset, type MultiFlowStarted, type NormalizedError, OUTBOX_LOCK_NAME, OUTBOX_STORAGE_KEY, type ObserveSdkConfigSnapshot, OperationFull, OperationFullProvideIdentifierWithCUI, type OperationFullProvideIdentifierWithCUIConfig, type OutboxEntry, type PasskeyEnrollmentCeremonyFinished, type PasskeyEnrollmentCeremonyStart, type PasskeyEnrollmentGetOptionsFinished, type PasskeyEnrollmentGetOptionsStart, type PasskeyEnrollmentOperationConfig, PasskeyEnrollmentOperationFull, type PasskeyEnrollmentPostResponseStart, type PasskeyLoginCUIGetOptionsFinished, type PasskeyLoginCUIGetOptionsStart, type PasskeyLoginCUISpecType, type PasskeyLoginCeremonyFinished, type PasskeyLoginCeremonyStart, type PasskeyLoginClientError, type PasskeyLoginFinish, type PasskeyLoginGetOptionsFinished, type PasskeyLoginGetOptionsStart, PasskeyLoginOperationFull, type PasskeyLoginPostResponseStart, type PasskeyLoginStartable, type PasskeyLoginSubmitted, type PasskeyOperationEnrollmentExplicitSpecType, type PasskeyOperationLoginExplicitSpecType, type PasswordEnrollmentAutoTrackConfig, PasswordEnrollmentOperationFull, type PasswordEnrollmentTypedError, type PasswordLoginAutoTrackConfig, type PasswordLoginCUICeremonyStart, type PasswordLoginCUIGetOptionsFinished, type PasswordLoginCUIGetOptionsStart, type PasswordLoginCUISpecType, type PasswordLoginCUITypedError, PasswordLoginOperationFull, type PasswordLoginTypedError, type PredefinedEvent, type ProvideDataOperationConfig, ProvideDataOperationFull, type ProvideDataOperationPostResponseStart, type ProvideDataOperationSpecType, type ProvideDataOperationStart, type ProvideIdentifierError, type ProvideIdentifierFinish, type ProvideIdentifierPostResponseStart, type ProvideIdentifierSpecType, type ProvideIdentifierStart, type QueueOptions, RequestQueue, SDK_NAME, SDK_VERSION, type SdkInfo, type SdkReliabilityConfig, type SdkRetryConfig, SessionStorage, type SmsOTPOperationConfig, type SmsOTPOperationPostResponseStart, type SmsOTPOperationSpecType, SmsOtpOperationFull, type SocialLoginExchangeCodeFinished, type SocialLoginExchangeCodeStart, type SocialLoginGetRedirectUrlFinished, type SocialLoginGetRedirectUrlStart, SocialLoginOperationFull, type SocialLoginProviderType, type SocialLoginSpecType, type StepHelper, type StepOptions, type StorageEngine, type SubflowTrigger, type SubflowType, type TelemetryEntry, type TelemetryLevel, type TelemetrySink, type TrackerOptions, type Transport, type TransportMakeRequestResponse, type TransportOptions, type UserReference, cacheConfig, clearExperiment, clearExperiments, createLogger, destroy, getExperiments, getSessionId, getTracker, init, loadCachedConfig, logError, logInfo, parseReliabilityConfig, resetSession, setExperiment, setExperiments, telemetry };
1927
+ export { type AppConfirmationOperationCeremonyTypedError, type AppConfirmationOperationConfig, AppConfirmationOperationFull, type AppConfirmationOperationRetryReason, type AppConfirmationOperationSpecType, type AppConfirmationOperationStart, type AuthDecisionFinished, type AuthDecisionStarted, AuthEventName, type AuthMethodDecisionFinished, type AuthMethodDecisionStarted, type AuthMethodType, type BaseEvent, CEREMONY_LOW_EVENT_TAIL_MS, CONFIG_BOUNDS, CONFIG_REQUEST_HEADER, CONFIG_STORAGE_KEY, type CaptchaOperationConfig, CaptchaOperationFull, type CaptchaOperationSpecType, type ClientCapabilities, type ClientEnvHandleMeta, type ClientEnvHandleMetaSource, type Conversion, CookieStorage, CorbadoTracker, type CreateLoggerOptions, type CustomEvent, DEFAULT_DEVICE_INFO_COLLECTOR_TIMEOUT_MS, DEFAULT_FLUSH_INTERVAL_MS, DEFAULT_MAX_ENTRIES, DEFAULT_MAX_SERIALIZED_LENGTH, DEFAULT_RELIABILITY_CONFIG, DEFAULT_SEQ_LOCK_TIMEOUT_MS, DEFAULT_SESSION_INACTIVITY_MS, type DeviceInfo, type DeviceInfoCollectionError, type DeviceInfoDataWeb, type DeviceType, type EmailLinkOperationConfig, EmailLinkOperationFull, type EmailLinkOperationPostResponseStart, type EmailLinkOperationSendStart, type EmailLinkOperationSpecType, type EmailOTPOperationConfig, type EmailOTPOperationPostResponseStart, type EmailOTPOperationSendOTPStart, type EmailOTPOperationSpecType, EmailOtpOperationFull, type Event, type EventBatch, type EventBatchMeta, type EventMeta, EventStore, type EventType, type FlowAutoFinished, type FlowDecided, type FlowFinished, type FlowReset, type FlowStarted, type FlowType, type FlushReason, type JavaScriptHighEntropy, LocalStorage, type Logger, type LowEvent, type MultiFlowReset, type MultiFlowStarted, NamespacedStorage, type NormalizedError, OUTBOX_LOCK_NAME, OUTBOX_STORAGE_KEY, type ObserveSdkConfigSnapshot, OperationFull, OperationFullProvideIdentifierWithCUI, type OperationFullProvideIdentifierWithCUIConfig, type OutboxEntry, type PasskeyEnrollmentCeremonyFinished, type PasskeyEnrollmentCeremonyStart, type PasskeyEnrollmentGetOptionsFinished, type PasskeyEnrollmentGetOptionsStart, type PasskeyEnrollmentOperationConfig, PasskeyEnrollmentOperationFull, type PasskeyEnrollmentPostResponseStart, type PasskeyLoginCUIGetOptionsFinished, type PasskeyLoginCUIGetOptionsStart, type PasskeyLoginCUISpecType, type PasskeyLoginCeremonyFinished, type PasskeyLoginCeremonyStart, type PasskeyLoginClientError, type PasskeyLoginFinish, type PasskeyLoginGetOptionsFinished, type PasskeyLoginGetOptionsStart, type PasskeyLoginOperationConfig, PasskeyLoginOperationFull, type PasskeyLoginPostResponseStart, type PasskeyLoginStartable, type PasskeyLoginSubmitted, type PasskeyOperationEnrollmentExplicitSpecType, type PasskeyOperationLoginExplicitSpecType, type PasswordEnrollmentConfig, PasswordEnrollmentOperationFull, type PasswordEnrollmentTypedError, type PasswordLoginCUICeremonyStart, type PasswordLoginCUIGetOptionsFinished, type PasswordLoginCUIGetOptionsStart, type PasswordLoginCUISpecType, type PasswordLoginCUITypedError, type PasswordLoginConfig, type PasswordLoginExplicitSpecType, PasswordLoginOperationFull, type PasswordLoginTypedError, type PredefinedEvent, type ProvideDataOperationConfig, ProvideDataOperationFull, type ProvideDataOperationPostResponseStart, type ProvideDataOperationSpecType, type ProvideDataOperationStart, type ProvideIdentifierError, type ProvideIdentifierFinish, type ProvideIdentifierPostResponseStart, type ProvideIdentifierSpecType, type ProvideIdentifierStart, type QueueOptions, RequestQueue, SDK_NAME, SDK_VERSION, type SdkInfo, type SdkReliabilityConfig, type SdkRetryConfig, SessionStorage, type SmsOTPOperationConfig, type SmsOTPOperationPostResponseStart, type SmsOTPOperationSpecType, SmsOtpOperationFull, type SocialLoginExchangeCodeFinished, type SocialLoginExchangeCodeStart, type SocialLoginGetRedirectUrlFinished, type SocialLoginGetRedirectUrlStart, type SocialLoginOperationConfig, SocialLoginOperationFull, type SocialLoginProviderType, type SocialLoginSpecType, type StepHelper, type StepOptions, type StorageEngine, type SubflowTrigger, type SubflowType, type TelemetryEntry, type TelemetryLevel, type TelemetrySink, type TrackerOptions, type Transport, type TransportMakeRequestResponse, type TransportOptions, type UserReference, cacheConfig, clearExperiment, clearExperiments, createLogger, destroy, getExperiments, getSessionId, getTracker, init, loadCachedConfig, logError, logInfo, namespacedKey, parseReliabilityConfig, resetSession, setExperiment, setExperiments, setUser, telemetry };