memorio 4.9.30 → 4.9.31
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/AGENTS.md +126 -126
- package/README.md +239 -163
- package/examples/cross-platform-guards.ts +57 -57
- package/examples/multi-tenant-context.ts +44 -44
- package/examples/react-observer.tsx +63 -63
- package/examples/semantic-memory.ts +60 -60
- package/examples/sqlite-batched-writes.ts +57 -57
- package/index.cjs +1 -1
- package/index.js +1 -1
- package/llms.txt +1 -1
- package/modules/redux.cjs.map +1 -1
- package/modules/redux.js.map +1 -1
- package/package.json +1 -1
package/modules/redux.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../node_modules/tsup/assets/esm_shims.js","../../core/internal.ts","../../core/env.ts","../../functions/message/index.ts","../../core/platform.ts","../../functions/idb/tools/db.create.ts","../../functions/idb/tools/db.list.ts","../../functions/idb/tools/db.exist.ts","../../functions/idb/tools/db.quota.ts","../../functions/idb/tools/db.delete.ts","../../functions/idb/tools/db.size.ts","../../functions/idb/tools/db.version.ts","../../functions/idb/tools/db.support.ts","../../functions/idb/tools/table.create.ts","../../functions/idb/tools/table.size.ts","../../functions/idb/crud/data.delete.ts","../../functions/idb/crud/data.set.ts","../../functions/idb/crud/data.get.ts","../../functions/idb/index.ts","../../modules/redux.ts","../../adapters/redux/index.ts","../../adapters/redux/middleware.ts","../../adapters/redux/selectors.ts","../../adapters/redux/persist.ts","../../functions/memory/index.ts","../../functions/state/index.ts","../../core/dispatch.ts","../../functions/schema/index.ts","../../functions/store/index.ts","../../functions/session/index.ts","../../core/hlc.ts","../../functions/memory/journal.ts","../../adapters/redux/hydration.ts","../../adapters/redux/bridge.ts"],"names":["store","resolve","state","schema","path","_fallbackStorageByContext","_getFallbackStorage","_hasStorage","_getPrefix","_prefixKey","_read","_write","_remove","now","hlc","isSyncEnabled","tombstone"],"mappings":"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","file":"redux.js","sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\r\n * MEMORIO INTERNAL STATE\r\n *\r\n * Module-local reactive/internal state for Memorio.\r\n * This replaces the previous practice of storing internal flags on\r\n * `globalThis.memorio.*`. Modules import this singleton instead of\r\n * reaching into the global object.\r\n *\r\n * `core/global.ts` is the ONLY place that publishes values to the\r\n * public `globalThis.memorio` namespace, at the very end of bootstrap.\r\n */\r\n\r\n/**\r\n * A single recorded state mutation for the trace / undo / redo system.\r\n */\r\nexport interface MutationRecord {\r\n /** State path in dotted notation (e.g. 'user.name'). */\r\n path: string\r\n /** 'set' or 'delete'. */\r\n action: 'set' | 'delete'\r\n /** The new value (for 'set') or undefined (for 'delete'). */\r\n newValue: any\r\n /** The previous value before the mutation. */\r\n previousValue: any\r\n /** Epoch timestamp (ms) of the mutation. */\r\n timestamp: number\r\n}\r\n\r\n/**\r\n * A snapshot is a deep clone of the entire state tree at a point in time.\r\n */\r\nexport type Snapshot = Record<string, any>\r\n\r\ninterface InternalState {\r\n debug: boolean\r\n tracking: boolean\r\n trackedPaths: Set<string>\r\n locked: boolean\r\n lastAccessedPath: string\r\n stateVersion: number\r\n currentContext: string | null\r\n /** Log of all recorded mutations (for trace / event sourcing). */\r\n mutations: MutationRecord[]\r\n /** Stack of mutations available to undo. */\r\n undoStack: MutationRecord[]\r\n /** Stack of mutations available to redo. */\r\n redoStack: MutationRecord[]\r\n /** Maximum number of mutations retained per stack. */\r\n maxHistory: number\r\n /** Whether history tracking is active. */\r\n historyEnabled: boolean\r\n}\r\n\r\n// Singleton across ESM/CJS/module-duplication boundaries.\r\n// When the same code is loaded via multiple paths (e.g. ESM import\r\n// \"dist/index.js\" + CJS require of \"memorio\"), each path gets its own\r\n// module instance. Storing the state on globalThis guarantees every instance\r\n// reads/writes the same shared state.\r\nconst INTERNAL_KEY = '__memorio_internal_state'\r\nconst state: InternalState = (globalThis as any)[INTERNAL_KEY] || {\r\n debug: false,\r\n tracking: false,\r\n trackedPaths: new Set<string>(),\r\n locked: false,\r\n lastAccessedPath: '',\r\n stateVersion: 0,\r\n currentContext: null,\r\n mutations: [],\r\n undoStack: [],\r\n redoStack: [],\r\n maxHistory: 100,\r\n historyEnabled: false\r\n}\r\nif (!(globalThis as any)[INTERNAL_KEY]) {\r\n (globalThis as any)[INTERNAL_KEY] = state\r\n}\r\n\r\nexport const internal = {\r\n get debug(): boolean {\r\n return state.debug\r\n },\r\n set debug(value: boolean) {\r\n state.debug = value\r\n },\r\n\r\n get tracking(): boolean {\r\n return state.tracking\r\n },\r\n set tracking(value: boolean) {\r\n state.tracking = value\r\n },\r\n\r\n get trackedPaths(): Set<string> {\r\n return state.trackedPaths\r\n },\r\n clearTrackedPaths(): void {\r\n state.trackedPaths.clear()\r\n },\r\n\r\n get locked(): boolean {\r\n return state.locked\r\n },\r\n set locked(value: boolean) {\r\n state.locked = value\r\n },\r\n\r\n get lastAccessedPath(): string {\r\n return state.lastAccessedPath\r\n },\r\n set lastAccessedPath(value: string) {\r\n state.lastAccessedPath = value\r\n },\r\n\r\n get stateVersion(): number {\r\n return state.stateVersion\r\n },\r\n bumpStateVersion(): number {\r\n state.stateVersion = (state.stateVersion || 0) + 1\r\n return state.stateVersion\r\n },\r\n\r\n get currentContext(): string | null {\r\n return state.currentContext\r\n },\r\n set currentContext(value: string | null) {\r\n state.currentContext = value\r\n },\r\n\r\n get mutations(): MutationRecord[] {\r\n return state.mutations\r\n },\r\n get undoStack(): MutationRecord[] {\r\n return state.undoStack\r\n },\r\n get redoStack(): MutationRecord[] {\r\n return state.redoStack\r\n },\r\n get maxHistory(): number {\r\n return state.maxHistory\r\n },\r\n set maxHistory(value: number) {\r\n state.maxHistory = value\r\n },\r\n get historyEnabled(): boolean {\r\n return state.historyEnabled\r\n },\r\n set historyEnabled(value: boolean) {\r\n state.historyEnabled = value\r\n },\r\n\r\n /**\r\n * Records a mutation in the trace log and undo/redo stacks.\r\n * Called by the state proxy's callback.\r\n */\r\n recordMutation(record: MutationRecord): void {\r\n if (!state.historyEnabled) return\r\n\r\n // Append to the trace log (mutations), trimmed to maxHistory\r\n state.mutations.push(record)\r\n if (state.mutations.length > state.maxHistory) {\r\n state.mutations.shift()\r\n }\r\n\r\n // Push to undo stack, trimmed to maxHistory\r\n state.undoStack.push(record)\r\n if (state.undoStack.length > state.maxHistory) {\r\n state.undoStack.shift()\r\n }\r\n\r\n // Clear redo stack on any new mutation\r\n state.redoStack = []\r\n },\r\n\r\n /**\r\n * Pops a record from the undo stack and pushes to redo stack.\r\n * Returns the record or undefined if empty.\r\n */\r\n popUndo(): MutationRecord | undefined {\r\n const record = state.undoStack.pop()\r\n if (record) {\r\n state.redoStack.push(record)\r\n }\r\n return record\r\n },\r\n\r\n /**\r\n * Pops a record from the redo stack and pushes to undo stack.\r\n * Returns the record or undefined if empty.\r\n */\r\n popRedo(): MutationRecord | undefined {\r\n const record = state.redoStack.pop()\r\n if (record) {\r\n state.undoStack.push(record)\r\n }\r\n return record\r\n },\r\n\r\n canUndo(): boolean {\r\n return state.undoStack.length > 0\r\n },\r\n\r\n canRedo(): boolean {\r\n return state.redoStack.length > 0\r\n },\r\n\r\n clearHistory(): void {\r\n state.mutations = []\r\n state.undoStack = []\r\n state.redoStack = []\r\n },\r\n\r\n clearRedo(): void {\r\n state.redoStack = []\r\n }\r\n}\r\n\r\n/**\r\n * Protected property names that cannot be used as state keys.\r\n * These are reserved for internal memorio functionality.\r\n */\r\nexport const protect = [\r\n 'list',\r\n 'state',\r\n 'store',\r\n 'idb',\r\n 'sqlite',\r\n 'observer',\r\n 'useObserver',\r\n 'remove',\r\n 'removeAll',\r\n // Platform-related protected keys\r\n '_platform',\r\n '_capabilities',\r\n '_sessionId'\r\n]\r\n\r\n/**\r\n * Extracts a property name from a container/arrow function.\r\n * Used by useObserver to resolve functional deps like `() => state.test`.\r\n * @param container The container (optional, often the function itself)\r\n * @param object The function or string to extract the property name from\r\n */\r\nexport const propertyName = (container: any, object?: any): string | null => {\r\n const target = object !== undefined ? object : container\r\n return String(target).replace('() => ', '')\r\n}\r\n\r\nexport default internal\r\n","/**\r\n * Runtime environment detection.\r\n *\r\n * `DEV` / `PROD` are determined at RUNTIME via `process.env.NODE_ENV`\r\n * (polyfilled by Vite/Webpack in browsers). No build-time environment\r\n * define is required - Memorios auto-detects the environment.\r\n *\r\n * In a Vite dev server: `process.env.NODE_ENV === 'development'` → `DEV = true`\r\n * In a Vite prod build: `process.env.NODE_ENV === 'production'` → `DEV = false`\r\n * In Node.js: `process.env.NODE_ENV` controls the flag.\r\n * In a raw browser (no bundler): defaults to `true` (assumed dev).\r\n *\r\n * @module memorio/env\r\n */\r\n\r\nexport const DEV: boolean =\r\n typeof process !== 'undefined'\r\n ? process.env?.NODE_ENV !== 'production'\r\n : true\r\n\r\nexport const PROD: boolean = !DEV\r\n","import internal from '../../core/internal'\r\nimport { DEV } from '../../core/env'\r\n\r\n/**\r\n * Internal debug logger.\r\n * Prints only when `memorio.debug` is enabled.\r\n * @param args Values to log via console.debug.\r\n */\r\nexport const message = (...args: unknown[]): void => {\r\n if (DEV && internal.debug === true) {\r\n console.debug(...args)\r\n }\r\n}\r\n\r\nexport default message\r\n","/**\r\n * MEMORIO PLATFORM COMPATIBILITY LAYER\r\n *\r\n * This module provides cross-platform compatibility for Memorio.\r\n * It detects the runtime environment and provides polyfills for\r\n * browser-only APIs when running in Node.js, Deno, or edge workers.\r\n *\r\n * Platform Detection:\r\n * - Browser (window, document, sessionStorage, localStorage)\r\n * - Node.js (process, Buffer, module)\r\n * - Deno (Deno namespace)\r\n * - Edge Workers (globalThis, service worker context)\r\n *\r\n * Session Isolation:\r\n * - Each session gets its own isolated state namespace\r\n * - Prevents state leakage between different requests/contexts\r\n *\r\n * @module memorio/platform\r\n */\r\n\r\nimport internal from './internal'\r\n\r\n/**\r\n * Platform detection types\r\n */\r\nexport type Platform = 'browser' | 'node' | 'deno' | 'edge' | 'unknown'\r\n\r\n/**\r\n * Environment capabilities\r\n */\r\nexport interface PlatformCapabilities {\r\n platform: Platform\r\n hasSessionStorage: boolean\r\n hasLocalStorage: boolean\r\n hasIndexedDB: boolean\r\n hasSqlJs: boolean\r\n hasDispatchEvent: boolean\r\n hasNavigator: boolean\r\n hasProcess: boolean\r\n isSecureContext: boolean\r\n sessionId: string\r\n}\r\n\r\n/**\r\n * Generate a unique session identifier for isolation\r\n * Uses crypto.getRandomValues for secure random generation\r\n */\r\nexport function generateSessionId(): string {\r\n const anyGlobal = globalThis as any\r\n if (typeof anyGlobal.crypto !== 'undefined' && anyGlobal.crypto.randomUUID) {\r\n return anyGlobal.crypto.randomUUID()\r\n }\r\n\r\n // Fallback: Use crypto.getRandomValues for secure random\r\n if (typeof anyGlobal.crypto !== 'undefined' && anyGlobal.crypto.getRandomValues) {\r\n const array = new Uint8Array(16)\r\n anyGlobal.crypto.getRandomValues(array)\r\n return Array.from(array, b => b.toString(16).padStart(2, '0')).join('')\r\n }\r\n\r\n // Last resort fallback (less secure)\r\n return `session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`\r\n}\r\n\r\n/**\r\n * Get the current platform\r\n */\r\nexport function detectPlatform(): Platform {\r\n // Deno check - use globalThis to avoid direct reference\r\n const globalAny = globalThis as any\r\n if (globalAny.Deno && globalAny.Deno.version) {\r\n return 'deno'\r\n }\r\n\r\n // Node.js check\r\n if (typeof process !== 'undefined' && process.versions && process.versions.node) {\r\n return 'node'\r\n }\r\n\r\n // Edge worker check (service worker context)\r\n if (typeof globalThis !== 'undefined' &&\r\n typeof (globalThis as any).ServiceWorkerGlobalScope !== 'undefined') {\r\n return 'edge'\r\n }\r\n\r\n // Browser check (has window and document)\r\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\r\n return 'browser'\r\n }\r\n\r\n return 'unknown'\r\n}\r\n\r\n/**\r\n * Check if we're in a browser environment\r\n */\r\nexport function isBrowser(): boolean {\r\n const platform = detectPlatform()\r\n return platform === 'browser'\r\n}\r\n\r\n/**\r\n * Check if we're in Node.js\r\n */\r\nexport function isNode(): boolean {\r\n const platform = detectPlatform()\r\n return platform === 'node'\r\n}\r\n\r\n/**\r\n * Check if we're in Deno\r\n */\r\nexport function isDeno(): boolean {\r\n const platform = detectPlatform()\r\n return platform === 'deno'\r\n}\r\n\r\n/**\r\n * Check if we're in an edge worker\r\n */\r\nexport function isEdge(): boolean {\r\n const platform = detectPlatform()\r\n return platform === 'edge'\r\n}\r\n\r\n/**\r\n * Get session storage polyfill or native\r\n */\r\nexport function getSessionStorage(): Storage | null {\r\n // Try native first\r\n try {\r\n if (typeof sessionStorage !== 'undefined') {\r\n // Test if it's actually usable\r\n const testKey = '__memorio_test__'\r\n sessionStorage.setItem(testKey, '1')\r\n sessionStorage.removeItem(testKey)\r\n return sessionStorage\r\n }\r\n } catch (_) {\r\n // Not available or disabled\r\n }\r\n\r\n // Return null for non-browser environments\r\n // Caller should handle this case\r\n return null\r\n}\r\n\r\n/**\r\n * Get local storage polyfill or native\r\n */\r\nexport function getLocalStorage(): Storage | null {\r\n try {\r\n if (typeof localStorage !== 'undefined') {\r\n const testKey = '__memorio_test__'\r\n localStorage.setItem(testKey, '1')\r\n localStorage.removeItem(testKey)\r\n return localStorage\r\n }\r\n } catch (_) {\r\n // Not available or disabled\r\n }\r\n return null\r\n}\r\n\r\n/**\r\n * Check IndexedDB support\r\n */\r\nexport function hasIndexedDB(): boolean {\r\n if (typeof indexedDB !== 'undefined') {\r\n return true\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * Check SQLite (sql.js) support.\r\n *\r\n * sql.js runs SQLite compiled to WebAssembly in the browser. This returns\r\n * `true` only in browser-like environments with WebAssembly support, mirroring\r\n * the client-only nature of the `idb` module. In Node.js/Deno the `sqlite`\r\n * module stays disabled; use `store` or `session` for persistence there.\r\n */\r\nexport function hasSqlJs(): boolean {\r\n const anyGlobal = globalThis as any\r\n if (typeof anyGlobal.WebAssembly === 'undefined' || typeof anyGlobal.WebAssembly.instantiate !== 'function') {\r\n return false\r\n }\r\n return typeof anyGlobal.window !== 'undefined'\r\n}\r\n\r\n/**\r\n * Check dispatchEvent support\r\n */\r\nexport function hasDispatchEvent(): boolean {\r\n return typeof globalThis.dispatchEvent === 'function'\r\n}\r\n\r\n/**\r\n * Get platform capabilities\r\n */\r\nexport function getCapabilities(): PlatformCapabilities {\r\n const platform = detectPlatform()\r\n const isSecure = typeof (globalThis as any).isSecureContext !== 'undefined'\r\n ? (globalThis as any).isSecureContext\r\n : platform === 'browser'\r\n\r\n return {\r\n platform,\r\n hasSessionStorage: getSessionStorage() !== null,\r\n hasLocalStorage: getLocalStorage() !== null,\r\n hasIndexedDB: hasIndexedDB(),\r\n hasSqlJs: hasSqlJs(),\r\n hasDispatchEvent: hasDispatchEvent(),\r\n hasNavigator: typeof navigator !== 'undefined',\r\n hasProcess: typeof process !== 'undefined',\r\n isSecureContext: isSecure,\r\n sessionId: generateSessionId()\r\n }\r\n}\r\n\r\n// Internal event listener storage for polyfill\r\nconst _eventListenerStorage: Map<string, Function[]> = new Map()\r\n\r\n/**\r\n * Initialize platform polyfills for globalThis\r\n * This ensures Memorio works in all environments\r\n */\r\nexport function initializePlatform(): void {\r\n const capabilities = getCapabilities()\r\n\r\n // Platform info is published onto the public `memorio` object by\r\n // core/global.ts at the end of bootstrap. No globalThis.memorio writes here.\r\n\r\n const anyGlobal = globalThis as any\r\n // as they don't make sense in server-side contexts\r\n // But we ensure the APIs exist to prevent crashes\r\n\r\n if (!capabilities.hasDispatchEvent) {\r\n // Polyfill dispatchEvent for environments that don't have it\r\n anyGlobal.dispatchEvent = function (_event: Event): boolean {\r\n return true // No-op for non-browser environments\r\n }\r\n\r\n // Polyfill CustomEvent\r\n if (typeof CustomEvent === 'undefined') {\r\n anyGlobal.CustomEvent = class CustomEvent {\r\n type: string\r\n detail: any\r\n constructor(type: string, detail: any = {}) {\r\n this.type = type\r\n this.detail = detail\r\n }\r\n }\r\n }\r\n }\r\n\r\n // AddEventListener is typically available in Node.js via EventEmitter\r\n // but we ensure it's there for compatibility\r\n if (typeof anyGlobal.addEventListener !== 'function') {\r\n anyGlobal.addEventListener = function (type: string, listener: Function): void {\r\n if (!_eventListenerStorage.has(type)) {\r\n _eventListenerStorage.set(type, [])\r\n }\r\n _eventListenerStorage.get(type)!.push(listener)\r\n }\r\n\r\n anyGlobal.removeEventListener = function (type: string, listener: Function): void {\r\n const listeners = _eventListenerStorage.get(type)\r\n if (listeners) {\r\n const index = listeners.indexOf(listener)\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n }\r\n }\r\n\r\n anyGlobal.dispatchEvent = function (event: Event): boolean {\r\n const listeners = _eventListenerStorage.get(event.type)\r\n if (listeners) {\r\n listeners.forEach(listener => {\r\n try {\r\n listener(event)\r\n } catch (e) {\r\n console.error('Event listener error:', e)\r\n }\r\n })\r\n }\r\n return true\r\n }\r\n }\r\n}\r\n\r\n\r\n// Export for use in other modules\r\nexport default {\r\n detectPlatform,\r\n isBrowser,\r\n isNode,\r\n isDeno,\r\n isEdge,\r\n getCapabilities,\r\n initializePlatform,\r\n getSessionStorage,\r\n getLocalStorage,\r\n hasIndexedDB,\r\n hasSqlJs,\r\n hasDispatchEvent\r\n}\r\n\r\n// ============================================\r\n// CONTEXT ISOLATION SYSTEM\r\n// ============================================\r\n\r\n/**\r\n * Internal storage for isolated contexts (singleton across module instances).\r\n */\r\nconst CONTEXTS_KEY = '__memorio_contexts__'\r\nconst _contexts: Map<string, any> = (globalThis as any)[CONTEXTS_KEY] || new Map<string, any>()\r\nif (!(globalThis as any)[CONTEXTS_KEY]) {\r\n (globalThis as any)[CONTEXTS_KEY] = _contexts\r\n}\r\n\r\n/**\r\n * Create a new isolated context for state management\r\n * Useful for multi-tenant server-side applications\r\n *\r\n * @param name Optional context name/identifier\r\n * @returns Object with isolated state, store, session, cache\r\n */\r\nexport function createContext(name?: string): {\r\n id: string\r\n state: any\r\n store: any\r\n session: any\r\n cache: any\r\n} {\r\n const contextId = name || `context_${generateSessionId()}`\r\n\r\n // Set this context as current for prefix resolution in store/session modules\r\n setCurrentContext(contextId)\r\n\r\n // Create isolated storage for this context\r\n const contextStorage = {\r\n state: {},\r\n store: new Map<string, string>(),\r\n session: new Map<string, string>(),\r\n cache: new Map<string, any>()\r\n }\r\n\r\n _contexts.set(contextId, contextStorage)\r\n\r\n // Return context with isolated data\r\n return {\r\n id: contextId,\r\n state: contextStorage.state,\r\n store: {\r\n get: (key: string) => {\r\n const data = contextStorage.store.get(key)\r\n return data ? JSON.parse(data) : null\r\n },\r\n set: (key: string, value: any) => {\r\n contextStorage.store.set(key, JSON.stringify(value))\r\n },\r\n remove: (key: string) => contextStorage.store.delete(key),\r\n removeAll: () => contextStorage.store.clear(),\r\n clearAll: () => contextStorage.store.clear(),\r\n size: () => contextStorage.store.size,\r\n isPersistent: false\r\n },\r\n session: {\r\n get: (key: string) => {\r\n const data = contextStorage.session.get(key)\r\n return data ? JSON.parse(data) : null\r\n },\r\n set: (key: string, value: any) => {\r\n contextStorage.session.set(key, JSON.stringify(value))\r\n },\r\n remove: (key: string) => contextStorage.session.delete(key),\r\n removeAll: () => contextStorage.session.clear(),\r\n clearAll: () => contextStorage.session.clear(),\r\n size: () => contextStorage.session.size,\r\n isPersistent: false\r\n },\r\n cache: {\r\n get: (key: string) => contextStorage.cache.get(key),\r\n set: (key: string, value: any) => contextStorage.cache.set(key, value),\r\n remove: (key: string) => contextStorage.cache.delete(key),\r\n removeAll: () => contextStorage.cache.clear(),\r\n clear: () => contextStorage.cache.clear()\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Get all existing context IDs\r\n */\r\nexport function listContexts(): string[] {\r\n return Array.from(_contexts.keys())\r\n}\r\n\r\n/**\r\n * Delete a context\r\n */\r\nexport function deleteContext(id: string): boolean {\r\n return _contexts.delete(id)\r\n}\r\n\r\n/**\r\n * Get current context (for server-side request isolation)\r\n */\r\nexport function getCurrentContext(): string | null {\r\n return internal.currentContext\r\n}\r\n\r\n/**\r\n * Set current context (for server-side request isolation)\r\n */\r\nexport function setCurrentContext(id: string): void {\r\n internal.currentContext = id\r\n}\r\n","import { idb } from '../index'\r\nimport message from '../../message'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\n/**\r\n * Creates a new IndexedDB database.\r\n * @param dbName Name of the database.\r\n * @param ver Version of the database.\r\n * @returns Promise that resolves with the database instance.\r\n */\r\nidb.db.create = (dbName: string, ver: number = 1): Promise<IDBDatabase> => {\r\n\r\n return new Promise((resolve, reject) => {\r\n\r\n if (!idb.db.support()) {\r\n return reject(new Error(\"IndexedDB not supported\"))\r\n }\r\n\r\n const request = globalThis.indexedDB.open(dbName, ver)\r\n\r\n request.onerror = () => {\r\n message(`IndexedDB error: ${request.error?.message}`)\r\n reject(request.error)\r\n }\r\n\r\n request.onsuccess = () => {\r\n message(`Database ${dbName} connected successfully`)\r\n // idb.db.list()\r\n resolve(request.result)\r\n }\r\n\r\n request.onupgradeneeded = () => {\r\n message(`Database ${dbName} upgrade/creation initiated`)\r\n }\r\n })\r\n}\r\n\r\nexport { }\r\n\r\n\r\n","import { idb } from '../index'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\n/**\r\n * Updates the global list of databases.\r\n * @returns Promise resolving with the databases list.\r\n */\r\nidb.db.list = async (): Promise<any[]> => {\r\n\r\n if (!(\"indexedDB\" in globalThis) || !indexedDB.databases) return []\r\n\r\n try {\r\n const result = await indexedDB.databases()\r\n globalThis.idbases = result || []\r\n await idb.db.size()\r\n return globalThis.idbases\r\n } catch (err) {\r\n console.error(\"Error listing databases:\", err)\r\n return []\r\n }\r\n}\r\n\r\n// Initial sync\r\n// idb.db.list()\r\n\r\nexport { }\r\n\r\n","import { idb } from '../index'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\n/**\r\n * Checks if a database exists in the tracked list.\r\n */\r\nidb.db.exist = (storeName: string): boolean => {\r\n return idbases?.some((db: any) => db.name === storeName)\r\n}\r\n\r\nexport { }\r\n\r\n","import { idb } from '../index'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\nidb.db.quota = () => {\r\n return navigator.storage.estimate()\r\n}\r\n\r\nexport { }\r\n\r\n","import { idb } from '../index'\r\nimport message from '../../message'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\n/**\r\n * Deletes an IndexedDB database.\r\n * @param storeName Name of the database to remove.\r\n */\r\nidb.db.delete = (storeName: string): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n message(`Removing database ${storeName}...`)\r\n\r\n const performDelete = () => {\r\n const request = indexedDB.deleteDatabase(storeName)\r\n\r\n request.onsuccess = () => {\r\n message(`${storeName} database removed successfully`)\r\n idb.db.list()\r\n resolve()\r\n }\r\n\r\n request.onerror = () => {\r\n console.error(`Error removing ${storeName}:`, request.error)\r\n reject(request.error)\r\n }\r\n\r\n request.onblocked = () => {\r\n console.warn(`Deletion of ${storeName} is blocked. Please close other tabs.`)\r\n }\r\n }\r\n\r\n // WARNING: Deleting a database is destructive and cannot be undone.\r\n // The confirm() call is intentionally removed for library usage.\r\n // Consumers should implement their own confirmation logic.\r\n performDelete()\r\n })\r\n}\r\n\r\nexport { }\r\n\r\n\r\n","import { idb } from '../index'\r\nimport message from '../../message'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\n/**\r\n * Updates the size information for all tracked databases.\r\n */\r\nidb.db.size = async (): Promise<void> => {\r\n if (!idbases || idbases.length === 0) return\r\n\r\n for (let i = 0; i < idbases.length; i++) {\r\n const dbInfo = idbases[i]\r\n try {\r\n const db = await idb.db.create(dbInfo.name, dbInfo.version)\r\n const tableNames = Array.from(db.objectStoreNames)\r\n\r\n let totalDbSize = 0\r\n for (const tableName of tableNames) {\r\n const tableSize = await idb.table.size(db, tableName)\r\n totalDbSize += tableSize\r\n }\r\n\r\n dbInfo.size = totalDbSize\r\n db.close()\r\n } catch (err) {\r\n message(`Could not calculate size for ${dbInfo.name}:${err}`)\r\n }\r\n }\r\n}\r\n\r\nexport { }\r\n\r\n\r\n","import { idb } from '../index'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\nidb.db.version = (storeName: string) => {\r\n let idbVer = 0\r\n for (const v of idbases) {\r\n if (v.name === storeName) idbVer = v.version\r\n break\r\n }\r\n return idbVer\r\n}\r\n\r\nexport { }\r\n\r\n","import { idb } from '../index'\r\nimport message from '../../message'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\n/**\r\n * Checks if IndexedDB is supported in the current environment.\r\n */\r\nidb.db.support = (): boolean => {\r\n const isSupported = \"indexedDB\" in globalThis\r\n if (!isSupported) {\r\n message(\"Your environment doesn't support IndexedDB\")\r\n }\r\n return isSupported\r\n}\r\n\r\nexport { }\r\n\r\n\r\n","import { idb } from '../index'\r\nimport message from '../../message'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\n/**\r\n * Creates a new object store in the specified database.\r\n * @param dbName Name of the database.\r\n * @param dbTable Name of the table (object store).\r\n * @returns Promise that resolves with void.\r\n */\r\nidb.table.create = (dbName: string, dbTable: string): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const currentVersion = Number(idb.db.version(dbName)) || 0\r\n const nextVersion = currentVersion + 1\r\n\r\n const request = indexedDB.open(dbName, nextVersion)\r\n\r\n request.onupgradeneeded = (e: IDBVersionChangeEvent) => {\r\n const db = (e.target as IDBOpenDBRequest).result\r\n\r\n if (!db.objectStoreNames.contains(dbTable)) {\r\n const store = db.createObjectStore(dbTable, {\r\n keyPath: \"id\",\r\n autoIncrement: true\r\n })\r\n\r\n store.createIndex(\"id\", \"id\", { unique: true })\r\n store.createIndex(\"data\", \"data\", { unique: false })\r\n message(`Table ${dbTable} created in ${dbName}`)\r\n }\r\n }\r\n\r\n request.onsuccess = () => {\r\n request.result.close()\r\n idb.db.list()\r\n resolve()\r\n }\r\n\r\n request.onerror = () => {\r\n console.error(`Error creating table ${dbTable}:`, request.error)\r\n reject(request.error)\r\n }\r\n\r\n } catch (err) {\r\n console.error(\"Critical error in table.create:\", err)\r\n reject(err)\r\n }\r\n })\r\n}\r\n\r\nexport { }\r\n\r\n\r\n","import { idb } from '../index'\r\nimport message from '../../message'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\n/**\r\n * Calculates the size of an object store by iterating through its records.\r\n * @param db The IDBDatabase instance.\r\n * @param table The name of the object store.\r\n * @returns Promise resolving with the size in bytes.\r\n */\r\nidb.table.size = (db: IDBDatabase, table: string): Promise<number> => {\r\n return new Promise((resolve, reject) => {\r\n if (!db) return reject(new Error(\"Database instance is required\"))\r\n if (!db.objectStoreNames.contains(table)) return resolve(0)\r\n\r\n let size = 0\r\n let count = 0\r\n const transaction = db.transaction([table], \"readonly\")\r\n const store = transaction.objectStore(table)\r\n const request = store.openCursor()\r\n\r\n request.onsuccess = async (event: any) => {\r\n const cursor = event.target.result\r\n if (cursor) {\r\n try {\r\n const value = cursor.value\r\n // Approximation of size via JSON stringification\r\n size += JSON.stringify(value).length\r\n } catch (err) {\r\n message(`Error stringifying IDB value tracking size:${err}`)\r\n }\r\n\r\n count++\r\n // Safe iteration: yield every 200 records\r\n if (count % 200 === 0) {\r\n await new Promise(resolve => setTimeout(resolve, 0))\r\n }\r\n\r\n cursor.continue()\r\n } else {\r\n resolve(size)\r\n }\r\n }\r\n\r\n request.onerror = () => {\r\n reject(request.error)\r\n }\r\n })\r\n}\r\n\r\nexport { }\r\n\r\n\r\n","import { idb } from '../index'\r\nimport message from '../../message'\r\n/*!\r\n memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\n/**\r\n * Deletes a record from IndexedDB.\r\n * @param storeName Name of the database.\r\n * @param table Name of the table.\r\n * @param key Key of the record to delete.\r\n */\r\nidb.data.delete = (storeName: string, table: string, key: any): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n const request = indexedDB.open(storeName)\r\n\r\n request.onsuccess = () => {\r\n const db = request.result\r\n if (!db.objectStoreNames.contains(table)) {\r\n db.close()\r\n return reject(new Error(`Table ${table} not found`))\r\n }\r\n\r\n const transaction = db.transaction(table, \"readwrite\")\r\n const objectStore = transaction.objectStore(table)\r\n const deleteRequest = objectStore.delete(key)\r\n\r\n deleteRequest.onsuccess = () => {\r\n db.close()\r\n message(`Record ${key} deleted from ${table}`)\r\n resolve()\r\n }\r\n\r\n deleteRequest.onerror = () => {\r\n db.close()\r\n reject(deleteRequest.error)\r\n }\r\n }\r\n\r\n request.onerror = () => reject(request.error)\r\n })\r\n}\r\n\r\n/**\r\n * Clears all records from a table.\r\n */\r\nidb.data.delete.all = (storeName: string, table: string): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n const request = indexedDB.open(storeName)\r\n\r\n request.onsuccess = (event: any) => {\r\n const db = event.target.result\r\n if (!db.objectStoreNames.contains(table)) {\r\n db.close()\r\n return reject(new Error(`Table ${table} not found`))\r\n }\r\n\r\n const transaction = db.transaction(table, \"readwrite\")\r\n const store = transaction.objectStore(table)\r\n const clearRequest = store.clear()\r\n\r\n clearRequest.onsuccess = () => {\r\n db.close()\r\n message(`All data cleared from ${table}`)\r\n resolve()\r\n }\r\n\r\n clearRequest.onerror = () => {\r\n db.close()\r\n reject(clearRequest.error)\r\n }\r\n }\r\n\r\n request.onerror = () => reject(request.error)\r\n })\r\n}\r\n\r\nexport { }\r\n\r\n\r\n","import { idb } from '../index'\r\nimport message from '../../message'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\n/**\r\n * Sets (inserts or updates) data in IndexedDB.\r\n * @param storeName Name of the database.\r\n * @param table Name of the object store.\r\n * @param value Object or value to store.\r\n * @returns Promise resolving with the request result.\r\n */\r\nidb.data.set = (storeName: string, table: string, value: any): Promise<any> => {\r\n return new Promise((resolve, reject) => {\r\n const request = indexedDB.open(storeName)\r\n\r\n request.onsuccess = () => {\r\n const db = request.result\r\n\r\n if (!db.objectStoreNames.contains(table)) {\r\n db.close()\r\n return reject(new Error(`Table ${table} does not exist in ${storeName}`))\r\n }\r\n\r\n const transaction = db.transaction(table, \"readwrite\")\r\n const objectStore = transaction.objectStore(table)\r\n const putRequest = objectStore.put(value)\r\n\r\n putRequest.onsuccess = () => {\r\n db.close()\r\n message(`Data saved in ${storeName}.${table}`)\r\n resolve(putRequest.result)\r\n }\r\n\r\n putRequest.onerror = (_) => {\r\n db.close()\r\n message(`Database insert error: ${putRequest.error?.message}`)\r\n reject(putRequest.error)\r\n }\r\n }\r\n\r\n request.onerror = () => {\r\n reject(request.error)\r\n }\r\n })\r\n}\r\n\r\nexport { }\r\n\r\n\r\n","import { idb } from '../index'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\n/**\r\n * Retrieves data from IndexedDB.\r\n * @param storeName Name of the database.\r\n * @param table Name of the object store.\r\n * @param key Key or ID to retrieve.\r\n * @returns Promise resolving with the data.\r\n */\r\nidb.data.get = (storeName: string, table: string, key: any): Promise<any> => {\r\n return new Promise((resolve, reject) => {\r\n const request = indexedDB.open(storeName)\r\n\r\n request.onsuccess = (event: any) => {\r\n const db = event.target.result\r\n\r\n if (!db.objectStoreNames.contains(table)) {\r\n db.close()\r\n return reject(new Error(`Table ${table} not found in ${storeName}`))\r\n }\r\n\r\n const transaction = db.transaction(table, \"readonly\")\r\n const store = transaction.objectStore(table)\r\n const getRequest = store.get(key)\r\n\r\n getRequest.onsuccess = () => {\r\n db.close()\r\n resolve(getRequest.result)\r\n }\r\n\r\n getRequest.onerror = () => {\r\n db.close()\r\n reject(getRequest.error)\r\n }\r\n }\r\n\r\n request.onerror = () => {\r\n reject(request.error)\r\n }\r\n })\r\n}\r\n\r\nexport { }\r\n\r\n","/**\r\n * MEMORIO INDEXEDDB\r\n *\r\n * This module provides IndexedDB browser database functionality.\r\n * It enables persistent storage for large amounts of structured data.\r\n *\r\n * **CLIENT-ONLY**: This module requires a browser environment with IndexedDB.\r\n * In Node.js/Deno, this will be disabled with a warning.\r\n *\r\n * The `idb` object is created here (empty) and published onto globalThis\r\n * by core/global once populated. Same reference is exported for named imports.\r\n */\r\n\r\nimport { hasIndexedDB } from '../../core/platform'\r\nimport { DEV } from '../../core/env'\r\n\r\n// Check if IndexedDB is available\r\nconst _hasIDB = hasIndexedDB()\r\n\r\n// Shared reference: populated below (or left as placeholder)\r\nexport const idb: any = {\r\n db: {},\r\n table: {},\r\n data: {}\r\n}\r\n\r\n// Initialize IDB only if available\r\nif (_hasIDB) {\r\n (\r\n async () => {\r\n Object.defineProperty(idb, 'db', { value: {}, writable: true, configurable: true })\r\n Object.defineProperty(idb, 'table', { value: {}, writable: true, configurable: true })\r\n Object.defineProperty(idb, 'data', { value: {}, writable: true, configurable: true })\r\n\r\n Object.defineProperty(globalThis, 'idbases', {\r\n value: [],\r\n writable: true,\r\n configurable: true,\r\n enumerable: false\r\n })\r\n\r\n await Promise.all([\r\n import('./tools/db.create'),\r\n import('./tools/db.list'),\r\n import('./tools/db.exist'),\r\n import('./tools/db.quota'),\r\n import('./tools/db.delete'),\r\n import('./tools/db.size'),\r\n import('./tools/db.version'),\r\n import('./tools/db.support'),\r\n import('./tools/table.create'),\r\n import('./tools/table.size'),\r\n import('./crud/data.delete'),\r\n import('./crud/data.set'),\r\n import('./crud/data.get')\r\n ])\r\n\r\n Object.preventExtensions(idb)\r\n Object.seal(idb)\r\n Object.freeze(idb)\r\n }\r\n )()\r\n} else {\r\n // Placeholder for non-browser environments\r\n idb._disabled = true\r\n idb._warning = 'IndexedDB is not available in this environment (Node.js/Deno). Use store or session for persistence.'\r\n if (DEV) {\r\n console.warn('Memorio IDB: IndexedDB is not available in this environment. Use store or session for data persistence.')\r\n }\r\n}\r\n\r\nexport default idb\r\n","/**\n * MEMORIO REDUX ADAPTER ENTRYPOINT\n *\n * Ships as `memorio/redux` (see `exports` generated by tsup.plugin.copyStatic).\n * Re-exports the adapter API from `./adapters/redux`. Core is imported via\n * relative paths and bundled into this entrypoint so the adapter is fully\n * self-contained.\n *\n * Importing `memorio/redux` does NOT activate memreo; the host application\n * must import `memorio` (or `memorio/redux`) and follow the bootstrap flow in\n * the docs. See docs/README.md -> \"Redux integration\".\n */\n\nexport { createMemorioMiddleware, hydrateMemorio, createMemorioReduxBridge } from '../adapters/redux'\nexport type {\n MemorioMiddlewareHandle,\n HydrateOptions,\n HydrationResult,\n HydrateBridge,\n MemorioReduxBridge,\n MemorioMapping,\n MemorioReduxAction,\n MemorioReduxOptions,\n MemorioReduxStoreLike,\n MemorioReduxMiddleware,\n MemoryEntry,\n MemoryType,\n MemoryScope\n} from '../adapters/redux'\n\n// Re-export convenience utilities (selectors) for consumers that want to build\n// custom mappings outside the bridge.\nexport { normalizeMappings, selectValues, deepEqual, shouldIgnoreAction, actionType } from '../adapters/redux'\n","/**\n * MEMORIO REDUX ADAPTER - PUBLIC API\n *\n * `import { createMemorioMiddleware, hydrateMemorio, createMemorioReduxBridge } from 'memorio/redux'`\n *\n * This adapter layer is optional and framework-agnostic (#13). It depends on\n * neither `redux` nor React at runtime (structural store typing, #4). Memorio\n * core is imported via relative paths and bundled into this entrypoint by the\n * build; core singletons (state/store/session/dispatch + globalThis.memorio)\n * are shared safely thanks to the idempotent bootstrap guards in core/global.ts.\n */\n\nexport { createMemorioMiddleware } from './middleware'\nexport type { MemorioMiddlewareHandle } from './middleware'\n\nexport { hydrateMemorio } from './hydration'\nexport type { HydrateOptions, HydrationResult, HydrateBridge } from './hydration'\n\nexport { createMemorioReduxBridge } from './bridge'\nexport type { MemorioReduxBridge } from './bridge'\n\nexport {\n normalizeMappings,\n selectValues,\n deepEqual,\n shouldIgnoreAction,\n actionType\n} from './selectors'\nexport type {\n MemorioMapping,\n MemorioReduxAction,\n MemorioReduxOptions,\n MemorioReduxStoreLike,\n MemorioReduxMiddleware\n} from './types'\nexport { type MemoryEntry, type MemoryType, type MemoryScope } from './types'\n","/**\n * MEMORIO REDUX ADAPTER - MIDDLEWARE (Redux -> Memorio)\n *\n * Produces a standard Redux middleware. The app installs it at store creation:\n *\n * const memorio = createMemorioMiddleware<AppState>({ mappings })\n * const store = createStore(reducer, applyMiddleware(memorio.middleware))\n *\n * Ownership: Redux state -> Memorio memory (directional, #8). Memorio never\n * writes back into Redux state here; hydration is a separate, one-shot step.\n * Async work is deferred off the reducer/middleware stack (#15) and coalesced\n * (#30). Failures are isolated (#17).\n */\n\nimport { normalizeMappings, shouldIgnoreAction, collectDirtyMappings } from './selectors'\nimport { createPersistContext, schedulePersist, flushPersist } from './persist'\nimport type { MemorioReduxAction, MemorioReduxOptions, MemorioReduxMiddleware } from './types'\n\nexport interface MemorioMiddlewareHandle<\n S = unknown,\n A extends MemorioReduxAction = MemorioReduxAction\n> {\n /** Pass to `applyMiddleware(...)`. */\n middleware: MemorioReduxMiddleware<S, A>\n /** Shared change-detection cache (exposed so hydration can seed it). */\n cache: Record<string, unknown>\n /** Toggle the Memorio->Redux re-entrancy guard (#10 loop prevention). */\n setHydrating: (v: boolean) => void\n /** Flush pending persist immediately (mostly for tests). */\n flush: () => Promise<void>\n}\n\nexport function createMemorioMiddleware<\n S = any,\n A extends MemorioReduxAction = MemorioReduxAction\n>(opts: MemorioReduxOptions<S> = {}) {\n const mappings = normalizeMappings(opts.mappings)\n const ctx = createPersistContext()\n\n // Captured when the middleware is installed (store creation time).\n let getState: (() => S) | null = null\n\n const middleware: MemorioReduxMiddleware<S, A> = (api) => {\n getState = api.getState\n return (next) => (action) => {\n const result = next(action)\n\n // Global whitelist/blacklist short-circuit (#30).\n if (shouldIgnoreAction(action, opts)) return result\n\n // Per-mapping filtering: only keys this action is allowed to persist for\n // become dirty. Blacklisted/whitelisted-out mappings never reach Memorio,\n // even via an explicit flush (#30).\n const dirty = collectDirtyMappings(action, opts, mappings)\n if (dirty.length === 0) return result\n for (const key of dirty) ctx.dirty.add(key)\n\n void schedulePersist(getState as () => S, mappings, ctx, opts)\n return result\n }\n }\n\n return {\n middleware,\n cache: ctx.cache,\n setHydrating: (v: boolean) => {\n ctx.hydrating = v\n },\n flush: () => (getState ? flushPersist(getState, mappings, ctx, opts) : Promise.resolve())\n }\n}\n","/**\n * MEMORIO REDUX ADAPTER - SELECTORS + DEEP EQUALITY\n *\n * Pure helpers: no memorio runtime import needed except types. These are\n * shared by the middleware and the bridge so both see one consistent view of\n * \"what changed\". Keeping them isolated from side effects makes them trivial\n * to unit-test.\n */\n\nimport type {\n MemorioMapping,\n MemorioReduxAction,\n MemorioReduxOptions,\n MemorioReduxStoreLike\n} from './types'\n\n/**\n * Normalizes a user-facing mappings table into canonical `MemorioMapping`\n * objects (bare selectors become `{ selector, ...defaults }`).\n */\nexport function normalizeMappings<S = any>(\n mappings: MemorioReduxOptions<S>['mappings']\n): Record<string, MemorioMapping<S>> {\n const out: Record<string, MemorioMapping<S>> = {}\n if (!mappings) return out\n for (const key of Object.keys(mappings)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const v: any = (mappings as Record<string, any>)[key]\n if (typeof v === 'function') {\n out[key] = { selector: v }\n } else if (v && typeof v === 'object') {\n out[key] = v\n }\n }\n return out\n}\n\n/**\n * Reads the current selected value for every mapping at once.\n * Returns a fresh object; cheap to diff against a cached snapshot.\n */\nexport function selectValues<S = any>(\n state: S,\n mappings: Record<string, MemorioMapping<S>>\n): Record<string, unknown> {\n const values: Record<string, unknown> = {}\n for (const key of Object.keys(mappings)) {\n try {\n values[key] = mappings[key].selector(state)\n } catch {\n // A throwing selector must not crash the Redux dispatch chain.\n values[key] = undefined\n }\n }\n return values\n}\n\n/**\n * Structural deep equality. Replaces a lodash/deep-equal dependency (#zero deps).\n * Handles primitives, arrays, plain objects, Dates, RegExps. Cycles are\n * treated as equal only when structurally identical.\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n if (a == null || b == null) return false\n if (typeof a !== typeof b) return false\n if (typeof a !== 'object') return a === b\n\n if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime()\n if (a instanceof RegExp && b instanceof RegExp) return a.source === b.source && a.flags === b.flags\n\n const ak = Object.keys(a as object)\n const bk = Object.keys(b as object)\n if (ak.length !== bk.length) return false\n\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b)) return false\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) return false\n }\n return true\n }\n\n for (const k of ak) {\n if (!(k in (b as object))) return false\n if (!deepEqual((a as any)[k], (b as any)[k])) return false\n }\n return true\n}\n\n/** Reads the action `type` discriminator in a type-safe, null-safe way. */\nexport function actionType(action: MemorioReduxAction): unknown {\n return action && typeof action === 'object' ? action.type : undefined\n}\n\n/**\n * Returns true when an action should be ignored for persistence given the\n * whitelist/blacklist + per-mapping `ignoreActions` rules (#30 aggressive filter).\n */\nexport function shouldIgnoreAction(\n action: MemorioReduxAction,\n opts: MemorioReduxOptions,\n mapping?: MemorioMapping\n): boolean {\n const t = actionType(action)\n if (opts.blacklist && opts.blacklist.length && opts.blacklist.includes(t)) return true\n if (opts.whitelist && opts.whitelist.length && !opts.whitelist.includes(t)) return true\n if (mapping && mapping.ignoreActions && mapping.ignoreActions.length && mapping.ignoreActions.includes(t)) {\n return true\n }\n return false\n}\n\n/**\n * Returns the memory keys whose mapping is NOT ignored for this action type.\n * The middleware only schedules persistence for these keys (dirty set), so a\n * blacklisted / whitelisted-out action can never reach Memorio (#30).\n */\nexport function collectDirtyMappings<S = any>(\n action: MemorioReduxAction,\n opts: MemorioReduxOptions,\n mappings: Record<string, MemorioMapping<S>>\n): string[] {\n const dirty: string[] = []\n for (const key of Object.keys(mappings)) {\n if (!shouldIgnoreAction(action, opts, mappings[key])) dirty.push(key)\n }\n return dirty\n}\n\n/** Memoizes a snapshot of selected values keyed by the store reference. */\nexport type SelectorCache = Record<string, unknown>\n\nexport type { MemorioReduxStoreLike }\n","/**\n * MEMORIO REDUX ADAPTER - PERSISTENCE ENGINE\n *\n * Shared write-to-Memorio logic used by both the standalone middleware and the\n * integrated bridge. Owns the *last-values cache* (change detection) so the\n * same closures can be reused for loop-guarding during hydration.\n *\n * Redux owns app state (#5). This layer only writes *selected* values into\n * Memorio memory - never the whole Redux tree (#6/#30) - and only when a\n * selector's value actually changes.\n */\n\nimport { memory } from '../../functions/memory'\nimport { selectValues, deepEqual } from './selectors'\nimport type {\n MemorioMapping,\n MemorioReduxOptions\n} from './types'\n\nexport interface PersistContext {\n /** Last seen selected value per memory key (change detection). */\n cache: Record<string, unknown>\n /** Re-entrancy guard: true while the app is rehydrating (Memorio -> Redux). */\n hydrating: boolean\n /** Coalesce flag so rapid actions collapse to one persist cycle (#30). */\n pending: boolean\n /** Mapping keys triggered by a non-ignored action since the last flush. */\n dirty: Set<string>\n}\n\nexport function createPersistContext(): PersistContext {\n return { cache: {}, hydrating: false, pending: false, dirty: new Set() }\n}\n\n/**\n * Schedule an async, coalesced persist of changed mappings.\n * Returns immediately (does not block the Redux dispatch stack - #15).\n * Each mapping is failure-isolated (#17).\n */\nexport function schedulePersist<S>(\n getState: () => S,\n mappings: Record<string, MemorioMapping<S>>,\n ctx: PersistContext,\n opts: MemorioReduxOptions<S>\n): void {\n if (ctx.hydrating) return\n if (ctx.pending) return\n ctx.pending = true\n queueMicrotask(() => {\n ctx.pending = false\n void flushPersist(getState, mappings, ctx, opts)\n })\n}\n\n/**\n * Walk every mapping, compare selector output to the cached value, and write\n * only the deltas to Memorio memory. Async and failure-isolated.\n */\nexport async function flushPersist<S>(\n getState: () => S,\n mappings: Record<string, MemorioMapping<S>>,\n ctx: PersistContext,\n opts: MemorioReduxOptions<S>\n): Promise<void> {\n // Drain the dirty set first - only mappings triggered by a non-ignored action\n // are eligible (#30). An empty dirty set means nothing to do.\n const keys = Array.from(ctx.dirty)\n ctx.dirty.clear()\n if (keys.length === 0) return\n\n const state = getState()\n const values = selectValues(state, mappings)\n\n for (const key of keys) {\n const mapping = mappings[key]\n const next = values[key]\n const prev = ctx.cache[key]\n if (!deepEqual(next, prev)) {\n ctx.cache[key] = next\n try {\n await memory.remember(key, next, {\n type: mapping.type,\n confidence: mapping.confidence ?? 0.9,\n scope: mapping.scope ?? 'local',\n ttl: mapping.ttl ?? null,\n tags: mapping.tags,\n source: mapping.source ?? 'redux'\n })\n if (opts.debug) {\n console.debug(`[memorio/redux] persisted \"${key}\"`)\n }\n } catch (err) {\n if (opts.failSoft === false) throw err\n opts.onError?.(err, 'persist')\n if (opts.debug) {\n console.debug(`[memorio/redux] persist failed for \"${key}\"`, err)\n }\n }\n }\n }\n}\n","import { state } from '../state'\r\nimport { store } from '../store'\r\nimport { session } from '../session'\r\nimport { idb } from '../idb'\r\nimport { dispatch } from '../../core/dispatch'\r\nimport { hlc } from '../../core/hlc'\r\nimport { DEV } from '../../core/env'\r\nimport memoryJournal, { configure as configureSync } from './journal'\r\nimport type {\r\n MemoryEntry,\r\n MemoryOperation,\r\n MemoryType,\r\n RememberOptions,\r\n RecallOptions,\r\n ContextOptions,\r\n ContextEntry,\r\n MemoryStats,\r\n MemoryScope,\r\n SyncConfig,\r\n PatchOperation\r\n} from '../../types/memory'\r\n\r\nconst MEMORY_INDEX_KEY = '__memorio_memory_index__'\r\nconst SUPERSEDED_PREFIX = '__memorio_superseded__'\r\n\r\nfunction isSyncEnabled(): boolean {\r\n return !!(globalThis as any).memorioSyncConfig\r\n}\r\n\r\n/**\r\n * Record a memory operation in the local (namespaced) sync journal.\r\n * Attaches an HLC timestamp for causal ordering across devices.\r\n * No-op when sync hasn't been configured, for `hot` (volatile) scopes, or if\r\n * the substrate is unavailable - journaling never breaks a memory write.\r\n */\r\nasync function recordJournal(entry: MemoryEntry, operation: MemoryOperation): Promise<void> {\r\n if (!isSyncEnabled()) return\r\n if (entry.scope === 'hot') return\r\n try {\r\n await memoryJournal.append(entry as MemoryEntry, operation)\r\n } catch (err) {\r\n if (DEV) console.warn('[memorio memory] journal append failed:', err)\r\n }\n}\r\n\r\nfunction memoryEntryKey(id: string): string {\r\n return id.startsWith(SUPERSEDED_PREFIX) ? id : `${SUPERSEDED_PREFIX}${id}`\r\n}\r\n\r\nfunction normalizeTags(tags: string | string[] | undefined): string[] {\r\n if (!tags) return []\r\n return Array.isArray(tags) ? tags : [tags]\r\n}\r\n\r\nfunction resolveScope<T>(value: T, opts: RememberOptions<T>): MemoryScope {\r\n if (opts.scope) return opts.scope\r\n\r\n const size = JSON.stringify(value).length\r\n\r\n if (size > 1_000_000) return 'durable'\r\n if (size > 100_000) return 'local'\r\n\r\n return 'local'\r\n}\r\n\r\nfunction now(): number {\r\n return Date.now()\r\n}\r\n\r\nfunction isExpired(entry: MemoryEntry): boolean {\r\n if (entry.ttl === null || entry.ttl === undefined) return false\r\n return now() - entry.createdAt > entry.ttl\r\n}\r\n\r\nfunction matchesFilters(entry: MemoryEntry, opts: RecallOptions): boolean {\r\n if (entry.status === 'obsolete') return opts.includeObsolete ?? false\r\n if (entry.status === 'superseded') return opts.includeObsolete ?? false\r\n if (isExpired(entry)) {\r\n return opts.includeObsolete ?? false\r\n }\r\n if (opts.type) {\r\n const types = Array.isArray(opts.type) ? opts.type : [opts.type]\r\n if (!types.includes(entry.type)) return false\r\n }\r\n if (opts.minConfidence !== undefined && entry.confidence < opts.minConfidence) return false\r\n return true\r\n}\r\n\r\nfunction matchesContextFilters(entry: MemoryEntry, opts: ContextOptions): boolean {\r\n if (entry.status !== 'active') return false\r\n if (isExpired(entry)) return false\r\n\r\n if (opts.tags) {\r\n const tags = Array.isArray(opts.tags) ? opts.tags : [opts.tags]\r\n const hasMatch = tags.some(t => entry.tags.includes(t))\r\n if (!hasMatch) return false\r\n }\r\n\r\n if (opts.types) {\r\n const types = Array.isArray(opts.types) ? opts.types : [opts.types]\r\n if (!types.includes(entry.type)) return false\r\n }\r\n\r\n if (opts.minConfidence !== undefined && entry.confidence < opts.minConfidence) return false\r\n\r\n if (opts.scopes && !opts.scopes.includes(entry.scope)) return false\r\n\r\n return true\r\n}\r\n\r\nfunction computeRelevance(entry: MemoryEntry): number {\r\n const ageHours = (now() - entry.createdAt) / (1000 * 3600)\r\n const recencyScore = Math.max(0.1, 1 / (1 + ageHours * 0.5))\r\n const confidenceScore = entry.confidence\r\n const accessScore = 1 + (entry.tags.length * 0.1)\r\n\r\n const typeBoost: Record<MemoryType, number> = {\r\n decision: 1.5,\r\n context: 1.3,\r\n preference: 1.2,\r\n task: 1.0,\r\n fact: 0.8\r\n }\r\n\r\n const scopeBoost: Record<MemoryScope, number> = {\r\n hot: 1.5,\r\n session: 1.2,\r\n local: 1.0,\r\n durable: 0.8\r\n }\r\n\r\n return recencyScore * confidenceScore * accessScore * typeBoost[entry.type] * scopeBoost[entry.scope]\r\n}\r\n\r\nfunction getNestedPath(obj: any, path: string): any {\r\n if (!path || typeof path !== 'string') return undefined\r\n const parts = path.replace(/^state\\./, '').split('.')\r\n let current: any = obj\r\n for (const part of parts) {\r\n if (current === null || current === undefined) return undefined\r\n current = current[part]\r\n }\r\n return current\r\n}\r\n\r\nfunction setNestedPath(obj: any, path: string, value: any): void {\r\n if (!path || typeof path !== 'string') return\r\n const parts = path.replace(/^state\\./, '').split('.')\r\n let current: any = obj\r\n for (let i = 0; i < parts.length - 1; i++) {\r\n const part = parts[i]\r\n if (current[part] === undefined || current[part] === null) {\r\n current[part] = {}\r\n }\r\n current = current[part]\r\n }\r\n current[parts[parts.length - 1]] = value\r\n}\r\n\r\nfunction deleteNestedPath(obj: any, path: string): void {\r\n if (!path || typeof path !== 'string') return\r\n const parts = path.replace(/^state\\./, '').split('.')\r\n let current: any = obj\r\n for (let i = 0; i < parts.length - 1; i++) {\r\n const part = parts[i]\r\n if (current[part] === undefined || current[part] === null) return\r\n current = current[part]\r\n }\r\n delete current[parts[parts.length - 1]]\r\n}\r\n\r\nasync function saveToScope(entry: MemoryEntry): Promise<void> {\r\n const storageKey = entry.status === 'superseded' ? memoryEntryKey(entry.id || entry.key) : entry.key\r\n const serialized = JSON.stringify(entry)\r\n\r\n switch (entry.scope) {\r\n case 'hot':\r\n setNestedPath(state, storageKey, entry.value)\r\n break\r\n\r\n case 'session':\r\n session.set(storageKey, serialized)\r\n break\r\n\r\n case 'local':\r\n store.set(storageKey, serialized)\r\n break\r\n\r\n case 'durable':\r\n await idb.set('memories', storageKey, serialized)\r\n break\r\n }\r\n\r\n await updateIndex(entry.id || entry.key, entry.scope, entry.status === 'superseded')\r\n}\r\n\r\nasync function loadFromScope(id: string, scope: MemoryScope, isSuperseded: boolean = false): Promise<MemoryEntry | null> {\r\n const storageKey = isSuperseded ? memoryEntryKey(id) : id\r\n let raw: string | undefined\r\n\r\n switch (scope) {\r\n case 'hot': {\r\n const val = getNestedPath(state, storageKey)\r\n if (val === undefined) return null\r\n return reconstructEntry(id, val, scope)\r\n }\r\n\r\n case 'session':\r\n raw = session.get(storageKey)\r\n break\r\n\r\n case 'local':\r\n raw = store.get(storageKey)\r\n break\r\n\r\n case 'durable':\r\n raw = await idb.get('memories', storageKey)\r\n break\r\n }\r\n\r\n if (!raw) return null\r\n\r\n try {\r\n const entry = JSON.parse(raw) as MemoryEntry\r\n entry.id = entry.id || id\r\n return entry\r\n } catch (err) {\r\n if (DEV) console.warn('[memorio memory] failed to parse memory entry:', err)\r\n return null\r\n }\r\n}\r\n\r\nfunction reconstructEntry(key: string, value: any, scope: MemoryScope): MemoryEntry {\r\n return {\r\n id: key,\r\n key,\r\n value: value,\r\n type: 'fact',\r\n confidence: 1.0,\r\n scope,\r\n ttl: null,\r\n tags: [],\r\n status: 'active',\r\n createdAt: now(),\r\n lastConfirmedAt: now(),\r\n supersededId: null\r\n }\r\n}\r\n\r\nasync function removeFromScope(id: string, scope: MemoryScope, isSuperseded: boolean = false): Promise<void> {\r\n const storageKey = isSuperseded ? memoryEntryKey(id) : id\r\n\r\n switch (scope) {\r\n case 'hot':\r\n setNestedPath(state, storageKey, undefined)\r\n break\r\n case 'session':\r\n session.remove(storageKey)\r\n break\r\n case 'local':\r\n store.remove(storageKey)\r\n break\r\n case 'durable':\r\n await idb.deleteKey('memories', storageKey)\r\n break\r\n }\r\n\r\n await removeFromIndex(id, isSuperseded)\r\n}\r\n\r\ninterface IndexEntry {\r\n scope: MemoryScope\r\n superseded: boolean\r\n}\r\n\r\nasync function getAllIndexes(): Promise<Record<string, IndexEntry>> {\r\n try {\r\n const raw = store.get(MEMORY_INDEX_KEY)\r\n if (!raw) return {}\r\n return JSON.parse(raw)\r\n } catch (err) {\r\n if (DEV) console.warn('[memorio memory] failed to parse memory index:', err)\r\n return {}\r\n }\r\n}\r\n\r\nasync function updateIndex(id: string, scope: MemoryScope, isSuperseded: boolean = false): Promise<void> {\r\n const index = await getAllIndexes()\r\n index[id] = { scope, superseded: isSuperseded }\r\n store.set(MEMORY_INDEX_KEY, JSON.stringify(index))\r\n}\r\n\r\nasync function removeFromIndex(id: string, isSuperseded: boolean = false): Promise<void> {\r\n const index = await getAllIndexes()\r\n const entry = index[id]\r\n if (entry) {\r\n if (isSuperseded && entry.superseded) {\r\n delete index[id]\r\n } else if (!isSuperseded && !entry.superseded) {\r\n delete index[id]\r\n }\r\n }\r\n store.set(MEMORY_INDEX_KEY, JSON.stringify(index))\r\n}\r\n\r\nasync function loadAll(): Promise<MemoryEntry[]> {\r\n const index = await getAllIndexes()\r\n const entries: MemoryEntry[] = []\r\n\r\n for (const [id, info] of Object.entries(index)) {\r\n const entry = await loadFromScope(id, info.scope, info.superseded)\r\n if (entry) {\r\n entry.id = entry.id || id\r\n entry.supersededId = entry.supersededId ?? null\r\n entries.push(entry)\r\n }\r\n }\r\n\r\n return entries\r\n}\r\n\r\nexport const memory = {\r\n async remember<T>(key: string, value: T, opts: RememberOptions<T> = {}): Promise<void> {\r\n const existing = await this._getEntry(key)\r\n\r\n if (existing && existing.status === 'active') {\r\n const supersededId = `${existing.id}__v${Date.now()}`\r\n const superseded: MemoryEntry = {\r\n ...existing,\r\n id: supersededId,\r\n key: existing.key,\r\n status: 'superseded',\r\n supersededId: null,\r\n lastConfirmedAt: now()\r\n }\r\n await saveToScope(superseded)\r\n await recordJournal(superseded, 'supersede')\r\n }\r\n\r\n const scope = resolveScope(value, opts)\r\n const tags = normalizeTags(opts.tags)\r\n\r\n const entry: MemoryEntry<T> = {\r\n id: opts.id || key,\r\n key,\r\n value,\r\n type: opts.type || 'fact',\r\n confidence: opts.confidence ?? 1.0,\r\n scope,\r\n ttl: opts.ttl ?? null,\r\n tags,\r\n source: opts.source,\r\n status: 'active',\r\n createdAt: now(),\r\n lastConfirmedAt: now(),\r\n updatedAt: now(),\r\n version: existing ? (existing.version ? existing.version + 1 : 1) : 1,\r\n sync: isSyncEnabled() ? 'pending' : undefined,\r\n supersededId: existing ? existing.id : null,\r\n hlc: hlc.serialize(hlc.tick())\r\n }\r\n\r\n await saveToScope(entry)\r\n await recordJournal(entry, 'remember')\r\n dispatch.set('memorio:memory:remembered', { key, scope, entryId: entry.id })\r\n },\r\n\r\n async recall<T = any>(query: string, opts: RecallOptions = {}): Promise<T | null> {\r\n const entry = await this._getEntry(query)\r\n if (!entry) return null\r\n if (!matchesFilters(entry, opts)) return null\r\n\r\n entry.lastConfirmedAt = now()\r\n await saveToScope(entry)\r\n dispatch.set('memorio:memory:recalled', { key: query })\r\n\r\n return entry.value as T\r\n },\r\n\r\n async context(opts: ContextOptions = {}): Promise<ContextEntry[]> {\r\n const entries = await loadAll()\r\n const filtered = entries.filter(e => matchesContextFilters(e, opts))\r\n\r\n const ranked = filtered\r\n .map(entry => ({\r\n entry,\r\n score: computeRelevance(entry)\r\n }))\r\n .sort((a, b) => b.score - a.score)\r\n .slice(0, opts.maxEntries ?? 25)\r\n\r\n return ranked.map(({ entry }) => ({\r\n key: entry.key,\r\n value: entry.value,\r\n type: entry.type,\r\n confidence: entry.confidence,\r\n scope: entry.scope,\r\n tags: entry.tags,\r\n age: now() - entry.createdAt,\r\n accessCount: entry.tags.length + 1,\r\n lastAccessedAt: entry.lastConfirmedAt\r\n }))\r\n },\r\n\r\n async forget(key: string): Promise<void> {\r\n const entry = await this._getEntry(key)\r\n if (!entry) {\r\n const tombstone: MemoryEntry = {\r\n id: key,\r\n key,\r\n value: null,\r\n type: 'fact',\r\n confidence: 1,\r\n scope: 'local',\r\n ttl: null,\r\n tags: [],\r\n status: 'obsolete',\r\n operation: 'delete',\r\n createdAt: now(),\r\n lastConfirmedAt: now(),\r\n updatedAt: now(),\r\n version: 1,\r\n sync: isSyncEnabled() ? 'pending' : undefined,\r\n hlc: hlc.serialize(hlc.tick())\r\n }\r\n await recordJournal(tombstone, 'delete')\r\n return\r\n }\r\n\r\n await removeFromScope(entry.id || key, entry.scope, entry.status === 'superseded')\r\n\r\n const tombstone: MemoryEntry = {\r\n ...entry,\r\n value: null,\r\n status: 'obsolete',\r\n operation: 'delete',\r\n updatedAt: now(),\r\n version: (entry.version ? entry.version : 0) + 1,\r\n sync: isSyncEnabled() ? 'pending' : undefined,\r\n hlc: hlc.serialize(hlc.tick())\r\n }\r\n await recordJournal(tombstone, 'delete')\r\n dispatch.set('memorio:memory:forgotten', { key })\r\n },\r\n\r\n async update(key: string, value: any, opts: Partial<RememberOptions> = {}): Promise<void> {\r\n const existing = await this._getEntry(key)\r\n if (!existing) {\r\n await this.remember(key, value, opts)\r\n return\r\n }\r\n\r\n const supersededId = `${existing.id}__v${now()}`\r\n const superseded: MemoryEntry = {\r\n ...existing,\r\n id: supersededId,\r\n key: existing.key,\r\n status: 'superseded',\r\n supersededId: null,\r\n lastConfirmedAt: now()\r\n }\r\n await saveToScope(superseded)\r\n await recordJournal(superseded, 'supersede')\r\n\r\n const updated: MemoryEntry = {\r\n ...existing,\r\n value,\r\n lastConfirmedAt: now(),\r\n updatedAt: now(),\r\n version: (existing.version ? existing.version : 0) + 1,\r\n sync: isSyncEnabled() ? 'pending' : undefined,\r\n hlc: hlc.serialize(hlc.tick()),\r\n ...(opts.scope ? { scope: opts.scope } : {}),\r\n ...(opts.ttl !== undefined ? { ttl: opts.ttl } : {}),\r\n ...(opts.type ? { type: opts.type } : {}),\r\n ...(opts.confidence !== undefined ? { confidence: opts.confidence } : {}),\r\n ...(opts.tags !== undefined ? { tags: normalizeTags(opts.tags) } : {}),\r\n ...(opts.source ? { source: opts.source } : {})\r\n }\r\n\r\n await saveToScope(updated)\r\n await recordJournal(updated, 'update')\r\n dispatch.set('memorio:memory:updated', { key, entryId: updated.id })\r\n },\r\n\r\n async stats(): Promise<MemoryStats> {\r\n const entries = await loadAll()\r\n const byScope: Record<MemoryScope, number> = { hot: 0, session: 0, local: 0, durable: 0 }\r\n const byType: Partial<Record<MemoryType, number>> = {}\r\n let expired = 0\r\n\r\n for (const entry of entries) {\r\n byScope[entry.scope] = (byScope[entry.scope] || 0) + 1\r\n\r\n if (isExpired(entry)) expired++\r\n\r\n byType[entry.type] = (byType[entry.type] || 0) + 1\r\n }\r\n\r\n return { total: entries.length, byScope, byType, expired }\r\n },\r\n\r\n async forgetExpired(): Promise<number> {\r\n const entries = await loadAll()\r\n let count = 0\r\n\r\n for (const entry of entries) {\r\n if (isExpired(entry) && entry.status === 'active') {\r\n entry.status = 'obsolete'\r\n entry.updatedAt = now()\r\n entry.operation = 'expire'\r\n await saveToScope(entry)\r\n await recordJournal(entry, 'expire')\r\n count++\r\n }\r\n }\r\n\r\n return count\r\n },\r\n\r\n async clear(): Promise<void> {\r\n const index = await getAllIndexes()\r\n for (const [id, info] of Object.entries(index)) {\r\n await removeFromScope(id, info.scope, info.superseded)\r\n }\r\n store.remove(MEMORY_INDEX_KEY)\r\n },\r\n\r\n async _getEntry(key: string): Promise<MemoryEntry | null> {\r\n const index = await getAllIndexes()\r\n const info = index[key]\r\n\r\n if (!info) {\r\n const val = getNestedPath(state, key)\r\n if (val !== undefined) return reconstructEntry(key, val, 'hot')\r\n return null\r\n }\r\n\r\n return loadFromScope(key, info.scope, info.superseded)\r\n },\r\n\r\n async _loadAll(): Promise<MemoryEntry[]> {\r\n return loadAll()\r\n },\r\n\r\n async _save(entry: MemoryEntry): Promise<void> {\r\n await saveToScope(entry)\r\n },\r\n\r\n /** Apply a field-level path patch to an existing memory entry. */\r\n async patch(key: string, patches: PatchOperation[]): Promise<void> {\r\n const entry = await this._getEntry(key)\r\n if (!entry) return\r\n\r\n let patched = false\r\n for (const p of patches) {\r\n if (p.op === 'set') {\r\n setNestedPath({ [entry.key]: entry.value } as any, p.path.replace(/^[^.]+\\./, ''), p.value)\r\n patched = true\r\n } else if (p.op === 'delete') {\r\n deleteNestedPath({ [entry.key]: entry.value } as any, p.path.replace(/^[^.]+\\./, ''))\n patched = true\r\n }\r\n }\r\n\r\n if (!patched) return\r\n\r\n const updated: MemoryEntry = {\r\n ...entry,\r\n updatedAt: now(),\r\n lastConfirmedAt: now(),\r\n version: (entry.version ? entry.version : 0) + 1,\r\n sync: isSyncEnabled() ? 'pending' : undefined,\r\n hlc: hlc.serialize(hlc.tick()),\r\n patches,\r\n path: patches[0]?.path\r\n }\r\n\r\n await saveToScope(updated)\r\n await recordJournal(updated, 'patch')\r\n dispatch.set('memorio:memory:patched', { key, patches })\r\n },\r\n\r\n /** Local operation journal (namespaced). No-op substrate when sqlite/idb unavailable. */\r\n journal: memoryJournal,\r\n\r\n /** Configure the optional cloud-sync layer (namespace + provider). Chainable. */\r\n configure(opts: SyncConfig): any {\r\n configureSync(opts)\r\n return this\r\n }\r\n}\r\n","/**\r\n * MEMORIO STATE MANAGEMENT\r\n *\r\n * Self-contained reactive state module using Proxy.\r\n * It enables nested object tracking and dispatches events on state changes.\r\n * Internal flags live in `core/internal` (no globalThis.memorio.* writes).\r\n * `core/global.ts` publishes the resulting `state` proxy at bootstrap end.\r\n */\r\n\r\nimport internal, { protect } from '../../core/internal'\r\nimport message from '../message'\r\nimport { dispatch } from '../../core/dispatch'\r\nimport { schema } from '../schema'\r\nimport { DEV } from '../../core/env'\r\n\r\n/**\r\n * Symbol used to recognize Memorio proxy instances and access the underlying\r\n * raw target. It is intentionally a Symbol (not a string key) so it can never\r\n * collide with user keys and is non-enumerable. `__path` remains as a string\r\n * for backward compatibility with external consumers.\r\n */\r\nexport const TARGET = Symbol('memorio.target')\r\n\r\n// WeakMap cache: raw target -> proxy wrapper (avoids allocating a new Proxy\r\n// on every read for the same object, critical in nested-read hot loops).\r\nconst wrapperCache = new WeakMap<any, any>()\r\n\r\n/**\r\n * Recursively unwraps Memorio proxies produced by `buildProxy`, returning the\r\n * plain raw value. Leaves untouched anything that is not one of our proxies\r\n * (Date, Set, Map, functions, React elements with `$$typeof`, primitives, etc).\r\n * Uses a WeakSet to stay safe against cycles.\r\n */\r\nexport const deepRaw = (val: any, seen: WeakSet<object> | null = null): any => {\r\n if (val === null || typeof val !== 'object') return val\r\n // Already one of our proxies → pull the raw target out.\r\n if (val[TARGET] !== undefined) return deepRaw(val[TARGET], seen)\r\n // Avoid infinite recursion on cycles.\r\n if (seen) {\r\n if (seen.has(val)) return val\r\n seen.add(val)\r\n }\r\n // Only traverse plain Objects/Arrays. Other instances are returned by reference.\r\n const ctor = val.constructor?.name\r\n if (ctor !== 'Object' && ctor !== 'Array') return val\r\n const copy: any = Array.isArray(val) ? [] : {}\r\n for (const k of Reflect.ownKeys(val)) {\r\n copy[k] = deepRaw((val as any)[k], seen)\r\n }\r\n return copy\r\n}\r\n\r\n/**\r\n * Builds the dotted path string for a property (no side effects).\r\n * Used by set/delete to compute the state path.\r\n */\r\nexport const objPath = (prop: string, object: string[], separator: string = '.'): string => {\r\n return object.concat(prop).join(separator)\r\n}\r\n\r\n///\r\n/**\r\n * Builds a recursive proxy for reactive state management.\r\n * @param obj The target object to proxy.\r\n * @param callback Function called on state changes.\r\n * @param tree Current path in the object tree.\r\n * @returns A proxied object with reactive behavior.\r\n */\r\nexport const buildProxy = (obj: Record<string, any>, callback: (props: any) => void, tree: string[] = []): any => {\r\n\r\n // EVENT FUNCTION FOR OBSERVER\r\n const event = (name: string) => {\r\n // Dispatch ONLY the exact path, not parent paths\r\n // This ensures useObserver only triggers for the exact property being watched\r\n // name already includes 'state.' prefix from the caller\r\n try {\r\n dispatch.set(name, { detail: { name } })\r\n } catch (err) {\r\n if (DEV) console.warn('[memorio state] event dispatch failed:', err)\r\n }\n return\r\n }\r\n\r\n ///\r\n\r\n // CREATE THE PROXY\r\n return new Proxy(\r\n obj,\r\n {\r\n get(target: any, prop: any) {\r\n\r\n if (prop === '__path') {\r\n return tree.length > 0 ? 'state.' + tree.join('.') : 'state'\r\n }\r\n\r\n // Symbol accessor: return the RAW underlying target of a Memorio proxy.\r\n // Prevents re-wrapping already-proxied objects on nested access.\r\n if (prop === TARGET) {\r\n return target\r\n }\r\n\r\n // Re-wrap guard: if the target itself is one of our proxies, never\r\n // allocate a new wrapper around it (prevents exponential wrap growth).\r\n if (target[TARGET] !== undefined) {\r\n return target\r\n }\r\n\r\n if (prop === 'list') {\r\n message('Some state could be hidden when you use \"state.list\". Use \"state\" to see the complete list ')\r\n return deepRaw(target, new WeakSet())\r\n }\r\n\r\n // Track access for useObserver auto-discovery and last path\r\n if (typeof prop === 'string') {\r\n const path = tree.length > 0 ? 'state.' + tree.concat(prop).join('.') : 'state.' + prop\r\n internal.lastAccessedPath = path\r\n if (internal.tracking) {\r\n internal.trackedPaths.add(path)\r\n }\r\n }\r\n\r\n // Handle special property to get last accessed path for primitive values\r\n if (prop === '_lastPath') {\r\n return internal.lastAccessedPath\r\n }\r\n\r\n if (prop === 'remove') {\r\n return (key: string) => {\r\n delete target[key]\r\n return true\r\n }\r\n }\r\n\r\n if (prop === 'removeAll') {\r\n return () => {\r\n try {\r\n for (const key in target) {\r\n if (typeof target[key] !== 'function' && !['list', 'remove', 'removeAll', 'lock', 'unlock'].includes(key)) {\r\n delete target[key]\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error)\r\n }\r\n return\r\n }\r\n }\r\n\r\n if (Object.isFrozen(target[prop])) return target[prop]\r\n\r\n // Handle lock/unlock properties - return from raw target\r\n if (prop === 'lock' || prop === 'unlock') {\r\n const value = Reflect.get(target, prop)\r\n if (value) return value\r\n }\r\n\r\n try {\r\n const value = Reflect.get(target, prop)\r\n if (value && typeof value === 'object' && ['Array', 'Object'].includes(value.constructor.name)) {\r\n // Reuse a cached wrapper for the same raw target to avoid allocating\r\n // a new Proxy on every read (critical in nested-read hot loops).\r\n let wrapper = wrapperCache.get(value)\r\n if (!wrapper) {\r\n wrapper = buildProxy(value, callback, tree.concat(prop as string))\r\n wrapperCache.set(value, wrapper)\r\n }\r\n return wrapper\r\n }\r\n // Return value directly - useObserver handles primitives via lastAccessedPath\r\n return value\r\n } catch (error) {\r\n console.error('Error: ', error)\r\n return undefined\r\n }\r\n\r\n },\r\n\r\n set(target: any, key: string, value: any): boolean {\r\n\r\n // LOCKED MODE - prevent all modifications\r\n if (internal.locked) {\r\n console.error('Error: state is locked. Use state.unlock() to enable modifications.')\r\n return false\r\n }\r\n\r\n // PROTECTED\r\n if (protect.includes(key)) {\r\n console.error('key ' + key + ' is protected')\r\n return false\r\n }\r\n\r\n // FREEZED\r\n if (target[key] && typeof target[key] === 'object' && Object.isFrozen(target[key])) {\r\n console.error(`Error: state '${key}' is locked`)\r\n return false\r\n }\r\n\r\n // LOCKED - check if this specific key is locked\r\n if (target[key] && typeof target[key] === 'object' && (target[key] as any).__locked) {\r\n console.error(`Error: state '${key}' is locked. Use state.${key}.unlock() to enable modifications.`)\r\n return false\r\n }\r\n\r\n // ALLOWED SET\r\n\r\n try {\r\n\r\n const path = objPath(key as string, tree)\r\n\r\n // Unwrap any Memorio proxies (and nested ones) before storing so we\r\n // never persist wrappers inside the raw state tree. This prevents the\r\n // exponential re-wrap growth caused by `{ ...state.x }` style updates.\r\n const rawValue = deepRaw(value)\r\n\r\n /**\r\n * SCHEMA VALIDATION\r\n * If a validator was registered for this path, reject the write\r\n * when it fails. The setter returns false so callers can detect\r\n * validation rejection.\r\n */\r\n const _schemaResult = schema.validate(path, rawValue)\r\n if (!_schemaResult.valid) {\r\n if (DEV && internal.debug) {\r\n console.error(\r\n `[memorio schema] Validation failed for '${path}':`,\r\n _schemaResult.errors\r\n )\r\n }\r\n message(\r\n `[memorio schema] Validation failed for '${path}': ` +\r\n (_schemaResult.errors?.join(', ') || 'unknown error')\r\n )\r\n return false\r\n }\r\n\r\n callback(\r\n {\r\n action: 'set',\r\n path,\r\n target,\r\n newValue: rawValue,\r\n previousValue: Reflect.get(target, key)\r\n }\r\n )\r\n\r\n event('state.' + path)\r\n\r\n Reflect.set(target, key, rawValue)\r\n\r\n // Increment state version for React dependency tracking\r\n internal.bumpStateVersion()\r\n // DEFINE LOCK PROPERTY FUNCTION\r\n // NOTE: lock/unlock is first-level only (non-recursive). Locking a\r\n // node freezes the node's own `__locked` flag and guards its direct\r\n // setters via the proxy traps, but does NOT recurse into deep\r\n // descendants — `state.a.lock()` locks `a`, not `a.b.c`. This keeps\r\n // the per-set O(1) cost; wrap descendants explicitly if needed.\r\n if (target[key] && typeof target[key] === 'object') {\n\r\n // Get the raw value from target directly (not through proxy)\r\n const lockValue = target[key]\r\n if (lockValue && typeof lockValue === 'object') {\r\n try {\r\n // Define lock and unlock methods on the object\r\n // Use a special property to track locked state\r\n Object.defineProperty(lockValue, '__locked', {\r\n writable: true,\r\n enumerable: false,\r\n configurable: false,\r\n value: false\r\n })\r\n Object.defineProperty(lockValue, 'lock', {\r\n writable: false,\r\n enumerable: false,\r\n configurable: false,\r\n value: () => {\r\n Object.defineProperty(lockValue, '__locked', {\r\n writable: true,\r\n enumerable: false,\r\n configurable: false,\r\n value: true\r\n })\r\n message(`State '${key}' is now locked.`)\r\n }\r\n })\r\n Object.defineProperty(lockValue, 'unlock', {\r\n writable: false,\r\n enumerable: false,\r\n configurable: false,\r\n value: () => {\r\n Object.defineProperty(lockValue, '__locked', {\r\n writable: true,\r\n enumerable: false,\r\n configurable: false,\r\n value: false\r\n })\r\n message(`State '${key}' is now unlocked.`)\r\n }\r\n })\r\n } catch (err) {\r\n if (DEV) console.warn('[memorio state] lock/unlock defineProperty failed:', err)\r\n }\r\n }\r\n\r\n }\r\n\r\n return true\r\n\r\n } catch (error) {\r\n\r\n console.error('Error in set trap:', error)\r\n return false\r\n\r\n }\r\n\r\n },\r\n\r\n deleteProperty(target: any, prop: string | symbol): boolean {\r\n try {\r\n const path = objPath(prop as string, tree)\r\n const previousValue = Reflect.get(target, prop)\r\n callback({ action: 'delete', path, target, previousValue })\r\n return Reflect.deleteProperty(target, prop)\r\n } catch (error) {\r\n console.error('Error in deleteProperty trap:', error)\r\n return false\r\n }\r\n },\r\n\r\n ownKeys(target: any): Array<string | symbol> {\r\n return Reflect.ownKeys(target)\r\n },\r\n\r\n getOwnPropertyDescriptor(target: any, prop: string | symbol): PropertyDescriptor | undefined {\r\n return Reflect.getOwnPropertyDescriptor(target, prop)\r\n }\r\n\r\n }\r\n\r\n )\r\n\r\n}\r\n\r\n// Reuse existing state proxy via private globalThis key to guard against\r\n// module duplication across ESM/CJS/absolute-path imports creating separate\r\n// state trees. The public `globalThis.state` is set separately by core/global.ts.\r\nconst STATE_INSTANCE_KEY = '__memorio_state_instance__'\r\nlet state: any\r\n\r\nif ((globalThis as any)[STATE_INSTANCE_KEY]) {\r\n state = (globalThis as any)[STATE_INSTANCE_KEY]\r\n} else {\r\n state = buildProxy({}, (mutation: any) => {\r\n if (internal.historyEnabled) {\r\n internal.recordMutation({\r\n path: mutation.path,\r\n action: mutation.action,\r\n newValue: mutation.newValue,\r\n previousValue: mutation.previousValue,\r\n timestamp: Date.now()\r\n })\r\n }\r\n })\r\n\r\n // Add lock/unlock methods to state\r\n state.lock = () => {\r\n internal.locked = true\r\n message('State is now locked. All modifications are blocked.')\r\n }\r\n\r\n state.unlock = () => {\r\n internal.locked = false\r\n message('State is now unlocked. Modifications are allowed.')\r\n }\r\n\r\n (globalThis as any)[STATE_INSTANCE_KEY] = state\r\n}\r\n\r\nexport { state }\r\nexport default state\r\n","/**\r\n * MEMORIO DISPATCH\r\n *\r\n * Event system for vanilla JS. Listens, emits and removes custom events\r\n * on globalThis using the platform-native CustomEvent / dispatchEvent.\r\n * Self-contained: it does NOT import observer (breaks the cycle) and\r\n * manages duplicate listeners via globalThis.events directly.\r\n * `core/global.ts` publishes it at the end of bootstrap.\r\n */\r\n\r\nexport const dispatch = {\r\n /**\r\n * Dispatches a custom event with the specified name and value.\r\n * @param name The name of the event.\r\n * @param value The value to pass with the event.\r\n */\r\n set: (name: string, value = {}): void => {\r\n globalThis.dispatchEvent(new CustomEvent(String(name), value))\r\n },\r\n\r\n ///\r\n /**\r\n * Subscribes a callback to an event name. Maintains a *list* of handlers per\r\n * name, so multiple subscribers on the same path (e.g. several\r\n * `useObserver` calls observing `state.report`) each keep firing and each\r\n * get an independent unsubscribe. The previous single-slot-per-name\r\n * behaviour silently dropped the second subscriber and let any unsubscribe\r\n * cancel every other subscriber on that path.\r\n * @param name The name of the event to listen for.\r\n * @param cb The callback function to execute when the event is triggered.\r\n * @returns An unsubscribe function for this subscriber, or void if no callback.\r\n */\r\n listen: (name: string, cb: ((e: Event) => void) | null = null, _flag?: boolean): (() => void) | void => {\r\n if (!cb) return\r\n const wrapped: (e: Event) => void = (e: Event) => {\r\n const target = e\r\n if (globalThis.queueMicrotask) {\r\n globalThis.queueMicrotask(() => cb(target))\r\n } else {\r\n Promise.resolve().then(() => cb(target))\r\n }\r\n }\r\n globalThis.addEventListener(name, wrapped)\r\n const list: Array<(e: Event) => void> = (globalThis.events[name] = globalThis.events[name] ?? [])\r\n list.push(wrapped)\r\n return () => {\r\n globalThis.removeEventListener(name, wrapped)\r\n const idx = list.indexOf(wrapped)\r\n if (idx > -1) list.splice(idx, 1)\r\n if (!list.length) delete globalThis.events[name]\r\n }\r\n },\r\n\r\n ///\r\n /**\r\n * Removes ALL handlers for the specified event name (imperative bulk\r\n * removal). For per-subscriber teardown, use the unsubscribe function\r\n * returned by `listen`.\r\n * @param name The name of the event to remove the listeners for.\r\n */\r\n remove: (name: string): void => {\r\n const entry = globalThis.events?.[name]\r\n if (Array.isArray(entry)) {\r\n entry.forEach((h: (e: Event) => void) => globalThis.removeEventListener(name, h))\r\n } else if (typeof entry === 'function') {\r\n globalThis.removeEventListener(name, entry as EventListener)\r\n }\r\n delete globalThis.events[name]\r\n }\r\n}\n\r\nexport default dispatch\r\n","/**\n * MEMORIO SCHEMA VALIDATION\n *\n * Lightweight, zero-dependency schema validation system that hooks into\n * the state proxy's set trap. When a schema is registered for a path,\n * any `state.set` at that path is validated before the value is written.\n *\n * Supported schema features:\n * - Type checking: 'string' | 'number' | 'boolean' | 'object' | 'array' | 'any'\n * - Required fields (on objects)\n * - Min/max constraints (numbers: value; strings: length)\n * - Regex pattern matching (strings)\n * - Enum membership\n * - Custom validator functions returning `true` or an error string\n * - Nested property validation (recursive object schemas)\n * - Array item validation (per-element schemas via `items`)\n *\n * @module memorio/schema\n */\n\nimport message from '../message'\n\n// --- Types ---\n\nexport type SchemaType = 'string' | 'number' | 'boolean' | 'object' | 'array' | 'any'\n\nexport interface Schema {\n /** Expected runtime type of the value. */\n type?: SchemaType\n /** Required property names when type is 'object'. */\n required?: string[]\n /** Nested property schemas (validated recursively). */\n properties?: Record<string, Schema>\n /** Item schema validated against each element when type is 'array'. */\n items?: Schema\n /** Minimum: value for numbers, length for strings. */\n min?: number\n /** Maximum: value for numbers, length for strings. */\n max?: number\n /** Regex pattern a string value must match. */\n pattern?: RegExp\n /** Whitelist of allowed values. */\n enum?: any[]\n /** Custom validator: return `true` for pass, or a string describing the error. */\n validator?: (value: any) => boolean | string\n}\n\nexport interface ValidationResult {\n /** Whether the value passed all checks. */\n valid: boolean\n /** Array of human-readable error strings (present when valid is false). */\n errors?: string[]\n}\n\n// --- Schema Registry ---\n\nconst _schemas = new Map<string, Schema>()\n\n// --- Core Validation ---\n\n/**\n * Recursively validates a value against a schema definition.\n * @param value The value to validate.\n * @param schema The schema to validate against.\n * @param path The dotted path (for error messages).\n * @returns ValidationResult with valid flag and optional errors.\n */\nconst _validateValue = (value: any, schema: Schema, path: string): ValidationResult => {\n const errors: string[] = []\n\n // --- Type check ---\n if (schema.type && schema.type !== 'any') {\n const actualType = Array.isArray(value) ? 'array' : typeof value\n if (actualType !== schema.type) {\n errors.push(`${path}: expected ${schema.type}, got ${actualType}`)\n return { valid: false, errors }\n }\n }\n\n // --- Enum check ---\n if (schema.enum && !schema.enum.includes(value)) {\n errors.push(`${path}: value must be one of [${schema.enum.map(String).join(', ')}]`)\n }\n\n // --- Custom validator ---\n if (schema.validator) {\n const result = schema.validator(value)\n if (result !== true) {\n errors.push(`${path}: ${typeof result === 'string' ? result : 'validation failed'}`)\n }\n }\n\n // --- Number constraints ---\n if (typeof value === 'number') {\n if (schema.min !== undefined && value < schema.min) {\n errors.push(`${path}: value ${value} is less than minimum ${schema.min}`)\n }\n if (schema.max !== undefined && value > schema.max) {\n errors.push(`${path}: value ${value} exceeds maximum ${schema.max}`)\n }\n }\n\n // --- String constraints ---\n if (typeof value === 'string') {\n if (schema.min !== undefined && value.length < schema.min) {\n errors.push(`${path}: string length ${value.length} is less than minimum ${schema.min}`)\n }\n if (schema.max !== undefined && value.length > schema.max) {\n errors.push(`${path}: string length ${value.length} exceeds maximum ${schema.max}`)\n }\n if (schema.pattern && !schema.pattern.test(value)) {\n errors.push(`${path}: string does not match required pattern`)\n }\n }\n\n // --- Object validation ---\n if (schema.type === 'object' && value && typeof value === 'object' && !Array.isArray(value)) {\n if (schema.required) {\n for (const req of schema.required) {\n if (!(req in value)) {\n errors.push(`${path}: missing required property '${req}'`)\n }\n }\n }\n if (schema.properties) {\n for (const [prop, propSchema] of Object.entries(schema.properties)) {\n if (prop in value && value[prop] !== undefined) {\n const propResult = _validateValue(value[prop], propSchema, `${path}.${prop}`)\n if (!propResult.valid) {\n errors.push(...(propResult.errors || []))\n }\n }\n }\n }\n }\n\n // --- Array item validation ---\n if (schema.type === 'array' && Array.isArray(value) && schema.items) {\n for (let i = 0; i < value.length; i++) {\n const itemResult = _validateValue(value[i], schema.items, `${path}[${i}]`)\n if (!itemResult.valid) {\n errors.push(...(itemResult.errors || []))\n }\n }\n }\n\n return errors.length === 0\n ? { valid: true }\n : { valid: false, errors }\n}\n\n// --- Public API ---\n\n/**\n * Validates a value against a previously registered schema.\n * If no schema is registered for the path, validation passes trivially.\n * @param path The state path (e.g. 'user', 'user.age').\n * @param value The value to validate.\n * @returns ValidationResult.\n */\nexport const validate = (path: string, value: any): ValidationResult => {\n const schema = _schemas.get(path)\n if (!schema) {\n return { valid: true }\n }\n return _validateValue(value, schema, path)\n}\n\n/**\n * Registers a schema (or custom validator) for a state path.\n *\n * The schema is checked by the state proxy on every write to the registered path.\n * If validation fails the write is rejected (returns false) and an error is logged.\n *\n * @param path The state path to guard (e.g. `'user'` catches `state.user = ...`).\n * @param schema A Schema object, or a custom validator function.\n *\n * @example\n * // Object schema with required fields and typed properties\n * memorio.registerSchema('user', {\n * type: 'object',\n * required: ['name', 'email'],\n * properties: {\n * name: { type: 'string', min: 1 },\n * email: { type: 'string', pattern: /^[^@]+@[^@]+$/' },\n * age: { type: 'number', min: 0 }\n * }\n * })\n *\n * @example\n * // Custom validator function\n * memorio.registerSchema('theme', (v) =>\n * v === 'light' || v === 'dark'\n * ? true\n * : 'theme must be \"light\" or \"dark\"')\n */\nexport const registerSchema = (\n path: string,\n schema: Schema | ((value: any) => boolean | string)\n): void => {\n if (typeof schema === 'function') {\n _schemas.set(path, { validator: schema as (value: any) => boolean | string })\n } else {\n _schemas.set(path, schema as Schema)\n }\n message(`[memorio schema] Registered schema for '${path}'`)\n}\n\n/**\n * Removes a previously registered schema.\n * @param path The state path to unregister.\n * @returns `true` if a schema was removed, `false` if none existed.\n */\nexport const unregisterSchema = (path: string): boolean => {\n return _schemas.delete(path)\n}\n\n/**\n * Lists all registered schema paths.\n * @returns Array of registered path strings.\n */\nexport const listSchemas = (): string[] => {\n return Array.from(_schemas.keys())\n}\n\n/**\n * Retrieves the schema registered for a path.\n * @param path The state path.\n * @returns The registered Schema, or `undefined`.\n */\nexport const getSchema = (path: string): Schema | undefined => {\n return _schemas.get(path)\n}\n\n// --- Namespace object ---\n\nconst schema = {\n register: registerSchema,\n validate,\n unregister: unregisterSchema,\n list: listSchemas,\n get: getSchema\n}\n\nexport default schema\nexport { schema }\n","/**\r\n * MEMORIO STORE (localStorage)\r\n *\r\n * This module provides localStorage persistence with a simple API.\r\n * It handles JSON serialization/deserialization automatically.\r\n *\r\n * **CLIENT-ONLY**: This module requires a browser environment with localStorage.\r\n * In Node.js/Deno, this will use an in-memory fallback.\r\n *\r\n * Storage Isolation:\r\n * - Each instance gets its own isolated namespace\r\n * - Prevents state leakage between different requests\r\n *\r\n * @todo v4.3.0 - Use AsyncLocalStorage for true request isolation in Node.js/Deno\r\n * Current: internal.currentContext is module-local (race condition in concurrent requests)\r\n */\r\n\r\n// STORE\r\n\r\nimport { getLocalStorage } from '../../core/platform'\r\nimport internal from '../../core/internal'\r\nimport { message } from '../message'\r\n\r\ntype _store = {\r\n get: (name: string) => any\r\n set: (name: string, value: any) => boolean\r\n remove: (name: string) => boolean\r\n delete: (name: string) => boolean\r\n removeAll: () => boolean\r\n clearAll: () => boolean\r\n quota: () => Promise<[number, number]>\r\n size: () => number\r\n list: () => Record<string, any>\r\n getMultiple: <T>(keys: string[]) => Record<string, T>\r\n isPersistent: boolean\r\n}\r\n\r\n// Get storage implementation based on environment\r\nconst _localStorage = getLocalStorage()\r\n\r\n// Fallback in-memory storage for Node.js/Deno - Map of context -> key-value pairs\r\nconst _fallbackStorageByContext = new Map<string, Map<string, string>>()\r\n\r\n// Get fallback storage for current context\r\nfunction _getFallbackStorage(): Map<string, string> {\r\n const contextName = internal.currentContext || ''\r\n const key = contextName || 'default'\r\n if (!_fallbackStorageByContext.has(key)) {\r\n _fallbackStorageByContext.set(key, new Map<string, string>())\r\n }\r\n return _fallbackStorageByContext.get(key)!\r\n}\r\n\r\n// Check if we have real localStorage\r\nconst _hasStorage = _localStorage !== null\r\n\r\n// Helper to get dynamic prefix based on current context\r\nfunction _getPrefix(): string {\r\n const contextName = internal.currentContext || ''\r\n return contextName ? `${contextName}-` : `memorio_store_`\r\n}\r\n\r\n// Helper to prefix keys with context-aware prefix\r\nfunction _prefixKey(name: string): string {\r\n // Validate key\r\n if (!name || typeof name !== 'string') {\r\n console.warn(`[memorio store] key is empty or not a string - operation aborted`)\r\n return ''\r\n }\r\n if (name.length > 512) {\r\n console.warn(`[memorio store] key \"${name}\" exceeds 512 chars - operation aborted`)\r\n return ''\r\n }\r\n // localStorage permits any string key. We no longer enforce a charset\r\n // because `:` and `/` are common namespace separators (e.g. \"a:b\").\r\n // Only empty/non-string keys are rejected (handled above).\r\n return _getPrefix() + name\r\n}\r\n\r\n// Read a raw (already prefixed) value, parsed from JSON.\r\nfunction _read(prefixedName: string): any {\r\n const raw = _hasStorage\r\n ? _localStorage.getItem(prefixedName)\r\n : _getFallbackStorage().get(prefixedName)\r\n return raw ? JSON.parse(raw) : raw\r\n}\r\n\r\n// Write a JSON-serializable value under a (already prefixed) key.\r\nfunction _write(prefixedName: string, value: any): void {\r\n const json = JSON.stringify(value)\r\n if (_hasStorage) _localStorage.setItem(prefixedName, json)\r\n else _getFallbackStorage().set(prefixedName, json)\r\n}\r\n\r\n// Remove a (already prefixed) key. Returns true if it existed.\r\nfunction _remove(prefixedName: string): boolean {\r\n if (_hasStorage) {\r\n if (_localStorage.getItem(prefixedName)) {\r\n _localStorage.removeItem(prefixedName)\r\n return true\r\n }\r\n } else if (_getFallbackStorage().has(prefixedName)) {\r\n _getFallbackStorage().delete(prefixedName)\r\n return true\r\n }\r\n return false\r\n}\r\n\r\n// Reuse existing store proxy via private globalThis key to guard against\r\n// module duplication across ESM/CJS/absolute-path imports. The public\r\n// `globalThis.store` is set separately by core/global.ts (dev only).\r\nconst STORE_INSTANCE_KEY = '__memorio_store_instance__'\r\nlet store: any\r\n\r\nif ((globalThis as any)[STORE_INSTANCE_KEY]) {\r\n store = (globalThis as any)[STORE_INSTANCE_KEY]\r\n} else {\r\n store = new Proxy({} as _store, {})\r\n\r\n Object.defineProperties(\r\n store,\r\n {\r\n /**\r\n * Gets a value from storage.\r\n * @param name The key to retrieve.\r\n * @returns The parsed value or null if not found.\r\n */\r\n get: {\r\n value: (name: string) => {\r\n if (!name) {\r\n console.warn('[memorio store] store.get() called with empty or null key - returning null')\r\n return null\r\n }\r\n try {\r\n return _read(_prefixKey(name))\r\n } catch (err) {\r\n message(`Error parsing store item '${name}': ${err}`)\r\n }\r\n return null\r\n }\r\n },\r\n\r\n getMultiple: {\r\n value: <T>(keys: string[]): Record<string, T> => {\r\n const result: Record<string, T> = {}\r\n for (const key of keys) {\r\n try {\r\n const item = store.get(key)\r\n if (item) result[key] = item\r\n } catch (err) {\r\n console.debug(`[memorio store] getMultiple error for key \"${key}\":`, err)\r\n }\r\n }\r\n return result\r\n }\r\n },\r\n\r\n /**\r\n * Sets a value in storage.\r\n * @param name The key to set.\r\n * @param value The value to store (objects, arrays, primitives).\r\n * @returns true if written, false if the key was rejected.\r\n */\r\n set: {\r\n value: (name: string, value: any): boolean => {\r\n if (!name) {\r\n console.warn('[memorio store] store.set() called with empty or null key - write aborted')\r\n return false\r\n }\r\n const prefixedName = _prefixKey(name)\r\n if (!prefixedName) return false\r\n if (typeof value === 'function') {\r\n console.warn('[memorio store] functions are not storable - write aborted for key: ' + name)\r\n message('Storing functions is not secure and is blocked for safety.')\r\n return false\r\n }\r\n try {\r\n _write(prefixedName, value)\r\n } catch (err) {\r\n message(`Error setting store item '${name}': ${err}`)\r\n return false\r\n }\r\n return true\r\n }\r\n },\r\n\r\n /**\r\n * Removes a value from storage.\r\n * @param name The key to remove.\r\n * @returns True if removed, false if not found.\r\n */\r\n remove: {\r\n value: (name: string) => {\r\n if (!name) {\r\n console.debug('[memorio store] store.remove() called with empty or null key - returning false')\r\n return false\r\n }\r\n const prefixedName = _prefixKey(name)\r\n if (!prefixedName) return false\r\n try {\r\n return _remove(prefixedName)\r\n } catch (err) {\r\n message(`Error removing store item '${name}': ${err}`)\r\n }\r\n return false\r\n }\r\n },\r\n\r\n /**\r\n * Alias for remove.\r\n * @param name The key to delete.\r\n */\r\n delete: {\r\n value: (name: string) => {\r\n return store.remove(name)\r\n }\r\n },\r\n\r\n /**\r\n * Clears all memorio items from storage.\r\n */\r\n removeAll: {\r\n value: () => {\r\n if (_hasStorage) {\r\n const keysToRemove: string[] = []\r\n for (let i = 0; i < _localStorage.length; i++) {\r\n const key = _localStorage.key(i)\r\n if (key?.startsWith(_getPrefix())) keysToRemove.push(key)\r\n }\r\n keysToRemove.forEach(key => _localStorage.removeItem(key))\r\n } else {\r\n _getFallbackStorage().clear()\r\n }\r\n return true\r\n }\r\n },\r\n\r\n /**\r\n * Alias for removeAll.\r\n */\r\n clearAll: {\r\n value: () => {\r\n store.removeAll()\r\n return true\r\n }\r\n },\r\n\r\n /**\r\n * Estimates storage quota usage.\r\n * @returns Promise with [usage, quota].\r\n */\r\n quota: {\r\n value: async (): Promise<[number, number]> => {\r\n return [0, 0] as [number, number]\r\n }\r\n },\r\n\r\n /**\r\n * Calculates total size of all memorio items in kilobytes.\r\n * Counts each prefixed key and its JSON-serialized value, summing their\r\n * byte lengths and converting to whole kilobytes (Math.ceil). Replaces\r\n * the previous character-only total which did not express real usage.\r\n * @returns Total size in kilobytes (0 when empty / no memorio items).\r\n */\r\n size: {\r\n value: () => {\r\n let totalBytes = 0\r\n if (_hasStorage) {\r\n for (let i = 0; i < _localStorage.length; i++) {\r\n const key = _localStorage.key(i)\r\n if (key && key.startsWith(_getPrefix())) {\r\n const item = _localStorage.getItem(key)\r\n if (item) totalBytes += key.length + item.length\r\n }\r\n }\r\n } else {\r\n _getFallbackStorage().forEach((value: string, key: string) => {\r\n totalBytes += key.length + value.length\r\n })\r\n }\r\n return totalBytes === 0 ? 0 : Math.ceil(totalBytes / 1024)\r\n }\r\n },\r\n\r\n /**\r\n * Check if using real localStorage or fallback\r\n */\r\n isPersistent: {\r\n get: () => _hasStorage\r\n },\r\n\r\n /**\r\n * Get a list of all memorio store items.\r\n */\r\n list: {\r\n value: (): Record<string, any> => {\r\n const result: Record<string, any> = {}\r\n try {\r\n if (_hasStorage) {\r\n for (let i = 0; i < _localStorage.length; i++) {\r\n const key = _localStorage.key(i)\r\n if (key?.startsWith(_getPrefix())) {\r\n const cleanKey = key.replace(_getPrefix(), '')\r\n const item = _localStorage.getItem(key)\r\n if (item !== null) {\r\n try {\r\n result[cleanKey] = JSON.parse(item)\r\n } catch {\r\n result[cleanKey] = item\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n _getFallbackStorage().forEach((value: string, key: string) => {\r\n if (key.startsWith(_getPrefix())) {\r\n const cleanKey = key.replace(_getPrefix(), '')\r\n try {\r\n result[cleanKey] = JSON.parse(value)\r\n } catch {\r\n result[cleanKey] = value\r\n }\r\n }\r\n })\r\n }\r\n } catch (err) {\r\n message(`Error listing store items: ${err}`)\r\n }\r\n return result\r\n }\r\n }\r\n\r\n }\r\n)\r\n\r\n\r\n Object.freeze(store as _store);\r\n (globalThis as any)[STORE_INSTANCE_KEY] = store\r\n}\r\n\r\nexport { store }\r\nexport default store\r\n","/**\r\n * MEMORIO SESSION (sessionStorage)\r\n *\r\n * This module provides sessionStorage persistence with a simple API.\r\n * Data is cleared when the browser tab is closed.\r\n *\r\n * **CLIENT-ONLY**: This module requires a browser environment with sessionStorage.\r\n * In Node.js/Deno, this will use an in-memory fallback.\r\n *\r\n * Session Isolation:\r\n * - Each session gets its own isolated namespace\r\n * - Prevents state leakage between different requests\r\n *\r\n * @todo v4.3.0 - Use AsyncLocalStorage for true request isolation in Node.js/Deno\r\n * Current: internal.currentContext is a global variable (race condition in concurrent requests)\r\n */\r\n\r\nimport { getSessionStorage } from '../../core/platform'\r\nimport internal from '../../core/internal'\r\nimport { message } from '../message'\r\n\r\ntype _session = {\r\n get: (name: string) => any\r\n set: (name: string, value: any) => boolean\r\n remove: (name: string) => boolean\r\n delete: (name: string) => boolean\r\n removeAll: () => boolean\r\n clearAll: () => boolean\r\n quota: () => Promise<[number, number]>\r\n size: () => number\r\n list: () => Record<string, any>\r\n isPersistent: boolean\r\n}\r\n\r\n// Get storage implementation based on environment\r\nconst _sessionStorage = getSessionStorage()\r\n\r\n// Fallback in-memory storage for Node.js/Deno - Map of context -> key-value pairs\r\nconst _fallbackStorageByContext = new Map<string, Map<string, string>>()\r\n\r\n// Get fallback storage for current context\r\nfunction _getFallbackStorage(): Map<string, string> {\r\n const contextName = internal.currentContext || ''\r\n const key = contextName || 'default'\r\n if (!_fallbackStorageByContext.has(key)) {\r\n _fallbackStorageByContext.set(key, new Map<string, string>())\r\n }\r\n return _fallbackStorageByContext.get(key)!\r\n}\r\n\r\n// Check if we have real sessionStorage\r\nconst _hasStorage = _sessionStorage !== null\r\n\r\n// Helper to get dynamic prefix based on current context\r\nfunction _getPrefix(): string {\r\n const contextName = internal.currentContext || ''\r\n return contextName ? `${contextName}-` : `memorio_session_`\r\n}\r\n\r\n// Helper to prefix keys with context-aware prefix\r\nfunction _prefixKey(name: string): string {\r\n // Validate key\r\n if (!name || typeof name !== 'string') {\r\n console.warn('[memorio session] key is empty or not a string - operation aborted')\r\n return ''\r\n }\r\n if (name.length > 512) {\r\n console.warn(`[memorio session] key \"${name}\" exceeds 512 chars - operation aborted`)\r\n return ''\r\n }\r\n // sessionStorage permits any string key. We no longer enforce a charset\r\n // because ':' and '/' are common namespace separators (e.g. 'app:section').\r\n // Only empty/non-string keys are rejected (handled above).\r\n return _getPrefix() + name\r\n}\r\n\r\n// Read a raw (already prefixed) value, parsed from JSON.\r\nfunction _read(prefixedName: string): any {\r\n const raw = _hasStorage\r\n ? _sessionStorage.getItem(prefixedName)\r\n : _getFallbackStorage().get(prefixedName)\r\n return raw ? JSON.parse(raw) : raw\r\n}\r\n\r\n// Write a JSON-serializable value under a (already prefixed) key.\r\nfunction _write(prefixedName: string, value: any): void {\r\n const json = JSON.stringify(value)\r\n if (_hasStorage) _sessionStorage.setItem(prefixedName, json)\r\n else _getFallbackStorage().set(prefixedName, json)\r\n}\r\n\r\n// Remove a (already prefixed) key. Returns true if it existed.\r\nfunction _remove(prefixedName: string): boolean {\r\n if (_hasStorage) {\r\n if (_sessionStorage.getItem(prefixedName)) {\r\n _sessionStorage.removeItem(prefixedName)\r\n return true\r\n }\r\n } else if (_getFallbackStorage().has(prefixedName)) {\r\n _getFallbackStorage().delete(prefixedName)\r\n return true\r\n }\r\n return false\r\n}\r\n\r\n// Reuse existing session proxy via private globalThis key to guard against\r\n// module duplication across ESM/CJS/absolute-path imports. The public\r\n// `globalThis.session` is set separately by core/global.ts (dev only).\r\nconst SESSION_INSTANCE_KEY = '__memorio_session_instance__'\r\nlet session: any\r\n\r\nif ((globalThis as any)[SESSION_INSTANCE_KEY]) {\r\n session = (globalThis as any)[SESSION_INSTANCE_KEY]\r\n} else {\r\n session = new Proxy({} as _session, {})\r\n\r\n Object.defineProperties(\r\n session,\r\n {\r\n /**\r\n * Gets a value from storage.\r\n * @param name The key to retrieve.\r\n * @returns The parsed value or null if not found.\r\n */\r\n get: {\r\n value: (name: string) => {\r\n if (!name) {\r\n console.warn('[memorio session] session.get() called with empty or null key - returning null')\r\n return null\r\n }\r\n try {\r\n return _read(_prefixKey(name))\r\n } catch (err) {\r\n message(`Error parsing session item '${name}':${err}`)\r\n }\r\n return null\r\n }\r\n },\r\n\r\n /**\r\n * Sets a value in storage.\r\n * @param name The key to set.\r\n * @param value The value to store.\r\n * @returns true if written, false if the key was rejected.\r\n */\r\n set: {\r\n value: (name: string, value: any): boolean => {\r\n if (!name) {\r\n console.warn('[memorio session] session.set() called with empty or null key - write aborted')\r\n return false\r\n }\r\n const prefixedName = _prefixKey(name)\r\n if (!prefixedName) return false\r\n if (typeof value === 'function') {\r\n console.warn('[memorio session] functions are not storable - write aborted for key: ' + name)\r\n message('It\\'s not secure to session functions.')\r\n return false\r\n }\r\n try {\r\n _write(prefixedName, value)\r\n } catch (err) {\r\n message(`Error setting session item '${name}': ${err}`)\r\n return false\r\n }\r\n return true\r\n }\r\n },\r\n\r\n /**\r\n * Removes a value from storage.\r\n * @param name The key to remove.\r\n * @returns True if removed.\r\n */\r\n remove: {\r\n value: (name: string): boolean => {\r\n if (!name) {\r\n console.warn('[memorio session] session.remove() called with empty or null key - returning false')\r\n return false\r\n }\r\n const prefixedName = _prefixKey(name)\r\n if (!prefixedName) return false\r\n try {\r\n return _remove(prefixedName)\r\n } catch (err) {\r\n message(`Error removing session item '${name}': ${err}`)\r\n }\r\n return false\r\n }\r\n },\r\n\r\n /**\r\n * Alias for remove.\r\n * @param name The key to delete.\r\n * @returns True if removed.\r\n */\r\n delete: {\r\n value: (name: string): boolean => {\r\n return session.remove(name)\r\n }\r\n },\r\n\r\n /**\r\n * Clears all sessionStorage items.\r\n */\r\n removeAll: {\r\n value: () => {\r\n if (_hasStorage) {\r\n // Only clear keys with our prefix\r\n const keysToRemove: string[] = []\r\n for (let i = 0; i < _sessionStorage.length; i++) {\r\n const key = _sessionStorage.key(i)\r\n if (key?.startsWith(_getPrefix())) {\r\n keysToRemove.push(key)\r\n }\r\n }\r\n keysToRemove.forEach(key => _sessionStorage.removeItem(key))\r\n } else {\r\n _getFallbackStorage().clear()\r\n }\r\n return true\r\n }\r\n },\r\n\r\n /**\r\n * Alias for removeAll.\r\n */\r\n clearAll: {\r\n value: () => {\r\n session.removeAll()\r\n return true\r\n }\r\n },\r\n\r\n quota: {\r\n value: async (): Promise<[number, number]> => {\r\n return [0, 0] as [number, number]\r\n }\r\n },\r\n\r\n /**\r\n * Calculates total size of all memorio session items in kilobytes.\r\n * Counts each prefixed key and its JSON-serialized value, summing their\r\n * byte lengths and converting to whole kilobytes (Math.ceil).\r\n * @returns Total size in kilobytes (0 when empty / no memorio items).\r\n */\r\n size: {\r\n value: () => {\r\n let totalBytes = 0\r\n if (_hasStorage) {\r\n for (let i = 0; i < _sessionStorage.length; i++) {\r\n const key = _sessionStorage.key(i)\r\n // Only count keys with our prefix\r\n if (key && key.startsWith(_getPrefix())) {\r\n const item = _sessionStorage.getItem(key)\r\n if (item) totalBytes += key.length + item.length\r\n }\r\n }\r\n } else {\r\n _getFallbackStorage().forEach((value: string, key: string) => {\r\n totalBytes += key.length + value.length\r\n })\r\n }\r\n return totalBytes === 0 ? 0 : Math.ceil(totalBytes / 1024)\r\n }\r\n },\r\n\r\n /**\r\n * Check if using real sessionStorage or fallback\r\n */\r\n isPersistent: {\r\n get: () => _hasStorage\r\n },\r\n\r\n /**\r\n * Get a list of all memorio session items.\r\n */\r\n list: {\r\n value: (): Record<string, any> => {\r\n const result: Record<string, any> = {}\r\n try {\r\n if (_hasStorage) {\r\n for (let i = 0; i < _sessionStorage.length; i++) {\r\n const key = _sessionStorage.key(i)\r\n if (key?.startsWith(_getPrefix())) {\r\n const cleanKey = key.replace(_getPrefix(), '')\r\n const item = _sessionStorage.getItem(key)\r\n if (item !== null) {\r\n try {\r\n result[cleanKey] = JSON.parse(item)\r\n } catch {\r\n result[cleanKey] = item\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n _getFallbackStorage().forEach((value: string, key: string) => {\r\n if (key.startsWith(_getPrefix())) {\r\n const cleanKey = key.replace(_getPrefix(), '')\r\n try {\r\n result[cleanKey] = JSON.parse(value)\r\n } catch {\r\n result[cleanKey] = value\r\n }\r\n }\r\n })\r\n }\r\n } catch (err) {\r\n message(`Error listing session items: ${err}`)\r\n }\r\n return result\r\n }\r\n }\r\n\r\n }\r\n )\r\n\r\n\r\n Object.freeze(session as _session);\r\n (globalThis as any)[SESSION_INSTANCE_KEY] = session\r\n}\r\n\r\nexport { session }\r\nexport default session\r\n","/**\r\n * Hybrid Logical Clock (HLC) for memorio.\r\n *\r\n * Combines a physical timestamp (Date.now), a logical counter, and a node\r\n * identifier to provide constant-size causal ordering across devices.\r\n * This is preferred over vector clocks (which grow with the number of writers)\r\n * because the sync journal must remain bounded in size.\r\n *\r\n * Format: `{ physical: number, logical: number, node: string }`\r\n * Serialized as a string for storage: `\"hlc:<physical>:<logical>:<node>\"`\r\n *\r\n * The algorithm follows the standard HLC construction:\r\n * 1. If the incoming timestamp is greater than the local physical clock,\r\n * advance the physical clock and reset logical to 0.\r\n * 2. If equal, increment the logical counter.\r\n * 3. If less, increment the logical counter.\r\n *\r\n * @module memorio/hlc\r\n */\r\n\r\nexport interface HLC {\r\n physical: number\r\n logical: number\r\n node: string\r\n}\r\n\r\nconst NODE_ID_KEY = '__memorio_hlc_node'\r\n\r\n/**\r\n * Returns the current node identifier for HLC generation.\r\n * The node ID is stable per origin/device and persisted in sessionStorage\r\n * (or an in-memory fallback when sessionStorage is unavailable).\r\n * For server-side usage, falls back to a process-based identifier.\r\n */\r\nfunction getNodeId(): string {\r\n if (typeof globalThis === 'undefined') return 'node'\r\n\r\n try {\r\n if (typeof sessionStorage !== 'undefined' && sessionStorage) {\r\n let id = sessionStorage.getItem(NODE_ID_KEY)\r\n if (!id) {\r\n id = generateNodeId()\r\n sessionStorage.setItem(NODE_ID_KEY, id)\r\n }\r\n return id\r\n }\r\n } catch {\r\n /* fall through to in-memory */\r\n }\r\n\r\n if (!(globalThis as any).__memorioHlcNodeId) {\r\n (globalThis as any).__memorioHlcNodeId = generateNodeId()\r\n }\r\n return (globalThis as any).__memorioHlcNodeId\r\n}\r\n\r\nfunction generateNodeId(): string {\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID().slice(0, 8)\r\n }\r\n return Math.random().toString(36).slice(2, 10)\r\n}\r\n\r\n/** Local HLC state - updated on every `hlcNow()` call.\r\n * Stored on globalThis as a singleton so all module instances share the same\r\n * clock (module duplication across ESM/CJS boundaries would otherwise create\r\n * independent clocks and produce duplicate/out-of-order timestamps). */\r\nconst HLC_KEY = '__memorio_hlc_local'\r\nconst local: HLC = (globalThis as any)[HLC_KEY] || {\r\n physical: 0,\r\n logical: 0,\r\n node: getNodeId()\r\n}\r\nif (!(globalThis as any)[HLC_KEY]) {\r\n (globalThis as any)[HLC_KEY] = local\r\n}\r\n\r\n/**\r\n * Produces the next HLC timestamp, advancing from the local state.\r\n * If `incoming` is provided (e.g. received from a remote device), the clock\r\n * is synchronized to the maximum physical time before ticking.\r\n */\r\nfunction tick(_incoming?: HLC): HLC {\r\n const now = Date.now()\r\n const base = local.physical\r\n let physical: number\r\n let logical: number\r\n\r\n if (now > base) {\r\n physical = now\r\n logical = 0\r\n } else if (now < base) {\r\n physical = base\r\n logical = local.logical + 1\r\n } else {\r\n physical = base\r\n logical = local.logical + 1\r\n }\r\n\r\n local.physical = physical\r\n local.logical = logical\r\n\r\n return { physical, logical, node: local.node }\r\n}\r\n\r\n/**\r\n * Updates the local wall-clock component from a received HLC without\r\n * necessarily ticking (used during sync before replaying remote entries).\r\n * Returns the possibly-updated local clock.\r\n */\r\nfunction receive(remote: HLC): HLC {\r\n const now = Date.now()\r\n\r\n if (remote.physical > local.physical) {\r\n local.physical = remote.physical > now ? remote.physical : now\r\n local.logical = 1\r\n } else if (remote.physical === local.physical) {\r\n local.logical = Math.max(local.logical, remote.logical) + 1\r\n }\r\n local.node = getNodeId()\r\n\r\n return { ...local }\r\n}\r\n\r\n/**\r\n * Compares two HLC timestamps.\r\n * Returns:\r\n * - `-1` if `a` happened before `b` (causally prior)\r\n * - ` 1` if `a` happened after `b` (causally subsequent)\r\n * - ` 0` if `a` and `b` are concurrent (cannot be ordered)\r\n */\r\nfunction compare(a: HLC, b: HLC): number {\r\n if (a.physical !== b.physical) {\r\n return a.physical < b.physical ? -1 : 1\r\n }\r\n if (a.logical !== b.logical) {\r\n return a.logical < b.logical ? -1 : 1\r\n }\r\n if (a.node !== b.node) {\r\n return a.node < b.node ? -1 : 1\r\n }\r\n return 0\r\n}\r\n\r\n/**\r\n * Determines whether `a` causally happened-before `b`.\r\n */\r\nfunction happenedBefore(a: HLC, b: HLC): boolean {\r\n return compare(a, b) < 0\r\n}\r\n\r\n/**\r\n * Serializes an HLC to a compact string for journal storage.\r\n */\r\nfunction serialize(hlc: HLC): string {\r\n return `hlc:${hlc.physical}:${hlc.logical}:${hlc.node}`\r\n}\r\n\r\n/**\r\n * Parses a serialized HLC string back into an HLC object.\r\n */\r\nfunction parse(serialized: string): HLC | null {\r\n if (!serialized.startsWith('hlc:')) return null\r\n const parts = serialized.split(':')\r\n if (parts.length !== 4) return null\r\n const physical = parseInt(parts[1], 10)\r\n const logical = parseInt(parts[2], 10)\r\n const node = parts[3]\r\n if (isNaN(physical) || isNaN(logical)) return null\r\n return { physical, logical, node }\r\n}\r\n\r\nexport const hlc = {\r\n tick,\r\n receive,\r\n compare,\r\n happenedBefore,\r\n serialize,\r\n parse,\r\n getNodeId\r\n}\r\n\r\nexport default hlc\r\n","/**\r\n * MEMORIO MEMORY JOURNAL (local sync layer)\r\n *\r\n * A local, namespaced operation journal that records every memory mutation\r\n * (`remember` / `update` / `forget` / `expire` / `confirm` / `supersede`) so it\r\n * can be reconciled with an optional cloud backend.\r\n *\r\n * Trust model (OWASP / NIST-aligned, client-side envelope):\r\n * - The journal is partitioned by a `namespace` (tenant/user/device) that the\r\n * application establishes via `configure({ namespace })`. A read or write\r\n * for one namespace never touches another - there is no API surface that can\r\n * enumerate or open a different namespace, so a compromised/fake account\r\n * cannot blindly dump the whole journal.\r\n * - Memorio never handles credentials. Authentication and authorization for a\r\n * namespace live in the application-owned `sync.provider` (REST, WebSocket,\r\n * Supabase, a custom agent server, ...). The provider is the only component\r\n * that talks to the cloud, and only for the locally-configured namespace.\r\n * - Locally, data is stored per-substrate and keyed by `namespace:id`, so\r\n * namespace boundaries are enforced at the storage layer, not just the API.\r\n *\r\n * Persistence: sql.js databases are *in-memory* (volatile, per page load), so\r\n * the journal is persisted on `store` (localStorage / in-memory Map fallback)\r\n * which survives reloads - this is what makes offline-first sync correct. The\r\n * `sqlite` engine is still used for ad-hoc SQL on `sqlite.db.*` databases; that\r\n * is the consumer's responsibility to export/import if they need it durable.\r\n *\r\n * No `eval`, no dynamic code generation. Entries are strictly JSON-round-tripped\r\n * and size-capped on write.\r\n */\r\n\r\nimport type {\r\n MemoryEntry,\r\n MemoryOperation,\r\n MemorySync,\r\n SyncConfig,\r\n SyncAck\r\n} from '../../types/memory'\r\nimport { hlc } from '../../core/hlc'\r\nimport { DEV } from '../../core/env'\r\nimport { store } from '../store'\r\n\r\nconst g = globalThis as any\r\n\r\nfunction namespace(): string {\r\n const cfg = g.memorioSyncConfig\r\n if (cfg && typeof cfg.namespace === 'string' && cfg.namespace) return `ns:${cfg.namespace}`\r\n // Defense-in-depth: even without an explicit namespace, isolate per memorio\r\n // context so contexts cannot read each other's journal entries.\r\n const ctx = g.memorio ? g.memorio._currentContext : undefined\r\n const ctxName = typeof ctx === 'string' && ctx ? ctx : ''\r\n return ctxName ? `ctx:${ctxName}` : 'default'\r\n}\r\n\r\nfunction isSyncEnabled(): boolean {\r\n return !!g.memorioSyncConfig\r\n}\r\n\r\nconst STORE_PREFIX = (ns: string) => `memorio:sync:${ns}:`\r\nconst INDEX_KEY = (ns: string) => `${STORE_PREFIX(ns)}index`\r\n\r\nfunction parseEntry(raw: string | MemoryEntry): MemoryEntry | null {\r\n try {\r\n if (typeof raw === 'string') return JSON.parse(raw) as MemoryEntry\r\n return raw as MemoryEntry\r\n } catch (err) {\r\n if (DEV) console.warn('[memorio memory] failed to parse journal entry:', err)\r\n return null\r\n }\n}\r\n\r\nconst journal: MemoryJournal = {\r\n /** Append (or replace) a journal row for the current namespace. */\r\n async append(entry: MemoryEntry, operation: MemoryOperation): Promise<MemoryEntry> {\r\n const ns = namespace()\r\n const row: MemoryEntry = {\r\n ...entry,\r\n operation,\r\n updatedAt: entry.updatedAt || Date.now(),\r\n version: entry.version || 1,\r\n sync: 'pending' as MemorySync,\r\n hlc: entry.hlc || hlc.serialize(hlc.tick())\r\n }\r\n const key = `${STORE_PREFIX(ns)}${row.id}`\r\n store.set(key, row)\r\n const idx: string[] = store.get(INDEX_KEY(ns)) || []\r\n if (!idx.includes(row.id)) idx.push(row.id)\r\n store.set(INDEX_KEY(ns), idx)\r\n return row\r\n },\r\n\r\n /** All pending (not-yet-synced) entries for the current namespace. */\r\n async pending(): Promise<MemoryEntry[]> {\r\n const ns = namespace()\r\n const out: MemoryEntry[] = []\r\n const idx: string[] = store.get(INDEX_KEY(ns)) || []\r\n for (const id of idx) {\r\n const raw = store.get(`${STORE_PREFIX(ns)}${id}`)\r\n if (!raw) continue\r\n const e = parseEntry(raw)\r\n if (e && e.sync !== 'synced') out.push(e)\r\n }\r\n out.sort((a, b) => {\r\n if (a.hlc && b.hlc) {\r\n const ha = hlc.parse(a.hlc)\r\n const hb = hlc.parse(b.hlc)\r\n if (ha && hb) return hlc.compare(ha, hb)\r\n }\r\n return (a.updatedAt || 0) - (b.updatedAt || 0)\r\n })\r\n return out\r\n },\r\n\r\n /**\r\n * Mark entries as synced. Returns the number of rows actually advanced to\r\n * `synced` (namespace-scoped).\r\n */\r\n async markSynced(ids: string[]): Promise<number> {\r\n if (!ids.length) return 0\r\n const ns = namespace()\r\n let count = 0\r\n const idx: string[] = store.get(INDEX_KEY(ns)) || []\r\n for (const id of idx) {\r\n if (!ids.includes(id)) continue\r\n const key = `${STORE_PREFIX(ns)}${id}`\r\n const raw = store.get(key)\r\n if (!raw) continue\r\n const e = parseEntry(raw)\r\n if (!e || e.sync === 'synced') continue\r\n e.sync = 'synced'\r\n store.set(key, e)\r\n count++\r\n }\r\n return count\r\n },\r\n\r\n async get(id: string): Promise<MemoryEntry | null> {\r\n const ns = namespace()\r\n const raw = store.get(`${STORE_PREFIX(ns)}${id}`)\r\n return parseEntry(raw ?? '')\r\n },\r\n\r\n /** Remove all journal rows for the current namespace. */\r\n async clear(): Promise<void> {\r\n const ns = namespace()\r\n const idx: string[] = store.get(INDEX_KEY(ns)) || []\r\n for (const id of idx) store.remove(`${STORE_PREFIX(ns)}${id}`)\r\n store.remove(INDEX_KEY(ns))\r\n },\r\n\r\n /**\r\n * Reconcile the local journal against the configured provider. Pushes pending\r\n * local operations, then optionally pulls newer remote operations and applies\r\n * them. No-op (empty ack) when no provider is configured.\r\n *\r\n * When pulling remote entries, HLC timestamps are used to order operations\r\n * causally. Concurrent writes to the same key (HLC tie) are resolved via the\r\n * provider's `resolveConflict` method (if provided), otherwise the REMOTE\r\n * entry wins by default (logged at warn level in dev). Provide a resolver on\r\n * the sync provider to override this behaviour and prevent silent local data\r\n * loss.\n */\r\n async replay(): Promise<SyncAck> {\r\n const ack: SyncAck = { synced: [], resolved: [] }\r\n if (!isSyncEnabled()) return ack\r\n const transport = (g.memorioSyncConfig || {}) as SyncConfig\r\n const provider = transport.provider\r\n if (!provider || typeof provider.push !== 'function') return ack\r\n\r\n const pending = await this.pending()\r\n if (pending.length) {\r\n try {\r\n const res = await provider.push(pending)\r\n ack.synced = res?.synced || []\r\n ack.conflicts = res?.conflicts\r\n ack.error = res?.error\r\n if (ack.synced.length) await this.markSynced(ack.synced)\r\n } catch (err) {\r\n ack.error = String(err)\r\n }\r\n }\r\n\r\n if (typeof provider.pull === 'function') {\r\n try {\r\n const since = pending.length\r\n ? Math.min(...pending.map(p => p.updatedAt || 0))\r\n : 0\r\n const remote = await provider.pull(since)\r\n\r\n for (const e of remote || []) {\r\n if (e.hlc) {\r\n const parsed = hlc.parse(e.hlc)\r\n if (parsed) hlc.receive(parsed)\r\n }\r\n\r\n const localEntry = await this.get(e.id)\r\n if (localEntry && e.hlc && localEntry.hlc) {\r\n const ha = hlc.parse(localEntry.hlc)\r\n const hb = hlc.parse(e.hlc)\r\n if (ha && hb) {\r\n const cmp = hlc.compare(ha, hb)\r\n if (cmp === 0) {\r\n const hasResolver = typeof provider.resolveConflict === 'function'\r\n const resolution = hasResolver\r\n ? await provider.resolveConflict(localEntry, e)\r\n : 'remote'\r\n if (!hasResolver && DEV) {\r\n console.warn(`[memorio memory] replay() conflict for \"${e.id}\": no resolveConflict handler provided, defaulting to remote-wins`)\r\n }\r\n ack.resolved?.push({ id: e.id, resolution })\r\n if (resolution === 'local') continue\r\n } else if (cmp > 0) {\r\n continue\r\n }\r\n }\r\n }\r\n\r\n await this.append(e, (e.operation as MemoryOperation) || 'confirm')\r\n await this.markSynced([e.id])\r\n }\r\n } catch (err) {\r\n if (DEV) console.warn('[memorio memory] sync pull failed:', err)\r\n }\n }\r\n return ack\r\n },\r\n\r\n status(): Promise<'store'> {\r\n // Journal is always persisted on `store` (localStorage / Map fallback).\r\n return Promise.resolve('store')\r\n }\r\n}\r\n\r\n/** Configure the sync layer (namespace + provider). Returns the journal. */\r\nexport function configure(opts: SyncConfig): any {\r\n const prev: SyncConfig = g.memorioSyncConfig || {}\r\n g.memorioSyncConfig = { ...prev, ...opts }\r\n return journal\r\n}\r\n\r\n/** Best-effort auto-replay when the tab regains focus / connectivity. */\r\nif (typeof g.addEventListener === 'function') {\r\n let armed = false\r\n g.addEventListener('focus', () => {\r\n if (armed || !isSyncEnabled()) return\r\n armed = true\r\n void journal.replay().finally(() => { armed = false })\r\n })\r\n}\r\n\r\nexport default journal\r\nexport interface MemoryJournal {\r\n append(entry: MemoryEntry, operation: MemoryOperation): Promise<MemoryEntry>\r\n pending(): Promise<MemoryEntry[]>\r\n markSynced(ids: string[]): Promise<number>\r\n get(id: string): Promise<MemoryEntry | null>\r\n clear(): Promise<void>\r\n replay(): Promise<SyncAck>\r\n status(): Promise<'store'>\r\n}\r\n","/**\n * MEMORIO REDUX ADAPTER - HYDRATION (Memorio -> Redux, one-shot)\n *\n * At application bootstrap, Memorio is the durable owner of mapped values\n * (#31). This recalls those memories and hands them back to the application\n * so it can re-dispatch restore actions into Redux. Hydration is NOT continuous\n * - Memorio never writes back into Redux state at runtime (#9/#6).\n *\n * Failure isolation (#17/#18): by default a failed recall is swallowed and the\n * corresponding key is simply absent from the result; Redux boots with its own\n * default/initial state.\n */\n\nimport { memory } from '../../functions/memory'\nimport type {\n MemorioMapping,\n MemorioReduxOptions\n} from './types'\nimport { normalizeMappings, selectValues } from './selectors'\n\nexport interface HydrateOptions<S>\n extends Pick<MemorioReduxOptions<S>, 'failSoft' | 'onError' | 'debug'> {\n /**\n * Invoked with recalled values so the application can dispatch its own\n * restore actions (actions are the integration boundary, #11). The\n * re-entrancy guard + cache seeding described below only apply when a\n * `bridge` is supplied.\n */\n onHydration?: (values: Record<string, unknown>) => void\n}\n\nexport interface HydrationResult {\n /** Recalled memory values keyed by memory key. */\n values: Record<string, unknown>\n /** False if any recall failed (and failSoft swallowed it). */\n ok: boolean\n}\n\nexport interface HydrateBridge<S> {\n /** Middleware change-detection cache to seed with recalled values. */\n cache: Record<string, unknown>\n /** Arms/disarms the Memorio->Redux re-entrancy guard (#10 loop prevention). */\n setHydrating: (v: boolean) => void\n /** Redux state accessor after restore actions are dispatched. */\n getState: () => S\n}\n\n/**\n * Recalls every mapped memory from Memorio and returns the values.\n *\n * When `bridge` is supplied the call:\n * 1. arms the loop guard (`setHydrating(true)`),\n * 2. recalls values,\n * 3. calls `opts.onHydration(values)` (app dispatches restore actions),\n * 4. seeds the middleware cache with the post-restore selected values so the\n * restore dispatch is seen as \"no change\" (no echo #10),\n * 5. disarms the guard.\n *\n * This keeps the whole Memorio->Redux->(middleware)->Memorio cycle from\n * persisting back.\n */\nexport async function hydrateMemorio<S>(\n mappings: Record<string, MemorioMapping<S> | ((state: S) => unknown)>,\n opts: HydrateOptions<S> = {},\n bridge?: HydrateBridge<S>\n): Promise<HydrationResult> {\n const canonical = normalizeMappings<S>(mappings)\n const values: Record<string, unknown> = {}\n let ok = true\n\n bridge?.setHydrating(true)\n try {\n for (const key of Object.keys(canonical)) {\n try {\n const recalled = await memory.recall(key)\n if (recalled !== null && recalled !== undefined) values[key] = recalled\n } catch (err) {\n ok = false\n if (opts.failSoft === false) throw err\n opts.onError?.(err, 'hydrate')\n if (opts.debug) {\n console.debug(`[memorio/redux] hydrate recall failed for \"${key}\"`, err)\n }\n }\n }\n\n if (opts.onHydration) {\n opts.onHydration(values)\n // Seed the middleware cache with the selected values *after* the app's\n // restore action has mutated Redux state, so the middleware observes no\n // delta and does not echo the value back into Memorio (#10).\n if (bridge) {\n const selected = selectValues(bridge.getState(), canonical)\n for (const key of Object.keys(selected)) {\n bridge.cache[key] = selected[key]\n }\n }\n }\n } finally {\n bridge?.setHydrating(false)\n }\n\n return { values, ok }\n}\n","/**\n * MEMORIO REDUX ADAPTER - INTEGRATED BRIDGE\n *\n * `createMemorioReduxBridge` is the recommended one-stop entry point: it\n * returns a Redux middleware plus a `hydrate` helper that share the SAME\n * change-detection cache and re-entrancy guard, so the\n * Memorio -> Redux (hydration) -> middleware (echo) cycle is provably inert.\n *\n * Usage:\n * const memorio = createMemorioReduxBridge<AppState>({ mappings })\n * const store = createStore(reducer, applyMiddleware(memorio.middleware))\n * await memorio.hydrate(store, {\n * onHydration: (values) => store.dispatch(restorePreferences(values))\n * })\n */\n\nimport { createMemorioMiddleware } from './middleware'\nimport { hydrateMemorio } from './hydration'\nimport type {\n MemorioMapping,\n MemorioReduxAction,\n MemorioReduxOptions,\n MemorioReduxStoreLike\n} from './types'\n\nexport interface MemorioReduxBridge<\n S = unknown,\n A extends MemorioReduxAction = MemorioReduxAction\n> {\n /** Redux middleware: install via `applyMiddleware(bridge.middleware)`. */\n readonly middleware: ReturnType<\n typeof createMemorioMiddleware<S, A>\n >['middleware']\n /** One-shot Memorio -> Redux hydration. */\n hydrate: (\n store: MemorioReduxStoreLike<S, A>,\n opts?: { onHydration?: (values: Record<string, unknown>) => void }\n ) => Promise<{ values: Record<string, unknown>; ok: boolean }>\n /** Flush any pending persist immediately (tests / explicit flush). */\n flush: () => Promise<void>\n /** Tear down: clear caches. The middleware auto-unregisters with Redux. */\n disconnect: () => void\n /** Shared change-detection cache (advanced: pre-seed before hydration). */\n readonly cache: Record<string, unknown>\n}\n\nexport function createMemorioReduxBridge<\n S = any,\n A extends MemorioReduxAction = MemorioReduxAction\n>(\n opts: MemorioReduxOptions<S> = {}\n): MemorioReduxBridge<S, A> {\n const handle = createMemorioMiddleware<S, A>(opts)\n let disconnected = false\n\n return {\n middleware: handle.middleware,\n cache: handle.cache,\n flush: handle.flush,\n disconnect: () => {\n if (disconnected) return\n disconnected = true\n handle.cache && Object.keys(handle.cache).forEach((k) => delete handle.cache[k])\n handle.setHydrating(false)\n },\n hydrate: async (store, hopts = {}) => {\n // `hydrateMemorio` arms the loop guard, recalls, lets the app re-dispatch\n // via `onHydration`, seeds the cache, then disarms - using the SAME shared\n // cache the middleware reads (#10).\n const res = await hydrateMemorio<S>(\n opts.mappings as Record<string, MemorioMapping<S> | ((s: S) => unknown)>,\n {\n failSoft: opts.failSoft,\n onError: opts.onError,\n debug: opts.debug,\n onHydration: hopts.onHydration\n },\n {\n cache: handle.cache,\n setHydrating: handle.setHydrating,\n getState: () => store.getState()\n }\n )\n return { values: res.values, ok: res.ok }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../node_modules/tsup/assets/esm_shims.js","../../core/internal.ts","../../core/env.ts","../../functions/message/index.ts","../../core/platform.ts","../../functions/idb/tools/db.create.ts","../../functions/idb/tools/db.list.ts","../../functions/idb/tools/db.exist.ts","../../functions/idb/tools/db.quota.ts","../../functions/idb/tools/db.delete.ts","../../functions/idb/tools/db.size.ts","../../functions/idb/tools/db.version.ts","../../functions/idb/tools/db.support.ts","../../functions/idb/tools/table.create.ts","../../functions/idb/tools/table.size.ts","../../functions/idb/crud/data.delete.ts","../../functions/idb/crud/data.set.ts","../../functions/idb/crud/data.get.ts","../../functions/idb/index.ts","../../modules/redux.ts","../../adapters/redux/index.ts","../../adapters/redux/middleware.ts","../../adapters/redux/selectors.ts","../../adapters/redux/persist.ts","../../functions/memory/index.ts","../../functions/state/index.ts","../../core/dispatch.ts","../../functions/schema/index.ts","../../functions/store/index.ts","../../functions/session/index.ts","../../core/hlc.ts","../../functions/memory/journal.ts","../../adapters/redux/hydration.ts","../../adapters/redux/bridge.ts"],"names":["store","resolve","state","schema","path","_fallbackStorageByContext","_getFallbackStorage","_hasStorage","_getPrefix","_prefixKey","_read","_write","_remove","now","hlc","isSyncEnabled","tombstone"],"mappings":"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","file":"redux.js","sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\r\n * MEMORIO INTERNAL STATE\r\n *\r\n * Module-local reactive/internal state for Memorio.\r\n * This replaces the previous practice of storing internal flags on\r\n * `globalThis.memorio.*`. Modules import this singleton instead of\r\n * reaching into the global object.\r\n *\r\n * `core/global.ts` is the ONLY place that publishes values to the\r\n * public `globalThis.memorio` namespace, at the very end of bootstrap.\r\n */\r\n\r\n/**\r\n * A single recorded state mutation for the trace / undo / redo system.\r\n */\r\nexport interface MutationRecord {\r\n /** State path in dotted notation (e.g. 'user.name'). */\r\n path: string\r\n /** 'set' or 'delete'. */\r\n action: 'set' | 'delete'\r\n /** The new value (for 'set') or undefined (for 'delete'). */\r\n newValue: any\r\n /** The previous value before the mutation. */\r\n previousValue: any\r\n /** Epoch timestamp (ms) of the mutation. */\r\n timestamp: number\r\n}\r\n\r\n/**\r\n * A snapshot is a deep clone of the entire state tree at a point in time.\r\n */\r\nexport type Snapshot = Record<string, any>\r\n\r\ninterface InternalState {\r\n debug: boolean\r\n tracking: boolean\r\n trackedPaths: Set<string>\r\n locked: boolean\r\n lastAccessedPath: string\r\n stateVersion: number\r\n currentContext: string | null\r\n /** Log of all recorded mutations (for trace / event sourcing). */\r\n mutations: MutationRecord[]\r\n /** Stack of mutations available to undo. */\r\n undoStack: MutationRecord[]\r\n /** Stack of mutations available to redo. */\r\n redoStack: MutationRecord[]\r\n /** Maximum number of mutations retained per stack. */\r\n maxHistory: number\r\n /** Whether history tracking is active. */\r\n historyEnabled: boolean\r\n}\r\n\r\n// Singleton across ESM/CJS/module-duplication boundaries.\r\n// When the same code is loaded via multiple paths (e.g. ESM import\r\n// \"dist/index.js\" + CJS require of \"memorio\"), each path gets its own\r\n// module instance. Storing the state on globalThis guarantees every instance\r\n// reads/writes the same shared state.\r\nconst INTERNAL_KEY = '__memorio_internal_state'\r\nconst state: InternalState = (globalThis as any)[INTERNAL_KEY] || {\r\n debug: false,\r\n tracking: false,\r\n trackedPaths: new Set<string>(),\r\n locked: false,\r\n lastAccessedPath: '',\r\n stateVersion: 0,\r\n currentContext: null,\r\n mutations: [],\r\n undoStack: [],\r\n redoStack: [],\r\n maxHistory: 100,\r\n historyEnabled: false\r\n}\r\nif (!(globalThis as any)[INTERNAL_KEY]) {\r\n (globalThis as any)[INTERNAL_KEY] = state\r\n}\r\n\r\nexport const internal = {\r\n get debug(): boolean {\r\n return state.debug\r\n },\r\n set debug(value: boolean) {\r\n state.debug = value\r\n },\r\n\r\n get tracking(): boolean {\r\n return state.tracking\r\n },\r\n set tracking(value: boolean) {\r\n state.tracking = value\r\n },\r\n\r\n get trackedPaths(): Set<string> {\r\n return state.trackedPaths\r\n },\r\n clearTrackedPaths(): void {\r\n state.trackedPaths.clear()\r\n },\r\n\r\n get locked(): boolean {\r\n return state.locked\r\n },\r\n set locked(value: boolean) {\r\n state.locked = value\r\n },\r\n\r\n get lastAccessedPath(): string {\r\n return state.lastAccessedPath\r\n },\r\n set lastAccessedPath(value: string) {\r\n state.lastAccessedPath = value\r\n },\r\n\r\n get stateVersion(): number {\r\n return state.stateVersion\r\n },\r\n bumpStateVersion(): number {\r\n state.stateVersion = (state.stateVersion || 0) + 1\r\n return state.stateVersion\r\n },\r\n\r\n get currentContext(): string | null {\r\n return state.currentContext\r\n },\r\n set currentContext(value: string | null) {\r\n state.currentContext = value\r\n },\r\n\r\n get mutations(): MutationRecord[] {\r\n return state.mutations\r\n },\r\n get undoStack(): MutationRecord[] {\r\n return state.undoStack\r\n },\r\n get redoStack(): MutationRecord[] {\r\n return state.redoStack\r\n },\r\n get maxHistory(): number {\r\n return state.maxHistory\r\n },\r\n set maxHistory(value: number) {\r\n state.maxHistory = value\r\n },\r\n get historyEnabled(): boolean {\r\n return state.historyEnabled\r\n },\r\n set historyEnabled(value: boolean) {\r\n state.historyEnabled = value\r\n },\r\n\r\n /**\r\n * Records a mutation in the trace log and undo/redo stacks.\r\n * Called by the state proxy's callback.\r\n */\r\n recordMutation(record: MutationRecord): void {\r\n if (!state.historyEnabled) return\r\n\r\n // Append to the trace log (mutations), trimmed to maxHistory\r\n state.mutations.push(record)\r\n if (state.mutations.length > state.maxHistory) {\r\n state.mutations.shift()\r\n }\r\n\r\n // Push to undo stack, trimmed to maxHistory\r\n state.undoStack.push(record)\r\n if (state.undoStack.length > state.maxHistory) {\r\n state.undoStack.shift()\r\n }\r\n\r\n // Clear redo stack on any new mutation\r\n state.redoStack = []\r\n },\r\n\r\n /**\r\n * Pops a record from the undo stack and pushes to redo stack.\r\n * Returns the record or undefined if empty.\r\n */\r\n popUndo(): MutationRecord | undefined {\r\n const record = state.undoStack.pop()\r\n if (record) {\r\n state.redoStack.push(record)\r\n }\r\n return record\r\n },\r\n\r\n /**\r\n * Pops a record from the redo stack and pushes to undo stack.\r\n * Returns the record or undefined if empty.\r\n */\r\n popRedo(): MutationRecord | undefined {\r\n const record = state.redoStack.pop()\r\n if (record) {\r\n state.undoStack.push(record)\r\n }\r\n return record\r\n },\r\n\r\n canUndo(): boolean {\r\n return state.undoStack.length > 0\r\n },\r\n\r\n canRedo(): boolean {\r\n return state.redoStack.length > 0\r\n },\r\n\r\n clearHistory(): void {\r\n state.mutations = []\r\n state.undoStack = []\r\n state.redoStack = []\r\n },\r\n\r\n clearRedo(): void {\r\n state.redoStack = []\r\n }\r\n}\r\n\r\n/**\r\n * Protected property names that cannot be used as state keys.\r\n * These are reserved for internal memorio functionality.\r\n */\r\nexport const protect = [\r\n 'list',\r\n 'state',\r\n 'store',\r\n 'idb',\r\n 'sqlite',\r\n 'observer',\r\n 'useObserver',\r\n 'remove',\r\n 'removeAll',\r\n // Platform-related protected keys\r\n '_platform',\r\n '_capabilities',\r\n '_sessionId'\r\n]\r\n\r\n/**\r\n * Extracts a property name from a container/arrow function.\r\n * Used by useObserver to resolve functional deps like `() => state.test`.\r\n * @param container The container (optional, often the function itself)\r\n * @param object The function or string to extract the property name from\r\n */\r\nexport const propertyName = (container: any, object?: any): string | null => {\r\n const target = object !== undefined ? object : container\r\n return String(target).replace('() => ', '')\r\n}\r\n\r\nexport default internal\r\n","/**\r\n * Runtime environment detection.\r\n *\r\n * `DEV` / `PROD` are determined at RUNTIME via `process.env.NODE_ENV`\r\n * (polyfilled by Vite/Webpack in browsers). No build-time environment\r\n * define is required - Memorios auto-detects the environment.\r\n *\r\n * In a Vite dev server: `process.env.NODE_ENV === 'development'` → `DEV = true`\r\n * In a Vite prod build: `process.env.NODE_ENV === 'production'` → `DEV = false`\r\n * In Node.js: `process.env.NODE_ENV` controls the flag.\r\n * In a raw browser (no bundler): defaults to `true` (assumed dev).\r\n *\r\n * @module memorio/env\r\n */\r\n\r\nexport const DEV: boolean =\r\n typeof process !== 'undefined'\r\n ? process.env?.NODE_ENV !== 'production'\r\n : true\r\n\r\nexport const PROD: boolean = !DEV\r\n","import internal from '../../core/internal'\r\nimport { DEV } from '../../core/env'\r\n\r\n/**\r\n * Internal debug logger.\r\n * Prints only when `memorio.debug` is enabled.\r\n * @param args Values to log via console.debug.\r\n */\r\nexport const message = (...args: unknown[]): void => {\r\n if (DEV && internal.debug === true) {\r\n console.debug(...args)\r\n }\r\n}\r\n\r\nexport default message\r\n","/**\r\n * MEMORIO PLATFORM COMPATIBILITY LAYER\r\n *\r\n * This module provides cross-platform compatibility for Memorio.\r\n * It detects the runtime environment and provides polyfills for\r\n * browser-only APIs when running in Node.js, Deno, or edge workers.\r\n *\r\n * Platform Detection:\r\n * - Browser (window, document, sessionStorage, localStorage)\r\n * - Node.js (process, Buffer, module)\r\n * - Deno (Deno namespace)\r\n * - Edge Workers (globalThis, service worker context)\r\n *\r\n * Session Isolation:\r\n * - Each session gets its own isolated state namespace\r\n * - Prevents state leakage between different requests/contexts\r\n *\r\n * @module memorio/platform\r\n */\r\n\r\nimport internal from './internal'\r\n\r\n/**\r\n * Platform detection types\r\n */\r\nexport type Platform = 'browser' | 'node' | 'deno' | 'edge' | 'unknown'\r\n\r\n/**\r\n * Environment capabilities\r\n */\r\nexport interface PlatformCapabilities {\r\n platform: Platform\r\n hasSessionStorage: boolean\r\n hasLocalStorage: boolean\r\n hasIndexedDB: boolean\r\n hasSqlJs: boolean\r\n hasDispatchEvent: boolean\r\n hasNavigator: boolean\r\n hasProcess: boolean\r\n isSecureContext: boolean\r\n sessionId: string\r\n}\r\n\r\n/**\r\n * Generate a unique session identifier for isolation\r\n * Uses crypto.getRandomValues for secure random generation\r\n */\r\nexport function generateSessionId(): string {\r\n const anyGlobal = globalThis as any\r\n if (typeof anyGlobal.crypto !== 'undefined' && anyGlobal.crypto.randomUUID) {\r\n return anyGlobal.crypto.randomUUID()\r\n }\r\n\r\n // Fallback: Use crypto.getRandomValues for secure random\r\n if (typeof anyGlobal.crypto !== 'undefined' && anyGlobal.crypto.getRandomValues) {\r\n const array = new Uint8Array(16)\r\n anyGlobal.crypto.getRandomValues(array)\r\n return Array.from(array, b => b.toString(16).padStart(2, '0')).join('')\r\n }\r\n\r\n // Last resort fallback (less secure)\r\n return `session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`\r\n}\r\n\r\n/**\r\n * Get the current platform\r\n */\r\nexport function detectPlatform(): Platform {\r\n // Deno check - use globalThis to avoid direct reference\r\n const globalAny = globalThis as any\r\n if (globalAny.Deno && globalAny.Deno.version) {\r\n return 'deno'\r\n }\r\n\r\n // Node.js check\r\n if (typeof process !== 'undefined' && process.versions && process.versions.node) {\r\n return 'node'\r\n }\r\n\r\n // Edge worker check (service worker context)\r\n if (typeof globalThis !== 'undefined' &&\r\n typeof (globalThis as any).ServiceWorkerGlobalScope !== 'undefined') {\r\n return 'edge'\r\n }\r\n\r\n // Browser check (has window and document)\r\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\r\n return 'browser'\r\n }\r\n\r\n return 'unknown'\r\n}\r\n\r\n/**\r\n * Check if we're in a browser environment\r\n */\r\nexport function isBrowser(): boolean {\r\n const platform = detectPlatform()\r\n return platform === 'browser'\r\n}\r\n\r\n/**\r\n * Check if we're in Node.js\r\n */\r\nexport function isNode(): boolean {\r\n const platform = detectPlatform()\r\n return platform === 'node'\r\n}\r\n\r\n/**\r\n * Check if we're in Deno\r\n */\r\nexport function isDeno(): boolean {\r\n const platform = detectPlatform()\r\n return platform === 'deno'\r\n}\r\n\r\n/**\r\n * Check if we're in an edge worker\r\n */\r\nexport function isEdge(): boolean {\r\n const platform = detectPlatform()\r\n return platform === 'edge'\r\n}\r\n\r\n/**\r\n * Get session storage polyfill or native\r\n */\r\nexport function getSessionStorage(): Storage | null {\r\n // Try native first\r\n try {\r\n if (typeof sessionStorage !== 'undefined') {\r\n // Test if it's actually usable\r\n const testKey = '__memorio_test__'\r\n sessionStorage.setItem(testKey, '1')\r\n sessionStorage.removeItem(testKey)\r\n return sessionStorage\r\n }\r\n } catch (_) {\r\n // Not available or disabled\r\n }\r\n\r\n // Return null for non-browser environments\r\n // Caller should handle this case\r\n return null\r\n}\r\n\r\n/**\r\n * Get local storage polyfill or native\r\n */\r\nexport function getLocalStorage(): Storage | null {\r\n try {\r\n if (typeof localStorage !== 'undefined') {\r\n const testKey = '__memorio_test__'\r\n localStorage.setItem(testKey, '1')\r\n localStorage.removeItem(testKey)\r\n return localStorage\r\n }\r\n } catch (_) {\r\n // Not available or disabled\r\n }\r\n return null\r\n}\r\n\r\n/**\r\n * Check IndexedDB support\r\n */\r\nexport function hasIndexedDB(): boolean {\r\n if (typeof indexedDB !== 'undefined') {\r\n return true\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * Check SQLite (sql.js) support.\r\n *\r\n * sql.js runs SQLite compiled to WebAssembly in the browser. This returns\r\n * `true` only in browser-like environments with WebAssembly support, mirroring\r\n * the client-only nature of the `idb` module. In Node.js/Deno the `sqlite`\r\n * module stays disabled; use `store` or `session` for persistence there.\r\n */\r\nexport function hasSqlJs(): boolean {\r\n const anyGlobal = globalThis as any\r\n if (typeof anyGlobal.WebAssembly === 'undefined' || typeof anyGlobal.WebAssembly.instantiate !== 'function') {\r\n return false\r\n }\r\n return typeof anyGlobal.window !== 'undefined'\r\n}\r\n\r\n/**\r\n * Check dispatchEvent support\r\n */\r\nexport function hasDispatchEvent(): boolean {\r\n return typeof globalThis.dispatchEvent === 'function'\r\n}\r\n\r\n/**\r\n * Get platform capabilities\r\n */\r\nexport function getCapabilities(): PlatformCapabilities {\r\n const platform = detectPlatform()\r\n const isSecure = typeof (globalThis as any).isSecureContext !== 'undefined'\r\n ? (globalThis as any).isSecureContext\r\n : platform === 'browser'\r\n\r\n return {\r\n platform,\r\n hasSessionStorage: getSessionStorage() !== null,\r\n hasLocalStorage: getLocalStorage() !== null,\r\n hasIndexedDB: hasIndexedDB(),\r\n hasSqlJs: hasSqlJs(),\r\n hasDispatchEvent: hasDispatchEvent(),\r\n hasNavigator: typeof navigator !== 'undefined',\r\n hasProcess: typeof process !== 'undefined',\r\n isSecureContext: isSecure,\r\n sessionId: generateSessionId()\r\n }\r\n}\r\n\r\n// Internal event listener storage for polyfill\r\nconst _eventListenerStorage: Map<string, Function[]> = new Map()\r\n\r\n/**\r\n * Initialize platform polyfills for globalThis\r\n * This ensures Memorio works in all environments\r\n */\r\nexport function initializePlatform(): void {\r\n const capabilities = getCapabilities()\r\n\r\n // Platform info is published onto the public `memorio` object by\r\n // core/global.ts at the end of bootstrap. No globalThis.memorio writes here.\r\n\r\n const anyGlobal = globalThis as any\r\n // as they don't make sense in server-side contexts\r\n // But we ensure the APIs exist to prevent crashes\r\n\r\n if (!capabilities.hasDispatchEvent) {\r\n // Polyfill dispatchEvent for environments that don't have it\r\n anyGlobal.dispatchEvent = function (_event: Event): boolean {\r\n return true // No-op for non-browser environments\r\n }\r\n\r\n // Polyfill CustomEvent\r\n if (typeof CustomEvent === 'undefined') {\r\n anyGlobal.CustomEvent = class CustomEvent {\r\n type: string\r\n detail: any\r\n constructor(type: string, detail: any = {}) {\r\n this.type = type\r\n this.detail = detail\r\n }\r\n }\r\n }\r\n }\r\n\r\n // AddEventListener is typically available in Node.js via EventEmitter\r\n // but we ensure it's there for compatibility\r\n if (typeof anyGlobal.addEventListener !== 'function') {\r\n anyGlobal.addEventListener = function (type: string, listener: Function): void {\r\n if (!_eventListenerStorage.has(type)) {\r\n _eventListenerStorage.set(type, [])\r\n }\r\n _eventListenerStorage.get(type)!.push(listener)\r\n }\r\n\r\n anyGlobal.removeEventListener = function (type: string, listener: Function): void {\r\n const listeners = _eventListenerStorage.get(type)\r\n if (listeners) {\r\n const index = listeners.indexOf(listener)\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n }\r\n }\r\n\r\n anyGlobal.dispatchEvent = function (event: Event): boolean {\r\n const listeners = _eventListenerStorage.get(event.type)\r\n if (listeners) {\r\n listeners.forEach(listener => {\r\n try {\r\n listener(event)\r\n } catch (e) {\r\n console.error('Event listener error:', e)\r\n }\r\n })\r\n }\r\n return true\r\n }\r\n }\r\n}\r\n\r\n\r\n// Export for use in other modules\r\nexport default {\r\n detectPlatform,\r\n isBrowser,\r\n isNode,\r\n isDeno,\r\n isEdge,\r\n getCapabilities,\r\n initializePlatform,\r\n getSessionStorage,\r\n getLocalStorage,\r\n hasIndexedDB,\r\n hasSqlJs,\r\n hasDispatchEvent\r\n}\r\n\r\n// ============================================\r\n// CONTEXT ISOLATION SYSTEM\r\n// ============================================\r\n\r\n/**\r\n * Internal storage for isolated contexts (singleton across module instances).\r\n */\r\nconst CONTEXTS_KEY = '__memorio_contexts__'\r\nconst _contexts: Map<string, any> = (globalThis as any)[CONTEXTS_KEY] || new Map<string, any>()\r\nif (!(globalThis as any)[CONTEXTS_KEY]) {\r\n (globalThis as any)[CONTEXTS_KEY] = _contexts\r\n}\r\n\r\n/**\r\n * Create a new isolated context for state management\r\n * Useful for multi-tenant server-side applications\r\n *\r\n * @param name Optional context name/identifier\r\n * @returns Object with isolated state, store, session, cache\r\n */\r\nexport function createContext(name?: string): {\r\n id: string\r\n state: any\r\n store: any\r\n session: any\r\n cache: any\r\n} {\r\n const contextId = name || `context_${generateSessionId()}`\r\n\r\n // Set this context as current for prefix resolution in store/session modules\r\n setCurrentContext(contextId)\r\n\r\n // Create isolated storage for this context\r\n const contextStorage = {\r\n state: {},\r\n store: new Map<string, string>(),\r\n session: new Map<string, string>(),\r\n cache: new Map<string, any>()\r\n }\r\n\r\n _contexts.set(contextId, contextStorage)\r\n\r\n // Return context with isolated data\r\n return {\r\n id: contextId,\r\n state: contextStorage.state,\r\n store: {\r\n get: (key: string) => {\r\n const data = contextStorage.store.get(key)\r\n return data ? JSON.parse(data) : null\r\n },\r\n set: (key: string, value: any) => {\r\n contextStorage.store.set(key, JSON.stringify(value))\r\n },\r\n remove: (key: string) => contextStorage.store.delete(key),\r\n removeAll: () => contextStorage.store.clear(),\r\n clearAll: () => contextStorage.store.clear(),\r\n size: () => contextStorage.store.size,\r\n isPersistent: false\r\n },\r\n session: {\r\n get: (key: string) => {\r\n const data = contextStorage.session.get(key)\r\n return data ? JSON.parse(data) : null\r\n },\r\n set: (key: string, value: any) => {\r\n contextStorage.session.set(key, JSON.stringify(value))\r\n },\r\n remove: (key: string) => contextStorage.session.delete(key),\r\n removeAll: () => contextStorage.session.clear(),\r\n clearAll: () => contextStorage.session.clear(),\r\n size: () => contextStorage.session.size,\r\n isPersistent: false\r\n },\r\n cache: {\r\n get: (key: string) => contextStorage.cache.get(key),\r\n set: (key: string, value: any) => contextStorage.cache.set(key, value),\r\n remove: (key: string) => contextStorage.cache.delete(key),\r\n removeAll: () => contextStorage.cache.clear(),\r\n clear: () => contextStorage.cache.clear()\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Get all existing context IDs\r\n */\r\nexport function listContexts(): string[] {\r\n return Array.from(_contexts.keys())\r\n}\r\n\r\n/**\r\n * Delete a context\r\n */\r\nexport function deleteContext(id: string): boolean {\r\n return _contexts.delete(id)\r\n}\r\n\r\n/**\r\n * Get current context (for server-side request isolation)\r\n */\r\nexport function getCurrentContext(): string | null {\r\n return internal.currentContext\r\n}\r\n\r\n/**\r\n * Set current context (for server-side request isolation)\r\n */\r\nexport function setCurrentContext(id: string): void {\r\n internal.currentContext = id\r\n}\r\n","import { idb } from '../index'\r\nimport message from '../../message'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\n/**\r\n * Creates a new IndexedDB database.\r\n * @param dbName Name of the database.\r\n * @param ver Version of the database.\r\n * @returns Promise that resolves with the database instance.\r\n */\r\nidb.db.create = (dbName: string, ver: number = 1): Promise<IDBDatabase> => {\r\n\r\n return new Promise((resolve, reject) => {\r\n\r\n if (!idb.db.support()) {\r\n return reject(new Error(\"IndexedDB not supported\"))\r\n }\r\n\r\n const request = globalThis.indexedDB.open(dbName, ver)\r\n\r\n request.onerror = () => {\r\n message(`IndexedDB error: ${request.error?.message}`)\r\n reject(request.error)\r\n }\r\n\r\n request.onsuccess = () => {\r\n message(`Database ${dbName} connected successfully`)\r\n // idb.db.list()\r\n resolve(request.result)\r\n }\r\n\r\n request.onupgradeneeded = () => {\r\n message(`Database ${dbName} upgrade/creation initiated`)\r\n }\r\n })\r\n}\r\n\r\nexport { }\r\n\r\n\r\n","import { idb } from '../index'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\n/**\r\n * Updates the global list of databases.\r\n * @returns Promise resolving with the databases list.\r\n */\r\nidb.db.list = async (): Promise<any[]> => {\r\n\r\n if (!(\"indexedDB\" in globalThis) || !indexedDB.databases) return []\r\n\r\n try {\r\n const result = await indexedDB.databases()\r\n globalThis.idbases = result || []\r\n await idb.db.size()\r\n return globalThis.idbases\r\n } catch (err) {\r\n console.error(\"Error listing databases:\", err)\r\n return []\r\n }\r\n}\r\n\r\n// Initial sync\r\n// idb.db.list()\r\n\r\nexport { }\r\n\r\n","import { idb } from '../index'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\n/**\r\n * Checks if a database exists in the tracked list.\r\n */\r\nidb.db.exist = (storeName: string): boolean => {\r\n return idbases?.some((db: any) => db.name === storeName)\r\n}\r\n\r\nexport { }\r\n\r\n","import { idb } from '../index'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\nidb.db.quota = () => {\r\n return navigator.storage.estimate()\r\n}\r\n\r\nexport { }\r\n\r\n","import { idb } from '../index'\r\nimport message from '../../message'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\n/**\r\n * Deletes an IndexedDB database.\r\n * @param storeName Name of the database to remove.\r\n */\r\nidb.db.delete = (storeName: string): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n message(`Removing database ${storeName}...`)\r\n\r\n const performDelete = () => {\r\n const request = indexedDB.deleteDatabase(storeName)\r\n\r\n request.onsuccess = () => {\r\n message(`${storeName} database removed successfully`)\r\n idb.db.list()\r\n resolve()\r\n }\r\n\r\n request.onerror = () => {\r\n console.error(`Error removing ${storeName}:`, request.error)\r\n reject(request.error)\r\n }\r\n\r\n request.onblocked = () => {\r\n console.warn(`Deletion of ${storeName} is blocked. Please close other tabs.`)\r\n }\r\n }\r\n\r\n // WARNING: Deleting a database is destructive and cannot be undone.\r\n // The confirm() call is intentionally removed for library usage.\r\n // Consumers should implement their own confirmation logic.\r\n performDelete()\r\n })\r\n}\r\n\r\nexport { }\r\n\r\n\r\n","import { idb } from '../index'\r\nimport message from '../../message'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\n/**\r\n * Updates the size information for all tracked databases.\r\n */\r\nidb.db.size = async (): Promise<void> => {\r\n if (!idbases || idbases.length === 0) return\r\n\r\n for (let i = 0; i < idbases.length; i++) {\r\n const dbInfo = idbases[i]\r\n try {\r\n const db = await idb.db.create(dbInfo.name, dbInfo.version)\r\n const tableNames = Array.from(db.objectStoreNames)\r\n\r\n let totalDbSize = 0\r\n for (const tableName of tableNames) {\r\n const tableSize = await idb.table.size(db, tableName)\r\n totalDbSize += tableSize\r\n }\r\n\r\n dbInfo.size = totalDbSize\r\n db.close()\r\n } catch (err) {\r\n message(`Could not calculate size for ${dbInfo.name}:${err}`)\r\n }\r\n }\r\n}\r\n\r\nexport { }\r\n\r\n\r\n","import { idb } from '../index'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\nidb.db.version = (storeName: string) => {\r\n let idbVer = 0\r\n for (const v of idbases) {\r\n if (v.name === storeName) idbVer = v.version\r\n break\r\n }\r\n return idbVer\r\n}\r\n\r\nexport { }\r\n\r\n","import { idb } from '../index'\r\nimport message from '../../message'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\n/**\r\n * Checks if IndexedDB is supported in the current environment.\r\n */\r\nidb.db.support = (): boolean => {\r\n const isSupported = \"indexedDB\" in globalThis\r\n if (!isSupported) {\r\n message(\"Your environment doesn't support IndexedDB\")\r\n }\r\n return isSupported\r\n}\r\n\r\nexport { }\r\n\r\n\r\n","import { idb } from '../index'\r\nimport message from '../../message'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\n/**\r\n * Creates a new object store in the specified database.\r\n * @param dbName Name of the database.\r\n * @param dbTable Name of the table (object store).\r\n * @returns Promise that resolves with void.\r\n */\r\nidb.table.create = (dbName: string, dbTable: string): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const currentVersion = Number(idb.db.version(dbName)) || 0\r\n const nextVersion = currentVersion + 1\r\n\r\n const request = indexedDB.open(dbName, nextVersion)\r\n\r\n request.onupgradeneeded = (e: IDBVersionChangeEvent) => {\r\n const db = (e.target as IDBOpenDBRequest).result\r\n\r\n if (!db.objectStoreNames.contains(dbTable)) {\r\n const store = db.createObjectStore(dbTable, {\r\n keyPath: \"id\",\r\n autoIncrement: true\r\n })\r\n\r\n store.createIndex(\"id\", \"id\", { unique: true })\r\n store.createIndex(\"data\", \"data\", { unique: false })\r\n message(`Table ${dbTable} created in ${dbName}`)\r\n }\r\n }\r\n\r\n request.onsuccess = () => {\r\n request.result.close()\r\n idb.db.list()\r\n resolve()\r\n }\r\n\r\n request.onerror = () => {\r\n console.error(`Error creating table ${dbTable}:`, request.error)\r\n reject(request.error)\r\n }\r\n\r\n } catch (err) {\r\n console.error(\"Critical error in table.create:\", err)\r\n reject(err)\r\n }\r\n })\r\n}\r\n\r\nexport { }\r\n\r\n\r\n","import { idb } from '../index'\r\nimport message from '../../message'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\n/**\r\n * Calculates the size of an object store by iterating through its records.\r\n * @param db The IDBDatabase instance.\r\n * @param table The name of the object store.\r\n * @returns Promise resolving with the size in bytes.\r\n */\r\nidb.table.size = (db: IDBDatabase, table: string): Promise<number> => {\r\n return new Promise((resolve, reject) => {\r\n if (!db) return reject(new Error(\"Database instance is required\"))\r\n if (!db.objectStoreNames.contains(table)) return resolve(0)\r\n\r\n let size = 0\r\n let count = 0\r\n const transaction = db.transaction([table], \"readonly\")\r\n const store = transaction.objectStore(table)\r\n const request = store.openCursor()\r\n\r\n request.onsuccess = async (event: any) => {\r\n const cursor = event.target.result\r\n if (cursor) {\r\n try {\r\n const value = cursor.value\r\n // Approximation of size via JSON stringification\r\n size += JSON.stringify(value).length\r\n } catch (err) {\r\n message(`Error stringifying IDB value tracking size:${err}`)\r\n }\r\n\r\n count++\r\n // Safe iteration: yield every 200 records\r\n if (count % 200 === 0) {\r\n await new Promise(resolve => setTimeout(resolve, 0))\r\n }\r\n\r\n cursor.continue()\r\n } else {\r\n resolve(size)\r\n }\r\n }\r\n\r\n request.onerror = () => {\r\n reject(request.error)\r\n }\r\n })\r\n}\r\n\r\nexport { }\r\n\r\n\r\n","import { idb } from '../index'\r\nimport message from '../../message'\r\n/*!\r\n memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\n/**\r\n * Deletes a record from IndexedDB.\r\n * @param storeName Name of the database.\r\n * @param table Name of the table.\r\n * @param key Key of the record to delete.\r\n */\r\nidb.data.delete = (storeName: string, table: string, key: any): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n const request = indexedDB.open(storeName)\r\n\r\n request.onsuccess = () => {\r\n const db = request.result\r\n if (!db.objectStoreNames.contains(table)) {\r\n db.close()\r\n return reject(new Error(`Table ${table} not found`))\r\n }\r\n\r\n const transaction = db.transaction(table, \"readwrite\")\r\n const objectStore = transaction.objectStore(table)\r\n const deleteRequest = objectStore.delete(key)\r\n\r\n deleteRequest.onsuccess = () => {\r\n db.close()\r\n message(`Record ${key} deleted from ${table}`)\r\n resolve()\r\n }\r\n\r\n deleteRequest.onerror = () => {\r\n db.close()\r\n reject(deleteRequest.error)\r\n }\r\n }\r\n\r\n request.onerror = () => reject(request.error)\r\n })\r\n}\r\n\r\n/**\r\n * Clears all records from a table.\r\n */\r\nidb.data.delete.all = (storeName: string, table: string): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n const request = indexedDB.open(storeName)\r\n\r\n request.onsuccess = (event: any) => {\r\n const db = event.target.result\r\n if (!db.objectStoreNames.contains(table)) {\r\n db.close()\r\n return reject(new Error(`Table ${table} not found`))\r\n }\r\n\r\n const transaction = db.transaction(table, \"readwrite\")\r\n const store = transaction.objectStore(table)\r\n const clearRequest = store.clear()\r\n\r\n clearRequest.onsuccess = () => {\r\n db.close()\r\n message(`All data cleared from ${table}`)\r\n resolve()\r\n }\r\n\r\n clearRequest.onerror = () => {\r\n db.close()\r\n reject(clearRequest.error)\r\n }\r\n }\r\n\r\n request.onerror = () => reject(request.error)\r\n })\r\n}\r\n\r\nexport { }\r\n\r\n\r\n","import { idb } from '../index'\r\nimport message from '../../message'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\n/**\r\n * Sets (inserts or updates) data in IndexedDB.\r\n * @param storeName Name of the database.\r\n * @param table Name of the object store.\r\n * @param value Object or value to store.\r\n * @returns Promise resolving with the request result.\r\n */\r\nidb.data.set = (storeName: string, table: string, value: any): Promise<any> => {\r\n return new Promise((resolve, reject) => {\r\n const request = indexedDB.open(storeName)\r\n\r\n request.onsuccess = () => {\r\n const db = request.result\r\n\r\n if (!db.objectStoreNames.contains(table)) {\r\n db.close()\r\n return reject(new Error(`Table ${table} does not exist in ${storeName}`))\r\n }\r\n\r\n const transaction = db.transaction(table, \"readwrite\")\r\n const objectStore = transaction.objectStore(table)\r\n const putRequest = objectStore.put(value)\r\n\r\n putRequest.onsuccess = () => {\r\n db.close()\r\n message(`Data saved in ${storeName}.${table}`)\r\n resolve(putRequest.result)\r\n }\r\n\r\n putRequest.onerror = (_) => {\r\n db.close()\r\n message(`Database insert error: ${putRequest.error?.message}`)\r\n reject(putRequest.error)\r\n }\r\n }\r\n\r\n request.onerror = () => {\r\n reject(request.error)\r\n }\r\n })\r\n}\r\n\r\nexport { }\r\n\r\n\r\n","import { idb } from '../index'\r\n/*!\r\n Memorio\r\n Copyright (c) 2019 Dario Passariello <dariopassariello@gmail.com>\r\n Licensed under MIT License, see\r\n dario.passariello.ca\r\n*/\r\n\r\n/**\r\n * Retrieves data from IndexedDB.\r\n * @param storeName Name of the database.\r\n * @param table Name of the object store.\r\n * @param key Key or ID to retrieve.\r\n * @returns Promise resolving with the data.\r\n */\r\nidb.data.get = (storeName: string, table: string, key: any): Promise<any> => {\r\n return new Promise((resolve, reject) => {\r\n const request = indexedDB.open(storeName)\r\n\r\n request.onsuccess = (event: any) => {\r\n const db = event.target.result\r\n\r\n if (!db.objectStoreNames.contains(table)) {\r\n db.close()\r\n return reject(new Error(`Table ${table} not found in ${storeName}`))\r\n }\r\n\r\n const transaction = db.transaction(table, \"readonly\")\r\n const store = transaction.objectStore(table)\r\n const getRequest = store.get(key)\r\n\r\n getRequest.onsuccess = () => {\r\n db.close()\r\n resolve(getRequest.result)\r\n }\r\n\r\n getRequest.onerror = () => {\r\n db.close()\r\n reject(getRequest.error)\r\n }\r\n }\r\n\r\n request.onerror = () => {\r\n reject(request.error)\r\n }\r\n })\r\n}\r\n\r\nexport { }\r\n\r\n","/**\r\n * MEMORIO INDEXEDDB\r\n *\r\n * This module provides IndexedDB browser database functionality.\r\n * It enables persistent storage for large amounts of structured data.\r\n *\r\n * **CLIENT-ONLY**: This module requires a browser environment with IndexedDB.\r\n * In Node.js/Deno, this will be disabled with a warning.\r\n *\r\n * The `idb` object is created here (empty) and published onto globalThis\r\n * by core/global once populated. Same reference is exported for named imports.\r\n */\r\n\r\nimport { hasIndexedDB } from '../../core/platform'\r\nimport { DEV } from '../../core/env'\r\n\r\n// Check if IndexedDB is available\r\nconst _hasIDB = hasIndexedDB()\r\n\r\n// Shared reference: populated below (or left as placeholder)\r\nexport const idb: any = {\r\n db: {},\r\n table: {},\r\n data: {}\r\n}\r\n\r\n// Initialize IDB only if available\r\nif (_hasIDB) {\r\n (\r\n async () => {\r\n Object.defineProperty(idb, 'db', { value: {}, writable: true, configurable: true })\r\n Object.defineProperty(idb, 'table', { value: {}, writable: true, configurable: true })\r\n Object.defineProperty(idb, 'data', { value: {}, writable: true, configurable: true })\r\n\r\n Object.defineProperty(globalThis, 'idbases', {\r\n value: [],\r\n writable: true,\r\n configurable: true,\r\n enumerable: false\r\n })\r\n\r\n await Promise.all([\r\n import('./tools/db.create'),\r\n import('./tools/db.list'),\r\n import('./tools/db.exist'),\r\n import('./tools/db.quota'),\r\n import('./tools/db.delete'),\r\n import('./tools/db.size'),\r\n import('./tools/db.version'),\r\n import('./tools/db.support'),\r\n import('./tools/table.create'),\r\n import('./tools/table.size'),\r\n import('./crud/data.delete'),\r\n import('./crud/data.set'),\r\n import('./crud/data.get')\r\n ])\r\n\r\n Object.preventExtensions(idb)\r\n Object.seal(idb)\r\n Object.freeze(idb)\r\n }\r\n )()\r\n} else {\r\n // Placeholder for non-browser environments\r\n idb._disabled = true\r\n idb._warning = 'IndexedDB is not available in this environment (Node.js/Deno). Use store or session for persistence.'\r\n if (DEV) {\r\n console.warn('Memorio IDB: IndexedDB is not available in this environment. Use store or session for data persistence.')\r\n }\r\n}\r\n\r\nexport default idb\r\n","/**\n * MEMORIO REDUX ADAPTER ENTRYPOINT\n *\n * Ships as `memorio/redux` (see `exports` generated by tsup.plugin.copyStatic).\n * Re-exports the adapter API from `./adapters/redux`. Core is imported via\n * relative paths and bundled into this entrypoint so the adapter is fully\n * self-contained.\n *\n * Importing `memorio/redux` does NOT activate memreo; the host application\n * must import `memorio` (or `memorio/redux`) and follow the bootstrap flow in\n * the docs. See docs/README.md -> \"Redux integration\".\n */\n\nexport { createMemorioMiddleware, hydrateMemorio, createMemorioReduxBridge } from '../adapters/redux'\nexport type {\n MemorioMiddlewareHandle,\n HydrateOptions,\n HydrationResult,\n HydrateBridge,\n MemorioReduxBridge,\n MemorioMapping,\n MemorioReduxAction,\n MemorioReduxOptions,\n MemorioReduxStoreLike,\n MemorioReduxMiddleware,\n MemoryEntry,\n MemoryType,\n MemoryScope\n} from '../adapters/redux'\n\n// Re-export convenience utilities (selectors) for consumers that want to build\n// custom mappings outside the bridge.\nexport { normalizeMappings, selectValues, deepEqual, shouldIgnoreAction, actionType } from '../adapters/redux'\n","/**\n * MEMORIO REDUX ADAPTER - PUBLIC API\n *\n * `import { createMemorioMiddleware, hydrateMemorio, createMemorioReduxBridge } from 'memorio/redux'`\n *\n * This adapter layer is optional and framework-agnostic (#13). It depends on\n * neither `redux` nor React at runtime (structural store typing, #4). Memorio\n * core is imported via relative paths and bundled into this entrypoint by the\n * build; core singletons (state/store/session/dispatch + globalThis.memorio)\n * are shared safely thanks to the idempotent bootstrap guards in core/global.ts.\n */\n\nexport { createMemorioMiddleware } from './middleware'\nexport type { MemorioMiddlewareHandle } from './middleware'\n\nexport { hydrateMemorio } from './hydration'\nexport type { HydrateOptions, HydrationResult, HydrateBridge } from './hydration'\n\nexport { createMemorioReduxBridge } from './bridge'\nexport type { MemorioReduxBridge } from './bridge'\n\nexport {\n normalizeMappings,\n selectValues,\n deepEqual,\n shouldIgnoreAction,\n actionType\n} from './selectors'\nexport type {\n MemorioMapping,\n MemorioReduxAction,\n MemorioReduxOptions,\n MemorioReduxStoreLike,\n MemorioReduxMiddleware\n} from './types'\nexport { type MemoryEntry, type MemoryType, type MemoryScope } from './types'\n","/**\n * MEMORIO REDUX ADAPTER - MIDDLEWARE (Redux -> Memorio)\n *\n * Produces a standard Redux middleware. The app installs it at store creation:\n *\n * const memorio = createMemorioMiddleware<AppState>({ mappings })\n * const store = createStore(reducer, applyMiddleware(memorio.middleware))\n *\n * Ownership: Redux state -> Memorio memory (directional, #8). Memorio never\n * writes back into Redux state here; hydration is a separate, one-shot step.\n * Async work is deferred off the reducer/middleware stack (#15) and coalesced\n * (#30). Failures are isolated (#17).\n */\n\nimport { normalizeMappings, shouldIgnoreAction, collectDirtyMappings } from './selectors'\nimport { createPersistContext, schedulePersist, flushPersist } from './persist'\nimport type { MemorioReduxAction, MemorioReduxOptions, MemorioReduxMiddleware } from './types'\n\nexport interface MemorioMiddlewareHandle<\n S = unknown,\n A extends MemorioReduxAction = MemorioReduxAction\n> {\n /** Pass to `applyMiddleware(...)`. */\n middleware: MemorioReduxMiddleware<S, A>\n /** Shared change-detection cache (exposed so hydration can seed it). */\n cache: Record<string, unknown>\n /** Toggle the Memorio->Redux re-entrancy guard (#10 loop prevention). */\n setHydrating: (v: boolean) => void\n /** Flush pending persist immediately (mostly for tests). */\n flush: () => Promise<void>\n}\n\nexport function createMemorioMiddleware<\n S = any,\n A extends MemorioReduxAction = MemorioReduxAction\n>(opts: MemorioReduxOptions<S> = {}) {\n const mappings = normalizeMappings(opts.mappings)\n const ctx = createPersistContext()\n\n // Captured when the middleware is installed (store creation time).\n let getState: (() => S) | null = null\n\n const middleware: MemorioReduxMiddleware<S, A> = (api) => {\n getState = api.getState\n return (next) => (action) => {\n const result = next(action)\n\n // Global whitelist/blacklist short-circuit (#30).\n if (shouldIgnoreAction(action, opts)) return result\n\n // Per-mapping filtering: only keys this action is allowed to persist for\n // become dirty. Blacklisted/whitelisted-out mappings never reach Memorio,\n // even via an explicit flush (#30).\n const dirty = collectDirtyMappings(action, opts, mappings)\n if (dirty.length === 0) return result\n for (const key of dirty) ctx.dirty.add(key)\n\n void schedulePersist(getState as () => S, mappings, ctx, opts)\n return result\n }\n }\n\n return {\n middleware,\n cache: ctx.cache,\n setHydrating: (v: boolean) => {\n ctx.hydrating = v\n },\n flush: () => (getState ? flushPersist(getState, mappings, ctx, opts) : Promise.resolve())\n }\n}\n","/**\n * MEMORIO REDUX ADAPTER - SELECTORS + DEEP EQUALITY\n *\n * Pure helpers: no memorio runtime import needed except types. These are\n * shared by the middleware and the bridge so both see one consistent view of\n * \"what changed\". Keeping them isolated from side effects makes them trivial\n * to unit-test.\n */\n\nimport type {\n MemorioMapping,\n MemorioReduxAction,\n MemorioReduxOptions,\n MemorioReduxStoreLike\n} from './types'\n\n/**\n * Normalizes a user-facing mappings table into canonical `MemorioMapping`\n * objects (bare selectors become `{ selector, ...defaults }`).\n */\nexport function normalizeMappings<S = any>(\n mappings: MemorioReduxOptions<S>['mappings']\n): Record<string, MemorioMapping<S>> {\n const out: Record<string, MemorioMapping<S>> = {}\n if (!mappings) return out\n for (const key of Object.keys(mappings)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const v: any = (mappings as Record<string, any>)[key]\n if (typeof v === 'function') {\n out[key] = { selector: v }\n } else if (v && typeof v === 'object') {\n out[key] = v\n }\n }\n return out\n}\n\n/**\n * Reads the current selected value for every mapping at once.\n * Returns a fresh object; cheap to diff against a cached snapshot.\n */\nexport function selectValues<S = any>(\n state: S,\n mappings: Record<string, MemorioMapping<S>>\n): Record<string, unknown> {\n const values: Record<string, unknown> = {}\n for (const key of Object.keys(mappings)) {\n try {\n values[key] = mappings[key].selector(state)\n } catch {\n // A throwing selector must not crash the Redux dispatch chain.\n values[key] = undefined\n }\n }\n return values\n}\n\n/**\n * Structural deep equality. Replaces a lodash/deep-equal dependency (#zero deps).\n * Handles primitives, arrays, plain objects, Dates, RegExps. Cycles are\n * treated as equal only when structurally identical.\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n if (a == null || b == null) return false\n if (typeof a !== typeof b) return false\n if (typeof a !== 'object') return a === b\n\n if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime()\n if (a instanceof RegExp && b instanceof RegExp) return a.source === b.source && a.flags === b.flags\n\n const ak = Object.keys(a as object)\n const bk = Object.keys(b as object)\n if (ak.length !== bk.length) return false\n\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b)) return false\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) return false\n }\n return true\n }\n\n for (const k of ak) {\n if (!(k in (b as object))) return false\n if (!deepEqual((a as any)[k], (b as any)[k])) return false\n }\n return true\n}\n\n/** Reads the action `type` discriminator in a type-safe, null-safe way. */\nexport function actionType(action: MemorioReduxAction): unknown {\n return action && typeof action === 'object' ? action.type : undefined\n}\n\n/**\n * Returns true when an action should be ignored for persistence given the\n * whitelist/blacklist + per-mapping `ignoreActions` rules (#30 aggressive filter).\n */\nexport function shouldIgnoreAction(\n action: MemorioReduxAction,\n opts: MemorioReduxOptions,\n mapping?: MemorioMapping\n): boolean {\n const t = actionType(action)\n if (opts.blacklist && opts.blacklist.length && opts.blacklist.includes(t)) return true\n if (opts.whitelist && opts.whitelist.length && !opts.whitelist.includes(t)) return true\n if (mapping && mapping.ignoreActions && mapping.ignoreActions.length && mapping.ignoreActions.includes(t)) {\n return true\n }\n return false\n}\n\n/**\n * Returns the memory keys whose mapping is NOT ignored for this action type.\n * The middleware only schedules persistence for these keys (dirty set), so a\n * blacklisted / whitelisted-out action can never reach Memorio (#30).\n */\nexport function collectDirtyMappings<S = any>(\n action: MemorioReduxAction,\n opts: MemorioReduxOptions,\n mappings: Record<string, MemorioMapping<S>>\n): string[] {\n const dirty: string[] = []\n for (const key of Object.keys(mappings)) {\n if (!shouldIgnoreAction(action, opts, mappings[key])) dirty.push(key)\n }\n return dirty\n}\n\n/** Memoizes a snapshot of selected values keyed by the store reference. */\nexport type SelectorCache = Record<string, unknown>\n\nexport type { MemorioReduxStoreLike }\n","/**\n * MEMORIO REDUX ADAPTER - PERSISTENCE ENGINE\n *\n * Shared write-to-Memorio logic used by both the standalone middleware and the\n * integrated bridge. Owns the *last-values cache* (change detection) so the\n * same closures can be reused for loop-guarding during hydration.\n *\n * Redux owns app state (#5). This layer only writes *selected* values into\n * Memorio memory - never the whole Redux tree (#6/#30) - and only when a\n * selector's value actually changes.\n */\n\nimport { memory } from '../../functions/memory'\nimport { selectValues, deepEqual } from './selectors'\nimport type {\n MemorioMapping,\n MemorioReduxOptions\n} from './types'\n\nexport interface PersistContext {\n /** Last seen selected value per memory key (change detection). */\n cache: Record<string, unknown>\n /** Re-entrancy guard: true while the app is rehydrating (Memorio -> Redux). */\n hydrating: boolean\n /** Coalesce flag so rapid actions collapse to one persist cycle (#30). */\n pending: boolean\n /** Mapping keys triggered by a non-ignored action since the last flush. */\n dirty: Set<string>\n}\n\nexport function createPersistContext(): PersistContext {\n return { cache: {}, hydrating: false, pending: false, dirty: new Set() }\n}\n\n/**\n * Schedule an async, coalesced persist of changed mappings.\n * Returns immediately (does not block the Redux dispatch stack - #15).\n * Each mapping is failure-isolated (#17).\n */\nexport function schedulePersist<S>(\n getState: () => S,\n mappings: Record<string, MemorioMapping<S>>,\n ctx: PersistContext,\n opts: MemorioReduxOptions<S>\n): void {\n if (ctx.hydrating) return\n if (ctx.pending) return\n ctx.pending = true\n queueMicrotask(() => {\n ctx.pending = false\n void flushPersist(getState, mappings, ctx, opts)\n })\n}\n\n/**\n * Walk every mapping, compare selector output to the cached value, and write\n * only the deltas to Memorio memory. Async and failure-isolated.\n */\nexport async function flushPersist<S>(\n getState: () => S,\n mappings: Record<string, MemorioMapping<S>>,\n ctx: PersistContext,\n opts: MemorioReduxOptions<S>\n): Promise<void> {\n // Drain the dirty set first - only mappings triggered by a non-ignored action\n // are eligible (#30). An empty dirty set means nothing to do.\n const keys = Array.from(ctx.dirty)\n ctx.dirty.clear()\n if (keys.length === 0) return\n\n const state = getState()\n const values = selectValues(state, mappings)\n\n for (const key of keys) {\n const mapping = mappings[key]\n const next = values[key]\n const prev = ctx.cache[key]\n if (!deepEqual(next, prev)) {\n ctx.cache[key] = next\n try {\n await memory.remember(key, next, {\n type: mapping.type,\n confidence: mapping.confidence ?? 0.9,\n scope: mapping.scope ?? 'local',\n ttl: mapping.ttl ?? null,\n tags: mapping.tags,\n source: mapping.source ?? 'redux'\n })\n if (opts.debug) {\n console.debug(`[memorio/redux] persisted \"${key}\"`)\n }\n } catch (err) {\n if (opts.failSoft === false) throw err\n opts.onError?.(err, 'persist')\n if (opts.debug) {\n console.debug(`[memorio/redux] persist failed for \"${key}\"`, err)\n }\n }\n }\n }\n}\n","import { state } from '../state'\r\nimport { store } from '../store'\r\nimport { session } from '../session'\r\nimport { idb } from '../idb'\r\nimport { dispatch } from '../../core/dispatch'\r\nimport { hlc } from '../../core/hlc'\r\nimport { DEV } from '../../core/env'\r\nimport memoryJournal, { configure as configureSync } from './journal'\r\nimport type {\r\n MemoryEntry,\r\n MemoryOperation,\r\n MemoryType,\r\n RememberOptions,\r\n RecallOptions,\r\n ContextOptions,\r\n ContextEntry,\r\n MemoryStats,\r\n MemoryScope,\r\n SyncConfig,\r\n PatchOperation\r\n} from '../../types/memory'\r\n\r\nconst MEMORY_INDEX_KEY = '__memorio_memory_index__'\r\nconst SUPERSEDED_PREFIX = '__memorio_superseded__'\r\n\r\nfunction isSyncEnabled(): boolean {\r\n return !!(globalThis as any).memorioSyncConfig\r\n}\r\n\r\n/**\r\n * Record a memory operation in the local (namespaced) sync journal.\r\n * Attaches an HLC timestamp for causal ordering across devices.\r\n * No-op when sync hasn't been configured, for `hot` (volatile) scopes, or if\r\n * the substrate is unavailable - journaling never breaks a memory write.\r\n */\r\nasync function recordJournal(entry: MemoryEntry, operation: MemoryOperation): Promise<void> {\r\n if (!isSyncEnabled()) return\r\n if (entry.scope === 'hot') return\r\n try {\r\n await memoryJournal.append(entry as MemoryEntry, operation)\r\n } catch (err) {\r\n if (DEV) console.warn('[memorio memory] journal append failed:', err)\r\n }\n}\r\n\r\nfunction memoryEntryKey(id: string): string {\r\n return id.startsWith(SUPERSEDED_PREFIX) ? id : `${SUPERSEDED_PREFIX}${id}`\r\n}\r\n\r\nfunction normalizeTags(tags: string | string[] | undefined): string[] {\r\n if (!tags) return []\r\n return Array.isArray(tags) ? tags : [tags]\r\n}\r\n\r\nfunction resolveScope<T>(value: T, opts: RememberOptions<T>): MemoryScope {\r\n if (opts.scope) return opts.scope\r\n\r\n const size = JSON.stringify(value).length\r\n\r\n if (size > 1_000_000) return 'durable'\r\n if (size > 100_000) return 'local'\r\n\r\n return 'local'\r\n}\r\n\r\nfunction now(): number {\r\n return Date.now()\r\n}\r\n\r\nfunction isExpired(entry: MemoryEntry): boolean {\r\n if (entry.ttl === null || entry.ttl === undefined) return false\r\n return now() - entry.createdAt > entry.ttl\r\n}\r\n\r\nfunction matchesFilters(entry: MemoryEntry, opts: RecallOptions): boolean {\r\n if (entry.status === 'obsolete') return opts.includeObsolete ?? false\r\n if (entry.status === 'superseded') return opts.includeObsolete ?? false\r\n if (isExpired(entry)) {\r\n return opts.includeObsolete ?? false\r\n }\r\n if (opts.type) {\r\n const types = Array.isArray(opts.type) ? opts.type : [opts.type]\r\n if (!types.includes(entry.type)) return false\r\n }\r\n if (opts.minConfidence !== undefined && entry.confidence < opts.minConfidence) return false\r\n return true\r\n}\r\n\r\nfunction matchesContextFilters(entry: MemoryEntry, opts: ContextOptions): boolean {\r\n if (entry.status !== 'active') return false\r\n if (isExpired(entry)) return false\r\n\r\n if (opts.tags) {\r\n const tags = Array.isArray(opts.tags) ? opts.tags : [opts.tags]\r\n const hasMatch = tags.some(t => entry.tags.includes(t))\r\n if (!hasMatch) return false\r\n }\r\n\r\n if (opts.types) {\r\n const types = Array.isArray(opts.types) ? opts.types : [opts.types]\r\n if (!types.includes(entry.type)) return false\r\n }\r\n\r\n if (opts.minConfidence !== undefined && entry.confidence < opts.minConfidence) return false\r\n\r\n if (opts.scopes && !opts.scopes.includes(entry.scope)) return false\r\n\r\n return true\r\n}\r\n\r\nfunction computeRelevance(entry: MemoryEntry): number {\r\n const ageHours = (now() - entry.createdAt) / (1000 * 3600)\r\n const recencyScore = Math.max(0.1, 1 / (1 + ageHours * 0.5))\r\n const confidenceScore = entry.confidence\r\n const accessScore = 1 + (entry.tags.length * 0.1)\r\n\r\n const typeBoost: Record<MemoryType, number> = {\r\n decision: 1.5,\r\n context: 1.3,\r\n preference: 1.2,\r\n task: 1.0,\r\n fact: 0.8\r\n }\r\n\r\n const scopeBoost: Record<MemoryScope, number> = {\r\n hot: 1.5,\r\n session: 1.2,\r\n local: 1.0,\r\n durable: 0.8\r\n }\r\n\r\n return recencyScore * confidenceScore * accessScore * typeBoost[entry.type] * scopeBoost[entry.scope]\r\n}\r\n\r\nfunction getNestedPath(obj: any, path: string): any {\r\n if (!path || typeof path !== 'string') return undefined\r\n const parts = path.replace(/^state\\./, '').split('.')\r\n let current: any = obj\r\n for (const part of parts) {\r\n if (current === null || current === undefined) return undefined\r\n current = current[part]\r\n }\r\n return current\r\n}\r\n\r\nfunction setNestedPath(obj: any, path: string, value: any): void {\r\n if (!path || typeof path !== 'string') return\r\n const parts = path.replace(/^state\\./, '').split('.')\r\n let current: any = obj\r\n for (let i = 0; i < parts.length - 1; i++) {\r\n const part = parts[i]\r\n if (current[part] === undefined || current[part] === null) {\r\n current[part] = {}\r\n }\r\n current = current[part]\r\n }\r\n current[parts[parts.length - 1]] = value\r\n}\r\n\r\nfunction deleteNestedPath(obj: any, path: string): void {\r\n if (!path || typeof path !== 'string') return\r\n const parts = path.replace(/^state\\./, '').split('.')\r\n let current: any = obj\r\n for (let i = 0; i < parts.length - 1; i++) {\r\n const part = parts[i]\r\n if (current[part] === undefined || current[part] === null) return\r\n current = current[part]\r\n }\r\n delete current[parts[parts.length - 1]]\r\n}\r\n\r\nasync function saveToScope(entry: MemoryEntry): Promise<void> {\r\n const storageKey = entry.status === 'superseded' ? memoryEntryKey(entry.id || entry.key) : entry.key\r\n const serialized = JSON.stringify(entry)\r\n\r\n switch (entry.scope) {\r\n case 'hot':\r\n setNestedPath(state, storageKey, entry.value)\r\n break\r\n\r\n case 'session':\r\n session.set(storageKey, serialized)\r\n break\r\n\r\n case 'local':\r\n store.set(storageKey, serialized)\r\n break\r\n\r\n case 'durable':\r\n await idb.set('memories', storageKey, serialized)\r\n break\r\n }\r\n\r\n await updateIndex(entry.id || entry.key, entry.scope, entry.status === 'superseded')\r\n}\r\n\r\nasync function loadFromScope(id: string, scope: MemoryScope, isSuperseded: boolean = false): Promise<MemoryEntry | null> {\r\n const storageKey = isSuperseded ? memoryEntryKey(id) : id\r\n let raw: string | undefined\r\n\r\n switch (scope) {\r\n case 'hot': {\r\n const val = getNestedPath(state, storageKey)\r\n if (val === undefined) return null\r\n return reconstructEntry(id, val, scope)\r\n }\r\n\r\n case 'session':\r\n raw = session.get(storageKey)\r\n break\r\n\r\n case 'local':\r\n raw = store.get(storageKey)\r\n break\r\n\r\n case 'durable':\r\n raw = await idb.get('memories', storageKey)\r\n break\r\n }\r\n\r\n if (!raw) return null\r\n\r\n try {\r\n const entry = JSON.parse(raw) as MemoryEntry\r\n entry.id = entry.id || id\r\n return entry\r\n } catch (err) {\r\n if (DEV) console.warn('[memorio memory] failed to parse memory entry:', err)\r\n return null\r\n }\r\n}\r\n\r\nfunction reconstructEntry(key: string, value: any, scope: MemoryScope): MemoryEntry {\r\n return {\r\n id: key,\r\n key,\r\n value: value,\r\n type: 'fact',\r\n confidence: 1.0,\r\n scope,\r\n ttl: null,\r\n tags: [],\r\n status: 'active',\r\n createdAt: now(),\r\n lastConfirmedAt: now(),\r\n supersededId: null\r\n }\r\n}\r\n\r\nasync function removeFromScope(id: string, scope: MemoryScope, isSuperseded: boolean = false): Promise<void> {\r\n const storageKey = isSuperseded ? memoryEntryKey(id) : id\r\n\r\n switch (scope) {\r\n case 'hot':\r\n setNestedPath(state, storageKey, undefined)\r\n break\r\n case 'session':\r\n session.remove(storageKey)\r\n break\r\n case 'local':\r\n store.remove(storageKey)\r\n break\r\n case 'durable':\r\n await idb.deleteKey('memories', storageKey)\r\n break\r\n }\r\n\r\n await removeFromIndex(id, isSuperseded)\r\n}\r\n\r\ninterface IndexEntry {\r\n scope: MemoryScope\r\n superseded: boolean\r\n}\r\n\r\nasync function getAllIndexes(): Promise<Record<string, IndexEntry>> {\r\n try {\r\n const raw = store.get(MEMORY_INDEX_KEY)\r\n if (!raw) return {}\r\n return JSON.parse(raw)\r\n } catch (err) {\r\n if (DEV) console.warn('[memorio memory] failed to parse memory index:', err)\r\n return {}\r\n }\r\n}\r\n\r\nasync function updateIndex(id: string, scope: MemoryScope, isSuperseded: boolean = false): Promise<void> {\r\n const index = await getAllIndexes()\r\n index[id] = { scope, superseded: isSuperseded }\r\n store.set(MEMORY_INDEX_KEY, JSON.stringify(index))\r\n}\r\n\r\nasync function removeFromIndex(id: string, isSuperseded: boolean = false): Promise<void> {\r\n const index = await getAllIndexes()\r\n const entry = index[id]\r\n if (entry) {\r\n if (isSuperseded && entry.superseded) {\r\n delete index[id]\r\n } else if (!isSuperseded && !entry.superseded) {\r\n delete index[id]\r\n }\r\n }\r\n store.set(MEMORY_INDEX_KEY, JSON.stringify(index))\r\n}\r\n\r\nasync function loadAll(): Promise<MemoryEntry[]> {\r\n const index = await getAllIndexes()\r\n const entries: MemoryEntry[] = []\r\n\r\n for (const [id, info] of Object.entries(index)) {\r\n const entry = await loadFromScope(id, info.scope, info.superseded)\r\n if (entry) {\r\n entry.id = entry.id || id\r\n entry.supersededId = entry.supersededId ?? null\r\n entries.push(entry)\r\n }\r\n }\r\n\r\n return entries\r\n}\r\n\r\nexport const memory = {\r\n async remember<T>(key: string, value: T, opts: RememberOptions<T> = {}): Promise<void> {\r\n const existing = await this._getEntry(key)\r\n\r\n if (existing && existing.status === 'active') {\r\n const supersededId = `${existing.id}__v${Date.now()}`\r\n const superseded: MemoryEntry = {\r\n ...existing,\r\n id: supersededId,\r\n key: existing.key,\r\n status: 'superseded',\r\n supersededId: null,\r\n lastConfirmedAt: now()\r\n }\r\n await saveToScope(superseded)\r\n await recordJournal(superseded, 'supersede')\r\n }\r\n\r\n const scope = resolveScope(value, opts)\r\n const tags = normalizeTags(opts.tags)\r\n\r\n const entry: MemoryEntry<T> = {\r\n id: opts.id || key,\r\n key,\r\n value,\r\n type: opts.type || 'fact',\r\n confidence: opts.confidence ?? 1.0,\r\n scope,\r\n ttl: opts.ttl ?? null,\r\n tags,\r\n source: opts.source,\r\n status: 'active',\r\n createdAt: now(),\r\n lastConfirmedAt: now(),\r\n updatedAt: now(),\r\n version: existing ? (existing.version ? existing.version + 1 : 1) : 1,\r\n sync: isSyncEnabled() ? 'pending' : undefined,\r\n supersededId: existing ? existing.id : null,\r\n hlc: hlc.serialize(hlc.tick())\r\n }\r\n\r\n await saveToScope(entry)\r\n await recordJournal(entry, 'remember')\r\n dispatch.set('memorio:memory:remembered', { key, scope, entryId: entry.id })\r\n },\r\n\r\n async recall<T = any>(query: string, opts: RecallOptions = {}): Promise<T | null> {\r\n const entry = await this._getEntry(query)\r\n if (!entry) return null\r\n if (!matchesFilters(entry, opts)) return null\r\n\r\n entry.lastConfirmedAt = now()\r\n await saveToScope(entry)\r\n dispatch.set('memorio:memory:recalled', { key: query })\r\n\r\n return entry.value as T\r\n },\r\n\r\n async context(opts: ContextOptions = {}): Promise<ContextEntry[]> {\r\n const entries = await loadAll()\r\n const filtered = entries.filter(e => matchesContextFilters(e, opts))\r\n\r\n const ranked = filtered\r\n .map(entry => ({\r\n entry,\r\n score: computeRelevance(entry)\r\n }))\r\n .sort((a, b) => b.score - a.score)\r\n .slice(0, opts.maxEntries ?? 25)\r\n\r\n return ranked.map(({ entry }) => ({\r\n key: entry.key,\r\n value: entry.value,\r\n type: entry.type,\r\n confidence: entry.confidence,\r\n scope: entry.scope,\r\n tags: entry.tags,\r\n age: now() - entry.createdAt,\r\n accessCount: entry.tags.length + 1,\r\n lastAccessedAt: entry.lastConfirmedAt\r\n }))\r\n },\r\n\r\n async forget(key: string): Promise<void> {\r\n const entry = await this._getEntry(key)\r\n if (!entry) {\r\n const tombstone: MemoryEntry = {\r\n id: key,\r\n key,\r\n value: null,\r\n type: 'fact',\r\n confidence: 1,\r\n scope: 'local',\r\n ttl: null,\r\n tags: [],\r\n status: 'obsolete',\r\n operation: 'delete',\r\n createdAt: now(),\r\n lastConfirmedAt: now(),\r\n updatedAt: now(),\r\n version: 1,\r\n sync: isSyncEnabled() ? 'pending' : undefined,\r\n hlc: hlc.serialize(hlc.tick())\r\n }\r\n await recordJournal(tombstone, 'delete')\r\n return\r\n }\r\n\r\n await removeFromScope(entry.id || key, entry.scope, entry.status === 'superseded')\r\n\r\n const tombstone: MemoryEntry = {\r\n ...entry,\r\n value: null,\r\n status: 'obsolete',\r\n operation: 'delete',\r\n updatedAt: now(),\r\n version: (entry.version ? entry.version : 0) + 1,\r\n sync: isSyncEnabled() ? 'pending' : undefined,\r\n hlc: hlc.serialize(hlc.tick())\r\n }\r\n await recordJournal(tombstone, 'delete')\r\n dispatch.set('memorio:memory:forgotten', { key })\r\n },\r\n\r\n async update(key: string, value: any, opts: Partial<RememberOptions> = {}): Promise<void> {\r\n const existing = await this._getEntry(key)\r\n if (!existing) {\r\n await this.remember(key, value, opts)\r\n return\r\n }\r\n\r\n const supersededId = `${existing.id}__v${now()}`\r\n const superseded: MemoryEntry = {\r\n ...existing,\r\n id: supersededId,\r\n key: existing.key,\r\n status: 'superseded',\r\n supersededId: null,\r\n lastConfirmedAt: now()\r\n }\r\n await saveToScope(superseded)\r\n await recordJournal(superseded, 'supersede')\r\n\r\n const updated: MemoryEntry = {\r\n ...existing,\r\n value,\r\n lastConfirmedAt: now(),\r\n updatedAt: now(),\r\n version: (existing.version ? existing.version : 0) + 1,\r\n sync: isSyncEnabled() ? 'pending' : undefined,\r\n hlc: hlc.serialize(hlc.tick()),\r\n ...(opts.scope ? { scope: opts.scope } : {}),\r\n ...(opts.ttl !== undefined ? { ttl: opts.ttl } : {}),\r\n ...(opts.type ? { type: opts.type } : {}),\r\n ...(opts.confidence !== undefined ? { confidence: opts.confidence } : {}),\r\n ...(opts.tags !== undefined ? { tags: normalizeTags(opts.tags) } : {}),\r\n ...(opts.source ? { source: opts.source } : {})\r\n }\r\n\r\n await saveToScope(updated)\r\n await recordJournal(updated, 'update')\r\n dispatch.set('memorio:memory:updated', { key, entryId: updated.id })\r\n },\r\n\r\n async stats(): Promise<MemoryStats> {\r\n const entries = await loadAll()\r\n const byScope: Record<MemoryScope, number> = { hot: 0, session: 0, local: 0, durable: 0 }\r\n const byType: Partial<Record<MemoryType, number>> = {}\r\n let expired = 0\r\n\r\n for (const entry of entries) {\r\n byScope[entry.scope] = (byScope[entry.scope] || 0) + 1\r\n\r\n if (isExpired(entry)) expired++\r\n\r\n byType[entry.type] = (byType[entry.type] || 0) + 1\r\n }\r\n\r\n return { total: entries.length, byScope, byType, expired }\r\n },\r\n\r\n async forgetExpired(): Promise<number> {\r\n const entries = await loadAll()\r\n let count = 0\r\n\r\n for (const entry of entries) {\r\n if (isExpired(entry) && entry.status === 'active') {\r\n entry.status = 'obsolete'\r\n entry.updatedAt = now()\r\n entry.operation = 'expire'\r\n await saveToScope(entry)\r\n await recordJournal(entry, 'expire')\r\n count++\r\n }\r\n }\r\n\r\n return count\r\n },\r\n\r\n async clear(): Promise<void> {\r\n const index = await getAllIndexes()\r\n for (const [id, info] of Object.entries(index)) {\r\n await removeFromScope(id, info.scope, info.superseded)\r\n }\r\n store.remove(MEMORY_INDEX_KEY)\r\n },\r\n\r\n async _getEntry(key: string): Promise<MemoryEntry | null> {\r\n const index = await getAllIndexes()\r\n const info = index[key]\r\n\r\n if (!info) {\r\n const val = getNestedPath(state, key)\r\n if (val !== undefined) return reconstructEntry(key, val, 'hot')\r\n return null\r\n }\r\n\r\n return loadFromScope(key, info.scope, info.superseded)\r\n },\r\n\r\n async _loadAll(): Promise<MemoryEntry[]> {\r\n return loadAll()\r\n },\r\n\r\n async _save(entry: MemoryEntry): Promise<void> {\r\n await saveToScope(entry)\r\n },\r\n\r\n /** Apply a field-level path patch to an existing memory entry. */\r\n async patch(key: string, patches: PatchOperation[]): Promise<void> {\r\n const entry = await this._getEntry(key)\r\n if (!entry) return\r\n\r\n let patched = false\r\n for (const p of patches) {\r\n if (p.op === 'set') {\r\n setNestedPath({ [entry.key]: entry.value } as any, p.path.replace(/^[^.]+\\./, ''), p.value)\r\n patched = true\r\n } else if (p.op === 'delete') {\r\n deleteNestedPath({ [entry.key]: entry.value } as any, p.path.replace(/^[^.]+\\./, ''))\n patched = true\r\n }\r\n }\r\n\r\n if (!patched) return\r\n\r\n const updated: MemoryEntry = {\r\n ...entry,\r\n updatedAt: now(),\r\n lastConfirmedAt: now(),\r\n version: (entry.version ? entry.version : 0) + 1,\r\n sync: isSyncEnabled() ? 'pending' : undefined,\r\n hlc: hlc.serialize(hlc.tick()),\r\n patches,\r\n path: patches[0]?.path\r\n }\r\n\r\n await saveToScope(updated)\r\n await recordJournal(updated, 'patch')\r\n dispatch.set('memorio:memory:patched', { key, patches })\r\n },\r\n\r\n /** Local operation journal (namespaced). No-op substrate when sqlite/idb unavailable. */\r\n journal: memoryJournal,\r\n\r\n /** Configure the optional cloud-sync layer (namespace + provider). Chainable. */\r\n configure(opts: SyncConfig): any {\r\n configureSync(opts)\r\n return this\r\n }\r\n}\r\n","/**\r\n * MEMORIO STATE MANAGEMENT\r\n *\r\n * Self-contained reactive state module using Proxy.\r\n * It enables nested object tracking and dispatches events on state changes.\r\n * Internal flags live in `core/internal` (no globalThis.memorio.* writes).\r\n * `core/global.ts` publishes the resulting `state` proxy at bootstrap end.\r\n */\r\n\r\nimport internal, { protect } from '../../core/internal'\r\nimport message from '../message'\r\nimport { dispatch } from '../../core/dispatch'\r\nimport { schema } from '../schema'\r\nimport { DEV } from '../../core/env'\r\n\r\n/**\r\n * Symbol used to recognize Memorio proxy instances and access the underlying\r\n * raw target. It is intentionally a Symbol (not a string key) so it can never\r\n * collide with user keys and is non-enumerable. `__path` remains as a string\r\n * for backward compatibility with external consumers.\r\n */\r\nexport const TARGET = Symbol('memorio.target')\r\n\r\n// WeakMap cache: raw target -> proxy wrapper (avoids allocating a new Proxy\r\n// on every read for the same object, critical in nested-read hot loops).\r\nconst wrapperCache = new WeakMap<any, any>()\r\n\r\n/**\r\n * Recursively unwraps Memorio proxies produced by `buildProxy`, returning the\r\n * plain raw value. Leaves untouched anything that is not one of our proxies\r\n * (Date, Set, Map, functions, React elements with `$$typeof`, primitives, etc).\r\n * Uses a WeakSet to stay safe against cycles.\r\n */\r\nexport const deepRaw = (val: any, seen: WeakSet<object> | null = null): any => {\r\n if (val === null || typeof val !== 'object') return val\r\n // Already one of our proxies → pull the raw target out.\r\n if (val[TARGET] !== undefined) return deepRaw(val[TARGET], seen)\r\n // Avoid infinite recursion on cycles.\r\n if (seen) {\r\n if (seen.has(val)) return val\r\n seen.add(val)\r\n }\r\n // Only traverse plain Objects/Arrays. Other instances are returned by reference.\r\n const ctor = val.constructor?.name\r\n if (ctor !== 'Object' && ctor !== 'Array') return val\r\n const copy: any = Array.isArray(val) ? [] : {}\r\n for (const k of Reflect.ownKeys(val)) {\r\n copy[k] = deepRaw((val as any)[k], seen)\r\n }\r\n return copy\r\n}\r\n\r\n/**\r\n * Builds the dotted path string for a property (no side effects).\r\n * Used by set/delete to compute the state path.\r\n */\r\nexport const objPath = (prop: string, object: string[], separator: string = '.'): string => {\r\n return object.concat(prop).join(separator)\r\n}\r\n\r\n///\r\n/**\r\n * Builds a recursive proxy for reactive state management.\r\n * @param obj The target object to proxy.\r\n * @param callback Function called on state changes.\r\n * @param tree Current path in the object tree.\r\n * @returns A proxied object with reactive behavior.\r\n */\r\nexport const buildProxy = (obj: Record<string, any>, callback: (props: any) => void, tree: string[] = []): any => {\r\n\r\n // EVENT FUNCTION FOR OBSERVER\r\n const event = (name: string) => {\r\n // Dispatch ONLY the exact path, not parent paths\r\n // This ensures useObserver only triggers for the exact property being watched\r\n // name already includes 'state.' prefix from the caller\r\n try {\r\n dispatch.set(name, { detail: { name } })\r\n } catch (err) {\r\n if (DEV) console.warn('[memorio state] event dispatch failed:', err)\r\n }\r\n return\r\n }\r\n\r\n ///\r\n\r\n // CREATE THE PROXY\r\n return new Proxy(\r\n obj,\r\n {\r\n get(target: any, prop: any) {\r\n\r\n if (prop === '__path') {\r\n return tree.length > 0 ? 'state.' + tree.join('.') : 'state'\r\n }\r\n\r\n // Symbol accessor: return the RAW underlying target of a Memorio proxy.\r\n // Prevents re-wrapping already-proxied objects on nested access.\r\n if (prop === TARGET) {\r\n return target\r\n }\r\n\r\n // Re-wrap guard: if the target itself is one of our proxies, never\r\n // allocate a new wrapper around it (prevents exponential wrap growth).\r\n if (target[TARGET] !== undefined) {\r\n return target\r\n }\r\n\r\n if (prop === 'list') {\r\n message('Some state could be hidden when you use \"state.list\". Use \"state\" to see the complete list ')\r\n return deepRaw(target, new WeakSet())\r\n }\r\n\r\n // Track access for useObserver auto-discovery and last path\r\n if (typeof prop === 'string') {\r\n const path = tree.length > 0 ? 'state.' + tree.concat(prop).join('.') : 'state.' + prop\r\n internal.lastAccessedPath = path\r\n if (internal.tracking) {\r\n internal.trackedPaths.add(path)\r\n }\r\n }\r\n\r\n // Handle special property to get last accessed path for primitive values\r\n if (prop === '_lastPath') {\r\n return internal.lastAccessedPath\r\n }\r\n\r\n if (prop === 'remove') {\r\n return (key: string) => {\r\n delete target[key]\r\n return true\r\n }\r\n }\r\n\r\n if (prop === 'removeAll') {\r\n return () => {\r\n try {\r\n for (const key in target) {\r\n if (typeof target[key] !== 'function' && !['list', 'remove', 'removeAll', 'lock', 'unlock'].includes(key)) {\r\n delete target[key]\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error)\r\n }\r\n return\r\n }\r\n }\r\n\r\n if (Object.isFrozen(target[prop])) return target[prop]\r\n\r\n // Handle lock/unlock properties - return from raw target\r\n if (prop === 'lock' || prop === 'unlock') {\r\n const value = Reflect.get(target, prop)\r\n if (value) return value\r\n }\r\n\r\n try {\r\n const value = Reflect.get(target, prop)\r\n if (value && typeof value === 'object' && ['Array', 'Object'].includes(value.constructor.name)) {\r\n // Reuse a cached wrapper for the same raw target to avoid allocating\r\n // a new Proxy on every read (critical in nested-read hot loops).\r\n let wrapper = wrapperCache.get(value)\r\n if (!wrapper) {\r\n wrapper = buildProxy(value, callback, tree.concat(prop as string))\r\n wrapperCache.set(value, wrapper)\r\n }\r\n return wrapper\r\n }\r\n // Return value directly - useObserver handles primitives via lastAccessedPath\r\n return value\r\n } catch (error) {\r\n console.error('Error: ', error)\r\n return undefined\r\n }\r\n\r\n },\r\n\r\n set(target: any, key: string, value: any): boolean {\r\n\r\n // LOCKED MODE - prevent all modifications\r\n if (internal.locked) {\r\n console.error('Error: state is locked. Use state.unlock() to enable modifications.')\r\n return false\r\n }\r\n\r\n // PROTECTED\r\n if (protect.includes(key)) {\r\n console.error('key ' + key + ' is protected')\r\n return false\r\n }\r\n\r\n // FREEZED\r\n if (target[key] && typeof target[key] === 'object' && Object.isFrozen(target[key])) {\r\n console.error(`Error: state '${key}' is locked`)\r\n return false\r\n }\r\n\r\n // LOCKED - check if this specific key is locked\r\n if (target[key] && typeof target[key] === 'object' && (target[key] as any).__locked) {\r\n console.error(`Error: state '${key}' is locked. Use state.${key}.unlock() to enable modifications.`)\r\n return false\r\n }\r\n\r\n // ALLOWED SET\r\n\r\n try {\r\n\r\n const path = objPath(key as string, tree)\r\n\r\n // Unwrap any Memorio proxies (and nested ones) before storing so we\r\n // never persist wrappers inside the raw state tree. This prevents the\r\n // exponential re-wrap growth caused by `{ ...state.x }` style updates.\r\n const rawValue = deepRaw(value)\r\n\r\n /**\r\n * SCHEMA VALIDATION\r\n * If a validator was registered for this path, reject the write\r\n * when it fails. The setter returns false so callers can detect\r\n * validation rejection.\r\n */\r\n const _schemaResult = schema.validate(path, rawValue)\r\n if (!_schemaResult.valid) {\r\n if (DEV && internal.debug) {\r\n console.error(\r\n `[memorio schema] Validation failed for '${path}':`,\r\n _schemaResult.errors\r\n )\r\n }\r\n message(\r\n `[memorio schema] Validation failed for '${path}': ` +\r\n (_schemaResult.errors?.join(', ') || 'unknown error')\r\n )\r\n return false\r\n }\r\n\r\n callback(\r\n {\r\n action: 'set',\r\n path,\r\n target,\r\n newValue: rawValue,\r\n previousValue: Reflect.get(target, key)\r\n }\r\n )\r\n\r\n event('state.' + path)\r\n\r\n Reflect.set(target, key, rawValue)\r\n\r\n // Increment state version for React dependency tracking\r\n internal.bumpStateVersion()\r\n // DEFINE LOCK PROPERTY FUNCTION\r\n // NOTE: lock/unlock is first-level only (non-recursive). Locking a\r\n // node freezes the node's own `__locked` flag and guards its direct\r\n // setters via the proxy traps, but does NOT recurse into deep\r\n // descendants - `state.a.lock()` locks `a`, not `a.b.c`. This keeps\r\n // the per-set O(1) cost; wrap descendants explicitly if needed.\r\n if (target[key] && typeof target[key] === 'object') {\r\n\r\n // Get the raw value from target directly (not through proxy)\r\n const lockValue = target[key]\r\n if (lockValue && typeof lockValue === 'object') {\r\n try {\r\n // Define lock and unlock methods on the object\r\n // Use a special property to track locked state\r\n Object.defineProperty(lockValue, '__locked', {\r\n writable: true,\r\n enumerable: false,\r\n configurable: false,\r\n value: false\r\n })\r\n Object.defineProperty(lockValue, 'lock', {\r\n writable: false,\r\n enumerable: false,\r\n configurable: false,\r\n value: () => {\r\n Object.defineProperty(lockValue, '__locked', {\r\n writable: true,\r\n enumerable: false,\r\n configurable: false,\r\n value: true\r\n })\r\n message(`State '${key}' is now locked.`)\r\n }\r\n })\r\n Object.defineProperty(lockValue, 'unlock', {\r\n writable: false,\r\n enumerable: false,\r\n configurable: false,\r\n value: () => {\r\n Object.defineProperty(lockValue, '__locked', {\r\n writable: true,\r\n enumerable: false,\r\n configurable: false,\r\n value: false\r\n })\r\n message(`State '${key}' is now unlocked.`)\r\n }\r\n })\r\n } catch (err) {\r\n if (DEV) console.warn('[memorio state] lock/unlock defineProperty failed:', err)\r\n }\r\n }\r\n\r\n }\r\n\r\n return true\r\n\r\n } catch (error) {\r\n\r\n console.error('Error in set trap:', error)\r\n return false\r\n\r\n }\r\n\r\n },\r\n\r\n deleteProperty(target: any, prop: string | symbol): boolean {\r\n try {\r\n const path = objPath(prop as string, tree)\r\n const previousValue = Reflect.get(target, prop)\r\n callback({ action: 'delete', path, target, previousValue })\r\n return Reflect.deleteProperty(target, prop)\r\n } catch (error) {\r\n console.error('Error in deleteProperty trap:', error)\r\n return false\r\n }\r\n },\r\n\r\n ownKeys(target: any): Array<string | symbol> {\r\n return Reflect.ownKeys(target)\r\n },\r\n\r\n getOwnPropertyDescriptor(target: any, prop: string | symbol): PropertyDescriptor | undefined {\r\n return Reflect.getOwnPropertyDescriptor(target, prop)\r\n }\r\n\r\n }\r\n\r\n )\r\n\r\n}\r\n\r\n// Reuse existing state proxy via private globalThis key to guard against\r\n// module duplication across ESM/CJS/absolute-path imports creating separate\r\n// state trees. The public `globalThis.state` is set separately by core/global.ts.\r\nconst STATE_INSTANCE_KEY = '__memorio_state_instance__'\r\nlet state: any\r\n\r\nif ((globalThis as any)[STATE_INSTANCE_KEY]) {\r\n state = (globalThis as any)[STATE_INSTANCE_KEY]\r\n} else {\r\n state = buildProxy({}, (mutation: any) => {\r\n if (internal.historyEnabled) {\r\n internal.recordMutation({\r\n path: mutation.path,\r\n action: mutation.action,\r\n newValue: mutation.newValue,\r\n previousValue: mutation.previousValue,\r\n timestamp: Date.now()\r\n })\r\n }\r\n })\r\n\r\n // Add lock/unlock methods to state\r\n state.lock = () => {\r\n internal.locked = true\r\n message('State is now locked. All modifications are blocked.')\r\n }\r\n\r\n state.unlock = () => {\r\n internal.locked = false\r\n message('State is now unlocked. Modifications are allowed.')\r\n }\r\n\r\n (globalThis as any)[STATE_INSTANCE_KEY] = state\r\n}\r\n\r\nexport { state }\r\nexport default state\r\n","/**\r\n * MEMORIO DISPATCH\r\n *\r\n * Event system for vanilla JS. Listens, emits and removes custom events\r\n * on globalThis using the platform-native CustomEvent / dispatchEvent.\r\n * Self-contained: it does NOT import observer (breaks the cycle) and\r\n * manages duplicate listeners via globalThis.events directly.\r\n * `core/global.ts` publishes it at the end of bootstrap.\r\n */\r\n\r\nexport const dispatch = {\r\n /**\r\n * Dispatches a custom event with the specified name and value.\r\n * @param name The name of the event.\r\n * @param value The value to pass with the event.\r\n */\r\n set: (name: string, value = {}): void => {\r\n globalThis.dispatchEvent(new CustomEvent(String(name), value))\r\n },\r\n\r\n ///\r\n /**\r\n * Subscribes a callback to an event name. Maintains a *list* of handlers per\r\n * name, so multiple subscribers on the same path (e.g. several\r\n * `useObserver` calls observing `state.report`) each keep firing and each\r\n * get an independent unsubscribe. The previous single-slot-per-name\r\n * behaviour silently dropped the second subscriber and let any unsubscribe\r\n * cancel every other subscriber on that path.\r\n * @param name The name of the event to listen for.\r\n * @param cb The callback function to execute when the event is triggered.\r\n * @returns An unsubscribe function for this subscriber, or void if no callback.\r\n */\r\n listen: (name: string, cb: ((e: Event) => void) | null = null, _flag?: boolean): (() => void) | void => {\r\n if (!cb) return\r\n const wrapped: (e: Event) => void = (e: Event) => {\r\n const target = e\r\n if (globalThis.queueMicrotask) {\r\n globalThis.queueMicrotask(() => cb(target))\r\n } else {\r\n Promise.resolve().then(() => cb(target))\r\n }\r\n }\r\n globalThis.addEventListener(name, wrapped)\r\n const list: Array<(e: Event) => void> = (globalThis.events[name] = globalThis.events[name] ?? [])\r\n list.push(wrapped)\r\n return () => {\r\n globalThis.removeEventListener(name, wrapped)\r\n const idx = list.indexOf(wrapped)\r\n if (idx > -1) list.splice(idx, 1)\r\n if (!list.length) delete globalThis.events[name]\r\n }\r\n },\r\n\r\n ///\r\n /**\r\n * Removes ALL handlers for the specified event name (imperative bulk\r\n * removal). For per-subscriber teardown, use the unsubscribe function\r\n * returned by `listen`.\r\n * @param name The name of the event to remove the listeners for.\r\n */\r\n remove: (name: string): void => {\r\n const entry = globalThis.events?.[name]\r\n if (Array.isArray(entry)) {\r\n entry.forEach((h: (e: Event) => void) => globalThis.removeEventListener(name, h))\r\n } else if (typeof entry === 'function') {\r\n globalThis.removeEventListener(name, entry as EventListener)\r\n }\r\n delete globalThis.events[name]\r\n }\r\n}\n\r\nexport default dispatch\r\n","/**\n * MEMORIO SCHEMA VALIDATION\n *\n * Lightweight, zero-dependency schema validation system that hooks into\n * the state proxy's set trap. When a schema is registered for a path,\n * any `state.set` at that path is validated before the value is written.\n *\n * Supported schema features:\n * - Type checking: 'string' | 'number' | 'boolean' | 'object' | 'array' | 'any'\n * - Required fields (on objects)\n * - Min/max constraints (numbers: value; strings: length)\n * - Regex pattern matching (strings)\n * - Enum membership\n * - Custom validator functions returning `true` or an error string\n * - Nested property validation (recursive object schemas)\n * - Array item validation (per-element schemas via `items`)\n *\n * @module memorio/schema\n */\n\nimport message from '../message'\n\n// --- Types ---\n\nexport type SchemaType = 'string' | 'number' | 'boolean' | 'object' | 'array' | 'any'\n\nexport interface Schema {\n /** Expected runtime type of the value. */\n type?: SchemaType\n /** Required property names when type is 'object'. */\n required?: string[]\n /** Nested property schemas (validated recursively). */\n properties?: Record<string, Schema>\n /** Item schema validated against each element when type is 'array'. */\n items?: Schema\n /** Minimum: value for numbers, length for strings. */\n min?: number\n /** Maximum: value for numbers, length for strings. */\n max?: number\n /** Regex pattern a string value must match. */\n pattern?: RegExp\n /** Whitelist of allowed values. */\n enum?: any[]\n /** Custom validator: return `true` for pass, or a string describing the error. */\n validator?: (value: any) => boolean | string\n}\n\nexport interface ValidationResult {\n /** Whether the value passed all checks. */\n valid: boolean\n /** Array of human-readable error strings (present when valid is false). */\n errors?: string[]\n}\n\n// --- Schema Registry ---\n\nconst _schemas = new Map<string, Schema>()\n\n// --- Core Validation ---\n\n/**\n * Recursively validates a value against a schema definition.\n * @param value The value to validate.\n * @param schema The schema to validate against.\n * @param path The dotted path (for error messages).\n * @returns ValidationResult with valid flag and optional errors.\n */\nconst _validateValue = (value: any, schema: Schema, path: string): ValidationResult => {\n const errors: string[] = []\n\n // --- Type check ---\n if (schema.type && schema.type !== 'any') {\n const actualType = Array.isArray(value) ? 'array' : typeof value\n if (actualType !== schema.type) {\n errors.push(`${path}: expected ${schema.type}, got ${actualType}`)\n return { valid: false, errors }\n }\n }\n\n // --- Enum check ---\n if (schema.enum && !schema.enum.includes(value)) {\n errors.push(`${path}: value must be one of [${schema.enum.map(String).join(', ')}]`)\n }\n\n // --- Custom validator ---\n if (schema.validator) {\n const result = schema.validator(value)\n if (result !== true) {\n errors.push(`${path}: ${typeof result === 'string' ? result : 'validation failed'}`)\n }\n }\n\n // --- Number constraints ---\n if (typeof value === 'number') {\n if (schema.min !== undefined && value < schema.min) {\n errors.push(`${path}: value ${value} is less than minimum ${schema.min}`)\n }\n if (schema.max !== undefined && value > schema.max) {\n errors.push(`${path}: value ${value} exceeds maximum ${schema.max}`)\n }\n }\n\n // --- String constraints ---\n if (typeof value === 'string') {\n if (schema.min !== undefined && value.length < schema.min) {\n errors.push(`${path}: string length ${value.length} is less than minimum ${schema.min}`)\n }\n if (schema.max !== undefined && value.length > schema.max) {\n errors.push(`${path}: string length ${value.length} exceeds maximum ${schema.max}`)\n }\n if (schema.pattern && !schema.pattern.test(value)) {\n errors.push(`${path}: string does not match required pattern`)\n }\n }\n\n // --- Object validation ---\n if (schema.type === 'object' && value && typeof value === 'object' && !Array.isArray(value)) {\n if (schema.required) {\n for (const req of schema.required) {\n if (!(req in value)) {\n errors.push(`${path}: missing required property '${req}'`)\n }\n }\n }\n if (schema.properties) {\n for (const [prop, propSchema] of Object.entries(schema.properties)) {\n if (prop in value && value[prop] !== undefined) {\n const propResult = _validateValue(value[prop], propSchema, `${path}.${prop}`)\n if (!propResult.valid) {\n errors.push(...(propResult.errors || []))\n }\n }\n }\n }\n }\n\n // --- Array item validation ---\n if (schema.type === 'array' && Array.isArray(value) && schema.items) {\n for (let i = 0; i < value.length; i++) {\n const itemResult = _validateValue(value[i], schema.items, `${path}[${i}]`)\n if (!itemResult.valid) {\n errors.push(...(itemResult.errors || []))\n }\n }\n }\n\n return errors.length === 0\n ? { valid: true }\n : { valid: false, errors }\n}\n\n// --- Public API ---\n\n/**\n * Validates a value against a previously registered schema.\n * If no schema is registered for the path, validation passes trivially.\n * @param path The state path (e.g. 'user', 'user.age').\n * @param value The value to validate.\n * @returns ValidationResult.\n */\nexport const validate = (path: string, value: any): ValidationResult => {\n const schema = _schemas.get(path)\n if (!schema) {\n return { valid: true }\n }\n return _validateValue(value, schema, path)\n}\n\n/**\n * Registers a schema (or custom validator) for a state path.\n *\n * The schema is checked by the state proxy on every write to the registered path.\n * If validation fails the write is rejected (returns false) and an error is logged.\n *\n * @param path The state path to guard (e.g. `'user'` catches `state.user = ...`).\n * @param schema A Schema object, or a custom validator function.\n *\n * @example\n * // Object schema with required fields and typed properties\n * memorio.registerSchema('user', {\n * type: 'object',\n * required: ['name', 'email'],\n * properties: {\n * name: { type: 'string', min: 1 },\n * email: { type: 'string', pattern: /^[^@]+@[^@]+$/' },\n * age: { type: 'number', min: 0 }\n * }\n * })\n *\n * @example\n * // Custom validator function\n * memorio.registerSchema('theme', (v) =>\n * v === 'light' || v === 'dark'\n * ? true\n * : 'theme must be \"light\" or \"dark\"')\n */\nexport const registerSchema = (\n path: string,\n schema: Schema | ((value: any) => boolean | string)\n): void => {\n if (typeof schema === 'function') {\n _schemas.set(path, { validator: schema as (value: any) => boolean | string })\n } else {\n _schemas.set(path, schema as Schema)\n }\n message(`[memorio schema] Registered schema for '${path}'`)\n}\n\n/**\n * Removes a previously registered schema.\n * @param path The state path to unregister.\n * @returns `true` if a schema was removed, `false` if none existed.\n */\nexport const unregisterSchema = (path: string): boolean => {\n return _schemas.delete(path)\n}\n\n/**\n * Lists all registered schema paths.\n * @returns Array of registered path strings.\n */\nexport const listSchemas = (): string[] => {\n return Array.from(_schemas.keys())\n}\n\n/**\n * Retrieves the schema registered for a path.\n * @param path The state path.\n * @returns The registered Schema, or `undefined`.\n */\nexport const getSchema = (path: string): Schema | undefined => {\n return _schemas.get(path)\n}\n\n// --- Namespace object ---\n\nconst schema = {\n register: registerSchema,\n validate,\n unregister: unregisterSchema,\n list: listSchemas,\n get: getSchema\n}\n\nexport default schema\nexport { schema }\n","/**\r\n * MEMORIO STORE (localStorage)\r\n *\r\n * This module provides localStorage persistence with a simple API.\r\n * It handles JSON serialization/deserialization automatically.\r\n *\r\n * **CLIENT-ONLY**: This module requires a browser environment with localStorage.\r\n * In Node.js/Deno, this will use an in-memory fallback.\r\n *\r\n * Storage Isolation:\r\n * - Each instance gets its own isolated namespace\r\n * - Prevents state leakage between different requests\r\n *\r\n * @todo v4.3.0 - Use AsyncLocalStorage for true request isolation in Node.js/Deno\r\n * Current: internal.currentContext is module-local (race condition in concurrent requests)\r\n */\r\n\r\n// STORE\r\n\r\nimport { getLocalStorage } from '../../core/platform'\r\nimport internal from '../../core/internal'\r\nimport { message } from '../message'\r\n\r\ntype _store = {\r\n get: (name: string) => any\r\n set: (name: string, value: any) => boolean\r\n remove: (name: string) => boolean\r\n delete: (name: string) => boolean\r\n removeAll: () => boolean\r\n clearAll: () => boolean\r\n quota: () => Promise<[number, number]>\r\n size: () => number\r\n list: () => Record<string, any>\r\n getMultiple: <T>(keys: string[]) => Record<string, T>\r\n isPersistent: boolean\r\n}\r\n\r\n// Get storage implementation based on environment\r\nconst _localStorage = getLocalStorage()\r\n\r\n// Fallback in-memory storage for Node.js/Deno - Map of context -> key-value pairs\r\nconst _fallbackStorageByContext = new Map<string, Map<string, string>>()\r\n\r\n// Get fallback storage for current context\r\nfunction _getFallbackStorage(): Map<string, string> {\r\n const contextName = internal.currentContext || ''\r\n const key = contextName || 'default'\r\n if (!_fallbackStorageByContext.has(key)) {\r\n _fallbackStorageByContext.set(key, new Map<string, string>())\r\n }\r\n return _fallbackStorageByContext.get(key)!\r\n}\r\n\r\n// Check if we have real localStorage\r\nconst _hasStorage = _localStorage !== null\r\n\r\n// Helper to get dynamic prefix based on current context\r\nfunction _getPrefix(): string {\r\n const contextName = internal.currentContext || ''\r\n return contextName ? `${contextName}-` : `memorio_store_`\r\n}\r\n\r\n// Helper to prefix keys with context-aware prefix\r\nfunction _prefixKey(name: string): string {\r\n // Validate key\r\n if (!name || typeof name !== 'string') {\r\n console.warn(`[memorio store] key is empty or not a string - operation aborted`)\r\n return ''\r\n }\r\n if (name.length > 512) {\r\n console.warn(`[memorio store] key \"${name}\" exceeds 512 chars - operation aborted`)\r\n return ''\r\n }\r\n // localStorage permits any string key. We no longer enforce a charset\r\n // because `:` and `/` are common namespace separators (e.g. \"a:b\").\r\n // Only empty/non-string keys are rejected (handled above).\r\n return _getPrefix() + name\r\n}\r\n\r\n// Read a raw (already prefixed) value, parsed from JSON.\r\nfunction _read(prefixedName: string): any {\r\n const raw = _hasStorage\r\n ? _localStorage.getItem(prefixedName)\r\n : _getFallbackStorage().get(prefixedName)\r\n return raw ? JSON.parse(raw) : raw\r\n}\r\n\r\n// Write a JSON-serializable value under a (already prefixed) key.\r\nfunction _write(prefixedName: string, value: any): void {\r\n const json = JSON.stringify(value)\r\n if (_hasStorage) _localStorage.setItem(prefixedName, json)\r\n else _getFallbackStorage().set(prefixedName, json)\r\n}\r\n\r\n// Remove a (already prefixed) key. Returns true if it existed.\r\nfunction _remove(prefixedName: string): boolean {\r\n if (_hasStorage) {\r\n if (_localStorage.getItem(prefixedName)) {\r\n _localStorage.removeItem(prefixedName)\r\n return true\r\n }\r\n } else if (_getFallbackStorage().has(prefixedName)) {\r\n _getFallbackStorage().delete(prefixedName)\r\n return true\r\n }\r\n return false\r\n}\r\n\r\n// Reuse existing store proxy via private globalThis key to guard against\r\n// module duplication across ESM/CJS/absolute-path imports. The public\r\n// `globalThis.store` is set separately by core/global.ts (dev only).\r\nconst STORE_INSTANCE_KEY = '__memorio_store_instance__'\r\nlet store: any\r\n\r\nif ((globalThis as any)[STORE_INSTANCE_KEY]) {\r\n store = (globalThis as any)[STORE_INSTANCE_KEY]\r\n} else {\r\n store = new Proxy({} as _store, {})\r\n\r\n Object.defineProperties(\r\n store,\r\n {\r\n /**\r\n * Gets a value from storage.\r\n * @param name The key to retrieve.\r\n * @returns The parsed value or null if not found.\r\n */\r\n get: {\r\n value: (name: string) => {\r\n if (!name) {\r\n console.warn('[memorio store] store.get() called with empty or null key - returning null')\r\n return null\r\n }\r\n try {\r\n return _read(_prefixKey(name))\r\n } catch (err) {\r\n message(`Error parsing store item '${name}': ${err}`)\r\n }\r\n return null\r\n }\r\n },\r\n\r\n getMultiple: {\r\n value: <T>(keys: string[]): Record<string, T> => {\r\n const result: Record<string, T> = {}\r\n for (const key of keys) {\r\n try {\r\n const item = store.get(key)\r\n if (item) result[key] = item\r\n } catch (err) {\r\n console.debug(`[memorio store] getMultiple error for key \"${key}\":`, err)\r\n }\r\n }\r\n return result\r\n }\r\n },\r\n\r\n /**\r\n * Sets a value in storage.\r\n * @param name The key to set.\r\n * @param value The value to store (objects, arrays, primitives).\r\n * @returns true if written, false if the key was rejected.\r\n */\r\n set: {\r\n value: (name: string, value: any): boolean => {\r\n if (!name) {\r\n console.warn('[memorio store] store.set() called with empty or null key - write aborted')\r\n return false\r\n }\r\n const prefixedName = _prefixKey(name)\r\n if (!prefixedName) return false\r\n if (typeof value === 'function') {\r\n console.warn('[memorio store] functions are not storable - write aborted for key: ' + name)\r\n message('Storing functions is not secure and is blocked for safety.')\r\n return false\r\n }\r\n try {\r\n _write(prefixedName, value)\r\n } catch (err) {\r\n message(`Error setting store item '${name}': ${err}`)\r\n return false\r\n }\r\n return true\r\n }\r\n },\r\n\r\n /**\r\n * Removes a value from storage.\r\n * @param name The key to remove.\r\n * @returns True if removed, false if not found.\r\n */\r\n remove: {\r\n value: (name: string) => {\r\n if (!name) {\r\n console.debug('[memorio store] store.remove() called with empty or null key - returning false')\r\n return false\r\n }\r\n const prefixedName = _prefixKey(name)\r\n if (!prefixedName) return false\r\n try {\r\n return _remove(prefixedName)\r\n } catch (err) {\r\n message(`Error removing store item '${name}': ${err}`)\r\n }\r\n return false\r\n }\r\n },\r\n\r\n /**\r\n * Alias for remove.\r\n * @param name The key to delete.\r\n */\r\n delete: {\r\n value: (name: string) => {\r\n return store.remove(name)\r\n }\r\n },\r\n\r\n /**\r\n * Clears all memorio items from storage.\r\n */\r\n removeAll: {\r\n value: () => {\r\n if (_hasStorage) {\r\n const keysToRemove: string[] = []\r\n for (let i = 0; i < _localStorage.length; i++) {\r\n const key = _localStorage.key(i)\r\n if (key?.startsWith(_getPrefix())) keysToRemove.push(key)\r\n }\r\n keysToRemove.forEach(key => _localStorage.removeItem(key))\r\n } else {\r\n _getFallbackStorage().clear()\r\n }\r\n return true\r\n }\r\n },\r\n\r\n /**\r\n * Alias for removeAll.\r\n */\r\n clearAll: {\r\n value: () => {\r\n store.removeAll()\r\n return true\r\n }\r\n },\r\n\r\n /**\r\n * Estimates storage quota usage.\r\n * @returns Promise with [usage, quota].\r\n */\r\n quota: {\r\n value: async (): Promise<[number, number]> => {\r\n return [0, 0] as [number, number]\r\n }\r\n },\r\n\r\n /**\r\n * Calculates total size of all memorio items in kilobytes.\r\n * Counts each prefixed key and its JSON-serialized value, summing their\r\n * byte lengths and converting to whole kilobytes (Math.ceil). Replaces\r\n * the previous character-only total which did not express real usage.\r\n * @returns Total size in kilobytes (0 when empty / no memorio items).\r\n */\r\n size: {\r\n value: () => {\r\n let totalBytes = 0\r\n if (_hasStorage) {\r\n for (let i = 0; i < _localStorage.length; i++) {\r\n const key = _localStorage.key(i)\r\n if (key && key.startsWith(_getPrefix())) {\r\n const item = _localStorage.getItem(key)\r\n if (item) totalBytes += key.length + item.length\r\n }\r\n }\r\n } else {\r\n _getFallbackStorage().forEach((value: string, key: string) => {\r\n totalBytes += key.length + value.length\r\n })\r\n }\r\n return totalBytes === 0 ? 0 : Math.ceil(totalBytes / 1024)\r\n }\r\n },\r\n\r\n /**\r\n * Check if using real localStorage or fallback\r\n */\r\n isPersistent: {\r\n get: () => _hasStorage\r\n },\r\n\r\n /**\r\n * Get a list of all memorio store items.\r\n */\r\n list: {\r\n value: (): Record<string, any> => {\r\n const result: Record<string, any> = {}\r\n try {\r\n if (_hasStorage) {\r\n for (let i = 0; i < _localStorage.length; i++) {\r\n const key = _localStorage.key(i)\r\n if (key?.startsWith(_getPrefix())) {\r\n const cleanKey = key.replace(_getPrefix(), '')\r\n const item = _localStorage.getItem(key)\r\n if (item !== null) {\r\n try {\r\n result[cleanKey] = JSON.parse(item)\r\n } catch {\r\n result[cleanKey] = item\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n _getFallbackStorage().forEach((value: string, key: string) => {\r\n if (key.startsWith(_getPrefix())) {\r\n const cleanKey = key.replace(_getPrefix(), '')\r\n try {\r\n result[cleanKey] = JSON.parse(value)\r\n } catch {\r\n result[cleanKey] = value\r\n }\r\n }\r\n })\r\n }\r\n } catch (err) {\r\n message(`Error listing store items: ${err}`)\r\n }\r\n return result\r\n }\r\n }\r\n\r\n }\r\n)\r\n\r\n\r\n Object.freeze(store as _store);\r\n (globalThis as any)[STORE_INSTANCE_KEY] = store\r\n}\r\n\r\nexport { store }\r\nexport default store\r\n","/**\r\n * MEMORIO SESSION (sessionStorage)\r\n *\r\n * This module provides sessionStorage persistence with a simple API.\r\n * Data is cleared when the browser tab is closed.\r\n *\r\n * **CLIENT-ONLY**: This module requires a browser environment with sessionStorage.\r\n * In Node.js/Deno, this will use an in-memory fallback.\r\n *\r\n * Session Isolation:\r\n * - Each session gets its own isolated namespace\r\n * - Prevents state leakage between different requests\r\n *\r\n * @todo v4.3.0 - Use AsyncLocalStorage for true request isolation in Node.js/Deno\r\n * Current: internal.currentContext is a global variable (race condition in concurrent requests)\r\n */\r\n\r\nimport { getSessionStorage } from '../../core/platform'\r\nimport internal from '../../core/internal'\r\nimport { message } from '../message'\r\n\r\ntype _session = {\r\n get: (name: string) => any\r\n set: (name: string, value: any) => boolean\r\n remove: (name: string) => boolean\r\n delete: (name: string) => boolean\r\n removeAll: () => boolean\r\n clearAll: () => boolean\r\n quota: () => Promise<[number, number]>\r\n size: () => number\r\n list: () => Record<string, any>\r\n isPersistent: boolean\r\n}\r\n\r\n// Get storage implementation based on environment\r\nconst _sessionStorage = getSessionStorage()\r\n\r\n// Fallback in-memory storage for Node.js/Deno - Map of context -> key-value pairs\r\nconst _fallbackStorageByContext = new Map<string, Map<string, string>>()\r\n\r\n// Get fallback storage for current context\r\nfunction _getFallbackStorage(): Map<string, string> {\r\n const contextName = internal.currentContext || ''\r\n const key = contextName || 'default'\r\n if (!_fallbackStorageByContext.has(key)) {\r\n _fallbackStorageByContext.set(key, new Map<string, string>())\r\n }\r\n return _fallbackStorageByContext.get(key)!\r\n}\r\n\r\n// Check if we have real sessionStorage\r\nconst _hasStorage = _sessionStorage !== null\r\n\r\n// Helper to get dynamic prefix based on current context\r\nfunction _getPrefix(): string {\r\n const contextName = internal.currentContext || ''\r\n return contextName ? `${contextName}-` : `memorio_session_`\r\n}\r\n\r\n// Helper to prefix keys with context-aware prefix\r\nfunction _prefixKey(name: string): string {\r\n // Validate key\r\n if (!name || typeof name !== 'string') {\r\n console.warn('[memorio session] key is empty or not a string - operation aborted')\r\n return ''\r\n }\r\n if (name.length > 512) {\r\n console.warn(`[memorio session] key \"${name}\" exceeds 512 chars - operation aborted`)\r\n return ''\r\n }\r\n // sessionStorage permits any string key. We no longer enforce a charset\r\n // because ':' and '/' are common namespace separators (e.g. 'app:section').\r\n // Only empty/non-string keys are rejected (handled above).\r\n return _getPrefix() + name\r\n}\r\n\r\n// Read a raw (already prefixed) value, parsed from JSON.\r\nfunction _read(prefixedName: string): any {\r\n const raw = _hasStorage\r\n ? _sessionStorage.getItem(prefixedName)\r\n : _getFallbackStorage().get(prefixedName)\r\n return raw ? JSON.parse(raw) : raw\r\n}\r\n\r\n// Write a JSON-serializable value under a (already prefixed) key.\r\nfunction _write(prefixedName: string, value: any): void {\r\n const json = JSON.stringify(value)\r\n if (_hasStorage) _sessionStorage.setItem(prefixedName, json)\r\n else _getFallbackStorage().set(prefixedName, json)\r\n}\r\n\r\n// Remove a (already prefixed) key. Returns true if it existed.\r\nfunction _remove(prefixedName: string): boolean {\r\n if (_hasStorage) {\r\n if (_sessionStorage.getItem(prefixedName)) {\r\n _sessionStorage.removeItem(prefixedName)\r\n return true\r\n }\r\n } else if (_getFallbackStorage().has(prefixedName)) {\r\n _getFallbackStorage().delete(prefixedName)\r\n return true\r\n }\r\n return false\r\n}\r\n\r\n// Reuse existing session proxy via private globalThis key to guard against\r\n// module duplication across ESM/CJS/absolute-path imports. The public\r\n// `globalThis.session` is set separately by core/global.ts (dev only).\r\nconst SESSION_INSTANCE_KEY = '__memorio_session_instance__'\r\nlet session: any\r\n\r\nif ((globalThis as any)[SESSION_INSTANCE_KEY]) {\r\n session = (globalThis as any)[SESSION_INSTANCE_KEY]\r\n} else {\r\n session = new Proxy({} as _session, {})\r\n\r\n Object.defineProperties(\r\n session,\r\n {\r\n /**\r\n * Gets a value from storage.\r\n * @param name The key to retrieve.\r\n * @returns The parsed value or null if not found.\r\n */\r\n get: {\r\n value: (name: string) => {\r\n if (!name) {\r\n console.warn('[memorio session] session.get() called with empty or null key - returning null')\r\n return null\r\n }\r\n try {\r\n return _read(_prefixKey(name))\r\n } catch (err) {\r\n message(`Error parsing session item '${name}':${err}`)\r\n }\r\n return null\r\n }\r\n },\r\n\r\n /**\r\n * Sets a value in storage.\r\n * @param name The key to set.\r\n * @param value The value to store.\r\n * @returns true if written, false if the key was rejected.\r\n */\r\n set: {\r\n value: (name: string, value: any): boolean => {\r\n if (!name) {\r\n console.warn('[memorio session] session.set() called with empty or null key - write aborted')\r\n return false\r\n }\r\n const prefixedName = _prefixKey(name)\r\n if (!prefixedName) return false\r\n if (typeof value === 'function') {\r\n console.warn('[memorio session] functions are not storable - write aborted for key: ' + name)\r\n message('It\\'s not secure to session functions.')\r\n return false\r\n }\r\n try {\r\n _write(prefixedName, value)\r\n } catch (err) {\r\n message(`Error setting session item '${name}': ${err}`)\r\n return false\r\n }\r\n return true\r\n }\r\n },\r\n\r\n /**\r\n * Removes a value from storage.\r\n * @param name The key to remove.\r\n * @returns True if removed.\r\n */\r\n remove: {\r\n value: (name: string): boolean => {\r\n if (!name) {\r\n console.warn('[memorio session] session.remove() called with empty or null key - returning false')\r\n return false\r\n }\r\n const prefixedName = _prefixKey(name)\r\n if (!prefixedName) return false\r\n try {\r\n return _remove(prefixedName)\r\n } catch (err) {\r\n message(`Error removing session item '${name}': ${err}`)\r\n }\r\n return false\r\n }\r\n },\r\n\r\n /**\r\n * Alias for remove.\r\n * @param name The key to delete.\r\n * @returns True if removed.\r\n */\r\n delete: {\r\n value: (name: string): boolean => {\r\n return session.remove(name)\r\n }\r\n },\r\n\r\n /**\r\n * Clears all sessionStorage items.\r\n */\r\n removeAll: {\r\n value: () => {\r\n if (_hasStorage) {\r\n // Only clear keys with our prefix\r\n const keysToRemove: string[] = []\r\n for (let i = 0; i < _sessionStorage.length; i++) {\r\n const key = _sessionStorage.key(i)\r\n if (key?.startsWith(_getPrefix())) {\r\n keysToRemove.push(key)\r\n }\r\n }\r\n keysToRemove.forEach(key => _sessionStorage.removeItem(key))\r\n } else {\r\n _getFallbackStorage().clear()\r\n }\r\n return true\r\n }\r\n },\r\n\r\n /**\r\n * Alias for removeAll.\r\n */\r\n clearAll: {\r\n value: () => {\r\n session.removeAll()\r\n return true\r\n }\r\n },\r\n\r\n quota: {\r\n value: async (): Promise<[number, number]> => {\r\n return [0, 0] as [number, number]\r\n }\r\n },\r\n\r\n /**\r\n * Calculates total size of all memorio session items in kilobytes.\r\n * Counts each prefixed key and its JSON-serialized value, summing their\r\n * byte lengths and converting to whole kilobytes (Math.ceil).\r\n * @returns Total size in kilobytes (0 when empty / no memorio items).\r\n */\r\n size: {\r\n value: () => {\r\n let totalBytes = 0\r\n if (_hasStorage) {\r\n for (let i = 0; i < _sessionStorage.length; i++) {\r\n const key = _sessionStorage.key(i)\r\n // Only count keys with our prefix\r\n if (key && key.startsWith(_getPrefix())) {\r\n const item = _sessionStorage.getItem(key)\r\n if (item) totalBytes += key.length + item.length\r\n }\r\n }\r\n } else {\r\n _getFallbackStorage().forEach((value: string, key: string) => {\r\n totalBytes += key.length + value.length\r\n })\r\n }\r\n return totalBytes === 0 ? 0 : Math.ceil(totalBytes / 1024)\r\n }\r\n },\r\n\r\n /**\r\n * Check if using real sessionStorage or fallback\r\n */\r\n isPersistent: {\r\n get: () => _hasStorage\r\n },\r\n\r\n /**\r\n * Get a list of all memorio session items.\r\n */\r\n list: {\r\n value: (): Record<string, any> => {\r\n const result: Record<string, any> = {}\r\n try {\r\n if (_hasStorage) {\r\n for (let i = 0; i < _sessionStorage.length; i++) {\r\n const key = _sessionStorage.key(i)\r\n if (key?.startsWith(_getPrefix())) {\r\n const cleanKey = key.replace(_getPrefix(), '')\r\n const item = _sessionStorage.getItem(key)\r\n if (item !== null) {\r\n try {\r\n result[cleanKey] = JSON.parse(item)\r\n } catch {\r\n result[cleanKey] = item\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n _getFallbackStorage().forEach((value: string, key: string) => {\r\n if (key.startsWith(_getPrefix())) {\r\n const cleanKey = key.replace(_getPrefix(), '')\r\n try {\r\n result[cleanKey] = JSON.parse(value)\r\n } catch {\r\n result[cleanKey] = value\r\n }\r\n }\r\n })\r\n }\r\n } catch (err) {\r\n message(`Error listing session items: ${err}`)\r\n }\r\n return result\r\n }\r\n }\r\n\r\n }\r\n )\r\n\r\n\r\n Object.freeze(session as _session);\r\n (globalThis as any)[SESSION_INSTANCE_KEY] = session\r\n}\r\n\r\nexport { session }\r\nexport default session\r\n","/**\r\n * Hybrid Logical Clock (HLC) for memorio.\r\n *\r\n * Combines a physical timestamp (Date.now), a logical counter, and a node\r\n * identifier to provide constant-size causal ordering across devices.\r\n * This is preferred over vector clocks (which grow with the number of writers)\r\n * because the sync journal must remain bounded in size.\r\n *\r\n * Format: `{ physical: number, logical: number, node: string }`\r\n * Serialized as a string for storage: `\"hlc:<physical>:<logical>:<node>\"`\r\n *\r\n * The algorithm follows the standard HLC construction:\r\n * 1. If the incoming timestamp is greater than the local physical clock,\r\n * advance the physical clock and reset logical to 0.\r\n * 2. If equal, increment the logical counter.\r\n * 3. If less, increment the logical counter.\r\n *\r\n * @module memorio/hlc\r\n */\r\n\r\nexport interface HLC {\r\n physical: number\r\n logical: number\r\n node: string\r\n}\r\n\r\nconst NODE_ID_KEY = '__memorio_hlc_node'\r\n\r\n/**\r\n * Returns the current node identifier for HLC generation.\r\n * The node ID is stable per origin/device and persisted in sessionStorage\r\n * (or an in-memory fallback when sessionStorage is unavailable).\r\n * For server-side usage, falls back to a process-based identifier.\r\n */\r\nfunction getNodeId(): string {\r\n if (typeof globalThis === 'undefined') return 'node'\r\n\r\n try {\r\n if (typeof sessionStorage !== 'undefined' && sessionStorage) {\r\n let id = sessionStorage.getItem(NODE_ID_KEY)\r\n if (!id) {\r\n id = generateNodeId()\r\n sessionStorage.setItem(NODE_ID_KEY, id)\r\n }\r\n return id\r\n }\r\n } catch {\r\n /* fall through to in-memory */\r\n }\r\n\r\n if (!(globalThis as any).__memorioHlcNodeId) {\r\n (globalThis as any).__memorioHlcNodeId = generateNodeId()\r\n }\r\n return (globalThis as any).__memorioHlcNodeId\r\n}\r\n\r\nfunction generateNodeId(): string {\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID().slice(0, 8)\r\n }\r\n return Math.random().toString(36).slice(2, 10)\r\n}\r\n\r\n/** Local HLC state - updated on every `hlcNow()` call.\r\n * Stored on globalThis as a singleton so all module instances share the same\r\n * clock (module duplication across ESM/CJS boundaries would otherwise create\r\n * independent clocks and produce duplicate/out-of-order timestamps). */\r\nconst HLC_KEY = '__memorio_hlc_local'\r\nconst local: HLC = (globalThis as any)[HLC_KEY] || {\r\n physical: 0,\r\n logical: 0,\r\n node: getNodeId()\r\n}\r\nif (!(globalThis as any)[HLC_KEY]) {\r\n (globalThis as any)[HLC_KEY] = local\r\n}\r\n\r\n/**\r\n * Produces the next HLC timestamp, advancing from the local state.\r\n * If `incoming` is provided (e.g. received from a remote device), the clock\r\n * is synchronized to the maximum physical time before ticking.\r\n */\r\nfunction tick(_incoming?: HLC): HLC {\r\n const now = Date.now()\r\n const base = local.physical\r\n let physical: number\r\n let logical: number\r\n\r\n if (now > base) {\r\n physical = now\r\n logical = 0\r\n } else if (now < base) {\r\n physical = base\r\n logical = local.logical + 1\r\n } else {\r\n physical = base\r\n logical = local.logical + 1\r\n }\r\n\r\n local.physical = physical\r\n local.logical = logical\r\n\r\n return { physical, logical, node: local.node }\r\n}\r\n\r\n/**\r\n * Updates the local wall-clock component from a received HLC without\r\n * necessarily ticking (used during sync before replaying remote entries).\r\n * Returns the possibly-updated local clock.\r\n */\r\nfunction receive(remote: HLC): HLC {\r\n const now = Date.now()\r\n\r\n if (remote.physical > local.physical) {\r\n local.physical = remote.physical > now ? remote.physical : now\r\n local.logical = 1\r\n } else if (remote.physical === local.physical) {\r\n local.logical = Math.max(local.logical, remote.logical) + 1\r\n }\r\n local.node = getNodeId()\r\n\r\n return { ...local }\r\n}\r\n\r\n/**\r\n * Compares two HLC timestamps.\r\n * Returns:\r\n * - `-1` if `a` happened before `b` (causally prior)\r\n * - ` 1` if `a` happened after `b` (causally subsequent)\r\n * - ` 0` if `a` and `b` are concurrent (cannot be ordered)\r\n */\r\nfunction compare(a: HLC, b: HLC): number {\r\n if (a.physical !== b.physical) {\r\n return a.physical < b.physical ? -1 : 1\r\n }\r\n if (a.logical !== b.logical) {\r\n return a.logical < b.logical ? -1 : 1\r\n }\r\n if (a.node !== b.node) {\r\n return a.node < b.node ? -1 : 1\r\n }\r\n return 0\r\n}\r\n\r\n/**\r\n * Determines whether `a` causally happened-before `b`.\r\n */\r\nfunction happenedBefore(a: HLC, b: HLC): boolean {\r\n return compare(a, b) < 0\r\n}\r\n\r\n/**\r\n * Serializes an HLC to a compact string for journal storage.\r\n */\r\nfunction serialize(hlc: HLC): string {\r\n return `hlc:${hlc.physical}:${hlc.logical}:${hlc.node}`\r\n}\r\n\r\n/**\r\n * Parses a serialized HLC string back into an HLC object.\r\n */\r\nfunction parse(serialized: string): HLC | null {\r\n if (!serialized.startsWith('hlc:')) return null\r\n const parts = serialized.split(':')\r\n if (parts.length !== 4) return null\r\n const physical = parseInt(parts[1], 10)\r\n const logical = parseInt(parts[2], 10)\r\n const node = parts[3]\r\n if (isNaN(physical) || isNaN(logical)) return null\r\n return { physical, logical, node }\r\n}\r\n\r\nexport const hlc = {\r\n tick,\r\n receive,\r\n compare,\r\n happenedBefore,\r\n serialize,\r\n parse,\r\n getNodeId\r\n}\r\n\r\nexport default hlc\r\n","/**\r\n * MEMORIO MEMORY JOURNAL (local sync layer)\r\n *\r\n * A local, namespaced operation journal that records every memory mutation\r\n * (`remember` / `update` / `forget` / `expire` / `confirm` / `supersede`) so it\r\n * can be reconciled with an optional cloud backend.\r\n *\r\n * Trust model (OWASP / NIST-aligned, client-side envelope):\r\n * - The journal is partitioned by a `namespace` (tenant/user/device) that the\r\n * application establishes via `configure({ namespace })`. A read or write\r\n * for one namespace never touches another - there is no API surface that can\r\n * enumerate or open a different namespace, so a compromised/fake account\r\n * cannot blindly dump the whole journal.\r\n * - Memorio never handles credentials. Authentication and authorization for a\r\n * namespace live in the application-owned `sync.provider` (REST, WebSocket,\r\n * Supabase, a custom agent server, ...). The provider is the only component\r\n * that talks to the cloud, and only for the locally-configured namespace.\r\n * - Locally, data is stored per-substrate and keyed by `namespace:id`, so\r\n * namespace boundaries are enforced at the storage layer, not just the API.\r\n *\r\n * Persistence: sql.js databases are *in-memory* (volatile, per page load), so\r\n * the journal is persisted on `store` (localStorage / in-memory Map fallback)\r\n * which survives reloads - this is what makes offline-first sync correct. The\r\n * `sqlite` engine is still used for ad-hoc SQL on `sqlite.db.*` databases; that\r\n * is the consumer's responsibility to export/import if they need it durable.\r\n *\r\n * No `eval`, no dynamic code generation. Entries are strictly JSON-round-tripped\r\n * and size-capped on write.\r\n */\r\n\r\nimport type {\r\n MemoryEntry,\r\n MemoryOperation,\r\n MemorySync,\r\n SyncConfig,\r\n SyncAck\r\n} from '../../types/memory'\r\nimport { hlc } from '../../core/hlc'\r\nimport { DEV } from '../../core/env'\r\nimport { store } from '../store'\r\n\r\nconst g = globalThis as any\r\n\r\nfunction namespace(): string {\r\n const cfg = g.memorioSyncConfig\r\n if (cfg && typeof cfg.namespace === 'string' && cfg.namespace) return `ns:${cfg.namespace}`\r\n // Defense-in-depth: even without an explicit namespace, isolate per memorio\r\n // context so contexts cannot read each other's journal entries.\r\n const ctx = g.memorio ? g.memorio._currentContext : undefined\r\n const ctxName = typeof ctx === 'string' && ctx ? ctx : ''\r\n return ctxName ? `ctx:${ctxName}` : 'default'\r\n}\r\n\r\nfunction isSyncEnabled(): boolean {\r\n return !!g.memorioSyncConfig\r\n}\r\n\r\nconst STORE_PREFIX = (ns: string) => `memorio:sync:${ns}:`\r\nconst INDEX_KEY = (ns: string) => `${STORE_PREFIX(ns)}index`\r\n\r\nfunction parseEntry(raw: string | MemoryEntry): MemoryEntry | null {\r\n try {\r\n if (typeof raw === 'string') return JSON.parse(raw) as MemoryEntry\r\n return raw as MemoryEntry\r\n } catch (err) {\r\n if (DEV) console.warn('[memorio memory] failed to parse journal entry:', err)\r\n return null\r\n }\n}\r\n\r\nconst journal: MemoryJournal = {\r\n /** Append (or replace) a journal row for the current namespace. */\r\n async append(entry: MemoryEntry, operation: MemoryOperation): Promise<MemoryEntry> {\r\n const ns = namespace()\r\n const row: MemoryEntry = {\r\n ...entry,\r\n operation,\r\n updatedAt: entry.updatedAt || Date.now(),\r\n version: entry.version || 1,\r\n sync: 'pending' as MemorySync,\r\n hlc: entry.hlc || hlc.serialize(hlc.tick())\r\n }\r\n const key = `${STORE_PREFIX(ns)}${row.id}`\r\n store.set(key, row)\r\n const idx: string[] = store.get(INDEX_KEY(ns)) || []\r\n if (!idx.includes(row.id)) idx.push(row.id)\r\n store.set(INDEX_KEY(ns), idx)\r\n return row\r\n },\r\n\r\n /** All pending (not-yet-synced) entries for the current namespace. */\r\n async pending(): Promise<MemoryEntry[]> {\r\n const ns = namespace()\r\n const out: MemoryEntry[] = []\r\n const idx: string[] = store.get(INDEX_KEY(ns)) || []\r\n for (const id of idx) {\r\n const raw = store.get(`${STORE_PREFIX(ns)}${id}`)\r\n if (!raw) continue\r\n const e = parseEntry(raw)\r\n if (e && e.sync !== 'synced') out.push(e)\r\n }\r\n out.sort((a, b) => {\r\n if (a.hlc && b.hlc) {\r\n const ha = hlc.parse(a.hlc)\r\n const hb = hlc.parse(b.hlc)\r\n if (ha && hb) return hlc.compare(ha, hb)\r\n }\r\n return (a.updatedAt || 0) - (b.updatedAt || 0)\r\n })\r\n return out\r\n },\r\n\r\n /**\r\n * Mark entries as synced. Returns the number of rows actually advanced to\r\n * `synced` (namespace-scoped).\r\n */\r\n async markSynced(ids: string[]): Promise<number> {\r\n if (!ids.length) return 0\r\n const ns = namespace()\r\n let count = 0\r\n const idx: string[] = store.get(INDEX_KEY(ns)) || []\r\n for (const id of idx) {\r\n if (!ids.includes(id)) continue\r\n const key = `${STORE_PREFIX(ns)}${id}`\r\n const raw = store.get(key)\r\n if (!raw) continue\r\n const e = parseEntry(raw)\r\n if (!e || e.sync === 'synced') continue\r\n e.sync = 'synced'\r\n store.set(key, e)\r\n count++\r\n }\r\n return count\r\n },\r\n\r\n async get(id: string): Promise<MemoryEntry | null> {\r\n const ns = namespace()\r\n const raw = store.get(`${STORE_PREFIX(ns)}${id}`)\r\n return parseEntry(raw ?? '')\r\n },\r\n\r\n /** Remove all journal rows for the current namespace. */\r\n async clear(): Promise<void> {\r\n const ns = namespace()\r\n const idx: string[] = store.get(INDEX_KEY(ns)) || []\r\n for (const id of idx) store.remove(`${STORE_PREFIX(ns)}${id}`)\r\n store.remove(INDEX_KEY(ns))\r\n },\r\n\r\n /**\r\n * Reconcile the local journal against the configured provider. Pushes pending\r\n * local operations, then optionally pulls newer remote operations and applies\r\n * them. No-op (empty ack) when no provider is configured.\r\n *\r\n * When pulling remote entries, HLC timestamps are used to order operations\r\n * causally. Concurrent writes to the same key (HLC tie) are resolved via the\r\n * provider's `resolveConflict` method (if provided), otherwise the REMOTE\r\n * entry wins by default (logged at warn level in dev). Provide a resolver on\r\n * the sync provider to override this behaviour and prevent silent local data\r\n * loss.\n */\r\n async replay(): Promise<SyncAck> {\r\n const ack: SyncAck = { synced: [], resolved: [] }\r\n if (!isSyncEnabled()) return ack\r\n const transport = (g.memorioSyncConfig || {}) as SyncConfig\r\n const provider = transport.provider\r\n if (!provider || typeof provider.push !== 'function') return ack\r\n\r\n const pending = await this.pending()\r\n if (pending.length) {\r\n try {\r\n const res = await provider.push(pending)\r\n ack.synced = res?.synced || []\r\n ack.conflicts = res?.conflicts\r\n ack.error = res?.error\r\n if (ack.synced.length) await this.markSynced(ack.synced)\r\n } catch (err) {\r\n ack.error = String(err)\r\n }\r\n }\r\n\r\n if (typeof provider.pull === 'function') {\r\n try {\r\n const since = pending.length\r\n ? Math.min(...pending.map(p => p.updatedAt || 0))\r\n : 0\r\n const remote = await provider.pull(since)\r\n\r\n for (const e of remote || []) {\r\n if (e.hlc) {\r\n const parsed = hlc.parse(e.hlc)\r\n if (parsed) hlc.receive(parsed)\r\n }\r\n\r\n const localEntry = await this.get(e.id)\r\n if (localEntry && e.hlc && localEntry.hlc) {\r\n const ha = hlc.parse(localEntry.hlc)\r\n const hb = hlc.parse(e.hlc)\r\n if (ha && hb) {\r\n const cmp = hlc.compare(ha, hb)\r\n if (cmp === 0) {\r\n const hasResolver = typeof provider.resolveConflict === 'function'\r\n const resolution = hasResolver\r\n ? await provider.resolveConflict(localEntry, e)\r\n : 'remote'\r\n if (!hasResolver && DEV) {\r\n console.warn(`[memorio memory] replay() conflict for \"${e.id}\": no resolveConflict handler provided, defaulting to remote-wins`)\r\n }\r\n ack.resolved?.push({ id: e.id, resolution })\r\n if (resolution === 'local') continue\r\n } else if (cmp > 0) {\r\n continue\r\n }\r\n }\r\n }\r\n\r\n await this.append(e, (e.operation as MemoryOperation) || 'confirm')\r\n await this.markSynced([e.id])\r\n }\r\n } catch (err) {\r\n if (DEV) console.warn('[memorio memory] sync pull failed:', err)\r\n }\n }\r\n return ack\r\n },\r\n\r\n status(): Promise<'store'> {\r\n // Journal is always persisted on `store` (localStorage / Map fallback).\r\n return Promise.resolve('store')\r\n }\r\n}\r\n\r\n/** Configure the sync layer (namespace + provider). Returns the journal. */\r\nexport function configure(opts: SyncConfig): any {\r\n const prev: SyncConfig = g.memorioSyncConfig || {}\r\n g.memorioSyncConfig = { ...prev, ...opts }\r\n return journal\r\n}\r\n\r\n/** Best-effort auto-replay when the tab regains focus / connectivity. */\r\nif (typeof g.addEventListener === 'function') {\r\n let armed = false\r\n g.addEventListener('focus', () => {\r\n if (armed || !isSyncEnabled()) return\r\n armed = true\r\n void journal.replay().finally(() => { armed = false })\r\n })\r\n}\r\n\r\nexport default journal\r\nexport interface MemoryJournal {\r\n append(entry: MemoryEntry, operation: MemoryOperation): Promise<MemoryEntry>\r\n pending(): Promise<MemoryEntry[]>\r\n markSynced(ids: string[]): Promise<number>\r\n get(id: string): Promise<MemoryEntry | null>\r\n clear(): Promise<void>\r\n replay(): Promise<SyncAck>\r\n status(): Promise<'store'>\r\n}\r\n","/**\n * MEMORIO REDUX ADAPTER - HYDRATION (Memorio -> Redux, one-shot)\n *\n * At application bootstrap, Memorio is the durable owner of mapped values\n * (#31). This recalls those memories and hands them back to the application\n * so it can re-dispatch restore actions into Redux. Hydration is NOT continuous\n * - Memorio never writes back into Redux state at runtime (#9/#6).\n *\n * Failure isolation (#17/#18): by default a failed recall is swallowed and the\n * corresponding key is simply absent from the result; Redux boots with its own\n * default/initial state.\n */\n\nimport { memory } from '../../functions/memory'\nimport type {\n MemorioMapping,\n MemorioReduxOptions\n} from './types'\nimport { normalizeMappings, selectValues } from './selectors'\n\nexport interface HydrateOptions<S>\n extends Pick<MemorioReduxOptions<S>, 'failSoft' | 'onError' | 'debug'> {\n /**\n * Invoked with recalled values so the application can dispatch its own\n * restore actions (actions are the integration boundary, #11). The\n * re-entrancy guard + cache seeding described below only apply when a\n * `bridge` is supplied.\n */\n onHydration?: (values: Record<string, unknown>) => void\n}\n\nexport interface HydrationResult {\n /** Recalled memory values keyed by memory key. */\n values: Record<string, unknown>\n /** False if any recall failed (and failSoft swallowed it). */\n ok: boolean\n}\n\nexport interface HydrateBridge<S> {\n /** Middleware change-detection cache to seed with recalled values. */\n cache: Record<string, unknown>\n /** Arms/disarms the Memorio->Redux re-entrancy guard (#10 loop prevention). */\n setHydrating: (v: boolean) => void\n /** Redux state accessor after restore actions are dispatched. */\n getState: () => S\n}\n\n/**\n * Recalls every mapped memory from Memorio and returns the values.\n *\n * When `bridge` is supplied the call:\n * 1. arms the loop guard (`setHydrating(true)`),\n * 2. recalls values,\n * 3. calls `opts.onHydration(values)` (app dispatches restore actions),\n * 4. seeds the middleware cache with the post-restore selected values so the\n * restore dispatch is seen as \"no change\" (no echo #10),\n * 5. disarms the guard.\n *\n * This keeps the whole Memorio->Redux->(middleware)->Memorio cycle from\n * persisting back.\n */\nexport async function hydrateMemorio<S>(\n mappings: Record<string, MemorioMapping<S> | ((state: S) => unknown)>,\n opts: HydrateOptions<S> = {},\n bridge?: HydrateBridge<S>\n): Promise<HydrationResult> {\n const canonical = normalizeMappings<S>(mappings)\n const values: Record<string, unknown> = {}\n let ok = true\n\n bridge?.setHydrating(true)\n try {\n for (const key of Object.keys(canonical)) {\n try {\n const recalled = await memory.recall(key)\n if (recalled !== null && recalled !== undefined) values[key] = recalled\n } catch (err) {\n ok = false\n if (opts.failSoft === false) throw err\n opts.onError?.(err, 'hydrate')\n if (opts.debug) {\n console.debug(`[memorio/redux] hydrate recall failed for \"${key}\"`, err)\n }\n }\n }\n\n if (opts.onHydration) {\n opts.onHydration(values)\n // Seed the middleware cache with the selected values *after* the app's\n // restore action has mutated Redux state, so the middleware observes no\n // delta and does not echo the value back into Memorio (#10).\n if (bridge) {\n const selected = selectValues(bridge.getState(), canonical)\n for (const key of Object.keys(selected)) {\n bridge.cache[key] = selected[key]\n }\n }\n }\n } finally {\n bridge?.setHydrating(false)\n }\n\n return { values, ok }\n}\n","/**\n * MEMORIO REDUX ADAPTER - INTEGRATED BRIDGE\n *\n * `createMemorioReduxBridge` is the recommended one-stop entry point: it\n * returns a Redux middleware plus a `hydrate` helper that share the SAME\n * change-detection cache and re-entrancy guard, so the\n * Memorio -> Redux (hydration) -> middleware (echo) cycle is provably inert.\n *\n * Usage:\n * const memorio = createMemorioReduxBridge<AppState>({ mappings })\n * const store = createStore(reducer, applyMiddleware(memorio.middleware))\n * await memorio.hydrate(store, {\n * onHydration: (values) => store.dispatch(restorePreferences(values))\n * })\n */\n\nimport { createMemorioMiddleware } from './middleware'\nimport { hydrateMemorio } from './hydration'\nimport type {\n MemorioMapping,\n MemorioReduxAction,\n MemorioReduxOptions,\n MemorioReduxStoreLike\n} from './types'\n\nexport interface MemorioReduxBridge<\n S = unknown,\n A extends MemorioReduxAction = MemorioReduxAction\n> {\n /** Redux middleware: install via `applyMiddleware(bridge.middleware)`. */\n readonly middleware: ReturnType<\n typeof createMemorioMiddleware<S, A>\n >['middleware']\n /** One-shot Memorio -> Redux hydration. */\n hydrate: (\n store: MemorioReduxStoreLike<S, A>,\n opts?: { onHydration?: (values: Record<string, unknown>) => void }\n ) => Promise<{ values: Record<string, unknown>; ok: boolean }>\n /** Flush any pending persist immediately (tests / explicit flush). */\n flush: () => Promise<void>\n /** Tear down: clear caches. The middleware auto-unregisters with Redux. */\n disconnect: () => void\n /** Shared change-detection cache (advanced: pre-seed before hydration). */\n readonly cache: Record<string, unknown>\n}\n\nexport function createMemorioReduxBridge<\n S = any,\n A extends MemorioReduxAction = MemorioReduxAction\n>(\n opts: MemorioReduxOptions<S> = {}\n): MemorioReduxBridge<S, A> {\n const handle = createMemorioMiddleware<S, A>(opts)\n let disconnected = false\n\n return {\n middleware: handle.middleware,\n cache: handle.cache,\n flush: handle.flush,\n disconnect: () => {\n if (disconnected) return\n disconnected = true\n handle.cache && Object.keys(handle.cache).forEach((k) => delete handle.cache[k])\n handle.setHydrating(false)\n },\n hydrate: async (store, hopts = {}) => {\n // `hydrateMemorio` arms the loop guard, recalls, lets the app re-dispatch\n // via `onHydration`, seeds the cache, then disarms - using the SAME shared\n // cache the middleware reads (#10).\n const res = await hydrateMemorio<S>(\n opts.mappings as Record<string, MemorioMapping<S> | ((s: S) => unknown)>,\n {\n failSoft: opts.failSoft,\n onError: opts.onError,\n debug: opts.debug,\n onHydration: hopts.onHydration\n },\n {\n cache: handle.cache,\n setHydrating: handle.setHydrating,\n getState: () => store.getState()\n }\n )\n return { values: res.values, ok: res.ok }\n }\n }\n}\n"]}
|