 85bf1341f3
			
		
	
	85bf1341f3
	
	
	
		
			
			Frontend Enhancements: - Complete React TypeScript frontend with modern UI components - Distributed workflows management interface with real-time updates - Socket.IO integration for live agent status monitoring - Agent management dashboard with cluster visualization - Project management interface with metrics and task tracking - Responsive design with proper error handling and loading states Backend Infrastructure: - Distributed coordinator for multi-agent workflow orchestration - Cluster management API with comprehensive agent operations - Enhanced database models for agents and projects - Project service for filesystem-based project discovery - Performance monitoring and metrics collection - Comprehensive API documentation and error handling Documentation: - Complete distributed development guide (README_DISTRIBUTED.md) - Comprehensive development report with architecture insights - System configuration templates and deployment guides The platform now provides a complete web interface for managing the distributed AI cluster with real-time monitoring, workflow orchestration, and agent coordination capabilities. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			584 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			584 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const reduxImpl = (reducer, initial) => (set, _get, api) => {
 | |
|   api.dispatch = (action) => {
 | |
|     set((state) => reducer(state, action), false, action);
 | |
|     return action;
 | |
|   };
 | |
|   api.dispatchFromDevtools = true;
 | |
|   return { dispatch: (...a) => api.dispatch(...a), ...initial };
 | |
| };
 | |
| const redux = reduxImpl;
 | |
| 
 | |
| const trackedConnections = /* @__PURE__ */ new Map();
 | |
| const getTrackedConnectionState = (name) => {
 | |
|   const api = trackedConnections.get(name);
 | |
|   if (!api) return {};
 | |
|   return Object.fromEntries(
 | |
|     Object.entries(api.stores).map(([key, api2]) => [key, api2.getState()])
 | |
|   );
 | |
| };
 | |
| const extractConnectionInformation = (store, extensionConnector, options) => {
 | |
|   if (store === void 0) {
 | |
|     return {
 | |
|       type: "untracked",
 | |
|       connection: extensionConnector.connect(options)
 | |
|     };
 | |
|   }
 | |
|   const existingConnection = trackedConnections.get(options.name);
 | |
|   if (existingConnection) {
 | |
|     return { type: "tracked", store, ...existingConnection };
 | |
|   }
 | |
|   const newConnection = {
 | |
|     connection: extensionConnector.connect(options),
 | |
|     stores: {}
 | |
|   };
 | |
|   trackedConnections.set(options.name, newConnection);
 | |
|   return { type: "tracked", store, ...newConnection };
 | |
| };
 | |
