memorio 4.8.0 → 4.9.7

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/index.cjs CHANGED
@@ -2,8 +2,2934 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var v=(e,t)=>()=>(e&&(t=e(e=0)),t);var a=v(()=>{});var p,mr,ut;exports.propertyName = void 0;exports.internal = void 0;var M=v(()=>{a();p={debug:false,tracking:false,trackedPaths:new Set,locked:false,lastAccessedPath:"",stateVersion:0,currentContext:null,mutations:[],undoStack:[],redoStack:[],maxHistory:100,historyEnabled:false},mr={get debug(){return p.debug},set debug(e){p.debug=e;},get tracking(){return p.tracking},set tracking(e){p.tracking=e;},get trackedPaths(){return p.trackedPaths},clearTrackedPaths(){p.trackedPaths.clear();},get locked(){return p.locked},set locked(e){p.locked=e;},get lastAccessedPath(){return p.lastAccessedPath},set lastAccessedPath(e){p.lastAccessedPath=e;},get stateVersion(){return p.stateVersion},bumpStateVersion(){return p.stateVersion=(p.stateVersion||0)+1,p.stateVersion},get currentContext(){return p.currentContext},set currentContext(e){p.currentContext=e;},get mutations(){return p.mutations},get undoStack(){return p.undoStack},get redoStack(){return p.redoStack},get maxHistory(){return p.maxHistory},set maxHistory(e){p.maxHistory=e;},get historyEnabled(){return p.historyEnabled},set historyEnabled(e){p.historyEnabled=e;},recordMutation(e){p.historyEnabled&&(p.mutations.push(e),p.mutations.length>p.maxHistory&&p.mutations.shift(),p.undoStack.push(e),p.undoStack.length>p.maxHistory&&p.undoStack.shift(),p.redoStack=[]);},popUndo(){let e=p.undoStack.pop();return e&&p.redoStack.push(e),e},popRedo(){let e=p.redoStack.pop();return e&&p.undoStack.push(e),e},canUndo(){return p.undoStack.length>0},canRedo(){return p.redoStack.length>0},clearHistory(){p.mutations=[],p.undoStack=[],p.redoStack=[];},clearRedo(){p.redoStack=[];}},ut=["list","state","store","idb","sqlite","observer","useObserver","remove","removeAll","_platform","_capabilities","_sessionId"],exports.propertyName=(e,t)=>String(t!==void 0?t:e).replace("() => ",""),exports.internal=mr;});exports.message = void 0;var c,S=v(()=>{a();M();exports.message=(...e)=>{exports.internal.debug===true&&console.debug(...e);},c=exports.message;});function le(){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 ee(){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 Se(){return ee()==="browser"}function we(){return ee()==="node"}function Ee(){return ee()==="deno"}function Te(){return ee()==="edge"}function Pe(){try{if(typeof sessionStorage<"u"){let e="__memorio_test__";return sessionStorage.setItem(e,"1"),sessionStorage.removeItem(e),sessionStorage}}catch{}return null}function _e(){try{if(typeof localStorage<"u"){let e="__memorio_test__";return localStorage.setItem(e,"1"),localStorage.removeItem(e),localStorage}}catch{}return null}function ke(){return typeof indexedDB<"u"}function te(){let e=globalThis;return typeof e.WebAssembly>"u"||typeof e.WebAssembly.instantiate!="function"?false:typeof e.window<"u"}function fr(){return typeof globalThis.dispatchEvent=="function"}function re(){let e=ee(),t=typeof globalThis.isSecureContext<"u"?globalThis.isSecureContext:e==="browser";return {platform:e,hasSessionStorage:Pe()!==null,hasLocalStorage:_e()!==null,hasIndexedDB:ke(),hasSqlJs:te(),hasDispatchEvent:fr(),hasNavigator:typeof navigator<"u",hasProcess:typeof process<"u",isSecureContext:t,sessionId:le()}}function vt(){let e=re(),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){Z.has(r)||Z.set(r,[]),Z.get(r).push(o);},t.removeEventListener=function(r,o){let n=Z.get(r);if(n){let s=n.indexOf(o);s>-1&&n.splice(s,1);}},t.dispatchEvent=function(r){let o=Z.get(r.type);return o&&o.forEach(n=>{try{n(r);}catch(s){console.error("Event listener error:",s);}}),true});}function oe(e){let t=e||`context_${le()}`;Ce(t);let r={state:{},store:new Map,session:new Map,cache:new Map};return Oe.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 qe(){return Array.from(Oe.keys())}function Me(e){return Oe.delete(e)}function Ce(e){exports.internal.currentContext=e;}var Z,Oe,L=v(()=>{a();M();Z=new Map;Oe=new Map;});function U(){let t=exports.internal.currentContext||""||"default";return $e.has(t)||$e.set(t,new Map),$e.get(t)}function N(){let e=exports.internal.currentContext||"";return e?`${e}-`:"memorio_store_"}function je(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`),""):N()+e}function pr(e){let t=B?O.getItem(e):U().get(e);return t&&JSON.parse(t)}function yr(e,t){let r=JSON.stringify(t);B?O.setItem(e,r):U().set(e,r);}function gr(e){if(B){if(O.getItem(e))return O.removeItem(e),true}else if(U().has(e))return U().delete(e),true;return false}var O,$e,B;exports.store = void 0;var F=v(()=>{a();L();M();S();O=_e(),$e=new Map;B=O!==null;exports.store=new Proxy({},{});Object.defineProperty(globalThis,"store",{value:exports.store,enumerable:false,configurable:true});Object.defineProperties(exports.store,{get:{value:e=>{if(!e)return console.warn("[memorio store] store.get() called with empty or null key - returning null"),null;try{return pr(je(e))}catch(t){exports.message(`Error parsing store item '${e}': ${t}`);}return null}},getMultiple:{value:e=>{let t={};for(let r of e)try{let o=exports.store.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=je(e);if(!r)return false;if(typeof t=="function")return console.warn("[memorio store] functions are not storable - write aborted for key: "+e),exports.message("Storing functions is not secure and is blocked for safety."),false;try{yr(r,t);}catch(o){return exports.message(`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=je(e);if(!t)return false;try{return gr(t)}catch(r){exports.message(`Error removing store item '${e}': ${r}`);}return false}},delete:{value:e=>exports.store.remove(e)},removeAll:{value:()=>{if(B){let e=[];for(let t=0;t<O.length;t++){let r=O.key(t);r?.startsWith(N())&&e.push(r);}e.forEach(t=>O.removeItem(t));}else U().clear();return true}},clearAll:{value:()=>(exports.store.removeAll(),true)},quota:{value:async()=>[0,0]},size:{value:()=>{let e=0;return B?Object.keys(O).forEach(t=>{if(t.startsWith(N())){let r=O.getItem(t);r&&(e+=r.length);}}):U().forEach(t=>{e+=t.length;}),e}},isPersistent:{get:()=>B},list:{value:()=>{let e={};try{if(B)for(let t=0;t<O.length;t++){let r=O.key(t);if(r?.startsWith(N())){let o=r.replace(N(),""),n=O.getItem(r);if(n!==null)try{e[o]=JSON.parse(n);}catch{e[o]=n;}}}else U().forEach((t,r)=>{if(r.startsWith(N())){let o=r.replace(N(),"");try{e[o]=JSON.parse(t);}catch{e[o]=t;}}});}catch(t){exports.message(`Error listing store items: ${t}`);}return e}}});Object.freeze(exports.store);});var xr={};var xt=v(()=>{a();E();S();exports.idb.db.create=(e,t=1)=>new Promise((r,o)=>{if(!exports.idb.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 Sr={};var St=v(()=>{a();E();exports.idb.db.list=async()=>{if(!("indexedDB"in globalThis)||!indexedDB.databases)return [];try{let e=await indexedDB.databases();return globalThis.idbases=e||[],await exports.idb.db.size(),globalThis.idbases}catch(e){return console.error("Error listing databases:",e),[]}};});var wr={};var wt=v(()=>{a();E();exports.idb.db.exist=e=>idbases?.some(t=>t.name===e);});var Er={};var Et=v(()=>{a();E();exports.idb.db.quota=()=>navigator.storage.estimate();});var Tr={};var Tt=v(()=>{a();E();S();exports.idb.db.delete=e=>new Promise((t,r)=>{c(`Removing database ${e}...`),(()=>{let n=indexedDB.deleteDatabase(e);n.onsuccess=()=>{c(`${e} database removed successfully`),exports.idb.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 Pr={};var Pt=v(()=>{a();E();S();exports.idb.db.size=async()=>{if(!(!idbases||idbases.length===0))for(let e=0;e<idbases.length;e++){let t=idbases[e];try{let r=await exports.idb.db.create(t.name,t.version),o=Array.from(r.objectStoreNames),n=0;for(let s of o){let i=await exports.idb.table.size(r,s);n+=i;}t.size=n,r.close();}catch(r){c(`Could not calculate size for ${t.name}:${r}`);}}};});var _r={};var _t=v(()=>{a();E();exports.idb.db.version=e=>{let t=0;for(let r of idbases){r.name===e&&(t=r.version);break}return t};});var kr={};var kt=v(()=>{a();E();S();exports.idb.db.support=()=>{let e="indexedDB"in globalThis;return e||c("Your environment doesn't support IndexedDB"),e};});var Or={};var Ot=v(()=>{a();E();S();exports.idb.table.create=(e,t)=>new Promise((r,o)=>{try{let s=(Number(exports.idb.db.version(e))||0)+1,i=indexedDB.open(e,s);i.onupgradeneeded=l=>{let y=l.target.result;if(!y.objectStoreNames.contains(t)){let g=y.createObjectStore(t,{keyPath:"id",autoIncrement:!0});g.createIndex("id","id",{unique:!0}),g.createIndex("data","data",{unique:!1}),c(`Table ${t} created in ${e}`);}},i.onsuccess=()=>{i.result.close(),exports.idb.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 qr={};var qt=v(()=>{a();E();S();exports.idb.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,y=e.transaction([t],"readonly").objectStore(t).openCursor();y.onsuccess=async g=>{let h=g.target.result;if(h){try{let k=h.value;n+=JSON.stringify(k).length;}catch(k){c(`Error stringifying IDB value tracking size:${k}`);}s++,s%200===0&&await new Promise(k=>setTimeout(k,0)),h.continue();}else r(n);},y.onerror=()=>{o(y.error);};});});var Mr={};var Mt=v(()=>{a();E();S();exports.idb.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 g=i.transaction(t,"readwrite").objectStore(t).delete(r);g.onsuccess=()=>{i.close(),c(`Record ${r} deleted from ${t}`),o();},g.onerror=()=>{i.close(),n(g.error);};},s.onerror=()=>n(s.error);});exports.idb.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 g=i.transaction(t,"readwrite").objectStore(t).clear();g.onsuccess=()=>{i.close(),c(`All data cleared from ${t}`),r();},g.onerror=()=>{i.close(),o(g.error);};},n.onerror=()=>o(n.error);});});var Cr={};var Ct=v(()=>{a();E();S();exports.idb.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 g=i.transaction(t,"readwrite").objectStore(t).put(r);g.onsuccess=()=>{i.close(),c(`Data saved in ${e}.${t}`),o(g.result);},g.onerror=h=>{i.close(),c(`Database insert error: ${g.error?.message}`),n(g.error);};},s.onerror=()=>{n(s.error);};});});var $r={};var $t=v(()=>{a();E();exports.idb.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 jr;exports.idb = void 0;var E=v(()=>{a();L();jr=ke(),exports.idb={db:{},table:{},data:{}};jr?(async()=>(Object.defineProperty(exports.idb,"db",{value:{},writable:true,configurable:true}),Object.defineProperty(exports.idb,"table",{value:{},writable:true,configurable:true}),Object.defineProperty(exports.idb,"data",{value:{},writable:true,configurable:true}),Object.defineProperty(globalThis,"idbases",{value:[],writable:true,configurable:true,enumerable:false}),await Promise.all([Promise.resolve().then(()=>(xt(),xr)),Promise.resolve().then(()=>(St(),Sr)),Promise.resolve().then(()=>(wt(),wr)),Promise.resolve().then(()=>(Et(),Er)),Promise.resolve().then(()=>(Tt(),Tr)),Promise.resolve().then(()=>(Pt(),Pr)),Promise.resolve().then(()=>(_t(),_r)),Promise.resolve().then(()=>(kt(),kr)),Promise.resolve().then(()=>(Ot(),Or)),Promise.resolve().then(()=>(qt(),qr)),Promise.resolve().then(()=>(Mt(),Mr)),Promise.resolve().then(()=>(Ct(),Cr)),Promise.resolve().then(()=>($t(),$r))]),Object.preventExtensions(exports.idb),Object.seal(exports.idb),Object.freeze(exports.idb)))():(exports.idb._disabled=true,exports.idb._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."));});var Jr={};function Rr(){let e=globalThis;return typeof e.document<"u"&&typeof e.document.createElement=="function"}function Ir(e){let t=globalThis;return t.__memorioSqlJsScript===e?Promise.resolve():(Re||(Re=new Promise((r,o)=>{if(t.initSqlJs&&typeof t.initSqlJs=="function"){t.__memorioSqlJsScript=e,r();return}if(!Rr()){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);})),Re)}var ue,me,jt,Dr,Ar,Re,Lr,Dt=v(()=>{a();P();L();S();ue=null,me=null,jt="https://cdn.jsdelivr.net/npm/sql.js/dist/sql-wasm-browser.js",Dr=jt.replace(/sql-wasm-browser\.js$/,""),Ar=e=>(globalThis.sqliteWasmBase||Dr)+e,Re=null;Lr=async()=>{let e=globalThis;return typeof e.initSqlJs=="function"?e.initSqlJs:(await Ir(jt),e.initSqlJs||e)};exports.sqlite.db.support=()=>te();exports.sqlite.db.getSQL=async()=>{if(me)return me;if(ue)return ue;let e=globalThis,t=e.sqliteConfig||{},r=(async()=>{if(typeof t.loader=="function")return await t.loader();let o=await Lr(),s=await(typeof o=="function"?o:o&&(o.default||o))({locateFile:t.locateFile||Ar});return e.sqliteVersion=s?.version||"sql.js",c("Memorio SQLite: sql.js engine loaded"),s})();ue=r;try{return me=await r,me}catch(o){try{exports.sqlite._disabled=!0;}catch{}try{exports.sqlite._warning='Memorio SQLite: sql.js could not be loaded. Install sql.js (npm i sql.js) and configure a loader via sqlite.config({ loader: () => import("sql.js") }).';}catch{}throw console.warn("Memorio SQLite: failed to load sql.js",o),o}finally{ue=null;}};exports.sqlite.db.version=()=>globalThis.sqliteVersion||null;});function Nr(){let e=j.sqliteConfig||{};return e.namespace?`ns:${e.namespace}`:"default"}function Ie(e){return `memorio:sqlite:db:${Nr()}:${e}`}function Br(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 Ur(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 de(e){return new Promise(t=>{let r=j.__sqliteDbs&&j.__sqliteDbs[e];if(!r||typeof r.export!="function"){t(false);return}try{let o=r.export();exports.store.set(Ie(e),Br(o)),c(`Memorio SQLite: persisted '${e}' to store`),t(!0);}catch(o){console.warn("Memorio SQLite: persist snapshot failed",o),t(false);}})}function Le(e){let t=exports.store.get(Ie(e));if(!t)return null;try{return Ur(t)}catch{return null}}function Vr(e){exports.store.remove(Ie(e));}function Rt(e,t){if(!(!t||typeof t.updateHook!="function")){At[e]=true;try{t.updateHook(()=>{Q[e]&&clearTimeout(Q[e]),Q[e]=setTimeout(()=>{Q[e]=null,de(e);},250);});}catch(r){console.warn("Memorio SQLite: could not attach updateHook",r);}}}var j,At,Q,It=v(()=>{a();P();F();S();j=globalThis,At={},Q={};exports.sqlite.db.persist=async(e="memorio")=>de(e);exports.sqlite.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}' \u2014 database not found. Create it with sqlite.db.create('${e}').`),false;let n;try{n=await exports.sqlite.db.export(e);}catch(y){return console.warn("Memorio SQLite: export failed during download",y),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};exports.sqlite.db.close=async(e="memorio")=>{let t=j.__sqliteDbs&&j.__sqliteDbs[e];if(t&&typeof t.close=="function"){try{await de(e);}catch{}try{t.close();}catch(r){console.warn("Memorio SQLite: close failed",r);}}if(j.__sqliteDbs&&delete j.__sqliteDbs[e],j.sqlbases){let r=j.sqlbases.findIndex(o=>o&&o.name===e);r>-1&&j.sqlbases.splice(r,1);}delete At[e],Q[e]&&(clearTimeout(Q[e]),Q[e]=null),Vr(e);};exports.sqlite.db.loadSnapshot=Le;exports.sqlite.db.saveSnapshot=de;});var Hr={};var Lt=v(()=>{a();P();S();It();exports.sqlite.db.create=async(e="memorio",t={})=>{let r=await exports.sqlite.db.getSQL(),o=globalThis,n=!!(t&&t.persistence)||!!(o.sqliteConfig&&o.sqliteConfig.persistence),s;if(n&&!t.data){let h=Le(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 y={...t,persistence:n};o.__sqliteDbs||(o.__sqliteDbs={}),o.__sqliteDbs[e]=l,o.sqlbases||(o.sqlbases=[]);let g=o.sqlbases.findIndex(h=>h&&h.name===e);return g>-1?o.sqlbases[g]={name:e,db:l,persistence:y.persistence}:o.sqlbases.push({name:e,db:l,persistence:y.persistence}),n&&Rt(e,l),l};});var zr={};var Jt=v(()=>{a();P();exports.sqlite.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 Qr={};var Nt=v(()=>{a();P();S();exports.sqlite.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 Kr={};var Bt=v(()=>{a();P();exports.sqlite.db.list=()=>{let e=globalThis.__sqliteDbs;return e?Object.keys(e):[]};});var Wr={};var Ut=v(()=>{a();P();exports.sqlite.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=exports.sqlite.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 Fr={};var Vt=v(()=>{a();P();exports.sqlite.db.export=async(e="memorio")=>exports.sqlite.db.get(e).export();});var Gr={};var Ht=v(()=>{a();P();exports.sqlite.db.import=async(e,t)=>exports.sqlite.db.create(e,{data:t});});var Yr={};var zt=v(()=>{a();P();S();exports.sqlite.query.run=async(e="memorio",t,r=[])=>{let o=exports.sqlite.db.get(e);return c(`Memorio SQLite: run -> ${t}`),o.run(t,r),o.getRowsModified()};});var Xr={};var Qt=v(()=>{a();P();exports.sqlite.query.select=async(e="memorio",t,r=[])=>{let n=exports.sqlite.db.get(e).prepare(t,r),s=[];try{for(;n.step();)s.push(n.getAsObject());}finally{try{n.free();}catch{}}return s};});var Zr={};var Kt=v(()=>{a();P();exports.sqlite.data.set=async(e="memorio",t,r=[])=>exports.sqlite.query.run(e,t,r);});var eo={};var Wt=v(()=>{a();P();exports.sqlite.data.get=async(e="memorio",t,r=[])=>{let o=await exports.sqlite.query.select(e,t,r);return o.length?o[0]:null};});var to;exports.sqlite = void 0;var P=v(()=>{a();L();to=te(),exports.sqlite={db:{},query:{},data:{}};exports.sqlite.config=e=>{let t=globalThis;return t.sqliteConfig={...t.sqliteConfig,...e},e&&e.wasmUrl&&(t.sqliteWasmBase=e.wasmUrl.endsWith("/")?e.wasmUrl:e.wasmUrl+"/"),exports.sqlite};Object.defineProperty(exports.sqlite,"ready",{enumerable:false,configurable:false,get:()=>{let e=globalThis;return e.sqliteReady||(e.sqliteReady=typeof exports.sqlite.db.getSQL=="function"?exports.sqlite.db.getSQL().then(()=>{}).catch(()=>{}):Promise.resolve()),e.sqliteReady}});to?(async()=>(Object.defineProperty(exports.sqlite,"db",{value:{},writable:false,configurable:true,enumerable:true}),Object.defineProperty(exports.sqlite,"query",{value:{},writable:false,configurable:true,enumerable:true}),Object.defineProperty(exports.sqlite,"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(()=>(Dt(),Jr)),Promise.resolve().then(()=>(Lt(),Hr)),Promise.resolve().then(()=>(Jt(),zr)),Promise.resolve().then(()=>(Nt(),Qr)),Promise.resolve().then(()=>(Bt(),Kr)),Promise.resolve().then(()=>(Ut(),Wr)),Promise.resolve().then(()=>(Vt(),Fr)),Promise.resolve().then(()=>(Ht(),Gr)),Promise.resolve().then(()=>(zt(),Yr)),Promise.resolve().then(()=>(Qt(),Xr)),Promise.resolve().then(()=>(Kt(),Zr)),Promise.resolve().then(()=>(Wt(),eo))])))():(globalThis.sqliteDisabled=true,globalThis.sqliteWarning='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.',exports.sqlite._disabled=true,exports.sqlite._warning=globalThis.sqliteWarning,console.warn("Memorio SQLite: sql.js is not available in this environment (requires browser + WebAssembly). Use store or session for persistence."));});a();a();M();S();a();var w={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();S();var W=new Map,mt=(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=mt(e[n],s,`${r}.${n}`);i.valid||o.push(...i.errors||[]);}}}return o.length===0?{valid:true}:{valid:false,errors:o}},dt=(e,t)=>{let r=W.get(e);return r?mt(t,r,e):{valid:true}},ft=(e,t)=>{typeof t=="function"?W.set(e,{validator:t}):W.set(e,t),c(`[memorio schema] Registered schema for '${e}'`);},pt=e=>W.delete(e),yt=()=>Array.from(W.keys()),dr=e=>W.get(e),I={register:ft,validate:dt,unregister:pt,list:yt,get:dr};var ae=Symbol("memorio.target"),gt=new WeakMap,A=(e,t=null)=>{if(e===null||typeof e!="object")return e;if(e[ae]!==void 0)return A(e[ae],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]=A(e[n],t);return o},bt=(e,t,r=".")=>t.concat(e).join(r),ht=(e,t,r=[])=>{let o=n=>{try{w.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===ae||n[ae]!==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;exports.internal.lastAccessedPath=i,exports.internal.tracking&&exports.internal.trackedPaths.add(i);}if(s==="_lastPath")return exports.internal.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=gt.get(i);return l||(l=ht(i,t,r.concat(s)),gt.set(i,l)),l}return i}catch(i){console.error("Error: ",i);return}},set(n,s,i){if(exports.internal.locked)return console.error("Error: state is locked. Use state.unlock() to enable modifications."),false;if(ut.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=bt(s,r),y=A(i),g=I.validate(l,y);if(!g.valid)return exports.internal.debug&&console.error(`[memorio schema] Validation failed for '${l}':`,g.errors),c(`[memorio schema] Validation failed for '${l}': `+(g.errors?.join(", ")||"unknown error")),!1;if(t({action:"set",path:l,target:n,newValue:y,previousValue:Reflect.get(n,s)}),o("state."+l),Reflect.set(n,s,y),exports.internal.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=bt(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)}})},x=ht({},e=>{exports.internal.historyEnabled&&exports.internal.recordMutation({path:e.path,action:e.action,newValue:e.newValue,previousValue:e.previousValue,timestamp:Date.now()});});x.lock=()=>{exports.internal.locked=true,c("State is now locked. All modifications are blocked.");};x.unlock=()=>{exports.internal.locked=false,c("State is now unlocked. Modifications are allowed.");};F();a();L();M();S();var q=Pe(),De=new Map;function z(){let t=exports.internal.currentContext||""||"default";return De.has(t)||De.set(t,new Map),De.get(t)}var H=q!==null;function V(){let e=exports.internal.currentContext||"";return e?`${e}-`:"memorio_session_"}function Ae(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`),""):V()+e}function br(e){let t=H?q.getItem(e):z().get(e);return t&&JSON.parse(t)}function hr(e,t){let r=JSON.stringify(t);H?q.setItem(e,r):z().set(e,r);}function vr(e){if(H){if(q.getItem(e))return q.removeItem(e),true}else if(z().has(e))return z().delete(e),true;return false}var C=new Proxy({},{});Object.defineProperty(globalThis,"session",{value:C,enumerable:false,configurable:true});Object.defineProperties(C,{get:{value:e=>{if(!e)return console.warn("[memorio session] session.get() called with empty or null key - returning null"),null;try{return br(Ae(e))}catch(t){exports.message(`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=Ae(e);if(!r)return false;if(typeof t=="function")return console.warn("[memorio session] functions are not storable - write aborted for key: "+e),exports.message("It's not secure to session functions."),false;try{hr(r,t);}catch(o){return exports.message(`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=Ae(e);if(!t)return false;try{return vr(t)}catch(r){exports.message(`Error removing session item '${e}': ${r}`);}return false}},delete:{value:e=>C.remove(e)},removeAll:{value:()=>{if(H){let e=[];for(let t=0;t<q.length;t++){let r=q.key(t);r?.startsWith(V())&&e.push(r);}e.forEach(t=>q.removeItem(t));}else z().clear();return true}},clearAll:{value:()=>(C.removeAll(),true)},quota:{value:async()=>[0,0]},size:{value:()=>{let e=0;return H?Object.keys(q).forEach(t=>{if(t.startsWith(V())){let r=q.getItem(t);r&&(e+=r.length);}}):z().forEach(t=>{e+=t.length;}),e}},isPersistent:{get:()=>H},list:{value:()=>{let e={};try{if(H)for(let t=0;t<q.length;t++){let r=q.key(t);if(r?.startsWith(V())){let o=r.replace(V(),""),n=q.getItem(r);if(n!==null)try{e[o]=JSON.parse(n);}catch{e[o]=n;}}}else z().forEach((t,r)=>{if(r.startsWith(V())){let o=r.replace(V(),"");try{e[o]=JSON.parse(t);}catch{e[o]=t;}}});}catch(t){exports.message(`Error listing session items: ${t}`);}return e}}});Object.freeze(C);a();var $={},ce=new Proxy({},{get(e,t){let r=t;return r==="get"?o=>$[o]:r==="set"?(o,n)=>{$[o]=n;}:r==="remove"?o=>(delete $[o],true):r==="removeAll"?()=>(Object.keys($).forEach(o=>delete $[o]),true):r==="clear"?()=>(Object.keys($).forEach(o=>delete $[o]),true):r==="list"?()=>({...$}):$[r]},set(e,t,r){return $[t]=r,true},deleteProperty(e,t){return delete $[t],true}});Object.freeze(ce);E();P();a();S();var ro=(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]&&w.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]&&w.remove(s),i.forEach(y=>{typeof y=="function"&&w.listen(s,y,r);});return}},fe=ro;Object.defineProperties(fe,{list:{get:()=>globalThis.events},remove:{value:e=>{e&&(w.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();S();M();globalThis.useObserver||(globalThis.useObserver=null);Object.defineProperty(globalThis,"useObserver",{value:null,writable:true,enumerable:false,configurable:true});var pe=((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=exports.propertyName(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;w.listen(i,()=>e()),r.push(i);}else {exports.internal.clearTrackedPaths(),exports.internal.tracking=!0;try{e();}catch{}exports.internal.tracking=!1,exports.internal.trackedPaths.forEach(i=>{r.includes(i)||(c(`useObserver: [Auto-Discovery] -> "${i}"`),w.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 w.remove=="function"&&(w.remove(n),c(`useObserver: Stopped monitoring "${n}"`));});}}catch(n){return c(`useObserver Error: ${n}`),()=>{}}});globalThis.useObserver=pe;Object.freeze(globalThis.useObserver);S();a();M();function oo(){return exports.internal.debug===true}function Ft(){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 o=t.get(r);o!=null&&(e[r]=o);}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 o=t.get(r);o!=null&&(e[r]=o);}catch{}}return e}var no=()=>{if(oo()){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(Ft()),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);}}},so=()=>{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,sqliteDbCount:typeof globalThis.sqlite?.db?.list=="function"?globalThis.sqlite.db.list().length:(globalThis.sqlbases||[]).length,lastUpdate:new Date().toISOString()}},ne=e=>{globalThis[e]&&typeof globalThis[e].clear=="function"?globalThis[e].clear():console.error(`Module ${e} not found or does not support clear()`);},io=()=>{ne("state"),ne("store"),ne("session"),ne("cache");},ao=()=>{let e=()=>{if(globalThis.state)try{return typeof globalThis.state.list=="function"?globalThis.state.list():globalThis.state}catch{return}},t=()=>Ft(),r=()=>Gt(),o=()=>{if(globalThis.cache)try{return typeof globalThis.cache.list=="function"?globalThis.cache.list():globalThis.cache}catch{return}},n={state:e(),store:t(),session:r(),cache:o(),exportedAt:new Date().toISOString()};return JSON.stringify(n,null,2)},lo=e=>{try{let t=JSON.parse(e);t.state&&Object.entries(t.state).forEach(([r,o])=>{globalThis.state&&r!=="list"&&r!=="remove"&&r!=="removeAll"&&(globalThis.state[r]=o);}),t.store&&globalThis.store&&typeof globalThis.store.set=="function"&&Object.entries(t.store).forEach(([r,o])=>{globalThis.store.set(r,o);}),t.session&&globalThis.session&&typeof globalThis.session.set=="function"&&Object.entries(t.session).forEach(([r,o])=>{globalThis.session.set(r,o);}),t.cache&&globalThis.cache&&Object.entries(t.cache).forEach(([r,o])=>{globalThis.cache&&r!=="get"&&r!=="set"&&r!=="remove"&&r!=="clear"&&(globalThis.cache[r]=o);});}catch(t){console.error("%c\u2717 Import failed:","color: #F44336",t);}},co=(e,t)=>{if(!globalThis[e]){console.error(`Module ${e} not found`);return}let r=globalThis[e],o=r[t];if(console.debug(`\u{1F441} Watching ${e}.${t} (initial: ${JSON.stringify(o)})`),e==="state"&&globalThis.memorio?.dispatch){let n=s=>{s.detail?.name?.includes(t)&&console.debug(`\u{1F441} Change: ${e}.${t} =`,s.detail.value);};r.addEventListener?.("memorio-change",n);}},uo=()=>{console.debug(`
6
- \u{1F9E0} Memorio DevTools Help
5
+ var __defProp = Object.defineProperty;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
8
+ var __esm = (fn, res) => function __init() {
9
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
10
+ };
11
+
12
+ // node_modules/tsup/assets/cjs_shims.js
13
+ var init_cjs_shims = __esm({
14
+ "node_modules/tsup/assets/cjs_shims.js"() {
15
+ }
16
+ });
17
+
18
+ // core/env.ts
19
+ exports.DEV = void 0; exports.PROD = void 0;
20
+ var init_env = __esm({
21
+ "core/env.ts"() {
22
+ init_cjs_shims();
23
+ exports.DEV = typeof process !== "undefined" ? false : true;
24
+ exports.PROD = !exports.DEV;
25
+ }
26
+ });
27
+
28
+ // core/internal.ts
29
+ var INTERNAL_KEY, state, internal, protect; exports.propertyName = void 0; exports.internal = void 0;
30
+ var init_internal = __esm({
31
+ "core/internal.ts"() {
32
+ init_cjs_shims();
33
+ INTERNAL_KEY = "__memorio_internal_state";
34
+ state = globalThis[INTERNAL_KEY] || {
35
+ debug: false,
36
+ tracking: false,
37
+ trackedPaths: /* @__PURE__ */ new Set(),
38
+ locked: false,
39
+ lastAccessedPath: "",
40
+ stateVersion: 0,
41
+ currentContext: null,
42
+ mutations: [],
43
+ undoStack: [],
44
+ redoStack: [],
45
+ maxHistory: 100,
46
+ historyEnabled: false
47
+ };
48
+ if (!globalThis[INTERNAL_KEY]) {
49
+ globalThis[INTERNAL_KEY] = state;
50
+ }
51
+ internal = {
52
+ get debug() {
53
+ return state.debug;
54
+ },
55
+ set debug(value) {
56
+ state.debug = value;
57
+ },
58
+ get tracking() {
59
+ return state.tracking;
60
+ },
61
+ set tracking(value) {
62
+ state.tracking = value;
63
+ },
64
+ get trackedPaths() {
65
+ return state.trackedPaths;
66
+ },
67
+ clearTrackedPaths() {
68
+ state.trackedPaths.clear();
69
+ },
70
+ get locked() {
71
+ return state.locked;
72
+ },
73
+ set locked(value) {
74
+ state.locked = value;
75
+ },
76
+ get lastAccessedPath() {
77
+ return state.lastAccessedPath;
78
+ },
79
+ set lastAccessedPath(value) {
80
+ state.lastAccessedPath = value;
81
+ },
82
+ get stateVersion() {
83
+ return state.stateVersion;
84
+ },
85
+ bumpStateVersion() {
86
+ state.stateVersion = (state.stateVersion || 0) + 1;
87
+ return state.stateVersion;
88
+ },
89
+ get currentContext() {
90
+ return state.currentContext;
91
+ },
92
+ set currentContext(value) {
93
+ state.currentContext = value;
94
+ },
95
+ get mutations() {
96
+ return state.mutations;
97
+ },
98
+ get undoStack() {
99
+ return state.undoStack;
100
+ },
101
+ get redoStack() {
102
+ return state.redoStack;
103
+ },
104
+ get maxHistory() {
105
+ return state.maxHistory;
106
+ },
107
+ set maxHistory(value) {
108
+ state.maxHistory = value;
109
+ },
110
+ get historyEnabled() {
111
+ return state.historyEnabled;
112
+ },
113
+ set historyEnabled(value) {
114
+ state.historyEnabled = value;
115
+ },
116
+ /**
117
+ * Records a mutation in the trace log and undo/redo stacks.
118
+ * Called by the state proxy's callback.
119
+ */
120
+ recordMutation(record) {
121
+ if (!state.historyEnabled) return;
122
+ state.mutations.push(record);
123
+ if (state.mutations.length > state.maxHistory) {
124
+ state.mutations.shift();
125
+ }
126
+ state.undoStack.push(record);
127
+ if (state.undoStack.length > state.maxHistory) {
128
+ state.undoStack.shift();
129
+ }
130
+ state.redoStack = [];
131
+ },
132
+ /**
133
+ * Pops a record from the undo stack and pushes to redo stack.
134
+ * Returns the record or undefined if empty.
135
+ */
136
+ popUndo() {
137
+ const record = state.undoStack.pop();
138
+ if (record) {
139
+ state.redoStack.push(record);
140
+ }
141
+ return record;
142
+ },
143
+ /**
144
+ * Pops a record from the redo stack and pushes to undo stack.
145
+ * Returns the record or undefined if empty.
146
+ */
147
+ popRedo() {
148
+ const record = state.redoStack.pop();
149
+ if (record) {
150
+ state.undoStack.push(record);
151
+ }
152
+ return record;
153
+ },
154
+ canUndo() {
155
+ return state.undoStack.length > 0;
156
+ },
157
+ canRedo() {
158
+ return state.redoStack.length > 0;
159
+ },
160
+ clearHistory() {
161
+ state.mutations = [];
162
+ state.undoStack = [];
163
+ state.redoStack = [];
164
+ },
165
+ clearRedo() {
166
+ state.redoStack = [];
167
+ }
168
+ };
169
+ protect = [
170
+ "list",
171
+ "state",
172
+ "store",
173
+ "idb",
174
+ "sqlite",
175
+ "observer",
176
+ "useObserver",
177
+ "remove",
178
+ "removeAll",
179
+ // Platform-related protected keys
180
+ "_platform",
181
+ "_capabilities",
182
+ "_sessionId"
183
+ ];
184
+ exports.propertyName = /* @__PURE__ */ __name((container, object) => {
185
+ const target = object !== void 0 ? object : container;
186
+ return String(target).replace("() => ", "");
187
+ }, "propertyName");
188
+ exports.internal = internal;
189
+ }
190
+ });
191
+
192
+ // functions/message/index.ts
193
+ exports.message = void 0; var message_default;
194
+ var init_message = __esm({
195
+ "functions/message/index.ts"() {
196
+ init_cjs_shims();
197
+ init_internal();
198
+ init_env();
199
+ exports.message = /* @__PURE__ */ __name((...args) => {
200
+ if (exports.DEV && exports.internal.debug === true) {
201
+ console.debug(...args);
202
+ }
203
+ }, "message");
204
+ message_default = exports.message;
205
+ }
206
+ });
207
+
208
+ // core/platform.ts
209
+ function generateSessionId() {
210
+ const anyGlobal = globalThis;
211
+ if (typeof anyGlobal.crypto !== "undefined" && anyGlobal.crypto.randomUUID) {
212
+ return anyGlobal.crypto.randomUUID();
213
+ }
214
+ if (typeof anyGlobal.crypto !== "undefined" && anyGlobal.crypto.getRandomValues) {
215
+ const array = new Uint8Array(16);
216
+ anyGlobal.crypto.getRandomValues(array);
217
+ return Array.from(array, (b) => b.toString(16).padStart(2, "0")).join("");
218
+ }
219
+ return `session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;
220
+ }
221
+ function detectPlatform() {
222
+ const globalAny = globalThis;
223
+ if (globalAny.Deno && globalAny.Deno.version) {
224
+ return "deno";
225
+ }
226
+ if (typeof process !== "undefined" && process.versions && process.versions.node) {
227
+ return "node";
228
+ }
229
+ if (typeof globalThis !== "undefined" && typeof globalThis.ServiceWorkerGlobalScope !== "undefined") {
230
+ return "edge";
231
+ }
232
+ if (typeof window !== "undefined" && typeof document !== "undefined") {
233
+ return "browser";
234
+ }
235
+ return "unknown";
236
+ }
237
+ function isBrowser() {
238
+ const platform = detectPlatform();
239
+ return platform === "browser";
240
+ }
241
+ function isNode() {
242
+ const platform = detectPlatform();
243
+ return platform === "node";
244
+ }
245
+ function isDeno() {
246
+ const platform = detectPlatform();
247
+ return platform === "deno";
248
+ }
249
+ function isEdge() {
250
+ const platform = detectPlatform();
251
+ return platform === "edge";
252
+ }
253
+ function getSessionStorage() {
254
+ try {
255
+ if (typeof sessionStorage !== "undefined") {
256
+ const testKey = "__memorio_test__";
257
+ sessionStorage.setItem(testKey, "1");
258
+ sessionStorage.removeItem(testKey);
259
+ return sessionStorage;
260
+ }
261
+ } catch (_) {
262
+ }
263
+ return null;
264
+ }
265
+ function getLocalStorage() {
266
+ try {
267
+ if (typeof localStorage !== "undefined") {
268
+ const testKey = "__memorio_test__";
269
+ localStorage.setItem(testKey, "1");
270
+ localStorage.removeItem(testKey);
271
+ return localStorage;
272
+ }
273
+ } catch (_) {
274
+ }
275
+ return null;
276
+ }
277
+ function hasIndexedDB() {
278
+ if (typeof indexedDB !== "undefined") {
279
+ return true;
280
+ }
281
+ return false;
282
+ }
283
+ function hasSqlJs() {
284
+ const anyGlobal = globalThis;
285
+ if (typeof anyGlobal.WebAssembly === "undefined" || typeof anyGlobal.WebAssembly.instantiate !== "function") {
286
+ return false;
287
+ }
288
+ return typeof anyGlobal.window !== "undefined";
289
+ }
290
+ function hasDispatchEvent() {
291
+ return typeof globalThis.dispatchEvent === "function";
292
+ }
293
+ function getCapabilities() {
294
+ const platform = detectPlatform();
295
+ const isSecure = typeof globalThis.isSecureContext !== "undefined" ? globalThis.isSecureContext : platform === "browser";
296
+ return {
297
+ platform,
298
+ hasSessionStorage: getSessionStorage() !== null,
299
+ hasLocalStorage: getLocalStorage() !== null,
300
+ hasIndexedDB: hasIndexedDB(),
301
+ hasSqlJs: hasSqlJs(),
302
+ hasDispatchEvent: hasDispatchEvent(),
303
+ hasNavigator: typeof navigator !== "undefined",
304
+ hasProcess: typeof process !== "undefined",
305
+ isSecureContext: isSecure,
306
+ sessionId: generateSessionId()
307
+ };
308
+ }
309
+ function initializePlatform() {
310
+ const capabilities = getCapabilities();
311
+ const anyGlobal = globalThis;
312
+ if (!capabilities.hasDispatchEvent) {
313
+ anyGlobal.dispatchEvent = function(_event) {
314
+ return true;
315
+ };
316
+ if (typeof CustomEvent === "undefined") {
317
+ anyGlobal.CustomEvent = class CustomEvent {
318
+ static {
319
+ __name(this, "CustomEvent");
320
+ }
321
+ type;
322
+ detail;
323
+ constructor(type, detail = {}) {
324
+ this.type = type;
325
+ this.detail = detail;
326
+ }
327
+ };
328
+ }
329
+ }
330
+ if (typeof anyGlobal.addEventListener !== "function") {
331
+ anyGlobal.addEventListener = function(type, listener) {
332
+ if (!_eventListenerStorage.has(type)) {
333
+ _eventListenerStorage.set(type, []);
334
+ }
335
+ _eventListenerStorage.get(type).push(listener);
336
+ };
337
+ anyGlobal.removeEventListener = function(type, listener) {
338
+ const listeners = _eventListenerStorage.get(type);
339
+ if (listeners) {
340
+ const index = listeners.indexOf(listener);
341
+ if (index > -1) {
342
+ listeners.splice(index, 1);
343
+ }
344
+ }
345
+ };
346
+ anyGlobal.dispatchEvent = function(event) {
347
+ const listeners = _eventListenerStorage.get(event.type);
348
+ if (listeners) {
349
+ listeners.forEach((listener) => {
350
+ try {
351
+ listener(event);
352
+ } catch (e) {
353
+ console.error("Event listener error:", e);
354
+ }
355
+ });
356
+ }
357
+ return true;
358
+ };
359
+ }
360
+ }
361
+ function createContext(name) {
362
+ const contextId = name || `context_${generateSessionId()}`;
363
+ setCurrentContext(contextId);
364
+ const contextStorage = {
365
+ state: {},
366
+ store: /* @__PURE__ */ new Map(),
367
+ session: /* @__PURE__ */ new Map(),
368
+ cache: /* @__PURE__ */ new Map()
369
+ };
370
+ _contexts.set(contextId, contextStorage);
371
+ return {
372
+ id: contextId,
373
+ state: contextStorage.state,
374
+ store: {
375
+ get: /* @__PURE__ */ __name((key) => {
376
+ const data = contextStorage.store.get(key);
377
+ return data ? JSON.parse(data) : null;
378
+ }, "get"),
379
+ set: /* @__PURE__ */ __name((key, value) => {
380
+ contextStorage.store.set(key, JSON.stringify(value));
381
+ }, "set"),
382
+ remove: /* @__PURE__ */ __name((key) => contextStorage.store.delete(key), "remove"),
383
+ removeAll: /* @__PURE__ */ __name(() => contextStorage.store.clear(), "removeAll"),
384
+ clearAll: /* @__PURE__ */ __name(() => contextStorage.store.clear(), "clearAll"),
385
+ size: /* @__PURE__ */ __name(() => contextStorage.store.size, "size"),
386
+ isPersistent: false
387
+ },
388
+ session: {
389
+ get: /* @__PURE__ */ __name((key) => {
390
+ const data = contextStorage.session.get(key);
391
+ return data ? JSON.parse(data) : null;
392
+ }, "get"),
393
+ set: /* @__PURE__ */ __name((key, value) => {
394
+ contextStorage.session.set(key, JSON.stringify(value));
395
+ }, "set"),
396
+ remove: /* @__PURE__ */ __name((key) => contextStorage.session.delete(key), "remove"),
397
+ removeAll: /* @__PURE__ */ __name(() => contextStorage.session.clear(), "removeAll"),
398
+ clearAll: /* @__PURE__ */ __name(() => contextStorage.session.clear(), "clearAll"),
399
+ size: /* @__PURE__ */ __name(() => contextStorage.session.size, "size"),
400
+ isPersistent: false
401
+ },
402
+ cache: {
403
+ get: /* @__PURE__ */ __name((key) => contextStorage.cache.get(key), "get"),
404
+ set: /* @__PURE__ */ __name((key, value) => contextStorage.cache.set(key, value), "set"),
405
+ remove: /* @__PURE__ */ __name((key) => contextStorage.cache.delete(key), "remove"),
406
+ removeAll: /* @__PURE__ */ __name(() => contextStorage.cache.clear(), "removeAll"),
407
+ clear: /* @__PURE__ */ __name(() => contextStorage.cache.clear(), "clear")
408
+ }
409
+ };
410
+ }
411
+ function listContexts() {
412
+ return Array.from(_contexts.keys());
413
+ }
414
+ function deleteContext(id) {
415
+ return _contexts.delete(id);
416
+ }
417
+ function setCurrentContext(id) {
418
+ exports.internal.currentContext = id;
419
+ }
420
+ var _eventListenerStorage, CONTEXTS_KEY, _contexts;
421
+ var init_platform = __esm({
422
+ "core/platform.ts"() {
423
+ init_cjs_shims();
424
+ init_internal();
425
+ __name(generateSessionId, "generateSessionId");
426
+ __name(detectPlatform, "detectPlatform");
427
+ __name(isBrowser, "isBrowser");
428
+ __name(isNode, "isNode");
429
+ __name(isDeno, "isDeno");
430
+ __name(isEdge, "isEdge");
431
+ __name(getSessionStorage, "getSessionStorage");
432
+ __name(getLocalStorage, "getLocalStorage");
433
+ __name(hasIndexedDB, "hasIndexedDB");
434
+ __name(hasSqlJs, "hasSqlJs");
435
+ __name(hasDispatchEvent, "hasDispatchEvent");
436
+ __name(getCapabilities, "getCapabilities");
437
+ _eventListenerStorage = /* @__PURE__ */ new Map();
438
+ __name(initializePlatform, "initializePlatform");
439
+ CONTEXTS_KEY = "__memorio_contexts__";
440
+ _contexts = globalThis[CONTEXTS_KEY] || /* @__PURE__ */ new Map();
441
+ if (!globalThis[CONTEXTS_KEY]) {
442
+ globalThis[CONTEXTS_KEY] = _contexts;
443
+ }
444
+ __name(createContext, "createContext");
445
+ __name(listContexts, "listContexts");
446
+ __name(deleteContext, "deleteContext");
447
+ __name(setCurrentContext, "setCurrentContext");
448
+ }
449
+ });
450
+
451
+ // functions/store/index.ts
452
+ function _getFallbackStorage() {
453
+ const contextName = exports.internal.currentContext || "";
454
+ const key = contextName || "default";
455
+ if (!_fallbackStorageByContext.has(key)) {
456
+ _fallbackStorageByContext.set(key, /* @__PURE__ */ new Map());
457
+ }
458
+ return _fallbackStorageByContext.get(key);
459
+ }
460
+ function _getPrefix() {
461
+ const contextName = exports.internal.currentContext || "";
462
+ return contextName ? `${contextName}-` : `memorio_store_`;
463
+ }
464
+ function _prefixKey(name) {
465
+ if (!name || typeof name !== "string") {
466
+ console.warn(`[memorio store] key is empty or not a string - operation aborted`);
467
+ return "";
468
+ }
469
+ if (name.length > 512) {
470
+ console.warn(`[memorio store] key "${name}" exceeds 512 chars - operation aborted`);
471
+ return "";
472
+ }
473
+ return _getPrefix() + name;
474
+ }
475
+ function _read(prefixedName) {
476
+ const raw = _hasStorage ? _localStorage.getItem(prefixedName) : _getFallbackStorage().get(prefixedName);
477
+ return raw ? JSON.parse(raw) : raw;
478
+ }
479
+ function _write(prefixedName, value) {
480
+ const json = JSON.stringify(value);
481
+ if (_hasStorage) _localStorage.setItem(prefixedName, json);
482
+ else _getFallbackStorage().set(prefixedName, json);
483
+ }
484
+ function _remove(prefixedName) {
485
+ if (_hasStorage) {
486
+ if (_localStorage.getItem(prefixedName)) {
487
+ _localStorage.removeItem(prefixedName);
488
+ return true;
489
+ }
490
+ } else if (_getFallbackStorage().has(prefixedName)) {
491
+ _getFallbackStorage().delete(prefixedName);
492
+ return true;
493
+ }
494
+ return false;
495
+ }
496
+ var _localStorage, _fallbackStorageByContext, _hasStorage, STORE_INSTANCE_KEY; exports.store = void 0;
497
+ var init_store = __esm({
498
+ "functions/store/index.ts"() {
499
+ init_cjs_shims();
500
+ init_platform();
501
+ init_internal();
502
+ init_message();
503
+ _localStorage = getLocalStorage();
504
+ _fallbackStorageByContext = /* @__PURE__ */ new Map();
505
+ __name(_getFallbackStorage, "_getFallbackStorage");
506
+ _hasStorage = _localStorage !== null;
507
+ __name(_getPrefix, "_getPrefix");
508
+ __name(_prefixKey, "_prefixKey");
509
+ __name(_read, "_read");
510
+ __name(_write, "_write");
511
+ __name(_remove, "_remove");
512
+ STORE_INSTANCE_KEY = "__memorio_store_instance__";
513
+ if (globalThis[STORE_INSTANCE_KEY]) {
514
+ exports.store = globalThis[STORE_INSTANCE_KEY];
515
+ } else {
516
+ exports.store = new Proxy({}, {});
517
+ Object.defineProperties(
518
+ exports.store,
519
+ {
520
+ /**
521
+ * Gets a value from storage.
522
+ * @param name The key to retrieve.
523
+ * @returns The parsed value or null if not found.
524
+ */
525
+ get: {
526
+ value: /* @__PURE__ */ __name((name) => {
527
+ if (!name) {
528
+ console.warn("[memorio store] store.get() called with empty or null key - returning null");
529
+ return null;
530
+ }
531
+ try {
532
+ return _read(_prefixKey(name));
533
+ } catch (err) {
534
+ exports.message(`Error parsing store item '${name}': ${err}`);
535
+ }
536
+ return null;
537
+ }, "value")
538
+ },
539
+ getMultiple: {
540
+ value: /* @__PURE__ */ __name((keys) => {
541
+ const result = {};
542
+ for (const key of keys) {
543
+ try {
544
+ const item = exports.store.get(key);
545
+ if (item) result[key] = item;
546
+ } catch (err) {
547
+ console.debug(`[memorio store] getMultiple error for key "${key}":`, err);
548
+ }
549
+ }
550
+ return result;
551
+ }, "value")
552
+ },
553
+ /**
554
+ * Sets a value in storage.
555
+ * @param name The key to set.
556
+ * @param value The value to store (objects, arrays, primitives).
557
+ * @returns true if written, false if the key was rejected.
558
+ */
559
+ set: {
560
+ value: /* @__PURE__ */ __name((name, value) => {
561
+ if (!name) {
562
+ console.warn("[memorio store] store.set() called with empty or null key - write aborted");
563
+ return false;
564
+ }
565
+ const prefixedName = _prefixKey(name);
566
+ if (!prefixedName) return false;
567
+ if (typeof value === "function") {
568
+ console.warn("[memorio store] functions are not storable - write aborted for key: " + name);
569
+ exports.message("Storing functions is not secure and is blocked for safety.");
570
+ return false;
571
+ }
572
+ try {
573
+ _write(prefixedName, value);
574
+ } catch (err) {
575
+ exports.message(`Error setting store item '${name}': ${err}`);
576
+ return false;
577
+ }
578
+ return true;
579
+ }, "value")
580
+ },
581
+ /**
582
+ * Removes a value from storage.
583
+ * @param name The key to remove.
584
+ * @returns True if removed, false if not found.
585
+ */
586
+ remove: {
587
+ value: /* @__PURE__ */ __name((name) => {
588
+ if (!name) {
589
+ console.debug("[memorio store] store.remove() called with empty or null key - returning false");
590
+ return false;
591
+ }
592
+ const prefixedName = _prefixKey(name);
593
+ if (!prefixedName) return false;
594
+ try {
595
+ return _remove(prefixedName);
596
+ } catch (err) {
597
+ exports.message(`Error removing store item '${name}': ${err}`);
598
+ }
599
+ return false;
600
+ }, "value")
601
+ },
602
+ /**
603
+ * Alias for remove.
604
+ * @param name The key to delete.
605
+ */
606
+ delete: {
607
+ value: /* @__PURE__ */ __name((name) => {
608
+ return exports.store.remove(name);
609
+ }, "value")
610
+ },
611
+ /**
612
+ * Clears all memorio items from storage.
613
+ */
614
+ removeAll: {
615
+ value: /* @__PURE__ */ __name(() => {
616
+ if (_hasStorage) {
617
+ const keysToRemove = [];
618
+ for (let i = 0; i < _localStorage.length; i++) {
619
+ const key = _localStorage.key(i);
620
+ if (key?.startsWith(_getPrefix())) keysToRemove.push(key);
621
+ }
622
+ keysToRemove.forEach((key) => _localStorage.removeItem(key));
623
+ } else {
624
+ _getFallbackStorage().clear();
625
+ }
626
+ return true;
627
+ }, "value")
628
+ },
629
+ /**
630
+ * Alias for removeAll.
631
+ */
632
+ clearAll: {
633
+ value: /* @__PURE__ */ __name(() => {
634
+ exports.store.removeAll();
635
+ return true;
636
+ }, "value")
637
+ },
638
+ /**
639
+ * Estimates storage quota usage.
640
+ * @returns Promise with [usage, quota].
641
+ */
642
+ quota: {
643
+ value: /* @__PURE__ */ __name(async () => {
644
+ return [0, 0];
645
+ }, "value")
646
+ },
647
+ /**
648
+ * Calculates total size of all memorio items (characters).
649
+ */
650
+ size: {
651
+ value: /* @__PURE__ */ __name(() => {
652
+ let totalSize = 0;
653
+ if (_hasStorage) {
654
+ Object.keys(_localStorage).forEach((key) => {
655
+ if (key.startsWith(_getPrefix())) {
656
+ const item = _localStorage.getItem(key);
657
+ if (item) totalSize += item.length;
658
+ }
659
+ });
660
+ } else {
661
+ _getFallbackStorage().forEach((value) => {
662
+ totalSize += value.length;
663
+ });
664
+ }
665
+ return totalSize;
666
+ }, "value")
667
+ },
668
+ /**
669
+ * Check if using real localStorage or fallback
670
+ */
671
+ isPersistent: {
672
+ get: /* @__PURE__ */ __name(() => _hasStorage, "get")
673
+ },
674
+ /**
675
+ * Get a list of all memorio store items.
676
+ */
677
+ list: {
678
+ value: /* @__PURE__ */ __name(() => {
679
+ const result = {};
680
+ try {
681
+ if (_hasStorage) {
682
+ for (let i = 0; i < _localStorage.length; i++) {
683
+ const key = _localStorage.key(i);
684
+ if (key?.startsWith(_getPrefix())) {
685
+ const cleanKey = key.replace(_getPrefix(), "");
686
+ const item = _localStorage.getItem(key);
687
+ if (item !== null) {
688
+ try {
689
+ result[cleanKey] = JSON.parse(item);
690
+ } catch {
691
+ result[cleanKey] = item;
692
+ }
693
+ }
694
+ }
695
+ }
696
+ } else {
697
+ _getFallbackStorage().forEach((value, key) => {
698
+ if (key.startsWith(_getPrefix())) {
699
+ const cleanKey = key.replace(_getPrefix(), "");
700
+ try {
701
+ result[cleanKey] = JSON.parse(value);
702
+ } catch {
703
+ result[cleanKey] = value;
704
+ }
705
+ }
706
+ });
707
+ }
708
+ } catch (err) {
709
+ exports.message(`Error listing store items: ${err}`);
710
+ }
711
+ return result;
712
+ }, "value")
713
+ }
714
+ }
715
+ );
716
+ Object.freeze(exports.store);
717
+ globalThis[STORE_INSTANCE_KEY] = exports.store;
718
+ }
719
+ }
720
+ });
721
+
722
+ // functions/idb/tools/db.create.ts
723
+ var db_create_exports = {};
724
+ var init_db_create = __esm({
725
+ "functions/idb/tools/db.create.ts"() {
726
+ init_cjs_shims();
727
+ init_idb();
728
+ init_message();
729
+ exports.idb.db.create = (dbName, ver = 1) => {
730
+ return new Promise((resolve, reject) => {
731
+ if (!exports.idb.db.support()) {
732
+ return reject(new Error("IndexedDB not supported"));
733
+ }
734
+ const request = globalThis.indexedDB.open(dbName, ver);
735
+ request.onerror = () => {
736
+ message_default(`IndexedDB error: ${request.error?.message}`);
737
+ reject(request.error);
738
+ };
739
+ request.onsuccess = () => {
740
+ message_default(`Database ${dbName} connected successfully`);
741
+ resolve(request.result);
742
+ };
743
+ request.onupgradeneeded = () => {
744
+ message_default(`Database ${dbName} upgrade/creation initiated`);
745
+ };
746
+ });
747
+ };
748
+ }
749
+ });
750
+
751
+ // functions/idb/tools/db.list.ts
752
+ var db_list_exports = {};
753
+ var init_db_list = __esm({
754
+ "functions/idb/tools/db.list.ts"() {
755
+ init_cjs_shims();
756
+ init_idb();
757
+ exports.idb.db.list = async () => {
758
+ if (!("indexedDB" in globalThis) || !indexedDB.databases) return [];
759
+ try {
760
+ const result = await indexedDB.databases();
761
+ globalThis.idbases = result || [];
762
+ await exports.idb.db.size();
763
+ return globalThis.idbases;
764
+ } catch (err) {
765
+ console.error("Error listing databases:", err);
766
+ return [];
767
+ }
768
+ };
769
+ }
770
+ });
771
+
772
+ // functions/idb/tools/db.exist.ts
773
+ var db_exist_exports = {};
774
+ var init_db_exist = __esm({
775
+ "functions/idb/tools/db.exist.ts"() {
776
+ init_cjs_shims();
777
+ init_idb();
778
+ exports.idb.db.exist = (storeName) => {
779
+ return idbases?.some((db) => db.name === storeName);
780
+ };
781
+ }
782
+ });
783
+
784
+ // functions/idb/tools/db.quota.ts
785
+ var db_quota_exports = {};
786
+ var init_db_quota = __esm({
787
+ "functions/idb/tools/db.quota.ts"() {
788
+ init_cjs_shims();
789
+ init_idb();
790
+ exports.idb.db.quota = () => {
791
+ return navigator.storage.estimate();
792
+ };
793
+ }
794
+ });
795
+
796
+ // functions/idb/tools/db.delete.ts
797
+ var db_delete_exports = {};
798
+ var init_db_delete = __esm({
799
+ "functions/idb/tools/db.delete.ts"() {
800
+ init_cjs_shims();
801
+ init_idb();
802
+ init_message();
803
+ exports.idb.db.delete = (storeName) => {
804
+ return new Promise((resolve, reject) => {
805
+ message_default(`Removing database ${storeName}...`);
806
+ const performDelete = /* @__PURE__ */ __name(() => {
807
+ const request = indexedDB.deleteDatabase(storeName);
808
+ request.onsuccess = () => {
809
+ message_default(`${storeName} database removed successfully`);
810
+ exports.idb.db.list();
811
+ resolve();
812
+ };
813
+ request.onerror = () => {
814
+ console.error(`Error removing ${storeName}:`, request.error);
815
+ reject(request.error);
816
+ };
817
+ request.onblocked = () => {
818
+ console.warn(`Deletion of ${storeName} is blocked. Please close other tabs.`);
819
+ };
820
+ }, "performDelete");
821
+ performDelete();
822
+ });
823
+ };
824
+ }
825
+ });
826
+
827
+ // functions/idb/tools/db.size.ts
828
+ var db_size_exports = {};
829
+ var init_db_size = __esm({
830
+ "functions/idb/tools/db.size.ts"() {
831
+ init_cjs_shims();
832
+ init_idb();
833
+ init_message();
834
+ exports.idb.db.size = async () => {
835
+ if (!idbases || idbases.length === 0) return;
836
+ for (let i = 0; i < idbases.length; i++) {
837
+ const dbInfo = idbases[i];
838
+ try {
839
+ const db = await exports.idb.db.create(dbInfo.name, dbInfo.version);
840
+ const tableNames = Array.from(db.objectStoreNames);
841
+ let totalDbSize = 0;
842
+ for (const tableName of tableNames) {
843
+ const tableSize = await exports.idb.table.size(db, tableName);
844
+ totalDbSize += tableSize;
845
+ }
846
+ dbInfo.size = totalDbSize;
847
+ db.close();
848
+ } catch (err) {
849
+ message_default(`Could not calculate size for ${dbInfo.name}:${err}`);
850
+ }
851
+ }
852
+ };
853
+ }
854
+ });
855
+
856
+ // functions/idb/tools/db.version.ts
857
+ var db_version_exports = {};
858
+ var init_db_version = __esm({
859
+ "functions/idb/tools/db.version.ts"() {
860
+ init_cjs_shims();
861
+ init_idb();
862
+ exports.idb.db.version = (storeName) => {
863
+ let idbVer = 0;
864
+ for (const v of idbases) {
865
+ if (v.name === storeName) idbVer = v.version;
866
+ break;
867
+ }
868
+ return idbVer;
869
+ };
870
+ }
871
+ });
872
+
873
+ // functions/idb/tools/db.support.ts
874
+ var db_support_exports = {};
875
+ var init_db_support = __esm({
876
+ "functions/idb/tools/db.support.ts"() {
877
+ init_cjs_shims();
878
+ init_idb();
879
+ init_message();
880
+ exports.idb.db.support = () => {
881
+ const isSupported = "indexedDB" in globalThis;
882
+ if (!isSupported) {
883
+ message_default("Your environment doesn't support IndexedDB");
884
+ }
885
+ return isSupported;
886
+ };
887
+ }
888
+ });
889
+
890
+ // functions/idb/tools/table.create.ts
891
+ var table_create_exports = {};
892
+ var init_table_create = __esm({
893
+ "functions/idb/tools/table.create.ts"() {
894
+ init_cjs_shims();
895
+ init_idb();
896
+ init_message();
897
+ exports.idb.table.create = (dbName, dbTable) => {
898
+ return new Promise((resolve, reject) => {
899
+ try {
900
+ const currentVersion = Number(exports.idb.db.version(dbName)) || 0;
901
+ const nextVersion = currentVersion + 1;
902
+ const request = indexedDB.open(dbName, nextVersion);
903
+ request.onupgradeneeded = (e) => {
904
+ const db = e.target.result;
905
+ if (!db.objectStoreNames.contains(dbTable)) {
906
+ const store2 = db.createObjectStore(dbTable, {
907
+ keyPath: "id",
908
+ autoIncrement: true
909
+ });
910
+ store2.createIndex("id", "id", { unique: true });
911
+ store2.createIndex("data", "data", { unique: false });
912
+ message_default(`Table ${dbTable} created in ${dbName}`);
913
+ }
914
+ };
915
+ request.onsuccess = () => {
916
+ request.result.close();
917
+ exports.idb.db.list();
918
+ resolve();
919
+ };
920
+ request.onerror = () => {
921
+ console.error(`Error creating table ${dbTable}:`, request.error);
922
+ reject(request.error);
923
+ };
924
+ } catch (err) {
925
+ console.error("Critical error in table.create:", err);
926
+ reject(err);
927
+ }
928
+ });
929
+ };
930
+ }
931
+ });
932
+
933
+ // functions/idb/tools/table.size.ts
934
+ var table_size_exports = {};
935
+ var init_table_size = __esm({
936
+ "functions/idb/tools/table.size.ts"() {
937
+ init_cjs_shims();
938
+ init_idb();
939
+ init_message();
940
+ exports.idb.table.size = (db, table) => {
941
+ return new Promise((resolve, reject) => {
942
+ if (!db) return reject(new Error("Database instance is required"));
943
+ if (!db.objectStoreNames.contains(table)) return resolve(0);
944
+ let size = 0;
945
+ let count = 0;
946
+ const transaction = db.transaction([table], "readonly");
947
+ const store2 = transaction.objectStore(table);
948
+ const request = store2.openCursor();
949
+ request.onsuccess = async (event) => {
950
+ const cursor = event.target.result;
951
+ if (cursor) {
952
+ try {
953
+ const value = cursor.value;
954
+ size += JSON.stringify(value).length;
955
+ } catch (err) {
956
+ message_default(`Error stringifying IDB value tracking size:${err}`);
957
+ }
958
+ count++;
959
+ if (count % 200 === 0) {
960
+ await new Promise((resolve2) => setTimeout(resolve2, 0));
961
+ }
962
+ cursor.continue();
963
+ } else {
964
+ resolve(size);
965
+ }
966
+ };
967
+ request.onerror = () => {
968
+ reject(request.error);
969
+ };
970
+ });
971
+ };
972
+ }
973
+ });
974
+
975
+ // functions/idb/crud/data.delete.ts
976
+ var data_delete_exports = {};
977
+ var init_data_delete = __esm({
978
+ "functions/idb/crud/data.delete.ts"() {
979
+ init_cjs_shims();
980
+ init_idb();
981
+ init_message();
982
+ exports.idb.data.delete = (storeName, table, key) => {
983
+ return new Promise((resolve, reject) => {
984
+ const request = indexedDB.open(storeName);
985
+ request.onsuccess = () => {
986
+ const db = request.result;
987
+ if (!db.objectStoreNames.contains(table)) {
988
+ db.close();
989
+ return reject(new Error(`Table ${table} not found`));
990
+ }
991
+ const transaction = db.transaction(table, "readwrite");
992
+ const objectStore = transaction.objectStore(table);
993
+ const deleteRequest = objectStore.delete(key);
994
+ deleteRequest.onsuccess = () => {
995
+ db.close();
996
+ message_default(`Record ${key} deleted from ${table}`);
997
+ resolve();
998
+ };
999
+ deleteRequest.onerror = () => {
1000
+ db.close();
1001
+ reject(deleteRequest.error);
1002
+ };
1003
+ };
1004
+ request.onerror = () => reject(request.error);
1005
+ });
1006
+ };
1007
+ exports.idb.data.delete.all = (storeName, table) => {
1008
+ return new Promise((resolve, reject) => {
1009
+ const request = indexedDB.open(storeName);
1010
+ request.onsuccess = (event) => {
1011
+ const db = event.target.result;
1012
+ if (!db.objectStoreNames.contains(table)) {
1013
+ db.close();
1014
+ return reject(new Error(`Table ${table} not found`));
1015
+ }
1016
+ const transaction = db.transaction(table, "readwrite");
1017
+ const store2 = transaction.objectStore(table);
1018
+ const clearRequest = store2.clear();
1019
+ clearRequest.onsuccess = () => {
1020
+ db.close();
1021
+ message_default(`All data cleared from ${table}`);
1022
+ resolve();
1023
+ };
1024
+ clearRequest.onerror = () => {
1025
+ db.close();
1026
+ reject(clearRequest.error);
1027
+ };
1028
+ };
1029
+ request.onerror = () => reject(request.error);
1030
+ });
1031
+ };
1032
+ }
1033
+ });
1034
+
1035
+ // functions/idb/crud/data.set.ts
1036
+ var data_set_exports = {};
1037
+ var init_data_set = __esm({
1038
+ "functions/idb/crud/data.set.ts"() {
1039
+ init_cjs_shims();
1040
+ init_idb();
1041
+ init_message();
1042
+ exports.idb.data.set = (storeName, table, value) => {
1043
+ return new Promise((resolve, reject) => {
1044
+ const request = indexedDB.open(storeName);
1045
+ request.onsuccess = () => {
1046
+ const db = request.result;
1047
+ if (!db.objectStoreNames.contains(table)) {
1048
+ db.close();
1049
+ return reject(new Error(`Table ${table} does not exist in ${storeName}`));
1050
+ }
1051
+ const transaction = db.transaction(table, "readwrite");
1052
+ const objectStore = transaction.objectStore(table);
1053
+ const putRequest = objectStore.put(value);
1054
+ putRequest.onsuccess = () => {
1055
+ db.close();
1056
+ message_default(`Data saved in ${storeName}.${table}`);
1057
+ resolve(putRequest.result);
1058
+ };
1059
+ putRequest.onerror = (_) => {
1060
+ db.close();
1061
+ message_default(`Database insert error: ${putRequest.error?.message}`);
1062
+ reject(putRequest.error);
1063
+ };
1064
+ };
1065
+ request.onerror = () => {
1066
+ reject(request.error);
1067
+ };
1068
+ });
1069
+ };
1070
+ }
1071
+ });
1072
+
1073
+ // functions/idb/crud/data.get.ts
1074
+ var data_get_exports = {};
1075
+ var init_data_get = __esm({
1076
+ "functions/idb/crud/data.get.ts"() {
1077
+ init_cjs_shims();
1078
+ init_idb();
1079
+ exports.idb.data.get = (storeName, table, key) => {
1080
+ return new Promise((resolve, reject) => {
1081
+ const request = indexedDB.open(storeName);
1082
+ request.onsuccess = (event) => {
1083
+ const db = event.target.result;
1084
+ if (!db.objectStoreNames.contains(table)) {
1085
+ db.close();
1086
+ return reject(new Error(`Table ${table} not found in ${storeName}`));
1087
+ }
1088
+ const transaction = db.transaction(table, "readonly");
1089
+ const store2 = transaction.objectStore(table);
1090
+ const getRequest = store2.get(key);
1091
+ getRequest.onsuccess = () => {
1092
+ db.close();
1093
+ resolve(getRequest.result);
1094
+ };
1095
+ getRequest.onerror = () => {
1096
+ db.close();
1097
+ reject(getRequest.error);
1098
+ };
1099
+ };
1100
+ request.onerror = () => {
1101
+ reject(request.error);
1102
+ };
1103
+ });
1104
+ };
1105
+ }
1106
+ });
1107
+
1108
+ // functions/idb/index.ts
1109
+ var _hasIDB; exports.idb = void 0;
1110
+ var init_idb = __esm({
1111
+ "functions/idb/index.ts"() {
1112
+ init_cjs_shims();
1113
+ init_platform();
1114
+ init_env();
1115
+ _hasIDB = hasIndexedDB();
1116
+ exports.idb = {
1117
+ db: {},
1118
+ table: {},
1119
+ data: {}
1120
+ };
1121
+ if (_hasIDB) {
1122
+ (async () => {
1123
+ Object.defineProperty(exports.idb, "db", { value: {}, writable: true, configurable: true });
1124
+ Object.defineProperty(exports.idb, "table", { value: {}, writable: true, configurable: true });
1125
+ Object.defineProperty(exports.idb, "data", { value: {}, writable: true, configurable: true });
1126
+ Object.defineProperty(globalThis, "idbases", {
1127
+ value: [],
1128
+ writable: true,
1129
+ configurable: true,
1130
+ enumerable: false
1131
+ });
1132
+ await Promise.all([
1133
+ Promise.resolve().then(() => (init_db_create(), db_create_exports)),
1134
+ Promise.resolve().then(() => (init_db_list(), db_list_exports)),
1135
+ Promise.resolve().then(() => (init_db_exist(), db_exist_exports)),
1136
+ Promise.resolve().then(() => (init_db_quota(), db_quota_exports)),
1137
+ Promise.resolve().then(() => (init_db_delete(), db_delete_exports)),
1138
+ Promise.resolve().then(() => (init_db_size(), db_size_exports)),
1139
+ Promise.resolve().then(() => (init_db_version(), db_version_exports)),
1140
+ Promise.resolve().then(() => (init_db_support(), db_support_exports)),
1141
+ Promise.resolve().then(() => (init_table_create(), table_create_exports)),
1142
+ Promise.resolve().then(() => (init_table_size(), table_size_exports)),
1143
+ Promise.resolve().then(() => (init_data_delete(), data_delete_exports)),
1144
+ Promise.resolve().then(() => (init_data_set(), data_set_exports)),
1145
+ Promise.resolve().then(() => (init_data_get(), data_get_exports))
1146
+ ]);
1147
+ Object.preventExtensions(exports.idb);
1148
+ Object.seal(exports.idb);
1149
+ Object.freeze(exports.idb);
1150
+ })();
1151
+ } else {
1152
+ exports.idb._disabled = true;
1153
+ exports.idb._warning = "IndexedDB is not available in this environment (Node.js/Deno). Use store or session for persistence.";
1154
+ if (exports.DEV) {
1155
+ console.warn("Memorio IDB: IndexedDB is not available in this environment. Use store or session for data persistence.");
1156
+ }
1157
+ }
1158
+ }
1159
+ });
1160
+
1161
+ // functions/sqlite/tools/db.support.ts
1162
+ var db_support_exports2 = {};
1163
+ function _inDocument() {
1164
+ const g3 = globalThis;
1165
+ return typeof g3.document !== "undefined" && typeof g3.document.createElement === "function";
1166
+ }
1167
+ function _loadSqlJsScript(url) {
1168
+ const g3 = globalThis;
1169
+ if (g3.__memorioSqlJsScript === url) return Promise.resolve();
1170
+ if (!_scriptLoaded) {
1171
+ _scriptLoaded = new Promise((resolve, reject) => {
1172
+ if (g3.initSqlJs && typeof g3.initSqlJs === "function") {
1173
+ g3.__memorioSqlJsScript = url;
1174
+ resolve();
1175
+ return;
1176
+ }
1177
+ if (!_inDocument()) {
1178
+ reject(new Error("memorio sqlite: no document available to load sql.js"));
1179
+ return;
1180
+ }
1181
+ const script = g3.document.createElement("script");
1182
+ script.src = url;
1183
+ script.async = true;
1184
+ script.onload = () => {
1185
+ g3.__memorioSqlJsScript = url;
1186
+ resolve();
1187
+ };
1188
+ script.onerror = () => reject(new Error(`memorio sqlite: failed to load sql.js from ${url}`));
1189
+ g3.document.head.appendChild(script);
1190
+ });
1191
+ }
1192
+ return _scriptLoaded;
1193
+ }
1194
+ var _loading, _SQL, _defaultLocateFile, _scriptLoaded, _loadSqlJsFromCdn;
1195
+ var init_db_support2 = __esm({
1196
+ "functions/sqlite/tools/db.support.ts"() {
1197
+ init_cjs_shims();
1198
+ init_sqlite();
1199
+ init_platform();
1200
+ init_message();
1201
+ _loading = null;
1202
+ _SQL = null;
1203
+ _defaultLocateFile = /* @__PURE__ */ __name((file) => {
1204
+ const g3 = globalThis;
1205
+ const base = g3.sqliteWasmBase || "";
1206
+ return base + file;
1207
+ }, "_defaultLocateFile");
1208
+ _scriptLoaded = null;
1209
+ __name(_inDocument, "_inDocument");
1210
+ __name(_loadSqlJsScript, "_loadSqlJsScript");
1211
+ _loadSqlJsFromCdn = /* @__PURE__ */ __name(async (url) => {
1212
+ const g3 = globalThis;
1213
+ if (!url) {
1214
+ throw new Error('memorio sqlite: no loader configured. Install sql.js (npm i sql.js) and pass a loader via sqlite.config({ loader: () => import("sql.js") }).');
1215
+ }
1216
+ if (typeof g3.initSqlJs === "function") return g3.initSqlJs;
1217
+ await _loadSqlJsScript(url);
1218
+ return g3.initSqlJs || g3;
1219
+ }, "_loadSqlJsFromCdn");
1220
+ exports.sqlite.db.support = () => {
1221
+ return hasSqlJs();
1222
+ };
1223
+ exports.sqlite.db.getSQL = async () => {
1224
+ if (_SQL) return _SQL;
1225
+ if (_loading) return _loading;
1226
+ const g3 = globalThis;
1227
+ const cfg = g3.sqliteConfig || {};
1228
+ const p = (async () => {
1229
+ if (typeof cfg.loader === "function") {
1230
+ return await cfg.loader();
1231
+ }
1232
+ if (cfg.scriptUrl) {
1233
+ const mod = await _loadSqlJsFromCdn(cfg.scriptUrl);
1234
+ const initSqlJs = typeof mod === "function" ? mod : mod && (mod.default || mod);
1235
+ const SQL = await initSqlJs({ locateFile: cfg.locateFile || _defaultLocateFile });
1236
+ g3.sqliteVersion = SQL?.version || "sql.js";
1237
+ message_default("Memorio SQLite: sql.js engine loaded");
1238
+ return SQL;
1239
+ }
1240
+ throw new Error('memorio sqlite: no loader configured. Install sql.js (npm i sql.js) and pass a loader via sqlite.config({ loader: () => import("sql.js") }).');
1241
+ })();
1242
+ _loading = p;
1243
+ try {
1244
+ _SQL = await p;
1245
+ return _SQL;
1246
+ } catch (err) {
1247
+ try {
1248
+ exports.sqlite._disabled = true;
1249
+ } catch (_) {
1250
+ }
1251
+ try {
1252
+ exports.sqlite._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>() }).";
1253
+ } catch (_) {
1254
+ }
1255
+ console.warn("Memorio SQLite: failed to load sql.js", err);
1256
+ throw err;
1257
+ } finally {
1258
+ _loading = null;
1259
+ }
1260
+ };
1261
+ exports.sqlite.db.version = () => {
1262
+ return globalThis.sqliteVersion || null;
1263
+ };
1264
+ }
1265
+ });
1266
+
1267
+ // functions/sqlite/tools/persist.ts
1268
+ function _ns() {
1269
+ const cfg = g.sqliteConfig || {};
1270
+ return cfg.namespace ? `ns:${cfg.namespace}` : "default";
1271
+ }
1272
+ function _key(name) {
1273
+ return `memorio:sqlite:db:${_ns()}:${name}`;
1274
+ }
1275
+ function _b64encode(buf) {
1276
+ const bytes = buf instanceof Uint8Array ? buf : new Uint8Array(buf);
1277
+ let binary = "";
1278
+ const len = bytes.byteLength;
1279
+ for (let i = 0; i < len; i++) binary += String.fromCharCode(bytes[i]);
1280
+ if (typeof btoa === "function") return btoa(binary);
1281
+ return typeof Buffer !== "undefined" ? Buffer.from(bytes).toString("base64") : "";
1282
+ }
1283
+ function _b64decode(b64) {
1284
+ if (typeof Buffer !== "undefined") {
1285
+ return new Uint8Array(Buffer.from(b64, "base64"));
1286
+ }
1287
+ if (typeof atob !== "function") {
1288
+ throw new Error("memorio sqlite: no base64 decoder available");
1289
+ }
1290
+ const binary = atob(b64);
1291
+ const len = binary.length;
1292
+ const out = new Uint8Array(len);
1293
+ for (let i = 0; i < len; i++) out[i] = binary.charCodeAt(i);
1294
+ return out;
1295
+ }
1296
+ function saveSnapshot(name) {
1297
+ return new Promise((resolve) => {
1298
+ const db = g.__sqliteDbs && g.__sqliteDbs[name];
1299
+ if (!db || typeof db.export !== "function") {
1300
+ resolve(false);
1301
+ return;
1302
+ }
1303
+ try {
1304
+ const blob = db.export();
1305
+ exports.store.set(_key(name), _b64encode(blob));
1306
+ message_default(`Memorio SQLite: persisted '${name}' to store`);
1307
+ resolve(true);
1308
+ } catch (err) {
1309
+ console.warn("Memorio SQLite: persist snapshot failed", err);
1310
+ resolve(false);
1311
+ }
1312
+ });
1313
+ }
1314
+ function loadSnapshot(name) {
1315
+ const b64 = exports.store.get(_key(name));
1316
+ if (!b64) return null;
1317
+ try {
1318
+ return _b64decode(b64);
1319
+ } catch {
1320
+ return null;
1321
+ }
1322
+ }
1323
+ function removeSnapshot(name) {
1324
+ exports.store.remove(_key(name));
1325
+ }
1326
+ function attachAutoExport(name, db) {
1327
+ if (!db || typeof db.updateHook !== "function") return;
1328
+ _persistDbs[name] = true;
1329
+ try {
1330
+ db.updateHook(() => {
1331
+ if (_exportTimers[name]) clearTimeout(_exportTimers[name]);
1332
+ _exportTimers[name] = setTimeout(() => {
1333
+ _exportTimers[name] = null;
1334
+ void saveSnapshot(name);
1335
+ }, 250);
1336
+ });
1337
+ } catch (err) {
1338
+ console.warn("Memorio SQLite: could not attach updateHook", err);
1339
+ }
1340
+ }
1341
+ var g, _persistDbs, _exportTimers;
1342
+ var init_persist = __esm({
1343
+ "functions/sqlite/tools/persist.ts"() {
1344
+ init_cjs_shims();
1345
+ init_sqlite();
1346
+ init_store();
1347
+ init_message();
1348
+ g = globalThis;
1349
+ _persistDbs = {};
1350
+ _exportTimers = {};
1351
+ __name(_ns, "_ns");
1352
+ __name(_key, "_key");
1353
+ __name(_b64encode, "_b64encode");
1354
+ __name(_b64decode, "_b64decode");
1355
+ __name(saveSnapshot, "saveSnapshot");
1356
+ __name(loadSnapshot, "loadSnapshot");
1357
+ __name(removeSnapshot, "removeSnapshot");
1358
+ __name(attachAutoExport, "attachAutoExport");
1359
+ exports.sqlite.db.persist = async (name = "memorio") => {
1360
+ return saveSnapshot(name);
1361
+ };
1362
+ exports.sqlite.db.download = async (name = "memorio", filename = `${name}.sqlite`) => {
1363
+ const g3 = globalThis;
1364
+ const db = g3.__sqliteDbs && g3.__sqliteDbs[name];
1365
+ if (!db) {
1366
+ console.warn(`Memorio SQLite: cannot download '${name}' - database not found. Create it with sqlite.db.create('${name}').`);
1367
+ return false;
1368
+ }
1369
+ let blob;
1370
+ try {
1371
+ blob = await exports.sqlite.db.export(name);
1372
+ } catch (err) {
1373
+ console.warn("Memorio SQLite: export failed during download", err);
1374
+ return false;
1375
+ }
1376
+ if (!blob) return false;
1377
+ if (typeof g3.document === "undefined" || typeof g3.Blob === "undefined") {
1378
+ console.warn("Memorio SQLite: sqlite.db.download() requires a browser environment.");
1379
+ return false;
1380
+ }
1381
+ const URL2 = g3.URL || g3.webkitURL;
1382
+ if (!URL2 || typeof URL2.createObjectURL !== "function") return false;
1383
+ const objectUrl = URL2.createObjectURL(new Blob([blob], { type: "application/x-sqlite3" }));
1384
+ const a = g3.document.createElement("a");
1385
+ a.style.display = "none";
1386
+ a.href = objectUrl;
1387
+ a.download = filename;
1388
+ g3.document.body.appendChild(a);
1389
+ a.click();
1390
+ setTimeout(() => {
1391
+ try {
1392
+ URL2.revokeObjectURL(objectUrl);
1393
+ } catch (_) {
1394
+ }
1395
+ a.remove();
1396
+ }, 1e3);
1397
+ return true;
1398
+ };
1399
+ exports.sqlite.db.close = async (name = "memorio") => {
1400
+ const db = g.__sqliteDbs && g.__sqliteDbs[name];
1401
+ if (db && typeof db.close === "function") {
1402
+ try {
1403
+ await saveSnapshot(name);
1404
+ } catch (_) {
1405
+ }
1406
+ try {
1407
+ db.close();
1408
+ } catch (err) {
1409
+ console.warn("Memorio SQLite: close failed", err);
1410
+ }
1411
+ }
1412
+ if (g.__sqliteDbs) delete g.__sqliteDbs[name];
1413
+ if (g.sqlbases) {
1414
+ const idx = g.sqlbases.findIndex((x) => x && x.name === name);
1415
+ if (idx > -1) g.sqlbases.splice(idx, 1);
1416
+ }
1417
+ delete _persistDbs[name];
1418
+ if (_exportTimers[name]) {
1419
+ clearTimeout(_exportTimers[name]);
1420
+ _exportTimers[name] = null;
1421
+ }
1422
+ removeSnapshot(name);
1423
+ };
1424
+ exports.sqlite.db.loadSnapshot = loadSnapshot;
1425
+ exports.sqlite.db.saveSnapshot = saveSnapshot;
1426
+ }
1427
+ });
1428
+
1429
+ // functions/sqlite/tools/db.create.ts
1430
+ var db_create_exports2 = {};
1431
+ var init_db_create2 = __esm({
1432
+ "functions/sqlite/tools/db.create.ts"() {
1433
+ init_cjs_shims();
1434
+ init_sqlite();
1435
+ init_message();
1436
+ init_persist();
1437
+ exports.sqlite.db.create = async (name = "memorio", opts = {}) => {
1438
+ const SQL = await exports.sqlite.db.getSQL();
1439
+ const g3 = globalThis;
1440
+ const persistence = !!(opts && opts.persistence) || !!(g3.sqliteConfig && g3.sqliteConfig.persistence);
1441
+ let data;
1442
+ if (persistence && !opts.data) {
1443
+ const restored = loadSnapshot(name);
1444
+ if (restored) data = restored;
1445
+ }
1446
+ const useData = opts && opts.data || data;
1447
+ let db;
1448
+ if (useData && typeof useData.byteLength === "number") {
1449
+ db = new SQL.Database(useData);
1450
+ message_default(`Memorio SQLite: database '${name}' opened (persistence=${persistence})`);
1451
+ } else {
1452
+ db = new SQL.Database();
1453
+ message_default(`Memorio SQLite: database '${name}' created (persistence=${persistence})`);
1454
+ }
1455
+ const createOpts = { ...opts, persistence };
1456
+ if (!g3.__sqliteDbs) g3.__sqliteDbs = {};
1457
+ g3.__sqliteDbs[name] = db;
1458
+ if (!g3.sqlbases) g3.sqlbases = [];
1459
+ const idx = g3.sqlbases.findIndex((x) => x && x.name === name);
1460
+ if (idx > -1) {
1461
+ g3.sqlbases[idx] = { name, db, persistence: createOpts.persistence };
1462
+ } else {
1463
+ g3.sqlbases.push({ name, db, persistence: createOpts.persistence });
1464
+ }
1465
+ if (persistence) attachAutoExport(name, db);
1466
+ return db;
1467
+ };
1468
+ }
1469
+ });
1470
+
1471
+ // functions/sqlite/tools/db.get.ts
1472
+ var db_get_exports = {};
1473
+ var init_db_get = __esm({
1474
+ "functions/sqlite/tools/db.get.ts"() {
1475
+ init_cjs_shims();
1476
+ init_sqlite();
1477
+ exports.sqlite.db.get = (name = "memorio") => {
1478
+ const dbs = globalThis.__sqliteDbs;
1479
+ if (!dbs || !dbs[name]) {
1480
+ throw new Error(
1481
+ `SQLite database '${name}' does not exist. Create it with sqlite.db.create('${name}').`
1482
+ );
1483
+ }
1484
+ return dbs[name];
1485
+ };
1486
+ }
1487
+ });
1488
+
1489
+ // functions/sqlite/tools/db.delete.ts
1490
+ var db_delete_exports2 = {};
1491
+ var init_db_delete2 = __esm({
1492
+ "functions/sqlite/tools/db.delete.ts"() {
1493
+ init_cjs_shims();
1494
+ init_sqlite();
1495
+ init_message();
1496
+ exports.sqlite.db.delete = (name) => {
1497
+ const dbs = globalThis.__sqliteDbs;
1498
+ if (!dbs || !dbs[name]) return false;
1499
+ try {
1500
+ dbs[name].close();
1501
+ } catch (_) {
1502
+ }
1503
+ delete dbs[name];
1504
+ const g3 = globalThis;
1505
+ if (g3.sqlbases) g3.sqlbases = g3.sqlbases.filter((x) => x && x.name !== name);
1506
+ message_default(`Memorio SQLite: database '${name}' deleted`);
1507
+ return true;
1508
+ };
1509
+ }
1510
+ });
1511
+
1512
+ // functions/sqlite/tools/db.list.ts
1513
+ var db_list_exports2 = {};
1514
+ var init_db_list2 = __esm({
1515
+ "functions/sqlite/tools/db.list.ts"() {
1516
+ init_cjs_shims();
1517
+ init_sqlite();
1518
+ exports.sqlite.db.list = () => {
1519
+ const dbs = globalThis.__sqliteDbs;
1520
+ return dbs ? Object.keys(dbs) : [];
1521
+ };
1522
+ }
1523
+ });
1524
+
1525
+ // functions/sqlite/tools/db.size.ts
1526
+ var db_size_exports2 = {};
1527
+ var init_db_size2 = __esm({
1528
+ "functions/sqlite/tools/db.size.ts"() {
1529
+ init_cjs_shims();
1530
+ init_sqlite();
1531
+ exports.sqlite.db.size = async (name) => {
1532
+ const dbs = globalThis.__sqliteDbs;
1533
+ if (!dbs) return 0;
1534
+ const _bytes = /* @__PURE__ */ __name((b) => b ? b.byteLength || b.length || 0 : 0, "_bytes");
1535
+ if (name) {
1536
+ const db = exports.sqlite.db.get(name);
1537
+ return _bytes(db.export());
1538
+ }
1539
+ let total = 0;
1540
+ for (const n of Object.keys(dbs)) {
1541
+ try {
1542
+ total += _bytes(dbs[n].export());
1543
+ } catch (_) {
1544
+ }
1545
+ }
1546
+ return total;
1547
+ };
1548
+ }
1549
+ });
1550
+
1551
+ // functions/sqlite/tools/db.export.ts
1552
+ var db_export_exports = {};
1553
+ var init_db_export = __esm({
1554
+ "functions/sqlite/tools/db.export.ts"() {
1555
+ init_cjs_shims();
1556
+ init_sqlite();
1557
+ exports.sqlite.db.export = async (name = "memorio") => {
1558
+ const db = exports.sqlite.db.get(name);
1559
+ return db.export();
1560
+ };
1561
+ }
1562
+ });
1563
+
1564
+ // functions/sqlite/tools/db.import.ts
1565
+ var db_import_exports = {};
1566
+ var init_db_import = __esm({
1567
+ "functions/sqlite/tools/db.import.ts"() {
1568
+ init_cjs_shims();
1569
+ init_sqlite();
1570
+ exports.sqlite.db.import = async (name, data) => {
1571
+ return exports.sqlite.db.create(name, { data });
1572
+ };
1573
+ }
1574
+ });
1575
+
1576
+ // functions/sqlite/crud/query.run.ts
1577
+ var query_run_exports = {};
1578
+ var init_query_run = __esm({
1579
+ "functions/sqlite/crud/query.run.ts"() {
1580
+ init_cjs_shims();
1581
+ init_sqlite();
1582
+ init_message();
1583
+ exports.sqlite.query.run = async (name = "memorio", sql, params = []) => {
1584
+ const db = exports.sqlite.db.get(name);
1585
+ message_default(`Memorio SQLite: run -> ${sql}`);
1586
+ db.run(sql, params);
1587
+ return db.getRowsModified();
1588
+ };
1589
+ }
1590
+ });
1591
+
1592
+ // functions/sqlite/crud/query.select.ts
1593
+ var query_select_exports = {};
1594
+ var init_query_select = __esm({
1595
+ "functions/sqlite/crud/query.select.ts"() {
1596
+ init_cjs_shims();
1597
+ init_sqlite();
1598
+ exports.sqlite.query.select = async (name = "memorio", sql, params = []) => {
1599
+ const db = exports.sqlite.db.get(name);
1600
+ const stmt = db.prepare(sql, params);
1601
+ const result = [];
1602
+ try {
1603
+ while (stmt.step()) {
1604
+ result.push(stmt.getAsObject());
1605
+ }
1606
+ } finally {
1607
+ try {
1608
+ stmt.free();
1609
+ } catch (_) {
1610
+ }
1611
+ }
1612
+ return result;
1613
+ };
1614
+ }
1615
+ });
1616
+
1617
+ // functions/sqlite/crud/data.set.ts
1618
+ var data_set_exports2 = {};
1619
+ var init_data_set2 = __esm({
1620
+ "functions/sqlite/crud/data.set.ts"() {
1621
+ init_cjs_shims();
1622
+ init_sqlite();
1623
+ exports.sqlite.data.set = async (name = "memorio", sql, params = []) => {
1624
+ return exports.sqlite.query.run(name, sql, params);
1625
+ };
1626
+ }
1627
+ });
1628
+
1629
+ // functions/sqlite/crud/data.get.ts
1630
+ var data_get_exports2 = {};
1631
+ var init_data_get2 = __esm({
1632
+ "functions/sqlite/crud/data.get.ts"() {
1633
+ init_cjs_shims();
1634
+ init_sqlite();
1635
+ exports.sqlite.data.get = async (name = "memorio", sql, params = []) => {
1636
+ const rows = await exports.sqlite.query.select(name, sql, params);
1637
+ return rows.length ? rows[0] : null;
1638
+ };
1639
+ }
1640
+ });
1641
+
1642
+ // functions/sqlite/index.ts
1643
+ var _hasSqlJs; exports.sqlite = void 0;
1644
+ var init_sqlite = __esm({
1645
+ "functions/sqlite/index.ts"() {
1646
+ init_cjs_shims();
1647
+ init_platform();
1648
+ init_env();
1649
+ _hasSqlJs = hasSqlJs();
1650
+ exports.sqlite = {
1651
+ db: {},
1652
+ query: {},
1653
+ data: {}
1654
+ };
1655
+ exports.sqlite.config = (opts) => {
1656
+ const g3 = globalThis;
1657
+ g3.sqliteConfig = { ...g3.sqliteConfig, ...opts };
1658
+ if (opts && opts.wasmUrl) {
1659
+ g3.sqliteWasmBase = opts.wasmUrl.endsWith("/") ? opts.wasmUrl : opts.wasmUrl + "/";
1660
+ }
1661
+ return exports.sqlite;
1662
+ };
1663
+ Object.defineProperty(exports.sqlite, "ready", {
1664
+ enumerable: false,
1665
+ configurable: false,
1666
+ get: /* @__PURE__ */ __name(() => {
1667
+ const g3 = globalThis;
1668
+ if (!g3.sqliteReady) {
1669
+ g3.sqliteReady = typeof exports.sqlite.db.getSQL === "function" ? exports.sqlite.db.getSQL().then(() => {
1670
+ }).catch(() => {
1671
+ }) : Promise.resolve();
1672
+ }
1673
+ return g3.sqliteReady;
1674
+ }, "get")
1675
+ });
1676
+ if (_hasSqlJs) {
1677
+ (async () => {
1678
+ Object.defineProperty(exports.sqlite, "db", { value: {}, writable: false, configurable: true, enumerable: true });
1679
+ Object.defineProperty(exports.sqlite, "query", { value: {}, writable: false, configurable: true, enumerable: true });
1680
+ Object.defineProperty(exports.sqlite, "data", { value: {}, writable: false, configurable: true, enumerable: true });
1681
+ Object.defineProperty(globalThis, "sqlbases", {
1682
+ value: [],
1683
+ writable: true,
1684
+ configurable: true,
1685
+ enumerable: false
1686
+ });
1687
+ await Promise.all([
1688
+ Promise.resolve().then(() => (init_db_support2(), db_support_exports2)),
1689
+ Promise.resolve().then(() => (init_db_create2(), db_create_exports2)),
1690
+ Promise.resolve().then(() => (init_db_get(), db_get_exports)),
1691
+ Promise.resolve().then(() => (init_db_delete2(), db_delete_exports2)),
1692
+ Promise.resolve().then(() => (init_db_list2(), db_list_exports2)),
1693
+ Promise.resolve().then(() => (init_db_size2(), db_size_exports2)),
1694
+ Promise.resolve().then(() => (init_db_export(), db_export_exports)),
1695
+ Promise.resolve().then(() => (init_db_import(), db_import_exports)),
1696
+ Promise.resolve().then(() => (init_query_run(), query_run_exports)),
1697
+ Promise.resolve().then(() => (init_query_select(), query_select_exports)),
1698
+ Promise.resolve().then(() => (init_data_set2(), data_set_exports2)),
1699
+ Promise.resolve().then(() => (init_data_get2(), data_get_exports2))
1700
+ ]);
1701
+ })();
1702
+ } else {
1703
+ exports.sqlite._disabled = true;
1704
+ exports.sqlite._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.';
1705
+ if (exports.DEV) {
1706
+ globalThis.sqliteDisabled = true;
1707
+ globalThis.sqliteWarning = exports.sqlite._warning;
1708
+ console.warn("Memorio SQLite: sql.js is not available in this environment (requires browser + WebAssembly). Use store or session for persistence.");
1709
+ }
1710
+ }
1711
+ }
1712
+ });
1713
+
1714
+ // index.ts
1715
+ init_cjs_shims();
1716
+ init_env();
1717
+
1718
+ // functions/state/index.ts
1719
+ init_cjs_shims();
1720
+ init_internal();
1721
+ init_message();
1722
+
1723
+ // core/dispatch.ts
1724
+ init_cjs_shims();
1725
+ var dispatch = {
1726
+ /**
1727
+ * Dispatches a custom event with the specified name and value.
1728
+ * @param name The name of the event.
1729
+ * @param value The value to pass with the event.
1730
+ */
1731
+ set: /* @__PURE__ */ __name((name, value = {}) => {
1732
+ globalThis.dispatchEvent(new CustomEvent(String(name), value));
1733
+ }, "set"),
1734
+ ///
1735
+ /**
1736
+ * Listens for the specified event names and executes the callback when the event is triggered.
1737
+ * @param name The name of the event to listen for.
1738
+ * @param cb The callback function to execute when the event is triggered.
1739
+ */
1740
+ listen: /* @__PURE__ */ __name((name, cb = null, _flag) => {
1741
+ if (globalThis.events?.[name]) return;
1742
+ const exec = cb ? (e) => {
1743
+ const target = e;
1744
+ return globalThis.queueMicrotask ? globalThis.queueMicrotask(() => cb(target)) : Promise.resolve().then(() => cb(target));
1745
+ } : void 0;
1746
+ if (exec) globalThis.addEventListener(name, exec);
1747
+ if (exec) globalThis.events[name] = exec;
1748
+ }, "listen"),
1749
+ ///
1750
+ /**
1751
+ * Removes the event listener for the specified event names.
1752
+ * @param name The name of the event to remove the listener for.
1753
+ */
1754
+ remove: /* @__PURE__ */ __name((name) => {
1755
+ const listener = globalThis.events?.[name];
1756
+ if (listener) {
1757
+ globalThis.removeEventListener(name, listener);
1758
+ delete globalThis.events[name];
1759
+ }
1760
+ }, "remove")
1761
+ };
1762
+
1763
+ // functions/schema/index.ts
1764
+ init_cjs_shims();
1765
+ init_message();
1766
+ var _schemas = /* @__PURE__ */ new Map();
1767
+ var _validateValue = /* @__PURE__ */ __name((value, schema2, path) => {
1768
+ const errors = [];
1769
+ if (schema2.type && schema2.type !== "any") {
1770
+ const actualType = Array.isArray(value) ? "array" : typeof value;
1771
+ if (actualType !== schema2.type) {
1772
+ errors.push(`${path}: expected ${schema2.type}, got ${actualType}`);
1773
+ return { valid: false, errors };
1774
+ }
1775
+ }
1776
+ if (schema2.enum && !schema2.enum.includes(value)) {
1777
+ errors.push(`${path}: value must be one of [${schema2.enum.map(String).join(", ")}]`);
1778
+ }
1779
+ if (schema2.validator) {
1780
+ const result = schema2.validator(value);
1781
+ if (result !== true) {
1782
+ errors.push(`${path}: ${typeof result === "string" ? result : "validation failed"}`);
1783
+ }
1784
+ }
1785
+ if (typeof value === "number") {
1786
+ if (schema2.min !== void 0 && value < schema2.min) {
1787
+ errors.push(`${path}: value ${value} is less than minimum ${schema2.min}`);
1788
+ }
1789
+ if (schema2.max !== void 0 && value > schema2.max) {
1790
+ errors.push(`${path}: value ${value} exceeds maximum ${schema2.max}`);
1791
+ }
1792
+ }
1793
+ if (typeof value === "string") {
1794
+ if (schema2.min !== void 0 && value.length < schema2.min) {
1795
+ errors.push(`${path}: string length ${value.length} is less than minimum ${schema2.min}`);
1796
+ }
1797
+ if (schema2.max !== void 0 && value.length > schema2.max) {
1798
+ errors.push(`${path}: string length ${value.length} exceeds maximum ${schema2.max}`);
1799
+ }
1800
+ if (schema2.pattern && !schema2.pattern.test(value)) {
1801
+ errors.push(`${path}: string does not match required pattern`);
1802
+ }
1803
+ }
1804
+ if (schema2.type === "object" && value && typeof value === "object" && !Array.isArray(value)) {
1805
+ if (schema2.required) {
1806
+ for (const req of schema2.required) {
1807
+ if (!(req in value)) {
1808
+ errors.push(`${path}: missing required property '${req}'`);
1809
+ }
1810
+ }
1811
+ }
1812
+ if (schema2.properties) {
1813
+ for (const [prop, propSchema] of Object.entries(schema2.properties)) {
1814
+ if (prop in value && value[prop] !== void 0) {
1815
+ const propResult = _validateValue(value[prop], propSchema, `${path}.${prop}`);
1816
+ if (!propResult.valid) {
1817
+ errors.push(...propResult.errors || []);
1818
+ }
1819
+ }
1820
+ }
1821
+ }
1822
+ }
1823
+ return errors.length === 0 ? { valid: true } : { valid: false, errors };
1824
+ }, "_validateValue");
1825
+ var validate = /* @__PURE__ */ __name((path, value) => {
1826
+ const schema2 = _schemas.get(path);
1827
+ if (!schema2) {
1828
+ return { valid: true };
1829
+ }
1830
+ return _validateValue(value, schema2, path);
1831
+ }, "validate");
1832
+ var registerSchema = /* @__PURE__ */ __name((path, schema2) => {
1833
+ if (typeof schema2 === "function") {
1834
+ _schemas.set(path, { validator: schema2 });
1835
+ } else {
1836
+ _schemas.set(path, schema2);
1837
+ }
1838
+ message_default(`[memorio schema] Registered schema for '${path}'`);
1839
+ }, "registerSchema");
1840
+ var unregisterSchema = /* @__PURE__ */ __name((path) => {
1841
+ return _schemas.delete(path);
1842
+ }, "unregisterSchema");
1843
+ var listSchemas = /* @__PURE__ */ __name(() => {
1844
+ return Array.from(_schemas.keys());
1845
+ }, "listSchemas");
1846
+ var getSchema = /* @__PURE__ */ __name((path) => {
1847
+ return _schemas.get(path);
1848
+ }, "getSchema");
1849
+ var schema = {
1850
+ register: registerSchema,
1851
+ validate,
1852
+ unregister: unregisterSchema,
1853
+ list: listSchemas,
1854
+ get: getSchema
1855
+ };
1856
+
1857
+ // functions/state/index.ts
1858
+ init_env();
1859
+ var TARGET = /* @__PURE__ */ Symbol("memorio.target");
1860
+ var wrapperCache = /* @__PURE__ */ new WeakMap();
1861
+ var deepRaw = /* @__PURE__ */ __name((val, seen = null) => {
1862
+ if (val === null || typeof val !== "object") return val;
1863
+ if (val[TARGET] !== void 0) return deepRaw(val[TARGET], seen);
1864
+ if (seen) {
1865
+ if (seen.has(val)) return val;
1866
+ seen.add(val);
1867
+ }
1868
+ const ctor = val.constructor?.name;
1869
+ if (ctor !== "Object" && ctor !== "Array") return val;
1870
+ const copy = Array.isArray(val) ? [] : {};
1871
+ for (const k of Reflect.ownKeys(val)) {
1872
+ copy[k] = deepRaw(val[k], seen);
1873
+ }
1874
+ return copy;
1875
+ }, "deepRaw");
1876
+ var objPath = /* @__PURE__ */ __name((prop, object, separator = ".") => {
1877
+ return object.concat(prop).join(separator);
1878
+ }, "objPath");
1879
+ var buildProxy = /* @__PURE__ */ __name((obj, callback, tree = []) => {
1880
+ const event = /* @__PURE__ */ __name((name) => {
1881
+ try {
1882
+ dispatch.set(name, { detail: { name } });
1883
+ } catch (_) {
1884
+ }
1885
+ return;
1886
+ }, "event");
1887
+ return new Proxy(
1888
+ obj,
1889
+ {
1890
+ get(target, prop) {
1891
+ if (prop === "__path") {
1892
+ return tree.length > 0 ? "state." + tree.join(".") : "state";
1893
+ }
1894
+ if (prop === TARGET) {
1895
+ return target;
1896
+ }
1897
+ if (target[TARGET] !== void 0) {
1898
+ return target;
1899
+ }
1900
+ if (prop === "list") {
1901
+ message_default('Some state could be hidden when you use "state.list". Use "state" to see the complete list ');
1902
+ return JSON.parse(JSON.stringify(target));
1903
+ }
1904
+ if (typeof prop === "string") {
1905
+ const path = tree.length > 0 ? "state." + tree.concat(prop).join(".") : "state." + prop;
1906
+ exports.internal.lastAccessedPath = path;
1907
+ if (exports.internal.tracking) {
1908
+ exports.internal.trackedPaths.add(path);
1909
+ }
1910
+ }
1911
+ if (prop === "_lastPath") {
1912
+ return exports.internal.lastAccessedPath;
1913
+ }
1914
+ if (prop === "remove") {
1915
+ return (key) => {
1916
+ delete target[key];
1917
+ return true;
1918
+ };
1919
+ }
1920
+ if (prop === "removeAll") {
1921
+ return () => {
1922
+ try {
1923
+ for (const key in target) {
1924
+ if (typeof target[key] !== "function" && !["list", "remove", "removeAll", "lock", "unlock"].includes(key)) {
1925
+ delete target[key];
1926
+ }
1927
+ }
1928
+ } catch (error) {
1929
+ console.error(error);
1930
+ }
1931
+ return;
1932
+ };
1933
+ }
1934
+ if (Object.isFrozen(target[prop])) return target[prop];
1935
+ if (prop === "lock" || prop === "unlock") {
1936
+ const value = Reflect.get(target, prop);
1937
+ if (value) return value;
1938
+ }
1939
+ try {
1940
+ const value = Reflect.get(target, prop);
1941
+ if (value && typeof value === "object" && ["Array", "Object"].includes(value.constructor.name)) {
1942
+ let wrapper = wrapperCache.get(value);
1943
+ if (!wrapper) {
1944
+ wrapper = buildProxy(value, callback, tree.concat(prop));
1945
+ wrapperCache.set(value, wrapper);
1946
+ }
1947
+ return wrapper;
1948
+ }
1949
+ return value;
1950
+ } catch (error) {
1951
+ console.error("Error: ", error);
1952
+ return void 0;
1953
+ }
1954
+ },
1955
+ set(target, key, value) {
1956
+ if (exports.internal.locked) {
1957
+ console.error("Error: state is locked. Use state.unlock() to enable modifications.");
1958
+ return false;
1959
+ }
1960
+ if (protect.includes(key)) {
1961
+ console.error("key " + key + " is protected");
1962
+ return false;
1963
+ }
1964
+ if (target[key] && typeof target[key] === "object" && Object.isFrozen(target[key])) {
1965
+ console.error(`Error: state '${key}' is locked`);
1966
+ return false;
1967
+ }
1968
+ if (target[key] && typeof target[key] === "object" && target[key].__locked) {
1969
+ console.error(`Error: state '${key}' is locked. Use state.${key}.unlock() to enable modifications.`);
1970
+ return false;
1971
+ }
1972
+ try {
1973
+ const path = objPath(key, tree);
1974
+ const rawValue = deepRaw(value);
1975
+ const _schemaResult = schema.validate(path, rawValue);
1976
+ if (!_schemaResult.valid) {
1977
+ if (exports.DEV && exports.internal.debug) {
1978
+ console.error(
1979
+ `[memorio schema] Validation failed for '${path}':`,
1980
+ _schemaResult.errors
1981
+ );
1982
+ }
1983
+ message_default(
1984
+ `[memorio schema] Validation failed for '${path}': ` + (_schemaResult.errors?.join(", ") || "unknown error")
1985
+ );
1986
+ return false;
1987
+ }
1988
+ callback(
1989
+ {
1990
+ action: "set",
1991
+ path,
1992
+ target,
1993
+ newValue: rawValue,
1994
+ previousValue: Reflect.get(target, key)
1995
+ }
1996
+ );
1997
+ event("state." + path);
1998
+ Reflect.set(target, key, rawValue);
1999
+ exports.internal.bumpStateVersion();
2000
+ if (target[key] && typeof target[key] === "object") {
2001
+ const lockValue = target[key];
2002
+ if (lockValue && typeof lockValue === "object") {
2003
+ try {
2004
+ Object.defineProperty(lockValue, "__locked", {
2005
+ writable: true,
2006
+ enumerable: false,
2007
+ configurable: false,
2008
+ value: false
2009
+ });
2010
+ Object.defineProperty(lockValue, "lock", {
2011
+ writable: false,
2012
+ enumerable: false,
2013
+ configurable: false,
2014
+ value: /* @__PURE__ */ __name(() => {
2015
+ Object.defineProperty(lockValue, "__locked", {
2016
+ writable: true,
2017
+ enumerable: false,
2018
+ configurable: false,
2019
+ value: true
2020
+ });
2021
+ message_default(`State '${key}' is now locked.`);
2022
+ }, "value")
2023
+ });
2024
+ Object.defineProperty(lockValue, "unlock", {
2025
+ writable: false,
2026
+ enumerable: false,
2027
+ configurable: false,
2028
+ value: /* @__PURE__ */ __name(() => {
2029
+ Object.defineProperty(lockValue, "__locked", {
2030
+ writable: true,
2031
+ enumerable: false,
2032
+ configurable: false,
2033
+ value: false
2034
+ });
2035
+ message_default(`State '${key}' is now unlocked.`);
2036
+ }, "value")
2037
+ });
2038
+ } catch (_) {
2039
+ }
2040
+ }
2041
+ }
2042
+ return true;
2043
+ } catch (error) {
2044
+ console.error("Error in set trap:", error);
2045
+ return false;
2046
+ }
2047
+ },
2048
+ deleteProperty(target, prop) {
2049
+ try {
2050
+ const path = objPath(prop, tree);
2051
+ const previousValue = Reflect.get(target, prop);
2052
+ callback({ action: "delete", path, target, previousValue });
2053
+ return Reflect.deleteProperty(target, prop);
2054
+ } catch (error) {
2055
+ console.error("Error in deleteProperty trap:", error);
2056
+ return false;
2057
+ }
2058
+ },
2059
+ ownKeys(target) {
2060
+ return Reflect.ownKeys(target);
2061
+ },
2062
+ getOwnPropertyDescriptor(target, prop) {
2063
+ return Reflect.getOwnPropertyDescriptor(target, prop);
2064
+ }
2065
+ }
2066
+ );
2067
+ }, "buildProxy");
2068
+ var STATE_INSTANCE_KEY = "__memorio_state_instance__";
2069
+ exports.state = void 0;
2070
+ if (globalThis[STATE_INSTANCE_KEY]) {
2071
+ exports.state = globalThis[STATE_INSTANCE_KEY];
2072
+ } else {
2073
+ exports.state = buildProxy({}, (mutation) => {
2074
+ if (exports.internal.historyEnabled) {
2075
+ exports.internal.recordMutation({
2076
+ path: mutation.path,
2077
+ action: mutation.action,
2078
+ newValue: mutation.newValue,
2079
+ previousValue: mutation.previousValue,
2080
+ timestamp: Date.now()
2081
+ });
2082
+ }
2083
+ });
2084
+ exports.state.lock = () => {
2085
+ exports.internal.locked = true;
2086
+ message_default("State is now locked. All modifications are blocked.");
2087
+ };
2088
+ exports.state.unlock = () => {
2089
+ exports.internal.locked = false;
2090
+ message_default("State is now unlocked. Modifications are allowed.");
2091
+ };
2092
+ globalThis[STATE_INSTANCE_KEY] = exports.state;
2093
+ }
2094
+
2095
+ // index.ts
2096
+ init_store();
2097
+
2098
+ // functions/session/index.ts
2099
+ init_cjs_shims();
2100
+ init_platform();
2101
+ init_internal();
2102
+ init_message();
2103
+ var _sessionStorage = getSessionStorage();
2104
+ var _fallbackStorageByContext2 = /* @__PURE__ */ new Map();
2105
+ function _getFallbackStorage2() {
2106
+ const contextName = exports.internal.currentContext || "";
2107
+ const key = contextName || "default";
2108
+ if (!_fallbackStorageByContext2.has(key)) {
2109
+ _fallbackStorageByContext2.set(key, /* @__PURE__ */ new Map());
2110
+ }
2111
+ return _fallbackStorageByContext2.get(key);
2112
+ }
2113
+ __name(_getFallbackStorage2, "_getFallbackStorage");
2114
+ var _hasStorage2 = _sessionStorage !== null;
2115
+ function _getPrefix2() {
2116
+ const contextName = exports.internal.currentContext || "";
2117
+ return contextName ? `${contextName}-` : `memorio_session_`;
2118
+ }
2119
+ __name(_getPrefix2, "_getPrefix");
2120
+ function _prefixKey2(name) {
2121
+ if (!name || typeof name !== "string") {
2122
+ console.warn("[memorio session] key is empty or not a string - operation aborted");
2123
+ return "";
2124
+ }
2125
+ if (name.length > 512) {
2126
+ console.warn(`[memorio session] key "${name}" exceeds 512 chars - operation aborted`);
2127
+ return "";
2128
+ }
2129
+ return _getPrefix2() + name;
2130
+ }
2131
+ __name(_prefixKey2, "_prefixKey");
2132
+ function _read2(prefixedName) {
2133
+ const raw = _hasStorage2 ? _sessionStorage.getItem(prefixedName) : _getFallbackStorage2().get(prefixedName);
2134
+ return raw ? JSON.parse(raw) : raw;
2135
+ }
2136
+ __name(_read2, "_read");
2137
+ function _write2(prefixedName, value) {
2138
+ const json = JSON.stringify(value);
2139
+ if (_hasStorage2) _sessionStorage.setItem(prefixedName, json);
2140
+ else _getFallbackStorage2().set(prefixedName, json);
2141
+ }
2142
+ __name(_write2, "_write");
2143
+ function _remove2(prefixedName) {
2144
+ if (_hasStorage2) {
2145
+ if (_sessionStorage.getItem(prefixedName)) {
2146
+ _sessionStorage.removeItem(prefixedName);
2147
+ return true;
2148
+ }
2149
+ } else if (_getFallbackStorage2().has(prefixedName)) {
2150
+ _getFallbackStorage2().delete(prefixedName);
2151
+ return true;
2152
+ }
2153
+ return false;
2154
+ }
2155
+ __name(_remove2, "_remove");
2156
+ var SESSION_INSTANCE_KEY = "__memorio_session_instance__";
2157
+ exports.session = void 0;
2158
+ if (globalThis[SESSION_INSTANCE_KEY]) {
2159
+ exports.session = globalThis[SESSION_INSTANCE_KEY];
2160
+ } else {
2161
+ exports.session = new Proxy({}, {});
2162
+ Object.defineProperties(
2163
+ exports.session,
2164
+ {
2165
+ /**
2166
+ * Gets a value from storage.
2167
+ * @param name The key to retrieve.
2168
+ * @returns The parsed value or null if not found.
2169
+ */
2170
+ get: {
2171
+ value: /* @__PURE__ */ __name((name) => {
2172
+ if (!name) {
2173
+ console.warn("[memorio session] session.get() called with empty or null key - returning null");
2174
+ return null;
2175
+ }
2176
+ try {
2177
+ return _read2(_prefixKey2(name));
2178
+ } catch (err) {
2179
+ exports.message(`Error parsing session item '${name}':${err}`);
2180
+ }
2181
+ return null;
2182
+ }, "value")
2183
+ },
2184
+ /**
2185
+ * Sets a value in storage.
2186
+ * @param name The key to set.
2187
+ * @param value The value to store.
2188
+ * @returns true if written, false if the key was rejected.
2189
+ */
2190
+ set: {
2191
+ value: /* @__PURE__ */ __name((name, value) => {
2192
+ if (!name) {
2193
+ console.warn("[memorio session] session.set() called with empty or null key - write aborted");
2194
+ return false;
2195
+ }
2196
+ const prefixedName = _prefixKey2(name);
2197
+ if (!prefixedName) return false;
2198
+ if (typeof value === "function") {
2199
+ console.warn("[memorio session] functions are not storable - write aborted for key: " + name);
2200
+ exports.message("It's not secure to session functions.");
2201
+ return false;
2202
+ }
2203
+ try {
2204
+ _write2(prefixedName, value);
2205
+ } catch (err) {
2206
+ exports.message(`Error setting session item '${name}': ${err}`);
2207
+ return false;
2208
+ }
2209
+ return true;
2210
+ }, "value")
2211
+ },
2212
+ /**
2213
+ * Removes a value from storage.
2214
+ * @param name The key to remove.
2215
+ * @returns True if removed.
2216
+ */
2217
+ remove: {
2218
+ value: /* @__PURE__ */ __name((name) => {
2219
+ if (!name) {
2220
+ console.warn("[memorio session] session.remove() called with empty or null key - returning false");
2221
+ return false;
2222
+ }
2223
+ const prefixedName = _prefixKey2(name);
2224
+ if (!prefixedName) return false;
2225
+ try {
2226
+ return _remove2(prefixedName);
2227
+ } catch (err) {
2228
+ exports.message(`Error removing session item '${name}': ${err}`);
2229
+ }
2230
+ return false;
2231
+ }, "value")
2232
+ },
2233
+ /**
2234
+ * Alias for remove.
2235
+ * @param name The key to delete.
2236
+ * @returns True if removed.
2237
+ */
2238
+ delete: {
2239
+ value: /* @__PURE__ */ __name((name) => {
2240
+ return exports.session.remove(name);
2241
+ }, "value")
2242
+ },
2243
+ /**
2244
+ * Clears all sessionStorage items.
2245
+ */
2246
+ removeAll: {
2247
+ value: /* @__PURE__ */ __name(() => {
2248
+ if (_hasStorage2) {
2249
+ const keysToRemove = [];
2250
+ for (let i = 0; i < _sessionStorage.length; i++) {
2251
+ const key = _sessionStorage.key(i);
2252
+ if (key?.startsWith(_getPrefix2())) {
2253
+ keysToRemove.push(key);
2254
+ }
2255
+ }
2256
+ keysToRemove.forEach((key) => _sessionStorage.removeItem(key));
2257
+ } else {
2258
+ _getFallbackStorage2().clear();
2259
+ }
2260
+ return true;
2261
+ }, "value")
2262
+ },
2263
+ /**
2264
+ * Alias for removeAll.
2265
+ */
2266
+ clearAll: {
2267
+ value: /* @__PURE__ */ __name(() => {
2268
+ exports.session.removeAll();
2269
+ return true;
2270
+ }, "value")
2271
+ },
2272
+ quota: {
2273
+ value: /* @__PURE__ */ __name(async () => {
2274
+ return [0, 0];
2275
+ }, "value")
2276
+ },
2277
+ /**
2278
+ * Gets total size of all sessionStorage items.
2279
+ * @returns Total size in characters.
2280
+ */
2281
+ size: {
2282
+ value: /* @__PURE__ */ __name(() => {
2283
+ let totalSize = 0;
2284
+ if (_hasStorage2) {
2285
+ Object.keys(_sessionStorage).forEach(
2286
+ (key) => {
2287
+ if (key.startsWith(_getPrefix2())) {
2288
+ const item = _sessionStorage.getItem(key);
2289
+ if (item) totalSize += item.length;
2290
+ }
2291
+ }
2292
+ );
2293
+ } else {
2294
+ _getFallbackStorage2().forEach((value) => {
2295
+ totalSize += value.length;
2296
+ });
2297
+ }
2298
+ return totalSize;
2299
+ }, "value")
2300
+ },
2301
+ /**
2302
+ * Check if using real sessionStorage or fallback
2303
+ */
2304
+ isPersistent: {
2305
+ get: /* @__PURE__ */ __name(() => _hasStorage2, "get")
2306
+ },
2307
+ /**
2308
+ * Get a list of all memorio session items.
2309
+ */
2310
+ list: {
2311
+ value: /* @__PURE__ */ __name(() => {
2312
+ const result = {};
2313
+ try {
2314
+ if (_hasStorage2) {
2315
+ for (let i = 0; i < _sessionStorage.length; i++) {
2316
+ const key = _sessionStorage.key(i);
2317
+ if (key?.startsWith(_getPrefix2())) {
2318
+ const cleanKey = key.replace(_getPrefix2(), "");
2319
+ const item = _sessionStorage.getItem(key);
2320
+ if (item !== null) {
2321
+ try {
2322
+ result[cleanKey] = JSON.parse(item);
2323
+ } catch {
2324
+ result[cleanKey] = item;
2325
+ }
2326
+ }
2327
+ }
2328
+ }
2329
+ } else {
2330
+ _getFallbackStorage2().forEach((value, key) => {
2331
+ if (key.startsWith(_getPrefix2())) {
2332
+ const cleanKey = key.replace(_getPrefix2(), "");
2333
+ try {
2334
+ result[cleanKey] = JSON.parse(value);
2335
+ } catch {
2336
+ result[cleanKey] = value;
2337
+ }
2338
+ }
2339
+ });
2340
+ }
2341
+ } catch (err) {
2342
+ exports.message(`Error listing session items: ${err}`);
2343
+ }
2344
+ return result;
2345
+ }, "value")
2346
+ }
2347
+ }
2348
+ );
2349
+ Object.freeze(exports.session);
2350
+ globalThis[SESSION_INSTANCE_KEY] = exports.session;
2351
+ }
2352
+
2353
+ // functions/cache/index.ts
2354
+ init_cjs_shims();
2355
+ var CACHE_INSTANCE_KEY = "__memorio_cache_instance__";
2356
+ var cacheData = {};
2357
+ var cache = globalThis[CACHE_INSTANCE_KEY] ? globalThis[CACHE_INSTANCE_KEY] : new Proxy({}, {
2358
+ get(target, prop) {
2359
+ const key = prop;
2360
+ if (key === "get") return (name) => cacheData[name];
2361
+ if (key === "set") return (name, value) => {
2362
+ cacheData[name] = value;
2363
+ };
2364
+ if (key === "remove") return (name) => {
2365
+ delete cacheData[name];
2366
+ return true;
2367
+ };
2368
+ if (key === "removeAll") return () => {
2369
+ Object.keys(cacheData).forEach((k) => delete cacheData[k]);
2370
+ return true;
2371
+ };
2372
+ if (key === "clear") return () => {
2373
+ Object.keys(cacheData).forEach((k) => delete cacheData[k]);
2374
+ return true;
2375
+ };
2376
+ if (key === "list") return () => ({ ...cacheData });
2377
+ return cacheData[key];
2378
+ },
2379
+ set(target, prop, value) {
2380
+ cacheData[prop] = value;
2381
+ return true;
2382
+ },
2383
+ deleteProperty(target, prop) {
2384
+ delete cacheData[prop];
2385
+ return true;
2386
+ }
2387
+ });
2388
+ if (!globalThis[CACHE_INSTANCE_KEY]) {
2389
+ globalThis[CACHE_INSTANCE_KEY] = cache;
2390
+ if (!Object.isFrozen(cache)) {
2391
+ Object.freeze(cache);
2392
+ }
2393
+ }
2394
+
2395
+ // index.ts
2396
+ init_idb();
2397
+ init_sqlite();
2398
+
2399
+ // functions/observer/index.ts
2400
+ init_cjs_shims();
2401
+ init_message();
2402
+ var observerFunction = /* @__PURE__ */ __name((s, cb = null, option = true) => {
2403
+ const resolvePath = /* @__PURE__ */ __name((path2) => {
2404
+ if (typeof path2 === "string") return path2;
2405
+ if (path2 && typeof path2 === "object" && path2.__path) return path2.__path;
2406
+ return null;
2407
+ }, "resolvePath");
2408
+ const path = resolvePath(s);
2409
+ if (!s && !cb) {
2410
+ console.error("Observer Error: You need to setup observer correctly, Some parameters are missed!");
2411
+ return;
2412
+ }
2413
+ if (!s && cb) {
2414
+ console.error(`Observer Error: You need to declare what state need to be monitored as string like 'state.test'.`);
2415
+ return;
2416
+ }
2417
+ if (path) {
2418
+ const t = path.split(".");
2419
+ if (t[0] !== "state" && t[0] !== "store") {
2420
+ console.error(`Observer Error: You need to declare 'state.' or 'store.'. The '${path}' string is incorrect!`);
2421
+ return;
2422
+ }
2423
+ }
2424
+ if (s && !cb) {
2425
+ const resolvedPath = resolvePath(s);
2426
+ if (!resolvedPath) return;
2427
+ const obs = globalThis.observer;
2428
+ if (obs?.list?.[resolvedPath]) dispatch.remove(resolvedPath);
2429
+ message_default(`called: ${resolvedPath}`);
2430
+ return;
2431
+ }
2432
+ if (s && cb) {
2433
+ const resolvedPath = resolvePath(s);
2434
+ if (!resolvedPath) return;
2435
+ if (typeof s !== "string" && !(s && typeof s === "object")) {
2436
+ console.error(`Observer Error: name of state need to be a 'string' like 'state.test' or a direct state value`);
2437
+ return;
2438
+ }
2439
+ const callbacks = Array.isArray(cb) ? cb : [cb];
2440
+ const obs = globalThis.observer;
2441
+ if (obs?.list?.[resolvedPath]) dispatch.remove(resolvedPath);
2442
+ callbacks.forEach((callback) => {
2443
+ if (typeof callback === "function") {
2444
+ dispatch.listen(resolvedPath, callback, option);
2445
+ }
2446
+ });
2447
+ return;
2448
+ }
2449
+ }, "observerFunction");
2450
+ var observer = observerFunction;
2451
+ Object.defineProperties(
2452
+ observer,
2453
+ {
2454
+ /**
2455
+ * See the list of all your observer (eventListener) actually installed.
2456
+ * @returns The list of all installed observers.
2457
+ */
2458
+ list: {
2459
+ get: /* @__PURE__ */ __name(() => globalThis.events, "get")
2460
+ },
2461
+ ///
2462
+ /**
2463
+ * Remove an observer.
2464
+ * @param name The name of the observer to remove.
2465
+ */
2466
+ remove: {
2467
+ value: /* @__PURE__ */ __name((name) => {
2468
+ if (!name) return;
2469
+ dispatch.remove(name);
2470
+ delete globalThis.events[name];
2471
+ return;
2472
+ }, "value")
2473
+ },
2474
+ ///
2475
+ /**
2476
+ * Remove all observers.
2477
+ * @returns void
2478
+ */
2479
+ removeAll: {
2480
+ get: /* @__PURE__ */ __name(() => {
2481
+ const obs = globalThis.observer;
2482
+ const list = obs?.list;
2483
+ if (list) {
2484
+ Object.keys(list).forEach((key) => {
2485
+ obs?.remove?.(key);
2486
+ });
2487
+ }
2488
+ return true;
2489
+ }, "get")
2490
+ },
2491
+ ///
2492
+ /**
2493
+ * Check if an observer exists for the given path.
2494
+ * @param name The state path to check.
2495
+ * @returns true if an observer exists for the path, false otherwise.
2496
+ */
2497
+ has: {
2498
+ value: /* @__PURE__ */ __name((name) => {
2499
+ const obs = globalThis.observer;
2500
+ return !!obs?.list?.[name];
2501
+ }, "value")
2502
+ }
2503
+ }
2504
+ );
2505
+
2506
+ // functions/useObserver/index.ts
2507
+ init_cjs_shims();
2508
+ init_message();
2509
+ init_internal();
2510
+ init_env();
2511
+ var useObserver = /* @__PURE__ */ __name(((func, deps = []) => {
2512
+ if (!deps || typeof func !== "function") {
2513
+ return () => {
2514
+ };
2515
+ }
2516
+ const handlers = [];
2517
+ const depList = Array.isArray(deps) && !deps.__path ? deps : [deps];
2518
+ try {
2519
+ depList.forEach((dep) => {
2520
+ let t = "";
2521
+ if (typeof dep === "function") {
2522
+ const result = exports.propertyName(dep);
2523
+ if (result) t = result;
2524
+ } else if (typeof dep === "object" && dep !== null) {
2525
+ t = dep.__path || (typeof dep.toString === "function" && dep.toString() !== "[object Object]" ? dep.toString() : "");
2526
+ }
2527
+ if (t) {
2528
+ t = t.replace(/^(\(\)\s*=>\s*)/, "").replace(/^globalThis\./, "").replace(/^state\./, "");
2529
+ const path = t.startsWith("store.") || t.startsWith("state.") ? t : "state." + t;
2530
+ dispatch.listen(path, () => func());
2531
+ handlers.push(path);
2532
+ } else {
2533
+ exports.internal.clearTrackedPaths();
2534
+ exports.internal.tracking = true;
2535
+ try {
2536
+ func();
2537
+ } catch (_) {
2538
+ }
2539
+ exports.internal.tracking = false;
2540
+ exports.internal.trackedPaths.forEach((path) => {
2541
+ if (!handlers.includes(path)) {
2542
+ message_default(`useObserver: [Auto-Discovery] -> "${path}"`);
2543
+ dispatch.listen(path, () => func());
2544
+ handlers.push(path);
2545
+ }
2546
+ });
2547
+ }
2548
+ });
2549
+ if (handlers.length > 0) {
2550
+ message_default(`useObserver: Monitoring ${handlers.length} paths.`);
2551
+ } else {
2552
+ console.warn(`useObserver: No paths resolved for monitoring. Check your dependencies!`);
2553
+ }
2554
+ return () => {
2555
+ handlers.forEach((path) => {
2556
+ if (typeof dispatch.remove === "function") {
2557
+ dispatch.remove(path);
2558
+ message_default(`useObserver: Stopped monitoring "${path}"`);
2559
+ }
2560
+ });
2561
+ };
2562
+ } catch (err) {
2563
+ message_default(`useObserver Error: ${err}`);
2564
+ return () => {
2565
+ };
2566
+ }
2567
+ }), "useObserver");
2568
+ if (exports.DEV && !("useObserver" in globalThis)) {
2569
+ if (!globalThis.useObserver) globalThis.useObserver = null;
2570
+ Object.defineProperty(
2571
+ globalThis,
2572
+ "useObserver",
2573
+ {
2574
+ value: useObserver,
2575
+ writable: true,
2576
+ enumerable: false,
2577
+ configurable: true
2578
+ }
2579
+ );
2580
+ Object.freeze(globalThis.useObserver);
2581
+ }
2582
+
2583
+ // index.ts
2584
+ init_message();
2585
+
2586
+ // functions/logger/index.ts
2587
+ init_cjs_shims();
2588
+ init_internal();
2589
+ init_message();
2590
+ init_env();
2591
+ var defaultConfig = {
2592
+ enabled: true,
2593
+ logToConsole: true,
2594
+ modules: ["state", "store", "session", "cache", "idb"],
2595
+ maxEntries: 1e3
2596
+ };
2597
+ function isDebugEnabled() {
2598
+ return exports.DEV && exports.internal.debug === true;
2599
+ }
2600
+ __name(isDebugEnabled, "isDebugEnabled");
2601
+ var config = { ...defaultConfig };
2602
+ var logHistory = [];
2603
+ var configure = /* @__PURE__ */ __name((options) => {
2604
+ config = { ...config, ...options };
2605
+ }, "configure");
2606
+ var enable = /* @__PURE__ */ __name(() => {
2607
+ config.enabled = true;
2608
+ }, "enable");
2609
+ var disable = /* @__PURE__ */ __name(() => {
2610
+ config.enabled = false;
2611
+ }, "disable");
2612
+ var isEnabled = /* @__PURE__ */ __name((module) => {
2613
+ return config.enabled && config.modules.includes(module);
2614
+ }, "isEnabled");
2615
+ var log = /* @__PURE__ */ __name((module, action, path, value, previousValue) => {
2616
+ if (!isEnabled(module)) return;
2617
+ const entry = {
2618
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
2619
+ module,
2620
+ action,
2621
+ path,
2622
+ value,
2623
+ previousValue
2624
+ };
2625
+ logHistory.push(entry);
2626
+ if (logHistory.length > config.maxEntries) {
2627
+ logHistory.shift();
2628
+ }
2629
+ if (config.logToConsole && isDebugEnabled()) {
2630
+ const prefix = `[Memorio:${module.toUpperCase()}]`;
2631
+ const color = getModuleColor(module);
2632
+ message_default(
2633
+ `%c${prefix}%c ${action} ${path},
2634
+ color: ${color}; font-weight: bold,
2635
+ color: inherit`
2636
+ );
2637
+ if (value !== void 0) {
2638
+ message_default(` \u2192 value:${value}`);
2639
+ }
2640
+ if (previousValue !== void 0) {
2641
+ message_default(` \u2190 previous:${previousValue}`);
2642
+ }
2643
+ }
2644
+ if (config.customHandler) {
2645
+ config.customHandler(entry);
2646
+ }
2647
+ }, "log");
2648
+ var getModuleColor = /* @__PURE__ */ __name((module) => {
2649
+ const colors = {
2650
+ state: "#4CAF50",
2651
+ store: "#2196F3",
2652
+ session: "#FF9800",
2653
+ cache: "#9C27B0",
2654
+ idb: "#F44336"
2655
+ };
2656
+ return colors[module] || "#888888";
2657
+ }, "getModuleColor");
2658
+ var getHistory = /* @__PURE__ */ __name(() => {
2659
+ return [...logHistory];
2660
+ }, "getHistory");
2661
+ var clearHistory = /* @__PURE__ */ __name(() => {
2662
+ logHistory.length = 0;
2663
+ }, "clearHistory");
2664
+ var getStats = /* @__PURE__ */ __name(() => {
2665
+ const stats2 = {
2666
+ total: logHistory.length,
2667
+ state: 0,
2668
+ store: 0,
2669
+ session: 0,
2670
+ cache: 0,
2671
+ idb: 0,
2672
+ set: 0,
2673
+ get: 0,
2674
+ delete: 0,
2675
+ clear: 0
2676
+ };
2677
+ for (const entry of logHistory) {
2678
+ if (entry) {
2679
+ const module = entry.module;
2680
+ const action = entry.action;
2681
+ if (module && typeof stats2[module] === "number") stats2[module]++;
2682
+ if (action && typeof stats2[action] === "number") stats2[action]++;
2683
+ }
2684
+ }
2685
+ return stats2;
2686
+ }, "getStats");
2687
+ var exportLogs = /* @__PURE__ */ __name(() => {
2688
+ return JSON.stringify(logHistory, null, 2);
2689
+ }, "exportLogs");
2690
+ var logger = {
2691
+ configure,
2692
+ enable,
2693
+ disable,
2694
+ isEnabled,
2695
+ log,
2696
+ getHistory,
2697
+ clearHistory,
2698
+ getStats,
2699
+ exportLogs
2700
+ };
2701
+
2702
+ // functions/devtools/index.ts
2703
+ init_cjs_shims();
2704
+ init_internal();
2705
+ init_env();
2706
+ var _state = globalThis.__memorio_state_instance__;
2707
+ var _store = globalThis.__memorio_store_instance__;
2708
+ var _session = globalThis.__memorio_session_instance__;
2709
+ var _cache = globalThis.__memorio_cache_instance__;
2710
+ function isDebugEnabled2() {
2711
+ return exports.DEV && exports.internal.debug === true;
2712
+ }
2713
+ __name(isDebugEnabled2, "isDebugEnabled");
2714
+ function extractStoreData() {
2715
+ if (!_store) return {};
2716
+ const result = {};
2717
+ const store2 = _store;
2718
+ if (typeof store2.list === "function") {
2719
+ try {
2720
+ return store2.list();
2721
+ } catch {
2722
+ }
2723
+ }
2724
+ if (typeof store2.get === "function") {
2725
+ for (const key of Object.keys(store2)) {
2726
+ if (!["get", "set", "remove", "delete", "removeAll", "clearAll", "size", "isPersistent", "list"].includes(key)) {
2727
+ try {
2728
+ const val = store2.get(key);
2729
+ if (val !== null && val !== void 0) {
2730
+ result[key] = val;
2731
+ }
2732
+ } catch {
2733
+ }
2734
+ }
2735
+ }
2736
+ }
2737
+ return result;
2738
+ }
2739
+ __name(extractStoreData, "extractStoreData");
2740
+ function extractSessionData() {
2741
+ if (!_session) return {};
2742
+ const result = {};
2743
+ const session2 = _session;
2744
+ if (typeof session2.list === "function") {
2745
+ try {
2746
+ return session2.list();
2747
+ } catch {
2748
+ }
2749
+ }
2750
+ if (typeof session2.get === "function") {
2751
+ for (const key of Object.keys(session2)) {
2752
+ if (!["get", "set", "remove", "delete", "removeAll", "clearAll", "size", "isPersistent", "list"].includes(key)) {
2753
+ try {
2754
+ const val = session2.get(key);
2755
+ if (val !== null && val !== void 0) {
2756
+ result[key] = val;
2757
+ }
2758
+ } catch {
2759
+ }
2760
+ }
2761
+ }
2762
+ }
2763
+ return result;
2764
+ }
2765
+ __name(extractSessionData, "extractSessionData");
2766
+ var inspect = /* @__PURE__ */ __name(() => {
2767
+ if (!isDebugEnabled2()) return;
2768
+ if (_state) {
2769
+ const stateList = _state.list;
2770
+ let stateData;
2771
+ if (typeof stateList === "function") {
2772
+ stateData = stateList();
2773
+ } else if (typeof stateList === "object" && stateList !== null) {
2774
+ stateData = stateList;
2775
+ } else {
2776
+ stateData = _state;
2777
+ }
2778
+ console.table(stateData);
2779
+ }
2780
+ if (_store) {
2781
+ console.table(extractStoreData());
2782
+ }
2783
+ if (_session) {
2784
+ console.table(extractSessionData());
2785
+ }
2786
+ if (_cache) {
2787
+ const cacheList = _cache.list;
2788
+ let cacheData2;
2789
+ if (typeof cacheList === "function") {
2790
+ cacheData2 = cacheList();
2791
+ } else if (typeof cacheList === "object" && cacheList !== null) {
2792
+ cacheData2 = cacheList;
2793
+ } else {
2794
+ cacheData2 = _cache;
2795
+ }
2796
+ console.table(cacheData2);
2797
+ }
2798
+ }, "inspect");
2799
+ var stats = /* @__PURE__ */ __name(() => {
2800
+ const getKeys = /* @__PURE__ */ __name((obj) => {
2801
+ if (!obj) return 0;
2802
+ if (typeof obj.list === "function") {
2803
+ try {
2804
+ const list = obj.list();
2805
+ return Object.keys(list).length;
2806
+ } catch {
2807
+ }
2808
+ }
2809
+ return Object.keys(obj).length;
2810
+ }, "getKeys");
2811
+ return {
2812
+ stateKeys: getKeys(_state),
2813
+ storeKeys: getKeys(_store),
2814
+ sessionKeys: getKeys(_session),
2815
+ cacheKeys: getKeys(_cache),
2816
+ idbDatabases: 0,
2817
+ sqliteDbCount: 0,
2818
+ lastUpdate: (/* @__PURE__ */ new Date()).toISOString()
2819
+ };
2820
+ }, "stats");
2821
+ var clear = /* @__PURE__ */ __name((moduleName) => {
2822
+ const targets = { state: _state, store: _store, session: _session, cache: _cache };
2823
+ const target = targets[moduleName];
2824
+ if (target && typeof target.clear === "function") {
2825
+ target.clear();
2826
+ } else if (target && typeof target.removeAll === "function") {
2827
+ target.removeAll();
2828
+ } else {
2829
+ console.debug(`Module ${moduleName} not found or does not support clear()/removeAll()`);
2830
+ }
2831
+ }, "clear");
2832
+ var clearAll = /* @__PURE__ */ __name(() => {
2833
+ clear("state");
2834
+ clear("store");
2835
+ clear("session");
2836
+ clear("cache");
2837
+ }, "clearAll");
2838
+ var exportData = /* @__PURE__ */ __name(() => {
2839
+ const getStateData = /* @__PURE__ */ __name(() => {
2840
+ if (!_state) return void 0;
2841
+ try {
2842
+ if (typeof _state.list === "function") {
2843
+ return _state.list();
2844
+ }
2845
+ return _state;
2846
+ } catch {
2847
+ return void 0;
2848
+ }
2849
+ }, "getStateData");
2850
+ const getStoreData = /* @__PURE__ */ __name(() => {
2851
+ return extractStoreData();
2852
+ }, "getStoreData");
2853
+ const getSessionData = /* @__PURE__ */ __name(() => {
2854
+ return extractSessionData();
2855
+ }, "getSessionData");
2856
+ const getCacheData = /* @__PURE__ */ __name(() => {
2857
+ if (!_cache) return void 0;
2858
+ try {
2859
+ if (typeof _cache.list === "function") {
2860
+ return _cache.list();
2861
+ }
2862
+ return _cache;
2863
+ } catch {
2864
+ return void 0;
2865
+ }
2866
+ }, "getCacheData");
2867
+ const data = {
2868
+ state: getStateData(),
2869
+ store: getStoreData(),
2870
+ session: getSessionData(),
2871
+ cache: getCacheData(),
2872
+ exportedAt: (/* @__PURE__ */ new Date()).toISOString()
2873
+ };
2874
+ return JSON.stringify(data, null, 2);
2875
+ }, "exportData");
2876
+ var importData = /* @__PURE__ */ __name((jsonString) => {
2877
+ try {
2878
+ const data = JSON.parse(jsonString);
2879
+ if (data.state) {
2880
+ Object.entries(data.state).forEach(([key, value]) => {
2881
+ if (_state && key !== "list" && key !== "remove" && key !== "removeAll") {
2882
+ ;
2883
+ _state[key] = value;
2884
+ }
2885
+ });
2886
+ }
2887
+ if (data.store && _store && typeof _store.set === "function") {
2888
+ Object.entries(data.store).forEach(([key, value]) => {
2889
+ ;
2890
+ _store.set(key, value);
2891
+ });
2892
+ }
2893
+ if (data.session && _session && typeof _session.set === "function") {
2894
+ Object.entries(data.session).forEach(([key, value]) => {
2895
+ ;
2896
+ _session.set(key, value);
2897
+ });
2898
+ }
2899
+ if (data.cache && _cache) {
2900
+ Object.entries(data.cache).forEach(([key, value]) => {
2901
+ if (_cache && key !== "get" && key !== "set" && key !== "remove" && key !== "clear") {
2902
+ ;
2903
+ _cache[key] = value;
2904
+ }
2905
+ });
2906
+ }
2907
+ } catch (error) {
2908
+ console.debug("Import failed:", error);
2909
+ }
2910
+ }, "importData");
2911
+ var watch = /* @__PURE__ */ __name((moduleName, path) => {
2912
+ const targets = { state: _state, store: _store, session: _session, cache: _cache };
2913
+ const target = targets[moduleName];
2914
+ if (!target) {
2915
+ console.debug(`Module ${moduleName} not found`);
2916
+ return;
2917
+ }
2918
+ const initialValue = target[path];
2919
+ console.debug(`Watching ${moduleName}.${path} (initial: ${JSON.stringify(initialValue)})`);
2920
+ if (moduleName === "state" && globalThis.memorio?.dispatch) {
2921
+ const handler = /* @__PURE__ */ __name((e) => {
2922
+ const detail = e.detail;
2923
+ if (detail?.name?.includes(path)) {
2924
+ console.debug(`Change: ${moduleName}.${path} =`, e.detail.value);
2925
+ }
2926
+ }, "handler");
2927
+ target.addEventListener?.("memorio-change", handler);
2928
+ }
2929
+ }, "watch");
2930
+ var help = /* @__PURE__ */ __name(() => {
2931
+ console.debug(`
2932
+ Memorio DevTools Help
7
2933
 
8
2934
  Available commands:
9
2935
  memorio.devtools.inspect() - Inspect all state modules
@@ -15,99 +2941,1424 @@ Available commands:
15
2941
  memorio.devtools.watch(module, path) - Watch a path for changes
16
2942
  memorio.devtools.help() - Show this help
17
2943
 
18
- Shortcuts:
19
- state - globalThis.state
20
- store - globalThis.store
21
- session - globalThis.session
22
- cache - globalThis.cache
23
- sqlite - globalThis.sqlite (SQLite / sql.js, browser only)
24
- `);},Je={inspect:no,stats:so,clear:ne,clearAll:io,exportData:ao,importData:lo,watch:co,help:uo};a();M();S();var mo={enabled:true,logToConsole:true,modules:["state","store","session","cache","idb"],maxEntries:1e3};function fo(){return exports.internal.debug===true}var D={...mo},J=[],po=e=>{D={...D,...e};},yo=()=>{D.enabled=true;},go=()=>{D.enabled=false;},Yt=e=>D.enabled&&D.modules.includes(e),bo=(e,t,r,o,n)=>{if(!Yt(e))return;let s={timestamp:new Date().toISOString(),module:e,action:t,path:r,value:o,previousValue:n};if(J.push(s),J.length>D.maxEntries&&J.shift(),D.logToConsole&&fo()){let i=`[Memorio:${e.toUpperCase()}]`,l=ho(e);c(`%c${i}%c ${t} ${r},
25
- color: ${l}; font-weight: bold,
26
- color: inherit`),o!==void 0&&c(` \u2192 value:${o}`),n!==void 0&&c(` \u2190 previous:${n}`);}D.customHandler&&D.customHandler(s);},ho=e=>({state:"#4CAF50",store:"#2196F3",session:"#FF9800",cache:"#9C27B0",idb:"#F44336"})[e]||"#888888",vo=()=>[...J],xo=()=>{J.length=0;},So=()=>{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,o=t.action;r&&typeof e[r]=="number"&&e[r]++,o&&typeof e[o]=="number"&&e[o]++;}return e},wo=()=>JSON.stringify(J,null,2),Ne={configure:po,enable:yo,disable:go,isEnabled:Yt,log:bo,getHistory:vo,clearHistory:xo,getStats:So,exportLogs:wo};M();L();a();L();M();var ye={version:"4.8.0"};F();E();P();S();a();function Be(){return x}a();M();S();function Xt(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 Ve=()=>Xt(A(x)),He=e=>{let t=[],r=(o,n,s)=>{let i=o?Object.keys(o):[],l=n?Object.keys(n):[];for(let y of l){let g=s?`${s}.${y}`:y,h=o?o[y]:void 0,k=n[y];h!==k&&(typeof h!==typeof k||h===void 0?t.push({path:g,oldValue:h,newValue:k}):h&&typeof h=="object"?r(h,k,g):h!==k&&t.push({path:g,oldValue:h,newValue:k}));}for(let y of i)if(!(y in(n||{}))){let g=s?`${s}.${y}`:y;t.push({path:g,oldValue:o[y],newValue:void 0});}};return r(e,A(x),""),t},ze=(e=true)=>{exports.internal.historyEnabled=e,c(`[memorio history] Tracking ${e?"enabled":"disabled"}`);};var Qe=()=>[...exports.internal.mutations],Ke=()=>exports.internal.canUndo(),We=()=>exports.internal.canRedo(),Fe=()=>{if(!exports.internal.historyEnabled){c("[memorio history] History is not enabled");return}let e=exports.internal.popUndo();if(e)return To(e),c(`[memorio history] Undid: ${e.action} ${e.path}`),e},Ge=()=>{if(!exports.internal.historyEnabled){c("[memorio history] History is not enabled");return}let e=exports.internal.popRedo();if(e)return Po(e),c(`[memorio history] Redid: ${e.action} ${e.path}`),e};function To(e){let t=exports.internal.historyEnabled;exports.internal.historyEnabled=false;try{e.action==="set"?e.previousValue===void 0?Zt(e.path):Ue(e.path,e.previousValue):e.action==="delete"&&e.previousValue!==void 0&&Ue(e.path,e.previousValue);}finally{exports.internal.historyEnabled=t;}}function Po(e){let t=exports.internal.historyEnabled;exports.internal.historyEnabled=false;try{e.action==="set"?Ue(e.path,e.newValue):e.action==="delete"&&Zt(e.path);}finally{exports.internal.historyEnabled=t;}}function Ue(e,t){let r=e.split("."),o=x;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 Zt(e){let t=e.split(".");if(t.length===1){x.remove(t[0]);return}let r=x;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 Ye=e=>{x.removeAll();for(let t of Object.keys(e))x[t]=Xt(e[t]);exports.internal.clearHistory(),c("[memorio history] State rolled back to snapshot");},Xe=()=>{exports.internal.clearHistory(),c("[memorio history] History cleared");},Ze=()=>{exports.internal.clearRedo();};a();var et=()=>{let e=A(x);return Object.keys(e).filter(t=>!["list","remove","removeAll","lock","unlock"].includes(t))},tt=e=>{if(!e||typeof e!="string")return false;let t=e.replace(/^state\./,"").split("."),r=x;for(let o of t){if(r==null)return false;r=r[o];}return r!==void 0},rt=e=>{let[t,r]=er(e);return !t||r===void 0?"undefined":Array.isArray(r)?"array":typeof r},ot=e=>{let[t,r]=er(e);if(!(!t||r===void 0))return _o(r)},nt=()=>{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],y=l!==void 0,g=y?Array.isArray(l)?"array":typeof l:"undefined";e.push({path:i,type:g,defined:y}),y&&typeof l=="object"&&!Array.isArray(l)&&l.constructor?.name==="Object"&&t(l,i);}};return t(A(x),""),e};function er(e){if(!e||typeof e!="string")return [false,void 0];let t=e.replace(/^state\./,"").split("."),r=x;for(let o of t){if(r==null)return [false,void 0];r=r[o];}return [r!==void 0,r]}function _o(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();F();E();a();F();var R=globalThis,ko=10*1024*1024;function se(){let e=R.memorioSyncConfig;if(e&&typeof e.namespace=="string"&&e.namespace)return `ns:${e.namespace}`;let t=R.memorio?R.memorio._currentContext:void 0,r=typeof t=="string"&&t?t:"";return r?`ctx:${r}`:"default"}function tr(){return !!R.memorioSyncConfig}var Y=e=>`memorio:sync:${e}:`,G=e=>`${Y(e)}index`;function Oo(e){let t=JSON.stringify(e);if(t.length>ko)throw new Error("memorio sync: memory entry exceeds maximum size");return t}function st(e){try{return JSON.parse(e)}catch{return null}}var it={async append(e,t){let r=se(),o={...e,operation:t,updatedAt:e.updatedAt||Date.now(),version:e.version||1,sync:"pending"},n=Oo(o),s=`${Y(r)}${o.id}`;exports.store.set(s,n);let i=exports.store.get(G(r))||[];return i.includes(o.id)||i.push(o.id),exports.store.set(G(r),JSON.stringify(i)),o},async pending(){let e=se(),t=[],r=exports.store.get(G(e))||[];for(let o of r){let n=exports.store.get(`${Y(e)}${o}`);if(!n)continue;let s=st(n);s&&s.sync!=="synced"&&t.push(s);}return t.sort((o,n)=>(o.updatedAt||0)-(n.updatedAt||0)),t},async markSynced(e){if(!e.length)return 0;let t=se(),r=0,o=exports.store.get(G(t))||[];for(let n of o){if(!e.includes(n))continue;let s=`${Y(t)}${n}`,i=exports.store.get(s);if(!i)continue;let l=st(i);!l||l.sync==="synced"||(l.sync="synced",exports.store.set(s,JSON.stringify(l)),r++);}return r},async get(e){let t=se(),r=exports.store.get(`${Y(t)}${e}`);return st(r??"")},async clear(){let e=se(),t=exports.store.get(G(e))||[];for(let r of t)exports.store.remove(`${Y(e)}${r}`);exports.store.remove(G(e));},async replay(){let e={synced:[]};if(!tr())return e;let r=(R.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||[])await this.append(i,i.operation||"confirm"),await this.markSynced([i.id]);}catch{}return e},status(){return Promise.resolve("store")}};function rr(e){let t=R.memorioSyncConfig||{};return R.memorioSyncConfig={...t,...e},it}if(typeof R.addEventListener=="function"){let e=false;R.addEventListener("focus",()=>{e||!tr()||(e=true,it.replay().finally(()=>{e=false;}));});}var at=it;var he="__memorio_memory_index__",or="__memorio_superseded__";function lt(){return !!globalThis.memorioSyncConfig}async function X(e,t){if(lt()&&e.scope!=="hot")try{await at.append(e,t);}catch{}}function ct(e){return e.startsWith(or)?e:`${or}${e}`}function nr(e){return e?Array.isArray(e)?e:[e]:[]}function qo(e,t){if(t.scope)return t.scope;let r=JSON.stringify(e).length;return r>1e6?"durable":("local")}function _(){return Date.now()}function be(e){return e.ttl===null||e.ttl===void 0?false:_()-e.createdAt>e.ttl}function Mo(e,t){return e.status==="obsolete"||e.status==="superseded"||be(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 Co(e,t){return !(e.status!=="active"||be(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 $o(e){let t=(_()-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 ir(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 ar(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;}async function K(e){let t=e.status==="superseded"?ct(e.id||e.key):e.key,r=JSON.stringify(e);switch(e.scope){case "hot":ar(x,t,e.value);break;case "session":C.set(t,r);break;case "local":exports.store.set(t,r);break;case "durable":await exports.idb.set("memories",t,r);break}await jo(e.id||e.key,e.scope,e.status==="superseded");}async function lr(e,t,r=false){let o=r?ct(e):e,n;switch(t){case "hot":{let s=ir(x,o);return s===void 0?null:cr(e,s,t)}case "session":n=C.get(o);break;case "local":n=exports.store.get(o);break;case "durable":n=await exports.idb.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 cr(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 sr(e,t,r=false){let o=r?ct(e):e;switch(t){case "hot":ar(x,o,void 0);break;case "session":C.remove(o);break;case "local":exports.store.remove(o);break;case "durable":await exports.idb.deleteKey("memories",o);break}await Do(e,r);}async function ie(){try{let e=exports.store.get(he);return e?JSON.parse(e):{}}catch{return {}}}async function jo(e,t,r=false){let o=await ie();o[e]={scope:t,superseded:r},exports.store.set(he,JSON.stringify(o));}async function Do(e,t=false){let r=await ie(),o=r[e];o&&(t&&o.superseded||!t&&!o.superseded)&&delete r[e],exports.store.set(he,JSON.stringify(r));}async function ge(){let e=await ie(),t=[];for(let[r,o]of Object.entries(e)){let n=await lr(r,o.scope,o.superseded);n&&(n.id=n.id||r,n.supersededId=n.supersededId??null,t.push(n));}return t}var ve={async remember(e,t,r={}){let o=await this._getEntry(e);if(o&&o.status==="active"){let l=`${o.id}__v${Date.now()}`,y={...o,id:l,key:o.key,status:"superseded",supersededId:null,lastConfirmedAt:_()};await K(y),await X(y,"supersede");}let n=qo(t,r),s=nr(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:_(),lastConfirmedAt:_(),updatedAt:_(),version:o&&o.version?o.version+1:1,sync:lt()?"pending":void 0,supersededId:o?o.id:null};await K(i),await X(i,"remember"),w.set("memorio:memory:remembered",{key:e,scope:n,entryId:i.id});},async recall(e,t={}){let r=await this._getEntry(e);return !r||!Mo(r,t)?null:(r.lastConfirmedAt=_(),await K(r),w.set("memorio:memory:recalled",{key:e}),r.value)},async context(e={}){return (await ge()).filter(n=>Co(n,e)).map(n=>({entry:n,score:$o(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:_()-n.createdAt,accessCount:n.tags.length+1,lastAccessedAt:n.lastConfirmedAt}))},async forget(e){let t=await this._getEntry(e);t&&(await sr(t.id||e,t.scope,t.status==="superseded"),await X(t,"forget"),w.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${_()}`,s={...o,id:n,key:o.key,status:"superseded",supersededId:null,lastConfirmedAt:_()};await K(s),await X(s,"supersede");let i={...o,value:t,lastConfirmedAt:_(),updatedAt:_(),version:(o.version?o.version:0)+1,sync:lt()?"pending":void 0,...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:nr(r.tags)}:{},...r.source?{source:r.source}:{}};await K(i),await X(i,"update"),w.set("memorio:memory:updated",{key:e,entryId:i.id});},async stats(){let e=await ge(),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,be(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 ge(),t=0;for(let r of e)be(r)&&r.status==="active"&&(r.status="obsolete",r.updatedAt=_(),r.operation="expire",await K(r),await X(r,"expire"),t++);return t},async clear(){let e=await ie();for(let[t,r]of Object.entries(e))await sr(t,r.scope,r.superseded);exports.store.remove(he);},async _getEntry(e){let r=(await ie())[e];if(!r){let o=ir(x,e);return o!==void 0?cr(e,o,"hot"):null}return lr(e,r.scope,r.superseded)},async _loadAll(){return ge()},async _save(e){await K(e);},journal:at,configure(e){return rr(e),this}};Object.defineProperty(globalThis,"memorio",{value:{setProps:()=>{},obj:{},array:[],dispatch:w,message:exports.message,devtools:Je,logger:Ne,setDescription:()=>{}},writable:false,configurable:true,enumerable:false});Object.defineProperty(globalThis,"events",{value:{},writable:true,enumerable:false});typeof globalThis.addEventListener=="function"&&w.listen("memorio:memory:cleanup",async()=>ve.forgetExpired?.());Object.defineProperty(memorio,"version",{writable:false,enumerable:false,value:ye.version});Object.defineProperty(memorio,"debug",{get:()=>exports.internal.debug,set:e=>{exports.internal.debug=e;},enumerable:false});var ur=re();Object.defineProperty(memorio,"_platform",{writable:false,enumerable:false,value:ur.platform});Object.defineProperty(memorio,"_capabilities",{writable:false,enumerable:false,value:ur});Object.defineProperty(memorio,"_sessionId",{writable:false,enumerable:false,value:le()});vt();memorio.isBrowser=Se;memorio.isNode=we;memorio.isDeno=Ee;memorio.isEdge=Te;memorio.getCapabilities=re;memorio.createContext=oe;memorio.listContexts=qe;memorio.deleteContext=Me;memorio.isolate=e=>oe(e);memorio.registerSchema=I.register;memorio.validate=I.validate;memorio.unregisterSchema=I.unregister;memorio.listSchemas=I.list;memorio.typed=Be;memorio.snapshot=Ve;memorio.diff=He;memorio.undo=Fe;memorio.redo=Ge;memorio.canUndo=Ke;memorio.canRedo=We;memorio.rollback=Ye;memorio.trace=Qe;memorio.enableHistory=ze;memorio.clearHistory=Xe;memorio.clearRedo=Ze;memorio.stateKeys=et;memorio.pathExists=tt;memorio.stateType=rt;memorio.stateGet=ot;memorio.stateSchema=nt;memorio.memory=ve;Object.defineProperty(globalThis,"state",{value:x,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"store",{value:exports.store,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"session",{value:C,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"cache",{value:ce,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"idb",{value:exports.idb,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"sqlite",{value:exports.sqlite,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"observer",{value:fe,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"useObserver",{value:pe,writable:true,enumerable:false,configurable:true});Object.defineProperty(memorio,"dispatch",{value:w,writable:true,enumerable:false,configurable:true});Object.defineProperty(memorio,"setContext",{writable:false,enumerable:false,value:e=>Ce(e)});Object.defineProperty(memorio,"getContext",{writable:false,enumerable:false,value:()=>exports.internal.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(`
27
- \u{1F9E0} Memorio ${ye.version} - Help
28
-
29
- Core Modules:
30
- state - Reactive state management
31
- store - Persistent storage (localStorage/Map)
32
- session - Session storage (sessionStorage/Map)
33
- cache - In-memory cache
34
- idb - IndexedDB (browser only)
35
- sqlite - SQLite in browser (sql.js, optional)
2944
+ Shortcuts (dev only):
2945
+ state - global state proxy
2946
+ store - localStorage wrapper
2947
+ session - sessionStorage wrapper
2948
+ cache - in-memory cache
2949
+ `);
2950
+ }, "help");
2951
+ var devtools = {
2952
+ inspect,
2953
+ stats,
2954
+ clear,
2955
+ clearAll,
2956
+ exportData,
2957
+ importData,
2958
+ watch,
2959
+ help
2960
+ };
36
2961
 
37
- API:
38
- memorio.typed<T>() - Type-safe view of global state (compile-time only)
39
- memorio.registerSchema() - Register a validator for a state path
40
- memorio.validate() - Manually validate a value
41
- memorio.unregisterSchema() - Remove a registered schema
42
- memorio.listSchemas() - List all registered schema paths
2962
+ // core/hlc.ts
2963
+ init_cjs_shims();
2964
+ var NODE_ID_KEY = "__memorio_hlc_node";
2965
+ function getNodeId() {
2966
+ if (typeof globalThis === "undefined") return "node";
2967
+ try {
2968
+ if (typeof sessionStorage !== "undefined" && sessionStorage) {
2969
+ let id = sessionStorage.getItem(NODE_ID_KEY);
2970
+ if (!id) {
2971
+ id = generateNodeId();
2972
+ sessionStorage.setItem(NODE_ID_KEY, id);
2973
+ }
2974
+ return id;
2975
+ }
2976
+ } catch {
2977
+ }
2978
+ if (!globalThis.__memorioHlcNodeId) {
2979
+ globalThis.__memorioHlcNodeId = generateNodeId();
2980
+ }
2981
+ return globalThis.__memorioHlcNodeId;
2982
+ }
2983
+ __name(getNodeId, "getNodeId");
2984
+ function generateNodeId() {
2985
+ if (typeof crypto !== "undefined" && crypto.randomUUID) {
2986
+ return crypto.randomUUID().slice(0, 8);
2987
+ }
2988
+ return Math.random().toString(36).slice(2, 10);
2989
+ }
2990
+ __name(generateNodeId, "generateNodeId");
2991
+ var HLC_KEY = "__memorio_hlc_local";
2992
+ var local = globalThis[HLC_KEY] || {
2993
+ physical: 0,
2994
+ logical: 0,
2995
+ node: getNodeId()
2996
+ };
2997
+ if (!globalThis[HLC_KEY]) {
2998
+ globalThis[HLC_KEY] = local;
2999
+ }
3000
+ function tick(_incoming) {
3001
+ const now2 = Date.now();
3002
+ const base = local.physical;
3003
+ let physical;
3004
+ let logical;
3005
+ if (now2 > base) {
3006
+ physical = now2;
3007
+ logical = 0;
3008
+ } else if (now2 < base) {
3009
+ physical = base;
3010
+ logical = local.logical + 1;
3011
+ } else {
3012
+ physical = base;
3013
+ logical = local.logical + 1;
3014
+ }
3015
+ local.physical = physical;
3016
+ local.logical = logical;
3017
+ return { physical, logical, node: local.node };
3018
+ }
3019
+ __name(tick, "tick");
3020
+ function receive(remote) {
3021
+ const now2 = Date.now();
3022
+ if (remote.physical > local.physical) {
3023
+ local.physical = remote.physical > now2 ? remote.physical : now2;
3024
+ local.logical = 1;
3025
+ } else if (remote.physical === local.physical) {
3026
+ local.logical = Math.max(local.logical, remote.logical) + 1;
3027
+ }
3028
+ local.node = getNodeId();
3029
+ return { ...local };
3030
+ }
3031
+ __name(receive, "receive");
3032
+ function compare(a, b) {
3033
+ if (a.physical !== b.physical) {
3034
+ return a.physical < b.physical ? -1 : 1;
3035
+ }
3036
+ if (a.logical !== b.logical) {
3037
+ return a.logical < b.logical ? -1 : 1;
3038
+ }
3039
+ if (a.node !== b.node) {
3040
+ return a.node < b.node ? -1 : 1;
3041
+ }
3042
+ return 0;
3043
+ }
3044
+ __name(compare, "compare");
3045
+ function happenedBefore(a, b) {
3046
+ return compare(a, b) < 0;
3047
+ }
3048
+ __name(happenedBefore, "happenedBefore");
3049
+ function serialize(hlc2) {
3050
+ return `hlc:${hlc2.physical}:${hlc2.logical}:${hlc2.node}`;
3051
+ }
3052
+ __name(serialize, "serialize");
3053
+ function parse(serialized) {
3054
+ if (!serialized.startsWith("hlc:")) return null;
3055
+ const parts = serialized.split(":");
3056
+ if (parts.length !== 4) return null;
3057
+ const physical = parseInt(parts[1], 10);
3058
+ const logical = parseInt(parts[2], 10);
3059
+ const node = parts[3];
3060
+ if (isNaN(physical) || isNaN(logical)) return null;
3061
+ return { physical, logical, node };
3062
+ }
3063
+ __name(parse, "parse");
3064
+ var hlc = {
3065
+ tick,
3066
+ receive,
3067
+ compare,
3068
+ happenedBefore,
3069
+ serialize,
3070
+ parse,
3071
+ getNodeId
3072
+ };
43
3073
 
44
- Context Management:
45
- memorio.isolate(name) - Create isolated context
46
- memorio.listContexts() - List all contexts
47
- memorio.deleteContext(id) - Delete a context
3074
+ // core/fractional.ts
3075
+ init_cjs_shims();
3076
+ function generateBetween(left, right, minChars = 2) {
3077
+ if (left !== null && right !== null && left >= right) {
3078
+ throw new Error(`left (${left}) must be < right (${right})`);
3079
+ }
3080
+ if (left === null && right === null) {
3081
+ return "a";
3082
+ }
3083
+ if (left === null) {
3084
+ return generateLower(right, minChars);
3085
+ }
3086
+ if (right === null) {
3087
+ return generateUpper(left, minChars);
3088
+ }
3089
+ return generateMiddle(left, right, minChars);
3090
+ }
3091
+ __name(generateBetween, "generateBetween");
3092
+ function generateLower(right, minChars) {
3093
+ const rightDigits = right.split(".");
3094
+ const first = rightDigits[0];
3095
+ const firstChar = first.charCodeAt(0);
3096
+ if (firstChar > "a".charCodeAt(0)) {
3097
+ const prev = String.fromCharCode(firstChar - 1);
3098
+ const rest = first.slice(1);
3099
+ if (rest === "") {
3100
+ return leftPad(prev, minChars);
3101
+ }
3102
+ return prev + rest;
3103
+ }
3104
+ if (first[0] === "a") {
3105
+ let i = 0;
3106
+ while (i < first.length && first[i] === "a") i++;
3107
+ if (i === first.length) {
3108
+ return ".z." + ".z".repeat(Math.floor(minChars / 2) + 1);
3109
+ }
3110
+ const char = first.charCodeAt(i);
3111
+ const next = String.fromCharCode(char - 1);
3112
+ if (next >= "a") {
3113
+ return next + first.slice(i + 1);
3114
+ }
3115
+ return "a" + next + first.slice(i + 1);
3116
+ }
3117
+ return ".z." + ".z".repeat(Math.floor(minChars / 2) + 1);
3118
+ }
3119
+ __name(generateLower, "generateLower");
3120
+ function generateUpper(left, minChars) {
3121
+ const leftDigits = left.split(".");
3122
+ const first = leftDigits[0];
3123
+ const firstChar = first.charCodeAt(0);
3124
+ const nextChar = String.fromCharCode(firstChar + 1);
3125
+ if (nextChar <= "z") {
3126
+ const rest = first.slice(1);
3127
+ if (rest === "") {
3128
+ return rightPad(nextChar, minChars);
3129
+ }
3130
+ return nextChar + rest;
3131
+ }
3132
+ if (first.length > 1) {
3133
+ const lastChar = first[first.length - 1];
3134
+ if (lastChar < "z") {
3135
+ return first.slice(0, -1) + String.fromCharCode(lastChar.charCodeAt(0) + 1);
3136
+ }
3137
+ }
3138
+ const carry = handleCarry(first, 0);
3139
+ if (carry !== null) {
3140
+ return carry + leftPad("a", minChars);
3141
+ }
3142
+ return "b" + leftPad("a", minChars);
3143
+ }
3144
+ __name(generateUpper, "generateUpper");
3145
+ function handleCarry(digits, carryPos) {
3146
+ if (carryPos >= digits.length) return null;
3147
+ const char = digits.charCodeAt(carryPos);
3148
+ if (char < "z".charCodeAt(0)) {
3149
+ return digits.slice(0, carryPos) + String.fromCharCode(char + 1);
3150
+ }
3151
+ return handleCarry(digits, carryPos + 1);
3152
+ }
3153
+ __name(handleCarry, "handleCarry");
3154
+ function generateMiddle(left, right, minChars) {
3155
+ const leftDigits = left.split(".");
3156
+ const rightDigits = right.split(".");
3157
+ const maxLen = Math.max(leftDigits.length, rightDigits.length);
3158
+ const leftParts = padParts(leftDigits, maxLen);
3159
+ const rightParts = padParts(rightDigits, maxLen);
3160
+ let prefix = [];
3161
+ for (let i = 0; i < maxLen; i++) {
3162
+ const l = leftParts[i] || "a";
3163
+ const r = rightParts[i] || "z";
3164
+ if (l === r) {
3165
+ prefix.push(l);
3166
+ } else {
3167
+ const lCode = l.charCodeAt(0);
3168
+ const rCode = r.charCodeAt(0);
3169
+ if (rCode - lCode > 1) {
3170
+ prefix.push(String.fromCharCode(lCode + 1));
3171
+ while (prefix.length < minChars) {
3172
+ prefix.push("a");
3173
+ }
3174
+ return prefix.join(".");
3175
+ }
3176
+ prefix.push(l);
3177
+ prefix.push(generateUpper(l, minChars));
3178
+ return prefix.join(".");
3179
+ }
3180
+ }
3181
+ return generateUpper(left, minChars);
3182
+ }
3183
+ __name(generateMiddle, "generateMiddle");
3184
+ function padParts(parts, maxLen) {
3185
+ while (parts.length < maxLen) parts.push("a");
3186
+ return parts;
3187
+ }
3188
+ __name(padParts, "padParts");
3189
+ function leftPad(key, minChars) {
3190
+ let result = key;
3191
+ while (result.length < minChars) result = "a" + result;
3192
+ return result;
3193
+ }
3194
+ __name(leftPad, "leftPad");
3195
+ function rightPad(key, minChars) {
3196
+ let result = key;
3197
+ while (result.length < minChars) result = result + "a";
3198
+ return result;
3199
+ }
3200
+ __name(rightPad, "rightPad");
3201
+ function firstKey() {
3202
+ return generateBetween(null, null);
3203
+ }
3204
+ __name(firstKey, "firstKey");
3205
+ function after(left) {
3206
+ return generateBetween(left, null);
3207
+ }
3208
+ __name(after, "after");
3209
+ function before(right) {
3210
+ return generateBetween(null, right);
3211
+ }
3212
+ __name(before, "before");
3213
+ function between(left, right) {
3214
+ return generateBetween(left, right);
3215
+ }
3216
+ __name(between, "between");
3217
+ function reorder(items, fromIndex, toIndex) {
3218
+ if (fromIndex === toIndex) return items.map((i) => i.key);
3219
+ const reordered = [...items];
3220
+ const [removed] = reordered.splice(fromIndex, 1);
3221
+ reordered.splice(toIndex, 0, removed);
3222
+ return reordered.map((i) => i.key);
3223
+ }
3224
+ __name(reorder, "reorder");
3225
+ function reindex(items) {
3226
+ if (items.length === 0) return items;
3227
+ const result = [];
3228
+ let prev = null;
3229
+ for (let i = 0; i < items.length; i++) {
3230
+ const next = i < items.length - 1 ? items[i + 1].key : null;
3231
+ const newItem = { ...items[i] };
3232
+ if (prev === null) {
3233
+ newItem.key = before(items[0].key);
3234
+ } else if (next === null) {
3235
+ newItem.key = after(prev);
3236
+ } else {
3237
+ newItem.key = between(prev, next);
3238
+ }
3239
+ result.push(newItem);
3240
+ prev = newItem.key;
3241
+ }
3242
+ return result;
3243
+ }
3244
+ __name(reindex, "reindex");
3245
+ var fractional = {
3246
+ generateBetween,
3247
+ firstKey,
3248
+ after,
3249
+ before,
3250
+ between,
3251
+ reorder,
3252
+ reindex
3253
+ };
48
3254
 
49
- Platform Detection:
50
- memorio.isBrowser() - Browser environment
51
- memorio.isNode() - Node.js environment
52
- memorio.isDeno() - Deno environment
53
- memorio.isEdge() - Edge/Worker environment
54
- memorio.getCapabilities() - Full capabilities object
3255
+ // index.ts
3256
+ init_internal();
3257
+ init_platform();
55
3258
 
56
- DevTools:
57
- memorio.devtools.inspect() - Inspect all modules
58
- memorio.devtools.stats() - Show statistics
59
- memorio.devtools.watch() - Watch a path
60
- memorio.devtools.exportData() - Export as JSON
61
- memorio.devtools.importData() - Import from JSON
62
- memorio.devtools.clear() - Clear specific module
63
- memorio.devtools.clearAll() - Clear all modules
3259
+ // core/global.ts
3260
+ init_cjs_shims();
3261
+ init_platform();
3262
+ init_internal();
64
3263
 
65
- Memory System:
66
- memorio.memory.remember(key, value, opts) - Store a memory with type, confidence, scope, TTL, tags
67
- memorio.memory.recall(key, opts) - Retrieve a memory with filtering
68
- memorio.memory.update(key, value, opts) - Update an existing memory
69
- memorio.memory.forget(key) - Delete a specific memory
70
- memorio.memory.context(opts) - Get ranked relevant memories (semantic context for AI)
71
- memorio.memory.stats() - Memory usage statistics
72
- memorio.memory.forgetExpired() - Remove all expired entries
73
- memorio.memory.clear() - Wipe all memories
74
- memorio.memory.configure({ sync }) - Optional cloud-sync provider + namespace
75
- memorio.memory.journal.pending() - Local op journal (SQLite/store)
3264
+ // package.json
3265
+ var package_default = {
3266
+ version: "4.9.7"};
76
3267
 
77
- Scopes:
78
- hot - In-memory reactive state (volatile, fastest)
79
- session - sessionStorage (persists across page reloads, cleared on tab close)
80
- local - localStorage (persistent, survives browser restart)
81
- durable - IndexedDB (large datasets, async)
82
- sql - SQLite / sql.js (browser, optional, full SQL)
3268
+ // core/global.ts
3269
+ init_env();
3270
+ init_store();
3271
+ init_idb();
3272
+ init_sqlite();
3273
+ init_message();
83
3274
 
84
- TTL options:
85
- ttl: number (milliseconds) or null (never expires)
3275
+ // functions/typed/index.ts
3276
+ init_cjs_shims();
3277
+ function typed() {
3278
+ return exports.state;
3279
+ }
3280
+ __name(typed, "typed");
86
3281
 
87
- Memory types:
88
- fact, preference, decision, task, context
3282
+ // functions/history/index.ts
3283
+ init_cjs_shims();
3284
+ init_internal();
3285
+ init_message();
3286
+ function _clone(value) {
3287
+ if (value === null || typeof value !== "object") return value;
3288
+ const ctor = value.constructor?.name;
3289
+ if (ctor !== "Object" && ctor !== "Array") return value;
3290
+ try {
3291
+ return JSON.parse(JSON.stringify(value));
3292
+ } catch {
3293
+ return value;
3294
+ }
3295
+ }
3296
+ __name(_clone, "_clone");
3297
+ var snapshot = /* @__PURE__ */ __name(() => {
3298
+ return _clone(deepRaw(exports.state));
3299
+ }, "snapshot");
3300
+ var diff = /* @__PURE__ */ __name((snap) => {
3301
+ const changes = [];
3302
+ const _walk = /* @__PURE__ */ __name((oldObj, newObj, prefix) => {
3303
+ const oldKeys = oldObj ? Object.keys(oldObj) : [];
3304
+ const newKeys = newObj ? Object.keys(newObj) : [];
3305
+ for (const key of newKeys) {
3306
+ const newPath = prefix ? `${prefix}.${key}` : key;
3307
+ const oldVal = oldObj ? oldObj[key] : void 0;
3308
+ const newVal = newObj[key];
3309
+ if (oldVal !== newVal) {
3310
+ const oldType = typeof oldVal;
3311
+ const newType = typeof newVal;
3312
+ if (oldType !== newType || oldVal === void 0) {
3313
+ changes.push({ path: newPath, oldValue: oldVal, newValue: newVal });
3314
+ } else if (oldVal && typeof oldVal === "object") {
3315
+ _walk(oldVal, newVal, newPath);
3316
+ } else if (oldVal !== newVal) {
3317
+ changes.push({ path: newPath, oldValue: oldVal, newValue: newVal });
3318
+ }
3319
+ }
3320
+ }
3321
+ for (const key of oldKeys) {
3322
+ if (!(key in (newObj || {}))) {
3323
+ const newPath = prefix ? `${prefix}.${key}` : key;
3324
+ changes.push({ path: newPath, oldValue: oldObj[key], newValue: void 0 });
3325
+ }
3326
+ }
3327
+ }, "_walk");
3328
+ _walk(snap, deepRaw(exports.state), "");
3329
+ return changes;
3330
+ }, "diff");
3331
+ var enableHistory = /* @__PURE__ */ __name((enabled = true) => {
3332
+ exports.internal.historyEnabled = enabled;
3333
+ message_default(`[memorio history] Tracking ${enabled ? "enabled" : "disabled"}`);
3334
+ }, "enableHistory");
3335
+ var trace = /* @__PURE__ */ __name(() => {
3336
+ return [...exports.internal.mutations];
3337
+ }, "trace");
3338
+ var canUndo = /* @__PURE__ */ __name(() => {
3339
+ return exports.internal.canUndo();
3340
+ }, "canUndo");
3341
+ var canRedo = /* @__PURE__ */ __name(() => {
3342
+ return exports.internal.canRedo();
3343
+ }, "canRedo");
3344
+ var undo = /* @__PURE__ */ __name(() => {
3345
+ if (!exports.internal.historyEnabled) {
3346
+ message_default("[memorio history] History is not enabled");
3347
+ return void 0;
3348
+ }
3349
+ const record = exports.internal.popUndo();
3350
+ if (!record) return void 0;
3351
+ _applyInverse(record);
3352
+ message_default(`[memorio history] Undid: ${record.action} ${record.path}`);
3353
+ return record;
3354
+ }, "undo");
3355
+ var redo = /* @__PURE__ */ __name(() => {
3356
+ if (!exports.internal.historyEnabled) {
3357
+ message_default("[memorio history] History is not enabled");
3358
+ return void 0;
3359
+ }
3360
+ const record = exports.internal.popRedo();
3361
+ if (!record) return void 0;
3362
+ _applyForward(record);
3363
+ message_default(`[memorio history] Redid: ${record.action} ${record.path}`);
3364
+ return record;
3365
+ }, "redo");
3366
+ function _applyInverse(record) {
3367
+ const wasEnabled = exports.internal.historyEnabled;
3368
+ exports.internal.historyEnabled = false;
3369
+ try {
3370
+ if (record.action === "set") {
3371
+ if (record.previousValue === void 0) {
3372
+ _deletePath(record.path);
3373
+ } else {
3374
+ _setPath(record.path, record.previousValue);
3375
+ }
3376
+ } else if (record.action === "delete") {
3377
+ if (record.previousValue !== void 0) {
3378
+ _setPath(record.path, record.previousValue);
3379
+ }
3380
+ }
3381
+ } finally {
3382
+ exports.internal.historyEnabled = wasEnabled;
3383
+ }
3384
+ }
3385
+ __name(_applyInverse, "_applyInverse");
3386
+ function _applyForward(record) {
3387
+ const wasEnabled = exports.internal.historyEnabled;
3388
+ exports.internal.historyEnabled = false;
3389
+ try {
3390
+ if (record.action === "set") {
3391
+ _setPath(record.path, record.newValue);
3392
+ } else if (record.action === "delete") {
3393
+ _deletePath(record.path);
3394
+ }
3395
+ } finally {
3396
+ exports.internal.historyEnabled = wasEnabled;
3397
+ }
3398
+ }
3399
+ __name(_applyForward, "_applyForward");
3400
+ function _setPath(path, value) {
3401
+ const parts = path.split(".");
3402
+ let current = exports.state;
3403
+ for (let i = 0; i < parts.length - 1; i++) {
3404
+ const part = parts[i];
3405
+ if (current[part] === void 0) {
3406
+ current[part] = {};
3407
+ }
3408
+ current = current[part];
3409
+ }
3410
+ current[parts[parts.length - 1]] = value;
3411
+ }
3412
+ __name(_setPath, "_setPath");
3413
+ function _deletePath(path) {
3414
+ const parts = path.split(".");
3415
+ if (parts.length === 1) {
3416
+ exports.state.remove(parts[0]);
3417
+ return;
3418
+ }
3419
+ let current = exports.state;
3420
+ for (let i = 0; i < parts.length - 1; i++) {
3421
+ const part = parts[i];
3422
+ if (current[part] === void 0) return;
3423
+ current = current[part];
3424
+ }
3425
+ delete current[parts[parts.length - 1]];
3426
+ }
3427
+ __name(_deletePath, "_deletePath");
3428
+ var rollback = /* @__PURE__ */ __name((snap) => {
3429
+ exports.state.removeAll();
3430
+ for (const key of Object.keys(snap)) {
3431
+ exports.state[key] = _clone(snap[key]);
3432
+ }
3433
+ exports.internal.clearHistory();
3434
+ message_default("[memorio history] State rolled back to snapshot");
3435
+ }, "rollback");
3436
+ var clearHistory2 = /* @__PURE__ */ __name(() => {
3437
+ exports.internal.clearHistory();
3438
+ message_default("[memorio history] History cleared");
3439
+ }, "clearHistory");
3440
+ var clearRedo = /* @__PURE__ */ __name(() => {
3441
+ exports.internal.clearRedo();
3442
+ }, "clearRedo");
89
3443
 
90
- Shortcuts:
91
- state, store, session, cache, idb, sqlite - direct access to modules
92
- `);};memorio.help=function(){console.debug(`
93
- \u{1F9E0} Memorio ${ye.version} - Help
3444
+ // functions/memory/index.ts
3445
+ init_cjs_shims();
3446
+ init_store();
3447
+ init_idb();
3448
+
3449
+ // functions/memory/journal.ts
3450
+ init_cjs_shims();
3451
+ init_store();
3452
+ var g2 = globalThis;
3453
+ function namespace() {
3454
+ const cfg = g2.memorioSyncConfig;
3455
+ if (cfg && typeof cfg.namespace === "string" && cfg.namespace) return `ns:${cfg.namespace}`;
3456
+ const ctx = g2.memorio ? g2.memorio._currentContext : void 0;
3457
+ const ctxName = typeof ctx === "string" && ctx ? ctx : "";
3458
+ return ctxName ? `ctx:${ctxName}` : "default";
3459
+ }
3460
+ __name(namespace, "namespace");
3461
+ function isSyncEnabled() {
3462
+ return !!g2.memorioSyncConfig;
3463
+ }
3464
+ __name(isSyncEnabled, "isSyncEnabled");
3465
+ var STORE_PREFIX = /* @__PURE__ */ __name((ns) => `memorio:sync:${ns}:`, "STORE_PREFIX");
3466
+ var INDEX_KEY = /* @__PURE__ */ __name((ns) => `${STORE_PREFIX(ns)}index`, "INDEX_KEY");
3467
+ function parseEntry(raw) {
3468
+ try {
3469
+ if (typeof raw === "string") return JSON.parse(raw);
3470
+ return raw;
3471
+ } catch {
3472
+ return null;
3473
+ }
3474
+ }
3475
+ __name(parseEntry, "parseEntry");
3476
+ var journal = {
3477
+ /** Append (or replace) a journal row for the current namespace. */
3478
+ async append(entry, operation) {
3479
+ const ns = namespace();
3480
+ const row = {
3481
+ ...entry,
3482
+ operation,
3483
+ updatedAt: entry.updatedAt || Date.now(),
3484
+ version: entry.version || 1,
3485
+ sync: "pending",
3486
+ hlc: entry.hlc || hlc.serialize(hlc.tick())
3487
+ };
3488
+ const key = `${STORE_PREFIX(ns)}${row.id}`;
3489
+ exports.store.set(key, row);
3490
+ const idx = exports.store.get(INDEX_KEY(ns)) || [];
3491
+ if (!idx.includes(row.id)) idx.push(row.id);
3492
+ exports.store.set(INDEX_KEY(ns), idx);
3493
+ return row;
3494
+ },
3495
+ /** All pending (not-yet-synced) entries for the current namespace. */
3496
+ async pending() {
3497
+ const ns = namespace();
3498
+ const out = [];
3499
+ const idx = exports.store.get(INDEX_KEY(ns)) || [];
3500
+ for (const id of idx) {
3501
+ const raw = exports.store.get(`${STORE_PREFIX(ns)}${id}`);
3502
+ if (!raw) continue;
3503
+ const e = parseEntry(raw);
3504
+ if (e && e.sync !== "synced") out.push(e);
3505
+ }
3506
+ out.sort((a, b) => {
3507
+ if (a.hlc && b.hlc) {
3508
+ const ha = hlc.parse(a.hlc);
3509
+ const hb = hlc.parse(b.hlc);
3510
+ if (ha && hb) return hlc.compare(ha, hb);
3511
+ }
3512
+ return (a.updatedAt || 0) - (b.updatedAt || 0);
3513
+ });
3514
+ return out;
3515
+ },
3516
+ /**
3517
+ * Mark entries as synced. Returns the number of rows actually advanced to
3518
+ * `synced` (namespace-scoped).
3519
+ */
3520
+ async markSynced(ids) {
3521
+ if (!ids.length) return 0;
3522
+ const ns = namespace();
3523
+ let count = 0;
3524
+ const idx = exports.store.get(INDEX_KEY(ns)) || [];
3525
+ for (const id of idx) {
3526
+ if (!ids.includes(id)) continue;
3527
+ const key = `${STORE_PREFIX(ns)}${id}`;
3528
+ const raw = exports.store.get(key);
3529
+ if (!raw) continue;
3530
+ const e = parseEntry(raw);
3531
+ if (!e || e.sync === "synced") continue;
3532
+ e.sync = "synced";
3533
+ exports.store.set(key, e);
3534
+ count++;
3535
+ }
3536
+ return count;
3537
+ },
3538
+ async get(id) {
3539
+ const ns = namespace();
3540
+ const raw = exports.store.get(`${STORE_PREFIX(ns)}${id}`);
3541
+ return parseEntry(raw ?? "");
3542
+ },
3543
+ /** Remove all journal rows for the current namespace. */
3544
+ async clear() {
3545
+ const ns = namespace();
3546
+ const idx = exports.store.get(INDEX_KEY(ns)) || [];
3547
+ for (const id of idx) exports.store.remove(`${STORE_PREFIX(ns)}${id}`);
3548
+ exports.store.remove(INDEX_KEY(ns));
3549
+ },
3550
+ /**
3551
+ * Reconcile the local journal against the configured provider. Pushes pending
3552
+ * local operations, then optionally pulls newer remote operations and applies
3553
+ * them. No-op (empty ack) when no provider is configured.
3554
+ *
3555
+ * When pulling remote entries, HLC timestamps are used to order operations
3556
+ * causally. Concurrent writes to the same key are resolved via the provider's
3557
+ * `resolveConflict` method (if provided), falling back to HLC timestamp
3558
+ * comparison.
3559
+ */
3560
+ async replay() {
3561
+ const ack = { synced: [], resolved: [] };
3562
+ if (!isSyncEnabled()) return ack;
3563
+ const transport = g2.memorioSyncConfig || {};
3564
+ const provider = transport.provider;
3565
+ if (!provider || typeof provider.push !== "function") return ack;
3566
+ const pending = await this.pending();
3567
+ if (pending.length) {
3568
+ try {
3569
+ const res = await provider.push(pending);
3570
+ ack.synced = res?.synced || [];
3571
+ ack.conflicts = res?.conflicts;
3572
+ ack.error = res?.error;
3573
+ if (ack.synced.length) await this.markSynced(ack.synced);
3574
+ } catch (err) {
3575
+ ack.error = String(err);
3576
+ }
3577
+ }
3578
+ if (typeof provider.pull === "function") {
3579
+ try {
3580
+ const since = pending.length ? Math.min(...pending.map((p) => p.updatedAt || 0)) : 0;
3581
+ const remote = await provider.pull(since);
3582
+ for (const e of remote || []) {
3583
+ if (e.hlc) {
3584
+ const parsed = hlc.parse(e.hlc);
3585
+ if (parsed) hlc.receive(parsed);
3586
+ }
3587
+ const localEntry = await this.get(e.id);
3588
+ if (localEntry && e.hlc && localEntry.hlc) {
3589
+ const ha = hlc.parse(localEntry.hlc);
3590
+ const hb = hlc.parse(e.hlc);
3591
+ if (ha && hb) {
3592
+ const cmp = hlc.compare(ha, hb);
3593
+ if (cmp === 0) {
3594
+ const resolution = typeof provider.resolveConflict === "function" ? await provider.resolveConflict(localEntry, e) : "remote";
3595
+ ack.resolved?.push({ id: e.id, resolution });
3596
+ if (resolution === "local") continue;
3597
+ } else if (cmp > 0) {
3598
+ continue;
3599
+ }
3600
+ }
3601
+ }
3602
+ await this.append(e, e.operation || "confirm");
3603
+ await this.markSynced([e.id]);
3604
+ }
3605
+ } catch (_) {
3606
+ }
3607
+ }
3608
+ return ack;
3609
+ },
3610
+ status() {
3611
+ return Promise.resolve("store");
3612
+ }
3613
+ };
3614
+ function configure2(opts) {
3615
+ const prev = g2.memorioSyncConfig || {};
3616
+ g2.memorioSyncConfig = { ...prev, ...opts };
3617
+ return journal;
3618
+ }
3619
+ __name(configure2, "configure");
3620
+ if (typeof g2.addEventListener === "function") {
3621
+ let armed = false;
3622
+ g2.addEventListener("focus", () => {
3623
+ if (armed || !isSyncEnabled()) return;
3624
+ armed = true;
3625
+ void journal.replay().finally(() => {
3626
+ armed = false;
3627
+ });
3628
+ });
3629
+ }
3630
+ var journal_default = journal;
3631
+
3632
+ // functions/memory/index.ts
3633
+ var MEMORY_INDEX_KEY = "__memorio_memory_index__";
3634
+ var SUPERSEDED_PREFIX = "__memorio_superseded__";
3635
+ function isSyncEnabled2() {
3636
+ return !!globalThis.memorioSyncConfig;
3637
+ }
3638
+ __name(isSyncEnabled2, "isSyncEnabled");
3639
+ async function recordJournal(entry, operation) {
3640
+ if (!isSyncEnabled2()) return;
3641
+ if (entry.scope === "hot") return;
3642
+ try {
3643
+ await journal_default.append(entry, operation);
3644
+ } catch (_) {
3645
+ }
3646
+ }
3647
+ __name(recordJournal, "recordJournal");
3648
+ function memoryEntryKey(id) {
3649
+ return id.startsWith(SUPERSEDED_PREFIX) ? id : `${SUPERSEDED_PREFIX}${id}`;
3650
+ }
3651
+ __name(memoryEntryKey, "memoryEntryKey");
3652
+ function normalizeTags(tags) {
3653
+ if (!tags) return [];
3654
+ return Array.isArray(tags) ? tags : [tags];
3655
+ }
3656
+ __name(normalizeTags, "normalizeTags");
3657
+ function resolveScope(value, opts) {
3658
+ if (opts.scope) return opts.scope;
3659
+ const size = JSON.stringify(value).length;
3660
+ if (size > 1e6) return "durable";
3661
+ if (size > 1e5) return "local";
3662
+ return "local";
3663
+ }
3664
+ __name(resolveScope, "resolveScope");
3665
+ function now() {
3666
+ return Date.now();
3667
+ }
3668
+ __name(now, "now");
3669
+ function isExpired(entry) {
3670
+ if (entry.ttl === null || entry.ttl === void 0) return false;
3671
+ return now() - entry.createdAt > entry.ttl;
3672
+ }
3673
+ __name(isExpired, "isExpired");
3674
+ function matchesFilters(entry, opts) {
3675
+ if (entry.status === "obsolete") return opts.includeObsolete ?? false;
3676
+ if (entry.status === "superseded") return opts.includeObsolete ?? false;
3677
+ if (isExpired(entry)) {
3678
+ return opts.includeObsolete ?? false;
3679
+ }
3680
+ if (opts.type) {
3681
+ const types = Array.isArray(opts.type) ? opts.type : [opts.type];
3682
+ if (!types.includes(entry.type)) return false;
3683
+ }
3684
+ if (opts.minConfidence !== void 0 && entry.confidence < opts.minConfidence) return false;
3685
+ return true;
3686
+ }
3687
+ __name(matchesFilters, "matchesFilters");
3688
+ function matchesContextFilters(entry, opts) {
3689
+ if (entry.status !== "active") return false;
3690
+ if (isExpired(entry)) return false;
3691
+ if (opts.tags) {
3692
+ const tags = Array.isArray(opts.tags) ? opts.tags : [opts.tags];
3693
+ const hasMatch = tags.some((t) => entry.tags.includes(t));
3694
+ if (!hasMatch) return false;
3695
+ }
3696
+ if (opts.types) {
3697
+ const types = Array.isArray(opts.types) ? opts.types : [opts.types];
3698
+ if (!types.includes(entry.type)) return false;
3699
+ }
3700
+ if (opts.minConfidence !== void 0 && entry.confidence < opts.minConfidence) return false;
3701
+ if (opts.scopes && !opts.scopes.includes(entry.scope)) return false;
3702
+ return true;
3703
+ }
3704
+ __name(matchesContextFilters, "matchesContextFilters");
3705
+ function computeRelevance(entry) {
3706
+ const ageHours = (now() - entry.createdAt) / (1e3 * 3600);
3707
+ const recencyScore = Math.max(0.1, 1 / (1 + ageHours * 0.5));
3708
+ const confidenceScore = entry.confidence;
3709
+ const accessScore = 1 + entry.tags.length * 0.1;
3710
+ const typeBoost = {
3711
+ decision: 1.5,
3712
+ context: 1.3,
3713
+ preference: 1.2,
3714
+ task: 1,
3715
+ fact: 0.8
3716
+ };
3717
+ const scopeBoost = {
3718
+ hot: 1.5,
3719
+ session: 1.2,
3720
+ local: 1,
3721
+ durable: 0.8
3722
+ };
3723
+ return recencyScore * confidenceScore * accessScore * typeBoost[entry.type] * scopeBoost[entry.scope];
3724
+ }
3725
+ __name(computeRelevance, "computeRelevance");
3726
+ function getNestedPath(obj, path) {
3727
+ if (!path || typeof path !== "string") return void 0;
3728
+ const parts = path.replace(/^state\./, "").split(".");
3729
+ let current = obj;
3730
+ for (const part of parts) {
3731
+ if (current === null || current === void 0) return void 0;
3732
+ current = current[part];
3733
+ }
3734
+ return current;
3735
+ }
3736
+ __name(getNestedPath, "getNestedPath");
3737
+ function setNestedPath(obj, path, value) {
3738
+ if (!path || typeof path !== "string") return;
3739
+ const parts = path.replace(/^state\./, "").split(".");
3740
+ let current = obj;
3741
+ for (let i = 0; i < parts.length - 1; i++) {
3742
+ const part = parts[i];
3743
+ if (current[part] === void 0 || current[part] === null) {
3744
+ current[part] = {};
3745
+ }
3746
+ current = current[part];
3747
+ }
3748
+ current[parts[parts.length - 1]] = value;
3749
+ }
3750
+ __name(setNestedPath, "setNestedPath");
3751
+ function deleteNestedPath(obj, path) {
3752
+ if (!path || typeof path !== "string") return;
3753
+ const parts = path.replace(/^state\./, "").split(".");
3754
+ let current = obj;
3755
+ for (let i = 0; i < parts.length - 1; i++) {
3756
+ const part = parts[i];
3757
+ if (current[part] === void 0 || current[part] === null) return;
3758
+ current = current[part];
3759
+ }
3760
+ delete current[parts[parts.length - 1]];
3761
+ }
3762
+ __name(deleteNestedPath, "deleteNestedPath");
3763
+ async function saveToScope(entry) {
3764
+ const storageKey = entry.status === "superseded" ? memoryEntryKey(entry.id || entry.key) : entry.key;
3765
+ const serialized = JSON.stringify(entry);
3766
+ switch (entry.scope) {
3767
+ case "hot":
3768
+ setNestedPath(exports.state, storageKey, entry.value);
3769
+ break;
3770
+ case "session":
3771
+ exports.session.set(storageKey, serialized);
3772
+ break;
3773
+ case "local":
3774
+ exports.store.set(storageKey, serialized);
3775
+ break;
3776
+ case "durable":
3777
+ await exports.idb.set("memories", storageKey, serialized);
3778
+ break;
3779
+ }
3780
+ await updateIndex(entry.id || entry.key, entry.scope, entry.status === "superseded");
3781
+ }
3782
+ __name(saveToScope, "saveToScope");
3783
+ async function loadFromScope(id, scope, isSuperseded = false) {
3784
+ const storageKey = isSuperseded ? memoryEntryKey(id) : id;
3785
+ let raw;
3786
+ switch (scope) {
3787
+ case "hot": {
3788
+ const val = getNestedPath(exports.state, storageKey);
3789
+ if (val === void 0) return null;
3790
+ return reconstructEntry(id, val, scope);
3791
+ }
3792
+ case "session":
3793
+ raw = exports.session.get(storageKey);
3794
+ break;
3795
+ case "local":
3796
+ raw = exports.store.get(storageKey);
3797
+ break;
3798
+ case "durable":
3799
+ raw = await exports.idb.get("memories", storageKey);
3800
+ break;
3801
+ }
3802
+ if (!raw) return null;
3803
+ try {
3804
+ const entry = JSON.parse(raw);
3805
+ entry.id = entry.id || id;
3806
+ return entry;
3807
+ } catch {
3808
+ return null;
3809
+ }
3810
+ }
3811
+ __name(loadFromScope, "loadFromScope");
3812
+ function reconstructEntry(key, value, scope) {
3813
+ return {
3814
+ id: key,
3815
+ key,
3816
+ value,
3817
+ type: "fact",
3818
+ confidence: 1,
3819
+ scope,
3820
+ ttl: null,
3821
+ tags: [],
3822
+ status: "active",
3823
+ createdAt: now(),
3824
+ lastConfirmedAt: now(),
3825
+ supersededId: null
3826
+ };
3827
+ }
3828
+ __name(reconstructEntry, "reconstructEntry");
3829
+ async function removeFromScope(id, scope, isSuperseded = false) {
3830
+ const storageKey = isSuperseded ? memoryEntryKey(id) : id;
3831
+ switch (scope) {
3832
+ case "hot":
3833
+ setNestedPath(exports.state, storageKey, void 0);
3834
+ break;
3835
+ case "session":
3836
+ exports.session.remove(storageKey);
3837
+ break;
3838
+ case "local":
3839
+ exports.store.remove(storageKey);
3840
+ break;
3841
+ case "durable":
3842
+ await exports.idb.deleteKey("memories", storageKey);
3843
+ break;
3844
+ }
3845
+ await removeFromIndex(id, isSuperseded);
3846
+ }
3847
+ __name(removeFromScope, "removeFromScope");
3848
+ async function getAllIndexes() {
3849
+ try {
3850
+ const raw = exports.store.get(MEMORY_INDEX_KEY);
3851
+ if (!raw) return {};
3852
+ return JSON.parse(raw);
3853
+ } catch {
3854
+ return {};
3855
+ }
3856
+ }
3857
+ __name(getAllIndexes, "getAllIndexes");
3858
+ async function updateIndex(id, scope, isSuperseded = false) {
3859
+ const index = await getAllIndexes();
3860
+ index[id] = { scope, superseded: isSuperseded };
3861
+ exports.store.set(MEMORY_INDEX_KEY, JSON.stringify(index));
3862
+ }
3863
+ __name(updateIndex, "updateIndex");
3864
+ async function removeFromIndex(id, isSuperseded = false) {
3865
+ const index = await getAllIndexes();
3866
+ const entry = index[id];
3867
+ if (entry) {
3868
+ if (isSuperseded && entry.superseded) {
3869
+ delete index[id];
3870
+ } else if (!isSuperseded && !entry.superseded) {
3871
+ delete index[id];
3872
+ }
3873
+ }
3874
+ exports.store.set(MEMORY_INDEX_KEY, JSON.stringify(index));
3875
+ }
3876
+ __name(removeFromIndex, "removeFromIndex");
3877
+ async function loadAll() {
3878
+ const index = await getAllIndexes();
3879
+ const entries = [];
3880
+ for (const [id, info] of Object.entries(index)) {
3881
+ const entry = await loadFromScope(id, info.scope, info.superseded);
3882
+ if (entry) {
3883
+ entry.id = entry.id || id;
3884
+ entry.supersededId = entry.supersededId ?? null;
3885
+ entries.push(entry);
3886
+ }
3887
+ }
3888
+ return entries;
3889
+ }
3890
+ __name(loadAll, "loadAll");
3891
+ var memory = {
3892
+ async remember(key, value, opts = {}) {
3893
+ const existing = await this._getEntry(key);
3894
+ if (existing && existing.status === "active") {
3895
+ const supersededId = `${existing.id}__v${Date.now()}`;
3896
+ const superseded = {
3897
+ ...existing,
3898
+ id: supersededId,
3899
+ key: existing.key,
3900
+ status: "superseded",
3901
+ supersededId: null,
3902
+ lastConfirmedAt: now()
3903
+ };
3904
+ await saveToScope(superseded);
3905
+ await recordJournal(superseded, "supersede");
3906
+ }
3907
+ const scope = resolveScope(value, opts);
3908
+ const tags = normalizeTags(opts.tags);
3909
+ const entry = {
3910
+ id: opts.id || key,
3911
+ key,
3912
+ value,
3913
+ type: opts.type || "fact",
3914
+ confidence: opts.confidence ?? 1,
3915
+ scope,
3916
+ ttl: opts.ttl ?? null,
3917
+ tags,
3918
+ source: opts.source,
3919
+ status: "active",
3920
+ createdAt: now(),
3921
+ lastConfirmedAt: now(),
3922
+ updatedAt: now(),
3923
+ version: existing ? existing.version ? existing.version + 1 : 1 : 1,
3924
+ sync: isSyncEnabled2() ? "pending" : void 0,
3925
+ supersededId: existing ? existing.id : null,
3926
+ hlc: hlc.serialize(hlc.tick())
3927
+ };
3928
+ await saveToScope(entry);
3929
+ await recordJournal(entry, "remember");
3930
+ dispatch.set("memorio:memory:remembered", { key, scope, entryId: entry.id });
3931
+ },
3932
+ async recall(query, opts = {}) {
3933
+ const entry = await this._getEntry(query);
3934
+ if (!entry) return null;
3935
+ if (!matchesFilters(entry, opts)) return null;
3936
+ entry.lastConfirmedAt = now();
3937
+ await saveToScope(entry);
3938
+ dispatch.set("memorio:memory:recalled", { key: query });
3939
+ return entry.value;
3940
+ },
3941
+ async context(opts = {}) {
3942
+ const entries = await loadAll();
3943
+ const filtered = entries.filter((e) => matchesContextFilters(e, opts));
3944
+ const ranked = filtered.map((entry) => ({
3945
+ entry,
3946
+ score: computeRelevance(entry)
3947
+ })).sort((a, b) => b.score - a.score).slice(0, opts.maxEntries ?? 25);
3948
+ return ranked.map(({ entry }) => ({
3949
+ key: entry.key,
3950
+ value: entry.value,
3951
+ type: entry.type,
3952
+ confidence: entry.confidence,
3953
+ scope: entry.scope,
3954
+ tags: entry.tags,
3955
+ age: now() - entry.createdAt,
3956
+ accessCount: entry.tags.length + 1,
3957
+ lastAccessedAt: entry.lastConfirmedAt
3958
+ }));
3959
+ },
3960
+ async forget(key) {
3961
+ const entry = await this._getEntry(key);
3962
+ if (!entry) {
3963
+ const tombstone2 = {
3964
+ id: key,
3965
+ key,
3966
+ value: null,
3967
+ type: "fact",
3968
+ confidence: 1,
3969
+ scope: "local",
3970
+ ttl: null,
3971
+ tags: [],
3972
+ status: "obsolete",
3973
+ operation: "delete",
3974
+ createdAt: now(),
3975
+ lastConfirmedAt: now(),
3976
+ updatedAt: now(),
3977
+ version: 1,
3978
+ sync: isSyncEnabled2() ? "pending" : void 0,
3979
+ hlc: hlc.serialize(hlc.tick())
3980
+ };
3981
+ await recordJournal(tombstone2, "delete");
3982
+ return;
3983
+ }
3984
+ await removeFromScope(entry.id || key, entry.scope, entry.status === "superseded");
3985
+ const tombstone = {
3986
+ ...entry,
3987
+ value: null,
3988
+ status: "obsolete",
3989
+ operation: "delete",
3990
+ updatedAt: now(),
3991
+ version: (entry.version ? entry.version : 0) + 1,
3992
+ sync: isSyncEnabled2() ? "pending" : void 0,
3993
+ hlc: hlc.serialize(hlc.tick())
3994
+ };
3995
+ await recordJournal(tombstone, "delete");
3996
+ dispatch.set("memorio:memory:forgotten", { key });
3997
+ },
3998
+ async update(key, value, opts = {}) {
3999
+ const existing = await this._getEntry(key);
4000
+ if (!existing) {
4001
+ await this.remember(key, value, opts);
4002
+ return;
4003
+ }
4004
+ const supersededId = `${existing.id}__v${now()}`;
4005
+ const superseded = {
4006
+ ...existing,
4007
+ id: supersededId,
4008
+ key: existing.key,
4009
+ status: "superseded",
4010
+ supersededId: null,
4011
+ lastConfirmedAt: now()
4012
+ };
4013
+ await saveToScope(superseded);
4014
+ await recordJournal(superseded, "supersede");
4015
+ const updated = {
4016
+ ...existing,
4017
+ value,
4018
+ lastConfirmedAt: now(),
4019
+ updatedAt: now(),
4020
+ version: (existing.version ? existing.version : 0) + 1,
4021
+ sync: isSyncEnabled2() ? "pending" : void 0,
4022
+ hlc: hlc.serialize(hlc.tick()),
4023
+ ...opts.scope ? { scope: opts.scope } : {},
4024
+ ...opts.ttl !== void 0 ? { ttl: opts.ttl } : {},
4025
+ ...opts.type ? { type: opts.type } : {},
4026
+ ...opts.confidence !== void 0 ? { confidence: opts.confidence } : {},
4027
+ ...opts.tags !== void 0 ? { tags: normalizeTags(opts.tags) } : {},
4028
+ ...opts.source ? { source: opts.source } : {}
4029
+ };
4030
+ await saveToScope(updated);
4031
+ await recordJournal(updated, "update");
4032
+ dispatch.set("memorio:memory:updated", { key, entryId: updated.id });
4033
+ },
4034
+ async stats() {
4035
+ const entries = await loadAll();
4036
+ const byScope = { hot: 0, session: 0, local: 0, durable: 0 };
4037
+ const byType = {};
4038
+ let expired = 0;
4039
+ for (const entry of entries) {
4040
+ byScope[entry.scope] = (byScope[entry.scope] || 0) + 1;
4041
+ if (isExpired(entry)) expired++;
4042
+ byType[entry.type] = (byType[entry.type] || 0) + 1;
4043
+ }
4044
+ return { total: entries.length, byScope, byType, expired };
4045
+ },
4046
+ async forgetExpired() {
4047
+ const entries = await loadAll();
4048
+ let count = 0;
4049
+ for (const entry of entries) {
4050
+ if (isExpired(entry) && entry.status === "active") {
4051
+ entry.status = "obsolete";
4052
+ entry.updatedAt = now();
4053
+ entry.operation = "expire";
4054
+ await saveToScope(entry);
4055
+ await recordJournal(entry, "expire");
4056
+ count++;
4057
+ }
4058
+ }
4059
+ return count;
4060
+ },
4061
+ async clear() {
4062
+ const index = await getAllIndexes();
4063
+ for (const [id, info] of Object.entries(index)) {
4064
+ await removeFromScope(id, info.scope, info.superseded);
4065
+ }
4066
+ exports.store.remove(MEMORY_INDEX_KEY);
4067
+ },
4068
+ async _getEntry(key) {
4069
+ const index = await getAllIndexes();
4070
+ const info = index[key];
4071
+ if (!info) {
4072
+ const val = getNestedPath(exports.state, key);
4073
+ if (val !== void 0) return reconstructEntry(key, val, "hot");
4074
+ return null;
4075
+ }
4076
+ return loadFromScope(key, info.scope, info.superseded);
4077
+ },
4078
+ async _loadAll() {
4079
+ return loadAll();
4080
+ },
4081
+ async _save(entry) {
4082
+ await saveToScope(entry);
4083
+ },
4084
+ /** Apply a field-level path patch to an existing memory entry. */
4085
+ async patch(key, patches) {
4086
+ const entry = await this._getEntry(key);
4087
+ if (!entry) return;
4088
+ let patched = false;
4089
+ for (const p of patches) {
4090
+ if (p.op === "set") {
4091
+ setNestedPath({ [entry.key]: entry.value }, p.path.replace(/^[^.]+\./, ""), p.value);
4092
+ patched = true;
4093
+ } else if (p.op === "delete") {
4094
+ deleteNestedPath({ [entry.key]: entry.value }, p.path.replace(/^[^.]+\./, ""));
4095
+ patched = true;
4096
+ }
4097
+ }
4098
+ if (!patched) return;
4099
+ const updated = {
4100
+ ...entry,
4101
+ updatedAt: now(),
4102
+ lastConfirmedAt: now(),
4103
+ version: (entry.version ? entry.version : 0) + 1,
4104
+ sync: isSyncEnabled2() ? "pending" : void 0,
4105
+ hlc: hlc.serialize(hlc.tick()),
4106
+ patches,
4107
+ path: patches[0]?.path
4108
+ };
4109
+ await saveToScope(updated);
4110
+ await recordJournal(updated, "patch");
4111
+ dispatch.set("memorio:memory:patched", { key, patches });
4112
+ },
4113
+ /** Local operation journal (namespaced). No-op substrate when sqlite/idb unavailable. */
4114
+ journal: journal_default,
4115
+ /** Configure the optional cloud-sync layer (namespace + provider). Chainable. */
4116
+ configure(opts) {
4117
+ configure2(opts);
4118
+ return this;
4119
+ }
4120
+ };
94
4121
 
95
- Core Modules:
96
- state - Reactive state management
4122
+ // functions/inspect/index.ts
4123
+ init_cjs_shims();
4124
+ var stateKeys = /* @__PURE__ */ __name(() => {
4125
+ const raw = deepRaw(exports.state);
4126
+ return Object.keys(raw).filter(
4127
+ (k) => !["list", "remove", "removeAll", "lock", "unlock"].includes(k)
4128
+ );
4129
+ }, "stateKeys");
4130
+ var pathExists = /* @__PURE__ */ __name((path) => {
4131
+ if (!path || typeof path !== "string") return false;
4132
+ const parts = path.replace(/^state\./, "").split(".");
4133
+ let current = exports.state;
4134
+ for (const part of parts) {
4135
+ if (current === null || current === void 0) {
4136
+ return false;
4137
+ }
4138
+ current = current[part];
4139
+ }
4140
+ return current !== void 0;
4141
+ }, "pathExists");
4142
+ var stateType = /* @__PURE__ */ __name((path) => {
4143
+ const [exists, value] = _getValue(path);
4144
+ if (!exists || value === void 0) return "undefined";
4145
+ return Array.isArray(value) ? "array" : typeof value;
4146
+ }, "stateType");
4147
+ var stateGet = /* @__PURE__ */ __name((path) => {
4148
+ const [exists, value] = _getValue(path);
4149
+ if (!exists || value === void 0) return void 0;
4150
+ return _clone2(value);
4151
+ }, "stateGet");
4152
+ var stateSchema = /* @__PURE__ */ __name(() => {
4153
+ const result = [];
4154
+ const _walk = /* @__PURE__ */ __name((obj, prefix) => {
4155
+ if (obj === null || typeof obj !== "object" || Array.isArray(obj)) {
4156
+ return;
4157
+ }
4158
+ const keys = Object.keys(obj).filter(
4159
+ (k) => !["list", "remove", "removeAll", "lock", "unlock"].includes(k)
4160
+ );
4161
+ for (const key of keys) {
4162
+ const newPath = prefix ? `${prefix}.${key}` : key;
4163
+ const value = obj[key];
4164
+ const defined = value !== void 0;
4165
+ const type = defined ? Array.isArray(value) ? "array" : typeof value : "undefined";
4166
+ result.push({ path: newPath, type, defined });
4167
+ if (defined && typeof value === "object" && !Array.isArray(value) && value.constructor?.name === "Object") {
4168
+ _walk(value, newPath);
4169
+ }
4170
+ }
4171
+ }, "_walk");
4172
+ _walk(deepRaw(exports.state), "");
4173
+ return result;
4174
+ }, "stateSchema");
4175
+ function _getValue(path) {
4176
+ if (!path || typeof path !== "string") return [false, void 0];
4177
+ const parts = path.replace(/^state\./, "").split(".");
4178
+ let current = exports.state;
4179
+ for (const part of parts) {
4180
+ if (current === null || current === void 0) {
4181
+ return [false, void 0];
4182
+ }
4183
+ current = current[part];
4184
+ }
4185
+ return [current !== void 0, current];
4186
+ }
4187
+ __name(_getValue, "_getValue");
4188
+ function _clone2(value) {
4189
+ if (value === null || typeof value !== "object") return value;
4190
+ const ctor = value.constructor?.name;
4191
+ if (ctor !== "Object" && ctor !== "Array") return value;
4192
+ try {
4193
+ return JSON.parse(JSON.stringify(value));
4194
+ } catch {
4195
+ return value;
4196
+ }
4197
+ }
4198
+ __name(_clone2, "_clone");
4199
+
4200
+ // core/global.ts
4201
+ if (!("memorio" in globalThis)) {
4202
+ Object.defineProperty(
4203
+ globalThis,
4204
+ "memorio",
4205
+ {
4206
+ value: {
4207
+ setProps: /* @__PURE__ */ __name(() => {
4208
+ }, "setProps"),
4209
+ obj: {},
4210
+ array: [],
4211
+ dispatch,
4212
+ message: exports.message,
4213
+ setDescription: /* @__PURE__ */ __name(() => {
4214
+ }, "setDescription")
4215
+ },
4216
+ writable: false,
4217
+ configurable: true,
4218
+ enumerable: false
4219
+ }
4220
+ );
4221
+ Object.defineProperty(
4222
+ globalThis,
4223
+ "events",
4224
+ {
4225
+ value: {},
4226
+ writable: true,
4227
+ enumerable: false
4228
+ }
4229
+ );
4230
+ if (typeof globalThis.addEventListener === "function") {
4231
+ dispatch.listen("memorio:memory:cleanup", async () => memory.forgetExpired?.());
4232
+ }
4233
+ Object.defineProperty(
4234
+ memorio,
4235
+ "version",
4236
+ {
4237
+ writable: false,
4238
+ enumerable: false,
4239
+ value: package_default.version
4240
+ }
4241
+ );
4242
+ memorio.memory = memory;
4243
+ initializePlatform();
4244
+ memorio.isBrowser = isBrowser;
4245
+ memorio.isNode = isNode;
4246
+ memorio.isDeno = isDeno;
4247
+ memorio.isEdge = isEdge;
4248
+ memorio.getCapabilities = getCapabilities;
4249
+ memorio.createContext = createContext;
4250
+ memorio.listContexts = listContexts;
4251
+ memorio.deleteContext = deleteContext;
4252
+ memorio.isolate = (name) => createContext(name);
4253
+ Object.defineProperty(memorio, "setContext", { writable: false, enumerable: false, value: /* @__PURE__ */ __name((id) => setCurrentContext(id), "value") });
4254
+ Object.defineProperty(memorio, "getContext", { writable: false, enumerable: false, value: /* @__PURE__ */ __name(() => exports.internal.currentContext, "value") });
4255
+ memorio.registerSchema = schema.register;
4256
+ memorio.validate = schema.validate;
4257
+ memorio.unregisterSchema = schema.unregister;
4258
+ memorio.listSchemas = schema.list;
4259
+ memorio.typed = typed;
4260
+ memorio.snapshot = snapshot;
4261
+ memorio.diff = diff;
4262
+ memorio.undo = undo;
4263
+ memorio.redo = redo;
4264
+ memorio.canUndo = canUndo;
4265
+ memorio.canRedo = canRedo;
4266
+ memorio.rollback = rollback;
4267
+ memorio.trace = trace;
4268
+ memorio.enableHistory = enableHistory;
4269
+ memorio.clearHistory = clearHistory2;
4270
+ memorio.clearRedo = clearRedo;
4271
+ Object.defineProperty(memorio, "dispatch", { value: dispatch, writable: true, enumerable: false, configurable: true });
4272
+ const isDev = exports.DEV;
4273
+ memorio.env = {
4274
+ isDev,
4275
+ isProd: exports.PROD
4276
+ };
4277
+ memorio.global = function() {
4278
+ const globalDefinitions = {
4279
+ state: exports.state,
4280
+ store: exports.store,
4281
+ session: exports.session,
4282
+ cache,
4283
+ idb: exports.idb,
4284
+ sqlite: exports.sqlite,
4285
+ observer,
4286
+ useObserver
4287
+ };
4288
+ for (const key of Object.keys(globalDefinitions)) {
4289
+ if (!(key in globalThis)) {
4290
+ Object.defineProperty(globalThis, key, {
4291
+ value: globalDefinitions[key],
4292
+ writable: true,
4293
+ enumerable: false,
4294
+ configurable: true
4295
+ });
4296
+ }
4297
+ }
4298
+ };
4299
+ if (isDev) {
4300
+ memorio.global();
4301
+ }
4302
+ if (exports.DEV) {
4303
+ Object.defineProperty(
4304
+ memorio,
4305
+ "debug",
4306
+ {
4307
+ get: /* @__PURE__ */ __name(() => exports.internal.debug, "get"),
4308
+ set: /* @__PURE__ */ __name((v) => {
4309
+ exports.internal.debug = v;
4310
+ }, "set"),
4311
+ enumerable: false
4312
+ }
4313
+ );
4314
+ const caps = getCapabilities();
4315
+ Object.defineProperty(memorio, "_platform", { writable: false, enumerable: false, value: caps.platform });
4316
+ Object.defineProperty(memorio, "_capabilities", { writable: false, enumerable: false, value: caps });
4317
+ Object.defineProperty(memorio, "_sessionId", { writable: false, enumerable: false, value: generateSessionId() });
4318
+ memorio.logger = logger;
4319
+ if (!("$state" in globalThis)) Object.defineProperty(globalThis, "$state", { get: /* @__PURE__ */ __name(() => globalThis.state, "get"), configurable: true });
4320
+ if (!("$store" in globalThis)) Object.defineProperty(globalThis, "$store", { get: /* @__PURE__ */ __name(() => globalThis.store, "get"), configurable: true });
4321
+ if (!("$session" in globalThis)) Object.defineProperty(globalThis, "$session", { get: /* @__PURE__ */ __name(() => globalThis.session, "get"), configurable: true });
4322
+ if (!("$cache" in globalThis)) Object.defineProperty(globalThis, "$cache", { get: /* @__PURE__ */ __name(() => globalThis.cache, "get"), configurable: true });
4323
+ memorio.devtools = devtools;
4324
+ memorio.inspect = stateKeys;
4325
+ memorio.stateKeys = stateKeys;
4326
+ memorio.pathExists = pathExists;
4327
+ memorio.stateType = stateType;
4328
+ memorio.stateGet = stateGet;
4329
+ memorio.stateSchema = stateSchema;
4330
+ memorio.help = function() {
4331
+ console.debug(`
4332
+ \u{1F9E0} Memorio ${package_default.version} - Help
4333
+
4334
+ Core Modules (runtime):
4335
+ state - Reactive state management (DEV global)
97
4336
  store - Persistent storage (localStorage/Map)
98
4337
  session - Session storage (sessionStorage/Map)
99
4338
  cache - In-memory cache
100
4339
  idb - IndexedDB (browser only)
101
4340
  sqlite - SQLite in browser (sql.js, optional)
102
4341
 
103
- API:
104
- memorio.typed<T>() - Type-safe view of global state (compile-time only)
4342
+ Platform Detection:
4343
+ memorio.isBrowser() - Browser environment
4344
+ memorio.isNode() - Node.js environment
4345
+ memorio.isDeno() - Deno environment
4346
+ memorio.isEdge() - Edge/Worker environment
4347
+ memorio.getCapabilities() - Full capabilities object
4348
+
4349
+ Context Management:
4350
+ memorio.isolate(name) - Create isolated context
4351
+ memorio.listContexts() - List all contexts
4352
+ memorio.deleteContext(id) - Delete a context
4353
+
4354
+ Schema Validation (runtime):
105
4355
  memorio.registerSchema() - Register a validator for a state path
106
4356
  memorio.validate() - Manually validate a value
107
4357
  memorio.unregisterSchema() - Remove a registered schema
108
4358
  memorio.listSchemas() - List all registered schema paths
4359
+ memorio.typed<T>() - Type-safe view of global state (compile-time only)
109
4360
 
110
- History & Time Travel:
4361
+ History & Time Travel (runtime):
111
4362
  memorio.snapshot() - Capture a deep snapshot of state
112
4363
  memorio.diff(snap) - Diff snapshot against current state
113
4364
  memorio.undo() / redo() - Undo / redo the last mutation
@@ -117,26 +4368,7 @@ History & Time Travel:
117
4368
  memorio.enableHistory() - Enable/disable mutation tracking
118
4369
  memorio.clearHistory() - Clear undo/redo stacks and trace log
119
4370
 
120
- Introspection:
121
- memorio.stateKeys() - List top-level state keys
122
- memorio.pathExists(path) - Check if a state path exists
123
- memorio.stateType(path) - Get runtime type of a state value
124
- memorio.stateGet(path) - Get a deep-cloned value at a path
125
- memorio.stateSchema() - Get a schema report of all state paths
126
-
127
- Context Management:
128
- memorio.isolate(name) - Create isolated context
129
- memorio.listContexts() - List all contexts
130
- memorio.deleteContext(id) - Delete a context
131
-
132
- Platform Detection:
133
- memorio.isBrowser() - Browser environment
134
- memorio.isNode() - Node.js environment
135
- memorio.isDeno() - Deno environment
136
- memorio.isEdge() - Edge/Worker environment
137
- memorio.getCapabilities() - Full capabilities object
138
-
139
- DevTools:
4371
+ DevTools (development-only):
140
4372
  memorio.devtools.inspect() - Inspect all modules
141
4373
  memorio.devtools.stats() - Show statistics
142
4374
  memorio.devtools.watch() - Watch a path
@@ -145,17 +4377,27 @@ DevTools:
145
4377
  memorio.devtools.clear() - Clear specific module
146
4378
  memorio.devtools.clearAll() - Clear all modules
147
4379
 
148
- Memory System:
4380
+ Introspection (development-only):
4381
+ memorio.stateKeys() - List top-level state keys
4382
+ memorio.pathExists(path) - Check if a state path exists
4383
+ memorio.stateType(path) - Get runtime type of a state value
4384
+ memorio.stateGet(path) - Get a deep-cloned value at a path
4385
+ memorio.stateSchema() - Get a schema report of all state paths
4386
+
4387
+ Debug:
4388
+ memorio.debug = true - Enable debug output (DEV only)
4389
+
4390
+ Memory System (runtime):
149
4391
  memorio.memory.remember(key, value, opts) - Store a memory with type, confidence, scope, TTL, tags
150
4392
  memorio.memory.recall(key, opts) - Retrieve a memory with filtering
151
4393
  memorio.memory.update(key, value, opts) - Update an existing memory
152
4394
  memorio.memory.forget(key) - Delete a specific memory
153
4395
  memorio.memory.context(opts) - Get ranked relevant memories (semantic context for AI)
154
4396
  memorio.memory.stats() - Memory usage statistics
155
- memorio.memory.forgetExpired() - Remove all expired entries
156
- memorio.memory.clear() - Wipe all memories
157
- memorio.memory.configure({ sync }) - Optional cloud-sync provider + namespace
158
- memorio.memory.journal.pending() - Local op journal (SQLite/store)
4397
+ memorio.memory.forgetExpired() - Remove all expired entries
4398
+ memorio.memory.clear() - Wipe all memories
4399
+ memorio.memory.configure({ sync }) - Optional cloud-sync provider + namespace
4400
+ memorio.memory.journal.pending() - Local op journal (SQLite/store)
159
4401
 
160
4402
  Scopes:
161
4403
  hot - In-memory reactive state (volatile, fastest)
@@ -170,53 +4412,64 @@ TTL options:
170
4412
  Memory types:
171
4413
  fact, preference, decision, task, context
172
4414
 
173
- Shortcuts:
4415
+ Console shortcuts (DEV only):
174
4416
  state, store, session, cache, idb, sqlite - direct access to modules
175
- `);};var Ao=globalThis.memorio,la=globalThis.events,ca=e=>oe(e),ua=globalThis.memorio?.help,ma=e=>exports.internal.currentContext=e,da=()=>exports.internal.currentContext,fa=Ao;
176
-
177
- exports.cache = ce;
178
- exports.canRedo = We;
179
- exports.canUndo = Ke;
180
- exports.clearHistory = Xe;
181
- exports.clearRedo = Ze;
182
- exports.createContext = oe;
183
- exports.default = fa;
184
- exports.deleteContext = Me;
185
- exports.devtools = Je;
186
- exports.diff = He;
187
- exports.dispatch = w;
188
- exports.enableHistory = ze;
189
- exports.events = la;
190
- exports.getCapabilities = re;
191
- exports.getContext = da;
192
- exports.help = ua;
193
- exports.isBrowser = Se;
194
- exports.isDeno = Ee;
195
- exports.isEdge = Te;
196
- exports.isNode = we;
197
- exports.isolate = ca;
198
- exports.listContexts = qe;
199
- exports.listSchemas = yt;
200
- exports.logger = Ne;
201
- exports.memorio = Ao;
202
- exports.memory = ve;
203
- exports.observer = fe;
204
- exports.pathExists = tt;
205
- exports.redo = Ge;
206
- exports.registerSchema = ft;
207
- exports.rollback = Ye;
208
- exports.schema = I;
209
- exports.session = C;
210
- exports.setContext = ma;
211
- exports.snapshot = Ve;
212
- exports.state = x;
213
- exports.stateGet = ot;
214
- exports.stateKeys = et;
215
- exports.stateSchema = nt;
216
- exports.stateType = rt;
217
- exports.trace = Qe;
218
- exports.typed = Be;
219
- exports.undo = Fe;
220
- exports.unregisterSchema = pt;
221
- exports.useObserver = pe;
222
- exports.validate = dt;
4417
+ $state, $store, $session, $cache - aliases for the above
4418
+ `);
4419
+ };
4420
+ }
4421
+ }
4422
+
4423
+ // index.ts
4424
+ var devtools2 = exports.DEV ? devtools : void 0;
4425
+ var memorio2 = globalThis.memorio;
4426
+ var events = globalThis.events;
4427
+ var isolate = /* @__PURE__ */ __name((name) => createContext(name), "isolate");
4428
+ var help2 = globalThis.memorio?.help;
4429
+ var setContext = /* @__PURE__ */ __name((id) => exports.internal.currentContext = id, "setContext");
4430
+ var getContext = /* @__PURE__ */ __name(() => exports.internal.currentContext, "getContext");
4431
+ var index_default = memorio2;
4432
+
4433
+ exports.cache = cache;
4434
+ exports.canRedo = canRedo;
4435
+ exports.canUndo = canUndo;
4436
+ exports.clearHistory = clearHistory2;
4437
+ exports.clearRedo = clearRedo;
4438
+ exports.createContext = createContext;
4439
+ exports.default = index_default;
4440
+ exports.deleteContext = deleteContext;
4441
+ exports.devtools = devtools2;
4442
+ exports.diff = diff;
4443
+ exports.dispatch = dispatch;
4444
+ exports.enableHistory = enableHistory;
4445
+ exports.events = events;
4446
+ exports.fractional = fractional;
4447
+ exports.getCapabilities = getCapabilities;
4448
+ exports.getContext = getContext;
4449
+ exports.help = help2;
4450
+ exports.hlc = hlc;
4451
+ exports.isBrowser = isBrowser;
4452
+ exports.isDeno = isDeno;
4453
+ exports.isEdge = isEdge;
4454
+ exports.isNode = isNode;
4455
+ exports.isolate = isolate;
4456
+ exports.listContexts = listContexts;
4457
+ exports.listSchemas = listSchemas;
4458
+ exports.logger = logger;
4459
+ exports.memorio = memorio2;
4460
+ exports.memory = memory;
4461
+ exports.observer = observer;
4462
+ exports.redo = redo;
4463
+ exports.registerSchema = registerSchema;
4464
+ exports.rollback = rollback;
4465
+ exports.schema = schema;
4466
+ exports.setContext = setContext;
4467
+ exports.snapshot = snapshot;
4468
+ exports.trace = trace;
4469
+ exports.typed = typed;
4470
+ exports.undo = undo;
4471
+ exports.unregisterSchema = unregisterSchema;
4472
+ exports.useObserver = useObserver;
4473
+ exports.validate = validate;
4474
+ //# sourceMappingURL=index.cjs.map
4475
+ //# sourceMappingURL=index.cjs.map