@sylphx/sdk 0.3.6 → 0.4.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.
@@ -41947,6 +41947,13 @@ var SylphxError = class _SylphxError extends Error {
41947
41947
  static isRateLimited(err) {
41948
41948
  return err instanceof _SylphxError && err.code === "TOO_MANY_REQUESTS";
41949
41949
  }
41950
+ /**
41951
+ * Check if error is an account lockout error (too many failed login attempts).
41952
+ * When true, `error.data?.lockoutUntil` contains the ISO 8601 timestamp when the lockout expires.
41953
+ */
41954
+ static isAccountLocked(err) {
41955
+ return err instanceof _SylphxError && err.code === "TOO_MANY_REQUESTS" && err.data?.code === "ACCOUNT_LOCKED";
41956
+ }
41950
41957
  /**
41951
41958
  * Check if error is a quota exceeded error (plan limit reached)
41952
41959
  */
@@ -42964,6 +42971,13 @@ function createConfig(input) {
42964
42971
  accessToken: input.accessToken
42965
42972
  });
42966
42973
  }
42974
+ function withToken(config2, accessToken) {
42975
+ return Object.freeze({
42976
+ ...config2,
42977
+ accessToken
42978
+ // Preserve baseUrl and ref from original config
42979
+ });
42980
+ }
42967
42981
  function buildHeaders(config2) {
42968
42982
  const headers = {
42969
42983
  "Content-Type": "application/json"
@@ -44498,7 +44512,7 @@ function useOrganization() {
44498
44512
  mounted = false;
44499
44513
  };
44500
44514
  }, [config2?.baseUrl, getStoredOrgSlug, selectOrganization, organization, config2]);
