@buoy-gg/clock 7.0.78 → 7.0.79
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/lib/commonjs/engine/timers.js +1 -1
- package/lib/commonjs/timers.js +1 -0
- package/lib/module/engine/timers.js +1 -1
- package/lib/module/timers.js +1 -0
- package/lib/typescript/engine/timers.d.ts +10 -1
- package/lib/typescript/timers.d.ts +3 -0
- package/lib/web/chunks/chunk-FCZBPAZF.mjs +3 -0
- package/lib/web/index.mjs +1 -1
- package/lib/web/timers.mjs +1 -0
- package/package.json +21 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.countDueWithin=countDueWithin;exports.fireDueWithin=fireDueWithin;exports.installTimerTracking=installTimerTracking;exports.isTimerTrackingInstalled=isTimerTrackingInstalled;exports.summarizeTimers=summarizeTimers;exports.uninstallTimerTracking=uninstallTimerTracking;var _patches=require("./patches");const g=globalThis;const TAG="__buoyClockTimer";const pending=new Map;let originals=null;let unpatched={};let jumpedMs=0;const timerClock=()=>(0,_patches.realNow)()+jumpedMs;function reportAsync(
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.countDueWithin=countDueWithin;exports.fireDueWithin=fireDueWithin;exports.installTimerTracking=installTimerTracking;exports.isTimerTrackingInstalled=isTimerTrackingInstalled;exports.observeTimers=observeTimers;exports.summarizeTimers=summarizeTimers;exports.uninstallTimerTracking=uninstallTimerTracking;var _patches=require("./patches");const observers=new Set;let nextTimerId=0;function emitTimer(e,t){if(!observers.size)return;const r={id:e.id,kind:e.kind,delay:e.delay,event:t};if(t==="add")r.stack=new Error().stack?.split("\n").slice(1,9).join("\n");for(const l of observers){try{l(r)}catch{}}}function observeTimers(e){if(typeof __DEV__==="undefined"||!__DEV__)return()=>{};if(!installTracking())throw new Error("Timers cannot be tracked here.");observers.add(e);return()=>{observers.delete(e);if(!observers.size&&!clockOwnsTracking)releaseTracking()}}const g=globalThis;const TAG="__buoyClockTimer";const pending=new Map;let clockOwnsTracking=false;let deactivate=()=>{};let wrappers={};let originals=null;let unpatched={};let jumpedMs=0;const timerClock=()=>(0,_patches.realNow)()+jumpedMs;function reportAsync(e){(originals?.setTimeout??setTimeout)(()=>{throw e},0)}function toDelay(e){const t=Number(e);return Number.isFinite(t)&&t>0?t:0}function isTimerTrackingInstalled(){return originals!==null}function installTimerTracking(){const e=installTracking();if(e)clockOwnsTracking=true;return e}function installTracking(){if(originals)return true;const{setTimeout:e,clearTimeout:t,setInterval:r,clearInterval:l}=g;if(typeof e!=="function"||typeof t!=="function")return false;if(e[TAG])return true;unpatched={setTimeout:e,clearTimeout:t,setInterval:r,clearInterval:l};originals={setTimeout:e.bind(globalThis),clearTimeout:t.bind(globalThis),setInterval:(typeof r==="function"?r:e).bind(globalThis),clearInterval:(typeof l==="function"?l:t).bind(globalThis)};const i=originals;let c=true;deactivate=()=>{c=false};const o=function(n,f,...a){if(!c||typeof n!=="function")return i.setTimeout(n,f,...a);const d=toDelay(f);let u;const m=function(){const T=c?pending.get(u):void 0;if(c)pending.delete(u);if(T)emitTimer(T,"fire");return n.apply(this,a)};u=i.setTimeout(m,f);pending.set(u,{id:++nextTimerId,kind:"timeout",callback:n,args:a,delay:d,due:timerClock()+d,realHandle:u,run:m});emitTimer(pending.get(u),"add");return u};const s=function(n,f,...a){if(!c||typeof n!=="function")return i.setInterval(n,f,...a);const d=toDelay(f);let u;const m=function(){const T=c?pending.get(u):void 0;if(T){T.due=timerClock()+d;emitTimer(T,"fire")}return n.apply(this,a)};u=i.setInterval(m,f);pending.set(u,{id:++nextTimerId,kind:"interval",callback:n,args:a,delay:d,due:timerClock()+d,realHandle:u,run:m});emitTimer(pending.get(u),"add");return u};const v=(n,f)=>{const a=c?pending.get(n):void 0;if(!a)return f(n);pending.delete(n);emitTimer(a,"clear");return a.kind==="interval"?i.clearInterval(a.realHandle):i.clearTimeout(a.realHandle)};const p=function(n){return v(n,i.clearTimeout)};const y=function(n){return v(n,i.clearInterval)};globalThis.__buoyRealTimers={setTimeout:i.setTimeout,clearTimeout:p,setInterval:i.setInterval,clearInterval:y};for(const n of[o,s,p,y]){Object.defineProperty(n,TAG,{value:true})}wrappers={setTimeout:o,clearTimeout:p,setInterval:s,clearInterval:y};g.setTimeout=o;g.clearTimeout=p;g.setInterval=s;g.clearInterval=y;return true}function releaseTracking(){if(!originals)return;deactivate();for(const t of Object.keys(wrappers))if(g[t]===wrappers[t])g[t]=unpatched[t];const e=globalThis.__buoyRealTimers;if(e?.clearTimeout===wrappers.clearTimeout)delete globalThis.__buoyRealTimers;originals=null;clockOwnsTracking=false;for(const t of pending.values())emitTimer(t,"reset");pending.clear();jumpedMs=0}function uninstallTimerTracking(){releaseTracking()}function summarizeTimers(){const e=timerClock();let t=0;let r=0;let l=null;for(const i of pending.values()){if(i.kind==="interval")r+=1;else{t+=1;const c=Math.max(0,i.due-e);if(l===null||c<l)l=c}}return{total:t+r,timeouts:t,intervals:r,nextTimeoutInMs:l}}function countDueWithin(e){const t=timerClock();let r=0;for(const l of pending.values())if(l.due-t<=e)r+=1;return r}function fireDueWithin(e){if(!originals||!(e>0))return 0;const t=originals;clockOwnsTracking=true;jumpedMs+=e;const r=timerClock();const l=[...pending.entries()].filter(([,o])=>o.due<=r).sort((o,s)=>o[1].due-s[1].due);let i=0;for(const[o,s]of l){if(!pending.has(o))continue;if(s.kind==="timeout"){pending.delete(o);t.clearTimeout(s.realHandle)}else{s.due=r+s.delay}emitTimer(s,"fire");try{s.callback(...s.args)}catch(v){reportAsync(v)}i+=1}const c=timerClock();for(const o of pending.values()){if(o.kind!=="timeout")continue;t.clearTimeout(o.realHandle);o.realHandle=t.setTimeout(o.run,Math.max(0,o.due-c))}return i}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"isTimerTrackingInstalled",{enumerable:true,get:function(){return _timers.isTimerTrackingInstalled}});Object.defineProperty(exports,"observeTimers",{enumerable:true,get:function(){return _timers.observeTimers}});var _timers=require("./engine/timers");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{realNow as
|
|
1
|
+
"use strict";import{realNow as O}from"./patches";const h=new Set;let H=0;function T(e,t){if(!h.size)return;const o={id:e.id,kind:e.kind,delay:e.delay,event:t};if(t==="add")o.stack=new Error().stack?.split("\n").slice(1,9).join("\n");for(const u of h){try{u(o)}catch{}}}export function observeTimers(e){if(typeof __DEV__==="undefined"||!__DEV__)return()=>{};if(!z())throw new Error("Timers cannot be tracked here.");h.add(e);return()=>{h.delete(e);if(!h.size&&!x)N()}}const v=globalThis;const D="__buoyClockTimer";const r=new Map;let x=false;let M=()=>{};let w={};let m=null;let j={};let C=0;const p=()=>O()+C;function R(e){(m?.setTimeout??setTimeout)(()=>{throw e},0)}function E(e){const t=Number(e);return Number.isFinite(t)&&t>0?t:0}export function isTimerTrackingInstalled(){return m!==null}export function installTimerTracking(){const e=z();if(e)x=true;return e}function z(){if(m)return true;const{setTimeout:e,clearTimeout:t,setInterval:o,clearInterval:u}=v;if(typeof e!=="function"||typeof t!=="function")return false;if(e[D])return true;j={setTimeout:e,clearTimeout:t,setInterval:o,clearInterval:u};m={setTimeout:e.bind(globalThis),clearTimeout:t.bind(globalThis),setInterval:(typeof o==="function"?o:e).bind(globalThis),clearInterval:(typeof u==="function"?u:t).bind(globalThis)};const i=m;let f=true;M=()=>{f=false};const l=function(n,d,...c){if(!f||typeof n!=="function")return i.setTimeout(n,d,...c);const y=E(d);let s;const k=function(){const b=f?r.get(s):void 0;if(f)r.delete(s);if(b)T(b,"fire");return n.apply(this,c)};s=i.setTimeout(k,d);r.set(s,{id:++H,kind:"timeout",callback:n,args:c,delay:y,due:p()+y,realHandle:s,run:k});T(r.get(s),"add");return s};const a=function(n,d,...c){if(!f||typeof n!=="function")return i.setInterval(n,d,...c);const y=E(d);let s;const k=function(){const b=f?r.get(s):void 0;if(b){b.due=p()+y;T(b,"fire")}return n.apply(this,c)};s=i.setInterval(k,d);r.set(s,{id:++H,kind:"interval",callback:n,args:c,delay:y,due:p()+y,realHandle:s,run:k});T(r.get(s),"add");return s};const I=(n,d)=>{const c=f?r.get(n):void 0;if(!c)return d(n);r.delete(n);T(c,"clear");return c.kind==="interval"?i.clearInterval(c.realHandle):i.clearTimeout(c.realHandle)};const g=function(n){return I(n,i.clearTimeout)};const _=function(n){return I(n,i.clearInterval)};globalThis.__buoyRealTimers={setTimeout:i.setTimeout,clearTimeout:g,setInterval:i.setInterval,clearInterval:_};for(const n of[l,a,g,_]){Object.defineProperty(n,D,{value:true})}w={setTimeout:l,clearTimeout:g,setInterval:a,clearInterval:_};v.setTimeout=l;v.clearTimeout=g;v.setInterval=a;v.clearInterval=_;return true}function N(){if(!m)return;M();for(const t of Object.keys(w))if(v[t]===w[t])v[t]=j[t];const e=globalThis.__buoyRealTimers;if(e?.clearTimeout===w.clearTimeout)delete globalThis.__buoyRealTimers;m=null;x=false;for(const t of r.values())T(t,"reset");r.clear();C=0}export function uninstallTimerTracking(){N()}export function summarizeTimers(){const e=p();let t=0;let o=0;let u=null;for(const i of r.values()){if(i.kind==="interval")o+=1;else{t+=1;const f=Math.max(0,i.due-e);if(u===null||f<u)u=f}}return{total:t+o,timeouts:t,intervals:o,nextTimeoutInMs:u}}export function countDueWithin(e){const t=p();let o=0;for(const u of r.values())if(u.due-t<=e)o+=1;return o}export function fireDueWithin(e){if(!m||!(e>0))return 0;const t=m;x=true;C+=e;const o=p();const u=[...r.entries()].filter(([,l])=>l.due<=o).sort((l,a)=>l[1].due-a[1].due);let i=0;for(const[l,a]of u){if(!r.has(l))continue;if(a.kind==="timeout"){r.delete(l);t.clearTimeout(a.realHandle)}else{a.due=o+a.delay}T(a,"fire");try{a.callback(...a.args)}catch(I){R(I)}i+=1}const f=p();for(const l of r.values()){if(l.kind!=="timeout")continue;t.clearTimeout(l.realHandle);l.realHandle=t.setTimeout(l.run,Math.max(0,l.due-f))}return i}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";export{observeTimers,isTimerTrackingInstalled}from"./engine/timers";
|
|
@@ -17,10 +17,19 @@
|
|
|
17
17
|
* handles, so code that stores or compares them sees no difference. Code that
|
|
18
18
|
* captured `setTimeout` before this module loaded is not tracked.
|
|
19
19
|
*/
|
|
20
|
+
export interface TimerEvent {
|
|
21
|
+
id: number;
|
|
22
|
+
event: "add" | "fire" | "clear" | "reset";
|
|
23
|
+
kind: "timeout" | "interval";
|
|
24
|
+
delay: number;
|
|
25
|
+
stack?: string;
|
|
26
|
+
}
|
|
27
|
+
/** Observe new timers. Existing timers remain part of the baseline. */
|
|
28
|
+
export declare function observeTimers(fn: (event: TimerEvent) => void): () => void;
|
|
20
29
|
export declare function isTimerTrackingInstalled(): boolean;
|
|
21
30
|
/** Wrap the timer globals. Idempotent; safe to call before any override. */
|
|
22
31
|
export declare function installTimerTracking(): boolean;
|
|
23
|
-
/** Test seam: put
|
|
32
|
+
/** Test seam: put our originals back and forget every handle. */
|
|
24
33
|
export declare function uninstallTimerTracking(): void;
|
|
25
34
|
export interface TimerSummary {
|
|
26
35
|
/** Pending timeouts plus live intervals. */
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";var B=Object.defineProperty;var Z=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var ee=Object.prototype.hasOwnProperty;var te=(e,t)=>{for(var r in t)B(e,r,{get:t[r],enumerable:true})},G=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of $(t))!ee.call(e,n)&&n!==r&&B(e,n,{get:()=>t[n],enumerable:!(o=Z(t,n))||o.enumerable});return e},re=(e,t,r)=>(G(e,t,"default"),r&&G(r,t,"default"));var M=(()=>{try{let e=globalThis.Capacitor;if(e&&typeof e.isNativePlatform=="function"&&e.isNativePlatform())return e.DEBUG===true}catch{}return process.env.NODE_ENV!=="production"})();typeof window<"u"&&typeof globalThis.global>"u"&&(globalThis.global=globalThis);var b=globalThis,R="__buoyClock",f=b.__buoyRealDate??(Date[R]?Date.__buoyRealDate:Date);b.__buoyRealDate=f;var W=f.now.bind(f);function U(){return W()}b.__buoyRealNow=U;var V=null,z=0;function N(){let e=W();return!V||z>0?e:V(e)}function ne(e){V=e}function F(e){z+=1;try{return e()}finally{z-=1}}b.__buoyWithRealClock=F;function d(...e){let t=new.target;return t?Reflect.construct(f,e.length===0?[N()]:e,t):new f(N()).toString()}d.prototype=f.prototype;Object.defineProperty(d,"name",{value:"Date"});Object.defineProperty(d,"length",{value:7});Object.defineProperty(d,"now",{value:function(){return N()},writable:true,configurable:true});Object.defineProperty(d,"parse",{value:f.parse,writable:true,configurable:true});Object.defineProperty(d,"UTC",{value:f.UTC,writable:true,configurable:true});Object.defineProperty(d,R,{value:true});Object.defineProperty(d,"__buoyRealDate",{value:f});var P=d,H=false,C;function oe(){return H&&b.Date===P}function le(){if(b.Date===P){H=true;return}let e=Object.getOwnPropertyDescriptor(b,"Date");Object.defineProperty(b,"Date",{value:P,writable:e?.writable??true,enumerable:e?.enumerable??false,configurable:true}),C=Object.getOwnPropertyDescriptor(f.prototype,"constructor");try{Object.defineProperty(f.prototype,"constructor",{value:P,writable:true,enumerable:false,configurable:true})}catch{}H=true}function ae(){if(b.Date===P){let e=Object.getOwnPropertyDescriptor(b,"Date");Object.defineProperty(b,"Date",{value:f,writable:e?.writable??true,enumerable:e?.enumerable??false,configurable:true})}if(C){try{Object.defineProperty(f.prototype,"constructor",C)}catch{}C=void 0}H=false}var w=[];function A(e){return function(t,...r){return e.call(this,t===void 0?N():t,...r)}}function ie(){if(w.length)return;let e=b.Intl?.DateTimeFormat?.prototype;if(e)for(let t of["format","formatToParts"]){let r=Object.getOwnPropertyDescriptor(e,t);if(!(!r||!r.configurable))try{if(typeof r.get=="function"){let o=r.get;Object.defineProperty(e,t,{...r,get(){return A(o.call(this))}})}else if(typeof r.value=="function")Object.defineProperty(e,t,{...r,value:A(r.value)});else continue;w.push({proto:e,name:t,original:r})}catch{}}}function ue(){for(let{proto:e,name:t,original:r}of w)try{Object.defineProperty(e,t,r)}catch{}w=[]}function ce(){return w.length>0}function fe(){le(),ie()}function se(){ae(),ue()}var S=false;function pe(e){let t=Object.getPrototypeOf(e);for(;t&&t!==Object.prototype;){if(!Object.prototype.hasOwnProperty.call(t,R)){for(let r of["start","onUpdate"]){let o=Object.getOwnPropertyDescriptor(t,r);if(o&&typeof o.value=="function"){let n=o.value;t[r]=function(...i){return F(()=>n.apply(this,i))}}}try{Object.defineProperty(t,R,{value:true})}catch{return}}t=Object.getPrototypeOf(t)}}function be(e){if(S)return true;try{let t=e;if(typeof t?.Value!="function")return false;let r=Object.getPrototypeOf(new t.Value(0)),o=r?.animate;return typeof o!="function"?false:(r.animate=function(n,...i){return n&&typeof n=="object"&&pe(n),o.call(this,n,...i)},S=true,true)}catch{return false}}function ye(){return S}var D=new Set,J=0;function m(e,t){if(!D.size)return;let r={id:e.id,kind:e.kind,delay:e.delay,event:t};t==="add"&&(r.stack=new Error().stack?.split(`
|
|
2
|
+
`).slice(1,9).join(`
|
|
3
|
+
`));for(let o of D)try{o(r)}catch{}}function de(e){if(typeof M>"u"||!M)return()=>{};if(!Y())throw new Error("Timers cannot be tracked here.");return D.add(e),()=>{D.delete(e),!D.size&&!E&&Te()}}var g=globalThis,K="__buoyClockTimer",a=new Map,E=false,L=()=>{},x={},v=null,Q={},q=0,T=()=>U()+q;function ve(e){(v?.setTimeout??setTimeout)(()=>{throw e},0)}function X(e){let t=Number(e);return Number.isFinite(t)&&t>0?t:0}function me(){return v!==null}function ge(){let e=Y();return e&&(E=true),e}function Y(){if(v)return true;let{setTimeout:e,clearTimeout:t,setInterval:r,clearInterval:o}=g;if(typeof e!="function"||typeof t!="function")return false;if(e[K])return true;Q={setTimeout:e,clearTimeout:t,setInterval:r,clearInterval:o},v={setTimeout:e.bind(globalThis),clearTimeout:t.bind(globalThis),setInterval:(typeof r=="function"?r:e).bind(globalThis),clearInterval:(typeof o=="function"?o:t).bind(globalThis)};let n=v,i=true;L=()=>{i=false};let u=function(l,y,...p){if(!i||typeof l!="function")return n.setTimeout(l,y,...p);let h=X(y),c,j=function(){let O=i?a.get(c):void 0;return i&&a.delete(c),O&&m(O,"fire"),l.apply(this,p)};return c=n.setTimeout(j,y),a.set(c,{id:++J,kind:"timeout",callback:l,args:p,delay:h,due:T()+h,realHandle:c,run:j}),m(a.get(c),"add"),c},s=function(l,y,...p){if(!i||typeof l!="function")return n.setInterval(l,y,...p);let h=X(y),c,j=function(){let O=i?a.get(c):void 0;return O&&(O.due=T()+h,m(O,"fire")),l.apply(this,p)};return c=n.setInterval(j,y),a.set(c,{id:++J,kind:"interval",callback:l,args:p,delay:h,due:T()+h,realHandle:c,run:j}),m(a.get(c),"add"),c},_=(l,y)=>{let p=i?a.get(l):void 0;return p?(a.delete(l),m(p,"clear"),p.kind==="interval"?n.clearInterval(p.realHandle):n.clearTimeout(p.realHandle)):y(l)},I=function(l){return _(l,n.clearTimeout)},k=function(l){return _(l,n.clearInterval)};globalThis.__buoyRealTimers={setTimeout:n.setTimeout,clearTimeout:I,setInterval:n.setInterval,clearInterval:k};for(let l of[u,s,I,k])Object.defineProperty(l,K,{value:true});return x={setTimeout:u,clearTimeout:I,setInterval:s,clearInterval:k},g.setTimeout=u,g.clearTimeout=I,g.setInterval=s,g.clearInterval=k,true}function Te(){if(!v)return;L();for(let e of Object.keys(x))g[e]===x[e]&&(g[e]=Q[e]);globalThis.__buoyRealTimers?.clearTimeout===x.clearTimeout&&delete globalThis.__buoyRealTimers,v=null,E=false;for(let e of a.values())m(e,"reset");a.clear(),q=0}function he(){let e=T(),t=0,r=0,o=null;for(let n of a.values())if(n.kind==="interval")r+=1;else{t+=1;let i=Math.max(0,n.due-e);(o===null||i<o)&&(o=i)}return{total:t+r,timeouts:t,intervals:r,nextTimeoutInMs:o}}function Oe(e){let t=T(),r=0;for(let o of a.values())o.due-t<=e&&(r+=1);return r}function je(e){if(!v||!(e>0))return 0;let t=v;E=true,q+=e;let r=T(),o=[...a.entries()].filter(([,u])=>u.due<=r).sort((u,s)=>u[1].due-s[1].due),n=0;for(let[u,s]of o)if(a.has(u)){s.kind==="timeout"?(a.delete(u),t.clearTimeout(s.realHandle)):s.due=r+s.delay,m(s,"fire");try{s.callback(...s.args)}catch(_){ve(_)}n+=1}let i=T();for(let u of a.values())u.kind==="timeout"&&(t.clearTimeout(u.realHandle),u.realHandle=t.setTimeout(u.run,Math.max(0,u.due-i)));return n}export{te as a,re as b,M as c,f as d,U as e,ne as f,F as g,oe as h,ce as i,fe as j,se as k,be as l,ye as m,de as n,me as o,ge as p,he as q,Oe as r,je as s};
|
package/lib/web/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";var wt=Object.defineProperty;var Qr=Object.getOwnPropertyDescriptor;var en=Object.getOwnPropertyNames;var tn=Object.prototype.hasOwnProperty;var rn=(e,t)=>{for(var r in t)wt(e,r,{get:t[r],enumerable:true})},At=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of en(t))!tn.call(e,o)&&o!==r&&wt(e,o,{get:()=>t[o],enumerable:!(n=Qr(t,o))||n.enumerable});return e},nn=(e,t,r)=>(At(e,t,"default"),r&&At(r,t,"default"));var St=(()=>{try{let e=globalThis.Capacitor;if(e&&typeof e.isNativePlatform=="function"&&e.isNativePlatform())return e.DEBUG===true}catch{}return process.env.NODE_ENV!=="production"})();typeof window<"u"&&typeof globalThis.global>"u"&&(globalThis.global=globalThis);var Tt={};rn(Tt,{AccessibilityInfo:()=>ln,ActivityIndicator:()=>uo,Alert:()=>po,Animated:()=>Et,AppRegistry:()=>cn,AppState:()=>dn,Appearance:()=>un,BackHandler:()=>fn,Button:()=>co,CheckBox:()=>Cn,Clipboard:()=>pn,DeviceEventEmitter:()=>Vn,Dimensions:()=>hn,Easing:()=>mn,FlatList:()=>On,I18nManager:()=>yn,Image:()=>En,ImageBackground:()=>Rn,InteractionManager:()=>bn,Keyboard:()=>gn,KeyboardAvoidingView:()=>Dn,LayoutAnimation:()=>kn,Linking:()=>vn,LogBox:()=>Hn,Modal:()=>so,NativeEventEmitter:()=>xn,NativeModules:()=>sn,PanResponder:()=>wn,Picker:()=>Pn,PixelRatio:()=>An,Platform:()=>Sn,Pressable:()=>ao,ProgressBar:()=>Ln,RefreshControl:()=>Nn,SafeAreaView:()=>zn,ScrollView:()=>Dt,SectionList:()=>jn,Share:()=>Tn,StatusBar:()=>Mn,StyleSheet:()=>X,Switch:()=>lo,Text:()=>w,TextInput:()=>Rt,Touchable:()=>_n,TouchableHighlight:()=>oo,TouchableNativeFeedback:()=>Fn,TouchableOpacity:()=>B,TouchableWithoutFeedback:()=>io,UIManager:()=>$n,Vibration:()=>In,View:()=>m,VirtualizedList:()=>Bn,YellowBox:()=>Un,findNodeHandle:()=>fo,unstable_createElement:()=>an,useColorScheme:()=>Wn,useLocaleContext:()=>Jn,useWindowDimensions:()=>qn});nn(Tt,on);import*as on from"react-native-web";import{unstable_createElement as an,NativeModules as sn,AccessibilityInfo as ln,Appearance as un,AppRegistry as cn,AppState as dn,BackHandler as fn,Clipboard as pn,Dimensions as hn,Easing as mn,I18nManager as yn,Keyboard as gn,InteractionManager as bn,LayoutAnimation as kn,Linking as vn,NativeEventEmitter as xn,PanResponder as wn,PixelRatio as An,Platform as Sn,Share as Tn,UIManager as $n,Vibration as In,CheckBox as Cn,FlatList as On,Image as En,ImageBackground as Rn,KeyboardAvoidingView as Dn,Picker as Pn,ProgressBar as Ln,RefreshControl as Nn,SafeAreaView as zn,SectionList as jn,StatusBar as Mn,Touchable as _n,TouchableNativeFeedback as Fn,VirtualizedList as Bn,YellowBox as Un,LogBox as Hn,DeviceEventEmitter as Vn,useColorScheme as Wn,useLocaleContext as Jn,useWindowDimensions as qn}from"react-native-web";import*as E from"react-native-web";import{createElement as Pe,forwardRef as $t,useCallback as Kn,useRef as Zn}from"react";import{useEffect as Yn,useState as Gn}from"react";import{createPortal as Xn}from"react-dom";var Qn='-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif';import{jsx as eo}from"react/jsx-runtime";var oe=Symbol.for("@buoy-gg/portal-host"),It=e=>{if(!(e instanceof Element))return false;if(e.closest("input, textarea, select"))return true;let t=e.closest("[contenteditable]")?.getAttribute("contenteditable")?.toLowerCase();return t===""||t==="true"||t==="plaintext-only"};function Ct(){let e=document;if(e[oe])return e[oe].host;let t=document.createElement("div");t.dataset.buoyPortalHost="",Object.assign(t.style,{position:"fixed",inset:"0",zIndex:"2147483647",pointerEvents:"none",fontFamily:Qn});let r=()=>{let u=document.fullscreenElement,f=u&&u.tagName!=="CANVAS"?u:document.body;t.parentElement!==f&&f.appendChild(t)},n=new Map,o=u=>{(!t.contains(u.target)||!It(u.target))&&n.set(u.code||u.key,{key:u.key,code:u.code,location:u.location,keyCode:u.keyCode,which:u.which,altKey:u.altKey,ctrlKey:u.ctrlKey,metaKey:u.metaKey,shiftKey:u.shiftKey})},i=u=>{n.delete(u.code||u.key)},a=()=>n.clear(),s=()=>{let u=[...n.values()];n.clear();for(let f of u)document.dispatchEvent(new KeyboardEvent("keyup",{...f,bubbles:true}))},l=u=>{It(u.target)&&u.stopPropagation()},c=u=>u.stopPropagation();return r(),document.addEventListener("fullscreenchange",r),document.addEventListener("keydown",o,true),document.addEventListener("keyup",i,true),window.addEventListener("blur",a),t.addEventListener("focusin",s),t.addEventListener("keydown",l),t.addEventListener("keyup",l),t.addEventListener("keypress",l),t.addEventListener("wheel",c,{passive:true}),e[oe]={host:t,users:0,dispose:()=>{document.removeEventListener("fullscreenchange",r),document.removeEventListener("keydown",o,true),document.removeEventListener("keyup",i,true),window.removeEventListener("blur",a),t.remove(),delete e[oe]}},t}function to({children:e}){let[t,r]=Gn(null);return Yn(()=>{let n=Ct(),o=document[oe];return o.users++,r(n),()=>{--o.users===0&&o.dispose()}},[]),t?Xn(eo("div",{"data-buoy-root":"",style:{display:"contents",pointerEvents:"auto"},children:e}),t):null}var Y=E,ro=["shadowColor","shadowOffset","shadowOpacity","shadowRadius","textShadowColor","textShadowOffset","textShadowRadius"],G=e=>typeof e=="number"?`${e}px`:e;function Le(e){if(Array.isArray(e)){let f=e.map(Le);return f.some((g,S)=>g!==e[S])?f:e}if(!e||typeof e!="object"||!ro.some(f=>e[f]!=null))return e;let{shadowColor:t,shadowOffset:r,shadowOpacity:n,shadowRadius:o,textShadowColor:i,textShadowOffset:a,textShadowRadius:s,...l}=e;if(t!=null||r!=null||n!=null||o!=null){let f=t??"black",g=n==null?f:`color-mix(in srgb, ${f} ${Math.min(n,1)*100}%, transparent)`,S=`${G(r?.width??0)} ${G(r?.height??0)} ${G(o??0)} ${g}`;l.boxShadow=typeof l.boxShadow=="string"?`${l.boxShadow}, ${S}`:l.boxShadow??S}let{width:c=0,height:u=0}=a??{};if(i&&(c||u||s)){let f=`${G(c)} ${G(u)} ${G(s??0)} ${i}`;l.textShadow=l.textShadow?`${l.textShadow}, ${f}`:f}return l}var no=Y.StyleSheet.create({auto:{pointerEvents:"auto"},none:{pointerEvents:"none"},"box-none":{pointerEvents:"box-none"},"box-only":{pointerEvents:"box-only"}});function Ot(e,t){if(typeof e=="function")return n=>Ot(e(n),t);let r=Le(e);return t?[r,no[t]]:r}var X={...Y.StyleSheet,create:e=>Y.StyleSheet.create(Object.fromEntries(Object.entries(e).map(([t,r])=>[t,Le(r)])))};function D(e){let t=$t((n,o)=>{let{accessibilityState:i,accessibilityValue:a,pointerEvents:s,...l}=n;for(let u of["busy","checked","disabled","expanded","selected"])i?.[u]!==void 0&&l[`aria-${u}`]===void 0&&(l[`aria-${u}`]=i[u]);for(let[u,f]of Object.entries({min:"valuemin",max:"valuemax",now:"valuenow",text:"valuetext"}))a?.[u]!==void 0&&l[`aria-${f}`]===void 0&&(l[`aria-${f}`]=a[u]);let c=Ot(l.style,s);return c!==l.style&&(l.style=c),Pe(e,{...l,ref:o})}),r=e.State;return r&&Object.assign(t,{State:r}),t.displayName=e.displayName??e.name??"NativeWebView",t}var m=D(E.View),w=D(E.Text),Et={...Y.Animated,View:Y.Animated.createAnimatedComponent(m),Text:Y.Animated.createAnimatedComponent(w)},Rt=D(E.TextInput),B=D(E.TouchableOpacity),oo=D(E.TouchableHighlight),io=D(E.TouchableWithoutFeedback),ao=D(E.Pressable),Dt=D(E.ScrollView),Pt=$t((e,t)=>{let r=Zn(null),n=Kn(o=>{if(o){let i=o;for(;i.parentElement&&i.parentElement!==document.body;)i=i.parentElement;i.parentElement===document.body&&(r.current=i,Object.assign(i.style,{position:"relative",zIndex:"2147483647",pointerEvents:"auto"}),Ct().appendChild(i))}else r.current&&(document.body.appendChild(r.current),r.current=null);typeof t=="function"?t(o):t&&(t.current=o)},[t]);return Pe(to,null,Pe(E.Modal,{...e,ref:n}))});Pt.displayName="Modal";var so=D(Pt),lo=D(E.Switch),uo=D(E.ActivityIndicator),co=D(E.Button),fo=E.findNodeHandle,po={alert(e,t,r,n){if(typeof document>"u")return;let o=document.createElement("dialog");o.dataset.buoyRoot="",o.setAttribute("aria-label",e),o.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 i=document.createElement("h2");if(i.textContent=e,i.style.cssText="font-size:18px;margin:0 0 12px",o.appendChild(i),t){let c=document.createElement("p");c.textContent=t,c.style.cssText="line-height:1.5;white-space:pre-wrap;margin:0 0 20px",o.appendChild(c)}let a=document.createElement("div");a.style.cssText="display:flex;justify-content:flex-end;flex-wrap:wrap;gap:8px";let s=r?.length?r:[{text:"OK"}],l=()=>{o.close?.(),o.remove()};for(let c of s){let u=document.createElement("button");u.type="button",u.textContent=c.text??"OK",u.style.cssText=`padding:9px 14px;border:1px solid #64748b;border-radius:7px;color:white;background:${c.style==="destructive"?"#a52b38":"#283a4d"};cursor:pointer;font:inherit`,u.onclick=()=>{l(),c.onPress?.()},a.appendChild(u)}o.addEventListener("cancel",c=>{c.preventDefault(),n?.cancelable!==false&&(l(),n?.onDismiss?.())}),o.appendChild(a),document.body.appendChild(o),o.showModal?o.showModal():o.setAttribute("open","")}};var Ne=Object.freeze({mode:"real",anchorReal:0,anchorVirtual:0,rate:1}),ze=.1,je=86400,ho=864e13;function M(e,t){return e.mode==="real"?t:e.mode==="frozen"?e.anchorVirtual:e.anchorVirtual+(t-e.anchorReal)*e.rate}function mo(e,t){return M(e,t)-t}function Q(e){if(!Number.isFinite(e)||Math.abs(e)>ho)throw new RangeError(`Not a valid time: ${e}`);return Math.round(e)}function Me(e,t,r,n=false){return{mode:n?"frozen":"running",anchorReal:t,anchorVirtual:Q(r),rate:e.mode==="real"?1:e.rate}}function yo(e,t,r){if(!Number.isFinite(r))throw new RangeError("Jump must be a number of ms");return Me(e,t,M(e,t)+r,e.mode==="frozen")}function go(e,t,r){return Me(e,t,r??M(e,t),true)}function bo(e,t){return e.mode!=="frozen"?e:{...e,mode:"running",anchorReal:t}}function ko(e,t,r){if(!Number.isFinite(r)||r<ze||r>je)throw new RangeError(`Speed must be between ${ze}\xD7 and ${je}\xD7`);return e.mode==="real"&&r===1?e:{mode:"running",anchorReal:t,anchorVirtual:Q(M(e,t)),rate:r}}function Lt(e){let t=e;return!!t&&(t.mode==="real"||t.mode==="running"||t.mode==="frozen")&&Number.isFinite(t.anchorReal)&&Number.isFinite(t.anchorVirtual)&&Number.isFinite(t.rate)&&t.rate>=ze&&t.rate<=je}var vo={ms:1,millisecond:1,milliseconds:1,s:1e3,sec:1e3,secs:1e3,second:1e3,seconds:1e3,m:6e4,min:6e4,mins:6e4,minute:6e4,minutes:6e4,h:36e5,hr:36e5,hrs:36e5,hour:36e5,hours:36e5,d:864e5,day:864e5,days:864e5,w:6048e5,wk:6048e5,week:6048e5,weeks:6048e5,mo:30*864e5,month:30*864e5,months:30*864e5,y:365*864e5,yr:365*864e5,year:365*864e5,years:365*864e5};function _e(e){if(typeof e=="number"){if(!Number.isFinite(e))throw new RangeError("Duration must be finite");return Math.round(e)}let t=String(e).trim().toLowerCase();if(!t)throw new RangeError("Duration is empty");let r=1;if((t[0]==="+"||t[0]==="-"||t[0]==="\u2212")&&(r=t[0]==="+"?1:-1,t=t.slice(1).trim()),/^\d+(\.\d+)?$/.test(t))return r*Math.round(Number(t));let n=/(\d+(?:\.\d+)?)\s*([a-z]+)/g,o=0,i="",a;for(;a=n.exec(t);){let s=vo[a[2]];if(s===void 0)throw new RangeError(`Unknown time unit "${a[2]}" in "${e}"`);o+=Number(a[1])*s,i+=a[0]}if(!i||i.replace(/\s/g,"")!==t.replace(/[\s,]/g,""))throw new RangeError(`Could not read "${e}" as a duration. Try "+1d", "-2h30m" or "90s".`);return r*Math.round(o)}function ie(e,{signed:t=true}={}){let r=e<0?"\u2212":"+",n=Math.abs(Math.round(e));if(n<1e3)return t&&n>0?`${r}${n}ms`:"0s";let o=[],i=[["y",365*864e5],["d",864e5],["h",36e5],["m",6e4],["s",1e3]];for(let[a,s]of i)if(n>=s&&(o.push(`${Math.floor(n/s)}${a}`),n%=s),o.length===2)break;return`${t?r:""}${o.join(" ")}`}function Nt(e,t,r){if(typeof e=="number")return Q(e);let n=String(e).trim();if(!n)throw new RangeError("Time is empty");if(/^now$/i.test(n))return t;if(/^[+\-−]/.test(n))return Q(t+_e(n));if(/^\d{11,}$/.test(n))return Q(Number(n));let o=n.replace(/^(\d{4}-\d{2}-\d{2})[ ](\d{2}:\d{2})/,"$1T$2"),i=r(o);if(!Number.isFinite(i))throw new RangeError(`Could not read "${e}" as a time. Use ISO 8601 like 2026-12-31T23:59:50, epoch ms, or "+1d".`);return Q(i)}var Fe=1e4,zt=[{id:"midnight",label:"Before midnight",hint:"23:59:50 tonight",at(e,t){let r=new t(e);return r.setHours(24,0,0,0),r.getTime()-Fe}},{id:"month-end",label:"Month end",hint:"last day, 23:59:50",at(e,t){let r=new t(e);return r.setMonth(r.getMonth()+1,1),r.setHours(0,0,0,0),r.getTime()-Fe}},{id:"year-end",label:"New Year's Eve",hint:"Dec 31, 23:59:50",at(e,t){let r=new t(e);return r.setFullYear(r.getFullYear()+1,0,1),r.setHours(0,0,0,0),r.getTime()-Fe}},{id:"tomorrow-9",label:"Tomorrow 9 AM",hint:"start of a business day",at(e,t){let r=new t(e);return r.setDate(r.getDate()+1),r.setHours(9,0,0,0),r.getTime()}},{id:"leap-day",label:"Leap day",hint:"next Feb 29, 09:00",at(e,t){let r=new t(e).getFullYear();for(;;){let n=r%4===0&&r%100!==0||r%400===0,o=new t(r,1,29,9,0,0,0).getTime();if(n&&o>e)return o;r+=1}}}],Qa=[{label:"1m",ms:6e4},{label:"15m",ms:15*6e4},{label:"1h",ms:36e5},{label:"1d",ms:864e5},{label:"7d",ms:7*864e5},{label:"30d",ms:30*864e5},{label:"1y",ms:365*864e5}];function jt(e){return e===3600?"1h/s":e===600?"10m/s":e===60?"1m/s":`${Number.isInteger(e)?e:e.toFixed(1)}\xD7`}var P=globalThis,ye="__buoyClock",T=P.__buoyRealDate??(Date[ye]?Date.__buoyRealDate:Date);P.__buoyRealDate=T;var Mt=T.now.bind(T);function $(){return Mt()}P.__buoyRealNow=$;var Be=null,Ue=0;function ge(){let e=Mt();return!Be||Ue>0?e:Be(e)}function _t(e){Be=e}function He(e){Ue+=1;try{return e()}finally{Ue-=1}}P.__buoyWithRealClock=He;function _(...e){let t=new.target;return t?Reflect.construct(T,e.length===0?[ge()]:e,t):new T(ge()).toString()}_.prototype=T.prototype;Object.defineProperty(_,"name",{value:"Date"});Object.defineProperty(_,"length",{value:7});Object.defineProperty(_,"now",{value:function(){return ge()},writable:true,configurable:true});Object.defineProperty(_,"parse",{value:T.parse,writable:true,configurable:true});Object.defineProperty(_,"UTC",{value:T.UTC,writable:true,configurable:true});Object.defineProperty(_,ye,{value:true});Object.defineProperty(_,"__buoyRealDate",{value:T});var ae=_,be=false,ke;function xo(){return be&&P.Date===ae}function wo(){if(P.Date===ae){be=true;return}let e=Object.getOwnPropertyDescriptor(P,"Date");Object.defineProperty(P,"Date",{value:ae,writable:e?.writable??true,enumerable:e?.enumerable??false,configurable:true}),ke=Object.getOwnPropertyDescriptor(T.prototype,"constructor");try{Object.defineProperty(T.prototype,"constructor",{value:ae,writable:true,enumerable:false,configurable:true})}catch{}be=true}function Ao(){if(P.Date===ae){let e=Object.getOwnPropertyDescriptor(P,"Date");Object.defineProperty(P,"Date",{value:T,writable:e?.writable??true,enumerable:e?.enumerable??false,configurable:true})}if(ke){try{Object.defineProperty(T.prototype,"constructor",ke)}catch{}ke=void 0}be=false}var se=[];function Ft(e){return function(t,...r){return e.call(this,t===void 0?ge():t,...r)}}function So(){if(se.length)return;let e=P.Intl?.DateTimeFormat?.prototype;if(e)for(let t of["format","formatToParts"]){let r=Object.getOwnPropertyDescriptor(e,t);if(!(!r||!r.configurable))try{if(typeof r.get=="function"){let n=r.get;Object.defineProperty(e,t,{...r,get(){return Ft(n.call(this))}})}else if(typeof r.value=="function")Object.defineProperty(e,t,{...r,value:Ft(r.value)});else continue;se.push({proto:e,name:t,original:r})}catch{}}}function To(){for(let{proto:e,name:t,original:r}of se)try{Object.defineProperty(e,t,r)}catch{}se=[]}function $o(){return se.length>0}function Io(){wo(),So()}function Co(){Ao(),To()}var Ve=false;function Oo(e){let t=Object.getPrototypeOf(e);for(;t&&t!==Object.prototype;){if(!Object.prototype.hasOwnProperty.call(t,ye)){for(let r of["start","onUpdate"]){let n=Object.getOwnPropertyDescriptor(t,r);if(n&&typeof n.value=="function"){let o=n.value;t[r]=function(...i){return He(()=>o.apply(this,i))}}}try{Object.defineProperty(t,ye,{value:true})}catch{return}}t=Object.getPrototypeOf(t)}}function Eo(e){if(Ve)return true;try{let t=e;if(typeof t?.Value!="function")return false;let r=Object.getPrototypeOf(new t.Value(0)),n=r?.animate;return typeof n!="function"?false:(r.animate=function(o,...i){return o&&typeof o=="object"&&Oo(o),n.call(this,o,...i)},Ve=true,true)}catch{return false}}function Ro(){return Ve}var le=globalThis,Bt="__buoyClockTimer",L=new Map,J=null,Do={},Ut=0,q=()=>$()+Ut;function Po(e){(J?.setTimeout??setTimeout)(()=>{throw e},0)}function Ht(e){let t=Number(e);return Number.isFinite(t)&&t>0?t:0}function Lo(){return J!==null}function Vt(){if(J)return true;let{setTimeout:e,clearTimeout:t,setInterval:r,clearInterval:n}=le;if(typeof e!="function"||typeof t!="function")return false;if(e[Bt])return true;Do={setTimeout:e,clearTimeout:t,setInterval:r,clearInterval:n},J={setTimeout:e.bind(globalThis),clearTimeout:t.bind(globalThis),setInterval:(typeof r=="function"?r:e).bind(globalThis),clearInterval:(typeof n=="function"?n:t).bind(globalThis)};let o=J,i=function(u,f,...g){if(typeof u!="function")return o.setTimeout(u,f,...g);let S=Ht(f),v,O=function(){return L.delete(v),u.apply(this,g)};return v=o.setTimeout(O,f),L.set(v,{kind:"timeout",callback:u,args:g,delay:S,due:q()+S,realHandle:v,run:O}),v},a=function(u,f,...g){if(typeof u!="function")return o.setInterval(u,f,...g);let S=Ht(f),v,O=function(){let z=L.get(v);return z&&(z.due=q()+S),u.apply(this,g)};return v=o.setInterval(O,f),L.set(v,{kind:"interval",callback:u,args:g,delay:S,due:q()+S,realHandle:v,run:O}),v},s=(u,f)=>{let g=L.get(u);return g?(L.delete(u),g.kind==="interval"?o.clearInterval(g.realHandle):o.clearTimeout(g.realHandle)):f(u)},l=function(u){return s(u,o.clearTimeout)},c=function(u){return s(u,o.clearInterval)};globalThis.__buoyRealTimers={setTimeout:o.setTimeout,clearTimeout:l,setInterval:o.setInterval,clearInterval:c};for(let u of[i,a,l,c])Object.defineProperty(u,Bt,{value:true});return le.setTimeout=i,le.clearTimeout=l,le.setInterval=a,le.clearInterval=c,true}function No(){let e=q(),t=0,r=0,n=null;for(let o of L.values())if(o.kind==="interval")r+=1;else{t+=1;let i=Math.max(0,o.due-e);(n===null||i<n)&&(n=i)}return{total:t+r,timeouts:t,intervals:r,nextTimeoutInMs:n}}function zo(e){let t=q(),r=0;for(let n of L.values())n.due-t<=e&&(r+=1);return r}function jo(e){if(!J||!(e>0))return 0;let t=J;Ut+=e;let r=q(),n=[...L.entries()].filter(([,a])=>a.due<=r).sort((a,s)=>a[1].due-s[1].due),o=0;for(let[a,s]of n)if(L.has(a)){s.kind==="timeout"?(L.delete(a),t.clearTimeout(s.realHandle)):s.due=r+s.delay;try{s.callback(...s.args)}catch(l){Po(l)}o+=1}let i=q();for(let a of L.values())a.kind==="timeout"&&(t.clearTimeout(a.realHandle),a.realHandle=t.setTimeout(a.run,Math.max(0,a.due-i)));return o}import{devToolsStorageKeys as Mo,persistentStorage as Wt}from"@buoy-gg/shared-ui/web";function _o(){try{let e=globalThis.localStorage;return e?Jt(e.getItem(We)):void 0}catch{return}}var ue={persist:true,showChip:true,fireTimersOnJump:true},Fo=2*6e4,We=Mo.clock.state();function Jt(e){if(!e)return null;try{let t=JSON.parse(e);if(!t||t.v!==1)return null;let r=t.settings??{},n=t.reload&&Lt(t.reload.anchor)&&typeof t.reload.at=="number"?{anchor:t.reload.anchor,at:t.reload.at}:void 0;return{v:1,anchor:Lt(t.anchor)?t.anchor:null,...n?{reload:n}:{},settings:{persist:typeof r.persist=="boolean"?r.persist:ue.persist,showChip:typeof r.showChip=="boolean"?r.showChip:ue.showChip,fireTimersOnJump:typeof r.fireTimersOnJump=="boolean"?r.fireTimersOnJump:ue.fireTimersOnJump}}}catch{return null}}async function Bo(){try{return Jt(await Wt.getItem(We))}catch{return null}}var Je=Promise.resolve();function qe(e){let t=JSON.stringify(e);return Je=Je.then(()=>Wt.setItem(We,t)).catch(()=>{}),Je.then(()=>{})}import{dispatchToolAction as Uo}from"@buoy-gg/shared-ui/web";import{loadToolModule as Ho}from"@buoy-gg/shared-ui/web/utils";var qt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",ve={};for(let e=0;e<qt.length;e++)ve[qt[e]]=e;ve["-"]=62;ve._=63;function Ke(e){let t=e.replace(/=+$/,""),r=[],n=0,o=0;for(let i=0;i<t.length;i++){let a=ve[t[i]];if(a===void 0)return null;n=n<<6|a,o+=6,o>=8&&(o-=8,r.push(n>>o&255))}return r}function Vo(e){let t="";for(let r=0;r<e.length;){let n=e[r],o,i;if(n<128)o=n,i=0;else if(n>=192&&n<224)o=n&31,i=1;else if(n>=224&&n<240)o=n&15,i=2;else if(n>=240&&n<248)o=n&7,i=3;else return null;for(let a=1;a<=i;a++){let s=e[r+a];if(s===void 0||(s&192)!==128)return null;o=o<<6|s&63}t+=String.fromCodePoint(o),r+=i+1}return t}function Ze(e){let t=Ke(e);return t?Kt(t):null}function Kt(e){let t=Vo(e);if(!t||t[0]!=="{")return null;try{let r=JSON.parse(t);return r&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}function Ye(e){let t=typeof e=="string"&&e.trim()!==""?Number(e):e;return typeof t=="number"&&Number.isFinite(t)&&t>0?t*1e3:void 0}function ce(e,t){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e<1e11?e*1e3:e;if(typeof e=="string"&&e.trim()!==""){let r=e.trim();if(/^\d+(\.\d+)?$/.test(r))return ce(Number(r),t);let n=t(r);return Number.isFinite(n)?n:void 0}}function Wo(e){let t=typeof e=="string"&&/^\d+(\.\d+)?$/.test(e.trim())?Number(e):e;return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}var Jo=/^[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]*$/,qo=/^[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]*\.[A-Za-z0-9_-]*\.[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]*$/,Zt=/^v([1-4])\.(local|public)\.([A-Za-z0-9_-]+)(?:\.([A-Za-z0-9_-]+))?$/,Ko={1:256,2:64,3:96,4:64};function U(e){if(typeof e=="string"&&e)return e;if(Array.isArray(e)){let t=e.filter(r=>typeof r=="string");return t.length?t.join(", "):void 0}}function Zo(e,t){let r=e.iss??"",n=e.use;if(r.includes("securetoken.google.com"))return"Firebase ID token";if(r.includes("firebaseappcheck"))return"Firebase App Check token";if(r.includes("cognito-idp"))return n?`Cognito ${n} token`:"Cognito token";if(r.includes("appleid.apple.com"))return"Sign in with Apple token";if(r.includes("accounts.google.com"))return"Google ID token";if(r.includes(".auth0.com")||r.includes("auth0"))return"Auth0 token";if(r.includes("clerk"))return"Clerk session token";if(r.includes("supabase")||r.includes("/auth/v1"))return"Supabase access token";if(r.includes("okta"))return"Okta token";if(r.includes("/realms/"))return"Keycloak token";if(r.includes("login.microsoftonline.com")||r.includes("sts.windows.net"))return"Microsoft Entra token";let o=typeof t?.typ=="string"?t.typ.toLowerCase():"";if(o==="at+jwt"||o==="application/at+jwt")return"OAuth access token"}function Yo(e,t){let r={iss:U(e.iss),aud:U(e.aud),sub:U(e.sub),scope:U(e.scope??e.scp),use:U(e.token_use)},n=Ye(e.exp);return{claims:r,issuedAt:Ye(e.iat),notBefore:Ye(e.nbf),expiresAt:n,expirySource:n?t:void 0}}function Go(e){let[t,r]=e.split("."),n=Ze(t);if(!n||typeof n.alg!="string"&&typeof n.typ!="string")return null;let o=Ze(r);if(!o)return null;let i=typeof n.alg=="string"?n.alg:void 0,a=Yo(o,"exp claim");return a.claims.alg=i,!a.claims.use&&typeof n.typ=="string"&&n.typ.toUpperCase()!=="JWT"&&(a.claims.use=n.typ),{format:"jwt",formatLabel:i?`JWT \xB7 ${i}`:"JWT",hint:Zo(a.claims,n),...a}}function Xo(e){let t=Ze(e.split(".")[0]);return!t||typeof t.enc!="string"?null:{format:"jwe",formatLabel:"Encrypted JWT",claims:{alg:typeof t.alg=="string"?t.alg:void 0}}}function Qo(e,t){let r=Zt.exec(e);if(!r)return null;let[,n,o,i]=r;if(o==="local")return{format:"paseto-local",formatLabel:`PASETO v${n} (encrypted)`,claims:{}};let a=Ke(i),s=Ko[n],l=a&&a.length>s?Kt(a.slice(0,a.length-s)):null,c={format:"paseto-public",formatLabel:`PASETO v${n}`,claims:{}};return l&&(c.claims={iss:U(l.iss),aud:U(l.aud),sub:U(l.sub)},c.issuedAt=ce(l.iat,t),c.notBefore=ce(l.nbf,t),c.expiresAt=ce(l.exp,t),c.expiresAt&&(c.expirySource="exp claim")),c}function ei(e){if(!e.startsWith("gAAAAA")||e.length<76)return null;let t=Ke(e);if(!t||t[0]!==128||t.length<73||(t.length-57)%16!==0)return null;let r=0;for(let n=1;n<=8;n++)r=r*256+t[n];return r<978307200||r>4102444800?null:{format:"fernet",formatLabel:"Fernet",claims:{},issuedAt:r*1e3}}var ti=[{test:/^ya29\./,hint:"Google OAuth access token"},{test:/^gh[opsu]_/,hint:"GitHub token"},{test:/^github_pat_/,hint:"GitHub token"},{test:/^xox[abeprs]-/,hint:"Slack token"},{test:/^EAA[A-Za-z0-9]{40,}/,hint:"Facebook access token"},{test:/^shp(at|ca|pa|ss)_/,hint:"Shopify token"},{test:/^(sk|rk|pk)_(live|test)_/,hint:"Stripe API key",neverExpires:true},{test:/^AIza[0-9A-Za-z_-]{35}$/,hint:"Google API key",neverExpires:true}];function xe(e,t=Date.parse){let r=e.trim().replace(/^"(.*)"$/,"$1");if(r.length<16||/\s/.test(r))return null;if(Jo.test(r)){let i=Go(r);if(i)return i}if(qo.test(r)){let i=Xo(r);if(i)return i}if(r.startsWith("v")&&Zt.test(r)){let i=Qo(r,t);if(i)return i}let n=ei(r);if(n)return n;let o=ti.find(i=>i.test.test(r));return{format:"opaque",formatLabel:"Opaque",hint:o?.hint,neverExpires:o?.neverExpires,claims:{}}}function ri(e){return!!e&&e.format!=="opaque"}function H(e){let t=2166136261;for(let r=0;r<e.length;r++)t^=e.charCodeAt(r),t=Math.imul(t,16777619)>>>0;return t.toString(16).padStart(8,"0")}function Ge(e){let t=/^([a-z][a-z0-9+.-]*:\/\/[^/?#]+)/i.exec(e);return t?t[1].toLowerCase():null}function ni(e){let t=Ge(e);return t?t.replace(/^[a-z][a-z0-9+.-]*:\/\//,""):"unknown"}function Xe(e){return e.replace(/^[a-z][a-z0-9+.-]*:\/\/[^/?#]+/i,"").split(/[?#]/)[0]||"/"}function oi(e){let t=e.split("#")[0].split("?")[1];if(!t)return[];let r=[];for(let n of t.split("&")){let o=n.indexOf("=");if(!(o<=0))try{r.push([decodeURIComponent(n.slice(0,o)),decodeURIComponent(n.slice(o+1))])}catch{}}return r}var Qe=/(token|jwt|session|auth|appcheck|api[-_]?key|apikey|credential|bearer)/i,ii=new Set(["authorization","cookie","dpop","idempotency-key","x-request-id","x-correlation-id","www-authenticate","proxy-authenticate","x-csrf-token","x-xsrf-token"]),Yt=new Set(["access_token","accesstoken","id_token","token","auth","auth_token","jwt","session","session_token"]),ai=new Set(["bearer","token","jwt","dpop","oauth","firebase"]);function Gt(e){let t={};if(!e)return t;for(let[r,n]of Object.entries(e))typeof n=="string"?t[r.toLowerCase()]=n:Array.isArray(n)&&(t[r.toLowerCase()]=n.join(", "));return t}function si(e){let t=[];for(let r of e.split(";")){let n=r.indexOf("=");n<=0||t.push([r.slice(0,n).trim(),r.slice(n+1).trim()])}return t}function de(e,t,r){let n=xe(e,r);return n&&(ri(n)||n.hint||t)?n:null}function Xt(e,t){let r=[],n=Gt(e.requestHeaders),o=n.authorization;if(o){let i=/^(\S+)\s+(\S+)$/.exec(o.trim()),a=i?i[1]:void 0,s=i?i[2]:o.trim();if(!a||ai.has(a.toLowerCase())){let l=de(s,true,t)??(a&&!/^(null|undefined)$/i.test(s)?{format:"opaque",formatLabel:"Opaque",claims:{}}:null);l&&r.push({location:"authorization",name:"Authorization",scheme:a,fp:H(s),info:l})}}for(let[i,a]of Object.entries(n)){if(ii.has(i)||!Qe.test(i))continue;let s=a.replace(/^bearer\s+/i,""),l=de(s,true,t);l&&r.push({location:"header",name:i,fp:H(s),info:l})}if(n.cookie)for(let[i,a]of si(n.cookie)){let s=de(a,Qe.test(i)||/^(sid|sess)/i.test(i),t);s&&r.push({location:"cookie",name:i,fp:H(a),info:s})}for(let[i,a]of oi(e.url)){let s=de(a,Yt.has(i.toLowerCase()),t);s&&Yt.has(i.toLowerCase())&&r.push({location:"query",name:i,fp:H(a),info:s})}return r}var li=/^(access_?token|accesstoken|token|jwt|auth_?token|session_?token|sessiontoken)$/i,Qt=/^(id_?token|idtoken)$/i,we=/^(refresh_?token|refreshtoken)$/i,ui=["expires_in","expiresIn","ExpiresIn","expires","ttl"],ci=["expires_at","expiresAt","ExpiresAt","expiration","Expiration","expiry","expirationTime","expiration_time","access_token_expires_at","accessTokenExpiresAt","accessTokenExpiry"],di=["refresh_expires_in","refresh_token_expires_in","refreshTokenExpiresIn","refreshExpiresIn"],fi=["refresh_expires_at","refreshTokenExpiresAt","refresh_token_expires_at"];function pi(e){if(typeof e!="string")return e;let t=e.trim();if(!(t.startsWith("{")||t.startsWith("[")))return null;try{return JSON.parse(t)}catch{return null}}function et(e,t,r){if(t>4||!e||typeof e!="object")return;if(Array.isArray(e)){for(let o of e.slice(0,5))et(o,t+1,r);return}let n=e;for(let[o,i]of Object.entries(n))typeof i=="string"&&(li.test(o)||Qt.test(o)||we.test(o))?r.push({key:o,value:i,holder:n}):i&&typeof i=="object"&&et(i,t+1,r)}function hi(e){return we.test(e)?"refresh":Qt.test(e)?"id":/session/i.test(e)?"session":"access"}function er(e,t,r,n,o){for(let i of t){let a=Wo(e[i]);if(a!==void 0)return{expiresAt:n+a*1e3,source:i,lifetimeMs:a*1e3}}for(let i of r){let a=ce(e[i],o);if(a!==void 0)return{expiresAt:a,source:i}}return{}}function mi(e){let t=e["set-cookie"];return t?t.split(/,(?=\s*[A-Za-z0-9!#$%&'*+.^_`|~-]+=)/).map(r=>r.trim()):[]}function yi(e,t){if(e.status===void 0||e.status>=400)return[];let r=`${e.method.toUpperCase()} ${Xe(e.url)}`,n=e.timestamp+(e.duration??0),o=[],i=pi(e.responseData);if(i){let s=[];et(i,0,s);let l=new Map;for(let c of s.filter(u=>we.test(u.key))){let u=xe(c.value,t);if(!u)continue;let f=er(c.holder,di,fi,n,t);l.set(c.holder,{fp:H(c.value),expiresAt:u.expiresAt??f.expiresAt,formatLabel:u.formatLabel})}for(let c of s){if(we.test(c.key))continue;let u=xe(c.value,t);if(!u)continue;let f=er(c.holder,ui,ci,n,t);o.push({fp:H(c.value),info:u,role:hi(c.key),expiresAt:f.expiresAt,expirySource:f.source,lifetimeMs:f.lifetimeMs,issuedBy:r,refresh:l.get(c.holder)})}}let a=Gt(e.responseHeaders);for(let s of mi(a)){let[l,...c]=s.split(";"),u=l.indexOf("=");if(u<=0)continue;let f=l.slice(0,u).trim(),g=l.slice(u+1).trim(),S=de(g,Qe.test(f)||/^(sid|sess)/i.test(f),t);if(!S||g===""||g.toLowerCase()==="deleted")continue;let v,O,z;for(let Yr of c){let[Gr,...Xr]=Yr.split("="),vt=Gr.trim().toLowerCase(),De=Xr.join("=").trim();if(vt==="max-age"&&/^-?\d+$/.test(De))z=Number(De)*1e3,v=n+z,O="Max-Age";else if(vt==="expires"&&O!=="Max-Age"){let xt=t(De);Number.isFinite(xt)&&(v=xt,O="Expires")}}o.push({fp:H(g),info:S,role:"cookie",cookie:f,expiresAt:S.expiresAt??v,expirySource:S.expiresAt?S.expirySource:O,lifetimeMs:S.expiresAt?void 0:z,issuedBy:r})}return o}var tt=e=>T.parse(e),tr=4,rr=2e4,gi=8,bi=8,ki=200,vi=1e3,R=new Map,ee=new Map,xi=new Set,wi=new Set,nr=new Set,Ai=/(token|refresh|oauth|session|auth\/)/i,p=null,Ae=new Set,Se=true,rt=null,nt=new Set,ot=false;function fe(){ot||(ot=true,Promise.resolve().then(()=>{ot=false,nt.forEach(e=>e())}))}function Si(e){return nt.add(e),()=>{nt.delete(e)}}function it(e,t){if(e.has(t))return false;if(e.size>=vi){let r=e.values().next().value;r!==void 0&&e.delete(r)}return e.add(t),true}function at(e,t){return`${e}|${t.location}:${t.name.toLowerCase()}`}function or(e,t){let r=t?.lifetimeMs!==void 0&&t.expiresAt!==void 0,n=r?t.expiresAt:e.expiresAt??t?.expiresAt,o=e.expiresAt??(r?t.observedReal+t.lifetimeMs:t?.expiresAt),i=r?t.expirySource:e.expiresAt?e.expirySource:t?.expirySource,a=r?t.lifetimeMs:e.expiresAt!==void 0&&e.issuedAt!==void 0?e.expiresAt-e.issuedAt:void 0;return{expiresAt:n,serverExpiresAt:o,source:i,lifetimeMs:a}}function st(e,t,r,n,o){let i=ee.get(t),a=or(r,i),s=e.fp!==t;s&&(e.history.unshift({fp:e.fp,firstSeenReal:e.firstSeenReal,expiresAt:e.expiresAt}),e.history.length=Math.min(e.history.length,bi),e.fp=t,e.firstSeenReal=n,e.firstSeenApp=o,e.uses=0,e.expiredSends=0,e.rejected=0),e.info=r,e.role=i?.role??(s?void 0:e.role),e.issuedBy=i?.issuedBy??(s?void 0:e.issuedBy),e.refresh=i?.refresh??(s?void 0:e.refresh),e.expiresAt=a.expiresAt,e.serverExpiresAt=a.serverExpiresAt,e.expirySource=a.source,e.lifetimeMs=a.lifetimeMs,s&&Ti(e,n)}function ir(e,t,r,n,o){let i=ee.get(r.fp),a=or(r.info,i);return{key:e,origin:t,host:ni(t),location:r.location,name:r.name,scheme:r.scheme,fp:r.fp,info:r.info,role:i?.role,issuedBy:i?.issuedBy,refresh:i?.refresh,expiresAt:a.expiresAt,serverExpiresAt:a.serverExpiresAt,expirySource:a.source,lifetimeMs:a.lifetimeMs,firstSeenReal:n,firstSeenApp:o,lastUsedReal:n,lastUsedApp:o,uses:0,expiredSends:0,rejected:0,history:[]}}function ar(){if(R.size<=gi)return;let e=null;for(let t of R.values())(!e||t.lastUsedReal<e.lastUsedReal)&&(e=t);e&&e.key!==p?.tokenId&&R.delete(e.key)}function Ti(e,t){!p||p.tokenId!==e.key||(p.newTokens+=1,p.status==="waiting"&&(p.status="refreshed",p.refreshedAt=t,p.ruleId&&p.forcedAt===void 0&&Uo("network","deleteOverrideRule",{id:p.ruleId}).catch(()=>{})),p.newTokens>=tr&&t-(p.refreshedAt??t)<=rr&&(p.status="loop"))}function $i(e){let t=Ge(e.url);if(!t)return;let r=Xt(e,tt);if(r.length===0)return;let n=$(),o=e.timestamp;for(let i of r){let a=at(t,i),s=R.get(a);s?st(s,i.fp,i.info,n,o):(s=ir(a,t,i,n,o),R.set(a,s),ar()),s.uses+=1,s.lastUsedReal=n,s.lastUsedApp=o,s.expiresAt!==void 0&&o>=s.expiresAt&&(s.expiredSends+=1),p&&p.tokenId===a&&p.forcedAt!==void 0&&i.fp===p.startFp&&(p.staleAfterFailure+=1,it(Ae,e.id))}fe()}function Ii(e){let t=Ge(e.url);if(!t)return;let r=$(),n=false;if(e.status===401||e.status===403)for(let l of Xt(e,tt)){let c=R.get(at(t,l));c&&c.fp===l.fp&&(c.rejected+=1,n=true)}let o=!!p?.ruleId&&e.override?.ruleId===p.ruleId,i=`${e.method.toUpperCase()} ${Xe(e.url)}`,a=nr.has(i)||e.method.toUpperCase()==="POST"&&Ai.test(Xe(e.url)),s=e.status??0;p&&s>=400&&!o&&a&&(p.failedRefreshes+=1,p.lastRefreshError=`${e.status} ${i}`,n=true),p?.status==="waiting"&&p.forcedAt!==void 0&&!o&&s>=200&&s<400&&(a&&p.refreshOkAt===void 0?(p.refreshOkAt=r,n=true):!a&&p.refreshOkAt!==void 0&&Ae.has(e.id)&&(p.status="refreshed",p.refreshedAt=r,p.sameToken=true,n=true)),p?.ruleId&&e.override?.ruleId===p.ruleId&&p.forcedAt===void 0&&(p.forcedAt=r,n=true);for(let l of yi(e,tt)){if(nr.add(l.issuedBy),ee.set(l.fp,{...l,observedReal:r}),ee.size>ki){let c=ee.keys().next().value;c!==void 0&&ee.delete(c)}if(n=true,l.cookie){let c={location:"cookie",name:l.cookie,fp:l.fp,info:l.info},u=at(t,c),f=R.get(u);f?st(f,l.fp,l.info,r,e.timestamp):(R.set(u,ir(u,t,c,r,e.timestamp)),ar());continue}for(let c of R.values())c.fp===l.fp&&st(c,l.fp,c.info,r,c.lastUsedApp)}n&&fe()}function Ci(e){let t=e;!t||typeof t.id!="string"||typeof t.url!="string"||(it(xi,t.id)&&$i(t),t.status!==void 0&&it(wi,t.id)&&Ii(t))}function Te(){if(rt)return true;try{let{networkEventStore:e}=Ho("@buoy-gg/network");if(!e?.onEvent)throw new Error("no event store");rt=e.onEvent(Ci,true),Se=true}catch{Se=false}return fe(),Se}function sr(e,t,r){let n=R.get(t);if(!n)throw new Error(`No token row "${t}".`);return p={kind:e,tokenId:t,startedAt:$(),startFp:n.fp,ruleId:r,status:"waiting",newTokens:0,staleAfterFailure:0,failedRefreshes:0},Ae.clear(),fe(),p}function Oi(){p=null,Ae.clear(),fe()}function Ei(e){return e.location==="cookie"?`${e.name} cookie`:e.location==="query"?`${e.name} parameter`:e.location==="header"?`${e.name} header`:e.role==="id"||e.info.claims.use==="id"?"ID token":"Access token"}function Ri(e,t){let r=[e.firstSeenReal,...e.history.map(o=>o.firstSeenReal)].slice(0,-1).filter(o=>t-o<=rr).length,n=e.info.issuedAt;return{id:e.key,label:Ei(e),host:e.host,location:e.location,name:e.name,scheme:e.scheme,format:e.info.format,formatLabel:e.info.formatLabel,hint:e.info.hint,claims:e.info.claims,fingerprint:e.fp,issuedAt:n,notBefore:e.info.notBefore,expiresAt:e.expiresAt,serverExpiresAt:e.serverExpiresAt,expirySource:e.expirySource,lifetimeMs:e.lifetimeMs,neverExpires:e.info.neverExpires,issuedBy:e.issuedBy,refresh:e.refresh?{expiresAt:e.refresh.expiresAt,formatLabel:e.refresh.formatLabel}:void 0,firstUsed:e.firstSeenApp,lastUsed:e.lastUsedApp,lastUsedReal:e.lastUsedReal,uses:e.uses,refreshes:e.history.length,lastRefreshAt:e.history.length?e.firstSeenReal:void 0,recentRefreshes:r,looping:r>=tr,expiredSends:e.expiredSends,rejected:e.rejected}}function $e(){let e=$(),t=[...R.values()].sort((r,n)=>n.lastUsedReal-r.lastUsedReal).map(r=>Ri(r,e));if(p?.status==="refreshed"){let r=R.get(p.tokenId);r&&(p.newLifetimeMs=r.lifetimeMs,p.newIssuedBy=r.issuedBy)}return{available:Se,watching:rt!==null,tokens:t,check:p?{...p}:null}}function Di(e){let t=$e();return e?t.tokens.find(r=>r.id===e||r.fingerprint===e)??null:t.tokens.find(r=>r.expiresAt!==void 0)??t.tokens[0]??null}function Pi(e){return R.get(e)?.origin??null}import{isProNow as lr}from"@buoy-gg/shared-ui/web";var h={anchor:Ne,settings:ue,lastJump:null,changedAt:null,hydrated:false},lt=new Set,Ie=null;function ur(){Ie=null,lt.forEach(e=>e())}Si(ur);function pe(e){return lt.add(e),()=>{lt.delete(e)}}function Li(){return h.settings}function cr(){return M(h.anchor,$())}function dr(){return h.anchor.mode!=="real"}function Ni(e){if(e.mode==="real"){_t(null),Co();return}Vt(),_t(t=>M(h.anchor,t)),Io()}function zi(){let e={v:1,anchor:h.settings.persist&&lr()?h.anchor:null,settings:h.settings};qe(e)}function fr(){let e={v:1,anchor:h.settings.persist&&lr()?h.anchor:null,settings:h.settings};return h.settings.persist&&h.anchor.mode!=="real"&&(e.reload={anchor:h.anchor,at:$()}),qe(e)}function te(e,{save:t=true}={}){h={...h,...e},e.anchor&&Ni(h.anchor),t&&zi(),ur()}function re(e,t=h.lastJump){te({anchor:e,lastJump:t,changedAt:$(),hydrated:true})}var pr=e=>T.parse(e);function hr(e,t=false){let r=$(),n=M(h.anchor,r),o=Nt(e,n,pr),i=o-n;return re(Me(h.anchor,r,o,t),{byMs:i,firedTimers:0,at:r}),C()}function ut(e,t){let r=_e(e),n=$(),o=yo(h.anchor,n,r),i=(t??h.settings.fireTimersOnJump)&&r>0;if(re(o,{byMs:r,firedTimers:0,at:n}),i){let a=jo(r);a>0&&te({lastJump:{byMs:r,firedTimers:a,at:n}},{save:false})}return C()}function ct(e){let t=$(),r=M(h.anchor,t),n=e===void 0||e===""?r:Nt(e,r,pr);return re(go(h.anchor,t,n)),C()}function dt(){return h.anchor.mode==="frozen"&&re(bo(h.anchor,$())),C()}function mr(e){return re(ko(h.anchor,$(),Number(e))),C()}function ft(){return re(Ne,null),C()}function yr(e){let t={...h.settings};for(let r of Object.keys(ue))typeof e[r]=="boolean"&&(t[r]=e[r]);return te({settings:t}),C()}function ji(e){return e>0?zo(e):0}var gr=false;function br(e){if(!e){te({hydrated:true},{save:false});return}let t=e.reload?$()-e.reload.at:1/0,r=t>=0&&t<Fo?e.reload?.anchor:void 0;e.reload&&qe({v:1,anchor:e.anchor,settings:e.settings});let n=e.anchor??r??null;te({settings:e.settings,anchor:n??Ne,changedAt:n?$():null,hydrated:true},{save:false})}function pt(){if(gr)return;gr=true,Vt();let e=_o();if(e!==void 0){br(e);return}Bo().then(t=>{h.changedAt===null?br(t):te({hydrated:true},{save:false})})}function Mi(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone??"unknown"}catch{return"unknown"}}function C(){let e=$(),t=M(h.anchor,e);return{mode:h.anchor.mode,active:h.anchor.mode!=="real",rate:h.anchor.rate,virtualNow:t,virtualIso:new T(t).toISOString(),realNow:e,offsetMs:mo(h.anchor,e),timeZone:Mi(),timers:No(),lastJump:h.lastJump,changedAt:h.changedAt,settings:h.settings,hydrated:h.hydrated,tokens:$e(),patched:{date:xo(),intl:$o(),timers:Lo(),animatedOnRealClock:Ro()}}}function kr(){return Ie||(Ie=C()),Ie}import{useSyncExternalStore as _i}from"react";import{ClockToolIcon as vr,FloatingTool as Fi,Pause as Bi,Play as Ui,X as Hi,dismissFloatingTool as Vi,getFloatingTools as Wi,getUseIsPro as Ji,night as he,openFloatingTool as xr}from"@buoy-gg/shared-ui/web";import{useEffect as qi,useState as Ki}from"react";function V(e,t=250){let[,r]=Ki(0);qi(()=>{let a=setInterval(()=>r(s=>s+1),t);return()=>clearInterval(a)},[t]);let n=$();if(!e)return{virtual:n,real:n};let o=n-e.realNow,i=e.mode==="real"?1:e.rate;return{virtual:e.mode==="frozen"?e.virtualNow:e.virtualNow+o*i,real:n}}var F=e=>String(e).padStart(2,"0");function ne(e){let t=new T(e);return`${F(t.getHours())}:${F(t.getMinutes())}:${F(t.getSeconds())}`}var Zi=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wr=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function Yi(e){let t=new T(e);return`${Zi[t.getDay()]}, ${wr[t.getMonth()]} ${t.getDate()}, ${t.getFullYear()}`}function Ce(e,t=true){let r=new T(e),n=t?ne(e):`${F(r.getHours())}:${F(r.getMinutes())}`;return`${wr[r.getMonth()]} ${r.getDate()} \xB7 ${n}`}function Ar(e){let t=new T(e);return`${t.getFullYear()}-${F(t.getMonth()+1)}-${F(t.getDate())} ${F(t.getHours())}:${F(t.getMinutes())}`}function Gi(e){if(Math.abs(e)<1e3)return"matches real time";let t=ie(Math.abs(e),{signed:false});return e>0?`${t} ahead of real time`:`${t} behind real time`}function Sr(e){return e.mode==="real"?{label:"Real time",tone:"neutral"}:e.mode==="frozen"?{label:"Frozen",tone:"info"}:e.rate!==1?{label:`${jt(e.rate)} speed`,tone:"warning"}:{label:"Overridden",tone:"accent"}}function Xi(e){return`clock-jump-${e<0?"minus":"plus"}-${ie(Math.abs(e),{signed:false}).replace(/\s/g,"")}`}import{jsx as N,jsxs as ht}from"react/jsx-runtime";var Oe="clock-chip",Tr={id:Oe,render:e=>N(Cr,{...e})},Qi=()=>Wi().some(e=>e.id===Oe);function ea(){xr(Tr)}var $r=false;function Ir(){if($r)return;$r=true;let e=false,t=()=>{let r=dr()&&Li().showChip;r&&!e?xr(Tr):!r&&Qi()&&Vi(Oe),e=r};pe(t),t()}function Cr({id:e,revealToken:t}){let r=_i(pe,kr,kr),{virtual:n,real:o}=V(r),i=r.mode==="frozen",a=Ji()(),s=i||a,l=Sr(r),c=n-o,u=`${Math.abs(c)<1e3?"0s":ie(c)} \xB7 ${l.label.toLowerCase()}`;return N(Fi,{id:e,revealToken:t,variant:"strip",dragFromSurface:true,defaultPlacement:"top",accessibilityLabel:`Move or hide the clock chip. App time ${Ce(n)}`,handleAdornment:N(vr,{size:12}),children:ht(m,{style:K.row,children:[N(vr,{size:18}),ht(m,{style:K.text,children:[N(w,{style:K.time,numberOfLines:1,testID:"clock-chip-time",children:Ce(n)}),N(w,{style:K.detail,numberOfLines:1,testID:"clock-chip-detail",children:u})]}),s?ht(B,{testID:i?"clock-chip-resume":"clock-chip-freeze",accessibilityRole:"button",accessibilityLabel:i?"Resume the app clock":"Freeze the app clock",onPress:()=>i?dt():ct(),style:K.button,hitSlop:{top:8,bottom:8,left:4,right:4},children:[i?N(Ui,{size:16,color:he.color.accent}):null,i?null:N(Bi,{size:16,color:he.color.text})]}):null,s?N(m,{style:K.separator}):null,N(B,{testID:"clock-chip-reset",accessibilityRole:"button",accessibilityLabel:"Back to real time",onPress:()=>ft(),style:K.button,hitSlop:{top:8,bottom:8,left:4,right:8},children:N(Hi,{size:16,color:he.color.textSecondary})})]})})}var K=X.create({row:{flexDirection:"row",alignItems:"center",gap:10,paddingLeft:10,paddingRight:4,paddingVertical:6,minWidth:220},text:{flexShrink:1,minWidth:120},time:{color:"#F59E0B",fontSize:14,fontWeight:"600",fontVariant:["tabular-nums"]},detail:{color:he.color.textSecondary,fontSize:11,fontVariant:["tabular-nums"]},button:{width:32,height:32,alignItems:"center",justifyContent:"center",borderRadius:16},separator:{width:X.hairlineWidth,height:20,backgroundColor:he.color.separator}});import{ClockToolIcon as ta,CLOCK_TOOL_ICON_COLOR as ra,createToolFactory as na,defineToolPreset as oa}from"@buoy-gg/shared-ui/web";import{useEffect as Or,useState as ia}from"react";import{reloadApp as aa}from"@buoy-gg/shared-ui/web";import{createSyncAdapter as sa}from"@buoy-gg/shared-ui/web";import{dispatchToolAction as Er}from"@buoy-gg/shared-ui/web";var Rr="No sign-in token seen yet. Use the app so it sends a signed-in request, then try again. Tokens are read from the Network tool's captured requests.";function Dr(e){Te();let t=Di(e);if(!t)throw new Error(e?`No token "${e}". Read getState for the current ids.`:Rr);return t}function Pr(e,t=1e4){let r=Dr(e);if(r.expiresAt===void 0)throw new Error(r.neverExpires?`${r.label} for ${r.host} is ${r.hint??"a key"} and never expires.`:`${r.label} for ${r.host} (${r.formatLabel}) has no expiry Buoy can read. Use failNextRequest to test the refresh instead.`);let n=r.expiresAt-Math.max(0,t)-cr();if(n<=0)throw new Error(`${r.label} for ${r.host} has already expired on the app's clock. Go back to real time, or use failNextRequest.`);return ut(n),sr("expiry",r.id),C()}async function Lr(e,t=401,r=1){let n=Dr(e),o=Pi(n.id);if(!o)throw new Error(Rr);await Nr();let i=t===403?403:401,a=n.location==="authorization"||n.location==="header"?{urlPattern:`${o}/*`,requireHeader:n.name.toLowerCase()}:n.location==="query"?{urlPattern:`${o}/*${n.name}=*`}:{urlPattern:`${o}/*`},s=await Er("network","upsertOverrideRule",{name:"Clock: force a token refresh",...a,kind:"respond",status:i,headers:{"content-type":"application/json","www-authenticate":'Bearer error="invalid_token", error_description="The access token expired"'},body:JSON.stringify({error:"invalid_token",error_description:"The access token expired (forced by Buoy Clock to test token refresh)"}),times:Math.max(1,Math.min(10,Math.round(r)))}).catch(l=>{let c=l instanceof Error?l.message:String(l);throw new Error(c.includes("Unknown tool")?"Failing a request needs the Network tool (@buoy-gg/network).":c)});if(!s?.ok||!s.rule)throw new Error(s?.error??"Network did not add the override.");return sr("401",n.id,s.rule.id),C()}async function Nr(){let e=$e().check;e?.ruleId&&e.forcedAt===void 0&&await Er("network","deleteOverrideRule",{id:e.ruleId}).catch(()=>{})}async function zr(){return await Nr(),Oi(),C()}function Z(e){return e&&typeof e=="object"?e:{}}function mt(e,...t){for(let r of t){let n=e[r];if(typeof n=="string"||typeof n=="number")return n}}function me(e,t){let r=e[t];if(typeof r=="boolean")return r;if(r==="true")return true;if(r==="false")return false}var jr=sa({version:1,getSnapshot(){return C()},subscribe(e){return pe(e)},actions:{getState(){return Te(),C()},setTime(e){let t=Z(e),r=mt(t,"time","at","date","iso");if(r===void 0)throw new Error('setTime needs `time`: ISO 8601 ("2026-12-31T23:59:50"), epoch ms, or relative ("+1d").');return hr(r,me(t,"freeze")??false)},shift(e){let t=Z(e),r=mt(t,"by","ms","duration","delta");if(r===void 0)throw new Error('shift needs `by`: a duration like "+1d", "-2h30m", "90s", or ms.');return ut(r,me(t,"fireTimers"))},freeze(e){return ct(mt(Z(e),"time","at"))},resume(){return dt()},setRate(e){let t=Z(e),r=Number(t.rate??t.speed);if(!Number.isFinite(r))throw new Error("setRate needs a numeric `rate` (1 = normal speed).");return mr(r)},reset(){return ft()},updateSettings(e){let t=Z(e);return yr({persist:me(t,"persist"),showChip:me(t,"showChip"),fireTimersOnJump:me(t,"fireTimersOnJump")})},jumpToTokenExpiry(e){let t=Z(e),r=typeof t.token=="string"?t.token:typeof t.id=="string"?t.id:void 0,n=Number(t.leadMs??t.lead??1e4);return Pr(r,Number.isFinite(n)?n:1e4)},failNextRequest(e){let t=Z(e),r=typeof t.token=="string"?t.token:typeof t.id=="string"?t.id:void 0,n=Number(t.status??401),o=Number(t.times??1);return Lr(r,n,Number.isFinite(o)?o:1)},stopTokenCheck(){return zr()},async holdForReload(){return await fr(),C()}}});import{useState as Ee}from"react";import{ChevronRight as la,NightButton as ua,NightCard as Re,NightChip as ca,NightFootnote as yt,NightRows as gt,NightSectionLabel as Mr,NightSegmented as da,NightSwitch as _r,ProBadge as fa,ProUpgradeModal as pa,getUseIsPro as ha,monoFont as ma,night as k,useSafeAreaInsets as ya}from"@buoy-gg/shared-ui/web";import{ChevronRight as ga,NightButton as Fr,NightCard as ba,NightFootnote as ka,NightRows as va,NightSectionLabel as xa,ProBadge as wa,night as x}from"@buoy-gg/shared-ui/web";import{jsx as A,jsxs as j}from"react/jsx-runtime";var W=e=>ie(Math.abs(e),{signed:false});function Aa({snapshot:e,run:t,openId:r,onToggle:n,isPro:o,onUpgrade:i}){let a=e.tokens;return j(m,{children:[A(xa,{children:a.tokens.length>1?"Sign-in tokens":"Sign-in token"}),A(ba,{children:j(va,{children:[a.tokens.map((s,l)=>j(m,{children:[A(Sa,{token:s,snapshot:e,index:l,open:r===s.id,onPress:()=>n(s.id)}),r===s.id?A(Ta,{token:s,snapshot:e,run:o?t:()=>i("Sign-in token tests"),isPro:o}):null]},s.id)),a.tokens.length===0?A(m,{style:b.row,testID:"clock-token-empty",children:A(w,{style:b.emptyText,children:a.available?"No token seen yet":"Needs the Network tool"})},"empty"):null]})}),A(Ia,{check:a.check,tokens:a.tokens,snapshot:e,run:t}),a.tokens.length===0?A(ka,{children:a.available?"Tokens show up here when the app sends a signed-in request.":"Install @buoy-gg/network so the Clock tool can read the app's tokens."}):null]})}function Sa({token:e,snapshot:t,index:r,open:n,onPress:o}){let{virtual:i}=V(t,1e3),a=e.expiresAt!==void 0?e.expiresAt-i:void 0,s=e.neverExpires?"No expiry":a===void 0?"Unknown":a<=0?"Expired":W(a),l=a!==void 0&&a<=0?b.valueDanger:a!==void 0&&a<6e4?b.valueWarning:null;return j(B,{testID:`clock-token-${r}`,accessibilityRole:"button",accessibilityLabel:`${e.label} for ${e.host}: ${a!==void 0&&a>0?`expires in ${s}`:s}`,accessibilityState:{expanded:n},activeOpacity:.6,onPress:o,style:b.row,children:[j(m,{style:b.rowText,children:[A(w,{style:b.rowTitle,numberOfLines:1,children:e.label}),A(w,{style:b.rowSubtitle,numberOfLines:1,children:`${e.host} \xB7 ${e.hint??e.formatLabel}`})]}),j(m,{style:b.rowRight,children:[A(w,{style:[b.value,l],testID:`clock-token-${r}-left`,children:s}),A(m,{style:n?b.chevronOpen:null,children:A(ga,{size:16,color:x.color.textTertiary})})]})]})}function Ta({token:e,snapshot:t,run:r,isPro:n}){let{virtual:o,real:i}=V(t,1e3),a=$a(e,o,i),s=e.expiresAt!==void 0&&e.expiresAt-o>1e4;return j(m,{style:b.detail,testID:"clock-token-detail",children:[a.map(l=>A(w,{style:[b.detailLine,l.tone==="warn"?b.warn:null,l.tone==="bad"?b.bad:null],children:l.text},l.text)),j(m,{style:b.buttons,children:[A(m,{style:b.button,children:A(Fr,{label:"Jump to Expiry",testID:"clock-token-jump",accessibilityLabel:"Jump the app's clock to ten seconds before this token expires",size:"md",disabled:!s,onPress:()=>r("jumpToTokenExpiry",{token:e.id})})}),A(m,{style:b.button,children:A(Fr,{label:"Fail Next Request",testID:"clock-token-fail",accessibilityLabel:"Answer the app's next request to this API with 401",size:"md",onPress:()=>r("failNextRequest",{token:e.id})})})]}),n?null:j(m,{style:b.proLine,children:[A(wa,{}),A(w,{style:[b.hint,b.proHint],children:"Jump to Expiry and Fail Next Request are part of Buoy Pro."})]}),A(w,{style:b.hint,children:s||e.expiresAt===void 0?"Jump tests an app that refreshes before expiry. Fail tests one that refreshes after a 401.":"This token has already expired on the app's clock. Use Real Time to jump to it again."})]})}function $a(e,t,r){let n=[];if(e.expiresAt!==void 0){if(n.push({text:`Expires ${Ce(e.expiresAt)}`}),e.lifetimeMs!==void 0&&e.lifetimeMs>0&&n.push({text:`Lasts ${W(e.lifetimeMs)}${e.expirySource?`, from ${e.expirySource}`:""}`}),e.serverExpiresAt!==void 0){let o=e.expiresAt-t,i=e.serverExpiresAt-r;Math.abs(o-i)>2e3&&n.push({text:i>0?`The server still accepts it for ${W(i)}`:`The server stopped accepting it ${W(i)} ago`})}}else e.neverExpires||n.push({text:"The token doesn't say when it expires, and no login response did either."});if(e.hint&&n.push({text:e.formatLabel}),e.issuedBy&&n.push({text:`Issued by ${e.issuedBy}`}),e.refresh?.expiresAt!==void 0){let o=e.refresh.expiresAt-t;n.push({text:o>0?`Refresh token expires in ${W(o)}`:"Refresh token expired"})}return e.refreshes>0&&e.lastRefreshAt!==void 0&&n.push({text:`Refreshed ${e.refreshes===1?"once":`${e.refreshes} times`}, last at ${ne(e.lastRefreshAt)}`}),n.push({text:`Sent with ${e.uses} request${e.uses===1?"":"s"}`}),e.expiredSends>0&&n.push({text:`Sent ${e.expiredSends} time${e.expiredSends===1?"":"s"} after it expired on the app's clock`,tone:"warn"}),e.rejected>0&&n.push({text:`Rejected by the server ${e.rejected} time${e.rejected===1?"":"s"}`,tone:"warn"}),e.looping&&n.push({text:`Refresh loop: ${e.recentRefreshes} new tokens in 20s`,tone:"bad"}),n}function Ia({check:e,tokens:t,snapshot:r,run:n}){let{virtual:o,real:i}=V(r,1e3);if(!e)return null;let a=t.find(c=>c.id===e.tokenId),{text:s,tone:l}=Ca(e,a,o,i);return j(m,{style:b.check,children:[A(w,{style:[b.checkText,l==="good"?b.good:null,l==="bad"?b.bad:null,l==="warn"?b.warn:null],testID:"clock-token-check",children:s}),A(B,{testID:"clock-token-check-done",accessibilityRole:"button",accessibilityLabel:e.status==="waiting"?"Stop the refresh check":"Dismiss",onPress:()=>n("stopTokenCheck"),hitSlop:{top:8,bottom:8,left:8,right:8},children:A(w,{style:b.checkDone,children:e.status==="waiting"?"Stop":"Done"})})]})}function Ca(e,t,r,n){if(e.status==="loop")return{text:`Refresh loop: ${e.newTokens} new tokens since the check started. The new tokens may already look expired to the app's clock.`,tone:"bad"};if(e.status==="refreshed"&&e.sameToken)return{text:`The app got the 401 and refreshed at ${ne(e.refreshedAt??n)}. The refresh sent back the same token, and the retry worked.`,tone:"good"};if(e.status==="refreshed"){let s=e.newIssuedBy?` by ${e.newIssuedBy}`:"",l=e.newLifetimeMs&&e.newLifetimeMs>0?`. The new token lasts ${W(e.newLifetimeMs)}`:"",c=e.kind==="401"&&e.forcedAt!==void 0?"The app got the 401 and refreshed":"Refreshed",u=e.failedRefreshes>0?` ${e.failedRefreshes===1?"One token request":`${e.failedRefreshes} token requests`} failed first (${e.lastRefreshError}).`:"";return{text:`${c} at ${ne(e.refreshedAt??n)}${s}${l}.${u}`,tone:u?"warn":"good"}}let o=n-e.startedAt,i=(e.staleAfterFailure>0?` It sent the old token again ${e.staleAfterFailure} time${e.staleAfterFailure===1?"":"s"}.`:"")+(e.failedRefreshes>0?` Its token request failed (${e.lastRefreshError}).`:"");if(o>6e4)return{text:`No new token after ${W(o)}. The app may refresh on its next action, or not at all.${i}`,tone:"warn"};if(e.kind==="401")return e.forcedAt===void 0?{text:`The next request to ${t?.host??"the API"} will get a 401. Use the app to send one.`}:{text:`The app got the 401. Waiting for a new token\u2026${i}`,tone:i?"warn":void 0};let a=t?.expiresAt!==void 0?t.expiresAt-r:void 0;return a!==void 0&&a>0?{text:`Expires in ${W(a)} on the app's clock. Waiting for a new token\u2026`}:{text:"Expired on the app's clock. Waiting for the app's next request\u2026"}}var b=X.create({row:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",gap:12,minHeight:56,paddingHorizontal:x.rowPadH,paddingVertical:10},rowText:{flex:1,minWidth:0},rowTitle:{color:x.color.text,fontSize:x.font.row},rowSubtitle:{color:x.color.textTertiary,fontSize:x.font.caption,marginTop:2},rowRight:{flexDirection:"row",alignItems:"center",gap:6},value:{color:x.color.textSecondary,fontSize:x.font.row,fontVariant:["tabular-nums"]},valueWarning:{color:x.color.warning},valueDanger:{color:x.color.danger},chevronOpen:{transform:[{rotate:"90deg"}]},emptyText:{color:x.color.textSecondary,fontSize:x.font.row},detail:{paddingHorizontal:x.rowPadH,paddingBottom:14,gap:4},detailLine:{color:x.color.textSecondary,fontSize:x.font.caption},buttons:{flexDirection:"row",gap:8,marginTop:8},button:{flex:1},hint:{color:x.color.textTertiary,fontSize:x.font.caption,marginTop:6},proLine:{flexDirection:"row",alignItems:"center",gap:8,marginTop:6},proHint:{marginTop:0,flexShrink:1},check:{flexDirection:"row",alignItems:"flex-start",gap:12,marginTop:8,marginHorizontal:x.labelInset},checkText:{flex:1,color:x.color.textSecondary,fontSize:x.font.caption,lineHeight:18},checkDone:{color:x.color.accent,fontSize:x.font.caption,fontWeight:"600"},good:{color:x.color.accent},warn:{color:x.color.warning},bad:{color:x.color.danger}});import{jsx as d,jsxs as I}from"react/jsx-runtime";var Br="#F59E0B";function Ur({snapshot:e,onAction:t,onReload:r}){let n=ya({minBottom:16}),[o,i]=Ee(null),[a,s]=Ee(null),l=ha()(),[c,u]=Ee(null),f=v=>u(v),g=(v,O)=>{i(null),t(v,O).catch(z=>{i(z instanceof Error?z.message:String(z))})},S=v=>s(O=>O===v?null:v);return e?I(Dt,{style:y.fill,contentContainerStyle:[y.content,{paddingBottom:n.bottom}],testID:"clock-scroll",keyboardShouldPersistTaps:"handled",children:[d(Oa,{snapshot:e}),o?d(m,{testID:"clock-error",children:d(yt,{tone:"danger",centered:true,children:o})}):null,I(m,{children:[d(Mr,{children:"Jump ahead"}),d(Ra,{run:g})]}),I(m,{children:[d(Re,{children:I(gt,{children:[I(m,{children:[d(Vr,{title:"Date & Time",testID:"clock-date-row",open:a==="date",onPress:()=>S("date"),value:d(Da,{snapshot:e})}),a==="date"?d(La,{snapshot:e,run:g,onDone:()=>s(null)}):null]},"date"),I(m,{style:y.row,children:[d(bt,{title:"Freeze",isPro:l}),d(_r,{value:e.mode==="frozen",testID:"clock-freeze",accessibilityLabel:"Freeze the clock",onValueChange:v=>v&&!l?f("Freeze"):g(v?"freeze":"resume")})]},"freeze"),I(m,{children:[d(Vr,{title:"Speed",pro:!l,testID:"clock-speed-row",open:a==="speed",onPress:()=>l?S("speed"):f("Speed"),value:d(w,{style:y.rowValue,children:qr(e)})}),a==="speed"?d(Na,{snapshot:e,run:g}):null]},"speed")]})}),d(yt,{children:"Only this app's clock changes. Screens pick up the new time when they next render, or all at once when you reload."})]}),e.tokens?d(Aa,{snapshot:e,run:g,openId:a,onToggle:S,isPro:l,onUpgrade:f}):null,d(Re,{children:I(gt,{children:[r?d(Wr,{label:"Reload App",testID:"clock-reload",onPress:r},"reload"):null,d(Wr,{label:"Use Real Time",accessibilityLabel:"Reset to real time",testID:"clock-reset",destructive:true,disabled:e.mode==="real",onPress:()=>g("reset")},"reset")]})}),I(m,{children:[d(Mr,{children:"Options"}),d(ja,{settings:e.settings,run:g,isPro:l,onUpgrade:f})]}),d(pa,{visible:c!==null&&!l,onClose:()=>u(null),featureName:c??void 0})]}):d(m,{style:y.waiting,testID:"clock-waiting",children:d(yt,{centered:true,children:"Waiting for the app's clock\u2026"})})}function bt({title:e,isPro:t}){return I(m,{style:y.titleRow,children:[d(w,{style:y.rowTitle,children:e}),t?null:d(fa,{})]})}function Oa({snapshot:e}){let{virtual:t,real:r}=V(e),n=Sr(e),o=e.mode!=="real",i=Gi(t-r),a=e.mode==="frozen"?" \xB7 Frozen":o&&e.rate!==1?` \xB7 ${qr(e)}`:"";return I(m,{style:y.hero,children:[d(w,{style:[y.heroTime,o?y.heroTimeActive:null],testID:"clock-hero-time",accessibilityLabel:`App clock ${ne(t)}`,children:ne(t)}),d(w,{style:y.heroDate,testID:"clock-hero-date",children:Yi(t)}),d(m,{testID:"clock-status",accessibilityLabel:`Clock status: ${n.label}${o?`, ${i}`:""}`,children:d(w,{style:[y.heroStatus,o?y.heroStatusActive:null],testID:"clock-offset",children:o?`${i}${a}`:"Real time"})})]})}var Hr=36e5,kt=24*Hr,Ea=[{ms:Hr,unit:"hour"},{ms:kt,unit:"day"},{ms:7*kt,unit:"week"},{ms:30*kt,unit:"month"}];function Ra({run:e}){return d(Re,{style:y.jumpBar,children:Ea.map((t,r)=>I(B,{testID:Xi(t.ms),accessibilityRole:"button",accessibilityLabel:`Jump ahead one ${t.unit}`,activeOpacity:.6,onPress:()=>e("shift",{by:t.ms}),style:[y.jump,r>0?y.jumpDivider:null],children:[d(w,{style:y.jumpAmount,children:"+1"}),d(w,{style:y.jumpUnit,children:t.unit})]},t.unit))})}function Vr({title:e,pro:t,value:r,open:n,onPress:o,testID:i}){return I(B,{testID:i,accessibilityRole:"button",accessibilityLabel:e,accessibilityState:{expanded:n},activeOpacity:.6,onPress:o,style:y.row,children:[d(bt,{title:e,isPro:!t}),I(m,{style:y.rowRight,children:[r,d(m,{style:n?y.chevronOpen:null,children:d(la,{size:16,color:k.color.textTertiary})})]})]})}function Da({snapshot:e}){let{virtual:t}=V(e,1e3);return d(w,{style:[y.rowValue,y.tabular],numberOfLines:1,children:Ce(t,false)})}function Wr({label:e,onPress:t,testID:r,destructive:n,disabled:o,accessibilityLabel:i}){return d(B,{testID:r,accessibilityRole:"button",accessibilityLabel:i??e,accessibilityState:{disabled:!!o},activeOpacity:.6,disabled:o,onPress:t,style:[y.row,o?y.rowDisabled:null],children:d(w,{style:[y.actionLabel,n?y.actionDestructive:null],children:e})})}var Pa=zt.filter(e=>["midnight","month-end","year-end"].includes(e.id));function La({snapshot:e,run:t,onDone:r}){let[n,o]=Ee(""),{virtual:i}=V(e,1e3),a=()=>n.trim()||Ar(i),s=e.mode==="frozen",l=c=>{t("setTime",{time:c,freeze:s}),r()};return I(m,{style:y.editor,children:[I(m,{style:y.inputRow,children:[d(Rt,{testID:"clock-time-input",accessibilityLabel:"Date and time",value:n,onChangeText:o,placeholder:Ar(i),placeholderTextColor:k.color.placeholder,autoCapitalize:"none",autoCorrect:false,returnKeyType:"done",onSubmitEditing:()=>l(a()),style:y.input}),d(ua,{label:"Set",testID:"clock-time-apply",accessibilityLabel:"Set this time",size:"md",variant:"primary",fullWidth:false,onPress:()=>l(a())})]}),d(w,{style:y.hint,children:"Year-month-day and 24-hour time, or +3d, -2h"}),d(m,{style:y.presets,children:Pa.map(c=>d(ca,{label:c.label,testID:`clock-preset-${c.id}`,onPress:()=>l(c.at(i,T))},c.id))})]})}var Jr=[{key:"1",label:"Normal"},{key:"10",label:"10\xD7"},{key:"60",label:"1 min/s"},{key:"3600",label:"1 hr/s"}];function qr(e){return e.mode==="real"||e.rate===1?"Normal":Jr.find(t=>Number(t.key)===e.rate)?.label??jt(e.rate)}function Na({snapshot:e,run:t}){let r=e.mode==="real"?"1":String(e.rate);return I(m,{style:y.editor,children:[d(m,{style:y.segmentRow,children:d(da,{tabs:Jr,activeKey:r,size:"sm",testIDPrefix:"clock-speed",onChange:n=>t("setRate",{rate:Number(n)})})}),d(w,{style:y.hint,children:"Taps, animations and timers keep real speed."})]})}var za=[{key:"showChip",title:"Show Floating Clock"},{key:"persist",title:"Keep After Reload",pro:true}];function ja({settings:e,run:t,isPro:r,onUpgrade:n}){return d(Re,{children:d(gt,{children:za.map(o=>{let i=!!o.pro&&!r;return I(m,{style:y.row,children:[d(bt,{title:o.title,isPro:!i}),d(_r,{value:i?false:e[o.key],testID:`clock-setting-${o.key}`,accessibilityLabel:o.title,onValueChange:a=>i?n(o.title):t("updateSettings",{[o.key]:a})})]},o.key)})})})}var y=X.create({fill:{flex:1},content:{paddingHorizontal:k.gutter,paddingTop:8,gap:k.groupGap},waiting:{flex:1,alignItems:"center",justifyContent:"center",padding:24},hero:{alignItems:"center",paddingTop:12},heroTime:{color:k.color.text,fontSize:56,fontWeight:"200",fontVariant:["tabular-nums"],letterSpacing:1},heroTimeActive:{color:Br},heroDate:{color:k.color.text,fontSize:17,fontWeight:"500",marginTop:2},heroStatus:{color:k.color.textTertiary,fontSize:k.font.caption,fontWeight:"500",marginTop:6},heroStatusActive:{color:k.color.textSecondary},jumpBar:{flexDirection:"row"},jump:{flex:1,alignItems:"center",paddingVertical:12},jumpDivider:{borderLeftWidth:X.hairlineWidth,borderLeftColor:k.color.separator},jumpAmount:{color:Br,fontSize:17,fontWeight:"600",fontVariant:["tabular-nums"]},jumpUnit:{color:k.color.textSecondary,fontSize:k.font.caption,marginTop:1},row:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",gap:12,minHeight:50,paddingHorizontal:k.rowPadH,paddingVertical:10},rowDisabled:{opacity:.4},rowTitle:{color:k.color.text,fontSize:k.font.row},titleRow:{flexDirection:"row",alignItems:"center",gap:8,flexShrink:1},rowRight:{flexDirection:"row",alignItems:"center",gap:6,flexShrink:1},rowValue:{color:k.color.textSecondary,fontSize:k.font.row},tabular:{fontVariant:["tabular-nums"]},chevronOpen:{transform:[{rotate:"90deg"}]},actionLabel:{color:k.color.accent,fontSize:k.font.row},actionDestructive:{color:k.color.danger},editor:{paddingHorizontal:k.rowPadH,paddingBottom:14,gap:10},inputRow:{flexDirection:"row",alignItems:"center",gap:8},input:{flex:1,color:k.color.text,fontFamily:ma,fontSize:15,backgroundColor:k.color.bg,borderRadius:k.radius.input,borderWidth:1,borderColor:k.color.border,paddingHorizontal:12,paddingVertical:8},hint:{color:k.color.textTertiary,fontSize:k.font.caption},presets:{flexDirection:"row",flexWrap:"wrap",gap:6},segmentRow:{flexDirection:"row"}});import{jsx as Ma}from"react/jsx-runtime";var _a=jr.actions;async function Fa(e,t){let r=_a[e];if(!r)throw new Error(`Unknown clock action: ${e}`);return r(t)}function Ba(){fr().then(()=>aa("auto","buoy clock")).catch(()=>{})}function Kr(){Or(()=>{pt(),Te()},[]);let[e,t]=ia(C);return Or(()=>pe(()=>t(C())),[]),Ma(Ur,{snapshot:e,onAction:Fa,onReload:Ba})}import{jsx as Ua}from"react/jsx-runtime";var Zr=oa({id:"clock",name:"CLOCK",description:"Travel to any date, freeze or speed up the app's clock",slot:"both",color:ra,icon:({size:e,color:t})=>Ua(ta,{size:e,color:t}),component:Kr,modal:{subtitle:"override the app's date & time"}}),Ha=na(Zr);import{ClockToolIcon as Va,CLOCK_TOOL_ICON_COLOR as Wa}from"@buoy-gg/shared-ui/web";var Ja=typeof navigator<"u"&&navigator.product==="ReactNative",qa=(()=>{try{return globalThis.Capacitor?.isNativePlatform?.()===true}catch{return false}})();Ja||qa?(Eo(Et),Ir(),typeof St<"u"&&St&&pt()):typeof globalThis.document<"u"&&Ir();export{Oe as CLOCK_CHIP_ID,Wa as CLOCK_TOOL_ICON_COLOR,Kr as ClockBody,Cr as ClockChip,Va as ClockToolIcon,Ur as ClockToolView,zt as TIME_PRESETS,pt as bootClock,jr as clockSyncAdapter,Zr as clockToolPreset,Ha as createClockTool,Lr as failNextRequest,ie as formatDuration,ct as freeze,C as getClockSnapshot,$e as getTokenReport,xe as inspectToken,dr as isClockOverridden,Pr as jumpToTokenExpiry,ea as openClockChip,_e as parseDuration,ji as previewJump,$ as realNow,ft as reset,dt as resume,mr as setRate,hr as setTime,ut as shift,Te as startTokenWatch,zr as stopTokenCheck,pe as subscribeClock,H as tokenFingerprint,yr as updateSettings,V as useLiveClock,cr as virtualNow,He as withRealClock};
|
|
1
|
+
"use client";import{a as Rr,b as Lr,c as st,d as M,e as A,f as at,g as zr,h as Nr,i as Dr,j as Or,k as Mr,l as Pr,m as Fr,o as jr,p as lt,q as _r,r as Br,s as Ur}from"./chunks/chunk-FCZBPAZF.mjs";var ct={};Rr(ct,{AccessibilityInfo:()=>Jr,ActivityIndicator:()=>Kn,Alert:()=>Yn,Animated:()=>ht,AppRegistry:()=>Kr,AppState:()=>Zr,Appearance:()=>qr,BackHandler:()=>Gr,Button:()=>Zn,CheckBox:()=>pn,Clipboard:()=>Yr,DeviceEventEmitter:()=>In,Dimensions:()=>Xr,Easing:()=>Qr,FlatList:()=>hn,I18nManager:()=>en,Image:()=>mn,ImageBackground:()=>gn,InteractionManager:()=>rn,Keyboard:()=>tn,KeyboardAvoidingView:()=>yn,LayoutAnimation:()=>nn,Linking:()=>on,LogBox:()=>En,Modal:()=>Jn,NativeEventEmitter:()=>sn,NativeModules:()=>Wr,PanResponder:()=>an,Picker:()=>bn,PixelRatio:()=>ln,Platform:()=>cn,Pressable:()=>Wn,ProgressBar:()=>kn,RefreshControl:()=>xn,SafeAreaView:()=>wn,ScrollView:()=>gt,SectionList:()=>vn,Share:()=>un,StatusBar:()=>An,StyleSheet:()=>q,Switch:()=>qn,Text:()=>x,TextInput:()=>mt,Touchable:()=>Sn,TouchableHighlight:()=>Vn,TouchableNativeFeedback:()=>Tn,TouchableOpacity:()=>P,TouchableWithoutFeedback:()=>Hn,UIManager:()=>dn,Vibration:()=>fn,View:()=>m,VirtualizedList:()=>$n,YellowBox:()=>Cn,findNodeHandle:()=>Gn,unstable_createElement:()=>Hr,useColorScheme:()=>Rn,useLocaleContext:()=>Ln,useWindowDimensions:()=>zn});Lr(ct,Vr);import*as Vr from"react-native-web";import{unstable_createElement as Hr,NativeModules as Wr,AccessibilityInfo as Jr,Appearance as qr,AppRegistry as Kr,AppState as Zr,BackHandler as Gr,Clipboard as Yr,Dimensions as Xr,Easing as Qr,I18nManager as en,Keyboard as tn,InteractionManager as rn,LayoutAnimation as nn,Linking as on,NativeEventEmitter as sn,PanResponder as an,PixelRatio as ln,Platform as cn,Share as un,UIManager as dn,Vibration as fn,CheckBox as pn,FlatList as hn,Image as mn,ImageBackground as gn,KeyboardAvoidingView as yn,Picker as bn,ProgressBar as kn,RefreshControl as xn,SafeAreaView as wn,SectionList as vn,StatusBar as An,Touchable as Sn,TouchableNativeFeedback as Tn,VirtualizedList as $n,YellowBox as Cn,LogBox as En,DeviceEventEmitter as In,useColorScheme as Rn,useLocaleContext as Ln,useWindowDimensions as zn}from"react-native-web";import*as C from"react-native-web";import{createElement as we,forwardRef as ut,useCallback as Nn,useRef as Dn}from"react";import{useEffect as On,useState as Mn}from"react";import{createPortal as Pn}from"react-dom";var Fn='-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif';import{jsx as jn}from"react/jsx-runtime";var Q=Symbol.for("@buoy-gg/portal-host"),dt=e=>{if(!(e instanceof Element))return false;if(e.closest("input, textarea, select"))return true;let t=e.closest("[contenteditable]")?.getAttribute("contenteditable")?.toLowerCase();return t===""||t==="true"||t==="plaintext-only"};function ft(){let e=document;if(e[Q])return e[Q].host;let t=document.createElement("div");t.dataset.buoyPortalHost="",Object.assign(t.style,{position:"fixed",inset:"0",zIndex:"2147483647",pointerEvents:"none",fontFamily:Fn});let r=()=>{let u=document.fullscreenElement,h=u&&u.tagName!=="CANVAS"?u:document.body;t.parentElement!==h&&h.appendChild(t)},n=new Map,o=u=>{(!t.contains(u.target)||!dt(u.target))&&n.set(u.code||u.key,{key:u.key,code:u.code,location:u.location,keyCode:u.keyCode,which:u.which,altKey:u.altKey,ctrlKey:u.ctrlKey,metaKey:u.metaKey,shiftKey:u.shiftKey})},i=u=>{n.delete(u.code||u.key)},s=()=>n.clear(),a=()=>{let u=[...n.values()];n.clear();for(let h of u)document.dispatchEvent(new KeyboardEvent("keyup",{...h,bubbles:true}))},l=u=>{dt(u.target)&&u.stopPropagation()},c=u=>u.stopPropagation();return r(),document.addEventListener("fullscreenchange",r),document.addEventListener("keydown",o,true),document.addEventListener("keyup",i,true),window.addEventListener("blur",s),t.addEventListener("focusin",a),t.addEventListener("keydown",l),t.addEventListener("keyup",l),t.addEventListener("keypress",l),t.addEventListener("wheel",c,{passive:true}),e[Q]={host:t,users:0,dispose:()=>{document.removeEventListener("fullscreenchange",r),document.removeEventListener("keydown",o,true),document.removeEventListener("keyup",i,true),window.removeEventListener("blur",s),t.remove(),delete e[Q]}},t}function _n({children:e}){let[t,r]=Mn(null);return On(()=>{let n=ft(),o=document[Q];return o.users++,r(n),()=>{--o.users===0&&o.dispose()}},[]),t?Pn(jn("div",{"data-buoy-root":"",style:{display:"contents",pointerEvents:"auto"},children:e}),t):null}var W=C,Bn=["shadowColor","shadowOffset","shadowOpacity","shadowRadius","textShadowColor","textShadowOffset","textShadowRadius"],J=e=>typeof e=="number"?`${e}px`:e;function ve(e){if(Array.isArray(e)){let h=e.map(ve);return h.some((T,$)=>T!==e[$])?h:e}if(!e||typeof e!="object"||!Bn.some(h=>e[h]!=null))return e;let{shadowColor:t,shadowOffset:r,shadowOpacity:n,shadowRadius:o,textShadowColor:i,textShadowOffset:s,textShadowRadius:a,...l}=e;if(t!=null||r!=null||n!=null||o!=null){let h=t??"black",T=n==null?h:`color-mix(in srgb, ${h} ${Math.min(n,1)*100}%, transparent)`,$=`${J(r?.width??0)} ${J(r?.height??0)} ${J(o??0)} ${T}`;l.boxShadow=typeof l.boxShadow=="string"?`${l.boxShadow}, ${$}`:l.boxShadow??$}let{width:c=0,height:u=0}=s??{};if(i&&(c||u||a)){let h=`${J(c)} ${J(u)} ${J(a??0)} ${i}`;l.textShadow=l.textShadow?`${l.textShadow}, ${h}`:h}return l}var Un=W.StyleSheet.create({auto:{pointerEvents:"auto"},none:{pointerEvents:"none"},"box-none":{pointerEvents:"box-none"},"box-only":{pointerEvents:"box-only"}});function pt(e,t){if(typeof e=="function")return n=>pt(e(n),t);let r=ve(e);return t?[r,Un[t]]:r}var q={...W.StyleSheet,create:e=>W.StyleSheet.create(Object.fromEntries(Object.entries(e).map(([t,r])=>[t,ve(r)])))};function R(e){let t=ut((n,o)=>{let{accessibilityState:i,accessibilityValue:s,pointerEvents:a,...l}=n;for(let u of["busy","checked","disabled","expanded","selected"])i?.[u]!==void 0&&l[`aria-${u}`]===void 0&&(l[`aria-${u}`]=i[u]);for(let[u,h]of Object.entries({min:"valuemin",max:"valuemax",now:"valuenow",text:"valuetext"}))s?.[u]!==void 0&&l[`aria-${h}`]===void 0&&(l[`aria-${h}`]=s[u]);let c=pt(l.style,a);return c!==l.style&&(l.style=c),we(e,{...l,ref:o})}),r=e.State;return r&&Object.assign(t,{State:r}),t.displayName=e.displayName??e.name??"NativeWebView",t}var m=R(C.View),x=R(C.Text),ht={...W.Animated,View:W.Animated.createAnimatedComponent(m),Text:W.Animated.createAnimatedComponent(x)},mt=R(C.TextInput),P=R(C.TouchableOpacity),Vn=R(C.TouchableHighlight),Hn=R(C.TouchableWithoutFeedback),Wn=R(C.Pressable),gt=R(C.ScrollView),yt=ut((e,t)=>{let r=Dn(null),n=Nn(o=>{if(o){let i=o;for(;i.parentElement&&i.parentElement!==document.body;)i=i.parentElement;i.parentElement===document.body&&(r.current=i,Object.assign(i.style,{position:"relative",zIndex:"2147483647",pointerEvents:"auto"}),ft().appendChild(i))}else r.current&&(document.body.appendChild(r.current),r.current=null);typeof t=="function"?t(o):t&&(t.current=o)},[t]);return we(_n,null,we(C.Modal,{...e,ref:n}))});yt.displayName="Modal";var Jn=R(yt),qn=R(C.Switch),Kn=R(C.ActivityIndicator),Zn=R(C.Button),Gn=C.findNodeHandle,Yn={alert(e,t,r,n){if(typeof document>"u")return;let o=document.createElement("dialog");o.dataset.buoyRoot="",o.setAttribute("aria-label",e),o.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 i=document.createElement("h2");if(i.textContent=e,i.style.cssText="font-size:18px;margin:0 0 12px",o.appendChild(i),t){let c=document.createElement("p");c.textContent=t,c.style.cssText="line-height:1.5;white-space:pre-wrap;margin:0 0 20px",o.appendChild(c)}let s=document.createElement("div");s.style.cssText="display:flex;justify-content:flex-end;flex-wrap:wrap;gap:8px";let a=r?.length?r:[{text:"OK"}],l=()=>{o.close?.(),o.remove()};for(let c of a){let u=document.createElement("button");u.type="button",u.textContent=c.text??"OK",u.style.cssText=`padding:9px 14px;border:1px solid #64748b;border-radius:7px;color:white;background:${c.style==="destructive"?"#a52b38":"#283a4d"};cursor:pointer;font:inherit`,u.onclick=()=>{l(),c.onPress?.()},s.appendChild(u)}o.addEventListener("cancel",c=>{c.preventDefault(),n?.cancelable!==false&&(l(),n?.onDismiss?.())}),o.appendChild(s),document.body.appendChild(o),o.showModal?o.showModal():o.setAttribute("open","")}};var Ae=Object.freeze({mode:"real",anchorReal:0,anchorVirtual:0,rate:1}),Se=.1,Te=86400,Xn=864e13;function N(e,t){return e.mode==="real"?t:e.mode==="frozen"?e.anchorVirtual:e.anchorVirtual+(t-e.anchorReal)*e.rate}function Qn(e,t){return N(e,t)-t}function K(e){if(!Number.isFinite(e)||Math.abs(e)>Xn)throw new RangeError(`Not a valid time: ${e}`);return Math.round(e)}function $e(e,t,r,n=false){return{mode:n?"frozen":"running",anchorReal:t,anchorVirtual:K(r),rate:e.mode==="real"?1:e.rate}}function eo(e,t,r){if(!Number.isFinite(r))throw new RangeError("Jump must be a number of ms");return $e(e,t,N(e,t)+r,e.mode==="frozen")}function to(e,t,r){return $e(e,t,r??N(e,t),true)}function ro(e,t){return e.mode!=="frozen"?e:{...e,mode:"running",anchorReal:t}}function no(e,t,r){if(!Number.isFinite(r)||r<Se||r>Te)throw new RangeError(`Speed must be between ${Se}\xD7 and ${Te}\xD7`);return e.mode==="real"&&r===1?e:{mode:"running",anchorReal:t,anchorVirtual:K(N(e,t)),rate:r}}function bt(e){let t=e;return!!t&&(t.mode==="real"||t.mode==="running"||t.mode==="frozen")&&Number.isFinite(t.anchorReal)&&Number.isFinite(t.anchorVirtual)&&Number.isFinite(t.rate)&&t.rate>=Se&&t.rate<=Te}var oo={ms:1,millisecond:1,milliseconds:1,s:1e3,sec:1e3,secs:1e3,second:1e3,seconds:1e3,m:6e4,min:6e4,mins:6e4,minute:6e4,minutes:6e4,h:36e5,hr:36e5,hrs:36e5,hour:36e5,hours:36e5,d:864e5,day:864e5,days:864e5,w:6048e5,wk:6048e5,week:6048e5,weeks:6048e5,mo:30*864e5,month:30*864e5,months:30*864e5,y:365*864e5,yr:365*864e5,year:365*864e5,years:365*864e5};function Ce(e){if(typeof e=="number"){if(!Number.isFinite(e))throw new RangeError("Duration must be finite");return Math.round(e)}let t=String(e).trim().toLowerCase();if(!t)throw new RangeError("Duration is empty");let r=1;if((t[0]==="+"||t[0]==="-"||t[0]==="\u2212")&&(r=t[0]==="+"?1:-1,t=t.slice(1).trim()),/^\d+(\.\d+)?$/.test(t))return r*Math.round(Number(t));let n=/(\d+(?:\.\d+)?)\s*([a-z]+)/g,o=0,i="",s;for(;s=n.exec(t);){let a=oo[s[2]];if(a===void 0)throw new RangeError(`Unknown time unit "${s[2]}" in "${e}"`);o+=Number(s[1])*a,i+=s[0]}if(!i||i.replace(/\s/g,"")!==t.replace(/[\s,]/g,""))throw new RangeError(`Could not read "${e}" as a duration. Try "+1d", "-2h30m" or "90s".`);return r*Math.round(o)}function ee(e,{signed:t=true}={}){let r=e<0?"\u2212":"+",n=Math.abs(Math.round(e));if(n<1e3)return t&&n>0?`${r}${n}ms`:"0s";let o=[],i=[["y",365*864e5],["d",864e5],["h",36e5],["m",6e4],["s",1e3]];for(let[s,a]of i)if(n>=a&&(o.push(`${Math.floor(n/a)}${s}`),n%=a),o.length===2)break;return`${t?r:""}${o.join(" ")}`}function kt(e,t,r){if(typeof e=="number")return K(e);let n=String(e).trim();if(!n)throw new RangeError("Time is empty");if(/^now$/i.test(n))return t;if(/^[+\-−]/.test(n))return K(t+Ce(n));if(/^\d{11,}$/.test(n))return K(Number(n));let o=n.replace(/^(\d{4}-\d{2}-\d{2})[ ](\d{2}:\d{2})/,"$1T$2"),i=r(o);if(!Number.isFinite(i))throw new RangeError(`Could not read "${e}" as a time. Use ISO 8601 like 2026-12-31T23:59:50, epoch ms, or "+1d".`);return K(i)}var Ee=1e4,xt=[{id:"midnight",label:"Before midnight",hint:"23:59:50 tonight",at(e,t){let r=new t(e);return r.setHours(24,0,0,0),r.getTime()-Ee}},{id:"month-end",label:"Month end",hint:"last day, 23:59:50",at(e,t){let r=new t(e);return r.setMonth(r.getMonth()+1,1),r.setHours(0,0,0,0),r.getTime()-Ee}},{id:"year-end",label:"New Year's Eve",hint:"Dec 31, 23:59:50",at(e,t){let r=new t(e);return r.setFullYear(r.getFullYear()+1,0,1),r.setHours(0,0,0,0),r.getTime()-Ee}},{id:"tomorrow-9",label:"Tomorrow 9 AM",hint:"start of a business day",at(e,t){let r=new t(e);return r.setDate(r.getDate()+1),r.setHours(9,0,0,0),r.getTime()}},{id:"leap-day",label:"Leap day",hint:"next Feb 29, 09:00",at(e,t){let r=new t(e).getFullYear();for(;;){let n=r%4===0&&r%100!==0||r%400===0,o=new t(r,1,29,9,0,0,0).getTime();if(n&&o>e)return o;r+=1}}}],vs=[{label:"1m",ms:6e4},{label:"15m",ms:15*6e4},{label:"1h",ms:36e5},{label:"1d",ms:864e5},{label:"7d",ms:7*864e5},{label:"30d",ms:30*864e5},{label:"1y",ms:365*864e5}];function wt(e){return e===3600?"1h/s":e===600?"10m/s":e===60?"1m/s":`${Number.isInteger(e)?e:e.toFixed(1)}\xD7`}import{devToolsStorageKeys as io,persistentStorage as vt}from"@buoy-gg/shared-ui/web";function so(){try{let e=globalThis.localStorage;return e?At(e.getItem(Ie)):void 0}catch{return}}var te={persist:true,showChip:true,fireTimersOnJump:true},ao=2*6e4,Ie=io.clock.state();function At(e){if(!e)return null;try{let t=JSON.parse(e);if(!t||t.v!==1)return null;let r=t.settings??{},n=t.reload&&bt(t.reload.anchor)&&typeof t.reload.at=="number"?{anchor:t.reload.anchor,at:t.reload.at}:void 0;return{v:1,anchor:bt(t.anchor)?t.anchor:null,...n?{reload:n}:{},settings:{persist:typeof r.persist=="boolean"?r.persist:te.persist,showChip:typeof r.showChip=="boolean"?r.showChip:te.showChip,fireTimersOnJump:typeof r.fireTimersOnJump=="boolean"?r.fireTimersOnJump:te.fireTimersOnJump}}}catch{return null}}async function lo(){try{return At(await vt.getItem(Ie))}catch{return null}}var Re=Promise.resolve();function Le(e){let t=JSON.stringify(e);return Re=Re.then(()=>vt.setItem(Ie,t)).catch(()=>{}),Re.then(()=>{})}import{dispatchToolAction as co}from"@buoy-gg/shared-ui/web";import{loadToolModule as uo}from"@buoy-gg/shared-ui/web/utils";var St="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",le={};for(let e=0;e<St.length;e++)le[St[e]]=e;le["-"]=62;le._=63;function ze(e){let t=e.replace(/=+$/,""),r=[],n=0,o=0;for(let i=0;i<t.length;i++){let s=le[t[i]];if(s===void 0)return null;n=n<<6|s,o+=6,o>=8&&(o-=8,r.push(n>>o&255))}return r}function fo(e){let t="";for(let r=0;r<e.length;){let n=e[r],o,i;if(n<128)o=n,i=0;else if(n>=192&&n<224)o=n&31,i=1;else if(n>=224&&n<240)o=n&15,i=2;else if(n>=240&&n<248)o=n&7,i=3;else return null;for(let s=1;s<=i;s++){let a=e[r+s];if(a===void 0||(a&192)!==128)return null;o=o<<6|a&63}t+=String.fromCodePoint(o),r+=i+1}return t}function Ne(e){let t=ze(e);return t?Tt(t):null}function Tt(e){let t=fo(e);if(!t||t[0]!=="{")return null;try{let r=JSON.parse(t);return r&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}function De(e){let t=typeof e=="string"&&e.trim()!==""?Number(e):e;return typeof t=="number"&&Number.isFinite(t)&&t>0?t*1e3:void 0}function re(e,t){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e<1e11?e*1e3:e;if(typeof e=="string"&&e.trim()!==""){let r=e.trim();if(/^\d+(\.\d+)?$/.test(r))return re(Number(r),t);let n=t(r);return Number.isFinite(n)?n:void 0}}function po(e){let t=typeof e=="string"&&/^\d+(\.\d+)?$/.test(e.trim())?Number(e):e;return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}var ho=/^[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]*$/,mo=/^[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]*\.[A-Za-z0-9_-]*\.[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]*$/,$t=/^v([1-4])\.(local|public)\.([A-Za-z0-9_-]+)(?:\.([A-Za-z0-9_-]+))?$/,go={1:256,2:64,3:96,4:64};function F(e){if(typeof e=="string"&&e)return e;if(Array.isArray(e)){let t=e.filter(r=>typeof r=="string");return t.length?t.join(", "):void 0}}function yo(e,t){let r=e.iss??"",n=e.use;if(r.includes("securetoken.google.com"))return"Firebase ID token";if(r.includes("firebaseappcheck"))return"Firebase App Check token";if(r.includes("cognito-idp"))return n?`Cognito ${n} token`:"Cognito token";if(r.includes("appleid.apple.com"))return"Sign in with Apple token";if(r.includes("accounts.google.com"))return"Google ID token";if(r.includes(".auth0.com")||r.includes("auth0"))return"Auth0 token";if(r.includes("clerk"))return"Clerk session token";if(r.includes("supabase")||r.includes("/auth/v1"))return"Supabase access token";if(r.includes("okta"))return"Okta token";if(r.includes("/realms/"))return"Keycloak token";if(r.includes("login.microsoftonline.com")||r.includes("sts.windows.net"))return"Microsoft Entra token";let o=typeof t?.typ=="string"?t.typ.toLowerCase():"";if(o==="at+jwt"||o==="application/at+jwt")return"OAuth access token"}function bo(e,t){let r={iss:F(e.iss),aud:F(e.aud),sub:F(e.sub),scope:F(e.scope??e.scp),use:F(e.token_use)},n=De(e.exp);return{claims:r,issuedAt:De(e.iat),notBefore:De(e.nbf),expiresAt:n,expirySource:n?t:void 0}}function ko(e){let[t,r]=e.split("."),n=Ne(t);if(!n||typeof n.alg!="string"&&typeof n.typ!="string")return null;let o=Ne(r);if(!o)return null;let i=typeof n.alg=="string"?n.alg:void 0,s=bo(o,"exp claim");return s.claims.alg=i,!s.claims.use&&typeof n.typ=="string"&&n.typ.toUpperCase()!=="JWT"&&(s.claims.use=n.typ),{format:"jwt",formatLabel:i?`JWT \xB7 ${i}`:"JWT",hint:yo(s.claims,n),...s}}function xo(e){let t=Ne(e.split(".")[0]);return!t||typeof t.enc!="string"?null:{format:"jwe",formatLabel:"Encrypted JWT",claims:{alg:typeof t.alg=="string"?t.alg:void 0}}}function wo(e,t){let r=$t.exec(e);if(!r)return null;let[,n,o,i]=r;if(o==="local")return{format:"paseto-local",formatLabel:`PASETO v${n} (encrypted)`,claims:{}};let s=ze(i),a=go[n],l=s&&s.length>a?Tt(s.slice(0,s.length-a)):null,c={format:"paseto-public",formatLabel:`PASETO v${n}`,claims:{}};return l&&(c.claims={iss:F(l.iss),aud:F(l.aud),sub:F(l.sub)},c.issuedAt=re(l.iat,t),c.notBefore=re(l.nbf,t),c.expiresAt=re(l.exp,t),c.expiresAt&&(c.expirySource="exp claim")),c}function vo(e){if(!e.startsWith("gAAAAA")||e.length<76)return null;let t=ze(e);if(!t||t[0]!==128||t.length<73||(t.length-57)%16!==0)return null;let r=0;for(let n=1;n<=8;n++)r=r*256+t[n];return r<978307200||r>4102444800?null:{format:"fernet",formatLabel:"Fernet",claims:{},issuedAt:r*1e3}}var Ao=[{test:/^ya29\./,hint:"Google OAuth access token"},{test:/^gh[opsu]_/,hint:"GitHub token"},{test:/^github_pat_/,hint:"GitHub token"},{test:/^xox[abeprs]-/,hint:"Slack token"},{test:/^EAA[A-Za-z0-9]{40,}/,hint:"Facebook access token"},{test:/^shp(at|ca|pa|ss)_/,hint:"Shopify token"},{test:/^(sk|rk|pk)_(live|test)_/,hint:"Stripe API key",neverExpires:true},{test:/^AIza[0-9A-Za-z_-]{35}$/,hint:"Google API key",neverExpires:true}];function ce(e,t=Date.parse){let r=e.trim().replace(/^"(.*)"$/,"$1");if(r.length<16||/\s/.test(r))return null;if(ho.test(r)){let i=ko(r);if(i)return i}if(mo.test(r)){let i=xo(r);if(i)return i}if(r.startsWith("v")&&$t.test(r)){let i=wo(r,t);if(i)return i}let n=vo(r);if(n)return n;let o=Ao.find(i=>i.test.test(r));return{format:"opaque",formatLabel:"Opaque",hint:o?.hint,neverExpires:o?.neverExpires,claims:{}}}function So(e){return!!e&&e.format!=="opaque"}function j(e){let t=2166136261;for(let r=0;r<e.length;r++)t^=e.charCodeAt(r),t=Math.imul(t,16777619)>>>0;return t.toString(16).padStart(8,"0")}function Oe(e){let t=/^([a-z][a-z0-9+.-]*:\/\/[^/?#]+)/i.exec(e);return t?t[1].toLowerCase():null}function To(e){let t=Oe(e);return t?t.replace(/^[a-z][a-z0-9+.-]*:\/\//,""):"unknown"}function Me(e){return e.replace(/^[a-z][a-z0-9+.-]*:\/\/[^/?#]+/i,"").split(/[?#]/)[0]||"/"}function $o(e){let t=e.split("#")[0].split("?")[1];if(!t)return[];let r=[];for(let n of t.split("&")){let o=n.indexOf("=");if(!(o<=0))try{r.push([decodeURIComponent(n.slice(0,o)),decodeURIComponent(n.slice(o+1))])}catch{}}return r}var Pe=/(token|jwt|session|auth|appcheck|api[-_]?key|apikey|credential|bearer)/i,Co=new Set(["authorization","cookie","dpop","idempotency-key","x-request-id","x-correlation-id","www-authenticate","proxy-authenticate","x-csrf-token","x-xsrf-token"]),Ct=new Set(["access_token","accesstoken","id_token","token","auth","auth_token","jwt","session","session_token"]),Eo=new Set(["bearer","token","jwt","dpop","oauth","firebase"]);function Et(e){let t={};if(!e)return t;for(let[r,n]of Object.entries(e))typeof n=="string"?t[r.toLowerCase()]=n:Array.isArray(n)&&(t[r.toLowerCase()]=n.join(", "));return t}function Io(e){let t=[];for(let r of e.split(";")){let n=r.indexOf("=");n<=0||t.push([r.slice(0,n).trim(),r.slice(n+1).trim()])}return t}function ne(e,t,r){let n=ce(e,r);return n&&(So(n)||n.hint||t)?n:null}function It(e,t){let r=[],n=Et(e.requestHeaders),o=n.authorization;if(o){let i=/^(\S+)\s+(\S+)$/.exec(o.trim()),s=i?i[1]:void 0,a=i?i[2]:o.trim();if(!s||Eo.has(s.toLowerCase())){let l=ne(a,true,t)??(s&&!/^(null|undefined)$/i.test(a)?{format:"opaque",formatLabel:"Opaque",claims:{}}:null);l&&r.push({location:"authorization",name:"Authorization",scheme:s,fp:j(a),info:l})}}for(let[i,s]of Object.entries(n)){if(Co.has(i)||!Pe.test(i))continue;let a=s.replace(/^bearer\s+/i,""),l=ne(a,true,t);l&&r.push({location:"header",name:i,fp:j(a),info:l})}if(n.cookie)for(let[i,s]of Io(n.cookie)){let a=ne(s,Pe.test(i)||/^(sid|sess)/i.test(i),t);a&&r.push({location:"cookie",name:i,fp:j(s),info:a})}for(let[i,s]of $o(e.url)){let a=ne(s,Ct.has(i.toLowerCase()),t);a&&Ct.has(i.toLowerCase())&&r.push({location:"query",name:i,fp:j(s),info:a})}return r}var Ro=/^(access_?token|accesstoken|token|jwt|auth_?token|session_?token|sessiontoken)$/i,Rt=/^(id_?token|idtoken)$/i,ue=/^(refresh_?token|refreshtoken)$/i,Lo=["expires_in","expiresIn","ExpiresIn","expires","ttl"],zo=["expires_at","expiresAt","ExpiresAt","expiration","Expiration","expiry","expirationTime","expiration_time","access_token_expires_at","accessTokenExpiresAt","accessTokenExpiry"],No=["refresh_expires_in","refresh_token_expires_in","refreshTokenExpiresIn","refreshExpiresIn"],Do=["refresh_expires_at","refreshTokenExpiresAt","refresh_token_expires_at"];function Oo(e){if(typeof e!="string")return e;let t=e.trim();if(!(t.startsWith("{")||t.startsWith("[")))return null;try{return JSON.parse(t)}catch{return null}}function Fe(e,t,r){if(t>4||!e||typeof e!="object")return;if(Array.isArray(e)){for(let o of e.slice(0,5))Fe(o,t+1,r);return}let n=e;for(let[o,i]of Object.entries(n))typeof i=="string"&&(Ro.test(o)||Rt.test(o)||ue.test(o))?r.push({key:o,value:i,holder:n}):i&&typeof i=="object"&&Fe(i,t+1,r)}function Mo(e){return ue.test(e)?"refresh":Rt.test(e)?"id":/session/i.test(e)?"session":"access"}function Lt(e,t,r,n,o){for(let i of t){let s=po(e[i]);if(s!==void 0)return{expiresAt:n+s*1e3,source:i,lifetimeMs:s*1e3}}for(let i of r){let s=re(e[i],o);if(s!==void 0)return{expiresAt:s,source:i}}return{}}function Po(e){let t=e["set-cookie"];return t?t.split(/,(?=\s*[A-Za-z0-9!#$%&'*+.^_`|~-]+=)/).map(r=>r.trim()):[]}function Fo(e,t){if(e.status===void 0||e.status>=400)return[];let r=`${e.method.toUpperCase()} ${Me(e.url)}`,n=e.timestamp+(e.duration??0),o=[],i=Oo(e.responseData);if(i){let a=[];Fe(i,0,a);let l=new Map;for(let c of a.filter(u=>ue.test(u.key))){let u=ce(c.value,t);if(!u)continue;let h=Lt(c.holder,No,Do,n,t);l.set(c.holder,{fp:j(c.value),expiresAt:u.expiresAt??h.expiresAt,formatLabel:u.formatLabel})}for(let c of a){if(ue.test(c.key))continue;let u=ce(c.value,t);if(!u)continue;let h=Lt(c.holder,Lo,zo,n,t);o.push({fp:j(c.value),info:u,role:Mo(c.key),expiresAt:h.expiresAt,expirySource:h.source,lifetimeMs:h.lifetimeMs,issuedBy:r,refresh:l.get(c.holder)})}}let s=Et(e.responseHeaders);for(let a of Po(s)){let[l,...c]=a.split(";"),u=l.indexOf("=");if(u<=0)continue;let h=l.slice(0,u).trim(),T=l.slice(u+1).trim(),$=ne(T,Pe.test(h)||/^(sid|sess)/i.test(h),t);if(!$||T===""||T.toLowerCase()==="deleted")continue;let E,O,U;for(let Cr of c){let[Er,...Ir]=Cr.split("="),ot=Er.trim().toLowerCase(),xe=Ir.join("=").trim();if(ot==="max-age"&&/^-?\d+$/.test(xe))U=Number(xe)*1e3,E=n+U,O="Max-Age";else if(ot==="expires"&&O!=="Max-Age"){let it=t(xe);Number.isFinite(it)&&(E=it,O="Expires")}}o.push({fp:j(T),info:$,role:"cookie",cookie:h,expiresAt:$.expiresAt??E,expirySource:$.expiresAt?$.expirySource:O,lifetimeMs:$.expiresAt?void 0:U,issuedBy:r})}return o}var je=e=>M.parse(e),zt=4,Nt=2e4,jo=8,_o=8,Bo=200,Uo=1e3,I=new Map,Z=new Map,Vo=new Set,Ho=new Set,Dt=new Set,Wo=/(token|refresh|oauth|session|auth\/)/i,f=null,de=new Set,fe=true,_e=null,Be=new Set,Ue=false;function oe(){Ue||(Ue=true,Promise.resolve().then(()=>{Ue=false,Be.forEach(e=>e())}))}function Jo(e){return Be.add(e),()=>{Be.delete(e)}}function Ve(e,t){if(e.has(t))return false;if(e.size>=Uo){let r=e.values().next().value;r!==void 0&&e.delete(r)}return e.add(t),true}function He(e,t){return`${e}|${t.location}:${t.name.toLowerCase()}`}function Ot(e,t){let r=t?.lifetimeMs!==void 0&&t.expiresAt!==void 0,n=r?t.expiresAt:e.expiresAt??t?.expiresAt,o=e.expiresAt??(r?t.observedReal+t.lifetimeMs:t?.expiresAt),i=r?t.expirySource:e.expiresAt?e.expirySource:t?.expirySource,s=r?t.lifetimeMs:e.expiresAt!==void 0&&e.issuedAt!==void 0?e.expiresAt-e.issuedAt:void 0;return{expiresAt:n,serverExpiresAt:o,source:i,lifetimeMs:s}}function We(e,t,r,n,o){let i=Z.get(t),s=Ot(r,i),a=e.fp!==t;a&&(e.history.unshift({fp:e.fp,firstSeenReal:e.firstSeenReal,expiresAt:e.expiresAt}),e.history.length=Math.min(e.history.length,_o),e.fp=t,e.firstSeenReal=n,e.firstSeenApp=o,e.uses=0,e.expiredSends=0,e.rejected=0),e.info=r,e.role=i?.role??(a?void 0:e.role),e.issuedBy=i?.issuedBy??(a?void 0:e.issuedBy),e.refresh=i?.refresh??(a?void 0:e.refresh),e.expiresAt=s.expiresAt,e.serverExpiresAt=s.serverExpiresAt,e.expirySource=s.source,e.lifetimeMs=s.lifetimeMs,a&&qo(e,n)}function Mt(e,t,r,n,o){let i=Z.get(r.fp),s=Ot(r.info,i);return{key:e,origin:t,host:To(t),location:r.location,name:r.name,scheme:r.scheme,fp:r.fp,info:r.info,role:i?.role,issuedBy:i?.issuedBy,refresh:i?.refresh,expiresAt:s.expiresAt,serverExpiresAt:s.serverExpiresAt,expirySource:s.source,lifetimeMs:s.lifetimeMs,firstSeenReal:n,firstSeenApp:o,lastUsedReal:n,lastUsedApp:o,uses:0,expiredSends:0,rejected:0,history:[]}}function Pt(){if(I.size<=jo)return;let e=null;for(let t of I.values())(!e||t.lastUsedReal<e.lastUsedReal)&&(e=t);e&&e.key!==f?.tokenId&&I.delete(e.key)}function qo(e,t){!f||f.tokenId!==e.key||(f.newTokens+=1,f.status==="waiting"&&(f.status="refreshed",f.refreshedAt=t,f.ruleId&&f.forcedAt===void 0&&co("network","deleteOverrideRule",{id:f.ruleId}).catch(()=>{})),f.newTokens>=zt&&t-(f.refreshedAt??t)<=Nt&&(f.status="loop"))}function Ko(e){let t=Oe(e.url);if(!t)return;let r=It(e,je);if(r.length===0)return;let n=A(),o=e.timestamp;for(let i of r){let s=He(t,i),a=I.get(s);a?We(a,i.fp,i.info,n,o):(a=Mt(s,t,i,n,o),I.set(s,a),Pt()),a.uses+=1,a.lastUsedReal=n,a.lastUsedApp=o,a.expiresAt!==void 0&&o>=a.expiresAt&&(a.expiredSends+=1),f&&f.tokenId===s&&f.forcedAt!==void 0&&i.fp===f.startFp&&(f.staleAfterFailure+=1,Ve(de,e.id))}oe()}function Zo(e){let t=Oe(e.url);if(!t)return;let r=A(),n=false;if(e.status===401||e.status===403)for(let l of It(e,je)){let c=I.get(He(t,l));c&&c.fp===l.fp&&(c.rejected+=1,n=true)}let o=!!f?.ruleId&&e.override?.ruleId===f.ruleId,i=`${e.method.toUpperCase()} ${Me(e.url)}`,s=Dt.has(i)||e.method.toUpperCase()==="POST"&&Wo.test(Me(e.url)),a=e.status??0;f&&a>=400&&!o&&s&&(f.failedRefreshes+=1,f.lastRefreshError=`${e.status} ${i}`,n=true),f?.status==="waiting"&&f.forcedAt!==void 0&&!o&&a>=200&&a<400&&(s&&f.refreshOkAt===void 0?(f.refreshOkAt=r,n=true):!s&&f.refreshOkAt!==void 0&&de.has(e.id)&&(f.status="refreshed",f.refreshedAt=r,f.sameToken=true,n=true)),f?.ruleId&&e.override?.ruleId===f.ruleId&&f.forcedAt===void 0&&(f.forcedAt=r,n=true);for(let l of Fo(e,je)){if(Dt.add(l.issuedBy),Z.set(l.fp,{...l,observedReal:r}),Z.size>Bo){let c=Z.keys().next().value;c!==void 0&&Z.delete(c)}if(n=true,l.cookie){let c={location:"cookie",name:l.cookie,fp:l.fp,info:l.info},u=He(t,c),h=I.get(u);h?We(h,l.fp,l.info,r,e.timestamp):(I.set(u,Mt(u,t,c,r,e.timestamp)),Pt());continue}for(let c of I.values())c.fp===l.fp&&We(c,l.fp,c.info,r,c.lastUsedApp)}n&&oe()}function Go(e){let t=e;!t||typeof t.id!="string"||typeof t.url!="string"||(Ve(Vo,t.id)&&Ko(t),t.status!==void 0&&Ve(Ho,t.id)&&Zo(t))}function pe(){if(_e)return true;try{let{networkEventStore:e}=uo("@buoy-gg/network");if(!e?.onEvent)throw new Error("no event store");_e=e.onEvent(Go,true),fe=true}catch{fe=false}return oe(),fe}function Ft(e,t,r){let n=I.get(t);if(!n)throw new Error(`No token row "${t}".`);return f={kind:e,tokenId:t,startedAt:A(),startFp:n.fp,ruleId:r,status:"waiting",newTokens:0,staleAfterFailure:0,failedRefreshes:0},de.clear(),oe(),f}function Yo(){f=null,de.clear(),oe()}function Xo(e){return e.location==="cookie"?`${e.name} cookie`:e.location==="query"?`${e.name} parameter`:e.location==="header"?`${e.name} header`:e.role==="id"||e.info.claims.use==="id"?"ID token":"Access token"}function Qo(e,t){let r=[e.firstSeenReal,...e.history.map(o=>o.firstSeenReal)].slice(0,-1).filter(o=>t-o<=Nt).length,n=e.info.issuedAt;return{id:e.key,label:Xo(e),host:e.host,location:e.location,name:e.name,scheme:e.scheme,format:e.info.format,formatLabel:e.info.formatLabel,hint:e.info.hint,claims:e.info.claims,fingerprint:e.fp,issuedAt:n,notBefore:e.info.notBefore,expiresAt:e.expiresAt,serverExpiresAt:e.serverExpiresAt,expirySource:e.expirySource,lifetimeMs:e.lifetimeMs,neverExpires:e.info.neverExpires,issuedBy:e.issuedBy,refresh:e.refresh?{expiresAt:e.refresh.expiresAt,formatLabel:e.refresh.formatLabel}:void 0,firstUsed:e.firstSeenApp,lastUsed:e.lastUsedApp,lastUsedReal:e.lastUsedReal,uses:e.uses,refreshes:e.history.length,lastRefreshAt:e.history.length?e.firstSeenReal:void 0,recentRefreshes:r,looping:r>=zt,expiredSends:e.expiredSends,rejected:e.rejected}}function he(){let e=A(),t=[...I.values()].sort((r,n)=>n.lastUsedReal-r.lastUsedReal).map(r=>Qo(r,e));if(f?.status==="refreshed"){let r=I.get(f.tokenId);r&&(f.newLifetimeMs=r.lifetimeMs,f.newIssuedBy=r.issuedBy)}return{available:fe,watching:_e!==null,tokens:t,check:f?{...f}:null}}function ei(e){let t=he();return e?t.tokens.find(r=>r.id===e||r.fingerprint===e)??null:t.tokens.find(r=>r.expiresAt!==void 0)??t.tokens[0]??null}function ti(e){return I.get(e)?.origin??null}import{isProNow as jt}from"@buoy-gg/shared-ui/web";var p={anchor:Ae,settings:te,lastJump:null,changedAt:null,hydrated:false},Je=new Set,me=null;function _t(){me=null,Je.forEach(e=>e())}Jo(_t);function ie(e){return Je.add(e),()=>{Je.delete(e)}}function ri(){return p.settings}function Bt(){return N(p.anchor,A())}function Ut(){return p.anchor.mode!=="real"}function ni(e){if(e.mode==="real"){at(null),Mr();return}lt(),at(t=>N(p.anchor,t)),Or()}function oi(){let e={v:1,anchor:p.settings.persist&&jt()?p.anchor:null,settings:p.settings};Le(e)}function Vt(){let e={v:1,anchor:p.settings.persist&&jt()?p.anchor:null,settings:p.settings};return p.settings.persist&&p.anchor.mode!=="real"&&(e.reload={anchor:p.anchor,at:A()}),Le(e)}function G(e,{save:t=true}={}){p={...p,...e},e.anchor&&ni(p.anchor),t&&oi(),_t()}function Y(e,t=p.lastJump){G({anchor:e,lastJump:t,changedAt:A(),hydrated:true})}var Ht=e=>M.parse(e);function Wt(e,t=false){let r=A(),n=N(p.anchor,r),o=kt(e,n,Ht),i=o-n;return Y($e(p.anchor,r,o,t),{byMs:i,firedTimers:0,at:r}),S()}function qe(e,t){let r=Ce(e),n=A(),o=eo(p.anchor,n,r),i=(t??p.settings.fireTimersOnJump)&&r>0;if(Y(o,{byMs:r,firedTimers:0,at:n}),i){let s=Ur(r);s>0&&G({lastJump:{byMs:r,firedTimers:s,at:n}},{save:false})}return S()}function Ke(e){let t=A(),r=N(p.anchor,t),n=e===void 0||e===""?r:kt(e,r,Ht);return Y(to(p.anchor,t,n)),S()}function Ze(){return p.anchor.mode==="frozen"&&Y(ro(p.anchor,A())),S()}function Jt(e){return Y(no(p.anchor,A(),Number(e))),S()}function Ge(){return Y(Ae,null),S()}function qt(e){let t={...p.settings};for(let r of Object.keys(te))typeof e[r]=="boolean"&&(t[r]=e[r]);return G({settings:t}),S()}function ii(e){return e>0?Br(e):0}var Kt=false;function Zt(e){if(!e){G({hydrated:true},{save:false});return}let t=e.reload?A()-e.reload.at:1/0,r=t>=0&&t<ao?e.reload?.anchor:void 0;e.reload&&Le({v:1,anchor:e.anchor,settings:e.settings});let n=e.anchor??r??null;G({settings:e.settings,anchor:n??Ae,changedAt:n?A():null,hydrated:true},{save:false})}function Ye(){if(Kt)return;Kt=true,lt();let e=so();if(e!==void 0){Zt(e);return}lo().then(t=>{p.changedAt===null?Zt(t):G({hydrated:true},{save:false})})}function si(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone??"unknown"}catch{return"unknown"}}function S(){let e=A(),t=N(p.anchor,e);return{mode:p.anchor.mode,active:p.anchor.mode!=="real",rate:p.anchor.rate,virtualNow:t,virtualIso:new M(t).toISOString(),realNow:e,offsetMs:Qn(p.anchor,e),timeZone:si(),timers:_r(),lastJump:p.lastJump,changedAt:p.changedAt,settings:p.settings,hydrated:p.hydrated,tokens:he(),patched:{date:Nr(),intl:Dr(),timers:jr(),animatedOnRealClock:Fr()}}}function Gt(){return me||(me=S()),me}import{useSyncExternalStore as ai}from"react";import{ClockToolIcon as Yt,FloatingTool as li,Pause as ci,Play as ui,X as di,dismissFloatingTool as fi,getFloatingTools as pi,getUseIsPro as hi,night as se,openFloatingTool as Xt}from"@buoy-gg/shared-ui/web";import{useEffect as mi,useState as gi}from"react";function _(e,t=250){let[,r]=gi(0);mi(()=>{let s=setInterval(()=>r(a=>a+1),t);return()=>clearInterval(s)},[t]);let n=A();if(!e)return{virtual:n,real:n};let o=n-e.realNow,i=e.mode==="real"?1:e.rate;return{virtual:e.mode==="frozen"?e.virtualNow:e.virtualNow+o*i,real:n}}var D=e=>String(e).padStart(2,"0");function X(e){let t=new M(e);return`${D(t.getHours())}:${D(t.getMinutes())}:${D(t.getSeconds())}`}var yi=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Qt=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function bi(e){let t=new M(e);return`${yi[t.getDay()]}, ${Qt[t.getMonth()]} ${t.getDate()}, ${t.getFullYear()}`}function ge(e,t=true){let r=new M(e),n=t?X(e):`${D(r.getHours())}:${D(r.getMinutes())}`;return`${Qt[r.getMonth()]} ${r.getDate()} \xB7 ${n}`}function er(e){let t=new M(e);return`${t.getFullYear()}-${D(t.getMonth()+1)}-${D(t.getDate())} ${D(t.getHours())}:${D(t.getMinutes())}`}function ki(e){if(Math.abs(e)<1e3)return"matches real time";let t=ee(Math.abs(e),{signed:false});return e>0?`${t} ahead of real time`:`${t} behind real time`}function tr(e){return e.mode==="real"?{label:"Real time",tone:"neutral"}:e.mode==="frozen"?{label:"Frozen",tone:"info"}:e.rate!==1?{label:`${wt(e.rate)} speed`,tone:"warning"}:{label:"Overridden",tone:"accent"}}function xi(e){return`clock-jump-${e<0?"minus":"plus"}-${ee(Math.abs(e),{signed:false}).replace(/\s/g,"")}`}import{jsx as L,jsxs as Xe}from"react/jsx-runtime";var ye="clock-chip",rr={id:ye,render:e=>L(ir,{...e})},wi=()=>pi().some(e=>e.id===ye);function vi(){Xt(rr)}var nr=false;function or(){if(nr)return;nr=true;let e=false,t=()=>{let r=Ut()&&ri().showChip;r&&!e?Xt(rr):!r&&wi()&&fi(ye),e=r};ie(t),t()}function ir({id:e,revealToken:t}){let r=ai(ie,Gt,Gt),{virtual:n,real:o}=_(r),i=r.mode==="frozen",s=hi()(),a=i||s,l=tr(r),c=n-o,u=`${Math.abs(c)<1e3?"0s":ee(c)} \xB7 ${l.label.toLowerCase()}`;return L(li,{id:e,revealToken:t,variant:"strip",dragFromSurface:true,defaultPlacement:"top",accessibilityLabel:`Move or hide the clock chip. App time ${ge(n)}`,handleAdornment:L(Yt,{size:12}),children:Xe(m,{style:V.row,children:[L(Yt,{size:18}),Xe(m,{style:V.text,children:[L(x,{style:V.time,numberOfLines:1,testID:"clock-chip-time",children:ge(n)}),L(x,{style:V.detail,numberOfLines:1,testID:"clock-chip-detail",children:u})]}),a?Xe(P,{testID:i?"clock-chip-resume":"clock-chip-freeze",accessibilityRole:"button",accessibilityLabel:i?"Resume the app clock":"Freeze the app clock",onPress:()=>i?Ze():Ke(),style:V.button,hitSlop:{top:8,bottom:8,left:4,right:4},children:[i?L(ui,{size:16,color:se.color.accent}):null,i?null:L(ci,{size:16,color:se.color.text})]}):null,a?L(m,{style:V.separator}):null,L(P,{testID:"clock-chip-reset",accessibilityRole:"button",accessibilityLabel:"Back to real time",onPress:()=>Ge(),style:V.button,hitSlop:{top:8,bottom:8,left:4,right:8},children:L(di,{size:16,color:se.color.textSecondary})})]})})}var V=q.create({row:{flexDirection:"row",alignItems:"center",gap:10,paddingLeft:10,paddingRight:4,paddingVertical:6,minWidth:220},text:{flexShrink:1,minWidth:120},time:{color:"#F59E0B",fontSize:14,fontWeight:"600",fontVariant:["tabular-nums"]},detail:{color:se.color.textSecondary,fontSize:11,fontVariant:["tabular-nums"]},button:{width:32,height:32,alignItems:"center",justifyContent:"center",borderRadius:16},separator:{width:q.hairlineWidth,height:20,backgroundColor:se.color.separator}});import{ClockToolIcon as Ai,CLOCK_TOOL_ICON_COLOR as Si,createToolFactory as Ti,defineToolPreset as $i}from"@buoy-gg/shared-ui/web";import{useEffect as sr,useState as Ci}from"react";import{reloadApp as Ei}from"@buoy-gg/shared-ui/web";import{createSyncAdapter as Ii}from"@buoy-gg/shared-ui/web";import{dispatchToolAction as ar}from"@buoy-gg/shared-ui/web";var lr="No sign-in token seen yet. Use the app so it sends a signed-in request, then try again. Tokens are read from the Network tool's captured requests.";function cr(e){pe();let t=ei(e);if(!t)throw new Error(e?`No token "${e}". Read getState for the current ids.`:lr);return t}function ur(e,t=1e4){let r=cr(e);if(r.expiresAt===void 0)throw new Error(r.neverExpires?`${r.label} for ${r.host} is ${r.hint??"a key"} and never expires.`:`${r.label} for ${r.host} (${r.formatLabel}) has no expiry Buoy can read. Use failNextRequest to test the refresh instead.`);let n=r.expiresAt-Math.max(0,t)-Bt();if(n<=0)throw new Error(`${r.label} for ${r.host} has already expired on the app's clock. Go back to real time, or use failNextRequest.`);return qe(n),Ft("expiry",r.id),S()}async function dr(e,t=401,r=1){let n=cr(e),o=ti(n.id);if(!o)throw new Error(lr);await fr();let i=t===403?403:401,s=n.location==="authorization"||n.location==="header"?{urlPattern:`${o}/*`,requireHeader:n.name.toLowerCase()}:n.location==="query"?{urlPattern:`${o}/*${n.name}=*`}:{urlPattern:`${o}/*`},a=await ar("network","upsertOverrideRule",{name:"Clock: force a token refresh",...s,kind:"respond",status:i,headers:{"content-type":"application/json","www-authenticate":'Bearer error="invalid_token", error_description="The access token expired"'},body:JSON.stringify({error:"invalid_token",error_description:"The access token expired (forced by Buoy Clock to test token refresh)"}),times:Math.max(1,Math.min(10,Math.round(r)))}).catch(l=>{let c=l instanceof Error?l.message:String(l);throw new Error(c.includes("Unknown tool")?"Failing a request needs the Network tool (@buoy-gg/network).":c)});if(!a?.ok||!a.rule)throw new Error(a?.error??"Network did not add the override.");return Ft("401",n.id,a.rule.id),S()}async function fr(){let e=he().check;e?.ruleId&&e.forcedAt===void 0&&await ar("network","deleteOverrideRule",{id:e.ruleId}).catch(()=>{})}async function pr(){return await fr(),Yo(),S()}function H(e){return e&&typeof e=="object"?e:{}}function Qe(e,...t){for(let r of t){let n=e[r];if(typeof n=="string"||typeof n=="number")return n}}function ae(e,t){let r=e[t];if(typeof r=="boolean")return r;if(r==="true")return true;if(r==="false")return false}var hr=Ii({version:1,getSnapshot(){return S()},subscribe(e){return ie(e)},actions:{getState(){return pe(),S()},setTime(e){let t=H(e),r=Qe(t,"time","at","date","iso");if(r===void 0)throw new Error('setTime needs `time`: ISO 8601 ("2026-12-31T23:59:50"), epoch ms, or relative ("+1d").');return Wt(r,ae(t,"freeze")??false)},shift(e){let t=H(e),r=Qe(t,"by","ms","duration","delta");if(r===void 0)throw new Error('shift needs `by`: a duration like "+1d", "-2h30m", "90s", or ms.');return qe(r,ae(t,"fireTimers"))},freeze(e){return Ke(Qe(H(e),"time","at"))},resume(){return Ze()},setRate(e){let t=H(e),r=Number(t.rate??t.speed);if(!Number.isFinite(r))throw new Error("setRate needs a numeric `rate` (1 = normal speed).");return Jt(r)},reset(){return Ge()},updateSettings(e){let t=H(e);return qt({persist:ae(t,"persist"),showChip:ae(t,"showChip"),fireTimersOnJump:ae(t,"fireTimersOnJump")})},jumpToTokenExpiry(e){let t=H(e),r=typeof t.token=="string"?t.token:typeof t.id=="string"?t.id:void 0,n=Number(t.leadMs??t.lead??1e4);return ur(r,Number.isFinite(n)?n:1e4)},failNextRequest(e){let t=H(e),r=typeof t.token=="string"?t.token:typeof t.id=="string"?t.id:void 0,n=Number(t.status??401),o=Number(t.times??1);return dr(r,n,Number.isFinite(o)?o:1)},stopTokenCheck(){return pr()},async holdForReload(){return await Vt(),S()}}});import{useState as be}from"react";import{ChevronRight as Ri,NightButton as Li,NightCard as ke,NightChip as zi,NightFootnote as et,NightRows as tt,NightSectionLabel as mr,NightSegmented as Ni,NightSwitch as gr,ProBadge as Di,ProUpgradeModal as Oi,getUseIsPro as Mi,monoFont as Pi,night as b,useSafeAreaInsets as Fi}from"@buoy-gg/shared-ui/web";import{ChevronRight as ji,NightButton as yr,NightCard as _i,NightFootnote as Bi,NightRows as Ui,NightSectionLabel as Vi,ProBadge as Hi,night as k}from"@buoy-gg/shared-ui/web";import{jsx as w,jsxs as z}from"react/jsx-runtime";var B=e=>ee(Math.abs(e),{signed:false});function Wi({snapshot:e,run:t,openId:r,onToggle:n,isPro:o,onUpgrade:i}){let s=e.tokens;return z(m,{children:[w(Vi,{children:s.tokens.length>1?"Sign-in tokens":"Sign-in token"}),w(_i,{children:z(Ui,{children:[s.tokens.map((a,l)=>z(m,{children:[w(Ji,{token:a,snapshot:e,index:l,open:r===a.id,onPress:()=>n(a.id)}),r===a.id?w(qi,{token:a,snapshot:e,run:o?t:()=>i("Sign-in token tests"),isPro:o}):null]},a.id)),s.tokens.length===0?w(m,{style:y.row,testID:"clock-token-empty",children:w(x,{style:y.emptyText,children:s.available?"No token seen yet":"Needs the Network tool"})},"empty"):null]})}),w(Zi,{check:s.check,tokens:s.tokens,snapshot:e,run:t}),s.tokens.length===0?w(Bi,{children:s.available?"Tokens show up here when the app sends a signed-in request.":"Install @buoy-gg/network so the Clock tool can read the app's tokens."}):null]})}function Ji({token:e,snapshot:t,index:r,open:n,onPress:o}){let{virtual:i}=_(t,1e3),s=e.expiresAt!==void 0?e.expiresAt-i:void 0,a=e.neverExpires?"No expiry":s===void 0?"Unknown":s<=0?"Expired":B(s),l=s!==void 0&&s<=0?y.valueDanger:s!==void 0&&s<6e4?y.valueWarning:null;return z(P,{testID:`clock-token-${r}`,accessibilityRole:"button",accessibilityLabel:`${e.label} for ${e.host}: ${s!==void 0&&s>0?`expires in ${a}`:a}`,accessibilityState:{expanded:n},activeOpacity:.6,onPress:o,style:y.row,children:[z(m,{style:y.rowText,children:[w(x,{style:y.rowTitle,numberOfLines:1,children:e.label}),w(x,{style:y.rowSubtitle,numberOfLines:1,children:`${e.host} \xB7 ${e.hint??e.formatLabel}`})]}),z(m,{style:y.rowRight,children:[w(x,{style:[y.value,l],testID:`clock-token-${r}-left`,children:a}),w(m,{style:n?y.chevronOpen:null,children:w(ji,{size:16,color:k.color.textTertiary})})]})]})}function qi({token:e,snapshot:t,run:r,isPro:n}){let{virtual:o,real:i}=_(t,1e3),s=Ki(e,o,i),a=e.expiresAt!==void 0&&e.expiresAt-o>1e4;return z(m,{style:y.detail,testID:"clock-token-detail",children:[s.map(l=>w(x,{style:[y.detailLine,l.tone==="warn"?y.warn:null,l.tone==="bad"?y.bad:null],children:l.text},l.text)),z(m,{style:y.buttons,children:[w(m,{style:y.button,children:w(yr,{label:"Jump to Expiry",testID:"clock-token-jump",accessibilityLabel:"Jump the app's clock to ten seconds before this token expires",size:"md",disabled:!a,onPress:()=>r("jumpToTokenExpiry",{token:e.id})})}),w(m,{style:y.button,children:w(yr,{label:"Fail Next Request",testID:"clock-token-fail",accessibilityLabel:"Answer the app's next request to this API with 401",size:"md",onPress:()=>r("failNextRequest",{token:e.id})})})]}),n?null:z(m,{style:y.proLine,children:[w(Hi,{}),w(x,{style:[y.hint,y.proHint],children:"Jump to Expiry and Fail Next Request are part of Buoy Pro."})]}),w(x,{style:y.hint,children:a||e.expiresAt===void 0?"Jump tests an app that refreshes before expiry. Fail tests one that refreshes after a 401.":"This token has already expired on the app's clock. Use Real Time to jump to it again."})]})}function Ki(e,t,r){let n=[];if(e.expiresAt!==void 0){if(n.push({text:`Expires ${ge(e.expiresAt)}`}),e.lifetimeMs!==void 0&&e.lifetimeMs>0&&n.push({text:`Lasts ${B(e.lifetimeMs)}${e.expirySource?`, from ${e.expirySource}`:""}`}),e.serverExpiresAt!==void 0){let o=e.expiresAt-t,i=e.serverExpiresAt-r;Math.abs(o-i)>2e3&&n.push({text:i>0?`The server still accepts it for ${B(i)}`:`The server stopped accepting it ${B(i)} ago`})}}else e.neverExpires||n.push({text:"The token doesn't say when it expires, and no login response did either."});if(e.hint&&n.push({text:e.formatLabel}),e.issuedBy&&n.push({text:`Issued by ${e.issuedBy}`}),e.refresh?.expiresAt!==void 0){let o=e.refresh.expiresAt-t;n.push({text:o>0?`Refresh token expires in ${B(o)}`:"Refresh token expired"})}return e.refreshes>0&&e.lastRefreshAt!==void 0&&n.push({text:`Refreshed ${e.refreshes===1?"once":`${e.refreshes} times`}, last at ${X(e.lastRefreshAt)}`}),n.push({text:`Sent with ${e.uses} request${e.uses===1?"":"s"}`}),e.expiredSends>0&&n.push({text:`Sent ${e.expiredSends} time${e.expiredSends===1?"":"s"} after it expired on the app's clock`,tone:"warn"}),e.rejected>0&&n.push({text:`Rejected by the server ${e.rejected} time${e.rejected===1?"":"s"}`,tone:"warn"}),e.looping&&n.push({text:`Refresh loop: ${e.recentRefreshes} new tokens in 20s`,tone:"bad"}),n}function Zi({check:e,tokens:t,snapshot:r,run:n}){let{virtual:o,real:i}=_(r,1e3);if(!e)return null;let s=t.find(c=>c.id===e.tokenId),{text:a,tone:l}=Gi(e,s,o,i);return z(m,{style:y.check,children:[w(x,{style:[y.checkText,l==="good"?y.good:null,l==="bad"?y.bad:null,l==="warn"?y.warn:null],testID:"clock-token-check",children:a}),w(P,{testID:"clock-token-check-done",accessibilityRole:"button",accessibilityLabel:e.status==="waiting"?"Stop the refresh check":"Dismiss",onPress:()=>n("stopTokenCheck"),hitSlop:{top:8,bottom:8,left:8,right:8},children:w(x,{style:y.checkDone,children:e.status==="waiting"?"Stop":"Done"})})]})}function Gi(e,t,r,n){if(e.status==="loop")return{text:`Refresh loop: ${e.newTokens} new tokens since the check started. The new tokens may already look expired to the app's clock.`,tone:"bad"};if(e.status==="refreshed"&&e.sameToken)return{text:`The app got the 401 and refreshed at ${X(e.refreshedAt??n)}. The refresh sent back the same token, and the retry worked.`,tone:"good"};if(e.status==="refreshed"){let a=e.newIssuedBy?` by ${e.newIssuedBy}`:"",l=e.newLifetimeMs&&e.newLifetimeMs>0?`. The new token lasts ${B(e.newLifetimeMs)}`:"",c=e.kind==="401"&&e.forcedAt!==void 0?"The app got the 401 and refreshed":"Refreshed",u=e.failedRefreshes>0?` ${e.failedRefreshes===1?"One token request":`${e.failedRefreshes} token requests`} failed first (${e.lastRefreshError}).`:"";return{text:`${c} at ${X(e.refreshedAt??n)}${a}${l}.${u}`,tone:u?"warn":"good"}}let o=n-e.startedAt,i=(e.staleAfterFailure>0?` It sent the old token again ${e.staleAfterFailure} time${e.staleAfterFailure===1?"":"s"}.`:"")+(e.failedRefreshes>0?` Its token request failed (${e.lastRefreshError}).`:"");if(o>6e4)return{text:`No new token after ${B(o)}. The app may refresh on its next action, or not at all.${i}`,tone:"warn"};if(e.kind==="401")return e.forcedAt===void 0?{text:`The next request to ${t?.host??"the API"} will get a 401. Use the app to send one.`}:{text:`The app got the 401. Waiting for a new token\u2026${i}`,tone:i?"warn":void 0};let s=t?.expiresAt!==void 0?t.expiresAt-r:void 0;return s!==void 0&&s>0?{text:`Expires in ${B(s)} on the app's clock. Waiting for a new token\u2026`}:{text:"Expired on the app's clock. Waiting for the app's next request\u2026"}}var y=q.create({row:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",gap:12,minHeight:56,paddingHorizontal:k.rowPadH,paddingVertical:10},rowText:{flex:1,minWidth:0},rowTitle:{color:k.color.text,fontSize:k.font.row},rowSubtitle:{color:k.color.textTertiary,fontSize:k.font.caption,marginTop:2},rowRight:{flexDirection:"row",alignItems:"center",gap:6},value:{color:k.color.textSecondary,fontSize:k.font.row,fontVariant:["tabular-nums"]},valueWarning:{color:k.color.warning},valueDanger:{color:k.color.danger},chevronOpen:{transform:[{rotate:"90deg"}]},emptyText:{color:k.color.textSecondary,fontSize:k.font.row},detail:{paddingHorizontal:k.rowPadH,paddingBottom:14,gap:4},detailLine:{color:k.color.textSecondary,fontSize:k.font.caption},buttons:{flexDirection:"row",gap:8,marginTop:8},button:{flex:1},hint:{color:k.color.textTertiary,fontSize:k.font.caption,marginTop:6},proLine:{flexDirection:"row",alignItems:"center",gap:8,marginTop:6},proHint:{marginTop:0,flexShrink:1},check:{flexDirection:"row",alignItems:"flex-start",gap:12,marginTop:8,marginHorizontal:k.labelInset},checkText:{flex:1,color:k.color.textSecondary,fontSize:k.font.caption,lineHeight:18},checkDone:{color:k.color.accent,fontSize:k.font.caption,fontWeight:"600"},good:{color:k.color.accent},warn:{color:k.color.warning},bad:{color:k.color.danger}});import{jsx as d,jsxs as v}from"react/jsx-runtime";var br="#F59E0B";function kr({snapshot:e,onAction:t,onReload:r}){let n=Fi({minBottom:16}),[o,i]=be(null),[s,a]=be(null),l=Mi()(),[c,u]=be(null),h=E=>u(E),T=(E,O)=>{i(null),t(E,O).catch(U=>{i(U instanceof Error?U.message:String(U))})},$=E=>a(O=>O===E?null:E);return e?v(gt,{style:g.fill,contentContainerStyle:[g.content,{paddingBottom:n.bottom}],testID:"clock-scroll",keyboardShouldPersistTaps:"handled",children:[d(Yi,{snapshot:e}),o?d(m,{testID:"clock-error",children:d(et,{tone:"danger",centered:true,children:o})}):null,v(m,{children:[d(mr,{children:"Jump ahead"}),d(Qi,{run:T})]}),v(m,{children:[d(ke,{children:v(tt,{children:[v(m,{children:[d(wr,{title:"Date & Time",testID:"clock-date-row",open:s==="date",onPress:()=>$("date"),value:d(es,{snapshot:e})}),s==="date"?d(rs,{snapshot:e,run:T,onDone:()=>a(null)}):null]},"date"),v(m,{style:g.row,children:[d(rt,{title:"Freeze",isPro:l}),d(gr,{value:e.mode==="frozen",testID:"clock-freeze",accessibilityLabel:"Freeze the clock",onValueChange:E=>E&&!l?h("Freeze"):T(E?"freeze":"resume")})]},"freeze"),v(m,{children:[d(wr,{title:"Speed",pro:!l,testID:"clock-speed-row",open:s==="speed",onPress:()=>l?$("speed"):h("Speed"),value:d(x,{style:g.rowValue,children:Sr(e)})}),s==="speed"?d(ns,{snapshot:e,run:T}):null]},"speed")]})}),d(et,{children:"Only this app's clock changes. Screens pick up the new time when they next render, or all at once when you reload."})]}),e.tokens?d(Wi,{snapshot:e,run:T,openId:s,onToggle:$,isPro:l,onUpgrade:h}):null,d(ke,{children:v(tt,{children:[r?d(vr,{label:"Reload App",testID:"clock-reload",onPress:r},"reload"):null,d(vr,{label:"Use Real Time",accessibilityLabel:"Reset to real time",testID:"clock-reset",destructive:true,disabled:e.mode==="real",onPress:()=>T("reset")},"reset")]})}),v(m,{children:[d(mr,{children:"Options"}),d(is,{settings:e.settings,run:T,isPro:l,onUpgrade:h})]}),d(Oi,{visible:c!==null&&!l,onClose:()=>u(null),featureName:c??void 0})]}):d(m,{style:g.waiting,testID:"clock-waiting",children:d(et,{centered:true,children:"Waiting for the app's clock\u2026"})})}function rt({title:e,isPro:t}){return v(m,{style:g.titleRow,children:[d(x,{style:g.rowTitle,children:e}),t?null:d(Di,{})]})}function Yi({snapshot:e}){let{virtual:t,real:r}=_(e),n=tr(e),o=e.mode!=="real",i=ki(t-r),s=e.mode==="frozen"?" \xB7 Frozen":o&&e.rate!==1?` \xB7 ${Sr(e)}`:"";return v(m,{style:g.hero,children:[d(x,{style:[g.heroTime,o?g.heroTimeActive:null],testID:"clock-hero-time",accessibilityLabel:`App clock ${X(t)}`,children:X(t)}),d(x,{style:g.heroDate,testID:"clock-hero-date",children:bi(t)}),d(m,{testID:"clock-status",accessibilityLabel:`Clock status: ${n.label}${o?`, ${i}`:""}`,children:d(x,{style:[g.heroStatus,o?g.heroStatusActive:null],testID:"clock-offset",children:o?`${i}${s}`:"Real time"})})]})}var xr=36e5,nt=24*xr,Xi=[{ms:xr,unit:"hour"},{ms:nt,unit:"day"},{ms:7*nt,unit:"week"},{ms:30*nt,unit:"month"}];function Qi({run:e}){return d(ke,{style:g.jumpBar,children:Xi.map((t,r)=>v(P,{testID:xi(t.ms),accessibilityRole:"button",accessibilityLabel:`Jump ahead one ${t.unit}`,activeOpacity:.6,onPress:()=>e("shift",{by:t.ms}),style:[g.jump,r>0?g.jumpDivider:null],children:[d(x,{style:g.jumpAmount,children:"+1"}),d(x,{style:g.jumpUnit,children:t.unit})]},t.unit))})}function wr({title:e,pro:t,value:r,open:n,onPress:o,testID:i}){return v(P,{testID:i,accessibilityRole:"button",accessibilityLabel:e,accessibilityState:{expanded:n},activeOpacity:.6,onPress:o,style:g.row,children:[d(rt,{title:e,isPro:!t}),v(m,{style:g.rowRight,children:[r,d(m,{style:n?g.chevronOpen:null,children:d(Ri,{size:16,color:b.color.textTertiary})})]})]})}function es({snapshot:e}){let{virtual:t}=_(e,1e3);return d(x,{style:[g.rowValue,g.tabular],numberOfLines:1,children:ge(t,false)})}function vr({label:e,onPress:t,testID:r,destructive:n,disabled:o,accessibilityLabel:i}){return d(P,{testID:r,accessibilityRole:"button",accessibilityLabel:i??e,accessibilityState:{disabled:!!o},activeOpacity:.6,disabled:o,onPress:t,style:[g.row,o?g.rowDisabled:null],children:d(x,{style:[g.actionLabel,n?g.actionDestructive:null],children:e})})}var ts=xt.filter(e=>["midnight","month-end","year-end"].includes(e.id));function rs({snapshot:e,run:t,onDone:r}){let[n,o]=be(""),{virtual:i}=_(e,1e3),s=()=>n.trim()||er(i),a=e.mode==="frozen",l=c=>{t("setTime",{time:c,freeze:a}),r()};return v(m,{style:g.editor,children:[v(m,{style:g.inputRow,children:[d(mt,{testID:"clock-time-input",accessibilityLabel:"Date and time",value:n,onChangeText:o,placeholder:er(i),placeholderTextColor:b.color.placeholder,autoCapitalize:"none",autoCorrect:false,returnKeyType:"done",onSubmitEditing:()=>l(s()),style:g.input}),d(Li,{label:"Set",testID:"clock-time-apply",accessibilityLabel:"Set this time",size:"md",variant:"primary",fullWidth:false,onPress:()=>l(s())})]}),d(x,{style:g.hint,children:"Year-month-day and 24-hour time, or +3d, -2h"}),d(m,{style:g.presets,children:ts.map(c=>d(zi,{label:c.label,testID:`clock-preset-${c.id}`,onPress:()=>l(c.at(i,M))},c.id))})]})}var Ar=[{key:"1",label:"Normal"},{key:"10",label:"10\xD7"},{key:"60",label:"1 min/s"},{key:"3600",label:"1 hr/s"}];function Sr(e){return e.mode==="real"||e.rate===1?"Normal":Ar.find(t=>Number(t.key)===e.rate)?.label??wt(e.rate)}function ns({snapshot:e,run:t}){let r=e.mode==="real"?"1":String(e.rate);return v(m,{style:g.editor,children:[d(m,{style:g.segmentRow,children:d(Ni,{tabs:Ar,activeKey:r,size:"sm",testIDPrefix:"clock-speed",onChange:n=>t("setRate",{rate:Number(n)})})}),d(x,{style:g.hint,children:"Taps, animations and timers keep real speed."})]})}var os=[{key:"showChip",title:"Show Floating Clock"},{key:"persist",title:"Keep After Reload",pro:true}];function is({settings:e,run:t,isPro:r,onUpgrade:n}){return d(ke,{children:d(tt,{children:os.map(o=>{let i=!!o.pro&&!r;return v(m,{style:g.row,children:[d(rt,{title:o.title,isPro:!i}),d(gr,{value:i?false:e[o.key],testID:`clock-setting-${o.key}`,accessibilityLabel:o.title,onValueChange:s=>i?n(o.title):t("updateSettings",{[o.key]:s})})]},o.key)})})})}var g=q.create({fill:{flex:1},content:{paddingHorizontal:b.gutter,paddingTop:8,gap:b.groupGap},waiting:{flex:1,alignItems:"center",justifyContent:"center",padding:24},hero:{alignItems:"center",paddingTop:12},heroTime:{color:b.color.text,fontSize:56,fontWeight:"200",fontVariant:["tabular-nums"],letterSpacing:1},heroTimeActive:{color:br},heroDate:{color:b.color.text,fontSize:17,fontWeight:"500",marginTop:2},heroStatus:{color:b.color.textTertiary,fontSize:b.font.caption,fontWeight:"500",marginTop:6},heroStatusActive:{color:b.color.textSecondary},jumpBar:{flexDirection:"row"},jump:{flex:1,alignItems:"center",paddingVertical:12},jumpDivider:{borderLeftWidth:q.hairlineWidth,borderLeftColor:b.color.separator},jumpAmount:{color:br,fontSize:17,fontWeight:"600",fontVariant:["tabular-nums"]},jumpUnit:{color:b.color.textSecondary,fontSize:b.font.caption,marginTop:1},row:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",gap:12,minHeight:50,paddingHorizontal:b.rowPadH,paddingVertical:10},rowDisabled:{opacity:.4},rowTitle:{color:b.color.text,fontSize:b.font.row},titleRow:{flexDirection:"row",alignItems:"center",gap:8,flexShrink:1},rowRight:{flexDirection:"row",alignItems:"center",gap:6,flexShrink:1},rowValue:{color:b.color.textSecondary,fontSize:b.font.row},tabular:{fontVariant:["tabular-nums"]},chevronOpen:{transform:[{rotate:"90deg"}]},actionLabel:{color:b.color.accent,fontSize:b.font.row},actionDestructive:{color:b.color.danger},editor:{paddingHorizontal:b.rowPadH,paddingBottom:14,gap:10},inputRow:{flexDirection:"row",alignItems:"center",gap:8},input:{flex:1,color:b.color.text,fontFamily:Pi,fontSize:15,backgroundColor:b.color.bg,borderRadius:b.radius.input,borderWidth:1,borderColor:b.color.border,paddingHorizontal:12,paddingVertical:8},hint:{color:b.color.textTertiary,fontSize:b.font.caption},presets:{flexDirection:"row",flexWrap:"wrap",gap:6},segmentRow:{flexDirection:"row"}});import{jsx as ss}from"react/jsx-runtime";var as=hr.actions;async function ls(e,t){let r=as[e];if(!r)throw new Error(`Unknown clock action: ${e}`);return r(t)}function cs(){Vt().then(()=>Ei("auto","buoy clock")).catch(()=>{})}function Tr(){sr(()=>{Ye(),pe()},[]);let[e,t]=Ci(S);return sr(()=>ie(()=>t(S())),[]),ss(kr,{snapshot:e,onAction:ls,onReload:cs})}import{jsx as us}from"react/jsx-runtime";var $r=$i({id:"clock",name:"CLOCK",description:"Travel to any date, freeze or speed up the app's clock",slot:"both",color:Si,icon:({size:e,color:t})=>us(Ai,{size:e,color:t}),component:Tr,modal:{subtitle:"override the app's date & time"}}),ds=Ti($r);import{ClockToolIcon as fs,CLOCK_TOOL_ICON_COLOR as ps}from"@buoy-gg/shared-ui/web";var hs=typeof navigator<"u"&&navigator.product==="ReactNative",ms=(()=>{try{return globalThis.Capacitor?.isNativePlatform?.()===true}catch{return false}})();hs||ms?(Pr(ht),or(),typeof st<"u"&&st&&Ye()):typeof globalThis.document<"u"&&or();export{ye as CLOCK_CHIP_ID,ps as CLOCK_TOOL_ICON_COLOR,Tr as ClockBody,ir as ClockChip,fs as ClockToolIcon,kr as ClockToolView,xt as TIME_PRESETS,Ye as bootClock,hr as clockSyncAdapter,$r as clockToolPreset,ds as createClockTool,dr as failNextRequest,ee as formatDuration,Ke as freeze,S as getClockSnapshot,he as getTokenReport,ce as inspectToken,Ut as isClockOverridden,ur as jumpToTokenExpiry,vi as openClockChip,Ce as parseDuration,ii as previewJump,A as realNow,Ge as reset,Ze as resume,Jt as setRate,Wt as setTime,qe as shift,pe as startTokenWatch,pr as stopTokenCheck,ie as subscribeClock,j as tokenFingerprint,qt as updateSettings,_ as useLiveClock,Bt as virtualNow,zr as withRealClock};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{n as e,o as s}from"./chunks/chunk-FCZBPAZF.mjs";export{s as isTimerTrackingInstalled,e as observeTimers};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@buoy-gg/clock",
|
|
3
|
-
"version": "7.0.
|
|
3
|
+
"version": "7.0.79",
|
|
4
4
|
"description": "Clock override for React Native: travel to any date, freeze or speed up time, and jump ahead while firing due timers. Test expirations, countdowns and renewals without touching the device clock.",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"./lib/web/**/*.mjs"
|
|
18
18
|
],
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@buoy-gg/shared-ui": "^7.0.
|
|
20
|
+
"@buoy-gg/shared-ui": "^7.0.79"
|
|
21
21
|
},
|
|
22
22
|
"peerDependencies": {
|
|
23
23
|
"react": "*"
|
|
@@ -85,6 +85,25 @@
|
|
|
85
85
|
"./web": {
|
|
86
86
|
"types": "./lib/typescript/index.d.ts",
|
|
87
87
|
"default": "./lib/web/index.mjs"
|
|
88
|
+
},
|
|
89
|
+
"./timers": {
|
|
90
|
+
"react-native": "./lib/module/timers.js",
|
|
91
|
+
"browser": {
|
|
92
|
+
"types": "./lib/typescript/timers.d.ts",
|
|
93
|
+
"default": "./lib/web/timers.mjs"
|
|
94
|
+
},
|
|
95
|
+
"import": {
|
|
96
|
+
"types": "./lib/typescript/timers.d.ts",
|
|
97
|
+
"default": "./lib/module/timers.js"
|
|
98
|
+
},
|
|
99
|
+
"require": {
|
|
100
|
+
"types": "./lib/typescript/timers.d.ts",
|
|
101
|
+
"default": "./lib/commonjs/timers.js"
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
"./web/timers": {
|
|
105
|
+
"types": "./lib/typescript/timers.d.ts",
|
|
106
|
+
"default": "./lib/web/timers.mjs"
|
|
88
107
|
}
|
|
89
108
|
},
|
|
90
109
|
"peerDependenciesMeta": {
|