@buoy-gg/time-machine 7.0.39 → 7.0.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -58,3 +58,7 @@ See the [Time Machine guide](https://buoy.gg/buoy/latest/docs/tools/time-machine
58
58
  React Native connections require `@buoy-gg/external-sync`. Follow the [Desktop connection guide](https://buoy.gg/buoy/latest/docs/desktop), sign in to Desktop separately, and confirm the selected device. [MCP](https://buoy.gg/buoy/latest/docs/mcp) also needs a process account and Pro access.
59
59
 
60
60
  Device data can travel over your LAN to the configured broker. Account validation makes network requests. See [Telemetry](https://buoy.gg/buoy/latest/docs/telemetry) for data-flow details.
61
+
62
+ ## Web support (unreleased)
63
+
64
+ Register this package’s /web namespace in FloatingDevTools modules to use its shared panels and actions in a browser app. The browser build is available in this checkout and has not been published yet. See the [web setup guide](https://buoy.gg/buoy/latest/docs/web-preview) for registration, dependencies, and browser boundaries.
@@ -0,0 +1,4 @@
1
+ "use client";
2
+ var No=Object.defineProperty;var ln=Object.getOwnPropertyDescriptor;var cn=Object.getOwnPropertyNames;var dn=Object.prototype.hasOwnProperty;var un=(e,t)=>{for(var o in t)No(e,o,{get:t[o],enumerable:!0})},Ho=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of cn(t))!dn.call(e,i)&&i!==o&&No(e,i,{get:()=>t[i],enumerable:!(n=ln(t,i))||n.enumerable});return e},B=(e,t,o)=>(Ho(e,t,"default"),o&&Ho(o,t,"default"));var C=process.env.NODE_ENV!=="production";typeof window<"u"&&typeof globalThis.global>"u"&&(globalThis.global=globalThis);import{getSafeCurrentRoute as pn,getSafeRouter as Bo,persistentStorage as Ft}from"@buoy-gg/shared-ui/web";var Ut="@react_buoy_time_machine:pending-route",mn=6e4,fn=8e3,hn=250;function gn(e){return{pathname:e.pathname,href:e.href}}function Be(){let e=pn();return e?gn(e):null}function _o(){return Be()}function De(){return Bo()!=null}function wt(e){let t={pathname:e.pathname,href:e.href},o=Bo();if(!o?.navigate)return{...t,status:"unavailable",error:"expo-router is not available on this device"};try{return o.navigate(e.href),{...t,status:"navigated"}}catch(n){return{...t,status:"failed",error:String(n)}}}async function Fo(e,t){let o={...e,savedAt:Date.now(),...t?{snapshotName:t}:{}};await Ft.setItem(Ut,JSON.stringify(o))}async function bn(){try{await Ft.removeItem(Ut)}catch{}}async function yn(){try{let e=await Ft.getItem(Ut);if(!e)return null;let t=JSON.parse(e);return typeof t?.href!="string"||!t.href||typeof t.savedAt!="number"?null:{pathname:typeof t.pathname=="string"?t.pathname:t.href,href:t.href,savedAt:t.savedAt,snapshotName:typeof t.snapshotName=="string"?t.snapshotName:void 0}}catch{return null}}var Wo=!1;function Kt(){Wo||(Wo=!0,(async()=>{let e=await yn();if(!e||(await bn(),Date.now()-e.savedAt>mn))return;let t=Date.now()+fn;for(;!De()&&Date.now()<t;)await new Promise(o=>setTimeout(o,100));De()&&(await new Promise(o=>setTimeout(o,hn)),wt({pathname:e.pathname,href:e.href}))})())}var w={};un(w,{AccessibilityInfo:()=>Dn,ActivityIndicator:()=>_e,Alert:()=>Gt,Animated:()=>Fe,AppRegistry:()=>Mn,AppState:()=>On,Appearance:()=>Cn,BackHandler:()=>An,Button:()=>Tn,CheckBox:()=>Jn,Clipboard:()=>Ln,DeviceEventEmitter:()=>si,Dimensions:()=>zn,Easing:()=>En,FlatList:()=>qt,I18nManager:()=>Vn,Image:()=>Gn,ImageBackground:()=>jn,InteractionManager:()=>Hn,Keyboard:()=>$n,KeyboardAvoidingView:()=>Yt,LayoutAnimation:()=>Nn,Linking:()=>Wn,LogBox:()=>ii,Modal:()=>Jt,NativeEventEmitter:()=>Bn,NativeModules:()=>kn,PanResponder:()=>jt,Picker:()=>qn,PixelRatio:()=>_n,Platform:()=>Me,Pressable:()=>xt,ProgressBar:()=>Yn,RefreshControl:()=>Xn,SafeAreaView:()=>Qn,ScrollView:()=>tt,SectionList:()=>Zn,Share:()=>Fn,StatusBar:()=>ei,StyleSheet:()=>T,Switch:()=>vn,Text:()=>l,TextInput:()=>Ce,Touchable:()=>ti,TouchableHighlight:()=>xn,TouchableNativeFeedback:()=>oi,TouchableOpacity:()=>v,TouchableWithoutFeedback:()=>Rn,UIManager:()=>Un,Vibration:()=>Kn,View:()=>u,VirtualizedList:()=>ri,YellowBox:()=>ni,findNodeHandle:()=>In,unstable_createElement:()=>Pn,useColorScheme:()=>ai,useLocaleContext:()=>li,useWindowDimensions:()=>Xt});B(w,ha);import*as ha from"react-native-web";import{unstable_createElement as Pn,NativeModules as kn,AccessibilityInfo as Dn,Animated as Fe,Appearance as Cn,AppRegistry as Mn,AppState as On,BackHandler as An,Clipboard as Ln,Dimensions as zn,Easing as En,I18nManager as Vn,Keyboard as $n,InteractionManager as Hn,LayoutAnimation as Nn,Linking as Wn,NativeEventEmitter as Bn,PanResponder as jt,PixelRatio as _n,Platform as Me,Share as Fn,StyleSheet as T,UIManager as Un,Vibration as Kn,CheckBox as Jn,FlatList as qt,Image as Gn,ImageBackground as jn,KeyboardAvoidingView as Yt,Picker as qn,ProgressBar as Yn,RefreshControl as Xn,SafeAreaView as Qn,SectionList as Zn,StatusBar as ei,Touchable as ti,TouchableNativeFeedback as oi,VirtualizedList as ri,YellowBox as ni,LogBox as ii,DeviceEventEmitter as si,useColorScheme as ai,useLocaleContext as li,useWindowDimensions as Xt}from"react-native-web";import*as E from"react-native-web";import{createElement as Sn,forwardRef as wn}from"react";function re(e){let t=wn((n,i)=>{let{accessibilityState:s,accessibilityValue:a,...d}=n;for(let p of["busy","checked","disabled","expanded","selected"])s?.[p]!==void 0&&d[`aria-${p}`]===void 0&&(d[`aria-${p}`]=s[p]);for(let[p,y]of Object.entries({min:"valuemin",max:"valuemax",now:"valuenow",text:"valuetext"}))a?.[p]!==void 0&&d[`aria-${y}`]===void 0&&(d[`aria-${y}`]=a[p]);return Sn(e,{...d,ref:i})}),o=e.State;return o&&Object.assign(t,{State:o}),t.displayName=e.displayName??e.name??"NativeWebView",t}var u=re(E.View),l=re(E.Text),Ce=re(E.TextInput),v=re(E.TouchableOpacity),xn=re(E.TouchableHighlight),Rn=re(E.TouchableWithoutFeedback),xt=re(E.Pressable),tt=re(E.ScrollView),Jt=re(E.Modal),vn=re(E.Switch),_e=re(E.ActivityIndicator),Tn=re(E.Button),In=E.findNodeHandle,Gt={alert(e,t,o,n){if(typeof document>"u")return;let i=document.createElement("dialog");i.dataset.buoyRoot="",i.setAttribute("aria-label",e),i.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 s=document.createElement("h2");if(s.textContent=e,s.style.cssText="font-size:18px;margin:0 0 12px",i.appendChild(s),t){let y=document.createElement("p");y.textContent=t,y.style.cssText="line-height:1.5;white-space:pre-wrap;margin:0 0 20px",i.appendChild(y)}let a=document.createElement("div");a.style.cssText="display:flex;justify-content:flex-end;flex-wrap:wrap;gap:8px";let d=o?.length?o:[{text:"OK"}],p=()=>{i.close?.(),i.remove()};for(let y of d){let L=document.createElement("button");L.type="button",L.textContent=y.text??"OK",L.style.cssText=`padding:9px 14px;border:1px solid #64748b;border-radius:7px;color:white;background:${y.style==="destructive"?"#a52b38":"#283a4d"};cursor:pointer;font:inherit`,L.onclick=()=>{p(),y.onPress?.()},a.appendChild(L)}i.addEventListener("cancel",y=>{y.preventDefault(),n?.cancelable!==!1&&(p(),n?.onDismiss?.())}),i.appendChild(a),document.body.appendChild(i),i.showModal?i.showModal():i.setAttribute("open","")}};import{TimeMachineIcon as qs,TIME_MACHINE_ICON_COLOR as Ys}from"@buoy-gg/shared-ui/web";import{useRef as Bs,useState as rn,useSyncExternalStore as tn}from"react";import{useSafeAreaInsets as _s,useLimit as Fs,ToolEmptyState as Us,getFloatingTools as Ks,subscribeFloatingTools as Js}from"@buoy-gg/shared-ui/web";import{useToolHost as Gs}from"@buoy-gg/core/web";import{useEffect as yi,useState as Si,useSyncExternalStore as wi}from"react";import{getStateSnapshotProviders as uo,subscribeToStateSnapshotProviders as xi}from"@buoy-gg/shared-ui/web";import{getStateSnapshotProvider as tr,getStateSnapshotProviders as vt,scheduleReloadApp as ui,superJsonDeserialize as ao,superJsonSerialize as pi}from"@buoy-gg/shared-ui/web";import{objectDiff as mi}from"@buoy-gg/shared-ui/web/dataViewer";import{persistentStorage as ye}from"@buoy-gg/shared-ui/web";var Qt="@react_buoy_time_machine:index",ot="@react_buoy_time_machine:snap:";async function Uo(){try{let e=await ye.getItem(Qt);if(!e)return[];let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}async function Zt(e){await ye.setItem(Qt,JSON.stringify(e))}async function rt(e,t){let o=JSON.stringify(e);e.meta.sizeBytes=o.length,await ye.setItem(ot+e.meta.id,JSON.stringify(e));let n=[e.meta,...t.filter(i=>i.id!==e.meta.id)];return await Zt(n),n}async function ue(e){try{let t=await ye.getItem(ot+e);return t?JSON.parse(t):null}catch{return null}}async function eo(e,t){await ye.removeItem(ot+e);let o=t.filter(n=>n.id!==e);return await Zt(o),o}async function Rt(e,t,o){let n=a=>a.id===e?t(a):a,i=o.map(n);await ye.setItem(Qt,JSON.stringify(i));let s=await ue(e);return s&&(s.meta=n(s.meta),await ye.setItem(ot+e,JSON.stringify(s))),i}function Ko(e,t,o){return Rt(e,n=>{let i={...n};return t&&t.length>0?i.scope=t:delete i.scope,i},o)}function Jo(e,t,o){return Rt(e,n=>{let i={...n};return delete i.scope,t&&t.length>0?i.excludedKeys=t:delete i.excludedKeys,i},o)}function Go(e,t,o){return Rt(e,n=>({...n,restoreRoute:t}),o)}function to(e,t,o){return Rt(e,n=>({...n,lastRestoredAt:t}),o)}async function jo(e,t,o){let n=await ue(e);if(!n)return null;let i={meta:{...n.meta,id:`${n.meta.id}_copy_${Date.now().toString(36)}`,name:t,createdAt:Date.now(),lastRestoredAt:void 0},data:n.data};return delete i.meta.lastRestoredAt,{metas:await rt(i,o),meta:i.meta}}async function qo(e){return ue(e)}async function Yo(e,t){return rt(e,t)}async function Xo(e,t,o){let n=o.map(s=>s.id===e?{...s,name:t}:s);await Zt(n);let i=await ue(e);return i&&(i.meta.name=t,await ye.setItem(ot+e,JSON.stringify(i))),n}import{definePersistedSetting as ci,devToolsStorageKeys as di}from"@buoy-gg/shared-ui/web";var Zo=ci(di.timeMachine.disabledSources(),[],{sanitize:e=>Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}),Oe=new Set,Qo=!1,oo=null,ro=new Set,er=()=>ro.forEach(e=>e());function ae(){return Qo?Promise.resolve():(oo||(oo=Zo.load().then(e=>{Oe.size===0&&(Oe=new Set(e),er())}).finally(()=>{Qo=!0})),oo)}function no(e){return ro.add(e),()=>{ro.delete(e)}}function io(){return Oe}function Z(e){return!Oe.has(e)}function so(e,t){if(t===!Oe.has(e))return;let o=new Set(Oe);t?o.delete(e):o.add(e),Oe=o,er(),Zo.save([...o])}var Se="route";var it=["storage","redux","zustand","jotai","query"];function fi(e){let t=new Date,o=`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`,n=e?e.pathname==="/"?"Home":e.pathname:null;return n?`${n} \xB7 ${o}`:`Snapshot \xB7 ${o}`}function hi(e,t){let o=new Set(t.map(n=>n.name));if(!o.has(e))return e;for(let n=2;n<1e3;n++){let i=`${e} (${n})`;if(!o.has(i))return i}return e}function Ue(e){return!!e.route&&(e.restoreRoute??!0)}var lo="Before last restore",$=null;function nt(e){return{ok:!1,applied:0,skipped:[{id:"*",reason:e}],warnings:[]}}var or=0;function rr(){return or+=1,`snap_${Date.now().toString(36)}_${or.toString(36)}`}var co=class{constructor(){this.state={snapshots:[],hasLoaded:!1,busy:null,lastOutcome:null,preview:null,remoteProviders:null,remoteRoute:null,recentlyDeleted:null};this.previewRunId=0;this.listeners=new Set;this.loadPromise=null;this.subscribe=t=>(this.listeners.add(t),this.ensureLoaded(),()=>{this.listeners.delete(t)})}getState(){return this.state}setState(t){this.state={...this.state,...t},this.listeners.forEach(o=>{try{o()}catch{}})}ensureLoaded(){return $?Promise.resolve():(this.loadPromise||(this.loadPromise=Uo().then(t=>{$||this.setState({snapshots:t,hasLoaded:!0})})),this.loadPromise)}replaceFromSnapshot(t){this.setState({snapshots:t.snapshots??[],busy:t.busy??null,lastOutcome:t.lastOutcome??null,remoteProviders:t.providers??[],remoteRoute:t.route??{available:!1},hasLoaded:!0})}async capture(t,o,n){if($)return(await $("capture",{name:t,sourceIds:o})).snapshot;await this.ensureLoaded(),await ae(),this.setState({busy:"capture"});try{let i=vt().filter(h=>h.status().canCapture&&Z(h.id)&&(!o||o.includes(h.id))),s={},a={};for(let h of i)try{let P=await h.capture();s[h.id]=pi(P.data),a[h.id]={warnings:P.warnings}}catch(P){a[h.id]={warnings:[`capture failed: ${String(P)}`]}}let d=Z(Se)?Be():null,p=this.state.snapshots;if(n?.safety)for(let h of p.filter(P=>P.safety))p=await eo(h.id,p);let y={meta:{id:rr(),name:n?.safety?lo:hi(t.trim()||fi(d),p),createdAt:Date.now(),sizeBytes:0,...d?{route:d}:{},...n?.safety?{safety:!0}:{},sources:a},data:s},L=await rt(y,p);return this.setState({snapshots:L}),y.meta}finally{this.setState({busy:null})}}async captureBaseline(){if($)return(await $("captureBaseline",{})).snapshot;await this.ensureLoaded(),await ae();let t={meta:{id:rr(),name:"Fresh install",createdAt:Date.now(),sizeBytes:0,baseline:!0,sources:{}},data:{}},o=await rt(t,this.state.snapshots);return this.setState({snapshots:o}),t.meta}async restore(t,o,n,i){if($){let a=await $("restore",{id:t,mode:o,excludeKeys:n,restoreRoute:i?.restoreRoute});return this.setState({lastOutcome:a}),a}await this.ensureLoaded(),await ae();let s;i?.safetyCapture&&!this.state.snapshots.find(a=>a.id===t)?.safety&&(s=(await this.capture(lo,void 0,{safety:!0})).id),this.setState({busy:"restore"});try{let a=await ue(t);if(!a)throw new Error(`No snapshot with id "${t}"`);let d={snapshotId:t,snapshotName:a.meta.name,mode:o,at:Date.now(),willReload:!1,results:{},...s?{safetySnapshotId:s}:{}};if(a.meta.baseline){for(let x of vt())if(x.clear)try{d.results[x.id]=await x.clear()}catch(N){d.results[x.id]=nt(String(N))}return d.willReload=this.scheduleReload("buoy time-machine baseline"),this.setState({lastOutcome:d}),d}let p=[...it.filter(x=>x in a.data),...Object.keys(a.data).filter(x=>!it.includes(x))],y=x=>{let N=new Map;for(let W of x){let S=W.indexOf("::");if(S<=0)continue;let Q=W.slice(0,S),ce=W.slice(S+2),q=N.get(Q)??[];q.push(ce),N.set(Q,q)}return N},L=n??a.meta.excludedKeys??[],h=y(L),P=!n&&a.meta.scope?.length?y(a.meta.scope):null,H=Z(Se)&&(i?.restoreRoute??Ue(a.meta));if(o==="reload"){if(a.data.storage&&Z("storage")&&(!P||P.has("storage"))&&(d.results.storage=await this.restoreSource("storage",a.data.storage,h.get("storage"),P?.get("storage"))),H){let x=a.meta.route;try{await Fo(x,a.meta.name),d.route={...x,status:"deferred"}}catch(N){d.route={...x,status:"failed",error:String(N)}}}return d.willReload=this.scheduleReload("buoy time-machine restore"),this.setState({lastOutcome:d,snapshots:await to(t,d.at,this.state.snapshots)}),d}for(let x of p)if(!(P&&!P.has(x))){if(!Z(x)){d.results[x]={ok:!0,applied:0,skipped:[],warnings:["Switched off in Sources; left as it is"]};continue}d.results[x]=await this.restoreSource(x,a.data[x],h.get(x),P?.get(x))}return H&&(d.route=wt(a.meta.route)),this.setState({lastOutcome:d,snapshots:await to(t,d.at,this.state.snapshots)}),d}finally{this.setState({busy:null})}}async restoreSource(t,o,n,i){let s=tr(t);if(!s)return nt("provider not available (package missing or not initialized)");let a=s.status();if(!a.canRestore)return nt(a.detail??"restore unavailable");try{let d=n?.length||i?.length?{...n?.length?{excludeKeys:n}:{},...i?.length?{includeKeys:i}:{}}:void 0;return await s.restore(ao(o),d)}catch(d){return nt(String(d))}}scheduleReload(t){try{return ui({reason:t}),!0}catch{return!1}}async delete(t){if($){await $("delete",{id:t});return}await this.ensureLoaded(),await ae();let o=await qo(t),n=await eo(t,this.state.snapshots);this.setState({snapshots:n,recentlyDeleted:o?{stored:o,at:Date.now()}:null})}async undoDelete(){let t=this.state.recentlyDeleted;if(!t)return;let o=await Yo(t.stored,this.state.snapshots);this.setState({snapshots:o,recentlyDeleted:null})}clearRecentlyDeleted(){this.state.recentlyDeleted&&this.setState({recentlyDeleted:null})}async setRestoreRoute(t,o){if($){await $("setRestoreRoute",{id:t,restoreRoute:o});return}await this.ensureLoaded(),await ae();let n=await Go(t,o,this.state.snapshots);this.setState({snapshots:n})}async duplicate(t){if($)return(await $("duplicate",{id:t}))?.snapshot??null;await this.ensureLoaded(),await ae();let o=this.state.snapshots.find(i=>i.id===t);if(!o)return null;let n=await jo(t,`${o.name} copy`,this.state.snapshots);return n?(this.setState({snapshots:n.metas}),n.meta):null}async rename(t,o){if($){await $("rename",{id:t,name:o});return}await this.ensureLoaded(),await ae();let n=await Xo(t,o,this.state.snapshots);this.setState({snapshots:n})}async setScope(t,o){if($){await $("setScope",{id:t,scope:o});return}await this.ensureLoaded(),await ae();let n=await Ko(t,o,this.state.snapshots);this.setState({snapshots:n})}async setExclusions(t,o){if($){await $("setExclusions",{id:t,excludedKeys:o});return}await this.ensureLoaded(),await ae();let n=await Jo(t,o,this.state.snapshots);this.setState({snapshots:n})}clearLastOutcome(){this.setState({lastOutcome:null})}async wipeAll(){if($){let t=await $("wipeAll",{});return this.setState({lastOutcome:t}),t}this.setState({busy:"restore"});try{let t={snapshotId:"wipe-all",snapshotName:"Wipe all",mode:"reload",at:Date.now(),willReload:!1,results:{}};for(let o of vt())if(o.clear)try{t.results[o.id]=await o.clear()}catch(n){t.results[o.id]=nt(String(n))}return t.willReload=this.scheduleReload("buoy time-machine wipe all"),this.setState({lastOutcome:t}),t}finally{this.setState({busy:null})}}clearPreview(){this.previewRunId+=1,this.setState({preview:null})}async buildPreview(t,o="current"){if($){let s=++this.previewRunId;this.setState({preview:{left:o,right:t,building:!0,builtAt:Date.now(),sources:[]}});try{let a=await $("preview",{id:t==="current"?void 0:t.snapshotId,compareTo:o==="current"?void 0:o.snapshotId});if(s!==this.previewRunId)return;this.setState({preview:{left:o,right:t,building:!1,builtAt:Date.now(),sources:a.sources??[]}})}catch(a){if(s!==this.previewRunId)return;this.setState({preview:{left:o,right:t,building:!1,builtAt:Date.now(),sources:[{id:"error",label:"Preview",items:[],notes:[],error:String(a)}]}})}return}await this.ensureLoaded(),await ae();let n=++this.previewRunId;this.setState({preview:{left:o,right:t,building:!0,builtAt:Date.now(),sources:[]}});let i=async s=>{if(s==="current")return null;let a=await ue(s.snapshotId);if(!a)throw new Error(`No snapshot with id "${s.snapshotId}"`);return a.data};try{if(t==="current")throw new Error("preview target must be a snapshot");let[s,a]=await Promise.all([i(o),ue(t.snapshotId)]);if(n!==this.previewRunId)return;if(!a)throw new Error(`No snapshot with id "${t.snapshotId}"`);let d=a.data,p=a.meta.baseline===!0,y=p?vt().filter(h=>h.clear).map(h=>h.id):[...it.filter(h=>h in d),...Object.keys(d).filter(h=>!it.includes(h))],L=[];for(let h of y){if(!Z(h))continue;if(await new Promise(x=>setTimeout(x,0)),n!==this.previewRunId)return;let P=tr(h),H=P?.label??h;try{let x=p?void 0:ao(d[h]),N=s===null?void 0:h in s?ao(s[h]):void 0,W;if(!P)W={items:[{key:h,label:H,verdict:"wont-apply",reason:"tool not installed \u2014 restore skips this source"}],notes:[]};else if(P.previewItems)W=await P.previewItems(x,N);else{let S=mi(N,x);W={items:[{key:h,label:H,verdict:S.equal?"unchanged":"changed",oldValue:N,newValue:x}],notes:S.truncated?["diff truncated (large value)"]:[]}}if(n!==this.previewRunId)return;L.push({id:h,label:H,...W})}catch(x){L.push({id:h,label:H,items:[],notes:[],error:String(x)})}this.setState({preview:{left:o,right:t,building:!0,builtAt:Date.now(),sources:[...L]}})}if(n!==this.previewRunId)return;this.setState({preview:{left:o,right:t,building:!1,builtAt:Date.now(),sources:L}})}catch(s){if(n!==this.previewRunId)return;this.setState({preview:{left:o,right:t,building:!1,builtAt:Date.now(),sources:[{id:"error",label:"Preview",items:[],notes:[],error:String(s)}]}})}}},g=new co;function gi(e){$=e,e||g.replaceFromSnapshot({})}function bi(e){g.replaceFromSnapshot(e)}function Ae(){return wi(g.subscribe,()=>g.getState())}function Tt(){let[e,t]=Si(uo);return yi(()=>(t(uo()),xi(()=>t(uo()))),[]),e}import{Children as Ti}from"react";import{ChevronRight as Ii}from"@buoy-gg/shared-ui/web";import{night as U}from"@buoy-gg/shared-ui/web";import{monoFont as Ri}from"@buoy-gg/shared-ui/web";var po="2E",vi="4D",r={color:{sheet:"rgba(5, 5, 5, 0.92)",group:U.color.glass,groupBorder:U.color.glassBorder,rowPressed:U.color.glassElevated,separator:U.color.separator,fill:U.color.glassElevated,fillStrong:U.color.fillTertiary,ring:U.color.bg,disc:U.color.surfaceElevated,label:U.color.text,labelSecondary:U.color.textSecondary,labelTertiary:U.color.textTertiary,accent:U.color.accent,accentSoft:`${U.color.accent}${po}`,accentSoftStrong:`${U.color.accent}${vi}`,onAccent:"#0A0A0A",warning:U.color.warning,warningSoft:`${U.color.warning}${po}`,danger:U.color.danger,dangerSoft:`${U.color.danger}${po}`,onDanger:"#FFFFFF",info:U.color.info},radius:{group:14,pill:99},gutter:14,textInset:16,separatorInset:16,font:{row:17,control:15,footnote:13,mono:12},tracking:{row:-.43,control:-.2},rowMinHeight:52},Ke=Ri;import{jsx as Le,jsxs as Pi}from"react/jsx-runtime";function Je({children:e,testID:t}){return Le(l,{style:we.sectionLabel,testID:t,children:e})}function Ge({children:e,centered:t,tone:o="secondary",testID:n}){return Le(l,{style:[we.footnote,t?we.footnoteCentered:null,o==="warning"?we.footnoteWarning:null],testID:n,children:e})}function ze({children:e,style:t}){let o=Ti.toArray(e);return Le(u,{style:[we.group,t],children:o.map((n,i)=>Pi(u,{children:[i>0?Le(u,{style:we.separator}):null,n]},n.key??i))})}function mo(){return Le(Ii,{size:16,color:r.color.labelTertiary})}function nr({label:e,color:t,background:o,testID:n}){return Le(u,{style:[we.pill,{backgroundColor:o}],children:Le(l,{style:[we.pillText,{color:t}],testID:n,children:e})})}var we=T.create({sectionLabel:{color:r.color.labelSecondary,fontSize:r.font.footnote,fontWeight:"500",textTransform:"uppercase",letterSpacing:.4,paddingHorizontal:r.gutter+r.textInset,paddingTop:22,paddingBottom:7},footnote:{color:r.color.labelSecondary,fontSize:r.font.footnote,lineHeight:r.font.footnote*1.35,paddingHorizontal:r.gutter+r.textInset,paddingTop:7},footnoteCentered:{textAlign:"center"},footnoteWarning:{color:r.color.warning},group:{marginHorizontal:r.gutter,backgroundColor:r.color.group,borderRadius:r.radius.group,borderWidth:1,borderColor:r.color.groupBorder,overflow:"hidden"},separator:{height:T.hairlineWidth,marginLeft:r.separatorInset,backgroundColor:r.color.separator},pill:{height:32,paddingHorizontal:15,borderRadius:r.radius.pill,alignItems:"center",justifyContent:"center"},pillText:{fontSize:r.font.control,fontWeight:"600",letterSpacing:r.tracking.control}});import{JotaiIcon as ki,QueryIcon as Di,ReduxIcon as Ci,RoutesIcon as Mi,StorageIcon as Oi,TimeMachineIcon as Ai,ZustandIcon as Li}from"@buoy-gg/floating-tools-core/web";import{useSyncExternalStore as zi}from"react";var Ei={storage:Oi,redux:Ci,zustand:Li,jotai:ki,query:Di,route:Mi};function ir(e){return Ei[e]??Ai}function sr(){let{remoteProviders:e,remoteRoute:t}=Ae(),o=Tt(),n=zi(no,io,io),i=e?e.map(a=>({...a,enabled:a.enabled!==!1})):o.map(a=>({id:a.id,label:a.label,...a.status(),enabled:!n.has(a.id)})),s=e?t?.available===!0:De();return[...i,{id:Se,label:"Route",canCapture:s,canRestore:s,enabled:e?t?.enabled!==!1:!n.has(Se),detail:s?"Recorded with every snapshot \u2014 a restore can take you back":"No Expo Router detected \u2014 snapshots record no route"}]}function Vi(e){let t=globalThis.confirm;return t?t(e):!0}function st(e,t,o,n){if(Me.OS==="web"){Vi(`${e}
3
+
4
+ ${t}`)&&n();return}Gt.alert(e,t,[{text:"Cancel",style:"cancel"},{text:o,style:"destructive",onPress:n}])}import{useState as $i}from"react";import{jsx as fo,jsxs as Hi}from"react/jsx-runtime";function ar({disabled:e,busy:t,onCapture:o}){let[n,i]=$i(""),s=()=>{e||(o(n),i(""))};return Hi(u,{style:at.bar,children:[fo(Ce,{style:at.input,value:n,onChangeText:i,placeholder:"Name this restore point\u2026",placeholderTextColor:r.color.labelTertiary,editable:!e,onSubmitEditing:s,returnKeyType:"done",testID:"time-machine-name-input"}),fo(v,{style:[at.button,e?at.buttonDisabled:null],onPress:s,disabled:e,accessibilityRole:"button",accessibilityLabel:"Capture restore point",testID:"time-machine-capture",children:fo(l,{style:at.buttonText,children:t?"Capturing\u2026":"Capture"})})]})}var at=T.create({bar:{flexDirection:"row",alignItems:"center",gap:8,marginHorizontal:r.gutter,backgroundColor:r.color.group,borderRadius:r.radius.group,borderWidth:1,borderColor:r.color.groupBorder,paddingLeft:r.textInset,padding:6},input:{flex:1,minWidth:0,color:r.color.label,fontSize:r.font.row,letterSpacing:r.tracking.row,padding:0,backgroundColor:"transparent"},button:{height:34,paddingHorizontal:16,borderRadius:r.radius.pill,backgroundColor:r.color.accent,alignItems:"center",justifyContent:"center"},buttonDisabled:{opacity:.4},buttonText:{color:r.color.onAccent,fontSize:r.font.control,fontWeight:"600",letterSpacing:r.tracking.control}});import{X as Ni}from"@buoy-gg/shared-ui/web";import{jsx as ve,jsxs as Re}from"react/jsx-runtime";var Wi={top:10,bottom:10,left:10,right:10};function Pt(e){if(Object.values(e.results).some(o=>!o.ok||o.skipped.length>0))return!0;let t=e.route;return t?.status==="failed"||t?.status==="unavailable"}function It({glyph:e,text:t,ok:o,testID:n}){return Re(l,{style:[xe.line,{color:o?r.color.accent:r.color.warning}],numberOfLines:2,testID:n,children:[Re(l,{style:xe.glyph,children:[e," "]}),t]})}var ho="time-machine-outcome-route";function Bi({route:e}){return e.status==="navigated"?ve(It,{glyph:"\u2713",ok:!0,text:`route \u2014 ${e.href}`,testID:ho}):e.status==="deferred"?ve(It,{glyph:"\u21BB",ok:!0,text:`route \u2014 ${e.href} after reload`,testID:ho}):ve(It,{glyph:"\u2715",ok:!1,text:`route \u2014 ${e.error??e.status}`,testID:ho})}function lr({outcome:e}){let t=Object.entries(e.results),o=e.mode==="reload"||e.willReload;return Re(u,{style:xe.card,testID:"time-machine-outcome",children:[Re(u,{style:xe.headerRow,children:[Re(l,{style:xe.title,numberOfLines:1,testID:"time-machine-outcome-title",children:["Restored \u201C",e.snapshotName,"\u201D",o?" \xB7 reloading":""]}),ve(v,{onPress:()=>g.clearLastOutcome(),hitSlop:Wi,accessibilityRole:"button",accessibilityLabel:"Dismiss restore result",testID:"time-machine-outcome-dismiss",children:ve(Ni,{size:13,color:r.color.labelSecondary})})]}),t.length===0&&!e.route?ve(l,{style:xe.empty,testID:"time-machine-outcome-empty",children:"No sources restored."}):null,e.route?ve(Bi,{route:e.route}):null,t.map(([n,i])=>Re(u,{children:[ve(It,{testID:`time-machine-outcome-${n}`,glyph:i.ok?"\u2713":"\u2715",ok:i.ok,text:`${n} \u2014 applied ${i.applied}${i.skipped.length>0?`, skipped ${i.skipped.length}`:""}`}),i.skipped.slice(0,3).map(s=>Re(l,{style:xe.detail,numberOfLines:2,children:[s.id,": ",s.reason]},s.id)),i.warnings.slice(0,3).map(s=>Re(l,{style:xe.detail,numberOfLines:2,children:["\u26A0 ",s]},s))]},n))]})}var xe=T.create({card:{marginHorizontal:r.gutter,marginTop:12,backgroundColor:r.color.group,borderRadius:r.radius.group,borderWidth:1,borderColor:r.color.groupBorder,padding:14,gap:4},headerRow:{flexDirection:"row",alignItems:"center",gap:10,marginBottom:2},title:{flex:1,color:r.color.label,fontSize:15,fontWeight:"600",letterSpacing:r.tracking.control},line:{fontSize:r.font.footnote,lineHeight:r.font.footnote*1.4},glyph:{fontWeight:"700"},detail:{color:r.color.labelTertiary,fontSize:r.font.mono,lineHeight:r.font.mono*1.4,paddingLeft:14},empty:{color:r.color.labelSecondary,fontSize:r.font.footnote}});import{useEffect as _i,useRef as cr}from"react";import{jsx as kt,jsxs as Ui}from"react/jsx-runtime";var ur=84,dr=8,Te=null;function Fi(e,t){let o=!1,n=a=>{o=a,a?(Te&&Te!==i&&Te(),Te=i):Te===i&&(Te=null),Fe.spring(e,{toValue:a?-t:0,useNativeDriver:!0,bounciness:0,speed:18}).start()},i=()=>n(!1);return{pan:jt.create({onMoveShouldSetPanResponder:(a,d)=>Math.abs(d.dx)>Math.abs(d.dy)*1.5?d.dx<-dr||o&&d.dx>dr:!1,onPanResponderMove:(a,d)=>{let p=o?-t:0;e.setValue(Math.min(0,Math.max(-t,p+d.dx)))},onPanResponderRelease:(a,d)=>{let p=(o?-t:0)+d.dx;n(d.vx<-.5?!0:d.vx>.5?!1:p<-t/2)},onPanResponderTerminate:()=>n(o)}),close:i}}function pr({children:e,actions:t,testID:o}){let n=ur*t.length,i=cr(new Fe.Value(0)).current,s=cr(null);s.current===null&&(s.current=Fi(i,n));let{pan:a,close:d}=s.current;_i(()=>()=>{Te===d&&(Te=null)},[d]);let p=i.interpolate({inputRange:[-24,0],outputRange:[1,0],extrapolate:"clamp"});return Ui(u,{style:lt.clip,children:[kt(Fe.View,{style:[lt.actionLayer,{width:n,opacity:p}],children:t.map(y=>kt(v,{style:[lt.action,y.background?{backgroundColor:y.background}:null],onPress:()=>{d(),y.onPress()},accessibilityLabel:y.label,testID:y.testID??(o?`${o}-${y.label.toLowerCase()}`:void 0),children:kt(l,{style:[lt.actionText,y.color?{color:y.color}:null],numberOfLines:1,children:y.label})},y.label))}),kt(Fe.View,{style:[lt.content,{transform:[{translateX:i}]}],...a.panHandlers,children:e})]})}var lt=T.create({clip:{overflow:"hidden"},actionLayer:{position:"absolute",top:0,bottom:0,right:0,flexDirection:"row"},action:{width:ur,height:"100%",backgroundColor:r.color.fillStrong,alignItems:"center",justifyContent:"center",paddingHorizontal:6},actionText:{color:r.color.label,fontSize:r.font.footnote,fontWeight:"600",letterSpacing:r.tracking.control},content:{backgroundColor:r.color.group}});function Ee(e){let t=Math.max(0,Math.round((Date.now()-e)/1e3));if(t<60)return`${t}s ago`;let o=Math.round(t/60);if(o<60)return`${o}m ago`;let n=Math.round(o/60);return n<24?`${n}h ago`:`${Math.round(n/24)}d ago`}function mr(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}import{jsx as Ve,jsxs as go}from"react/jsx-runtime";function fr(e){if(e.baseline)return"Wipes to fresh install";let t=[Ee(e.createdAt),mr(e.sizeBytes),`${Object.keys(e.sources).length} sources`];return e.excludedKeys?.length?t.push(`skips ${e.excludedKeys.length}`):e.scope?.length&&t.push(`scoped (${e.scope.length})`),e.safety&&t.unshift("safety copy"),t.join(" \xB7 ")}function hr({meta:e,busy:t,armed:o=!1,onOpen:n,onRestore:i,onDelete:s,onDuplicate:a,onArm:d}){let p=`time-machine-snap-${e.id}`;return Ve(pr,{testID:p,actions:[{label:"Bar",onPress:d},{label:"Dup",onPress:a},{label:"Delete",onPress:s,background:r.color.danger,color:r.color.onDanger}],children:go(u,{style:me.row,children:[go(v,{style:me.text,onPress:n,activeOpacity:.7,accessibilityRole:"button",accessibilityLabel:`${e.name}. ${fr(e)}. Open restore preview`,testID:p,children:[Ve(l,{style:me.name,numberOfLines:1,testID:`${p}-name`,children:e.name}),o?Ve(l,{style:me.armed,numberOfLines:1,testID:`${p}-armed`,children:"On the action bar"}):null,Ve(l,{style:me.meta,numberOfLines:1,testID:`${p}-meta`,children:fr(e)}),e.lastRestoredAt?go(l,{style:me.restored,numberOfLines:1,testID:`${p}-restored`,children:["Restored ",Ee(e.lastRestoredAt)]}):null,e.route?Ve(l,{style:me.route,numberOfLines:1,testID:`${p}-route`,children:e.route.href}):null]}),Ve(v,{onPress:i,disabled:t,style:[me.restore,t?me.actionDisabled:null],accessibilityRole:"button",accessibilityLabel:e.baseline?"Wipe and reload":"Restore",testID:`${p}-restore`,children:Ve(nr,{testID:`${p}-restore-label`,label:e.baseline?"Wipe":"Restore",color:e.baseline?r.color.danger:r.color.accent,background:e.baseline?r.color.dangerSoft:r.color.accentSoft})})]})})}var me=T.create({row:{flexDirection:"row",alignItems:"center",gap:10,paddingHorizontal:r.textInset},text:{flex:1,minWidth:0,paddingVertical:11},restore:{justifyContent:"center"},name:{color:r.color.label,fontSize:r.font.row,fontWeight:"600",letterSpacing:r.tracking.row},meta:{color:r.color.labelSecondary,fontSize:r.font.footnote,marginTop:2,fontVariant:["tabular-nums"]},restored:{color:r.color.accent,fontSize:r.font.footnote,marginTop:2},armed:{color:r.color.accent,fontSize:r.font.footnote,marginTop:2},route:{color:r.color.labelTertiary,fontFamily:Ke,fontSize:r.font.mono,marginTop:4},actionDisabled:{opacity:.4}});import{useEffect as Ki}from"react";import{jsx as br,jsxs as gr}from"react/jsx-runtime";var Ji=8e3;function yr({name:e,at:t,onUndo:o,onExpire:n}){return Ki(()=>{let i=setTimeout(n,Ji);return()=>clearTimeout(i)},[t]),gr(u,{style:bo.bar,testID:"time-machine-undo-bar",children:[gr(l,{style:bo.text,numberOfLines:1,testID:"time-machine-undo-text",children:["Deleted \u201C",e,"\u201D"]}),br(v,{onPress:o,hitSlop:{top:10,bottom:10,left:10,right:10},accessibilityRole:"button",testID:"time-machine-undo-delete",children:br(l,{style:bo.undo,children:"Undo"})})]})}var bo=T.create({bar:{flexDirection:"row",alignItems:"center",gap:12,marginHorizontal:r.gutter,marginTop:12,minHeight:46,paddingHorizontal:r.textInset,backgroundColor:r.color.group,borderRadius:r.radius.group,borderWidth:1,borderColor:r.color.groupBorder},text:{flex:1,color:r.color.labelSecondary,fontSize:r.font.control,letterSpacing:r.tracking.control},undo:{color:r.color.accent,fontSize:r.font.control,fontWeight:"600",letterSpacing:r.tracking.control}});import{NightSwitch as Gi}from"@buoy-gg/shared-ui/web";import{jsx as pe,jsxs as yo}from"react/jsx-runtime";var ji={storage:"Settings, sign-in and other things saved on the device",redux:"Data the whole app shares between screens",zustand:"Data the whole app shares between screens",jotai:"Small pieces of data screens share",query:"Data the app loaded from the server",route:"Which screen you were on"};function qi(e){return ji[e.id]??"App data"}function Yi(e){return e.enabled?e.canRestore?null:{text:"Can be saved but not put back",tone:"warn"}:{text:"Off \xB7 left as it is",tone:"off"}}function Xi({source:e,onToggle:t}){let o=ir(e.id),n=qi(e),i=Yi(e);return yo(u,{style:fe.row,testID:`time-machine-source-${e.id}`,accessibilityLabel:`${e.label}: ${n}${i?`. ${i.text}`:""}`,children:[pe(u,{style:fe.disc,children:pe(o,{size:22,bgColor:r.color.disc})}),yo(u,{style:fe.text,children:[pe(l,{style:fe.label,numberOfLines:1,testID:`time-machine-source-${e.id}-label`,children:e.label}),pe(l,{style:fe.description,numberOfLines:2,testID:`time-machine-source-${e.id}-description`,children:n}),i?pe(l,{style:[fe.state,fe[`state_${i.tone}`]],numberOfLines:1,testID:i.tone==="off"?`time-machine-source-${e.id}-off`:`time-machine-source-${e.id}-detail`,children:i.text}):null]}),pe(u,{testID:`time-machine-source-${e.id}-switch`,children:pe(Gi,{value:e.enabled,disabled:!t,onValueChange:s=>t?.(e.id,s)})})]})}function Sr({sources:e,onToggle:t}){let o=e.filter(n=>n.canCapture);return yo(ze,{children:[o.map(n=>pe(Xi,{source:n,onToggle:t},n.id)),o.length===0?pe(u,{style:fe.row,testID:"time-machine-sources-empty",children:pe(l,{style:fe.description,children:"No state tools are set up in this app."})}):null]})}var fe=T.create({row:{flexDirection:"row",alignItems:"center",gap:12,minHeight:r.rowMinHeight,paddingHorizontal:r.textInset,paddingVertical:10},disc:{width:36,height:36,borderRadius:r.radius.pill,backgroundColor:r.color.disc,alignItems:"center",justifyContent:"center"},text:{flex:1,minWidth:0,gap:2},label:{color:r.color.label,fontSize:r.font.row,fontWeight:"500",letterSpacing:r.tracking.row},description:{fontSize:r.font.footnote,lineHeight:r.font.footnote*1.3,color:r.color.labelSecondary},state:{fontSize:r.font.mono,lineHeight:r.font.mono*1.3,fontWeight:"600",marginTop:1},state_off:{color:r.color.labelTertiary},state_warn:{color:r.color.warning}});import{jsx as wr}from"react/jsx-runtime";function xr({disabled:e,onWipe:t}){return wr(v,{style:[So.row,e?So.disabled:null],onPress:t,disabled:e,accessibilityRole:"button",testID:"time-machine-wipe-all",children:wr(l,{style:So.label,children:"Wipe All App State\u2026"})})}var So=T.create({row:{minHeight:r.rowMinHeight,alignItems:"center",justifyContent:"center"},disabled:{opacity:.4},label:{color:r.color.danger,fontSize:r.font.row,letterSpacing:r.tracking.row}});import{memo as Cs,useCallback as $e,useEffect as Yr,useMemo as Ht,useRef as Oo,useState as Ao}from"react";import{ChevronUp as Qr,AlertTriangle as Ms,RefreshCw as Os,useSafeAreaInsets as As}from"@buoy-gg/shared-ui/web";import{useToolHeader as Ls,useToolHost as zs}from"@buoy-gg/core/web";import{night as zt}from"@buoy-gg/shared-ui/web";import{useToolHost as Ss}from"@buoy-gg/core/web";import{night as wo,scheduleReloadApp as Qi}from"@buoy-gg/shared-ui/web";import{jsx as vr}from"react/jsx-runtime";function Tr(){let e=()=>{try{Qi({reason:"buoy time-machine reload app"})}catch{}};return vr(v,{style:Rr.chip,onPress:e,accessibilityLabel:"Reload app",accessibilityHint:"Reloads the JavaScript bundle without restoring anything",accessibilityRole:"button",testID:"time-machine-reload-app",children:vr(l,{style:Rr.label,children:"Reload app"})})}var Rr=T.create({chip:{height:32,paddingHorizontal:10,borderRadius:8,borderWidth:1,borderColor:wo.color.border,backgroundColor:wo.color.buttonSurface,alignItems:"center",justifyContent:"center"},label:{fontSize:11,fontWeight:"700",color:wo.color.textSecondary}});import{useEffect as At,useRef as rs,useState as Ie,useSyncExternalStore as $r}from"react";import{Check as Hr,ChevronDown as ns,ChevronUp as is,FloatingTool as ss,NightSwitch as as,Plus as ls,TimeMachineIcon as cs,X as ds,night as A,openFloatingTool as us,persistentStorage as ps,registerPersistentFloatingTool as ms,useLimit as fs}from"@buoy-gg/shared-ui/web";import{devToolsStorageKeys as Zi,persistentStorage as Ro}from"@buoy-gg/shared-ui/web";var vo=Zi.timeMachine.armedPoint(),ct=null,Ir=!1,xo=null,To=new Set,Pr=()=>To.forEach(e=>e());function je(){return ct}function Dt(e){return To.add(e),()=>{To.delete(e)}}function kr(){return Ir?Promise.resolve():(xo||(xo=Ro.getItem(vo).then(e=>{ct===null&&e&&(ct=e,Pr())}).catch(()=>{}).finally(()=>{Ir=!0})),xo)}function Ct(e){ct!==e&&(ct=e,Pr(),(e===null?Ro.removeItem(vo):Ro.setItem(vo,e)).catch(()=>{}))}function Mt(e,t){let o=e.filter(i=>!i.baseline&&!i.safety);if(o.length===0)return null;if(t){let i=o.find(s=>s.id===t);if(i)return i}let n=null;for(let i of o)i.lastRestoredAt!==void 0&&(!n||i.lastRestoredAt>(n.lastRestoredAt??0))&&(n=i);return n||o.reduce((i,s)=>s.createdAt>i.createdAt?s:i)}import{useEffect as es,useState as ts}from"react";import{night as _}from"@buoy-gg/shared-ui/web";import{jsx as le,jsxs as Dr}from"react/jsx-runtime";function Cr({visible:e,summary:t,onCapture:o,onCancel:n}){let[i,s]=ts("");es(()=>{e&&s("")},[e]);let a=()=>o(i.trim());return le(Jt,{visible:e,transparent:!0,animationType:"fade",onRequestClose:n,statusBarTranslucent:!0,children:le(Yt,{behavior:Me.OS==="ios"?"padding":void 0,style:ne.fill,children:le(xt,{style:ne.backdrop,onPress:n,accessibilityLabel:"Cancel",testID:"time-machine-bar-name-backdrop",children:Dr(xt,{style:ne.card,onPress:d=>d.stopPropagation(),testID:"time-machine-bar-name-panel",accessible:!1,children:[le(l,{style:ne.title,children:"Name this restore point"}),t?le(l,{style:ne.summary,testID:"time-machine-bar-name-summary",children:t}):null,le(Ce,{testID:"time-machine-bar-name-input",accessibilityLabel:"Restore point name",value:i,onChangeText:s,onSubmitEditing:a,placeholder:"Screen and time, if left empty",placeholderTextColor:_.color.placeholder,autoFocus:!0,autoCorrect:!1,autoCapitalize:"none",returnKeyType:"done",style:ne.input}),le(l,{style:ne.hint,children:"Captures the state the app is in right now and arms it on the bar."}),Dr(u,{style:ne.actions,children:[le(v,{testID:"time-machine-bar-name-cancel",accessibilityRole:"button",onPress:n,style:ne.secondary,children:le(l,{style:ne.secondaryText,children:"Cancel"})}),le(v,{testID:"time-machine-bar-name-capture",accessibilityRole:"button",accessibilityLabel:"Capture and arm this restore point",onPress:a,style:ne.primary,children:le(l,{style:ne.primaryText,children:"Capture"})})]})]})})})})}var ne=T.create({fill:{flex:1},backdrop:{flex:1,backgroundColor:"rgba(0, 0, 0, 0.55)",alignItems:"center",justifyContent:"center",padding:24},card:{width:"100%",maxWidth:360,borderRadius:_.radius.sheet,borderWidth:1,borderColor:_.color.separator,backgroundColor:_.color.surface,padding:18,gap:12,shadowColor:"#000",shadowOffset:{width:0,height:12},shadowOpacity:.4,shadowRadius:24,elevation:12},title:{color:_.color.text,fontSize:_.font.title,fontWeight:"600"},input:{minHeight:44,borderRadius:_.radius.input,borderWidth:1,borderColor:_.color.accentBorder,backgroundColor:_.color.surfaceElevated,color:_.color.text,fontSize:_.font.row,paddingHorizontal:12},summary:{color:_.color.textTertiary,fontSize:_.font.caption,marginTop:-6},hint:{color:_.color.textSecondary,fontSize:_.font.caption,lineHeight:18},actions:{flexDirection:"row",justifyContent:"flex-end",gap:10,marginTop:4},secondary:{minHeight:40,paddingHorizontal:14,borderRadius:_.radius.input,alignItems:"center",justifyContent:"center"},secondaryText:{color:_.color.textSecondary,fontSize:14,fontWeight:"600"},primary:{minHeight:40,paddingHorizontal:18,borderRadius:_.radius.input,backgroundColor:_.color.accent,alignItems:"center",justifyContent:"center"},primaryText:{color:_.color.onAccent,fontSize:14,fontWeight:"700"}});import{devToolsStorageKeys as os,persistentStorage as Or}from"@buoy-gg/shared-ui/web";var Ar=os.timeMachine.barReloadMode(),dt=!1,Mr=!1,Io=null,Po=new Set,Lr=()=>Po.forEach(e=>e());function ko(){return dt}function zr(e){return Po.add(e),()=>{Po.delete(e)}}function Er(){return Mr?Promise.resolve():(Io||(Io=Or.getItem(Ar).then(e=>{!dt&&e==="1"&&(dt=!0,Lr())}).catch(()=>{}).finally(()=>{Mr=!0})),Io)}function Vr(e){e!==dt&&(dt=e,Lr(),Or.setItem(Ar,e?"1":"0").catch(()=>{}))}import{Fragment as ys,jsx as D,jsxs as G}from"react/jsx-runtime";var Lt="time-machine-restore",Ot=1e4,Nr=900,Co=6,Br={id:Lt,render:e=>D(bs,{...e})};typeof C<"u"&&C&&typeof navigator<"u"&&navigator.product==="ReactNative"&&ms(Br,ps);function ut(e){e&&Ct(e),us(Br)}function hs(e){let t=Object.values(e.results),o=t.filter(a=>!a.ok||a.skipped.length>0).length,n=t.length,i=e.route,s=i?.status==="failed"||i?.status==="unavailable";return o===0&&s?"Route did not restore":`${o} of ${n} source${n===1?"":"s"} failed`}function gs(e){let t=[];for(let[n,i]of Object.entries(e.results)){if(i.ok&&i.skipped.length===0)continue;let s=i.skipped[0]?.reason??i.warnings[0]??"did not apply";t.push(`${n}: ${s}`)}let o=e.route;return(o?.status==="failed"||o?.status==="unavailable")&&t.push(`route: ${o.status}`),t}function Wr(e){let[t,o]=Ie(0);return At(()=>{if(!t)return;let n=setTimeout(()=>o(0),e);return()=>clearTimeout(n)},[t,e]),[t>0,()=>o(n=>n+1)]}function bs({id:e,revealToken:t,dismiss:o}){let{snapshots:n,hasLoaded:i,busy:s}=Ae(),a=Tt(),d=$r(Dt,je,je),p=fs("timeMachine.snapshots"),y=$r(zr,ko,ko),{width:L}=Xt(),[h,P]=Ie(null),[H,x]=Ie(null),[N,W]=Ie(),[S,Q]=Ie(!1),[ce,q]=Wr(Nr),[Xe,ie]=Wr(Nr),[j,z]=Ie(null),[de,ge]=Ie(null),[,Qe]=Ie(0),ee=rs(!0);At(()=>(ee.current=!0,kr(),Er(),g.ensureLoaded(),()=>{ee.current=!1}),[]);let M=Mt(n,d),gt=M?.id,Ze=M?.lastRestoredAt,bt=M?.createdAt;At(()=>{if(Ze===void 0&&bt===void 0&&!j&&de===null)return;let b=setInterval(()=>Qe(J=>J+1),2500);return()=>clearInterval(b)},[Ze,bt,j,de]),At(()=>{H&&H.snapshotId!==gt&&(x(null),P(b=>b==="outcome"?null:b))},[gt,H]);let He=Date.now(),yt=j!==null&&He-j.at<Ot&&n.some(b=>b.id===j.id),c=n.filter(b=>!b.safety).length>=p,R=!M||s!==null,O=s!==null,k=async(b,J)=>{if(!s){P(null),W(void 0);try{let oe=await g.restore(b,y&&J.safetyCapture?"reload":"live",void 0,J);if(!ee.current)return;Pt(oe)?(x(oe),P("outcome")):(x(null),q()),z(oe.safetySnapshotId?{id:oe.safetySnapshotId,at:Date.now()}:null),oe.safetySnapshotId&&ge(null)}catch(oe){if(!ee.current)return;W(oe instanceof Error?oe.message:String(oe)),P("error")}}},Y=(b=!1)=>{M&&k(M.id,{safetyCapture:!0,...b?{restoreRoute:!1}:{}})},se=()=>{j&&k(j.id,{safetyCapture:!1,restoreRoute:!1}).then(()=>{ee.current&&ge(Date.now())})},te=()=>{if(!s){if(W(void 0),c){P("cap");return}P(null),Q(!0)}},Ne=async b=>{if(Q(!1),!s)try{let J=await g.capture(b);if(!ee.current)return;Ct(J.id),z(null),ie()}catch(J){if(!ee.current)return;W(J instanceof Error?J.message:String(J)),P("error")}},_t=b=>{Ct(b.id),P(null)},St=M?.name??(i?"No restore points":"Loading\u2026"),X,et="normal",Pe=!1;if(s==="restore")X="Restoring\u2026";else if(s==="capture")X="Capturing\u2026";else if(N)X=N,et="danger";else if(H&&M&&H.snapshotId===M.id)X=hs(H),et="danger";else if(!M)X=i?"Capture one with +":"";else{Pe=!0;let b=M.lastRestoredAt===void 0?null:He-M.lastRestoredAt,J=He-M.createdAt;de!==null&&He-de<Ot?X="undone, state only":b!==null&&b<Ot?X="restored just now":J<Ot&&b===null?X="captured just now":M.lastRestoredAt!==void 0?X=`restored ${Ee(M.lastRestoredAt)}`:X=`${Object.keys(M.sources).length} sources`,y&&(X+=" \xB7 reloads")}let We=Pe&&!yt&&M&&M.route&&Ue(M)?M.route.pathname:null,ke=n.filter(b=>!b.baseline&&!b.safety),V=(()=>{let b=a.filter($o=>$o.status().canCapture&&Z($o.id)).length,J=Be(),oe=[`${b} source${b===1?"":"s"}`];return J&&oe.push(J.pathname),oe.join(" \xB7 ")})(),be;return h==="picker"?be=G(u,{style:I.menu,testID:"time-machine-bar-picker",children:[G(tt,{style:I.pickerList,bounces:!1,children:[ke.map(b=>{let J=b.id===M?.id;return G(v,{testID:`time-machine-bar-pick-${b.id}`,accessibilityRole:"button",accessibilityState:{selected:J},accessibilityLabel:`Arm ${b.name}`,onPress:()=>_t(b),style:I.pickRow,children:[G(u,{style:I.pickText,children:[D(l,{numberOfLines:1,style:I.pickName,children:b.name}),G(l,{numberOfLines:1,style:I.pickDetail,children:[Ee(b.createdAt),b.route?` \xB7 ${b.route.pathname}`:"",b.lastRestoredAt!==void 0?D(l,{style:I.pickRestored,children:` \xB7 restored ${Ee(b.lastRestoredAt)}`}):null]})]}),J?D(Hr,{size:14,color:A.color.accent}):null]},b.id)}),ke.length===0?D(l,{style:I.menuText,children:"No restore points yet."}):null]}),ke.length>Co?G(l,{style:I.pickerMore,children:["Scroll for ",ke.length-Co," more"]}):null,G(u,{style:I.settingRow,testID:"time-machine-bar-reload-mode",children:[G(u,{style:I.settingText,children:[D(l,{style:I.settingLabel,children:"Reload the app after restoring"}),D(l,{style:I.settingHint,children:"For screens that read their state from storage only when they open, like a cart kept in a React context."})]}),D(as,{value:y,onValueChange:Vr})]})]}):h==="outcome"&&H?be=G(u,{style:I.menu,testID:"time-machine-bar-outcome",children:[gs(H).map(b=>D(l,{style:I.menuDanger,children:b},b)),D(l,{style:I.menuText,children:"The full report is on Time Machine's outcome card."}),D(Do,{onPress:()=>P(null)})]}):h==="cap"?be=G(u,{style:I.menu,testID:"time-machine-bar-cap",children:[G(l,{style:I.menuText,children:["Free plan keeps ",p," restore point",p===1?"":"s",". Delete one in Time Machine, or upgrade to Pro for unlimited snapshots."]}),D(Do,{onPress:()=>P(null)})]}):h==="error"&&N&&(be=G(u,{style:I.menu,testID:"time-machine-bar-error",children:[D(l,{accessibilityRole:"alert",style:I.menuDanger,children:N}),D(Do,{onPress:()=>{P(null),W(void 0)}})]})),G(ys,{children:[D(Cr,{visible:S,summary:V,onCapture:b=>void Ne(b),onCancel:()=>Q(!1)}),D(ss,{id:e,revealToken:t,variant:"strip",dragFromSurface:!0,defaultPlacement:"bottom",accessibilityLabel:`Move or hide the action bar. ${M?`${M.name} armed`:"Nothing armed"}`,accessory:be,handleAdornment:D(cs,{size:12,color:A.color.accent}),children:G(u,{style:[I.row,{width:Math.max(260,Math.min(320,L-64))}],children:[D(v,{testID:"time-machine-bar-restore",accessibilityRole:"button",accessibilityLabel:M?`Restore ${M.name}`:"Restore, nothing armed",accessibilityHint:We?`Also returns to ${We}. Long press to restore state only.`:void 0,accessibilityState:{disabled:R},disabled:R,onPress:()=>Y(!1),onLongPress:()=>Y(!0),style:[I.restoreButton,R&&I.disabled],children:s==="restore"?D(_e,{size:"small",color:A.color.accent}):ce?D(l,{style:I.restoreText,testID:"time-machine-bar-restored",children:"Restored"}):D(l,{style:I.restoreText,children:"Restore"})}),G(u,{style:I.identity,children:[D(l,{testID:"time-machine-bar-name",accessibilityLabel:`Armed restore point: ${St}`,numberOfLines:1,ellipsizeMode:"middle",style:I.name,children:St}),G(u,{style:I.statusRow,children:[G(l,{testID:"time-machine-bar-status",numberOfLines:1,accessibilityLiveRegion:"polite",style:[I.status,et==="danger"&&I.danger],children:[X,We?D(l,{style:I.destination,children:` \xB7 \u2192 ${We}`}):null]}),yt&&!s?D(v,{testID:"time-machine-bar-undo",accessibilityRole:"button",accessibilityLabel:"Undo the last restore",onPress:se,hitSlop:{top:8,bottom:8,left:6,right:6},children:D(l,{style:I.undo,children:"Undo"})}):null]})]}),D(v,{testID:"time-machine-bar-pick",accessibilityRole:"button",accessibilityLabel:"Choose another restore point",accessibilityState:{expanded:h==="picker"},onPress:()=>P(b=>b==="picker"?null:"picker"),style:I.smallButton,children:h==="picker"?D(is,{size:14,color:A.color.textSecondary}):D(ns,{size:14,color:A.color.textSecondary})}),D(v,{testID:"time-machine-bar-capture",accessibilityRole:"button",accessibilityLabel:"Capture a new restore point here and arm it",accessibilityState:{disabled:O},disabled:O,onPress:te,style:[I.smallButton,O&&I.disabled],children:s==="capture"?D(_e,{size:"small",color:A.color.accent}):Xe?D(u,{testID:"time-machine-bar-captured",children:D(Hr,{size:18,color:A.color.accent})}):D(ls,{size:18,color:c?A.color.textTertiary:A.color.text})}),D(u,{style:I.separator}),D(v,{testID:"time-machine-bar-close",accessibilityRole:"button",accessibilityLabel:"Close the action bar",onPress:o,style:I.closeButton,children:D(ds,{size:16,color:A.color.textSecondary})})]})})]})}function Do({onPress:e,label:t="Dismiss"}){return D(v,{testID:"time-machine-bar-dismiss",accessibilityRole:"button",onPress:e,style:I.dismiss,children:D(l,{style:I.dismissText,children:t})})}var I=T.create({row:{flexDirection:"row",alignItems:"center",gap:4,paddingVertical:4,minHeight:48},restoreButton:{height:32,minWidth:72,paddingHorizontal:12,borderRadius:8,borderWidth:1,borderColor:A.color.accentBorderStrong,backgroundColor:A.color.accentSoft,alignItems:"center",justifyContent:"center",marginLeft:2},restoreText:{color:A.color.accent,fontSize:12,fontWeight:"700"},smallButton:{width:32,minHeight:44,alignItems:"center",justifyContent:"center"},closeButton:{width:28,minHeight:44,alignItems:"center",justifyContent:"center"},identity:{flex:1,minHeight:44,justifyContent:"center",gap:1},name:{color:A.color.text,fontSize:13,fontWeight:"500"},statusRow:{flexDirection:"row",alignItems:"center",gap:8},status:{color:A.color.textSecondary,fontSize:10,lineHeight:14,flexShrink:1},destination:{color:A.color.textTertiary},danger:{color:A.color.danger},undo:{color:A.color.accent,fontSize:10,lineHeight:14,fontWeight:"700"},separator:{height:20,width:1,backgroundColor:A.color.separator,marginHorizontal:2},disabled:{opacity:.4},menu:{marginVertical:8,padding:6,borderRadius:A.radius.card,borderWidth:1,borderColor:A.color.separator,backgroundColor:A.color.surface,shadowColor:"#000",shadowOffset:{width:0,height:6},shadowOpacity:.25,shadowRadius:16,elevation:8},menuText:{color:A.color.textSecondary,fontSize:12,lineHeight:18,padding:10},menuDanger:{color:A.color.danger,fontSize:12,lineHeight:18,paddingHorizontal:10,paddingTop:6},pickerList:{maxHeight:Co*44},pickerMore:{color:A.color.textTertiary,fontSize:10,lineHeight:14,textAlign:"center",paddingVertical:4},pickRow:{flexDirection:"row",alignItems:"center",gap:8,minHeight:44,paddingHorizontal:10,borderRadius:A.radius.row},pickText:{flex:1},settingRow:{flexDirection:"row",alignItems:"center",gap:10,paddingHorizontal:10,paddingVertical:8,borderTopWidth:T.hairlineWidth,borderTopColor:A.color.separator,marginTop:4},settingText:{flex:1,gap:2},settingLabel:{color:A.color.text,fontSize:12,fontWeight:"500"},settingHint:{color:A.color.textTertiary,fontSize:10,lineHeight:13},pickName:{color:A.color.text,fontSize:13,fontWeight:"500"},pickDetail:{color:A.color.textSecondary,fontSize:10,lineHeight:14},pickRestored:{color:A.color.accent},dismiss:{alignSelf:"flex-end",paddingHorizontal:10,paddingVertical:8},dismissText:{color:A.color.accent,fontSize:12,fontWeight:"600"}});import{jsx as Vt,jsxs as _r}from"react/jsx-runtime";function ws({armId:e}){let t=Ss(),o=()=>{ut(e),t.minimize()};return _r(v,{style:Et.labeledChip,onPress:o,accessibilityLabel:"Open the floating action bar over the app",accessibilityRole:"button",testID:"time-machine-header-bar",children:[Vt(u,{style:Et.glyph}),Vt(l,{style:Et.label,children:"Action bar"})]})}function $t({armId:e}){return _r(u,{style:Et.row,children:[Vt(ws,{armId:e}),Vt(Tr,{})]})}var Et=T.create({row:{flexDirection:"row",alignItems:"center",gap:8},labeledChip:{height:32,flexDirection:"row",alignItems:"center",gap:6,paddingHorizontal:10,borderRadius:8,borderWidth:1,borderColor:zt.color.border,backgroundColor:zt.color.buttonSurface},glyph:{width:14,height:8,borderRadius:3,borderWidth:1.5,borderColor:zt.color.accent},label:{fontSize:11,fontWeight:"700",color:zt.color.accent}});import{useMemo as xs}from"react";import{ABSENT_VALUE as Fr,ThemedSplitView as Rs,devToolsDefaultTheme as vs,toDiffable as Ur}from"@buoy-gg/shared-ui/web/dataViewer";import{jsx as Is,jsxs as Jr}from"react/jsx-runtime";var Ts=[];function Gr({item:e,testID:t}){let{oldValue:o,newValue:n}=xs(()=>({oldValue:e.verdict==="added"?Fr:Ur(e.oldValue),newValue:e.verdict==="removed"?Fr:Ur(e.newValue)}),[e]);return Jr(u,{style:Kr.panel,testID:t,children:[e.reason?Jr(l,{style:Kr.reason,children:["\u26A0 ",e.reason]}):null,Is(Rs,{oldValue:o,newValue:n,differences:Ts,theme:vs,scrollEnabled:!1})]})}var Kr=T.create({panel:{paddingLeft:16,paddingRight:12,paddingTop:10,paddingBottom:14,gap:10,backgroundColor:r.color.group},reason:{color:r.color.warning,fontSize:r.font.footnote}});import{useEffect as Ps,useState as ks}from"react";import{jsx as jr,jsxs as Ds}from"react/jsx-runtime";function qr({name:e,onRename:t}){let[o,n]=ks(e);Ps(()=>n(e),[e]);let i=()=>{let s=o.trim();if(!s){n(e);return}s!==e&&t(s)};return Ds(u,{style:Mo.row,children:[jr(l,{style:Mo.label,children:"Name"}),jr(Ce,{style:Mo.input,value:o,onChangeText:n,onSubmitEditing:i,onBlur:i,returnKeyType:"done",selectTextOnFocus:!0,accessibilityLabel:"Restore point name",testID:"tm-preview-name"})]})}var Mo=T.create({row:{flexDirection:"row",alignItems:"center",gap:14,minHeight:r.rowMinHeight,paddingHorizontal:r.textInset},label:{color:r.color.labelSecondary,fontSize:r.font.row,letterSpacing:r.tracking.row},input:{flex:1,minWidth:0,color:r.color.label,fontSize:r.font.row,fontWeight:"600",letterSpacing:r.tracking.row,textAlign:"right",padding:0,backgroundColor:"transparent"}});var qe={added:{glyph:"+",color:r.color.accent,label:"added",applies:!0},removed:{glyph:"\u2212",color:r.color.danger,label:"removed",applies:!0},changed:{glyph:"\u2248",color:r.color.info,label:"changed",applies:!0},"too-large":{glyph:"\u2248",color:r.color.warning,label:"changed (large)",applies:!0},unchanged:{glyph:"=",color:r.color.labelTertiary,label:"unchanged",applies:!1},"wont-apply":{glyph:"\u2298",color:r.color.warning,label:"won't apply",applies:!1},recomputes:{glyph:"\u21BB",color:r.color.labelTertiary,label:"recomputes",applies:!1}};import{Fragment as Hs,jsx as m,jsxs as F}from"react/jsx-runtime";var Xr={storage:"keys",redux:"slices",zustand:"stores",jotai:"atoms",query:"queries"},Lo=new Set;function Es(e,t){if(e.size!==t.size)return!1;for(let o of e)if(!t.has(o))return!1;return!0}function he(e,t){return`${e}::${t}`}function Nt(e){if(e===void 0)return"\u2205";try{let t=typeof e=="string"?`"${e}"`:JSON.stringify(e);return t?t.length>46?`${t.slice(0,43)}\u2026`:t:String(e)}catch{return"[complex]"}}function pt({position:e,children:t}){return F(u,{style:[f.cardRow,e.first?f.cardRowFirst:null,e.last?f.cardRowLast:null],children:[e.first?null:m(u,{style:f.cardSeparator}),t]})}function zo({glyph:e,count:t,color:o,testID:n}){return m(u,{style:[f.countPill,{backgroundColor:`${o}26`}],children:F(l,{style:[f.countPillText,{color:o}],testID:n,children:[e,t]})})}function Eo({state:e}){return m(u,{style:[f.checkbox,e!=="none"&&f.checkboxChecked],children:e==="none"?null:m(l,{style:f.checkboxGlyph,children:e==="all"?"\u2713":"\u2212"})})}var Vs=Cs(function({row:t,expanded:o,onOpen:n,onToggle:i}){let s=qe[t.item.verdict],a=!s.applies||t.excluded,d=t.item.verdict==="changed"||t.item.verdict==="added"||t.item.verdict==="removed",p=`tm-preview-item-${t.sourceId}-${t.item.key}`;return m(pt,{position:t,children:F(u,{style:[f.itemRow,a&&f.dimmed],children:[m(v,{onPress:i,disabled:!s.applies,hitSlop:{top:10,bottom:10,left:8,right:8},testID:`tm-preview-toggle-${t.sourceId}-${t.item.key}`,accessibilityRole:"checkbox",accessibilityState:{checked:!(!s.applies||t.excluded)},accessibilityLabel:`Include ${t.item.label}`,children:m(Eo,{state:!s.applies||t.excluded?"none":"all"})}),F(v,{style:f.itemBodyTouch,onPress:()=>d&&n(),disabled:!d,testID:p,children:[m(l,{style:[f.itemGlyph,{color:s.color}],children:s.glyph}),F(u,{style:f.itemBody,children:[m(l,{style:f.itemLabel,numberOfLines:1,testID:`${p}-label`,children:t.item.label}),t.item.verdict==="changed"&&F(l,{style:f.itemPreview,numberOfLines:1,testID:`${p}-values`,children:[Nt(t.item.oldValue)," \u2192"," ",Nt(t.item.newValue)]}),t.item.verdict==="added"&&m(l,{style:f.itemPreview,numberOfLines:1,testID:`${p}-values`,children:Nt(t.item.newValue)}),t.item.verdict==="removed"&&m(l,{style:[f.itemPreview,f.itemPreviewRemoved],numberOfLines:1,testID:`${p}-values`,children:Nt(t.item.oldValue)}),t.excluded?m(l,{style:f.itemExcluded,testID:`${p}-excluded`,children:"excluded \u2014 restore leaves this untouched"}):t.item.reason&&m(l,{style:f.itemReason,numberOfLines:2,testID:`${p}-reason`,children:t.item.reason})]}),d?o?m(Qr,{size:16,color:r.color.labelTertiary}):m(mo,{}):null]})]})})});function Zr({preview:e,snapshots:t,busy:o,onBack:n,onRestore:i}){let s=zs(),a=s.instanceId!==void 0,d=As({minBottom:16}),[p,y]=Ao({}),[L,h]=Ao(new Set),P=Oo(!1),[H,x]=Ao(Lo),N=$e(c=>{x(R=>{let O=new Set(R);return O.has(c)?O.delete(c):O.add(c),O})},[]),W=s.search,S=e.right==="current"?void 0:t.find(c=>c.id===e.right.snapshotId),Q=Oo(S);Q.current=S;let ce=$e(()=>{if(!Q.current)return;let c=Q.current;g.setRestoreRoute(c.id,!Ue(c))},[]),q=S?.baseline===!0,Xe=e.left==="current",ie=Ht(()=>S?S.excludedKeys?.length?new Set(S.excludedKeys):Lo:null,[S]),j=!!S?.scope?.length&&!S?.excludedKeys?.length,z=Ht(()=>{if(!j||!S?.scope)return Lo;let c=new Set(S.scope),R=new Set;for(let O of e.sources)for(let k of O.items){let Y=he(O.id,k.key);qe[k.verdict].applies&&!c.has(Y)&&R.add(Y)}return R},[j,S,e.sources]),de=Oo(null);Yr(()=>{if(!S||e.building||!ie||de.current===S.id)return;de.current=S.id,P.current=!1;let c=ie.size>0?ie:z;c.size>0&&h(new Set(c)),j&&c.size>0&&g.setExclusions(S.id,Array.from(c))},[S,e.building,ie,z,j]),Yr(()=>{if(!S||!ie||!P.current||Es(L,ie))return;let c=Array.from(L);g.setExclusions(S.id,c.length?c:null)},[L,S,ie]);let ge=$e(c=>{P.current=!0,h(R=>{let O=new Set(R);return O.has(c)?O.delete(c):O.add(c),O})},[]),Qe=$e((c,R)=>{P.current=!0,h(O=>{let k=new Set(O);for(let Y of c.items){if(!qe[Y.verdict].applies)continue;let se=he(c.id,Y.key);R==="all"?k.add(se):k.delete(se)}return k})},[]),ee=$e((c,R)=>{y(O=>({...O,[c]:!R}))},[]),M=Ht(()=>{let c=0,R=0,O=0,k=[];for(let Y of e.sources){let se=0;for(let te of Y.items)qe[te.verdict].applies?L.has(he(Y.id,te.key))?R+=1:(c+=1,se+=1):te.verdict==="wont-apply"&&(O+=1);se>0&&k.push(`${se} ${Y.label.toLowerCase()}`)}return{applies:c,excludedCount:R,wontApply:O,perSource:k}},[e.sources,L]);Ls(a?{title:"Restore Preview",subtitle:S?.name??"preview",onBack:n,actions:m($t,{armId:S?.id})}:null,[a,S?.name,S?.id]);let{rows:gt,blockedSources:Ze}=Ht(()=>{let c=W.trim().toLowerCase(),R=[],O=[];for(let k of e.sources){let Y=k.items.some(V=>V.verdict!=="unchanged");if(!Y&&!k.error)continue;let se=Y||k.notes.length>0||!!k.error,te=k.items.filter(V=>qe[V.verdict].applies),Ne=k.items.filter(V=>V.verdict==="wont-apply").length;Ne>0&&O.push(k.label);let _t=k.items.length===1?(Xr[k.id]??"items").replace(/ies$/,"y").replace(/s$/,""):Xr[k.id]??"items",St=`${k.items.length} ${_t} \xB7 `+(te.length>0?`${te.length} changed`:Ne>0?`${Ne} won't apply`:"no changes"),X=te.filter(V=>L.has(he(k.id,V.key))).length,et=te.length===0||X===0?"all":X===te.length?"none":"some",Pe={added:0,removed:0,changed:0};for(let V of k.items)L.has(he(k.id,V.key))||(V.verdict==="added"?Pe.added+=1:V.verdict==="removed"?Pe.removed+=1:(V.verdict==="changed"||V.verdict==="too-large")&&(Pe.changed+=1));let We=k.items.filter(V=>!(V.verdict==="unchanged"||c&&!V.label.toLowerCase().includes(c))),ke=se?p[k.id]??!0:!0;if(R.push({kind:"source",source:k,collapsed:ke,includeState:et,applicableCount:te.length,counts:Pe,expandable:se,summary:St,first:!1,last:!1}),!ke){for(let V of k.notes)R.push({kind:"note",id:`${k.id}:${V}`,text:V,first:!1,last:!1});k.error&&R.push({kind:"note",id:`${k.id}:err`,text:`\u26A0 ${k.error}`,first:!1,last:!1});for(let V of We){let be=he(k.id,V.key);R.push({kind:"item",sourceId:k.id,item:V,excluded:L.has(be),first:!1,last:!1}),H.has(be)&&R.push({kind:"diff",sourceId:k.id,item:V,first:!1,last:!1})}}}return S?.route&&R.push({kind:"route",href:S.route.href,on:Ue(S),first:!1,last:!1}),R.length>0&&(R[0].first=!0,R[R.length-1].last=!0),{rows:R,blockedSources:O}},[e.sources,W,p,L,H,S]),bt=$e(({item:c})=>{if(c.kind==="source"){let R=c.source,{counts:O}=c;return m(pt,{position:c,children:F(u,{style:f.sourceCard,children:[m(v,{onPress:()=>Qe(R,c.includeState),disabled:c.applicableCount===0,hitSlop:{top:10,bottom:10,left:8,right:8},testID:`tm-preview-source-toggle-${R.id}`,children:m(Eo,{state:c.applicableCount===0?"none":c.includeState})}),F(v,{style:f.sourceCardTouch,onPress:()=>c.expandable&&ee(R.id,c.collapsed),disabled:!c.expandable,testID:`tm-preview-source-${R.id}`,children:[F(u,{style:f.sourceNameBlock,children:[m(l,{style:f.sourceName,numberOfLines:1,testID:`tm-preview-source-${R.id}-name`,children:R.label}),m(l,{style:f.sourceSummary,numberOfLines:1,testID:`tm-preview-source-${R.id}-summary`,children:c.includeState==="none"&&c.applicableCount>0?`${c.summary} \xB7 excluded`:c.summary})]}),F(u,{style:f.sourceBadges,children:[O.removed>0?m(zo,{glyph:"\u2212",count:O.removed,color:r.color.danger,testID:`tm-preview-source-${R.id}-removed`}):null,O.added>0?m(zo,{glyph:"+",count:O.added,color:r.color.accent,testID:`tm-preview-source-${R.id}-added`}):null,O.changed>0?m(zo,{glyph:"\u2248",count:O.changed,color:r.color.info,testID:`tm-preview-source-${R.id}-changed`}):null]}),c.expandable?c.collapsed?m(mo,{}):m(Qr,{size:16,color:r.color.labelTertiary}):null]})]})})}return c.kind==="note"?m(pt,{position:c,children:m(l,{style:f.noteRow,testID:`tm-preview-note-${c.id}`,children:c.text})}):c.kind==="route"?m(pt,{position:c,children:F(v,{style:f.routeRow,onPress:ce,accessibilityRole:"switch",accessibilityState:{checked:c.on},accessibilityLabel:`Also return to ${c.href}`,testID:"tm-preview-route",children:[m(Eo,{state:c.on?"all":"none"}),F(u,{style:f.routeText,children:[m(l,{style:f.routeTitle,children:"Return to this screen"}),m(l,{style:f.routeHref,numberOfLines:1,testID:"tm-preview-route-href",children:c.href})]})]})}):c.kind==="diff"?m(pt,{position:c,children:m(Gr,{item:c.item,testID:`tm-preview-diff-${c.sourceId}-${c.item.key}`})}):m(Vs,{row:c,expanded:H.has(he(c.sourceId,c.item.key)),onOpen:()=>N(he(c.sourceId,c.item.key)),onToggle:()=>ge(he(c.sourceId,c.item.key))})},[H,N,ee,ge,Qe,ce]),He=$e(c=>c.kind==="source"?`s:${c.source.id}`:c.kind==="note"?`n:${c.id}`:c.kind==="route"?"route":c.kind==="diff"?`d:${c.sourceId}:${c.item.key}`:`i:${c.sourceId}:${c.item.key}`,[]),yt=F(u,{children:[!a&&F(u,{style:f.fallbackHeader,children:[m(v,{onPress:n,hitSlop:$s,testID:"tm-preview-back",children:m(l,{style:f.backText,children:"\u2039 Back"})}),m(l,{style:f.screenTitle,numberOfLines:1,children:"Restore Preview"})]}),S?F(Hs,{children:[m(Je,{children:"Restore Point"}),m(ze,{children:m(qr,{name:S.name,onRename:c=>void g.rename(S.id,c)})})]}):null,m(Je,{children:"Changes to Restore"})]}),Bt=o||e.building||M.applies===0;return F(u,{style:f.container,children:[m(qt,{testID:"tm-preview-list",data:gt,renderItem:bt,keyExtractor:He,ListHeaderComponent:yt,ListEmptyComponent:e.building?m(_e,{style:f.buildingSpinner,size:"small",color:r.color.accent}):m(l,{style:f.emptyText,testID:"tm-preview-empty",children:W?"Nothing matches this filter.":"No changes \u2014 restoring would change nothing."}),ListFooterComponent:m(u,{children:M.wontApply>0?F(u,{style:f.warnNote,children:[m(Ms,{size:12,color:r.color.warning}),F(l,{style:f.warnNoteText,testID:"tm-preview-wont-apply",children:[M.wontApply," item",M.wontApply===1?"":"s"," ","won't apply \u2014 expand"," ",Ze.length>0?Ze.join(" and "):"the source"," ","to see the reason."]})]}):null}),keyboardShouldPersistTaps:"handled",removeClippedSubviews:!0,initialNumToRender:20,windowSize:7,contentContainerStyle:f.listContent}),Xe&&S&&F(u,{style:[f.footer,{paddingBottom:d.bottom}],children:[F(v,{style:[f.cta,q&&f.ctaDanger,Bt&&f.ctaDisabled],onPress:()=>i(q?"reload":"live",Array.from(L)),disabled:q?o||e.building:Bt,testID:"tm-preview-restore",children:[m(Os,{size:16,color:q?r.color.onDanger:r.color.onAccent}),m(l,{style:[f.ctaText,q?f.ctaTextDanger:null],children:q?"Wipe & Reload":"Restore State"})]}),m(l,{style:f.ctaCaption,testID:"tm-preview-cta-caption",children:q?"This wipes all app storage and reloads the app.":M.excludedCount>0?`Restores ${M.applies} of ${M.applies+M.excludedCount} change${M.applies+M.excludedCount===1?"":"s"} \u2014 everything else stays as it is.`:"This will replace the current state with the snapshot."})]})]})}var $s={top:10,bottom:10,left:10,right:10},f=T.create({container:{flex:1,backgroundColor:"transparent"},fallbackHeader:{flexDirection:"row",alignItems:"center",paddingHorizontal:r.gutter,paddingVertical:10,gap:10},backText:{color:r.color.accent,fontSize:r.font.control},screenTitle:{color:r.color.label,fontSize:20,fontWeight:"700",letterSpacing:r.tracking.row,flex:1},dimmed:{opacity:.5},listContent:{paddingTop:14,paddingBottom:12},cardRow:{marginHorizontal:r.gutter,backgroundColor:r.color.group},cardRowFirst:{borderTopLeftRadius:r.radius.group,borderTopRightRadius:r.radius.group},cardRowLast:{borderBottomLeftRadius:r.radius.group,borderBottomRightRadius:r.radius.group,marginBottom:10},cardSeparator:{height:T.hairlineWidth,marginLeft:51,backgroundColor:r.color.separator},warnNote:{flexDirection:"row",alignItems:"flex-start",gap:6,paddingHorizontal:r.gutter+r.textInset,paddingTop:8},warnNoteText:{flex:1,color:r.color.labelSecondary,fontSize:r.font.footnote,lineHeight:r.font.footnote*1.35},countPill:{borderRadius:r.radius.pill,paddingHorizontal:9,paddingVertical:3},countPillText:{fontFamily:Ke,fontSize:r.font.footnote,fontWeight:"600"},checkbox:{width:23,height:23,borderRadius:r.radius.pill,borderWidth:1.7,borderColor:r.color.labelTertiary,alignItems:"center",justifyContent:"center"},checkboxChecked:{borderColor:r.color.accent,backgroundColor:r.color.accent},checkboxGlyph:{color:r.color.onAccent,fontSize:13,fontWeight:"700",lineHeight:15},routeRow:{flexDirection:"row",alignItems:"center",minHeight:58,paddingHorizontal:r.textInset,paddingVertical:9,gap:12},routeText:{flex:1,minWidth:0,gap:2},routeTitle:{color:r.color.label,fontSize:r.font.row,fontWeight:"600",letterSpacing:r.tracking.row},routeHref:{color:r.color.labelSecondary,fontFamily:Ke,fontSize:r.font.mono},sourceCard:{flexDirection:"row",alignItems:"center",minHeight:58,paddingHorizontal:r.textInset,paddingVertical:9,gap:12},sourceCardTouch:{flex:1,flexDirection:"row",alignItems:"center",gap:12,minWidth:0},sourceNameBlock:{flex:1,minWidth:0,gap:2},sourceName:{color:r.color.label,fontSize:r.font.row,fontWeight:"600",letterSpacing:r.tracking.row},sourceSummary:{color:r.color.labelSecondary,fontSize:r.font.footnote,fontVariant:["tabular-nums"]},sourceBadges:{flexDirection:"row",gap:6},noteRow:{color:r.color.labelTertiary,fontSize:r.font.footnote,lineHeight:r.font.footnote*1.35,paddingHorizontal:r.textInset,paddingVertical:9},itemRow:{flexDirection:"row",alignItems:"center",paddingLeft:r.textInset,paddingRight:r.textInset,paddingVertical:10,gap:12},itemBodyTouch:{flex:1,flexDirection:"row",alignItems:"center",gap:10,minWidth:0},itemGlyph:{fontSize:14,fontWeight:"700",width:14,textAlign:"center"},itemBody:{flex:1,minWidth:0},itemLabel:{color:r.color.label,fontSize:r.font.control,letterSpacing:r.tracking.control},itemPreview:{color:r.color.labelSecondary,fontFamily:Ke,fontSize:r.font.mono,marginTop:3},itemPreviewRemoved:{textDecorationLine:"line-through"},itemReason:{color:r.color.warning,fontSize:r.font.mono,marginTop:3},itemExcluded:{color:r.color.labelTertiary,fontSize:r.font.mono,marginTop:3,fontStyle:"italic"},buildingSpinner:{marginTop:28},emptyText:{color:r.color.labelSecondary,fontSize:r.font.footnote,textAlign:"center",marginTop:28},footer:{paddingHorizontal:r.gutter,paddingTop:10,gap:8,borderTopColor:r.color.separator,borderTopWidth:T.hairlineWidth,backgroundColor:r.color.sheet},cta:{flexDirection:"row",alignItems:"center",justifyContent:"center",gap:8,height:50,backgroundColor:r.color.accent,borderRadius:r.radius.group},ctaDanger:{backgroundColor:r.color.danger},ctaTextDanger:{color:r.color.onDanger},ctaDisabled:{opacity:.4},ctaText:{color:r.color.onAccent,fontSize:r.font.row,fontWeight:"600",letterSpacing:r.tracking.row},ctaCaption:{color:r.color.labelSecondary,fontSize:r.font.footnote,lineHeight:r.font.footnote*1.35,textAlign:"center"}});import{jsx as Ws}from"react/jsx-runtime";function Ns(e,t){return e==="current"?void 0:t.find(o=>o.id===e.snapshotId)}function en({preview:e,snapshots:t,busy:o,onClose:n}){let i=Ns(e.right,t);return Ws(Zr,{preview:e,snapshots:t,busy:o,onBack:n,onRestore:(a,d)=>{if(!(!i||o)){if(i.baseline){st("Restore fresh install?","This wipes all app storage and reloads the app.","Wipe & reload",()=>void g.restore(i.id,"reload"));return}g.restore(i.id,a,d).then(n)}}})}import{jsx as K,jsxs as ft}from"react/jsx-runtime";var on=()=>Ks().some(e=>e.id===Lt);function ht(){let[e,t]=rn({kind:"list"}),{snapshots:o,busy:n,preview:i}=Ae(),s=sr(),a=()=>{g.clearPreview(),t({kind:"list"})};return e.kind==="preview"&&i?K(en,{preview:i,snapshots:o,busy:n!==null,onClose:a}):K(js,{sources:s,onOpenPreview:d=>{g.buildPreview({snapshotId:d.id}),t({kind:"preview"})}})}function js({sources:e,onOpenPreview:t}){let{snapshots:o,hasLoaded:n,busy:i,lastOutcome:s,recentlyDeleted:a,remoteProviders:d}=Ae(),p=Fs("timeMachine.snapshots"),y=Gs(),L=_s({minBottom:16}),h=tn(Js,on,on),P=tn(Dt,je,je),H=h?Mt(o,P)?.id:void 0,x=Bs({}),[N,W]=rn(null),S=z=>{W(null),ut(z),y.minimize()},Q=y.search.trim().toLowerCase(),ce=Q?o.filter(z=>z.name.toLowerCase().includes(Q)):o,q=o.filter(z=>!z.safety).length>=p,Xe=i!==null||q,ie=z=>{if(i)return;if(z.baseline){st("Restore fresh install?","This wipes all app storage and reloads the app.","Wipe & reload",()=>void g.restore(z.id,"reload"));return}let de=(x.current[z.id]??0)+1;x.current[z.id]=de,de>=2&&!h&&W(z.id),g.restore(z.id,"live").then(ge=>{!Object.values(ge.results).every(ee=>ee.ok)||ge.willReload||y.minimize()})},j=N&&!h?o.find(z=>z.id===N)??null:null;return ft(tt,{style:mt.fill,contentContainerStyle:[mt.content,{paddingBottom:L.bottom}],testID:"time-machine-scroll",keyboardShouldPersistTaps:"handled",children:[s&&Pt(s)?K(lr,{outcome:s}):null,a?K(yr,{name:a.stored.meta.name,at:a.at,onUndo:()=>void g.undoDelete(),onExpire:()=>g.clearRecentlyDeleted()}):null,K(u,{children:K(ar,{disabled:Xe,busy:i==="capture",onCapture:z=>void g.capture(z)})}),q?ft(Ge,{tone:"warning",testID:"time-machine-limit",children:["Free plan keeps ",p," restore point",p===1?"":"s",". Upgrade to Pro for unlimited snapshots."]}):null,K(Je,{children:"Sources"}),K(Sr,{sources:e,onToggle:d?void 0:so}),d?null:K(Ge,{testID:"time-machine-sources-hint",children:"Switch a source off to leave it out of every capture and restore."}),K(Je,{children:"Restore Points"}),j?ft(u,{style:mt.barHint,testID:"time-machine-bar-hint",children:[ft(Ge,{children:['Restoring "',j.name,'" a lot? Put it on the floating action bar and restore it with one tap.']}),K(v,{onPress:()=>S(j.id),accessibilityRole:"button",testID:"time-machine-bar-hint-pin",hitSlop:{top:6,bottom:6,left:6,right:6},children:K(l,{style:mt.barHintAction,children:"Open the action bar"})})]}):null,ft(ze,{children:[ce.map(z=>K(hr,{meta:z,busy:i!==null,armed:z.id===H,onOpen:()=>t(z),onRestore:()=>ie(z),onDelete:()=>void g.delete(z.id),onDuplicate:()=>void g.duplicate(z.id),onArm:()=>S(z.id)},z.id)),ce.length===0?K(Us,{testID:"time-machine-empty",...n?o.length>0?{otto:"sad",title:"No restore point matches that name.",message:`Clear the search to see all ${o.length}.`}:{otto:"rewind",title:"No restore points yet",message:"Set up the state you want to come back to, then capture it."}:{otto:"loading",title:"Loading restore points\u2026",message:"Reading the vault off disk."}}):null]}),ce.length>0?K(Ge,{testID:"time-machine-swipe-hint",children:"Swipe a restore point to copy or delete it."}):null,K(u,{style:mt.spacer}),K(ze,{children:K(xr,{disabled:i!==null,onWipe:()=>st("Wipe all app state?","This deletes all app storage and reloads the app \u2014 like a fresh install.","Wipe & reload",()=>void g.wipeAll())})}),K(Ge,{centered:!0,children:"Deletes all app storage and reloads \u2014 like a fresh install."})]})}var mt=T.create({barHint:{marginHorizontal:r.gutter,marginBottom:8},barHintAction:{color:r.color.accent,fontSize:r.font.footnote,fontWeight:"600",paddingHorizontal:r.textInset,paddingTop:2},fill:{flex:1,backgroundColor:"transparent"},content:{paddingTop:14},empty:{color:r.color.labelSecondary,fontSize:r.font.footnote,lineHeight:r.font.footnote*1.4,paddingHorizontal:r.textInset,paddingVertical:16},spacer:{height:24}});import{jsx as nn}from"react/jsx-runtime";var Wt={id:"time-machine",name:"TIME MACHINE",description:"Snapshot & restore app state (storage, stores, query cache)",slot:"both",icon:({size:e,color:t,slot:o})=>nn(qs,{size:o==="dial"&&Me.OS!=="web"?e*1.5:e,color:t||Ys}),component:ht,modal:{subtitle:"snapshot & restore app state",searchable:!0,searchPlaceholder:"Filter\u2026",headerActions:nn($t,{})}};function Xs(e={}){return{...Wt,name:e.name??Wt.name,description:e.description??Wt.description}}import{JsModal as Qs}from"@buoy-gg/shared-ui/web";import{jsx as Ye,jsxs as oa}from"react/jsx-runtime";function Zs(){return oa(u,{style:Vo.header,children:[Ye(l,{style:Vo.headerTitle,children:"Time Machine"}),Ye(l,{style:Vo.headerSubtitle,children:"Snapshot & restore app state"})]})}function ea({visible:e,onClose:t,onBack:o,onMinimize:n,persistenceKey:i}){return Ye(Qs,{visible:e,onClose:t,onMinimize:n,persistenceKey:i,header:{showToggleButton:!0,customContent:Ye(Zs,{})},enablePersistence:!0,initialMode:"bottomSheet",disableScrollWrapper:!0,children:Ye(ht,{})})}function ta(){return Ye(ht,{})}var Vo=T.create({header:{paddingHorizontal:4,gap:2},headerTitle:{color:r.color.label,fontSize:22,fontWeight:"700",letterSpacing:.3},headerSubtitle:{color:r.color.labelSecondary,fontSize:r.font.footnote}});import{getStateSnapshotProviders as ra,subscribeToStateSnapshotProviders as na,superJsonDeserialize as ia}from"@buoy-gg/shared-ui/web";import{jsonLikelyLargerThan as sn}from"@buoy-gg/shared-ui/web/dataViewer";function sa(){return ra().map(e=>{let t=e.status();return{id:e.id,label:e.label,canCapture:t.canCapture,canRestore:t.canRestore,detail:t.detail,enabled:Z(e.id)}})}function an(){let{snapshots:e,busy:t,lastOutcome:o}=g.getState(),n=_o();return{snapshots:e,busy:t,lastOutcome:o,providers:sa(),route:{available:De(),enabled:Z(Se),...n?{current:n.href}:{}}}}var aa={version:2,getSnapshot:()=>an(),subscribe:e=>{let t=g.subscribe(e),o=na(e);return()=>{t(),o()}},actions:{list:()=>an(),capture:async e=>{let{name:t="",sourceIds:o}=e??{};return{captured:!0,snapshot:await g.capture(t,o)}},captureBaseline:async()=>({captured:!0,snapshot:await g.captureBaseline()}),wipeAll:async()=>await g.wipeAll(),restore:async e=>{let{id:t,mode:o="live",excludeKeys:n,restoreRoute:i}=e??{};if(!t)throw new Error("restore requires a snapshot `id`");return await g.restore(t,o,n,{restoreRoute:i})},delete:async e=>{let{id:t}=e??{};if(!t)throw new Error("delete requires a snapshot `id`");return await g.delete(t),{deleted:!0,id:t}},rename:async e=>{let{id:t,name:o}=e??{};if(!t||!o)throw new Error("rename requires `id` and `name`");return await g.rename(t,o),{renamed:!0,id:t,name:o}},setExclusions:async e=>{let{id:t,excludedKeys:o}=e??{};if(!t)throw new Error("setExclusions requires `id`");return await g.setExclusions(t,o??null),{id:t,excluded:o?.length??0}},setRestoreRoute:async e=>{let{id:t,restoreRoute:o}=e??{};if(!t)throw new Error("setRestoreRoute requires `id`");return await g.setRestoreRoute(t,o!==!1),{id:t,restoreRoute:o!==!1}},duplicate:async e=>{let{id:t}=e??{};if(!t)throw new Error("duplicate requires `id`");let o=await g.duplicate(t);if(!o)throw new Error(`No snapshot with id "${t}"`);return{snapshot:o}},setScope:async e=>{let{id:t,scope:o}=e??{};if(!t)throw new Error("setScope requires a snapshot `id`");return await g.setScope(t,o??null),{scoped:!0,id:t,count:o?.length??0}},preview:async e=>{let{id:t,compareTo:o}=e??{};if(!t)throw new Error("preview requires a snapshot `id`");let n={snapshotId:t},i=o?{snapshotId:o}:"current";await g.buildPreview(n,i);let s=g.getState().preview;if(!s)throw new Error("preview build produced no result");let a=4*1024;return{left:i,right:n,builtAt:s.builtAt,sources:s.sources.map(d=>({...d,items:d.items.map(p=>{let y=p.oldValue!==void 0&&sn(p.oldValue,a),L=p.newValue!==void 0&&sn(p.newValue,a);return{...p,oldValue:y?void 0:p.oldValue,newValue:L?void 0:p.newValue,...y||L?{valueOmitted:!0}:{}}})}))}},inspect:async e=>{let{id:t,sourceId:o}=e??{};if(!t||!o)throw new Error("inspect requires `id` and `sourceId`");let n=await ue(t);if(!n)throw new Error(`No snapshot with id "${t}"`);let i=n.data[o];if(!i)throw new Error(`Snapshot "${t}" has no "${o}" source`);return{id:t,sourceId:o,warnings:n.meta.sources[o]?.warnings??[],data:ia(i)}}}};Kt();export{it as RESTORE_ORDER,lo as SAFETY_SNAPSHOT_NAME,Lt as TIME_MACHINE_FLOATING_TOOL_ID,ea as TimeMachineModal,ta as TimeMachineToolView,Kt as armPendingRouteRestore,De as canRestoreRoute,Be as captureCurrentRoute,Xs as createTimeMachineTool,Z as isSourceEnabled,wt as navigateToRoute,ut as openTimeMachineFloatingTool,bi as replaceTimeMachineFromSnapshot,gi as setRemoteTimeMachineHandler,so as setSourceEnabled,no as subscribeSourceSettings,g as timeMachineStore,aa as timeMachineSyncAdapter,Wt as timeMachineToolPreset};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buoy-gg/time-machine",
3
- "version": "7.0.39",
3
+ "version": "7.0.41",
4
4
  "description": "Time Machine - snapshot & restore app state (storage, redux, zustand, jotai, react-query) for React Native DevTools",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -16,24 +16,27 @@
16
16
  "./lib/commonjs/components/floating/TimeMachineFloatingTool.js",
17
17
  "./lib/module/components/floating/TimeMachineFloatingTool.js",
18
18
  "./lib/commonjs/index.js",
19
- "./lib/module/index.js"
19
+ "./lib/module/index.js",
20
+ "./lib/web/**/*.mjs"
20
21
  ],
21
22
  "dependencies": {
22
- "@buoy-gg/floating-tools-core": "^7.0.39",
23
- "@buoy-gg/shared-ui": "^7.0.39"
23
+ "@buoy-gg/shared-ui": "^7.0.41",
24
+ "@buoy-gg/floating-tools-core": "^7.0.41"
24
25
  },
25
26
  "peerDependencies": {
26
- "@buoy-gg/license": "7.0.39",
27
+ "@buoy-gg/license": "7.0.41",
27
28
  "react": "*",
28
29
  "react-native": "*",
29
- "@buoy-gg/core": "^7.0.39"
30
+ "react-native-web": "^0.21.0",
31
+ "react-dom": ">=18",
32
+ "@buoy-gg/core": "^7.0.41"
30
33
  },
31
34
  "devDependencies": {
32
35
  "@types/react": "^19.1.0",
33
36
  "@types/react-native": "^0.73.0",
34
37
  "typescript": "~5.8.3",
35
- "@buoy-gg/license": "^7.0.39",
36
- "@buoy-gg/core": "^7.0.39"
38
+ "@buoy-gg/license": "^7.0.41",
39
+ "@buoy-gg/core": "^7.0.41"
37
40
  },
38
41
  "react-native-builder-bob": {
39
42
  "source": "src",
@@ -65,13 +68,43 @@
65
68
  "peerDependenciesMeta": {
66
69
  "@buoy-gg/core": {
67
70
  "optional": true
71
+ },
72
+ "react-native": {
73
+ "optional": true
74
+ },
75
+ "react-native-web": {
76
+ "optional": true
77
+ },
78
+ "react-dom": {
79
+ "optional": true
80
+ }
81
+ },
82
+ "exports": {
83
+ ".": {
84
+ "browser": {
85
+ "types": "./lib/typescript/index.d.ts",
86
+ "default": "./lib/web/index.mjs"
87
+ },
88
+ "import": {
89
+ "types": "./lib/typescript/index.d.ts",
90
+ "default": "./lib/module/index.js"
91
+ },
92
+ "require": {
93
+ "types": "./lib/typescript/index.d.ts",
94
+ "default": "./lib/commonjs/index.js"
95
+ }
96
+ },
97
+ "./web": {
98
+ "types": "./lib/typescript/index.d.ts",
99
+ "default": "./lib/web/index.mjs"
68
100
  }
69
101
  },
70
102
  "scripts": {
71
- "build": "bob build",
103
+ "build": "bob build && pnpm run build:web",
72
104
  "typecheck": "tsc --noEmit",
73
105
  "clean": "rimraf lib",
74
106
  "test": "pnpm run typecheck",
75
- "postinstall": "echo \"Run pnpm build to compile this package\""
107
+ "postinstall": "echo \"Run pnpm build to compile this package\"",
108
+ "build:web": "node ../../scripts/build-web.mjs time-machine"
76
109
  }
77
110
  }