44501
- const hasPermission = useCallback41(
44515
+ const hasPermission2 = useCallback41(
44502
44516
  (permission) => {
44503
44517
  if (!role) return false;
44504
44518
  const rolePermissions = {
@@ -44626,7 +44640,7 @@ function useOrganization() {
44626
44640
  isLoading,
44627
44641
  error: error2,
44628
44642
  role,
44629
- hasPermission,
44643
+ hasPermission: hasPermission2,
44630
44644
  setOrganization: selectOrganization,
44631
44645
  createOrganization: createOrg,
44632
44646
  updateOrganization: updateOrg,
@@ -46017,7 +46031,7 @@ function InviteMemberInner({
46017
46031
  className,
46018
46032
  showRoleDescriptions = true
46019
46033
  }) {
46020
- const { organization, inviteMember, hasPermission } = useOrganization();
46034
+ const { organization, inviteMember, hasPermission: hasPermission2 } = useOrganization();
46021
46035
  const styles2 = baseStyles(theme);
46022
46036
  const [email, setEmail] = useState55("");
46023
46037
  const [role, setRole] = useState55(defaultRole);
@@ -46025,7 +46039,7 @@ function InviteMemberInner({
46025
46039
  const [error2, setError] = useState55(null);
46026
46040
  const [success, setSuccess] = useState55(false);
46027
46041
  const [focusedField, setFocusedField] = useState55(null);
46028
- const canInvite = hasPermission("manage_members");
46042
+ const canInvite = hasPermission2("manage_members");
46029
46043
  useEffect48(() => {
46030
46044
  injectGlobalStyles();
46031
46045
  }, []);
@@ -46404,7 +46418,7 @@ function MembersListInner({
46404
46418
  organization,
46405
46419
  members: serverMembers,
46406
46420
  isLoading,
46407
- hasPermission,
46421
+ hasPermission: hasPermission2,
46408
46422
  updateMemberRole,
46409
46423
  removeMember
46410
46424
  } = useOrganization();
@@ -46414,7 +46428,7 @@ function MembersListInner({
46414
46428
  const [error2, setError] = useState56(null);
46415
46429
  const [showAll, setShowAll] = useState56(false);
46416
46430
  const [pendingAction, setPendingAction] = useState56(null);
46417
- const canManageMembers = hasPermission("manage_members");
46431
+ const canManageMembers = hasPermission2("manage_members");
46418
46432
  useEffect49(() => {
46419
46433
  injectGlobalStyles();
46420
46434
  }, []);
@@ -54038,7 +54052,12 @@ function SylphxProviderInner({
54038
54052
  authPrefix = "/auth"
54039
54053
  }) {
54040
54054
  const appId = validateAndSanitizeAppId(appIdProp);
54041
- const platformUrl = providedRef ? `https://${providedRef}.${DEFAULT_SDK_API_HOST}` : providedPlatformUrl?.trim() || `https://${DEFAULT_SDK_API_HOST}`;
54055
+ const resolvedRef = (() => {
54056
+ if (providedRef) return providedRef;
54057
+ const parts = appId?.split("_") ?? [];
54058
+ return parts.length === 4 && /^[a-z0-9]{12}$/.test(parts[2] ?? "") ? parts[2] : void 0;
54059
+ })();
54060
+ const platformUrl = resolvedRef ? `https://${resolvedRef}.${DEFAULT_SDK_API_HOST}` : providedPlatformUrl?.trim() || `https://${DEFAULT_SDK_API_HOST}`;
54042
54061
  const storage2 = useMemo127(() => new SylphxStorage(appId), [appId]);
54043
54062
  const [anonymousId, setAnonymousId] = useState77("");
54044
54063
  useEffect63(() => {
@@ -54113,10 +54132,10 @@ function SylphxProviderInner({
54113
54132
  }
54114
54133
  const wasAnonymous = !prevIsSignedIn.current;
54115
54134
  const isNowAuthenticated = authState.isSignedIn && authState.user?.id;
54116
- if (wasAnonymous && isNowAuthenticated && authState.user && anonymousId && providedRef) {
54135
+ if (wasAnonymous && isNowAuthenticated && authState.user && anonymousId && resolvedRef) {
54117
54136
  const config3 = createConfig({
54118
54137
  secretKey: appId,
54119
- ref: providedRef
54138
+ ref: resolvedRef
54120
54139
  });
54121
54140
  linkAnonymousConsents(config3, {
54122
54141
  userId: authState.user.id,
@@ -55755,7 +55774,7 @@ function SylphxProviderInner({
55755
55774
  () => ({
55756
55775
  appId,
55757
55776
  platformUrl,
55758
- ref: providedRef,
55777
+ ref: resolvedRef,
55759
55778
  anonymousId,
55760
55779
  queryClient,
55761
55780
  clickIds,
@@ -55894,8 +55913,148 @@ function SylphxProviderInner({
55894
55913
  return /* @__PURE__ */ jsx64(AuthContext.Provider, { value: authValue, children: /* @__PURE__ */ jsx64(SdkAuthContext.Provider, { value: sdkAuthValue, children: /* @__PURE__ */ jsx64(UserContext.Provider, { value: userValue, children: /* @__PURE__ */ jsx64(SecurityContext.Provider, { value: securityValue, children: /* @__PURE__ */ jsx64(PlatformContext.Provider, { value: platformValue, children: /* @__PURE__ */ jsx64(StorageContext.Provider, { value: storageValue, children: /* @__PURE__ */ jsx64(AIContext.Provider, { value: aiValue, children: /* @__PURE__ */ jsx64(TasksContext.Provider, { value: tasksValue, children: /* @__PURE__ */ jsx64(MonitoringContext.Provider, { value: monitoringValue, children: /* @__PURE__ */ jsx64(ConsentContext.Provider, { value: consentValue, children: /* @__PURE__ */ jsx64(DatabaseContext.Provider, { value: databaseValue, children: /* @__PURE__ */ jsx64(EmailContext.Provider, { value: emailValue, children: /* @__PURE__ */ jsx64(NewsletterContext.Provider, { value: newsletterValue, children: /* @__PURE__ */ jsx64(WebhooksContext.Provider, { value: webhooksValue, children }) }) }) }) }) }) }) }) }) }) }) }) }) });
55895
55914
  }
55896
55915
 
55916
+ // src/react/rbac-hooks.ts
55917
+ import { useQuery as useQuery6, useQueryClient as useQueryClient5 } from "@tanstack/react-query";
55918
+ import { useCallback as useCallback67, useContext as useContext78, useMemo as useMemo128 } from "react";
55919
+
55920
+ // src/permissions.ts
55921
+ async function listPermissions(config2) {
55922
+ return callApi(config2, "/permissions");
55923
+ }
55924
+ async function getMemberPermissions(config2, orgIdOrSlug, memberId) {
55925
+ return callApi(
55926
+ config2,
55927
+ `/orgs/${orgIdOrSlug}/members/${memberId}/permissions`
55928
+ );
55929
+ }
55930
+ function hasPermission(permissions, required) {
55931
+ return permissions.includes(required);
55932
+ }
55933
+ function hasAnyPermission(permissions, required) {
55934
+ return required.some((perm) => permissions.includes(perm));
55935
+ }
55936
+ function hasAllPermissions(permissions, required) {
55937
+ return required.every((perm) => permissions.includes(perm));
55938
+ }
55939
+
55940
+ // src/roles.ts
55941
+ async function listRoles(config2) {
55942
+ return callApi(config2, "/roles");
55943
+ }
55944
+
55945
+ // src/react/rbac-hooks.ts
55946
+ function useSdkConfig() {
55947
+ const platform3 = useContext78(PlatformContext);
55948
+ const auth = useContext78(AuthContext);
55949
+ return useMemo128(() => {
55950
+ if (!platform3?.ref) return null;
55951
+ let config2 = createConfig({
55952
+ secretKey: platform3.appId,
55953
+ ref: platform3.ref
55954
+ });
55955
+ if (auth?.accessToken) {
55956
+ config2 = withToken(config2, auth.accessToken);
55957
+ }
55958
+ return config2;
55959
+ }, [platform3?.ref, platform3?.appId, auth?.accessToken]);
55960
+ }
55961
+ var rbacKeys = {
55962
+ all: ["rbac"],
55963
+ permissions: () => [...rbacKeys.all, "permissions"],
55964
+ roles: () => [...rbacKeys.all, "roles"],
55965
+ memberPermissions: (orgIdOrSlug, memberId) => [...rbacKeys.all, "memberPermissions", orgIdOrSlug, memberId]
55966
+ };
55967
+ function usePermissions() {
55968
+ const config2 = useSdkConfig();
55969
+ const queryClient = useQueryClient5();
55970
+ const { data, isLoading, error: error2 } = useQuery6({
55971
+ queryKey: rbacKeys.permissions(),
55972
+ queryFn: async () => {
55973
+ if (!config2) throw new Error("SDK not configured \u2014 wrap your app in SylphxProvider");
55974
+ return listPermissions(config2);
55975
+ },
55976
+ enabled: !!config2,
55977
+ staleTime: 3e4
55978
+ // 30s — permissions change rarely
55979
+ });
55980
+ const refresh = useCallback67(async () => {
55981
+ await queryClient.invalidateQueries({ queryKey: rbacKeys.permissions() });
55982
+ }, [queryClient]);
55983
+ return {
55984
+ permissions: data?.permissions ?? [],
55985
+ isLoading,
55986
+ error: error2,
55987
+ refresh
55988
+ };
55989
+ }
55990
+ function useRoles() {
55991
+ const config2 = useSdkConfig();
55992
+ const queryClient = useQueryClient5();
55993
+ const { data, isLoading, error: error2 } = useQuery6({
55994
+ queryKey: rbacKeys.roles(),
55995
+ queryFn: async () => {
55996
+ if (!config2) throw new Error("SDK not configured \u2014 wrap your app in SylphxProvider");
55997
+ return listRoles(config2);
55998
+ },
55999
+ enabled: !!config2,
56000
+ staleTime: 3e4
56001
+ // 30s — roles change rarely
56002
+ });
56003
+ const refresh = useCallback67(async () => {
56004
+ await queryClient.invalidateQueries({ queryKey: rbacKeys.roles() });
56005
+ }, [queryClient]);
56006
+ return {
56007
+ roles: data?.roles ?? [],
56008
+ isLoading,
56009
+ error: error2,
56010
+ refresh
56011
+ };
56012
+ }
56013
+ function useMemberPermissions(orgIdOrSlug, memberId) {
56014
+ const config2 = useSdkConfig();
56015
+ const queryClient = useQueryClient5();
56016
+ const enabled = !!config2 && !!orgIdOrSlug && !!memberId;
56017
+ const { data, isLoading, error: error2 } = useQuery6({
56018
+ queryKey: rbacKeys.memberPermissions(orgIdOrSlug ?? "", memberId ?? ""),
56019
+ queryFn: async () => {
56020
+ if (!config2 || !orgIdOrSlug || !memberId) {
56021
+ throw new Error("Missing required parameters");
56022
+ }
56023
+ return getMemberPermissions(config2, orgIdOrSlug, memberId);
56024
+ },
56025
+ enabled,
56026
+ staleTime: 15e3
56027
+ // 15s — member permissions may change more frequently
56028
+ });
56029
+ const refresh = useCallback67(async () => {
56030
+ if (orgIdOrSlug && memberId) {
56031
+ await queryClient.invalidateQueries({
56032
+ queryKey: rbacKeys.memberPermissions(orgIdOrSlug, memberId)
56033
+ });
56034
+ }
56035
+ }, [queryClient, orgIdOrSlug, memberId]);
56036
+ return {
56037
+ memberId: data?.memberId ?? null,
56038
+ role: data?.role ?? null,
56039
+ permissions: data?.permissions ?? [],
56040
+ isLoading: enabled ? isLoading : false,
56041
+ error: error2,
56042
+ refresh
56043
+ };
56044
+ }
56045
+ function useHasPermission(permissions, required) {
56046
+ return useMemo128(() => {
56047
+ const requiredArray = Array.isArray(required) ? required : [required];
56048
+ return {
56049
+ allowed: Array.isArray(required) ? hasAllPermissions(permissions, requiredArray) : hasPermission(permissions, required),
56050
+ allowedAny: hasAnyPermission(permissions, requiredArray),
56051
+ allowedAll: hasAllPermissions(permissions, requiredArray)
56052
+ };
56053
+ }, [permissions, required]);
56054
+ }
56055
+
55897
56056
  // src/react/storage-hooks.ts
55898
- import { useCallback as useCallback67, useRef as useRef89, useState as useState78 } from "react";
56057
+ import { useCallback as useCallback68, useRef as useRef89, useState as useState78 } from "react";
55899
56058
  function useStorage() {
55900
56059
  const ctx = useStorageContext();
55901
56060
  const [isUploading, setIsUploading] = useState78(false);
@@ -55905,12 +56064,12 @@ function useStorage() {
55905
56064
  const [uploadError, setUploadError] = useState78(null);
55906
56065
  const [wasCancelled, setWasCancelled] = useState78(false);
55907
56066
  const abortControllerRef = useRef89(null);
55908
- const handleProgress = useCallback67((event2) => {
56067
+ const handleProgress = useCallback68((event2) => {
55909
56068
  setProgress(event2.progress);
55910
56069
  setBytesUploaded(event2.loaded);
55911
56070
  setBytesTotal(event2.total);
55912
56071
  }, []);
55913
- const cancel = useCallback67(() => {
56072
+ const cancel = useCallback68(() => {
55914
56073
  if (abortControllerRef.current) {
55915
56074
  abortControllerRef.current.abort();
55916
56075
  abortControllerRef.current = null;
@@ -55918,7 +56077,7 @@ function useStorage() {
55918
56077
  setIsUploading(false);
55919
56078
  }
55920
56079
  }, []);
55921
- const upload = useCallback67(
56080
+ const upload = useCallback68(
55922
56081
  async (file, options) => {
55923
56082
  const controller = new AbortController();
55924
56083
  abortControllerRef.current = controller;
@@ -55952,7 +56111,7 @@ function useStorage() {
55952
56111
  },
55953
56112
  [ctx, handleProgress]
55954
56113
  );
55955
- const uploadAvatar = useCallback67(
56114
+ const uploadAvatar = useCallback68(
55956
56115
  async (file) => {
55957
56116
  const controller = new AbortController();
55958
56117
  abortControllerRef.current = controller;
@@ -55983,13 +56142,13 @@ function useStorage() {
55983
56142
  },
55984
56143
  [ctx, handleProgress]
55985
56144
  );
55986
- const deleteFile = useCallback67(
56145
+ const deleteFile = useCallback68(
55987
56146
  async (fileId) => {
55988
56147
  await ctx.deleteFile(fileId);
55989
56148
  },
55990
56149
  [ctx]
55991
56150
  );
55992
- const getUrl = useCallback67(
56151
+ const getUrl = useCallback68(
55993
56152
  async (fileId) => {
55994
56153
  return ctx.getUrl(fileId);
55995
56154
  },
@@ -56019,12 +56178,12 @@ function useFileUpload(options = {}) {
56019
56178
  const [wasCancelled, setWasCancelled] = useState78(false);
56020
56179
  const [url, setUrl] = useState78(null);
56021
56180
  const abortControllerRef = useRef89(null);
56022
- const handleProgress = useCallback67((event2) => {
56181
+ const handleProgress = useCallback68((event2) => {
56023
56182
  setProgress(event2.progress);
56024
56183
  setBytesUploaded(event2.loaded);
56025
56184
  setBytesTotal(event2.total);
56026
56185
  }, []);
56027
- const cancel = useCallback67(() => {
56186
+ const cancel = useCallback68(() => {
56028
56187
  if (abortControllerRef.current) {
56029
56188
  abortControllerRef.current.abort();
56030
56189
  abortControllerRef.current = null;
@@ -56033,7 +56192,7 @@ function useFileUpload(options = {}) {
56033
56192
  options.onCancel?.();
56034
56193
  }
56035
56194
  }, [options]);
56036
- const upload = useCallback67(
56195
+ const upload = useCallback68(
56037
56196
  async (file) => {
56038
56197
  if (options.accept && options.accept.length > 0) {
56039
56198
  const isAccepted = options.accept.some((type) => {
@@ -56093,7 +56252,7 @@ function useFileUpload(options = {}) {
56093
56252
  },
56094
56253
  [ctx, options, handleProgress]
56095
56254
  );
56096
- const reset = useCallback67(() => {
56255
+ const reset = useCallback68(() => {
56097
56256
  setIsUploading(false);
56098
56257
  setProgress(0);
56099
56258
  setBytesUploaded(0);
@@ -56118,13 +56277,13 @@ function useFileUpload(options = {}) {
56118
56277
  }
56119
56278
 
56120
56279
  // src/react/task-hooks.ts
56121
- import { useQuery as useQuery6, useQueryClient as useQueryClient5 } from "@tanstack/react-query";
56122
- import { useCallback as useCallback68, useEffect as useEffect64, useRef as useRef90, useState as useState79 } from "react";
56280
+ import { useQuery as useQuery7, useQueryClient as useQueryClient6 } from "@tanstack/react-query";
56281
+ import { useCallback as useCallback69, useEffect as useEffect64, useRef as useRef90, useState as useState79 } from "react";
56123
56282
  function useTasks() {
56124
56283
  const ctx = useTasksContext();
56125
56284
  const [isLoading, setIsLoading] = useState79(false);
56126
56285
  const [error2, setError] = useState79(null);
56127
- const isAvailable = useCallback68(async () => {
56286
+ const isAvailable = useCallback69(async () => {
56128
56287
  try {
56129
56288
  const status = await ctx.checkStatus();
56130
56289
  return status.available;
@@ -56132,7 +56291,7 @@ function useTasks() {
56132
56291
  return false;
56133
56292
  }
56134
56293
  }, [ctx]);
56135
- const schedule = useCallback68(
56294
+ const schedule = useCallback69(
56136
56295
  async (options) => {
56137
56296
  setIsLoading(true);
56138
56297
  setError(null);
@@ -56148,7 +56307,7 @@ function useTasks() {
56148
56307
  },
56149
56308
  [ctx]
56150
56309
  );
56151
- const createCron = useCallback68(
56310
+ const createCron = useCallback69(
56152
56311
  async (options) => {
56153
56312
  setIsLoading(true);
56154
56313
  setError(null);
@@ -56164,7 +56323,7 @@ function useTasks() {
56164
56323
  },
56165
56324
  [ctx]
56166
56325
  );
56167
- const pauseCron = useCallback68(
56326
+ const pauseCron = useCallback69(
56168
56327
  async (scheduleId) => {
56169
56328
  setIsLoading(true);
56170
56329
  setError(null);
@@ -56180,7 +56339,7 @@ function useTasks() {
56180
56339
  },
56181
56340
  [ctx]
56182
56341
  );
56183
- const resumeCron = useCallback68(
56342
+ const resumeCron = useCallback69(
56184
56343
  async (scheduleId) => {
56185
56344
  setIsLoading(true);
56186
56345
  setError(null);
@@ -56196,7 +56355,7 @@ function useTasks() {
56196
56355
  },
56197
56356
  [ctx]
56198
56357
  );
56199
- const deleteCron = useCallback68(
56358
+ const deleteCron = useCallback69(
56200
56359
  async (scheduleId) => {
56201
56360
  setIsLoading(true);
56202
56361
  setError(null);
@@ -56212,7 +56371,7 @@ function useTasks() {
56212
56371
  },
56213
56372
  [ctx]
56214
56373
  );
56215
- const getJob = useCallback68(
56374
+ const getJob = useCallback69(
56216
56375
  async (jobId) => {
56217
56376
  try {
56218
56377
  return await ctx.getJob(jobId);
@@ -56224,7 +56383,7 @@ function useTasks() {
56224
56383
  },
56225
56384
  [ctx]
56226
56385
  );
56227
- const listJobs = useCallback68(
56386
+ const listJobs = useCallback69(
56228
56387
  async (options = {}) => {
56229
56388
  try {
56230
56389
  const result = await ctx.listJobs(options);
@@ -56237,7 +56396,7 @@ function useTasks() {
56237
56396
  },
56238
56397
  [ctx]
56239
56398
  );
56240
- const cancelJob = useCallback68(
56399
+ const cancelJob = useCallback69(
56241
56400
  async (jobId) => {
56242
56401
  setIsLoading(true);
56243
56402
  setError(null);
@@ -56270,19 +56429,19 @@ function useTasks() {
56270
56429
 
56271
56430
  // src/react/webhooks-hooks.ts
56272
56431
  init_constants();
56273
- import { useInfiniteQuery as useInfiniteQuery2, useQuery as useQuery7, useQueryClient as useQueryClient6 } from "@tanstack/react-query";
56274
- import { useCallback as useCallback69 } from "react";
56432
+ import { useInfiniteQuery as useInfiniteQuery2, useQuery as useQuery8, useQueryClient as useQueryClient7 } from "@tanstack/react-query";
56433
+ import { useCallback as useCallback70 } from "react";
56275
56434
  function useWebhooks() {
56276
56435
  const ctx = useWebhooksContext();
56277
- const queryClient = useQueryClient6();
56278
- const configQuery = useQuery7({
56436
+ const queryClient = useQueryClient7();
56437
+ const configQuery = useQuery8({
56279
56438
  queryKey: ["sylphx", "webhooks", "config"],
56280
56439
  queryFn: () => ctx.getConfig(),
56281
56440
  staleTime: STALE_TIME_STABLE_MS
56282
56441
  // 5 min - config rarely changes
56283
56442
  });
56284
56443
  const config2 = configQuery.data;
56285
- const updateConfig = useCallback69(
56444
+ const updateConfig = useCallback70(
56286
56445
  async (options) => {
56287
56446
  const result = await ctx.updateConfig(options);
56288
56447
  await queryClient.invalidateQueries({
@@ -56292,7 +56451,7 @@ function useWebhooks() {
56292
56451
  },
56293
56452
  [ctx, queryClient]
56294
56453
  );
56295
- const refresh = useCallback69(async () => {
56454
+ const refresh = useCallback70(async () => {
56296
56455
  await queryClient.invalidateQueries({
56297
56456
  queryKey: ["sylphx", "webhooks", "config"]
56298
56457
  });
@@ -56309,7 +56468,7 @@ function useWebhooks() {
56309
56468
  function useWebhookDeliveries(options = {}) {
56310
56469
  const { status, event: event2, limit = 50, skip = false, refetchInterval } = options;
56311
56470
  const ctx = useWebhooksContext();
56312
- const queryClient = useQueryClient6();
56471
+ const queryClient = useQueryClient7();
56313
56472
  const deliveriesQuery = useInfiniteQuery2({
56314
56473
  queryKey: ["sylphx", "webhooks", "deliveries", { status, event: event2, limit }],
56315
56474
  queryFn: async ({ pageParam = 0 }) => {
@@ -56330,7 +56489,7 @@ function useWebhookDeliveries(options = {}) {
56330
56489
  });
56331
56490
  const deliveries = deliveriesQuery.data?.pages.flatMap((page) => page.deliveries) ?? [];
56332
56491
  const total = deliveriesQuery.data?.pages[0]?.total ?? 0;
56333
- const replay = useCallback69(
56492
+ const replay = useCallback70(
56334
56493
  async (deliveryId) => {
56335
56494
  const result = await ctx.replayDelivery(deliveryId);
56336
56495
  await queryClient.invalidateQueries({
@@ -56340,12 +56499,12 @@ function useWebhookDeliveries(options = {}) {
56340
56499
  },
56341
56500
  [ctx, queryClient]
56342
56501
  );
56343
- const refresh = useCallback69(async () => {
56502
+ const refresh = useCallback70(async () => {
56344
56503
  await queryClient.invalidateQueries({
56345
56504
  queryKey: ["sylphx", "webhooks", "deliveries"]
56346
56505
  });
56347
56506
  }, [queryClient]);
56348
- const loadMore = useCallback69(async () => {
56507
+ const loadMore = useCallback70(async () => {
56349
56508
  if (deliveriesQuery.hasNextPage && !deliveriesQuery.isFetchingNextPage) {
56350
56509
  await deliveriesQuery.fetchNextPage();
56351
56510
  }
@@ -56364,14 +56523,14 @@ function useWebhookDeliveries(options = {}) {
56364
56523
  }
56365
56524
  function useWebhookStats(period = "week") {
56366
56525
  const ctx = useWebhooksContext();
56367
- const queryClient = useQueryClient6();
56368
- const statsQuery = useQuery7({
56526
+ const queryClient = useQueryClient7();
56527
+ const statsQuery = useQuery8({
56369
56528
  queryKey: ["sylphx", "webhooks", "stats", period],
56370
56529
  queryFn: () => ctx.getStats(period),
56371
56530
  staleTime: STALE_TIME_MODERATE_MS
56372
56531
  // 2 min - stats aggregate data
56373
56532
  });
56374
- const refresh = useCallback69(async () => {
56533
+ const refresh = useCallback70(async () => {
56375
56534
  await queryClient.invalidateQueries({
56376
56535
  queryKey: ["sylphx", "webhooks", "stats", period]
56377
56536
  });
@@ -56386,7 +56545,7 @@ function useWebhookStats(period = "week") {
56386
56545
 
56387
56546
  // src/react/ui/account-section.tsx
56388
56547
  init_constants();
56389
- import { useCallback as useCallback70, useEffect as useEffect65, useState as useState80 } from "react";
56548
+ import { useCallback as useCallback71, useEffect as useEffect65, useState as useState80 } from "react";
56390
56549
  import { Fragment as Fragment35, jsx as jsx65, jsxs as jsxs42 } from "react/jsx-runtime";
56391
56550
  function AccountSection(props) {
56392
56551
  return /* @__PURE__ */ jsx65(RequireSdk, { services: ["auth"], componentType: "account", theme: props.theme, children: /* @__PURE__ */ jsx65(AccountSectionInner, { ...props }) });
@@ -56475,7 +56634,7 @@ function AccountSectionInner({
56475
56634
  setIsExporting(false);
56476
56635
  }
56477
56636
  };
56478
- const checkSecurityStatus = useCallback70(async () => {
56637
+ const checkSecurityStatus = useCallback71(async () => {
56479
56638
  setIsChecking2FA(true);
56480
56639
  try {
56481
56640
  const status = await securityContext.getTwoFactorStatus();
@@ -61123,7 +61282,7 @@ function CheckCircleIcon({ color: color2 }) {
61123
61282
 
61124
61283
  // src/react/ui/feature-gate.tsx
61125
61284
  init_constants();
61126
- import { useContext as useContext78, useState as useState89 } from "react";
61285
+ import { useContext as useContext79, useState as useState89 } from "react";
61127
61286
  import { Fragment as Fragment42, jsx as jsx74, jsxs as jsxs51 } from "react/jsx-runtime";
61128
61287
  function FeatureGate({
61129
61288
  flag,
@@ -61192,7 +61351,7 @@ function FlagDevTools({
61192
61351
  className
61193
61352
  }) {
61194
61353
  const [isCollapsed, setIsCollapsed] = useState89(defaultCollapsed);
61195
- const context = useContext78(FeatureFlagContext);
61354
+ const context = useContext79(FeatureFlagContext);
61196
61355
  const styles2 = baseStyles(theme);
61197
61356
  if (!context) {
61198
61357
  return null;
@@ -61422,7 +61581,7 @@ function CloseIcon4() {
61422
61581
 
61423
61582
  // src/react/ui/file-upload.tsx
61424
61583
  init_constants();
61425
- import { useCallback as useCallback71, useEffect as useEffect74, useRef as useRef92, useState as useState90 } from "react";
61584
+ import { useCallback as useCallback72, useEffect as useEffect74, useRef as useRef92, useState as useState90 } from "react";
61426
61585
  import { Fragment as Fragment43, jsx as jsx75, jsxs as jsxs52 } from "react/jsx-runtime";
61427
61586
  function FileUpload(props) {
61428
61587
  return /* @__PURE__ */ jsx75(RequireSdk, { services: ["storage"], componentType: "storage", theme: props.theme, children: /* @__PURE__ */ jsx75(FileUploadInner, { ...props }) });
@@ -61451,7 +61610,7 @@ function FileUploadInner({
61451
61610
  useEffect74(() => {
61452
61611
  injectGlobalStyles();
61453
61612
  }, []);
61454
- const handleFiles = useCallback71(
61613
+ const handleFiles = useCallback72(
61455
61614
  async (files) => {
61456
61615
  if (!files || files.length === 0) return;
61457
61616
  const fileArray = Array.from(files);
@@ -61470,7 +61629,7 @@ function FileUploadInner({
61470
61629
  },
61471
61630
  [upload, onUpload]
61472
61631
  );
61473
- const handleDrop = useCallback71(
61632
+ const handleDrop = useCallback72(
61474
61633
  (e2) => {
61475
61634
  e2.preventDefault();
61476
61635
  e2.stopPropagation();
@@ -61480,7 +61639,7 @@ function FileUploadInner({
61480
61639
  },
61481
61640
  [handleFiles, disabled2]
61482
61641
  );
61483
- const handleDragOver = useCallback71(
61642
+ const handleDragOver = useCallback72(
61484
61643
  (e2) => {
61485
61644
  e2.preventDefault();
61486
61645
  e2.stopPropagation();
@@ -61488,7 +61647,7 @@ function FileUploadInner({
61488
61647
  },
61489
61648
  [disabled2]
61490
61649
  );
61491
- const handleDragLeave = useCallback71((e2) => {
61650
+ const handleDragLeave = useCallback72((e2) => {
61492
61651
  e2.preventDefault();
61493
61652
  e2.stopPropagation();
61494
61653
  setIsDragging(false);
@@ -62024,17 +62183,17 @@ function CloseIcon5() {
62024
62183
 
62025
62184
  // src/react/ui/job-scheduler.tsx
62026
62185
  init_constants();
62027
- import { useMutation as useMutation2, useQuery as useQuery9, useQueryClient as useQueryClient8 } from "@tanstack/react-query";
62028
- import { useCallback as useCallback73, useEffect as useEffect76, useState as useState92 } from "react";
62186
+ import { useMutation as useMutation2, useQuery as useQuery10, useQueryClient as useQueryClient9 } from "@tanstack/react-query";
62187
+ import { useCallback as useCallback74, useEffect as useEffect76, useState as useState92 } from "react";
62029
62188
 
62030
62189
  // src/react/job-hooks.ts
62031
- import { useQuery as useQuery8, useQueryClient as useQueryClient7 } from "@tanstack/react-query";
62032
- import { useCallback as useCallback72, useEffect as useEffect75, useRef as useRef93, useState as useState91 } from "react";
62190
+ import { useQuery as useQuery9, useQueryClient as useQueryClient8 } from "@tanstack/react-query";
62191
+ import { useCallback as useCallback73, useEffect as useEffect75, useRef as useRef93, useState as useState91 } from "react";
62033
62192
  function useJobs() {
62034
62193
  const ctx = useJobsContext();
62035
62194
  const [isLoading, setIsLoading] = useState91(false);
62036
62195
  const [error2, setError] = useState91(null);
62037
- const isAvailable = useCallback72(async () => {
62196
+ const isAvailable = useCallback73(async () => {
62038
62197
  try {
62039
62198
  const status = await ctx.checkStatus();
62040
62199
  return status.available;
@@ -62042,7 +62201,7 @@ function useJobs() {
62042
62201
  return false;
62043
62202
  }
62044
62203
  }, [ctx]);
62045
- const schedule = useCallback72(
62204
+ const schedule = useCallback73(
62046
62205
  async (options) => {
62047
62206
  setIsLoading(true);
62048
62207
  setError(null);
@@ -62058,7 +62217,7 @@ function useJobs() {
62058
62217
  },
62059
62218
  [ctx]
62060
62219
  );
62061
- const createCron = useCallback72(
62220
+ const createCron = useCallback73(
62062
62221
  async (options) => {
62063
62222
  setIsLoading(true);
62064
62223
  setError(null);
@@ -62074,7 +62233,7 @@ function useJobs() {
62074
62233
  },
62075
62234
  [ctx]
62076
62235
  );
62077
- const pauseCron = useCallback72(
62236
+ const pauseCron = useCallback73(
62078
62237
  async (scheduleId) => {
62079
62238
  setIsLoading(true);
62080
62239
  setError(null);
@@ -62090,7 +62249,7 @@ function useJobs() {
62090
62249
  },
62091
62250
  [ctx]
62092
62251
  );
62093
- const resumeCron = useCallback72(
62252
+ const resumeCron = useCallback73(
62094
62253
  async (scheduleId) => {
62095
62254
  setIsLoading(true);
62096
62255
  setError(null);
@@ -62106,7 +62265,7 @@ function useJobs() {
62106
62265
  },
62107
62266
  [ctx]
62108
62267
  );
62109
- const deleteCron = useCallback72(
62268
+ const deleteCron = useCallback73(
62110
62269
  async (scheduleId) => {
62111
62270
  setIsLoading(true);
62112
62271
  setError(null);
@@ -62122,7 +62281,7 @@ function useJobs() {
62122
62281
  },
62123
62282
  [ctx]
62124
62283
  );
62125
- const getJob = useCallback72(
62284
+ const getJob = useCallback73(
62126
62285
  async (jobId) => {
62127
62286
  try {
62128
62287
  return await ctx.getJob(jobId);
@@ -62134,7 +62293,7 @@ function useJobs() {
62134
62293
  },
62135
62294
  [ctx]
62136
62295
  );
62137
- const listJobs = useCallback72(
62296
+ const listJobs = useCallback73(
62138
62297
  async (options = {}) => {
62139
62298
  try {
62140
62299
  const result = await ctx.listJobs(options);
@@ -62147,7 +62306,7 @@ function useJobs() {
62147
62306
  },
62148
62307
  [ctx]
62149
62308
  );
62150
- const cancelJob = useCallback72(
62309
+ const cancelJob = useCallback73(
62151
62310
  async (jobId) => {
62152
62311
  setIsLoading(true);
62153
62312
  setError(null);
@@ -62537,13 +62696,13 @@ function JobList({
62537
62696
  emptyMessage = "No jobs scheduled"
62538
62697
  }) {
62539
62698
  const ctx = useJobsContext();
62540
- const queryClient = useQueryClient8();
62699
+ const queryClient = useQueryClient9();
62541
62700
  const [filter2, setFilter] = useState92("all");
62542
62701
  const styles2 = baseStyles(theme);
62543
62702
  useEffect76(() => {
62544
62703
  injectGlobalStyles();
62545
62704
  }, []);
62546
- const jobsQuery = useQuery9({
62705
+ const jobsQuery = useQuery10({
62547
62706
  queryKey: ["sylphx", "jobs", "list", filter2],
62548
62707
  queryFn: async () => {
62549
62708
  const apiStatus = filter2 === "all" || filter2 === "cancelled" ? void 0 : filter2;
@@ -62565,7 +62724,7 @@ function JobList({
62565
62724
  queryClient.invalidateQueries({ queryKey: ["sylphx", "jobs", "list"] });
62566
62725
  }
62567
62726
  });
62568
- const handleCancel = useCallback73(
62727
+ const handleCancel = useCallback74(
62569
62728
  async (jobId) => {
62570
62729
  if (onCancel) {
62571
62730
  onCancel(jobId);
@@ -65812,8 +65971,8 @@ function EmailIcon({ size: size4 = 24 }) {
65812
65971
 
65813
65972
  // src/react/ui/security-settings.tsx
65814
65973
  init_constants();
65815
- import { useMutation as useMutation3, useQuery as useQuery10, useQueryClient as useQueryClient9 } from "@tanstack/react-query";
65816
- import { useCallback as useCallback74, useEffect as useEffect83, useState as useState99 } from "react";
65974
+ import { useMutation as useMutation3, useQuery as useQuery11, useQueryClient as useQueryClient10 } from "@tanstack/react-query";
65975
+ import { useCallback as useCallback75, useEffect as useEffect83, useState as useState99 } from "react";
65817
65976
  import { Fragment as Fragment47, jsx as jsx83, jsxs as jsxs60 } from "react/jsx-runtime";
65818
65977
  function SecuritySettings({
65819
65978
  theme = defaultTheme,
@@ -65827,7 +65986,7 @@ function SecuritySettings({
65827
65986
  }) {
65828
65987
  const userContext = useUserContext();
65829
65988
  const securityContext = useSecurityContext();
65830
- const queryClient = useQueryClient9();
65989
+ const queryClient = useQueryClient10();
65831
65990
  const styles2 = baseStyles(theme);
65832
65991
  const [error2, setError] = useState99(null);
65833
65992
  const [success, setSuccess] = useState99(null);
@@ -65842,7 +66001,7 @@ function SecuritySettings({
65842
66001
  useEffect83(() => {
65843
66002
  injectGlobalStyles();
65844
66003
  }, []);
65845
- const twoFactorQuery = useQuery10({
66004
+ const twoFactorQuery = useQuery11({
65846
66005
  queryKey: ["sylphx", "security", "2fa-status"],
65847
66006
  queryFn: async () => {
65848
66007
  const data = await securityContext.getTwoFactorStatus();
@@ -65855,7 +66014,7 @@ function SecuritySettings({
65855
66014
  staleTime: STALE_TIME_STABLE_MS
65856
66015
  // 5 min
65857
66016
  });
65858
- const sessionsQuery = useQuery10({
66017
+ const sessionsQuery = useQuery11({
65859
66018
  queryKey: ["sylphx", "security", "sessions"],
65860
66019
  queryFn: async () => {
65861
66020
  const data = await userContext.getSessions();
@@ -65874,7 +66033,7 @@ function SecuritySettings({
65874
66033
  staleTime: STALE_TIME_FREQUENT_MS
65875
66034
  // 1 min - sessions can change
65876
66035
  });
65877
- const loginHistoryQuery = useQuery10({
66036
+ const loginHistoryQuery = useQuery11({
65878
66037
  queryKey: ["sylphx", "security", "login-history"],
65879
66038
  queryFn: async () => {
65880
66039
  const data = await userContext.getLoginHistory({ limit: 10 });
@@ -66007,10 +66166,10 @@ function SecuritySettings({
66007
66166
  onError?.(message);
66008
66167
  }
66009
66168
  });
66010
- const handleStart2FASetup = useCallback74(() => {
66169
+ const handleStart2FASetup = useCallback75(() => {
66011
66170
  setup2FAMutation.mutate();
66012
66171
  }, [setup2FAMutation]);
66013
- const handleEnable2FA = useCallback74(
66172
+ const handleEnable2FA = useCallback75(
66014
66173
  (e2) => {
66015
66174
  e2.preventDefault();
66016
66175
  if (!verifyCode || verifyCode.length !== 6) {
@@ -66021,12 +66180,12 @@ function SecuritySettings({
66021
66180
  },
66022
66181
  [verifyCode, enable2FAMutation]
66023
66182
  );
66024
- const handleDisable2FA = useCallback74(() => {
66183
+ const handleDisable2FA = useCallback75(() => {
66025
66184
  const code = prompt("Enter your 2FA code to disable two-factor authentication:");
66026
66185
  if (!code) return;
66027
66186
  disable2FAMutation.mutate(code);
66028
66187
  }, [disable2FAMutation]);
66029
- const handlePasswordChange = useCallback74(
66188
+ const handlePasswordChange = useCallback75(
66030
66189
  (e2) => {
66031
66190
  e2.preventDefault();
66032
66191
  if (newPassword !== confirmPassword) {
@@ -66044,13 +66203,13 @@ function SecuritySettings({
66044
66203
  },
66045
66204
  [newPassword, confirmPassword, currentPassword, changePasswordMutation]
66046
66205
  );
66047
- const handleRevokeSession = useCallback74(
66206
+ const handleRevokeSession = useCallback75(
66048
66207
  (sessionId) => {
66049
66208
  revokeSessionMutation.mutate(sessionId);
66050
66209
  },
66051
66210
  [revokeSessionMutation]
66052
66211
  );
66053
- const handleRevokeAllSessions = useCallback74(() => {
66212
+ const handleRevokeAllSessions = useCallback75(() => {
66054
66213
  if (!confirm("Are you sure you want to sign out all other devices?")) {
66055
66214
  return;
66056
66215
  }
@@ -66583,7 +66742,7 @@ function DeviceIcon({ device, theme }) {
66583
66742
 
66584
66743
  // src/react/ui/subscriber-preferences.tsx
66585
66744
  init_constants();
66586
- import { useQuery as useQuery11, useQueryClient as useQueryClient10 } from "@tanstack/react-query";
66745
+ import { useQuery as useQuery12, useQueryClient as useQueryClient11 } from "@tanstack/react-query";
66587
66746
  import { useEffect as useEffect84, useState as useState100 } from "react";
66588
66747
  import { Fragment as Fragment48, jsx as jsx84, jsxs as jsxs61 } from "react/jsx-runtime";
66589
66748
  function SubscriberPreferences({
@@ -66601,7 +66760,7 @@ function SubscriberPreferences({
66601
66760
  unsubscribeButtonText = "Unsubscribe from All"
66602
66761
  }) {
66603
66762
  const { getPreferences, updatePreferences } = useNewsletter();
66604
- const queryClient = useQueryClient10();
66763
+ const queryClient = useQueryClient11();
66605
66764
  const styles2 = baseStyles(theme);
66606
66765
  const [selectedPreferences, setSelectedPreferences] = useState100([]);
66607
66766
  const [saving, setSaving] = useState100(false);
@@ -66611,7 +66770,7 @@ function SubscriberPreferences({
66611
66770
  useEffect84(() => {
66612
66771
  injectGlobalStyles();
66613
66772
  }, []);
66614
- const prefsQuery = useQuery11({
66773
+ const prefsQuery = useQuery12({
66615
66774
  queryKey: ["sylphx", "newsletter", "preferences", email],
66616
66775
  queryFn: async () => {
66617
66776
  const prefs = await getPreferences(email);
@@ -67198,7 +67357,7 @@ function UnsubscribeConfirm({
67198
67357
 
67199
67358
  // src/react/ui/user-profile.tsx
67200
67359
  init_constants();
67201
- import { useCallback as useCallback75, useEffect as useEffect86, useRef as useRef95, useState as useState102 } from "react";
67360
+ import { useCallback as useCallback76, useEffect as useEffect86, useRef as useRef95, useState as useState102 } from "react";
67202
67361
  import { Fragment as Fragment50, jsx as jsx86, jsxs as jsxs63 } from "react/jsx-runtime";
67203
67362
  function UserProfile(props) {
67204
67363
  return /* @__PURE__ */ jsx86(RequireSdk, { services: ["auth", "storage"], componentType: "user", theme: props.theme, children: /* @__PURE__ */ jsx86(UserProfileInner, { ...props }) });
@@ -67244,7 +67403,7 @@ function UserProfileInner({
67244
67403
  return () => clearTimeout(timer);
67245
67404
  }
67246
67405
  }, [success, error2]);
67247
- const handleProfileUpdate = useCallback75(
67406
+ const handleProfileUpdate = useCallback76(
67248
67407
  async (e2) => {
67249
67408
  e2.preventDefault();
67250
67409
  setIsLoading(true);
@@ -67268,7 +67427,7 @@ function UserProfileInner({
67268
67427
  },
67269
67428
  [form, userContext, refreshUser, onSuccess, onError]
67270
67429
  );
67271
- const handleAvatarUpload = useCallback75(
67430
+ const handleAvatarUpload = useCallback76(
67272
67431
  async (file) => {
67273
67432
  setError(null);
67274
67433
  try {
@@ -73866,7 +74025,7 @@ function isWebVitalsInitialized() {
73866
74025
 
73867
74026
  // src/react/hooks/use-session-replay.tsx
73868
74027
  init_constants();
73869
- import { useCallback as useCallback76, useEffect as useEffect88, useRef as useRef96, useState as useState104 } from "react";
74028
+ import { useCallback as useCallback77, useEffect as useEffect88, useRef as useRef96, useState as useState104 } from "react";
73870
74029
  import { jsx as jsx88 } from "react/jsx-runtime";
73871
74030
  function useSessionReplay(options = {}) {
73872
74031
  const {
@@ -73939,7 +74098,7 @@ function useSessionReplay(options = {}) {
73939
74098
  });
73940
74099
  }
73941
74100
  }, [userId]);
73942
- const start = useCallback76(() => {
74101
+ const start = useCallback77(() => {
73943
74102
  if (!recorderRef.current) {
73944
74103
  throw new Error("Recorder not initialized");
73945
74104
  }
@@ -73947,29 +74106,29 @@ function useSessionReplay(options = {}) {
73947
74106
  setSessionId(id3);
73948
74107
  return id3;
73949
74108
  }, []);
73950
- const pause = useCallback76(() => {
74109
+ const pause = useCallback77(() => {
73951
74110
  recorderRef.current?.pause();
73952
74111
  }, []);
73953
- const resume = useCallback76(() => {
74112
+ const resume = useCallback77(() => {
73954
74113
  recorderRef.current?.resume();
73955
74114
  }, []);
73956
- const stop = useCallback76(async () => {
74115
+ const stop = useCallback77(async () => {
73957
74116
  await recorderRef.current?.stop();
73958
74117
  setSessionId(null);
73959
74118
  }, []);
73960
- const markError = useCallback76(
74119
+ const markError = useCallback77(
73961
74120
  (errorId, error2, metadata) => {
73962
74121
  recorderRef.current?.markError(errorId, error2, metadata);
73963
74122
  },
73964
74123
  []
73965
74124
  );
73966
- const markNavigation = useCallback76((from, to) => {
74125
+ const markNavigation = useCallback77((from, to) => {
73967
74126
  recorderRef.current?.markNavigation(from, to);
73968
74127
  }, []);
73969
- const markConversion = useCallback76((name, value) => {
74128
+ const markConversion = useCallback77((name, value) => {
73970
74129
  recorderRef.current?.markConversion(name, value);
73971
74130
  }, []);
73972
- const addMarker = useCallback76((type, payload) => {
74131
+ const addMarker = useCallback77((type, payload) => {
73973
74132
  recorderRef.current?.addMarker(type, payload);
73974
74133
  }, []);
73975
74134
  return {
@@ -74024,7 +74183,7 @@ function useSessionReplayErrorMarker() {
74024
74183
  recorderRef.current = window.__sylphxRecorder;
74025
74184
  }
74026
74185
  }, []);
74027
- const markError = useCallback76((error2, errorInfo) => {
74186
+ const markError = useCallback77((error2, errorInfo) => {
74028
74187
  const errorId = `err_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
74029
74188
  recorderRef.current?.markError(errorId, error2, {
74030
74189
  componentStack: errorInfo?.componentStack?.slice(0, STACK_TRACE_MAX_LENGTH)
@@ -74043,7 +74202,7 @@ function withSessionReplay(Component4, options) {
74043
74202
  }
74044
74203
 
74045
74204
  // src/react/hooks/use-web-vitals.ts
74046
- import { useCallback as useCallback77, useEffect as useEffect89, useRef as useRef97, useState as useState105 } from "react";
74205
+ import { useCallback as useCallback78, useEffect as useEffect89, useRef as useRef97, useState as useState105 } from "react";
74047
74206
  function useWebVitals(options = {}) {
74048
74207
  const { autoInit = true, onReport, ...config2 } = options;
74049
74208
  const [report, setReport] = useState105(null);
@@ -74063,10 +74222,10 @@ function useWebVitals(options = {}) {
74063
74222
  return () => {
74064
74223
  };
74065
74224
  }, [autoInit, onReport]);
74066
- const refresh = useCallback77(() => {
74225
+ const refresh = useCallback78(() => {
74067
74226
  setReport(getWebVitalsReport());
74068
74227
  }, []);
74069
- const reset = useCallback77(() => {
74228
+ const reset = useCallback78(() => {
74070
74229
  resetWebVitals();
74071
74230
  setReport(null);
74072
74231
  initRef.current = false;
@@ -74153,7 +74312,7 @@ function useWebVitalsAnalytics(options) {
74153
74312
 
74154
74313
  // src/react/hooks/use-error-tracking.ts
74155
74314
  init_constants();
74156
- import { useCallback as useCallback78, useEffect as useEffect90, useRef as useRef98 } from "react";
74315
+ import { useCallback as useCallback79, useEffect as useEffect90, useRef as useRef98 } from "react";
74157
74316
  function useEnhancedErrorTracking(options = {}) {
74158
74317
  const {
74159
74318
  attachReplay = true,
@@ -74208,7 +74367,7 @@ function useEnhancedErrorTracking(options = {}) {
74208
74367
  const interval = setInterval(checkReplaySession, SESSION_REPLAY_STATUS_CHECK_MS);
74209
74368
  return () => clearInterval(interval);
74210
74369
  }, [attachReplay]);
74211
- const captureException = useCallback78(
74370
+ const captureException = useCallback79(
74212
74371
  async (error2, opts = {}) => {
74213
74372
  if (!trackerRef.current) {
74214
74373
  return { eventId: "" };
@@ -74236,7 +74395,7 @@ function useEnhancedErrorTracking(options = {}) {
74236
74395
  },
74237
74396
  [attachReplay, onCapture]
74238
74397
  );
74239
- const captureMessage = useCallback78(
74398
+ const captureMessage = useCallback79(
74240
74399
  async (message, opts = {}) => {
74241
74400
  if (!trackerRef.current) {
74242
74401
  return { eventId: "" };
@@ -74247,20 +74406,20 @@ function useEnhancedErrorTracking(options = {}) {
74247
74406
  },
74248
74407
  [onCapture]
74249
74408
  );
74250
- const addBreadcrumb2 = useCallback78((breadcrumb) => {
74409
+ const addBreadcrumb2 = useCallback79((breadcrumb) => {
74251
74410
  trackerRef.current?.addBreadcrumb(breadcrumb);
74252
74411
  }, []);
74253
- const setUser = useCallback78((user) => {
74412
+ const setUser = useCallback79((user) => {
74254
74413
  trackerRef.current?.setUser(user);
74255
74414
  }, []);
74256
- const clearUser = useCallback78(() => {
74415
+ const clearUser = useCallback79(() => {
74257
74416
  trackerRef.current?.clearUser();
74258
74417
  }, []);
74259
- const linkReplaySession = useCallback78((sessionId) => {
74418
+ const linkReplaySession = useCallback79((sessionId) => {
74260
74419
  replaySessionIdRef.current = sessionId;
74261
74420
  trackerRef.current?.setSessionReplayId(sessionId);
74262
74421
  }, []);
74263
- const getReplaySessionId = useCallback78(() => {
74422
+ const getReplaySessionId = useCallback79(() => {
74264
74423
  return replaySessionIdRef.current;
74265
74424
  }, []);
74266
74425
  return {
@@ -75464,10 +75623,10 @@ var DEFAULT_FLAGS_CONFIG = {
75464
75623
  };
75465
75624
 
75466
75625
  // src/react/hooks/use-flag.ts
75467
- import { useCallback as useCallback80, useContext as useContext80, useEffect as useEffect92, useMemo as useMemo129, useRef as useRef100, useState as useState107 } from "react";
75626
+ import { useCallback as useCallback81, useContext as useContext81, useEffect as useEffect92, useMemo as useMemo130, useRef as useRef100, useState as useState107 } from "react";
75468
75627
 
75469
75628
  // src/react/hooks/use-flags.tsx
75470
- import { createContext as createContext67, useCallback as useCallback79, useContext as useContext79, useEffect as useEffect91, useMemo as useMemo128, useRef as useRef99, useState as useState106 } from "react";
75629
+ import { createContext as createContext67, useCallback as useCallback80, useContext as useContext80, useEffect as useEffect91, useMemo as useMemo129, useRef as useRef99, useState as useState106 } from "react";
75471
75630
  import { jsx as jsx89 } from "react/jsx-runtime";
75472
75631
  var FeatureFlagsContext = createContext67(null);
75473
75632
  function FeatureFlagsProvider({
@@ -75486,7 +75645,7 @@ function FeatureFlagsProvider({
75486
75645
  const evaluatorRef = useRef99(null);
75487
75646
  const streamRef = useRef99(null);
75488
75647
  const experimentsRef = useRef99(null);
75489
- const handleStreamEvent = useCallback79(
75648
+ const handleStreamEvent = useCallback80(
75490
75649
  (event2) => {
75491
75650
  switch (event2.type) {
75492
75651
  case "ready":
@@ -75558,7 +75717,7 @@ function FeatureFlagsProvider({
75558
75717
  evaluatorRef.current.setContext(context);
75559
75718
  }
75560
75719
  }, [context]);
75561
- const value = useMemo128(
75720
+ const value = useMemo129(
75562
75721
  () => ({
75563
75722
  evaluator: evaluatorRef.current,
75564
75723
  stream: streamRef.current,
@@ -75577,53 +75736,53 @@ function FeatureFlagsProvider({
75577
75736
  return /* @__PURE__ */ jsx89(FeatureFlagsContext.Provider, { value, children });
75578
75737
  }
75579
75738
  function useFeatureFlags2() {
75580
- const ctx = useContext79(FeatureFlagsContext);
75739
+ const ctx = useContext80(FeatureFlagsContext);
75581
75740
  if (!ctx) {
75582
75741
  throw new Error("useFeatureFlags must be used within a FeatureFlagsProvider");
75583
75742
  }
75584
75743
  const { evaluator, isReady, isLoading, error: error2, flags, updateVersion } = ctx;
75585
- const isEnabled = useCallback79(
75744
+ const isEnabled = useCallback80(
75586
75745
  (flagKey, defaultValue = false) => {
75587
75746
  void updateVersion;
75588
75747
  return evaluator.isEnabled(flagKey, defaultValue);
75589
75748
  },
75590
75749
  [evaluator, updateVersion]
75591
75750
  );
75592
- const getString = useCallback79(
75751
+ const getString = useCallback80(
75593
75752
  (flagKey, defaultValue = "") => {
75594
75753
  void updateVersion;
75595
75754
  return evaluator.getString(flagKey, defaultValue);
75596
75755
  },
75597
75756
  [evaluator, updateVersion]
75598
75757
  );
75599
- const getNumber = useCallback79(
75758
+ const getNumber = useCallback80(
75600
75759
  (flagKey, defaultValue = 0) => {
75601
75760
  void updateVersion;
75602
75761
  return evaluator.getNumber(flagKey, defaultValue);
75603
75762
  },
75604
75763
  [evaluator, updateVersion]
75605
75764
  );
75606
- const getJSON = useCallback79(
75765
+ const getJSON = useCallback80(
75607
75766
  (flagKey, defaultValue) => {
75608
75767
  void updateVersion;
75609
75768
  return evaluator.getJSON(flagKey, defaultValue);
75610
75769
  },
75611
75770
  [evaluator, updateVersion]
75612
75771
  );
75613
- const evaluate2 = useCallback79(
75772
+ const evaluate2 = useCallback80(
75614
75773
  (flagKey, defaultValue, contextOverride) => {
75615
75774
  void updateVersion;
75616
75775
  return evaluator.evaluate(flagKey, defaultValue, contextOverride);
75617
75776
  },
75618
75777
  [evaluator, updateVersion]
75619
75778
  );
75620
- const setContext = useCallback79(
75779
+ const setContext = useCallback80(
75621
75780
  (context) => {
75622
75781
  evaluator.setContext(context);
75623
75782
  },
75624
75783
  [evaluator]
75625
75784
  );
75626
- const updateContext = useCallback79(
75785
+ const updateContext = useCallback80(
75627
75786
  (partial) => {
75628
75787
  evaluator.updateContext(partial);
75629
75788
  },
@@ -75645,7 +75804,7 @@ function useFeatureFlags2() {
75645
75804
  }
75646
75805
  function useFlag(flagKey, defaultValue = false) {
75647
75806
  const { isEnabled, updateVersion } = useFeatureFlagsContext();
75648
- return useMemo128(
75807
+ return useMemo129(
75649
75808
  () => isEnabled(flagKey, defaultValue),
75650
75809
  // eslint-disable-next-line react-hooks/exhaustive-deps
75651
75810
  [flagKey, defaultValue, isEnabled]
@@ -75653,7 +75812,7 @@ function useFlag(flagKey, defaultValue = false) {
75653
75812
  }
75654
75813
  function useFlagString(flagKey, defaultValue = "") {
75655
75814
  const { getString, updateVersion } = useFeatureFlagsContext();
75656
- return useMemo128(
75815
+ return useMemo129(
75657
75816
  () => getString(flagKey, defaultValue),
75658
75817
  // eslint-disable-next-line react-hooks/exhaustive-deps
75659
75818
  [flagKey, defaultValue, getString]
@@ -75661,7 +75820,7 @@ function useFlagString(flagKey, defaultValue = "") {
75661
75820
  }
75662
75821
  function useFlagNumber(flagKey, defaultValue = 0) {
75663
75822
  const { getNumber, updateVersion } = useFeatureFlagsContext();
75664
- return useMemo128(
75823
+ return useMemo129(
75665
75824
  () => getNumber(flagKey, defaultValue),
75666
75825
  // eslint-disable-next-line react-hooks/exhaustive-deps
75667
75826
  [flagKey, defaultValue, getNumber]
@@ -75669,7 +75828,7 @@ function useFlagNumber(flagKey, defaultValue = 0) {
75669
75828
  }
75670
75829
  function useFlagJSON(flagKey, defaultValue) {
75671
75830
  const { getJSON, updateVersion } = useFeatureFlagsContext();
75672
- return useMemo128(
75831
+ return useMemo129(
75673
75832
  () => getJSON(flagKey, defaultValue),
75674
75833
  // eslint-disable-next-line react-hooks/exhaustive-deps
75675
75834
  [flagKey, defaultValue, getJSON]
@@ -75677,19 +75836,19 @@ function useFlagJSON(flagKey, defaultValue) {
75677
75836
  }
75678
75837
  function useFlagEvaluation(flagKey, defaultValue, contextOverride) {
75679
75838
  const { evaluate: evaluate2, updateVersion } = useFeatureFlagsContext();
75680
- return useMemo128(
75839
+ return useMemo129(
75681
75840
  () => evaluate2(flagKey, defaultValue, contextOverride),
75682
75841
  // eslint-disable-next-line react-hooks/exhaustive-deps
75683
75842
  [flagKey, defaultValue, contextOverride, evaluate2]
75684
75843
  );
75685
75844
  }
75686
75845
  function useExperiment(experimentKey) {
75687
- const ctx = useContext79(FeatureFlagsContext);
75846
+ const ctx = useContext80(FeatureFlagsContext);
75688
75847
  if (!ctx) {
75689
75848
  throw new Error("useExperiment must be used within a FeatureFlagsProvider");
75690
75849
  }
75691
75850
  const { experiments, updateVersion } = ctx;
75692
- return useMemo128(() => {
75851
+ return useMemo129(() => {
75693
75852
  const result = experiments.getVariant(experimentKey);
75694
75853
  return {
75695
75854
  variant: result.variant,
@@ -75707,7 +75866,7 @@ function useIsInTreatment(experimentKey) {
75707
75866
  return inExperiment && variant !== "control";
75708
75867
  }
75709
75868
  function useFeatureFlagsContext() {
75710
- const ctx = useContext79(FeatureFlagsContext);
75869
+ const ctx = useContext80(FeatureFlagsContext);
75711
75870
  if (!ctx) {
75712
75871
  throw new Error("Feature flags hooks must be used within a FeatureFlagsProvider");
75713
75872
  }
@@ -75722,7 +75881,7 @@ function useFeatureFlagsContext() {
75722
75881
  };
75723
75882
  }
75724
75883
  function useFlagsReady() {
75725
- const ctx = useContext79(FeatureFlagsContext);
75884
+ const ctx = useContext80(FeatureFlagsContext);
75726
75885
  if (!ctx) {
75727
75886
  return { isReady: false, isLoading: true, error: null };
75728
75887
  }
@@ -75742,22 +75901,22 @@ function useFlagStatus(key, options) {
75742
75901
  pollInterval = DEFAULT_POLL_INTERVAL_MS2,
75743
75902
  context: contextOverride
75744
75903
  } = options ?? {};
75745
- const ctx = useContext80(FeatureFlagsContext);
75904
+ const ctx = useContext81(FeatureFlagsContext);
75746
75905
  const [enabled, setEnabled] = useState107(false);
75747
75906
  const [loading, setLoading] = useState107(!ctx?.isReady);
75748
75907
  const [error2, setError] = useState107(null);
75749
75908
  const mountedRef = useRef100(true);
75750
- const evalContext = useMemo129(() => {
75909
+ const evalContext = useMemo130(() => {
75751
75910
  if (contextOverride) return contextOverride;
75752
75911
  if (userId || attributes) return { userId, ...attributes };
75753
75912
  return void 0;
75754
75913
  }, [contextOverride, userId, attributes]);
75755
- const evaluateLocally = useCallback80(() => {
75914
+ const evaluateLocally = useCallback81(() => {
75756
75915
  if (!ctx?.evaluator) return false;
75757
75916
  const result = ctx.evaluator.evaluate(key, false, evalContext);
75758
75917
  return result.value;
75759
75918
  }, [ctx, key, evalContext]);
75760
- const refetch = useCallback80(async () => {
75919
+ const refetch = useCallback81(async () => {
75761
75920
  if (!mountedRef.current) return;
75762
75921
  setError(null);
75763
75922
  try {
@@ -77934,7 +78093,7 @@ function resetAnalyticsTracker() {
77934
78093
 
77935
78094
  // src/react/hooks/use-analytics.tsx
77936
78095
  init_constants();
77937
- import React227, { createContext as createContext68, useCallback as useCallback81, useContext as useContext81, useEffect as useEffect93, useMemo as useMemo130, useRef as useRef101 } from "react";
78096
+ import React227, { createContext as createContext68, useCallback as useCallback82, useContext as useContext82, useEffect as useEffect93, useMemo as useMemo131, useRef as useRef101 } from "react";
77938
78097
  import { Fragment as Fragment51, jsx as jsx90 } from "react/jsx-runtime";
77939
78098
  var AnalyticsContext = createContext68(null);
77940
78099
  function AnalyticsProvider({
@@ -77959,7 +78118,7 @@ function AnalyticsProvider({
77959
78118
  trackerRef.current.identify(user.id, user.properties);
77960
78119
  }
77961
78120
  }, [user]);
77962
- const value = useMemo130(() => {
78121
+ const value = useMemo131(() => {
77963
78122
  if (!trackerRef.current || disabled2) return null;
77964
78123
  return {
77965
78124
  tracker: trackerRef.current,
@@ -77972,25 +78131,25 @@ function AnalyticsProvider({
77972
78131
  return /* @__PURE__ */ jsx90(AnalyticsContext.Provider, { value, children });
77973
78132
  }
77974
78133
  function useAnalyticsHook() {
77975
- const ctx = useContext81(AnalyticsContext);
77976
- const noopTrack = useCallback81(() => {
78134
+ const ctx = useContext82(AnalyticsContext);
78135
+ const noopTrack = useCallback82(() => {
77977
78136
  }, []);
77978
- const noopIdentify = useCallback81(() => {
78137
+ const noopIdentify = useCallback82(() => {
77979
78138
  }, []);
77980
- const noopReset = useCallback81(() => {
78139
+ const noopReset = useCallback82(() => {
77981
78140
  }, []);
77982
- const noopSetUserProperties = useCallback81(() => {
78141
+ const noopSetUserProperties = useCallback82(() => {
77983
78142
  }, []);
77984
- const noopSetUserPropertiesOnce = useCallback81(() => {
78143
+ const noopSetUserPropertiesOnce = useCallback82(() => {
77985
78144
  }, []);
77986
- const noopIncrementUserProperty = useCallback81(() => {
78145
+ const noopIncrementUserProperty = useCallback82(() => {
77987
78146
  }, []);
77988
- const noopGroup = useCallback81(() => {
78147
+ const noopGroup = useCallback82(() => {
77989
78148
  }, []);
77990
- const noopRegister = useCallback81(() => {
78149
+ const noopRegister = useCallback82(() => {
77991
78150
  }, []);
77992
- const noopGetDistinctId = useCallback81(() => null, []);
77993
- const noopFlush = useCallback81(async () => {
78151
+ const noopGetDistinctId = useCallback82(() => null, []);
78152
+ const noopFlush = useCallback82(async () => {
77994
78153
  }, []);
77995
78154
  if (!ctx) {
77996
78155
  return {
@@ -78009,56 +78168,56 @@ function useAnalyticsHook() {
78009
78168
  }
78010
78169
  const { tracker, isReady } = ctx;
78011
78170
  return {
78012
- track: useCallback81(
78171
+ track: useCallback82(
78013
78172
  (eventName, properties) => {
78014
78173
  tracker.track(eventName, properties);
78015
78174
  },
78016
78175
  [tracker]
78017
78176
  ),
78018
- identify: useCallback81(
78177
+ identify: useCallback82(
78019
78178
  (userId, properties) => {
78020
78179
  tracker.identify(userId, properties);
78021
78180
  },
78022
78181
  [tracker]
78023
78182
  ),
78024
- reset: useCallback81(() => {
78183
+ reset: useCallback82(() => {
78025
78184
  tracker.reset();
78026
78185
  }, [tracker]),
78027
- setUserProperties: useCallback81(
78186
+ setUserProperties: useCallback82(
78028
78187
  (properties) => {
78029
78188
  tracker.setUserProperties(properties);
78030
78189
  },
78031
78190
  [tracker]
78032
78191
  ),
78033
- setUserPropertiesOnce: useCallback81(
78192
+ setUserPropertiesOnce: useCallback82(
78034
78193
  (properties) => {
78035
78194
  tracker.setUserPropertiesOnce(properties);
78036
78195
  },
78037
78196
  [tracker]
78038
78197
  ),
78039
- incrementUserProperty: useCallback81(
78198
+ incrementUserProperty: useCallback82(
78040
78199
  (property, value) => {
78041
78200
  tracker.incrementUserProperty(property, value);
78042
78201
  },
78043
78202
  [tracker]
78044
78203
  ),
78045
- group: useCallback81(
78204
+ group: useCallback82(
78046
78205
  (groupType, groupKey, properties) => {
78047
78206
  tracker.group(groupType, groupKey, properties);
78048
78207
  },
78049
78208
  [tracker]
78050
78209
  ),
78051
- register: useCallback81(
78210
+ register: useCallback82(
78052
78211
  (properties) => {
78053
78212
  tracker.register(properties);
78054
78213
  },
78055
78214
  [tracker]
78056
78215
  ),
78057
- getDistinctId: useCallback81(() => {
78216
+ getDistinctId: useCallback82(() => {
78058
78217
  return tracker.getDistinctId();
78059
78218
  }, [tracker]),
78060
78219
  isReady,
78061
- flush: useCallback81(async () => {
78220
+ flush: useCallback82(async () => {
78062
78221
  await tracker.flush();
78063
78222
  }, [tracker])
78064
78223
  };
@@ -78097,7 +78256,7 @@ function useComponentTracking(componentName, properties) {
78097
78256
  }
78098
78257
  function useFeatureTracking(featureName) {
78099
78258
  const { track } = useAnalyticsHook();
78100
- const trackUsed = useCallback81(
78259
+ const trackUsed = useCallback82(
78101
78260
  (properties) => {
78102
78261
  track("feature_used", {
78103
78262
  feature: featureName,
@@ -78106,7 +78265,7 @@ function useFeatureTracking(featureName) {
78106
78265
  },
78107
78266
  [track, featureName]
78108
78267
  );
78109
- const trackError = useCallback81(
78268
+ const trackError = useCallback82(
78110
78269
  (error2, properties) => {
78111
78270
  track("feature_error", {
78112
78271
  feature: featureName,
@@ -78123,11 +78282,11 @@ function useFormTracking(formName) {
78123
78282
  const { track } = useAnalyticsHook();
78124
78283
  const startTime = useRef101(null);
78125
78284
  const fieldsFilledRef = useRef101(/* @__PURE__ */ new Set());
78126
- const trackStarted = useCallback81(() => {
78285
+ const trackStarted = useCallback82(() => {
78127
78286
  startTime.current = Date.now();
78128
78287
  track("form_started", { form: formName });
78129
78288
  }, [track, formName]);
78130
- const trackCompleted = useCallback81(
78289
+ const trackCompleted = useCallback82(
78131
78290
  (properties) => {
78132
78291
  const duration2 = startTime.current ? Date.now() - startTime.current : void 0;
78133
78292
  track("form_completed", {
@@ -78139,7 +78298,7 @@ function useFormTracking(formName) {
78139
78298
  },
78140
78299
  [track, formName]
78141
78300
  );
78142
- const trackAbandoned = useCallback81(() => {
78301
+ const trackAbandoned = useCallback82(() => {
78143
78302
  const duration2 = startTime.current ? Date.now() - startTime.current : void 0;
78144
78303
  track("form_abandoned", {
78145
78304
  form: formName,
@@ -78147,7 +78306,7 @@ function useFormTracking(formName) {
78147
78306
  fields_filled: fieldsFilledRef.current.size
78148
78307
  });
78149
78308
  }, [track, formName]);
78150
- const trackFieldFilled = useCallback81(
78309
+ const trackFieldFilled = useCallback82(
78151
78310
  (fieldName) => {
78152
78311
  if (!fieldsFilledRef.current.has(fieldName)) {
78153
78312
  fieldsFilledRef.current.add(fieldName);
@@ -78159,7 +78318,7 @@ function useFormTracking(formName) {
78159
78318
  },
78160
78319
  [track, formName]
78161
78320
  );
78162
- const trackError = useCallback81(
78321
+ const trackError = useCallback82(
78163
78322
  (fieldName, error2) => {
78164
78323
  track("form_field_error", {
78165
78324
  form: formName,
@@ -78181,10 +78340,10 @@ function useTimeTracking(name, options) {
78181
78340
  const { track } = useAnalyticsHook();
78182
78341
  const startTime = useRef101(Date.now());
78183
78342
  const trackedIntervals = useRef101(/* @__PURE__ */ new Set());
78184
- const getTimeSpent = useCallback81(() => {
78343
+ const getTimeSpent = useCallback82(() => {
78185
78344
  return Date.now() - startTime.current;
78186
78345
  }, []);
78187
- const trackNow = useCallback81(() => {
78346
+ const trackNow = useCallback82(() => {
78188
78347
  track("time_spent", {
78189
78348
  name,
78190
78349
  duration_ms: getTimeSpent()
@@ -78221,8 +78380,8 @@ function useTimeTracking(name, options) {
78221
78380
  }
78222
78381
 
78223
78382
  // src/react/hooks/use-destination-router.tsx
78224
- import { useCallback as useCallback82, useEffect as useEffect94, useMemo as useMemo131, useRef as useRef102 } from "react";
78225
- import { createContext as createContext69, useContext as useContext82 } from "react";
78383
+ import { useCallback as useCallback83, useEffect as useEffect94, useMemo as useMemo132, useRef as useRef102 } from "react";
78384
+ import { createContext as createContext69, useContext as useContext83 } from "react";
78226
78385
  import { jsx as jsx91 } from "react/jsx-runtime";
78227
78386
  function useDestinationRouter(options) {
78228
78387
  const {
@@ -78236,7 +78395,7 @@ function useDestinationRouter(options) {
78236
78395
  const initializedRef = useRef102(false);
78237
78396
  const { hasConsent: checkConsent } = useConsent();
78238
78397
  const { user } = useUser();
78239
- const router = useMemo131(() => {
78398
+ const router = useMemo132(() => {
78240
78399
  if (!autoInit || typeof window === "undefined") return null;
78241
78400
  const newRouter = createDestinationRouter({
78242
78401
  destinations,
@@ -78261,46 +78420,46 @@ function useDestinationRouter(options) {
78261
78420
  name: user.name
78262
78421
  });
78263
78422
  }, [syncUser, user?.id, user?.email, user?.name]);
78264
- const track = useCallback82(
78423
+ const track = useCallback83(
78265
78424
  (event2, properties) => {
78266
78425
  router?.track(event2, properties);
78267
78426
  },
78268
78427
  [router]
78269
78428
  );
78270
- const trackTo = useCallback82(
78429
+ const trackTo = useCallback83(
78271
78430
  (destinationType, event2, properties) => {
78272
78431
  router?.trackTo(destinationType, event2, properties);
78273
78432
  },
78274
78433
  [router]
78275
78434
  );
78276
- const identify = useCallback82(
78435
+ const identify = useCallback83(
78277
78436
  (userId, traits) => {
78278
78437
  router?.identify(userId, traits);
78279
78438
  },
78280
78439
  [router]
78281
78440
  );
78282
- const page = useCallback82(
78441
+ const page = useCallback83(
78283
78442
  (name, properties) => {
78284
78443
  router?.page(name, properties);
78285
78444
  },
78286
78445
  [router]
78287
78446
  );
78288
- const getEnabledDestinations = useCallback82(() => {
78447
+ const getEnabledDestinations = useCallback83(() => {
78289
78448
  return router?.getEnabledDestinations() || [];
78290
78449
  }, [router]);
78291
- const setDestinationEnabled = useCallback82(
78450
+ const setDestinationEnabled = useCallback83(
78292
78451
  (type, enabled) => {
78293
78452
  router?.setDestinationEnabled(type, enabled);
78294
78453
  },
78295
78454
  [router]
78296
78455
  );
78297
- const setConsentChecker = useCallback82(
78456
+ const setConsentChecker = useCallback83(
78298
78457
  (fn) => {
78299
78458
  router?.setConsentChecker(fn);
78300
78459
  },
78301
78460
  [router]
78302
78461
  );
78303
- const setDistinctId = useCallback82(
78462
+ const setDistinctId = useCallback83(
78304
78463
  (id3) => {
78305
78464
  router?.setDistinctId(id3);
78306
78465
  },
@@ -78328,7 +78487,7 @@ function DestinationRouterProvider({
78328
78487
  return /* @__PURE__ */ jsx91(DestinationRouterContext.Provider, { value: router, children });
78329
78488
  }
78330
78489
  function useRouterContext() {
78331
- return useContext82(DestinationRouterContext);
78490
+ return useContext83(DestinationRouterContext);
78332
78491
  }
78333
78492
 
78334
78493
  // src/lib/tasks/handler.ts
@@ -79114,7 +79273,7 @@ var job = task;
79114
79273
 
79115
79274
  // src/react/hooks/use-realtime.ts
79116
79275
  init_constants();
79117
- import { useCallback as useCallback83, useContext as useContext83, useEffect as useEffect95, useMemo as useMemo132, useRef as useRef103, useState as useState108 } from "react";
79276
+ import { useCallback as useCallback84, useContext as useContext84, useEffect as useEffect95, useMemo as useMemo133, useRef as useRef103, useState as useState108 } from "react";
79118
79277
  function useRealtime(channel, options = {}) {
79119
79278
  const {
79120
79279
  events,
@@ -79128,7 +79287,7 @@ function useRealtime(channel, options = {}) {
79128
79287
  } = options;
79129
79288
  const [messages, setMessages] = useState108([]);
79130
79289
  const [status, setStatus] = useState108("disconnected");
79131
- const platformContext = useContext83(PlatformContext);
79290
+ const platformContext = useContext84(PlatformContext);
79132
79291
  const appId = platformContext?.appId || "";
79133
79292
  const lastAckRef = useRef103("0");
79134
79293
  const eventSourceRef = useRef103(null);
@@ -79136,7 +79295,7 @@ function useRealtime(channel, options = {}) {
79136
79295
  const reconnectAttemptRef = useRef103(0);
79137
79296
  const mountedRef = useRef103(true);
79138
79297
  const platformUrl = customPlatformUrl || platformContext?.platformUrl || `https://${DEFAULT_SDK_API_HOST}`;
79139
- const buildUrl = useCallback83(() => {
79298
+ const buildUrl = useCallback84(() => {
79140
79299
  const url = new URL(`${platformUrl}${SDK_API_PATH}/realtime/subscribe`);
79141
79300
  url.searchParams.set("channel", channel);
79142
79301
  if (lastAckRef.current !== "0") {
@@ -79144,7 +79303,7 @@ function useRealtime(channel, options = {}) {
79144
79303
  }
79145
79304
  return url.toString();
79146
79305
  }, [platformUrl, channel]);
79147
- const sdkHeaders = useMemo132(
79306
+ const sdkHeaders = useMemo133(
79148
79307
  () => ({
79149
79308
  "Content-Type": "application/json",
79150
79309
  "x-app-secret": appId,
@@ -79153,7 +79312,7 @@ function useRealtime(channel, options = {}) {
79153
79312
  }),
79154
79313
  [appId]
79155
79314
  );
79156
- const fetchHistory = useCallback83(async () => {
79315
+ const fetchHistory = useCallback84(async () => {
79157
79316
  if (!history2) return;
79158
79317
  const historyLimit = typeof history2 === "number" ? history2 : history2.limit ?? 100;
79159
79318
  const historyStart = typeof history2 === "object" ? history2.start : void 0;
@@ -79177,7 +79336,7 @@ function useRealtime(channel, options = {}) {
79177
79336
  } catch {
79178
79337
  }
79179
79338
  }, [platformUrl, sdkHeaders, channel, history2]);
79180
- const connect = useCallback83(() => {
79339
+ const connect = useCallback84(() => {
79181
79340
  if (!enabled || !appId) return;
79182
79341
  if (eventSourceRef.current) {
79183
79342
  eventSourceRef.current.close();
@@ -79248,7 +79407,7 @@ function useRealtime(channel, options = {}) {
79248
79407
  onReconnect,
79249
79408
  onError
79250
79409
  ]);
79251
- const disconnect = useCallback83(() => {
79410
+ const disconnect = useCallback84(() => {
79252
79411
  if (eventSourceRef.current) {
79253
79412
  eventSourceRef.current.close();
79254
79413
  eventSourceRef.current = null;
@@ -79259,7 +79418,7 @@ function useRealtime(channel, options = {}) {
79259
79418
  }
79260
79419
  setStatus("disconnected");
79261
79420
  }, []);
79262
- const emit = useCallback83(
79421
+ const emit = useCallback84(
79263
79422
  async (event2, data) => {
79264
79423
  const response = await fetch(`${platformUrl}${SDK_API_PATH}/realtime/emit`, {
79265
79424
  method: "POST",
@@ -79291,7 +79450,7 @@ function useRealtime(channel, options = {}) {
79291
79450
  },
79292
79451
  [platformUrl, sdkHeaders, channel]
79293
79452
  );
79294
- const clear = useCallback83(() => {
79453
+ const clear = useCallback84(() => {
79295
79454
  setMessages([]);
79296
79455
  lastAckRef.current = "0";
79297
79456
  }, []);
@@ -79327,7 +79486,7 @@ function useRealtimeChannels(channels, options = {}) {
79327
79486
  } = options;
79328
79487
  const [messages, setMessages] = useState108([]);
79329
79488
  const [statuses, setStatuses] = useState108({});
79330
- const platformContext = useContext83(PlatformContext);
79489
+ const platformContext = useContext84(PlatformContext);
79331
79490
  const appId = platformContext?.appId || "";
79332
79491
  const platformUrl = customPlatformUrl || platformContext?.platformUrl || `https://${DEFAULT_SDK_API_HOST}`;
79333
79492
  const lastAcksRef = useRef103({});
@@ -79341,7 +79500,7 @@ function useRealtimeChannels(channels, options = {}) {
79341
79500
  if (statusValues.every((s2) => s2 === "connected")) return "connected";
79342
79501
  return "disconnected";
79343
79502
  })();
79344
- const connectChannel = useCallback83(
79503
+ const connectChannel = useCallback84(
79345
79504
  (channel) => {
79346
79505
  if (!enabled || !appId) return;
79347
79506
  if (eventSourcesRef.current[channel]) {
@@ -79391,15 +79550,15 @@ function useRealtimeChannels(channels, options = {}) {
79391
79550
  },
79392
79551
  [enabled, appId, platformUrl, events, onConnect, onMessage, onReconnect, onError]
79393
79552
  );
79394
- const connect = useCallback83(() => {
79553
+ const connect = useCallback84(() => {
79395
79554
  channels.forEach(connectChannel);
79396
79555
  }, [channels, connectChannel]);
79397
- const disconnect = useCallback83(() => {
79556
+ const disconnect = useCallback84(() => {
79398
79557
  Object.values(eventSourcesRef.current).forEach((es) => es.close());
79399
79558
  eventSourcesRef.current = {};
79400
79559
  setStatuses({});
79401
79560
  }, []);
79402
- const sdkHeaders = useMemo132(
79561
+ const sdkHeaders = useMemo133(
79403
79562
  () => ({
79404
79563
  "Content-Type": "application/json",
79405
79564
  "x-app-secret": appId,
@@ -79408,7 +79567,7 @@ function useRealtimeChannels(channels, options = {}) {
79408
79567
  }),
79409
79568
  [appId]
79410
79569
  );
79411
- const emit = useCallback83(
79570
+ const emit = useCallback84(
79412
79571
  async (event2, data, targetChannel) => {
79413
79572
  const channel = targetChannel || channels[0];
79414
79573
  if (!channel) throw new SylphxError("No channel specified", { code: "BAD_REQUEST" });
@@ -79435,7 +79594,7 @@ function useRealtimeChannels(channels, options = {}) {
79435
79594
  },
79436
79595
  [channels, platformUrl, sdkHeaders]
79437
79596
  );
79438
- const clear = useCallback83(() => {
79597
+ const clear = useCallback84(() => {
79439
79598
  setMessages([]);
79440
79599
  lastAcksRef.current = {};
79441
79600
  }, []);
@@ -79461,13 +79620,13 @@ function useRealtimeChannels(channels, options = {}) {
79461
79620
 
79462
79621
  // src/react/hooks/use-kv.ts
79463
79622
  init_constants();
79464
- import { useCallback as useCallback84, useContext as useContext84, useMemo as useMemo133 } from "react";
79623
+ import { useCallback as useCallback85, useContext as useContext85, useMemo as useMemo134 } from "react";
79465
79624
  function useKv(options = {}) {
79466
79625
  const { platformUrl: customPlatformUrl } = options;
79467
- const platformContext = useContext84(PlatformContext);
79626
+ const platformContext = useContext85(PlatformContext);
79468
79627
  const appId = platformContext?.appId || "";
79469
79628
  const platformUrl = customPlatformUrl || platformContext?.platformUrl || `https://${DEFAULT_SDK_API_HOST}`;
79470
- const headers = useMemo133(
79629
+ const headers = useMemo134(
79471
79630
  () => ({
79472
79631
  "Content-Type": "application/json",
79473
79632
  "x-app-secret": appId,
@@ -79476,7 +79635,7 @@ function useKv(options = {}) {
79476
79635
  }),
79477
79636
  [appId]
79478
79637
  );
79479
- const request = useCallback84(
79638
+ const request = useCallback85(
79480
79639
  async (method, path, body) => {
79481
79640
  let lastError;
79482
79641
  for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
@@ -79532,13 +79691,13 @@ function useKv(options = {}) {
79532
79691
  },
79533
79692
  [platformUrl, headers]
79534
79693
  );
79535
- const get = useCallback84(
79694
+ const get = useCallback85(
79536
79695
  async (key) => {
79537
79696
  return request("GET", `/${encodeURIComponent(key)}`);
79538
79697
  },
79539
79698
  [request]
79540
79699
  );
79541
- const set3 = useCallback84(
79700
+ const set3 = useCallback85(
79542
79701
  async (key, value, options2) => {
79543
79702
  const result = await request("POST", "", {
79544
79703
  key,
@@ -79549,28 +79708,28 @@ function useKv(options = {}) {
79549
79708
  },
79550
79709
  [request]
79551
79710
  );
79552
- const del = useCallback84(
79711
+ const del = useCallback85(
79553
79712
  async (key) => {
79554
79713
  const result = await request("DELETE", `/${encodeURIComponent(key)}`);
79555
79714
  return result.deleted;
79556
79715
  },
79557
79716
  [request]
79558
79717
  );
79559
- const exists = useCallback84(
79718
+ const exists = useCallback85(
79560
79719
  async (key) => {
79561
79720
  const result = await request("GET", `/exists/${encodeURIComponent(key)}`);
79562
79721
  return result.exists;
79563
79722
  },
79564
79723
  [request]
79565
79724
  );
79566
- const mget = useCallback84(
79725
+ const mget = useCallback85(
79567
79726
  async (keys) => {
79568
79727
  const result = await request("POST", "/mget", { keys });
79569
79728
  return result.values;
79570
79729
  },
79571
79730
  [request]
79572
79731
  );
79573
- const mset = useCallback84(
79732
+ const mset = useCallback85(
79574
79733
  async (entries, options2) => {
79575
79734
  await request("POST", "/mset", {
79576
79735
  entries,
@@ -79579,7 +79738,7 @@ function useKv(options = {}) {
79579
79738
  },
79580
79739
  [request]
79581
79740
  );
79582
- const incr = useCallback84(
79741
+ const incr = useCallback85(
79583
79742
  async (key, by = 1) => {
79584
79743
  const result = await request("POST", "/incr", {
79585
79744
  key,
@@ -79589,7 +79748,7 @@ function useKv(options = {}) {
79589
79748
  },
79590
79749
  [request]
79591
79750
  );
79592
- const expire = useCallback84(
79751
+ const expire = useCallback85(
79593
79752
  async (key, seconds) => {
79594
79753
  const result = await request("POST", "/expire", {
79595
79754
  key,
@@ -79599,7 +79758,7 @@ function useKv(options = {}) {
79599
79758
  },
79600
79759
  [request]
79601
79760
  );
79602
- const ratelimit = useCallback84(
79761
+ const ratelimit = useCallback85(
79603
79762
  async (key, options2) => {
79604
79763
  return request("POST", "/ratelimit", {
79605
79764
  key,
@@ -79608,7 +79767,7 @@ function useKv(options = {}) {
79608
79767
  },
79609
79768
  [request]
79610
79769
  );
79611
- const hset = useCallback84(
79770
+ const hset = useCallback85(
79612
79771
  async (key, fields) => {
79613
79772
  const result = await request("POST", "/hset", {
79614
79773
  key,
@@ -79618,7 +79777,7 @@ function useKv(options = {}) {
79618
79777
  },
79619
79778
  [request]
79620
79779
  );
79621
- const hget = useCallback84(
79780
+ const hget = useCallback85(
79622
79781
  async (key, field) => {
79623
79782
  const result = await request("POST", "/hget", {
79624
79783
  key,
@@ -79628,7 +79787,7 @@ function useKv(options = {}) {
79628
79787
  },
79629
79788
  [request]
79630
79789
  );
79631
- const hgetall = useCallback84(
79790
+ const hgetall = useCallback85(
79632
79791
  async (key) => {
79633
79792
  const result = await request("POST", "/hgetall", {
79634
79793
  key
@@ -79637,7 +79796,7 @@ function useKv(options = {}) {
79637
79796
  },
79638
79797
  [request]
79639
79798
  );
79640
- const lpush = useCallback84(
79799
+ const lpush = useCallback85(
79641
79800
  async (key, ...values) => {
79642
79801
  const result = await request("POST", "/lpush", {
79643
79802
  key,
@@ -79647,7 +79806,7 @@ function useKv(options = {}) {
79647
79806
  },
79648
79807
  [request]
79649
79808
  );
79650
- const lrange = useCallback84(
79809
+ const lrange = useCallback85(
79651
79810
  async (key, start = 0, stop = -1) => {
79652
79811
  const result = await request("POST", "/lrange", {
79653
79812
  key,
@@ -79658,7 +79817,7 @@ function useKv(options = {}) {
79658
79817
  },
79659
79818
  [request]
79660
79819
  );
79661
- const zadd = useCallback84(
79820
+ const zadd = useCallback85(
79662
79821
  async (key, ...members) => {
79663
79822
  const result = await request("POST", "/zadd", {
79664
79823
  key,
@@ -79668,7 +79827,7 @@ function useKv(options = {}) {
79668
79827
  },
79669
79828
  [request]
79670
79829
  );
79671
- const zrange = useCallback84(
79830
+ const zrange = useCallback85(
79672
79831
  async (key, start = 0, stop = 9, options2) => {
79673
79832
  const result = await request("POST", "/zrange", {
79674
79833
  key,
@@ -79681,7 +79840,7 @@ function useKv(options = {}) {
79681
79840
  },
79682
79841
  [request]
79683
79842
  );
79684
- return useMemo133(
79843
+ return useMemo134(
79685
79844
  () => ({
79686
79845
  get,
79687
79846
  set: set3,
@@ -79722,7 +79881,7 @@ function useKv(options = {}) {
79722
79881
  }
79723
79882
 
79724
79883
  // src/react/hooks/use-search.ts
79725
- import { useCallback as useCallback85, useEffect as useEffect96, useRef as useRef104, useState as useState109 } from "react";
79884
+ import { useCallback as useCallback86, useEffect as useEffect96, useRef as useRef104, useState as useState109 } from "react";
79726
79885
 
79727
79886
  // src/search.ts
79728
79887
  async function search(config2, input) {
@@ -79768,7 +79927,7 @@ function useSearch(config2, options = {}) {
79768
79927
  useEffect96(() => {
79769
79928
  searchOptionsRef.current = searchOptions;
79770
79929
  });
79771
- const executeSearch = useCallback85(
79930
+ const executeSearch = useCallback86(
79772
79931
  async (q2) => {
79773
79932
  if (!q2 || q2.length < minLength) {
79774
79933
  setResults([]);
@@ -79800,7 +79959,7 @@ function useSearch(config2, options = {}) {
79800
79959
  },
79801
79960
  [config2, minLength]
79802
79961
  );
79803
- const setQuery = useCallback85(
79962
+ const setQuery = useCallback86(
79804
79963
  (q2) => {
79805
79964
  setQueryState(q2);
79806
79965
  if (debounceTimer.current) {
@@ -79820,7 +79979,7 @@ function useSearch(config2, options = {}) {
79820
79979
  },
79821
79980
  [executeSearch, debounceMs, minLength]
79822
79981
  );
79823
- const clear = useCallback85(() => {
79982
+ const clear = useCallback86(() => {
79824
79983
  if (debounceTimer.current) clearTimeout(debounceTimer.current);
79825
79984
  abortController.current?.abort();
79826
79985
  setQueryState("");
@@ -79830,10 +79989,10 @@ function useSearch(config2, options = {}) {
79830
79989
  setLoading(false);
79831
79990
  setError(null);
79832
79991
  }, []);
79833
- const refetch = useCallback85(() => {
79992
+ const refetch = useCallback86(() => {
79834
79993
  executeSearch(query);
79835
79994
  }, [executeSearch, query]);
79836
- const trackResultClick = useCallback85((_documentId, _resultRank) => {
79995
+ const trackResultClick = useCallback86((_documentId, _resultRank) => {
79837
79996
  }, []);
79838
79997
  useEffect96(() => {
79839
79998
  if (initialQuery && initialQuery.length >= minLength) {
@@ -80405,11 +80564,13 @@ export {
80405
80564
  useFormTracking,
80406
80565
  useGlobalErrorHandler,
80407
80566
  useGoogleConsentMode,
80567
+ useHasPermission,
80408
80568
  useInbox,
80409
80569
  useIsInTreatment,
80410
80570
  useIsInVariant,
80411
80571
  useKv,
80412
80572
  useLeaderboard,
80573
+ useMemberPermissions,
80413
80574
  useMobilePush,
80414
80575
  useModal,
80415
80576
  useModels,
@@ -80420,12 +80581,14 @@ export {
80420
80581
  useOAuthProviders2 as useOAuthProviders,
80421
80582
  useOrganization,
80422
80583
  usePageView,
80584
+ usePermissions,
80423
80585
  usePlans,
80424
80586
  useProtect,
80425
80587
  useRealtime,
80426
80588
  useRealtimeChannels,
80427
80589
  useReferral,
80428
80590
  useResetPasswordForm,
80591
+ useRoles,
80429
80592
  useRouterContext,
80430
80593
  useSafeAchievements,
80431
80594
  useSafeAnalytics,