fractostate 4.3.0 → 4.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cjs/index.js CHANGED
@@ -61,6 +61,7 @@ function defineFlow(key, initial, options) {
61
61
  */
62
62
  function getFlow(def) {
63
63
  const { key, initial, options: flowOptions } = def;
64
+ const state = store.store.get(key, initial, flowOptions);
64
65
  const boundActions = {};
65
66
  const defaultOps = {
66
67
  get self() {
@@ -108,34 +109,7 @@ function getFlow(def) {
108
109
  cf: flowOptions || {},
109
110
  isHydrating: !!store.store.__hydrating__?.has(key),
110
111
  };
111
- const current = store.store.get(key, initial);
112
- // Optimization: If state is a primitive, return it directly.
113
- // Proxies are only useful for objects/arrays to provide "Live" property access.
114
- if (current === null || typeof current !== "object") {
115
- return [current, toolbox];
116
- }
117
- // Create a Live Proxy for the state so it's always fresh even in the same execution block
118
- const stateProxy = new Proxy({}, {
119
- get(_, prop) {
120
- if (prop === "__isFractoProxy")
121
- return true;
122
- const latest = store.store.get(key, initial);
123
- if (latest === null || latest === undefined)
124
- return undefined;
125
- return latest[prop];
126
- },
127
- ownKeys() {
128
- const latest = store.store.get(key, initial);
129
- return Reflect.ownKeys(latest !== null && typeof latest === "object" ? latest : {});
130
- },
131
- getOwnPropertyDescriptor(_, prop) {
132
- const latest = store.store.get(key, initial);
133
- if (latest === null || typeof latest !== "object")
134
- return undefined;
135
- return Reflect.getOwnPropertyDescriptor(latest, prop);
136
- },
137
- });
138
- return [stateProxy, toolbox];
112
+ return [state, toolbox];
139
113
  }
140
114
  function useFlow(keyOrDef, initial, options) {
141
115
  const isDerived = typeof keyOrDef === "object" && "selector" in keyOrDef;
@@ -155,15 +129,16 @@ function useFlow(keyOrDef, initial, options) {
155
129
  : isDerived
156
130
  ? keyOrDef.source.options
157
131
  : options;
158
- // Heartbeat to trigger React re-renders when the store changes
159
- const [_, setTick] = React.useState(0);
132
+ const [state, setState] = React.useState(() => {
133
+ const raw = store.store.get(key, initialVal, flowOptions);
134
+ return isDerived ? keyOrDef.selector(raw) : raw;
135
+ });
160
136
  React.useEffect(() => {
161
137
  return store.store.subscribe(key, () => {
162
- setTick((t) => t + 1);
138
+ const raw = store.store.get(key, initialVal);
139
+ setState(isDerived ? keyOrDef.selector(raw) : raw);
163
140
  }, flowOptions?.name || flowOptions?.actor);
164
141
  }, [key, isDerived, flowOptions?.name, flowOptions?.actor]);
165
- const current = store.store.get(key, initialVal);
166
- const target = isDerived ? keyOrDef.selector(current) : current;
167
142
  const toolbox = React.useMemo(() => {
168
143
  if (isDerived)
169
144
  return {};
@@ -214,48 +189,8 @@ function useFlow(keyOrDef, initial, options) {
214
189
  cf: flowOptions || {},
215
190
  isHydrating: !!store.store.__hydrating__?.has(key),
216
191
  };
217
- }, [key, isDerived, flowOptions?.name, flowOptions?.actor]);
218
- // React cannot render Proxy objects as children.
219
- // If the state is a primitive, we return it directly.
220
- if (target === null || typeof target !== "object") {
221
- return [target, toolbox];
222
- }
223
- // Create a Live Proxy for the state so it's always fresh even in the same execution block
224
- // We useMemo here to keep the Proxy reference stable between renders.
225
- const stateProxy = React.useMemo(() => {
226
- return new Proxy({}, {
227
- get(_, prop) {
228
- if (prop === "__isFractoProxy")
229
- return true;
230
- const latest = store.store.get(key, initialVal);
231
- const latestTarget = isDerived
232
- ? keyOrDef.selector(latest)
233
- : latest;
234
- if (latestTarget === null || latestTarget === undefined)
235
- return undefined;
236
- return latestTarget[prop];
237
- },
238
- ownKeys() {
239
- const latest = store.store.get(key, initialVal);
240
- const latestTarget = isDerived
241
- ? keyOrDef.selector(latest)
242
- : latest;
243
- return Reflect.ownKeys(latestTarget !== null && typeof latestTarget === "object"
244
- ? latestTarget
245
- : {});
246
- },
247
- getOwnPropertyDescriptor(_, prop) {
248
- const latest = store.store.get(key, initialVal);
249
- const latestTarget = isDerived
250
- ? keyOrDef.selector(latest)
251
- : latest;
252
- if (latestTarget === null || typeof latestTarget !== "object")
253
- return undefined;
254
- return Reflect.getOwnPropertyDescriptor(latestTarget, prop);
255
- },
256
- });
257
- }, [key, isDerived]);
258
- return [stateProxy, toolbox];
192
+ }, [key, isDerived, state, flowOptions]);
193
+ return [state, toolbox];
259
194
  }
260
195
 
261
196
  exports.defineDerived = defineDerived;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["/* *****************************************************************************\n * FractoSate\n *\n * ACCESS RESTRICTIONS:\n * - This software is exclusively for use by Authorized Personnel of NEHONIX\n * - Intended for Internal Use only within NEHONIX operations\n * - No rights granted to unauthorized individuals or entities\n * - All modifications are works made for hire assigned to NEHONIX\n *\n * PROHIBITED ACTIVITIES:\n * - Copying, distributing, or sublicensing without written permission\n * - Reverse engineering, decompiling, or disassembling\n * - Creating derivative works without explicit authorization\n * - External use or commercial distribution outside NEHONIX\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * For questions or permissions, contact:\n * NEHONIX Legal Department\n * Email: legal@nehonix.com\n * Website: www.nehonix.com\n ***************************************************************************** */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport type {\n FlowOperations,\n FlowDefinition,\n DerivedFlowDefinition,\n FlowOptions,\n UseFlowOptions,\n FlowOpsObject,\n} from \"./types\";\nimport { store } from \"./store\";\nimport { createDeepProxy } from \"./proxy\";\n\n// Connect proxy creator to store for internal effects\nstore.setProxyCreator(createDeepProxy);\n\nexport * from \"./types\";\n\n/**\n * Manually initializes a flow to ensure its effects run immediately.\n * This is useful for flows that need to start working before any component subscribes to them.\n */\nexport function initFlow<T, A>(flow: FlowDefinition<T, A>) {\n store.get(flow.key, flow.initial, flow.options);\n}\n\n/**\n * Defines a derived flow that reacts to changes in a source flow.\n * Use this for computed values that shouldn't be manually modified.\n */\nexport function defineDerived<T, R>(\n source: FlowDefinition<T, any>,\n selector: (state: T) => R,\n derivedKey?: string,\n): DerivedFlowDefinition<T, R> {\n return {\n key: derivedKey || `${source.key}_derived_${Date.now()}`,\n source,\n selector,\n };\n}\n\nexport function defineFlow<\n T,\n A extends Record<\n string,\n (...args: any[]) => (ops: FlowOpsObject<T, A>) => any\n >,\n>(\n key: string,\n initial: T,\n options: FlowOptions<NoInfer<T>, A> & {\n actions: A;\n },\n): FlowDefinition<T, A>;\nexport function defineFlow<T>(\n key: string,\n initial: T,\n options?: FlowOptions<NoInfer<T>, {}>,\n): FlowDefinition<T, {}>;\nexport function defineFlow<T, A>(\n key: string,\n initial: T,\n options?: FlowOptions<T> & { actions?: A },\n): FlowDefinition<T, A> {\n return { key, initial, options: options as any };\n}\n\n/**\n * Non-hook version of useFlow.\n * Useful for accessing and interacting with flows outside React components (e.g., axios interceptors).\n */\nexport function getFlow<T, A>(\n def: FlowDefinition<T, A>,\n): [T, FlowOperations<T, A>] {\n const { key, initial, options: flowOptions } = def;\n const boundActions = {} as any;\n const defaultOps: FlowOpsObject<T, A> = {\n get self() {\n return createDeepProxy<T, A>(key, [], store.get(key, initial), {\n ...flowOptions,\n actions: boundActions,\n actor: flowOptions?.actor,\n });\n },\n get state() {\n return store.get(key, initial);\n },\n };\n\n const actions = (def as any)?.options?.actions || flowOptions?.actions;\n\n if (actions) {\n for (const [name, fn] of Object.entries(actions)) {\n boundActions[name] = (...args: any[]) =>\n (fn as Function)(...args)(defaultOps);\n }\n }\n\n const toolbox: FlowOperations<T, A> = {\n ops: defaultOps,\n actions: boundActions,\n _undo: () => store.undo(key),\n _redo: () => store.redo(key),\n history: store.getHistory(key),\n _canUndo: store.getHistory(key).length > 1,\n _canRedo: store.getRedoStack(key).length > 0,\n _set: (val: any) => {\n const next = typeof val === \"function\" ? val(store.get(key)) : val;\n store.set(key, next, {\n ...flowOptions,\n force: true,\n actor: flowOptions?.actor,\n });\n },\n _patch: (val: any) => {\n const next = typeof val === \"function\" ? val(store.get(key)) : val;\n store.set(key, next, {\n ...flowOptions,\n force: false,\n actor: flowOptions?.actor,\n });\n },\n _reset: () => store.reset(key),\n cf: flowOptions || {},\n isHydrating: !!store.__hydrating__?.has(key),\n };\n\n const current = store.get(key, initial);\n\n // Optimization: If state is a primitive, return it directly.\n // Proxies are only useful for objects/arrays to provide \"Live\" property access.\n if (current === null || typeof current !== \"object\") {\n return [current, toolbox];\n }\n\n // Create a Live Proxy for the state so it's always fresh even in the same execution block\n const stateProxy = new Proxy({} as any, {\n get(_, prop) {\n if (prop === \"__isFractoProxy\") return true;\n const latest = store.get(key, initial);\n if (latest === null || latest === undefined) return undefined;\n return (latest as any)[prop];\n },\n ownKeys() {\n const latest = store.get(key, initial);\n return Reflect.ownKeys(\n latest !== null && typeof latest === \"object\" ? latest : {},\n );\n },\n getOwnPropertyDescriptor(_, prop) {\n const latest = store.get(key, initial);\n if (latest === null || typeof latest !== \"object\") return undefined;\n return Reflect.getOwnPropertyDescriptor(latest, prop);\n },\n }) as T;\n\n return [stateProxy, toolbox];\n}\n\n/**\n * Main hook to consume and interact with a FractoState flow.\n * Returns a tuple containing the current [State, Toolbox].\n */\nexport function useFlow<K extends string, T = any>(\n key: K,\n initial?: T,\n options?: UseFlowOptions<T>,\n): [T, FlowOperations<T, {}>];\n\nexport function useFlow<T, A>(\n def: FlowDefinition<T, A>,\n options?: UseFlowOptions<T>,\n): [T, FlowOperations<T, A>];\n\nexport function useFlow<T, R>(def: DerivedFlowDefinition<T, R>): [R, {}];\n\nexport function useFlow(\n keyOrDef: any,\n initial?: any,\n options?: any,\n): [any, any] {\n const isDerived = typeof keyOrDef === \"object\" && \"selector\" in keyOrDef;\n const isDef = typeof keyOrDef === \"object\" && \"key\" in keyOrDef && !isDerived;\n\n const key = isDef\n ? (keyOrDef as any).key\n : isDerived\n ? (keyOrDef as any).source.key\n : (keyOrDef as string);\n const initialVal = isDef\n ? (keyOrDef as any).initial\n : isDerived\n ? (keyOrDef as any).source.initial\n : initial;\n const flowOptions = isDef\n ? { ...((keyOrDef as any).options || {}), ...(initial || {}) }\n : isDerived\n ? (keyOrDef as any).source.options\n : options;\n\n // Heartbeat to trigger React re-renders when the store changes\n const [_, setTick] = useState(0);\n\n useEffect(() => {\n return store.subscribe(\n key,\n () => {\n setTick((t) => t + 1);\n },\n flowOptions?.name || flowOptions?.actor,\n );\n }, [key, isDerived, flowOptions?.name, flowOptions?.actor]);\n\n const current = store.get(key, initialVal);\n const target = isDerived ? (keyOrDef as any).selector(current) : current;\n\n const toolbox = useMemo(() => {\n if (isDerived) return {};\n\n const boundActions = {} as any;\n const defaultOps: FlowOpsObject<any, any> = {\n get self() {\n return createDeepProxy<any, any>(key, [], store.get(key, initialVal), {\n ...flowOptions,\n actions: boundActions,\n actor: flowOptions?.name || flowOptions?.actor,\n });\n },\n get state() {\n return store.get(key, initialVal);\n },\n };\n\n const actions = (keyOrDef as any)?.options?.actions || flowOptions?.actions;\n\n if (actions) {\n for (const [name, fn] of Object.entries(actions)) {\n boundActions[name] = (...args: any[]) =>\n (fn as Function)(...args)(defaultOps);\n }\n }\n\n return {\n ops: defaultOps,\n actions: boundActions,\n _undo: () => store.undo(key),\n _redo: () => store.redo(key),\n history: store.getHistory(key),\n _canUndo: store.getHistory(key).length > 1,\n _canRedo: store.getRedoStack(key).length > 0,\n _set: (val: any) => {\n const next = typeof val === \"function\" ? val(store.get(key)) : val;\n store.set(key, next, {\n ...flowOptions,\n force: true,\n actor: flowOptions?.name || flowOptions?.actor,\n });\n },\n _patch: (val: any) => {\n const next = typeof val === \"function\" ? val(store.get(key)) : val;\n store.set(key, next, {\n ...flowOptions,\n force: false,\n actor: flowOptions?.name || flowOptions?.actor,\n });\n },\n _reset: () => store.reset(key),\n cf: flowOptions || {},\n isHydrating: !!store.__hydrating__?.has(key),\n };\n }, [key, isDerived, flowOptions?.name, flowOptions?.actor]);\n\n // React cannot render Proxy objects as children.\n // If the state is a primitive, we return it directly.\n if (target === null || typeof target !== \"object\") {\n return [target, toolbox] as any;\n }\n\n // Create a Live Proxy for the state so it's always fresh even in the same execution block\n // We useMemo here to keep the Proxy reference stable between renders.\n const stateProxy = useMemo(() => {\n return new Proxy({} as any, {\n get(_, prop) {\n if (prop === \"__isFractoProxy\") return true;\n const latest = store.get(key, initialVal);\n const latestTarget = isDerived\n ? (keyOrDef as any).selector(latest)\n : latest;\n if (latestTarget === null || latestTarget === undefined)\n return undefined;\n return (latestTarget as any)[prop];\n },\n ownKeys() {\n const latest = store.get(key, initialVal);\n const latestTarget = isDerived\n ? (keyOrDef as any).selector(latest)\n : latest;\n return Reflect.ownKeys(\n latestTarget !== null && typeof latestTarget === \"object\"\n ? latestTarget\n : {},\n );\n },\n getOwnPropertyDescriptor(_, prop) {\n const latest = store.get(key, initialVal);\n const latestTarget = isDerived\n ? (keyOrDef as any).selector(latest)\n : latest;\n if (latestTarget === null || typeof latestTarget !== \"object\")\n return undefined;\n return Reflect.getOwnPropertyDescriptor(latestTarget, prop);\n },\n });\n }, [key, isDerived]);\n\n return [stateProxy, toolbox] as any;\n}\n"],"names":["store","createDeepProxy","useState","useEffect","useMemo"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["/* *****************************************************************************\n * FractoSate\n *\n * ACCESS RESTRICTIONS:\n * - This software is exclusively for use by Authorized Personnel of NEHONIX\n * - Intended for Internal Use only within NEHONIX operations\n * - No rights granted to unauthorized individuals or entities\n * - All modifications are works made for hire assigned to NEHONIX\n *\n * PROHIBITED ACTIVITIES:\n * - Copying, distributing, or sublicensing without written permission\n * - Reverse engineering, decompiling, or disassembling\n * - Creating derivative works without explicit authorization\n * - External use or commercial distribution outside NEHONIX\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * For questions or permissions, contact:\n * NEHONIX Legal Department\n * Email: legal@nehonix.com\n * Website: www.nehonix.com\n ***************************************************************************** */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport type {\n FlowOperations,\n FlowDefinition,\n DerivedFlowDefinition,\n FlowOptions,\n UseFlowOptions,\n FlowOpsObject,\n} from \"./types\";\nimport { store } from \"./store\";\nimport { createDeepProxy } from \"./proxy\";\n\n// Connect proxy creator to store for internal effects\nstore.setProxyCreator(createDeepProxy);\n\nexport * from \"./types\";\n\n/**\n * Manually initializes a flow to ensure its effects run immediately.\n * This is useful for flows that need to start working before any component subscribes to them.\n */\nexport function initFlow<T, A>(flow: FlowDefinition<T, A>) {\n store.get(flow.key, flow.initial, flow.options);\n}\n\n/**\n * Defines a derived flow that reacts to changes in a source flow.\n * Use this for computed values that shouldn't be manually modified.\n */\nexport function defineDerived<T, R>(\n source: FlowDefinition<T, any>,\n selector: (state: T) => R,\n derivedKey?: string,\n): DerivedFlowDefinition<T, R> {\n return {\n key: derivedKey || `${source.key}_derived_${Date.now()}`,\n source,\n selector,\n };\n}\n\nexport function defineFlow<\n T,\n A extends Record<\n string,\n (...args: any[]) => (ops: FlowOpsObject<T, A>) => any\n >,\n>(\n key: string,\n initial: T,\n options: FlowOptions<NoInfer<T>, A> & {\n actions: A;\n },\n): FlowDefinition<T, A>;\nexport function defineFlow<T>(\n key: string,\n initial: T,\n options?: FlowOptions<NoInfer<T>, {}>,\n): FlowDefinition<T, {}>;\nexport function defineFlow<T, A>(\n key: string,\n initial: T,\n options?: FlowOptions<T> & { actions?: A },\n): FlowDefinition<T, A> {\n return { key, initial, options: options as any };\n}\n\n/**\n * Non-hook version of useFlow.\n * Useful for accessing and interacting with flows outside React components (e.g., axios interceptors).\n */\nexport function getFlow<T, A>(\n def: FlowDefinition<T, A>,\n): [T, FlowOperations<T, A>] {\n const { key, initial, options: flowOptions } = def;\n const state = store.get(key, initial, flowOptions);\n\n const boundActions = {} as any;\n const defaultOps: FlowOpsObject<T, A> = {\n get self() {\n return createDeepProxy<T, A>(key, [], store.get(key, initial), {\n ...flowOptions,\n actions: boundActions,\n actor: flowOptions?.actor,\n });\n },\n get state() {\n return store.get(key, initial);\n },\n };\n\n const actions = (def as any)?.options?.actions || flowOptions?.actions;\n\n if (actions) {\n for (const [name, fn] of Object.entries(actions)) {\n boundActions[name] = (...args: any[]) =>\n (fn as Function)(...args)(defaultOps);\n }\n }\n\n const toolbox: FlowOperations<T, A> = {\n ops: defaultOps,\n actions: boundActions,\n _undo: () => store.undo(key),\n _redo: () => store.redo(key),\n history: store.getHistory(key),\n _canUndo: store.getHistory(key).length > 1,\n _canRedo: store.getRedoStack(key).length > 0,\n _set: (val: any) => {\n const next = typeof val === \"function\" ? val(store.get(key)) : val;\n store.set(key, next, {\n ...flowOptions,\n force: true,\n actor: flowOptions?.actor,\n });\n },\n _patch: (val: any) => {\n const next = typeof val === \"function\" ? val(store.get(key)) : val;\n store.set(key, next, {\n ...flowOptions,\n force: false,\n actor: flowOptions?.actor,\n });\n },\n _reset: () => store.reset(key),\n cf: flowOptions || {},\n isHydrating: !!store.__hydrating__?.has(key),\n };\n\n return [state, toolbox];\n}\n\n/**\n * Main hook to consume and interact with a FractoState flow.\n * Returns a tuple containing the current [State, Toolbox].\n */\nexport function useFlow<K extends string, T = any>(\n key: K,\n initial?: T,\n options?: UseFlowOptions<T>,\n): [T, FlowOperations<T, {}>];\n\nexport function useFlow<T, A>(\n def: FlowDefinition<T, A>,\n options?: UseFlowOptions<T>,\n): [T, FlowOperations<T, A>];\n\nexport function useFlow<T, R>(def: DerivedFlowDefinition<T, R>): [R, {}];\n\nexport function useFlow(\n keyOrDef: any,\n initial?: any,\n options?: any,\n): [any, any] {\n const isDerived = typeof keyOrDef === \"object\" && \"selector\" in keyOrDef;\n const isDef = typeof keyOrDef === \"object\" && \"key\" in keyOrDef && !isDerived;\n\n const key = isDef\n ? (keyOrDef as any).key\n : isDerived\n ? (keyOrDef as any).source.key\n : (keyOrDef as string);\n const initialVal = isDef\n ? (keyOrDef as any).initial\n : isDerived\n ? (keyOrDef as any).source.initial\n : initial;\n const flowOptions = isDef\n ? { ...((keyOrDef as any).options || {}), ...(initial || {}) }\n : isDerived\n ? (keyOrDef as any).source.options\n : options;\n\n const [state, setState] = useState(() => {\n const raw = store.get(key, initialVal, flowOptions);\n return isDerived ? (keyOrDef as any).selector(raw) : raw;\n });\n\n useEffect(() => {\n return store.subscribe(\n key,\n () => {\n const raw = store.get(key, initialVal);\n setState(isDerived ? (keyOrDef as any).selector(raw) : raw);\n },\n flowOptions?.name || flowOptions?.actor,\n );\n }, [key, isDerived, flowOptions?.name, flowOptions?.actor]);\n\n const toolbox = useMemo(() => {\n if (isDerived) return {};\n\n const boundActions = {} as any;\n const defaultOps: FlowOpsObject<any, any> = {\n get self() {\n return createDeepProxy<any, any>(key, [], store.get(key, initialVal), {\n ...flowOptions,\n actions: boundActions,\n actor: flowOptions?.name || flowOptions?.actor,\n });\n },\n get state() {\n return store.get(key, initialVal);\n },\n };\n\n const actions = (keyOrDef as any)?.options?.actions || flowOptions?.actions;\n\n if (actions) {\n for (const [name, fn] of Object.entries(actions)) {\n boundActions[name] = (...args: any[]) =>\n (fn as Function)(...args)(defaultOps);\n }\n }\n\n return {\n ops: defaultOps,\n actions: boundActions,\n _undo: () => store.undo(key),\n _redo: () => store.redo(key),\n history: store.getHistory(key),\n _canUndo: store.getHistory(key).length > 1,\n _canRedo: store.getRedoStack(key).length > 0,\n _set: (val: any) => {\n const next = typeof val === \"function\" ? val(store.get(key)) : val;\n store.set(key, next, {\n ...flowOptions,\n force: true,\n actor: flowOptions?.name || flowOptions?.actor,\n });\n },\n _patch: (val: any) => {\n const next = typeof val === \"function\" ? val(store.get(key)) : val;\n store.set(key, next, {\n ...flowOptions,\n force: false,\n actor: flowOptions?.name || flowOptions?.actor,\n });\n },\n _reset: () => store.reset(key),\n cf: flowOptions || {},\n isHydrating: !!store.__hydrating__?.has(key),\n };\n }, [key, isDerived, state, flowOptions]);\n\n return [state, toolbox] as any;\n}\n"],"names":["store","createDeepProxy","useState","useEffect","useMemo"],"mappings":"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"}
@@ -50,7 +50,7 @@ const FractoDevTools = ({ position = "left", initialOpen = false, expanded = fal
50
50
  const updateCount = () => {
51
51
  if (!isMountedRef.current)
52
52
  return;
53
- setFlowCount(store.store.getFlowCount());
53
+ setFlowCount(Object.keys(store.store.getDebugSnapshot()).length);
54
54
  };
55
55
  updateCount();
56
56
  return store.store.subscribeGlobal(updateCount);
@@ -58,23 +58,14 @@ const FractoDevTools = ({ position = "left", initialOpen = false, expanded = fal
58
58
  React.useEffect(() => {
59
59
  if (!isOpen && !showMentalMap && !showPluginManager)
60
60
  return;
61
- let timer;
61
+ setSnapshot(store.store.getDebugSnapshot());
62
62
  const unsub = store.store.subscribeGlobal(() => {
63
63
  if (!isMountedRef.current)
64
64
  return;
65
- // Debounce the snapshot update to avoid freezing during high-frequency changes
66
- if (timer)
67
- clearTimeout(timer);
68
- timer = setTimeout(() => {
69
- setSnapshot(store.store.getDebugSnapshot());
70
- setLastUpdate(Date.now());
71
- }, 100); // 100ms debounce
65
+ setSnapshot(store.store.getDebugSnapshot());
66
+ setLastUpdate(Date.now());
72
67
  });
73
- return () => {
74
- unsub();
75
- if (timer)
76
- clearTimeout(timer);
77
- };
68
+ return unsub;
78
69
  }, [isOpen, showMentalMap, showPluginManager]);
79
70
  React.useEffect(() => {
80
71
  if (!isInitialized && Object.keys(snapshot).length > 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"FractoDevTools.js","sources":["../../../../src/devtools/FractoDevTools.tsx"],"sourcesContent":["/* *****************************************************************************\n * FractoSate\n *\n * ACCESS RESTRICTIONS:\n * - This software is exclusively for use by Authorized Personnel of NEHONIX\n * - Intended for Internal Use only within NEHONIX operations\n * - No rights granted to unauthorized individuals or entities\n * - All modifications are works made for hire assigned to NEHONIX\n *\n * PROHIBITED ACTIVITIES:\n * - Copying, distributing, or sublicensing without written permission\n * - Reverse engineering, decompiling, or disassembling\n * - Creating derivative works without explicit authorization\n * - External use or commercial distribution outside NEHONIX\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * For questions or permissions, contact:\n * NEHONIX Legal Department\n * Email: legal@nehonix.com\n * Website: www.nehonix.com\n ***************************************************************************** */\n\nimport { useState, useEffect, useMemo, useRef, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { store } from \"../store\";\nimport \"./FractoDevTools.css\";\nimport \"./MentalMap.css\";\nimport type { FractoDevToolsProps, ViewMode } from \"./FDevT\";\nimport { MentalMap } from \"./MentalMap\";\nimport { PluginManager } from \"./PluginManager\";\nimport {\n ChevronRight,\n ChevronLeft,\n ChevronDown,\n RotateCcw,\n Zap,\n Activity,\n History,\n ArrowDownToLine,\n ArrowUpToLine,\n X,\n Maximize2,\n Minimize2,\n Monitor,\n Database,\n} from \"lucide-react\";\n\nexport const FractoDevTools = ({\n position = \"left\",\n initialOpen = false,\n expanded = false,\n trafficLightsMode = \"indicators\",\n controlsPosition = \"right\",\n maximizeMode = \"overlay\",\n}: FractoDevToolsProps) => {\n const [isOpen, setIsOpen] = useState(initialOpen);\n const [isMaximized, setIsMaximized] = useState(false);\n const [showMentalMap, setShowMentalMap] = useState(false);\n const [showPluginManager, setShowPluginManager] = useState(false);\n const [snapshot, setSnapshot] = useState<\n Record<string, { value: any; meta: any }>\n >({});\n const [isInitialized, setIsInitialized] = useState(false);\n const [lastUpdate, setLastUpdate] = useState(0);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [viewMode, setViewMode] = useState<ViewMode>(\"all\");\n const [collapsedFlows, setCollapsedFlows] = useState<Set<string>>(new Set());\n const [copiedKey, setCopiedKey] = useState<string | null>(null);\n const [flowCount, setFlowCount] = useState(0);\n const [mentalMapSide, setMentalMapSide] = useState<\"left\" | \"right\">(\n position,\n );\n\n // Dragging state\n const [coords, setCoords] = useState({ x: 20, y: 20 });\n const [isDragging, setIsDragging] = useState(false);\n\n // Indicators state\n const [activeIndicators, setActiveIndicators] = useState({\n red: false,\n yellow: false,\n green: false,\n });\n\n // Refs to manage pending indicator updates\n const indicatorTimeoutsRef = useRef<Map<string, NodeJS.Timeout>>(new Map());\n const isMountedRef = useRef(true);\n\n // Cleanup on unmount\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n // Clear all pending timeouts\n indicatorTimeoutsRef.current.forEach((timeout) => clearTimeout(timeout));\n indicatorTimeoutsRef.current.clear();\n };\n }, []);\n\n useEffect(() => {\n const updateCount = () => {\n if (!isMountedRef.current) return;\n setFlowCount(store.getFlowCount());\n };\n updateCount();\n return store.subscribeGlobal(updateCount);\n }, []);\n\n useEffect(() => {\n if (!isOpen && !showMentalMap && !showPluginManager) return;\n\n let timer: any;\n const unsub = store.subscribeGlobal(() => {\n if (!isMountedRef.current) return;\n\n // Debounce the snapshot update to avoid freezing during high-frequency changes\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n setSnapshot(store.getDebugSnapshot());\n setLastUpdate(Date.now());\n }, 100); // 100ms debounce\n });\n\n return () => {\n unsub();\n if (timer) clearTimeout(timer);\n };\n }, [isOpen, showMentalMap, showPluginManager]);\n\n useEffect(() => {\n if (!isInitialized && Object.keys(snapshot).length > 0) {\n if (!expanded) {\n setCollapsedFlows(new Set(Object.keys(snapshot)));\n }\n setIsInitialized(true);\n }\n }, [snapshot, expanded, isInitialized]);\n\n // Optimized indicator effect - prevents setState during render\n useEffect(() => {\n if (trafficLightsMode !== \"indicators\") return;\n\n const unsub = store.subscribeEvents((event) => {\n let color: \"yellow\" | \"red\" | null = null;\n if (\n event.type === \"write\" ||\n event.type === \"redo\" ||\n event.type === \"read\"\n ) {\n color = \"yellow\";\n }\n if (event.type === \"reset\" || event.type === \"undo\") {\n color = \"red\";\n }\n\n if (color) {\n // Clear any existing timeout for this color\n const existingTimeout = indicatorTimeoutsRef.current.get(color);\n if (existingTimeout) {\n clearTimeout(existingTimeout);\n }\n\n // Use requestAnimationFrame to defer state updates outside render cycle\n requestAnimationFrame(() => {\n if (!isMountedRef.current) return;\n\n setActiveIndicators((prev) => ({ ...prev, [color!]: true }));\n\n const deactivateTimeout = setTimeout(() => {\n if (!isMountedRef.current) return;\n setActiveIndicators((prev) => ({ ...prev, [color!]: false }));\n indicatorTimeoutsRef.current.delete(color!);\n }, 150);\n\n indicatorTimeoutsRef.current.set(color!, deactivateTimeout);\n });\n }\n });\n\n return () => {\n unsub();\n // Cleanup timeouts on unmount\n indicatorTimeoutsRef.current.forEach((timeout) => clearTimeout(timeout));\n indicatorTimeoutsRef.current.clear();\n };\n }, [trafficLightsMode]);\n\n // Handle maximization logic\n const toggleMaximize = () => {\n if (maximizeMode === \"fullscreen\") {\n if (!isMaximized) {\n document.documentElement.requestFullscreen().catch((err) => {\n console.warn(\"[FractoDevTools] Fullscreen denied:\", err.message);\n setIsMaximized(true); // Fallback to overlay\n });\n } else {\n if (document.fullscreenElement) {\n document.exitFullscreen();\n } else {\n setIsMaximized(false);\n }\n }\n } else {\n setIsMaximized(!isMaximized);\n }\n };\n\n useEffect(() => {\n const handleFsChange = () => setIsMaximized(!!document.fullscreenElement);\n document.addEventListener(\"fullscreenchange\", handleFsChange);\n return () =>\n document.removeEventListener(\"fullscreenchange\", handleFsChange);\n }, []);\n\n // Escape key handler\n useEffect(() => {\n const handleEsc = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n if (showMentalMap) {\n setShowMentalMap(false);\n return;\n }\n if (isMaximized) {\n if (document.fullscreenElement) {\n document.exitFullscreen();\n } else {\n setIsMaximized(false);\n }\n }\n }\n };\n window.addEventListener(\"keydown\", handleEsc);\n return () => window.removeEventListener(\"keydown\", handleEsc);\n }, [isMaximized, showMentalMap]);\n\n const filteredEntries = useMemo(() => {\n let entries = Object.entries(snapshot);\n\n if (searchQuery.trim()) {\n const query = searchQuery.toLowerCase();\n entries = entries.filter(([key, data]) => {\n const keyMatch = key.toLowerCase().includes(query);\n const valueMatch = JSON.stringify(data.value)\n .toLowerCase()\n .includes(query);\n return keyMatch || valueMatch;\n });\n }\n\n if (viewMode !== \"all\") {\n entries = entries.filter(([_, data]) => {\n const value = data.value;\n if (viewMode === \"objects\") {\n return (\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n );\n }\n if (viewMode === \"arrays\") {\n return Array.isArray(value);\n }\n if (viewMode === \"primitives\") {\n return typeof value !== \"object\" || value === null;\n }\n return true;\n });\n }\n\n return entries;\n }, [snapshot, searchQuery, viewMode]);\n\n const stats = useMemo(() => {\n const entries = Object.values(snapshot);\n return {\n total: entries.length,\n objects: entries.filter(\n (d) =>\n typeof d.value === \"object\" &&\n d.value !== null &&\n !Array.isArray(d.value),\n ).length,\n arrays: entries.filter((d) => Array.isArray(d.value)).length,\n primitives: entries.filter(\n (d) => typeof d.value !== \"object\" || d.value === null,\n ).length,\n };\n }, [snapshot]);\n\n const isGlobalDirty = useMemo(() => {\n return Object.values(snapshot).some((d) => d.meta.isDirty);\n }, [snapshot]);\n\n const toggleCollapse = (key: string) => {\n setCollapsedFlows((prev) => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n };\n\n const collapseAll = () => {\n const keys = Object.keys(snapshot);\n setCollapsedFlows(new Set(keys));\n };\n\n const expandAll = () => {\n setCollapsedFlows(new Set());\n };\n\n const handleResetAll = () => {\n if (!isGlobalDirty) return;\n if (\n confirm(\n \"Are you sure you want to reset ALL flows to their initial state?\",\n )\n ) {\n store.resetAll();\n }\n };\n\n const handleResetFlow = (key: string, isDirty: boolean) => {\n if (!isDirty) return;\n store.reset(key);\n };\n\n const handleCopy = (key: string, value: any) => {\n navigator.clipboard.writeText(JSON.stringify(value, null, 2));\n setCopiedKey(key);\n setTimeout(() => {\n if (isMountedRef.current) {\n setCopiedKey(null);\n }\n }, 2000);\n };\n\n const getValueType = (value: any): string => {\n if (value === null) return \"null\";\n if (Array.isArray(value)) return `array[${value.length}]`;\n if (typeof value === \"object\")\n return `object{${Object.keys(value).length}}`;\n return typeof value;\n };\n\n // Drag logic\n const handleMouseDown = (e: React.MouseEvent) => {\n setIsDragging(false);\n const startX = e.clientX;\n const startY = e.clientY;\n const initialCoords = { ...coords };\n\n const onMouseMove = (moveEvent: MouseEvent) => {\n if (\n Math.abs(moveEvent.clientX - startX) > 5 ||\n Math.abs(moveEvent.clientY - startY) > 5\n ) {\n setIsDragging(true);\n }\n\n const dx =\n position === \"left\"\n ? moveEvent.clientX - startX\n : startX - moveEvent.clientX;\n const dy = startY - moveEvent.clientY;\n\n setCoords({\n x: Math.max(0, initialCoords.x + dx),\n y: Math.max(0, initialCoords.y + dy),\n });\n };\n\n const onMouseUp = () => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n };\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n };\n\n const positionStyle: React.CSSProperties = {\n [position]: `${coords.x}px`,\n bottom: `${coords.y}px`,\n };\n\n // Stable handler for minimize change.\n // We ensure the main panel stays closed when Mental Map is active/minimized.\n const handleMinimizeChange = useCallback((_min: boolean) => {\n setIsOpen(false);\n }, []);\n\n const mentalMapPortal =\n showMentalMap &&\n createPortal(\n <MentalMap\n snapshot={snapshot}\n onClose={() => {\n setShowMentalMap(false);\n setIsOpen(true);\n }}\n onMinimizeChange={handleMinimizeChange}\n minimizedSide={mentalMapSide}\n setIsOpen={setIsOpen}\n />,\n document.body,\n );\n\n const buttonContent = (\n <button\n onMouseDown={handleMouseDown}\n onClick={() => !isDragging && setIsOpen(true)}\n className={`fracto-devtools-button position-${position}`}\n style={{ ...positionStyle, cursor: isDragging ? \"grabbing\" : \"grab\" }}\n title=\"Open FractoState DevTools (Draggable)\"\n >\n F\n {flowCount > 0 && (\n <span className=\"fracto-devtools-badge-count\">{flowCount}</span>\n )}\n </button>\n );\n\n const panelContent = (\n <div\n className={`fracto-devtools-panel position-${position} ${isMaximized ? \"is-maximized\" : \"\"}`}\n style={isMaximized ? {} : positionStyle}\n >\n <div\n className={`fracto-devtools-header mode-${trafficLightsMode} controls-${controlsPosition}`}\n >\n {trafficLightsMode === \"controls\" && (\n <div className=\"fracto-devtools-window-controls\">\n <button\n className=\"fracto-devtools-dot red\"\n onClick={() => setIsOpen(false)}\n title=\"Close Inspector\"\n />\n <button\n className=\"fracto-devtools-dot yellow\"\n onClick={collapseAll}\n title=\"Collapse All\"\n />\n <button\n className=\"fracto-devtools-dot green\"\n onClick={expandAll}\n title=\"Expand All\"\n />\n <button\n className=\"fracto-devtools-dot blue\"\n onClick={toggleMaximize}\n title={isMaximized ? \"Restore\" : \"Maximize\"}\n />\n </div>\n )}\n\n <div className=\"fracto-devtools-header-content\">\n <div\n className={`fracto-devtools-logo ${lastUpdate ? \"pulse\" : \"\"}`}\n key={lastUpdate}\n >\n F\n </div>\n <div>\n <div className=\"fracto-devtools-title\">\n Fracto<span className=\"fracto-devtools-title-state\">State</span>\n </div>\n <div className=\"fracto-devtools-subtitle\">Advanced Inspector</div>\n </div>\n </div>\n\n {trafficLightsMode === \"indicators\" && (\n <div className=\"fracto-devtools-window-indicators\">\n <div\n className={`fracto-devtools-dot red ${activeIndicators.red ? \"active\" : \"\"}`}\n title=\"State Reset/Undo\"\n />\n <div\n className={`fracto-devtools-dot yellow ${activeIndicators.yellow ? \"active\" : \"\"}`}\n title=\"State Activity (Read/Write)\"\n />\n <div\n className={`fracto-devtools-dot green ${flowCount > 0 ? \"active\" : \"\"}`}\n title={\n flowCount > 0\n ? \"Engine Online: Flows Active\"\n : \"Engine Standby: No Flows\"\n }\n />\n <button\n className=\"fracto-devtools-max-minimal\"\n onClick={toggleMaximize}\n title={isMaximized ? \"Minimize\" : \"Maximize\"}\n >\n {isMaximized ? (\n <Minimize2 size={12} strokeWidth={2.5} />\n ) : (\n <Maximize2 size={12} strokeWidth={2.5} />\n )}\n </button>\n <button\n className=\"fracto-devtools-close-minimal\"\n onClick={() => setIsOpen(false)}\n title=\"Close\"\n >\n <X size={14} strokeWidth={2.5} />\n </button>\n {/* <button\n className=\"fracto-devtools-close-minimal\"\n onClick={() => {\n // setIsOpen(false);\n setShowMentalMap(false);\n }}\n title=\"Close\"\n >\n <X color=\"blue\" size={14} strokeWidth={2.5} />\n </button> */}\n </div>\n )}\n </div>\n\n <div className=\"fracto-devtools-toolbar\">\n <div className=\"fracto-devtools-search-container\">\n <span className=\"fracto-devtools-search-icon\">🔍</span>\n <input\n type=\"text\"\n className=\"fracto-devtools-search\"\n placeholder=\"Search flows...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n {searchQuery && (\n <button\n className=\"fracto-devtools-clear-search\"\n onClick={() => setSearchQuery(\"\")}\n >\n Clear\n </button>\n )}\n </div>\n\n <div className=\"fracto-devtools-filters\">\n <div className=\"fracto-devtools-filter-buttons\">\n <button\n className={`fracto-devtools-filter-button ${viewMode === \"all\" ? \"active\" : \"\"}`}\n onClick={() => setViewMode(\"all\")}\n >\n All ({stats.total})\n </button>\n <button\n className={`fracto-devtools-filter-button ${viewMode === \"objects\" ? \"active\" : \"\"}`}\n onClick={() => setViewMode(\"objects\")}\n >\n Objects\n </button>\n <button\n className={`fracto-devtools-filter-button ${viewMode === \"arrays\" ? \"active\" : \"\"}`}\n onClick={() => setViewMode(\"arrays\")}\n >\n Arrays\n </button>\n <button\n className={`fracto-devtools-filter-button ${viewMode === \"primitives\" ? \"active\" : \"\"}`}\n onClick={() => setViewMode(\"primitives\")}\n >\n Primitives\n </button>\n </div>\n\n <div className=\"fracto-devtools-actions\">\n <button\n onClick={handleResetAll}\n className={`fracto-devtools-action-btn danger ${isGlobalDirty ? \"is-dirty\" : \"\"}`}\n title={\n isGlobalDirty\n ? \"Reset All Flows\"\n : \"All flows are at initial state\"\n }\n >\n <RotateCcw size={16} />\n </button>\n <button\n onClick={() =>\n setMentalMapSide((prev) => (prev === \"left\" ? \"right\" : \"left\"))\n }\n className=\"fracto-devtools-action-btn\"\n title={`Map Logo default: ${mentalMapSide}`}\n >\n {mentalMapSide === \"left\" ? (\n <ChevronLeft size={16} />\n ) : (\n <ChevronRight size={16} />\n )}\n </button>\n <button\n onClick={() => {\n setShowMentalMap(true);\n setIsOpen(false);\n }}\n className=\"fracto-devtools-action-btn\"\n style={{ fontSize: \"16px\" }}\n title=\"Mental Map & Traces\"\n >\n <Activity size={18} />\n </button>\n <button\n onClick={() => {\n setShowPluginManager(true);\n setIsOpen(false);\n }}\n className=\"fracto-devtools-action-btn\"\n style={{ fontSize: \"16px\" }}\n title=\"Plugin Architect\"\n >\n <Database size={18} />\n </button>\n <button\n onClick={collapseAll}\n className=\"fracto-devtools-action-btn\"\n title=\"Collapse All\"\n >\n <ArrowDownToLine size={16} />\n </button>\n <button\n onClick={expandAll}\n className=\"fracto-devtools-action-btn\"\n title=\"Expand All\"\n >\n <ArrowUpToLine size={16} />\n </button>\n </div>\n </div>\n </div>\n\n <div className=\"fracto-devtools-content\">\n {filteredEntries.length === 0 ? (\n <div className=\"fracto-devtools-empty\">No flows detected</div>\n ) : (\n filteredEntries.map(([key, data]) => (\n <div\n key={key}\n className={`fracto-devtools-flow ${collapsedFlows.has(key) ? \"collapsed\" : \"\"}`}\n >\n <div\n className=\"fracto-devtools-flow-header\"\n onClick={() => toggleCollapse(key)}\n >\n <div className=\"fracto-devtools-flow-header-left\">\n <span className=\"fracto-devtools-flow-collapse-icon\">\n {collapsedFlows.has(key) ? (\n <ChevronRight size={14} />\n ) : (\n <ChevronDown size={14} />\n )}\n </span>\n <div className=\"fracto-devtools-flow-key\">{key}</div>\n {data.meta.plugins && data.meta.plugins.length > 0 && (\n <span\n className=\"fracto-devtools-meta-tag\"\n style={{\n background: \"rgba(255, 215, 0, 0.1)\",\n color: \"#ffd700\",\n animation: \"none\",\n }}\n title={`${data.meta.plugins.length} active plugins`}\n >\n <Zap size={10} />\n </span>\n )}\n {data.meta.isDebouncing && (\n <span\n className=\"fracto-devtools-meta-tag\"\n title=\"Sync pending\"\n >\n <History size={12} className=\"spinning\" />\n </span>\n )}\n </div>\n <div className=\"fracto-devtools-flow-actions\">\n <span className=\"fracto-devtools-flow-badge\">\n {getValueType(data.value)}\n </span>\n <button\n className={`fracto-devtools-flow-action ${data.meta.isDirty ? \"is-dirty\" : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n handleResetFlow(key, data.meta.isDirty);\n }}\n title={\n data.meta.isDirty\n ? \"Reset Flow\"\n : \"Flow is at initial state\"\n }\n >\n <RotateCcw size={14} />\n </button>\n <button\n className={`fracto-devtools-flow-action ${copiedKey === key ? \"copied\" : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n handleCopy(key, data.value);\n }}\n >\n {copiedKey === key ? (\n <Zap size={14} />\n ) : (\n <Monitor size={14} />\n )}\n </button>\n </div>\n </div>\n\n {!collapsedFlows.has(key) && (\n <div className=\"fracto-devtools-flow-expanded\">\n <div className=\"fracto-devtools-meta-grid\">\n <div className=\"fracto-devtools-meta-item\">\n <span className=\"label\">Listeners:</span>\n <span className=\"value\">{data.meta.listeners}</span>\n </div>\n <div className=\"fracto-devtools-meta-item\">\n <span className=\"label\">History:</span>\n <span className=\"value\">{data.meta.historySize}</span>\n </div>\n <div className=\"fracto-devtools-meta-item\">\n <span className=\"label\">Redo:</span>\n <span className=\"value\">{data.meta.redoSize}</span>\n </div>\n </div>\n <pre className=\"fracto-devtools-flow-content\">\n {JSON.stringify(data.value, null, 2)}\n </pre>\n </div>\n )}\n {copiedKey === key && (\n <div className=\"fracto-devtools-copy-toast\">Copied!</div>\n )}\n </div>\n ))\n )}\n </div>\n\n <div className=\"fracto-devtools-footer\">\n <span>FractoState Engine v5</span>\n <span className=\"fracto-devtools-footer-count\">\n {filteredEntries.length} items\n </span>\n </div>\n </div>\n );\n\n const pluginManagerPortal =\n showPluginManager &&\n createPortal(\n <PluginManager\n snapshot={snapshot}\n onClose={() => {\n setShowPluginManager(false);\n setIsOpen(true);\n }}\n />,\n document.body,\n );\n\n return (\n <>\n {isOpen\n ? panelContent\n : showMentalMap || showPluginManager\n ? null\n : buttonContent}\n {mentalMapPortal}\n {pluginManagerPortal}\n </>\n );\n};\n"],"names":["useState","useRef","useEffect","store","useMemo","useCallback","createPortal","_jsx","MentalMap","_jsxs","Minimize2","Maximize2","X","RotateCcw","ChevronLeft","ChevronRight","Activity","Database","ArrowDownToLine","ArrowUpToLine","ChevronDown","Zap","History","Monitor","PluginManager"],"mappings":"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"}
1
+ {"version":3,"file":"FractoDevTools.js","sources":["../../../../src/devtools/FractoDevTools.tsx"],"sourcesContent":["/* *****************************************************************************\n * FractoSate\n *\n * ACCESS RESTRICTIONS:\n * - This software is exclusively for use by Authorized Personnel of NEHONIX\n * - Intended for Internal Use only within NEHONIX operations\n * - No rights granted to unauthorized individuals or entities\n * - All modifications are works made for hire assigned to NEHONIX\n *\n * PROHIBITED ACTIVITIES:\n * - Copying, distributing, or sublicensing without written permission\n * - Reverse engineering, decompiling, or disassembling\n * - Creating derivative works without explicit authorization\n * - External use or commercial distribution outside NEHONIX\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * For questions or permissions, contact:\n * NEHONIX Legal Department\n * Email: legal@nehonix.com\n * Website: www.nehonix.com\n ***************************************************************************** */\n\nimport { useState, useEffect, useMemo, useRef, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { store } from \"../store\";\nimport \"./FractoDevTools.css\";\nimport \"./MentalMap.css\";\nimport type { FractoDevToolsProps, ViewMode } from \"./FDevT\";\nimport { MentalMap } from \"./MentalMap\";\nimport { PluginManager } from \"./PluginManager\";\nimport {\n ChevronRight,\n ChevronLeft,\n ChevronDown,\n RotateCcw,\n Zap,\n Activity,\n History,\n ArrowDownToLine,\n ArrowUpToLine,\n X,\n Maximize2,\n Minimize2,\n Monitor,\n Database,\n} from \"lucide-react\";\n\nexport const FractoDevTools = ({\n position = \"left\",\n initialOpen = false,\n expanded = false,\n trafficLightsMode = \"indicators\",\n controlsPosition = \"right\",\n maximizeMode = \"overlay\",\n}: FractoDevToolsProps) => {\n const [isOpen, setIsOpen] = useState(initialOpen);\n const [isMaximized, setIsMaximized] = useState(false);\n const [showMentalMap, setShowMentalMap] = useState(false);\n const [showPluginManager, setShowPluginManager] = useState(false);\n const [snapshot, setSnapshot] = useState<\n Record<string, { value: any; meta: any }>\n >({});\n const [isInitialized, setIsInitialized] = useState(false);\n const [lastUpdate, setLastUpdate] = useState(0);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [viewMode, setViewMode] = useState<ViewMode>(\"all\");\n const [collapsedFlows, setCollapsedFlows] = useState<Set<string>>(new Set());\n const [copiedKey, setCopiedKey] = useState<string | null>(null);\n const [flowCount, setFlowCount] = useState(0);\n const [mentalMapSide, setMentalMapSide] = useState<\"left\" | \"right\">(\n position,\n );\n\n // Dragging state\n const [coords, setCoords] = useState({ x: 20, y: 20 });\n const [isDragging, setIsDragging] = useState(false);\n\n // Indicators state\n const [activeIndicators, setActiveIndicators] = useState({\n red: false,\n yellow: false,\n green: false,\n });\n\n // Refs to manage pending indicator updates\n const indicatorTimeoutsRef = useRef<Map<string, NodeJS.Timeout>>(new Map());\n const isMountedRef = useRef(true);\n\n // Cleanup on unmount\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n // Clear all pending timeouts\n indicatorTimeoutsRef.current.forEach((timeout) => clearTimeout(timeout));\n indicatorTimeoutsRef.current.clear();\n };\n }, []);\n\n useEffect(() => {\n const updateCount = () => {\n if (!isMountedRef.current) return;\n setFlowCount(Object.keys(store.getDebugSnapshot()).length);\n };\n updateCount();\n return store.subscribeGlobal(updateCount);\n }, []);\n\n useEffect(() => {\n if (!isOpen && !showMentalMap && !showPluginManager) return;\n\n setSnapshot(store.getDebugSnapshot());\n const unsub = store.subscribeGlobal(() => {\n if (!isMountedRef.current) return;\n setSnapshot(store.getDebugSnapshot());\n setLastUpdate(Date.now());\n });\n\n return unsub;\n }, [isOpen, showMentalMap, showPluginManager]);\n\n useEffect(() => {\n if (!isInitialized && Object.keys(snapshot).length > 0) {\n if (!expanded) {\n setCollapsedFlows(new Set(Object.keys(snapshot)));\n }\n setIsInitialized(true);\n }\n }, [snapshot, expanded, isInitialized]);\n\n // Optimized indicator effect - prevents setState during render\n useEffect(() => {\n if (trafficLightsMode !== \"indicators\") return;\n\n const unsub = store.subscribeEvents((event) => {\n let color: \"yellow\" | \"red\" | null = null;\n if (\n event.type === \"write\" ||\n event.type === \"redo\" ||\n event.type === \"read\"\n ) {\n color = \"yellow\";\n }\n if (event.type === \"reset\" || event.type === \"undo\") {\n color = \"red\";\n }\n\n if (color) {\n // Clear any existing timeout for this color\n const existingTimeout = indicatorTimeoutsRef.current.get(color);\n if (existingTimeout) {\n clearTimeout(existingTimeout);\n }\n\n // Use requestAnimationFrame to defer state updates outside render cycle\n requestAnimationFrame(() => {\n if (!isMountedRef.current) return;\n\n setActiveIndicators((prev) => ({ ...prev, [color!]: true }));\n\n const deactivateTimeout = setTimeout(() => {\n if (!isMountedRef.current) return;\n setActiveIndicators((prev) => ({ ...prev, [color!]: false }));\n indicatorTimeoutsRef.current.delete(color!);\n }, 150);\n\n indicatorTimeoutsRef.current.set(color!, deactivateTimeout);\n });\n }\n });\n\n return () => {\n unsub();\n // Cleanup timeouts on unmount\n indicatorTimeoutsRef.current.forEach((timeout) => clearTimeout(timeout));\n indicatorTimeoutsRef.current.clear();\n };\n }, [trafficLightsMode]);\n\n // Handle maximization logic\n const toggleMaximize = () => {\n if (maximizeMode === \"fullscreen\") {\n if (!isMaximized) {\n document.documentElement.requestFullscreen().catch((err) => {\n console.warn(\"[FractoDevTools] Fullscreen denied:\", err.message);\n setIsMaximized(true); // Fallback to overlay\n });\n } else {\n if (document.fullscreenElement) {\n document.exitFullscreen();\n } else {\n setIsMaximized(false);\n }\n }\n } else {\n setIsMaximized(!isMaximized);\n }\n };\n\n useEffect(() => {\n const handleFsChange = () => setIsMaximized(!!document.fullscreenElement);\n document.addEventListener(\"fullscreenchange\", handleFsChange);\n return () =>\n document.removeEventListener(\"fullscreenchange\", handleFsChange);\n }, []);\n\n // Escape key handler\n useEffect(() => {\n const handleEsc = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n if (showMentalMap) {\n setShowMentalMap(false);\n return;\n }\n if (isMaximized) {\n if (document.fullscreenElement) {\n document.exitFullscreen();\n } else {\n setIsMaximized(false);\n }\n }\n }\n };\n window.addEventListener(\"keydown\", handleEsc);\n return () => window.removeEventListener(\"keydown\", handleEsc);\n }, [isMaximized, showMentalMap]);\n\n const filteredEntries = useMemo(() => {\n let entries = Object.entries(snapshot);\n\n if (searchQuery.trim()) {\n const query = searchQuery.toLowerCase();\n entries = entries.filter(([key, data]) => {\n const keyMatch = key.toLowerCase().includes(query);\n const valueMatch = JSON.stringify(data.value)\n .toLowerCase()\n .includes(query);\n return keyMatch || valueMatch;\n });\n }\n\n if (viewMode !== \"all\") {\n entries = entries.filter(([_, data]) => {\n const value = data.value;\n if (viewMode === \"objects\") {\n return (\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n );\n }\n if (viewMode === \"arrays\") {\n return Array.isArray(value);\n }\n if (viewMode === \"primitives\") {\n return typeof value !== \"object\" || value === null;\n }\n return true;\n });\n }\n\n return entries;\n }, [snapshot, searchQuery, viewMode]);\n\n const stats = useMemo(() => {\n const entries = Object.values(snapshot);\n return {\n total: entries.length,\n objects: entries.filter(\n (d) =>\n typeof d.value === \"object\" &&\n d.value !== null &&\n !Array.isArray(d.value),\n ).length,\n arrays: entries.filter((d) => Array.isArray(d.value)).length,\n primitives: entries.filter(\n (d) => typeof d.value !== \"object\" || d.value === null,\n ).length,\n };\n }, [snapshot]);\n\n const isGlobalDirty = useMemo(() => {\n return Object.values(snapshot).some((d) => d.meta.isDirty);\n }, [snapshot]);\n\n const toggleCollapse = (key: string) => {\n setCollapsedFlows((prev) => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n };\n\n const collapseAll = () => {\n const keys = Object.keys(snapshot);\n setCollapsedFlows(new Set(keys));\n };\n\n const expandAll = () => {\n setCollapsedFlows(new Set());\n };\n\n const handleResetAll = () => {\n if (!isGlobalDirty) return;\n if (\n confirm(\n \"Are you sure you want to reset ALL flows to their initial state?\",\n )\n ) {\n store.resetAll();\n }\n };\n\n const handleResetFlow = (key: string, isDirty: boolean) => {\n if (!isDirty) return;\n store.reset(key);\n };\n\n const handleCopy = (key: string, value: any) => {\n navigator.clipboard.writeText(JSON.stringify(value, null, 2));\n setCopiedKey(key);\n setTimeout(() => {\n if (isMountedRef.current) {\n setCopiedKey(null);\n }\n }, 2000);\n };\n\n const getValueType = (value: any): string => {\n if (value === null) return \"null\";\n if (Array.isArray(value)) return `array[${value.length}]`;\n if (typeof value === \"object\")\n return `object{${Object.keys(value).length}}`;\n return typeof value;\n };\n\n // Drag logic\n const handleMouseDown = (e: React.MouseEvent) => {\n setIsDragging(false);\n const startX = e.clientX;\n const startY = e.clientY;\n const initialCoords = { ...coords };\n\n const onMouseMove = (moveEvent: MouseEvent) => {\n if (\n Math.abs(moveEvent.clientX - startX) > 5 ||\n Math.abs(moveEvent.clientY - startY) > 5\n ) {\n setIsDragging(true);\n }\n\n const dx =\n position === \"left\"\n ? moveEvent.clientX - startX\n : startX - moveEvent.clientX;\n const dy = startY - moveEvent.clientY;\n\n setCoords({\n x: Math.max(0, initialCoords.x + dx),\n y: Math.max(0, initialCoords.y + dy),\n });\n };\n\n const onMouseUp = () => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n };\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n };\n\n const positionStyle: React.CSSProperties = {\n [position]: `${coords.x}px`,\n bottom: `${coords.y}px`,\n };\n\n // Stable handler for minimize change.\n // We ensure the main panel stays closed when Mental Map is active/minimized.\n const handleMinimizeChange = useCallback((_min: boolean) => {\n setIsOpen(false);\n }, []);\n\n const mentalMapPortal =\n showMentalMap &&\n createPortal(\n <MentalMap\n snapshot={snapshot}\n onClose={() => {\n setShowMentalMap(false);\n setIsOpen(true);\n }}\n onMinimizeChange={handleMinimizeChange}\n minimizedSide={mentalMapSide}\n setIsOpen={setIsOpen}\n />,\n document.body,\n );\n\n const buttonContent = (\n <button\n onMouseDown={handleMouseDown}\n onClick={() => !isDragging && setIsOpen(true)}\n className={`fracto-devtools-button position-${position}`}\n style={{ ...positionStyle, cursor: isDragging ? \"grabbing\" : \"grab\" }}\n title=\"Open FractoState DevTools (Draggable)\"\n >\n F\n {flowCount > 0 && (\n <span className=\"fracto-devtools-badge-count\">{flowCount}</span>\n )}\n </button>\n );\n\n const panelContent = (\n <div\n className={`fracto-devtools-panel position-${position} ${isMaximized ? \"is-maximized\" : \"\"}`}\n style={isMaximized ? {} : positionStyle}\n >\n <div\n className={`fracto-devtools-header mode-${trafficLightsMode} controls-${controlsPosition}`}\n >\n {trafficLightsMode === \"controls\" && (\n <div className=\"fracto-devtools-window-controls\">\n <button\n className=\"fracto-devtools-dot red\"\n onClick={() => setIsOpen(false)}\n title=\"Close Inspector\"\n />\n <button\n className=\"fracto-devtools-dot yellow\"\n onClick={collapseAll}\n title=\"Collapse All\"\n />\n <button\n className=\"fracto-devtools-dot green\"\n onClick={expandAll}\n title=\"Expand All\"\n />\n <button\n className=\"fracto-devtools-dot blue\"\n onClick={toggleMaximize}\n title={isMaximized ? \"Restore\" : \"Maximize\"}\n />\n </div>\n )}\n\n <div className=\"fracto-devtools-header-content\">\n <div\n className={`fracto-devtools-logo ${lastUpdate ? \"pulse\" : \"\"}`}\n key={lastUpdate}\n >\n F\n </div>\n <div>\n <div className=\"fracto-devtools-title\">\n Fracto<span className=\"fracto-devtools-title-state\">State</span>\n </div>\n <div className=\"fracto-devtools-subtitle\">Advanced Inspector</div>\n </div>\n </div>\n\n {trafficLightsMode === \"indicators\" && (\n <div className=\"fracto-devtools-window-indicators\">\n <div\n className={`fracto-devtools-dot red ${activeIndicators.red ? \"active\" : \"\"}`}\n title=\"State Reset/Undo\"\n />\n <div\n className={`fracto-devtools-dot yellow ${activeIndicators.yellow ? \"active\" : \"\"}`}\n title=\"State Activity (Read/Write)\"\n />\n <div\n className={`fracto-devtools-dot green ${flowCount > 0 ? \"active\" : \"\"}`}\n title={\n flowCount > 0\n ? \"Engine Online: Flows Active\"\n : \"Engine Standby: No Flows\"\n }\n />\n <button\n className=\"fracto-devtools-max-minimal\"\n onClick={toggleMaximize}\n title={isMaximized ? \"Minimize\" : \"Maximize\"}\n >\n {isMaximized ? (\n <Minimize2 size={12} strokeWidth={2.5} />\n ) : (\n <Maximize2 size={12} strokeWidth={2.5} />\n )}\n </button>\n <button\n className=\"fracto-devtools-close-minimal\"\n onClick={() => setIsOpen(false)}\n title=\"Close\"\n >\n <X size={14} strokeWidth={2.5} />\n </button>\n {/* <button\n className=\"fracto-devtools-close-minimal\"\n onClick={() => {\n // setIsOpen(false);\n setShowMentalMap(false);\n }}\n title=\"Close\"\n >\n <X color=\"blue\" size={14} strokeWidth={2.5} />\n </button> */}\n </div>\n )}\n </div>\n\n <div className=\"fracto-devtools-toolbar\">\n <div className=\"fracto-devtools-search-container\">\n <span className=\"fracto-devtools-search-icon\">🔍</span>\n <input\n type=\"text\"\n className=\"fracto-devtools-search\"\n placeholder=\"Search flows...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n {searchQuery && (\n <button\n className=\"fracto-devtools-clear-search\"\n onClick={() => setSearchQuery(\"\")}\n >\n Clear\n </button>\n )}\n </div>\n\n <div className=\"fracto-devtools-filters\">\n <div className=\"fracto-devtools-filter-buttons\">\n <button\n className={`fracto-devtools-filter-button ${viewMode === \"all\" ? \"active\" : \"\"}`}\n onClick={() => setViewMode(\"all\")}\n >\n All ({stats.total})\n </button>\n <button\n className={`fracto-devtools-filter-button ${viewMode === \"objects\" ? \"active\" : \"\"}`}\n onClick={() => setViewMode(\"objects\")}\n >\n Objects\n </button>\n <button\n className={`fracto-devtools-filter-button ${viewMode === \"arrays\" ? \"active\" : \"\"}`}\n onClick={() => setViewMode(\"arrays\")}\n >\n Arrays\n </button>\n <button\n className={`fracto-devtools-filter-button ${viewMode === \"primitives\" ? \"active\" : \"\"}`}\n onClick={() => setViewMode(\"primitives\")}\n >\n Primitives\n </button>\n </div>\n\n <div className=\"fracto-devtools-actions\">\n <button\n onClick={handleResetAll}\n className={`fracto-devtools-action-btn danger ${isGlobalDirty ? \"is-dirty\" : \"\"}`}\n title={\n isGlobalDirty\n ? \"Reset All Flows\"\n : \"All flows are at initial state\"\n }\n >\n <RotateCcw size={16} />\n </button>\n <button\n onClick={() =>\n setMentalMapSide((prev) => (prev === \"left\" ? \"right\" : \"left\"))\n }\n className=\"fracto-devtools-action-btn\"\n title={`Map Logo default: ${mentalMapSide}`}\n >\n {mentalMapSide === \"left\" ? (\n <ChevronLeft size={16} />\n ) : (\n <ChevronRight size={16} />\n )}\n </button>\n <button\n onClick={() => {\n setShowMentalMap(true);\n setIsOpen(false);\n }}\n className=\"fracto-devtools-action-btn\"\n style={{ fontSize: \"16px\" }}\n title=\"Mental Map & Traces\"\n >\n <Activity size={18} />\n </button>\n <button\n onClick={() => {\n setShowPluginManager(true);\n setIsOpen(false);\n }}\n className=\"fracto-devtools-action-btn\"\n style={{ fontSize: \"16px\" }}\n title=\"Plugin Architect\"\n >\n <Database size={18} />\n </button>\n <button\n onClick={collapseAll}\n className=\"fracto-devtools-action-btn\"\n title=\"Collapse All\"\n >\n <ArrowDownToLine size={16} />\n </button>\n <button\n onClick={expandAll}\n className=\"fracto-devtools-action-btn\"\n title=\"Expand All\"\n >\n <ArrowUpToLine size={16} />\n </button>\n </div>\n </div>\n </div>\n\n <div className=\"fracto-devtools-content\">\n {filteredEntries.length === 0 ? (\n <div className=\"fracto-devtools-empty\">No flows detected</div>\n ) : (\n filteredEntries.map(([key, data]) => (\n <div\n key={key}\n className={`fracto-devtools-flow ${collapsedFlows.has(key) ? \"collapsed\" : \"\"}`}\n >\n <div\n className=\"fracto-devtools-flow-header\"\n onClick={() => toggleCollapse(key)}\n >\n <div className=\"fracto-devtools-flow-header-left\">\n <span className=\"fracto-devtools-flow-collapse-icon\">\n {collapsedFlows.has(key) ? (\n <ChevronRight size={14} />\n ) : (\n <ChevronDown size={14} />\n )}\n </span>\n <div className=\"fracto-devtools-flow-key\">{key}</div>\n {data.meta.plugins && data.meta.plugins.length > 0 && (\n <span\n className=\"fracto-devtools-meta-tag\"\n style={{\n background: \"rgba(255, 215, 0, 0.1)\",\n color: \"#ffd700\",\n animation: \"none\",\n }}\n title={`${data.meta.plugins.length} active plugins`}\n >\n <Zap size={10} />\n </span>\n )}\n {data.meta.isDebouncing && (\n <span\n className=\"fracto-devtools-meta-tag\"\n title=\"Sync pending\"\n >\n <History size={12} className=\"spinning\" />\n </span>\n )}\n </div>\n <div className=\"fracto-devtools-flow-actions\">\n <span className=\"fracto-devtools-flow-badge\">\n {getValueType(data.value)}\n </span>\n <button\n className={`fracto-devtools-flow-action ${data.meta.isDirty ? \"is-dirty\" : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n handleResetFlow(key, data.meta.isDirty);\n }}\n title={\n data.meta.isDirty\n ? \"Reset Flow\"\n : \"Flow is at initial state\"\n }\n >\n <RotateCcw size={14} />\n </button>\n <button\n className={`fracto-devtools-flow-action ${copiedKey === key ? \"copied\" : \"\"}`}\n onClick={(e) => {\n e.stopPropagation();\n handleCopy(key, data.value);\n }}\n >\n {copiedKey === key ? (\n <Zap size={14} />\n ) : (\n <Monitor size={14} />\n )}\n </button>\n </div>\n </div>\n\n {!collapsedFlows.has(key) && (\n <div className=\"fracto-devtools-flow-expanded\">\n <div className=\"fracto-devtools-meta-grid\">\n <div className=\"fracto-devtools-meta-item\">\n <span className=\"label\">Listeners:</span>\n <span className=\"value\">{data.meta.listeners}</span>\n </div>\n <div className=\"fracto-devtools-meta-item\">\n <span className=\"label\">History:</span>\n <span className=\"value\">{data.meta.historySize}</span>\n </div>\n <div className=\"fracto-devtools-meta-item\">\n <span className=\"label\">Redo:</span>\n <span className=\"value\">{data.meta.redoSize}</span>\n </div>\n </div>\n <pre className=\"fracto-devtools-flow-content\">\n {JSON.stringify(data.value, null, 2)}\n </pre>\n </div>\n )}\n {copiedKey === key && (\n <div className=\"fracto-devtools-copy-toast\">Copied!</div>\n )}\n </div>\n ))\n )}\n </div>\n\n <div className=\"fracto-devtools-footer\">\n <span>FractoState Engine v5</span>\n <span className=\"fracto-devtools-footer-count\">\n {filteredEntries.length} items\n </span>\n </div>\n </div>\n );\n\n const pluginManagerPortal =\n showPluginManager &&\n createPortal(\n <PluginManager\n snapshot={snapshot}\n onClose={() => {\n setShowPluginManager(false);\n setIsOpen(true);\n }}\n />,\n document.body,\n );\n\n return (\n <>\n {isOpen\n ? panelContent\n : showMentalMap || showPluginManager\n ? null\n : buttonContent}\n {mentalMapPortal}\n {pluginManagerPortal}\n </>\n );\n};\n"],"names":["useState","useRef","useEffect","store","useMemo","useCallback","createPortal","_jsx","MentalMap","_jsxs","Minimize2","Maximize2","X","RotateCcw","ChevronLeft","ChevronRight","Activity","Database","ArrowDownToLine","ArrowUpToLine","ChevronDown","Zap","History","Monitor","PluginManager"],"mappings":";;;;;;;;;;;;AAsDO,MAAM,cAAc,GAAG,CAAC,EAC7B,QAAQ,GAAG,MAAM,EACjB,WAAW,GAAG,KAAK,EACnB,QAAQ,GAAG,KAAK,EAChB,iBAAiB,GAAG,YAAY,EAChC,gBAAgB,GAAG,OAAO,EAC1B,YAAY,GAAG,SAAS,GACJ,KAAI;IACxB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAGA,cAAQ,CAAC,WAAW,CAAC;IACjD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;IACrD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;IACzD,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;IACjE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAGA,cAAQ,CAEtC,EAAE,CAAC;IACL,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;IACzD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAGA,cAAQ,CAAC,CAAC,CAAC;IAC/C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAGA,cAAQ,CAAC,EAAE,CAAC;IAClD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAGA,cAAQ,CAAW,KAAK,CAAC;AACzD,IAAA,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAGA,cAAQ,CAAc,IAAI,GAAG,EAAE,CAAC;IAC5E,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAGA,cAAQ,CAAgB,IAAI,CAAC;IAC/D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAGA,cAAQ,CAAC,CAAC,CAAC;IAC7C,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAGA,cAAQ,CAChD,QAAQ,CACT;;AAGD,IAAA,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAGA,cAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;IACtD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;;AAGnD,IAAA,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAGA,cAAQ,CAAC;AACvD,QAAA,GAAG,EAAE,KAAK;AACV,QAAA,MAAM,EAAE,KAAK;AACb,QAAA,KAAK,EAAE,KAAK;AACb,KAAA,CAAC;;IAGF,MAAM,oBAAoB,GAAGC,YAAM,CAA8B,IAAI,GAAG,EAAE,CAAC;AAC3E,IAAA,MAAM,YAAY,GAAGA,YAAM,CAAC,IAAI,CAAC;;IAGjCC,eAAS,CAAC,MAAK;AACb,QAAA,YAAY,CAAC,OAAO,GAAG,IAAI;AAC3B,QAAA,OAAO,MAAK;AACV,YAAA,YAAY,CAAC,OAAO,GAAG,KAAK;;AAE5B,YAAA,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC;AACxE,YAAA,oBAAoB,CAAC,OAAO,CAAC,KAAK,EAAE;AACtC,QAAA,CAAC;IACH,CAAC,EAAE,EAAE,CAAC;IAENA,eAAS,CAAC,MAAK;QACb,MAAM,WAAW,GAAG,MAAK;YACvB,IAAI,CAAC,YAAY,CAAC,OAAO;gBAAE;AAC3B,YAAA,YAAY,CAAC,MAAM,CAAC,IAAI,CAACC,WAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC;AAC5D,QAAA,CAAC;AACD,QAAA,WAAW,EAAE;AACb,QAAA,OAAOA,WAAK,CAAC,eAAe,CAAC,WAAW,CAAC;IAC3C,CAAC,EAAE,EAAE,CAAC;IAEND,eAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,IAAI,CAAC,iBAAiB;YAAE;AAErD,QAAA,WAAW,CAACC,WAAK,CAAC,gBAAgB,EAAE,CAAC;AACrC,QAAA,MAAM,KAAK,GAAGA,WAAK,CAAC,eAAe,CAAC,MAAK;YACvC,IAAI,CAAC,YAAY,CAAC,OAAO;gBAAE;AAC3B,YAAA,WAAW,CAACA,WAAK,CAAC,gBAAgB,EAAE,CAAC;AACrC,YAAA,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AAC3B,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,KAAK;IACd,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,iBAAiB,CAAC,CAAC;IAE9CD,eAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YACtD,IAAI,CAAC,QAAQ,EAAE;AACb,gBAAA,iBAAiB,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACnD;YACA,gBAAgB,CAAC,IAAI,CAAC;QACxB;IACF,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;;IAGvCA,eAAS,CAAC,MAAK;QACb,IAAI,iBAAiB,KAAK,YAAY;YAAE;QAExC,MAAM,KAAK,GAAGC,WAAK,CAAC,eAAe,CAAC,CAAC,KAAK,KAAI;YAC5C,IAAI,KAAK,GAA4B,IAAI;AACzC,YAAA,IACE,KAAK,CAAC,IAAI,KAAK,OAAO;gBACtB,KAAK,CAAC,IAAI,KAAK,MAAM;AACrB,gBAAA,KAAK,CAAC,IAAI,KAAK,MAAM,EACrB;gBACA,KAAK,GAAG,QAAQ;YAClB;AACA,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE;gBACnD,KAAK,GAAG,KAAK;YACf;YAEA,IAAI,KAAK,EAAE;;gBAET,MAAM,eAAe,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC/D,IAAI,eAAe,EAAE;oBACnB,YAAY,CAAC,eAAe,CAAC;gBAC/B;;gBAGA,qBAAqB,CAAC,MAAK;oBACzB,IAAI,CAAC,YAAY,CAAC,OAAO;wBAAE;AAE3B,oBAAA,mBAAmB,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,KAAM,GAAG,IAAI,EAAE,CAAC,CAAC;AAE5D,oBAAA,MAAM,iBAAiB,GAAG,UAAU,CAAC,MAAK;wBACxC,IAAI,CAAC,YAAY,CAAC,OAAO;4BAAE;AAC3B,wBAAA,mBAAmB,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,KAAM,GAAG,KAAK,EAAE,CAAC,CAAC;AAC7D,wBAAA,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,KAAM,CAAC;oBAC7C,CAAC,EAAE,GAAG,CAAC;oBAEP,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,KAAM,EAAE,iBAAiB,CAAC;AAC7D,gBAAA,CAAC,CAAC;YACJ;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,MAAK;AACV,YAAA,KAAK,EAAE;;AAEP,YAAA,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC;AACxE,YAAA,oBAAoB,CAAC,OAAO,CAAC,KAAK,EAAE;AACtC,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC;;IAGvB,MAAM,cAAc,GAAG,MAAK;AAC1B,QAAA,IAAI,YAAY,KAAK,YAAY,EAAE;YACjC,IAAI,CAAC,WAAW,EAAE;gBAChB,QAAQ,CAAC,eAAe,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,KAAI;oBACzD,OAAO,CAAC,IAAI,CAAC,qCAAqC,EAAE,GAAG,CAAC,OAAO,CAAC;AAChE,oBAAA,cAAc,CAAC,IAAI,CAAC,CAAC;AACvB,gBAAA,CAAC,CAAC;YACJ;iBAAO;AACL,gBAAA,IAAI,QAAQ,CAAC,iBAAiB,EAAE;oBAC9B,QAAQ,CAAC,cAAc,EAAE;gBAC3B;qBAAO;oBACL,cAAc,CAAC,KAAK,CAAC;gBACvB;YACF;QACF;aAAO;AACL,YAAA,cAAc,CAAC,CAAC,WAAW,CAAC;QAC9B;AACF,IAAA,CAAC;IAEDD,eAAS,CAAC,MAAK;AACb,QAAA,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;AACzE,QAAA,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,cAAc,CAAC;QAC7D,OAAO,MACL,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,cAAc,CAAC;IACpE,CAAC,EAAE,EAAE,CAAC;;IAGNA,eAAS,CAAC,MAAK;AACb,QAAA,MAAM,SAAS,GAAG,CAAC,CAAgB,KAAI;AACrC,YAAA,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE;gBACtB,IAAI,aAAa,EAAE;oBACjB,gBAAgB,CAAC,KAAK,CAAC;oBACvB;gBACF;gBACA,IAAI,WAAW,EAAE;AACf,oBAAA,IAAI,QAAQ,CAAC,iBAAiB,EAAE;wBAC9B,QAAQ,CAAC,cAAc,EAAE;oBAC3B;yBAAO;wBACL,cAAc,CAAC,KAAK,CAAC;oBACvB;gBACF;YACF;AACF,QAAA,CAAC;AACD,QAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;QAC7C,OAAO,MAAM,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC;AAC/D,IAAA,CAAC,EAAE,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AAEhC,IAAA,MAAM,eAAe,GAAGE,aAAO,CAAC,MAAK;QACnC,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;AAEtC,QAAA,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE;AACtB,YAAA,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAE;AACvC,YAAA,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,KAAI;gBACvC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAClD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK;AACzC,qBAAA,WAAW;qBACX,QAAQ,CAAC,KAAK,CAAC;gBAClB,OAAO,QAAQ,IAAI,UAAU;AAC/B,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,IAAI,QAAQ,KAAK,KAAK,EAAE;AACtB,YAAA,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAI;AACrC,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK;AACxB,gBAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;AAC1B,oBAAA,QACE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAExE;AACA,gBAAA,IAAI,QAAQ,KAAK,QAAQ,EAAE;AACzB,oBAAA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC7B;AACA,gBAAA,IAAI,QAAQ,KAAK,YAAY,EAAE;oBAC7B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;gBACpD;AACA,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,OAAO,OAAO;IAChB,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;AAErC,IAAA,MAAM,KAAK,GAAGA,aAAO,CAAC,MAAK;QACzB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;QACvC,OAAO;YACL,KAAK,EAAE,OAAO,CAAC,MAAM;AACrB,YAAA,OAAO,EAAE,OAAO,CAAC,MAAM,CACrB,CAAC,CAAC,KACA,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ;gBAC3B,CAAC,CAAC,KAAK,KAAK,IAAI;gBAChB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAC1B,CAAC,MAAM;YACR,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;YAC5D,UAAU,EAAE,OAAO,CAAC,MAAM,CACxB,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CACvD,CAAC,MAAM;SACT;AACH,IAAA,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;AAEd,IAAA,MAAM,aAAa,GAAGA,aAAO,CAAC,MAAK;QACjC,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;AAC5D,IAAA,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;AAEd,IAAA,MAAM,cAAc,GAAG,CAAC,GAAW,KAAI;AACrC,QAAA,iBAAiB,CAAC,CAAC,IAAI,KAAI;AACzB,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC;AAC1B,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;;AAC9B,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;IAED,MAAM,WAAW,GAAG,MAAK;QACvB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;AAClC,QAAA,iBAAiB,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;AAClC,IAAA,CAAC;IAED,MAAM,SAAS,GAAG,MAAK;AACrB,QAAA,iBAAiB,CAAC,IAAI,GAAG,EAAE,CAAC;AAC9B,IAAA,CAAC;IAED,MAAM,cAAc,GAAG,MAAK;AAC1B,QAAA,IAAI,CAAC,aAAa;YAAE;AACpB,QAAA,IACE,OAAO,CACL,kEAAkE,CACnE,EACD;YACAD,WAAK,CAAC,QAAQ,EAAE;QAClB;AACF,IAAA,CAAC;AAED,IAAA,MAAM,eAAe,GAAG,CAAC,GAAW,EAAE,OAAgB,KAAI;AACxD,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAAA,WAAK,CAAC,KAAK,CAAC,GAAG,CAAC;AAClB,IAAA,CAAC;AAED,IAAA,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,KAAU,KAAI;AAC7C,QAAA,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7D,YAAY,CAAC,GAAG,CAAC;QACjB,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,YAAY,CAAC,OAAO,EAAE;gBACxB,YAAY,CAAC,IAAI,CAAC;YACpB;QACF,CAAC,EAAE,IAAI,CAAC;AACV,IAAA,CAAC;AAED,IAAA,MAAM,YAAY,GAAG,CAAC,KAAU,KAAY;QAC1C,IAAI,KAAK,KAAK,IAAI;AAAE,YAAA,OAAO,MAAM;AACjC,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,CAAA,MAAA,EAAS,KAAK,CAAC,MAAM,GAAG;QACzD,IAAI,OAAO,KAAK,KAAK,QAAQ;YAC3B,OAAO,CAAA,OAAA,EAAU,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAA,CAAA,CAAG;QAC/C,OAAO,OAAO,KAAK;AACrB,IAAA,CAAC;;AAGD,IAAA,MAAM,eAAe,GAAG,CAAC,CAAmB,KAAI;QAC9C,aAAa,CAAC,KAAK,CAAC;AACpB,QAAA,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO;AACxB,QAAA,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO;AACxB,QAAA,MAAM,aAAa,GAAG,EAAE,GAAG,MAAM,EAAE;AAEnC,QAAA,MAAM,WAAW,GAAG,CAAC,SAAqB,KAAI;YAC5C,IACE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC;AACxC,gBAAA,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,EACxC;gBACA,aAAa,CAAC,IAAI,CAAC;YACrB;AAEA,YAAA,MAAM,EAAE,GACN,QAAQ,KAAK;AACX,kBAAE,SAAS,CAAC,OAAO,GAAG;AACtB,kBAAE,MAAM,GAAG,SAAS,CAAC,OAAO;AAChC,YAAA,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAAC,OAAO;AAErC,YAAA,SAAS,CAAC;AACR,gBAAA,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,GAAG,EAAE,CAAC;AACpC,gBAAA,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,GAAG,EAAE,CAAC;AACrC,aAAA,CAAC;AACJ,QAAA,CAAC;QAED,MAAM,SAAS,GAAG,MAAK;AACrB,YAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC;AACtD,YAAA,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC;AACpD,QAAA,CAAC;AAED,QAAA,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC;AACnD,QAAA,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;AACjD,IAAA,CAAC;AAED,IAAA,MAAM,aAAa,GAAwB;AACzC,QAAA,CAAC,QAAQ,GAAG,GAAG,MAAM,CAAC,CAAC,CAAA,EAAA,CAAI;AAC3B,QAAA,MAAM,EAAE,CAAA,EAAG,MAAM,CAAC,CAAC,CAAA,EAAA,CAAI;KACxB;;;AAID,IAAA,MAAM,oBAAoB,GAAGE,iBAAW,CAAC,CAAC,IAAa,KAAI;QACzD,SAAS,CAAC,KAAK,CAAC;IAClB,CAAC,EAAE,EAAE,CAAC;IAEN,MAAM,eAAe,GACnB,aAAa;QACbC,qBAAY,CACVC,cAAA,CAACC,mBAAS,EAAA,EACR,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAK;gBACZ,gBAAgB,CAAC,KAAK,CAAC;gBACvB,SAAS,CAAC,IAAI,CAAC;AACjB,YAAA,CAAC,EACD,gBAAgB,EAAE,oBAAoB,EACtC,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EAAA,CACpB,EACF,QAAQ,CAAC,IAAI,CACd;AAEH,IAAA,MAAM,aAAa,IACjBC,eAAA,CAAA,QAAA,EAAA,EACE,WAAW,EAAE,eAAe,EAC5B,OAAO,EAAE,MAAM,CAAC,UAAU,IAAI,SAAS,CAAC,IAAI,CAAC,EAC7C,SAAS,EAAE,CAAA,gCAAA,EAAmC,QAAQ,CAAA,CAAE,EACxD,KAAK,EAAE,EAAE,GAAG,aAAa,EAAE,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,EAAE,EACrE,KAAK,EAAC,uCAAuC,EAAA,QAAA,EAAA,CAAA,GAAA,EAG5C,SAAS,GAAG,CAAC,KACZF,yBAAM,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAAE,SAAS,EAAA,CAAQ,CACjE,CAAA,EAAA,CACM,CACV;IAED,MAAM,YAAY,IAChBE,eAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAE,CAAA,+BAAA,EAAkC,QAAQ,CAAA,CAAA,EAAI,WAAW,GAAG,cAAc,GAAG,EAAE,CAAA,CAAE,EAC5F,KAAK,EAAE,WAAW,GAAG,EAAE,GAAG,aAAa,EAAA,QAAA,EAAA,CAEvCA,eAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAE,CAAA,4BAAA,EAA+B,iBAAiB,CAAA,UAAA,EAAa,gBAAgB,CAAA,CAAE,EAAA,QAAA,EAAA,CAEzF,iBAAiB,KAAK,UAAU,KAC/BA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAAA,CAC9CF,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,yBAAyB,EACnC,OAAO,EAAE,MAAM,SAAS,CAAC,KAAK,CAAC,EAC/B,KAAK,EAAC,iBAAiB,EAAA,CACvB,EACFA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,4BAA4B,EACtC,OAAO,EAAE,WAAW,EACpB,KAAK,EAAC,cAAc,EAAA,CACpB,EACFA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,2BAA2B,EACrC,OAAO,EAAE,SAAS,EAClB,KAAK,EAAC,YAAY,EAAA,CAClB,EACFA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,0BAA0B,EACpC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,EAAA,CAC3C,CAAA,EAAA,CACE,CACP,EAEDE,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gCAAgC,EAAA,QAAA,EAAA,CAC7CF,cAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAE,CAAA,qBAAA,EAAwB,UAAU,GAAG,OAAO,GAAG,EAAE,CAAA,CAAE,EAAA,QAAA,EAAA,GAAA,EAAA,EACzD,UAAU,CAGX,EACNE,eAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CACEA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uBAAuB,uBAC9BF,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAAA,OAAA,EAAA,CAAa,CAAA,EAAA,CAC5D,EACNA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,0BAA0B,EAAA,QAAA,EAAA,oBAAA,EAAA,CAAyB,CAAA,EAAA,CAC9D,CAAA,EAAA,CACF,EAEL,iBAAiB,KAAK,YAAY,KACjCE,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAA,CAChDF,cAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAE,CAAA,wBAAA,EAA2B,gBAAgB,CAAC,GAAG,GAAG,QAAQ,GAAG,EAAE,CAAA,CAAE,EAC5E,KAAK,EAAC,kBAAkB,EAAA,CACxB,EACFA,cAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAE,CAAA,2BAAA,EAA8B,gBAAgB,CAAC,MAAM,GAAG,QAAQ,GAAG,EAAE,CAAA,CAAE,EAClF,KAAK,EAAC,6BAA6B,EAAA,CACnC,EACFA,cAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAE,CAAA,0BAAA,EAA6B,SAAS,GAAG,CAAC,GAAG,QAAQ,GAAG,EAAE,CAAA,CAAE,EACvE,KAAK,EACH,SAAS,GAAG;AACV,sCAAE;AACF,sCAAE,0BAA0B,EAAA,CAEhC,EACFA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,6BAA6B,EACvC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,UAAU,EAAA,QAAA,EAE3C,WAAW,IACVA,eAACG,qBAAS,EAAA,EAAC,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,GAAI,KAEzCH,cAAA,CAACI,qBAAS,EAAA,EAAC,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,EAAA,CAAI,CAC1C,EAAA,CACM,EACTJ,2BACE,SAAS,EAAC,+BAA+B,EACzC,OAAO,EAAE,MAAM,SAAS,CAAC,KAAK,CAAC,EAC/B,KAAK,EAAC,OAAO,EAAA,QAAA,EAEbA,cAAA,CAACK,aAAC,EAAA,EAAC,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,EAAA,CAAI,GAC1B,CAAA,EAAA,CAWL,CACP,CAAA,EAAA,CACG,EAENH,yBAAK,SAAS,EAAC,yBAAyB,EAAA,QAAA,EAAA,CACtCA,yBAAK,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAAA,CAC/CF,yBAAM,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAAA,cAAA,EAAA,CAAU,EACvDA,cAAA,CAAA,OAAA,EAAA,EACE,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,wBAAwB,EAClC,WAAW,EAAC,iBAAiB,EAC7B,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAA,CAC/C,EACD,WAAW,KACVA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,8BAA8B,EACxC,OAAO,EAAE,MAAM,cAAc,CAAC,EAAE,CAAC,EAAA,QAAA,EAAA,OAAA,EAAA,CAG1B,CACV,CAAA,EAAA,CACG,EAENE,yBAAK,SAAS,EAAC,yBAAyB,EAAA,QAAA,EAAA,CACtCA,yBAAK,SAAS,EAAC,gCAAgC,EAAA,QAAA,EAAA,CAC7CA,4BACE,SAAS,EAAE,CAAA,8BAAA,EAAiC,QAAQ,KAAK,KAAK,GAAG,QAAQ,GAAG,EAAE,EAAE,EAChF,OAAO,EAAE,MAAM,WAAW,CAAC,KAAK,CAAC,EAAA,QAAA,EAAA,CAAA,OAAA,EAE3B,KAAK,CAAC,KAAK,SACV,EACTF,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAE,iCAAiC,QAAQ,KAAK,SAAS,GAAG,QAAQ,GAAG,EAAE,CAAA,CAAE,EACpF,OAAO,EAAE,MAAM,WAAW,CAAC,SAAS,CAAC,wBAG9B,EACTA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAE,CAAA,8BAAA,EAAiC,QAAQ,KAAK,QAAQ,GAAG,QAAQ,GAAG,EAAE,CAAA,CAAE,EACnF,OAAO,EAAE,MAAM,WAAW,CAAC,QAAQ,CAAC,uBAG7B,EACTA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAE,iCAAiC,QAAQ,KAAK,YAAY,GAAG,QAAQ,GAAG,EAAE,CAAA,CAAE,EACvF,OAAO,EAAE,MAAM,WAAW,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,YAAA,EAAA,CAGjC,CAAA,EAAA,CACL,EAENE,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,yBAAyB,aACtCF,cAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,CAAA,kCAAA,EAAqC,aAAa,GAAG,UAAU,GAAG,EAAE,EAAE,EACjF,KAAK,EACH;AACE,8CAAE;AACF,8CAAE,gCAAgC,EAAA,QAAA,EAGtCA,cAAA,CAACM,qBAAS,IAAC,IAAI,EAAE,EAAE,EAAA,CAAI,GAChB,EACTN,cAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,MACP,gBAAgB,CAAC,CAAC,IAAI,MAAM,IAAI,KAAK,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC,EAElE,SAAS,EAAC,4BAA4B,EACtC,KAAK,EAAE,qBAAqB,aAAa,CAAA,CAAE,YAE1C,aAAa,KAAK,MAAM,IACvBA,eAACO,uBAAW,EAAA,EAAC,IAAI,EAAE,EAAE,EAAA,CAAI,KAEzBP,cAAA,CAACQ,wBAAY,IAAC,IAAI,EAAE,EAAE,EAAA,CAAI,CAC3B,EAAA,CACM,EACTR,2BACE,OAAO,EAAE,MAAK;4CACZ,gBAAgB,CAAC,IAAI,CAAC;4CACtB,SAAS,CAAC,KAAK,CAAC;AAClB,wCAAA,CAAC,EACD,SAAS,EAAC,4BAA4B,EACtC,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAC3B,KAAK,EAAC,qBAAqB,EAAA,QAAA,EAE3BA,cAAA,CAACS,oBAAQ,EAAA,EAAC,IAAI,EAAE,EAAE,EAAA,CAAI,EAAA,CACf,EACTT,cAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,MAAK;4CACZ,oBAAoB,CAAC,IAAI,CAAC;4CAC1B,SAAS,CAAC,KAAK,CAAC;wCAClB,CAAC,EACD,SAAS,EAAC,4BAA4B,EACtC,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAC3B,KAAK,EAAC,kBAAkB,EAAA,QAAA,EAExBA,cAAA,CAACU,oBAAQ,EAAA,EAAC,IAAI,EAAE,EAAE,EAAA,CAAI,EAAA,CACf,EACTV,cAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,WAAW,EACpB,SAAS,EAAC,4BAA4B,EACtC,KAAK,EAAC,cAAc,EAAA,QAAA,EAEpBA,eAACW,2BAAe,EAAA,EAAC,IAAI,EAAE,EAAE,EAAA,CAAI,GACtB,EACTX,cAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,SAAS,EAClB,SAAS,EAAC,4BAA4B,EACtC,KAAK,EAAC,YAAY,YAElBA,cAAA,CAACY,yBAAa,EAAA,EAAC,IAAI,EAAE,EAAE,GAAI,EAAA,CACpB,CAAA,EAAA,CACL,CAAA,EAAA,CACF,CAAA,EAAA,CACF,EAENZ,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,yBAAyB,EAAA,QAAA,EACrC,eAAe,CAAC,MAAM,KAAK,CAAC,IAC3BA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAA,mBAAA,EAAA,CAAwB,KAE9D,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,MAC9BE,eAAA,CAAA,KAAA,EAAA,EAEE,SAAS,EAAE,CAAA,qBAAA,EAAwB,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,GAAG,EAAE,CAAA,CAAE,aAE/EA,eAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,6BAA6B,EACvC,OAAO,EAAE,MAAM,cAAc,CAAC,GAAG,CAAC,EAAA,QAAA,EAAA,CAElCA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAAA,CAC/CF,yBAAM,SAAS,EAAC,oCAAoC,EAAA,QAAA,EACjD,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IACtBA,cAAA,CAACQ,wBAAY,EAAA,EAAC,IAAI,EAAE,EAAE,GAAI,KAE1BR,cAAA,CAACa,uBAAW,EAAA,EAAC,IAAI,EAAE,EAAE,EAAA,CAAI,CAC1B,GACI,EACPb,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,0BAA0B,EAAA,QAAA,EAAE,GAAG,EAAA,CAAO,EACpD,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,KAChDA,cAAA,CAAA,MAAA,EAAA,EACE,SAAS,EAAC,0BAA0B,EACpC,KAAK,EAAE;AACL,gDAAA,UAAU,EAAE,wBAAwB;AACpC,gDAAA,KAAK,EAAE,SAAS;AAChB,gDAAA,SAAS,EAAE,MAAM;6CAClB,EACD,KAAK,EAAE,CAAA,EAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,iBAAiB,EAAA,QAAA,EAEnDA,cAAA,CAACc,eAAG,EAAA,EAAC,IAAI,EAAE,EAAE,EAAA,CAAI,GACZ,CACR,EACA,IAAI,CAAC,IAAI,CAAC,YAAY,KACrBd,cAAA,CAAA,MAAA,EAAA,EACE,SAAS,EAAC,0BAA0B,EACpC,KAAK,EAAC,cAAc,YAEpBA,cAAA,CAACe,mBAAO,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,UAAU,EAAA,CAAG,EAAA,CACrC,CACR,CAAA,EAAA,CACG,EACNb,yBAAK,SAAS,EAAC,8BAA8B,EAAA,QAAA,EAAA,CAC3CF,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,4BAA4B,YACzC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAA,CACpB,EACPA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAE,CAAA,4BAAA,EAA+B,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,UAAU,GAAG,EAAE,CAAA,CAAE,EAC/E,OAAO,EAAE,CAAC,CAAC,KAAI;gDACb,CAAC,CAAC,eAAe,EAAE;gDACnB,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AACzC,4CAAA,CAAC,EACD,KAAK,EACH,IAAI,CAAC,IAAI,CAAC;AACR,kDAAE;AACF,kDAAE,0BAA0B,EAAA,QAAA,EAGhCA,cAAA,CAACM,qBAAS,EAAA,EAAC,IAAI,EAAE,EAAE,GAAI,EAAA,CAChB,EACTN,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAE,CAAA,4BAAA,EAA+B,SAAS,KAAK,GAAG,GAAG,QAAQ,GAAG,EAAE,CAAA,CAAE,EAC7E,OAAO,EAAE,CAAC,CAAC,KAAI;gDACb,CAAC,CAAC,eAAe,EAAE;AACnB,gDAAA,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC;AAC7B,4CAAA,CAAC,YAEA,SAAS,KAAK,GAAG,IAChBA,cAAA,CAACc,eAAG,EAAA,EAAC,IAAI,EAAE,EAAE,EAAA,CAAI,KAEjBd,cAAA,CAACgB,mBAAO,EAAA,EAAC,IAAI,EAAE,EAAE,GAAI,CACtB,EAAA,CACM,IACL,CAAA,EAAA,CACF,EAEL,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,KACvBd,yBAAK,SAAS,EAAC,+BAA+B,EAAA,QAAA,EAAA,CAC5CA,yBAAK,SAAS,EAAC,2BAA2B,EAAA,QAAA,EAAA,CACxCA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,2BAA2B,aACxCF,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,OAAO,EAAA,QAAA,EAAA,YAAA,EAAA,CAAkB,EACzCA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,OAAO,EAAA,QAAA,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAA,CAAQ,IAChD,EACNE,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,2BAA2B,aACxCF,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,CAAgB,EACvCA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,OAAO,EAAA,QAAA,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,GAAQ,CAAA,EAAA,CAClD,EACNE,yBAAK,SAAS,EAAC,2BAA2B,EAAA,QAAA,EAAA,CACxCF,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,OAAO,sBAAa,EACpCA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,OAAO,YAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAQ,CAAA,EAAA,CAC/C,CAAA,EAAA,CACF,EACNA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,8BAA8B,EAAA,QAAA,EAC1C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAA,CAChC,CAAA,EAAA,CACF,CACP,EACA,SAAS,KAAK,GAAG,KAChBA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,4BAA4B,EAAA,QAAA,EAAA,SAAA,EAAA,CAAc,CAC1D,CAAA,EAAA,EA/FI,GAAG,CAgGJ,CACP,CAAC,CACH,EAAA,CACG,EAENE,yBAAK,SAAS,EAAC,wBAAwB,EAAA,QAAA,EAAA,CACrCF,cAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,CAAkC,EAClCE,eAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,8BAA8B,EAAA,QAAA,EAAA,CAC3C,eAAe,CAAC,MAAM,cAClB,CAAA,EAAA,CACH,CAAA,EAAA,CACF,CACP;IAED,MAAM,mBAAmB,GACvB,iBAAiB;QACjBH,qBAAY,CACVC,cAAA,CAACiB,2BAAa,EAAA,EACZ,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAK;gBACZ,oBAAoB,CAAC,KAAK,CAAC;gBAC3B,SAAS,CAAC,IAAI,CAAC;AACjB,YAAA,CAAC,GACD,EACF,QAAQ,CAAC,IAAI,CACd;IAEH,QACEf,kDACG;AACC,kBAAE;kBACA,aAAa,IAAI;AACjB,sBAAE;sBACA,aAAa,EAClB,eAAe,EACf,mBAAmB,CAAA,EAAA,CACnB;AAEP;;;;"}
@@ -103,27 +103,18 @@ class StorageAdapter {
103
103
  },
104
104
  onUpdate: ({ key: hkey, next, store }) => {
105
105
  const storageKey = $key || `fracto_flow_${hkey}`;
106
- // Debounce storage writes to avoid blocking the main thread during high-frequency updates
107
- const timerKey = `persist_${storageKey}`;
108
- if (store.debounceTimers.has(timerKey)) {
109
- clearTimeout(store.debounceTimers.get(timerKey));
106
+ const json = JSON.stringify(next);
107
+ if (type === "indexedDB") {
108
+ this.idbSet(storageKey, json);
110
109
  }
111
- const timer = setTimeout(() => {
112
- const json = JSON.stringify(next);
113
- if (type === "indexedDB") {
114
- this.idbSet(storageKey, json);
115
- }
116
- else if (typeof window !== "undefined") {
117
- window[type].setItem(storageKey, json);
118
- }
119
- store.logPluginActivity?.(hkey, {
120
- plugin: "persist",
121
- action: "auto-save",
122
- description: `Automatically synced changes to ${type}`,
123
- });
124
- store.debounceTimers.delete(timerKey);
125
- }, 300); // 300ms debounce
126
- store.debounceTimers.set(timerKey, timer);
110
+ else if (typeof window !== "undefined") {
111
+ window[type].setItem(storageKey, json);
112
+ }
113
+ store.logPluginActivity?.(hkey, {
114
+ plugin: "persist",
115
+ action: "auto-save",
116
+ description: `Automatically synced changes to ${type}`,
117
+ });
127
118
  },
128
119
  getOps: ({ key: hkey, store }) => {
129
120
  const storageKey = $key || `fracto_flow_${hkey}`;
@@ -1 +1 @@
1
- {"version":3,"file":"StorageAdapter.js","sources":["../../../../../src/plugins/storage/StorageAdapter.ts"],"sourcesContent":["/* *****************************************************************************\n * FractoSate\n *\n * ACCESS RESTRICTIONS:\n * - This software is exclusively for use by Authorized Personnel of NEHONIX\n * - Intended for Internal Use only within NEHONIX operations\n * - No rights granted to unauthorized individuals or entities\n * - All modifications are works made for hire assigned to NEHONIX\n *\n * PROHIBITED ACTIVITIES:\n * - Copying, distributing, or sublicensing without written permission\n * - Reverse engineering, decompiling, or disassembling\n * - Creating derivative works without explicit authorization\n * - External use or commercial distribution outside NEHONIX\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * For questions or permissions, contact:\n * NEHONIX Legal Department\n * Email: legal@nehonix.com\n * Website: www.nehonix.com\n ***************************************************************************** */\n\nimport { FlowPlugin } from \"../../types\";\nimport { PersistOptions } from \"../types/pluginTypes\";\n\nexport class StorageAdapter {\n private IDB_NAME = \"FractoVaultDB\";\n private STORE_NAME = \"kvp\"; // kvp = key_value_pairs\n\n private getIDB() {\n return new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(this.IDB_NAME, 1);\n request.onupgradeneeded = () =>\n request.result.createObjectStore(this.STORE_NAME);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n }\n\n private async idbGet(key: string): Promise<any> {\n const db = await this.getIDB();\n return new Promise((resolve) => {\n const req = db\n .transaction(this.STORE_NAME)\n .objectStore(this.STORE_NAME)\n .get(key);\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => resolve(null);\n });\n }\n\n private async idbSet(key: string, value: any): Promise<void> {\n const db = await this.getIDB();\n return new Promise((resolve) => {\n const req = db\n .transaction(this.STORE_NAME, \"readwrite\")\n .objectStore(this.STORE_NAME)\n .put(value, key);\n req.onsuccess = () => resolve();\n });\n }\n\n public persist(\n $key: string | undefined,\n type: PersistOptions[\"storage\"],\n ): FlowPlugin {\n if (!type) throw new Error(\"No storage type provided\");\n\n return {\n name: \"persist\",\n onHydrate: ({ key: hkey, store }) => {\n const storageKey = $key || `fracto_flow_${hkey}`;\n\n // Notify engine of async task\n (store as any).__hydrating__?.add($key);\n\n const done = (val: any) => {\n (store as any).__hydrating__?.delete($key);\n if (val !== undefined) {\n (store as any).logPluginActivity?.(hkey, {\n plugin: \"persist\",\n action: \"hydrate\",\n description: `Auto-restored state from ${type}`,\n data: val,\n });\n }\n return val;\n };\n\n if (type === \"indexedDB\") {\n return this.idbGet(storageKey).then((data) =>\n done(data ? JSON.parse(data) : undefined),\n );\n }\n\n if (typeof window === \"undefined\") return done(undefined);\n const raw = window[type].getItem(storageKey);\n return done(raw ? JSON.parse(raw) : undefined);\n },\n\n onUpdate: ({ key: hkey, next, store }) => {\n const storageKey = $key || `fracto_flow_${hkey}`;\n\n // Debounce storage writes to avoid blocking the main thread during high-frequency updates\n const timerKey = `persist_${storageKey}`;\n if ((store as any).debounceTimers.has(timerKey)) {\n clearTimeout((store as any).debounceTimers.get(timerKey));\n }\n\n const timer = setTimeout(() => {\n const json = JSON.stringify(next);\n if (type === \"indexedDB\") {\n this.idbSet(storageKey, json);\n } else if (typeof window !== \"undefined\") {\n window[type].setItem(storageKey, json);\n }\n\n (store as any).logPluginActivity?.(hkey, {\n plugin: \"persist\",\n action: \"auto-save\",\n description: `Automatically synced changes to ${type}`,\n });\n (store as any).debounceTimers.delete(timerKey);\n }, 300); // 300ms debounce\n\n (store as any).debounceTimers.set(timerKey, timer);\n },\n\n getOps: ({ key: hkey, store }) => {\n const storageKey = $key || `fracto_flow_${hkey}`;\n return {\n clear: () => {\n if (type === \"indexedDB\") {\n this.IDB_NAME &&\n this.getIDB().then((db) => {\n db.transaction(this.STORE_NAME, \"readwrite\")\n .objectStore(this.STORE_NAME)\n .delete(storageKey);\n });\n } else if (typeof window !== \"undefined\") {\n window[type].removeItem(storageKey);\n }\n store.logPluginActivity(hkey, {\n plugin: \"persist\",\n action: \"clear\",\n description: `Cleared ${type} storage for key ${storageKey}`,\n });\n },\n update: () => {\n const current = store.get(hkey, undefined, { bypassClone: true });\n const json = JSON.stringify(current);\n if (type === \"indexedDB\") {\n this.idbSet(storageKey, json);\n } else if (typeof window !== \"undefined\") {\n window[type].setItem(storageKey, json);\n }\n store.logPluginActivity(hkey, {\n plugin: \"persist\",\n action: \"update\",\n description: `Manually pushed current state to ${type}`,\n data: current,\n });\n },\n refresh: async () => {\n let data: any;\n if (type === \"indexedDB\") {\n const raw = await this.idbGet(storageKey);\n data = raw ? JSON.parse(raw) : undefined;\n } else if (typeof window !== \"undefined\") {\n const raw = window[type].getItem(storageKey);\n data = raw ? JSON.parse(raw) : undefined;\n }\n if (data !== undefined) {\n store.set(hkey, data, { force: true, actor: \"persist_refresh\" });\n store.logPluginActivity(hkey, {\n plugin: \"persist\",\n action: \"refresh\",\n description: `Successfully restored state from ${type}`,\n data,\n });\n }\n },\n };\n },\n };\n }\n}\n"],"names":[],"mappings":";;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BiF;MAKpE,cAAc,CAAA;AAA3B,IAAA,WAAA,GAAA;AACU,QAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,UAAA,EAAA;;;;mBAAW;AAAgB,SAAA,CAAA;AAC3B,QAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,YAAA,EAAA;;;;mBAAa;AAAM,SAAA,CAAA,CAAA;IA+J7B;IA7JU,MAAM,GAAA;QACZ,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,KAAI;AAClD,YAAA,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChD,YAAA,OAAO,CAAC,eAAe,GAAG,MACxB,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;AACnD,YAAA,OAAO,CAAC,SAAS,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;AACjD,YAAA,OAAO,CAAC,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;AAC/C,QAAA,CAAC,CAAC;IACJ;IAEQ,MAAM,MAAM,CAAC,GAAW,EAAA;AAC9B,QAAA,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE;AAC9B,QAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;YAC7B,MAAM,GAAG,GAAG;AACT,iBAAA,WAAW,CAAC,IAAI,CAAC,UAAU;AAC3B,iBAAA,WAAW,CAAC,IAAI,CAAC,UAAU;iBAC3B,GAAG,CAAC,GAAG,CAAC;AACX,YAAA,GAAG,CAAC,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;YACzC,GAAG,CAAC,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;AACnC,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,MAAM,MAAM,CAAC,GAAW,EAAE,KAAU,EAAA;AAC1C,QAAA,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE;AAC9B,QAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;YAC7B,MAAM,GAAG,GAAG;AACT,iBAAA,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW;AACxC,iBAAA,WAAW,CAAC,IAAI,CAAC,UAAU;AAC3B,iBAAA,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;YAClB,GAAG,CAAC,SAAS,GAAG,MAAM,OAAO,EAAE;AACjC,QAAA,CAAC,CAAC;IACJ;IAEO,OAAO,CACZ,IAAwB,EACxB,IAA+B,EAAA;AAE/B,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC;QAEtD,OAAO;AACL,YAAA,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAI;AAClC,gBAAA,MAAM,UAAU,GAAG,IAAI,IAAI,CAAA,YAAA,EAAe,IAAI,EAAE;;AAG/C,gBAAA,KAAa,CAAC,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC;AAEvC,gBAAA,MAAM,IAAI,GAAG,CAAC,GAAQ,KAAI;AACvB,oBAAA,KAAa,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC;AAC1C,oBAAA,IAAI,GAAG,KAAK,SAAS,EAAE;AACpB,wBAAA,KAAa,CAAC,iBAAiB,GAAG,IAAI,EAAE;AACvC,4BAAA,MAAM,EAAE,SAAS;AACjB,4BAAA,MAAM,EAAE,SAAS;4BACjB,WAAW,EAAE,CAAA,yBAAA,EAA4B,IAAI,CAAA,CAAE;AAC/C,4BAAA,IAAI,EAAE,GAAG;AACV,yBAAA,CAAC;oBACJ;AACA,oBAAA,OAAO,GAAG;AACZ,gBAAA,CAAC;AAED,gBAAA,IAAI,IAAI,KAAK,WAAW,EAAE;AACxB,oBAAA,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KACvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAC1C;gBACH;gBAEA,IAAI,OAAO,MAAM,KAAK,WAAW;AAAE,oBAAA,OAAO,IAAI,CAAC,SAAS,CAAC;gBACzD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;AAC5C,gBAAA,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;YAChD,CAAC;AAED,YAAA,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAI;AACvC,gBAAA,MAAM,UAAU,GAAG,IAAI,IAAI,CAAA,YAAA,EAAe,IAAI,EAAE;;AAGhD,gBAAA,MAAM,QAAQ,GAAG,CAAA,QAAA,EAAW,UAAU,EAAE;gBACxC,IAAK,KAAa,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;oBAC/C,YAAY,CAAE,KAAa,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC3D;AAEA,gBAAA,MAAM,KAAK,GAAG,UAAU,CAAC,MAAK;oBAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AACjC,oBAAA,IAAI,IAAI,KAAK,WAAW,EAAE;AACxB,wBAAA,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC;oBAC/B;AAAO,yBAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;wBACxC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC;oBACxC;AAEC,oBAAA,KAAa,CAAC,iBAAiB,GAAG,IAAI,EAAE;AACvC,wBAAA,MAAM,EAAE,SAAS;AACjB,wBAAA,MAAM,EAAE,WAAW;wBACnB,WAAW,EAAE,CAAA,gCAAA,EAAmC,IAAI,CAAA,CAAE;AACvD,qBAAA,CAAC;AACD,oBAAA,KAAa,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;AAChD,gBAAA,CAAC,EAAE,GAAG,CAAC,CAAC;gBAEP,KAAa,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC;YACpD,CAAC;YAED,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAI;AAC/B,gBAAA,MAAM,UAAU,GAAG,IAAI,IAAI,CAAA,YAAA,EAAe,IAAI,EAAE;gBAChD,OAAO;oBACL,KAAK,EAAE,MAAK;AACV,wBAAA,IAAI,IAAI,KAAK,WAAW,EAAE;AACxB,4BAAA,IAAI,CAAC,QAAQ;gCACX,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,KAAI;oCACxB,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW;AACxC,yCAAA,WAAW,CAAC,IAAI,CAAC,UAAU;yCAC3B,MAAM,CAAC,UAAU,CAAC;AACvB,gCAAA,CAAC,CAAC;wBACN;AAAO,6BAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;4BACxC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;wBACrC;AACA,wBAAA,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE;AAC5B,4BAAA,MAAM,EAAE,SAAS;AACjB,4BAAA,MAAM,EAAE,OAAO;AACf,4BAAA,WAAW,EAAE,CAAA,QAAA,EAAW,IAAI,CAAA,iBAAA,EAAoB,UAAU,CAAA,CAAE;AAC7D,yBAAA,CAAC;oBACJ,CAAC;oBACD,MAAM,EAAE,MAAK;AACX,wBAAA,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;wBACjE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;AACpC,wBAAA,IAAI,IAAI,KAAK,WAAW,EAAE;AACxB,4BAAA,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC;wBAC/B;AAAO,6BAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;4BACxC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC;wBACxC;AACA,wBAAA,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE;AAC5B,4BAAA,MAAM,EAAE,SAAS;AACjB,4BAAA,MAAM,EAAE,QAAQ;4BAChB,WAAW,EAAE,CAAA,iCAAA,EAAoC,IAAI,CAAA,CAAE;AACvD,4BAAA,IAAI,EAAE,OAAO;AACd,yBAAA,CAAC;oBACJ,CAAC;oBACD,OAAO,EAAE,YAAW;AAClB,wBAAA,IAAI,IAAS;AACb,wBAAA,IAAI,IAAI,KAAK,WAAW,EAAE;4BACxB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;AACzC,4BAAA,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS;wBAC1C;AAAO,6BAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;4BACxC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;AAC5C,4BAAA,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS;wBAC1C;AACA,wBAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AACtB,4BAAA,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;AAChE,4BAAA,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE;AAC5B,gCAAA,MAAM,EAAE,SAAS;AACjB,gCAAA,MAAM,EAAE,SAAS;gCACjB,WAAW,EAAE,CAAA,iCAAA,EAAoC,IAAI,CAAA,CAAE;gCACvD,IAAI;AACL,6BAAA,CAAC;wBACJ;oBACF,CAAC;iBACF;YACH,CAAC;SACF;IACH;AACD;;;;"}
1
+ {"version":3,"file":"StorageAdapter.js","sources":["../../../../../src/plugins/storage/StorageAdapter.ts"],"sourcesContent":["/* *****************************************************************************\n * FractoSate\n *\n * ACCESS RESTRICTIONS:\n * - This software is exclusively for use by Authorized Personnel of NEHONIX\n * - Intended for Internal Use only within NEHONIX operations\n * - No rights granted to unauthorized individuals or entities\n * - All modifications are works made for hire assigned to NEHONIX\n *\n * PROHIBITED ACTIVITIES:\n * - Copying, distributing, or sublicensing without written permission\n * - Reverse engineering, decompiling, or disassembling\n * - Creating derivative works without explicit authorization\n * - External use or commercial distribution outside NEHONIX\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * For questions or permissions, contact:\n * NEHONIX Legal Department\n * Email: legal@nehonix.com\n * Website: www.nehonix.com\n ***************************************************************************** */\n\nimport { FlowPlugin } from \"../../types\";\nimport { PersistOptions } from \"../types/pluginTypes\";\n\nexport class StorageAdapter {\n private IDB_NAME = \"FractoVaultDB\";\n private STORE_NAME = \"kvp\"; // kvp = key_value_pairs\n\n private getIDB() {\n return new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(this.IDB_NAME, 1);\n request.onupgradeneeded = () =>\n request.result.createObjectStore(this.STORE_NAME);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n }\n\n private async idbGet(key: string): Promise<any> {\n const db = await this.getIDB();\n return new Promise((resolve) => {\n const req = db\n .transaction(this.STORE_NAME)\n .objectStore(this.STORE_NAME)\n .get(key);\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => resolve(null);\n });\n }\n\n private async idbSet(key: string, value: any): Promise<void> {\n const db = await this.getIDB();\n return new Promise((resolve) => {\n const req = db\n .transaction(this.STORE_NAME, \"readwrite\")\n .objectStore(this.STORE_NAME)\n .put(value, key);\n req.onsuccess = () => resolve();\n });\n }\n\n public persist(\n $key: string | undefined,\n type: PersistOptions[\"storage\"],\n ): FlowPlugin {\n if (!type) throw new Error(\"No storage type provided\");\n\n return {\n name: \"persist\",\n onHydrate: ({ key: hkey, store }) => {\n const storageKey = $key || `fracto_flow_${hkey}`;\n\n // Notify engine of async task\n (store as any).__hydrating__?.add($key);\n\n const done = (val: any) => {\n (store as any).__hydrating__?.delete($key);\n if (val !== undefined) {\n (store as any).logPluginActivity?.(hkey, {\n plugin: \"persist\",\n action: \"hydrate\",\n description: `Auto-restored state from ${type}`,\n data: val,\n });\n }\n return val;\n };\n\n if (type === \"indexedDB\") {\n return this.idbGet(storageKey).then((data) =>\n done(data ? JSON.parse(data) : undefined),\n );\n }\n\n if (typeof window === \"undefined\") return done(undefined);\n const raw = window[type].getItem(storageKey);\n return done(raw ? JSON.parse(raw) : undefined);\n },\n\n onUpdate: ({ key: hkey, next, store }) => {\n const storageKey = $key || `fracto_flow_${hkey}`;\n const json = JSON.stringify(next);\n\n if (type === \"indexedDB\") {\n this.idbSet(storageKey, json);\n } else if (typeof window !== \"undefined\") {\n window[type].setItem(storageKey, json);\n }\n\n (store as any).logPluginActivity?.(hkey, {\n plugin: \"persist\",\n action: \"auto-save\",\n description: `Automatically synced changes to ${type}`,\n });\n },\n\n getOps: ({ key: hkey, store }) => {\n const storageKey = $key || `fracto_flow_${hkey}`;\n return {\n clear: () => {\n if (type === \"indexedDB\") {\n this.IDB_NAME &&\n this.getIDB().then((db) => {\n db.transaction(this.STORE_NAME, \"readwrite\")\n .objectStore(this.STORE_NAME)\n .delete(storageKey);\n });\n } else if (typeof window !== \"undefined\") {\n window[type].removeItem(storageKey);\n }\n store.logPluginActivity(hkey, {\n plugin: \"persist\",\n action: \"clear\",\n description: `Cleared ${type} storage for key ${storageKey}`,\n });\n },\n update: () => {\n const current = store.get(hkey, undefined, { bypassClone: true });\n const json = JSON.stringify(current);\n if (type === \"indexedDB\") {\n this.idbSet(storageKey, json);\n } else if (typeof window !== \"undefined\") {\n window[type].setItem(storageKey, json);\n }\n store.logPluginActivity(hkey, {\n plugin: \"persist\",\n action: \"update\",\n description: `Manually pushed current state to ${type}`,\n data: current,\n });\n },\n refresh: async () => {\n let data: any;\n if (type === \"indexedDB\") {\n const raw = await this.idbGet(storageKey);\n data = raw ? JSON.parse(raw) : undefined;\n } else if (typeof window !== \"undefined\") {\n const raw = window[type].getItem(storageKey);\n data = raw ? JSON.parse(raw) : undefined;\n }\n if (data !== undefined) {\n store.set(hkey, data, { force: true, actor: \"persist_refresh\" });\n store.logPluginActivity(hkey, {\n plugin: \"persist\",\n action: \"refresh\",\n description: `Successfully restored state from ${type}`,\n data,\n });\n }\n },\n };\n },\n };\n }\n}\n"],"names":[],"mappings":"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"}