| const devtoolsImpl = (fn, devtoolsOptions = {}) => (set, get, api) => {
 | |
|   const { enabled, anonymousActionType, store, ...options } = devtoolsOptions;
 | |
|   let extensionConnector;
 | |
|   try {
 | |
|     extensionConnector = (enabled != null ? enabled : process.env.NODE_ENV !== "production") && window.__REDUX_DEVTOOLS_EXTENSION__;
 | |
|   } catch (_e) {
 | |
|   }
 | |
|   if (!extensionConnector) {
 | |
|     if (process.env.NODE_ENV !== "production" && enabled) {
 | |
|       console.warn(
 | |
|         "[zustand devtools middleware] Please install/enable Redux devtools extension"
 | |
|       );
 | |
|     }
 | |
|     return fn(set, get, api);
 | |
|   }
 | |
|   const { connection, ...connectionInformation } = extractConnectionInformation(store, extensionConnector, options);
 | |
|   let isRecording = true;
 | |
|   api.setState = (state, replace, nameOrAction) => {
 | |
|     const r = set(state, replace);
 | |
|     if (!isRecording) return r;
 | |
|     const action = nameOrAction === void 0 ? { type: anonymousActionType || "anonymous" } : typeof nameOrAction === "string" ? { type: nameOrAction } : nameOrAction;
 | |
|     if (store === void 0) {
 | |
|       connection == null ? void 0 : connection.send(action, get());
 | |
|       return r;
 | |
|     }
 | |
|     connection == null ? void 0 : connection.send(
 | |
|       {
 | |
|         ...action,
 | |
|         type: `${store}/${action.type}`
 | |
|       },
 | |
|       {
 | |
|         ...getTrackedConnectionState(options.name),
 | |
|         [store]: api.getState()
 | |
|       }
 | |
|     );
 | |
|     return r;
 | |
|   };
 | |
|   const setStateFromDevtools = (...a) => {
 | |
|     const originalIsRecording = isRecording;
 | |
|     isRecording = false;
 | |
|     set(...a);
 | |
|     isRecording = originalIsRecording;
 | |
|   };
 | |
|   const initialState = fn(api.setState, get, api);
 | |
|   if (connectionInformation.type === "untracked") {
 | |
|     connection == null ? void 0 : connection.init(initialState);
 | |
|   } else {
 | |
|     connectionInformation.stores[connectionInformation.store] = api;
 | |
|     connection == null ? void 0 : connection.init(
 | |
|       Object.fromEntries(
 | |
|         Object.entries(connectionInformation.stores).map(([key, store2]) => [
 | |
|           key,
 | |
|           key === connectionInformation.store ? initialState : store2.getState()
 | |
|         ])
 | |
|       )
 | |
|     );
 | |
|   }
 | |
|   if (api.dispatchFromDevtools && typeof api.dispatch === "function") {
 | |
|     let didWarnAboutReservedActionType = false;
 | |
|     const originalDispatch = api.dispatch;
 | |
|     api.dispatch = (...a) => {
 | |
|       if (process.env.NODE_ENV !== "production" && a[0].type === "__setState" && !didWarnAboutReservedActionType) {
 | |
|         console.warn(
 | |
|           '[zustand devtools middleware] "__setState" action type is reserved to set state from the devtools. Avoid using it.'
 | |
|         );
 | |
|         didWarnAboutReservedActionType = true;
 | |
|       }
 | |
|       originalDispatch(...a);
 | |
|     };
 | |
|   }
 | |
|   connection.subscribe((message) => {
 | |
|     var _a;
 | |
|     switch (message.type) {
 | |
|       case "ACTION":
 | |
|         if (typeof message.payload !== "string") {
 | |
|           console.error(
 | |
|             "[zustand devtools middleware] Unsupported action format"
 | |
|           );
 | |
|           return;
 | |
|         }
 | |
|         return parseJsonThen(
 | |
|           message.payload,
 | |
|           (action) => {
 | |
|             if (action.type === "__setState") {
 | |
|               if (store === void 0) {
 | |
|                 setStateFromDevtools(action.state);
 | |
|                 return;
 | |
|               }
 | |
|               if (Object.keys(action.state).length !== 1) {
 | |
|                 console.error(
 | |
|                   `
 | |
|                     [zustand devtools middleware] Unsupported __setState action format. 
 | |
|                     When using 'store' option in devtools(), the 'state' should have only one key, which is a value of 'store' that was passed in devtools(),
 | |
|                     and value of this only key should be a state object. Example: { "type": "__setState", "state": { "abc123Store": { "foo": "bar" } } }
 | |
|                     `
 | |
|                 );
 | |
|               }
 | |
|               const stateFromDevtools = action.state[store];
 | |
|               if (stateFromDevtools === void 0 || stateFromDevtools === null) {
 | |
|                 return;
 | |
|               }
 | |
|               if (JSON.stringify(api.getState()) !== JSON.stringify(stateFromDevtools)) {
 | |
|                 setStateFromDevtools(stateFromDevtools);
 | |
|               }
 | |
|               return;
 | |
|             }
 | |
|             if (!api.dispatchFromDevtools) return;
 | |
|             if (typeof api.dispatch !== "function") return;
 | |
|             api.dispatch(action);
 | |
|           }
 | |
|         );
 | |
|       case "DISPATCH":
 | |
|         switch (message.payload.type) {
 | |
|           case "RESET":
 | |
|             setStateFromDevtools(initialState);
 | |
|             if (store === void 0) {
 | |
|               return connection == null ? void 0 : connection.init(api.getState());
 | |
|             }
 | |
|             return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));
 | |
|           case "COMMIT":
 | |
|             if (store === void 0) {
 | |
|               connection == null ? void 0 : connection.init(api.getState());
 | |
|               return;
 | |
|             }
 | |
|             return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));
 | |
|           case "ROLLBACK":
 | |
|             return parseJsonThen(message.state, (state) => {
 | |
|               if (store === void 0) {
 | |
|                 setStateFromDevtools(state);
 | |
|                 connection == null ? void 0 : connection.init(api.getState());
 | |
|                 return;
 | |
|               }
 | |
|               setStateFromDevtools(state[store]);
 | |
|               connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));
 | |
|             });
 | |
