@adventurelabs/scout-core 1.0.109 → 1.0.111

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.
@@ -1,12 +1,12 @@
1
- import { useEffect, useCallback, useRef } from "react";
1
+ import { useEffect, useCallback, useRef, useMemo } from "react";
2
2
  import { useAppDispatch } from "../store/hooks";
3
3
  import { useStore } from "react-redux";
4
- import { EnumScoutStateStatus, setHerdModules, setStatus, setHerdModulesLoadingState, setHerdModulesLoadedInMs, setHerdModulesApiDuration, setUserApiDuration, setDataProcessingDuration, setUser, setDataSource, setDataSourceInfo, } from "../store/scout";
4
+ import { EnumScoutStateStatus, setHerdModules, setStatus, setHerdModulesLoadingState, setHerdModulesLoadedInMs, setHerdModulesApiDuration, setUserApiDuration, setDataProcessingDuration, setCacheLoadDuration, setUser, setDataSource, setDataSourceInfo, } from "../store/scout";
5
5
  import { EnumHerdModulesLoadingState } from "../types/herd_module";
6
6
  import { server_load_herd_modules } from "../helpers/herds";
7
- import { server_get_user } from "../helpers/users";
8
7
  import { scoutCache } from "../helpers/cache";
9
8
  import { EnumDataSource } from "../types/data_source";
