@buoy-gg/storage 7.0.44 → 7.0.45

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.
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.VALUE_ON_DEVICE=exports.SNAPSHOT_VALUE_INLINE_LIMIT=exports.SNAPSHOT_EVENTS_BUDGET=void 0;exports.setToolRequiredStorageKeys=setToolRequiredStorageKeys;exports.storageSyncAdapter=void 0;var _asyncStorage=_interopRequireDefault(require("@react-native-async-storage/async-storage"));var _sharedUi=require("@buoy-gg/shared-ui");var _asyncStorageCompat=require("../utils/asyncStorageCompat");var _storageEventStore=require("../stores/storageEventStore");var _clearAllStorage=require("../utils/clearAllStorage");var _storageTimeTravelUtils=require("../utils/storageTimeTravelUtils");var _MMKVInstanceRegistry=require("../utils/MMKVInstanceRegistry");var _mmkvTypeDetection=require("../utils/mmkvTypeDetection");var _SecureStoreRegistry=require("../utils/SecureStoreRegistry");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const VALUE_ON_DEVICE=exports.VALUE_ON_DEVICE=Object.freeze({__buoyValueOnDevice:true,note:"Value stays on the device \u2014 fetched on demand via getEventDetail / mmkv.get / secure.get."});const SNAPSHOT_VALUE_INLINE_LIMIT=exports.SNAPSHOT_VALUE_INLINE_LIMIT=16*1024;const SNAPSHOT_EVENTS_BUDGET=exports.SNAPSHOT_EVENTS_BUDGET=1.25*1024*1024;const MAX_EVENT_DETAIL_BYTES=8*1024*1024;function toWireValue(e){if(e===void 0)return e;return(0,_sharedUi.isOverWireBudget)(e,SNAPSHOT_VALUE_INLINE_LIMIT)?VALUE_ON_DEVICE:e}function mapEventValues(e,t){const r=e.data;if(!r)return e;const n=t(r.value);const s=t(r.prevValue);const o=(0,_storageEventStore.batchPairsOf)(e);const i=t(o.pairs);const a=t(o.prevPairs);if(n===r.value&&s===r.prevValue&&i===o.pairs&&a===o.prevPairs){return e}return{...e,data:{...r,value:n,prevValue:s,...e.storageType==="async"?{pairs:i,prevPairs:a}:{}}}}function capDetailValue(e){if(e===void 0)return e;if(!(0,_sharedUi.isOverWireBudget)(e,MAX_EVENT_DETAIL_BYTES))return e;return(0,_sharedUi.isJsonSerializable)(e)?{__buoyTruncated:true,note:`Exceeds the ${MAX_EVENT_DETAIL_BYTES/(1024*1024)}MB detail limit \u2014 inspect it on-device.`}:VALUE_ON_DEVICE}const wireCache=new WeakMap;const strippedCache=new WeakMap;function wireFor(e){const t=wireCache.get(e);if(t)return t;let r;try{const n=mapEventValues(e,toWireValue);r={event:n,bytes:(0,_sharedUi.approxJsonSize)(n,SNAPSHOT_EVENTS_BUDGET).bytes}}catch{const n=mapEventValues(e,()=>VALUE_ON_DEVICE);r={event:n,bytes:1024}}wireCache.set(e,r);return r}function strippedFor(e){const t=strippedCache.get(e);if(t)return t;const r=mapEventValues(e,s=>s===void 0?void 0:VALUE_ON_DEVICE);const n={event:r,bytes:(0,_sharedUi.approxJsonSize)(r,SNAPSHOT_EVENTS_BUDGET).bytes};strippedCache.set(e,n);return n}function fitEventsToBudget(e){const t=new Array(e.length);let r=0;for(let n=0;n<e.length;n++){const s=wireFor(e[n]);if(r+s.bytes<=SNAPSHOT_EVENTS_BUDGET){t[n]=s.event;r+=s.bytes}else{const o=strippedFor(e[n]);t[n]=o.event;r+=o.bytes}}return t}function assertMMKVWritable(e){const t=_MMKVInstanceRegistry.mmkvInstanceRegistry.get(e);if(!t){throw new Error(`No MMKV instance registered as "${e}"`)}if(t.instance?.isReadOnly){throw new Error(`MMKV instance "${e}" is registered read-only`)}return t.instance}let toolRequiredStorageKeys=[];function setToolRequiredStorageKeys(e){toolRequiredStorageKeys=e}const storageSyncAdapter=exports.storageSyncAdapter={version:3,getSnapshot:()=>fitEventsToBudget(_storageEventStore.storageEventStore.getEvents().filter(e=>{const t=e.data?.key;return!(typeof t==="string"&&(0,_sharedUi.isDevToolsStorageKey)(t))})),subscribe:e=>_storageEventStore.storageEventStore.subscribeToEvents(e),actions:{clearEvents:()=>{_storageEventStore.storageEventStore.clearEvents()},getRequiredKeys:()=>toolRequiredStorageKeys,getEventDetail:e=>{const{id:t}=e??{};if(!t)return{found:false,reason:"missing id"};const r=_storageEventStore.storageEventStore.getEvents().find(s=>s.id===t);if(!r)return{found:false,reason:"unknown id"};const n=mapEventValues(r,capDetailValue);return{found:true,id:t,event:n}},clearAppStorage:()=>(0,_clearAllStorage.clearAllAppStorage)(),"timeTravel.undo":async e=>{const t=e?.id;if(!t)throw new Error("timeTravel.undo requires an event `id`");const r=_storageEventStore.storageEventStore.getEvents().find(s=>s.id===t);if(!r)throw new Error(`No storage event with id "${t}"`);if(r.storageType==="mmkv"){throw new Error("Time travel supports AsyncStorage events only")}const n=r;if(!(0,_storageTimeTravelUtils.canUndo)(n)){throw new Error(`Event "${t}" (${n.action}) has no previous value captured, so it cannot be undone`)}await(0,_storageTimeTravelUtils.undoOperation)(n);return{undone:true,action:n.action,key:n.data?.key}},"timeTravel.jump":async e=>{const{id:t,scope:r="key"}=e??{};if(!t)throw new Error("timeTravel.jump requires an event `id`");const n=_storageEventStore.storageEventStore.getEvents().filter(a=>a.storageType!=="mmkv").slice().reverse();const s=n.find(a=>a.id===t);if(!s)throw new Error(`No AsyncStorage event with id "${t}"`);const o=r==="all"?n:n.filter(a=>a.data?.key===s.data?.key);const i=o.findIndex(a=>a.id===t);if(i===-1)throw new Error(`Event "${t}" is not in the timeline`);await(0,_storageTimeTravelUtils.jumpToState)(o,i);return{jumped:true,scope:r,replayed:i+1,of:o.length,key:s.data?.key}},"async.getAllKeys":async()=>(await _asyncStorage.default.getAllKeys()).filter(e=>!(0,_sharedUi.isDevToolsStorageKey)(e)),"async.multiGet":async e=>(await(0,_asyncStorageCompat.readMany)(e.keys)).filter(([t])=>!(0,_sharedUi.isDevToolsStorageKey)(t)),"async.getItem":e=>{const{key:t}=e;return(0,_sharedUi.isDevToolsStorageKey)(t)?Promise.resolve(null):_asyncStorage.default.getItem(t)},"async.setItem":e=>{const{key:t,value:r}=e;return _asyncStorage.default.setItem(t,r)},"async.removeItem":e=>_asyncStorage.default.removeItem(e.key),"async.multiRemove":e=>(0,_asyncStorageCompat.removeMany)(e.keys),"async.multiSet":e=>(0,_asyncStorageCompat.writeMany)(e.pairs),"async.clear":()=>_asyncStorage.default.clear(),"mmkv.snapshot":()=>_MMKVInstanceRegistry.mmkvInstanceRegistry.getAll().map(({id:e,instance:t,encrypted:r,readOnly:n})=>{let s=[];try{s=t.getAllKeys().filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o)).map(o=>{const{value:i,type:a}=(0,_mmkvTypeDetection.detectMMKVType)(t,o);return{key:o,value:toWireValue(i),valueType:a}})}catch{}return{id:e,encrypted:r,readOnly:n,entries:s}}),"mmkv.get":e=>{const{instanceId:t,key:r}=e??{};if(!t||!r){return{found:false,reason:"missing instanceId/key"}}const n=_MMKVInstanceRegistry.mmkvInstanceRegistry.get(t);if(!n){return{found:false,reason:"unknown instance"}}const{value:s,type:o}=(0,_mmkvTypeDetection.detectMMKVType)(n.instance,r);return{found:true,instanceId:t,key:r,value:capDetailValue(s),valueType:o}},"mmkv.set":e=>{const{instanceId:t,key:r,value:n}=e;assertMMKVWritable(t).set(r,n)},"mmkv.remove":e=>{const{instanceId:t,key:r}=e;const n=assertMMKVWritable(t);if(n.remove)n.remove(r);else n.delete?.(r)},"secure.keys":()=>_SecureStoreRegistry.secureStoreRegistry.getAll().map(({key:e,options:t,description:r})=>({key:e,description:r,keychainService:t.keychainService,requireAuthentication:t.requireAuthentication??false})),"secure.snapshot":async()=>{const e=_SecureStoreRegistry.secureStoreRegistry.getModule();const t=_SecureStoreRegistry.secureStoreRegistry.getAll();const r=[];for(const{key:n,options:s,description:o}of t){let i=null;if(e&&!s.requireAuthentication){try{i=await e.getItemAsync(n,s)}catch{}}r.push({key:n,description:o,keychainService:s.keychainService,requireAuthentication:s.requireAuthentication??false,value:i==null?i:toWireValue(i)})}return r},"secure.get":e=>{const{key:t}=e;const r=_SecureStoreRegistry.secureStoreRegistry.getAll().find(s=>s.key===t);const n=_SecureStoreRegistry.secureStoreRegistry.getModule();if(!r||!n||r.options.requireAuthentication){return Promise.resolve(null)}return n.getItemAsync(t,r.options)},"secure.set":e=>{const{key:t,value:r}=e;return _SecureStoreRegistry.secureStoreRegistry.setValue(t,r)},"secure.delete":e=>_SecureStoreRegistry.secureStoreRegistry.deleteValue(e.key)}};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.VALUE_ON_DEVICE=exports.SNAPSHOT_VALUE_INLINE_LIMIT=exports.SNAPSHOT_EVENTS_BUDGET=void 0;exports.setToolRequiredStorageKeys=setToolRequiredStorageKeys;exports.storageSyncAdapter=void 0;var _asyncStorage=_interopRequireDefault(require("@react-native-async-storage/async-storage"));var _sharedUi=require("@buoy-gg/shared-ui");var _asyncStorageCompat=require("../utils/asyncStorageCompat");var _storageEventStore=require("../stores/storageEventStore");var _clearAllStorage=require("../utils/clearAllStorage");var _storageTimeTravelUtils=require("../utils/storageTimeTravelUtils");var _MMKVInstanceRegistry=require("../utils/MMKVInstanceRegistry");var _mmkvTypeDetection=require("../utils/mmkvTypeDetection");var _SecureStoreRegistry=require("../utils/SecureStoreRegistry");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const VALUE_ON_DEVICE=exports.VALUE_ON_DEVICE=Object.freeze({__buoyValueOnDevice:true,note:"Value stays on the device \u2014 fetched on demand via getEventDetail / mmkv.get / secure.get."});const SNAPSHOT_VALUE_INLINE_LIMIT=exports.SNAPSHOT_VALUE_INLINE_LIMIT=16*1024;const SNAPSHOT_EVENTS_BUDGET=exports.SNAPSHOT_EVENTS_BUDGET=1.25*1024*1024;const MAX_EVENT_DETAIL_BYTES=8*1024*1024;function toWireValue(e){if(e===void 0)return e;return(0,_sharedUi.isOverWireBudget)(e,SNAPSHOT_VALUE_INLINE_LIMIT)?VALUE_ON_DEVICE:e}function mapEventValues(e,t){const r=e.data;if(!r)return e;const n=t(r.value);const s=t(r.prevValue);const o=(0,_storageEventStore.batchPairsOf)(e);const i=t(o.pairs);const a=t(o.prevPairs);if(n===r.value&&s===r.prevValue&&i===o.pairs&&a===o.prevPairs){return e}return{...e,data:{...r,value:n,prevValue:s,...e.storageType==="async"?{pairs:i,prevPairs:a}:{}}}}function capDetailValue(e){if(e===void 0)return e;if(!(0,_sharedUi.isOverWireBudget)(e,MAX_EVENT_DETAIL_BYTES))return e;return(0,_sharedUi.isJsonSerializable)(e)?{__buoyTruncated:true,note:`Exceeds the ${MAX_EVENT_DETAIL_BYTES/(1024*1024)}MB detail limit \u2014 inspect it on-device.`}:VALUE_ON_DEVICE}const wireCache=new WeakMap;const strippedCache=new WeakMap;function wireFor(e){const t=wireCache.get(e);if(t)return t;let r;try{const n=mapEventValues(e,toWireValue);r={event:n,bytes:(0,_sharedUi.approxJsonSize)(n,SNAPSHOT_EVENTS_BUDGET).bytes}}catch{const n=mapEventValues(e,()=>VALUE_ON_DEVICE);r={event:n,bytes:1024}}wireCache.set(e,r);return r}function strippedFor(e){const t=strippedCache.get(e);if(t)return t;const r=mapEventValues(e,s=>s===void 0?void 0:VALUE_ON_DEVICE);const n={event:r,bytes:(0,_sharedUi.approxJsonSize)(r,SNAPSHOT_EVENTS_BUDGET).bytes};strippedCache.set(e,n);return n}function fitEventsToBudget(e){const t=new Array(e.length);let r=0;for(let n=0;n<e.length;n++){const s=wireFor(e[n]);if(r+s.bytes<=SNAPSHOT_EVENTS_BUDGET){t[n]=s.event;r+=s.bytes}else{const o=strippedFor(e[n]);t[n]=o.event;r+=o.bytes}}return t}function assertMMKVWritable(e){const t=_MMKVInstanceRegistry.mmkvInstanceRegistry.get(e);if(!t){throw new Error(`No MMKV instance registered as "${e}"`)}if(t.instance?.isReadOnly){throw new Error(`MMKV instance "${e}" is registered read-only`)}return t.instance}let toolRequiredStorageKeys=[];function setToolRequiredStorageKeys(e){toolRequiredStorageKeys=e}const storageSyncAdapter=exports.storageSyncAdapter={version:3,getSnapshot:()=>fitEventsToBudget(_storageEventStore.storageEventStore.getEvents().filter(e=>{const t=e.data?.key;return!(typeof t==="string"&&(0,_sharedUi.isDevToolsStorageKey)(t))})),subscribe:e=>_storageEventStore.storageEventStore.subscribeToEvents(e),actions:{clearEvents:()=>{_storageEventStore.storageEventStore.clearEvents()},getRequiredKeys:()=>toolRequiredStorageKeys,getEventDetail:e=>{const{id:t}=e??{};if(!t)return{found:false,reason:"missing id"};const r=_storageEventStore.storageEventStore.getEvents().find(s=>s.id===t);if(!r)return{found:false,reason:"unknown id"};const n=mapEventValues(r,capDetailValue);return{found:true,id:t,event:n}},clearAppStorage:()=>(0,_clearAllStorage.clearAllAppStorage)(),"timeTravel.undo":async e=>{const t=e?.id;if(!t)throw new Error("timeTravel.undo requires an event `id`");const r=_storageEventStore.storageEventStore.getEvents().find(s=>s.id===t);if(!r)throw new Error(`No storage event with id "${t}"`);if(r.storageType==="mmkv"){throw new Error("Time travel supports AsyncStorage events only")}const n=r;if(!(0,_storageTimeTravelUtils.canUndo)(n)){throw new Error(`Event "${t}" (${n.action}) has no previous value captured, so it cannot be undone`)}await(0,_storageTimeTravelUtils.undoOperation)(n);return{undone:true,action:n.action,key:n.data?.key}},"timeTravel.jump":async e=>{const{id:t,scope:r="key"}=e??{};if(!t)throw new Error("timeTravel.jump requires an event `id`");const n=_storageEventStore.storageEventStore.getEvents().filter(a=>a.storageType!=="mmkv").slice().reverse();const s=n.find(a=>a.id===t);if(!s)throw new Error(`No AsyncStorage event with id "${t}"`);const o=r==="all"?n:n.filter(a=>a.data?.key===s.data?.key);const i=o.findIndex(a=>a.id===t);if(i===-1)throw new Error(`Event "${t}" is not in the timeline`);await(0,_storageTimeTravelUtils.jumpToState)(o,i);return{jumped:true,scope:r,replayed:i+1,of:o.length,key:s.data?.key}},"async.getAllKeys":async()=>(await _asyncStorage.default.getAllKeys()).filter(e=>!(0,_sharedUi.isDevToolsStorageKey)(e)),"async.multiGet":async e=>(await(0,_asyncStorageCompat.readMany)(e.keys)).filter(([t])=>!(0,_sharedUi.isDevToolsStorageKey)(t)),"async.getItem":e=>{const{key:t}=e;return(0,_sharedUi.isDevToolsStorageKey)(t)?Promise.resolve(null):_asyncStorage.default.getItem(t)},"async.setItem":e=>{const{key:t,value:r}=e;return _asyncStorage.default.setItem(t,r)},"async.removeItem":e=>_asyncStorage.default.removeItem(e.key),"async.multiRemove":e=>(0,_asyncStorageCompat.removeMany)(e.keys),"async.multiSet":e=>(0,_asyncStorageCompat.writeMany)(e.pairs),"async.clear":()=>_asyncStorage.default.clear(),"mmkv.snapshot":()=>_MMKVInstanceRegistry.mmkvInstanceRegistry.getAll().map(({id:e,instance:t,encrypted:r,readOnly:n})=>{let s=[];try{s=t.getAllKeys().filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o)).map(o=>{const{value:i,type:a}=(0,_mmkvTypeDetection.detectMMKVType)(t,o);return{key:o,value:toWireValue(i),valueType:a}})}catch{}return{id:e,encrypted:r,readOnly:n,entries:s}}),"mmkv.get":e=>{const{instanceId:t,key:r}=e??{};if(!t||!r){return{found:false,reason:"missing instanceId/key"}}const n=_MMKVInstanceRegistry.mmkvInstanceRegistry.get(t);if(!n){return{found:false,reason:"unknown instance"}}const{value:s,type:o}=(0,_mmkvTypeDetection.detectMMKVType)(n.instance,r);return{found:true,instanceId:t,key:r,value:capDetailValue(s),valueType:o}},"mmkv.set":e=>{const{instanceId:t,key:r,value:n}=e;assertMMKVWritable(t).set(r,n)},"mmkv.remove":e=>{const{instanceId:t,key:r}=e;const n=assertMMKVWritable(t);if(n.remove)n.remove(r);else n.delete?.(r)},"secure.keys":async()=>{const e=_SecureStoreRegistry.secureStoreRegistry.getModule();return Promise.all(_SecureStoreRegistry.secureStoreRegistry.getAll().map(async({key:t,options:r,description:n})=>{let s=null;if(e&&!r.requireAuthentication){try{s=await e.getItemAsync(t,r)!=null}catch{s=null}}return{key:t,description:n,keychainService:r.keychainService,requireAuthentication:r.requireAuthentication??false,hasValue:s}}))},"secure.snapshot":async()=>{const e=_SecureStoreRegistry.secureStoreRegistry.getModule();const t=_SecureStoreRegistry.secureStoreRegistry.getAll();const r=[];for(const{key:n,options:s,description:o}of t){let i=null;if(e&&!s.requireAuthentication){try{i=await e.getItemAsync(n,s)}catch{}}r.push({key:n,description:o,keychainService:s.keychainService,requireAuthentication:s.requireAuthentication??false,value:i==null?i:toWireValue(i)})}return r},"secure.get":e=>{const{key:t}=e;const r=_SecureStoreRegistry.secureStoreRegistry.getAll().find(s=>s.key===t);const n=_SecureStoreRegistry.secureStoreRegistry.getModule();if(!r||!n||r.options.requireAuthentication){return Promise.resolve(null)}return n.getItemAsync(t,r.options)},"secure.set":e=>{const{key:t,value:r}=e;return _SecureStoreRegistry.secureStoreRegistry.setValue(t,r)},"secure.delete":e=>_SecureStoreRegistry.secureStoreRegistry.deleteValue(e.key)}};
@@ -1 +1 @@
1
- "use strict";import l from"@react-native-async-storage/async-storage";import{approxJsonSize as p,isDevToolsStorageKey as y,isOverWireBudget as v,isJsonSerializable as T}from"@buoy-gg/shared-ui";import{readMany as b,writeMany as V,removeMany as I}from"../utils/asyncStorageCompat";import{batchPairsOf as M,storageEventStore as u}from"../stores/storageEventStore";import{clearAllAppStorage as _}from"../utils/clearAllStorage";import{undoOperation as q,jumpToState as K,canUndo as N}from"../utils/storageTimeTravelUtils";import{mmkvInstanceRegistry as f}from"../utils/MMKVInstanceRegistry";import{detectMMKVType as g}from"../utils/mmkvTypeDetection";import{secureStoreRegistry as c}from"../utils/SecureStoreRegistry";export const VALUE_ON_DEVICE=Object.freeze({__buoyValueOnDevice:true,note:"Value stays on the device \u2014 fetched on demand via getEventDetail / mmkv.get / secure.get."});export const SNAPSHOT_VALUE_INLINE_LIMIT=16*1024;export const SNAPSHOT_EVENTS_BUDGET=1.25*1024*1024;const h=8*1024*1024;function m(e){if(e===void 0)return e;return v(e,SNAPSHOT_VALUE_INLINE_LIMIT)?VALUE_ON_DEVICE:e}function d(e,t){const r=e.data;if(!r)return e;const n=t(r.value);const s=t(r.prevValue);const o=M(e);const i=t(o.pairs);const a=t(o.prevPairs);if(n===r.value&&s===r.prevValue&&i===o.pairs&&a===o.prevPairs){return e}return{...e,data:{...r,value:n,prevValue:s,...e.storageType==="async"?{pairs:i,prevPairs:a}:{}}}}function k(e){if(e===void 0)return e;if(!v(e,h))return e;return T(e)?{__buoyTruncated:true,note:`Exceeds the ${h/(1024*1024)}MB detail limit \u2014 inspect it on-device.`}:VALUE_ON_DEVICE}const E=new WeakMap;const w=new WeakMap;function x(e){const t=E.get(e);if(t)return t;let r;try{const n=d(e,m);r={event:n,bytes:p(n,SNAPSHOT_EVENTS_BUDGET).bytes}}catch{const n=d(e,()=>VALUE_ON_DEVICE);r={event:n,bytes:1024}}E.set(e,r);return r}function O(e){const t=w.get(e);if(t)return t;const r=d(e,s=>s===void 0?void 0:VALUE_ON_DEVICE);const n={event:r,bytes:p(r,SNAPSHOT_EVENTS_BUDGET).bytes};w.set(e,n);return n}function D(e){const t=new Array(e.length);let r=0;for(let n=0;n<e.length;n++){const s=x(e[n]);if(r+s.bytes<=SNAPSHOT_EVENTS_BUDGET){t[n]=s.event;r+=s.bytes}else{const o=O(e[n]);t[n]=o.event;r+=o.bytes}}return t}function A(e){const t=f.get(e);if(!t){throw new Error(`No MMKV instance registered as "${e}"`)}if(t.instance?.isReadOnly){throw new Error(`MMKV instance "${e}" is registered read-only`)}return t.instance}let S=[];export function setToolRequiredStorageKeys(e){S=e}export const storageSyncAdapter={version:3,getSnapshot:()=>D(u.getEvents().filter(e=>{const t=e.data?.key;return!(typeof t==="string"&&y(t))})),subscribe:e=>u.subscribeToEvents(e),actions:{clearEvents:()=>{u.clearEvents()},getRequiredKeys:()=>S,getEventDetail:e=>{const{id:t}=e??{};if(!t)return{found:false,reason:"missing id"};const r=u.getEvents().find(s=>s.id===t);if(!r)return{found:false,reason:"unknown id"};const n=d(r,k);return{found:true,id:t,event:n}},clearAppStorage:()=>_(),"timeTravel.undo":async e=>{const t=e?.id;if(!t)throw new Error("timeTravel.undo requires an event `id`");const r=u.getEvents().find(s=>s.id===t);if(!r)throw new Error(`No storage event with id "${t}"`);if(r.storageType==="mmkv"){throw new Error("Time travel supports AsyncStorage events only")}const n=r;if(!N(n)){throw new Error(`Event "${t}" (${n.action}) has no previous value captured, so it cannot be undone`)}await q(n);return{undone:true,action:n.action,key:n.data?.key}},"timeTravel.jump":async e=>{const{id:t,scope:r="key"}=e??{};if(!t)throw new Error("timeTravel.jump requires an event `id`");const n=u.getEvents().filter(a=>a.storageType!=="mmkv").slice().reverse();const s=n.find(a=>a.id===t);if(!s)throw new Error(`No AsyncStorage event with id "${t}"`);const o=r==="all"?n:n.filter(a=>a.data?.key===s.data?.key);const i=o.findIndex(a=>a.id===t);if(i===-1)throw new Error(`Event "${t}" is not in the timeline`);await K(o,i);return{jumped:true,scope:r,replayed:i+1,of:o.length,key:s.data?.key}},"async.getAllKeys":async()=>(await l.getAllKeys()).filter(e=>!y(e)),"async.multiGet":async e=>(await b(e.keys)).filter(([t])=>!y(t)),"async.getItem":e=>{const{key:t}=e;return y(t)?Promise.resolve(null):l.getItem(t)},"async.setItem":e=>{const{key:t,value:r}=e;return l.setItem(t,r)},"async.removeItem":e=>l.removeItem(e.key),"async.multiRemove":e=>I(e.keys),"async.multiSet":e=>V(e.pairs),"async.clear":()=>l.clear(),"mmkv.snapshot":()=>f.getAll().map(({id:e,instance:t,encrypted:r,readOnly:n})=>{let s=[];try{s=t.getAllKeys().filter(o=>!y(o)).map(o=>{const{value:i,type:a}=g(t,o);return{key:o,value:m(i),valueType:a}})}catch{}return{id:e,encrypted:r,readOnly:n,entries:s}}),"mmkv.get":e=>{const{instanceId:t,key:r}=e??{};if(!t||!r){return{found:false,reason:"missing instanceId/key"}}const n=f.get(t);if(!n){return{found:false,reason:"unknown instance"}}const{value:s,type:o}=g(n.instance,r);return{found:true,instanceId:t,key:r,value:k(s),valueType:o}},"mmkv.set":e=>{const{instanceId:t,key:r,value:n}=e;A(t).set(r,n)},"mmkv.remove":e=>{const{instanceId:t,key:r}=e;const n=A(t);if(n.remove)n.remove(r);else n.delete?.(r)},"secure.keys":()=>c.getAll().map(({key:e,options:t,description:r})=>({key:e,description:r,keychainService:t.keychainService,requireAuthentication:t.requireAuthentication??false})),"secure.snapshot":async()=>{const e=c.getModule();const t=c.getAll();const r=[];for(const{key:n,options:s,description:o}of t){let i=null;if(e&&!s.requireAuthentication){try{i=await e.getItemAsync(n,s)}catch{}}r.push({key:n,description:o,keychainService:s.keychainService,requireAuthentication:s.requireAuthentication??false,value:i==null?i:m(i)})}return r},"secure.get":e=>{const{key:t}=e;const r=c.getAll().find(s=>s.key===t);const n=c.getModule();if(!r||!n||r.options.requireAuthentication){return Promise.resolve(null)}return n.getItemAsync(t,r.options)},"secure.set":e=>{const{key:t,value:r}=e;return c.setValue(t,r)},"secure.delete":e=>c.deleteValue(e.key)}};
1
+ "use strict";import l from"@react-native-async-storage/async-storage";import{approxJsonSize as p,isDevToolsStorageKey as y,isOverWireBudget as v,isJsonSerializable as T}from"@buoy-gg/shared-ui";import{readMany as b,writeMany as V,removeMany as I}from"../utils/asyncStorageCompat";import{batchPairsOf as M,storageEventStore as u}from"../stores/storageEventStore";import{clearAllAppStorage as _}from"../utils/clearAllStorage";import{undoOperation as q,jumpToState as K,canUndo as N}from"../utils/storageTimeTravelUtils";import{mmkvInstanceRegistry as f}from"../utils/MMKVInstanceRegistry";import{detectMMKVType as g}from"../utils/mmkvTypeDetection";import{secureStoreRegistry as c}from"../utils/SecureStoreRegistry";export const VALUE_ON_DEVICE=Object.freeze({__buoyValueOnDevice:true,note:"Value stays on the device \u2014 fetched on demand via getEventDetail / mmkv.get / secure.get."});export const SNAPSHOT_VALUE_INLINE_LIMIT=16*1024;export const SNAPSHOT_EVENTS_BUDGET=1.25*1024*1024;const h=8*1024*1024;function m(e){if(e===void 0)return e;return v(e,SNAPSHOT_VALUE_INLINE_LIMIT)?VALUE_ON_DEVICE:e}function d(e,t){const n=e.data;if(!n)return e;const r=t(n.value);const s=t(n.prevValue);const o=M(e);const i=t(o.pairs);const a=t(o.prevPairs);if(r===n.value&&s===n.prevValue&&i===o.pairs&&a===o.prevPairs){return e}return{...e,data:{...n,value:r,prevValue:s,...e.storageType==="async"?{pairs:i,prevPairs:a}:{}}}}function k(e){if(e===void 0)return e;if(!v(e,h))return e;return T(e)?{__buoyTruncated:true,note:`Exceeds the ${h/(1024*1024)}MB detail limit \u2014 inspect it on-device.`}:VALUE_ON_DEVICE}const w=new WeakMap;const E=new WeakMap;function x(e){const t=w.get(e);if(t)return t;let n;try{const r=d(e,m);n={event:r,bytes:p(r,SNAPSHOT_EVENTS_BUDGET).bytes}}catch{const r=d(e,()=>VALUE_ON_DEVICE);n={event:r,bytes:1024}}w.set(e,n);return n}function O(e){const t=E.get(e);if(t)return t;const n=d(e,s=>s===void 0?void 0:VALUE_ON_DEVICE);const r={event:n,bytes:p(n,SNAPSHOT_EVENTS_BUDGET).bytes};E.set(e,r);return r}function P(e){const t=new Array(e.length);let n=0;for(let r=0;r<e.length;r++){const s=x(e[r]);if(n+s.bytes<=SNAPSHOT_EVENTS_BUDGET){t[r]=s.event;n+=s.bytes}else{const o=O(e[r]);t[r]=o.event;n+=o.bytes}}return t}function A(e){const t=f.get(e);if(!t){throw new Error(`No MMKV instance registered as "${e}"`)}if(t.instance?.isReadOnly){throw new Error(`MMKV instance "${e}" is registered read-only`)}return t.instance}let S=[];export function setToolRequiredStorageKeys(e){S=e}export const storageSyncAdapter={version:3,getSnapshot:()=>P(u.getEvents().filter(e=>{const t=e.data?.key;return!(typeof t==="string"&&y(t))})),subscribe:e=>u.subscribeToEvents(e),actions:{clearEvents:()=>{u.clearEvents()},getRequiredKeys:()=>S,getEventDetail:e=>{const{id:t}=e??{};if(!t)return{found:false,reason:"missing id"};const n=u.getEvents().find(s=>s.id===t);if(!n)return{found:false,reason:"unknown id"};const r=d(n,k);return{found:true,id:t,event:r}},clearAppStorage:()=>_(),"timeTravel.undo":async e=>{const t=e?.id;if(!t)throw new Error("timeTravel.undo requires an event `id`");const n=u.getEvents().find(s=>s.id===t);if(!n)throw new Error(`No storage event with id "${t}"`);if(n.storageType==="mmkv"){throw new Error("Time travel supports AsyncStorage events only")}const r=n;if(!N(r)){throw new Error(`Event "${t}" (${r.action}) has no previous value captured, so it cannot be undone`)}await q(r);return{undone:true,action:r.action,key:r.data?.key}},"timeTravel.jump":async e=>{const{id:t,scope:n="key"}=e??{};if(!t)throw new Error("timeTravel.jump requires an event `id`");const r=u.getEvents().filter(a=>a.storageType!=="mmkv").slice().reverse();const s=r.find(a=>a.id===t);if(!s)throw new Error(`No AsyncStorage event with id "${t}"`);const o=n==="all"?r:r.filter(a=>a.data?.key===s.data?.key);const i=o.findIndex(a=>a.id===t);if(i===-1)throw new Error(`Event "${t}" is not in the timeline`);await K(o,i);return{jumped:true,scope:n,replayed:i+1,of:o.length,key:s.data?.key}},"async.getAllKeys":async()=>(await l.getAllKeys()).filter(e=>!y(e)),"async.multiGet":async e=>(await b(e.keys)).filter(([t])=>!y(t)),"async.getItem":e=>{const{key:t}=e;return y(t)?Promise.resolve(null):l.getItem(t)},"async.setItem":e=>{const{key:t,value:n}=e;return l.setItem(t,n)},"async.removeItem":e=>l.removeItem(e.key),"async.multiRemove":e=>I(e.keys),"async.multiSet":e=>V(e.pairs),"async.clear":()=>l.clear(),"mmkv.snapshot":()=>f.getAll().map(({id:e,instance:t,encrypted:n,readOnly:r})=>{let s=[];try{s=t.getAllKeys().filter(o=>!y(o)).map(o=>{const{value:i,type:a}=g(t,o);return{key:o,value:m(i),valueType:a}})}catch{}return{id:e,encrypted:n,readOnly:r,entries:s}}),"mmkv.get":e=>{const{instanceId:t,key:n}=e??{};if(!t||!n){return{found:false,reason:"missing instanceId/key"}}const r=f.get(t);if(!r){return{found:false,reason:"unknown instance"}}const{value:s,type:o}=g(r.instance,n);return{found:true,instanceId:t,key:n,value:k(s),valueType:o}},"mmkv.set":e=>{const{instanceId:t,key:n,value:r}=e;A(t).set(n,r)},"mmkv.remove":e=>{const{instanceId:t,key:n}=e;const r=A(t);if(r.remove)r.remove(n);else r.delete?.(n)},"secure.keys":async()=>{const e=c.getModule();return Promise.all(c.getAll().map(async({key:t,options:n,description:r})=>{let s=null;if(e&&!n.requireAuthentication){try{s=await e.getItemAsync(t,n)!=null}catch{s=null}}return{key:t,description:r,keychainService:n.keychainService,requireAuthentication:n.requireAuthentication??false,hasValue:s}}))},"secure.snapshot":async()=>{const e=c.getModule();const t=c.getAll();const n=[];for(const{key:r,options:s,description:o}of t){let i=null;if(e&&!s.requireAuthentication){try{i=await e.getItemAsync(r,s)}catch{}}n.push({key:r,description:o,keychainService:s.keychainService,requireAuthentication:s.requireAuthentication??false,value:i==null?i:m(i)})}return n},"secure.get":e=>{const{key:t}=e;const n=c.getAll().find(s=>s.key===t);const r=c.getModule();if(!n||!r||n.options.requireAuthentication){return Promise.resolve(null)}return r.getItemAsync(t,n.options)},"secure.set":e=>{const{key:t,value:n}=e;return c.setValue(t,n)},"secure.delete":e=>c.deleteValue(e.key)}};
@@ -129,12 +129,23 @@ export declare const storageSyncAdapter: {
129
129
  };
130
130
  "mmkv.set": (params?: unknown) => void;
131
131
  "mmkv.remove": (params?: unknown) => void;
132
- "secure.keys": () => {
132
+ /**
133
+ * Names and flags, plus `hasValue` — whether the key holds anything —
134
+ * never the value itself. Ask Buoy may not read SecureStore values (they
135
+ * are credentials), so before this it could not tell an empty session key
136
+ * from a full one: "the login moved from bk.session to bk.session.v2" and
137
+ * "is this phone signed out?" were unanswerable. The value is read on the
138
+ * device and reduced to a boolean here; it never leaves the app.
139
+ * Biometric-protected keys are not read (that would fire an auth prompt):
140
+ * their `hasValue` is null.
141
+ */
142
+ "secure.keys": () => Promise<{
133
143
  key: string;
134
144
  description: string | undefined;
135
145
  keychainService: string | undefined;
136
146
  requireAuthentication: boolean;
137
- }[];
147
+ hasValue: boolean | null;
148
+ }[]>;
138
149
  /**
139
150
  * Every registered key WITH its value, in one round trip — the SecureStore
140
151
  * counterpart to `mmkv.snapshot`. The dashboard polls this (the keychain
package/lib/web/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- "use client";var Mo=Object.defineProperty;var bi=Object.getOwnPropertyDescriptor;var vi=Object.getOwnPropertyNames;var Si=Object.prototype.hasOwnProperty;var Sn=(e,t)=>()=>(e&&(t=e(e=0)),t);var wn=(e,t)=>{for(var r in t)Mo(e,r,{get:t[r],enumerable:true})},Po=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of vi(t))!Si.call(e,n)&&n!==r&&Mo(e,n,{get:()=>t[n],enumerable:!(o=bi(t,n))||o.enumerable});return e},wi=(e,t,r)=>(Po(e,t,"default"),r&&Po(r,t,"default"));var ki=e=>Po(Mo({},"__esModule",{value:true}),e);var V=Sn(()=>{"use strict";typeof window<"u"&&typeof globalThis.global>"u"&&(globalThis.global=globalThis)});var kn={};wn(kn,{asyncStorage:()=>Fe,asyncStorageCaps:()=>Cn,default:()=>xn,readMany:()=>Gr,removeMany:()=>tr,writeMany:()=>Ir});import Ci from"@buoy-gg/shared-ui/web/asyncStorage";async function Gr(e){if(typeof Fe.multiGet=="function")return await Fe.multiGet(e);let t=await Fe.getMany(e);return e.map(r=>[r,t[r]??null])}async function Ir(e){if(typeof Fe.multiSet=="function")return Fe.multiSet(e);let t={};for(let[r,o]of e)t[r]=o;return Fe.setMany(t)}async function tr(e){return typeof Fe.multiRemove=="function"?Fe.multiRemove(e):Fe.removeMany(e)}var Fe,Cn,xn,Nt=Sn(()=>{"use strict";V();Fe=Ci,Cn={hasLegacyMultiApi:typeof Fe?.multiGet=="function",hasMergeApi:typeof Fe?.mergeItem=="function"};xn=Fe});V();V();Nt();import Tn from"@buoy-gg/shared-ui/web/asyncStorage";import{classifyPreviewItem as xi,createRestoreScope as Ti,emptyRestoreResult as In,failedRestore as Ii,isDevToolsStorageKey as mt,registerStateSnapshotProvider as Ei,unionKeys as Yr,wontApply as Er}from"@buoy-gg/shared-ui/web";V();Nt();import En from"@buoy-gg/shared-ui/web/asyncStorage";import{isDevToolsStorageKey as Ri}from"@buoy-gg/shared-ui/web";async function Qr(){let e=await En.getAllKeys();if(!e||e.length===0)return;let t=e.filter(r=>!Ri(r));t.length!==0&&await tr(t)}async function Vi(){await En.clear()}V();V();V();function ht(e,t){let r=e.getString(t);if(r!==void 0&&r!=="")return{value:r,type:"string"};let o=e.getNumber(t);if(o!==void 0)return{value:o,type:"number"};let n=e.getBoolean(t);if(n!==void 0)return{value:n,type:"boolean"};if(r==="")return{value:"",type:"string"};let a=e.getBuffer(t);return a!==void 0?{value:`<ArrayBuffer ${a.byteLength} bytes>`,type:"buffer"}:{value:void 0,type:"unknown"}}function Bi(e,t){if(e===void 0)return"undefined";if(e===null)return"null";switch(t){case"string":return`"${e}"`;case"number":return String(e);case"boolean":return e?"true":"false";case"buffer":return e;case"unknown":return"unknown";default:return String(e)}}function zo(e,t){return e===t}var Ai=class{constructor(){this.listeners=[];this.instances=new Map;this.ignoredKeys=new Set(["@react_buoy_storage_event_filters","@react_buoy_storage_key_filters","@react_buoy_storage_is_monitoring","REACT_QUERY_OFFLINE_CACHE"])}shouldIgnoreKey(e){if(this.ignoredKeys.has(e))return true;for(let t of this.ignoredKeys)if(e.startsWith(t))return true;return false}emit(e){this.listeners.length!==0&&this.listeners.forEach(t=>{try{t(e)}catch{}})}addInstance(e,t){if(this.instances.has(t))return;let r,o=new Map;try{for(let n of e.getAllKeys()??[])this.shouldIgnoreKey(n)||o.set(n,ht(e,n).value)}catch{}if(typeof e.addOnValueChangedListener=="function")try{r=e.addOnValueChangedListener(n=>{if(this.shouldIgnoreKey(n))return;let{value:a,type:i}=ht(e,n),u=o.get(n);if(i==="unknown"||a===void 0){o.delete(n);let d={action:"delete",timestamp:new Date,instanceId:t,data:{key:n,prevValue:u,success:true}};this.emit(d)}else{o.set(n,a);let d={action:i==="string"?"set.string":i==="number"?"set.number":i==="boolean"?"set.boolean":i==="buffer"?"set.buffer":"set.string",timestamp:new Date,instanceId:t,data:{key:n,value:a,prevValue:u,valueType:i,success:true}};this.emit(d)}})}catch{}this.instances.set(t,{instance:e,instanceId:t,originalMethods:{},nativeListenerUnsubscribe:r,lastKnownValues:o})}removeInstance(e){let t=this.instances.get(e);if(!t)return;let{nativeListenerUnsubscribe:r}=t;try{typeof r=="function"?r():typeof r?.remove=="function"&&r.remove()}catch{}this.instances.delete(e)}removeAllInstances(){Array.from(this.instances.keys()).forEach(e=>this.removeInstance(e))}addListener(e){return this.listeners.push(e),()=>{let t=this.listeners.indexOf(e);t>-1&&this.listeners.splice(t,1)}}removeAllListeners(){this.listeners=[]}hasInstance(e){return this.instances.has(e)}getMonitoredInstances(){return Array.from(this.instances.keys())}get instanceCount(){return this.instances.size}get listenerCount(){return this.listeners.length}get isActive(){return this.instances.size>0}},Ko=new Ai;var Rn=e=>Ko.addListener(e);var Di=class{constructor(){this.instances=new Map}register(e,t,r){let o={id:e,instance:t,encrypted:r?.encrypted??false,readOnly:t.isReadOnly??false};this.instances.set(e,o)}unregister(e){this.instances.delete(e)}get(e){return this.instances.get(e)}getAll(){return Array.from(this.instances.values())}has(e){return this.instances.has(e)}count(){return this.instances.size}},Pe=new Di;function Vn(e,t,r){Pe.register(e,t,r),Ko.addInstance(t,e)}function Bn(e){Ko.removeInstance(e),Pe.unregister(e)}V();var Mi=class{constructor(){this.module=null;this.keys=new Map;this.listeners=new Set}register(e,t){let r=this.signature();this.module=e;for(let o of t){let n=typeof o=="string"?{key:o,options:{}}:{key:o.key,description:o.description,options:{keychainService:o.keychainService,requireAuthentication:o.requireAuthentication,authenticationPrompt:o.authenticationPrompt}};this.keys.set(n.key,n)}this.signature()!==r&&this.notify()}unregister(e){this.keys.delete(e)&&this.notify()}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}signature(){return JSON.stringify(Array.from(this.keys.values()))}notify(){this.listeners.forEach(e=>{try{e()}catch{}})}getModule(){return this.module}getAll(){return Array.from(this.keys.values())}count(){return this.keys.size}async deleteValue(e){let t=this.keys.get(e);!this.module||!t||await this.module.deleteItemAsync(e,t.options)}async setValue(e,t){let r=this.keys.get(e);if(!this.module)throw new Error("No SecureStore module is registered");if(!r)throw new Error(`SecureStore key "${e}" is not registered`);if(r.options.requireAuthentication)throw new Error(`SecureStore key "${e}" is biometric-protected \u2014 DevTools never writes it`);await this.module.setItemAsync(e,t,r.options)}},re=new Mi;function Pi(e,t){re.register(e,t)}function zi(e){re.unregister(e)}function An(e,t){e.remove?e.remove(t):e.delete?.(t)}function Ki(){return{canCapture:true,canRestore:true}}async function Dn(){let e=[],t=(await Tn.getAllKeys()).filter(i=>!mt(i)),r=(await Gr(t)).filter(i=>i[1]!==null),o={};for(let{id:i,instance:u}of Pe.getAll())try{o[i]=u.getAllKeys().filter(d=>!mt(d)).map(d=>{let{value:y,type:g}=ht(u,d);return g==="buffer"&&e.push(`mmkv "${i}"/"${d}": ArrayBuffer value not capturable`),{key:d,value:y,valueType:g}})}catch{e.push(`mmkv "${i}": unreadable, captured without entries`),o[i]=[]}let n={},a=re.getModule();for(let{key:i,options:u}of re.getAll()){if(u.requireAuthentication){e.push(`secure "${i}": biometric-protected, not capturable`);continue}let d=null;if(a)try{d=await a.getItemAsync(i,u)}catch{e.push(`secure "${i}": unreadable, captured as unset`)}n[i]=d}return{data:{async:r,mmkv:o,secure:n},warnings:e}}async function Fi(){let{data:e,warnings:t}=await Dn();return{data:e,warnings:t}}async function Oi(e,t){let r=e,o=Ti(t),n=o.touch,a=In();if(!r)return Ii("empty storage snapshot");try{let d=(r.async??[]).filter(([p])=>!mt(p)&&n(`async:${p}`)),y=new Set(d.map(([p])=>p)),g=(await Tn.getAllKeys()).filter(p=>!mt(p)).filter(p=>!y.has(p)&&n(`async:${p}`));o.countExcluded((r.async??[]).length-d.length),g.length>0&&await tr(g),d.length>0&&await Ir(d),a.applied+=d.length+g.length}catch(d){a.ok=false,a.warnings.push(`asyncstorage restore failed: ${String(d)}`)}for(let[d,y]of Object.entries(r.mmkv??{})){let g=Pe.get(d);if(!g){a.skipped.push({id:`mmkv:${d}`,reason:"instance not registered"});continue}if(g.instance.isReadOnly){a.skipped.push({id:`mmkv:${d}`,reason:"instance registered read-only"});continue}let{instance:p}=g;try{let f=new Set(y.map(h=>h.key)),x=p.getAllKeys().filter(h=>!mt(h));for(let h of x)o.allows(`mmkv:${d}/${h}`)&&(f.has(h)||(An(p,h),a.applied+=1));for(let h of y)if(!mt(h.key)&&n(`mmkv:${d}/${h.key}`)){if(h.valueType==="buffer"){a.skipped.push({id:`mmkv:${d}/${h.key}`,reason:"ArrayBuffer values cannot be restored"});continue}p.set(h.key,h.value),a.applied+=1}}catch(f){a.ok=false,a.warnings.push(`mmkv "${d}" restore failed: ${String(f)}`)}}let i=r.secure??{};for(let{key:d,options:y}of re.getAll())if(o.allows(`secure:${d}`)){if(y.requireAuthentication){d in i&&a.skipped.push({id:`secure:${d}`,reason:"biometric-protected keys are never written"});continue}try{if(d in i){let g=i[d];g===null?await re.deleteValue(d):await re.setValue(d,g)}else await re.deleteValue(d);a.applied+=1}catch(g){a.ok=false,a.warnings.push(`secure "${d}" restore failed: ${String(g)}`)}}for(let d of Object.keys(i))n(`secure:${d}`)&&(re.getAll().some(y=>y.key===d)||a.skipped.push({id:`secure:${d}`,reason:"key no longer registered with registerSecureStoreKeys"}));let u=o.excludedWarning("item(s)");return u&&a.warnings.push(u),a}async function Li(){let e=In();try{await Qr(),e.applied+=1}catch(t){e.ok=false,e.warnings.push(`asyncstorage clear failed: ${String(t)}`)}for(let{id:t,instance:r}of Pe.getAll()){if(r.isReadOnly){e.skipped.push({id:`mmkv:${t}`,reason:"instance registered read-only"});continue}try{for(let o of r.getAllKeys().filter(n=>!mt(n)))An(r,o),e.applied+=1}catch(o){e.ok=false,e.warnings.push(`mmkv "${t}" clear failed: ${String(o)}`)}}for(let{key:t,options:r}of re.getAll()){if(r.requireAuthentication){e.skipped.push({id:`secure:${t}`,reason:"biometric-protected keys are never written"});continue}try{await re.deleteValue(t),e.applied+=1}catch(o){e.ok=false,e.warnings.push(`secure "${t}" clear failed: ${String(o)}`)}}return e}var Wi=256*1024;function Fo(e,t,r,o,n,a){return xi({key:e,label:t,oldValue:r,newValue:o,inOld:n,inNew:a},{equal:Object.is,tooLarge:i=>typeof i=="string"&&i.length>Wi,tooLargeReason:"value too large to render a diff \u2014 restore still applies it"})}async function _i(e,t){let r=e??{async:[],mmkv:{},secure:{}},o=t===void 0,n=o?(await Dn()).data:t??{async:[],mmkv:{},secure:{}},a=[],i=[],u=new Map(n.async??[]),d=new Map(r.async??[]);for(let f of Yr(u,d))mt(f)||a.push(Fo(`async:${f}`,f,u.get(f),d.get(f),u.has(f),d.has(f)));for(let f of Yr(n.mmkv,r.mmkv)){let x=o?Pe.get(f):null,h=o&&!x,b=o&&x?.instance.isReadOnly===true,S=new Map((n.mmkv?.[f]??[]).map(T=>[T.key,T])),w=new Map((r.mmkv?.[f]??[]).map(T=>[T.key,T]));for(let T of Yr(S,w)){if(mt(T))continue;let I=`mmkv:${f}/${T}`,E=`${f} \xB7 ${T}`,D=S.get(T),C=w.get(T),R=Fo(I,E,D?.value,C?.value,S.has(T),w.has(T));h?R=Er(R,"MMKV instance not registered"):b?R=Er(R,"MMKV instance registered read-only"):(C?.valueType==="buffer"||D?.valueType==="buffer")&&(R=Er(R,"ArrayBuffer values cannot be restored")),a.push(R)}}let y=n.secure??{},g=r.secure??{},p=o?new Map(re.getAll().map(f=>[f.key,f])):null;for(let f of Yr(y,g)){let x=Fo(`secure:${f}`,f,y[f],g[f],f in y,f in g);if(o){let h=p?.get(f);h?h.options.requireAuthentication&&(x=Er(x,"biometric-protected keys are never written")):x=Er(x,"key no longer registered with registerSecureStoreKeys")}a.push(x)}return{items:a,notes:i}}Ei({id:"storage",label:"Storage",status:Ki,capture:Fi,restore:Oi,clear:Li,previewItems:_i});V();import{StorageIcon as $i}from"@buoy-gg/floating-tools-core/web";import{createToolFactory as Ni,defineToolPreset as qi}from"@buoy-gg/shared-ui/web";V();import{useState as tt,useCallback as Be,useEffect as Oo,useRef as Mn,useMemo as at}from"react";var Pn={};wn(Pn,{AccessibilityInfo:()=>Ji,ActivityIndicator:()=>Ll,Alert:()=>xe,Animated:()=>qt,AppRegistry:()=>Yi,AppState:()=>Qi,Appearance:()=>Gi,BackHandler:()=>Zi,Button:()=>Wl,CheckBox:()=>gl,Clipboard:()=>Xi,DeviceEventEmitter:()=>Rl,Dimensions:()=>el,Easing:()=>Rr,FlatList:()=>Lo,I18nManager:()=>tl,Image:()=>pl,ImageBackground:()=>fl,InteractionManager:()=>ol,Keyboard:()=>rl,KeyboardAvoidingView:()=>ml,LayoutAnimation:()=>nl,Linking:()=>al,LogBox:()=>El,Modal:()=>zn,NativeEventEmitter:()=>il,NativeModules:()=>Ui,PanResponder:()=>ll,Picker:()=>hl,PixelRatio:()=>sl,Platform:()=>cl,Pressable:()=>Fl,ProgressBar:()=>bl,RefreshControl:()=>vl,SafeAreaView:()=>Sl,ScrollView:()=>Vr,SectionList:()=>wl,Share:()=>dl,StatusBar:()=>kl,StyleSheet:()=>ge,Switch:()=>Ol,Text:()=>c,TextInput:()=>Pl,Touchable:()=>Cl,TouchableHighlight:()=>zl,TouchableNativeFeedback:()=>xl,TouchableOpacity:()=>K,TouchableWithoutFeedback:()=>Kl,UIManager:()=>ul,Vibration:()=>yl,View:()=>l,VirtualizedList:()=>Tl,YellowBox:()=>Il,findNodeHandle:()=>_l,unstable_createElement:()=>ji,useColorScheme:()=>Vl,useLocaleContext:()=>Bl,useWindowDimensions:()=>Al});V();wi(Pn,Hi);import*as Hi from"react-native-web";import{unstable_createElement as ji,NativeModules as Ui,AccessibilityInfo as Ji,Animated as qt,Appearance as Gi,AppRegistry as Yi,AppState as Qi,BackHandler as Zi,Clipboard as Xi,Dimensions as el,Easing as Rr,I18nManager as tl,Keyboard as rl,InteractionManager as ol,LayoutAnimation as nl,Linking as al,NativeEventEmitter as il,PanResponder as ll,PixelRatio as sl,Platform as cl,Share as dl,StyleSheet as ge,UIManager as ul,Vibration as yl,CheckBox as gl,FlatList as Lo,Image as pl,ImageBackground as fl,KeyboardAvoidingView as ml,Picker as hl,ProgressBar as bl,RefreshControl as vl,SafeAreaView as Sl,SectionList as wl,StatusBar as kl,Touchable as Cl,TouchableNativeFeedback as xl,VirtualizedList as Tl,YellowBox as Il,LogBox as El,DeviceEventEmitter as Rl,useColorScheme as Vl,useLocaleContext as Bl,useWindowDimensions as Al}from"react-native-web";import*as Ye from"react-native-web";import{createElement as Dl,forwardRef as Ml}from"react";function rt(e){let t=Ml((o,n)=>{let{accessibilityState:a,accessibilityValue:i,...u}=o;for(let d of["busy","checked","disabled","expanded","selected"])a?.[d]!==void 0&&u[`aria-${d}`]===void 0&&(u[`aria-${d}`]=a[d]);for(let[d,y]of Object.entries({min:"valuemin",max:"valuemax",now:"valuenow",text:"valuetext"}))i?.[d]!==void 0&&u[`aria-${y}`]===void 0&&(u[`aria-${y}`]=i[d]);return Dl(e,{...u,ref:n})}),r=e.State;return r&&Object.assign(t,{State:r}),t.displayName=e.displayName??e.name??"NativeWebView",t}var l=rt(Ye.View),c=rt(Ye.Text),Pl=rt(Ye.TextInput),K=rt(Ye.TouchableOpacity),zl=rt(Ye.TouchableHighlight),Kl=rt(Ye.TouchableWithoutFeedback),Fl=rt(Ye.Pressable),Vr=rt(Ye.ScrollView),zn=rt(Ye.Modal),Ol=rt(Ye.Switch),Ll=rt(Ye.ActivityIndicator),Wl=rt(Ye.Button),_l=Ye.findNodeHandle,xe={alert(e,t,r,o){if(typeof document>"u")return;let n=document.createElement("dialog");n.dataset.buoyRoot="",n.setAttribute("aria-label",e),n.style.cssText="position:fixed;inset:0;margin:auto;width:min(440px,90vw);padding:24px;border:1px solid #475569;border-radius:14px;background:#17212e;color:#f1f5f9;font:14px system-ui;box-shadow:0 20px 80px #0008;z-index:2147483647";let a=document.createElement("h2");if(a.textContent=e,a.style.cssText="font-size:18px;margin:0 0 12px",n.appendChild(a),t){let y=document.createElement("p");y.textContent=t,y.style.cssText="line-height:1.5;white-space:pre-wrap;margin:0 0 20px",n.appendChild(y)}let i=document.createElement("div");i.style.cssText="display:flex;justify-content:flex-end;flex-wrap:wrap;gap:8px";let u=r?.length?r:[{text:"OK"}],d=()=>{n.close?.(),n.remove()};for(let y of u){let g=document.createElement("button");g.type="button",g.textContent=y.text??"OK",g.style.cssText=`padding:9px 14px;border:1px solid #64748b;border-radius:7px;color:white;background:${y.style==="destructive"?"#a52b38":"#283a4d"};cursor:pointer;font:inherit`,g.onclick=()=>{d(),y.onPress?.()},i.appendChild(g)}n.addEventListener("cancel",y=>{y.preventDefault(),o?.cancelable!==false&&(d(),o?.onDismiss?.())}),n.appendChild(i),document.body.appendChild(n),n.showModal?n.showModal():n.setAttribute("open","")}};import Wo from"@buoy-gg/shared-ui/web/asyncStorage";import{JsModal as $l,ModalHeader as Ae,TabSelector as Nl,parseValue as ql,devToolsStorageKeys as rr,macOSColors as Hl,night as Oe,ToolEmptyState as jl,Filter as Ul,RefreshCw as Jl,Search as Gl,SearchBar as Yl,PowerToggleButton as Ql,ToolbarCopyButton as Kn,ToolbarClearButton as Zl,truncatePayload as Zr,TickProvider as Fn,useLimit as Xl,TIER_LIMITS as es,windowDragProps as ts,usePersistedState as Xr,monoFont as eo}from"@buoy-gg/shared-ui/web";V();V();V();var le={async:"Local",asyncFull:"localStorage",mmkv:"Session",secure:"Secure",hasSecure:false};import{useMemo as Le,useCallback as Qe,useState as Ht,useEffect as or,useRef as _o}from"react";import{absoluteFill as On,useLimit as Ln,TIER_LIMITS as rs,monoFont as Br}from"@buoy-gg/shared-ui/web";import{Database as Wn,Zap as os,ProBadge as _n,ProUpgradeModal as ns,ToolEmptyState as as,resolveListEmptyState as is}from"@buoy-gg/shared-ui/web";import{isDevToolsStorageKey as ze}from"@buoy-gg/shared-ui/web";V();import{useCallback as $n,useState as ls}from"react";V();import{memo as ss}from"react";import{macOSColors as pe,night as se,CompactRow as cs,TypeBadge as Nn,HardDrive as ds,Square as us,CheckSquare as ys,Edit3 as gs,EyeOff as ps,Pin as qn,Trash2 as fs,ExpandedInfoRow as $o,PillBadge as Ar,monoFont as nr}from"@buoy-gg/shared-ui/web";V();import{gameUIColors as to}from"@buoy-gg/shared-ui/web";function No(e){switch(e){case"mmkv":return"MMKV";case"async":return"Async";case"secure":return"Secure";default:return e}}function Hn(e){switch(e){case"mmkv":return to.info;case"async":return to.warning;case"secure":return to.success;default:return to.muted}}V();function Et(e){if(e===null)return"null";if(e===void 0)return"undefined";if(Array.isArray(e))return"array";let t=typeof e;return t==="object"?"object":t==="boolean"?"boolean":t==="number"?"number":t==="string"?"string":"unknown"}function jn(e){if(typeof e!="string")return e;let t=e.trim();if(!t.startsWith("{")&&!t.startsWith("["))return e;try{return JSON.parse(e)}catch{return e}}var ms=40;function hs(e){switch(typeof e){case"boolean":return e?"true":"false";case"number":return Number.isFinite(e)?String(e):null;case"string":return e.length===0?'""':e.length>ms?null:`"${e.replace(/\s+/g," ")}"`;default:return null}}function bs(e){let t=Et(e),r=hs(e);return r?`${t} \xB7 ${r}`:t}import{DataViewer as vs}from"@buoy-gg/shared-ui/web/dataViewer";import{Fragment as Ss,jsx as W,jsxs as Re}from"react/jsx-runtime";var Un=[pe.semantic.info,pe.semantic.success,pe.semantic.warning,pe.semantic.debug,"#FF6B9D","#00D9FF"];function Jn(e){let t=e.split("").reduce((r,o)=>r+o.charCodeAt(0),0);return Un[t%Un.length]}var Gn=e=>{switch(e){case"required_present":return{label:"Valid",color:pe.semantic.success,sublabel:"Required"};case"required_missing":return{label:"Missing",color:pe.semantic.error,sublabel:"Required"};case"required_wrong_value":return{label:"Wrong",color:pe.semantic.warning,sublabel:"Invalid value"};case"required_wrong_type":return{label:"Type Error",color:pe.semantic.info,sublabel:"Wrong type"};case"optional_present":return{label:"Set",color:pe.semantic.debug,sublabel:"Optional"};default:return{label:"Set",color:pe.text.secondary,sublabel:String(e)}}},ws=e=>e==null?"undefined":typeof e=="string"?e:JSON.stringify(e),ks=ss(function({storageKey:e,isExpanded:t,onPress:r,isSelectMode:o=false,isSelected:n=false,onSelectionChange:a,eventCount:i,onViewHistory:u,onHideKey:d,isPinned:y=false,onTogglePin:g,onEditKey:p,onToggleKey:f,onDeleteKey:x,editBlockedReason:h}){let b=p!=null&&h==null,S=Gn(e.status),w=e.value!==void 0&&e.value!==null,T=w&&typeof e.value=="boolean",I=e.key,E=No(e.storageType),D=jn(e.value),C=D!==null&&typeof D=="object",R=Re(l,{style:_.expandedContainer,children:[W($o,{label:"Storage",children:W(Ar,{color:qo(e.storageType),children:E})}),e.storageType==="mmkv"&&e.instanceId&&W($o,{label:"Instance",children:W(Ar,{color:Jn(e.instanceId),icon:W(ds,{size:9,color:Jn(e.instanceId)}),children:e.instanceId})}),i!=null&&i>0&&Re($o,{label:"Updates",children:[W(Ar,{color:pe.semantic.warning,children:String(i)}),i>1&&u&&W(K,{onPress:u,testID:"buoy-storage-key-history",accessibilityLabel:`View history for ${e.key}`,accessibilityRole:"button",style:_.viewHistoryButton,hitSlop:{top:6,bottom:6,left:6,right:6},children:W(c,{style:_.viewHistoryText,children:"view history \u2192"})})]}),C?W(l,{style:_.dataViewerContainer,children:W(vs,{data:D,title:"",showTypeFilter:true,rawMode:true,initialExpanded:true})}):Re(l,{style:_.expandedRow,children:[W(c,{style:_.expandedLabel,children:"Value:"}),W(c,{style:_.expandedValue,numberOfLines:3,children:ws(e.value)||"undefined"})]}),e.status==="required_wrong_type"&&e.expectedType&&Re(Ss,{children:[Re(l,{style:_.expandedRow,children:[W(c,{style:_.expandedLabel,children:"Type:"}),W(Nn,{type:Et(e.value)})]}),Re(l,{style:_.expandedRow,children:[W(c,{style:_.expandedLabel,children:"Expected:"}),W(Nn,{type:e.expectedType})]})]}),e.status==="required_wrong_value"&&e.expectedValue&&Re(l,{style:_.expandedRow,children:[W(c,{style:_.expandedLabel,children:"Expected:"}),W(c,{style:_.expandedExpected,children:String(e.expectedValue)})]}),e.description?Re(l,{style:_.expandedRow,children:[W(c,{style:_.expandedLabel,children:"Info:"}),W(c,{style:_.expandedDescription,children:e.description})]}):null,h?Re(l,{style:_.expandedRow,children:[W(c,{style:_.expandedLabel,children:"Edit:"}),W(c,{style:_.expandedDescription,children:h})]}):null,g||d||b?Re(l,{style:_.actionRow,children:[b?Re(K,{style:_.editButton,testID:"buoy-storage-key-edit",accessibilityLabel:T&&f?`Toggle ${e.key}`:`Edit ${e.key}`,accessibilityRole:"button",onPress:()=>T&&f?f(e):p?.(e),hitSlop:{top:6,bottom:6,left:6,right:6},children:[W(gs,{size:13,color:se.color.onAccent}),W(c,{style:_.editButtonText,children:T&&f?"Toggle":"Edit"})]}):null,g?Re(K,{style:[_.actionChip,y&&_.actionChipActive],testID:"buoy-storage-key-pin",accessibilityLabel:y?`Unpin ${e.key}`:`Pin ${e.key} to top`,accessibilityRole:"button",onPress:()=>g(e.key),hitSlop:{top:6,bottom:6,left:6,right:6},children:[W(qn,{size:12,active:y,color:se.color.accent}),W(c,{style:[_.actionChipText,{color:se.color.accent}],children:y?"Unpin":"Pin to top"})]}):null,d?Re(K,{style:_.actionChip,testID:"buoy-storage-key-hide",accessibilityLabel:`Hide ${e.key} from list`,accessibilityRole:"button",onPress:()=>d(e),hitSlop:{top:6,bottom:6,left:6,right:6},children:[W(ps,{size:12,color:se.color.warning}),W(c,{style:[_.actionChipText,{color:se.color.warning}],children:"Hide from list"})]}):null,b&&x?Re(K,{style:[_.actionChip,_.dangerChip],testID:"buoy-storage-key-delete",accessibilityLabel:`Delete key ${e.key}`,accessibilityRole:"button",onPress:()=>x(e),hitSlop:{top:6,bottom:6,left:6,right:6},children:[W(fs,{size:12,color:se.color.danger}),W(c,{style:[_.actionChipText,{color:se.color.danger}],children:"Delete key"})]}):null]}):null]}),Q=()=>{a?.(e,!n)},be=o?W(K,{onPress:Q,testID:`buoy-storage-checkbox-${e.storageType}-${e.key}`,accessibilityLabel:`Select ${e.key}`,accessibilityRole:"checkbox",accessibilityState:{checked:n},style:_.checkboxContainer,hitSlop:{top:8,bottom:8,left:8,right:8},children:n?W(ys,{size:18,color:se.color.accent}):W(us,{size:18,color:se.color.textTertiary})}):null;return Re(l,{style:[_.rowContainer,n&&_.rowContainerSelected],children:[be,Re(l,{style:_.compactRowWrapper,children:[W(cs,{statusDotColor:S.color,statusLabel:S.label,statusSublabel:S.sublabel,primaryText:I,secondaryText:w?T?Et(e.value):bs(e.value):void 0,secondaryAccessory:T?W(Ar,{size:"sm",color:e.value?pe.semantic.success:pe.semantic.error,children:e.value?"true":"false"}):void 0,expandedContent:R,isExpanded:t,expandedGlowColor:S.color,customBadge:Re(l,{style:_.badgeRow,children:[y&&W(qn,{size:12,active:true,color:se.color.accent}),W(Ar,{color:qo(e.storageType),children:E})]}),showChevron:!o,onPress:o?Q:r?()=>r(e):void 0,testID:`buoy-storage-row-${e.storageType}-${e.key}`,accessibilityLabel:`${e.storageType} ${e.key}`}),i!=null&&i>1&&W(l,{style:[_.absCountBadge,t&&_.absCountBadgeExpanded,{backgroundColor:pe.semantic.warning+"22",borderColor:pe.semantic.warning+"55"}],pointerEvents:"none",children:W(c,{style:[_.absCountText,{color:pe.semantic.warning}],children:String(i)})})]})]})}),qo=e=>{switch(e){case"mmkv":return pe.semantic.info;case"async":return pe.semantic.warning;case"secure":return pe.semantic.success;default:return pe.text.secondary}},_=ge.create({badgeRow:{flexDirection:"row",alignItems:"center",gap:6},expandedContainer:{gap:8},expandedRow:{flexDirection:"row",alignItems:"center",gap:10},expandedLabel:{fontSize:10,color:se.color.textTertiary,fontWeight:"600",minWidth:70,fontFamily:nr},expandedValue:{fontSize:11,color:se.color.textSecondary,fontFamily:nr,flex:1},expandedExpected:{fontSize:11,color:pe.semantic.warning,fontFamily:nr,flex:1},expandedDescription:{fontSize:11,color:se.color.textSecondary,flex:1},dataViewerContainer:{marginTop:6,marginBottom:6,backgroundColor:se.color.bg,borderRadius:6,borderWidth:1,borderColor:se.color.border,padding:6},rowContainer:{flexDirection:"row",alignItems:"flex-start"},rowContainerSelected:{backgroundColor:se.color.accentSoft,borderRadius:8},checkboxContainer:{paddingLeft:4,paddingRight:8,paddingTop:10,alignSelf:"flex-start"},compactRowWrapper:{flex:1},absCountBadge:{position:"absolute",top:4,right:10,paddingHorizontal:5,paddingVertical:1,borderRadius:4,borderWidth:1,zIndex:1},absCountBadgeExpanded:{top:13},absCountText:{fontSize:9,fontWeight:"700",fontFamily:nr},actionRow:{flexDirection:"row",alignItems:"center",flexWrap:"wrap",gap:8,marginTop:4},actionChip:{flexDirection:"row",alignItems:"center",gap:6,paddingVertical:6,paddingHorizontal:10,borderRadius:6,backgroundColor:se.color.surface,borderWidth:1,borderColor:se.color.border},dangerChip:{borderColor:se.color.danger+"55"},actionChipActive:{backgroundColor:se.color.accentSoft,borderColor:se.color.accentBorderStrong},editButton:{flexDirection:"row",alignItems:"center",gap:6,paddingVertical:8,paddingHorizontal:14,borderRadius:8,backgroundColor:se.color.accent},editButtonText:{color:se.color.onAccent,fontSize:12,fontWeight:"700"},actionChipText:{fontSize:11,fontWeight:"600",fontFamily:nr},viewHistoryButton:{marginLeft:4},viewHistoryText:{fontSize:10,fontWeight:"600",fontFamily:nr,color:se.color.accent}});import{SectionHeader as ar,night as Ho}from"@buoy-gg/shared-ui/web";import{jsx as bt,jsxs as ro}from"react/jsx-runtime";function jo(e){return e.instanceId?`${e.storageType}-${e.instanceId}-${e.key}`:`${e.storageType}-${e.key}`}function Yn({title:e,count:t,keys:r,emptyMessage:o,headerColor:n,isSelectMode:a=false,selectedKeys:i=new Set,onSelectionChange:u,eventCountByKey:d,onViewHistory:y,onHideKey:g,pinnedKeys:p,onTogglePin:f,onEditKey:x,onToggleKey:h,onDeleteKey:b,editBlockedFor:S,onRowRef:w,onOpenKey:T}){let I=$n(R=>jo(R),[]),[E,D]=ls(null),C=$n(R=>{if(!R||typeof R.key!="string")return;if(T){T(R);return}let Q=I(R);D(be=>be===Q?null:Q)},[I,T]);return r.length===0&&e==="Required Keys"?ro(l,{style:Dr.sectionContainer,children:[ro(ar,{children:[bt(ar.Title,{children:e}),bt(ar.Badge,{count:0,color:n})]}),bt(l,{style:Dr.emptySection,children:bt(c,{style:Dr.emptySectionText,children:o})})]}):r.length===0?null:ro(l,{style:Dr.sectionContainer,children:[e?ro(ar,{children:[bt(ar.Title,{children:e}),t>=0&&bt(ar.Badge,{count:t,color:n})]}):null,bt(l,{style:Dr.sectionContent,children:r.map(R=>{let Q=I(R);return bt(l,{ref:w?be=>w(Q,be):void 0,collapsable:false,children:bt(ks,{storageKey:R,isExpanded:!a&&E===Q,onPress:C,isSelectMode:a,isSelected:i.has(Q),onSelectionChange:u,eventCount:d?.[R.key],onViewHistory:y?()=>y(R.key):void 0,onHideKey:g,onEditKey:x,onToggleKey:h,onDeleteKey:b,editBlockedReason:S?.(R),isPinned:p?.has(R.key),onTogglePin:f})},Q)})})]})}var Dr=ge.create({sectionContainer:{gap:8},sectionContent:{},emptySection:{backgroundColor:Ho.color.surface,borderRadius:6,padding:16,borderWidth:1,borderColor:Ho.color.border,alignItems:"center"},emptySectionText:{color:Ho.color.textTertiary,fontSize:11,textAlign:"center"}});V();import{useCallback as Cs,useMemo as Qn,useRef as Zn,useState as Xn}from"react";import{EyeOff as xs,FileJson as Ts,HardDrive as Is,night as G,macOSColors as ir,Pin as Es,PillBadge as oo,Trash2 as Rs,TypeBadge as Vs,useSafeAreaInsets as Bs,monoFont as Rt}from"@buoy-gg/shared-ui/web";import{DataViewer as As,LiveExplorer as Ds,ValueEditModal as Ms,updateNestedDataByPath as Ps,deleteNestedDataByPath as zs}from"@buoy-gg/shared-ui/web/dataViewer";import{jsx as F,jsxs as fe}from"react/jsx-runtime";var Ks=300,ut="buoy-storage-detail";function Fs(e){let t=r=>r.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length===0?`${ut}-explorer-root`:`${ut}-explorer-${e.map(t).filter(Boolean).join("-")}`}var ea=[ir.semantic.info,ir.semantic.success,ir.semantic.warning,ir.semantic.debug,"#FF6B9D","#00D9FF"];function ta(e){let t=e.split("").reduce((r,o)=>r+o.charCodeAt(0),0);return ea[t%ea.length]}function Os({storageKey:e,editBlockedReason:t,eventCount:r,onSave:o,onViewHistory:n,onDeleteKey:a,onHideKey:i,isPinned:u=false,onTogglePin:d,applySafeAreaInset:y}){let g=Bs(),p=y?g.bottom:0,f=t==null,x=Gn(e.status),h=No(e.storageType),[b,S]=Xn(false),[w,T]=Xn(0),I=Zn(null),E=Qn(()=>jn(e.value),[e.value]),D=typeof e.value=="string"?e.value:JSON.stringify(e.value);I.current&&I.current.raw===D&&(I.current=null);let C=I.current?I.current.value:E,R=Cs(H=>{let de=typeof H=="string"?H:JSON.stringify(H);I.current={raw:de,value:H},o(de).catch(ee=>{I.current=null,xe.alert("Couldn't save",ee instanceof Error?ee.message:String(ee))})},[o]),Q=Zn(C);Q.current=C;let be=Qn(()=>{if(f)return{update:(H,de)=>{let ee=H.length===0?de:Ps(Q.current,H,de);R(ee)},remove:H=>{H.length!==0&&R(zs(Q.current,H))}}},[f,R]),ve=d||i||f&&a;return fe(l,{style:A.screen,children:[F(l,{testID:`${ut}-key`,accessibilityLabel:e.key}),fe(Vr,{testID:`${ut}-scroll`,style:A.scroll,contentContainerStyle:[A.scrollContent,{paddingBottom:24+p}],keyboardShouldPersistTaps:"handled",children:[F(l,{style:A.section,children:fe(l,{style:A.editorContainer,children:[fe(l,{style:A.sectionHeaderRow,children:[F(c,{testID:`${ut}-editor-header`,style:A.sectionHeaderAccentText,children:"Value Editor"}),f?fe(K,{onPress:()=>S(true),testID:`${ut}-raw`,accessibilityRole:"button",accessibilityLabel:"Edit raw JSON",style:A.rawButton,hitSlop:{top:6,bottom:6,left:6,right:6},children:[F(Ts,{size:13,color:G.color.accent}),F(c,{style:A.rawButtonText,children:"Raw"})]}):null]}),fe(l,{style:A.sectionBody,children:[F(Ds,{editable:f,label:"Value",value:C,defaultExpanded:["Value"],writer:be,dataVersion:w,testIDForPath:Fs,debounceMs:Ks}),f?F(c,{style:A.editorHint,children:"Edits write to the device as you make them \u2014 undo lives in the key's history."}):F(c,{style:A.blockedText,testID:`${ut}-edit-blocked`,children:t})]})]})}),F(l,{style:A.section,children:fe(l,{style:A.infoContainer,children:[F(c,{style:A.sectionHeaderPlain,children:"Key Details"}),fe(l,{style:A.infoBody,children:[fe(l,{style:A.infoRow,children:[F(c,{style:A.infoLabel,children:"Status:"}),F(oo,{color:x.color,testID:`${ut}-status`,children:x.label}),F(c,{style:A.infoDim,children:x.sublabel})]}),fe(l,{style:A.infoRow,children:[F(c,{style:A.infoLabel,children:"Storage:"}),F(oo,{color:qo(e.storageType),testID:`${ut}-backend`,children:h}),F(c,{style:A.infoDim,children:Et(e.value)})]}),e.storageType==="mmkv"&&e.instanceId&&fe(l,{style:A.infoRow,children:[F(c,{style:A.infoLabel,children:"Instance:"}),F(oo,{color:ta(e.instanceId),icon:F(Is,{size:9,color:ta(e.instanceId)}),children:e.instanceId})]}),r!=null&&r>0&&fe(l,{style:A.infoRow,children:[F(c,{style:A.infoLabel,children:"Updates:"}),F(oo,{color:ir.semantic.warning,children:String(r)}),r>1&&n&&F(K,{onPress:n,testID:"buoy-storage-key-history",accessibilityLabel:`View history for ${e.key}`,accessibilityRole:"button",style:A.inlineLinkButton,hitSlop:{top:6,bottom:6,left:6,right:6},children:F(c,{style:A.inlineLinkText,children:"view history \u2192"})})]}),e.status==="required_wrong_type"&&e.expectedType&&fe(l,{style:A.infoRow,children:[F(c,{style:A.infoLabel,children:"Expected:"}),F(Vs,{type:e.expectedType}),fe(c,{style:A.infoDim,children:["got ",Et(e.value)]})]}),e.status==="required_wrong_value"&&e.expectedValue&&fe(l,{style:A.infoRow,children:[F(c,{style:A.infoLabel,children:"Expected:"}),F(c,{style:A.infoExpected,children:String(e.expectedValue)})]}),e.description?fe(l,{style:A.infoRow,children:[F(c,{style:A.infoLabel,children:"Info:"}),F(c,{style:A.infoDescription,children:e.description})]}):null]})]})}),F(l,{style:A.section,children:fe(l,{style:A.infoContainer,children:[F(c,{style:A.sectionHeaderPlain,children:"Value Explorer"}),F(l,{style:A.viewerBody,testID:`${ut}-viewer`,children:C!==null&&typeof C=="object"?F(As,{title:"",data:C,showTypeFilter:true,rawMode:true,initialExpanded:false}):F(c,{style:A.rawValueText,selectable:true,children:D??"undefined"})})]})}),ve?fe(l,{style:A.actionRow,children:[d?fe(K,{style:[A.actionChip,u&&A.actionChipActive],testID:"buoy-storage-key-pin",accessibilityLabel:u?`Unpin ${e.key}`:`Pin ${e.key} to top`,accessibilityRole:"button",onPress:()=>d(e.key),hitSlop:{top:6,bottom:6,left:6,right:6},children:[F(Es,{size:12,active:u,color:G.color.accent}),F(c,{style:[A.actionChipText,{color:G.color.accent}],children:u?"Unpin":"Pin to top"})]}):null,i?fe(K,{style:A.actionChip,testID:"buoy-storage-key-hide",accessibilityLabel:`Hide ${e.key} from list`,accessibilityRole:"button",onPress:()=>i(e),hitSlop:{top:6,bottom:6,left:6,right:6},children:[F(xs,{size:12,color:G.color.warning}),F(c,{style:[A.actionChipText,{color:G.color.warning}],children:"Hide from list"})]}):null,f&&a?fe(K,{style:[A.actionChip,A.dangerChip],testID:"buoy-storage-key-delete",accessibilityLabel:`Delete key ${e.key}`,accessibilityRole:"button",onPress:()=>a(e),hitSlop:{top:6,bottom:6,left:6,right:6},children:[F(Rs,{size:12,color:G.color.danger}),F(c,{style:[A.actionChipText,{color:G.color.danger}],children:"Delete key"})]}):null]}):null]}),b&&f?F(Ms,{path:[],value:C,onSave:H=>{R(H),T(de=>de+1),S(false)},onCancel:()=>S(false),saveLabel:"Apply",testIDPrefix:"buoy-storage-value"}):null]})}var A=ge.create({screen:{flex:1,minHeight:0},scroll:{flex:1},scrollContent:{paddingHorizontal:8,paddingTop:8},section:{marginBottom:16},editorContainer:{minWidth:200,backgroundColor:G.color.surface,borderRadius:6,borderWidth:1,borderColor:G.color.accent+"4D",overflow:"hidden",shadowColor:G.color.accent,shadowOffset:{width:0,height:0},shadowOpacity:.1,shadowRadius:6},sectionHeaderRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",backgroundColor:G.color.accent+"1A",paddingHorizontal:12,paddingVertical:8,borderBottomWidth:1,borderBottomColor:G.color.accent+"33"},sectionHeaderAccentText:{fontWeight:"600",fontSize:12,color:G.color.accent,letterSpacing:.5,textTransform:"uppercase",fontFamily:Rt},rawButton:{flexDirection:"row",alignItems:"center",gap:4},rawButtonText:{color:G.color.accent,fontSize:11,fontWeight:"700"},sectionBody:{padding:8},editorHint:{color:G.color.textTertiary,fontSize:10,paddingTop:8,paddingHorizontal:4,lineHeight:14},blockedText:{color:G.color.textSecondary,fontSize:12,padding:12,lineHeight:18},infoContainer:{minWidth:200,backgroundColor:G.color.surface,borderRadius:6,borderWidth:1,borderColor:G.color.border,overflow:"hidden"},sectionHeaderPlain:{backgroundColor:G.color.surfaceElevated,paddingHorizontal:12,paddingVertical:8,fontWeight:"600",fontSize:12,color:G.color.textSecondary,borderBottomWidth:1,borderBottomColor:G.color.border,letterSpacing:.5,textTransform:"uppercase",fontFamily:Rt},infoBody:{padding:12,gap:10},infoRow:{flexDirection:"row",alignItems:"center",gap:8},infoLabel:{fontSize:10,color:G.color.textTertiary,fontWeight:"600",minWidth:64,fontFamily:Rt},infoDim:{color:G.color.textTertiary,fontSize:10,fontFamily:Rt},infoExpected:{fontSize:11,color:ir.semantic.warning,fontFamily:Rt,flex:1},infoDescription:{fontSize:11,color:G.color.textSecondary,flex:1},rawValueText:{color:G.color.textSecondary,fontSize:11,fontFamily:Rt,lineHeight:16,padding:12},viewerBody:{backgroundColor:G.color.bg,minHeight:48},inlineLinkButton:{marginLeft:4},inlineLinkText:{fontSize:10,fontWeight:"600",fontFamily:Rt,color:G.color.accent},actionRow:{flexDirection:"row",alignItems:"center",flexWrap:"wrap",gap:8,paddingHorizontal:4},actionChip:{flexDirection:"row",alignItems:"center",gap:6,paddingVertical:6,paddingHorizontal:10,borderRadius:6,backgroundColor:G.color.surface,borderWidth:1,borderColor:G.color.border},dangerChip:{borderColor:G.color.danger+"55"},actionChipActive:{backgroundColor:G.color.accentSoft,borderColor:G.color.accentBorderStrong},actionChipText:{fontSize:11,fontWeight:"600",fontFamily:Rt}});V();V();import{macOSColors as Uo,night as Vt,monoFont as Ls}from"@buoy-gg/shared-ui/web";import{jsx as Jo,jsxs as Ws}from"react/jsx-runtime";var _s=[{id:"all",label:"All Types",color:null},{id:"async",label:le.async,color:Uo.semantic.warning},{id:"mmkv",label:le.mmkv,color:Uo.semantic.info},{id:"secure",label:"Secure",color:Uo.semantic.success}];function Go({active:e,onChange:t,counts:r}){return Jo(l,{style:Mr.row,children:_s.filter(o=>le.hasSecure||o.id!=="secure").map(o=>{let n=e===o.id,a=o.color??Vt.color.accent;return Ws(K,{testID:`buoy-storage-type-${o.id}`,accessibilityRole:"button",accessibilityLabel:`Filter by ${o.label}`,accessibilityState:{selected:n},activeOpacity:.8,onPress:()=>t(o.id),style:[Mr.pill,{borderColor:Vt.color.border},n&&[Mr.pillActive,o.color?{backgroundColor:o.color+"15",borderColor:o.color+"40"}:{backgroundColor:Vt.color.accentSoft,borderColor:Vt.color.accentBorderStrong}]],children:[Jo(c,{style:[Mr.label,n&&{color:a,fontWeight:"600"}],children:o.label}),Jo(c,{style:[Mr.value,{color:n?a:Vt.color.textTertiary}],children:r[o.id]})]},o.id)})})}function ra(e){let t={all:e.length,async:0,mmkv:0,secure:0};for(let r of e)t[r.storageType]+=1;return t}var Mr=ge.create({row:{flexDirection:"row",gap:8,marginTop:2},pill:{flex:1,backgroundColor:Vt.color.buttonSurface,borderRadius:8,borderWidth:1,borderColor:Vt.color.border,paddingVertical:6,paddingHorizontal:8,alignItems:"center",justifyContent:"center",minHeight:32},pillActive:{borderWidth:1,transform:[{scale:1.005}]},label:{fontSize:9,color:Vt.color.textSecondary,textTransform:"uppercase",letterSpacing:.4,fontWeight:"500",marginBottom:1},value:{fontSize:12,fontWeight:"600",fontFamily:Ls,lineHeight:14}});import{macOSColors as Bt,night as Ke,monoFont as $s}from"@buoy-gg/shared-ui/web";V();function Yo(){try{return typeof window<"u"&&!!window.sessionStorage}catch{return false}}function Ns(){return null}function oa(){return"Session storage is unavailable in this browser context."}import{jsx as jt,jsxs as Pr}from"react/jsx-runtime";var ey=Yo();function qs({stats:e,tabStats:t,healthPercentage:r,healthStatus:o,healthColor:n,activeFilter:a="all",onFilterChange:i,activeStorageType:u="all",onStorageTypeChange:d,showStatus:y=true}){let g=t||{validCount:e.presentRequiredCount+e.optionalCount,missingCount:e.missingCount,issuesCount:e.wrongValueCount+e.wrongTypeCount,asyncCount:e.asyncCount||0,mmkvCount:e.mmkvCount||0,secureCount:e.secureCount||0,totalCount:e.totalCount};return Pr(l,{style:We.container,children:[y?Pr(l,{style:We.filtersRow,children:[Pr(K,{style:[We.filterChip,a==="all"&&[We.filterChipActive,{backgroundColor:Ke.color.accentSoft,borderColor:Ke.color.accentBorderStrong,shadowColor:Ke.color.accent}]],onPress:()=>i?.("all"),activeOpacity:.8,testID:"buoy-storage-status-all",accessibilityRole:"button",accessibilityLabel:"Valid keys",children:[jt(c,{style:[We.filterValue,{color:Ke.color.text}],children:g.validCount}),jt(c,{style:We.filterLabel,children:"Valid"})]}),Pr(K,{style:[We.filterChip,a==="missing"&&[We.filterChipActive,{backgroundColor:Bt.semantic.error+"10",borderColor:Bt.semantic.error+"30",shadowColor:Bt.semantic.error}]],onPress:()=>i?.("missing"),activeOpacity:.8,testID:"buoy-storage-status-missing",accessibilityRole:"button",accessibilityLabel:"Missing keys",children:[jt(c,{style:[We.filterValue,{color:g.missingCount>0?Bt.semantic.error:Ke.color.textTertiary}],children:g.missingCount}),jt(c,{style:We.filterLabel,children:"Missing"})]}),Pr(K,{style:[We.filterChip,a==="issues"&&[We.filterChipActive,{backgroundColor:Bt.semantic.warning+"10",borderColor:Bt.semantic.warning+"30",shadowColor:Bt.semantic.warning}]],onPress:()=>i?.("issues"),activeOpacity:.8,testID:"buoy-storage-status-issues",accessibilityRole:"button",accessibilityLabel:"Issues keys",children:[jt(c,{style:[We.filterValue,{color:g.issuesCount>0?Bt.semantic.warning:Ke.color.textTertiary}],children:g.issuesCount}),jt(c,{style:We.filterLabel,children:"Issues"})]})]}):null,d&&jt(Go,{active:u,onChange:d,counts:{all:g.totalCount,async:g.asyncCount,mmkv:g.mmkvCount,secure:g.secureCount}})]})}var We=ge.create({container:{backgroundColor:Ke.color.surface,borderRadius:12,padding:16,borderWidth:1,borderColor:Ke.color.border,gap:14,shadowColor:"#000000",shadowOpacity:.03,shadowRadius:12,shadowOffset:{width:0,height:2}},topRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between"},titleLeft:{flexDirection:"row",alignItems:"center",gap:8,flexShrink:1},healthDot:{width:6,height:6,borderRadius:3},titleText:{fontSize:12,fontWeight:"600",color:Ke.color.text,letterSpacing:.5,textTransform:"uppercase"},titleDivider:{width:4,height:1,backgroundColor:Ke.color.border,marginHorizontal:4},subtitleText:{color:Ke.color.textTertiary,fontSize:11},healthBadge:{paddingHorizontal:6,paddingVertical:2,borderRadius:6,borderWidth:1},healthBadgeText:{fontSize:10,fontWeight:"600",fontVariant:["tabular-nums"]},healthProgressBar:{height:3,borderRadius:1.5,backgroundColor:Ke.color.bg,overflow:"hidden"},healthProgressFill:{height:3,borderRadius:1.5},filtersRow:{flexDirection:"row",gap:10},filterChip:{flex:1,backgroundColor:Ke.color.buttonSurface,borderRadius:8,borderWidth:1,borderColor:Ke.color.border,paddingVertical:10,paddingHorizontal:12,alignItems:"center",justifyContent:"center",minHeight:44},filterChipActive:{borderWidth:1,shadowOffset:{width:0,height:0},shadowOpacity:.1,shadowRadius:6,elevation:2,transform:[{scale:1.005}]},filterLabel:{fontSize:9,color:Ke.color.textTertiary,textTransform:"uppercase",letterSpacing:.5,fontWeight:"500",marginTop:3},filterValue:{fontSize:18,fontWeight:"600",fontFamily:$s,lineHeight:20}});V();Nt();import{useState as Qo,useEffect as Hs,useCallback as js,useRef as Us}from"react";import Js from"@buoy-gg/shared-ui/web/asyncStorage";V();function At(e,t){return typeof e=="string"?t==="async":e.storageType?e.storageType===t:true}function Zo(e=[]){let[t,r]=Qo([]),[o,n]=Qo(true),[a,i]=Qo(null),u=JSON.stringify(e),d=Us(e);d.current=e;let y=js(async()=>{let g=d.current;n(true),i(null);try{let p=await Js.getAllKeys();if(!p||p.length===0){r([]),n(false);return}let f=await Gr(p),x=[];f.forEach(([h,b])=>{let S=b;if(b)try{S=JSON.parse(b)}catch{S=b}let w=g.find(E=>At(E,"async")?typeof E=="string"?E===h:E.key===h:false),T="optional_present";w&&(S==null?T="required_missing":typeof w=="object"&&w.expectedValue!==void 0?T=S===w.expectedValue?"required_present":"required_wrong_value":typeof w=="object"&&w.expectedType!==void 0?T=(S===null?"null":typeof S).toLowerCase()===w.expectedType.toLowerCase()?"required_present":"required_wrong_type":T="required_present");let I={key:h,value:S,storageType:"async",status:T,category:w?"required":"optional",...typeof w=="object"&&w.expectedValue!==void 0&&{expectedValue:w.expectedValue},...typeof w=="object"&&w.expectedType!==void 0&&{expectedType:w.expectedType},...typeof w=="object"&&w.description!==void 0&&{description:w.description}};x.push(I)}),g.forEach(h=>{if(!At(h,"async"))return;let b=typeof h=="string"?h:h.key;x.some(S=>S.key===b)||x.push({key:b,value:void 0,storageType:"async",status:"required_missing",category:"required",...typeof h=="object"&&h.expectedValue!==void 0&&{expectedValue:h.expectedValue},...typeof h=="object"&&h.expectedType!==void 0&&{expectedType:h.expectedType},...typeof h=="object"&&h.description!==void 0&&{description:h.description}})}),r(x)}catch(p){i(p instanceof Error?p:new Error("Failed to fetch storage data")),r([])}finally{n(false)}},[u]);return Hs(()=>{y()},[y]),{storageKeys:t,isLoading:o,error:a,refresh:y}}V();import{subscribeToBrowserStorage as Gs}from"@buoy-gg/shared-ui/web/utils";var Xo=new Set,en,Ys=false,Qs=new Set(["@react_buoy_storage_event_filters","@react_buoy_storage_key_filters","@react_buoy_storage_is_monitoring","REACT_QUERY_OFFLINE_CACHE"]),na=e=>[...Qs].some(t=>e.startsWith(t));async function Zs(){en||typeof window>"u"||(en=Gs(e=>{if(Ys||e.area!=="localStorage"||e.key!==void 0&&na(e.key))return;let{area:t,action:r,...o}=e;o.prevPairs&&(o.prevPairs=o.prevPairs.filter(([a])=>!na(a)));let n={action:r,data:o,timestamp:new Date};for(let a of[...Xo])try{a(n)}catch{}}))}function aa(e){return Xo.add(e),()=>{Xo.delete(e)}}function Xs(){return!!en}V();import{useState as lr,useEffect as ia,useCallback as la,useRef as sa}from"react";function ec(e,t,r=[]){let[o,n]=lr([]),[a,i]=lr(true),[u,d]=lr(null),y=JSON.stringify(r),g=sa(r);g.current=r;let p=la(()=>{let f=g.current;i(true),d(null);try{if(!e){n([]),i(false);return}let x=e.getAllKeys();if(!x||x.length===0){let b=f.filter(S=>At(S,"mmkv")).map(S=>{let w=typeof S=="string"?S:S.key,T=typeof S=="object"?S.description:void 0,I=typeof S=="object"?S.expectedValue:void 0,E=typeof S=="object"?S.expectedType:void 0;return{key:w,value:void 0,valueType:void 0,storageType:"mmkv",instanceId:t,status:"required_missing",category:"required",description:T,expectedValue:I,expectedType:E}});n(b),i(false);return}let h=[];x.forEach(b=>{let{value:S,type:w}=ht(e,b),T=f.find(D=>At(D,"mmkv")?typeof D=="string"?D===b:D.key===b:false),I="optional_present";T&&(S===void 0?I="required_missing":typeof T=="object"&&T.expectedValue!==void 0?I=String(S)===String(T.expectedValue)?"required_present":"required_wrong_value":typeof T=="object"&&T.expectedType!==void 0?I=zo(w,T.expectedType)?"required_present":"required_wrong_type":I="required_present");let E={key:b,value:S,valueType:w!=="unknown"?w:void 0,storageType:"mmkv",instanceId:t,status:I,category:T?"required":"optional",lastUpdated:new Date,...typeof T=="object"&&T.expectedValue!==void 0&&{expectedValue:T.expectedValue},...typeof T=="object"&&T.expectedType!==void 0&&{expectedType:T.expectedType},...typeof T=="object"&&T.description!==void 0&&{description:T.description}};h.push(E)}),f.forEach(b=>{if(!At(b,"mmkv"))return;let S=typeof b=="string"?b:b.key;h.some(w=>w.key===S)||h.push({key:S,value:void 0,valueType:void 0,storageType:"mmkv",instanceId:t,status:"required_missing",category:"required",...typeof b=="object"&&b.expectedValue!==void 0&&{expectedValue:b.expectedValue},...typeof b=="object"&&b.expectedType!==void 0&&{expectedType:b.expectedType},...typeof b=="object"&&b.description!==void 0&&{description:b.description}})}),n(h)}catch(x){d(x instanceof Error?x:new Error("Failed to fetch MMKV storage data")),n([])}finally{i(false)}},[e,t,y]);return ia(()=>{p()},[p]),{storageKeys:o,isLoading:a,error:u,refresh:p}}function ca(e,t=[]){let[r,o]=lr([]),[n,a]=lr(true),[i,u]=lr(null),d=JSON.stringify(t),y=sa(t);y.current=t;let g=la(()=>{let p=y.current;a(true),u(null);try{let f=[];e.forEach(({instance:x,id:h})=>{let b=x.getAllKeys();!b||b.length===0||b.forEach(S=>{let{value:w,type:T}=ht(x,S),I=p.find(C=>At(C,"mmkv")?typeof C=="string"?C===S:C.key===S:false),E="optional_present";I&&(w===void 0?E="required_missing":typeof I=="object"&&I.expectedValue!==void 0?E=String(w)===String(I.expectedValue)?"required_present":"required_wrong_value":typeof I=="object"&&I.expectedType!==void 0?E=zo(T,I.expectedType)?"required_present":"required_wrong_type":E="required_present");let D={key:S,value:w,valueType:T!=="unknown"?T:void 0,storageType:"mmkv",instanceId:h,status:E,category:I?"required":"optional",lastUpdated:new Date,...typeof I=="object"&&I.expectedValue!==void 0&&{expectedValue:I.expectedValue},...typeof I=="object"&&I.expectedType!==void 0&&{expectedType:I.expectedType},...typeof I=="object"&&I.description!==void 0&&{description:I.description}};f.push(D)})}),p.forEach(x=>{if(!At(x,"mmkv"))return;let h=typeof x=="string"?x:x.key;if(!f.some(b=>b.key===h)){let b=e[0]?.id||"mmkv.default";f.push({key:h,value:void 0,valueType:void 0,storageType:"mmkv",instanceId:b,status:"required_missing",category:"required",...typeof x=="object"&&x.expectedValue!==void 0&&{expectedValue:x.expectedValue},...typeof x=="object"&&x.expectedType!==void 0&&{expectedType:x.expectedType},...typeof x=="object"&&x.description!==void 0&&{description:x.description}})}}),o(f)}catch(f){u(f instanceof Error?f:new Error("Failed to fetch multi-MMKV storage data")),o([])}finally{a(false)}},[e,d]);return ia(()=>{g()},[g]),{storageKeys:r,isLoading:n,error:i,refresh:g}}V();import{useState as tn,useEffect as tc,useCallback as da,useRef as no}from"react";var rc="\u2022\u2022\u2022\u2022\u2022\u2022 (biometric protected)",oc=3e3;function ua(e){return JSON.stringify(e)}function nc(e=[],t={}){let{pollMs:r=oc}=t,o=no(e);o.current=e;let n=JSON.stringify(e),[a,i]=tn([]),[u,d]=tn(true),[y,g]=tn(null),p=no(ua([])),f=no(false),x=no(false),h=da(S=>{let w=ua(S);w!==p.current&&(p.current=w,i(S))},[]),b=da(async()=>{if(!x.current){x.current=true;try{let S=re.getModule(),w=re.getAll(),T=o.current.filter(C=>At(C,"secure")),I=C=>T.find(R=>(typeof R=="string"?R:R.key)===C);if(!S||w.length===0&&T.length===0){h([]),f.current=true,d(false);return}f.current||d(true),g(null);let E=[],D=[...w,...T.map(C=>typeof C=="string"?C:C.key).filter(C=>!w.some(R=>R.key===C)).map(C=>({key:C,options:{},description:void 0}))];for(let C of D){let R=I(C.key),Q=typeof R=="object"?R:void 0,be={...Q?.expectedValue!==void 0&&{expectedValue:Q.expectedValue},...Q?.expectedType!==void 0&&{expectedType:Q.expectedType}},ve=Q?.description??C.description;if(C.options.requireAuthentication){E.push({key:C.key,value:rc,storageType:"secure",status:R?"required_present":"optional_present",category:R?"required":"optional",description:ve??"Protected by biometric authentication \u2014 value not read by DevTools",...be,...C.options.keychainService&&{instanceId:C.options.keychainService}});continue}let H=null;try{H=await S.getItemAsync(C.key,C.options)}catch{}if(H===null&&!R)continue;let de=H;if(H)try{de=JSON.parse(H)}catch{de=H}let ee="optional_present";if(R)if(H===null)ee="required_missing";else if(Q?.expectedValue!==void 0)ee=String(de)===String(Q.expectedValue)?"required_present":"required_wrong_value";else if(Q?.expectedType!==void 0){let ie=de===null?"null":Array.isArray(de)?"array":typeof de,He=Q.expectedType.toLowerCase();ee=ie===He||He==="string"&&typeof H=="string"?"required_present":"required_wrong_type"}else ee="required_present";E.push({key:C.key,value:H===null?void 0:de,storageType:"secure",status:ee,category:R?"required":"optional",...ve&&{description:ve},...be,...C.options.keychainService&&{instanceId:C.options.keychainService}})}h(E)}catch(S){g(S instanceof Error?S:new Error("Failed to read SecureStore")),h([])}finally{f.current=true,x.current=false,d(false)}}},[h,n]);return tc(()=>{b();let S=re.subscribe(()=>{b()});if(r<=0)return S;let w=setInterval(b,r);return()=>{S(),clearInterval(w)}},[b,r]),{storageKeys:a,isLoading:u,error:y,refresh:b}}V();import{useState as ao,useEffect as io}from"react";function rn(e=false){let[t,r]=ao([]),[o,n]=ao(true),a=()=>{n(true);try{let i=Pe.getAll().map(u=>{let{instance:d,id:y,encrypted:g,readOnly:p}=u,f=d.getAllKeys()?.length||0;return{id:y,instance:d,encrypted:g,readOnly:p,keyCount:f,size:void 0}});r(i)}catch{r([])}finally{n(false)}};return io(()=>{a()},[]),io(()=>{if(!e)return;let i=setInterval(()=>{a()},1e3);return()=>clearInterval(i)},[e]),{instances:t,instanceCount:t.length,isLoading:o,refresh:a}}function ya(e){let[t,r]=ao(null);return io(()=>{if(!Pe){r(null);return}let o=Pe.get(e);if(!o){r(null);return}let n=o.instance.getAllKeys()?.length||0;r({...o,keyCount:n,size:void 0})},[e]),t}function ac(e){let[t,r]=ao(false);return io(()=>{if(!Pe){r(false);return}r(Pe.has(e))},[e]),t}V();import{useEffect as ic,useRef as ga}from"react";import{Check as lc,macOSColors as Ut}from"@buoy-gg/shared-ui/web";import{jsx as sr,jsxs as sc}from"react/jsx-runtime";var cc=2600,pa=180;function dc({onDone:e}){let t=ga(new qt.Value(0)).current,r=ga(e);return r.current=e,ic(()=>{let o=qt.sequence([qt.timing(t,{toValue:1,duration:pa,easing:Rr.out(Rr.quad),useNativeDriver:true}),qt.delay(cc),qt.timing(t,{toValue:0,duration:pa,easing:Rr.in(Rr.quad),useNativeDriver:true})]);return o.start(({finished:n})=>{n&&r.current()}),()=>o.stop()},[t]),sr(qt.View,{pointerEvents:"box-none",style:[cr.wrap,{opacity:t,transform:[{translateY:t.interpolate({inputRange:[0,1],outputRange:[-10,0]})}]}],testID:"buoy-storage-save-notice",children:sc(K,{activeOpacity:.85,onPress:()=>r.current(),style:cr.toast,accessibilityRole:"button",accessibilityLabel:"Saved. Applies on the app's next launch. Tap to dismiss.",testID:"buoy-storage-save-notice-dismiss",children:[sr(l,{style:cr.tick,children:sr(lc,{size:10,color:Ut.semantic.success})}),sr(c,{style:cr.saved,children:"Saved"}),sr(l,{style:cr.divider}),sr(c,{style:cr.detail,children:"applies on next launch"})]})})}var cr=ge.create({wrap:{position:"absolute",top:10,left:12,right:12,zIndex:100,elevation:100,alignItems:"center"},toast:{flexDirection:"row",alignItems:"center",paddingVertical:7,paddingLeft:8,paddingRight:12,borderRadius:999,backgroundColor:Ut.background.card,borderWidth:ge.hairlineWidth,borderColor:Ut.border.default,shadowColor:"#000",shadowOpacity:.4,shadowRadius:14,shadowOffset:{width:0,height:5}},tick:{width:16,height:16,borderRadius:8,marginRight:7,alignItems:"center",justifyContent:"center",backgroundColor:Ut.semantic.successBackground},saved:{color:Ut.text.primary,fontSize:12,fontWeight:"600"},divider:{width:ge.hairlineWidth,alignSelf:"stretch",marginHorizontal:8,backgroundColor:Ut.border.default},detail:{color:Ut.text.muted,fontSize:12}});V();import{useState as uc,useEffect as yc}from"react";import{Trash2 as lo,CopyButton as gc,SquareDashed as pc,X as fc,ProUpgradeModal as mc,monoFont as hc}from"@buoy-gg/shared-ui/web";import{macOSColors as fa,night as ot}from"@buoy-gg/shared-ui/web";import{useIsPro as bc}from"@buoy-gg/license/web";import ma from"@buoy-gg/shared-ui/web/asyncStorage";import{jsx as _e,jsxs as ha}from"react/jsx-runtime";function vc({copyValue:e,mmkvInstances:t=[],activeStorageType:r="all",onClearComplete:o,isSelectMode:n=false,onToggleSelectMode:a,selectedCount:i=0}){let[u,d]=uc(false),y=bc();yc(()=>{u&&y&&d(false)},[u,y]);let g=()=>{if(!y){d(true);return}xe.alert(`Clear ${le.asyncFull}`,`Delete all ${le.asyncFull} keys? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Clear",style:"destructive",onPress:async()=>{try{await ma.clear(),o?.()}catch(E){xe.alert("Error",`Failed: ${E}`)}}}])},p=(E,D)=>{if(!y){d(true);return}xe.alert(`Clear ${D}`,`Delete all keys from ${D}? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Clear",style:"destructive",onPress:()=>{try{let C=t.find(R=>R.id===E);C&&(C.instance.clearAll(),o?.())}catch(C){xe.alert("Error",`Failed: ${C}`)}}}])},f=()=>{if(!y){d(true);return}xe.alert(`Clear All ${le.mmkv}`,`Delete all keys from ${t.length} instances? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Clear All",style:"destructive",onPress:()=>{try{t.forEach(E=>E.instance.clearAll()),o?.()}catch(E){xe.alert("Error",`Failed: ${E}`)}}}])},x=()=>{if(!y){d(true);return}xe.alert("Clear All Storage","Delete all storage data? This cannot be undone.",[{text:"Cancel",style:"cancel"},{text:"Clear All",style:"destructive",onPress:async()=>{try{await ma.clear(),t.forEach(E=>E.instance.clearAll()),o?.()}catch(E){xe.alert("Error",`Failed: ${E}`)}}}])},h=r==="all"||r==="async",b=r==="all"||r==="mmkv",S=r==="all",w=h&&!S,T=b&&!S,I=b&&t.length>1&&!S;return ha(l,{style:yt.container,children:[a&&_e(K,{onPress:a,testID:"buoy-storage-select-mode",accessibilityLabel:n?"Exit selection mode":"Select keys",accessibilityRole:"button",style:[yt.actionButton,n&&yt.actionButtonActive],children:n?ha(l,{style:yt.selectModeActiveContainer,children:[_e(fc,{size:14,color:ot.color.accent}),i>0&&_e(c,{style:yt.selectedCountText,children:i})]}):_e(pc,{size:16,color:ot.color.textSecondary})}),!n&&_e(gc,{value:e,size:16,testID:"buoy-storage-export-copy",buttonStyle:yt.actionButton,colors:{idle:ot.color.textSecondary,success:fa.semantic.success,error:fa.semantic.error}}),!n&&S&&_e(K,{onPress:x,testID:"buoy-storage-clear-all",accessibilityLabel:"Clear all storage",accessibilityRole:"button",style:yt.actionButton,children:_e(lo,{size:16,color:ot.color.danger})}),!n&&w&&_e(K,{onPress:g,testID:"buoy-storage-clear-async",accessibilityLabel:`Clear ${le.asyncFull}`,accessibilityRole:"button",style:yt.actionButton,children:_e(lo,{size:16,color:ot.color.danger})}),!n&&I&&_e(K,{onPress:f,testID:"buoy-storage-clear-mmkv-all",accessibilityLabel:`Clear all ${le.mmkv} instances`,accessibilityRole:"button",style:yt.actionButton,children:_e(lo,{size:16,color:ot.color.danger})}),!n&&T&&t.length===1&&_e(K,{onPress:()=>p(t[0].id,t[0].id),testID:"buoy-storage-clear-mmkv",accessibilityLabel:`Clear ${le.mmkv} instance`,accessibilityRole:"button",style:yt.actionButton,children:_e(lo,{size:16,color:ot.color.danger})}),_e(mc,{visible:u,onClose:()=>d(false),featureName:"Storage Editing"})]})}var yt=ge.create({container:{flexDirection:"row",alignItems:"center",gap:8},actionButton:{width:32,height:32,alignItems:"center",justifyContent:"center",borderRadius:6,backgroundColor:ot.color.buttonSurface,borderWidth:1,borderColor:ot.color.border},actionButtonActive:{backgroundColor:ot.color.accentSoft,borderColor:ot.color.accentBorderStrong},selectModeActiveContainer:{flexDirection:"row",alignItems:"center",gap:2},selectedCountText:{fontSize:10,fontWeight:"700",color:ot.color.accent,fontFamily:hc}});V();import{useState as Sc,useEffect as wc}from"react";import{Trash2 as kc,CopyButton as Cc,CheckSquare as xc,EyeOff as Tc,ProUpgradeModal as Ic,monoFont as Ec}from"@buoy-gg/shared-ui/web";import{macOSColors as ba,night as $e}from"@buoy-gg/shared-ui/web";import{useIsPro as Rc}from"@buoy-gg/license/web";V();Nt();function Vc(e,t){if(typeof e.remove=="function"){e.remove(t);return}if(typeof e.delete=="function"){e.delete(t);return}throw new Error("MMKV instance exposes neither remove() nor delete()")}async function va(e,t){if(e.length===0)return;let r=e.filter(a=>a.storageType==="async"),o=e.filter(a=>a.storageType==="mmkv"),n=e.filter(a=>a.storageType==="secure");r.length>0&&await tr(r.map(a=>a.key));for(let a of n)await re.deleteValue(a.key);if(o.length>0){let a={};o.forEach(i=>{let u=i.instanceId||"default";a[u]||(a[u]=[]),a[u].push(i.key)}),Object.entries(a).forEach(([i,u])=>{let d=t.find(y=>y.id===i);d&&u.forEach(y=>Vc(d.instance,y))})}}import{jsx as vt,jsxs as zr}from"react/jsx-runtime";function Bc({selectedKeys:e,mmkvInstances:t,onDeleteComplete:r,onHideKeys:o,onSelectAll:n,onClearSelection:a,totalVisibleKeys:i}){let[u,d]=Sc(false),y=Rc();wc(()=>{u&&y&&d(false)},[u,y]);let g=e.length,p=g===i&&i>0,f=()=>{let b={};return e.forEach(S=>{let w=S.instanceId?`[${S.storageType}:${S.instanceId}]`:`[${S.storageType}]`;b[`${w} ${S.key}`]=S.value}),{selectedCount:g,keys:b,timestamp:new Date().toISOString()}},x=()=>{g!==0&&o?.(e)},h=()=>{if(g!==0){if(!y){d(true);return}xe.alert("Delete Selected Keys",`Delete ${g} selected key${g>1?"s":""}? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Delete",style:"destructive",onPress:async()=>{try{await va(e,t),r?.()}catch(b){xe.alert("Error",`Failed to delete keys: ${b}`)}}}])}};return g===0?null:zr(l,{style:gt.container,children:[zr(l,{style:gt.leftSection,children:[zr(K,{style:gt.selectAllButton,onPress:p?a:n,testID:"buoy-storage-select-all",accessibilityLabel:p?"Deselect all keys":"Select all keys",accessibilityRole:"button",children:[vt(xc,{size:14,color:p?$e.color.accent:$e.color.textSecondary}),vt(c,{style:gt.selectAllText,children:p?"Deselect All":"Select All"})]}),vt(l,{style:gt.countBadge,children:zr(c,{style:gt.countText,children:[g," selected"]})})]}),zr(l,{style:gt.actionsSection,children:[vt(Cc,{value:f(),size:14,testID:"buoy-storage-selection-copy",buttonStyle:gt.actionButton,colors:{idle:$e.color.accent,success:ba.semantic.success,error:ba.semantic.error}}),o&&vt(K,{style:gt.actionButton,onPress:x,testID:"buoy-storage-selection-hide",accessibilityLabel:"Hide selected keys",accessibilityRole:"button",children:vt(Tc,{size:14,color:$e.color.warning})}),vt(K,{style:gt.actionButton,onPress:h,testID:"buoy-storage-selection-delete",accessibilityLabel:"Delete selected keys",accessibilityRole:"button",children:vt(kc,{size:14,color:$e.color.danger})})]}),vt(Ic,{visible:u,onClose:()=>d(false),featureName:"Storage Editing"})]})}var gt=ge.create({container:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",backgroundColor:$e.color.accentSoft,borderRadius:8,borderWidth:1,borderColor:$e.color.accentBorderStrong,paddingHorizontal:12,paddingVertical:8,marginBottom:10},leftSection:{flexDirection:"row",alignItems:"center",gap:12},selectAllButton:{flexDirection:"row",alignItems:"center",gap:6,paddingVertical:4,paddingHorizontal:8,backgroundColor:$e.color.surface,borderRadius:6,borderWidth:1,borderColor:$e.color.border},selectAllText:{fontSize:11,fontWeight:"600",color:$e.color.textSecondary},countBadge:{backgroundColor:$e.color.accentFill,paddingHorizontal:8,paddingVertical:4,borderRadius:6},countText:{fontSize:11,fontWeight:"700",color:$e.color.accent,fontFamily:Ec},actionsSection:{flexDirection:"row",alignItems:"center",gap:8},actionButton:{width:28,height:28,alignItems:"center",justifyContent:"center",borderRadius:6,backgroundColor:$e.color.surface,borderWidth:1,borderColor:$e.color.border}});V();var on=new Set;function Ac(e){return on.add(e),()=>{on.delete(e)}}function Dc(){on.forEach(e=>{try{e()}catch{}})}V();import Mc from"@buoy-gg/shared-ui/web/asyncStorage";function nn(e,t=[]){if(e.storageType==="mmkv"){if(e.valueType==="buffer")return"Buffer values can't be edited \u2014 the tool only ever sees their byte length, not their contents.";let r=t.find(o=>o.id===(e.instanceId||"default"));if(r?.readOnly)return`MMKV instance "${r.id}" is registered read-only.`}if(e.storageType==="secure"){if(re.getAll().find(r=>r.key===e.key)?.options.requireAuthentication)return"Biometric-protected keys can't be edited \u2014 writing one would fire an auth prompt.";if(!re.getModule())return"No SecureStore module is registered."}return null}function Sa(e,t){if(e.storageType==="mmkv"){let r=xa(e);if(r==="number"&&(t.trim()===""||Number.isNaN(Number(t))))return"Must be a number \u2014 this MMKV key is stored as a number.";if(r==="boolean"){let o=t.trim().toLowerCase();if(o!=="true"&&o!=="false")return'Must be "true" or "false" \u2014 this MMKV key is stored as a boolean.'}return null}if(ka(e.value))try{JSON.parse(t)}catch(r){return`This key holds JSON \u2014 ${r instanceof Error?r.message:"invalid JSON"}`}return null}function Pc(e){if(e==null)return"";if(typeof e=="string"){let t=e.trim();if(t.startsWith("{")||t.startsWith("["))try{return JSON.stringify(JSON.parse(e),null,2)}catch{return e}return e}return typeof e=="object"?JSON.stringify(e,null,2):String(e)}async function wa(e,t,r=[]){let o=nn(e,r);if(o)throw new Error(o);let n=Sa(e,t);if(n)throw new Error(n);switch(e.storageType){case"async":{await Mc.setItem(e.key,Ca(e,t));return}case"secure":{await re.setValue(e.key,Ca(e,t));return}case"mmkv":{let a=e.instanceId||"default",i=r.find(u=>u.id===a);if(!i)throw new Error(`MMKV instance "${a}" is not registered.`);i.instance.set(e.key,zc(e,t));return}default:throw new Error(`Unsupported storage type "${String(e.storageType)}"`)}}function ka(e){return e!==null&&typeof e=="object"}function Ca(e,t){return ka(e.value)?JSON.stringify(JSON.parse(t)):t}function xa(e){return e.valueType?e.valueType:typeof e.value=="number"?"number":typeof e.value=="boolean"?"boolean":"string"}function zc(e,t){switch(xa(e)){case"number":return Number(t);case"boolean":return t.trim().toLowerCase()==="true";default:return t}}import{gameUIColors as dr,macOSColors as so,night as L,HardDrive as Ta}from"@buoy-gg/shared-ui/web";import{useIsPro as Kc}from"@buoy-gg/license/web";import{Fragment as Fc,jsx as q,jsxs as Te}from"react/jsx-runtime";var Ia=[so.semantic.info,so.semantic.success,so.semantic.warning,so.semantic.debug,"#FF6B9D","#00D9FF"];function ur(e){let t=e.split("").reduce((r,o)=>r+o.charCodeAt(0),0);return Ia[t%Ia.length]}var Ty=rs["storage.keys"].free;function Oc({requiredStorageKeys:e=[],showFilters:t=false,ignoredPatterns:r=new Set(["@react_buoy"]),onTogglePattern:o,onAddPattern:n,searchQuery:a="",storageDataRef:i,eventCountByKey:u,lastWriteByKey:d,onViewHistory:y,enabledStorageTypes:g,statusFilter:p,onStatusFilterChange:f,onStatusCountsChange:x,pinnedKeys:h,onTogglePin:b,storageTypeFilter:S,onStorageTypeFilterChange:w,applySafeAreaInset:T,detailKey:I=null,onOpenKey:E,onCloseDetail:D}){let C=Kc(),R=Ln("storage.keys"),Q=Ln("storage.mmkvInstances"),[be,ve]=Ht(false);or(()=>{be&&C&&ve(false)},[be,C]);let[H,de]=Ht("all"),ee=p!=null&&f!=null,ie=ee?p:H,He=ee?f:de,[je,ft]=Ht("all"),xt=S!=null&&w!=null,ue=xt?S:je,Qt=xt?w:ft,[te,Kt]=Ht(null),Ue=_o(null),mr=_o(0),oe=_o(new Map),ct=Qe((s,m)=>{m?oe.current.set(s,m):oe.current.delete(s)},[]),[Ft,hr]=Ht(0),[Ot,br]=Ht(false),[Zt,Tt]=Ht(new Set),{instances:ke}=rn(false),{storageKeys:$r,isLoading:Nr,error:qr,refresh:Lt}=Zo(e),xo=Le(()=>ke.map(s=>({instance:s.instance,id:s.id})),[ke]),{storageKeys:vr,isLoading:To,error:Sr,refresh:Xt}=ca(xo,e),Io=Le(()=>te?vr.filter(s=>s.instanceId===te):vr,[vr,te]),{storageKeys:Wt,isLoading:Hr,error:Eo,refresh:jr}=nc(e),N=Le(()=>[...$r,...Io,...Wt],[$r,Io,Wt]),Se=Le(()=>{if(!I)return null;let s=jo(I);return N.find(m=>jo(m)===s)??I},[I,N]),Ro=Nr||To||Hr,Ur=qr||Sr||Eo,Ce=Qe(()=>{Lt(),Xt(),jr()},[Lt,Xt,jr]),Xe=Qe(s=>s.instanceId?`${s.storageType}-${s.instanceId}-${s.key}`:`${s.storageType}-${s.key}`,[]),Vo=Qe(()=>{br(s=>(s&&Tt(new Set),!s))},[]),et=Qe((s,m)=>{let U=Xe(s);Tt(Z=>{let Ge=new Set(Z);return m?Ge.add(U):Ge.delete(U),Ge})},[Xe]),Bo=Qe(()=>{Tt(new Set),br(false),Ce()},[Ce]),wr=Qe(s=>{s.forEach(m=>n?.(m.key)),Tt(new Set),br(false)},[n]),_t=Qe(async(s,m)=>{if(!C)throw ve(true),new Error("Editing storage values is a Pro feature.");await wa(s,m,ke),Ce(),hr(U=>U+1)},[C,ke,Ce]),Ao=Qe(s=>{_t(s,JSON.stringify(!s.value)).catch(m=>{xe.alert("Couldn't save",m instanceof Error?m.message:String(m))})},[_t]),Jr=Qe((s,m)=>{if(!C){ve(true);return}xe.alert("Delete key",`Delete "${s.key}"? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Delete",style:"destructive",onPress:async()=>{try{await va([s],ke.map(U=>({id:U.id,instance:U.instance}))),Ce(),m?.()}catch(U){xe.alert("Error",`Failed to delete key: ${U}`)}}}])},[C,ke,Ce]),kr=Qe(s=>nn(s,ke),[ke]),Do=Le(()=>{let s=N,m={valid:s.filter(J=>J.status==="required_present"||J.status==="optional_present").length,missing:s.filter(J=>J.status==="required_missing").length,issues:s.filter(J=>J.status==="required_wrong_value"||J.status==="required_wrong_type").length,total:s.length},U=s.filter(J=>J.storageType==="async"),Z=s.filter(J=>J.storageType==="mmkv"),Ge=s.filter(J=>J.storageType==="secure");return{summary:{valid:m.valid,missing:m.missing,issues:m.issues,total:m.total,timestamp:new Date().toISOString()},asyncStorage:U.reduce((J,Ee)=>(J[Ee.key]=Ee.value,J),{}),mmkv:Z.reduce((J,Ee)=>{let It=Ee.instanceId||"default";return J[It]||(J[It]={}),J[It][Ee.key]=Ee.value,J},{}),secure:Ge.reduce((J,Ee)=>(J[Ee.key]=Ee.value,J),{})}},[N]);or(()=>{i&&(i.current=N)},[N,i]),or(()=>{let s,m=aa(U=>{clearTimeout(s),s=setTimeout(()=>{Lt()},100)});return()=>{clearTimeout(s),m()}},[Lt]),or(()=>{let s,m=Ac(()=>{clearTimeout(s),s=setTimeout(Ce,100)});return()=>{clearTimeout(s),m()}},[Ce]),or(()=>{let s,m=Rn(U=>{(te===null||U.instanceId===te)&&(clearTimeout(s),s=setTimeout(()=>{Xt()},100))});return()=>{clearTimeout(s),m()}},[Xt,te]);let $t=Le(()=>{let s=N,m=s.filter(Z=>!ze(Z.key)),U=s.filter(Z=>ze(Z.key));return{totalCount:s.length,requiredCount:m.filter(Z=>Z.category==="required").length,missingCount:m.filter(Z=>Z.status==="required_missing").length,wrongValueCount:m.filter(Z=>Z.status==="required_wrong_value").length,wrongTypeCount:m.filter(Z=>Z.status==="required_wrong_type").length,presentRequiredCount:m.filter(Z=>Z.status==="required_present").length,optionalCount:m.filter(Z=>Z.category==="optional").length,mmkvCount:s.filter(Z=>Z.storageType==="mmkv").length,asyncCount:s.filter(Z=>Z.storageType==="async").length,secureCount:s.filter(Z=>Z.storageType==="secure").length,devToolsCount:U.length}},[N]),dt=Le(()=>{let s=N.filter(B=>!ze(B.key));ue!=="all"&&(s=s.filter(B=>B.storageType===ue));let m=s.filter(B=>B.status==="required_present"||B.status==="optional_present").length,U=s.filter(B=>B.status==="required_missing").length,Z=s.filter(B=>B.status==="required_wrong_type"||B.status==="required_wrong_value").length,Ge=0,J=0,Ee=0,It=0;return ie==="all"?(Ge=N.filter(B=>!ze(B.key)&&B.storageType==="async"&&(B.status==="required_present"||B.status==="optional_present")).length,J=N.filter(B=>!ze(B.key)&&B.storageType==="mmkv"&&(B.status==="required_present"||B.status==="optional_present")).length,Ee=N.filter(B=>!ze(B.key)&&B.storageType==="secure"&&(B.status==="required_present"||B.status==="optional_present")).length,It=Ge+J+Ee):ie==="missing"?(Ge=N.filter(B=>!ze(B.key)&&B.storageType==="async"&&B.status==="required_missing").length,J=N.filter(B=>!ze(B.key)&&B.storageType==="mmkv"&&B.status==="required_missing").length,Ee=N.filter(B=>!ze(B.key)&&B.storageType==="secure"&&B.status==="required_missing").length,It=Ge+J+Ee):ie==="issues"&&(Ge=N.filter(B=>!ze(B.key)&&B.storageType==="async"&&(B.status==="required_wrong_type"||B.status==="required_wrong_value")).length,J=N.filter(B=>!ze(B.key)&&B.storageType==="mmkv"&&(B.status==="required_wrong_type"||B.status==="required_wrong_value")).length,Ee=N.filter(B=>!ze(B.key)&&B.storageType==="secure"&&(B.status==="required_wrong_type"||B.status==="required_wrong_value")).length,It=Ge+J+Ee),{validCount:m,missingCount:U,issuesCount:Z,asyncCount:Ge,mmkvCount:J,secureCount:Ee,totalCount:It}},[N,ie,ue]);or(()=>{x?.({validCount:dt.validCount,missingCount:dt.missingCount,issuesCount:dt.issuesCount})},[x,dt.validCount,dt.missingCount,dt.issuesCount]);let er=Le(()=>[...N].sort((s,m)=>{let U={required_missing:1,required_wrong_type:2,required_wrong_value:3,required_present:4,optional_present:5};return(U[s.status]||999)-(U[m.status]||999)}),[N]),vn=Le(()=>Array.from(new Set(N.map(s=>s.key))).sort(),[N]),Me=Le(()=>{let s=er;if(g&&g.size>0&&(s=s.filter(m=>g.has(m.storageType))),s=s.filter(m=>!Array.from(r).some(U=>m.key.includes(U))),a){let m=a.toLowerCase();s=s.filter(U=>U.key.toLowerCase().includes(m))}switch(ie){case"all":s=s.filter(m=>m.status==="required_present"||m.status==="optional_present");break;case"missing":s=s.filter(m=>m.status==="required_missing");break;case"issues":s=s.filter(m=>m.status==="required_wrong_type"||m.status==="required_wrong_value");break}if(ue!=="all"&&(s=s.filter(m=>m.storageType===ue)),h&&h.size>0){let m=s.filter(Z=>h.has(Z.key)),U=s.filter(Z=>!h.has(Z.key));s=[...m,...U]}return s},[er,ie,ue,r,a,te,g,h]),v=Le(()=>Me.slice(0,R),[Me,R]),k=Le(()=>Math.max(0,Me.length-R),[Me.length,R]),P=k>0,j=Le(()=>{let s=Me.filter(m=>!ze(m.key));return{totalCount:Me.length,requiredCount:s.filter(m=>m.category==="required").length,missingCount:s.filter(m=>m.status==="required_missing").length,wrongValueCount:s.filter(m=>m.status==="required_wrong_value").length,wrongTypeCount:s.filter(m=>m.status==="required_wrong_type").length,presentRequiredCount:s.filter(m=>m.status==="required_present").length,optionalCount:s.filter(m=>m.category==="optional").length,mmkvCount:Me.filter(m=>m.storageType==="mmkv").length,asyncCount:Me.filter(m=>m.storageType==="async").length,secureCount:Me.filter(m=>m.storageType==="secure").length,devToolsCount:Me.filter(m=>ze(m.key)).length}},[Me]),Je=Le(()=>v.filter(s=>Zt.has(Xe(s))),[v,Zt,Xe]),Cr=Qe(()=>{let s=new Set(v.map(Xe));Tt(s)},[v,Xe]),xr=Qe(()=>{Tt(new Set)},[]),Tr=$t.requiredCount>0?Math.round($t.presentRequiredCount/$t.requiredCount*100):$t.totalCount>0?100:0,di=Tr>=90?"OPTIMAL":Tr>=70?"WARNING":"CRITICAL",ui=Tr>=90?dr.success:Tr>=70?dr.warning:dr.error;if(Se)return q(l,{style:O.root,children:q(Os,{storageKey:Se,editBlockedReason:kr(Se),eventCount:u?.[Se.key],onSave:s=>_t(Se,s),onViewHistory:y?()=>y(Se.key):void 0,onDeleteKey:s=>Jr(s,()=>D?.()),onHideKey:s=>{wr([s]),D?.()},isPinned:h?.has(Se.key)??false,onTogglePin:b,applySafeAreaInset:T})});if(Ro&&N.length===0)return Te(l,{style:O.emptyState,children:[q(Wn,{size:48,color:L.color.textTertiary}),q(c,{style:O.emptyTitle,children:"Loading storage keys..."})]});if(Ur)return Te(l,{style:O.emptyState,children:[q(Wn,{size:48,color:dr.error}),q(c,{style:[O.emptyTitle,{color:dr.error}],children:"Error loading storage"}),q(c,{style:O.emptySubtitle,children:Ur.message})]});let yi=Te(Fc,{children:[ue==="mmkv"&&ke.length===0&&Te(l,{style:O.emptyMMKVState,children:[q(c,{style:O.emptyMMKVTitle,children:"No MMKV Instances Detected"}),q(c,{style:O.emptyMMKVSubtitle,children:"MMKV instances must be registered with registerMMKVInstance()"}),q(c,{style:O.emptyMMKVCode,children:`import { registerMMKVInstance } from '@buoy-gg/storage';
1
+ "use client";var Mo=Object.defineProperty;var bi=Object.getOwnPropertyDescriptor;var vi=Object.getOwnPropertyNames;var Si=Object.prototype.hasOwnProperty;var Sn=(e,t)=>()=>(e&&(t=e(e=0)),t);var wn=(e,t)=>{for(var r in t)Mo(e,r,{get:t[r],enumerable:true})},Po=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of vi(t))!Si.call(e,n)&&n!==r&&Mo(e,n,{get:()=>t[n],enumerable:!(o=bi(t,n))||o.enumerable});return e},wi=(e,t,r)=>(Po(e,t,"default"),r&&Po(r,t,"default"));var ki=e=>Po(Mo({},"__esModule",{value:true}),e);var V=Sn(()=>{"use strict";typeof window<"u"&&typeof globalThis.global>"u"&&(globalThis.global=globalThis)});var kn={};wn(kn,{asyncStorage:()=>Fe,asyncStorageCaps:()=>Cn,default:()=>xn,readMany:()=>Gr,removeMany:()=>tr,writeMany:()=>Ir});import Ci from"@buoy-gg/shared-ui/web/asyncStorage";async function Gr(e){if(typeof Fe.multiGet=="function")return await Fe.multiGet(e);let t=await Fe.getMany(e);return e.map(r=>[r,t[r]??null])}async function Ir(e){if(typeof Fe.multiSet=="function")return Fe.multiSet(e);let t={};for(let[r,o]of e)t[r]=o;return Fe.setMany(t)}async function tr(e){return typeof Fe.multiRemove=="function"?Fe.multiRemove(e):Fe.removeMany(e)}var Fe,Cn,xn,Nt=Sn(()=>{"use strict";V();Fe=Ci,Cn={hasLegacyMultiApi:typeof Fe?.multiGet=="function",hasMergeApi:typeof Fe?.mergeItem=="function"};xn=Fe});V();V();Nt();import Tn from"@buoy-gg/shared-ui/web/asyncStorage";import{classifyPreviewItem as xi,createRestoreScope as Ti,emptyRestoreResult as In,failedRestore as Ii,isDevToolsStorageKey as mt,registerStateSnapshotProvider as Ei,unionKeys as Yr,wontApply as Er}from"@buoy-gg/shared-ui/web";V();Nt();import En from"@buoy-gg/shared-ui/web/asyncStorage";import{isDevToolsStorageKey as Ri}from"@buoy-gg/shared-ui/web";async function Qr(){let e=await En.getAllKeys();if(!e||e.length===0)return;let t=e.filter(r=>!Ri(r));t.length!==0&&await tr(t)}async function Vi(){await En.clear()}V();V();V();function ht(e,t){let r=e.getString(t);if(r!==void 0&&r!=="")return{value:r,type:"string"};let o=e.getNumber(t);if(o!==void 0)return{value:o,type:"number"};let n=e.getBoolean(t);if(n!==void 0)return{value:n,type:"boolean"};if(r==="")return{value:"",type:"string"};let a=e.getBuffer(t);return a!==void 0?{value:`<ArrayBuffer ${a.byteLength} bytes>`,type:"buffer"}:{value:void 0,type:"unknown"}}function Bi(e,t){if(e===void 0)return"undefined";if(e===null)return"null";switch(t){case"string":return`"${e}"`;case"number":return String(e);case"boolean":return e?"true":"false";case"buffer":return e;case"unknown":return"unknown";default:return String(e)}}function zo(e,t){return e===t}var Ai=class{constructor(){this.listeners=[];this.instances=new Map;this.ignoredKeys=new Set(["@react_buoy_storage_event_filters","@react_buoy_storage_key_filters","@react_buoy_storage_is_monitoring","REACT_QUERY_OFFLINE_CACHE"])}shouldIgnoreKey(e){if(this.ignoredKeys.has(e))return true;for(let t of this.ignoredKeys)if(e.startsWith(t))return true;return false}emit(e){this.listeners.length!==0&&this.listeners.forEach(t=>{try{t(e)}catch{}})}addInstance(e,t){if(this.instances.has(t))return;let r,o=new Map;try{for(let n of e.getAllKeys()??[])this.shouldIgnoreKey(n)||o.set(n,ht(e,n).value)}catch{}if(typeof e.addOnValueChangedListener=="function")try{r=e.addOnValueChangedListener(n=>{if(this.shouldIgnoreKey(n))return;let{value:a,type:i}=ht(e,n),u=o.get(n);if(i==="unknown"||a===void 0){o.delete(n);let d={action:"delete",timestamp:new Date,instanceId:t,data:{key:n,prevValue:u,success:true}};this.emit(d)}else{o.set(n,a);let d={action:i==="string"?"set.string":i==="number"?"set.number":i==="boolean"?"set.boolean":i==="buffer"?"set.buffer":"set.string",timestamp:new Date,instanceId:t,data:{key:n,value:a,prevValue:u,valueType:i,success:true}};this.emit(d)}})}catch{}this.instances.set(t,{instance:e,instanceId:t,originalMethods:{},nativeListenerUnsubscribe:r,lastKnownValues:o})}removeInstance(e){let t=this.instances.get(e);if(!t)return;let{nativeListenerUnsubscribe:r}=t;try{typeof r=="function"?r():typeof r?.remove=="function"&&r.remove()}catch{}this.instances.delete(e)}removeAllInstances(){Array.from(this.instances.keys()).forEach(e=>this.removeInstance(e))}addListener(e){return this.listeners.push(e),()=>{let t=this.listeners.indexOf(e);t>-1&&this.listeners.splice(t,1)}}removeAllListeners(){this.listeners=[]}hasInstance(e){return this.instances.has(e)}getMonitoredInstances(){return Array.from(this.instances.keys())}get instanceCount(){return this.instances.size}get listenerCount(){return this.listeners.length}get isActive(){return this.instances.size>0}},Ko=new Ai;var Rn=e=>Ko.addListener(e);var Di=class{constructor(){this.instances=new Map}register(e,t,r){let o={id:e,instance:t,encrypted:r?.encrypted??false,readOnly:t.isReadOnly??false};this.instances.set(e,o)}unregister(e){this.instances.delete(e)}get(e){return this.instances.get(e)}getAll(){return Array.from(this.instances.values())}has(e){return this.instances.has(e)}count(){return this.instances.size}},Pe=new Di;function Vn(e,t,r){Pe.register(e,t,r),Ko.addInstance(t,e)}function Bn(e){Ko.removeInstance(e),Pe.unregister(e)}V();var Mi=class{constructor(){this.module=null;this.keys=new Map;this.listeners=new Set}register(e,t){let r=this.signature();this.module=e;for(let o of t){let n=typeof o=="string"?{key:o,options:{}}:{key:o.key,description:o.description,options:{keychainService:o.keychainService,requireAuthentication:o.requireAuthentication,authenticationPrompt:o.authenticationPrompt}};this.keys.set(n.key,n)}this.signature()!==r&&this.notify()}unregister(e){this.keys.delete(e)&&this.notify()}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}signature(){return JSON.stringify(Array.from(this.keys.values()))}notify(){this.listeners.forEach(e=>{try{e()}catch{}})}getModule(){return this.module}getAll(){return Array.from(this.keys.values())}count(){return this.keys.size}async deleteValue(e){let t=this.keys.get(e);!this.module||!t||await this.module.deleteItemAsync(e,t.options)}async setValue(e,t){let r=this.keys.get(e);if(!this.module)throw new Error("No SecureStore module is registered");if(!r)throw new Error(`SecureStore key "${e}" is not registered`);if(r.options.requireAuthentication)throw new Error(`SecureStore key "${e}" is biometric-protected \u2014 DevTools never writes it`);await this.module.setItemAsync(e,t,r.options)}},te=new Mi;function Pi(e,t){te.register(e,t)}function zi(e){te.unregister(e)}function An(e,t){e.remove?e.remove(t):e.delete?.(t)}function Ki(){return{canCapture:true,canRestore:true}}async function Dn(){let e=[],t=(await Tn.getAllKeys()).filter(i=>!mt(i)),r=(await Gr(t)).filter(i=>i[1]!==null),o={};for(let{id:i,instance:u}of Pe.getAll())try{o[i]=u.getAllKeys().filter(d=>!mt(d)).map(d=>{let{value:y,type:g}=ht(u,d);return g==="buffer"&&e.push(`mmkv "${i}"/"${d}": ArrayBuffer value not capturable`),{key:d,value:y,valueType:g}})}catch{e.push(`mmkv "${i}": unreadable, captured without entries`),o[i]=[]}let n={},a=te.getModule();for(let{key:i,options:u}of te.getAll()){if(u.requireAuthentication){e.push(`secure "${i}": biometric-protected, not capturable`);continue}let d=null;if(a)try{d=await a.getItemAsync(i,u)}catch{e.push(`secure "${i}": unreadable, captured as unset`)}n[i]=d}return{data:{async:r,mmkv:o,secure:n},warnings:e}}async function Fi(){let{data:e,warnings:t}=await Dn();return{data:e,warnings:t}}async function Oi(e,t){let r=e,o=Ti(t),n=o.touch,a=In();if(!r)return Ii("empty storage snapshot");try{let d=(r.async??[]).filter(([p])=>!mt(p)&&n(`async:${p}`)),y=new Set(d.map(([p])=>p)),g=(await Tn.getAllKeys()).filter(p=>!mt(p)).filter(p=>!y.has(p)&&n(`async:${p}`));o.countExcluded((r.async??[]).length-d.length),g.length>0&&await tr(g),d.length>0&&await Ir(d),a.applied+=d.length+g.length}catch(d){a.ok=false,a.warnings.push(`asyncstorage restore failed: ${String(d)}`)}for(let[d,y]of Object.entries(r.mmkv??{})){let g=Pe.get(d);if(!g){a.skipped.push({id:`mmkv:${d}`,reason:"instance not registered"});continue}if(g.instance.isReadOnly){a.skipped.push({id:`mmkv:${d}`,reason:"instance registered read-only"});continue}let{instance:p}=g;try{let f=new Set(y.map(h=>h.key)),x=p.getAllKeys().filter(h=>!mt(h));for(let h of x)o.allows(`mmkv:${d}/${h}`)&&(f.has(h)||(An(p,h),a.applied+=1));for(let h of y)if(!mt(h.key)&&n(`mmkv:${d}/${h.key}`)){if(h.valueType==="buffer"){a.skipped.push({id:`mmkv:${d}/${h.key}`,reason:"ArrayBuffer values cannot be restored"});continue}p.set(h.key,h.value),a.applied+=1}}catch(f){a.ok=false,a.warnings.push(`mmkv "${d}" restore failed: ${String(f)}`)}}let i=r.secure??{};for(let{key:d,options:y}of te.getAll())if(o.allows(`secure:${d}`)){if(y.requireAuthentication){d in i&&a.skipped.push({id:`secure:${d}`,reason:"biometric-protected keys are never written"});continue}try{if(d in i){let g=i[d];g===null?await te.deleteValue(d):await te.setValue(d,g)}else await te.deleteValue(d);a.applied+=1}catch(g){a.ok=false,a.warnings.push(`secure "${d}" restore failed: ${String(g)}`)}}for(let d of Object.keys(i))n(`secure:${d}`)&&(te.getAll().some(y=>y.key===d)||a.skipped.push({id:`secure:${d}`,reason:"key no longer registered with registerSecureStoreKeys"}));let u=o.excludedWarning("item(s)");return u&&a.warnings.push(u),a}async function Li(){let e=In();try{await Qr(),e.applied+=1}catch(t){e.ok=false,e.warnings.push(`asyncstorage clear failed: ${String(t)}`)}for(let{id:t,instance:r}of Pe.getAll()){if(r.isReadOnly){e.skipped.push({id:`mmkv:${t}`,reason:"instance registered read-only"});continue}try{for(let o of r.getAllKeys().filter(n=>!mt(n)))An(r,o),e.applied+=1}catch(o){e.ok=false,e.warnings.push(`mmkv "${t}" clear failed: ${String(o)}`)}}for(let{key:t,options:r}of te.getAll()){if(r.requireAuthentication){e.skipped.push({id:`secure:${t}`,reason:"biometric-protected keys are never written"});continue}try{await te.deleteValue(t),e.applied+=1}catch(o){e.ok=false,e.warnings.push(`secure "${t}" clear failed: ${String(o)}`)}}return e}var Wi=256*1024;function Fo(e,t,r,o,n,a){return xi({key:e,label:t,oldValue:r,newValue:o,inOld:n,inNew:a},{equal:Object.is,tooLarge:i=>typeof i=="string"&&i.length>Wi,tooLargeReason:"value too large to render a diff \u2014 restore still applies it"})}async function _i(e,t){let r=e??{async:[],mmkv:{},secure:{}},o=t===void 0,n=o?(await Dn()).data:t??{async:[],mmkv:{},secure:{}},a=[],i=[],u=new Map(n.async??[]),d=new Map(r.async??[]);for(let f of Yr(u,d))mt(f)||a.push(Fo(`async:${f}`,f,u.get(f),d.get(f),u.has(f),d.has(f)));for(let f of Yr(n.mmkv,r.mmkv)){let x=o?Pe.get(f):null,h=o&&!x,b=o&&x?.instance.isReadOnly===true,S=new Map((n.mmkv?.[f]??[]).map(T=>[T.key,T])),w=new Map((r.mmkv?.[f]??[]).map(T=>[T.key,T]));for(let T of Yr(S,w)){if(mt(T))continue;let I=`mmkv:${f}/${T}`,E=`${f} \xB7 ${T}`,D=S.get(T),C=w.get(T),R=Fo(I,E,D?.value,C?.value,S.has(T),w.has(T));h?R=Er(R,"MMKV instance not registered"):b?R=Er(R,"MMKV instance registered read-only"):(C?.valueType==="buffer"||D?.valueType==="buffer")&&(R=Er(R,"ArrayBuffer values cannot be restored")),a.push(R)}}let y=n.secure??{},g=r.secure??{},p=o?new Map(te.getAll().map(f=>[f.key,f])):null;for(let f of Yr(y,g)){let x=Fo(`secure:${f}`,f,y[f],g[f],f in y,f in g);if(o){let h=p?.get(f);h?h.options.requireAuthentication&&(x=Er(x,"biometric-protected keys are never written")):x=Er(x,"key no longer registered with registerSecureStoreKeys")}a.push(x)}return{items:a,notes:i}}Ei({id:"storage",label:"Storage",status:Ki,capture:Fi,restore:Oi,clear:Li,previewItems:_i});V();import{StorageIcon as $i}from"@buoy-gg/floating-tools-core/web";import{createToolFactory as Ni,defineToolPreset as qi}from"@buoy-gg/shared-ui/web";V();import{useState as tt,useCallback as Be,useEffect as Oo,useRef as Mn,useMemo as at}from"react";var Pn={};wn(Pn,{AccessibilityInfo:()=>Ji,ActivityIndicator:()=>Ll,Alert:()=>xe,Animated:()=>qt,AppRegistry:()=>Yi,AppState:()=>Qi,Appearance:()=>Gi,BackHandler:()=>Zi,Button:()=>Wl,CheckBox:()=>gl,Clipboard:()=>Xi,DeviceEventEmitter:()=>Rl,Dimensions:()=>el,Easing:()=>Rr,FlatList:()=>Lo,I18nManager:()=>tl,Image:()=>pl,ImageBackground:()=>fl,InteractionManager:()=>ol,Keyboard:()=>rl,KeyboardAvoidingView:()=>ml,LayoutAnimation:()=>nl,Linking:()=>al,LogBox:()=>El,Modal:()=>zn,NativeEventEmitter:()=>il,NativeModules:()=>Ui,PanResponder:()=>ll,Picker:()=>hl,PixelRatio:()=>sl,Platform:()=>cl,Pressable:()=>Fl,ProgressBar:()=>bl,RefreshControl:()=>vl,SafeAreaView:()=>Sl,ScrollView:()=>Vr,SectionList:()=>wl,Share:()=>dl,StatusBar:()=>kl,StyleSheet:()=>ge,Switch:()=>Ol,Text:()=>c,TextInput:()=>Pl,Touchable:()=>Cl,TouchableHighlight:()=>zl,TouchableNativeFeedback:()=>xl,TouchableOpacity:()=>K,TouchableWithoutFeedback:()=>Kl,UIManager:()=>ul,Vibration:()=>yl,View:()=>l,VirtualizedList:()=>Tl,YellowBox:()=>Il,findNodeHandle:()=>_l,unstable_createElement:()=>ji,useColorScheme:()=>Vl,useLocaleContext:()=>Bl,useWindowDimensions:()=>Al});V();wi(Pn,Hi);import*as Hi from"react-native-web";import{unstable_createElement as ji,NativeModules as Ui,AccessibilityInfo as Ji,Animated as qt,Appearance as Gi,AppRegistry as Yi,AppState as Qi,BackHandler as Zi,Clipboard as Xi,Dimensions as el,Easing as Rr,I18nManager as tl,Keyboard as rl,InteractionManager as ol,LayoutAnimation as nl,Linking as al,NativeEventEmitter as il,PanResponder as ll,PixelRatio as sl,Platform as cl,Share as dl,StyleSheet as ge,UIManager as ul,Vibration as yl,CheckBox as gl,FlatList as Lo,Image as pl,ImageBackground as fl,KeyboardAvoidingView as ml,Picker as hl,ProgressBar as bl,RefreshControl as vl,SafeAreaView as Sl,SectionList as wl,StatusBar as kl,Touchable as Cl,TouchableNativeFeedback as xl,VirtualizedList as Tl,YellowBox as Il,LogBox as El,DeviceEventEmitter as Rl,useColorScheme as Vl,useLocaleContext as Bl,useWindowDimensions as Al}from"react-native-web";import*as Ye from"react-native-web";import{createElement as Dl,forwardRef as Ml}from"react";function rt(e){let t=Ml((o,n)=>{let{accessibilityState:a,accessibilityValue:i,...u}=o;for(let d of["busy","checked","disabled","expanded","selected"])a?.[d]!==void 0&&u[`aria-${d}`]===void 0&&(u[`aria-${d}`]=a[d]);for(let[d,y]of Object.entries({min:"valuemin",max:"valuemax",now:"valuenow",text:"valuetext"}))i?.[d]!==void 0&&u[`aria-${y}`]===void 0&&(u[`aria-${y}`]=i[d]);return Dl(e,{...u,ref:n})}),r=e.State;return r&&Object.assign(t,{State:r}),t.displayName=e.displayName??e.name??"NativeWebView",t}var l=rt(Ye.View),c=rt(Ye.Text),Pl=rt(Ye.TextInput),K=rt(Ye.TouchableOpacity),zl=rt(Ye.TouchableHighlight),Kl=rt(Ye.TouchableWithoutFeedback),Fl=rt(Ye.Pressable),Vr=rt(Ye.ScrollView),zn=rt(Ye.Modal),Ol=rt(Ye.Switch),Ll=rt(Ye.ActivityIndicator),Wl=rt(Ye.Button),_l=Ye.findNodeHandle,xe={alert(e,t,r,o){if(typeof document>"u")return;let n=document.createElement("dialog");n.dataset.buoyRoot="",n.setAttribute("aria-label",e),n.style.cssText="position:fixed;inset:0;margin:auto;width:min(440px,90vw);padding:24px;border:1px solid #475569;border-radius:14px;background:#17212e;color:#f1f5f9;font:14px system-ui;box-shadow:0 20px 80px #0008;z-index:2147483647";let a=document.createElement("h2");if(a.textContent=e,a.style.cssText="font-size:18px;margin:0 0 12px",n.appendChild(a),t){let y=document.createElement("p");y.textContent=t,y.style.cssText="line-height:1.5;white-space:pre-wrap;margin:0 0 20px",n.appendChild(y)}let i=document.createElement("div");i.style.cssText="display:flex;justify-content:flex-end;flex-wrap:wrap;gap:8px";let u=r?.length?r:[{text:"OK"}],d=()=>{n.close?.(),n.remove()};for(let y of u){let g=document.createElement("button");g.type="button",g.textContent=y.text??"OK",g.style.cssText=`padding:9px 14px;border:1px solid #64748b;border-radius:7px;color:white;background:${y.style==="destructive"?"#a52b38":"#283a4d"};cursor:pointer;font:inherit`,g.onclick=()=>{d(),y.onPress?.()},i.appendChild(g)}n.addEventListener("cancel",y=>{y.preventDefault(),o?.cancelable!==false&&(d(),o?.onDismiss?.())}),n.appendChild(i),document.body.appendChild(n),n.showModal?n.showModal():n.setAttribute("open","")}};import Wo from"@buoy-gg/shared-ui/web/asyncStorage";import{JsModal as $l,ModalHeader as Ae,TabSelector as Nl,parseValue as ql,devToolsStorageKeys as rr,macOSColors as Hl,night as Oe,ToolEmptyState as jl,Filter as Ul,RefreshCw as Jl,Search as Gl,SearchBar as Yl,PowerToggleButton as Ql,ToolbarCopyButton as Kn,ToolbarClearButton as Zl,truncatePayload as Zr,TickProvider as Fn,useLimit as Xl,TIER_LIMITS as es,windowDragProps as ts,usePersistedState as Xr,monoFont as eo}from"@buoy-gg/shared-ui/web";V();V();V();var le={async:"Local",asyncFull:"localStorage",mmkv:"Session",secure:"Secure",hasSecure:false};import{useMemo as Le,useCallback as Qe,useState as Ht,useEffect as or,useRef as _o}from"react";import{absoluteFill as On,useLimit as Ln,TIER_LIMITS as rs,monoFont as Br}from"@buoy-gg/shared-ui/web";import{Database as Wn,Zap as os,ProBadge as _n,ProUpgradeModal as ns,ToolEmptyState as as,resolveListEmptyState as is}from"@buoy-gg/shared-ui/web";import{isDevToolsStorageKey as ze}from"@buoy-gg/shared-ui/web";V();import{useCallback as $n,useState as ls}from"react";V();import{memo as ss}from"react";import{macOSColors as pe,night as se,CompactRow as cs,TypeBadge as Nn,HardDrive as ds,Square as us,CheckSquare as ys,Edit3 as gs,EyeOff as ps,Pin as qn,Trash2 as fs,ExpandedInfoRow as $o,PillBadge as Ar,monoFont as nr}from"@buoy-gg/shared-ui/web";V();import{gameUIColors as to}from"@buoy-gg/shared-ui/web";function No(e){switch(e){case"mmkv":return"MMKV";case"async":return"Async";case"secure":return"Secure";default:return e}}function Hn(e){switch(e){case"mmkv":return to.info;case"async":return to.warning;case"secure":return to.success;default:return to.muted}}V();function Et(e){if(e===null)return"null";if(e===void 0)return"undefined";if(Array.isArray(e))return"array";let t=typeof e;return t==="object"?"object":t==="boolean"?"boolean":t==="number"?"number":t==="string"?"string":"unknown"}function jn(e){if(typeof e!="string")return e;let t=e.trim();if(!t.startsWith("{")&&!t.startsWith("["))return e;try{return JSON.parse(e)}catch{return e}}var ms=40;function hs(e){switch(typeof e){case"boolean":return e?"true":"false";case"number":return Number.isFinite(e)?String(e):null;case"string":return e.length===0?'""':e.length>ms?null:`"${e.replace(/\s+/g," ")}"`;default:return null}}function bs(e){let t=Et(e),r=hs(e);return r?`${t} \xB7 ${r}`:t}import{DataViewer as vs}from"@buoy-gg/shared-ui/web/dataViewer";import{Fragment as Ss,jsx as W,jsxs as Re}from"react/jsx-runtime";var Un=[pe.semantic.info,pe.semantic.success,pe.semantic.warning,pe.semantic.debug,"#FF6B9D","#00D9FF"];function Jn(e){let t=e.split("").reduce((r,o)=>r+o.charCodeAt(0),0);return Un[t%Un.length]}var Gn=e=>{switch(e){case"required_present":return{label:"Valid",color:pe.semantic.success,sublabel:"Required"};case"required_missing":return{label:"Missing",color:pe.semantic.error,sublabel:"Required"};case"required_wrong_value":return{label:"Wrong",color:pe.semantic.warning,sublabel:"Invalid value"};case"required_wrong_type":return{label:"Type Error",color:pe.semantic.info,sublabel:"Wrong type"};case"optional_present":return{label:"Set",color:pe.semantic.debug,sublabel:"Optional"};default:return{label:"Set",color:pe.text.secondary,sublabel:String(e)}}},ws=e=>e==null?"undefined":typeof e=="string"?e:JSON.stringify(e),ks=ss(function({storageKey:e,isExpanded:t,onPress:r,isSelectMode:o=false,isSelected:n=false,onSelectionChange:a,eventCount:i,onViewHistory:u,onHideKey:d,isPinned:y=false,onTogglePin:g,onEditKey:p,onToggleKey:f,onDeleteKey:x,editBlockedReason:h}){let b=p!=null&&h==null,S=Gn(e.status),w=e.value!==void 0&&e.value!==null,T=w&&typeof e.value=="boolean",I=e.key,E=No(e.storageType),D=jn(e.value),C=D!==null&&typeof D=="object",R=Re(l,{style:_.expandedContainer,children:[W($o,{label:"Storage",children:W(Ar,{color:qo(e.storageType),children:E})}),e.storageType==="mmkv"&&e.instanceId&&W($o,{label:"Instance",children:W(Ar,{color:Jn(e.instanceId),icon:W(ds,{size:9,color:Jn(e.instanceId)}),children:e.instanceId})}),i!=null&&i>0&&Re($o,{label:"Updates",children:[W(Ar,{color:pe.semantic.warning,children:String(i)}),i>1&&u&&W(K,{onPress:u,testID:"buoy-storage-key-history",accessibilityLabel:`View history for ${e.key}`,accessibilityRole:"button",style:_.viewHistoryButton,hitSlop:{top:6,bottom:6,left:6,right:6},children:W(c,{style:_.viewHistoryText,children:"view history \u2192"})})]}),C?W(l,{style:_.dataViewerContainer,children:W(vs,{data:D,title:"",showTypeFilter:true,rawMode:true,initialExpanded:true})}):Re(l,{style:_.expandedRow,children:[W(c,{style:_.expandedLabel,children:"Value:"}),W(c,{style:_.expandedValue,numberOfLines:3,children:ws(e.value)||"undefined"})]}),e.status==="required_wrong_type"&&e.expectedType&&Re(Ss,{children:[Re(l,{style:_.expandedRow,children:[W(c,{style:_.expandedLabel,children:"Type:"}),W(Nn,{type:Et(e.value)})]}),Re(l,{style:_.expandedRow,children:[W(c,{style:_.expandedLabel,children:"Expected:"}),W(Nn,{type:e.expectedType})]})]}),e.status==="required_wrong_value"&&e.expectedValue&&Re(l,{style:_.expandedRow,children:[W(c,{style:_.expandedLabel,children:"Expected:"}),W(c,{style:_.expandedExpected,children:String(e.expectedValue)})]}),e.description?Re(l,{style:_.expandedRow,children:[W(c,{style:_.expandedLabel,children:"Info:"}),W(c,{style:_.expandedDescription,children:e.description})]}):null,h?Re(l,{style:_.expandedRow,children:[W(c,{style:_.expandedLabel,children:"Edit:"}),W(c,{style:_.expandedDescription,children:h})]}):null,g||d||b?Re(l,{style:_.actionRow,children:[b?Re(K,{style:_.editButton,testID:"buoy-storage-key-edit",accessibilityLabel:T&&f?`Toggle ${e.key}`:`Edit ${e.key}`,accessibilityRole:"button",onPress:()=>T&&f?f(e):p?.(e),hitSlop:{top:6,bottom:6,left:6,right:6},children:[W(gs,{size:13,color:se.color.onAccent}),W(c,{style:_.editButtonText,children:T&&f?"Toggle":"Edit"})]}):null,g?Re(K,{style:[_.actionChip,y&&_.actionChipActive],testID:"buoy-storage-key-pin",accessibilityLabel:y?`Unpin ${e.key}`:`Pin ${e.key} to top`,accessibilityRole:"button",onPress:()=>g(e.key),hitSlop:{top:6,bottom:6,left:6,right:6},children:[W(qn,{size:12,active:y,color:se.color.accent}),W(c,{style:[_.actionChipText,{color:se.color.accent}],children:y?"Unpin":"Pin to top"})]}):null,d?Re(K,{style:_.actionChip,testID:"buoy-storage-key-hide",accessibilityLabel:`Hide ${e.key} from list`,accessibilityRole:"button",onPress:()=>d(e),hitSlop:{top:6,bottom:6,left:6,right:6},children:[W(ps,{size:12,color:se.color.warning}),W(c,{style:[_.actionChipText,{color:se.color.warning}],children:"Hide from list"})]}):null,b&&x?Re(K,{style:[_.actionChip,_.dangerChip],testID:"buoy-storage-key-delete",accessibilityLabel:`Delete key ${e.key}`,accessibilityRole:"button",onPress:()=>x(e),hitSlop:{top:6,bottom:6,left:6,right:6},children:[W(fs,{size:12,color:se.color.danger}),W(c,{style:[_.actionChipText,{color:se.color.danger}],children:"Delete key"})]}):null]}):null]}),Q=()=>{a?.(e,!n)},be=o?W(K,{onPress:Q,testID:`buoy-storage-checkbox-${e.storageType}-${e.key}`,accessibilityLabel:`Select ${e.key}`,accessibilityRole:"checkbox",accessibilityState:{checked:n},style:_.checkboxContainer,hitSlop:{top:8,bottom:8,left:8,right:8},children:n?W(ys,{size:18,color:se.color.accent}):W(us,{size:18,color:se.color.textTertiary})}):null;return Re(l,{style:[_.rowContainer,n&&_.rowContainerSelected],children:[be,Re(l,{style:_.compactRowWrapper,children:[W(cs,{statusDotColor:S.color,statusLabel:S.label,statusSublabel:S.sublabel,primaryText:I,secondaryText:w?T?Et(e.value):bs(e.value):void 0,secondaryAccessory:T?W(Ar,{size:"sm",color:e.value?pe.semantic.success:pe.semantic.error,children:e.value?"true":"false"}):void 0,expandedContent:R,isExpanded:t,expandedGlowColor:S.color,customBadge:Re(l,{style:_.badgeRow,children:[y&&W(qn,{size:12,active:true,color:se.color.accent}),W(Ar,{color:qo(e.storageType),children:E})]}),showChevron:!o,onPress:o?Q:r?()=>r(e):void 0,testID:`buoy-storage-row-${e.storageType}-${e.key}`,accessibilityLabel:`${e.storageType} ${e.key}`}),i!=null&&i>1&&W(l,{style:[_.absCountBadge,t&&_.absCountBadgeExpanded,{backgroundColor:pe.semantic.warning+"22",borderColor:pe.semantic.warning+"55"}],pointerEvents:"none",children:W(c,{style:[_.absCountText,{color:pe.semantic.warning}],children:String(i)})})]})]})}),qo=e=>{switch(e){case"mmkv":return pe.semantic.info;case"async":return pe.semantic.warning;case"secure":return pe.semantic.success;default:return pe.text.secondary}},_=ge.create({badgeRow:{flexDirection:"row",alignItems:"center",gap:6},expandedContainer:{gap:8},expandedRow:{flexDirection:"row",alignItems:"center",gap:10},expandedLabel:{fontSize:10,color:se.color.textTertiary,fontWeight:"600",minWidth:70,fontFamily:nr},expandedValue:{fontSize:11,color:se.color.textSecondary,fontFamily:nr,flex:1},expandedExpected:{fontSize:11,color:pe.semantic.warning,fontFamily:nr,flex:1},expandedDescription:{fontSize:11,color:se.color.textSecondary,flex:1},dataViewerContainer:{marginTop:6,marginBottom:6,backgroundColor:se.color.bg,borderRadius:6,borderWidth:1,borderColor:se.color.border,padding:6},rowContainer:{flexDirection:"row",alignItems:"flex-start"},rowContainerSelected:{backgroundColor:se.color.accentSoft,borderRadius:8},checkboxContainer:{paddingLeft:4,paddingRight:8,paddingTop:10,alignSelf:"flex-start"},compactRowWrapper:{flex:1},absCountBadge:{position:"absolute",top:4,right:10,paddingHorizontal:5,paddingVertical:1,borderRadius:4,borderWidth:1,zIndex:1},absCountBadgeExpanded:{top:13},absCountText:{fontSize:9,fontWeight:"700",fontFamily:nr},actionRow:{flexDirection:"row",alignItems:"center",flexWrap:"wrap",gap:8,marginTop:4},actionChip:{flexDirection:"row",alignItems:"center",gap:6,paddingVertical:6,paddingHorizontal:10,borderRadius:6,backgroundColor:se.color.surface,borderWidth:1,borderColor:se.color.border},dangerChip:{borderColor:se.color.danger+"55"},actionChipActive:{backgroundColor:se.color.accentSoft,borderColor:se.color.accentBorderStrong},editButton:{flexDirection:"row",alignItems:"center",gap:6,paddingVertical:8,paddingHorizontal:14,borderRadius:8,backgroundColor:se.color.accent},editButtonText:{color:se.color.onAccent,fontSize:12,fontWeight:"700"},actionChipText:{fontSize:11,fontWeight:"600",fontFamily:nr},viewHistoryButton:{marginLeft:4},viewHistoryText:{fontSize:10,fontWeight:"600",fontFamily:nr,color:se.color.accent}});import{SectionHeader as ar,night as Ho}from"@buoy-gg/shared-ui/web";import{jsx as bt,jsxs as ro}from"react/jsx-runtime";function jo(e){return e.instanceId?`${e.storageType}-${e.instanceId}-${e.key}`:`${e.storageType}-${e.key}`}function Yn({title:e,count:t,keys:r,emptyMessage:o,headerColor:n,isSelectMode:a=false,selectedKeys:i=new Set,onSelectionChange:u,eventCountByKey:d,onViewHistory:y,onHideKey:g,pinnedKeys:p,onTogglePin:f,onEditKey:x,onToggleKey:h,onDeleteKey:b,editBlockedFor:S,onRowRef:w,onOpenKey:T}){let I=$n(R=>jo(R),[]),[E,D]=ls(null),C=$n(R=>{if(!R||typeof R.key!="string")return;if(T){T(R);return}let Q=I(R);D(be=>be===Q?null:Q)},[I,T]);return r.length===0&&e==="Required Keys"?ro(l,{style:Dr.sectionContainer,children:[ro(ar,{children:[bt(ar.Title,{children:e}),bt(ar.Badge,{count:0,color:n})]}),bt(l,{style:Dr.emptySection,children:bt(c,{style:Dr.emptySectionText,children:o})})]}):r.length===0?null:ro(l,{style:Dr.sectionContainer,children:[e?ro(ar,{children:[bt(ar.Title,{children:e}),t>=0&&bt(ar.Badge,{count:t,color:n})]}):null,bt(l,{style:Dr.sectionContent,children:r.map(R=>{let Q=I(R);return bt(l,{ref:w?be=>w(Q,be):void 0,collapsable:false,children:bt(ks,{storageKey:R,isExpanded:!a&&E===Q,onPress:C,isSelectMode:a,isSelected:i.has(Q),onSelectionChange:u,eventCount:d?.[R.key],onViewHistory:y?()=>y(R.key):void 0,onHideKey:g,onEditKey:x,onToggleKey:h,onDeleteKey:b,editBlockedReason:S?.(R),isPinned:p?.has(R.key),onTogglePin:f})},Q)})})]})}var Dr=ge.create({sectionContainer:{gap:8},sectionContent:{},emptySection:{backgroundColor:Ho.color.surface,borderRadius:6,padding:16,borderWidth:1,borderColor:Ho.color.border,alignItems:"center"},emptySectionText:{color:Ho.color.textTertiary,fontSize:11,textAlign:"center"}});V();import{useCallback as Cs,useMemo as Qn,useRef as Zn,useState as Xn}from"react";import{EyeOff as xs,FileJson as Ts,HardDrive as Is,night as G,macOSColors as ir,Pin as Es,PillBadge as oo,Trash2 as Rs,TypeBadge as Vs,useSafeAreaInsets as Bs,monoFont as Rt}from"@buoy-gg/shared-ui/web";import{DataViewer as As,LiveExplorer as Ds,ValueEditModal as Ms,updateNestedDataByPath as Ps,deleteNestedDataByPath as zs}from"@buoy-gg/shared-ui/web/dataViewer";import{jsx as F,jsxs as fe}from"react/jsx-runtime";var Ks=300,ut="buoy-storage-detail";function Fs(e){let t=r=>r.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length===0?`${ut}-explorer-root`:`${ut}-explorer-${e.map(t).filter(Boolean).join("-")}`}var ea=[ir.semantic.info,ir.semantic.success,ir.semantic.warning,ir.semantic.debug,"#FF6B9D","#00D9FF"];function ta(e){let t=e.split("").reduce((r,o)=>r+o.charCodeAt(0),0);return ea[t%ea.length]}function Os({storageKey:e,editBlockedReason:t,eventCount:r,onSave:o,onViewHistory:n,onDeleteKey:a,onHideKey:i,isPinned:u=false,onTogglePin:d,applySafeAreaInset:y}){let g=Bs(),p=y?g.bottom:0,f=t==null,x=Gn(e.status),h=No(e.storageType),[b,S]=Xn(false),[w,T]=Xn(0),I=Zn(null),E=Qn(()=>jn(e.value),[e.value]),D=typeof e.value=="string"?e.value:JSON.stringify(e.value);I.current&&I.current.raw===D&&(I.current=null);let C=I.current?I.current.value:E,R=Cs(H=>{let de=typeof H=="string"?H:JSON.stringify(H);I.current={raw:de,value:H},o(de).catch(ee=>{I.current=null,xe.alert("Couldn't save",ee instanceof Error?ee.message:String(ee))})},[o]),Q=Zn(C);Q.current=C;let be=Qn(()=>{if(f)return{update:(H,de)=>{let ee=H.length===0?de:Ps(Q.current,H,de);R(ee)},remove:H=>{H.length!==0&&R(zs(Q.current,H))}}},[f,R]),ve=d||i||f&&a;return fe(l,{style:A.screen,children:[F(l,{testID:`${ut}-key`,accessibilityLabel:e.key}),fe(Vr,{testID:`${ut}-scroll`,style:A.scroll,contentContainerStyle:[A.scrollContent,{paddingBottom:24+p}],keyboardShouldPersistTaps:"handled",children:[F(l,{style:A.section,children:fe(l,{style:A.editorContainer,children:[fe(l,{style:A.sectionHeaderRow,children:[F(c,{testID:`${ut}-editor-header`,style:A.sectionHeaderAccentText,children:"Value Editor"}),f?fe(K,{onPress:()=>S(true),testID:`${ut}-raw`,accessibilityRole:"button",accessibilityLabel:"Edit raw JSON",style:A.rawButton,hitSlop:{top:6,bottom:6,left:6,right:6},children:[F(Ts,{size:13,color:G.color.accent}),F(c,{style:A.rawButtonText,children:"Raw"})]}):null]}),fe(l,{style:A.sectionBody,children:[F(Ds,{editable:f,label:"Value",value:C,defaultExpanded:["Value"],writer:be,dataVersion:w,testIDForPath:Fs,debounceMs:Ks}),f?F(c,{style:A.editorHint,children:"Edits write to the device as you make them \u2014 undo lives in the key's history."}):F(c,{style:A.blockedText,testID:`${ut}-edit-blocked`,children:t})]})]})}),F(l,{style:A.section,children:fe(l,{style:A.infoContainer,children:[F(c,{style:A.sectionHeaderPlain,children:"Key Details"}),fe(l,{style:A.infoBody,children:[fe(l,{style:A.infoRow,children:[F(c,{style:A.infoLabel,children:"Status:"}),F(oo,{color:x.color,testID:`${ut}-status`,children:x.label}),F(c,{style:A.infoDim,children:x.sublabel})]}),fe(l,{style:A.infoRow,children:[F(c,{style:A.infoLabel,children:"Storage:"}),F(oo,{color:qo(e.storageType),testID:`${ut}-backend`,children:h}),F(c,{style:A.infoDim,children:Et(e.value)})]}),e.storageType==="mmkv"&&e.instanceId&&fe(l,{style:A.infoRow,children:[F(c,{style:A.infoLabel,children:"Instance:"}),F(oo,{color:ta(e.instanceId),icon:F(Is,{size:9,color:ta(e.instanceId)}),children:e.instanceId})]}),r!=null&&r>0&&fe(l,{style:A.infoRow,children:[F(c,{style:A.infoLabel,children:"Updates:"}),F(oo,{color:ir.semantic.warning,children:String(r)}),r>1&&n&&F(K,{onPress:n,testID:"buoy-storage-key-history",accessibilityLabel:`View history for ${e.key}`,accessibilityRole:"button",style:A.inlineLinkButton,hitSlop:{top:6,bottom:6,left:6,right:6},children:F(c,{style:A.inlineLinkText,children:"view history \u2192"})})]}),e.status==="required_wrong_type"&&e.expectedType&&fe(l,{style:A.infoRow,children:[F(c,{style:A.infoLabel,children:"Expected:"}),F(Vs,{type:e.expectedType}),fe(c,{style:A.infoDim,children:["got ",Et(e.value)]})]}),e.status==="required_wrong_value"&&e.expectedValue&&fe(l,{style:A.infoRow,children:[F(c,{style:A.infoLabel,children:"Expected:"}),F(c,{style:A.infoExpected,children:String(e.expectedValue)})]}),e.description?fe(l,{style:A.infoRow,children:[F(c,{style:A.infoLabel,children:"Info:"}),F(c,{style:A.infoDescription,children:e.description})]}):null]})]})}),F(l,{style:A.section,children:fe(l,{style:A.infoContainer,children:[F(c,{style:A.sectionHeaderPlain,children:"Value Explorer"}),F(l,{style:A.viewerBody,testID:`${ut}-viewer`,children:C!==null&&typeof C=="object"?F(As,{title:"",data:C,showTypeFilter:true,rawMode:true,initialExpanded:false}):F(c,{style:A.rawValueText,selectable:true,children:D??"undefined"})})]})}),ve?fe(l,{style:A.actionRow,children:[d?fe(K,{style:[A.actionChip,u&&A.actionChipActive],testID:"buoy-storage-key-pin",accessibilityLabel:u?`Unpin ${e.key}`:`Pin ${e.key} to top`,accessibilityRole:"button",onPress:()=>d(e.key),hitSlop:{top:6,bottom:6,left:6,right:6},children:[F(Es,{size:12,active:u,color:G.color.accent}),F(c,{style:[A.actionChipText,{color:G.color.accent}],children:u?"Unpin":"Pin to top"})]}):null,i?fe(K,{style:A.actionChip,testID:"buoy-storage-key-hide",accessibilityLabel:`Hide ${e.key} from list`,accessibilityRole:"button",onPress:()=>i(e),hitSlop:{top:6,bottom:6,left:6,right:6},children:[F(xs,{size:12,color:G.color.warning}),F(c,{style:[A.actionChipText,{color:G.color.warning}],children:"Hide from list"})]}):null,f&&a?fe(K,{style:[A.actionChip,A.dangerChip],testID:"buoy-storage-key-delete",accessibilityLabel:`Delete key ${e.key}`,accessibilityRole:"button",onPress:()=>a(e),hitSlop:{top:6,bottom:6,left:6,right:6},children:[F(Rs,{size:12,color:G.color.danger}),F(c,{style:[A.actionChipText,{color:G.color.danger}],children:"Delete key"})]}):null]}):null]}),b&&f?F(Ms,{path:[],value:C,onSave:H=>{R(H),T(de=>de+1),S(false)},onCancel:()=>S(false),saveLabel:"Apply",testIDPrefix:"buoy-storage-value"}):null]})}var A=ge.create({screen:{flex:1,minHeight:0},scroll:{flex:1},scrollContent:{paddingHorizontal:8,paddingTop:8},section:{marginBottom:16},editorContainer:{minWidth:200,backgroundColor:G.color.surface,borderRadius:6,borderWidth:1,borderColor:G.color.accent+"4D",overflow:"hidden",shadowColor:G.color.accent,shadowOffset:{width:0,height:0},shadowOpacity:.1,shadowRadius:6},sectionHeaderRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",backgroundColor:G.color.accent+"1A",paddingHorizontal:12,paddingVertical:8,borderBottomWidth:1,borderBottomColor:G.color.accent+"33"},sectionHeaderAccentText:{fontWeight:"600",fontSize:12,color:G.color.accent,letterSpacing:.5,textTransform:"uppercase",fontFamily:Rt},rawButton:{flexDirection:"row",alignItems:"center",gap:4},rawButtonText:{color:G.color.accent,fontSize:11,fontWeight:"700"},sectionBody:{padding:8},editorHint:{color:G.color.textTertiary,fontSize:10,paddingTop:8,paddingHorizontal:4,lineHeight:14},blockedText:{color:G.color.textSecondary,fontSize:12,padding:12,lineHeight:18},infoContainer:{minWidth:200,backgroundColor:G.color.surface,borderRadius:6,borderWidth:1,borderColor:G.color.border,overflow:"hidden"},sectionHeaderPlain:{backgroundColor:G.color.surfaceElevated,paddingHorizontal:12,paddingVertical:8,fontWeight:"600",fontSize:12,color:G.color.textSecondary,borderBottomWidth:1,borderBottomColor:G.color.border,letterSpacing:.5,textTransform:"uppercase",fontFamily:Rt},infoBody:{padding:12,gap:10},infoRow:{flexDirection:"row",alignItems:"center",gap:8},infoLabel:{fontSize:10,color:G.color.textTertiary,fontWeight:"600",minWidth:64,fontFamily:Rt},infoDim:{color:G.color.textTertiary,fontSize:10,fontFamily:Rt},infoExpected:{fontSize:11,color:ir.semantic.warning,fontFamily:Rt,flex:1},infoDescription:{fontSize:11,color:G.color.textSecondary,flex:1},rawValueText:{color:G.color.textSecondary,fontSize:11,fontFamily:Rt,lineHeight:16,padding:12},viewerBody:{backgroundColor:G.color.bg,minHeight:48},inlineLinkButton:{marginLeft:4},inlineLinkText:{fontSize:10,fontWeight:"600",fontFamily:Rt,color:G.color.accent},actionRow:{flexDirection:"row",alignItems:"center",flexWrap:"wrap",gap:8,paddingHorizontal:4},actionChip:{flexDirection:"row",alignItems:"center",gap:6,paddingVertical:6,paddingHorizontal:10,borderRadius:6,backgroundColor:G.color.surface,borderWidth:1,borderColor:G.color.border},dangerChip:{borderColor:G.color.danger+"55"},actionChipActive:{backgroundColor:G.color.accentSoft,borderColor:G.color.accentBorderStrong},actionChipText:{fontSize:11,fontWeight:"600",fontFamily:Rt}});V();V();import{macOSColors as Uo,night as Vt,monoFont as Ls}from"@buoy-gg/shared-ui/web";import{jsx as Jo,jsxs as Ws}from"react/jsx-runtime";var _s=[{id:"all",label:"All Types",color:null},{id:"async",label:le.async,color:Uo.semantic.warning},{id:"mmkv",label:le.mmkv,color:Uo.semantic.info},{id:"secure",label:"Secure",color:Uo.semantic.success}];function Go({active:e,onChange:t,counts:r}){return Jo(l,{style:Mr.row,children:_s.filter(o=>le.hasSecure||o.id!=="secure").map(o=>{let n=e===o.id,a=o.color??Vt.color.accent;return Ws(K,{testID:`buoy-storage-type-${o.id}`,accessibilityRole:"button",accessibilityLabel:`Filter by ${o.label}`,accessibilityState:{selected:n},activeOpacity:.8,onPress:()=>t(o.id),style:[Mr.pill,{borderColor:Vt.color.border},n&&[Mr.pillActive,o.color?{backgroundColor:o.color+"15",borderColor:o.color+"40"}:{backgroundColor:Vt.color.accentSoft,borderColor:Vt.color.accentBorderStrong}]],children:[Jo(c,{style:[Mr.label,n&&{color:a,fontWeight:"600"}],children:o.label}),Jo(c,{style:[Mr.value,{color:n?a:Vt.color.textTertiary}],children:r[o.id]})]},o.id)})})}function ra(e){let t={all:e.length,async:0,mmkv:0,secure:0};for(let r of e)t[r.storageType]+=1;return t}var Mr=ge.create({row:{flexDirection:"row",gap:8,marginTop:2},pill:{flex:1,backgroundColor:Vt.color.buttonSurface,borderRadius:8,borderWidth:1,borderColor:Vt.color.border,paddingVertical:6,paddingHorizontal:8,alignItems:"center",justifyContent:"center",minHeight:32},pillActive:{borderWidth:1,transform:[{scale:1.005}]},label:{fontSize:9,color:Vt.color.textSecondary,textTransform:"uppercase",letterSpacing:.4,fontWeight:"500",marginBottom:1},value:{fontSize:12,fontWeight:"600",fontFamily:Ls,lineHeight:14}});import{macOSColors as Bt,night as Ke,monoFont as $s}from"@buoy-gg/shared-ui/web";V();function Yo(){try{return typeof window<"u"&&!!window.sessionStorage}catch{return false}}function Ns(){return null}function oa(){return"Session storage is unavailable in this browser context."}import{jsx as jt,jsxs as Pr}from"react/jsx-runtime";var ey=Yo();function qs({stats:e,tabStats:t,healthPercentage:r,healthStatus:o,healthColor:n,activeFilter:a="all",onFilterChange:i,activeStorageType:u="all",onStorageTypeChange:d,showStatus:y=true}){let g=t||{validCount:e.presentRequiredCount+e.optionalCount,missingCount:e.missingCount,issuesCount:e.wrongValueCount+e.wrongTypeCount,asyncCount:e.asyncCount||0,mmkvCount:e.mmkvCount||0,secureCount:e.secureCount||0,totalCount:e.totalCount};return Pr(l,{style:We.container,children:[y?Pr(l,{style:We.filtersRow,children:[Pr(K,{style:[We.filterChip,a==="all"&&[We.filterChipActive,{backgroundColor:Ke.color.accentSoft,borderColor:Ke.color.accentBorderStrong,shadowColor:Ke.color.accent}]],onPress:()=>i?.("all"),activeOpacity:.8,testID:"buoy-storage-status-all",accessibilityRole:"button",accessibilityLabel:"Valid keys",children:[jt(c,{style:[We.filterValue,{color:Ke.color.text}],children:g.validCount}),jt(c,{style:We.filterLabel,children:"Valid"})]}),Pr(K,{style:[We.filterChip,a==="missing"&&[We.filterChipActive,{backgroundColor:Bt.semantic.error+"10",borderColor:Bt.semantic.error+"30",shadowColor:Bt.semantic.error}]],onPress:()=>i?.("missing"),activeOpacity:.8,testID:"buoy-storage-status-missing",accessibilityRole:"button",accessibilityLabel:"Missing keys",children:[jt(c,{style:[We.filterValue,{color:g.missingCount>0?Bt.semantic.error:Ke.color.textTertiary}],children:g.missingCount}),jt(c,{style:We.filterLabel,children:"Missing"})]}),Pr(K,{style:[We.filterChip,a==="issues"&&[We.filterChipActive,{backgroundColor:Bt.semantic.warning+"10",borderColor:Bt.semantic.warning+"30",shadowColor:Bt.semantic.warning}]],onPress:()=>i?.("issues"),activeOpacity:.8,testID:"buoy-storage-status-issues",accessibilityRole:"button",accessibilityLabel:"Issues keys",children:[jt(c,{style:[We.filterValue,{color:g.issuesCount>0?Bt.semantic.warning:Ke.color.textTertiary}],children:g.issuesCount}),jt(c,{style:We.filterLabel,children:"Issues"})]})]}):null,d&&jt(Go,{active:u,onChange:d,counts:{all:g.totalCount,async:g.asyncCount,mmkv:g.mmkvCount,secure:g.secureCount}})]})}var We=ge.create({container:{backgroundColor:Ke.color.surface,borderRadius:12,padding:16,borderWidth:1,borderColor:Ke.color.border,gap:14,shadowColor:"#000000",shadowOpacity:.03,shadowRadius:12,shadowOffset:{width:0,height:2}},topRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between"},titleLeft:{flexDirection:"row",alignItems:"center",gap:8,flexShrink:1},healthDot:{width:6,height:6,borderRadius:3},titleText:{fontSize:12,fontWeight:"600",color:Ke.color.text,letterSpacing:.5,textTransform:"uppercase"},titleDivider:{width:4,height:1,backgroundColor:Ke.color.border,marginHorizontal:4},subtitleText:{color:Ke.color.textTertiary,fontSize:11},healthBadge:{paddingHorizontal:6,paddingVertical:2,borderRadius:6,borderWidth:1},healthBadgeText:{fontSize:10,fontWeight:"600",fontVariant:["tabular-nums"]},healthProgressBar:{height:3,borderRadius:1.5,backgroundColor:Ke.color.bg,overflow:"hidden"},healthProgressFill:{height:3,borderRadius:1.5},filtersRow:{flexDirection:"row",gap:10},filterChip:{flex:1,backgroundColor:Ke.color.buttonSurface,borderRadius:8,borderWidth:1,borderColor:Ke.color.border,paddingVertical:10,paddingHorizontal:12,alignItems:"center",justifyContent:"center",minHeight:44},filterChipActive:{borderWidth:1,shadowOffset:{width:0,height:0},shadowOpacity:.1,shadowRadius:6,elevation:2,transform:[{scale:1.005}]},filterLabel:{fontSize:9,color:Ke.color.textTertiary,textTransform:"uppercase",letterSpacing:.5,fontWeight:"500",marginTop:3},filterValue:{fontSize:18,fontWeight:"600",fontFamily:$s,lineHeight:20}});V();Nt();import{useState as Qo,useEffect as Hs,useCallback as js,useRef as Us}from"react";import Js from"@buoy-gg/shared-ui/web/asyncStorage";V();function At(e,t){return typeof e=="string"?t==="async":e.storageType?e.storageType===t:true}function Zo(e=[]){let[t,r]=Qo([]),[o,n]=Qo(true),[a,i]=Qo(null),u=JSON.stringify(e),d=Us(e);d.current=e;let y=js(async()=>{let g=d.current;n(true),i(null);try{let p=await Js.getAllKeys();if(!p||p.length===0){r([]),n(false);return}let f=await Gr(p),x=[];f.forEach(([h,b])=>{let S=b;if(b)try{S=JSON.parse(b)}catch{S=b}let w=g.find(E=>At(E,"async")?typeof E=="string"?E===h:E.key===h:false),T="optional_present";w&&(S==null?T="required_missing":typeof w=="object"&&w.expectedValue!==void 0?T=S===w.expectedValue?"required_present":"required_wrong_value":typeof w=="object"&&w.expectedType!==void 0?T=(S===null?"null":typeof S).toLowerCase()===w.expectedType.toLowerCase()?"required_present":"required_wrong_type":T="required_present");let I={key:h,value:S,storageType:"async",status:T,category:w?"required":"optional",...typeof w=="object"&&w.expectedValue!==void 0&&{expectedValue:w.expectedValue},...typeof w=="object"&&w.expectedType!==void 0&&{expectedType:w.expectedType},...typeof w=="object"&&w.description!==void 0&&{description:w.description}};x.push(I)}),g.forEach(h=>{if(!At(h,"async"))return;let b=typeof h=="string"?h:h.key;x.some(S=>S.key===b)||x.push({key:b,value:void 0,storageType:"async",status:"required_missing",category:"required",...typeof h=="object"&&h.expectedValue!==void 0&&{expectedValue:h.expectedValue},...typeof h=="object"&&h.expectedType!==void 0&&{expectedType:h.expectedType},...typeof h=="object"&&h.description!==void 0&&{description:h.description}})}),r(x)}catch(p){i(p instanceof Error?p:new Error("Failed to fetch storage data")),r([])}finally{n(false)}},[u]);return Hs(()=>{y()},[y]),{storageKeys:t,isLoading:o,error:a,refresh:y}}V();import{subscribeToBrowserStorage as Gs}from"@buoy-gg/shared-ui/web/utils";var Xo=new Set,en,Ys=false,Qs=new Set(["@react_buoy_storage_event_filters","@react_buoy_storage_key_filters","@react_buoy_storage_is_monitoring","REACT_QUERY_OFFLINE_CACHE"]),na=e=>[...Qs].some(t=>e.startsWith(t));async function Zs(){en||typeof window>"u"||(en=Gs(e=>{if(Ys||e.area!=="localStorage"||e.key!==void 0&&na(e.key))return;let{area:t,action:r,...o}=e;o.prevPairs&&(o.prevPairs=o.prevPairs.filter(([a])=>!na(a)));let n={action:r,data:o,timestamp:new Date};for(let a of[...Xo])try{a(n)}catch{}}))}function aa(e){return Xo.add(e),()=>{Xo.delete(e)}}function Xs(){return!!en}V();import{useState as lr,useEffect as ia,useCallback as la,useRef as sa}from"react";function ec(e,t,r=[]){let[o,n]=lr([]),[a,i]=lr(true),[u,d]=lr(null),y=JSON.stringify(r),g=sa(r);g.current=r;let p=la(()=>{let f=g.current;i(true),d(null);try{if(!e){n([]),i(false);return}let x=e.getAllKeys();if(!x||x.length===0){let b=f.filter(S=>At(S,"mmkv")).map(S=>{let w=typeof S=="string"?S:S.key,T=typeof S=="object"?S.description:void 0,I=typeof S=="object"?S.expectedValue:void 0,E=typeof S=="object"?S.expectedType:void 0;return{key:w,value:void 0,valueType:void 0,storageType:"mmkv",instanceId:t,status:"required_missing",category:"required",description:T,expectedValue:I,expectedType:E}});n(b),i(false);return}let h=[];x.forEach(b=>{let{value:S,type:w}=ht(e,b),T=f.find(D=>At(D,"mmkv")?typeof D=="string"?D===b:D.key===b:false),I="optional_present";T&&(S===void 0?I="required_missing":typeof T=="object"&&T.expectedValue!==void 0?I=String(S)===String(T.expectedValue)?"required_present":"required_wrong_value":typeof T=="object"&&T.expectedType!==void 0?I=zo(w,T.expectedType)?"required_present":"required_wrong_type":I="required_present");let E={key:b,value:S,valueType:w!=="unknown"?w:void 0,storageType:"mmkv",instanceId:t,status:I,category:T?"required":"optional",lastUpdated:new Date,...typeof T=="object"&&T.expectedValue!==void 0&&{expectedValue:T.expectedValue},...typeof T=="object"&&T.expectedType!==void 0&&{expectedType:T.expectedType},...typeof T=="object"&&T.description!==void 0&&{description:T.description}};h.push(E)}),f.forEach(b=>{if(!At(b,"mmkv"))return;let S=typeof b=="string"?b:b.key;h.some(w=>w.key===S)||h.push({key:S,value:void 0,valueType:void 0,storageType:"mmkv",instanceId:t,status:"required_missing",category:"required",...typeof b=="object"&&b.expectedValue!==void 0&&{expectedValue:b.expectedValue},...typeof b=="object"&&b.expectedType!==void 0&&{expectedType:b.expectedType},...typeof b=="object"&&b.description!==void 0&&{description:b.description}})}),n(h)}catch(x){d(x instanceof Error?x:new Error("Failed to fetch MMKV storage data")),n([])}finally{i(false)}},[e,t,y]);return ia(()=>{p()},[p]),{storageKeys:o,isLoading:a,error:u,refresh:p}}function ca(e,t=[]){let[r,o]=lr([]),[n,a]=lr(true),[i,u]=lr(null),d=JSON.stringify(t),y=sa(t);y.current=t;let g=la(()=>{let p=y.current;a(true),u(null);try{let f=[];e.forEach(({instance:x,id:h})=>{let b=x.getAllKeys();!b||b.length===0||b.forEach(S=>{let{value:w,type:T}=ht(x,S),I=p.find(C=>At(C,"mmkv")?typeof C=="string"?C===S:C.key===S:false),E="optional_present";I&&(w===void 0?E="required_missing":typeof I=="object"&&I.expectedValue!==void 0?E=String(w)===String(I.expectedValue)?"required_present":"required_wrong_value":typeof I=="object"&&I.expectedType!==void 0?E=zo(T,I.expectedType)?"required_present":"required_wrong_type":E="required_present");let D={key:S,value:w,valueType:T!=="unknown"?T:void 0,storageType:"mmkv",instanceId:h,status:E,category:I?"required":"optional",lastUpdated:new Date,...typeof I=="object"&&I.expectedValue!==void 0&&{expectedValue:I.expectedValue},...typeof I=="object"&&I.expectedType!==void 0&&{expectedType:I.expectedType},...typeof I=="object"&&I.description!==void 0&&{description:I.description}};f.push(D)})}),p.forEach(x=>{if(!At(x,"mmkv"))return;let h=typeof x=="string"?x:x.key;if(!f.some(b=>b.key===h)){let b=e[0]?.id||"mmkv.default";f.push({key:h,value:void 0,valueType:void 0,storageType:"mmkv",instanceId:b,status:"required_missing",category:"required",...typeof x=="object"&&x.expectedValue!==void 0&&{expectedValue:x.expectedValue},...typeof x=="object"&&x.expectedType!==void 0&&{expectedType:x.expectedType},...typeof x=="object"&&x.description!==void 0&&{description:x.description}})}}),o(f)}catch(f){u(f instanceof Error?f:new Error("Failed to fetch multi-MMKV storage data")),o([])}finally{a(false)}},[e,d]);return ia(()=>{g()},[g]),{storageKeys:r,isLoading:n,error:i,refresh:g}}V();import{useState as tn,useEffect as tc,useCallback as da,useRef as no}from"react";var rc="\u2022\u2022\u2022\u2022\u2022\u2022 (biometric protected)",oc=3e3;function ua(e){return JSON.stringify(e)}function nc(e=[],t={}){let{pollMs:r=oc}=t,o=no(e);o.current=e;let n=JSON.stringify(e),[a,i]=tn([]),[u,d]=tn(true),[y,g]=tn(null),p=no(ua([])),f=no(false),x=no(false),h=da(S=>{let w=ua(S);w!==p.current&&(p.current=w,i(S))},[]),b=da(async()=>{if(!x.current){x.current=true;try{let S=te.getModule(),w=te.getAll(),T=o.current.filter(C=>At(C,"secure")),I=C=>T.find(R=>(typeof R=="string"?R:R.key)===C);if(!S||w.length===0&&T.length===0){h([]),f.current=true,d(false);return}f.current||d(true),g(null);let E=[],D=[...w,...T.map(C=>typeof C=="string"?C:C.key).filter(C=>!w.some(R=>R.key===C)).map(C=>({key:C,options:{},description:void 0}))];for(let C of D){let R=I(C.key),Q=typeof R=="object"?R:void 0,be={...Q?.expectedValue!==void 0&&{expectedValue:Q.expectedValue},...Q?.expectedType!==void 0&&{expectedType:Q.expectedType}},ve=Q?.description??C.description;if(C.options.requireAuthentication){E.push({key:C.key,value:rc,storageType:"secure",status:R?"required_present":"optional_present",category:R?"required":"optional",description:ve??"Protected by biometric authentication \u2014 value not read by DevTools",...be,...C.options.keychainService&&{instanceId:C.options.keychainService}});continue}let H=null;try{H=await S.getItemAsync(C.key,C.options)}catch{}if(H===null&&!R)continue;let de=H;if(H)try{de=JSON.parse(H)}catch{de=H}let ee="optional_present";if(R)if(H===null)ee="required_missing";else if(Q?.expectedValue!==void 0)ee=String(de)===String(Q.expectedValue)?"required_present":"required_wrong_value";else if(Q?.expectedType!==void 0){let ie=de===null?"null":Array.isArray(de)?"array":typeof de,He=Q.expectedType.toLowerCase();ee=ie===He||He==="string"&&typeof H=="string"?"required_present":"required_wrong_type"}else ee="required_present";E.push({key:C.key,value:H===null?void 0:de,storageType:"secure",status:ee,category:R?"required":"optional",...ve&&{description:ve},...be,...C.options.keychainService&&{instanceId:C.options.keychainService}})}h(E)}catch(S){g(S instanceof Error?S:new Error("Failed to read SecureStore")),h([])}finally{f.current=true,x.current=false,d(false)}}},[h,n]);return tc(()=>{b();let S=te.subscribe(()=>{b()});if(r<=0)return S;let w=setInterval(b,r);return()=>{S(),clearInterval(w)}},[b,r]),{storageKeys:a,isLoading:u,error:y,refresh:b}}V();import{useState as ao,useEffect as io}from"react";function rn(e=false){let[t,r]=ao([]),[o,n]=ao(true),a=()=>{n(true);try{let i=Pe.getAll().map(u=>{let{instance:d,id:y,encrypted:g,readOnly:p}=u,f=d.getAllKeys()?.length||0;return{id:y,instance:d,encrypted:g,readOnly:p,keyCount:f,size:void 0}});r(i)}catch{r([])}finally{n(false)}};return io(()=>{a()},[]),io(()=>{if(!e)return;let i=setInterval(()=>{a()},1e3);return()=>clearInterval(i)},[e]),{instances:t,instanceCount:t.length,isLoading:o,refresh:a}}function ya(e){let[t,r]=ao(null);return io(()=>{if(!Pe){r(null);return}let o=Pe.get(e);if(!o){r(null);return}let n=o.instance.getAllKeys()?.length||0;r({...o,keyCount:n,size:void 0})},[e]),t}function ac(e){let[t,r]=ao(false);return io(()=>{if(!Pe){r(false);return}r(Pe.has(e))},[e]),t}V();import{useEffect as ic,useRef as ga}from"react";import{Check as lc,macOSColors as Ut}from"@buoy-gg/shared-ui/web";import{jsx as sr,jsxs as sc}from"react/jsx-runtime";var cc=2600,pa=180;function dc({onDone:e}){let t=ga(new qt.Value(0)).current,r=ga(e);return r.current=e,ic(()=>{let o=qt.sequence([qt.timing(t,{toValue:1,duration:pa,easing:Rr.out(Rr.quad),useNativeDriver:true}),qt.delay(cc),qt.timing(t,{toValue:0,duration:pa,easing:Rr.in(Rr.quad),useNativeDriver:true})]);return o.start(({finished:n})=>{n&&r.current()}),()=>o.stop()},[t]),sr(qt.View,{pointerEvents:"box-none",style:[cr.wrap,{opacity:t,transform:[{translateY:t.interpolate({inputRange:[0,1],outputRange:[-10,0]})}]}],testID:"buoy-storage-save-notice",children:sc(K,{activeOpacity:.85,onPress:()=>r.current(),style:cr.toast,accessibilityRole:"button",accessibilityLabel:"Saved. Applies on the app's next launch. Tap to dismiss.",testID:"buoy-storage-save-notice-dismiss",children:[sr(l,{style:cr.tick,children:sr(lc,{size:10,color:Ut.semantic.success})}),sr(c,{style:cr.saved,children:"Saved"}),sr(l,{style:cr.divider}),sr(c,{style:cr.detail,children:"applies on next launch"})]})})}var cr=ge.create({wrap:{position:"absolute",top:10,left:12,right:12,zIndex:100,elevation:100,alignItems:"center"},toast:{flexDirection:"row",alignItems:"center",paddingVertical:7,paddingLeft:8,paddingRight:12,borderRadius:999,backgroundColor:Ut.background.card,borderWidth:ge.hairlineWidth,borderColor:Ut.border.default,shadowColor:"#000",shadowOpacity:.4,shadowRadius:14,shadowOffset:{width:0,height:5}},tick:{width:16,height:16,borderRadius:8,marginRight:7,alignItems:"center",justifyContent:"center",backgroundColor:Ut.semantic.successBackground},saved:{color:Ut.text.primary,fontSize:12,fontWeight:"600"},divider:{width:ge.hairlineWidth,alignSelf:"stretch",marginHorizontal:8,backgroundColor:Ut.border.default},detail:{color:Ut.text.muted,fontSize:12}});V();import{useState as uc,useEffect as yc}from"react";import{Trash2 as lo,CopyButton as gc,SquareDashed as pc,X as fc,ProUpgradeModal as mc,monoFont as hc}from"@buoy-gg/shared-ui/web";import{macOSColors as fa,night as ot}from"@buoy-gg/shared-ui/web";import{useIsPro as bc}from"@buoy-gg/license/web";import ma from"@buoy-gg/shared-ui/web/asyncStorage";import{jsx as _e,jsxs as ha}from"react/jsx-runtime";function vc({copyValue:e,mmkvInstances:t=[],activeStorageType:r="all",onClearComplete:o,isSelectMode:n=false,onToggleSelectMode:a,selectedCount:i=0}){let[u,d]=uc(false),y=bc();yc(()=>{u&&y&&d(false)},[u,y]);let g=()=>{if(!y){d(true);return}xe.alert(`Clear ${le.asyncFull}`,`Delete all ${le.asyncFull} keys? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Clear",style:"destructive",onPress:async()=>{try{await ma.clear(),o?.()}catch(E){xe.alert("Error",`Failed: ${E}`)}}}])},p=(E,D)=>{if(!y){d(true);return}xe.alert(`Clear ${D}`,`Delete all keys from ${D}? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Clear",style:"destructive",onPress:()=>{try{let C=t.find(R=>R.id===E);C&&(C.instance.clearAll(),o?.())}catch(C){xe.alert("Error",`Failed: ${C}`)}}}])},f=()=>{if(!y){d(true);return}xe.alert(`Clear All ${le.mmkv}`,`Delete all keys from ${t.length} instances? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Clear All",style:"destructive",onPress:()=>{try{t.forEach(E=>E.instance.clearAll()),o?.()}catch(E){xe.alert("Error",`Failed: ${E}`)}}}])},x=()=>{if(!y){d(true);return}xe.alert("Clear All Storage","Delete all storage data? This cannot be undone.",[{text:"Cancel",style:"cancel"},{text:"Clear All",style:"destructive",onPress:async()=>{try{await ma.clear(),t.forEach(E=>E.instance.clearAll()),o?.()}catch(E){xe.alert("Error",`Failed: ${E}`)}}}])},h=r==="all"||r==="async",b=r==="all"||r==="mmkv",S=r==="all",w=h&&!S,T=b&&!S,I=b&&t.length>1&&!S;return ha(l,{style:yt.container,children:[a&&_e(K,{onPress:a,testID:"buoy-storage-select-mode",accessibilityLabel:n?"Exit selection mode":"Select keys",accessibilityRole:"button",style:[yt.actionButton,n&&yt.actionButtonActive],children:n?ha(l,{style:yt.selectModeActiveContainer,children:[_e(fc,{size:14,color:ot.color.accent}),i>0&&_e(c,{style:yt.selectedCountText,children:i})]}):_e(pc,{size:16,color:ot.color.textSecondary})}),!n&&_e(gc,{value:e,size:16,testID:"buoy-storage-export-copy",buttonStyle:yt.actionButton,colors:{idle:ot.color.textSecondary,success:fa.semantic.success,error:fa.semantic.error}}),!n&&S&&_e(K,{onPress:x,testID:"buoy-storage-clear-all",accessibilityLabel:"Clear all storage",accessibilityRole:"button",style:yt.actionButton,children:_e(lo,{size:16,color:ot.color.danger})}),!n&&w&&_e(K,{onPress:g,testID:"buoy-storage-clear-async",accessibilityLabel:`Clear ${le.asyncFull}`,accessibilityRole:"button",style:yt.actionButton,children:_e(lo,{size:16,color:ot.color.danger})}),!n&&I&&_e(K,{onPress:f,testID:"buoy-storage-clear-mmkv-all",accessibilityLabel:`Clear all ${le.mmkv} instances`,accessibilityRole:"button",style:yt.actionButton,children:_e(lo,{size:16,color:ot.color.danger})}),!n&&T&&t.length===1&&_e(K,{onPress:()=>p(t[0].id,t[0].id),testID:"buoy-storage-clear-mmkv",accessibilityLabel:`Clear ${le.mmkv} instance`,accessibilityRole:"button",style:yt.actionButton,children:_e(lo,{size:16,color:ot.color.danger})}),_e(mc,{visible:u,onClose:()=>d(false),featureName:"Storage Editing"})]})}var yt=ge.create({container:{flexDirection:"row",alignItems:"center",gap:8},actionButton:{width:32,height:32,alignItems:"center",justifyContent:"center",borderRadius:6,backgroundColor:ot.color.buttonSurface,borderWidth:1,borderColor:ot.color.border},actionButtonActive:{backgroundColor:ot.color.accentSoft,borderColor:ot.color.accentBorderStrong},selectModeActiveContainer:{flexDirection:"row",alignItems:"center",gap:2},selectedCountText:{fontSize:10,fontWeight:"700",color:ot.color.accent,fontFamily:hc}});V();import{useState as Sc,useEffect as wc}from"react";import{Trash2 as kc,CopyButton as Cc,CheckSquare as xc,EyeOff as Tc,ProUpgradeModal as Ic,monoFont as Ec}from"@buoy-gg/shared-ui/web";import{macOSColors as ba,night as $e}from"@buoy-gg/shared-ui/web";import{useIsPro as Rc}from"@buoy-gg/license/web";V();Nt();function Vc(e,t){if(typeof e.remove=="function"){e.remove(t);return}if(typeof e.delete=="function"){e.delete(t);return}throw new Error("MMKV instance exposes neither remove() nor delete()")}async function va(e,t){if(e.length===0)return;let r=e.filter(a=>a.storageType==="async"),o=e.filter(a=>a.storageType==="mmkv"),n=e.filter(a=>a.storageType==="secure");r.length>0&&await tr(r.map(a=>a.key));for(let a of n)await te.deleteValue(a.key);if(o.length>0){let a={};o.forEach(i=>{let u=i.instanceId||"default";a[u]||(a[u]=[]),a[u].push(i.key)}),Object.entries(a).forEach(([i,u])=>{let d=t.find(y=>y.id===i);d&&u.forEach(y=>Vc(d.instance,y))})}}import{jsx as vt,jsxs as zr}from"react/jsx-runtime";function Bc({selectedKeys:e,mmkvInstances:t,onDeleteComplete:r,onHideKeys:o,onSelectAll:n,onClearSelection:a,totalVisibleKeys:i}){let[u,d]=Sc(false),y=Rc();wc(()=>{u&&y&&d(false)},[u,y]);let g=e.length,p=g===i&&i>0,f=()=>{let b={};return e.forEach(S=>{let w=S.instanceId?`[${S.storageType}:${S.instanceId}]`:`[${S.storageType}]`;b[`${w} ${S.key}`]=S.value}),{selectedCount:g,keys:b,timestamp:new Date().toISOString()}},x=()=>{g!==0&&o?.(e)},h=()=>{if(g!==0){if(!y){d(true);return}xe.alert("Delete Selected Keys",`Delete ${g} selected key${g>1?"s":""}? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Delete",style:"destructive",onPress:async()=>{try{await va(e,t),r?.()}catch(b){xe.alert("Error",`Failed to delete keys: ${b}`)}}}])}};return g===0?null:zr(l,{style:gt.container,children:[zr(l,{style:gt.leftSection,children:[zr(K,{style:gt.selectAllButton,onPress:p?a:n,testID:"buoy-storage-select-all",accessibilityLabel:p?"Deselect all keys":"Select all keys",accessibilityRole:"button",children:[vt(xc,{size:14,color:p?$e.color.accent:$e.color.textSecondary}),vt(c,{style:gt.selectAllText,children:p?"Deselect All":"Select All"})]}),vt(l,{style:gt.countBadge,children:zr(c,{style:gt.countText,children:[g," selected"]})})]}),zr(l,{style:gt.actionsSection,children:[vt(Cc,{value:f(),size:14,testID:"buoy-storage-selection-copy",buttonStyle:gt.actionButton,colors:{idle:$e.color.accent,success:ba.semantic.success,error:ba.semantic.error}}),o&&vt(K,{style:gt.actionButton,onPress:x,testID:"buoy-storage-selection-hide",accessibilityLabel:"Hide selected keys",accessibilityRole:"button",children:vt(Tc,{size:14,color:$e.color.warning})}),vt(K,{style:gt.actionButton,onPress:h,testID:"buoy-storage-selection-delete",accessibilityLabel:"Delete selected keys",accessibilityRole:"button",children:vt(kc,{size:14,color:$e.color.danger})})]}),vt(Ic,{visible:u,onClose:()=>d(false),featureName:"Storage Editing"})]})}var gt=ge.create({container:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",backgroundColor:$e.color.accentSoft,borderRadius:8,borderWidth:1,borderColor:$e.color.accentBorderStrong,paddingHorizontal:12,paddingVertical:8,marginBottom:10},leftSection:{flexDirection:"row",alignItems:"center",gap:12},selectAllButton:{flexDirection:"row",alignItems:"center",gap:6,paddingVertical:4,paddingHorizontal:8,backgroundColor:$e.color.surface,borderRadius:6,borderWidth:1,borderColor:$e.color.border},selectAllText:{fontSize:11,fontWeight:"600",color:$e.color.textSecondary},countBadge:{backgroundColor:$e.color.accentFill,paddingHorizontal:8,paddingVertical:4,borderRadius:6},countText:{fontSize:11,fontWeight:"700",color:$e.color.accent,fontFamily:Ec},actionsSection:{flexDirection:"row",alignItems:"center",gap:8},actionButton:{width:28,height:28,alignItems:"center",justifyContent:"center",borderRadius:6,backgroundColor:$e.color.surface,borderWidth:1,borderColor:$e.color.border}});V();var on=new Set;function Ac(e){return on.add(e),()=>{on.delete(e)}}function Dc(){on.forEach(e=>{try{e()}catch{}})}V();import Mc from"@buoy-gg/shared-ui/web/asyncStorage";function nn(e,t=[]){if(e.storageType==="mmkv"){if(e.valueType==="buffer")return"Buffer values can't be edited \u2014 the tool only ever sees their byte length, not their contents.";let r=t.find(o=>o.id===(e.instanceId||"default"));if(r?.readOnly)return`MMKV instance "${r.id}" is registered read-only.`}if(e.storageType==="secure"){if(te.getAll().find(r=>r.key===e.key)?.options.requireAuthentication)return"Biometric-protected keys can't be edited \u2014 writing one would fire an auth prompt.";if(!te.getModule())return"No SecureStore module is registered."}return null}function Sa(e,t){if(e.storageType==="mmkv"){let r=xa(e);if(r==="number"&&(t.trim()===""||Number.isNaN(Number(t))))return"Must be a number \u2014 this MMKV key is stored as a number.";if(r==="boolean"){let o=t.trim().toLowerCase();if(o!=="true"&&o!=="false")return'Must be "true" or "false" \u2014 this MMKV key is stored as a boolean.'}return null}if(ka(e.value))try{JSON.parse(t)}catch(r){return`This key holds JSON \u2014 ${r instanceof Error?r.message:"invalid JSON"}`}return null}function Pc(e){if(e==null)return"";if(typeof e=="string"){let t=e.trim();if(t.startsWith("{")||t.startsWith("["))try{return JSON.stringify(JSON.parse(e),null,2)}catch{return e}return e}return typeof e=="object"?JSON.stringify(e,null,2):String(e)}async function wa(e,t,r=[]){let o=nn(e,r);if(o)throw new Error(o);let n=Sa(e,t);if(n)throw new Error(n);switch(e.storageType){case"async":{await Mc.setItem(e.key,Ca(e,t));return}case"secure":{await te.setValue(e.key,Ca(e,t));return}case"mmkv":{let a=e.instanceId||"default",i=r.find(u=>u.id===a);if(!i)throw new Error(`MMKV instance "${a}" is not registered.`);i.instance.set(e.key,zc(e,t));return}default:throw new Error(`Unsupported storage type "${String(e.storageType)}"`)}}function ka(e){return e!==null&&typeof e=="object"}function Ca(e,t){return ka(e.value)?JSON.stringify(JSON.parse(t)):t}function xa(e){return e.valueType?e.valueType:typeof e.value=="number"?"number":typeof e.value=="boolean"?"boolean":"string"}function zc(e,t){switch(xa(e)){case"number":return Number(t);case"boolean":return t.trim().toLowerCase()==="true";default:return t}}import{gameUIColors as dr,macOSColors as so,night as L,HardDrive as Ta}from"@buoy-gg/shared-ui/web";import{useIsPro as Kc}from"@buoy-gg/license/web";import{Fragment as Fc,jsx as q,jsxs as Te}from"react/jsx-runtime";var Ia=[so.semantic.info,so.semantic.success,so.semantic.warning,so.semantic.debug,"#FF6B9D","#00D9FF"];function ur(e){let t=e.split("").reduce((r,o)=>r+o.charCodeAt(0),0);return Ia[t%Ia.length]}var Ty=rs["storage.keys"].free;function Oc({requiredStorageKeys:e=[],showFilters:t=false,ignoredPatterns:r=new Set(["@react_buoy"]),onTogglePattern:o,onAddPattern:n,searchQuery:a="",storageDataRef:i,eventCountByKey:u,lastWriteByKey:d,onViewHistory:y,enabledStorageTypes:g,statusFilter:p,onStatusFilterChange:f,onStatusCountsChange:x,pinnedKeys:h,onTogglePin:b,storageTypeFilter:S,onStorageTypeFilterChange:w,applySafeAreaInset:T,detailKey:I=null,onOpenKey:E,onCloseDetail:D}){let C=Kc(),R=Ln("storage.keys"),Q=Ln("storage.mmkvInstances"),[be,ve]=Ht(false);or(()=>{be&&C&&ve(false)},[be,C]);let[H,de]=Ht("all"),ee=p!=null&&f!=null,ie=ee?p:H,He=ee?f:de,[je,ft]=Ht("all"),xt=S!=null&&w!=null,ue=xt?S:je,Qt=xt?w:ft,[re,Kt]=Ht(null),Ue=_o(null),mr=_o(0),oe=_o(new Map),ct=Qe((s,m)=>{m?oe.current.set(s,m):oe.current.delete(s)},[]),[Ft,hr]=Ht(0),[Ot,br]=Ht(false),[Zt,Tt]=Ht(new Set),{instances:ke}=rn(false),{storageKeys:$r,isLoading:Nr,error:qr,refresh:Lt}=Zo(e),xo=Le(()=>ke.map(s=>({instance:s.instance,id:s.id})),[ke]),{storageKeys:vr,isLoading:To,error:Sr,refresh:Xt}=ca(xo,e),Io=Le(()=>re?vr.filter(s=>s.instanceId===re):vr,[vr,re]),{storageKeys:Wt,isLoading:Hr,error:Eo,refresh:jr}=nc(e),N=Le(()=>[...$r,...Io,...Wt],[$r,Io,Wt]),Se=Le(()=>{if(!I)return null;let s=jo(I);return N.find(m=>jo(m)===s)??I},[I,N]),Ro=Nr||To||Hr,Ur=qr||Sr||Eo,Ce=Qe(()=>{Lt(),Xt(),jr()},[Lt,Xt,jr]),Xe=Qe(s=>s.instanceId?`${s.storageType}-${s.instanceId}-${s.key}`:`${s.storageType}-${s.key}`,[]),Vo=Qe(()=>{br(s=>(s&&Tt(new Set),!s))},[]),et=Qe((s,m)=>{let U=Xe(s);Tt(Z=>{let Ge=new Set(Z);return m?Ge.add(U):Ge.delete(U),Ge})},[Xe]),Bo=Qe(()=>{Tt(new Set),br(false),Ce()},[Ce]),wr=Qe(s=>{s.forEach(m=>n?.(m.key)),Tt(new Set),br(false)},[n]),_t=Qe(async(s,m)=>{if(!C)throw ve(true),new Error("Editing storage values is a Pro feature.");await wa(s,m,ke),Ce(),hr(U=>U+1)},[C,ke,Ce]),Ao=Qe(s=>{_t(s,JSON.stringify(!s.value)).catch(m=>{xe.alert("Couldn't save",m instanceof Error?m.message:String(m))})},[_t]),Jr=Qe((s,m)=>{if(!C){ve(true);return}xe.alert("Delete key",`Delete "${s.key}"? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Delete",style:"destructive",onPress:async()=>{try{await va([s],ke.map(U=>({id:U.id,instance:U.instance}))),Ce(),m?.()}catch(U){xe.alert("Error",`Failed to delete key: ${U}`)}}}])},[C,ke,Ce]),kr=Qe(s=>nn(s,ke),[ke]),Do=Le(()=>{let s=N,m={valid:s.filter(J=>J.status==="required_present"||J.status==="optional_present").length,missing:s.filter(J=>J.status==="required_missing").length,issues:s.filter(J=>J.status==="required_wrong_value"||J.status==="required_wrong_type").length,total:s.length},U=s.filter(J=>J.storageType==="async"),Z=s.filter(J=>J.storageType==="mmkv"),Ge=s.filter(J=>J.storageType==="secure");return{summary:{valid:m.valid,missing:m.missing,issues:m.issues,total:m.total,timestamp:new Date().toISOString()},asyncStorage:U.reduce((J,Ee)=>(J[Ee.key]=Ee.value,J),{}),mmkv:Z.reduce((J,Ee)=>{let It=Ee.instanceId||"default";return J[It]||(J[It]={}),J[It][Ee.key]=Ee.value,J},{}),secure:Ge.reduce((J,Ee)=>(J[Ee.key]=Ee.value,J),{})}},[N]);or(()=>{i&&(i.current=N)},[N,i]),or(()=>{let s,m=aa(U=>{clearTimeout(s),s=setTimeout(()=>{Lt()},100)});return()=>{clearTimeout(s),m()}},[Lt]),or(()=>{let s,m=Ac(()=>{clearTimeout(s),s=setTimeout(Ce,100)});return()=>{clearTimeout(s),m()}},[Ce]),or(()=>{let s,m=Rn(U=>{(re===null||U.instanceId===re)&&(clearTimeout(s),s=setTimeout(()=>{Xt()},100))});return()=>{clearTimeout(s),m()}},[Xt,re]);let $t=Le(()=>{let s=N,m=s.filter(Z=>!ze(Z.key)),U=s.filter(Z=>ze(Z.key));return{totalCount:s.length,requiredCount:m.filter(Z=>Z.category==="required").length,missingCount:m.filter(Z=>Z.status==="required_missing").length,wrongValueCount:m.filter(Z=>Z.status==="required_wrong_value").length,wrongTypeCount:m.filter(Z=>Z.status==="required_wrong_type").length,presentRequiredCount:m.filter(Z=>Z.status==="required_present").length,optionalCount:m.filter(Z=>Z.category==="optional").length,mmkvCount:s.filter(Z=>Z.storageType==="mmkv").length,asyncCount:s.filter(Z=>Z.storageType==="async").length,secureCount:s.filter(Z=>Z.storageType==="secure").length,devToolsCount:U.length}},[N]),dt=Le(()=>{let s=N.filter(B=>!ze(B.key));ue!=="all"&&(s=s.filter(B=>B.storageType===ue));let m=s.filter(B=>B.status==="required_present"||B.status==="optional_present").length,U=s.filter(B=>B.status==="required_missing").length,Z=s.filter(B=>B.status==="required_wrong_type"||B.status==="required_wrong_value").length,Ge=0,J=0,Ee=0,It=0;return ie==="all"?(Ge=N.filter(B=>!ze(B.key)&&B.storageType==="async"&&(B.status==="required_present"||B.status==="optional_present")).length,J=N.filter(B=>!ze(B.key)&&B.storageType==="mmkv"&&(B.status==="required_present"||B.status==="optional_present")).length,Ee=N.filter(B=>!ze(B.key)&&B.storageType==="secure"&&(B.status==="required_present"||B.status==="optional_present")).length,It=Ge+J+Ee):ie==="missing"?(Ge=N.filter(B=>!ze(B.key)&&B.storageType==="async"&&B.status==="required_missing").length,J=N.filter(B=>!ze(B.key)&&B.storageType==="mmkv"&&B.status==="required_missing").length,Ee=N.filter(B=>!ze(B.key)&&B.storageType==="secure"&&B.status==="required_missing").length,It=Ge+J+Ee):ie==="issues"&&(Ge=N.filter(B=>!ze(B.key)&&B.storageType==="async"&&(B.status==="required_wrong_type"||B.status==="required_wrong_value")).length,J=N.filter(B=>!ze(B.key)&&B.storageType==="mmkv"&&(B.status==="required_wrong_type"||B.status==="required_wrong_value")).length,Ee=N.filter(B=>!ze(B.key)&&B.storageType==="secure"&&(B.status==="required_wrong_type"||B.status==="required_wrong_value")).length,It=Ge+J+Ee),{validCount:m,missingCount:U,issuesCount:Z,asyncCount:Ge,mmkvCount:J,secureCount:Ee,totalCount:It}},[N,ie,ue]);or(()=>{x?.({validCount:dt.validCount,missingCount:dt.missingCount,issuesCount:dt.issuesCount})},[x,dt.validCount,dt.missingCount,dt.issuesCount]);let er=Le(()=>[...N].sort((s,m)=>{let U={required_missing:1,required_wrong_type:2,required_wrong_value:3,required_present:4,optional_present:5};return(U[s.status]||999)-(U[m.status]||999)}),[N]),vn=Le(()=>Array.from(new Set(N.map(s=>s.key))).sort(),[N]),Me=Le(()=>{let s=er;if(g&&g.size>0&&(s=s.filter(m=>g.has(m.storageType))),s=s.filter(m=>!Array.from(r).some(U=>m.key.includes(U))),a){let m=a.toLowerCase();s=s.filter(U=>U.key.toLowerCase().includes(m))}switch(ie){case"all":s=s.filter(m=>m.status==="required_present"||m.status==="optional_present");break;case"missing":s=s.filter(m=>m.status==="required_missing");break;case"issues":s=s.filter(m=>m.status==="required_wrong_type"||m.status==="required_wrong_value");break}if(ue!=="all"&&(s=s.filter(m=>m.storageType===ue)),h&&h.size>0){let m=s.filter(Z=>h.has(Z.key)),U=s.filter(Z=>!h.has(Z.key));s=[...m,...U]}return s},[er,ie,ue,r,a,re,g,h]),v=Le(()=>Me.slice(0,R),[Me,R]),k=Le(()=>Math.max(0,Me.length-R),[Me.length,R]),P=k>0,j=Le(()=>{let s=Me.filter(m=>!ze(m.key));return{totalCount:Me.length,requiredCount:s.filter(m=>m.category==="required").length,missingCount:s.filter(m=>m.status==="required_missing").length,wrongValueCount:s.filter(m=>m.status==="required_wrong_value").length,wrongTypeCount:s.filter(m=>m.status==="required_wrong_type").length,presentRequiredCount:s.filter(m=>m.status==="required_present").length,optionalCount:s.filter(m=>m.category==="optional").length,mmkvCount:Me.filter(m=>m.storageType==="mmkv").length,asyncCount:Me.filter(m=>m.storageType==="async").length,secureCount:Me.filter(m=>m.storageType==="secure").length,devToolsCount:Me.filter(m=>ze(m.key)).length}},[Me]),Je=Le(()=>v.filter(s=>Zt.has(Xe(s))),[v,Zt,Xe]),Cr=Qe(()=>{let s=new Set(v.map(Xe));Tt(s)},[v,Xe]),xr=Qe(()=>{Tt(new Set)},[]),Tr=$t.requiredCount>0?Math.round($t.presentRequiredCount/$t.requiredCount*100):$t.totalCount>0?100:0,di=Tr>=90?"OPTIMAL":Tr>=70?"WARNING":"CRITICAL",ui=Tr>=90?dr.success:Tr>=70?dr.warning:dr.error;if(Se)return q(l,{style:O.root,children:q(Os,{storageKey:Se,editBlockedReason:kr(Se),eventCount:u?.[Se.key],onSave:s=>_t(Se,s),onViewHistory:y?()=>y(Se.key):void 0,onDeleteKey:s=>Jr(s,()=>D?.()),onHideKey:s=>{wr([s]),D?.()},isPinned:h?.has(Se.key)??false,onTogglePin:b,applySafeAreaInset:T})});if(Ro&&N.length===0)return Te(l,{style:O.emptyState,children:[q(Wn,{size:48,color:L.color.textTertiary}),q(c,{style:O.emptyTitle,children:"Loading storage keys..."})]});if(Ur)return Te(l,{style:O.emptyState,children:[q(Wn,{size:48,color:dr.error}),q(c,{style:[O.emptyTitle,{color:dr.error}],children:"Error loading storage"}),q(c,{style:O.emptySubtitle,children:Ur.message})]});let yi=Te(Fc,{children:[ue==="mmkv"&&ke.length===0&&Te(l,{style:O.emptyMMKVState,children:[q(c,{style:O.emptyMMKVTitle,children:"No MMKV Instances Detected"}),q(c,{style:O.emptyMMKVSubtitle,children:"MMKV instances must be registered with registerMMKVInstance()"}),q(c,{style:O.emptyMMKVCode,children:`import { registerMMKVInstance } from '@buoy-gg/storage';
2
2
 
3
3
  const storage = createMMKV();
4
- registerMMKVInstance('mmkv.default', storage);`})]}),ue==="mmkv"&&ke.length>0&&Te(l,{style:O.instanceNavbar,children:[Te(l,{style:O.instanceNavbarHeader,children:[q(c,{style:O.instanceNavbarLabel,children:"INSTANCES"}),ke.length>Q&&q(_n,{style:{transform:[{scale:.85}]}})]}),Te(Vr,{horizontal:true,showsHorizontalScrollIndicator:false,contentContainerStyle:O.instanceNavbarScroll,children:[(C||ke.length===1)&&Te(K,{onPress:()=>Kt(null),testID:"buoy-storage-instance-all",accessibilityRole:"button",accessibilityLabel:`All ${le.mmkv} instances`,style:[O.instanceNavbarButton,te===null&&O.instanceNavbarButtonActive],children:[q(Ta,{size:12,color:te===null?L.color.text:L.color.textSecondary}),q(c,{style:[O.instanceNavbarButtonText,te===null&&O.instanceNavbarButtonTextActive],children:"All"}),q(l,{style:O.instanceNavbarBadge,children:q(c,{style:O.instanceNavbarBadgeText,children:ke.reduce((s,m)=>s+m.keyCount,0)})})]}),ke.map((s,m)=>{let U=m>=Q;return Te(K,{testID:`buoy-storage-instance-${s.id}`,accessibilityRole:"button",accessibilityLabel:`MMKV instance ${s.id}`,onPress:()=>{U?ve(true):Kt(s.id)},style:[O.instanceNavbarButton,s.id===te&&O.instanceNavbarButtonActive,{borderColor:U?L.color.border:ur(s.id)+"40",backgroundColor:s.id===te?ur(s.id)+"20":L.color.surfaceElevated,opacity:U?.5:1}],children:[q(Ta,{size:12,color:s.id===te?ur(s.id):L.color.textSecondary}),q(c,{style:[O.instanceNavbarButtonText,s.id===te&&{color:ur(s.id),fontWeight:"700"}],children:s.id}),q(l,{style:[O.instanceNavbarBadge,s.id===te&&{backgroundColor:ur(s.id)+"30"}],children:q(c,{style:[O.instanceNavbarBadgeText,s.id===te&&{color:ur(s.id)}],children:s.keyCount})})]},s.id)})]})]})]}),gi=q(vc,{copyValue:Do,mmkvInstances:ke.map(s=>({id:s.id,instance:s.instance})),activeStorageType:ue,onClearComplete:Ce,isSelectMode:Ot,onToggleSelectMode:Vo,selectedCount:Zt.size}),pi=Ot?q(Bc,{selectedKeys:Je,mmkvInstances:ke.map(s=>({id:s.id,instance:s.instance})),onDeleteComplete:Bo,onHideKeys:wr,onSelectAll:Cr,onClearSelection:xr,totalVisibleKeys:v.length}):null,fi=P?Te(K,{style:O.limitBanner,onPress:()=>ve(true),activeOpacity:.8,testID:"buoy-storage-locked-banner",accessibilityRole:"button",children:[Te(l,{style:O.limitBannerContent,children:[Te(l,{style:O.limitBannerLeft,children:[q(os,{size:16,color:L.color.accent}),q(c,{style:O.limitBannerText,children:a?`${k} matching ${k===1?"key":"keys"} in locked storage`:`${k} keys locked`})]}),q(_n,{})]}),q(c,{style:O.limitBannerSubtext,children:a?"Upgrade to Pro to search your full storage":"Upgrade to Pro to unlock full storage access"})]}):null,mi=(()=>{let s=N.some(U=>!ze(U.key)),m;return a||!s?(m=is({subject:"keys",verb:"registered",search:a,total:s?1:0,waiting:{otto:"empty",title:"No storage keys",message:"Nothing is registered for this tool to read."}}),a&&s&&(m={...m,message:"No keys match. Clear the search to see them."})):ie==="missing"?m={otto:"thumbsup",title:"No missing keys",message:"All required keys are present"}:ie==="issues"?m={otto:"cool",title:"No issues found",message:"All storage keys are correctly configured"}:m={otto:"broken",title:"No valid keys found",message:"All keys have issues or are missing"},q(as,{...m,testID:"buoy-storage-keys-empty"})})(),hi=q(ns,{visible:be,onClose:()=>ve(false),featureName:"Storage Keys"});return Te(l,{style:O.root,children:[Ft>0?q(dc,{onDone:()=>hr(0)},Ft):null,Te(Vr,{testID:"buoy-storage-scroll",ref:Ue,onScroll:s=>{mr.current=s.nativeEvent.contentOffset.y},scrollEventThrottle:32,style:O.scrollContainer,contentContainerStyle:O.container,showsVerticalScrollIndicator:false,children:[q(l,{style:O.backgroundGrid}),q(qs,{stats:$t,tabStats:dt,healthPercentage:Tr,healthStatus:di,healthColor:ui,activeFilter:ie,onFilterChange:He,activeStorageType:ue,onStorageTypeChange:Qt,showStatus:!ee}),yi,Me.length>0?Te(l,{style:O.keysSection,children:[Te(l,{style:O.sectionHeader,children:[Te(l,{style:O.sectionHeaderLeft,children:[Te(c,{style:O.sectionTitle,children:[ie==="all"?"KEYS":ie==="missing"?"MISSING KEYS":"ISSUES TO FIX",ue!=="all"&&` (${ue.toUpperCase()})`]}),q(l,{style:O.countBadge,children:q(c,{style:O.countText,children:v.length})})]}),gi]}),pi,q(Yn,{title:"",count:-1,keys:v,emptyMessage:"",isSelectMode:Ot,selectedKeys:Zt,onSelectionChange:et,eventCountByKey:u,onViewHistory:y,onHideKey:s=>wr([s]),onToggleKey:Ao,onDeleteKey:Jr,editBlockedFor:kr,pinnedKeys:h,onTogglePin:b,onRowRef:ct,onOpenKey:E}),fi]}):mi,q(c,{style:O.techFooter,children:"ASYNC STORAGE | MMKV | SECURE STORAGE BACKENDS"}),hi]})]})}var O=ge.create({root:{flex:1,minHeight:0},editorOverlay:{...On,zIndex:10},scrollContainer:{flex:1,backgroundColor:"transparent"},container:{padding:12,paddingBottom:120},backgroundGrid:{...On,opacity:.006,backgroundColor:dr.info},techFooter:{fontSize:8,color:L.color.textTertiary,fontFamily:Br,textAlign:"center",marginTop:20,letterSpacing:1,opacity:.5},keysSection:{marginTop:8,backgroundColor:L.color.bg,borderRadius:12,padding:12,borderWidth:1,borderColor:L.color.border},sectionHeader:{flexDirection:"row",justifyContent:"space-between",alignItems:"center",marginBottom:10,paddingBottom:6,borderBottomWidth:1,borderBottomColor:L.color.separator},sectionHeaderLeft:{flexDirection:"row",alignItems:"center",gap:8},sectionTitle:{fontSize:12,fontWeight:"600",color:L.color.textSecondary,letterSpacing:.4,textTransform:"uppercase"},countBadge:{backgroundColor:L.color.surfaceElevated,paddingHorizontal:8,paddingVertical:3,borderRadius:6,borderWidth:1,borderColor:L.color.border},countText:{fontSize:11,fontWeight:"600",color:L.color.text,fontFamily:Br},emptyState:{alignItems:"center",justifyContent:"center",paddingVertical:48},emptyTitle:{fontSize:16,fontWeight:"600",color:L.color.text,marginTop:12,marginBottom:8},emptySubtitle:{fontSize:13,color:L.color.textSecondary,textAlign:"center"},emptyMMKVState:{backgroundColor:L.color.surface,borderRadius:12,padding:20,borderWidth:1,borderColor:L.color.border,marginTop:8,alignItems:"center"},emptyMMKVTitle:{fontSize:14,fontWeight:"600",color:L.color.text,marginBottom:6},emptyMMKVSubtitle:{fontSize:12,color:L.color.textSecondary,textAlign:"center",marginBottom:12},emptyMMKVCode:{fontSize:10,fontFamily:Br,color:L.color.accent,backgroundColor:L.color.bg,padding:12,borderRadius:8,borderWidth:1,borderColor:L.color.border,alignSelf:"stretch"},instanceNavbar:{marginTop:12,marginBottom:8,backgroundColor:L.color.surface,borderRadius:10,borderWidth:1,borderColor:L.color.border,padding:10,shadowColor:"#000",shadowOpacity:.08,shadowRadius:6,shadowOffset:{width:0,height:2}},instanceNavbarHeader:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginBottom:8,paddingLeft:2},instanceNavbarLabel:{fontSize:9,fontWeight:"700",color:L.color.textTertiary,textTransform:"uppercase",letterSpacing:1},instanceNavbarScroll:{gap:8,paddingRight:8},instanceNavbarButton:{flexDirection:"row",alignItems:"center",gap:6,paddingHorizontal:12,paddingVertical:8,backgroundColor:L.color.surfaceElevated,borderRadius:8,borderWidth:1,borderColor:L.color.border,minWidth:90},instanceNavbarButtonActive:{borderWidth:1.5,shadowColor:"#000",shadowOpacity:.1,shadowRadius:4,shadowOffset:{width:0,height:1}},instanceNavbarButtonText:{fontSize:11,fontWeight:"600",color:L.color.textSecondary,fontFamily:Br,flex:1},instanceNavbarButtonTextActive:{fontWeight:"700",color:L.color.text},instanceNavbarBadge:{backgroundColor:L.color.bg,paddingHorizontal:6,paddingVertical:2,borderRadius:6,minWidth:24,alignItems:"center"},instanceNavbarBadgeText:{fontSize:10,fontWeight:"700",color:L.color.textSecondary,fontFamily:Br},clearSearchButton:{marginTop:16,paddingHorizontal:16,paddingVertical:8,backgroundColor:L.color.surfaceElevated,borderRadius:6,borderWidth:1,borderColor:L.color.border},clearSearchText:{fontSize:13,color:L.color.text,fontWeight:"500"},limitBanner:{backgroundColor:L.color.surface,borderRadius:10,borderWidth:1,borderColor:L.color.accentBorderStrong,padding:12,marginTop:12},limitBannerContent:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginBottom:4},limitBannerLeft:{flexDirection:"row",alignItems:"center",gap:8},limitBannerText:{color:L.color.text,fontSize:13,fontWeight:"600"},limitBannerSubtext:{color:L.color.textTertiary,fontSize:11}});import{jsx as Lc}from"react/jsx-runtime";function Ea({requiredStorageKeys:e=[],showFilters:t=false,ignoredPatterns:r=new Set,onTogglePattern:o,onAddPattern:n,searchQuery:a="",storageDataRef:i,eventCountByKey:u,lastWriteByKey:d,onViewHistory:y,enabledStorageTypes:g,statusFilter:p,onStatusFilterChange:f,onStatusCountsChange:x,pinnedKeys:h,onTogglePin:b,applySafeAreaInset:S,storageTypeFilter:w,onStorageTypeFilterChange:T,detailKey:I,onOpenKey:E,onCloseDetail:D}){return Lc(Oc,{requiredStorageKeys:e,showFilters:t,ignoredPatterns:r,onTogglePattern:o,onAddPattern:n,searchQuery:a,storageDataRef:i,eventCountByKey:u,lastWriteByKey:d,onViewHistory:y,enabledStorageTypes:g,statusFilter:p,onStatusFilterChange:f,onStatusCountsChange:x,pinnedKeys:h,onTogglePin:b,applySafeAreaInset:S,storageTypeFilter:w,onStorageTypeFilterChange:T,detailKey:I,onOpenKey:E,onCloseDetail:D})}import{ProFeatureBanner as Wc}from"@buoy-gg/shared-ui/web";V();import{useMemo as _c}from"react";import{useEventStoreEvents as $c}from"@buoy-gg/shared-ui/web";V();import{BaseEventStore as Nc}from"@buoy-gg/shared-ui/web";function Kr(e){return!!e&&typeof e=="object"&&e.__buoyValueOnDevice===true}function co(e){return e.storageType!=="async"||!e.data?{}:{pairs:e.data.pairs,prevPairs:e.data.prevPairs}}function Ra(e){let t=e.data;if(!t)return false;let{pairs:r,prevPairs:o}=co(e);return Kr(t.value)||Kr(t.prevValue)||Kr(r)||Kr(o)}var qc=0;function uo(){return`se-${Date.now()}-${++qc}`}var Hc=class extends Nc{constructor(){super({storeName:"storage",maxEvents:500});this.asyncStorageUnsubscribe=null;this.mmkvUnsubscribe=null;this.hasScannedInitialState=false}async scanExistingState(){if(this.hasScannedInitialState)return;this.hasScannedInitialState=true;let e=new Date,t=Pe.getAll();for(let{id:r,instance:o}of t)try{let n=o.getAllKeys();for(let a of n){let{value:i,type:u}=ht(o,a),d={string:"set.string",number:"set.number",boolean:"set.boolean",buffer:"set.buffer"}[u]??"set.string";this.addEvent({action:d,timestamp:e,instanceId:r,data:{key:a,value:i,valueType:u,initialScan:true},storageType:"mmkv",id:uo()})}}catch{}try{let{asyncStorage:r,readMany:o}=(Nt(),ki(kn));if(r){let n=await r.getAllKeys();if(n.length>0){let a=await o(n);for(let[i,u]of a)this.addEvent({action:"setItem",timestamp:e,data:{key:i,value:u??void 0,initialScan:true},storageType:"async",id:uo()})}}}catch{}}async startCapturing(){Xs()||await Zs(),this.asyncStorageUnsubscribe||(this.asyncStorageUnsubscribe=aa(e=>{let t={...e,storageType:"async",id:uo()};this.addEvent(t)})),this.mmkvUnsubscribe||(this.mmkvUnsubscribe=Rn(e=>{let t={...e,storageType:"mmkv",id:uo()};this.addEvent(t)})),await this.scanExistingState()}stopCapturing(){this.asyncStorageUnsubscribe&&(this.asyncStorageUnsubscribe(),this.asyncStorageUnsubscribe=null),this.mmkvUnsubscribe&&(this.mmkvUnsubscribe(),this.mmkvUnsubscribe=null)}isCapturing(){return this.asyncStorageUnsubscribe!==null||this.mmkvUnsubscribe!==null}getEventsByType(e){return this.events.filter(t=>t.storageType===e)}replaceEvents(e){let t=new Map;for(let o of this.events)Ra(o)||t.set(o.id,o);let r=e.map(o=>{let n=t.get(o.id);return!n||!Ra(o)?o:{...o,data:{...o.data,value:n.data?.value,prevValue:n.data?.prevValue,...co(n)}}});super.replaceEvents(r)}hydrateEvent(e){let t=this.events.findIndex(n=>n.id===e.id);if(t===-1)return;let r=this.events[t],o=this.events.slice();o[t]={...r,...e,timestamp:r.timestamp,data:{...r.data,...e.data}},super.replaceEvents(o)}},Dt=new Hc;function Va(e={}){let{storageType:t="all",maxEvents:r=500,enabled:o=true}=e,n=_c(()=>t==="all"?void 0:d=>d.filter(y=>y.storageType===t),[t]),{events:a,clearEvents:i,isActive:u}=$c(Dt,{maxEvents:r,enabled:o,select:n});return{events:a,clearEvents:i,isCapturing:u}}V();import{useState as yo,useCallback as it,useMemo as Mt,useEffect as Ba,useRef as jc}from"react";import Aa from"@buoy-gg/shared-ui/web/asyncStorage";import{formatRelativeTime as go,macOSColors as po,night as Jt,parseValue as fo,devToolsStorageKeys as Da,GitBranch as Uc,EventStepperFooter as Jc,EventHistoryViewer as Gc,copyToClipboard as Yc,ProUpgradeModal as Qc,monoFont as Ma}from"@buoy-gg/shared-ui/web";import{useIsPro as Zc}from"@buoy-gg/license/web";V();import{computeLineDiff as Ky,DiffType as Fy,ABSENT_VALUE as Xc,isAbsent as Oy}from"@buoy-gg/shared-ui/web/dataViewer";V();import{ThemedSplitView as ed}from"@buoy-gg/shared-ui/web/dataViewer";V();import{diffThemes as td,gitClassicTheme as _y,devToolsDefaultTheme as $y}from"@buoy-gg/shared-ui/web/dataViewer";V();import{night as Pa}from"@buoy-gg/shared-ui/web";import{TreeDiffViewer as rd}from"@buoy-gg/shared-ui/web/dataViewer";import{jsx as za}from"react/jsx-runtime";function od({oldValue:e,newValue:t,scrollEnabled:r=true}){return za(l,{style:r?Ka.container:Ka.containerInline,children:za(rd,{oldValue:e,newValue:t,theme:"dark",scrollEnabled:r})})}var Ka=ge.create({container:{flex:1,backgroundColor:Pa.color.bg},containerInline:{backgroundColor:Pa.color.bg}});V();function an(e){switch(e){case"setItem":return"SET";case"removeItem":return"REMOVE";case"mergeItem":return"MERGE";case"clear":return"CLEAR";case"multiSet":return"MULTI SET";case"multiRemove":return"MULTI REMOVE";case"multiMerge":return"MULTI MERGE";case"set.string":case"set.number":case"set.boolean":case"set.buffer":return"SET";case"delete":return"REMOVE";case"clearAll":return"CLEAR";case"get.string":case"get.number":case"get.boolean":case"get.buffer":return"GET";default:return"UNKNOWN ACTION"}}V();import{night as Ie,Lock as nd,monoFont as ad}from"@buoy-gg/shared-ui/web";import{jsx as ln,jsxs as id}from"react/jsx-runtime";var ld={copy:{color:Ie.color.accent,backgroundColor:Ie.color.accentSoft,borderColor:Ie.color.accentBorderStrong,textColor:Ie.color.accent},jump:{color:Ie.color.warning,backgroundColor:Ie.color.warningSoft,borderColor:Ie.color.warning+"40",textColor:Ie.color.warning},undo:{color:Ie.color.info,backgroundColor:Ie.color.infoSoft,borderColor:Ie.color.info+"40",textColor:Ie.color.info}};function sn({onPress:e,text:t,type:r,disabled:o=false,locked:n=false}){let a=ld[r],i=o||n;return id(K,{disabled:i,onPress:e,style:[mo.button,{backgroundColor:i?Ie.color.fill:a.backgroundColor,borderColor:i?Ie.color.fillTertiary:a.borderColor,opacity:o?.5:1}],activeOpacity:.7,testID:`buoy-storage-action-${r}`,accessibilityRole:"button",accessibilityLabel:t,accessibilityState:{disabled:i},children:[n?ln(nd,{size:10,color:Ie.color.textTertiary,style:mo.lockIcon}):ln(l,{style:[mo.dot,{backgroundColor:i?Ie.color.textTertiary:a.color}]}),ln(c,{style:[mo.text,{color:i?Ie.color.textTertiary:a.textColor}],children:t})]})}var mo=ge.create({button:{flexDirection:"row",alignItems:"center",justifyContent:"center",borderRadius:6,borderWidth:1,paddingHorizontal:12,paddingVertical:6,height:25,minWidth:70,shadowOffset:{width:0,height:1},shadowOpacity:.2,shadowRadius:2,elevation:2},dot:{width:5,height:5,borderRadius:3,marginRight:6,shadowColor:Ie.color.text,shadowOffset:{width:0,height:0},shadowOpacity:.6,shadowRadius:2},lockIcon:{marginRight:4},text:{fontSize:10,fontWeight:"600",letterSpacing:.5,textTransform:"uppercase",fontFamily:ad,height:12}});V();Nt();import{isDevToolsStorageKey as sd}from"@buoy-gg/shared-ui/web";import yr from"@buoy-gg/shared-ui/web/asyncStorage";function Pt(e){return!!e&&typeof e=="object"&&e.__buoyValueOnDevice===true}async function cn(e){let{action:t,data:r}=e;if(Pt(r?.prevValue)||Pt(r?.prevPairs))throw new Error("Cannot undo: previous value is still on the device \u2014 fetch getEventDetail first");switch(t){case"setItem":case"mergeItem":r?.key&&(r.prevValue===null||r.prevValue===void 0?await yr.removeItem(r.key):await yr.setItem(r.key,r.prevValue));break;case"removeItem":r?.key&&r.prevValue!==null&&r.prevValue!==void 0&&await yr.setItem(r.key,r.prevValue);break;case"multiSet":case"multiMerge":if(r?.prevPairs&&r.prevPairs.length>0)for(let[o,n]of r.prevPairs)n===null?await yr.removeItem(o):await yr.setItem(o,n);break;case"multiRemove":if(r?.prevPairs&&r.prevPairs.length>0)for(let[o,n]of r.prevPairs)n!==null&&await yr.setItem(o,n);break;case"clear":if(r?.prevPairs&&r.prevPairs.length>0){let o=r.prevPairs.filter(([,n])=>n!==null);o.length>0&&await Ir(o)}break;default:throw new Error(`Cannot undo unknown action type: ${t}`)}}async function dn(e,t){if(t<0||t>=e.length)throw new Error(`Invalid event index: ${t}`);for(let i of e){let u=i.data;if(Pt(u?.value)||Pt(u?.prevValue)||Pt(u?.pairs)||Pt(u?.prevPairs))throw new Error("Cannot jump: some event values are still on the device \u2014 fetch getEventDetail first")}let r=new Map;for(let i=0;i<=t;i++)dd(e[i],r);let o=new Set;for(let i of e)cd(i,o);let n=[],a=[];for(let i of o){if(sd(i))continue;let u=r.get(i);u==null?a.push(i):n.push([i,u])}a.length>0&&await tr(a),n.length>0&&await Ir(n)}function cd(e,t){let{data:r}=e;if(r){if(r.key&&t.add(r.key),r.keys)for(let o of r.keys)t.add(o);if(r.pairs)for(let[o]of r.pairs)t.add(o);if(r.prevPairs)for(let[o]of r.prevPairs)t.add(o)}}function dd(e,t){let{action:r,data:o}=e;switch(r){case"setItem":o?.key&&o?.value!==void 0&&t.set(o.key,o.value);break;case"removeItem":o?.key&&t.set(o.key,null);break;case"mergeItem":if(o?.key&&o?.value!==void 0){let n=t.get(o.key);if(n)try{let a=JSON.parse(n),i=JSON.parse(o.value),u={...a,...i};t.set(o.key,JSON.stringify(u))}catch{t.set(o.key,o.value)}else t.set(o.key,o.value)}break;case"multiSet":if(o?.pairs)for(let[n,a]of o.pairs)t.set(n,a);break;case"multiRemove":if(o?.keys)for(let n of o.keys)t.set(n,null);break;case"multiMerge":if(o?.pairs)for(let[n,a]of o.pairs){let i=t.get(n);if(i)try{let u=JSON.parse(i),d=JSON.parse(a),y={...u,...d};t.set(n,JSON.stringify(y))}catch{t.set(n,a)}else t.set(n,a)}break;case"clear":t.clear();break}}function un(e){let{action:t,data:r}=e;switch(t){case"setItem":case"mergeItem":case"removeItem":return!!r?.key&&!Pt(r.prevValue);case"multiSet":case"multiRemove":case"multiMerge":case"clear":return!!r?.prevPairs&&r.prevPairs.length>0&&!Pt(r.prevPairs);default:return false}}import{Fragment as ud,jsx as Ne,jsxs as Fa}from"react/jsx-runtime";var gr=-1,ho={prior:{label:"BEFORE #1",timestamp:"value before first event",relativeTime:"not captured",badge:"PRIOR"},absent:{label:"NO PRIOR VALUE",timestamp:"key did not exist",relativeTime:"created here",badge:"ABSENT"},scanned:{label:"ALREADY PRESENT",timestamp:"value found at startup",relativeTime:"not a write",badge:"SCANNED"}};function bo(e){switch(e){case"setItem":case"multiSet":return po.semantic.success;case"removeItem":case"multiRemove":case"clear":return po.semantic.error;case"mergeItem":case"multiMerge":return po.semantic.info;default:return po.text.muted}}function Oa(e){let t=String(e.getHours()).padStart(2,"0"),r=String(e.getMinutes()).padStart(2,"0"),o=String(e.getSeconds()).padStart(2,"0"),n=String(e.getMilliseconds()).padStart(3,"0");return`${t}:${r}:${o}.${n}`}var yd={hideLineNumbers:false,disableWordDiff:false,showDiffOnly:false,compareMethod:"words",contextLines:3,lineOffset:0},gd=[];function yn({conversation:e,selectedEventIndex:t=0,onEventIndexChange:r=()=>{},disableInternalFooter:o=false}){let n=Zc(),[a,i]=yo(false),[u,d]=yo("split"),[y,g]=yo(Math.max(gr,t-1)),[p,f]=yo(t),x=jc(false),h=Mt(()=>e.events.sort((oe,ct)=>oe.timestamp.getTime()-ct.timestamp.getTime()),[e.events]),b=h.length;Ba(()=>{if(x.current)return;(async()=>{try{let oe=await Aa.getItem(Da.storage.diffViewerMode());(oe==="split"||oe==="tree")&&d(oe),x.current=true}catch{}})()},[]),Ba(()=>{let oe=Math.min(b-1,Math.max(0,t)),ct=Math.max(gr,Math.min(oe-1,t-1));g(ct),f(oe)},[t,b]);let S=it(async oe=>{d(oe);try{await Aa.setItem(Da.storage.diffViewerMode(),oe)}catch{}},[]),w=h[t],T=w?.action,I=y===gr,E=I?void 0:h[Math.max(0,Math.min(b-1,y))],D=h[Math.max(0,Math.min(b-1,p))],C=Mt(()=>{let oe=D?.data;return oe?.initialScan?"scanned":oe?.prevValue===null||oe?.prevValue===void 0?"absent":"prior"},[D]),R=Mt(()=>C==="absent"?Xc:C==="scanned"?fo(D?.data?.value):fo(D?.data?.prevValue),[C,D]),Q=Mt(()=>I?{index:gr,label:ho[C].label,timestamp:ho[C].timestamp,relativeTime:ho[C].relativeTime,badge:Ne(l,{style:[Gt.actionBadgeSmall,{backgroundColor:`${Jt.color.textTertiary}20`}],children:Ne(c,{style:[Gt.actionTextSmall,{color:Jt.color.textTertiary}],children:ho[C].badge})})}:{index:y,label:`#${y+1} / ${b}`,timestamp:E?Oa(E.timestamp):"",relativeTime:E?go(E.timestamp):"",badge:E?Ne(l,{style:[Gt.actionBadgeSmall,{backgroundColor:`${bo(E.action)}20`}],children:Ne(c,{style:[Gt.actionTextSmall,{color:bo(E.action)}],children:an(E.action)})}):void 0},[y,E,b,I,C]),be=Mt(()=>({index:p,label:`#${p+1} / ${b}`,timestamp:D?Oa(D.timestamp):"",relativeTime:D?go(D.timestamp):"",badge:D?Ne(l,{style:[Gt.actionBadgeSmall,{backgroundColor:`${bo(D.action)}20`}],children:Ne(c,{style:[Gt.actionTextSmall,{color:bo(D.action)}],children:an(D.action)})}):void 0}),[p,D,b]),ve=Mt(()=>[{key:"tree",label:"TREE VIEW"},{key:"split",label:"SPLIT VIEW"}],[]),H=it(()=>{y>gr&&g(y-1)},[y]),de=it(()=>{y<p-1&&g(y+1)},[y,p]),ee=it(()=>{p>y+1&&f(p-1)},[p,y]),ie=it(()=>{p<b-1&&f(p+1)},[p,b]),He=Mt(()=>I?R:fo(E?.data?.value??null),[I,R,E]),je=Mt(()=>fo(D?.data?.value),[D]),ft=it(()=>u==="split"?Ne(ed,{oldValue:He,newValue:je,differences:gd,theme:td.devToolsDefault,options:yd,showThemeName:false,scrollEnabled:false}):Ne(od,{oldValue:He,newValue:je,scrollEnabled:false}),[He,je,u]),xt=it(()=>{r(Math.max(0,t-1))},[t,r]),ue=it(()=>{r(Math.min(b-1,t+1))},[t,b,r]),Qt=it(async()=>{if(!n){i(true);return}if(!(!w||w.storageType==="mmkv"))try{await cn(w)}catch{}},[w,n]),te=it(async()=>{if(!n){i(true);return}if(!w||w.storageType==="mmkv")return;let oe=h.filter(Ft=>Ft.storageType!=="mmkv"),ct=oe.findIndex(Ft=>Ft.timestamp.getTime()===w.timestamp.getTime());if(ct!==-1)try{await dn(oe,ct)}catch{}},[w,h,n]),Kt=it(async()=>{if(!w)return;let oe={action:w.action,timestamp:w.timestamp.toISOString(),data:w.data};await Yc(oe)},[w]),Ue=w?.storageType!=="mmkv",mr=Ue&&w&&un(w);return Fa(ud,{children:[Ue&&Fa(l,{style:Gt.actionButtonsContainer,children:[Ne(sn,{type:"undo",text:"UNDO",onPress:Qt,disabled:!mr,locked:!n}),Ne(sn,{type:"jump",text:"JUMP",onPress:te,locked:!n}),Ne(sn,{type:"copy",text:"COPY",onPress:Kt})]}),Ne(Gc,{activeView:"diff",diffViewLabel:"DIFF VIEW",diffViewDescription:"Compare changes between versions",diffViewIcon:Uc,diffModeTabs:ve,activeDiffMode:u,onDiffModeChange:S,renderDiffContent:ft,scrollDiffSection:true,leftEvent:Q,rightEvent:be,showCompareNavigation:true,onLeftPrevious:H,onLeftNext:de,onRightPrevious:ee,onRightNext:ie,canLeftPrevious:y>gr,canLeftNext:y<p-1,canRightPrevious:p>y+1,canRightNext:p<b-1,disableInternalFooter:o,footerCurrentIndex:t,footerTotalItems:b,footerItemLabel:"Event",footerSubtitle:go(w?.timestamp),onFooterPrevious:xt,onFooterNext:ue}),Ne(Qc,{visible:a,onClose:()=>i(false),featureName:"Storage Time-Travel"})]})}function gn({conversation:e,selectedEventIndex:t=0,onEventIndexChange:r=()=>{},applySafeAreaInset:o=true}){let n=e.events.sort((i,u)=>i.timestamp.getTime()-u.timestamp.getTime()),a=n.length;return Ne(Jc,{currentIndex:t,totalItems:a,onPrevious:()=>r(Math.max(0,t-1)),onNext:()=>r(Math.min(a-1,t+1)),itemLabel:"Event",subtitle:go(n[t]?.timestamp),applySafeAreaInset:o})}var Gt=ge.create({actionButtonsContainer:{flexDirection:"row",justifyContent:"center",alignItems:"center",gap:8,paddingHorizontal:12,paddingVertical:10,backgroundColor:Jt.color.surface,borderBottomWidth:1,borderBottomColor:Jt.color.border},valueBox:{backgroundColor:Jt.color.bg,borderRadius:6,borderWidth:1,borderColor:Jt.color.border,padding:8},valueText:{fontSize:12,color:Jt.color.text,fontFamily:Ma,lineHeight:18},actionBadgeSmall:{paddingHorizontal:6,paddingVertical:1,borderRadius:3},actionTextSmall:{fontSize:8,fontWeight:"700",fontFamily:Ma}});V();import{Filter as La,DynamicFilterView as pd,Database as fd,HardDrive as md,Shield as hd,macOSColors as St,night as wt}from"@buoy-gg/shared-ui/web";import{jsx as zt,jsxs as pr}from"react/jsx-runtime";function bd({ignoredPatterns:e,onTogglePattern:t,onAddPattern:r,availableKeys:o=[],enabledStorageTypes:n,onToggleStorageType:a}){let i={addFilterSection:{enabled:true,placeholder:"Enter key pattern to hide...",title:"KEY FILTERS",icon:La},availableItemsSection:{enabled:true,title:"AVAILABLE EVENT KEYS",emptyMessage:"No storage event keys available. Events will appear here once captured.",items:o},howItWorksSection:{enabled:true,title:"HOW EVENT FILTERS WORK",description:"Patterns hide matching storage keys from the event list. Storage type toggles control which storage backends are monitored.",examples:["\u2022 react_buoy \u2192 hides keys containing react_buoy","\u2022 @temp \u2192 hides @temp_user, @temp_data","\u2022 redux \u2192 hides redux-persist:root",`\u2022 ${le.asyncFull}: show or hide captured events`,`\u2022 ${le.mmkv}: show or hide captured events`],icon:La},onPatternToggle:t,onPatternAdd:r,activePatterns:e};return pr(l,{style:Ze.container,children:[pr(l,{style:Ze.storageTypeSection,children:[zt(c,{style:Ze.sectionTitle,children:"STORAGE TYPES"}),pr(l,{style:Ze.storageTypeButtons,children:[pr(K,{style:[Ze.storageTypeButton,n.has("async")&&Ze.storageTypeButtonActive,{borderColor:St.semantic.warning+"40"}],onPress:()=>a("async"),testID:"buoy-storage-backend-async",accessibilityRole:"button",accessibilityLabel:`Toggle ${le.asyncFull} capture`,accessibilityState:{selected:n.has("async")},children:[zt(fd,{size:16,color:n.has("async")?St.semantic.warning:wt.color.textTertiary}),zt(c,{style:[Ze.storageTypeButtonText,n.has("async")&&{color:St.semantic.warning}],children:le.asyncFull})]}),pr(K,{style:[Ze.storageTypeButton,n.has("mmkv")&&Ze.storageTypeButtonActive,{borderColor:St.semantic.info+"40"}],onPress:()=>a("mmkv"),testID:"buoy-storage-backend-mmkv",accessibilityRole:"button",accessibilityLabel:`Toggle ${le.mmkv} capture`,accessibilityState:{selected:n.has("mmkv")},children:[zt(md,{size:16,color:n.has("mmkv")?St.semantic.info:wt.color.textTertiary}),zt(c,{style:[Ze.storageTypeButtonText,n.has("mmkv")&&{color:St.semantic.info}],children:le.mmkv})]}),le.hasSecure&&pr(K,{style:[Ze.storageTypeButton,n.has("secure")&&Ze.storageTypeButtonActive,{borderColor:St.semantic.success+"40"}],onPress:()=>a("secure"),testID:"buoy-storage-backend-secure",accessibilityRole:"button",accessibilityLabel:"Toggle Secure Storage capture",accessibilityState:{selected:n.has("secure")},children:[zt(hd,{size:16,color:n.has("secure")?St.semantic.success:wt.color.textTertiary}),zt(c,{style:[Ze.storageTypeButtonText,n.has("secure")&&{color:St.semantic.success}],children:"Secure Storage"})]})]})]}),zt(pd,{...i})]})}var Ze=ge.create({container:{flex:1},storageTypeSection:{padding:16,borderBottomWidth:1,borderBottomColor:wt.color.border},sectionTitle:{fontSize:11,fontWeight:"700",color:wt.color.textSecondary,letterSpacing:.8,marginBottom:12},storageTypeButtons:{flexDirection:"row",gap:8},storageTypeButton:{flex:1,flexDirection:"row",alignItems:"center",justifyContent:"center",gap:6,paddingVertical:10,paddingHorizontal:12,backgroundColor:wt.color.surfaceElevated,borderRadius:8,borderWidth:1,borderColor:wt.color.border},storageTypeButtonActive:{backgroundColor:wt.color.surface},storageTypeButtonText:{fontSize:11,fontWeight:"600",color:wt.color.textTertiary}});V();import{memo as vd}from"react";import{RelativeTime as Sd,macOSColors as Fr,parseValue as wd,CompactRow as kd}from"@buoy-gg/shared-ui/web";import{jsx as Wa}from"react/jsx-runtime";function Cd(e){let t=wd(e);return t===null?"null":t===void 0?"undefined":Array.isArray(t)?"array":typeof t=="boolean"?"boolean":typeof t=="number"?"number":typeof t=="string"?"string":typeof t=="object"?"object":"undefined"}function xd(e){switch(e){case"setItem":case"multiSet":case"set.string":case"set.number":case"set.boolean":case"set.buffer":return Fr.semantic.success;case"removeItem":case"multiRemove":case"clear":case"delete":case"clearAll":return Fr.semantic.error;case"mergeItem":case"multiMerge":return Fr.semantic.info;case"get.string":case"get.number":case"get.boolean":case"get.buffer":return Fr.semantic.warning;default:return Fr.text.muted}}function Td(e,t){return`${Array.from(e).map(r=>r==="async"?le.async:le.mmkv).join("/")} \xB7 ${t} op${t!==1?"s":""}`}var pn=vd(function({data:e,onPress:t,isSelected:r=false,showChevron:o=true,testID:n}){let a=xd(e.lastAction),i=an(e.lastAction),u=e.totalOperations??1;return Wa(kd,{statusDotColor:a,statusLabel:"Storage",statusSublabel:Td(e.storageTypes,u),primaryText:e.key,badgeText:i,badgeColor:a,showChevron:o,bottomRightText:Wa(Sd,{timestamp:e.lastEventTimestamp}),isSelected:r,onPress:t,testID:n,accessibilityLabel:`${i} ${e.key}`})});import{useIsPro as Id}from"@buoy-gg/license/web";import{Fragment as _a,jsx as M,jsxs as lt}from"react/jsx-runtime";var ng=es["storage.events"].free,fn={getItem:e=>Wo.getItem(e),setItem:(e,t)=>Wo.setItem(e,t)},Ed={storage:fn,parse:e=>e==="browser"||e==="events"?e:void 0,serialize:e=>e},Rd={storage:fn,parse:e=>e==="true",serialize:e=>e.toString()},$a={storage:fn,parse:e=>new Set(JSON.parse(e)),serialize:e=>JSON.stringify(Array.from(e))},Vd={...$a,parse:e=>{let t=JSON.parse(e);return t.includes("@react_buoy")||t.push("@react_buoy"),new Set(t)}};function mn({visible:e,onClose:t,onBack:r,onMinimize:o,enableSharedModalDimensions:n=false,requiredStorageKeys:a=[],inline:i=false,onTabChange:u,onRefresh:d,onEventSelect:y}){let g=Id(),p=Xl("storage.events"),[f,x]=Xr(rr.storage.activeTab(),"browser",Ed);Oo(()=>{u?.(f)},[f,u]);let[h,b]=tt(""),[S,w]=tt(null),[T,I]=tt(false),[E,D]=Xr(rr.storage.isMonitoring(),true,Rd),{events:C,clearEvents:R,isCapturing:Q}=Va({enabled:E}),[be,ve]=tt(null),[H,de]=tt(null),[ee,ie]=tt(null),[He,je]=tt(0),[ft,xt]=tt(false),[ue,Qt]=Xr(rr.storage.eventFilters(),new Set(["@react_buoy","@RNAsyncStorage","redux-persist","persist:"]),Vd),[te,Kt]=tt("all"),[Ue,mr]=tt(new Set(["async","mmkv","secure"])),[oe,ct]=Xr(rr.storage.pinnedKeys(),new Set,$a),Ft=Mn(null),hr=E&&Q,[Ot,br]=tt("bottomSheet"),Zt=Be(v=>{br(v)},[]),Tt=Be(()=>{D(v=>!v)},[]),ke=Be(()=>{R(),ve(null),je(0)},[R]),$r=Be(v=>{de(v),ie(null)},[]),Nr=Be(()=>{de(null),ie(null)},[]),qr=Be(v=>{Qt(k=>{let P=new Set(k);return P.has(v)?P.delete(v):P.add(v),P})},[]),Lt=Be(v=>{Qt(k=>new Set([...k,v]))},[]),xo=Be(v=>{ct(k=>{let P=new Set(k);return P.has(v)?P.delete(v):P.add(v),P})},[]),vr=Be(()=>{xt(!ft)},[ft]),To=Be(v=>{mr(k=>{let P=new Set(k);return P.has(v)?P.delete(v):P.add(v),P})},[]),Sr=Mn([]),Xt=Be(()=>{let v=Sr.current;return{timestamp:new Date().toISOString(),totalKeys:v.length,asyncStorage:v.filter(k=>k.storageType==="async").reduce((k,P)=>(k[P.key]=Zr(P.value),k),{}),mmkv:v.filter(k=>k.storageType==="mmkv").reduce((k,P)=>{let j=P.instanceId||"default";return k[j]||(k[j]={}),k[j][P.key]=Zr(P.value),k},{}),secure:v.filter(k=>k.storageType==="secure").reduce((k,P)=>(k[P.key]=Zr(P.value),k),{})}},[]),Io=Be(async()=>{xe.alert("Clear Storage","Choose what to clear:",[{text:"Cancel",style:"cancel"},{text:"Clear App Storage",onPress:async()=>{try{await Qr()}catch{xe.alert("Error","Failed to clear app storage")}}},{text:"Clear All (Including Dev Tools)",style:"destructive",onPress:async()=>{try{await Vi()}catch{xe.alert("Error","Failed to clear all storage")}}}])},[]),Wt=v=>{let k=ql(v);return k===null?"null":k===void 0?"undefined":Array.isArray(k)?"array":typeof k=="boolean"?"boolean":typeof k=="number"?"number":typeof k=="string"?"string":typeof k=="object"?"object":"undefined"},[Hr,Eo]=tt([]);Oo(()=>{e&&(async()=>{try{let v=await Wo.getAllKeys();Eo([...v].sort())}catch{}})()},[e]);let jr=at(()=>{let v=new Set(Hr);return C.forEach(k=>{k.data?.key&&v.add(k.data.key)}),Array.from(v).sort()},[C,Hr]),N=at(()=>{let v=new Map;return C.forEach(k=>{if(!k.data?.key)return;let P=k.data.key;if(!Ue.has(k.storageType)||Array.from(ue).some(Je=>P.includes(Je)))return;let j=v.get(P);j?(j.events.push(k),j.totalOperations++,j.storageTypes.add(k.storageType),k.timestamp>j.lastEvent.timestamp&&(j.lastEvent=k,j.currentValue=k.data.value,j.valueType=Wt(k.data.value))):v.set(P,{key:P,lastEvent:k,events:[k],totalOperations:1,currentValue:k.data.value,valueType:Wt(k.data.value),storageTypes:new Set([k.storageType])})}),Array.from(v.values()).sort((k,P)=>P.lastEvent.timestamp.getTime()-k.lastEvent.timestamp.getTime())},[C,ue,Ue]),Se=at(()=>be&&N.find(v=>v.key===be)||null,[be,N]),Ro=at(()=>{let v={};return N.forEach(k=>{v[k.key]=k.totalOperations}),v},[N]),Ur=at(()=>{let v={};return N.forEach(k=>{v[k.key]=k.lastEvent.timestamp.getTime()}),v},[N]),Ce=at(()=>H&&N.find(v=>v.key===H)||null,[H,N]);Oo(()=>{if(!y)return;let v=Se||(ee!==null?Ce:null),k=Se?He:ee;if(!v||k==null)return;let P=[...v.events].sort((Cr,xr)=>Cr.timestamp.getTime()-xr.timestamp.getTime()),j=P[k],Je=P[k-1];j&&y(j),Je&&y(Je)},[y,Se,He,Ce,ee]);let Xe=at(()=>C.filter(v=>{if(!v.data?.key||!Ue.has(v.storageType))return false;let k=v.data.key;return!Array.from(ue).some(P=>k.includes(P))}),[C,ue,Ue]),Vo=at(()=>ra(Xe),[Xe]),et=at(()=>te==="all"?Xe:Xe.filter(v=>v.storageType===te),[Xe,te]),Bo=Be(()=>et.map(v=>({key:v.data?.key,action:v.action,value:Zr(v.data?.value),storageType:v.storageType,timestamp:v.timestamp.toISOString()})),[et]),wr=at(()=>et.slice(0,p),[et,p]),_t=at(()=>Math.max(0,et.length-p),[et.length,p]),Ao=.8,Jr=Be(v=>v.id,[]),kr=Be(v=>{let k=N.find(j=>j.key===v.data?.key);if(!k)return;let P=[...k.events].sort((j,Je)=>j.timestamp.getTime()-Je.timestamp.getTime()).findIndex(j=>j.timestamp.getTime()===v.timestamp.getTime());ve(k.key),je(P>=0?P:0)},[N]),Do=Be(({item:v})=>{let k={key:v.data?.key||"",lastAction:v.action,totalOperations:1,lastEventTimestamp:v.timestamp,storageTypes:new Set([v.storageType]),valueType:Wt(v.data?.value)};return M(pn,{data:k,onPress:()=>kr(v),testID:`buoy-storage-event-${v.id}`})},[kr]);if(!e)return null;let $t=n?rr.modal.root():rr.storage.modal(),dt=()=>{if(ft)return M(bd,{ignoredPatterns:ue,onTogglePattern:qr,onAddPattern:Lt,availableKeys:jr,enabledStorageTypes:Ue,onToggleStorageType:To});if(f==="browser"){if(H&&Ce){if(ee!==null)return M(l,{style:me.contentWrapper,children:M(yn,{conversation:Ce,selectedEventIndex:ee,onEventIndexChange:ie,disableInternalFooter:true})});let k=[...Ce.events].sort((j,Je)=>j.timestamp.getTime()-Je.timestamp.getTime()),P=[...k].reverse();return M(Lo,{testID:"buoy-storage-history-list",style:me.flexFill,data:P,keyExtractor:j=>j.id,renderItem:({item:j})=>{let Je=k.findIndex(xr=>xr.timestamp.getTime()===j.timestamp.getTime()),Cr={key:j.data?.key||"",lastAction:j.action,totalOperations:1,lastEventTimestamp:j.timestamp,storageTypes:new Set([j.storageType]),valueType:Wt(j.data?.value)};return M(pn,{data:Cr,onPress:()=>ie(Je>=0?Je:0),testID:`buoy-storage-history-event-${j.id}`})},contentContainerStyle:me.listContent,ItemSeparatorComponent:()=>M(l,{style:me.separator}),initialNumToRender:20})}return M(Ea,{requiredStorageKeys:a,ignoredPatterns:ue,onTogglePattern:qr,onAddPattern:Lt,searchQuery:h,storageDataRef:Sr,eventCountByKey:Ro,lastWriteByKey:Ur,onViewHistory:$r,enabledStorageTypes:Ue,pinnedKeys:oe,onTogglePin:xo,applySafeAreaInset:Ot==="bottomSheet",storageTypeFilter:te,onStorageTypeFilterChange:Kt,detailKey:S,onOpenKey:w,onCloseDetail:()=>w(null)})}if(Se)return M(l,{style:me.contentWrapper,children:M(yn,{conversation:Se,selectedEventIndex:He,onEventIndexChange:je,disableInternalFooter:true})});let v=M(l,{style:me.eventFilterBar,children:M(Go,{active:te,onChange:Kt,counts:Vo})});if(et.length===0){let k=te!=="all";return lt(l,{style:me.flexFill,children:[v,M(jl,{testID:"buoy-storage-events-empty",...hr?k?{otto:"filtering",title:`No ${te} events`,message:"Other backends have events \u2014 pick All Types to see them"}:{otto:"listening",title:"No storage events yet",message:"Storage operations will appear here"}:{otto:"paused",title:"Event listener is paused",message:"Press play to start monitoring"}})]})}return lt(l,{style:me.flexFill,children:[v,M(Lo,{testID:"buoy-storage-events-list",style:me.flexFill,data:wr,renderItem:Do,keyExtractor:Jr,onEndReachedThreshold:Ao,contentContainerStyle:me.listContent,ListFooterComponent:_t>0?M(l,{style:me.lockedBannerContainer,children:M(Wc,{featureName:`${_t} event${_t>1?"s":""} locked`,description:"Upgrade to Pro to unlock full event history"})}):null,initialNumToRender:10,maxToRenderPerBatch:10,windowSize:10})]})},er=Se&&Se.events.length>1?M(gn,{conversation:Se,selectedEventIndex:He,onEventIndexChange:je,applySafeAreaInset:Ot==="bottomSheet"}):Ce&&ee!==null&&Ce.events.length>1?M(gn,{conversation:Ce,selectedEventIndex:ee,onEventIndexChange:ie,applySafeAreaInset:Ot==="bottomSheet"}):null,vn=ft?()=>xt(false):ee!==null?()=>ie(null):H?Nr:Se?()=>{ve(null),je(0)}:r,Me=ft?lt(Ae,{children:[M(Ae.Navigation,{onBack:()=>xt(false)}),M(Ae.Content,{title:"Filters"})]}):H?lt(Ae,{children:[M(Ae.Navigation,{onBack:ee!==null?()=>ie(null):Nr}),M(Ae.Content,{title:`${H} History`,centered:true})]}):Se?lt(Ae,{children:[M(Ae.Navigation,{onBack:()=>{ve(null),je(0)}}),M(Ae.Content,{title:Se.key})]}):S?lt(Ae,{children:[M(Ae.Navigation,{onBack:()=>w(null)}),M(Ae.Content,{title:S.key,centered:true,testID:"buoy-storage-detail-title"})]}):lt(Ae,{children:[r&&M(Ae.Navigation,{onBack:r}),M(Ae.Content,{title:"",children:T?M(Yl,{value:h,onChange:b,onClear:()=>{b(""),I(false)},placeholder:"Search storage keys...",testID:"buoy-storage-search",autoFocus:true,onSubmitEditing:()=>I(false),returnKeyType:"search",containerStyle:me.headerSearchContainer}):M(Nl,{tabs:[{key:"browser",label:"Storage"},{key:"events",label:`Events${et.length>0?` (${et.length})`:""}`}],activeTab:f,testIDPrefix:"buoy-storage-tab",onTabChange:v=>{x(v),de(null),ie(null),ve(null),je(0),w(null)}})}),lt(Ae.Actions,{children:[d&&!T?M(K,{onPress:d,style:me.iconButton,testID:"buoy-storage-refresh",accessibilityLabel:"Refresh storage",accessibilityRole:"button",children:M(Jl,{size:14,color:Oe.color.textSecondary})}):null,M(K,{onPress:vr,testID:"buoy-storage-filters",accessibilityLabel:"Storage filters",accessibilityRole:"button",style:[me.iconButton,(ue.size>0||Ue.size<3)&&me.activeFilterButton],children:M(Ul,{size:14,color:ue.size>0||Ue.size<3?Oe.color.accent:Oe.color.textSecondary})}),f==="browser"&&!T&&lt(_a,{children:[M(K,{onPress:()=>I(true),testID:"buoy-storage-search-open",accessibilityLabel:"Open search",accessibilityRole:"button",style:me.iconButton,children:M(Gl,{size:14,color:Oe.color.textSecondary})}),M(Kn,{value:Xt,disabled:Sr.current.length===0,buttonStyle:me.iconButton,testID:"buoy-storage-copy"})]}),f==="events"&&lt(_a,{children:[M(Kn,{value:Bo,disabled:et.length===0,buttonStyle:me.iconButton,testID:"buoy-storage-events-copy"}),M(Ql,{isEnabled:hr,onToggle:Tt,accessibilityLabel:"Toggle storage event monitoring",testID:"buoy-storage-power"}),M(Zl,{onPress:ke,buttonStyle:me.iconButton,testID:"buoy-storage-clear-events"})]})]})]});return i?M(Fn,{children:lt(l,{style:me.inlineRoot,children:[M(l,{style:me.inlineHeader,...ts,children:Me}),dt(),er]})}):M(Fn,{children:M($l,{visible:e,onClose:t,onBack:vn,onMinimize:o,persistenceKey:$t,header:{showToggleButton:true,customContent:Me},onModeChange:Zt,enablePersistence:true,initialMode:"bottomSheet",enableGlitchEffects:true,styles:{},footer:er,footerHeight:er?68:0,disableScrollWrapper:true,children:dt()})})}function Bd(e={}){return M(mn,{...e,inline:true,visible:true,onClose:()=>{}})}var me=ge.create({inlineRoot:{flex:1,minHeight:0,backgroundColor:"transparent"},inlineHeader:{paddingHorizontal:12,paddingVertical:8,borderBottomWidth:1,borderBottomColor:Hl.border.default,backgroundColor:"transparent"},headerSearchContainer:{flex:1},flexFill:{flex:1},iconButton:{width:32,height:32,borderRadius:8,backgroundColor:Oe.color.buttonSurface,borderWidth:1,borderColor:Oe.color.border,alignItems:"center",justifyContent:"center"},activeFilterButton:{backgroundColor:Oe.color.accentSoft,borderColor:Oe.color.accentBorderStrong},separator:{height:8},listContent:{paddingVertical:6},lockedBannerContainer:{marginTop:8,marginHorizontal:16},eventFilterBar:{paddingHorizontal:12,paddingTop:8,paddingBottom:4},emptyState:{flex:1,justifyContent:"center",alignItems:"center",padding:32},emptyTitle:{color:Oe.color.text,fontSize:16,fontWeight:"600",marginTop:16,marginBottom:8,fontFamily:eo,letterSpacing:.5,textTransform:"uppercase"},emptySubtitle:{color:Oe.color.textSecondary,fontSize:14,textAlign:"center",fontFamily:eo},eventNavigation:{flexDirection:"row",alignItems:"center",gap:8,paddingHorizontal:8},navButton:{padding:4,borderRadius:4},navButtonDisabled:{opacity:.3},eventCounter:{color:Oe.color.text,fontSize:12,fontWeight:"600",fontFamily:eo,paddingHorizontal:8},headerTopRow:{flexDirection:"row",alignItems:"center",gap:8,marginBottom:12},keyNameContainer:{flex:1,flexDirection:"row",alignItems:"center",gap:6,backgroundColor:Oe.color.surfaceElevated,paddingHorizontal:10,paddingVertical:4,borderRadius:6,borderWidth:1,borderColor:Oe.color.border,height:28},keyNameText:{flex:1,fontSize:13,fontWeight:"600",color:Oe.color.accent,fontFamily:eo,letterSpacing:.5},contentWrapper:{flex:1}});V();Nt();import Or from"@buoy-gg/shared-ui/web/asyncStorage";import{approxJsonSize as Na,isDevToolsStorageKey as Lr,isOverWireBudget as qa,isJsonSerializable as Ad}from"@buoy-gg/shared-ui/web";var vo=Object.freeze({__buoyValueOnDevice:true,note:"Value stays on the device \u2014 fetched on demand via getEventDetail / mmkv.get / secure.get."}),Dd=16*1024,hn=1.25*1024*1024,Ha=8*1024*1024;function bn(e){return e===void 0?e:qa(e,Dd)?vo:e}function So(e,t){let r=e.data;if(!r)return e;let o=t(r.value),n=t(r.prevValue),a=co(e),i=t(a.pairs),u=t(a.prevPairs);return o===r.value&&n===r.prevValue&&i===a.pairs&&u===a.prevPairs?e:{...e,data:{...r,value:o,prevValue:n,...e.storageType==="async"?{pairs:i,prevPairs:u}:{}}}}function ja(e){return e===void 0||!qa(e,Ha)?e:Ad(e)?{__buoyTruncated:true,note:`Exceeds the ${Ha/(1024*1024)}MB detail limit \u2014 inspect it on-device.`}:vo}var Ua=new WeakMap,Ja=new WeakMap;function Md(e){let t=Ua.get(e);if(t)return t;let r;try{let o=So(e,bn);r={event:o,bytes:Na(o,hn).bytes}}catch{r={event:So(e,()=>vo),bytes:1024}}return Ua.set(e,r),r}function Pd(e){let t=Ja.get(e);if(t)return t;let r=So(e,n=>n===void 0?void 0:vo),o={event:r,bytes:Na(r,hn).bytes};return Ja.set(e,o),o}function zd(e){let t=new Array(e.length),r=0;for(let o=0;o<e.length;o++){let n=Md(e[o]);if(r+n.bytes<=hn)t[o]=n.event,r+=n.bytes;else{let a=Pd(e[o]);t[o]=a.event,r+=a.bytes}}return t}function Ga(e){let t=Pe.get(e);if(!t)throw new Error(`No MMKV instance registered as "${e}"`);if(t.instance?.isReadOnly)throw new Error(`MMKV instance "${e}" is registered read-only`);return t.instance}var Ya=[];function Kd(e){Ya=e}var Fd={version:3,getSnapshot:()=>zd(Dt.getEvents().filter(e=>{let t=e.data?.key;return!(typeof t=="string"&&Lr(t))})),subscribe:e=>Dt.subscribeToEvents(e),actions:{clearEvents:()=>{Dt.clearEvents()},getRequiredKeys:()=>Ya,getEventDetail:e=>{let{id:t}=e??{};if(!t)return{found:false,reason:"missing id"};let r=Dt.getEvents().find(n=>n.id===t);if(!r)return{found:false,reason:"unknown id"};let o=So(r,ja);return{found:true,id:t,event:o}},clearAppStorage:()=>Qr(),"timeTravel.undo":async e=>{let t=e?.id;if(!t)throw new Error("timeTravel.undo requires an event `id`");let r=Dt.getEvents().find(n=>n.id===t);if(!r)throw new Error(`No storage event with id "${t}"`);if(r.storageType==="mmkv")throw new Error("Time travel supports AsyncStorage events only");let o=r;if(!un(o))throw new Error(`Event "${t}" (${o.action}) has no previous value captured, so it cannot be undone`);return await cn(o),{undone:true,action:o.action,key:o.data?.key}},"timeTravel.jump":async e=>{let{id:t,scope:r="key"}=e??{};if(!t)throw new Error("timeTravel.jump requires an event `id`");let o=Dt.getEvents().filter(u=>u.storageType!=="mmkv").slice().reverse(),n=o.find(u=>u.id===t);if(!n)throw new Error(`No AsyncStorage event with id "${t}"`);let a=r==="all"?o:o.filter(u=>u.data?.key===n.data?.key),i=a.findIndex(u=>u.id===t);if(i===-1)throw new Error(`Event "${t}" is not in the timeline`);return await dn(a,i),{jumped:true,scope:r,replayed:i+1,of:a.length,key:n.data?.key}},"async.getAllKeys":async()=>(await Or.getAllKeys()).filter(e=>!Lr(e)),"async.multiGet":async e=>(await Gr(e.keys)).filter(([t])=>!Lr(t)),"async.getItem":e=>{let{key:t}=e;return Lr(t)?Promise.resolve(null):Or.getItem(t)},"async.setItem":e=>{let{key:t,value:r}=e;return Or.setItem(t,r)},"async.removeItem":e=>Or.removeItem(e.key),"async.multiRemove":e=>tr(e.keys),"async.multiSet":e=>Ir(e.pairs),"async.clear":()=>Or.clear(),"mmkv.snapshot":()=>Pe.getAll().map(({id:e,instance:t,encrypted:r,readOnly:o})=>{let n=[];try{n=t.getAllKeys().filter(a=>!Lr(a)).map(a=>{let{value:i,type:u}=ht(t,a);return{key:a,value:bn(i),valueType:u}})}catch{}return{id:e,encrypted:r,readOnly:o,entries:n}}),"mmkv.get":e=>{let{instanceId:t,key:r}=e??{};if(!t||!r)return{found:false,reason:"missing instanceId/key"};let o=Pe.get(t);if(!o)return{found:false,reason:"unknown instance"};let{value:n,type:a}=ht(o.instance,r);return{found:true,instanceId:t,key:r,value:ja(n),valueType:a}},"mmkv.set":e=>{let{instanceId:t,key:r,value:o}=e;Ga(t).set(r,o)},"mmkv.remove":e=>{let{instanceId:t,key:r}=e,o=Ga(t);o.remove?o.remove(r):o.delete?.(r)},"secure.keys":()=>re.getAll().map(({key:e,options:t,description:r})=>({key:e,description:r,keychainService:t.keychainService,requireAuthentication:t.requireAuthentication??false})),"secure.snapshot":async()=>{let e=re.getModule(),t=re.getAll(),r=[];for(let{key:o,options:n,description:a}of t){let i=null;if(e&&!n.requireAuthentication)try{i=await e.getItemAsync(o,n)}catch{}r.push({key:o,description:a,keychainService:n.keychainService,requireAuthentication:n.requireAuthentication??false,value:i==null?i:bn(i)})}return r},"secure.get":e=>{let{key:t}=e,r=re.getAll().find(n=>n.key===t),o=re.getModule();return!r||!o||r.options.requireAuthentication?Promise.resolve(null):o.getItemAsync(t,r.options)},"secure.set":e=>{let{key:t,value:r}=e;return re.setValue(t,r)},"secure.delete":e=>re.deleteValue(e.key)}};import{jsx as Od}from"react/jsx-runtime";var Qa=qi({id:"storage",name:"STORAGE",description:"AsyncStorage browser",slot:"both",icon:({size:e})=>Od($i,{size:e}),component:mn,props:{requiredStorageKeys:[],enableSharedModalDimensions:false}}),Ld=Ni(Qa,e=>(Kd(e.requiredStorageKeys||[]),{requiredStorageKeys:e.requiredStorageKeys||[],enableSharedModalDimensions:e.enableSharedModalDimensions??false}));V();import{HardDrive as Wd,CyberpunkSectionButton as _d}from"@buoy-gg/shared-ui/web";import{isDevToolsStorageKey as $d}from"@buoy-gg/shared-ui/web";import{jsx as Nd}from"react/jsx-runtime";function qd({onPress:e}){let{storageKeys:t}=Zo(),r=t.filter(n=>!$d(n.key)).length,o=r;return Nd(_d,{id:"storage",title:"STORAGE",subtitle:o===0?"Empty":`${r} Async`,icon:Wd,iconColor:"#00FF88",iconBackgroundColor:"rgba(0, 255, 136, 0.1)",onPress:e,index:2})}V();import{AlertCircle as Za,CheckCircle2 as Hd,Eye as Xa,XCircle as ei,HardDrive as ti,Database as ri,Shield as jd,gameUIColors as wo,macOSColors as ne,night as he,monoFont as ko}from"@buoy-gg/shared-ui/web";import{DataViewer as Ud}from"@buoy-gg/shared-ui/web/dataViewer";import{jsx as Y,jsxs as Ve}from"react/jsx-runtime";var oi=[ne.semantic.info,ne.semantic.success,ne.semantic.warning,ne.semantic.debug,"#FF6B9D","#00D9FF"];function Co(e){let t=e.split("").reduce((r,o)=>r+o.charCodeAt(0),0);return oi[t%oi.length]}var Jd=e=>{switch(e){case"required_present":return{icon:Hd,color:ne.semantic.success,bgColor:ne.semantic.successBackground,borderColor:ne.semantic.success+"40",label:"REQUIRED",labelColor:ne.semantic.success};case"required_missing":return{icon:Za,color:ne.semantic.error,bgColor:ne.semantic.errorBackground,borderColor:ne.semantic.error+"50",label:"MISSING",labelColor:ne.semantic.error};case"required_wrong_value":return{icon:ei,color:ne.semantic.warning,bgColor:ne.semantic.warningBackground,borderColor:ne.semantic.warning+"50",label:"WRONG S",labelColor:ne.semantic.warning};case"required_wrong_type":return{icon:ei,color:ne.semantic.info,bgColor:ne.semantic.infoBackground,borderColor:ne.semantic.info+"50",label:"WRONG TYPE",labelColor:ne.semantic.info};case"optional_present":return{icon:Xa,color:ne.semantic.debug,bgColor:ne.semantic.infoBackground,borderColor:ne.semantic.debug+"40",label:"OPTIONAL",labelColor:ne.semantic.debug}}},Gd=e=>{switch(e){case"mmkv":return ti;case"async":return ri;case"secure":return jd;default:return ri}};function Yd({storageKey:e,isExpanded:t,onToggle:r}){let o=Jd(e.status),n=o.icon,a=Gd(e.storageType),i=e.value!==void 0&&e.value!==null,u=e.expectedValue!==void 0,d=e.expectedType!==void 0,y=Hn(e.storageType),g=No(e.storageType);return Ve(l,{style:[z.storageKeyCard,{borderColor:o.borderColor}],children:[Ve(K,{accessibilityLabel:"Storage key card",accessibilityHint:"View storage key card","sentry-label":`ignore storage key card ${e.key}`,accessibilityRole:"button",style:z.cardHeader,onPress:r,children:[Ve(l,{style:z.cardHeaderLeft,children:[Y(l,{style:[z.iconContainer,{backgroundColor:o.bgColor}],children:Y(n,{size:14,color:o.color})}),Ve(l,{style:z.cardHeaderInfo,children:[Y(c,{style:z.storageKeyText,children:e.key}),e.description?Y(c,{style:z.descriptionText,children:e.description}):null,Ve(l,{style:z.cardHeaderMeta,children:[Y(l,{style:[z.statusBadge,{backgroundColor:o.bgColor}],children:Y(c,{style:[z.statusText,{color:o.labelColor}],children:o.label})}),Ve(l,{style:[z.storageBadge,{backgroundColor:`${y}15`}],children:[Y(a,{size:10,color:y}),Y(c,{style:[z.storageText,{color:y}],children:g})]}),e.storageType==="mmkv"&&e.instanceId&&Ve(l,{style:[z.instanceBadge,{backgroundColor:Co(e.instanceId)+"20",borderColor:Co(e.instanceId)+"40"}],children:[Y(ti,{size:9,color:Co(e.instanceId)}),Y(c,{style:[z.instanceText,{color:Co(e.instanceId)}],children:e.instanceId})]}),i&&Y(l,{style:z.valueBadge,children:Y(c,{style:z.valueText,children:e.valueType?e.valueType.toUpperCase():Et(e.value)})})]})]})]}),Y(l,{style:z.cardHeaderRight,children:Y(l,{style:z.actionButton,children:Y(Xa,{size:12,color:he.color.textSecondary})})})]}),t&&i&&Ve(l,{style:z.cardBody,children:[Y(l,{style:z.dataViewerContainer,children:(()=>{let p=typeof e.value=="string"?(()=>{try{return JSON.parse(e.value)}catch{return e.value}})():e.value;return typeof p=="string"||typeof p=="number"||typeof p=="boolean"?Ve(l,{style:z.simpleValueContainer,children:[Y(c,{style:z.simpleValueLabel,children:"Current Value:"}),Y(l,{style:z.simpleValueBox,children:Y(c,{style:z.simpleValueContent,selectable:true,children:String(p)})}),Ve(c,{style:z.valueTypeText,children:["Type: ",Et(e.value)]})]}):Y(Ud,{title:"Current Value",data:p,showTypeFilter:false,rawMode:true})})()}),u&&Ve(l,{style:z.valueContainer,children:[Y(c,{style:z.valueLabel,children:"Expected Value:"}),Y(l,{style:z.expectedValueBox,children:Y(c,{style:z.expectedValueContent,selectable:true,children:e.expectedValue})})]}),d&&e.expectedType&&Ve(l,{style:z.valueContainer,children:[Y(c,{style:z.valueLabel,children:"Expected Type:"}),Y(l,{style:z.expectedValueBox,children:Y(c,{style:z.expectedValueContent,selectable:true,children:e.expectedType.toUpperCase()})}),Ve(c,{style:z.typeHelperText,children:["Current type: ",Et(e.value)]})]}),e.lastUpdated?Y(l,{style:z.metaInfo,children:Ve(c,{style:z.metaLabel,children:["Last updated: ",e.lastUpdated.toLocaleString()]})}):null]}),t&&!i&&Ve(l,{style:z.cardBody,children:[Ve(l,{style:z.emptyValueContainer,children:[Y(Za,{size:16,color:ne.semantic.warning}),Y(c,{style:z.emptyValueText,children:"Storage key not found or empty"})]}),u&&Ve(l,{style:z.valueContainer,children:[Y(c,{style:z.valueLabel,children:"Expected Value:"}),Y(l,{style:z.expectedValueBox,children:Y(c,{style:z.expectedValueContent,selectable:true,children:e.expectedValue})})]})]})]})}var z=ge.create({storageKeyCard:{backgroundColor:he.color.surface,borderRadius:8,borderWidth:1,overflow:"hidden"},cardHeader:{padding:12,flexDirection:"row",alignItems:"center",justifyContent:"space-between"},cardHeaderLeft:{flexDirection:"row",alignItems:"center",flex:1,minWidth:0},iconContainer:{padding:6,borderRadius:6,marginRight:10},cardHeaderInfo:{flex:1,minWidth:0,gap:4},storageKeyText:{color:he.color.text,fontWeight:"500",fontSize:12,flexWrap:"wrap",flex:1},descriptionText:{color:he.color.textSecondary,fontSize:10,marginTop:2,flexWrap:"wrap"},cardHeaderMeta:{flexDirection:"row",alignItems:"center",gap:6,flexWrap:"wrap"},statusBadge:{paddingHorizontal:6,paddingVertical:2,borderRadius:4},statusText:{fontSize:9,fontWeight:"600",letterSpacing:.5},storageBadge:{paddingHorizontal:6,paddingVertical:2,borderRadius:4,flexDirection:"row",alignItems:"center",gap:4},storageText:{fontSize:9,fontWeight:"600"},instanceBadge:{paddingHorizontal:6,paddingVertical:3,borderRadius:4,borderWidth:1,flexDirection:"row",alignItems:"center",gap:4},instanceText:{fontSize:9,fontWeight:"700",fontFamily:ko,letterSpacing:.3},valueBadge:{paddingHorizontal:4,paddingVertical:2,backgroundColor:he.color.surfaceElevated,borderRadius:3},valueText:{fontSize:8,color:he.color.textSecondary,fontWeight:"500"},cardHeaderRight:{marginLeft:8},actionButton:{padding:4,borderRadius:4,backgroundColor:he.color.surfaceElevated},cardBody:{borderTopWidth:1,borderTopColor:he.color.separator,padding:12,gap:12},dataViewerContainer:{marginTop:8},simpleValueContainer:{gap:8},simpleValueLabel:{color:he.color.textSecondary,fontSize:10,fontWeight:"500",textTransform:"uppercase",letterSpacing:.5},simpleValueBox:{backgroundColor:he.color.bg,borderRadius:4,padding:10,borderWidth:1,borderColor:he.color.border},simpleValueContent:{color:wo.success,fontSize:12,fontFamily:ko,lineHeight:16},valueTypeText:{color:he.color.textTertiary,fontSize:9,fontStyle:"italic"},valueContainer:{gap:6},valueLabel:{color:he.color.textSecondary,fontSize:10,fontWeight:"500",textTransform:"uppercase",letterSpacing:.5},valueBox:{backgroundColor:he.color.bg,borderRadius:4,padding:8,borderWidth:1,borderColor:he.color.border},valueContent:{color:he.color.text,fontSize:10,fontFamily:ko,lineHeight:14},expectedValueBox:{backgroundColor:he.color.bg,borderRadius:4,padding:8,borderWidth:1,borderColor:he.color.border},expectedValueContent:{color:he.color.text,fontSize:10,fontFamily:ko,lineHeight:14},emptyValueContainer:{flexDirection:"row",alignItems:"center",gap:6,padding:8,backgroundColor:wo.warning+"0D",borderRadius:4,borderWidth:1,borderColor:wo.warning+"1A"},emptyValueText:{color:wo.warning,fontSize:10,fontStyle:"italic"},typeHelperText:{color:he.color.textSecondary,fontSize:9,marginTop:4,textAlign:"center"},metaInfo:{marginTop:8},metaLabel:{color:he.color.textTertiary,fontSize:9,fontStyle:"italic"}});V();import{AlertCircle as Qd,CheckCircle2 as Zd,XCircle as ni,Eye as Xd,Database as ai,Shield as eu}from"@buoy-gg/shared-ui/web";import{night as pt}from"@buoy-gg/shared-ui/web";import{jsx as we,jsxs as qe}from"react/jsx-runtime";var tu=[{key:"valid",label:"Valid Keys",description:"Correctly stored and accessible",icon:Zd,color:"#10B981",textColor:"#10B981",bgColor:"rgba(16, 185, 129, 0.1)"},{key:"missing",label:"Missing Keys",description:"Required but not found",icon:Qd,color:"#EF4444",textColor:"#EF4444",bgColor:"rgba(239, 68, 68, 0.1)"},{key:"wrongValue",label:"Wrong Values",description:"Stored but incorrect value",icon:ni,color:"#F97316",textColor:"#F97316",bgColor:"rgba(249, 115, 22, 0.1)"},{key:"wrongType",label:"Wrong Types",description:"Value has incorrect data type",icon:ni,color:"#0891B2",textColor:"#0891B2",bgColor:"rgba(8, 145, 178, 0.1)"},{key:"optional",label:"Optional Keys",description:"Available but not required",icon:Xd,color:"#8B5CF6",textColor:"#8B5CF6",bgColor:"rgba(139, 92, 246, 0.1)"}],ru=[{key:"mmkv",label:le.mmkv,description:le.hasSecure?"Synchronous key-value storage":"Storage for this browser tab",icon:ai},{key:"async",label:le.asyncFull,description:le.hasSecure?"React Native async storage":"Persistent storage for this origin",icon:ai},{key:"secure",label:"SecureStorage",description:"Encrypted secure storage",icon:eu}];function ou({stats:e}){let{totalCount:t,missingCount:r,wrongValueCount:o,wrongTypeCount:n,presentRequiredCount:a,optionalCount:i,mmkvCount:u,asyncCount:d,secureCount:y}=e;return t===0?qe(l,{style:X.statsContainer,children:[we(c,{style:X.sectionTitle,children:"STORAGE BREAKDOWN"}),we(l,{style:X.emptyState,children:we(c,{style:X.emptyStateText,children:"No storage keys detected"})})]}):qe(l,{style:X.statsContainer,children:[qe(l,{style:X.breakdownSection,children:[we(c,{style:X.sectionTitle,children:"KEY STATUS BREAKDOWN"}),we(l,{style:X.breakdownList,children:tu.map(g=>{let p=0,f=false;switch(g.key){case"valid":p=a,f=p>0;break;case"missing":p=r,f=p>0;break;case"wrongValue":p=o,f=p>0;break;case"wrongType":p=n,f=p>0;break;case"optional":p=i,f=p>0;break}if(!f)return null;let x=t>0?(p/t*100).toFixed(1):"0",h=g.icon;return we(l,{style:X.breakdownItem,children:qe(l,{style:X.breakdownItemRow,children:[qe(l,{style:X.breakdownItemLeft,children:[we(l,{style:[X.breakdownIcon,{backgroundColor:g.bgColor}],children:we(h,{size:14,color:g.color})}),qe(l,{style:X.breakdownItemInfo,children:[we(c,{style:X.breakdownItemLabel,children:g.label}),we(c,{style:X.breakdownItemDesc,children:g.description})]})]}),qe(l,{style:X.breakdownItemRight,children:[we(c,{style:[X.breakdownCount,{color:g.textColor}],children:p}),qe(c,{style:X.breakdownPercentage,children:[x,"%"]})]})]})},g.key)})})]}),(u>0||d>0||y>0)&&qe(l,{style:X.breakdownSection,children:[we(c,{style:X.sectionTitle,children:"STORAGE TYPE BREAKDOWN"}),we(l,{style:X.breakdownList,children:ru.map(g=>{let p=0,f=false;switch(g.key){case"mmkv":p=u,f=p>0;break;case"async":p=d,f=p>0;break;case"secure":p=y,f=p>0;break}if(!f)return null;let x=t>0?(p/t*100).toFixed(1):"0",h=g.icon,b=Hn(g.key);return we(l,{style:X.breakdownItem,children:qe(l,{style:X.breakdownItemRow,children:[qe(l,{style:X.breakdownItemLeft,children:[we(l,{style:[X.breakdownIcon,{backgroundColor:`${b}15`}],children:we(h,{size:14,color:b})}),qe(l,{style:X.breakdownItemInfo,children:[we(c,{style:X.breakdownItemLabel,children:g.label}),we(c,{style:X.breakdownItemDesc,children:g.description})]})]}),qe(l,{style:X.breakdownItemRight,children:[we(c,{style:[X.breakdownCount,{color:b}],children:p}),qe(c,{style:X.breakdownPercentage,children:[x,"%"]})]})]})},g.key)})})]})]})}var X=ge.create({statsContainer:{marginBottom:24,backgroundColor:pt.color.surface,borderRadius:8,padding:16,borderWidth:1,borderColor:pt.color.border},sectionTitle:{color:pt.color.textSecondary,fontSize:12,fontWeight:"500",marginBottom:16,textTransform:"uppercase",letterSpacing:.5},breakdownSection:{gap:12,marginBottom:20},breakdownList:{gap:12},breakdownItem:{backgroundColor:pt.color.surfaceElevated,padding:12,borderRadius:8,borderWidth:1,borderColor:pt.color.border},breakdownItemRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between"},breakdownItemLeft:{flexDirection:"row",alignItems:"center",gap:12,flex:1,minWidth:0},breakdownIcon:{padding:8,borderRadius:8},breakdownItemInfo:{flex:1,minWidth:0},breakdownItemLabel:{color:pt.color.text,fontSize:14,fontWeight:"500"},breakdownItemDesc:{color:pt.color.textSecondary,fontSize:12},breakdownItemRight:{alignItems:"flex-end"},breakdownCount:{fontSize:16,fontWeight:"600"},breakdownPercentage:{color:pt.color.textTertiary,fontSize:10},emptyState:{padding:16,backgroundColor:pt.color.surfaceElevated,borderRadius:6,alignItems:"center"},emptyStateText:{color:pt.color.textTertiary,fontSize:11,textAlign:"center"}});V();import{Database as nu,CyberpunkSectionButton as au}from"@buoy-gg/shared-ui/web";import{jsx as iu}from"react/jsx-runtime";function lu({onPress:e,eventCount:t=0}){let r=t>0?`${t} events`:"Monitoring";return iu(au,{id:"storage-events",title:"EVENTS",subtitle:r,icon:nu,iconColor:"#00E5FF",iconBackgroundColor:"rgba(0, 229, 255, 0.1)",onPress:e,index:3})}V();import{macOSColors as Wr}from"@buoy-gg/shared-ui/web";var su=["SET","GET","MERGE","DELETE","CLEAR"],cu={SET:Wr.semantic.info,GET:Wr.text.muted,MERGE:Wr.semantic.debug,DELETE:Wr.semantic.error,CLEAR:Wr.semantic.warning};function du(e){return cu[e]}function uu(e){let t=e.action;return t==="clear"||t==="clearAll"?"CLEAR":t.startsWith("get.")?"GET":t==="removeItem"||t==="multiRemove"||t==="delete"?"DELETE":t==="mergeItem"||t==="multiMerge"?"MERGE":"SET"}function yu(e){return!!e.data?.initialScan}V();import{useState as gu}from"react";import{macOSColors as Yt,night as ce,monoFont as ii}from"@buoy-gg/shared-ui/web";import{jsx as ae,jsxs as nt}from"react/jsx-runtime";function pu({selectedInstanceId:e,onSelectInstance:t,showRefreshButton:r=true}){let[o,n]=gu(false),{instances:a,instanceCount:i,refresh:u}=rn(false),d=a.find(g=>g.id===e),y=g=>{t(g),n(false)};return Yo()?i===0?ae(l,{style:$.container,children:nt(l,{style:$.emptyState,children:[ae(c,{style:$.emptyStateTitle,children:"No MMKV Instances Registered"}),ae(c,{style:$.emptyStateDescription,children:"Register MMKV instances using registerMMKVInstance() to monitor them in dev tools."}),r&&ae(K,{style:$.refreshButton,onPress:u,activeOpacity:.7,children:ae(c,{style:$.refreshButtonText,children:"\u21BB Refresh"})})]})}):nt(l,{style:$.container,children:[nt(K,{style:$.selectorButton,onPress:()=>n(true),activeOpacity:.7,children:[ae(l,{style:$.selectorContent,children:d?ae(li,{instance:d,isSelected:true}):ae(c,{style:$.placeholderText,children:"Select MMKV Instance"})}),ae(c,{style:$.dropdownArrow,children:"\u25BC"})]}),ae(zn,{visible:o,transparent:true,animationType:"fade",onRequestClose:()=>n(false),children:ae(K,{style:$.modalOverlay,activeOpacity:1,onPress:()=>n(false),children:nt(l,{style:$.dropdownContainer,children:[nt(l,{style:$.dropdownHeader,children:[nt(c,{style:$.dropdownTitle,children:["Select MMKV Instance (",i,")"]}),r&&ae(K,{style:$.headerRefreshButton,onPress:u,activeOpacity:.7,children:ae(c,{style:$.headerRefreshText,children:"\u21BB"})})]}),ae(Vr,{style:$.dropdownList,children:a.map(g=>ae(K,{style:[$.dropdownItem,g.id===e&&$.dropdownItemSelected],onPress:()=>y(g.id),activeOpacity:.7,children:ae(li,{instance:g,isSelected:g.id===e})},g.id))})]})})})]}):ae(l,{style:$.container,children:nt(l,{style:$.unavailableState,children:[nt(c,{style:$.unavailableTitle,children:[le.mmkv," Not Available"]}),ae(c,{style:$.unavailableDescription,children:oa()})]})})}function li({instance:e,isSelected:t}){return nt(l,{style:$.instanceRow,children:[nt(l,{style:$.instanceLeft,children:[ae(c,{style:[$.instanceId,t&&$.instanceIdSelected],numberOfLines:1,children:e.id}),nt(l,{style:$.instanceBadges,children:[e.encrypted&&ae(l,{style:[$.badge,$.badgeEncrypted],children:ae(c,{style:$.badgeText,children:"\u{1F512} Encrypted"})}),e.readOnly&&ae(l,{style:[$.badge,$.badgeReadOnly],children:ae(c,{style:$.badgeText,children:"\u{1F441}\uFE0F Read-only"})})]})]}),nt(l,{style:$.instanceRight,children:[ae(c,{style:$.keyCount,children:e.keyCount}),ae(c,{style:$.keyCountLabel,children:"keys"})]})]})}var $=ge.create({container:{marginBottom:12},unavailableState:{backgroundColor:Yt.semantic.warning+"15",borderRadius:12,padding:20,borderWidth:1,borderColor:Yt.semantic.warning+"40",alignItems:"center",gap:12},unavailableTitle:{fontSize:14,fontWeight:"600",color:Yt.semantic.warning},unavailableDescription:{fontSize:12,color:ce.color.textSecondary,textAlign:"center",lineHeight:18},emptyState:{backgroundColor:ce.color.surface,borderRadius:12,padding:20,borderWidth:1,borderColor:ce.color.border,alignItems:"center",gap:12},emptyStateTitle:{fontSize:14,fontWeight:"600",color:ce.color.text},emptyStateDescription:{fontSize:12,color:ce.color.textTertiary,textAlign:"center",lineHeight:18},refreshButton:{marginTop:8,paddingHorizontal:16,paddingVertical:8,backgroundColor:ce.color.accentSoft,borderRadius:8,borderWidth:1,borderColor:ce.color.accentBorderStrong},refreshButtonText:{fontSize:12,fontWeight:"600",color:ce.color.accent},selectorButton:{backgroundColor:ce.color.surface,borderRadius:12,borderWidth:1,borderColor:ce.color.border,padding:12,flexDirection:"row",alignItems:"center",justifyContent:"space-between",shadowColor:"#000000",shadowOpacity:.03,shadowRadius:8,shadowOffset:{width:0,height:2}},selectorContent:{flex:1},placeholderText:{fontSize:13,color:ce.color.placeholder,fontStyle:"italic"},dropdownArrow:{fontSize:10,color:ce.color.textTertiary,marginLeft:8},modalOverlay:{flex:1,backgroundColor:"rgba(0, 0, 0, 0.5)",justifyContent:"center",alignItems:"center",padding:20},dropdownContainer:{backgroundColor:ce.color.surface,borderRadius:16,borderWidth:1,borderColor:ce.color.border,width:"100%",maxWidth:500,maxHeight:"70%",shadowColor:"#000000",shadowOpacity:.2,shadowRadius:20,shadowOffset:{width:0,height:10},overflow:"hidden"},dropdownHeader:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",padding:16,borderBottomWidth:1,borderBottomColor:ce.color.separator},dropdownTitle:{fontSize:14,fontWeight:"600",color:ce.color.text},headerRefreshButton:{padding:4},headerRefreshText:{fontSize:18,color:ce.color.accent},dropdownList:{maxHeight:400},dropdownItem:{padding:12,borderBottomWidth:1,borderBottomColor:ce.color.separator},dropdownItemSelected:{backgroundColor:ce.color.accentSoft},instanceRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",gap:12},instanceLeft:{flex:1,gap:6},instanceId:{fontSize:13,fontWeight:"500",color:ce.color.text,fontFamily:ii},instanceIdSelected:{fontWeight:"600",color:ce.color.accent},instanceBadges:{flexDirection:"row",flexWrap:"wrap",gap:6},badge:{paddingHorizontal:6,paddingVertical:2,borderRadius:4,borderWidth:1},badgeEncrypted:{backgroundColor:Yt.semantic.success+"15",borderColor:Yt.semantic.success+"40"},badgeReadOnly:{backgroundColor:Yt.semantic.warning+"15",borderColor:Yt.semantic.warning+"40"},badgeText:{fontSize:9,fontWeight:"500",color:ce.color.textSecondary},instanceRight:{alignItems:"flex-end"},keyCount:{fontSize:16,fontWeight:"600",color:ce.color.text,fontFamily:ii},keyCountLabel:{fontSize:9,color:ce.color.textTertiary,textTransform:"uppercase",letterSpacing:.5}});V();import{macOSColors as st,night as kt,monoFont as fu}from"@buoy-gg/shared-ui/web";import{jsx as De,jsxs as fr}from"react/jsx-runtime";function mu({instanceId:e}){let t=ya(e);return t?De(l,{style:ye.container,children:fr(l,{style:ye.panel,children:[De(l,{style:ye.header,children:De(c,{style:ye.headerTitle,children:"Instance Details"})}),fr(l,{style:ye.infoGrid,children:[De(_r,{label:"Instance ID",value:t.id,valueStyle:ye.monoValue}),De(_r,{label:"Keys",value:`${t.keyCount} ${t.keyCount===1?"key":"keys"}`,highlight:true}),De(_r,{label:"Encryption",value:t.encrypted?"\u{1F512} Encrypted":"\u{1F513} Not encrypted",valueColor:t.encrypted?st.semantic.success:kt.color.textTertiary}),De(_r,{label:"Access",value:t.readOnly?"\u{1F441}\uFE0F Read-only":"\u270F\uFE0F Read-write",valueColor:t.readOnly?st.semantic.warning:kt.color.textTertiary}),t.size!==void 0&&De(_r,{label:"Size",value:hu(t.size),valueStyle:ye.monoValue})]}),t.encrypted&&fr(l,{style:ye.notice,children:[De(c,{style:ye.noticeIcon,children:"\u{1F512}"}),De(c,{style:ye.noticeText,children:"This instance is encrypted. Values are protected at rest."})]}),t.readOnly&&fr(l,{style:[ye.notice,ye.noticeWarning],children:[De(c,{style:ye.noticeIcon,children:"\u{1F441}\uFE0F"}),De(c,{style:[ye.noticeText,ye.noticeTextWarning],children:"Read-only mode. Cannot modify values in this instance."})]})]})}):De(l,{style:ye.container,children:De(l,{style:ye.errorState,children:fr(c,{style:ye.errorText,children:["Instance not found: ",e]})})})}function _r({label:e,value:t,valueStyle:r,valueColor:o,highlight:n}){return fr(l,{style:ye.infoItem,children:[De(c,{style:ye.infoLabel,children:e}),De(c,{style:[ye.infoValue,r,o&&{color:o},n&&ye.infoValueHighlight],children:t})]})}function hu(e){if(e===0)return"0 Bytes";let t=1024,r=["Bytes","KB","MB","GB"],o=Math.floor(Math.log(e)/Math.log(t));return`${parseFloat((e/Math.pow(t,o)).toFixed(2))} ${r[o]}`}var ye=ge.create({container:{marginBottom:12},errorState:{backgroundColor:st.semantic.error+"15",borderRadius:12,padding:12,borderWidth:1,borderColor:st.semantic.error+"40"},errorText:{fontSize:12,color:st.semantic.error,textAlign:"center"},panel:{backgroundColor:kt.color.surface,borderRadius:12,borderWidth:1,borderColor:kt.color.border,overflow:"hidden",shadowColor:"#000000",shadowOpacity:.03,shadowRadius:8,shadowOffset:{width:0,height:2}},header:{padding:12,borderBottomWidth:1,borderBottomColor:kt.color.separator},headerTitle:{fontSize:11,fontWeight:"600",color:kt.color.text,textTransform:"uppercase",letterSpacing:.5},infoGrid:{padding:12,gap:10},infoItem:{flexDirection:"row",justifyContent:"space-between",alignItems:"center",paddingVertical:4},infoLabel:{fontSize:12,color:kt.color.textTertiary,fontWeight:"500"},infoValue:{fontSize:12,color:kt.color.text,fontWeight:"500"},infoValueHighlight:{fontSize:14,fontWeight:"600",color:kt.color.accent},monoValue:{fontFamily:fu},notice:{flexDirection:"row",alignItems:"center",gap:8,padding:10,margin:12,marginTop:0,backgroundColor:st.semantic.success+"10",borderRadius:8,borderWidth:1,borderColor:st.semantic.success+"30"},noticeWarning:{backgroundColor:st.semantic.warning+"10",borderColor:st.semantic.warning+"30"},noticeIcon:{fontSize:14},noticeText:{flex:1,fontSize:11,color:st.semantic.success,lineHeight:16},noticeTextWarning:{color:st.semantic.warning}});V();import{getBrowserStorage as bu,subscribeToBrowserStorage as vu}from"@buoy-gg/shared-ui/web/utils";var si=0,Ct=()=>bu("sessionStorage"),ci=()=>Array.from({length:Ct().length},(e,t)=>Ct().key(t)).filter(e=>e!==null),Su={set(e,t){Ct().setItem(e,String(t))},getString(e){return Ct().getItem(e)??void 0},getNumber(){},getBoolean(){},getBuffer(){},contains(e){return Ct().getItem(e)!==null},delete(e){let t=this.contains(e);return Ct().removeItem(e),t},getAllKeys:ci,clearAll(){Ct().clear()},get size(){return ci().reduce((e,t)=>e+2*(t.length+(Ct().getItem(t)?.length??0)),0)},addOnValueChangedListener(e){return{remove:vu(t=>{t.area==="sessionStorage"&&(t.key!==void 0?e(t.key):t.prevPairs?.forEach(([r])=>e(r)))})}}};function wu(){if(typeof window>"u")return()=>{};try{Ct()}catch{return()=>{}}++si===1&&Vn("sessionStorage",Su);let e=true;return()=>{e&&(e=false,--si===0&&Bn("sessionStorage"))}}export{mu as MMKVInstanceInfoPanel,pu as MMKVInstanceSelector,su as STORAGE_OPS,Ea as StorageBrowserMode,pn as StorageEventCard,yn as StorageEventDetailContent,gn as StorageEventDetailFooter,lu as StorageEventsSection,Yd as StorageKeyCard,Yn as StorageKeySection,ou as StorageKeyStatsSection,mn as StorageModalWithTabs,qd as StorageSection,Bd as StorageToolView,Go as StorageTypeFilterBar,co as batchPairsOf,un as canUndo,Qr as clearAllAppStorage,ra as countByStorageType,Ld as createStorageTool,ht as detectMMKVType,Bi as formatMMKVValue,Ns as getMMKVClass,oa as getMMKVUnavailableMessage,Cd as getValueType,yu as isInitialScan,Yo as isMMKVAvailable,zo as isTypeMatch,Kr as isValueOnDevice,dn as jumpToState,Vn as registerMMKVInstance,Pi as registerSecureStoreKeys,Dc as requestStorageBrowserRefresh,wa as setStorageValue,wu as startBrowserStorageCapture,nn as storageEditBlockedReason,Dt as storageEventStore,du as storageOpDot,uu as storageOpOf,Fd as storageSyncAdapter,Qa as storageToolPreset,Pc as storageValueToEditableText,cn as undoOperation,Bn as unregisterMMKVInstance,zi as unregisterSecureStoreKey,Zo as useAsyncStorageKeys,ya as useMMKVInstance,ac as useMMKVInstanceExists,rn as useMMKVInstances,ec as useMMKVKeys,ca as useMultiMMKVKeys,Va as useStorageEvents,Sa as validateStorageValue};
4
+ registerMMKVInstance('mmkv.default', storage);`})]}),ue==="mmkv"&&ke.length>0&&Te(l,{style:O.instanceNavbar,children:[Te(l,{style:O.instanceNavbarHeader,children:[q(c,{style:O.instanceNavbarLabel,children:"INSTANCES"}),ke.length>Q&&q(_n,{style:{transform:[{scale:.85}]}})]}),Te(Vr,{horizontal:true,showsHorizontalScrollIndicator:false,contentContainerStyle:O.instanceNavbarScroll,children:[(C||ke.length===1)&&Te(K,{onPress:()=>Kt(null),testID:"buoy-storage-instance-all",accessibilityRole:"button",accessibilityLabel:`All ${le.mmkv} instances`,style:[O.instanceNavbarButton,re===null&&O.instanceNavbarButtonActive],children:[q(Ta,{size:12,color:re===null?L.color.text:L.color.textSecondary}),q(c,{style:[O.instanceNavbarButtonText,re===null&&O.instanceNavbarButtonTextActive],children:"All"}),q(l,{style:O.instanceNavbarBadge,children:q(c,{style:O.instanceNavbarBadgeText,children:ke.reduce((s,m)=>s+m.keyCount,0)})})]}),ke.map((s,m)=>{let U=m>=Q;return Te(K,{testID:`buoy-storage-instance-${s.id}`,accessibilityRole:"button",accessibilityLabel:`MMKV instance ${s.id}`,onPress:()=>{U?ve(true):Kt(s.id)},style:[O.instanceNavbarButton,s.id===re&&O.instanceNavbarButtonActive,{borderColor:U?L.color.border:ur(s.id)+"40",backgroundColor:s.id===re?ur(s.id)+"20":L.color.surfaceElevated,opacity:U?.5:1}],children:[q(Ta,{size:12,color:s.id===re?ur(s.id):L.color.textSecondary}),q(c,{style:[O.instanceNavbarButtonText,s.id===re&&{color:ur(s.id),fontWeight:"700"}],children:s.id}),q(l,{style:[O.instanceNavbarBadge,s.id===re&&{backgroundColor:ur(s.id)+"30"}],children:q(c,{style:[O.instanceNavbarBadgeText,s.id===re&&{color:ur(s.id)}],children:s.keyCount})})]},s.id)})]})]})]}),gi=q(vc,{copyValue:Do,mmkvInstances:ke.map(s=>({id:s.id,instance:s.instance})),activeStorageType:ue,onClearComplete:Ce,isSelectMode:Ot,onToggleSelectMode:Vo,selectedCount:Zt.size}),pi=Ot?q(Bc,{selectedKeys:Je,mmkvInstances:ke.map(s=>({id:s.id,instance:s.instance})),onDeleteComplete:Bo,onHideKeys:wr,onSelectAll:Cr,onClearSelection:xr,totalVisibleKeys:v.length}):null,fi=P?Te(K,{style:O.limitBanner,onPress:()=>ve(true),activeOpacity:.8,testID:"buoy-storage-locked-banner",accessibilityRole:"button",children:[Te(l,{style:O.limitBannerContent,children:[Te(l,{style:O.limitBannerLeft,children:[q(os,{size:16,color:L.color.accent}),q(c,{style:O.limitBannerText,children:a?`${k} matching ${k===1?"key":"keys"} in locked storage`:`${k} keys locked`})]}),q(_n,{})]}),q(c,{style:O.limitBannerSubtext,children:a?"Upgrade to Pro to search your full storage":"Upgrade to Pro to unlock full storage access"})]}):null,mi=(()=>{let s=N.some(U=>!ze(U.key)),m;return a||!s?(m=is({subject:"keys",verb:"registered",search:a,total:s?1:0,waiting:{otto:"empty",title:"No storage keys",message:"Nothing is registered for this tool to read."}}),a&&s&&(m={...m,message:"No keys match. Clear the search to see them."})):ie==="missing"?m={otto:"thumbsup",title:"No missing keys",message:"All required keys are present"}:ie==="issues"?m={otto:"cool",title:"No issues found",message:"All storage keys are correctly configured"}:m={otto:"broken",title:"No valid keys found",message:"All keys have issues or are missing"},q(as,{...m,testID:"buoy-storage-keys-empty"})})(),hi=q(ns,{visible:be,onClose:()=>ve(false),featureName:"Storage Keys"});return Te(l,{style:O.root,children:[Ft>0?q(dc,{onDone:()=>hr(0)},Ft):null,Te(Vr,{testID:"buoy-storage-scroll",ref:Ue,onScroll:s=>{mr.current=s.nativeEvent.contentOffset.y},scrollEventThrottle:32,style:O.scrollContainer,contentContainerStyle:O.container,showsVerticalScrollIndicator:false,children:[q(l,{style:O.backgroundGrid}),q(qs,{stats:$t,tabStats:dt,healthPercentage:Tr,healthStatus:di,healthColor:ui,activeFilter:ie,onFilterChange:He,activeStorageType:ue,onStorageTypeChange:Qt,showStatus:!ee}),yi,Me.length>0?Te(l,{style:O.keysSection,children:[Te(l,{style:O.sectionHeader,children:[Te(l,{style:O.sectionHeaderLeft,children:[Te(c,{style:O.sectionTitle,children:[ie==="all"?"KEYS":ie==="missing"?"MISSING KEYS":"ISSUES TO FIX",ue!=="all"&&` (${ue.toUpperCase()})`]}),q(l,{style:O.countBadge,children:q(c,{style:O.countText,children:v.length})})]}),gi]}),pi,q(Yn,{title:"",count:-1,keys:v,emptyMessage:"",isSelectMode:Ot,selectedKeys:Zt,onSelectionChange:et,eventCountByKey:u,onViewHistory:y,onHideKey:s=>wr([s]),onToggleKey:Ao,onDeleteKey:Jr,editBlockedFor:kr,pinnedKeys:h,onTogglePin:b,onRowRef:ct,onOpenKey:E}),fi]}):mi,q(c,{style:O.techFooter,children:"ASYNC STORAGE | MMKV | SECURE STORAGE BACKENDS"}),hi]})]})}var O=ge.create({root:{flex:1,minHeight:0},editorOverlay:{...On,zIndex:10},scrollContainer:{flex:1,backgroundColor:"transparent"},container:{padding:12,paddingBottom:120},backgroundGrid:{...On,opacity:.006,backgroundColor:dr.info},techFooter:{fontSize:8,color:L.color.textTertiary,fontFamily:Br,textAlign:"center",marginTop:20,letterSpacing:1,opacity:.5},keysSection:{marginTop:8,backgroundColor:L.color.bg,borderRadius:12,padding:12,borderWidth:1,borderColor:L.color.border},sectionHeader:{flexDirection:"row",justifyContent:"space-between",alignItems:"center",marginBottom:10,paddingBottom:6,borderBottomWidth:1,borderBottomColor:L.color.separator},sectionHeaderLeft:{flexDirection:"row",alignItems:"center",gap:8},sectionTitle:{fontSize:12,fontWeight:"600",color:L.color.textSecondary,letterSpacing:.4,textTransform:"uppercase"},countBadge:{backgroundColor:L.color.surfaceElevated,paddingHorizontal:8,paddingVertical:3,borderRadius:6,borderWidth:1,borderColor:L.color.border},countText:{fontSize:11,fontWeight:"600",color:L.color.text,fontFamily:Br},emptyState:{alignItems:"center",justifyContent:"center",paddingVertical:48},emptyTitle:{fontSize:16,fontWeight:"600",color:L.color.text,marginTop:12,marginBottom:8},emptySubtitle:{fontSize:13,color:L.color.textSecondary,textAlign:"center"},emptyMMKVState:{backgroundColor:L.color.surface,borderRadius:12,padding:20,borderWidth:1,borderColor:L.color.border,marginTop:8,alignItems:"center"},emptyMMKVTitle:{fontSize:14,fontWeight:"600",color:L.color.text,marginBottom:6},emptyMMKVSubtitle:{fontSize:12,color:L.color.textSecondary,textAlign:"center",marginBottom:12},emptyMMKVCode:{fontSize:10,fontFamily:Br,color:L.color.accent,backgroundColor:L.color.bg,padding:12,borderRadius:8,borderWidth:1,borderColor:L.color.border,alignSelf:"stretch"},instanceNavbar:{marginTop:12,marginBottom:8,backgroundColor:L.color.surface,borderRadius:10,borderWidth:1,borderColor:L.color.border,padding:10,shadowColor:"#000",shadowOpacity:.08,shadowRadius:6,shadowOffset:{width:0,height:2}},instanceNavbarHeader:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginBottom:8,paddingLeft:2},instanceNavbarLabel:{fontSize:9,fontWeight:"700",color:L.color.textTertiary,textTransform:"uppercase",letterSpacing:1},instanceNavbarScroll:{gap:8,paddingRight:8},instanceNavbarButton:{flexDirection:"row",alignItems:"center",gap:6,paddingHorizontal:12,paddingVertical:8,backgroundColor:L.color.surfaceElevated,borderRadius:8,borderWidth:1,borderColor:L.color.border,minWidth:90},instanceNavbarButtonActive:{borderWidth:1.5,shadowColor:"#000",shadowOpacity:.1,shadowRadius:4,shadowOffset:{width:0,height:1}},instanceNavbarButtonText:{fontSize:11,fontWeight:"600",color:L.color.textSecondary,fontFamily:Br,flex:1},instanceNavbarButtonTextActive:{fontWeight:"700",color:L.color.text},instanceNavbarBadge:{backgroundColor:L.color.bg,paddingHorizontal:6,paddingVertical:2,borderRadius:6,minWidth:24,alignItems:"center"},instanceNavbarBadgeText:{fontSize:10,fontWeight:"700",color:L.color.textSecondary,fontFamily:Br},clearSearchButton:{marginTop:16,paddingHorizontal:16,paddingVertical:8,backgroundColor:L.color.surfaceElevated,borderRadius:6,borderWidth:1,borderColor:L.color.border},clearSearchText:{fontSize:13,color:L.color.text,fontWeight:"500"},limitBanner:{backgroundColor:L.color.surface,borderRadius:10,borderWidth:1,borderColor:L.color.accentBorderStrong,padding:12,marginTop:12},limitBannerContent:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginBottom:4},limitBannerLeft:{flexDirection:"row",alignItems:"center",gap:8},limitBannerText:{color:L.color.text,fontSize:13,fontWeight:"600"},limitBannerSubtext:{color:L.color.textTertiary,fontSize:11}});import{jsx as Lc}from"react/jsx-runtime";function Ea({requiredStorageKeys:e=[],showFilters:t=false,ignoredPatterns:r=new Set,onTogglePattern:o,onAddPattern:n,searchQuery:a="",storageDataRef:i,eventCountByKey:u,lastWriteByKey:d,onViewHistory:y,enabledStorageTypes:g,statusFilter:p,onStatusFilterChange:f,onStatusCountsChange:x,pinnedKeys:h,onTogglePin:b,applySafeAreaInset:S,storageTypeFilter:w,onStorageTypeFilterChange:T,detailKey:I,onOpenKey:E,onCloseDetail:D}){return Lc(Oc,{requiredStorageKeys:e,showFilters:t,ignoredPatterns:r,onTogglePattern:o,onAddPattern:n,searchQuery:a,storageDataRef:i,eventCountByKey:u,lastWriteByKey:d,onViewHistory:y,enabledStorageTypes:g,statusFilter:p,onStatusFilterChange:f,onStatusCountsChange:x,pinnedKeys:h,onTogglePin:b,applySafeAreaInset:S,storageTypeFilter:w,onStorageTypeFilterChange:T,detailKey:I,onOpenKey:E,onCloseDetail:D})}import{ProFeatureBanner as Wc}from"@buoy-gg/shared-ui/web";V();import{useMemo as _c}from"react";import{useEventStoreEvents as $c}from"@buoy-gg/shared-ui/web";V();import{BaseEventStore as Nc}from"@buoy-gg/shared-ui/web";function Kr(e){return!!e&&typeof e=="object"&&e.__buoyValueOnDevice===true}function co(e){return e.storageType!=="async"||!e.data?{}:{pairs:e.data.pairs,prevPairs:e.data.prevPairs}}function Ra(e){let t=e.data;if(!t)return false;let{pairs:r,prevPairs:o}=co(e);return Kr(t.value)||Kr(t.prevValue)||Kr(r)||Kr(o)}var qc=0;function uo(){return`se-${Date.now()}-${++qc}`}var Hc=class extends Nc{constructor(){super({storeName:"storage",maxEvents:500});this.asyncStorageUnsubscribe=null;this.mmkvUnsubscribe=null;this.hasScannedInitialState=false}async scanExistingState(){if(this.hasScannedInitialState)return;this.hasScannedInitialState=true;let e=new Date,t=Pe.getAll();for(let{id:r,instance:o}of t)try{let n=o.getAllKeys();for(let a of n){let{value:i,type:u}=ht(o,a),d={string:"set.string",number:"set.number",boolean:"set.boolean",buffer:"set.buffer"}[u]??"set.string";this.addEvent({action:d,timestamp:e,instanceId:r,data:{key:a,value:i,valueType:u,initialScan:true},storageType:"mmkv",id:uo()})}}catch{}try{let{asyncStorage:r,readMany:o}=(Nt(),ki(kn));if(r){let n=await r.getAllKeys();if(n.length>0){let a=await o(n);for(let[i,u]of a)this.addEvent({action:"setItem",timestamp:e,data:{key:i,value:u??void 0,initialScan:true},storageType:"async",id:uo()})}}}catch{}}async startCapturing(){Xs()||await Zs(),this.asyncStorageUnsubscribe||(this.asyncStorageUnsubscribe=aa(e=>{let t={...e,storageType:"async",id:uo()};this.addEvent(t)})),this.mmkvUnsubscribe||(this.mmkvUnsubscribe=Rn(e=>{let t={...e,storageType:"mmkv",id:uo()};this.addEvent(t)})),await this.scanExistingState()}stopCapturing(){this.asyncStorageUnsubscribe&&(this.asyncStorageUnsubscribe(),this.asyncStorageUnsubscribe=null),this.mmkvUnsubscribe&&(this.mmkvUnsubscribe(),this.mmkvUnsubscribe=null)}isCapturing(){return this.asyncStorageUnsubscribe!==null||this.mmkvUnsubscribe!==null}getEventsByType(e){return this.events.filter(t=>t.storageType===e)}replaceEvents(e){let t=new Map;for(let o of this.events)Ra(o)||t.set(o.id,o);let r=e.map(o=>{let n=t.get(o.id);return!n||!Ra(o)?o:{...o,data:{...o.data,value:n.data?.value,prevValue:n.data?.prevValue,...co(n)}}});super.replaceEvents(r)}hydrateEvent(e){let t=this.events.findIndex(n=>n.id===e.id);if(t===-1)return;let r=this.events[t],o=this.events.slice();o[t]={...r,...e,timestamp:r.timestamp,data:{...r.data,...e.data}},super.replaceEvents(o)}},Dt=new Hc;function Va(e={}){let{storageType:t="all",maxEvents:r=500,enabled:o=true}=e,n=_c(()=>t==="all"?void 0:d=>d.filter(y=>y.storageType===t),[t]),{events:a,clearEvents:i,isActive:u}=$c(Dt,{maxEvents:r,enabled:o,select:n});return{events:a,clearEvents:i,isCapturing:u}}V();import{useState as yo,useCallback as it,useMemo as Mt,useEffect as Ba,useRef as jc}from"react";import Aa from"@buoy-gg/shared-ui/web/asyncStorage";import{formatRelativeTime as go,macOSColors as po,night as Jt,parseValue as fo,devToolsStorageKeys as Da,GitBranch as Uc,EventStepperFooter as Jc,EventHistoryViewer as Gc,copyToClipboard as Yc,ProUpgradeModal as Qc,monoFont as Ma}from"@buoy-gg/shared-ui/web";import{useIsPro as Zc}from"@buoy-gg/license/web";V();import{computeLineDiff as Ky,DiffType as Fy,ABSENT_VALUE as Xc,isAbsent as Oy}from"@buoy-gg/shared-ui/web/dataViewer";V();import{ThemedSplitView as ed}from"@buoy-gg/shared-ui/web/dataViewer";V();import{diffThemes as td,gitClassicTheme as _y,devToolsDefaultTheme as $y}from"@buoy-gg/shared-ui/web/dataViewer";V();import{night as Pa}from"@buoy-gg/shared-ui/web";import{TreeDiffViewer as rd}from"@buoy-gg/shared-ui/web/dataViewer";import{jsx as za}from"react/jsx-runtime";function od({oldValue:e,newValue:t,scrollEnabled:r=true}){return za(l,{style:r?Ka.container:Ka.containerInline,children:za(rd,{oldValue:e,newValue:t,theme:"dark",scrollEnabled:r})})}var Ka=ge.create({container:{flex:1,backgroundColor:Pa.color.bg},containerInline:{backgroundColor:Pa.color.bg}});V();function an(e){switch(e){case"setItem":return"SET";case"removeItem":return"REMOVE";case"mergeItem":return"MERGE";case"clear":return"CLEAR";case"multiSet":return"MULTI SET";case"multiRemove":return"MULTI REMOVE";case"multiMerge":return"MULTI MERGE";case"set.string":case"set.number":case"set.boolean":case"set.buffer":return"SET";case"delete":return"REMOVE";case"clearAll":return"CLEAR";case"get.string":case"get.number":case"get.boolean":case"get.buffer":return"GET";default:return"UNKNOWN ACTION"}}V();import{night as Ie,Lock as nd,monoFont as ad}from"@buoy-gg/shared-ui/web";import{jsx as ln,jsxs as id}from"react/jsx-runtime";var ld={copy:{color:Ie.color.accent,backgroundColor:Ie.color.accentSoft,borderColor:Ie.color.accentBorderStrong,textColor:Ie.color.accent},jump:{color:Ie.color.warning,backgroundColor:Ie.color.warningSoft,borderColor:Ie.color.warning+"40",textColor:Ie.color.warning},undo:{color:Ie.color.info,backgroundColor:Ie.color.infoSoft,borderColor:Ie.color.info+"40",textColor:Ie.color.info}};function sn({onPress:e,text:t,type:r,disabled:o=false,locked:n=false}){let a=ld[r],i=o||n;return id(K,{disabled:i,onPress:e,style:[mo.button,{backgroundColor:i?Ie.color.fill:a.backgroundColor,borderColor:i?Ie.color.fillTertiary:a.borderColor,opacity:o?.5:1}],activeOpacity:.7,testID:`buoy-storage-action-${r}`,accessibilityRole:"button",accessibilityLabel:t,accessibilityState:{disabled:i},children:[n?ln(nd,{size:10,color:Ie.color.textTertiary,style:mo.lockIcon}):ln(l,{style:[mo.dot,{backgroundColor:i?Ie.color.textTertiary:a.color}]}),ln(c,{style:[mo.text,{color:i?Ie.color.textTertiary:a.textColor}],children:t})]})}var mo=ge.create({button:{flexDirection:"row",alignItems:"center",justifyContent:"center",borderRadius:6,borderWidth:1,paddingHorizontal:12,paddingVertical:6,height:25,minWidth:70,shadowOffset:{width:0,height:1},shadowOpacity:.2,shadowRadius:2,elevation:2},dot:{width:5,height:5,borderRadius:3,marginRight:6,shadowColor:Ie.color.text,shadowOffset:{width:0,height:0},shadowOpacity:.6,shadowRadius:2},lockIcon:{marginRight:4},text:{fontSize:10,fontWeight:"600",letterSpacing:.5,textTransform:"uppercase",fontFamily:ad,height:12}});V();Nt();import{isDevToolsStorageKey as sd}from"@buoy-gg/shared-ui/web";import yr from"@buoy-gg/shared-ui/web/asyncStorage";function Pt(e){return!!e&&typeof e=="object"&&e.__buoyValueOnDevice===true}async function cn(e){let{action:t,data:r}=e;if(Pt(r?.prevValue)||Pt(r?.prevPairs))throw new Error("Cannot undo: previous value is still on the device \u2014 fetch getEventDetail first");switch(t){case"setItem":case"mergeItem":r?.key&&(r.prevValue===null||r.prevValue===void 0?await yr.removeItem(r.key):await yr.setItem(r.key,r.prevValue));break;case"removeItem":r?.key&&r.prevValue!==null&&r.prevValue!==void 0&&await yr.setItem(r.key,r.prevValue);break;case"multiSet":case"multiMerge":if(r?.prevPairs&&r.prevPairs.length>0)for(let[o,n]of r.prevPairs)n===null?await yr.removeItem(o):await yr.setItem(o,n);break;case"multiRemove":if(r?.prevPairs&&r.prevPairs.length>0)for(let[o,n]of r.prevPairs)n!==null&&await yr.setItem(o,n);break;case"clear":if(r?.prevPairs&&r.prevPairs.length>0){let o=r.prevPairs.filter(([,n])=>n!==null);o.length>0&&await Ir(o)}break;default:throw new Error(`Cannot undo unknown action type: ${t}`)}}async function dn(e,t){if(t<0||t>=e.length)throw new Error(`Invalid event index: ${t}`);for(let i of e){let u=i.data;if(Pt(u?.value)||Pt(u?.prevValue)||Pt(u?.pairs)||Pt(u?.prevPairs))throw new Error("Cannot jump: some event values are still on the device \u2014 fetch getEventDetail first")}let r=new Map;for(let i=0;i<=t;i++)dd(e[i],r);let o=new Set;for(let i of e)cd(i,o);let n=[],a=[];for(let i of o){if(sd(i))continue;let u=r.get(i);u==null?a.push(i):n.push([i,u])}a.length>0&&await tr(a),n.length>0&&await Ir(n)}function cd(e,t){let{data:r}=e;if(r){if(r.key&&t.add(r.key),r.keys)for(let o of r.keys)t.add(o);if(r.pairs)for(let[o]of r.pairs)t.add(o);if(r.prevPairs)for(let[o]of r.prevPairs)t.add(o)}}function dd(e,t){let{action:r,data:o}=e;switch(r){case"setItem":o?.key&&o?.value!==void 0&&t.set(o.key,o.value);break;case"removeItem":o?.key&&t.set(o.key,null);break;case"mergeItem":if(o?.key&&o?.value!==void 0){let n=t.get(o.key);if(n)try{let a=JSON.parse(n),i=JSON.parse(o.value),u={...a,...i};t.set(o.key,JSON.stringify(u))}catch{t.set(o.key,o.value)}else t.set(o.key,o.value)}break;case"multiSet":if(o?.pairs)for(let[n,a]of o.pairs)t.set(n,a);break;case"multiRemove":if(o?.keys)for(let n of o.keys)t.set(n,null);break;case"multiMerge":if(o?.pairs)for(let[n,a]of o.pairs){let i=t.get(n);if(i)try{let u=JSON.parse(i),d=JSON.parse(a),y={...u,...d};t.set(n,JSON.stringify(y))}catch{t.set(n,a)}else t.set(n,a)}break;case"clear":t.clear();break}}function un(e){let{action:t,data:r}=e;switch(t){case"setItem":case"mergeItem":case"removeItem":return!!r?.key&&!Pt(r.prevValue);case"multiSet":case"multiRemove":case"multiMerge":case"clear":return!!r?.prevPairs&&r.prevPairs.length>0&&!Pt(r.prevPairs);default:return false}}import{Fragment as ud,jsx as Ne,jsxs as Fa}from"react/jsx-runtime";var gr=-1,ho={prior:{label:"BEFORE #1",timestamp:"value before first event",relativeTime:"not captured",badge:"PRIOR"},absent:{label:"NO PRIOR VALUE",timestamp:"key did not exist",relativeTime:"created here",badge:"ABSENT"},scanned:{label:"ALREADY PRESENT",timestamp:"value found at startup",relativeTime:"not a write",badge:"SCANNED"}};function bo(e){switch(e){case"setItem":case"multiSet":return po.semantic.success;case"removeItem":case"multiRemove":case"clear":return po.semantic.error;case"mergeItem":case"multiMerge":return po.semantic.info;default:return po.text.muted}}function Oa(e){let t=String(e.getHours()).padStart(2,"0"),r=String(e.getMinutes()).padStart(2,"0"),o=String(e.getSeconds()).padStart(2,"0"),n=String(e.getMilliseconds()).padStart(3,"0");return`${t}:${r}:${o}.${n}`}var yd={hideLineNumbers:false,disableWordDiff:false,showDiffOnly:false,compareMethod:"words",contextLines:3,lineOffset:0},gd=[];function yn({conversation:e,selectedEventIndex:t=0,onEventIndexChange:r=()=>{},disableInternalFooter:o=false}){let n=Zc(),[a,i]=yo(false),[u,d]=yo("split"),[y,g]=yo(Math.max(gr,t-1)),[p,f]=yo(t),x=jc(false),h=Mt(()=>e.events.sort((oe,ct)=>oe.timestamp.getTime()-ct.timestamp.getTime()),[e.events]),b=h.length;Ba(()=>{if(x.current)return;(async()=>{try{let oe=await Aa.getItem(Da.storage.diffViewerMode());(oe==="split"||oe==="tree")&&d(oe),x.current=true}catch{}})()},[]),Ba(()=>{let oe=Math.min(b-1,Math.max(0,t)),ct=Math.max(gr,Math.min(oe-1,t-1));g(ct),f(oe)},[t,b]);let S=it(async oe=>{d(oe);try{await Aa.setItem(Da.storage.diffViewerMode(),oe)}catch{}},[]),w=h[t],T=w?.action,I=y===gr,E=I?void 0:h[Math.max(0,Math.min(b-1,y))],D=h[Math.max(0,Math.min(b-1,p))],C=Mt(()=>{let oe=D?.data;return oe?.initialScan?"scanned":oe?.prevValue===null||oe?.prevValue===void 0?"absent":"prior"},[D]),R=Mt(()=>C==="absent"?Xc:C==="scanned"?fo(D?.data?.value):fo(D?.data?.prevValue),[C,D]),Q=Mt(()=>I?{index:gr,label:ho[C].label,timestamp:ho[C].timestamp,relativeTime:ho[C].relativeTime,badge:Ne(l,{style:[Gt.actionBadgeSmall,{backgroundColor:`${Jt.color.textTertiary}20`}],children:Ne(c,{style:[Gt.actionTextSmall,{color:Jt.color.textTertiary}],children:ho[C].badge})})}:{index:y,label:`#${y+1} / ${b}`,timestamp:E?Oa(E.timestamp):"",relativeTime:E?go(E.timestamp):"",badge:E?Ne(l,{style:[Gt.actionBadgeSmall,{backgroundColor:`${bo(E.action)}20`}],children:Ne(c,{style:[Gt.actionTextSmall,{color:bo(E.action)}],children:an(E.action)})}):void 0},[y,E,b,I,C]),be=Mt(()=>({index:p,label:`#${p+1} / ${b}`,timestamp:D?Oa(D.timestamp):"",relativeTime:D?go(D.timestamp):"",badge:D?Ne(l,{style:[Gt.actionBadgeSmall,{backgroundColor:`${bo(D.action)}20`}],children:Ne(c,{style:[Gt.actionTextSmall,{color:bo(D.action)}],children:an(D.action)})}):void 0}),[p,D,b]),ve=Mt(()=>[{key:"tree",label:"TREE VIEW"},{key:"split",label:"SPLIT VIEW"}],[]),H=it(()=>{y>gr&&g(y-1)},[y]),de=it(()=>{y<p-1&&g(y+1)},[y,p]),ee=it(()=>{p>y+1&&f(p-1)},[p,y]),ie=it(()=>{p<b-1&&f(p+1)},[p,b]),He=Mt(()=>I?R:fo(E?.data?.value??null),[I,R,E]),je=Mt(()=>fo(D?.data?.value),[D]),ft=it(()=>u==="split"?Ne(ed,{oldValue:He,newValue:je,differences:gd,theme:td.devToolsDefault,options:yd,showThemeName:false,scrollEnabled:false}):Ne(od,{oldValue:He,newValue:je,scrollEnabled:false}),[He,je,u]),xt=it(()=>{r(Math.max(0,t-1))},[t,r]),ue=it(()=>{r(Math.min(b-1,t+1))},[t,b,r]),Qt=it(async()=>{if(!n){i(true);return}if(!(!w||w.storageType==="mmkv"))try{await cn(w)}catch{}},[w,n]),re=it(async()=>{if(!n){i(true);return}if(!w||w.storageType==="mmkv")return;let oe=h.filter(Ft=>Ft.storageType!=="mmkv"),ct=oe.findIndex(Ft=>Ft.timestamp.getTime()===w.timestamp.getTime());if(ct!==-1)try{await dn(oe,ct)}catch{}},[w,h,n]),Kt=it(async()=>{if(!w)return;let oe={action:w.action,timestamp:w.timestamp.toISOString(),data:w.data};await Yc(oe)},[w]),Ue=w?.storageType!=="mmkv",mr=Ue&&w&&un(w);return Fa(ud,{children:[Ue&&Fa(l,{style:Gt.actionButtonsContainer,children:[Ne(sn,{type:"undo",text:"UNDO",onPress:Qt,disabled:!mr,locked:!n}),Ne(sn,{type:"jump",text:"JUMP",onPress:re,locked:!n}),Ne(sn,{type:"copy",text:"COPY",onPress:Kt})]}),Ne(Gc,{activeView:"diff",diffViewLabel:"DIFF VIEW",diffViewDescription:"Compare changes between versions",diffViewIcon:Uc,diffModeTabs:ve,activeDiffMode:u,onDiffModeChange:S,renderDiffContent:ft,scrollDiffSection:true,leftEvent:Q,rightEvent:be,showCompareNavigation:true,onLeftPrevious:H,onLeftNext:de,onRightPrevious:ee,onRightNext:ie,canLeftPrevious:y>gr,canLeftNext:y<p-1,canRightPrevious:p>y+1,canRightNext:p<b-1,disableInternalFooter:o,footerCurrentIndex:t,footerTotalItems:b,footerItemLabel:"Event",footerSubtitle:go(w?.timestamp),onFooterPrevious:xt,onFooterNext:ue}),Ne(Qc,{visible:a,onClose:()=>i(false),featureName:"Storage Time-Travel"})]})}function gn({conversation:e,selectedEventIndex:t=0,onEventIndexChange:r=()=>{},applySafeAreaInset:o=true}){let n=e.events.sort((i,u)=>i.timestamp.getTime()-u.timestamp.getTime()),a=n.length;return Ne(Jc,{currentIndex:t,totalItems:a,onPrevious:()=>r(Math.max(0,t-1)),onNext:()=>r(Math.min(a-1,t+1)),itemLabel:"Event",subtitle:go(n[t]?.timestamp),applySafeAreaInset:o})}var Gt=ge.create({actionButtonsContainer:{flexDirection:"row",justifyContent:"center",alignItems:"center",gap:8,paddingHorizontal:12,paddingVertical:10,backgroundColor:Jt.color.surface,borderBottomWidth:1,borderBottomColor:Jt.color.border},valueBox:{backgroundColor:Jt.color.bg,borderRadius:6,borderWidth:1,borderColor:Jt.color.border,padding:8},valueText:{fontSize:12,color:Jt.color.text,fontFamily:Ma,lineHeight:18},actionBadgeSmall:{paddingHorizontal:6,paddingVertical:1,borderRadius:3},actionTextSmall:{fontSize:8,fontWeight:"700",fontFamily:Ma}});V();import{Filter as La,DynamicFilterView as pd,Database as fd,HardDrive as md,Shield as hd,macOSColors as St,night as wt}from"@buoy-gg/shared-ui/web";import{jsx as zt,jsxs as pr}from"react/jsx-runtime";function bd({ignoredPatterns:e,onTogglePattern:t,onAddPattern:r,availableKeys:o=[],enabledStorageTypes:n,onToggleStorageType:a}){let i={addFilterSection:{enabled:true,placeholder:"Enter key pattern to hide...",title:"KEY FILTERS",icon:La},availableItemsSection:{enabled:true,title:"AVAILABLE EVENT KEYS",emptyMessage:"No storage event keys available. Events will appear here once captured.",items:o},howItWorksSection:{enabled:true,title:"HOW EVENT FILTERS WORK",description:"Patterns hide matching storage keys from the event list. Storage type toggles control which storage backends are monitored.",examples:["\u2022 react_buoy \u2192 hides keys containing react_buoy","\u2022 @temp \u2192 hides @temp_user, @temp_data","\u2022 redux \u2192 hides redux-persist:root",`\u2022 ${le.asyncFull}: show or hide captured events`,`\u2022 ${le.mmkv}: show or hide captured events`],icon:La},onPatternToggle:t,onPatternAdd:r,activePatterns:e};return pr(l,{style:Ze.container,children:[pr(l,{style:Ze.storageTypeSection,children:[zt(c,{style:Ze.sectionTitle,children:"STORAGE TYPES"}),pr(l,{style:Ze.storageTypeButtons,children:[pr(K,{style:[Ze.storageTypeButton,n.has("async")&&Ze.storageTypeButtonActive,{borderColor:St.semantic.warning+"40"}],onPress:()=>a("async"),testID:"buoy-storage-backend-async",accessibilityRole:"button",accessibilityLabel:`Toggle ${le.asyncFull} capture`,accessibilityState:{selected:n.has("async")},children:[zt(fd,{size:16,color:n.has("async")?St.semantic.warning:wt.color.textTertiary}),zt(c,{style:[Ze.storageTypeButtonText,n.has("async")&&{color:St.semantic.warning}],children:le.asyncFull})]}),pr(K,{style:[Ze.storageTypeButton,n.has("mmkv")&&Ze.storageTypeButtonActive,{borderColor:St.semantic.info+"40"}],onPress:()=>a("mmkv"),testID:"buoy-storage-backend-mmkv",accessibilityRole:"button",accessibilityLabel:`Toggle ${le.mmkv} capture`,accessibilityState:{selected:n.has("mmkv")},children:[zt(md,{size:16,color:n.has("mmkv")?St.semantic.info:wt.color.textTertiary}),zt(c,{style:[Ze.storageTypeButtonText,n.has("mmkv")&&{color:St.semantic.info}],children:le.mmkv})]}),le.hasSecure&&pr(K,{style:[Ze.storageTypeButton,n.has("secure")&&Ze.storageTypeButtonActive,{borderColor:St.semantic.success+"40"}],onPress:()=>a("secure"),testID:"buoy-storage-backend-secure",accessibilityRole:"button",accessibilityLabel:"Toggle Secure Storage capture",accessibilityState:{selected:n.has("secure")},children:[zt(hd,{size:16,color:n.has("secure")?St.semantic.success:wt.color.textTertiary}),zt(c,{style:[Ze.storageTypeButtonText,n.has("secure")&&{color:St.semantic.success}],children:"Secure Storage"})]})]})]}),zt(pd,{...i})]})}var Ze=ge.create({container:{flex:1},storageTypeSection:{padding:16,borderBottomWidth:1,borderBottomColor:wt.color.border},sectionTitle:{fontSize:11,fontWeight:"700",color:wt.color.textSecondary,letterSpacing:.8,marginBottom:12},storageTypeButtons:{flexDirection:"row",gap:8},storageTypeButton:{flex:1,flexDirection:"row",alignItems:"center",justifyContent:"center",gap:6,paddingVertical:10,paddingHorizontal:12,backgroundColor:wt.color.surfaceElevated,borderRadius:8,borderWidth:1,borderColor:wt.color.border},storageTypeButtonActive:{backgroundColor:wt.color.surface},storageTypeButtonText:{fontSize:11,fontWeight:"600",color:wt.color.textTertiary}});V();import{memo as vd}from"react";import{RelativeTime as Sd,macOSColors as Fr,parseValue as wd,CompactRow as kd}from"@buoy-gg/shared-ui/web";import{jsx as Wa}from"react/jsx-runtime";function Cd(e){let t=wd(e);return t===null?"null":t===void 0?"undefined":Array.isArray(t)?"array":typeof t=="boolean"?"boolean":typeof t=="number"?"number":typeof t=="string"?"string":typeof t=="object"?"object":"undefined"}function xd(e){switch(e){case"setItem":case"multiSet":case"set.string":case"set.number":case"set.boolean":case"set.buffer":return Fr.semantic.success;case"removeItem":case"multiRemove":case"clear":case"delete":case"clearAll":return Fr.semantic.error;case"mergeItem":case"multiMerge":return Fr.semantic.info;case"get.string":case"get.number":case"get.boolean":case"get.buffer":return Fr.semantic.warning;default:return Fr.text.muted}}function Td(e,t){return`${Array.from(e).map(r=>r==="async"?le.async:le.mmkv).join("/")} \xB7 ${t} op${t!==1?"s":""}`}var pn=vd(function({data:e,onPress:t,isSelected:r=false,showChevron:o=true,testID:n}){let a=xd(e.lastAction),i=an(e.lastAction),u=e.totalOperations??1;return Wa(kd,{statusDotColor:a,statusLabel:"Storage",statusSublabel:Td(e.storageTypes,u),primaryText:e.key,badgeText:i,badgeColor:a,showChevron:o,bottomRightText:Wa(Sd,{timestamp:e.lastEventTimestamp}),isSelected:r,onPress:t,testID:n,accessibilityLabel:`${i} ${e.key}`})});import{useIsPro as Id}from"@buoy-gg/license/web";import{Fragment as _a,jsx as M,jsxs as lt}from"react/jsx-runtime";var ng=es["storage.events"].free,fn={getItem:e=>Wo.getItem(e),setItem:(e,t)=>Wo.setItem(e,t)},Ed={storage:fn,parse:e=>e==="browser"||e==="events"?e:void 0,serialize:e=>e},Rd={storage:fn,parse:e=>e==="true",serialize:e=>e.toString()},$a={storage:fn,parse:e=>new Set(JSON.parse(e)),serialize:e=>JSON.stringify(Array.from(e))},Vd={...$a,parse:e=>{let t=JSON.parse(e);return t.includes("@react_buoy")||t.push("@react_buoy"),new Set(t)}};function mn({visible:e,onClose:t,onBack:r,onMinimize:o,enableSharedModalDimensions:n=false,requiredStorageKeys:a=[],inline:i=false,onTabChange:u,onRefresh:d,onEventSelect:y}){let g=Id(),p=Xl("storage.events"),[f,x]=Xr(rr.storage.activeTab(),"browser",Ed);Oo(()=>{u?.(f)},[f,u]);let[h,b]=tt(""),[S,w]=tt(null),[T,I]=tt(false),[E,D]=Xr(rr.storage.isMonitoring(),true,Rd),{events:C,clearEvents:R,isCapturing:Q}=Va({enabled:E}),[be,ve]=tt(null),[H,de]=tt(null),[ee,ie]=tt(null),[He,je]=tt(0),[ft,xt]=tt(false),[ue,Qt]=Xr(rr.storage.eventFilters(),new Set(["@react_buoy","@RNAsyncStorage","redux-persist","persist:"]),Vd),[re,Kt]=tt("all"),[Ue,mr]=tt(new Set(["async","mmkv","secure"])),[oe,ct]=Xr(rr.storage.pinnedKeys(),new Set,$a),Ft=Mn(null),hr=E&&Q,[Ot,br]=tt("bottomSheet"),Zt=Be(v=>{br(v)},[]),Tt=Be(()=>{D(v=>!v)},[]),ke=Be(()=>{R(),ve(null),je(0)},[R]),$r=Be(v=>{de(v),ie(null)},[]),Nr=Be(()=>{de(null),ie(null)},[]),qr=Be(v=>{Qt(k=>{let P=new Set(k);return P.has(v)?P.delete(v):P.add(v),P})},[]),Lt=Be(v=>{Qt(k=>new Set([...k,v]))},[]),xo=Be(v=>{ct(k=>{let P=new Set(k);return P.has(v)?P.delete(v):P.add(v),P})},[]),vr=Be(()=>{xt(!ft)},[ft]),To=Be(v=>{mr(k=>{let P=new Set(k);return P.has(v)?P.delete(v):P.add(v),P})},[]),Sr=Mn([]),Xt=Be(()=>{let v=Sr.current;return{timestamp:new Date().toISOString(),totalKeys:v.length,asyncStorage:v.filter(k=>k.storageType==="async").reduce((k,P)=>(k[P.key]=Zr(P.value),k),{}),mmkv:v.filter(k=>k.storageType==="mmkv").reduce((k,P)=>{let j=P.instanceId||"default";return k[j]||(k[j]={}),k[j][P.key]=Zr(P.value),k},{}),secure:v.filter(k=>k.storageType==="secure").reduce((k,P)=>(k[P.key]=Zr(P.value),k),{})}},[]),Io=Be(async()=>{xe.alert("Clear Storage","Choose what to clear:",[{text:"Cancel",style:"cancel"},{text:"Clear App Storage",onPress:async()=>{try{await Qr()}catch{xe.alert("Error","Failed to clear app storage")}}},{text:"Clear All (Including Dev Tools)",style:"destructive",onPress:async()=>{try{await Vi()}catch{xe.alert("Error","Failed to clear all storage")}}}])},[]),Wt=v=>{let k=ql(v);return k===null?"null":k===void 0?"undefined":Array.isArray(k)?"array":typeof k=="boolean"?"boolean":typeof k=="number"?"number":typeof k=="string"?"string":typeof k=="object"?"object":"undefined"},[Hr,Eo]=tt([]);Oo(()=>{e&&(async()=>{try{let v=await Wo.getAllKeys();Eo([...v].sort())}catch{}})()},[e]);let jr=at(()=>{let v=new Set(Hr);return C.forEach(k=>{k.data?.key&&v.add(k.data.key)}),Array.from(v).sort()},[C,Hr]),N=at(()=>{let v=new Map;return C.forEach(k=>{if(!k.data?.key)return;let P=k.data.key;if(!Ue.has(k.storageType)||Array.from(ue).some(Je=>P.includes(Je)))return;let j=v.get(P);j?(j.events.push(k),j.totalOperations++,j.storageTypes.add(k.storageType),k.timestamp>j.lastEvent.timestamp&&(j.lastEvent=k,j.currentValue=k.data.value,j.valueType=Wt(k.data.value))):v.set(P,{key:P,lastEvent:k,events:[k],totalOperations:1,currentValue:k.data.value,valueType:Wt(k.data.value),storageTypes:new Set([k.storageType])})}),Array.from(v.values()).sort((k,P)=>P.lastEvent.timestamp.getTime()-k.lastEvent.timestamp.getTime())},[C,ue,Ue]),Se=at(()=>be&&N.find(v=>v.key===be)||null,[be,N]),Ro=at(()=>{let v={};return N.forEach(k=>{v[k.key]=k.totalOperations}),v},[N]),Ur=at(()=>{let v={};return N.forEach(k=>{v[k.key]=k.lastEvent.timestamp.getTime()}),v},[N]),Ce=at(()=>H&&N.find(v=>v.key===H)||null,[H,N]);Oo(()=>{if(!y)return;let v=Se||(ee!==null?Ce:null),k=Se?He:ee;if(!v||k==null)return;let P=[...v.events].sort((Cr,xr)=>Cr.timestamp.getTime()-xr.timestamp.getTime()),j=P[k],Je=P[k-1];j&&y(j),Je&&y(Je)},[y,Se,He,Ce,ee]);let Xe=at(()=>C.filter(v=>{if(!v.data?.key||!Ue.has(v.storageType))return false;let k=v.data.key;return!Array.from(ue).some(P=>k.includes(P))}),[C,ue,Ue]),Vo=at(()=>ra(Xe),[Xe]),et=at(()=>re==="all"?Xe:Xe.filter(v=>v.storageType===re),[Xe,re]),Bo=Be(()=>et.map(v=>({key:v.data?.key,action:v.action,value:Zr(v.data?.value),storageType:v.storageType,timestamp:v.timestamp.toISOString()})),[et]),wr=at(()=>et.slice(0,p),[et,p]),_t=at(()=>Math.max(0,et.length-p),[et.length,p]),Ao=.8,Jr=Be(v=>v.id,[]),kr=Be(v=>{let k=N.find(j=>j.key===v.data?.key);if(!k)return;let P=[...k.events].sort((j,Je)=>j.timestamp.getTime()-Je.timestamp.getTime()).findIndex(j=>j.timestamp.getTime()===v.timestamp.getTime());ve(k.key),je(P>=0?P:0)},[N]),Do=Be(({item:v})=>{let k={key:v.data?.key||"",lastAction:v.action,totalOperations:1,lastEventTimestamp:v.timestamp,storageTypes:new Set([v.storageType]),valueType:Wt(v.data?.value)};return M(pn,{data:k,onPress:()=>kr(v),testID:`buoy-storage-event-${v.id}`})},[kr]);if(!e)return null;let $t=n?rr.modal.root():rr.storage.modal(),dt=()=>{if(ft)return M(bd,{ignoredPatterns:ue,onTogglePattern:qr,onAddPattern:Lt,availableKeys:jr,enabledStorageTypes:Ue,onToggleStorageType:To});if(f==="browser"){if(H&&Ce){if(ee!==null)return M(l,{style:me.contentWrapper,children:M(yn,{conversation:Ce,selectedEventIndex:ee,onEventIndexChange:ie,disableInternalFooter:true})});let k=[...Ce.events].sort((j,Je)=>j.timestamp.getTime()-Je.timestamp.getTime()),P=[...k].reverse();return M(Lo,{testID:"buoy-storage-history-list",style:me.flexFill,data:P,keyExtractor:j=>j.id,renderItem:({item:j})=>{let Je=k.findIndex(xr=>xr.timestamp.getTime()===j.timestamp.getTime()),Cr={key:j.data?.key||"",lastAction:j.action,totalOperations:1,lastEventTimestamp:j.timestamp,storageTypes:new Set([j.storageType]),valueType:Wt(j.data?.value)};return M(pn,{data:Cr,onPress:()=>ie(Je>=0?Je:0),testID:`buoy-storage-history-event-${j.id}`})},contentContainerStyle:me.listContent,ItemSeparatorComponent:()=>M(l,{style:me.separator}),initialNumToRender:20})}return M(Ea,{requiredStorageKeys:a,ignoredPatterns:ue,onTogglePattern:qr,onAddPattern:Lt,searchQuery:h,storageDataRef:Sr,eventCountByKey:Ro,lastWriteByKey:Ur,onViewHistory:$r,enabledStorageTypes:Ue,pinnedKeys:oe,onTogglePin:xo,applySafeAreaInset:Ot==="bottomSheet",storageTypeFilter:re,onStorageTypeFilterChange:Kt,detailKey:S,onOpenKey:w,onCloseDetail:()=>w(null)})}if(Se)return M(l,{style:me.contentWrapper,children:M(yn,{conversation:Se,selectedEventIndex:He,onEventIndexChange:je,disableInternalFooter:true})});let v=M(l,{style:me.eventFilterBar,children:M(Go,{active:re,onChange:Kt,counts:Vo})});if(et.length===0){let k=re!=="all";return lt(l,{style:me.flexFill,children:[v,M(jl,{testID:"buoy-storage-events-empty",...hr?k?{otto:"filtering",title:`No ${re} events`,message:"Other backends have events \u2014 pick All Types to see them"}:{otto:"listening",title:"No storage events yet",message:"Storage operations will appear here"}:{otto:"paused",title:"Event listener is paused",message:"Press play to start monitoring"}})]})}return lt(l,{style:me.flexFill,children:[v,M(Lo,{testID:"buoy-storage-events-list",style:me.flexFill,data:wr,renderItem:Do,keyExtractor:Jr,onEndReachedThreshold:Ao,contentContainerStyle:me.listContent,ListFooterComponent:_t>0?M(l,{style:me.lockedBannerContainer,children:M(Wc,{featureName:`${_t} event${_t>1?"s":""} locked`,description:"Upgrade to Pro to unlock full event history"})}):null,initialNumToRender:10,maxToRenderPerBatch:10,windowSize:10})]})},er=Se&&Se.events.length>1?M(gn,{conversation:Se,selectedEventIndex:He,onEventIndexChange:je,applySafeAreaInset:Ot==="bottomSheet"}):Ce&&ee!==null&&Ce.events.length>1?M(gn,{conversation:Ce,selectedEventIndex:ee,onEventIndexChange:ie,applySafeAreaInset:Ot==="bottomSheet"}):null,vn=ft?()=>xt(false):ee!==null?()=>ie(null):H?Nr:Se?()=>{ve(null),je(0)}:r,Me=ft?lt(Ae,{children:[M(Ae.Navigation,{onBack:()=>xt(false)}),M(Ae.Content,{title:"Filters"})]}):H?lt(Ae,{children:[M(Ae.Navigation,{onBack:ee!==null?()=>ie(null):Nr}),M(Ae.Content,{title:`${H} History`,centered:true})]}):Se?lt(Ae,{children:[M(Ae.Navigation,{onBack:()=>{ve(null),je(0)}}),M(Ae.Content,{title:Se.key})]}):S?lt(Ae,{children:[M(Ae.Navigation,{onBack:()=>w(null)}),M(Ae.Content,{title:S.key,centered:true,testID:"buoy-storage-detail-title"})]}):lt(Ae,{children:[r&&M(Ae.Navigation,{onBack:r}),M(Ae.Content,{title:"",children:T?M(Yl,{value:h,onChange:b,onClear:()=>{b(""),I(false)},placeholder:"Search storage keys...",testID:"buoy-storage-search",autoFocus:true,onSubmitEditing:()=>I(false),returnKeyType:"search",containerStyle:me.headerSearchContainer}):M(Nl,{tabs:[{key:"browser",label:"Storage"},{key:"events",label:`Events${et.length>0?` (${et.length})`:""}`}],activeTab:f,testIDPrefix:"buoy-storage-tab",onTabChange:v=>{x(v),de(null),ie(null),ve(null),je(0),w(null)}})}),lt(Ae.Actions,{children:[d&&!T?M(K,{onPress:d,style:me.iconButton,testID:"buoy-storage-refresh",accessibilityLabel:"Refresh storage",accessibilityRole:"button",children:M(Jl,{size:14,color:Oe.color.textSecondary})}):null,M(K,{onPress:vr,testID:"buoy-storage-filters",accessibilityLabel:"Storage filters",accessibilityRole:"button",style:[me.iconButton,(ue.size>0||Ue.size<3)&&me.activeFilterButton],children:M(Ul,{size:14,color:ue.size>0||Ue.size<3?Oe.color.accent:Oe.color.textSecondary})}),f==="browser"&&!T&&lt(_a,{children:[M(K,{onPress:()=>I(true),testID:"buoy-storage-search-open",accessibilityLabel:"Open search",accessibilityRole:"button",style:me.iconButton,children:M(Gl,{size:14,color:Oe.color.textSecondary})}),M(Kn,{value:Xt,disabled:Sr.current.length===0,buttonStyle:me.iconButton,testID:"buoy-storage-copy"})]}),f==="events"&&lt(_a,{children:[M(Kn,{value:Bo,disabled:et.length===0,buttonStyle:me.iconButton,testID:"buoy-storage-events-copy"}),M(Ql,{isEnabled:hr,onToggle:Tt,accessibilityLabel:"Toggle storage event monitoring",testID:"buoy-storage-power"}),M(Zl,{onPress:ke,buttonStyle:me.iconButton,testID:"buoy-storage-clear-events"})]})]})]});return i?M(Fn,{children:lt(l,{style:me.inlineRoot,children:[M(l,{style:me.inlineHeader,...ts,children:Me}),dt(),er]})}):M(Fn,{children:M($l,{visible:e,onClose:t,onBack:vn,onMinimize:o,persistenceKey:$t,header:{showToggleButton:true,customContent:Me},onModeChange:Zt,enablePersistence:true,initialMode:"bottomSheet",enableGlitchEffects:true,styles:{},footer:er,footerHeight:er?68:0,disableScrollWrapper:true,children:dt()})})}function Bd(e={}){return M(mn,{...e,inline:true,visible:true,onClose:()=>{}})}var me=ge.create({inlineRoot:{flex:1,minHeight:0,backgroundColor:"transparent"},inlineHeader:{paddingHorizontal:12,paddingVertical:8,borderBottomWidth:1,borderBottomColor:Hl.border.default,backgroundColor:"transparent"},headerSearchContainer:{flex:1},flexFill:{flex:1},iconButton:{width:32,height:32,borderRadius:8,backgroundColor:Oe.color.buttonSurface,borderWidth:1,borderColor:Oe.color.border,alignItems:"center",justifyContent:"center"},activeFilterButton:{backgroundColor:Oe.color.accentSoft,borderColor:Oe.color.accentBorderStrong},separator:{height:8},listContent:{paddingVertical:6},lockedBannerContainer:{marginTop:8,marginHorizontal:16},eventFilterBar:{paddingHorizontal:12,paddingTop:8,paddingBottom:4},emptyState:{flex:1,justifyContent:"center",alignItems:"center",padding:32},emptyTitle:{color:Oe.color.text,fontSize:16,fontWeight:"600",marginTop:16,marginBottom:8,fontFamily:eo,letterSpacing:.5,textTransform:"uppercase"},emptySubtitle:{color:Oe.color.textSecondary,fontSize:14,textAlign:"center",fontFamily:eo},eventNavigation:{flexDirection:"row",alignItems:"center",gap:8,paddingHorizontal:8},navButton:{padding:4,borderRadius:4},navButtonDisabled:{opacity:.3},eventCounter:{color:Oe.color.text,fontSize:12,fontWeight:"600",fontFamily:eo,paddingHorizontal:8},headerTopRow:{flexDirection:"row",alignItems:"center",gap:8,marginBottom:12},keyNameContainer:{flex:1,flexDirection:"row",alignItems:"center",gap:6,backgroundColor:Oe.color.surfaceElevated,paddingHorizontal:10,paddingVertical:4,borderRadius:6,borderWidth:1,borderColor:Oe.color.border,height:28},keyNameText:{flex:1,fontSize:13,fontWeight:"600",color:Oe.color.accent,fontFamily:eo,letterSpacing:.5},contentWrapper:{flex:1}});V();Nt();import Or from"@buoy-gg/shared-ui/web/asyncStorage";import{approxJsonSize as Na,isDevToolsStorageKey as Lr,isOverWireBudget as qa,isJsonSerializable as Ad}from"@buoy-gg/shared-ui/web";var vo=Object.freeze({__buoyValueOnDevice:true,note:"Value stays on the device \u2014 fetched on demand via getEventDetail / mmkv.get / secure.get."}),Dd=16*1024,hn=1.25*1024*1024,Ha=8*1024*1024;function bn(e){return e===void 0?e:qa(e,Dd)?vo:e}function So(e,t){let r=e.data;if(!r)return e;let o=t(r.value),n=t(r.prevValue),a=co(e),i=t(a.pairs),u=t(a.prevPairs);return o===r.value&&n===r.prevValue&&i===a.pairs&&u===a.prevPairs?e:{...e,data:{...r,value:o,prevValue:n,...e.storageType==="async"?{pairs:i,prevPairs:u}:{}}}}function ja(e){return e===void 0||!qa(e,Ha)?e:Ad(e)?{__buoyTruncated:true,note:`Exceeds the ${Ha/(1024*1024)}MB detail limit \u2014 inspect it on-device.`}:vo}var Ua=new WeakMap,Ja=new WeakMap;function Md(e){let t=Ua.get(e);if(t)return t;let r;try{let o=So(e,bn);r={event:o,bytes:Na(o,hn).bytes}}catch{r={event:So(e,()=>vo),bytes:1024}}return Ua.set(e,r),r}function Pd(e){let t=Ja.get(e);if(t)return t;let r=So(e,n=>n===void 0?void 0:vo),o={event:r,bytes:Na(r,hn).bytes};return Ja.set(e,o),o}function zd(e){let t=new Array(e.length),r=0;for(let o=0;o<e.length;o++){let n=Md(e[o]);if(r+n.bytes<=hn)t[o]=n.event,r+=n.bytes;else{let a=Pd(e[o]);t[o]=a.event,r+=a.bytes}}return t}function Ga(e){let t=Pe.get(e);if(!t)throw new Error(`No MMKV instance registered as "${e}"`);if(t.instance?.isReadOnly)throw new Error(`MMKV instance "${e}" is registered read-only`);return t.instance}var Ya=[];function Kd(e){Ya=e}var Fd={version:3,getSnapshot:()=>zd(Dt.getEvents().filter(e=>{let t=e.data?.key;return!(typeof t=="string"&&Lr(t))})),subscribe:e=>Dt.subscribeToEvents(e),actions:{clearEvents:()=>{Dt.clearEvents()},getRequiredKeys:()=>Ya,getEventDetail:e=>{let{id:t}=e??{};if(!t)return{found:false,reason:"missing id"};let r=Dt.getEvents().find(n=>n.id===t);if(!r)return{found:false,reason:"unknown id"};let o=So(r,ja);return{found:true,id:t,event:o}},clearAppStorage:()=>Qr(),"timeTravel.undo":async e=>{let t=e?.id;if(!t)throw new Error("timeTravel.undo requires an event `id`");let r=Dt.getEvents().find(n=>n.id===t);if(!r)throw new Error(`No storage event with id "${t}"`);if(r.storageType==="mmkv")throw new Error("Time travel supports AsyncStorage events only");let o=r;if(!un(o))throw new Error(`Event "${t}" (${o.action}) has no previous value captured, so it cannot be undone`);return await cn(o),{undone:true,action:o.action,key:o.data?.key}},"timeTravel.jump":async e=>{let{id:t,scope:r="key"}=e??{};if(!t)throw new Error("timeTravel.jump requires an event `id`");let o=Dt.getEvents().filter(u=>u.storageType!=="mmkv").slice().reverse(),n=o.find(u=>u.id===t);if(!n)throw new Error(`No AsyncStorage event with id "${t}"`);let a=r==="all"?o:o.filter(u=>u.data?.key===n.data?.key),i=a.findIndex(u=>u.id===t);if(i===-1)throw new Error(`Event "${t}" is not in the timeline`);return await dn(a,i),{jumped:true,scope:r,replayed:i+1,of:a.length,key:n.data?.key}},"async.getAllKeys":async()=>(await Or.getAllKeys()).filter(e=>!Lr(e)),"async.multiGet":async e=>(await Gr(e.keys)).filter(([t])=>!Lr(t)),"async.getItem":e=>{let{key:t}=e;return Lr(t)?Promise.resolve(null):Or.getItem(t)},"async.setItem":e=>{let{key:t,value:r}=e;return Or.setItem(t,r)},"async.removeItem":e=>Or.removeItem(e.key),"async.multiRemove":e=>tr(e.keys),"async.multiSet":e=>Ir(e.pairs),"async.clear":()=>Or.clear(),"mmkv.snapshot":()=>Pe.getAll().map(({id:e,instance:t,encrypted:r,readOnly:o})=>{let n=[];try{n=t.getAllKeys().filter(a=>!Lr(a)).map(a=>{let{value:i,type:u}=ht(t,a);return{key:a,value:bn(i),valueType:u}})}catch{}return{id:e,encrypted:r,readOnly:o,entries:n}}),"mmkv.get":e=>{let{instanceId:t,key:r}=e??{};if(!t||!r)return{found:false,reason:"missing instanceId/key"};let o=Pe.get(t);if(!o)return{found:false,reason:"unknown instance"};let{value:n,type:a}=ht(o.instance,r);return{found:true,instanceId:t,key:r,value:ja(n),valueType:a}},"mmkv.set":e=>{let{instanceId:t,key:r,value:o}=e;Ga(t).set(r,o)},"mmkv.remove":e=>{let{instanceId:t,key:r}=e,o=Ga(t);o.remove?o.remove(r):o.delete?.(r)},"secure.keys":async()=>{let e=te.getModule();return Promise.all(te.getAll().map(async({key:t,options:r,description:o})=>{let n=null;if(e&&!r.requireAuthentication)try{n=await e.getItemAsync(t,r)!=null}catch{n=null}return{key:t,description:o,keychainService:r.keychainService,requireAuthentication:r.requireAuthentication??false,hasValue:n}}))},"secure.snapshot":async()=>{let e=te.getModule(),t=te.getAll(),r=[];for(let{key:o,options:n,description:a}of t){let i=null;if(e&&!n.requireAuthentication)try{i=await e.getItemAsync(o,n)}catch{}r.push({key:o,description:a,keychainService:n.keychainService,requireAuthentication:n.requireAuthentication??false,value:i==null?i:bn(i)})}return r},"secure.get":e=>{let{key:t}=e,r=te.getAll().find(n=>n.key===t),o=te.getModule();return!r||!o||r.options.requireAuthentication?Promise.resolve(null):o.getItemAsync(t,r.options)},"secure.set":e=>{let{key:t,value:r}=e;return te.setValue(t,r)},"secure.delete":e=>te.deleteValue(e.key)}};import{jsx as Od}from"react/jsx-runtime";var Qa=qi({id:"storage",name:"STORAGE",description:"AsyncStorage browser",slot:"both",icon:({size:e})=>Od($i,{size:e}),component:mn,props:{requiredStorageKeys:[],enableSharedModalDimensions:false}}),Ld=Ni(Qa,e=>(Kd(e.requiredStorageKeys||[]),{requiredStorageKeys:e.requiredStorageKeys||[],enableSharedModalDimensions:e.enableSharedModalDimensions??false}));V();import{HardDrive as Wd,CyberpunkSectionButton as _d}from"@buoy-gg/shared-ui/web";import{isDevToolsStorageKey as $d}from"@buoy-gg/shared-ui/web";import{jsx as Nd}from"react/jsx-runtime";function qd({onPress:e}){let{storageKeys:t}=Zo(),r=t.filter(n=>!$d(n.key)).length,o=r;return Nd(_d,{id:"storage",title:"STORAGE",subtitle:o===0?"Empty":`${r} Async`,icon:Wd,iconColor:"#00FF88",iconBackgroundColor:"rgba(0, 255, 136, 0.1)",onPress:e,index:2})}V();import{AlertCircle as Za,CheckCircle2 as Hd,Eye as Xa,XCircle as ei,HardDrive as ti,Database as ri,Shield as jd,gameUIColors as wo,macOSColors as ne,night as he,monoFont as ko}from"@buoy-gg/shared-ui/web";import{DataViewer as Ud}from"@buoy-gg/shared-ui/web/dataViewer";import{jsx as Y,jsxs as Ve}from"react/jsx-runtime";var oi=[ne.semantic.info,ne.semantic.success,ne.semantic.warning,ne.semantic.debug,"#FF6B9D","#00D9FF"];function Co(e){let t=e.split("").reduce((r,o)=>r+o.charCodeAt(0),0);return oi[t%oi.length]}var Jd=e=>{switch(e){case"required_present":return{icon:Hd,color:ne.semantic.success,bgColor:ne.semantic.successBackground,borderColor:ne.semantic.success+"40",label:"REQUIRED",labelColor:ne.semantic.success};case"required_missing":return{icon:Za,color:ne.semantic.error,bgColor:ne.semantic.errorBackground,borderColor:ne.semantic.error+"50",label:"MISSING",labelColor:ne.semantic.error};case"required_wrong_value":return{icon:ei,color:ne.semantic.warning,bgColor:ne.semantic.warningBackground,borderColor:ne.semantic.warning+"50",label:"WRONG S",labelColor:ne.semantic.warning};case"required_wrong_type":return{icon:ei,color:ne.semantic.info,bgColor:ne.semantic.infoBackground,borderColor:ne.semantic.info+"50",label:"WRONG TYPE",labelColor:ne.semantic.info};case"optional_present":return{icon:Xa,color:ne.semantic.debug,bgColor:ne.semantic.infoBackground,borderColor:ne.semantic.debug+"40",label:"OPTIONAL",labelColor:ne.semantic.debug}}},Gd=e=>{switch(e){case"mmkv":return ti;case"async":return ri;case"secure":return jd;default:return ri}};function Yd({storageKey:e,isExpanded:t,onToggle:r}){let o=Jd(e.status),n=o.icon,a=Gd(e.storageType),i=e.value!==void 0&&e.value!==null,u=e.expectedValue!==void 0,d=e.expectedType!==void 0,y=Hn(e.storageType),g=No(e.storageType);return Ve(l,{style:[z.storageKeyCard,{borderColor:o.borderColor}],children:[Ve(K,{accessibilityLabel:"Storage key card",accessibilityHint:"View storage key card","sentry-label":`ignore storage key card ${e.key}`,accessibilityRole:"button",style:z.cardHeader,onPress:r,children:[Ve(l,{style:z.cardHeaderLeft,children:[Y(l,{style:[z.iconContainer,{backgroundColor:o.bgColor}],children:Y(n,{size:14,color:o.color})}),Ve(l,{style:z.cardHeaderInfo,children:[Y(c,{style:z.storageKeyText,children:e.key}),e.description?Y(c,{style:z.descriptionText,children:e.description}):null,Ve(l,{style:z.cardHeaderMeta,children:[Y(l,{style:[z.statusBadge,{backgroundColor:o.bgColor}],children:Y(c,{style:[z.statusText,{color:o.labelColor}],children:o.label})}),Ve(l,{style:[z.storageBadge,{backgroundColor:`${y}15`}],children:[Y(a,{size:10,color:y}),Y(c,{style:[z.storageText,{color:y}],children:g})]}),e.storageType==="mmkv"&&e.instanceId&&Ve(l,{style:[z.instanceBadge,{backgroundColor:Co(e.instanceId)+"20",borderColor:Co(e.instanceId)+"40"}],children:[Y(ti,{size:9,color:Co(e.instanceId)}),Y(c,{style:[z.instanceText,{color:Co(e.instanceId)}],children:e.instanceId})]}),i&&Y(l,{style:z.valueBadge,children:Y(c,{style:z.valueText,children:e.valueType?e.valueType.toUpperCase():Et(e.value)})})]})]})]}),Y(l,{style:z.cardHeaderRight,children:Y(l,{style:z.actionButton,children:Y(Xa,{size:12,color:he.color.textSecondary})})})]}),t&&i&&Ve(l,{style:z.cardBody,children:[Y(l,{style:z.dataViewerContainer,children:(()=>{let p=typeof e.value=="string"?(()=>{try{return JSON.parse(e.value)}catch{return e.value}})():e.value;return typeof p=="string"||typeof p=="number"||typeof p=="boolean"?Ve(l,{style:z.simpleValueContainer,children:[Y(c,{style:z.simpleValueLabel,children:"Current Value:"}),Y(l,{style:z.simpleValueBox,children:Y(c,{style:z.simpleValueContent,selectable:true,children:String(p)})}),Ve(c,{style:z.valueTypeText,children:["Type: ",Et(e.value)]})]}):Y(Ud,{title:"Current Value",data:p,showTypeFilter:false,rawMode:true})})()}),u&&Ve(l,{style:z.valueContainer,children:[Y(c,{style:z.valueLabel,children:"Expected Value:"}),Y(l,{style:z.expectedValueBox,children:Y(c,{style:z.expectedValueContent,selectable:true,children:e.expectedValue})})]}),d&&e.expectedType&&Ve(l,{style:z.valueContainer,children:[Y(c,{style:z.valueLabel,children:"Expected Type:"}),Y(l,{style:z.expectedValueBox,children:Y(c,{style:z.expectedValueContent,selectable:true,children:e.expectedType.toUpperCase()})}),Ve(c,{style:z.typeHelperText,children:["Current type: ",Et(e.value)]})]}),e.lastUpdated?Y(l,{style:z.metaInfo,children:Ve(c,{style:z.metaLabel,children:["Last updated: ",e.lastUpdated.toLocaleString()]})}):null]}),t&&!i&&Ve(l,{style:z.cardBody,children:[Ve(l,{style:z.emptyValueContainer,children:[Y(Za,{size:16,color:ne.semantic.warning}),Y(c,{style:z.emptyValueText,children:"Storage key not found or empty"})]}),u&&Ve(l,{style:z.valueContainer,children:[Y(c,{style:z.valueLabel,children:"Expected Value:"}),Y(l,{style:z.expectedValueBox,children:Y(c,{style:z.expectedValueContent,selectable:true,children:e.expectedValue})})]})]})]})}var z=ge.create({storageKeyCard:{backgroundColor:he.color.surface,borderRadius:8,borderWidth:1,overflow:"hidden"},cardHeader:{padding:12,flexDirection:"row",alignItems:"center",justifyContent:"space-between"},cardHeaderLeft:{flexDirection:"row",alignItems:"center",flex:1,minWidth:0},iconContainer:{padding:6,borderRadius:6,marginRight:10},cardHeaderInfo:{flex:1,minWidth:0,gap:4},storageKeyText:{color:he.color.text,fontWeight:"500",fontSize:12,flexWrap:"wrap",flex:1},descriptionText:{color:he.color.textSecondary,fontSize:10,marginTop:2,flexWrap:"wrap"},cardHeaderMeta:{flexDirection:"row",alignItems:"center",gap:6,flexWrap:"wrap"},statusBadge:{paddingHorizontal:6,paddingVertical:2,borderRadius:4},statusText:{fontSize:9,fontWeight:"600",letterSpacing:.5},storageBadge:{paddingHorizontal:6,paddingVertical:2,borderRadius:4,flexDirection:"row",alignItems:"center",gap:4},storageText:{fontSize:9,fontWeight:"600"},instanceBadge:{paddingHorizontal:6,paddingVertical:3,borderRadius:4,borderWidth:1,flexDirection:"row",alignItems:"center",gap:4},instanceText:{fontSize:9,fontWeight:"700",fontFamily:ko,letterSpacing:.3},valueBadge:{paddingHorizontal:4,paddingVertical:2,backgroundColor:he.color.surfaceElevated,borderRadius:3},valueText:{fontSize:8,color:he.color.textSecondary,fontWeight:"500"},cardHeaderRight:{marginLeft:8},actionButton:{padding:4,borderRadius:4,backgroundColor:he.color.surfaceElevated},cardBody:{borderTopWidth:1,borderTopColor:he.color.separator,padding:12,gap:12},dataViewerContainer:{marginTop:8},simpleValueContainer:{gap:8},simpleValueLabel:{color:he.color.textSecondary,fontSize:10,fontWeight:"500",textTransform:"uppercase",letterSpacing:.5},simpleValueBox:{backgroundColor:he.color.bg,borderRadius:4,padding:10,borderWidth:1,borderColor:he.color.border},simpleValueContent:{color:wo.success,fontSize:12,fontFamily:ko,lineHeight:16},valueTypeText:{color:he.color.textTertiary,fontSize:9,fontStyle:"italic"},valueContainer:{gap:6},valueLabel:{color:he.color.textSecondary,fontSize:10,fontWeight:"500",textTransform:"uppercase",letterSpacing:.5},valueBox:{backgroundColor:he.color.bg,borderRadius:4,padding:8,borderWidth:1,borderColor:he.color.border},valueContent:{color:he.color.text,fontSize:10,fontFamily:ko,lineHeight:14},expectedValueBox:{backgroundColor:he.color.bg,borderRadius:4,padding:8,borderWidth:1,borderColor:he.color.border},expectedValueContent:{color:he.color.text,fontSize:10,fontFamily:ko,lineHeight:14},emptyValueContainer:{flexDirection:"row",alignItems:"center",gap:6,padding:8,backgroundColor:wo.warning+"0D",borderRadius:4,borderWidth:1,borderColor:wo.warning+"1A"},emptyValueText:{color:wo.warning,fontSize:10,fontStyle:"italic"},typeHelperText:{color:he.color.textSecondary,fontSize:9,marginTop:4,textAlign:"center"},metaInfo:{marginTop:8},metaLabel:{color:he.color.textTertiary,fontSize:9,fontStyle:"italic"}});V();import{AlertCircle as Qd,CheckCircle2 as Zd,XCircle as ni,Eye as Xd,Database as ai,Shield as eu}from"@buoy-gg/shared-ui/web";import{night as pt}from"@buoy-gg/shared-ui/web";import{jsx as we,jsxs as qe}from"react/jsx-runtime";var tu=[{key:"valid",label:"Valid Keys",description:"Correctly stored and accessible",icon:Zd,color:"#10B981",textColor:"#10B981",bgColor:"rgba(16, 185, 129, 0.1)"},{key:"missing",label:"Missing Keys",description:"Required but not found",icon:Qd,color:"#EF4444",textColor:"#EF4444",bgColor:"rgba(239, 68, 68, 0.1)"},{key:"wrongValue",label:"Wrong Values",description:"Stored but incorrect value",icon:ni,color:"#F97316",textColor:"#F97316",bgColor:"rgba(249, 115, 22, 0.1)"},{key:"wrongType",label:"Wrong Types",description:"Value has incorrect data type",icon:ni,color:"#0891B2",textColor:"#0891B2",bgColor:"rgba(8, 145, 178, 0.1)"},{key:"optional",label:"Optional Keys",description:"Available but not required",icon:Xd,color:"#8B5CF6",textColor:"#8B5CF6",bgColor:"rgba(139, 92, 246, 0.1)"}],ru=[{key:"mmkv",label:le.mmkv,description:le.hasSecure?"Synchronous key-value storage":"Storage for this browser tab",icon:ai},{key:"async",label:le.asyncFull,description:le.hasSecure?"React Native async storage":"Persistent storage for this origin",icon:ai},{key:"secure",label:"SecureStorage",description:"Encrypted secure storage",icon:eu}];function ou({stats:e}){let{totalCount:t,missingCount:r,wrongValueCount:o,wrongTypeCount:n,presentRequiredCount:a,optionalCount:i,mmkvCount:u,asyncCount:d,secureCount:y}=e;return t===0?qe(l,{style:X.statsContainer,children:[we(c,{style:X.sectionTitle,children:"STORAGE BREAKDOWN"}),we(l,{style:X.emptyState,children:we(c,{style:X.emptyStateText,children:"No storage keys detected"})})]}):qe(l,{style:X.statsContainer,children:[qe(l,{style:X.breakdownSection,children:[we(c,{style:X.sectionTitle,children:"KEY STATUS BREAKDOWN"}),we(l,{style:X.breakdownList,children:tu.map(g=>{let p=0,f=false;switch(g.key){case"valid":p=a,f=p>0;break;case"missing":p=r,f=p>0;break;case"wrongValue":p=o,f=p>0;break;case"wrongType":p=n,f=p>0;break;case"optional":p=i,f=p>0;break}if(!f)return null;let x=t>0?(p/t*100).toFixed(1):"0",h=g.icon;return we(l,{style:X.breakdownItem,children:qe(l,{style:X.breakdownItemRow,children:[qe(l,{style:X.breakdownItemLeft,children:[we(l,{style:[X.breakdownIcon,{backgroundColor:g.bgColor}],children:we(h,{size:14,color:g.color})}),qe(l,{style:X.breakdownItemInfo,children:[we(c,{style:X.breakdownItemLabel,children:g.label}),we(c,{style:X.breakdownItemDesc,children:g.description})]})]}),qe(l,{style:X.breakdownItemRight,children:[we(c,{style:[X.breakdownCount,{color:g.textColor}],children:p}),qe(c,{style:X.breakdownPercentage,children:[x,"%"]})]})]})},g.key)})})]}),(u>0||d>0||y>0)&&qe(l,{style:X.breakdownSection,children:[we(c,{style:X.sectionTitle,children:"STORAGE TYPE BREAKDOWN"}),we(l,{style:X.breakdownList,children:ru.map(g=>{let p=0,f=false;switch(g.key){case"mmkv":p=u,f=p>0;break;case"async":p=d,f=p>0;break;case"secure":p=y,f=p>0;break}if(!f)return null;let x=t>0?(p/t*100).toFixed(1):"0",h=g.icon,b=Hn(g.key);return we(l,{style:X.breakdownItem,children:qe(l,{style:X.breakdownItemRow,children:[qe(l,{style:X.breakdownItemLeft,children:[we(l,{style:[X.breakdownIcon,{backgroundColor:`${b}15`}],children:we(h,{size:14,color:b})}),qe(l,{style:X.breakdownItemInfo,children:[we(c,{style:X.breakdownItemLabel,children:g.label}),we(c,{style:X.breakdownItemDesc,children:g.description})]})]}),qe(l,{style:X.breakdownItemRight,children:[we(c,{style:[X.breakdownCount,{color:b}],children:p}),qe(c,{style:X.breakdownPercentage,children:[x,"%"]})]})]})},g.key)})})]})]})}var X=ge.create({statsContainer:{marginBottom:24,backgroundColor:pt.color.surface,borderRadius:8,padding:16,borderWidth:1,borderColor:pt.color.border},sectionTitle:{color:pt.color.textSecondary,fontSize:12,fontWeight:"500",marginBottom:16,textTransform:"uppercase",letterSpacing:.5},breakdownSection:{gap:12,marginBottom:20},breakdownList:{gap:12},breakdownItem:{backgroundColor:pt.color.surfaceElevated,padding:12,borderRadius:8,borderWidth:1,borderColor:pt.color.border},breakdownItemRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between"},breakdownItemLeft:{flexDirection:"row",alignItems:"center",gap:12,flex:1,minWidth:0},breakdownIcon:{padding:8,borderRadius:8},breakdownItemInfo:{flex:1,minWidth:0},breakdownItemLabel:{color:pt.color.text,fontSize:14,fontWeight:"500"},breakdownItemDesc:{color:pt.color.textSecondary,fontSize:12},breakdownItemRight:{alignItems:"flex-end"},breakdownCount:{fontSize:16,fontWeight:"600"},breakdownPercentage:{color:pt.color.textTertiary,fontSize:10},emptyState:{padding:16,backgroundColor:pt.color.surfaceElevated,borderRadius:6,alignItems:"center"},emptyStateText:{color:pt.color.textTertiary,fontSize:11,textAlign:"center"}});V();import{Database as nu,CyberpunkSectionButton as au}from"@buoy-gg/shared-ui/web";import{jsx as iu}from"react/jsx-runtime";function lu({onPress:e,eventCount:t=0}){let r=t>0?`${t} events`:"Monitoring";return iu(au,{id:"storage-events",title:"EVENTS",subtitle:r,icon:nu,iconColor:"#00E5FF",iconBackgroundColor:"rgba(0, 229, 255, 0.1)",onPress:e,index:3})}V();import{macOSColors as Wr}from"@buoy-gg/shared-ui/web";var su=["SET","GET","MERGE","DELETE","CLEAR"],cu={SET:Wr.semantic.info,GET:Wr.text.muted,MERGE:Wr.semantic.debug,DELETE:Wr.semantic.error,CLEAR:Wr.semantic.warning};function du(e){return cu[e]}function uu(e){let t=e.action;return t==="clear"||t==="clearAll"?"CLEAR":t.startsWith("get.")?"GET":t==="removeItem"||t==="multiRemove"||t==="delete"?"DELETE":t==="mergeItem"||t==="multiMerge"?"MERGE":"SET"}function yu(e){return!!e.data?.initialScan}V();import{useState as gu}from"react";import{macOSColors as Yt,night as ce,monoFont as ii}from"@buoy-gg/shared-ui/web";import{jsx as ae,jsxs as nt}from"react/jsx-runtime";function pu({selectedInstanceId:e,onSelectInstance:t,showRefreshButton:r=true}){let[o,n]=gu(false),{instances:a,instanceCount:i,refresh:u}=rn(false),d=a.find(g=>g.id===e),y=g=>{t(g),n(false)};return Yo()?i===0?ae(l,{style:$.container,children:nt(l,{style:$.emptyState,children:[ae(c,{style:$.emptyStateTitle,children:"No MMKV Instances Registered"}),ae(c,{style:$.emptyStateDescription,children:"Register MMKV instances using registerMMKVInstance() to monitor them in dev tools."}),r&&ae(K,{style:$.refreshButton,onPress:u,activeOpacity:.7,children:ae(c,{style:$.refreshButtonText,children:"\u21BB Refresh"})})]})}):nt(l,{style:$.container,children:[nt(K,{style:$.selectorButton,onPress:()=>n(true),activeOpacity:.7,children:[ae(l,{style:$.selectorContent,children:d?ae(li,{instance:d,isSelected:true}):ae(c,{style:$.placeholderText,children:"Select MMKV Instance"})}),ae(c,{style:$.dropdownArrow,children:"\u25BC"})]}),ae(zn,{visible:o,transparent:true,animationType:"fade",onRequestClose:()=>n(false),children:ae(K,{style:$.modalOverlay,activeOpacity:1,onPress:()=>n(false),children:nt(l,{style:$.dropdownContainer,children:[nt(l,{style:$.dropdownHeader,children:[nt(c,{style:$.dropdownTitle,children:["Select MMKV Instance (",i,")"]}),r&&ae(K,{style:$.headerRefreshButton,onPress:u,activeOpacity:.7,children:ae(c,{style:$.headerRefreshText,children:"\u21BB"})})]}),ae(Vr,{style:$.dropdownList,children:a.map(g=>ae(K,{style:[$.dropdownItem,g.id===e&&$.dropdownItemSelected],onPress:()=>y(g.id),activeOpacity:.7,children:ae(li,{instance:g,isSelected:g.id===e})},g.id))})]})})})]}):ae(l,{style:$.container,children:nt(l,{style:$.unavailableState,children:[nt(c,{style:$.unavailableTitle,children:[le.mmkv," Not Available"]}),ae(c,{style:$.unavailableDescription,children:oa()})]})})}function li({instance:e,isSelected:t}){return nt(l,{style:$.instanceRow,children:[nt(l,{style:$.instanceLeft,children:[ae(c,{style:[$.instanceId,t&&$.instanceIdSelected],numberOfLines:1,children:e.id}),nt(l,{style:$.instanceBadges,children:[e.encrypted&&ae(l,{style:[$.badge,$.badgeEncrypted],children:ae(c,{style:$.badgeText,children:"\u{1F512} Encrypted"})}),e.readOnly&&ae(l,{style:[$.badge,$.badgeReadOnly],children:ae(c,{style:$.badgeText,children:"\u{1F441}\uFE0F Read-only"})})]})]}),nt(l,{style:$.instanceRight,children:[ae(c,{style:$.keyCount,children:e.keyCount}),ae(c,{style:$.keyCountLabel,children:"keys"})]})]})}var $=ge.create({container:{marginBottom:12},unavailableState:{backgroundColor:Yt.semantic.warning+"15",borderRadius:12,padding:20,borderWidth:1,borderColor:Yt.semantic.warning+"40",alignItems:"center",gap:12},unavailableTitle:{fontSize:14,fontWeight:"600",color:Yt.semantic.warning},unavailableDescription:{fontSize:12,color:ce.color.textSecondary,textAlign:"center",lineHeight:18},emptyState:{backgroundColor:ce.color.surface,borderRadius:12,padding:20,borderWidth:1,borderColor:ce.color.border,alignItems:"center",gap:12},emptyStateTitle:{fontSize:14,fontWeight:"600",color:ce.color.text},emptyStateDescription:{fontSize:12,color:ce.color.textTertiary,textAlign:"center",lineHeight:18},refreshButton:{marginTop:8,paddingHorizontal:16,paddingVertical:8,backgroundColor:ce.color.accentSoft,borderRadius:8,borderWidth:1,borderColor:ce.color.accentBorderStrong},refreshButtonText:{fontSize:12,fontWeight:"600",color:ce.color.accent},selectorButton:{backgroundColor:ce.color.surface,borderRadius:12,borderWidth:1,borderColor:ce.color.border,padding:12,flexDirection:"row",alignItems:"center",justifyContent:"space-between",shadowColor:"#000000",shadowOpacity:.03,shadowRadius:8,shadowOffset:{width:0,height:2}},selectorContent:{flex:1},placeholderText:{fontSize:13,color:ce.color.placeholder,fontStyle:"italic"},dropdownArrow:{fontSize:10,color:ce.color.textTertiary,marginLeft:8},modalOverlay:{flex:1,backgroundColor:"rgba(0, 0, 0, 0.5)",justifyContent:"center",alignItems:"center",padding:20},dropdownContainer:{backgroundColor:ce.color.surface,borderRadius:16,borderWidth:1,borderColor:ce.color.border,width:"100%",maxWidth:500,maxHeight:"70%",shadowColor:"#000000",shadowOpacity:.2,shadowRadius:20,shadowOffset:{width:0,height:10},overflow:"hidden"},dropdownHeader:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",padding:16,borderBottomWidth:1,borderBottomColor:ce.color.separator},dropdownTitle:{fontSize:14,fontWeight:"600",color:ce.color.text},headerRefreshButton:{padding:4},headerRefreshText:{fontSize:18,color:ce.color.accent},dropdownList:{maxHeight:400},dropdownItem:{padding:12,borderBottomWidth:1,borderBottomColor:ce.color.separator},dropdownItemSelected:{backgroundColor:ce.color.accentSoft},instanceRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",gap:12},instanceLeft:{flex:1,gap:6},instanceId:{fontSize:13,fontWeight:"500",color:ce.color.text,fontFamily:ii},instanceIdSelected:{fontWeight:"600",color:ce.color.accent},instanceBadges:{flexDirection:"row",flexWrap:"wrap",gap:6},badge:{paddingHorizontal:6,paddingVertical:2,borderRadius:4,borderWidth:1},badgeEncrypted:{backgroundColor:Yt.semantic.success+"15",borderColor:Yt.semantic.success+"40"},badgeReadOnly:{backgroundColor:Yt.semantic.warning+"15",borderColor:Yt.semantic.warning+"40"},badgeText:{fontSize:9,fontWeight:"500",color:ce.color.textSecondary},instanceRight:{alignItems:"flex-end"},keyCount:{fontSize:16,fontWeight:"600",color:ce.color.text,fontFamily:ii},keyCountLabel:{fontSize:9,color:ce.color.textTertiary,textTransform:"uppercase",letterSpacing:.5}});V();import{macOSColors as st,night as kt,monoFont as fu}from"@buoy-gg/shared-ui/web";import{jsx as De,jsxs as fr}from"react/jsx-runtime";function mu({instanceId:e}){let t=ya(e);return t?De(l,{style:ye.container,children:fr(l,{style:ye.panel,children:[De(l,{style:ye.header,children:De(c,{style:ye.headerTitle,children:"Instance Details"})}),fr(l,{style:ye.infoGrid,children:[De(_r,{label:"Instance ID",value:t.id,valueStyle:ye.monoValue}),De(_r,{label:"Keys",value:`${t.keyCount} ${t.keyCount===1?"key":"keys"}`,highlight:true}),De(_r,{label:"Encryption",value:t.encrypted?"\u{1F512} Encrypted":"\u{1F513} Not encrypted",valueColor:t.encrypted?st.semantic.success:kt.color.textTertiary}),De(_r,{label:"Access",value:t.readOnly?"\u{1F441}\uFE0F Read-only":"\u270F\uFE0F Read-write",valueColor:t.readOnly?st.semantic.warning:kt.color.textTertiary}),t.size!==void 0&&De(_r,{label:"Size",value:hu(t.size),valueStyle:ye.monoValue})]}),t.encrypted&&fr(l,{style:ye.notice,children:[De(c,{style:ye.noticeIcon,children:"\u{1F512}"}),De(c,{style:ye.noticeText,children:"This instance is encrypted. Values are protected at rest."})]}),t.readOnly&&fr(l,{style:[ye.notice,ye.noticeWarning],children:[De(c,{style:ye.noticeIcon,children:"\u{1F441}\uFE0F"}),De(c,{style:[ye.noticeText,ye.noticeTextWarning],children:"Read-only mode. Cannot modify values in this instance."})]})]})}):De(l,{style:ye.container,children:De(l,{style:ye.errorState,children:fr(c,{style:ye.errorText,children:["Instance not found: ",e]})})})}function _r({label:e,value:t,valueStyle:r,valueColor:o,highlight:n}){return fr(l,{style:ye.infoItem,children:[De(c,{style:ye.infoLabel,children:e}),De(c,{style:[ye.infoValue,r,o&&{color:o},n&&ye.infoValueHighlight],children:t})]})}function hu(e){if(e===0)return"0 Bytes";let t=1024,r=["Bytes","KB","MB","GB"],o=Math.floor(Math.log(e)/Math.log(t));return`${parseFloat((e/Math.pow(t,o)).toFixed(2))} ${r[o]}`}var ye=ge.create({container:{marginBottom:12},errorState:{backgroundColor:st.semantic.error+"15",borderRadius:12,padding:12,borderWidth:1,borderColor:st.semantic.error+"40"},errorText:{fontSize:12,color:st.semantic.error,textAlign:"center"},panel:{backgroundColor:kt.color.surface,borderRadius:12,borderWidth:1,borderColor:kt.color.border,overflow:"hidden",shadowColor:"#000000",shadowOpacity:.03,shadowRadius:8,shadowOffset:{width:0,height:2}},header:{padding:12,borderBottomWidth:1,borderBottomColor:kt.color.separator},headerTitle:{fontSize:11,fontWeight:"600",color:kt.color.text,textTransform:"uppercase",letterSpacing:.5},infoGrid:{padding:12,gap:10},infoItem:{flexDirection:"row",justifyContent:"space-between",alignItems:"center",paddingVertical:4},infoLabel:{fontSize:12,color:kt.color.textTertiary,fontWeight:"500"},infoValue:{fontSize:12,color:kt.color.text,fontWeight:"500"},infoValueHighlight:{fontSize:14,fontWeight:"600",color:kt.color.accent},monoValue:{fontFamily:fu},notice:{flexDirection:"row",alignItems:"center",gap:8,padding:10,margin:12,marginTop:0,backgroundColor:st.semantic.success+"10",borderRadius:8,borderWidth:1,borderColor:st.semantic.success+"30"},noticeWarning:{backgroundColor:st.semantic.warning+"10",borderColor:st.semantic.warning+"30"},noticeIcon:{fontSize:14},noticeText:{flex:1,fontSize:11,color:st.semantic.success,lineHeight:16},noticeTextWarning:{color:st.semantic.warning}});V();import{getBrowserStorage as bu,subscribeToBrowserStorage as vu}from"@buoy-gg/shared-ui/web/utils";var si=0,Ct=()=>bu("sessionStorage"),ci=()=>Array.from({length:Ct().length},(e,t)=>Ct().key(t)).filter(e=>e!==null),Su={set(e,t){Ct().setItem(e,String(t))},getString(e){return Ct().getItem(e)??void 0},getNumber(){},getBoolean(){},getBuffer(){},contains(e){return Ct().getItem(e)!==null},delete(e){let t=this.contains(e);return Ct().removeItem(e),t},getAllKeys:ci,clearAll(){Ct().clear()},get size(){return ci().reduce((e,t)=>e+2*(t.length+(Ct().getItem(t)?.length??0)),0)},addOnValueChangedListener(e){return{remove:vu(t=>{t.area==="sessionStorage"&&(t.key!==void 0?e(t.key):t.prevPairs?.forEach(([r])=>e(r)))})}}};function wu(){if(typeof window>"u")return()=>{};try{Ct()}catch{return()=>{}}++si===1&&Vn("sessionStorage",Su);let e=true;return()=>{e&&(e=false,--si===0&&Bn("sessionStorage"))}}export{mu as MMKVInstanceInfoPanel,pu as MMKVInstanceSelector,su as STORAGE_OPS,Ea as StorageBrowserMode,pn as StorageEventCard,yn as StorageEventDetailContent,gn as StorageEventDetailFooter,lu as StorageEventsSection,Yd as StorageKeyCard,Yn as StorageKeySection,ou as StorageKeyStatsSection,mn as StorageModalWithTabs,qd as StorageSection,Bd as StorageToolView,Go as StorageTypeFilterBar,co as batchPairsOf,un as canUndo,Qr as clearAllAppStorage,ra as countByStorageType,Ld as createStorageTool,ht as detectMMKVType,Bi as formatMMKVValue,Ns as getMMKVClass,oa as getMMKVUnavailableMessage,Cd as getValueType,yu as isInitialScan,Yo as isMMKVAvailable,zo as isTypeMatch,Kr as isValueOnDevice,dn as jumpToState,Vn as registerMMKVInstance,Pi as registerSecureStoreKeys,Dc as requestStorageBrowserRefresh,wa as setStorageValue,wu as startBrowserStorageCapture,nn as storageEditBlockedReason,Dt as storageEventStore,du as storageOpDot,uu as storageOpOf,Fd as storageSyncAdapter,Qa as storageToolPreset,Pc as storageValueToEditableText,cn as undoOperation,Bn as unregisterMMKVInstance,zi as unregisterSecureStoreKey,Zo as useAsyncStorageKeys,ya as useMMKVInstance,ac as useMMKVInstanceExists,rn as useMMKVInstances,ec as useMMKVKeys,ca as useMultiMMKVKeys,Va as useStorageEvents,Sa as validateStorageValue};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buoy-gg/storage",
3
- "version": "7.0.44",
3
+ "version": "7.0.45",
4
4
  "description": "Inspect supported AsyncStorage data, registered MMKV instances and registered SecureStore keys in a React Native app.",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -38,11 +38,11 @@
38
38
  "./lib/web/**/*.mjs"
39
39
  ],
40
40
  "dependencies": {
41
- "@buoy-gg/shared-ui": "^7.0.44",
42
- "@buoy-gg/floating-tools-core": "^7.0.44"
41
+ "@buoy-gg/floating-tools-core": "^7.0.45",
42
+ "@buoy-gg/shared-ui": "^7.0.45"
43
43
  },
44
44
  "peerDependencies": {
45
- "@buoy-gg/license": "7.0.44",
45
+ "@buoy-gg/license": "7.0.45",
46
46
  "react": "*"
47
47
  },
48
48
  "devDependencies": {
@@ -50,7 +50,7 @@
50
50
  "@types/react": "^19.1.0",
51
51
  "@types/react-native": "^0.73.0",
52
52
  "typescript": "~5.8.3",
53
- "@buoy-gg/license": "^7.0.44"
53
+ "@buoy-gg/license": "^7.0.45"
54
54
  },
55
55
  "react-native-builder-bob": {
56
56
  "source": "src",