|           case "JUMP_TO_STATE":
 | |
|           case "JUMP_TO_ACTION":
 | |
|             return parseJsonThen(message.state, (state) => {
 | |
|               if (store === void 0) {
 | |
|                 setStateFromDevtools(state);
 | |
|                 return;
 | |
|               }
 | |
|               if (JSON.stringify(api.getState()) !== JSON.stringify(state[store])) {
 | |
|                 setStateFromDevtools(state[store]);
 | |
|               }
 | |
|             });
 | |
|           case "IMPORT_STATE": {
 | |
|             const { nextLiftedState } = message.payload;
 | |
|             const lastComputedState = (_a = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a.state;
 | |
|             if (!lastComputedState) return;
 | |
|             if (store === void 0) {
 | |
|               setStateFromDevtools(lastComputedState);
 | |
|             } else {
 | |
|               setStateFromDevtools(lastComputedState[store]);
 | |
|             }
 | |
|             connection == null ? void 0 : connection.send(
 | |
|               null,
 | |
|               // FIXME no-any
 | |
|               nextLiftedState
 | |
|             );
 | |
|             return;
 | |
|           }
 | |
|           case "PAUSE_RECORDING":
 | |
|             return isRecording = !isRecording;
 | |
|         }
 | |
|         return;
 | |
|     }
 | |
|   });
 | |
|   return initialState;
 | |
| };
 | |
| const devtools = devtoolsImpl;
 | |
| const parseJsonThen = (stringified, f) => {
 | |
|   let parsed;
 | |
|   try {
 | |
|     parsed = JSON.parse(stringified);
 | |
|   } catch (e) {
 | |
|     console.error(
 | |
|       "[zustand devtools middleware] Could not parse the received json",
 | |
|       e
 | |
|     );
 | |
|   }
 | |
|   if (parsed !== void 0) f(parsed);
 | |
| };
 | |
| 
 | |
| const subscribeWithSelectorImpl = (fn) => (set, get, api) => {
 | |
|   const origSubscribe = api.subscribe;
 | |
|   api.subscribe = (selector, optListener, options) => {
 | |
|     let listener = selector;
 | |
|     if (optListener) {
 | |
|       const equalityFn = (options == null ? void 0 : options.equalityFn) || Object.is;
 | |
|       let currentSlice = selector(api.getState());
 | |
|       listener = (state) => {
 | |
|         const nextSlice = selector(state);
 | |
|         if (!equalityFn(currentSlice, nextSlice)) {
 | |
|           const previousSlice = currentSlice;
 | |
|           optListener(currentSlice = nextSlice, previousSlice);
 | |
|         }
 | |
|       };
 | |
|       if (options == null ? void 0 : options.fireImmediately) {
 | |
|         optListener(currentSlice, currentSlice);
 | |
|       }
 | |
|     }
 | |
|     return origSubscribe(listener);
 | |
|   };
 | |
|   const initialState = fn(set, get, api);
 | |
|   return initialState;
 | |
| };
 | |
| const subscribeWithSelector = subscribeWithSelectorImpl;
 | |
| 
 | |
| const combine = (initialState, create) => (...a) => Object.assign({}, initialState, create(...a));
 | |
| 
 | |