9
+ import { createBrowserClient } from "@supabase/ssr";
10
10
  /**
11
11
  * Hook for refreshing scout data with detailed timing measurements and cache-first loading
12
12
  *
@@ -36,6 +36,10 @@ export function useScoutRefresh(options = {}) {
36
36
  const dispatch = useAppDispatch();
37
37
  const store = useStore();
38
38
  const refreshInProgressRef = useRef(false);
39
+ // Create Supabase client directly to avoid circular dependency
40
+ const supabase = useMemo(() => {
41
+ return createBrowserClient(process.env.NEXT_PUBLIC_SUPABASE_URL || "", process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || "");
42
+ }, []);
39
43
  // Refs to store timing measurements
40
44
  const timingRefs = useRef({
41
45
  startTime: 0,
@@ -87,10 +91,67 @@ export function useScoutRefresh(options = {}) {
87
91
  }
88
92
  return true;
89
93
  }, []);
94
+ // Helper function to find differences between herd modules for debugging
95
+ const findHerdModulesDifferences = useCallback((newData, currentData) => {
96
+ if (!Array.isArray(newData) || !Array.isArray(currentData)) {
97
+ return `Array type mismatch: new=${Array.isArray(newData)}, current=${Array.isArray(currentData)}`;
98
+ }
99
+ if (newData.length !== currentData.length) {
100
+ return `Array length mismatch: new=${newData.length}, current=${currentData.length}`;
101
+ }
102
+ const differences = [];
103
+ for (let i = 0; i < newData.length; i++) {
104
+ const newHerd = newData[i];
105
+ const currentHerd = currentData[i];
106
+ if (!newHerd || !currentHerd) {
107
+ differences.push(`Herd ${i}: null/undefined mismatch`);
108
+ continue;
109
+ }
110
+ // Check top-level fields
111
+ const fieldsToCheck = [
112
+ "timestamp_last_refreshed",
113
+ "total_events",
114
+ "total_events_with_filters",
115
+ "events_page_index",
116
+ ];
117
+ fieldsToCheck.forEach((field) => {
118
+ if (newHerd[field] !== currentHerd[field]) {
119
+ differences.push(`Herd ${i}.${field}: ${currentHerd[field]} → ${newHerd[field]}`);
120
+ }
121
+ });
122
+ // Check array lengths for nested data
123
+ const arrayFields = [
124
+ "devices",
125
+ "events",
126
+ "plans",
127
+ "zones",
128
+ "sessions",
129
+ "layers",
130
+ "providers",
131
+ ];
132
+ arrayFields.forEach((field) => {
133
+ const newArray = newHerd[field];
134
+ const currentArray = currentHerd[field];
135
+ if (Array.isArray(newArray) && Array.isArray(currentArray)) {
136
+ if (newArray.length !== currentArray.length) {
137
+ differences.push(`Herd ${i}.${field}[]: length ${currentArray.length} → ${newArray.length}`);
138
+ }
139
+ }
140
+ });
141
+ }
142
+ return differences.length > 0
143
+ ? differences.join(", ")
144
+ : "No significant differences found";
145
+ }, []);
90
146
  // Helper function to conditionally dispatch only if data has changed
91
- const conditionalDispatch = useCallback((newData, currentData, actionCreator, dataType) => {
147
+ const conditionalDispatch = useCallback((newData, currentData, actionCreator, dataType, enableDebugging = false) => {
92
148
  if (!deepEqual(newData, currentData)) {
93
149
  console.log(`[useScoutRefresh] ${dataType} data changed, updating store`);
150
+ // Add debugging for herd modules to see what actually changed
151
+ if (enableDebugging && dataType.includes("Herd modules")) {
152
+ const differences = findHerdModulesDifferences(newData, currentData);
153
+ console.log(`[useScoutRefresh] ${dataType} differences: ${differences}`);
154
+ }
94
155
  dispatch(actionCreator(newData));
95
156
  return true;
96
157
  }
@@ -98,7 +159,7 @@ export function useScoutRefresh(options = {}) {
98
159
  console.log(`[useScoutRefresh] ${dataType} data unchanged, skipping store update`);
99
160
  return false;
100
161
  }
101
- }, [dispatch, deepEqual]);
162
+ }, [dispatch, deepEqual, findHerdModulesDifferences]);
102
163
  // Helper function to handle IndexedDB errors - memoized for stability
103
164
  const handleIndexedDbError = useCallback(async (error, operation, retryFn) => {
104
165
  if (error instanceof Error &&
@@ -140,6 +201,7 @@ export function useScoutRefresh(options = {}) {
140
201
  const cacheResult = await scoutCache.getHerdModules();
141
202
  cacheLoadDuration = Date.now() - cacheStartTime;
142
203
  timingRefs.current.cacheLoadDuration = cacheLoadDuration;
204
+ dispatch(setCacheLoadDuration(cacheLoadDuration));
143
205
  if (cacheResult.data && cacheResult.data.length > 0) {
144
206
  cachedHerdModules = cacheResult.data;
145
207
  console.log(`[useScoutRefresh] Loaded ${cachedHerdModules.length} herd modules from cache in ${cacheLoadDuration}ms (age: ${Math.round(cacheResult.age / 1000)}s, stale: ${cacheResult.isStale})`);
@@ -151,23 +213,13 @@ export function useScoutRefresh(options = {}) {
151
213
  cacheAge: cacheResult.age,
152
214
  isStale: cacheResult.isStale,
153
215
  }));
154
- // Conditionally update the store with cached data if different
216
+ // Conditionally update the store with cached data if business data is different
155
217
  // Get current state at execution time to avoid dependency issues
156
218
  const currentHerdModules = store.getState().scout.herd_modules;
157
- const herdModulesChanged = conditionalDispatch(cachedHerdModules, currentHerdModules, setHerdModules, "Herd modules (cache)");
219
+ const herdModulesChanged = conditionalDispatch(cachedHerdModules, currentHerdModules, setHerdModules, "Herd modules (cache)", true);
158
220
  if (herdModulesChanged) {
159
221
  dispatch(setHerdModulesLoadingState(EnumHerdModulesLoadingState.SUCCESSFULLY_LOADED));
160
222
  }
161
- // Always load user data from API
162
- const userStartTime = Date.now();
163
- const res_new_user = await server_get_user();
164
- const userApiDuration = Date.now() - userStartTime;
165
- timingRefs.current.userApiDuration = userApiDuration;
166
- dispatch(setUserApiDuration(userApiDuration));
167
- if (res_new_user && res_new_user.data) {
168
- const currentUser = store.getState().scout.user;
169
- conditionalDispatch(res_new_user.data, currentUser, setUser, "User (initial)");
170
- }
171
223
  // If cache is fresh, we still background fetch but don't wait
172
224
  if (!cacheResult.isStale) {
173
225
  console.log("[useScoutRefresh] Cache is fresh, background fetching fresh data...");
@@ -177,8 +229,22 @@ export function useScoutRefresh(options = {}) {
177
229
  console.log("[useScoutRefresh] Starting background fetch...");
178
230
  const backgroundStartTime = Date.now();
179
231
  const [backgroundHerdModulesResult, backgroundUserResult] = await Promise.all([
180
- server_load_herd_modules(),
181
- server_get_user(),
232
+ (async () => {
233
+ const start = Date.now();
234
+ const result = await server_load_herd_modules();
235
+ const duration = Date.now() - start;
236
+ timingRefs.current.herdModulesDuration = duration;
237
+ dispatch(setHerdModulesApiDuration(duration));
238
+ return result;
239
+ })(),
240
+ (async () => {
241
+ const start = Date.now();
242
+ const { data } = await supabase.auth.getUser();
243
+ const duration = Date.now() - start;
244
+ timingRefs.current.userApiDuration = duration;
245
+ dispatch(setUserApiDuration(duration));
246
+ return { data: data.user, status: "success" };
247
+ })(),
182
248
  ]);
183
249
  const backgroundDuration = Date.now() - backgroundStartTime;
184
250
  console.log(`[useScoutRefresh] Background fetch completed in ${backgroundDuration}ms`);
@@ -200,11 +266,13 @@ export function useScoutRefresh(options = {}) {
200
266
  }
201
267
  });
202
268
  }
203
- // Conditionally update store with fresh background data
269
+ // Conditionally update store with fresh background data using normalized comparison
204
270
  const currentHerdModules = store.getState().scout.herd_modules;
205
271
  const currentUser = store.getState().scout.user;
206
- conditionalDispatch(backgroundHerdModulesResult.data, currentHerdModules, setHerdModules, "Herd modules (background)");
207
- conditionalDispatch(backgroundUserResult.data, currentUser, setUser, "User (background)");
272
+ conditionalDispatch(backgroundHerdModulesResult.data, currentHerdModules, setHerdModules, "Herd modules (background)", true);
273
+ if (backgroundUserResult && backgroundUserResult.data) {
274
+ conditionalDispatch(backgroundUserResult.data, currentUser, setUser, "User (background)");
275
+ }
208
276
  // Update data source to DATABASE
209
277
  dispatch(setDataSource(EnumDataSource.DATABASE));
210
278
  dispatch(setDataSourceInfo({
@@ -254,10 +322,14 @@ export function useScoutRefresh(options = {}) {
254
322
  (async () => {
255
323
  const start = Date.now();
256
324
  console.log(`[useScoutRefresh] Starting user request at ${new Date(start).toISOString()}`);
257
- const result = await server_get_user();
325
+ const { data } = await supabase.auth.getUser();
258
326
  const duration = Date.now() - start;
259
327
  console.log(`[useScoutRefresh] User request completed in ${duration}ms`);
260
- return { result, duration, start };
328
+ return {
329
+ result: { data: data.user, status: "success" },
330
+ duration,
331
+ start,
332
+ };
261
333
  })(),
262
334
  ]);
263
335
  const parallelDuration = Date.now() - parallelStartTime;
@@ -306,11 +378,11 @@ export function useScoutRefresh(options = {}) {
306
378
  await scoutCache.setHerdModules(compatible_new_herd_modules, cacheTtlMs);
307
379
  });
308
380
  }
309
- // Step 4: Conditionally update store with fresh data if different
381
+ // Step 4: Conditionally update store with fresh data using normalized comparison
310
382
  const dataProcessingStartTime = Date.now();
311
383
  const currentHerdModules = store.getState().scout.herd_modules;
312
384
  const currentUser = store.getState().scout.user;
313
- const herdModulesChanged = conditionalDispatch(compatible_new_herd_modules, currentHerdModules, setHerdModules, "Herd modules (fresh API)");
385
+ const herdModulesChanged = conditionalDispatch(compatible_new_herd_modules, currentHerdModules, setHerdModules, "Herd modules (fresh API)", true);
314
386
  const userChanged = conditionalDispatch(res_new_user.data, currentUser, setUser, "User (fresh API)");
315
387
  if (herdModulesChanged) {
316
388
  dispatch(setHerdModulesLoadingState(EnumHerdModulesLoadingState.SUCCESSFULLY_LOADED));
@@ -359,6 +431,7 @@ export function useScoutRefresh(options = {}) {
359
431
  }, [
360
432
  dispatch,
361
433
  store,
434
+ supabase,
362
435
  onRefreshComplete,
363
436
  cacheFirst,
364
437
  cacheTtlMs,
@@ -14,6 +14,7 @@ export interface ScoutState {
14
14
  herd_modules_api_duration_ms: number | null;
15
15
  user_api_duration_ms: number | null;
16
16
  data_processing_duration_ms: number | null;
17
+ cache_load_duration_ms: number | null;
17
18
  active_herd_id: string | null;
18
19
  active_device_id: string | null;
19
20
  lastRefreshed: number;
@@ -54,6 +55,10 @@ export declare const scoutSlice: import("@reduxjs/toolkit").Slice<ScoutState, {
54
55
  payload: any;
55
56
  type: string;
56
57
  }) => void;
58
+ setCacheLoadDuration: (state: import("immer").WritableDraft<ScoutState>, action: {
59
+ payload: any;
60
+ type: string;
61
+ }) => void;
57
62
  setActiveHerdId: (state: import("immer").WritableDraft<ScoutState>, action: {
58
63
  payload: any;
59
64
  type: string;
@@ -155,6 +160,6 @@ export declare const scoutSlice: import("@reduxjs/toolkit").Slice<ScoutState, {
155
160
  type: string;
156
161
  }) => void;
157
162
  }, "scout", "scout", import("@reduxjs/toolkit").SliceSelectors<ScoutState>>;
158
- export declare const setHerdModules: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModules">, setStatus: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setStatus">, setHerdModulesLoadingState: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModulesLoadingState">, setHerdModulesLoadedInMs: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModulesLoadedInMs">, setHerdModulesApiDuration: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModulesApiDuration">, setUserApiDuration: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setUserApiDuration">, setDataProcessingDuration: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setDataProcessingDuration">, setActiveHerdId: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setActiveHerdId">, setActiveDeviceId: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setActiveDeviceId">, setDataSource: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setDataSource">, setDataSourceInfo: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setDataSourceInfo">, appendEventsToHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/appendEventsToHerdModule">, replaceEventsForHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/replaceEventsForHerdModule">, updateEventValuesForHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateEventValuesForHerdModule">, updatePageIndexForHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updatePageIndexForHerdModule">, appendPlansToHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/appendPlansToHerdModule">, setUser: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setUser">, addTag: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addTag">, deleteTag: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/deleteTag">, updateTag: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateTag">, addNewDeviceToHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addNewDeviceToHerdModule">, updateDeviceForHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateDeviceForHerdModule">, addDevice: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addDevice">, deleteDevice: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/deleteDevice">, updateDevice: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateDevice">, addPlan: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addPlan">, deletePlan: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/deletePlan">, updatePlan: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updatePlan">, addSessionToStore: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addSessionToStore">, deleteSessionFromStore: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/deleteSessionFromStore">, updateSessionInStore: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateSessionInStore">, setActiveHerdGpsTrackersConnectivity: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setActiveHerdGpsTrackersConnectivity">;
163
+ export declare const setHerdModules: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModules">, setStatus: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setStatus">, setHerdModulesLoadingState: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModulesLoadingState">, setHerdModulesLoadedInMs: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModulesLoadedInMs">, setHerdModulesApiDuration: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModulesApiDuration">, setUserApiDuration: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setUserApiDuration">, setDataProcessingDuration: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setDataProcessingDuration">, setCacheLoadDuration: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setCacheLoadDuration">, setActiveHerdId: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setActiveHerdId">, setActiveDeviceId: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setActiveDeviceId">, setDataSource: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setDataSource">, setDataSourceInfo: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setDataSourceInfo">, appendEventsToHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/appendEventsToHerdModule">, replaceEventsForHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/replaceEventsForHerdModule">, updateEventValuesForHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateEventValuesForHerdModule">, updatePageIndexForHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updatePageIndexForHerdModule">, appendPlansToHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/appendPlansToHerdModule">, setUser: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setUser">, addTag: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addTag">, deleteTag: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/deleteTag">, updateTag: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateTag">, addNewDeviceToHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addNewDeviceToHerdModule">, updateDeviceForHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateDeviceForHerdModule">, addDevice: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addDevice">, deleteDevice: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/deleteDevice">, updateDevice: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateDevice">, addPlan: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addPlan">, deletePlan: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/deletePlan">, updatePlan: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updatePlan">, addSessionToStore: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addSessionToStore">, deleteSessionFromStore: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/deleteSessionFromStore">, updateSessionInStore: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateSessionInStore">, setActiveHerdGpsTrackersConnectivity: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setActiveHerdGpsTrackersConnectivity">;
159
164
  declare const _default: import("redux").Reducer<ScoutState>;
160
165
  export default _default;
@@ -15,6 +15,7 @@ const initialState = {
15
15
  herd_modules_api_duration_ms: null,
16
16
  user_api_duration_ms: null,
17
17
  data_processing_duration_ms: null,
18
+ cache_load_duration_ms: null,
18
19
  lastRefreshed: 0,
19
20
  active_herd_id: null,
20
21
  active_device_id: null,
@@ -50,6 +51,9 @@ export const scoutSlice = createSlice({
50
51
  setDataProcessingDuration: (state, action) => {
51
52
  state.data_processing_duration_ms = action.payload;
52
53
  },
54
+ setCacheLoadDuration: (state, action) => {
55
+ state.cache_load_duration_ms = action.payload;
56
+ },
53
57
  setActiveHerdId: (state, action) => {
54
58
  state.active_herd_id = action.payload;
55
59
  state.active_herd_gps_trackers_connectivity = {};
@@ -265,5 +269,5 @@ export const scoutSlice = createSlice({
265
269
  },
266
270
  });
267
271
  // Action creators are generated for each case reducer function
268
- export const { setHerdModules, setStatus, setHerdModulesLoadingState, setHerdModulesLoadedInMs, setHerdModulesApiDuration, setUserApiDuration, setDataProcessingDuration, setActiveHerdId, setActiveDeviceId, setDataSource, setDataSourceInfo, appendEventsToHerdModule, replaceEventsForHerdModule, updateEventValuesForHerdModule, updatePageIndexForHerdModule, appendPlansToHerdModule, setUser, addTag, deleteTag, updateTag, addNewDeviceToHerdModule, updateDeviceForHerdModule, addDevice, deleteDevice, updateDevice, addPlan, deletePlan, updatePlan, addSessionToStore, deleteSessionFromStore, updateSessionInStore, setActiveHerdGpsTrackersConnectivity, } = scoutSlice.actions;
272
+ export const { setHerdModules, setStatus, setHerdModulesLoadingState, setHerdModulesLoadedInMs, setHerdModulesApiDuration, setUserApiDuration, setDataProcessingDuration, setCacheLoadDuration, setActiveHerdId, setActiveDeviceId, setDataSource, setDataSourceInfo, appendEventsToHerdModule, replaceEventsForHerdModule, updateEventValuesForHerdModule, updatePageIndexForHerdModule, appendPlansToHerdModule, setUser, addTag, deleteTag, updateTag, addNewDeviceToHerdModule, updateDeviceForHerdModule, addDevice, deleteDevice, updateDevice, addPlan, deletePlan, updatePlan, addSessionToStore, deleteSessionFromStore, updateSessionInStore, setActiveHerdGpsTrackersConnectivity, } = scoutSlice.actions;
269
273
  export default scoutSlice.reducer;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adventurelabs/scout-core",
3
- "version": "1.0.109",
3
+ "version": "1.0.111",
4
4
  "description": "Core utilities and helpers for Adventure Labs Scout applications",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",