memorio 4.7.3 → 4.9.5
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/README.md +242 -331
- package/SUMMARY.md +3 -0
- package/index.cjs +87 -147
- package/index.d.ts +1 -0
- package/index.js +46 -100
- package/llms.txt +1 -1
- package/package.json +9 -3
- package/types/env.d.ts +9 -0
- package/types/exports.d.ts +52 -1
- package/types/memorio.d.ts +43 -10
- package/types/memory.d.ts +95 -0
- package/types/schema.d.ts +53 -53
- package/types/sqlite.d.ts +35 -0
- package/markdown/CACHE.md +0 -90
- package/markdown/CHANGELOG.md +0 -161
- package/markdown/DEVTOOLS.md +0 -122
- package/markdown/DISPATCH.md +0 -168
- package/markdown/HISTORY.md +0 -192
- package/markdown/IDB.md +0 -169
- package/markdown/IMPORT.md +0 -139
- package/markdown/INSPECT.md +0 -116
- package/markdown/LOGGER.md +0 -147
- package/markdown/MEMORY.md +0 -155
- package/markdown/OBSERVER.md +0 -200
- package/markdown/PLATFORM.md +0 -265
- package/markdown/SCHEMA.md +0 -169
- package/markdown/SECURITY.md +0 -323
- package/markdown/SESSION.md +0 -154
- package/markdown/STATE.md +0 -153
- package/markdown/STORE.md +0 -164
- package/markdown/TYPED.md +0 -158
- package/markdown/USEOBSERVER.md +0 -259
package/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import 'path';
|
|
2
2
|
import 'url';
|
|
3
3
|
|
|
4
|
-
var S=(e,t)=>()=>(e&&(t=e(e=0)),t);var a=S(()=>{});var m,Ct,Ke,ae,l,C=S(()=>{a();m={debug:false,tracking:false,trackedPaths:new Set,locked:false,lastAccessedPath:"",stateVersion:0,currentContext:null,mutations:[],undoStack:[],redoStack:[],maxHistory:100,historyEnabled:false},Ct={get debug(){return m.debug},set debug(e){m.debug=e;},get tracking(){return m.tracking},set tracking(e){m.tracking=e;},get trackedPaths(){return m.trackedPaths},clearTrackedPaths(){m.trackedPaths.clear();},get locked(){return m.locked},set locked(e){m.locked=e;},get lastAccessedPath(){return m.lastAccessedPath},set lastAccessedPath(e){m.lastAccessedPath=e;},get stateVersion(){return m.stateVersion},bumpStateVersion(){return m.stateVersion=(m.stateVersion||0)+1,m.stateVersion},get currentContext(){return m.currentContext},set currentContext(e){m.currentContext=e;},get mutations(){return m.mutations},get undoStack(){return m.undoStack},get redoStack(){return m.redoStack},get maxHistory(){return m.maxHistory},set maxHistory(e){m.maxHistory=e;},get historyEnabled(){return m.historyEnabled},set historyEnabled(e){m.historyEnabled=e;},recordMutation(e){m.historyEnabled&&(m.mutations.push(e),m.mutations.length>m.maxHistory&&m.mutations.shift(),m.undoStack.push(e),m.undoStack.length>m.maxHistory&&m.undoStack.shift(),m.redoStack=[]);},popUndo(){let e=m.undoStack.pop();return e&&m.redoStack.push(e),e},popRedo(){let e=m.redoStack.pop();return e&&m.undoStack.push(e),e},canUndo(){return m.undoStack.length>0},canRedo(){return m.redoStack.length>0},clearHistory(){m.mutations=[],m.undoStack=[],m.redoStack=[];},clearRedo(){m.redoStack=[];}},Ke=["list","state","store","idb","observer","useObserver","remove","removeAll","_platform","_capabilities","_sessionId"],ae=(e,t)=>String(t!==void 0?t:e).replace("() => ",""),l=Ct;});var T,c,x=S(()=>{a();C();T=(...e)=>{l.debug===true&&console.debug(...e);},c=T;});function Q(){let e=globalThis;if(typeof e.crypto<"u"&&e.crypto.randomUUID)return e.crypto.randomUUID();if(typeof e.crypto<"u"&&e.crypto.getRandomValues){let t=new Uint8Array(16);return e.crypto.getRandomValues(t),Array.from(t,r=>r.toString(16).padStart(2,"0")).join("")}return `session_${Date.now()}_${Math.random().toString(36).substring(2,15)}`}function q(){let e=globalThis;return e.Deno&&e.Deno.version?"deno":typeof process<"u"&&process.versions&&process.versions.node?"node":typeof globalThis<"u"&&typeof globalThis.ServiceWorkerGlobalScope<"u"?"edge":typeof window<"u"&&typeof document<"u"?"browser":"unknown"}function le(){return q()==="browser"}function ce(){return q()==="node"}function ue(){return q()==="deno"}function me(){return q()==="edge"}function de(){try{if(typeof sessionStorage<"u"){let e="__memorio_test__";return sessionStorage.setItem(e,"1"),sessionStorage.removeItem(e),sessionStorage}}catch{}return null}function fe(){try{if(typeof localStorage<"u"){let e="__memorio_test__";return localStorage.setItem(e,"1"),localStorage.removeItem(e),localStorage}}catch{}return null}function pe(){return typeof indexedDB<"u"}function $t(){return typeof globalThis.dispatchEvent=="function"}function F(){let e=q(),t=typeof globalThis.isSecureContext<"u"?globalThis.isSecureContext:e==="browser";return {platform:e,hasSessionStorage:de()!==null,hasLocalStorage:fe()!==null,hasIndexedDB:pe(),hasDispatchEvent:$t(),hasNavigator:typeof navigator<"u",hasProcess:typeof process<"u",isSecureContext:t,sessionId:Q()}}function Ze(){let e=F(),t=globalThis;e.hasDispatchEvent||(t.dispatchEvent=function(r){return true},typeof CustomEvent>"u"&&(t.CustomEvent=class{type;detail;constructor(s,o={}){this.type=s,this.detail=o;}})),typeof t.addEventListener!="function"&&(t.addEventListener=function(r,s){U.has(r)||U.set(r,[]),U.get(r).push(s);},t.removeEventListener=function(r,s){let o=U.get(r);if(o){let n=o.indexOf(s);n>-1&&o.splice(n,1);}},t.dispatchEvent=function(r){let s=U.get(r.type);return s&&s.forEach(o=>{try{o(r);}catch(n){console.error("Event listener error:",n);}}),true});}function W(e){let t=e||`context_${Q()}`;he(t);let r={state:{},store:new Map,session:new Map,cache:new Map};return ge.set(t,r),{id:t,state:r.state,store:{get:s=>{let o=r.store.get(s);return o?JSON.parse(o):null},set:(s,o)=>{r.store.set(s,JSON.stringify(o));},remove:s=>r.store.delete(s),removeAll:()=>r.store.clear(),clearAll:()=>r.store.clear(),size:()=>r.store.size,isPersistent:false},session:{get:s=>{let o=r.session.get(s);return o?JSON.parse(o):null},set:(s,o)=>{r.session.set(s,JSON.stringify(o));},remove:s=>r.session.delete(s),removeAll:()=>r.session.clear(),clearAll:()=>r.session.clear(),size:()=>r.session.size,isPersistent:false},cache:{get:s=>r.cache.get(s),set:(s,o)=>r.cache.set(s,o),remove:s=>r.cache.delete(s),removeAll:()=>r.cache.clear(),clear:()=>r.cache.clear()}}}function ye(){return Array.from(ge.keys())}function be(e){return ge.delete(e)}function he(e){l.currentContext=e;}var U,ge,K=S(()=>{a();C();U=new Map;ge=new Map;});var Nt={};var et=S(()=>{a();E();x();u.db.create=(e,t=1)=>new Promise((r,s)=>{if(!u.db.support())return s(new Error("IndexedDB not supported"));let o=globalThis.indexedDB.open(e,t);o.onerror=()=>{c(`IndexedDB error: ${o.error?.message}`),s(o.error);},o.onsuccess=()=>{c(`Database ${e} connected successfully`),r(o.result);},o.onupgradeneeded=()=>{c(`Database ${e} upgrade/creation initiated`);};});});var Vt={};var tt=S(()=>{a();E();u.db.list=async()=>{if(!("indexedDB"in globalThis)||!indexedDB.databases)return [];try{let e=await indexedDB.databases();return globalThis.idbases=e||[],await u.db.size(),globalThis.idbases}catch(e){return console.error("Error listing databases:",e),[]}};});var Bt={};var rt=S(()=>{a();E();u.db.exist=e=>idbases?.some(t=>t.name===e);});var Lt={};var ot=S(()=>{a();E();u.db.quota=()=>navigator.storage.estimate();});var Ht={};var st=S(()=>{a();E();x();u.db.delete=e=>new Promise((t,r)=>{c(`Removing database ${e}...`),(()=>{let o=indexedDB.deleteDatabase(e);o.onsuccess=()=>{c(`${e} database removed successfully`),u.db.list(),t();},o.onerror=()=>{console.error(`Error removing ${e}:`,o.error),r(o.error);},o.onblocked=()=>{console.warn(`Deletion of ${e} is blocked. Please close other tabs.`);};})();});});var Jt={};var nt=S(()=>{a();E();x();u.db.size=async()=>{if(!(!idbases||idbases.length===0))for(let e=0;e<idbases.length;e++){let t=idbases[e];try{let r=await u.db.create(t.name,t.version),s=Array.from(r.objectStoreNames),o=0;for(let n of s){let i=await u.table.size(r,n);o+=i;}t.size=o,r.close();}catch(r){c(`Could not calculate size for ${t.name}:${r}`);}}};});var zt={};var it=S(()=>{a();E();u.db.version=e=>{let t=0;for(let r of idbases){r.name===e&&(t=r.version);break}return t};});var Kt={};var at=S(()=>{a();E();x();u.db.support=()=>{let e="indexedDB"in globalThis;return e||c("Your environment doesn't support IndexedDB"),e};});var Ut={};var lt=S(()=>{a();E();x();u.table.create=(e,t)=>new Promise((r,s)=>{try{let n=(Number(u.db.version(e))||0)+1,i=indexedDB.open(e,n);i.onupgradeneeded=d=>{let f=d.target.result;if(!f.objectStoreNames.contains(t)){let y=f.createObjectStore(t,{keyPath:"id",autoIncrement:!0});y.createIndex("id","id",{unique:!0}),y.createIndex("data","data",{unique:!1}),c(`Table ${t} created in ${e}`);}},i.onsuccess=()=>{i.result.close(),u.db.list(),r();},i.onerror=()=>{console.error(`Error creating table ${t}:`,i.error),s(i.error);};}catch(o){console.error("Critical error in table.create:",o),s(o);}});});var qt={};var ct=S(()=>{a();E();x();u.table.size=(e,t)=>new Promise((r,s)=>{if(!e)return s(new Error("Database instance is required"));if(!e.objectStoreNames.contains(t))return r(0);let o=0,n=0,f=e.transaction([t],"readonly").objectStore(t).openCursor();f.onsuccess=async y=>{let b=y.target.result;if(b){try{let k=b.value;o+=JSON.stringify(k).length;}catch(k){c(`Error stringifying IDB value tracking size:${k}`);}n++,n%200===0&&await new Promise(k=>setTimeout(k,0)),b.continue();}else r(o);},f.onerror=()=>{s(f.error);};});});var Ft={};var ut=S(()=>{a();E();x();u.data.delete=(e,t,r)=>new Promise((s,o)=>{let n=indexedDB.open(e);n.onsuccess=()=>{let i=n.result;if(!i.objectStoreNames.contains(t))return i.close(),o(new Error(`Table ${t} not found`));let y=i.transaction(t,"readwrite").objectStore(t).delete(r);y.onsuccess=()=>{i.close(),c(`Record ${r} deleted from ${t}`),s();},y.onerror=()=>{i.close(),o(y.error);};},n.onerror=()=>o(n.error);});u.data.delete.all=(e,t)=>new Promise((r,s)=>{let o=indexedDB.open(e);o.onsuccess=n=>{let i=n.target.result;if(!i.objectStoreNames.contains(t))return i.close(),s(new Error(`Table ${t} not found`));let y=i.transaction(t,"readwrite").objectStore(t).clear();y.onsuccess=()=>{i.close(),c(`All data cleared from ${t}`),r();},y.onerror=()=>{i.close(),s(y.error);};},o.onerror=()=>s(o.error);});});var Wt={};var mt=S(()=>{a();E();x();u.data.set=(e,t,r)=>new Promise((s,o)=>{let n=indexedDB.open(e);n.onsuccess=()=>{let i=n.result;if(!i.objectStoreNames.contains(t))return i.close(),o(new Error(`Table ${t} does not exist in ${e}`));let y=i.transaction(t,"readwrite").objectStore(t).put(r);y.onsuccess=()=>{i.close(),c(`Data saved in ${e}.${t}`),s(y.result);},y.onerror=b=>{i.close(),c(`Database insert error: ${y.error?.message}`),o(y.error);};},n.onerror=()=>{o(n.error);};});});var Gt={};var dt=S(()=>{a();E();u.data.get=(e,t,r)=>new Promise((s,o)=>{let n=indexedDB.open(e);n.onsuccess=i=>{let d=i.target.result;if(!d.objectStoreNames.contains(t))return d.close(),o(new Error(`Table ${t} not found in ${e}`));let b=d.transaction(t,"readonly").objectStore(t).get(r);b.onsuccess=()=>{d.close(),s(b.result);},b.onerror=()=>{d.close(),o(b.error);};},n.onerror=()=>{o(n.error);};});});var Yt,u,E=S(()=>{a();K();Yt=pe(),u={db:{},table:{},data:{}};Yt?(async()=>(Object.defineProperty(u,"db",{value:{},writable:true,configurable:true}),Object.defineProperty(u,"table",{value:{},writable:true,configurable:true}),Object.defineProperty(u,"data",{value:{},writable:true,configurable:true}),Object.defineProperty(globalThis,"idbases",{value:[],writable:true,configurable:true,enumerable:false}),await Promise.all([Promise.resolve().then(()=>(et(),Nt)),Promise.resolve().then(()=>(tt(),Vt)),Promise.resolve().then(()=>(rt(),Bt)),Promise.resolve().then(()=>(ot(),Lt)),Promise.resolve().then(()=>(st(),Ht)),Promise.resolve().then(()=>(nt(),Jt)),Promise.resolve().then(()=>(it(),zt)),Promise.resolve().then(()=>(at(),Kt)),Promise.resolve().then(()=>(lt(),Ut)),Promise.resolve().then(()=>(ct(),qt)),Promise.resolve().then(()=>(ut(),Ft)),Promise.resolve().then(()=>(mt(),Wt)),Promise.resolve().then(()=>(dt(),Gt))]),Object.preventExtensions(u),Object.seal(u),Object.freeze(u)))():(u._disabled=true,u._warning="IndexedDB is not available in this environment (Node.js/Deno). Use store or session for persistence.",console.warn("Memorio IDB: IndexedDB is not available in this environment. Use store or session for data persistence."));});a();a();C();x();a();var v={set:(e,t={})=>{globalThis.dispatchEvent(new CustomEvent(String(e),t));},listen:(e,t=null,r)=>{if(globalThis.events?.[e])return;let s=t?o=>{let n=o;return globalThis.queueMicrotask?globalThis.queueMicrotask(()=>t(n)):Promise.resolve().then(()=>t(n))}:void 0;s&&globalThis.addEventListener(e,s),s&&(globalThis.events[e]=s);},remove:e=>{let t=globalThis.events?.[e];t&&(globalThis.removeEventListener(e,t),delete globalThis.events[e]);}};a();x();var z=new Map,Ue=(e,t,r)=>{let s=[];if(t.type&&t.type!=="any"){let o=Array.isArray(e)?"array":typeof e;if(o!==t.type)return s.push(`${r}: expected ${t.type}, got ${o}`),{valid:false,errors:s}}if(t.enum&&!t.enum.includes(e)&&s.push(`${r}: value must be one of [${t.enum.map(String).join(", ")}]`),t.validator){let o=t.validator(e);o!==true&&s.push(`${r}: ${typeof o=="string"?o:"validation failed"}`);}if(typeof e=="number"&&(t.min!==void 0&&e<t.min&&s.push(`${r}: value ${e} is less than minimum ${t.min}`),t.max!==void 0&&e>t.max&&s.push(`${r}: value ${e} exceeds maximum ${t.max}`)),typeof e=="string"&&(t.min!==void 0&&e.length<t.min&&s.push(`${r}: string length ${e.length} is less than minimum ${t.min}`),t.max!==void 0&&e.length>t.max&&s.push(`${r}: string length ${e.length} exceeds maximum ${t.max}`),t.pattern&&!t.pattern.test(e)&&s.push(`${r}: string does not match required pattern`)),t.type==="object"&&e&&typeof e=="object"&&!Array.isArray(e)){if(t.required)for(let o of t.required)o in e||s.push(`${r}: missing required property '${o}'`);if(t.properties){for(let[o,n]of Object.entries(t.properties))if(o in e&&e[o]!==void 0){let i=Ue(e[o],n,`${r}.${o}`);i.valid||s.push(...i.errors||[]);}}}return s.length===0?{valid:true}:{valid:false,errors:s}},qe=(e,t)=>{let r=z.get(e);return r?Ue(t,r,e):{valid:true}},Fe=(e,t)=>{typeof t=="function"?z.set(e,{validator:t}):z.set(e,t),c(`[memorio schema] Registered schema for '${e}'`);},We=e=>z.delete(e),Ge=()=>Array.from(z.keys()),_t=e=>z.get(e),M={register:Fe,validate:qe,unregister:We,list:Ge,get:_t};var X=Symbol("memorio.target"),Ye=new WeakMap,A=(e,t=null)=>{if(e===null||typeof e!="object")return e;if(e[X]!==void 0)return A(e[X],t);if(t){if(t.has(e))return e;t.add(e);}let r=e.constructor?.name;if(r!=="Object"&&r!=="Array")return e;let s=Array.isArray(e)?[]:{};for(let o of Reflect.ownKeys(e))s[o]=A(e[o],t);return s},Xe=(e,t,r=".")=>t.concat(e).join(r),Qe=(e,t,r=[])=>{let s=o=>{try{v.set(o,{detail:{name:o}});}catch{}};return new Proxy(e,{get(o,n){if(n==="__path")return r.length>0?"state."+r.join("."):"state";if(n===X||o[X]!==void 0)return o;if(n==="list")return c('Some state could be hidden when you use "state.list". Use "state" to see the complete list '),JSON.parse(JSON.stringify(o));if(typeof n=="string"){let i=r.length>0?"state."+r.concat(n).join("."):"state."+n;l.lastAccessedPath=i,l.tracking&&l.trackedPaths.add(i);}if(n==="_lastPath")return l.lastAccessedPath;if(n==="remove")return i=>(delete o[i],true);if(n==="removeAll")return ()=>{try{for(let i in o)typeof o[i]!="function"&&!["list","remove","removeAll","lock","unlock"].includes(i)&&delete o[i];}catch(i){console.error(i);}};if(Object.isFrozen(o[n]))return o[n];if(n==="lock"||n==="unlock"){let i=Reflect.get(o,n);if(i)return i}try{let i=Reflect.get(o,n);if(i&&typeof i=="object"&&["Array","Object"].includes(i.constructor.name)){let d=Ye.get(i);return d||(d=Qe(i,t,r.concat(n)),Ye.set(i,d)),d}return i}catch(i){console.error("Error: ",i);return}},set(o,n,i){if(l.locked)return console.error("Error: state is locked. Use state.unlock() to enable modifications."),false;if(Ke.includes(n))return console.error("key "+n+" is protected"),false;if(o[n]&&typeof o[n]=="object"&&Object.isFrozen(o[n]))return console.error(`Error: state '${n}' is locked`),false;if(o[n]&&typeof o[n]=="object"&&o[n].__locked)return console.error(`Error: state '${n}' is locked. Use state.${n}.unlock() to enable modifications.`),false;try{let d=Xe(n,r),f=A(i),y=M.validate(d,f);if(!y.valid)return l.debug&&console.error(`[memorio schema] Validation failed for '${d}':`,y.errors),c(`[memorio schema] Validation failed for '${d}': `+(y.errors?.join(", ")||"unknown error")),!1;if(t({action:"set",path:d,target:o,newValue:f,previousValue:Reflect.get(o,n)}),s("state."+d),Reflect.set(o,n,f),l.bumpStateVersion(),o[n]&&typeof o[n]=="object"){let b=o[n];if(b&&typeof b=="object")try{Object.defineProperty(b,"__locked",{writable:!0,enumerable:!1,configurable:!1,value:!1}),Object.defineProperty(b,"lock",{writable:!1,enumerable:!1,configurable:!1,value:()=>{Object.defineProperty(b,"__locked",{writable:!0,enumerable:!1,configurable:!1,value:!0}),c(`State '${n}' is now locked.`);}}),Object.defineProperty(b,"unlock",{writable:!1,enumerable:!1,configurable:!1,value:()=>{Object.defineProperty(b,"__locked",{writable:!0,enumerable:!1,configurable:!1,value:!1}),c(`State '${n}' is now unlocked.`);}});}catch{}}return !0}catch(d){return console.error("Error in set trap:",d),false}},deleteProperty(o,n){try{let i=Xe(n,r),d=Reflect.get(o,n);return t({action:"delete",path:i,target:o,previousValue:d}),Reflect.deleteProperty(o,n)}catch(i){return console.error("Error in deleteProperty trap:",i),false}},ownKeys(o){return Reflect.ownKeys(o)},getOwnPropertyDescriptor(o,n){return Reflect.getOwnPropertyDescriptor(o,n)}})},h=Qe({},e=>{l.historyEnabled&&l.recordMutation({path:e.path,action:e.action,newValue:e.newValue,previousValue:e.previousValue,timestamp:Date.now()});});h.lock=()=>{l.locked=true,c("State is now locked. All modifications are blocked.");};h.unlock=()=>{l.locked=false,c("State is now unlocked. Modifications are allowed.");};a();K();C();x();var P=fe(),ve=new Map;function V(){let t=l.currentContext||""||"default";return ve.has(t)||ve.set(t,new Map),ve.get(t)}var N=P!==null;function I(){let e=l.currentContext||"";return e?`${e}-`:"memorio_store_"}function xe(e){return !e||typeof e!="string"?(console.warn("[memorio store] key is empty or not a string - operation aborted"),""):e.length>512?(console.warn(`[memorio store] key "${e}" exceeds 512 chars - operation aborted`),""):I()+e}function Dt(e){let t=N?P.getItem(e):V().get(e);return t&&JSON.parse(t)}function Rt(e,t){let r=JSON.stringify(t);N?P.setItem(e,r):V().set(e,r);}function At(e){if(N){if(P.getItem(e))return P.removeItem(e),true}else if(V().has(e))return V().delete(e),true;return false}var w=new Proxy({},{});Object.defineProperty(globalThis,"store",{value:w,enumerable:false,configurable:true});Object.defineProperties(w,{get:{value:e=>{if(!e)return console.warn("[memorio store] store.get() called with empty or null key - returning null"),null;try{return Dt(xe(e))}catch(t){T(`Error parsing store item '${e}': ${t}`);}return null}},getMultiple:{value:e=>{let t={};for(let r of e)try{let s=w.get(r);s&&(t[r]=s);}catch(s){console.debug(`[memorio store] getMultiple error for key "${r}":`,s);}return t}},set:{value:(e,t)=>{if(!e)return console.warn("[memorio store] store.set() called with empty or null key - write aborted"),false;let r=xe(e);if(!r)return false;if(typeof t=="function")return console.warn("[memorio store] functions are not storable - write aborted for key: "+e),T("Storing functions is not secure and is blocked for safety."),false;try{Rt(r,t);}catch(s){return T(`Error setting store item '${e}': ${s}`),false}return true}},remove:{value:e=>{if(!e)return console.debug("[memorio store] store.remove() called with empty or null key - returning false"),false;let t=xe(e);if(!t)return false;try{return At(t)}catch(r){T(`Error removing store item '${e}': ${r}`);}return false}},delete:{value:e=>w.remove(e)},removeAll:{value:()=>{if(N){let e=[];for(let t=0;t<P.length;t++){let r=P.key(t);r?.startsWith(I())&&e.push(r);}e.forEach(t=>P.removeItem(t));}else V().clear();return true}},clearAll:{value:()=>(w.removeAll(),true)},quota:{value:async()=>[0,0]},size:{value:()=>{let e=0;return N?Object.keys(P).forEach(t=>{if(t.startsWith(I())){let r=P.getItem(t);r&&(e+=r.length);}}):V().forEach(t=>{e+=t.length;}),e}},isPersistent:{get:()=>N},list:{value:()=>{let e={};try{if(N)for(let t=0;t<P.length;t++){let r=P.key(t);if(r?.startsWith(I())){let s=r.replace(I(),""),o=P.getItem(r);if(o!==null)try{e[s]=JSON.parse(o);}catch{e[s]=o;}}}else V().forEach((t,r)=>{if(r.startsWith(I())){let s=r.replace(I(),"");try{e[s]=JSON.parse(t);}catch{e[s]=t;}}});}catch(t){T(`Error listing store items: ${t}`);}return e}}});Object.freeze(w);a();K();C();x();var O=de(),Se=new Map;function H(){let t=l.currentContext||""||"default";return Se.has(t)||Se.set(t,new Map),Se.get(t)}var L=O!==null;function B(){let e=l.currentContext||"";return e?`${e}-`:"memorio_session_"}function we(e){return !e||typeof e!="string"?(console.warn("[memorio session] key is empty or not a string - operation aborted"),""):e.length>512?(console.warn(`[memorio session] key "${e}" exceeds 512 chars - operation aborted`),""):B()+e}function Mt(e){let t=L?O.getItem(e):H().get(e);return t&&JSON.parse(t)}function jt(e,t){let r=JSON.stringify(t);L?O.setItem(e,r):H().set(e,r);}function It(e){if(L){if(O.getItem(e))return O.removeItem(e),true}else if(H().has(e))return H().delete(e),true;return false}var _=new Proxy({},{});Object.defineProperty(globalThis,"session",{value:_,enumerable:false,configurable:true});Object.defineProperties(_,{get:{value:e=>{if(!e)return console.warn("[memorio session] session.get() called with empty or null key - returning null"),null;try{return Mt(we(e))}catch(t){T(`Error parsing session item '${e}':${t}`);}return null}},set:{value:(e,t)=>{if(!e)return console.warn("[memorio session] session.set() called with empty or null key - write aborted"),false;let r=we(e);if(!r)return false;if(typeof t=="function")return console.warn("[memorio session] functions are not storable - write aborted for key: "+e),T("It's not secure to session functions."),false;try{jt(r,t);}catch(s){return T(`Error setting session item '${e}': ${s}`),false}return true}},remove:{value:e=>{if(!e)return console.warn("[memorio session] session.remove() called with empty or null key - returning false"),false;let t=we(e);if(!t)return false;try{return It(t)}catch(r){T(`Error removing session item '${e}': ${r}`);}return false}},delete:{value:e=>_.remove(e)},removeAll:{value:()=>{if(L){let e=[];for(let t=0;t<O.length;t++){let r=O.key(t);r?.startsWith(B())&&e.push(r);}e.forEach(t=>O.removeItem(t));}else H().clear();return true}},clearAll:{value:()=>(_.removeAll(),true)},quota:{value:async()=>[0,0]},size:{value:()=>{let e=0;return L?Object.keys(O).forEach(t=>{if(t.startsWith(B())){let r=O.getItem(t);r&&(e+=r.length);}}):H().forEach(t=>{e+=t.length;}),e}},isPersistent:{get:()=>L},list:{value:()=>{let e={};try{if(L)for(let t=0;t<O.length;t++){let r=O.key(t);if(r?.startsWith(B())){let s=r.replace(B(),""),o=O.getItem(r);if(o!==null)try{e[s]=JSON.parse(o);}catch{e[s]=o;}}}else H().forEach((t,r)=>{if(r.startsWith(B())){let s=r.replace(B(),"");try{e[s]=JSON.parse(t);}catch{e[s]=t;}}});}catch(t){T(`Error listing session items: ${t}`);}return e}}});Object.freeze(_);a();var D={},Z=new Proxy({},{get(e,t){let r=t;return r==="get"?s=>D[s]:r==="set"?(s,o)=>{D[s]=o;}:r==="remove"?s=>(delete D[s],true):r==="removeAll"?()=>(Object.keys(D).forEach(s=>delete D[s]),true):r==="clear"?()=>(Object.keys(D).forEach(s=>delete D[s]),true):r==="list"?()=>({...D}):D[r]},set(e,t,r){return D[t]=r,true},deleteProperty(e,t){return delete D[t],true}});Object.freeze(Z);E();a();x();var ft=false,Xt=(e,t=null,r=true)=>{ft||(console.warn('DEPRECATED: "observer" is deprecated and will be removed in future versions. Please use "useObserver" instead.'),ft=true);let s=n=>typeof n=="string"?n:n&&typeof n=="object"&&n.__path?n.__path:null,o=s(e);if(!e&&!t){console.error("Observer Error: You need to setup observer correctly, Some parameters are missed!");return}if(!e&&t){console.error("Observer Error: You need to declare what state need to be monitored as string like 'state.test'.");return}if(o){let n=o.split(".");if(n[0]!=="state"&&n[0]!=="store"){console.error(`Observer Error: You need to declare 'state.' or 'store.'. The '${o}' string is incorrect!`);return}}if(e&&!t){let n=s(e);if(!n)return;globalThis.observer?.list?.[n]&&v.remove(n),c(`called: ${n}`);return}if(e&&t){let n=s(e);if(!n)return;if(typeof e!="string"&&!(e&&typeof e=="object")){console.error("Observer Error: name of state need to be a 'string' like 'state.test' or a direct state value");return}let i=Array.isArray(t)?t:[t];globalThis.observer?.list?.[n]&&v.remove(n),i.forEach(f=>{typeof f=="function"&&v.listen(n,f,r);});return}},ee=Xt;Object.defineProperties(ee,{list:{get:()=>globalThis.events},remove:{value:e=>{e&&(v.remove(e),delete globalThis.events[e]);}},removeAll:{get:()=>{let e=globalThis.observer,t=e?.list;return t&&Object.keys(t).forEach(r=>{e?.remove?.(r);}),true}},has:{value:e=>!!globalThis.observer?.list?.[e]}});a();x();C();globalThis.useObserver||(globalThis.useObserver=null);Object.defineProperty(globalThis,"useObserver",{value:null,writable:true,enumerable:false,configurable:true});var te=((e,t=[])=>{if(!t||typeof e!="function")return ()=>{};let r=[],s=Array.isArray(t)&&!t.__path?t:[t];try{return s.forEach(o=>{let n="";if(typeof o=="function"){let i=ae(o);i&&(n=i);}else typeof o=="object"&&o!==null&&(n=o.__path||(typeof o.toString=="function"&&o.toString()!=="[object Object]"?o.toString():""));if(n){n=n.replace(/^(\(\)\s*=>\s*)/,"").replace(/^globalThis\./,"").replace(/^state\./,"");let i=n.startsWith("store.")||n.startsWith("state.")?n:"state."+n;v.listen(i,()=>e()),r.push(i);}else {l.clearTrackedPaths(),l.tracking=!0;try{e();}catch{}l.tracking=!1,l.trackedPaths.forEach(i=>{r.includes(i)||(c(`useObserver: [Auto-Discovery] -> "${i}"`),v.listen(i,()=>e()),r.push(i));});}}),r.length>0?c(`useObserver: Monitoring ${r.length} paths.`):console.warn("useObserver: No paths resolved for monitoring. Check your dependencies!"),()=>{r.forEach(o=>{typeof v.remove=="function"&&(v.remove(o),c(`useObserver: Stopped monitoring "${o}"`));});}}catch(o){return c(`useObserver Error: ${o}`),()=>{}}});globalThis.useObserver=te;Object.freeze(globalThis.useObserver);x();a();C();function Qt(){return l.debug===true}function pt(){if(!globalThis.store)return {};let e={},t=globalThis.store;if(typeof t.list=="function")try{return t.list()}catch{}if(typeof t.get=="function"){for(let r of Object.keys(t))if(!["get","set","remove","delete","removeAll","clearAll","size","isPersistent","list"].includes(r))try{let s=t.get(r);s!=null&&(e[r]=s);}catch{}}return e}function gt(){if(!globalThis.session)return {};let e={},t=globalThis.session;if(typeof t.list=="function")try{return t.list()}catch{}if(typeof t.get=="function"){for(let r of Object.keys(t))if(!["get","set","remove","delete","removeAll","clearAll","size","isPersistent","list"].includes(r))try{let s=t.get(r);s!=null&&(e[r]=s);}catch{}}return e}var Zt=()=>{if(Qt()){if(globalThis.state){let e=globalThis.state.list,t;typeof e=="function"?t=e():typeof e=="object"&&e!==null?t=e:t=globalThis.state,console.table(t);}if(globalThis.store&&console.table(pt()),globalThis.session&&console.table(gt()),globalThis.cache){let e=globalThis.cache.list,t;typeof e=="function"?t=e():typeof e=="object"&&e!==null?t=e:t=globalThis.cache,console.table(t);}}},er=()=>{let e=t=>{if(!t)return 0;if(typeof t.list=="function")try{let r=t.list();return Object.keys(r).length}catch{}return Object.keys(t).length};return {stateKeys:e(globalThis.state),storeKeys:e(globalThis.store),sessionKeys:e(globalThis.session),cacheKeys:e(globalThis.cache),idbDatabases:0,lastUpdate:new Date().toISOString()}},G=e=>{globalThis[e]&&typeof globalThis[e].clear=="function"?globalThis[e].clear():console.error(`Module ${e} not found or does not support clear()`);},tr=()=>{G("state"),G("store"),G("session"),G("cache");},rr=()=>{let e=()=>{if(globalThis.state)try{return typeof globalThis.state.list=="function"?globalThis.state.list():globalThis.state}catch{return}},t=()=>pt(),r=()=>gt(),s=()=>{if(globalThis.cache)try{return typeof globalThis.cache.list=="function"?globalThis.cache.list():globalThis.cache}catch{return}},o={state:e(),store:t(),session:r(),cache:s(),exportedAt:new Date().toISOString()};return JSON.stringify(o,null,2)},or=e=>{try{let t=JSON.parse(e);t.state&&Object.entries(t.state).forEach(([r,s])=>{globalThis.state&&r!=="list"&&r!=="remove"&&r!=="removeAll"&&(globalThis.state[r]=s);}),t.store&&globalThis.store&&typeof globalThis.store.set=="function"&&Object.entries(t.store).forEach(([r,s])=>{globalThis.store.set(r,s);}),t.session&&globalThis.session&&typeof globalThis.session.set=="function"&&Object.entries(t.session).forEach(([r,s])=>{globalThis.session.set(r,s);}),t.cache&&globalThis.cache&&Object.entries(t.cache).forEach(([r,s])=>{globalThis.cache&&r!=="get"&&r!=="set"&&r!=="remove"&&r!=="clear"&&(globalThis.cache[r]=s);});}catch(t){console.error("%c\u2717 Import failed:","color: #F44336",t);}},sr=(e,t)=>{if(!globalThis[e]){console.error(`Module ${e} not found`);return}let r=globalThis[e],s=r[t];if(console.debug(`\u{1F441} Watching ${e}.${t} (initial: ${JSON.stringify(s)})`),e==="state"&&globalThis.memorio?.dispatch){let o=n=>{n.detail?.name?.includes(t)&&console.debug(`\u{1F441} Change: ${e}.${t} =`,n.detail.value);};r.addEventListener?.("memorio-change",o);}},nr=()=>{console.debug(`
|
|
5
|
-
|
|
4
|
+
var x=(e,t)=>()=>(e&&(t=e(e=0)),t);var a=x(()=>{});var P,qe,N=x(()=>{a();P=!(typeof process<"u"),qe=!P;});var je,g,Hr,Dt,Re,d,R=x(()=>{a();je="__memorio_internal_state",g=globalThis[je]||{debug:false,tracking:false,trackedPaths:new Set,locked:false,lastAccessedPath:"",stateVersion:0,currentContext:null,mutations:[],undoStack:[],redoStack:[],maxHistory:100,historyEnabled:false};globalThis[je]||(globalThis[je]=g);Hr={get debug(){return g.debug},set debug(e){g.debug=e;},get tracking(){return g.tracking},set tracking(e){g.tracking=e;},get trackedPaths(){return g.trackedPaths},clearTrackedPaths(){g.trackedPaths.clear();},get locked(){return g.locked},set locked(e){g.locked=e;},get lastAccessedPath(){return g.lastAccessedPath},set lastAccessedPath(e){g.lastAccessedPath=e;},get stateVersion(){return g.stateVersion},bumpStateVersion(){return g.stateVersion=(g.stateVersion||0)+1,g.stateVersion},get currentContext(){return g.currentContext},set currentContext(e){g.currentContext=e;},get mutations(){return g.mutations},get undoStack(){return g.undoStack},get redoStack(){return g.redoStack},get maxHistory(){return g.maxHistory},set maxHistory(e){g.maxHistory=e;},get historyEnabled(){return g.historyEnabled},set historyEnabled(e){g.historyEnabled=e;},recordMutation(e){g.historyEnabled&&(g.mutations.push(e),g.mutations.length>g.maxHistory&&g.mutations.shift(),g.undoStack.push(e),g.undoStack.length>g.maxHistory&&g.undoStack.shift(),g.redoStack=[]);},popUndo(){let e=g.undoStack.pop();return e&&g.redoStack.push(e),e},popRedo(){let e=g.redoStack.pop();return e&&g.undoStack.push(e),e},canUndo(){return g.undoStack.length>0},canRedo(){return g.redoStack.length>0},clearHistory(){g.mutations=[],g.undoStack=[],g.redoStack=[];},clearRedo(){g.redoStack=[];}},Dt=["list","state","store","idb","sqlite","observer","useObserver","remove","removeAll","_platform","_capabilities","_sessionId"],Re=(e,t)=>String(t!==void 0?t:e).replace("() => ",""),d=Hr;});var D,c,w=x(()=>{a();R();N();D=(...e)=>{P&&d.debug===true&&console.debug(...e);},c=D;});function xe(){let e=globalThis;if(typeof e.crypto<"u"&&e.crypto.randomUUID)return e.crypto.randomUUID();if(typeof e.crypto<"u"&&e.crypto.getRandomValues){let t=new Uint8Array(16);return e.crypto.getRandomValues(t),Array.from(t,r=>r.toString(16).padStart(2,"0")).join("")}return `session_${Date.now()}_${Math.random().toString(36).substring(2,15)}`}function de(){let e=globalThis;return e.Deno&&e.Deno.version?"deno":typeof process<"u"&&process.versions&&process.versions.node?"node":typeof globalThis<"u"&&typeof globalThis.ServiceWorkerGlobalScope<"u"?"edge":typeof window<"u"&&typeof document<"u"?"browser":"unknown"}function Ne(){return de()==="browser"}function Ve(){return de()==="node"}function He(){return de()==="deno"}function Je(){return de()==="edge"}function Be(){try{if(typeof sessionStorage<"u"){let e="__memorio_test__";return sessionStorage.setItem(e,"1"),sessionStorage.removeItem(e),sessionStorage}}catch{}return null}function Ue(){try{if(typeof localStorage<"u"){let e="__memorio_test__";return localStorage.setItem(e,"1"),localStorage.removeItem(e),localStorage}}catch{}return null}function ze(){return typeof indexedDB<"u"}function fe(){let e=globalThis;return typeof e.WebAssembly>"u"||typeof e.WebAssembly.instantiate!="function"?false:typeof e.window<"u"}function Br(){return typeof globalThis.dispatchEvent=="function"}function me(){let e=de(),t=typeof globalThis.isSecureContext<"u"?globalThis.isSecureContext:e==="browser";return {platform:e,hasSessionStorage:Be()!==null,hasLocalStorage:Ue()!==null,hasIndexedDB:ze(),hasSqlJs:fe(),hasDispatchEvent:Br(),hasNavigator:typeof navigator<"u",hasProcess:typeof process<"u",isSecureContext:t,sessionId:xe()}}function Lt(){let e=me(),t=globalThis;e.hasDispatchEvent||(t.dispatchEvent=function(r){return true},typeof CustomEvent>"u"&&(t.CustomEvent=class{type;detail;constructor(o,n={}){this.type=o,this.detail=n;}})),typeof t.addEventListener!="function"&&(t.addEventListener=function(r,o){ue.has(r)||ue.set(r,[]),ue.get(r).push(o);},t.removeEventListener=function(r,o){let n=ue.get(r);if(n){let s=n.indexOf(o);s>-1&&n.splice(s,1);}},t.dispatchEvent=function(r){let o=ue.get(r.type);return o&&o.forEach(n=>{try{n(r);}catch(s){console.error("Event listener error:",s);}}),true});}function pe(e){let t=e||`context_${xe()}`;Qe(t);let r={state:{},store:new Map,session:new Map,cache:new Map};return Se.set(t,r),{id:t,state:r.state,store:{get:o=>{let n=r.store.get(o);return n?JSON.parse(n):null},set:(o,n)=>{r.store.set(o,JSON.stringify(n));},remove:o=>r.store.delete(o),removeAll:()=>r.store.clear(),clearAll:()=>r.store.clear(),size:()=>r.store.size,isPersistent:false},session:{get:o=>{let n=r.session.get(o);return n?JSON.parse(n):null},set:(o,n)=>{r.session.set(o,JSON.stringify(n));},remove:o=>r.session.delete(o),removeAll:()=>r.session.clear(),clearAll:()=>r.session.clear(),size:()=>r.session.size,isPersistent:false},cache:{get:o=>r.cache.get(o),set:(o,n)=>r.cache.set(o,n),remove:o=>r.cache.delete(o),removeAll:()=>r.cache.clear(),clear:()=>r.cache.clear()}}}function Ke(){return Array.from(Se.keys())}function Fe(e){return Se.delete(e)}function Qe(e){d.currentContext=e;}var ue,Le,Se,F=x(()=>{a();R();ue=new Map;Le="__memorio_contexts__",Se=globalThis[Le]||new Map;globalThis[Le]||(globalThis[Le]=Se);});function Z(){let t=d.currentContext||""||"default";return We.has(t)||We.set(t,new Map),We.get(t)}function G(){let e=d.currentContext||"";return e?`${e}-`:"memorio_store_"}function Ye(e){return !e||typeof e!="string"?(console.warn("[memorio store] key is empty or not a string - operation aborted"),""):e.length>512?(console.warn(`[memorio store] key "${e}" exceeds 512 chars - operation aborted`),""):G()+e}function Ur(e){let t=X?M.getItem(e):Z().get(e);return t&&JSON.parse(t)}function zr(e,t){let r=JSON.stringify(t);X?M.setItem(e,r):Z().set(e,r);}function Kr(e){if(X){if(M.getItem(e))return M.removeItem(e),true}else if(Z().has(e))return Z().delete(e),true;return false}var M,We,X,Ge,v,se=x(()=>{a();F();R();w();M=Ue(),We=new Map;X=M!==null;Ge="__memorio_store_instance__";globalThis[Ge]?v=globalThis[Ge]:(v=new Proxy({},{}),Object.defineProperties(v,{get:{value:e=>{if(!e)return console.warn("[memorio store] store.get() called with empty or null key - returning null"),null;try{return Ur(Ye(e))}catch(t){D(`Error parsing store item '${e}': ${t}`);}return null}},getMultiple:{value:e=>{let t={};for(let r of e)try{let o=v.get(r);o&&(t[r]=o);}catch(o){console.debug(`[memorio store] getMultiple error for key "${r}":`,o);}return t}},set:{value:(e,t)=>{if(!e)return console.warn("[memorio store] store.set() called with empty or null key - write aborted"),false;let r=Ye(e);if(!r)return false;if(typeof t=="function")return console.warn("[memorio store] functions are not storable - write aborted for key: "+e),D("Storing functions is not secure and is blocked for safety."),false;try{zr(r,t);}catch(o){return D(`Error setting store item '${e}': ${o}`),false}return true}},remove:{value:e=>{if(!e)return console.debug("[memorio store] store.remove() called with empty or null key - returning false"),false;let t=Ye(e);if(!t)return false;try{return Kr(t)}catch(r){D(`Error removing store item '${e}': ${r}`);}return false}},delete:{value:e=>v.remove(e)},removeAll:{value:()=>{if(X){let e=[];for(let t=0;t<M.length;t++){let r=M.key(t);r?.startsWith(G())&&e.push(r);}e.forEach(t=>M.removeItem(t));}else Z().clear();return true}},clearAll:{value:()=>(v.removeAll(),true)},quota:{value:async()=>[0,0]},size:{value:()=>{let e=0;return X?Object.keys(M).forEach(t=>{if(t.startsWith(G())){let r=M.getItem(t);r&&(e+=r.length);}}):Z().forEach(t=>{e+=t.length;}),e}},isPersistent:{get:()=>X},list:{value:()=>{let e={};try{if(X)for(let t=0;t<M.length;t++){let r=M.key(t);if(r?.startsWith(G())){let o=r.replace(G(),""),n=M.getItem(r);if(n!==null)try{e[o]=JSON.parse(n);}catch{e[o]=n;}}}else Z().forEach((t,r)=>{if(r.startsWith(G())){let o=r.replace(G(),"");try{e[o]=JSON.parse(t);}catch{e[o]=t;}}});}catch(t){D(`Error listing store items: ${t}`);}return e}}}),Object.freeze(v),globalThis[Ge]=v);});var Yr={};var Nt=x(()=>{a();C();w();y.db.create=(e,t=1)=>new Promise((r,o)=>{if(!y.db.support())return o(new Error("IndexedDB not supported"));let n=globalThis.indexedDB.open(e,t);n.onerror=()=>{c(`IndexedDB error: ${n.error?.message}`),o(n.error);},n.onsuccess=()=>{c(`Database ${e} connected successfully`),r(n.result);},n.onupgradeneeded=()=>{c(`Database ${e} upgrade/creation initiated`);};});});var Gr={};var Vt=x(()=>{a();C();y.db.list=async()=>{if(!("indexedDB"in globalThis)||!indexedDB.databases)return [];try{let e=await indexedDB.databases();return globalThis.idbases=e||[],await y.db.size(),globalThis.idbases}catch(e){return console.error("Error listing databases:",e),[]}};});var Xr={};var Ht=x(()=>{a();C();y.db.exist=e=>idbases?.some(t=>t.name===e);});var Zr={};var Jt=x(()=>{a();C();y.db.quota=()=>navigator.storage.estimate();});var eo={};var Bt=x(()=>{a();C();w();y.db.delete=e=>new Promise((t,r)=>{c(`Removing database ${e}...`),(()=>{let n=indexedDB.deleteDatabase(e);n.onsuccess=()=>{c(`${e} database removed successfully`),y.db.list(),t();},n.onerror=()=>{console.error(`Error removing ${e}:`,n.error),r(n.error);},n.onblocked=()=>{console.warn(`Deletion of ${e} is blocked. Please close other tabs.`);};})();});});var to={};var Ut=x(()=>{a();C();w();y.db.size=async()=>{if(!(!idbases||idbases.length===0))for(let e=0;e<idbases.length;e++){let t=idbases[e];try{let r=await y.db.create(t.name,t.version),o=Array.from(r.objectStoreNames),n=0;for(let s of o){let i=await y.table.size(r,s);n+=i;}t.size=n,r.close();}catch(r){c(`Could not calculate size for ${t.name}:${r}`);}}};});var ro={};var zt=x(()=>{a();C();y.db.version=e=>{let t=0;for(let r of idbases){r.name===e&&(t=r.version);break}return t};});var oo={};var Kt=x(()=>{a();C();w();y.db.support=()=>{let e="indexedDB"in globalThis;return e||c("Your environment doesn't support IndexedDB"),e};});var no={};var Ft=x(()=>{a();C();w();y.table.create=(e,t)=>new Promise((r,o)=>{try{let s=(Number(y.db.version(e))||0)+1,i=indexedDB.open(e,s);i.onupgradeneeded=l=>{let f=l.target.result;if(!f.objectStoreNames.contains(t)){let b=f.createObjectStore(t,{keyPath:"id",autoIncrement:!0});b.createIndex("id","id",{unique:!0}),b.createIndex("data","data",{unique:!1}),c(`Table ${t} created in ${e}`);}},i.onsuccess=()=>{i.result.close(),y.db.list(),r();},i.onerror=()=>{console.error(`Error creating table ${t}:`,i.error),o(i.error);};}catch(n){console.error("Critical error in table.create:",n),o(n);}});});var so={};var Qt=x(()=>{a();C();w();y.table.size=(e,t)=>new Promise((r,o)=>{if(!e)return o(new Error("Database instance is required"));if(!e.objectStoreNames.contains(t))return r(0);let n=0,s=0,f=e.transaction([t],"readonly").objectStore(t).openCursor();f.onsuccess=async b=>{let h=b.target.result;if(h){try{let T=h.value;n+=JSON.stringify(T).length;}catch(T){c(`Error stringifying IDB value tracking size:${T}`);}s++,s%200===0&&await new Promise(T=>setTimeout(T,0)),h.continue();}else r(n);},f.onerror=()=>{o(f.error);};});});var io={};var Wt=x(()=>{a();C();w();y.data.delete=(e,t,r)=>new Promise((o,n)=>{let s=indexedDB.open(e);s.onsuccess=()=>{let i=s.result;if(!i.objectStoreNames.contains(t))return i.close(),n(new Error(`Table ${t} not found`));let b=i.transaction(t,"readwrite").objectStore(t).delete(r);b.onsuccess=()=>{i.close(),c(`Record ${r} deleted from ${t}`),o();},b.onerror=()=>{i.close(),n(b.error);};},s.onerror=()=>n(s.error);});y.data.delete.all=(e,t)=>new Promise((r,o)=>{let n=indexedDB.open(e);n.onsuccess=s=>{let i=s.target.result;if(!i.objectStoreNames.contains(t))return i.close(),o(new Error(`Table ${t} not found`));let b=i.transaction(t,"readwrite").objectStore(t).clear();b.onsuccess=()=>{i.close(),c(`All data cleared from ${t}`),r();},b.onerror=()=>{i.close(),o(b.error);};},n.onerror=()=>o(n.error);});});var ao={};var Yt=x(()=>{a();C();w();y.data.set=(e,t,r)=>new Promise((o,n)=>{let s=indexedDB.open(e);s.onsuccess=()=>{let i=s.result;if(!i.objectStoreNames.contains(t))return i.close(),n(new Error(`Table ${t} does not exist in ${e}`));let b=i.transaction(t,"readwrite").objectStore(t).put(r);b.onsuccess=()=>{i.close(),c(`Data saved in ${e}.${t}`),o(b.result);},b.onerror=h=>{i.close(),c(`Database insert error: ${b.error?.message}`),n(b.error);};},s.onerror=()=>{n(s.error);};});});var lo={};var Gt=x(()=>{a();C();y.data.get=(e,t,r)=>new Promise((o,n)=>{let s=indexedDB.open(e);s.onsuccess=i=>{let l=i.target.result;if(!l.objectStoreNames.contains(t))return l.close(),n(new Error(`Table ${t} not found in ${e}`));let h=l.transaction(t,"readonly").objectStore(t).get(r);h.onsuccess=()=>{l.close(),o(h.result);},h.onerror=()=>{l.close(),n(h.error);};},s.onerror=()=>{n(s.error);};});});var co,y,C=x(()=>{a();F();N();co=ze(),y={db:{},table:{},data:{}};co?(async()=>(Object.defineProperty(y,"db",{value:{},writable:true,configurable:true}),Object.defineProperty(y,"table",{value:{},writable:true,configurable:true}),Object.defineProperty(y,"data",{value:{},writable:true,configurable:true}),Object.defineProperty(globalThis,"idbases",{value:[],writable:true,configurable:true,enumerable:false}),await Promise.all([Promise.resolve().then(()=>(Nt(),Yr)),Promise.resolve().then(()=>(Vt(),Gr)),Promise.resolve().then(()=>(Ht(),Xr)),Promise.resolve().then(()=>(Jt(),Zr)),Promise.resolve().then(()=>(Bt(),eo)),Promise.resolve().then(()=>(Ut(),to)),Promise.resolve().then(()=>(zt(),ro)),Promise.resolve().then(()=>(Kt(),oo)),Promise.resolve().then(()=>(Ft(),no)),Promise.resolve().then(()=>(Qt(),so)),Promise.resolve().then(()=>(Wt(),io)),Promise.resolve().then(()=>(Yt(),ao)),Promise.resolve().then(()=>(Gt(),lo))]),Object.preventExtensions(y),Object.seal(y),Object.freeze(y)))():(y._disabled=true,y._warning="IndexedDB is not available in this environment (Node.js/Deno). Use store or session for persistence.",P&&console.warn("Memorio IDB: IndexedDB is not available in this environment. Use store or session for data persistence."));});var go={};function mo(){let e=globalThis;return typeof e.document<"u"&&typeof e.document.createElement=="function"}function po(e){let t=globalThis;return t.__memorioSqlJsScript===e?Promise.resolve():(tt||(tt=new Promise((r,o)=>{if(t.initSqlJs&&typeof t.initSqlJs=="function"){t.__memorioSqlJsScript=e,r();return}if(!mo()){o(new Error("memorio sqlite: no document available to load sql.js"));return}let n=t.document.createElement("script");n.src=e,n.async=true,n.onload=()=>{t.__memorioSqlJsScript=e,r();},n.onerror=()=>o(new Error(`memorio sqlite: failed to load sql.js from ${e}`)),t.document.head.appendChild(n);})),tt)}var _e,Ee,Xt,uo,fo,tt,yo,Zt=x(()=>{a();$();F();w();_e=null,Ee=null,Xt="https://cdn.jsdelivr.net/npm/sql.js/dist/sql-wasm-browser.js",uo=Xt.replace(/sql-wasm-browser\.js$/,""),fo=e=>(globalThis.sqliteWasmBase||uo)+e,tt=null;yo=async()=>{let e=globalThis;return typeof e.initSqlJs=="function"?e.initSqlJs:(await po(Xt),e.initSqlJs||e)};u.db.support=()=>fe();u.db.getSQL=async()=>{if(Ee)return Ee;if(_e)return _e;let e=globalThis,t=e.sqliteConfig||{},r=(async()=>{if(typeof t.loader=="function")return await t.loader();let o=await yo(),s=await(typeof o=="function"?o:o&&(o.default||o))({locateFile:t.locateFile||fo});return e.sqliteVersion=s?.version||"sql.js",c("Memorio SQLite: sql.js engine loaded"),s})();_e=r;try{return Ee=await r,Ee}catch(o){try{u._disabled=!0;}catch{}try{u._warning="Memorio SQLite: sql.js could not be loaded. Install sql.js (npm i sql.js) and pass a loader via sqlite.config({ loader: () => <your sql.js import>() }).";}catch{}throw console.warn("Memorio SQLite: failed to load sql.js",o),o}finally{_e=null;}};u.db.version=()=>globalThis.sqliteVersion||null;});function bo(){let e=V.sqliteConfig||{};return e.namespace?`ns:${e.namespace}`:"default"}function rt(e){return `memorio:sqlite:db:${bo()}:${e}`}function ho(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),r="",o=t.byteLength;for(let n=0;n<o;n++)r+=String.fromCharCode(t[n]);return typeof btoa=="function"?btoa(r):typeof Buffer<"u"?Buffer.from(t).toString("base64"):""}function vo(e){if(typeof Buffer<"u")return new Uint8Array(Buffer.from(e,"base64"));if(typeof atob!="function")throw new Error("memorio sqlite: no base64 decoder available");let t=atob(e),r=t.length,o=new Uint8Array(r);for(let n=0;n<r;n++)o[n]=t.charCodeAt(n);return o}function ke(e){return new Promise(t=>{let r=V.__sqliteDbs&&V.__sqliteDbs[e];if(!r||typeof r.export!="function"){t(false);return}try{let o=r.export();v.set(rt(e),ho(o)),c(`Memorio SQLite: persisted '${e}' to store`),t(!0);}catch(o){console.warn("Memorio SQLite: persist snapshot failed",o),t(false);}})}function ot(e){let t=v.get(rt(e));if(!t)return null;try{return vo(t)}catch{return null}}function xo(e){v.remove(rt(e));}function tr(e,t){if(!(!t||typeof t.updateHook!="function")){er[e]=true;try{t.updateHook(()=>{oe[e]&&clearTimeout(oe[e]),oe[e]=setTimeout(()=>{oe[e]=null,ke(e);},250);});}catch(r){console.warn("Memorio SQLite: could not attach updateHook",r);}}}var V,er,oe,rr=x(()=>{a();$();se();w();V=globalThis,er={},oe={};u.db.persist=async(e="memorio")=>ke(e);u.db.download=async(e="memorio",t=`${e}.sqlite`)=>{let r=globalThis;if(!(r.__sqliteDbs&&r.__sqliteDbs[e]))return console.warn(`Memorio SQLite: cannot download '${e}' - database not found. Create it with sqlite.db.create('${e}').`),false;let n;try{n=await u.db.export(e);}catch(f){return console.warn("Memorio SQLite: export failed during download",f),false}if(!n)return false;if(typeof r.document>"u"||typeof r.Blob>"u")return console.warn("Memorio SQLite: sqlite.db.download() requires a browser environment."),false;let s=r.URL||r.webkitURL;if(!s||typeof s.createObjectURL!="function")return false;let i=s.createObjectURL(new Blob([n],{type:"application/x-sqlite3"})),l=r.document.createElement("a");return l.style.display="none",l.href=i,l.download=t,r.document.body.appendChild(l),l.click(),setTimeout(()=>{try{s.revokeObjectURL(i);}catch{}l.remove();},1e3),true};u.db.close=async(e="memorio")=>{let t=V.__sqliteDbs&&V.__sqliteDbs[e];if(t&&typeof t.close=="function"){try{await ke(e);}catch{}try{t.close();}catch(r){console.warn("Memorio SQLite: close failed",r);}}if(V.__sqliteDbs&&delete V.__sqliteDbs[e],V.sqlbases){let r=V.sqlbases.findIndex(o=>o&&o.name===e);r>-1&&V.sqlbases.splice(r,1);}delete er[e],oe[e]&&(clearTimeout(oe[e]),oe[e]=null),xo(e);};u.db.loadSnapshot=ot;u.db.saveSnapshot=ke;});var So={};var or=x(()=>{a();$();w();rr();u.db.create=async(e="memorio",t={})=>{let r=await u.db.getSQL(),o=globalThis,n=!!(t&&t.persistence)||!!(o.sqliteConfig&&o.sqliteConfig.persistence),s;if(n&&!t.data){let h=ot(e);h&&(s=h);}let i=t&&t.data||s,l;i&&typeof i.byteLength=="number"?(l=new r.Database(i),c(`Memorio SQLite: database '${e}' opened (persistence=${n})`)):(l=new r.Database,c(`Memorio SQLite: database '${e}' created (persistence=${n})`));let f={...t,persistence:n};o.__sqliteDbs||(o.__sqliteDbs={}),o.__sqliteDbs[e]=l,o.sqlbases||(o.sqlbases=[]);let b=o.sqlbases.findIndex(h=>h&&h.name===e);return b>-1?o.sqlbases[b]={name:e,db:l,persistence:f.persistence}:o.sqlbases.push({name:e,db:l,persistence:f.persistence}),n&&tr(e,l),l};});var wo={};var nr=x(()=>{a();$();u.db.get=(e="memorio")=>{let t=globalThis.__sqliteDbs;if(!t||!t[e])throw new Error(`SQLite database '${e}' does not exist. Create it with sqlite.db.create('${e}').`);return t[e]};});var _o={};var sr=x(()=>{a();$();w();u.db.delete=e=>{let t=globalThis.__sqliteDbs;if(!t||!t[e])return false;try{t[e].close();}catch{}delete t[e];let r=globalThis;return r.sqlbases&&(r.sqlbases=r.sqlbases.filter(o=>o&&o.name!==e)),c(`Memorio SQLite: database '${e}' deleted`),true};});var Eo={};var ir=x(()=>{a();$();u.db.list=()=>{let e=globalThis.__sqliteDbs;return e?Object.keys(e):[]};});var ko={};var ar=x(()=>{a();$();u.db.size=async e=>{let t=globalThis.__sqliteDbs;if(!t)return 0;let r=n=>n&&(n.byteLength||n.length)||0;if(e){let n=u.db.get(e);return r(n.export())}let o=0;for(let n of Object.keys(t))try{o+=r(t[n].export());}catch{}return o};});var Po={};var lr=x(()=>{a();$();u.db.export=async(e="memorio")=>u.db.get(e).export();});var To={};var cr=x(()=>{a();$();u.db.import=async(e,t)=>u.db.create(e,{data:t});});var Co={};var ur=x(()=>{a();$();w();u.query.run=async(e="memorio",t,r=[])=>{let o=u.db.get(e);return c(`Memorio SQLite: run -> ${t}`),o.run(t,r),o.getRowsModified()};});var Do={};var dr=x(()=>{a();$();u.query.select=async(e="memorio",t,r=[])=>{let n=u.db.get(e).prepare(t,r),s=[];try{for(;n.step();)s.push(n.getAsObject());}finally{try{n.free();}catch{}}return s};});var $o={};var fr=x(()=>{a();$();u.data.set=async(e="memorio",t,r=[])=>u.query.run(e,t,r);});var Oo={};var mr=x(()=>{a();$();u.data.get=async(e="memorio",t,r=[])=>{let o=await u.query.select(e,t,r);return o.length?o[0]:null};});var Ao,u,$=x(()=>{a();F();N();Ao=fe(),u={db:{},query:{},data:{}};u.config=e=>{let t=globalThis;return t.sqliteConfig={...t.sqliteConfig,...e},e&&e.wasmUrl&&(t.sqliteWasmBase=e.wasmUrl.endsWith("/")?e.wasmUrl:e.wasmUrl+"/"),u};Object.defineProperty(u,"ready",{enumerable:false,configurable:false,get:()=>{let e=globalThis;return e.sqliteReady||(e.sqliteReady=typeof u.db.getSQL=="function"?u.db.getSQL().then(()=>{}).catch(()=>{}):Promise.resolve()),e.sqliteReady}});Ao?(async()=>(Object.defineProperty(u,"db",{value:{},writable:false,configurable:true,enumerable:true}),Object.defineProperty(u,"query",{value:{},writable:false,configurable:true,enumerable:true}),Object.defineProperty(u,"data",{value:{},writable:false,configurable:true,enumerable:true}),Object.defineProperty(globalThis,"sqlbases",{value:[],writable:true,configurable:true,enumerable:false}),await Promise.all([Promise.resolve().then(()=>(Zt(),go)),Promise.resolve().then(()=>(or(),So)),Promise.resolve().then(()=>(nr(),wo)),Promise.resolve().then(()=>(sr(),_o)),Promise.resolve().then(()=>(ir(),Eo)),Promise.resolve().then(()=>(ar(),ko)),Promise.resolve().then(()=>(lr(),Po)),Promise.resolve().then(()=>(cr(),To)),Promise.resolve().then(()=>(ur(),Co)),Promise.resolve().then(()=>(dr(),Do)),Promise.resolve().then(()=>(fr(),$o)),Promise.resolve().then(()=>(mr(),Oo))])))():(u._disabled=true,u._warning='SQLite (sql.js) is not available in this environment. It requires a browser with WebAssembly support. Install the optional "sql.js" package to enable it.',P&&(globalThis.sqliteDisabled=true,globalThis.sqliteWarning=u._warning,console.warn("Memorio SQLite: sql.js is not available in this environment (requires browser + WebAssembly). Use store or session for persistence.")));});a();N();a();R();w();a();var _={set:(e,t={})=>{globalThis.dispatchEvent(new CustomEvent(String(e),t));},listen:(e,t=null,r)=>{if(globalThis.events?.[e])return;let o=t?n=>{let s=n;return globalThis.queueMicrotask?globalThis.queueMicrotask(()=>t(s)):Promise.resolve().then(()=>t(s))}:void 0;o&&globalThis.addEventListener(e,o),o&&(globalThis.events[e]=o);},remove:e=>{let t=globalThis.events?.[e];t&&(globalThis.removeEventListener(e,t),delete globalThis.events[e]);}};a();w();var ne=new Map,$t=(e,t,r)=>{let o=[];if(t.type&&t.type!=="any"){let n=Array.isArray(e)?"array":typeof e;if(n!==t.type)return o.push(`${r}: expected ${t.type}, got ${n}`),{valid:false,errors:o}}if(t.enum&&!t.enum.includes(e)&&o.push(`${r}: value must be one of [${t.enum.map(String).join(", ")}]`),t.validator){let n=t.validator(e);n!==true&&o.push(`${r}: ${typeof n=="string"?n:"validation failed"}`);}if(typeof e=="number"&&(t.min!==void 0&&e<t.min&&o.push(`${r}: value ${e} is less than minimum ${t.min}`),t.max!==void 0&&e>t.max&&o.push(`${r}: value ${e} exceeds maximum ${t.max}`)),typeof e=="string"&&(t.min!==void 0&&e.length<t.min&&o.push(`${r}: string length ${e.length} is less than minimum ${t.min}`),t.max!==void 0&&e.length>t.max&&o.push(`${r}: string length ${e.length} exceeds maximum ${t.max}`),t.pattern&&!t.pattern.test(e)&&o.push(`${r}: string does not match required pattern`)),t.type==="object"&&e&&typeof e=="object"&&!Array.isArray(e)){if(t.required)for(let n of t.required)n in e||o.push(`${r}: missing required property '${n}'`);if(t.properties){for(let[n,s]of Object.entries(t.properties))if(n in e&&e[n]!==void 0){let i=$t(e[n],s,`${r}.${n}`);i.valid||o.push(...i.errors||[]);}}}return o.length===0?{valid:true}:{valid:false,errors:o}},Ot=(e,t)=>{let r=ne.get(e);return r?$t(t,r,e):{valid:true}},At=(e,t)=>{typeof t=="function"?ne.set(e,{validator:t}):ne.set(e,t),c(`[memorio schema] Registered schema for '${e}'`);},Mt=e=>ne.delete(e),qt=()=>Array.from(ne.keys()),Jr=e=>ne.get(e),K={register:At,validate:Ot,unregister:Mt,list:qt,get:Jr};N();var ve=Symbol("memorio.target"),jt=new WeakMap,J=(e,t=null)=>{if(e===null||typeof e!="object")return e;if(e[ve]!==void 0)return J(e[ve],t);if(t){if(t.has(e))return e;t.add(e);}let r=e.constructor?.name;if(r!=="Object"&&r!=="Array")return e;let o=Array.isArray(e)?[]:{};for(let n of Reflect.ownKeys(e))o[n]=J(e[n],t);return o},Rt=(e,t,r=".")=>t.concat(e).join(r),It=(e,t,r=[])=>{let o=n=>{try{_.set(n,{detail:{name:n}});}catch{}};return new Proxy(e,{get(n,s){if(s==="__path")return r.length>0?"state."+r.join("."):"state";if(s===ve||n[ve]!==void 0)return n;if(s==="list")return c('Some state could be hidden when you use "state.list". Use "state" to see the complete list '),JSON.parse(JSON.stringify(n));if(typeof s=="string"){let i=r.length>0?"state."+r.concat(s).join("."):"state."+s;d.lastAccessedPath=i,d.tracking&&d.trackedPaths.add(i);}if(s==="_lastPath")return d.lastAccessedPath;if(s==="remove")return i=>(delete n[i],true);if(s==="removeAll")return ()=>{try{for(let i in n)typeof n[i]!="function"&&!["list","remove","removeAll","lock","unlock"].includes(i)&&delete n[i];}catch(i){console.error(i);}};if(Object.isFrozen(n[s]))return n[s];if(s==="lock"||s==="unlock"){let i=Reflect.get(n,s);if(i)return i}try{let i=Reflect.get(n,s);if(i&&typeof i=="object"&&["Array","Object"].includes(i.constructor.name)){let l=jt.get(i);return l||(l=It(i,t,r.concat(s)),jt.set(i,l)),l}return i}catch(i){console.error("Error: ",i);return}},set(n,s,i){if(d.locked)return console.error("Error: state is locked. Use state.unlock() to enable modifications."),false;if(Dt.includes(s))return console.error("key "+s+" is protected"),false;if(n[s]&&typeof n[s]=="object"&&Object.isFrozen(n[s]))return console.error(`Error: state '${s}' is locked`),false;if(n[s]&&typeof n[s]=="object"&&n[s].__locked)return console.error(`Error: state '${s}' is locked. Use state.${s}.unlock() to enable modifications.`),false;try{let l=Rt(s,r),f=J(i),b=K.validate(l,f);if(!b.valid)return P&&d.debug&&console.error(`[memorio schema] Validation failed for '${l}':`,b.errors),c(`[memorio schema] Validation failed for '${l}': `+(b.errors?.join(", ")||"unknown error")),!1;if(t({action:"set",path:l,target:n,newValue:f,previousValue:Reflect.get(n,s)}),o("state."+l),Reflect.set(n,s,f),d.bumpStateVersion(),n[s]&&typeof n[s]=="object"){let h=n[s];if(h&&typeof h=="object")try{Object.defineProperty(h,"__locked",{writable:!0,enumerable:!1,configurable:!1,value:!1}),Object.defineProperty(h,"lock",{writable:!1,enumerable:!1,configurable:!1,value:()=>{Object.defineProperty(h,"__locked",{writable:!0,enumerable:!1,configurable:!1,value:!0}),c(`State '${s}' is now locked.`);}}),Object.defineProperty(h,"unlock",{writable:!1,enumerable:!1,configurable:!1,value:()=>{Object.defineProperty(h,"__locked",{writable:!0,enumerable:!1,configurable:!1,value:!1}),c(`State '${s}' is now unlocked.`);}});}catch{}}return !0}catch(l){return console.error("Error in set trap:",l),false}},deleteProperty(n,s){try{let i=Rt(s,r),l=Reflect.get(n,s);return t({action:"delete",path:i,target:n,previousValue:l}),Reflect.deleteProperty(n,s)}catch(i){return console.error("Error in deleteProperty trap:",i),false}},ownKeys(n){return Reflect.ownKeys(n)},getOwnPropertyDescriptor(n,s){return Reflect.getOwnPropertyDescriptor(n,s)}})},Ie="__memorio_state_instance__",S;globalThis[Ie]?S=globalThis[Ie]:(S=It({},e=>{d.historyEnabled&&d.recordMutation({path:e.path,action:e.action,newValue:e.newValue,previousValue:e.previousValue,timestamp:Date.now()});}),S.lock=()=>{d.locked=true,c("State is now locked. All modifications are blocked.");},S.unlock=()=>{d.locked=false,c("State is now unlocked. Modifications are allowed.");},globalThis[Ie]=S);se();a();F();R();w();var q=Be(),Xe=new Map;function re(){let t=d.currentContext||""||"default";return Xe.has(t)||Xe.set(t,new Map),Xe.get(t)}var te=q!==null;function ee(){let e=d.currentContext||"";return e?`${e}-`:"memorio_session_"}function Ze(e){return !e||typeof e!="string"?(console.warn("[memorio session] key is empty or not a string - operation aborted"),""):e.length>512?(console.warn(`[memorio session] key "${e}" exceeds 512 chars - operation aborted`),""):ee()+e}function Fr(e){let t=te?q.getItem(e):re().get(e);return t&&JSON.parse(t)}function Qr(e,t){let r=JSON.stringify(t);te?q.setItem(e,r):re().set(e,r);}function Wr(e){if(te){if(q.getItem(e))return q.removeItem(e),true}else if(re().has(e))return re().delete(e),true;return false}var et="__memorio_session_instance__",A;globalThis[et]?A=globalThis[et]:(A=new Proxy({},{}),Object.defineProperties(A,{get:{value:e=>{if(!e)return console.warn("[memorio session] session.get() called with empty or null key - returning null"),null;try{return Fr(Ze(e))}catch(t){D(`Error parsing session item '${e}':${t}`);}return null}},set:{value:(e,t)=>{if(!e)return console.warn("[memorio session] session.set() called with empty or null key - write aborted"),false;let r=Ze(e);if(!r)return false;if(typeof t=="function")return console.warn("[memorio session] functions are not storable - write aborted for key: "+e),D("It's not secure to session functions."),false;try{Qr(r,t);}catch(o){return D(`Error setting session item '${e}': ${o}`),false}return true}},remove:{value:e=>{if(!e)return console.warn("[memorio session] session.remove() called with empty or null key - returning false"),false;let t=Ze(e);if(!t)return false;try{return Wr(t)}catch(r){D(`Error removing session item '${e}': ${r}`);}return false}},delete:{value:e=>A.remove(e)},removeAll:{value:()=>{if(te){let e=[];for(let t=0;t<q.length;t++){let r=q.key(t);r?.startsWith(ee())&&e.push(r);}e.forEach(t=>q.removeItem(t));}else re().clear();return true}},clearAll:{value:()=>(A.removeAll(),true)},quota:{value:async()=>[0,0]},size:{value:()=>{let e=0;return te?Object.keys(q).forEach(t=>{if(t.startsWith(ee())){let r=q.getItem(t);r&&(e+=r.length);}}):re().forEach(t=>{e+=t.length;}),e}},isPersistent:{get:()=>te},list:{value:()=>{let e={};try{if(te)for(let t=0;t<q.length;t++){let r=q.key(t);if(r?.startsWith(ee())){let o=r.replace(ee(),""),n=q.getItem(r);if(n!==null)try{e[o]=JSON.parse(n);}catch{e[o]=n;}}}else re().forEach((t,r)=>{if(r.startsWith(ee())){let o=r.replace(ee(),"");try{e[o]=JSON.parse(t);}catch{e[o]=t;}}});}catch(t){D(`Error listing session items: ${t}`);}return e}}}),Object.freeze(A),globalThis[et]=A);a();var we="__memorio_cache_instance__",L={},ie=globalThis[we]?globalThis[we]:new Proxy({},{get(e,t){let r=t;return r==="get"?o=>L[o]:r==="set"?(o,n)=>{L[o]=n;}:r==="remove"?o=>(delete L[o],true):r==="removeAll"?()=>(Object.keys(L).forEach(o=>delete L[o]),true):r==="clear"?()=>(Object.keys(L).forEach(o=>delete L[o]),true):r==="list"?()=>({...L}):L[r]},set(e,t,r){return L[t]=r,true},deleteProperty(e,t){return delete L[t],true}});globalThis[we]||(globalThis[we]=ie,Object.isFrozen(ie)||Object.freeze(ie));C();$();a();w();var Mo=(e,t=null,r=true)=>{let o=s=>typeof s=="string"?s:s&&typeof s=="object"&&s.__path?s.__path:null,n=o(e);if(!e&&!t){console.error("Observer Error: You need to setup observer correctly, Some parameters are missed!");return}if(!e&&t){console.error("Observer Error: You need to declare what state need to be monitored as string like 'state.test'.");return}if(n){let s=n.split(".");if(s[0]!=="state"&&s[0]!=="store"){console.error(`Observer Error: You need to declare 'state.' or 'store.'. The '${n}' string is incorrect!`);return}}if(e&&!t){let s=o(e);if(!s)return;globalThis.observer?.list?.[s]&&_.remove(s),c(`called: ${s}`);return}if(e&&t){let s=o(e);if(!s)return;if(typeof e!="string"&&!(e&&typeof e=="object")){console.error("Observer Error: name of state need to be a 'string' like 'state.test' or a direct state value");return}let i=Array.isArray(t)?t:[t];globalThis.observer?.list?.[s]&&_.remove(s),i.forEach(f=>{typeof f=="function"&&_.listen(s,f,r);});return}},Pe=Mo;Object.defineProperties(Pe,{list:{get:()=>globalThis.events},remove:{value:e=>{e&&(_.remove(e),delete globalThis.events[e]);}},removeAll:{get:()=>{let e=globalThis.observer,t=e?.list;return t&&Object.keys(t).forEach(r=>{e?.remove?.(r);}),true}},has:{value:e=>!!globalThis.observer?.list?.[e]}});a();w();R();N();var Te=((e,t=[])=>{if(!t||typeof e!="function")return ()=>{};let r=[],o=Array.isArray(t)&&!t.__path?t:[t];try{return o.forEach(n=>{let s="";if(typeof n=="function"){let i=Re(n);i&&(s=i);}else typeof n=="object"&&n!==null&&(s=n.__path||(typeof n.toString=="function"&&n.toString()!=="[object Object]"?n.toString():""));if(s){s=s.replace(/^(\(\)\s*=>\s*)/,"").replace(/^globalThis\./,"").replace(/^state\./,"");let i=s.startsWith("store.")||s.startsWith("state.")?s:"state."+s;_.listen(i,()=>e()),r.push(i);}else {d.clearTrackedPaths(),d.tracking=!0;try{e();}catch{}d.tracking=!1,d.trackedPaths.forEach(i=>{r.includes(i)||(c(`useObserver: [Auto-Discovery] -> "${i}"`),_.listen(i,()=>e()),r.push(i));});}}),r.length>0?c(`useObserver: Monitoring ${r.length} paths.`):console.warn("useObserver: No paths resolved for monitoring. Check your dependencies!"),()=>{r.forEach(n=>{typeof _.remove=="function"&&(_.remove(n),c(`useObserver: Stopped monitoring "${n}"`));});}}catch(n){return c(`useObserver Error: ${n}`),()=>{}}});P&&!("useObserver"in globalThis)&&(globalThis.useObserver||(globalThis.useObserver=null),Object.defineProperty(globalThis,"useObserver",{value:Te,writable:true,enumerable:false,configurable:true}),Object.freeze(globalThis.useObserver));w();a();R();w();N();var qo={enabled:true,logToConsole:true,modules:["state","store","session","cache","idb"],maxEntries:1e3};function jo(){return P&&d.debug===true}var H={...qo},Q=[],Ro=e=>{H={...H,...e};},Io=()=>{H.enabled=true;},Lo=()=>{H.enabled=false;},pr=e=>H.enabled&&H.modules.includes(e),No=(e,t,r,o,n)=>{if(!pr(e))return;let s={timestamp:new Date().toISOString(),module:e,action:t,path:r,value:o,previousValue:n};if(Q.push(s),Q.length>H.maxEntries&&Q.shift(),H.logToConsole&&jo()){let i=`[Memorio:${e.toUpperCase()}]`,l=Vo(e);c(`%c${i}%c ${t} ${r},
|
|
5
|
+
color: ${l}; font-weight: bold,
|
|
6
|
+
color: inherit`),o!==void 0&&c(` \u2192 value:${o}`),n!==void 0&&c(` \u2190 previous:${n}`);}H.customHandler&&H.customHandler(s);},Vo=e=>({state:"#4CAF50",store:"#2196F3",session:"#FF9800",cache:"#9C27B0",idb:"#F44336"})[e]||"#888888",Ho=()=>[...Q],Jo=()=>{Q.length=0;},Bo=()=>{let e={total:Q.length,state:0,store:0,session:0,cache:0,idb:0,set:0,get:0,delete:0,clear:0};for(let t of Q)if(t){let r=t.module,o=t.action;r&&typeof e[r]=="number"&&e[r]++,o&&typeof e[o]=="number"&&e[o]++;}return e},Uo=()=>JSON.stringify(Q,null,2),nt={configure:Ro,enable:Io,disable:Lo,isEnabled:pr,log:No,getHistory:Ho,clearHistory:Jo,getStats:Bo,exportLogs:Uo};a();R();N();var I=globalThis.__memorio_state_instance__,B=globalThis.__memorio_store_instance__,U=globalThis.__memorio_session_instance__,j=globalThis.__memorio_cache_instance__;function zo(){return P&&d.debug===true}function yr(){if(!B)return {};let e={},t=B;if(typeof t.list=="function")try{return t.list()}catch{}if(typeof t.get=="function"){for(let r of Object.keys(t))if(!["get","set","remove","delete","removeAll","clearAll","size","isPersistent","list"].includes(r))try{let o=t.get(r);o!=null&&(e[r]=o);}catch{}}return e}function gr(){if(!U)return {};let e={},t=U;if(typeof t.list=="function")try{return t.list()}catch{}if(typeof t.get=="function"){for(let r of Object.keys(t))if(!["get","set","remove","delete","removeAll","clearAll","size","isPersistent","list"].includes(r))try{let o=t.get(r);o!=null&&(e[r]=o);}catch{}}return e}var Ko=()=>{if(zo()){if(I){let e=I.list,t;typeof e=="function"?t=e():typeof e=="object"&&e!==null?t=e:t=I,console.table(t);}if(B&&console.table(yr()),U&&console.table(gr()),j){let e=j.list,t;typeof e=="function"?t=e():typeof e=="object"&&e!==null?t=e:t=j,console.table(t);}}},Fo=()=>{let e=t=>{if(!t)return 0;if(typeof t.list=="function")try{let r=t.list();return Object.keys(r).length}catch{}return Object.keys(t).length};return {stateKeys:e(I),storeKeys:e(B),sessionKeys:e(U),cacheKeys:e(j),idbDatabases:0,sqliteDbCount:0,lastUpdate:new Date().toISOString()}},ye=e=>{let r={state:I,store:B,session:U,cache:j}[e];r&&typeof r.clear=="function"?r.clear():r&&typeof r.removeAll=="function"?r.removeAll():console.debug(`Module ${e} not found or does not support clear()/removeAll()`);},Qo=()=>{ye("state"),ye("store"),ye("session"),ye("cache");},Wo=()=>{let e=()=>{if(I)try{return typeof I.list=="function"?I.list():I}catch{return}},t=()=>yr(),r=()=>gr(),o=()=>{if(j)try{return typeof j.list=="function"?j.list():j}catch{return}},n={state:e(),store:t(),session:r(),cache:o(),exportedAt:new Date().toISOString()};return JSON.stringify(n,null,2)},Yo=e=>{try{let t=JSON.parse(e);t.state&&Object.entries(t.state).forEach(([r,o])=>{I&&r!=="list"&&r!=="remove"&&r!=="removeAll"&&(I[r]=o);}),t.store&&B&&typeof B.set=="function"&&Object.entries(t.store).forEach(([r,o])=>{B.set(r,o);}),t.session&&U&&typeof U.set=="function"&&Object.entries(t.session).forEach(([r,o])=>{U.set(r,o);}),t.cache&&j&&Object.entries(t.cache).forEach(([r,o])=>{j&&r!=="get"&&r!=="set"&&r!=="remove"&&r!=="clear"&&(j[r]=o);});}catch(t){console.debug("Import failed:",t);}},Go=(e,t)=>{let o={state:I,store:B,session:U,cache:j}[e];if(!o){console.debug(`Module ${e} not found`);return}let n=o[t];if(console.debug(`Watching ${e}.${t} (initial: ${JSON.stringify(n)})`),e==="state"&&globalThis.memorio?.dispatch){let s=i=>{i.detail?.name?.includes(t)&&console.debug(`Change: ${e}.${t} =`,i.detail.value);};o.addEventListener?.("memorio-change",s);}},Xo=()=>{console.debug(`
|
|
7
|
+
Memorio DevTools Help
|
|
6
8
|
|
|
7
9
|
Available commands:
|
|
8
10
|
memorio.devtools.inspect() - Inspect all state modules
|
|
@@ -14,93 +16,42 @@ Available commands:
|
|
|
14
16
|
memorio.devtools.watch(module, path) - Watch a path for changes
|
|
15
17
|
memorio.devtools.help() - Show this help
|
|
16
18
|
|
|
17
|
-
Shortcuts:
|
|
18
|
-
state -
|
|
19
|
-
store -
|
|
20
|
-
session -
|
|
21
|
-
cache -
|
|
22
|
-
`);},Ee={inspect:Zt,stats:er,clear:G,clearAll:tr,exportData:rr,importData:or,watch:sr,help:nr};a();C();x();var ir={enabled:true,logToConsole:true,modules:["state","store","session","cache","idb"],maxEntries:1e3};function ar(){return l.debug===true}var R={...ir},j=[],lr=e=>{R={...R,...e};},cr=()=>{R.enabled=true;},ur=()=>{R.enabled=false;},yt=e=>R.enabled&&R.modules.includes(e),mr=(e,t,r,s,o)=>{if(!yt(e))return;let n={timestamp:new Date().toISOString(),module:e,action:t,path:r,value:s,previousValue:o};if(j.push(n),j.length>R.maxEntries&&j.shift(),R.logToConsole&&ar()){let i=`[Memorio:${e.toUpperCase()}]`,d=dr(e);c(`%c${i}%c ${t} ${r},
|
|
23
|
-
|
|
24
|
-
color: inherit`),s!==void 0&&c(` \u2192 value:${s}`),o!==void 0&&c(` \u2190 previous:${o}`);}R.customHandler&&R.customHandler(n);},dr=e=>({state:"#4CAF50",store:"#2196F3",session:"#FF9800",cache:"#9C27B0",idb:"#F44336"})[e]||"#888888",fr=()=>[...j],pr=()=>{j.length=0;},gr=()=>{let e={total:j.length,state:0,store:0,session:0,cache:0,idb:0,set:0,get:0,delete:0,clear:0};for(let t of j)if(t){let r=t.module,s=t.action;r&&typeof e[r]=="number"&&e[r]++,s&&typeof e[s]=="number"&&e[s]++;}return e},yr=()=>JSON.stringify(j,null,2),Te={configure:lr,enable:cr,disable:ur,isEnabled:yt,log:mr,getHistory:fr,clearHistory:pr,getStats:gr,exportLogs:yr};C();K();a();K();C();var re={version:"4.7.3"};E();x();a();function ke(){return h}a();C();x();function bt(e){if(e===null||typeof e!="object")return e;let t=e.constructor?.name;if(t!=="Object"&&t!=="Array")return e;try{return JSON.parse(JSON.stringify(e))}catch{return e}}var Oe=()=>bt(A(h)),Ce=e=>{let t=[],r=(s,o,n)=>{let i=s?Object.keys(s):[],d=o?Object.keys(o):[];for(let f of d){let y=n?`${n}.${f}`:f,b=s?s[f]:void 0,k=o[f];b!==k&&(typeof b!==typeof k||b===void 0?t.push({path:y,oldValue:b,newValue:k}):b&&typeof b=="object"?r(b,k,y):b!==k&&t.push({path:y,oldValue:b,newValue:k}));}for(let f of i)if(!(f in(o||{}))){let y=n?`${n}.${f}`:f;t.push({path:y,oldValue:s[f],newValue:void 0});}};return r(e,A(h),""),t},_e=(e=true)=>{l.historyEnabled=e,c(`[memorio history] Tracking ${e?"enabled":"disabled"}`);};var $e=()=>[...l.mutations],De=()=>l.canUndo(),Re=()=>l.canRedo(),Ae=()=>{if(!l.historyEnabled){c("[memorio history] History is not enabled");return}let e=l.popUndo();if(e)return hr(e),c(`[memorio history] Undid: ${e.action} ${e.path}`),e},Me=()=>{if(!l.historyEnabled){c("[memorio history] History is not enabled");return}let e=l.popRedo();if(e)return vr(e),c(`[memorio history] Redid: ${e.action} ${e.path}`),e};function hr(e){let t=l.historyEnabled;l.historyEnabled=false;try{e.action==="set"?e.previousValue===void 0?ht(e.path):Pe(e.path,e.previousValue):e.action==="delete"&&e.previousValue!==void 0&&Pe(e.path,e.previousValue);}finally{l.historyEnabled=t;}}function vr(e){let t=l.historyEnabled;l.historyEnabled=false;try{e.action==="set"?Pe(e.path,e.newValue):e.action==="delete"&&ht(e.path);}finally{l.historyEnabled=t;}}function Pe(e,t){let r=e.split("."),s=h;for(let o=0;o<r.length-1;o++){let n=r[o];s[n]===void 0&&(s[n]={}),s=s[n];}s[r[r.length-1]]=t;}function ht(e){let t=e.split(".");if(t.length===1){h.remove(t[0]);return}let r=h;for(let s=0;s<t.length-1;s++){let o=t[s];if(r[o]===void 0)return;r=r[o];}delete r[t[t.length-1]];}var je=e=>{h.removeAll();for(let t of Object.keys(e))h[t]=bt(e[t]);l.clearHistory(),c("[memorio history] State rolled back to snapshot");},Ie=()=>{l.clearHistory(),c("[memorio history] History cleared");},Ne=()=>{l.clearRedo();};a();var Ve=()=>{let e=A(h);return Object.keys(e).filter(t=>!["list","remove","removeAll","lock","unlock"].includes(t))},Be=e=>{if(!e||typeof e!="string")return false;let t=e.replace(/^state\./,"").split("."),r=h;for(let s of t){if(r==null)return false;r=r[s];}return r!==void 0},Le=e=>{let[t,r]=vt(e);return !t||r===void 0?"undefined":Array.isArray(r)?"array":typeof r},He=e=>{let[t,r]=vt(e);if(!(!t||r===void 0))return xr(r)},Je=()=>{let e=[],t=(r,s)=>{if(r===null||typeof r!="object"||Array.isArray(r))return;let o=Object.keys(r).filter(n=>!["list","remove","removeAll","lock","unlock"].includes(n));for(let n of o){let i=s?`${s}.${n}`:n,d=r[n],f=d!==void 0,y=f?Array.isArray(d)?"array":typeof d:"undefined";e.push({path:i,type:y,defined:f}),f&&typeof d=="object"&&!Array.isArray(d)&&d.constructor?.name==="Object"&&t(d,i);}};return t(A(h),""),e};function vt(e){if(!e||typeof e!="string")return [false,void 0];let t=e.replace(/^state\./,"").split("."),r=h;for(let s of t){if(r==null)return [false,void 0];r=r[s];}return [r!==void 0,r]}function xr(e){if(e===null||typeof e!="object")return e;let t=e.constructor?.name;if(t!=="Object"&&t!=="Array")return e;try{return JSON.parse(JSON.stringify(e))}catch{return e}}a();E();var se="__memorio_memory_index__",xt="__memorio_superseded__";function ze(e){return e.startsWith(xt)?e:`${xt}${e}`}function St(e){return e?Array.isArray(e)?e:[e]:[]}function Sr(e,t){if(t.scope)return t.scope;let r=JSON.stringify(e).length;return r>1e6?"durable":("local")}function $(){return Date.now()}function ne(e){return e.ttl===null||e.ttl===void 0?false:$()-e.createdAt>e.ttl}function wr(e,t){return e.status==="obsolete"||e.status==="superseded"||ne(e)?t.includeObsolete??false:!(t.type&&!(Array.isArray(t.type)?t.type:[t.type]).includes(e.type)||t.minConfidence!==void 0&&e.confidence<t.minConfidence)}function Er(e,t){return !(e.status!=="active"||ne(e)||t.tags&&!(Array.isArray(t.tags)?t.tags:[t.tags]).some(o=>e.tags.includes(o))||t.types&&!(Array.isArray(t.types)?t.types:[t.types]).includes(e.type)||t.minConfidence!==void 0&&e.confidence<t.minConfidence||t.scopes&&!t.scopes.includes(e.scope))}function Tr(e){let t=($()-e.createdAt)/36e5,r=Math.max(.1,1/(1+t*.5)),s=e.confidence,o=1+e.tags.length*.1,n={decision:1.5,context:1.3,preference:1.2,task:1,fact:.8},i={hot:1.5,session:1.2,local:1,durable:.8};return r*s*o*n[e.type]*i[e.scope]}function Et(e,t){if(!t||typeof t!="string")return;let r=t.replace(/^state\./,"").split("."),s=e;for(let o of r){if(s==null)return;s=s[o];}return s}function Tt(e,t,r){if(!t||typeof t!="string")return;let s=t.replace(/^state\./,"").split("."),o=e;for(let n=0;n<s.length-1;n++){let i=s[n];(o[i]===void 0||o[i]===null)&&(o[i]={}),o=o[i];}o[s[s.length-1]]=r;}async function J(e){let t=e.status==="superseded"?ze(e.id||e.key):e.key,r=JSON.stringify(e);switch(e.scope){case "hot":Tt(h,t,e.value);break;case "session":_.set(t,r);break;case "local":w.set(t,r);break;case "durable":await u.set("memories",t,r);break}await kr(e.id||e.key,e.scope,e.status==="superseded");}async function kt(e,t,r=false){let s=r?ze(e):e,o;switch(t){case "hot":{let n=Et(h,s);return n===void 0?null:Pt(e,n,t)}case "session":o=_.get(s);break;case "local":o=w.get(s);break;case "durable":o=await u.get("memories",s);break}if(!o)return null;try{let n=JSON.parse(o);return n.id=n.id||e,n}catch{return null}}function Pt(e,t,r){return {id:e,key:e,value:t,type:"fact",confidence:1,scope:r,ttl:null,tags:[],status:"active",createdAt:$(),lastConfirmedAt:$(),supersededId:null}}async function wt(e,t,r=false){let s=r?ze(e):e;switch(t){case "hot":Tt(h,s,void 0);break;case "session":_.remove(s);break;case "local":w.remove(s);break;case "durable":await u.deleteKey("memories",s);break}await Pr(e,r);}async function Y(){try{let e=w.get(se);return e?JSON.parse(e):{}}catch{return {}}}async function kr(e,t,r=false){let s=await Y();s[e]={scope:t,superseded:r},w.set(se,JSON.stringify(s));}async function Pr(e,t=false){let r=await Y(),s=r[e];s&&(t&&s.superseded||!t&&!s.superseded)&&delete r[e],w.set(se,JSON.stringify(r));}async function oe(){let e=await Y(),t=[];for(let[r,s]of Object.entries(e)){let o=await kt(r,s.scope,s.superseded);o&&(o.id=o.id||r,o.supersededId=o.supersededId??null,t.push(o));}return t}async function Or(){let e=await oe(),t=0;for(let r of e)ne(r)&&r.status==="active"&&(r.status="obsolete",await J(r),t++);return t}var ie={async remember(e,t,r={}){let s=await this._getEntry(e);if(s&&s.status==="active"){let d=`${s.id}__v${Date.now()}`,f={...s,id:d,key:s.key,status:"superseded",supersededId:null,lastConfirmedAt:$()};await J(f);}let o=Sr(t,r),n=St(r.tags),i={id:r.id||e,key:e,value:t,type:r.type||"fact",confidence:r.confidence??1,scope:o,ttl:r.ttl??null,tags:n,source:r.source,status:"active",createdAt:$(),lastConfirmedAt:$(),supersededId:s?s.id:null};await J(i),v.set("memorio:memory:remembered",{key:e,scope:o,entryId:i.id});},async recall(e,t={}){let r=await this._getEntry(e);return !r||!wr(r,t)?null:(r.lastConfirmedAt=$(),await J(r),v.set("memorio:memory:recalled",{key:e}),r.value)},async context(e={}){return (await oe()).filter(o=>Er(o,e)).map(o=>({entry:o,score:Tr(o)})).sort((o,n)=>n.score-o.score).slice(0,e.maxEntries??25).map(({entry:o})=>({key:o.key,value:o.value,type:o.type,confidence:o.confidence,scope:o.scope,tags:o.tags,age:$()-o.createdAt,accessCount:o.tags.length+1,lastAccessedAt:o.lastConfirmedAt}))},async forget(e){let t=await this._getEntry(e);t&&(await wt(t.id||e,t.scope,t.status==="superseded"),v.set("memorio:memory:forgotten",{key:e}));},async update(e,t,r={}){let s=await this._getEntry(e);if(!s){await this.remember(e,t,r);return}let o=`${s.id}__v${$()}`,n={...s,id:o,key:s.key,status:"superseded",supersededId:null,lastConfirmedAt:$()};await J(n);let i={...s,value:t,lastConfirmedAt:$(),...r.scope?{scope:r.scope}:{},...r.ttl!==void 0?{ttl:r.ttl}:{},...r.type?{type:r.type}:{},...r.confidence!==void 0?{confidence:r.confidence}:{},...r.tags!==void 0?{tags:St(r.tags)}:{},...r.source?{source:r.source}:{}};await J(i),v.set("memorio:memory:updated",{key:e,entryId:i.id});},async stats(){let e=await oe(),t={hot:0,session:0,local:0,durable:0},r={},s=0;for(let o of e)t[o.scope]=(t[o.scope]||0)+1,ne(o)&&s++,r[o.type]=(r[o.type]||0)+1;return {total:e.length,byScope:t,byType:r,expired:s}},async forgetExpired(){return Or()},async clear(){let e=await Y();for(let[t,r]of Object.entries(e))await wt(t,r.scope,r.superseded);w.remove(se);},async _getEntry(e){let r=(await Y())[e];if(!r){let s=Et(h,e);return s!==void 0?Pt(e,s,"hot"):null}return kt(e,r.scope,r.superseded)},async _loadAll(){return oe()},async _save(e){await J(e);}};Object.defineProperty(globalThis,"memorio",{value:{setProps:()=>{},obj:{},array:[],dispatch:v,message:T,devtools:Ee,logger:Te,setDescription:()=>{}},writable:false,configurable:true,enumerable:false});Object.defineProperty(globalThis,"events",{value:{},writable:true,enumerable:false});typeof globalThis.addEventListener=="function"&&v.listen("memorio:memory:cleanup",async()=>ie.forgetExpired?.());Object.defineProperty(memorio,"version",{writable:false,enumerable:false,value:re.version});Object.defineProperty(memorio,"debug",{get:()=>l.debug,set:e=>{l.debug=e;},enumerable:false});var Ot=F();Object.defineProperty(memorio,"_platform",{writable:false,enumerable:false,value:Ot.platform});Object.defineProperty(memorio,"_capabilities",{writable:false,enumerable:false,value:Ot});Object.defineProperty(memorio,"_sessionId",{writable:false,enumerable:false,value:Q()});Ze();memorio.isBrowser=le;memorio.isNode=ce;memorio.isDeno=ue;memorio.isEdge=me;memorio.getCapabilities=F;memorio.createContext=W;memorio.listContexts=ye;memorio.deleteContext=be;memorio.isolate=e=>W(e);memorio.registerSchema=M.register;memorio.validate=M.validate;memorio.unregisterSchema=M.unregister;memorio.listSchemas=M.list;memorio.typed=ke;memorio.snapshot=Oe;memorio.diff=Ce;memorio.undo=Ae;memorio.redo=Me;memorio.canUndo=De;memorio.canRedo=Re;memorio.rollback=je;memorio.trace=$e;memorio.enableHistory=_e;memorio.clearHistory=Ie;memorio.clearRedo=Ne;memorio.stateKeys=Ve;memorio.pathExists=Be;memorio.stateType=Le;memorio.stateGet=He;memorio.stateSchema=Je;memorio.memory=ie;Object.defineProperty(globalThis,"state",{value:h,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"store",{value:w,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"session",{value:_,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"cache",{value:Z,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"idb",{value:u,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"observer",{value:ee,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"useObserver",{value:te,writable:true,enumerable:false,configurable:true});Object.defineProperty(memorio,"dispatch",{value:v,writable:true,enumerable:false,configurable:true});Object.defineProperty(memorio,"setContext",{writable:false,enumerable:false,value:e=>he(e)});Object.defineProperty(memorio,"getContext",{writable:false,enumerable:false,value:()=>l.currentContext});Object.defineProperty(globalThis,"$state",{get:()=>globalThis.state,configurable:true});Object.defineProperty(globalThis,"$store",{get:()=>globalThis.store,configurable:true});Object.defineProperty(globalThis,"$session",{get:()=>globalThis.session,configurable:true});Object.defineProperty(globalThis,"$cache",{get:()=>globalThis.cache,configurable:true});memorio.help=function(){console.debug(`
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
Core Modules:
|
|
28
|
-
state - Reactive state management
|
|
19
|
+
Shortcuts (dev only):
|
|
20
|
+
state - global state proxy
|
|
21
|
+
store - localStorage wrapper
|
|
22
|
+
session - sessionStorage wrapper
|
|
23
|
+
cache - in-memory cache
|
|
24
|
+
`);},Ce={inspect:Ko,stats:Fo,clear:ye,clearAll:Qo,exportData:Wo,importData:Yo,watch:Go,help:Xo};a();var br="__memorio_hlc_node";function it(){if(typeof globalThis>"u")return "node";try{if(typeof sessionStorage<"u"&&sessionStorage){let e=sessionStorage.getItem(br);return e||(e=hr(),sessionStorage.setItem(br,e)),e}}catch{}return globalThis.__memorioHlcNodeId||(globalThis.__memorioHlcNodeId=hr()),globalThis.__memorioHlcNodeId}function hr(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID().slice(0,8):Math.random().toString(36).slice(2,10)}var st="__memorio_hlc_local",O=globalThis[st]||{physical:0,logical:0,node:it()};globalThis[st]||(globalThis[st]=O);function Zo(e){let t=Date.now(),r=O.physical,o,n;return t>r?(o=t,n=0):(o=r,n=O.logical+1),O.physical=o,O.logical=n,{physical:o,logical:n,node:O.node}}function en(e){let t=Date.now();return e.physical>O.physical?(O.physical=e.physical>t?e.physical:t,O.logical=1):e.physical===O.physical&&(O.logical=Math.max(O.logical,e.logical)+1),O.node=it(),{...O}}function vr(e,t){return e.physical!==t.physical?e.physical<t.physical?-1:1:e.logical!==t.logical?e.logical<t.logical?-1:1:e.node!==t.node?e.node<t.node?-1:1:0}function tn(e,t){return vr(e,t)<0}function rn(e){return `hlc:${e.physical}:${e.logical}:${e.node}`}function on(e){if(!e.startsWith("hlc:"))return null;let t=e.split(":");if(t.length!==4)return null;let r=parseInt(t[1],10),o=parseInt(t[2],10),n=t[3];return isNaN(r)||isNaN(o)?null:{physical:r,logical:o,node:n}}var E={tick:Zo,receive:en,compare:vr,happenedBefore:tn,serialize:rn,parse:on,getNodeId:it};a();function ge(e,t,r=2){if(e!==null&&t!==null&&e>=t)throw new Error(`left (${e}) must be < right (${t})`);return e===null&&t===null?"a":e===null?nn(t,r):t===null?at(e,r):sn(e,t,r)}function nn(e,t){let o=e.split(".")[0],n=o.charCodeAt(0);if(n>97){let s=String.fromCharCode(n-1),i=o.slice(1);return i===""?lt(s,t):s+i}if(o[0]==="a"){let s=0;for(;s<o.length&&o[s]==="a";)s++;if(s===o.length)return ".z."+".z".repeat(Math.floor(t/2)+1);let i=o.charCodeAt(s),l=String.fromCharCode(i-1);return l>="a"?l+o.slice(s+1):"a"+l+o.slice(s+1)}return ".z."+".z".repeat(Math.floor(t/2)+1)}function at(e,t){let o=e.split(".")[0],n=o.charCodeAt(0),s=String.fromCharCode(n+1);if(s<="z"){let l=o.slice(1);return l===""?an(s,t):s+l}if(o.length>1){let l=o[o.length-1];if(l<"z")return o.slice(0,-1)+String.fromCharCode(l.charCodeAt(0)+1)}let i=Sr(o,0);return i!==null?i+lt("a",t):"b"+lt("a",t)}function Sr(e,t){if(t>=e.length)return null;let r=e.charCodeAt(t);return r<122?e.slice(0,t)+String.fromCharCode(r+1):Sr(e,t+1)}function sn(e,t,r){let o=e.split("."),n=t.split("."),s=Math.max(o.length,n.length),i=xr(o,s),l=xr(n,s),f=[];for(let b=0;b<s;b++){let h=i[b]||"a",T=l[b]||"z";if(h===T)f.push(h);else {let Me=h.charCodeAt(0);if(T.charCodeAt(0)-Me>1){for(f.push(String.fromCharCode(Me+1));f.length<r;)f.push("a");return f.join(".")}return f.push(h),f.push(at(h,r)),f.join(".")}}return at(e,r)}function xr(e,t){for(;e.length<t;)e.push("a");return e}function lt(e,t){let r=e;for(;r.length<t;)r="a"+r;return r}function an(e,t){let r=e;for(;r.length<t;)r=r+"a";return r}function ln(){return ge(null,null)}function wr(e){return ge(e,null)}function _r(e){return ge(null,e)}function Er(e,t){return ge(e,t)}function cn(e,t,r){if(t===r)return e.map(s=>s.key);let o=[...e],[n]=o.splice(t,1);return o.splice(r,0,n),o.map(s=>s.key)}function un(e){if(e.length===0)return e;let t=[],r=null;for(let o=0;o<e.length;o++){let n=o<e.length-1?e[o+1].key:null,s={...e[o]};r===null?s.key=_r(e[0].key):n===null?s.key=wr(r):s.key=Er(r,n),t.push(s),r=s.key;}return t}var dn={generateBetween:ge,firstKey:ln,after:wr,before:_r,between:Er,reorder:cn,reindex:un};R();F();a();F();R();var ct={version:"4.9.5"};N();se();C();$();w();a();function ut(){return S}a();R();w();function kr(e){if(e===null||typeof e!="object")return e;let t=e.constructor?.name;if(t!=="Object"&&t!=="Array")return e;try{return JSON.parse(JSON.stringify(e))}catch{return e}}var ft=()=>kr(J(S)),mt=e=>{let t=[],r=(o,n,s)=>{let i=o?Object.keys(o):[],l=n?Object.keys(n):[];for(let f of l){let b=s?`${s}.${f}`:f,h=o?o[f]:void 0,T=n[f];h!==T&&(typeof h!==typeof T||h===void 0?t.push({path:b,oldValue:h,newValue:T}):h&&typeof h=="object"?r(h,T,b):h!==T&&t.push({path:b,oldValue:h,newValue:T}));}for(let f of i)if(!(f in(n||{}))){let b=s?`${s}.${f}`:f;t.push({path:b,oldValue:o[f],newValue:void 0});}};return r(e,J(S),""),t},pt=(e=true)=>{d.historyEnabled=e,c(`[memorio history] Tracking ${e?"enabled":"disabled"}`);};var yt=()=>[...d.mutations],gt=()=>d.canUndo(),bt=()=>d.canRedo(),ht=()=>{if(!d.historyEnabled){c("[memorio history] History is not enabled");return}let e=d.popUndo();if(e)return mn(e),c(`[memorio history] Undid: ${e.action} ${e.path}`),e},vt=()=>{if(!d.historyEnabled){c("[memorio history] History is not enabled");return}let e=d.popRedo();if(e)return pn(e),c(`[memorio history] Redid: ${e.action} ${e.path}`),e};function mn(e){let t=d.historyEnabled;d.historyEnabled=false;try{e.action==="set"?e.previousValue===void 0?Pr(e.path):dt(e.path,e.previousValue):e.action==="delete"&&e.previousValue!==void 0&&dt(e.path,e.previousValue);}finally{d.historyEnabled=t;}}function pn(e){let t=d.historyEnabled;d.historyEnabled=false;try{e.action==="set"?dt(e.path,e.newValue):e.action==="delete"&&Pr(e.path);}finally{d.historyEnabled=t;}}function dt(e,t){let r=e.split("."),o=S;for(let n=0;n<r.length-1;n++){let s=r[n];o[s]===void 0&&(o[s]={}),o=o[s];}o[r[r.length-1]]=t;}function Pr(e){let t=e.split(".");if(t.length===1){S.remove(t[0]);return}let r=S;for(let o=0;o<t.length-1;o++){let n=t[o];if(r[n]===void 0)return;r=r[n];}delete r[t[t.length-1]];}var xt=e=>{S.removeAll();for(let t of Object.keys(e))S[t]=kr(e[t]);d.clearHistory(),c("[memorio history] State rolled back to snapshot");},St=()=>{d.clearHistory(),c("[memorio history] History cleared");},wt=()=>{d.clearRedo();};a();se();C();a();se();var z=globalThis;function be(){let e=z.memorioSyncConfig;if(e&&typeof e.namespace=="string"&&e.namespace)return `ns:${e.namespace}`;let t=z.memorio?z.memorio._currentContext:void 0,r=typeof t=="string"&&t?t:"";return r?`ctx:${r}`:"default"}function Tr(){return !!z.memorioSyncConfig}var le=e=>`memorio:sync:${e}:`,ae=e=>`${le(e)}index`;function _t(e){try{return typeof e=="string"?JSON.parse(e):e}catch{return null}}var Et={async append(e,t){let r=be(),o={...e,operation:t,updatedAt:e.updatedAt||Date.now(),version:e.version||1,sync:"pending",hlc:e.hlc||E.serialize(E.tick())},n=`${le(r)}${o.id}`;v.set(n,o);let s=v.get(ae(r))||[];return s.includes(o.id)||s.push(o.id),v.set(ae(r),s),o},async pending(){let e=be(),t=[],r=v.get(ae(e))||[];for(let o of r){let n=v.get(`${le(e)}${o}`);if(!n)continue;let s=_t(n);s&&s.sync!=="synced"&&t.push(s);}return t.sort((o,n)=>{if(o.hlc&&n.hlc){let s=E.parse(o.hlc),i=E.parse(n.hlc);if(s&&i)return E.compare(s,i)}return (o.updatedAt||0)-(n.updatedAt||0)}),t},async markSynced(e){if(!e.length)return 0;let t=be(),r=0,o=v.get(ae(t))||[];for(let n of o){if(!e.includes(n))continue;let s=`${le(t)}${n}`,i=v.get(s);if(!i)continue;let l=_t(i);!l||l.sync==="synced"||(l.sync="synced",v.set(s,l),r++);}return r},async get(e){let t=be(),r=v.get(`${le(t)}${e}`);return _t(r??"")},async clear(){let e=be(),t=v.get(ae(e))||[];for(let r of t)v.remove(`${le(e)}${r}`);v.remove(ae(e));},async replay(){let e={synced:[],resolved:[]};if(!Tr())return e;let r=(z.memorioSyncConfig||{}).provider;if(!r||typeof r.push!="function")return e;let o=await this.pending();if(o.length)try{let n=await r.push(o);e.synced=n?.synced||[],e.conflicts=n?.conflicts,e.error=n?.error,e.synced.length&&await this.markSynced(e.synced);}catch(n){e.error=String(n);}if(typeof r.pull=="function")try{let n=o.length?Math.min(...o.map(i=>i.updatedAt||0)):0,s=await r.pull(n);for(let i of s||[]){if(i.hlc){let f=E.parse(i.hlc);f&&E.receive(f);}let l=await this.get(i.id);if(l&&i.hlc&&l.hlc){let f=E.parse(l.hlc),b=E.parse(i.hlc);if(f&&b){let h=E.compare(f,b);if(h===0){let T=typeof r.resolveConflict=="function"?await r.resolveConflict(l,i):"remote";if(e.resolved?.push({id:i.id,resolution:T}),T==="local")continue}else if(h>0)continue}}await this.append(i,i.operation||"confirm"),await this.markSynced([i.id]);}}catch{}return e},status(){return Promise.resolve("store")}};function Cr(e){let t=z.memorioSyncConfig||{};return z.memorioSyncConfig={...t,...e},Et}if(typeof z.addEventListener=="function"){let e=false;z.addEventListener("focus",()=>{e||!Tr()||(e=true,Et.replay().finally(()=>{e=false;}));});}var kt=Et;var Oe="__memorio_memory_index__",Dr="__memorio_superseded__";function ce(){return !!globalThis.memorioSyncConfig}async function W(e,t){if(ce()&&e.scope!=="hot")try{await kt.append(e,t);}catch{}}function Pt(e){return e.startsWith(Dr)?e:`${Dr}${e}`}function $r(e){return e?Array.isArray(e)?e:[e]:[]}function yn(e,t){if(t.scope)return t.scope;let r=JSON.stringify(e).length;return r>1e6?"durable":("local")}function k(){return Date.now()}function $e(e){return e.ttl===null||e.ttl===void 0?false:k()-e.createdAt>e.ttl}function gn(e,t){return e.status==="obsolete"||e.status==="superseded"||$e(e)?t.includeObsolete??false:!(t.type&&!(Array.isArray(t.type)?t.type:[t.type]).includes(e.type)||t.minConfidence!==void 0&&e.confidence<t.minConfidence)}function bn(e,t){return !(e.status!=="active"||$e(e)||t.tags&&!(Array.isArray(t.tags)?t.tags:[t.tags]).some(n=>e.tags.includes(n))||t.types&&!(Array.isArray(t.types)?t.types:[t.types]).includes(e.type)||t.minConfidence!==void 0&&e.confidence<t.minConfidence||t.scopes&&!t.scopes.includes(e.scope))}function hn(e){let t=(k()-e.createdAt)/36e5,r=Math.max(.1,1/(1+t*.5)),o=e.confidence,n=1+e.tags.length*.1,s={decision:1.5,context:1.3,preference:1.2,task:1,fact:.8},i={hot:1.5,session:1.2,local:1,durable:.8};return r*o*n*s[e.type]*i[e.scope]}function Ar(e,t){if(!t||typeof t!="string")return;let r=t.replace(/^state\./,"").split("."),o=e;for(let n of r){if(o==null)return;o=o[n];}return o}function Tt(e,t,r){if(!t||typeof t!="string")return;let o=t.replace(/^state\./,"").split("."),n=e;for(let s=0;s<o.length-1;s++){let i=o[s];(n[i]===void 0||n[i]===null)&&(n[i]={}),n=n[i];}n[o[o.length-1]]=r;}function vn(e,t){if(!t||typeof t!="string")return;let r=t.replace(/^state\./,"").split("."),o=e;for(let n=0;n<r.length-1;n++){let s=r[n];if(o[s]===void 0||o[s]===null)return;o=o[s];}delete o[r[r.length-1]];}async function Y(e){let t=e.status==="superseded"?Pt(e.id||e.key):e.key,r=JSON.stringify(e);switch(e.scope){case "hot":Tt(S,t,e.value);break;case "session":A.set(t,r);break;case "local":v.set(t,r);break;case "durable":await y.set("memories",t,r);break}await xn(e.id||e.key,e.scope,e.status==="superseded");}async function Mr(e,t,r=false){let o=r?Pt(e):e,n;switch(t){case "hot":{let s=Ar(S,o);return s===void 0?null:qr(e,s,t)}case "session":n=A.get(o);break;case "local":n=v.get(o);break;case "durable":n=await y.get("memories",o);break}if(!n)return null;try{let s=JSON.parse(n);return s.id=s.id||e,s}catch{return null}}function qr(e,t,r){return {id:e,key:e,value:t,type:"fact",confidence:1,scope:r,ttl:null,tags:[],status:"active",createdAt:k(),lastConfirmedAt:k(),supersededId:null}}async function Or(e,t,r=false){let o=r?Pt(e):e;switch(t){case "hot":Tt(S,o,void 0);break;case "session":A.remove(o);break;case "local":v.remove(o);break;case "durable":await y.deleteKey("memories",o);break}await Sn(e,r);}async function he(){try{let e=v.get(Oe);return e?JSON.parse(e):{}}catch{return {}}}async function xn(e,t,r=false){let o=await he();o[e]={scope:t,superseded:r},v.set(Oe,JSON.stringify(o));}async function Sn(e,t=false){let r=await he(),o=r[e];o&&(t&&o.superseded||!t&&!o.superseded)&&delete r[e],v.set(Oe,JSON.stringify(r));}async function De(){let e=await he(),t=[];for(let[r,o]of Object.entries(e)){let n=await Mr(r,o.scope,o.superseded);n&&(n.id=n.id||r,n.supersededId=n.supersededId??null,t.push(n));}return t}var Ae={async remember(e,t,r={}){let o=await this._getEntry(e);if(o&&o.status==="active"){let l=`${o.id}__v${Date.now()}`,f={...o,id:l,key:o.key,status:"superseded",supersededId:null,lastConfirmedAt:k()};await Y(f),await W(f,"supersede");}let n=yn(t,r),s=$r(r.tags),i={id:r.id||e,key:e,value:t,type:r.type||"fact",confidence:r.confidence??1,scope:n,ttl:r.ttl??null,tags:s,source:r.source,status:"active",createdAt:k(),lastConfirmedAt:k(),updatedAt:k(),version:o&&o.version?o.version+1:1,sync:ce()?"pending":void 0,supersededId:o?o.id:null,hlc:E.serialize(E.tick())};await Y(i),await W(i,"remember"),_.set("memorio:memory:remembered",{key:e,scope:n,entryId:i.id});},async recall(e,t={}){let r=await this._getEntry(e);return !r||!gn(r,t)?null:(r.lastConfirmedAt=k(),await Y(r),_.set("memorio:memory:recalled",{key:e}),r.value)},async context(e={}){return (await De()).filter(n=>bn(n,e)).map(n=>({entry:n,score:hn(n)})).sort((n,s)=>s.score-n.score).slice(0,e.maxEntries??25).map(({entry:n})=>({key:n.key,value:n.value,type:n.type,confidence:n.confidence,scope:n.scope,tags:n.tags,age:k()-n.createdAt,accessCount:n.tags.length+1,lastAccessedAt:n.lastConfirmedAt}))},async forget(e){let t=await this._getEntry(e);if(!t){let o={id:e,key:e,value:null,type:"fact",confidence:1,scope:"local",ttl:null,tags:[],status:"obsolete",operation:"delete",createdAt:k(),lastConfirmedAt:k(),updatedAt:k(),version:1,sync:ce()?"pending":void 0,hlc:E.serialize(E.tick())};await W(o,"delete");return}await Or(t.id||e,t.scope,t.status==="superseded");let r={...t,value:null,status:"obsolete",operation:"delete",updatedAt:k(),version:(t.version?t.version:0)+1,sync:ce()?"pending":void 0,hlc:E.serialize(E.tick())};await W(r,"delete"),_.set("memorio:memory:forgotten",{key:e});},async update(e,t,r={}){let o=await this._getEntry(e);if(!o){await this.remember(e,t,r);return}let n=`${o.id}__v${k()}`,s={...o,id:n,key:o.key,status:"superseded",supersededId:null,lastConfirmedAt:k()};await Y(s),await W(s,"supersede");let i={...o,value:t,lastConfirmedAt:k(),updatedAt:k(),version:(o.version?o.version:0)+1,sync:ce()?"pending":void 0,hlc:E.serialize(E.tick()),...r.scope?{scope:r.scope}:{},...r.ttl!==void 0?{ttl:r.ttl}:{},...r.type?{type:r.type}:{},...r.confidence!==void 0?{confidence:r.confidence}:{},...r.tags!==void 0?{tags:$r(r.tags)}:{},...r.source?{source:r.source}:{}};await Y(i),await W(i,"update"),_.set("memorio:memory:updated",{key:e,entryId:i.id});},async stats(){let e=await De(),t={hot:0,session:0,local:0,durable:0},r={},o=0;for(let n of e)t[n.scope]=(t[n.scope]||0)+1,$e(n)&&o++,r[n.type]=(r[n.type]||0)+1;return {total:e.length,byScope:t,byType:r,expired:o}},async forgetExpired(){let e=await De(),t=0;for(let r of e)$e(r)&&r.status==="active"&&(r.status="obsolete",r.updatedAt=k(),r.operation="expire",await Y(r),await W(r,"expire"),t++);return t},async clear(){let e=await he();for(let[t,r]of Object.entries(e))await Or(t,r.scope,r.superseded);v.remove(Oe);},async _getEntry(e){let r=(await he())[e];if(!r){let o=Ar(S,e);return o!==void 0?qr(e,o,"hot"):null}return Mr(e,r.scope,r.superseded)},async _loadAll(){return De()},async _save(e){await Y(e);},async patch(e,t){let r=await this._getEntry(e);if(!r)return;let o=false;for(let s of t)s.op==="set"?(Tt({[r.key]:r.value},s.path.replace(/^[^.]+\./,""),s.value),o=true):s.op==="delete"&&(vn({[r.key]:r.value},s.path.replace(/^[^.]+\./,"")),o=true);if(!o)return;let n={...r,updatedAt:k(),lastConfirmedAt:k(),version:(r.version?r.version:0)+1,sync:ce()?"pending":void 0,hlc:E.serialize(E.tick()),patches:t,path:t[0]?.path};await Y(n),await W(n,"patch"),_.set("memorio:memory:patched",{key:e,patches:t});},journal:kt,configure(e){return Cr(e),this}};a();var Ct=()=>{let e=J(S);return Object.keys(e).filter(t=>!["list","remove","removeAll","lock","unlock"].includes(t))},jr=e=>{if(!e||typeof e!="string")return false;let t=e.replace(/^state\./,"").split("."),r=S;for(let o of t){if(r==null)return false;r=r[o];}return r!==void 0},Rr=e=>{let[t,r]=Nr(e);return !t||r===void 0?"undefined":Array.isArray(r)?"array":typeof r},Ir=e=>{let[t,r]=Nr(e);if(!(!t||r===void 0))return wn(r)},Lr=()=>{let e=[],t=(r,o)=>{if(r===null||typeof r!="object"||Array.isArray(r))return;let n=Object.keys(r).filter(s=>!["list","remove","removeAll","lock","unlock"].includes(s));for(let s of n){let i=o?`${o}.${s}`:s,l=r[s],f=l!==void 0,b=f?Array.isArray(l)?"array":typeof l:"undefined";e.push({path:i,type:b,defined:f}),f&&typeof l=="object"&&!Array.isArray(l)&&l.constructor?.name==="Object"&&t(l,i);}};return t(J(S),""),e};function Nr(e){if(!e||typeof e!="string")return [false,void 0];let t=e.replace(/^state\./,"").split("."),r=S;for(let o of t){if(r==null)return [false,void 0];r=r[o];}return [r!==void 0,r]}function wn(e){if(e===null||typeof e!="object")return e;let t=e.constructor?.name;if(t!=="Object"&&t!=="Array")return e;try{return JSON.parse(JSON.stringify(e))}catch{return e}}if(!("memorio"in globalThis)){Object.defineProperty(globalThis,"memorio",{value:{setProps:()=>{},obj:{},array:[],dispatch:_,message:D,setDescription:()=>{}},writable:false,configurable:true,enumerable:false}),Object.defineProperty(globalThis,"events",{value:{},writable:true,enumerable:false}),typeof globalThis.addEventListener=="function"&&_.listen("memorio:memory:cleanup",async()=>Ae.forgetExpired?.()),Object.defineProperty(memorio,"version",{writable:false,enumerable:false,value:ct.version}),memorio.memory=Ae,Lt(),memorio.isBrowser=Ne,memorio.isNode=Ve,memorio.isDeno=He,memorio.isEdge=Je,memorio.getCapabilities=me,memorio.createContext=pe,memorio.listContexts=Ke,memorio.deleteContext=Fe,memorio.isolate=t=>pe(t),Object.defineProperty(memorio,"setContext",{writable:false,enumerable:false,value:t=>Qe(t)}),Object.defineProperty(memorio,"getContext",{writable:false,enumerable:false,value:()=>d.currentContext}),memorio.registerSchema=K.register,memorio.validate=K.validate,memorio.unregisterSchema=K.unregister,memorio.listSchemas=K.list,memorio.typed=ut,memorio.snapshot=ft,memorio.diff=mt,memorio.undo=ht,memorio.redo=vt,memorio.canUndo=gt,memorio.canRedo=bt,memorio.rollback=xt,memorio.trace=yt,memorio.enableHistory=pt,memorio.clearHistory=St,memorio.clearRedo=wt,Object.defineProperty(memorio,"dispatch",{value:_,writable:true,enumerable:false,configurable:true});let e=P;if(memorio.env={isDev:e,isProd:qe},memorio.global=function(){let t={state:S,store:v,session:A,cache:ie,idb:y,sqlite:u,observer:Pe,useObserver:Te};for(let r of Object.keys(t))r in globalThis||Object.defineProperty(globalThis,r,{value:t[r],writable:true,enumerable:false,configurable:true});},e&&memorio.global(),P){Object.defineProperty(memorio,"debug",{get:()=>d.debug,set:r=>{d.debug=r;},enumerable:false});let t=me();Object.defineProperty(memorio,"_platform",{writable:false,enumerable:false,value:t.platform}),Object.defineProperty(memorio,"_capabilities",{writable:false,enumerable:false,value:t}),Object.defineProperty(memorio,"_sessionId",{writable:false,enumerable:false,value:xe()}),memorio.logger=nt,"$state"in globalThis||Object.defineProperty(globalThis,"$state",{get:()=>globalThis.state,configurable:true}),"$store"in globalThis||Object.defineProperty(globalThis,"$store",{get:()=>globalThis.store,configurable:true}),"$session"in globalThis||Object.defineProperty(globalThis,"$session",{get:()=>globalThis.session,configurable:true}),"$cache"in globalThis||Object.defineProperty(globalThis,"$cache",{get:()=>globalThis.cache,configurable:true}),memorio.devtools=Ce,memorio.inspect=Ct,memorio.stateKeys=Ct,memorio.pathExists=jr,memorio.stateType=Rr,memorio.stateGet=Ir,memorio.stateSchema=Lr,memorio.help=function(){console.debug(`
|
|
25
|
+
\u{1F9E0} Memorio ${ct.version} - Help
|
|
26
|
+
|
|
27
|
+
Core Modules (runtime):
|
|
28
|
+
state - Reactive state management (DEV global)
|
|
29
29
|
store - Persistent storage (localStorage/Map)
|
|
30
30
|
session - Session storage (sessionStorage/Map)
|
|
31
31
|
cache - In-memory cache
|
|
32
32
|
idb - IndexedDB (browser only)
|
|
33
|
-
|
|
34
|
-
API:
|
|
35
|
-
memorio.typed<T>() - Type-safe view of global state (compile-time only)
|
|
36
|
-
memorio.registerSchema() - Register a validator for a state path
|
|
37
|
-
memorio.validate() - Manually validate a value
|
|
38
|
-
memorio.unregisterSchema() - Remove a registered schema
|
|
39
|
-
memorio.listSchemas() - List all registered schema paths
|
|
40
|
-
|
|
41
|
-
Context Management:
|
|
42
|
-
memorio.isolate(name) - Create isolated context
|
|
43
|
-
memorio.listContexts() - List all contexts
|
|
44
|
-
memorio.deleteContext(id) - Delete a context
|
|
33
|
+
sqlite - SQLite in browser (sql.js, optional)
|
|
45
34
|
|
|
46
35
|
Platform Detection:
|
|
47
|
-
memorio.isBrowser()
|
|
48
|
-
memorio.isNode()
|
|
49
|
-
memorio.isDeno()
|
|
50
|
-
memorio.isEdge()
|
|
36
|
+
memorio.isBrowser() - Browser environment
|
|
37
|
+
memorio.isNode() - Node.js environment
|
|
38
|
+
memorio.isDeno() - Deno environment
|
|
39
|
+
memorio.isEdge() - Edge/Worker environment
|
|
51
40
|
memorio.getCapabilities() - Full capabilities object
|
|
52
41
|
|
|
53
|
-
|
|
54
|
-
memorio.
|
|
55
|
-
memorio.
|
|
56
|
-
memorio.
|
|
57
|
-
memorio.devtools.exportData() - Export as JSON
|
|
58
|
-
memorio.devtools.importData() - Import from JSON
|
|
59
|
-
memorio.devtools.clear() - Clear specific module
|
|
60
|
-
memorio.devtools.clearAll() - Clear all modules
|
|
61
|
-
|
|
62
|
-
Memory System:
|
|
63
|
-
memorio.memory.remember(key, value, opts) - Store a memory with type, confidence, scope, TTL, tags
|
|
64
|
-
memorio.memory.recall(key, opts) - Retrieve a memory with filtering
|
|
65
|
-
memorio.memory.update(key, value, opts) - Update an existing memory
|
|
66
|
-
memorio.memory.forget(key) - Delete a specific memory
|
|
67
|
-
memorio.memory.context(opts) - Get ranked relevant memories (semantic context for AI)
|
|
68
|
-
memorio.memory.stats() - Memory usage statistics
|
|
69
|
-
memorio.memory.forgetExpired() - Remove all expired entries
|
|
70
|
-
memorio.memory.clear() - Wipe all memories
|
|
71
|
-
|
|
72
|
-
Scopes:
|
|
73
|
-
hot - In-memory reactive state (volatile, fastest)
|
|
74
|
-
session - sessionStorage (persists across page reloads, cleared on tab close)
|
|
75
|
-
local - localStorage (persistent, survives browser restart)
|
|
76
|
-
durable - IndexedDB (large datasets, async)
|
|
77
|
-
|
|
78
|
-
TTL options:
|
|
79
|
-
ttl: number (milliseconds) or null (never expires)
|
|
80
|
-
|
|
81
|
-
Memory types:
|
|
82
|
-
fact, preference, decision, task, context
|
|
83
|
-
|
|
84
|
-
Shortcuts:
|
|
85
|
-
state, store, session, cache, idb - direct access to modules
|
|
86
|
-
`);};memorio.help=function(){console.debug(`
|
|
87
|
-
\u{1F9E0} Memorio ${re.version} - Help
|
|
88
|
-
|
|
89
|
-
Core Modules:
|
|
90
|
-
state - Reactive state management
|
|
91
|
-
store - Persistent storage (localStorage/Map)
|
|
92
|
-
session - Session storage (sessionStorage/Map)
|
|
93
|
-
cache - In-memory cache
|
|
94
|
-
idb - IndexedDB (browser only)
|
|
42
|
+
Context Management:
|
|
43
|
+
memorio.isolate(name) - Create isolated context
|
|
44
|
+
memorio.listContexts() - List all contexts
|
|
45
|
+
memorio.deleteContext(id) - Delete a context
|
|
95
46
|
|
|
96
|
-
|
|
97
|
-
memorio.typed<T>() - Type-safe view of global state (compile-time only)
|
|
47
|
+
Schema Validation (runtime):
|
|
98
48
|
memorio.registerSchema() - Register a validator for a state path
|
|
99
49
|
memorio.validate() - Manually validate a value
|
|
100
50
|
memorio.unregisterSchema() - Remove a registered schema
|
|
101
51
|
memorio.listSchemas() - List all registered schema paths
|
|
52
|
+
memorio.typed<T>() - Type-safe view of global state (compile-time only)
|
|
102
53
|
|
|
103
|
-
History & Time Travel:
|
|
54
|
+
History & Time Travel (runtime):
|
|
104
55
|
memorio.snapshot() - Capture a deep snapshot of state
|
|
105
56
|
memorio.diff(snap) - Diff snapshot against current state
|
|
106
57
|
memorio.undo() / redo() - Undo / redo the last mutation
|
|
@@ -110,26 +61,7 @@ History & Time Travel:
|
|
|
110
61
|
memorio.enableHistory() - Enable/disable mutation tracking
|
|
111
62
|
memorio.clearHistory() - Clear undo/redo stacks and trace log
|
|
112
63
|
|
|
113
|
-
|
|
114
|
-
memorio.stateKeys() - List top-level state keys
|
|
115
|
-
memorio.pathExists(path) - Check if a state path exists
|
|
116
|
-
memorio.stateType(path) - Get runtime type of a state value
|
|
117
|
-
memorio.stateGet(path) - Get a deep-cloned value at a path
|
|
118
|
-
memorio.stateSchema() - Get a schema report of all state paths
|
|
119
|
-
|
|
120
|
-
Context Management:
|
|
121
|
-
memorio.isolate(name) - Create isolated context
|
|
122
|
-
memorio.listContexts() - List all contexts
|
|
123
|
-
memorio.deleteContext(id) - Delete a context
|
|
124
|
-
|
|
125
|
-
Platform Detection:
|
|
126
|
-
memorio.isBrowser() - Browser environment
|
|
127
|
-
memorio.isNode() - Node.js environment
|
|
128
|
-
memorio.isDeno() - Deno environment
|
|
129
|
-
memorio.isEdge() - Edge/Worker environment
|
|
130
|
-
memorio.getCapabilities() - Full capabilities object
|
|
131
|
-
|
|
132
|
-
DevTools:
|
|
64
|
+
DevTools (development-only):
|
|
133
65
|
memorio.devtools.inspect() - Inspect all modules
|
|
134
66
|
memorio.devtools.stats() - Show statistics
|
|
135
67
|
memorio.devtools.watch() - Watch a path
|
|
@@ -138,7 +70,17 @@ DevTools:
|
|
|
138
70
|
memorio.devtools.clear() - Clear specific module
|
|
139
71
|
memorio.devtools.clearAll() - Clear all modules
|
|
140
72
|
|
|
141
|
-
|
|
73
|
+
Introspection (development-only):
|
|
74
|
+
memorio.stateKeys() - List top-level state keys
|
|
75
|
+
memorio.pathExists(path) - Check if a state path exists
|
|
76
|
+
memorio.stateType(path) - Get runtime type of a state value
|
|
77
|
+
memorio.stateGet(path) - Get a deep-cloned value at a path
|
|
78
|
+
memorio.stateSchema() - Get a schema report of all state paths
|
|
79
|
+
|
|
80
|
+
Debug:
|
|
81
|
+
memorio.debug = true - Enable debug output (DEV only)
|
|
82
|
+
|
|
83
|
+
Memory System (runtime):
|
|
142
84
|
memorio.memory.remember(key, value, opts) - Store a memory with type, confidence, scope, TTL, tags
|
|
143
85
|
memorio.memory.recall(key, opts) - Retrieve a memory with filtering
|
|
144
86
|
memorio.memory.update(key, value, opts) - Update an existing memory
|
|
@@ -147,12 +89,15 @@ Memory System:
|
|
|
147
89
|
memorio.memory.stats() - Memory usage statistics
|
|
148
90
|
memorio.memory.forgetExpired() - Remove all expired entries
|
|
149
91
|
memorio.memory.clear() - Wipe all memories
|
|
92
|
+
memorio.memory.configure({ sync }) - Optional cloud-sync provider + namespace
|
|
93
|
+
memorio.memory.journal.pending() - Local op journal (SQLite/store)
|
|
150
94
|
|
|
151
95
|
Scopes:
|
|
152
96
|
hot - In-memory reactive state (volatile, fastest)
|
|
153
97
|
session - sessionStorage (persists across page reloads, cleared on tab close)
|
|
154
98
|
local - localStorage (persistent, survives browser restart)
|
|
155
99
|
durable - IndexedDB (large datasets, async)
|
|
100
|
+
sql - SQLite / sql.js (browser, optional, full SQL)
|
|
156
101
|
|
|
157
102
|
TTL options:
|
|
158
103
|
ttl: number (milliseconds) or null (never expires)
|
|
@@ -160,8 +105,9 @@ TTL options:
|
|
|
160
105
|
Memory types:
|
|
161
106
|
fact, preference, decision, task, context
|
|
162
107
|
|
|
163
|
-
|
|
164
|
-
state, store, session, cache, idb - direct access to modules
|
|
165
|
-
|
|
108
|
+
Console shortcuts (DEV only):
|
|
109
|
+
state, store, session, cache, idb, sqlite - direct access to modules
|
|
110
|
+
$state, $store, $session, $cache - aliases for the above
|
|
111
|
+
`);};}}var gl=P?Ce:void 0,_n=globalThis.memorio,bl=globalThis.events,hl=e=>pe(e),vl=globalThis.memorio?.help,xl=e=>d.currentContext=e,Sl=()=>d.currentContext,wl=_n;
|
|
166
112
|
|
|
167
|
-
export {
|
|
113
|
+
export { P as DEV, qe as PROD, ie as cache, bt as canRedo, gt as canUndo, St as clearHistory, wt as clearRedo, pe as createContext, wl as default, Fe as deleteContext, gl as devtools, mt as diff, _ as dispatch, pt as enableHistory, bl as events, dn as fractional, me as getCapabilities, Sl as getContext, vl as help, E as hlc, y as idb, d as internal, Ne as isBrowser, He as isDeno, Je as isEdge, Ve as isNode, hl as isolate, Ke as listContexts, qt as listSchemas, nt as logger, _n as memorio, Ae as memory, D as message, Pe as observer, Re as propertyName, vt as redo, At as registerSchema, xt as rollback, K as schema, A as session, xl as setContext, ft as snapshot, u as sqlite, S as state, v as store, yt as trace, ut as typed, ht as undo, Mt as unregisterSchema, Te as useObserver, Ot as validate };
|
package/llms.txt
CHANGED
|
@@ -357,7 +357,7 @@ Isolation is implemented as a **key-prefix convention** inside the same underlyi
|
|
|
357
357
|
|
|
358
358
|
### `memorio.typed<T>()` - Typed Store (compile-time safety)
|
|
359
359
|
|
|
360
|
-
Returns the global `state` proxy cast to type `T`. The same Proxy instance
|
|
360
|
+
Returns the global `state` proxy cast to type `T`. The same Proxy instance - no overhead. Use for TypeScript autocomplete and static type checking.
|
|
361
361
|
|
|
362
362
|
```javascript
|
|
363
363
|
const app = memorio.typed<AppState>()
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "memorio",
|
|
3
3
|
"codeName": "memorio",
|
|
4
|
-
"version": "4.
|
|
4
|
+
"version": "4.9.5",
|
|
5
5
|
"description": "Memorio, State + Observer, Store and iDB for an easy life - Cross-platform compatible",
|
|
6
6
|
"main": "./index.cjs",
|
|
7
7
|
"browser": "./index.js",
|
|
@@ -34,8 +34,9 @@
|
|
|
34
34
|
"reactive",
|
|
35
35
|
"universal",
|
|
36
36
|
"cross-platform",
|
|
37
|
-
"
|
|
38
|
-
"
|
|
37
|
+
"sqlite",
|
|
38
|
+
"sql.js",
|
|
39
|
+
"wasm",
|
|
39
40
|
"browser",
|
|
40
41
|
"frontend"
|
|
41
42
|
],
|
|
@@ -77,6 +78,11 @@
|
|
|
77
78
|
"overrides": {
|
|
78
79
|
"esbuild": "^0.25.0"
|
|
79
80
|
},
|
|
81
|
+
"peerDependenciesMeta": {
|
|
82
|
+
"sql.js": {
|
|
83
|
+
"optional": true
|
|
84
|
+
}
|
|
85
|
+
},
|
|
80
86
|
"exports": {
|
|
81
87
|
".": {
|
|
82
88
|
"import": "./index.js",
|
package/types/env.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime environment detection.
|
|
3
|
+
*
|
|
4
|
+
* `DEV` and `PROD` are derived at runtime from `process.env.NODE_ENV`
|
|
5
|
+
* (polyfilled by Vite/Webpack in browsers). No build-time environment
|
|
6
|
+
* constant is required. Import from `core/env.ts`:
|
|
7
|
+
*
|
|
8
|
+
* import { DEV, PROD } from './core/env'
|
|
9
|
+
*/
|
package/types/exports.d.ts
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
/// <reference path="./session.d.ts" />
|
|
18
18
|
/// <reference path="./cache.d.ts" />
|
|
19
19
|
/// <reference path="./idb.d.ts" />
|
|
20
|
+
/// <reference path="./sqlite.d.ts" />
|
|
20
21
|
/// <reference path="./observer.d.ts" />
|
|
21
22
|
/// <reference path="./useObserver.d.ts" />
|
|
22
23
|
|
|
@@ -26,11 +27,34 @@ export const store: _store
|
|
|
26
27
|
export const session: _session
|
|
27
28
|
export const cache: _cache
|
|
28
29
|
export const idb: _idb
|
|
30
|
+
export const sqlite: _sqlite
|
|
29
31
|
export const observer: _observer
|
|
30
32
|
export const useObserver: _useObserver
|
|
31
33
|
export const dispatch: _dispatch
|
|
32
34
|
export const events: Record<string, any>
|
|
33
35
|
|
|
36
|
+
export const DEV: boolean
|
|
37
|
+
export const PROD: boolean
|
|
38
|
+
|
|
39
|
+
export const hlc: {
|
|
40
|
+
tick(incoming?: { physical: number; logical: number; node: string }): { physical: number; logical: number; node: string }
|
|
41
|
+
receive(remote: { physical: number; logical: number; node: string }): { physical: number; logical: number; node: string }
|
|
42
|
+
compare(a: { physical: number; logical: number; node: string }, b: { physical: number; logical: number; node: string }): number
|
|
43
|
+
happenedBefore(a: { physical: number; logical: number; node: string }, b: { physical: number; logical: number; node: string }): boolean
|
|
44
|
+
serialize(hlc: { physical: number; logical: number; node: string }): string
|
|
45
|
+
parse(serialized: string): { physical: number; logical: number; node: string } | null
|
|
46
|
+
getNodeId(): string
|
|
47
|
+
}
|
|
48
|
+
export const fractional: {
|
|
49
|
+
generateBetween(left: string | null, right: string | null, minChars?: number): string
|
|
50
|
+
firstKey(): string
|
|
51
|
+
after(left: string): string
|
|
52
|
+
before(right: string): string
|
|
53
|
+
between(left: string, right: string): string
|
|
54
|
+
reorder<T extends { key: string }>(items: T[], fromIndex: number, toIndex: number): string[]
|
|
55
|
+
reindex<T extends { key: string }>(items: T[]): T[]
|
|
56
|
+
}
|
|
57
|
+
|
|
34
58
|
export const isBrowser: () => boolean
|
|
35
59
|
export const isNode: () => boolean
|
|
36
60
|
export const isDeno: () => boolean
|
|
@@ -43,11 +67,37 @@ export const isolate: _memorio['isolate']
|
|
|
43
67
|
export const message: (...args: unknown[]) => void
|
|
44
68
|
export const help: () => void
|
|
45
69
|
|
|
70
|
+
// ── Development-only (tree-shaken from production builds) ────────────
|
|
71
|
+
export const devtools: {
|
|
72
|
+
inspect: () => void
|
|
73
|
+
stats: () => any
|
|
74
|
+
clear: (module: string) => void
|
|
75
|
+
clearAll: () => void
|
|
76
|
+
exportData: () => string
|
|
77
|
+
importData: (json: string) => void
|
|
78
|
+
watch: (module: string, path: string) => void
|
|
79
|
+
help: () => void
|
|
80
|
+
} | undefined
|
|
81
|
+
export const logger: {
|
|
82
|
+
configure: (opts: Record<string, unknown>) => void
|
|
83
|
+
enable: () => void
|
|
84
|
+
disable: () => void
|
|
85
|
+
isEnabled: (module: string) => boolean
|
|
86
|
+
log: (module: string, action: string, path: string, value?: any, previousValue?: any) => void
|
|
87
|
+
getHistory: () => any[]
|
|
88
|
+
clearHistory: () => void
|
|
89
|
+
getStats: () => Record<string, number>
|
|
90
|
+
exportLogs: () => string
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// ── Schema validation (runtime) ───────────────────────────────────────
|
|
46
94
|
export const registerSchema: (path: string, schema: any) => void
|
|
47
95
|
export const validate: (path: string, value: any) => { valid: boolean; errors?: string[] }
|
|
48
96
|
export const unregisterSchema: (path: string) => boolean
|
|
49
97
|
export const listSchemas: () => string[]
|
|
50
98
|
export const typed: <T extends Record<string, any>>() => T
|
|
99
|
+
|
|
100
|
+
// ── History / time-travel (runtime) ───────────────────────────────────
|
|
51
101
|
export const snapshot: () => Record<string, any>
|
|
52
102
|
export const diff: (snap: Record<string, any>) => Array<{ path: string; oldValue: any; newValue: any }>
|
|
53
103
|
export const undo: () => any
|
|
@@ -59,12 +109,13 @@ export const trace: () => any[]
|
|
|
59
109
|
export const enableHistory: (enabled?: boolean) => void
|
|
60
110
|
export const clearHistory: () => void
|
|
61
111
|
export const clearRedo: () => void
|
|
112
|
+
|
|
113
|
+
// ── Introspection (development-only) ─────────────────────────────────
|
|
62
114
|
export const stateKeys: () => string[]
|
|
63
115
|
export const pathExists: (path: string) => boolean
|
|
64
116
|
export const stateType: (path: string) => string
|
|
65
117
|
export const stateGet: (path: string) => any
|
|
66
118
|
export const stateSchema: () => Array<{ path: string; type: string; defined: boolean }>
|
|
67
|
-
|
|
68
119
|
export const propertyName: (container: any, object: any) => string | null
|
|
69
120
|
export const internal: {
|
|
70
121
|
debug: boolean
|