| function createJSONStorage(getStorage, options) {
 | |
|   let storage;
 | |
|   try {
 | |
|     storage = getStorage();
 | |
|   } catch (_e) {
 | |
|     return;
 | |
|   }
 | |
|   const persistStorage = {
 | |
|     getItem: (name) => {
 | |
|       var _a;
 | |
|       const parse = (str2) => {
 | |
|         if (str2 === null) {
 | |
|           return null;
 | |
|         }
 | |
|         return JSON.parse(str2, options == null ? void 0 : options.reviver);
 | |
|       };
 | |
|       const str = (_a = storage.getItem(name)) != null ? _a : null;
 | |
|       if (str instanceof Promise) {
 | |
|         return str.then(parse);
 | |
|       }
 | |
|       return parse(str);
 | |
|     },
 | |
|     setItem: (name, newValue) => storage.setItem(
 | |
|       name,
 | |
|       JSON.stringify(newValue, options == null ? void 0 : options.replacer)
 | |
|     ),
 | |
|     removeItem: (name) => storage.removeItem(name)
 | |
|   };
 | |
|   return persistStorage;
 | |
| }
 | |
| const toThenable = (fn) => (input) => {
 | |
|   try {
 | |
|     const result = fn(input);
 | |
|     if (result instanceof Promise) {
 | |
|       return result;
 | |
|     }
 | |
|     return {
 | |
|       then(onFulfilled) {
 | |
|         return toThenable(onFulfilled)(result);
 | |
|       },
 | |
|       catch(_onRejected) {
 | |
|         return this;
 | |
|       }
 | |
|     };
 | |
|   } catch (e) {
 | |
|     return {
 | |
|       then(_onFulfilled) {
 | |
|         return this;
 | |
|       },
 | |
|       catch(onRejected) {
 | |
|         return toThenable(onRejected)(e);
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| };
 | |
| const oldImpl = (config, baseOptions) => (set, get, api) => {
 | |
|   let options = {
 | |
|     getStorage: () => localStorage,
 | |
|     serialize: JSON.stringify,
 | |
|     deserialize: JSON.parse,
 | |
|     partialize: (state) => state,
 | |
|     version: 0,
 | |
|     merge: (persistedState, currentState) => ({
 | |
|       ...currentState,
 | |
|       ...persistedState
 | |
|     }),
 | |
|     ...baseOptions
 | |
|   };
 | |
|   let hasHydrated = false;
 | |
|   const hydrationListeners = /* @__PURE__ */ new Set();
 | |
|   const finishHydrationListeners = /* @__PURE__ */ new Set();
 | |
|   let storage;
 | |
|   try {
 | |
|     storage = options.getStorage();
 | |
|   } catch (_e) {
 | |
|   }
 | |
|   if (!storage) {
 | |
|     return config(
 | |
|       (...args) => {
 | |
|         console.warn(
 | |
|           `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`
 | |
|         );
 | |
|         set(...args);
 | |
|       },
 | |
|       get,
 | |
|       api
 | |
|     );
 | |
|   }
 | |
|   const thenableSerialize = toThenable(options.serialize);
 | |
|   const setItem = () => {
 | |
|     const state = options.partialize({ ...get() });
 | |
|     let errorInSync;
 | |
|     const thenable = thenableSerialize({ state, version: options.version }).then(
 | |
|       (serializedValue) => storage.setItem(options.name, serializedValue)
 | |
|     ).catch((e) => {
 | |
|       errorInSync = e;
 | |
|     });
 | |
|     if (errorInSync) {
 | |
|       throw errorInSync;
 | |
|     }
 | |
|     return thenable;
 | |
|   };
 | |
|   const savedSetState = api.setState;
 | |
|   api.setState = (state, replace) => {
 | |
|     savedSetState(state, replace);
 | |
|     void setItem();
 | |
|   };
 | |
|   const configResult = config(
 | |
|     (...args) => {
 | |
|       set(...args);
 | |
|       void setItem();
 | |
|     },
 | |
|     get,
 | |
|     api
 | |
|   );
 | |
|   let stateFromStorage;
 | |
|   const hydrate = () => {
 | |
|     var _a;
 | |
|     if (!storage) return;
 | |
|     hasHydrated = false;
 | |
|     hydrationListeners.forEach((cb) => cb(get()));
 | |
|     const postRehydrationCallback = ((_a = options.onRehydrateStorage) == null ? void 0 : _a.call(options, get())) || void 0;
 | |
|     return toThenable(storage.getItem.bind(storage))(options.name).then((storageValue) => {
 | |
|       if (storageValue) {
 | |
|         return options.deserialize(storageValue);
 | |
|       }
 | |
|     }).then((deserializedStorageValue) => {
 | |
|       if (deserializedStorageValue) {
 | |
|         if (typeof deserializedStorageValue.version === "number" && deserializedStorageValue.version !== options.version) {
 | |
|           if (options.migrate) {
 | |
|             return options.migrate(
 | |
|               deserializedStorageValue.state,
 | |
|               deserializedStorageValue.version
 | |
|             );
 | |
|           }
 | |
|           console.error(
 | |
|             `State loaded from storage couldn't be migrated since no migrate function was provided`
 | |
|           );
 | |
|         } else {
 | |
|           return deserializedStorageValue.state;
 | |
|         }
 | |
|       }
 | |
|     }).then((migratedState) => {
 | |
|       var _a2;
 | |
|       stateFromStorage = options.merge(
 | |
|         migratedState,
 | |
|         (_a2 = get()) != null ? _a2 : configResult
 | |
|       );
 | |
|       set(stateFromStorage, true);
 | |
|       return setItem();
 | |
|     }).then(() => {
 | |
|       postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0);
 | |
|       hasHydrated = true;
 | |
|       finishHydrationListeners.forEach((cb) => cb(stateFromStorage));
 | |
|     }).catch((e) => {
 | |
|       postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);
 | |
|     });
 | |
|   };
 | |
|   api.persist = {
 | |
|     setOptions: (newOptions) => {
 | |
|       options = {
 | |
|         ...options,
 | |
|         ...newOptions
 | |
|       };
 | |
|       if (newOptions.getStorage) {
 | |
|         storage = newOptions.getStorage();
 | |
|       }
 | |
|     },
 | |
|     clearStorage: () => {
 | |
|       storage == null ? void 0 : storage.removeItem(options.name);
 | |
|     },
 | |
|     getOptions: () => options,
 | |
|     rehydrate: () => hydrate(),
 | |
|     hasHydrated: () => hasHydrated,
 | |
|     onHydrate: (cb) => {
 | |
|       hydrationListeners.add(cb);
 | |
|       return () => {
 | |
|         hydrationListeners.delete(cb);
 | |
|       };
 | |
|     },
 | |
|     onFinishHydration: (cb) => {
 | |
|       finishHydrationListeners.add(cb);
 | |
|       return () => {
 | |
|         finishHydrationListeners.delete(cb);
 | |
|       };
 | |
|     }
 | |
|   };
 | |
|   hydrate();
 | |
|   return stateFromStorage || configResult;
 | |
| };
 | |
| const newImpl = (config, baseOptions) => (set, get, api) => {
 | |
|   let options = {
 | |
|     storage: createJSONStorage(() => localStorage),
 | |
|     partialize: (state) => state,
 | |
|     version: 0,
 | |
|     merge: (persistedState, currentState) => ({
 | |
|       ...currentState,
 | |
|       ...persistedState
 | |
|     }),
 | |
|     ...baseOptions
 | |
|   };
 | |
|   let hasHydrated = false;
 | |
|   const hydrationListeners = /* @__PURE__ */ new Set();
 | |
|   const finishHydrationListeners = /* @__PURE__ */ new Set();
 | |
|   let storage = options.storage;
 | |
|   if (!storage) {
 | |
|     return config(
 | |
|       (...args) => {
 | |
|         console.warn(
 | |
|           `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`
 | |
|         );
 | |
|         set(...args);
 | |
|       },
 | |
|       get,
 | |
|       api
 | |
|     );
 | |
|   }
 | |
|   const setItem = () => {
 | |
|     const state = options.partialize({ ...get() });
 | |
|     return storage.setItem(options.name, {
 | |
|       state,
 | |
|       version: options.version
 | |
|     });
 | |
|   };
 | |
|   const savedSetState = api.setState;
 | |
|   api.setState = (state, replace) => {
 | |
|     savedSetState(state, replace);
 | |
|     void setItem();
 | |
|   };
 | |
|   const configResult = config(
 | |
|     (...args) => {
 | |
|       set(...args);
 | |
|       void setItem();
 | |
|     },
 | |
|     get,
 | |
|     api
 | |
|   );
 | |
|   api.getInitialState = () => configResult;
 | |
|   let stateFromStorage;
 | |
|   const hydrate = () => {
 | |
|     var _a, _b;
 | |
|     if (!storage) return;
 | |
|     hasHydrated = false;
 | |
|     hydrationListeners.forEach((cb) => {
 | |
|       var _a2;
 | |
|       return cb((_a2 = get()) != null ? _a2 : configResult);
 | |
|     });
 | |
|     const postRehydrationCallback = ((_b = options.onRehydrateStorage) == null ? void 0 : _b.call(options, (_a = get()) != null ? _a : configResult)) || void 0;
 | |
|     return toThenable(storage.getItem.bind(storage))(options.name).then((deserializedStorageValue) => {
 | |
|       if (deserializedStorageValue) {
 | |
|         if (typeof deserializedStorageValue.version === "number" && deserializedStorageValue.version !== options.version) {
 | |
|           if (options.migrate) {
 | |
|             return [
 | |
|               true,
 | |
|               options.migrate(
 | |
|                 deserializedStorageValue.state,
 | |
|                 deserializedStorageValue.version
 | |
|               )
 | |
|             ];
 | |
|           }
 | |
|           console.error(
 | |
|             `State loaded from storage couldn't be migrated since no migrate function was provided`
 | |
|           );
 | |
|         } else {
 | |
|           return [false, deserializedStorageValue.state];
 | |
|         }
 | |
|       }
 | |
|       return [false, void 0];
 | |
|     }).then((migrationResult) => {
 | |
|       var _a2;
 | |
|       const [migrated, migratedState] = migrationResult;
 | |
|       stateFromStorage = options.merge(
 | |
|         migratedState,
 | |
|         (_a2 = get()) != null ? _a2 : configResult
 | |
|       );
 | |
|       set(stateFromStorage, true);
 | |
|       if (migrated) {
 | |
|         return setItem();
 | |
|       }
 | |
|     }).then(() => {
 | |
|       postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0);
 | |
|       stateFromStorage = get();
 | |
|       hasHydrated = true;
 | |
|       finishHydrationListeners.forEach((cb) => cb(stateFromStorage));
 | |
|     }).catch((e) => {
 | |
|       postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);
 | |
|     });
 | |
|   };
 | |
|   api.persist = {
 | |
|     setOptions: (newOptions) => {
 | |
|       options = {
 | |
|         ...options,
 | |
|         ...newOptions
 | |
|       };
 | |
|       if (newOptions.storage) {
 | |
|         storage = newOptions.storage;
 | |
|       }
 | |
|     },
 | |
|     clearStorage: () => {
 | |
|       storage == null ? void 0 : storage.removeItem(options.name);
 | |
|     },
 | |
|     getOptions: () => options,
 | |
|     rehydrate: () => hydrate(),
 | |
|     hasHydrated: () => hasHydrated,
 | |
|     onHydrate: (cb) => {
 | |
|       hydrationListeners.add(cb);
 | |
|       return () => {
 | |
|         hydrationListeners.delete(cb);
 | |
|       };
 | |
|     },
 | |
|     onFinishHydration: (cb) => {
 | |
|       finishHydrationListeners.add(cb);
 | |
|       return () => {
 | |
|         finishHydrationListeners.delete(cb);
 | |
|       };
 | |
|     }
 | |
|   };
 | |
|   if (!options.skipHydration) {
 | |
|     hydrate();
 | |
|   }
 | |
|   return stateFromStorage || configResult;
 | |
| };
 | |
| const persistImpl = (config, baseOptions) => {
 | |
|   if ("getStorage" in baseOptions || "serialize" in baseOptions || "deserialize" in baseOptions) {
 | |
|     if (process.env.NODE_ENV !== "production") {
 | |
|       console.warn(
 | |
|         "[DEPRECATED] `getStorage`, `serialize` and `deserialize` options are deprecated. Use `storage` option instead."
 | |
|       );
 | |
|     }
 | |
|     return oldImpl(config, baseOptions);
 | |
|   }
 | |
|   return newImpl(config, baseOptions);
 | |
| };
 | |
| const persist = persistImpl;
 | |
| 
 | |
| export { combine, createJSONStorage, devtools, persist, redux, subscribeWithSelector };
 |