@buoy-gg/license 7.0.74 → 7.0.76

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.
Files changed (46) hide show
  1. package/lib/commonjs/LicenseManager.js +2 -2
  2. package/lib/commonjs/cacheSignature.js +1 -1
  3. package/lib/commonjs/config.js +1 -1
  4. package/lib/commonjs/devToken.js +1 -1
  5. package/lib/commonjs/hooks.js +1 -1
  6. package/lib/commonjs/index.js +1 -1
  7. package/lib/commonjs/index.web.js +1 -1
  8. package/lib/commonjs/nodeSession.js +1 -1
  9. package/lib/commonjs/tier.js +1 -1
  10. package/lib/commonjs/weekendPro.js +1 -1
  11. package/lib/module/LicenseManager.js +2 -2
  12. package/lib/module/cacheSignature.js +1 -1
  13. package/lib/module/config.js +1 -1
  14. package/lib/module/devToken.js +1 -1
  15. package/lib/module/hooks.js +1 -1
  16. package/lib/module/index.js +1 -1
  17. package/lib/module/index.web.js +1 -1
  18. package/lib/module/nodeSession.js +1 -1
  19. package/lib/module/tier.js +1 -1
  20. package/lib/module/weekendPro.js +1 -1
  21. package/lib/typescript/commonjs/LicenseManager.d.ts +12 -2
  22. package/lib/typescript/commonjs/cacheSignature.d.ts +1 -1
  23. package/lib/typescript/commonjs/config.d.ts +1 -1
  24. package/lib/typescript/commonjs/devToken.d.ts +1 -1
  25. package/lib/typescript/commonjs/hooks.d.ts +1 -1
  26. package/lib/typescript/commonjs/index.d.ts +2 -2
  27. package/lib/typescript/commonjs/index.web.d.ts +2 -2
  28. package/lib/typescript/commonjs/tier.d.ts +1 -1
  29. package/lib/typescript/commonjs/types.d.ts +21 -0
  30. package/lib/typescript/commonjs/weekendPro.d.ts +1 -1
  31. package/lib/typescript/module/LicenseManager.d.ts +12 -2
  32. package/lib/typescript/module/cacheSignature.d.ts +1 -1
  33. package/lib/typescript/module/config.d.ts +1 -1
  34. package/lib/typescript/module/devToken.d.ts +1 -1
  35. package/lib/typescript/module/hooks.d.ts +1 -1
  36. package/lib/typescript/module/index.d.ts +2 -2
  37. package/lib/typescript/module/index.web.d.ts +2 -2
  38. package/lib/typescript/module/tier.d.ts +1 -1
  39. package/lib/typescript/module/types.d.ts +21 -0
  40. package/lib/typescript/module/weekendPro.d.ts +1 -1
  41. package/lib/web/chunks/LicenseManager-LOBHCMIJ.mjs +1 -0
  42. package/lib/web/chunks/chunk-3RVGU64S.mjs +73 -0
  43. package/lib/web/index.mjs +4 -4
  44. package/package.json +1 -1
  45. package/lib/web/chunks/LicenseManager-G4PF6ILL.mjs +0 -1
  46. package/lib/web/chunks/chunk-OP6QSLZS.mjs +0 -73
@@ -13,7 +13,7 @@
13
13
  * copied.
14
14
  *
15
15
  * Pro is $9/mo, and is free every weekend for anyone holding a key —
16
- * including a free one (`npx buoy login`). Buy a key at
16
+ * including a free one (`npx --package=@buoy-gg/core buoy login`). Buy a key at
17
17
  * https://buoy.gg or use it free on Saturday and Sunday.
18
18
  */
19
19
  export { LicenseManager } from "./LicenseManager";
@@ -35,7 +35,7 @@ export { isDevToken } from "./devToken";
35
35
  export { getSyncCredential } from "./syncCredential";
36
36
  export { isBuoyToken } from "./freeToken";
37
37
  export { isWeekendFreePro, useWeekendFreePro } from "./weekendPro";
38
- export type { BuoyTier, TierSource, LicenseState, LicenseEvent, LicenseListener, LicenseValidationResult, CachedLicense, } from "./types";
38
+ export type { BuoyTier, TierSource, LicenseState, LicenseEvent, LicenseListener, LicenseValidationResult, CachedLicense, TeamAccess, } from "./types";
39
39
  export declare function setLicenseKey(key: string): Promise<boolean>;
40
40
  export declare function isPro(): boolean;
41
41
  export declare function hasEntitlement(code: string): boolean;
@@ -12,7 +12,7 @@
12
12
  * applies whether or not any code is copied.
13
13
  *
14
14
  * Pro is $9/mo, and is free every weekend for anyone holding a key —
15
- * including a free one (`npx buoy login`). Buy a key at
15
+ * including a free one (`npx --package=@buoy-gg/core buoy login`). Buy a key at
16
16
  * https://buoy.gg or use it free on Saturday and Sunday.
17
17
  */
18
18
  import type { BuoyTier, KeygenLicense } from "./types";
@@ -213,6 +213,27 @@ export interface LicenseState {
213
213
  */
214
214
  errorKind: "transport" | "verdict" | null;
215
215
  expiresAt: Date | null;
216
+ /**
217
+ * The person's team role, from their sign-in or dev token. Null for keys.
218
+ * Filled in by `getState()`; the stored state never holds it.
219
+ */
220
+ teamRole?: string | null;
221
+ /**
222
+ * The Buoy tools this person's team role shows, or null for all tools
223
+ * (`isTeamToolAllowed` in @buoy-gg/floating-tools-core applies it). Filled
224
+ * in by `getState()`, like `teamRole`.
225
+ */
226
+ allowedTools?: string[] | null;
227
+ }
228
+ /**
229
+ * What a person's Business team shows them. It shapes the menu only: tier,
230
+ * caps and capture never read it.
231
+ */
232
+ export interface TeamAccess {
233
+ /** Their team role, e.g. "qa". Null for keys and personal accounts. */
234
+ role: string | null;
235
+ /** The Buoy tools their role shows, or null for all tools. */
236
+ tools: string[] | null;
216
237
  }
217
238
  export type LicenseEventType = "initialized" | "validating" | "validated" | "error" | "deactivated";
218
239
  export interface LicenseEvent {
@@ -13,7 +13,7 @@
13
13
  * whether or not any code is copied.
14
14
  *
15
15
  * Pro is $9/mo, and is free every weekend for anyone holding a key —
16
- * including a free one (`npx buoy login`). Buy a key at
16
+ * including a free one (`npx --package=@buoy-gg/core buoy login`). Buy a key at
17
17
  * https://buoy.gg or use it free on Saturday and Sunday.
18
18
  */
19
19
  /** Whether the Weekend Pass is active right now (local Saturday or Sunday). */
@@ -11,10 +11,10 @@
11
11
  * 17 U.S.C. § 1201 — which applies whether or not any code is copied.
12
12
  *
13
13
  * Pro is $9/mo, and is free every weekend for anyone holding a key —
14
- * including a free one (`npx buoy login`). Buy a key at
14
+ * including a free one (`npx --package=@buoy-gg/core buoy login`). Buy a key at
15
15
  * https://buoy.gg or use it free on Saturday and Sunday.
16
16
  */
17
- import type { BuoyTier, TierSource, LicenseListener } from "./types";
17
+ import type { BuoyTier, TierSource, LicenseListener, TeamAccess } from "./types";
18
18
  /** Info passed to device registration callback */
19
19
  export interface DeviceRegistrationInfo {
20
20
  fingerprint: string;
@@ -48,6 +48,8 @@ declare class LicenseManagerImpl {
48
48
  private expiryTimer;
49
49
  private removeForegroundListener;
50
50
  private sessionUnsubscribe;
51
+ /** The dev token admitted last, so reading its role doesn't re-check the signature. */
52
+ private devToken;
51
53
  /**
52
54
  * Pending backoff retry after a transient failure (see
53
55
  * LICENSE_TRANSIENT_RETRY_DELAYS). At most one is ever outstanding, and it
@@ -172,6 +174,8 @@ declare class LicenseManagerImpl {
172
174
  tierSource: TierSource;
173
175
  isPro: boolean;
174
176
  access: import("./accountAccess").AccountAccess;
177
+ teamRole: string | null;
178
+ allowedTools: string[] | null;
175
179
  isInitialized: boolean;
176
180
  isValidating: boolean;
177
181
  licenseKey: string | null;
@@ -179,6 +183,12 @@ declare class LicenseManagerImpl {
179
183
  errorKind: "transport" | "verdict" | null;
180
184
  expiresAt: Date | null;
181
185
  };
186
+ /**
187
+ * What the person's team shows them: the sign-in's role and tool list, or
188
+ * else the dev token's. A key names no person, so it has no list. This
189
+ * only shapes the menu; tier and caps never read it.
190
+ */
191
+ getTeamAccess(): TeamAccess;
182
192
  getAccountAccess(): import("./accountAccess").AccountAccess;
183
193
  private getKeyAccess;
184
194
  hasAccountAccess(): boolean;
@@ -11,7 +11,7 @@
11
11
  * under 17 U.S.C. § 1201 — which applies whether or not any code is copied.
12
12
  *
13
13
  * Pro is $9/mo, and is free every weekend for anyone holding a key —
14
- * including a free one (`npx buoy login`). Buy a key at
14
+ * including a free one (`npx --package=@buoy-gg/core buoy login`). Buy a key at
15
15
  * https://buoy.gg or use it free on Saturday and Sunday.
16
16
  */
17
17
  /** The subset of the cache that the checksum covers. */
@@ -12,7 +12,7 @@
12
12
  * § 1201, which applies whether or not any code is copied.
13
13
  *
14
14
  * Pro is $9/mo, and is free every weekend for anyone holding a key —
15
- * including a free one (`npx buoy login`). Buy a key at
15
+ * including a free one (`npx --package=@buoy-gg/core buoy login`). Buy a key at
16
16
  * https://buoy.gg or use it free on Saturday and Sunday.
17
17
  */
18
18
  /**
@@ -5,7 +5,7 @@
5
5
  * (https://buoy.gg/terms), not an OSS license.
6
6
  */
7
7
  /**
8
- * Dev tokens (BUOY_SIGN_IN_PLAN.md 2.3): what `npx buoy login` writes into a
8
+ * Dev tokens (BUOY_SIGN_IN_PLAN.md 2.3): what `npx --package=@buoy-gg/core buoy login` writes into a
9
9
  * project for dev builds and sims. A sign-in token for the audience "dev",
10
10
  * good for 30 days, checked offline. Only dev builds take it, so one that
11
11
  * slips into a shipped app opens nothing there.
@@ -12,7 +12,7 @@
12
12
  * which applies whether or not any code is copied.
13
13
  *
14
14
  * Pro is $9/mo, and is free every weekend for anyone holding a key —
15
- * including a free one (`npx buoy login`). Buy a key at
15
+ * including a free one (`npx --package=@buoy-gg/core buoy login`). Buy a key at
16
16
  * https://buoy.gg or use it free on Saturday and Sunday.
17
17
  */
18
18
  import { LicenseManager } from "./LicenseManager";
@@ -13,7 +13,7 @@
13
13
  * copied.
14
14
  *
15
15
  * Pro is $9/mo, and is free every weekend for anyone holding a key —
16
- * including a free one (`npx buoy login`). Buy a key at
16
+ * including a free one (`npx --package=@buoy-gg/core buoy login`). Buy a key at
17
17
  * https://buoy.gg or use it free on Saturday and Sunday.
18
18
  */
19
19
  /**
@@ -46,7 +46,7 @@ export { isDevToken } from "./devToken";
46
46
  export { getSyncCredential } from "./syncCredential";
47
47
  export { isBuoyToken } from "./freeToken";
48
48
  export { isWeekendFreePro, useWeekendFreePro } from "./weekendPro";
49
- export type { BuoyTier, TierSource, LicenseState, LicenseEvent, LicenseListener, LicenseValidationResult, CachedLicense, } from "./types";
49
+ export type { BuoyTier, TierSource, LicenseState, LicenseEvent, LicenseListener, LicenseValidationResult, CachedLicense, TeamAccess, } from "./types";
50
50
  export declare function setLicenseKey(key: string): Promise<boolean>;
51
51
  export declare function isPro(): boolean;
52
52
  export declare function hasEntitlement(code: string): boolean;
@@ -13,7 +13,7 @@
13
13
  * copied.
14
14
  *
15
15
  * Pro is $9/mo, and is free every weekend for anyone holding a key —
16
- * including a free one (`npx buoy login`). Buy a key at
16
+ * including a free one (`npx --package=@buoy-gg/core buoy login`). Buy a key at
17
17
  * https://buoy.gg or use it free on Saturday and Sunday.
18
18
  */
19
19
  export { LicenseManager } from "./LicenseManager";
@@ -35,7 +35,7 @@ export { isDevToken } from "./devToken";
35
35
  export { getSyncCredential } from "./syncCredential";
36
36
  export { isBuoyToken } from "./freeToken";
37
37
  export { isWeekendFreePro, useWeekendFreePro } from "./weekendPro";
38
- export type { BuoyTier, TierSource, LicenseState, LicenseEvent, LicenseListener, LicenseValidationResult, CachedLicense, } from "./types";
38
+ export type { BuoyTier, TierSource, LicenseState, LicenseEvent, LicenseListener, LicenseValidationResult, CachedLicense, TeamAccess, } from "./types";
39
39
  export declare function setLicenseKey(key: string): Promise<boolean>;
40
40
  export declare function isPro(): boolean;
41
41
  export declare function hasEntitlement(code: string): boolean;
@@ -12,7 +12,7 @@
12
12
  * applies whether or not any code is copied.
13
13
  *
14
14
  * Pro is $9/mo, and is free every weekend for anyone holding a key —
15
- * including a free one (`npx buoy login`). Buy a key at
15
+ * including a free one (`npx --package=@buoy-gg/core buoy login`). Buy a key at
16
16
  * https://buoy.gg or use it free on Saturday and Sunday.
17
17
  */
18
18
  import type { BuoyTier, KeygenLicense } from "./types";
@@ -213,6 +213,27 @@ export interface LicenseState {
213
213
  */
214
214
  errorKind: "transport" | "verdict" | null;
215
215
  expiresAt: Date | null;
216
+ /**
217
+ * The person's team role, from their sign-in or dev token. Null for keys.
218
+ * Filled in by `getState()`; the stored state never holds it.
219
+ */
220
+ teamRole?: string | null;
221
+ /**
222
+ * The Buoy tools this person's team role shows, or null for all tools
223
+ * (`isTeamToolAllowed` in @buoy-gg/floating-tools-core applies it). Filled
224
+ * in by `getState()`, like `teamRole`.
225
+ */
226
+ allowedTools?: string[] | null;
227
+ }
228
+ /**
229
+ * What a person's Business team shows them. It shapes the menu only: tier,
230
+ * caps and capture never read it.
231
+ */
232
+ export interface TeamAccess {
233
+ /** Their team role, e.g. "qa". Null for keys and personal accounts. */
234
+ role: string | null;
235
+ /** The Buoy tools their role shows, or null for all tools. */
236
+ tools: string[] | null;
216
237
  }
217
238
  export type LicenseEventType = "initialized" | "validating" | "validated" | "error" | "deactivated";
218
239
  export interface LicenseEvent {
@@ -13,7 +13,7 @@
13
13
  * whether or not any code is copied.
14
14
  *
15
15
  * Pro is $9/mo, and is free every weekend for anyone holding a key —
16
- * including a free one (`npx buoy login`). Buy a key at
16
+ * including a free one (`npx --package=@buoy-gg/core buoy login`). Buy a key at
17
17
  * https://buoy.gg or use it free on Saturday and Sunday.
18
18
  */
19
19
  /** Whether the Weekend Pass is active right now (local Saturday or Sunday). */
@@ -0,0 +1 @@
1
+ "use client";import{m as e}from"./chunk-3RVGU64S.mjs";import"./chunk-J7MW3NXU.mjs";export{e as LicenseManager};
@@ -0,0 +1,73 @@
1
+ "use client";import{a as p,d as Ee}from"./chunk-J7MW3NXU.mjs";var L=new Map,be={async getItem(e){try{return localStorage.getItem(e)??L.get(e)??null}catch{return L.get(e)??null}},async setItem(e,t){L.set(e,t);try{localStorage.setItem(e,t)}catch{}},async removeItem(e){L.delete(e);try{localStorage.removeItem(e)}catch{}}};async function y(){return be}var xe="3b546fc717a62683f3236c70167899a271bee3ffc04df6ec1eea60a394a2f1e9";var Le="36abba0267f7f379d992a5b6df641daab4190bcc9e639e36f1378e3c1ac52746";var I=Object.freeze({accountId:"b0eba0e8-e904-4906-b644-38f9aab57bed",productId:"bf67cb43-eeef-40ca-b308-e6e1b22c0eaa",apiUrl:"https://buoy.gg/api/license"}),R=Object.freeze({free:"394e3351-1249-4f73-807a-703408604c0e",solo:"fa5d3c8f-5379-40f1-b63e-ab8a974b2f28",business:"690c2212-8e54-426f-b4b4-002ee1c0ae2b"}),N=720*60*60*1e3,Ie=1440*60*1e3,M="buoy-gg-license",V="buoy-gg-device-fingerprint",Re=3600*1e3,Ne=[5*1e3,20*1e3,60*1e3,300*1e3,900*1e3],Ce=60*1e3,q=3600*1e3,Pe=1440*60*1e3,Se=50,Ke=N,D="buoy-gg-license-hold";function h(){let e=globalThis.__buoyRealNow;return typeof e=="function"?e():Date.now()}var{apiUrl:Z}=I,A=class extends Error{constructor(e,t,i=null){super(e);this.isTransient=true;this.name="LicenseTransportError",this.status=t,this.retryAfterMs=i}};function Oe(e){let t=e?.status;return t===429||t===402}function Me(e,t,i){return e.status===402?t:e.retryAfterMs??i}function Ve(e){let t=s=>{try{return e.headers?.get?.(s)??null}catch{return null}},i=t("Retry-After");if(i){let s=Number(i);if(Number.isFinite(s)&&s>=0)return s*1e3;let n=Date.parse(i);if(Number.isFinite(n))return Math.max(0,n-h())}let r=Number(t("X-RateLimit-Reset"));return Number.isFinite(r)&&r>0?Math.max(0,r*1e3-h()):null}function Q(e){return e instanceof A||e instanceof TypeError?true:typeof e=="object"&&e!==null&&e.isTransient===true}async function De(e){try{return(await e.json()).errors?.[0]?.detail||`HTTP ${e.status}`}catch{return`HTTP ${e.status}`}}function ee(){return{"Content-Type":"application/vnd.api+json",Accept:"application/vnd.api+json"}}async function Ue(e,t){let i=`${Z}/validate`,r={meta:{key:e}},s;try{s=await fetch(i,{signal:t,method:"POST",headers:ee(),body:JSON.stringify(r)})}catch(n){throw new A(n instanceof Error?n.message:"Network request failed",null)}if(!s.ok)throw new A(await De(s),s.status,s.status===429?Ve(s):null);try{let n=await s.json();if(!n||typeof n!="object"||typeof n.meta?.valid!="boolean"||typeof n.meta?.code!="string"||!n.meta.code)throw new Error("Missing license verdict");return n}catch{throw new A("License server returned an unreadable response",s.status)}}async function Fe(e){let t=typeof AbortController=="function"?new AbortController:null,i;try{return await Promise.race([Ue(e,t?.signal),new Promise((r,s)=>{i=setTimeout(()=>{s(new A("License verification timed out. Please retry.",null)),t?.abort()},15e3)})])}finally{i&&clearTimeout(i)}}function $e(e){if(!e.data)return false;let t=e.data.relationships?.product?.data?.id;return t&&t!==I.productId?false:e.meta.valid&&e.meta.code==="VALID"?true:["OVERDUE","NO_MACHINE","NO_MACHINES","TOO_MANY_MACHINES","TOO_MANY_CORES","TOO_MANY_PROCESSES","FINGERPRINT_SCOPE_MISMATCH","HEARTBEAT_NOT_STARTED","HEARTBEAT_DEAD"].includes(e.meta.code)}function je(e){let t=e.data?.relationships?.machines?.meta?.count;return typeof t=="number"&&Number.isFinite(t)?t:0}async function te(e,t,i,r,s){let n=`${Z}/machines`,c=await fetch(n,{method:"POST",headers:ee(),body:JSON.stringify({licenseId:e,licenseKey:t,fingerprint:i,name:r,metadata:s||{}})});if(!c.ok){let o=await c.json(),a=o.errors?.[0]?.code;if(a==="FINGERPRINT_TAKEN")throw new Error("FINGERPRINT_TAKEN");if(a==="MACHINE_LIMIT_EXCEEDED")throw new Error("MACHINE_LIMIT_EXCEEDED");let l=o.errors?.[0]?.detail||`HTTP ${c.status}`;throw new Error(l)}return c.json()}function Be(e){let{meta:t,data:i}=e;return{valid:t.valid,code:t.code,detail:t.detail,metadata:i?.attributes?.metadata}}function ze(e){return["NOT_FOUND","SUSPENDED","EXPIRED","BANNED","PRODUCT_SCOPE_MISMATCH"].includes(e)}function U(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}function F(){let e=Ee();if(e!==null)return e;if(typeof p<"u")return p;try{if(typeof navigator<"u"&&/electron/i.test(navigator.userAgent))return true}catch{}return typeof process<"u"&&process.env.NODE_ENV!=="production"}function ie(){if(typeof navigator>"u")return"unknown";let e=navigator.userAgent.toLowerCase(),t=navigator.platform?.toLowerCase()||"";return e.includes("electron")?t.includes("mac")||e.includes("mac")?"electron-macos":t.includes("win")||e.includes("win")?"electron-windows":t.includes("linux")||e.includes("linux")?"electron-linux":"electron":t.includes("mac")||e.includes("mac")?"macos":t.includes("win")||e.includes("win")?"windows":t.includes("linux")||e.includes("linux")?"linux":/iphone|ipad|ipod/.test(e)?"ios-web":e.includes("android")?"android-web":"web"}function He(){if(typeof navigator>"u")return"unknown";let e=navigator.userAgent,t=e.match(/Mac OS X ([\d_.]+)/);if(t)return t[1].replace(/_/g,".");let i=e.match(/Windows NT ([\d.]+)/);return i?{"10.0":"10/11","6.3":"8.1","6.2":"8","6.1":"7"}[i[1]]||i[1]:e.includes("Linux")?"Linux":"unknown"}function re(){if(typeof navigator>"u")return{name:"unknown",version:"unknown"};let e=navigator.userAgent,t=e.match(/Electron\/([\d.]+)/);if(t)return{name:"Electron",version:t[1]};let i=e.match(/Chrome\/([\d.]+)/);if(i&&!e.includes("Edg"))return{name:"Chrome",version:i[1]};let r=e.match(/Edg\/([\d.]+)/);if(r)return{name:"Edge",version:r[1]};let s=e.match(/Firefox\/([\d.]+)/);if(s)return{name:"Firefox",version:s[1]};let n=e.match(/Version\/([\d.]+).*Safari/);return n?{name:"Safari",version:n[1]}:{name:"unknown",version:"unknown"}}function se(){let e={platform:ie(),osVersion:He(),isSimulator:"false"},t=re();e.browser=t.name,e.browserVersion=t.version,typeof window<"u"&&window.screen&&(e.screenResolution=`${window.screen.width}x${window.screen.height}`),typeof navigator<"u"&&navigator.language&&(e.language=navigator.language);try{e.timezone=Intl.DateTimeFormat().resolvedOptions().timeZone}catch{}return e}function $(){let e=ie(),t=re();if(e.startsWith("electron")){let i=e.replace("electron-","").replace("electron","Desktop");return`${i.charAt(0).toUpperCase()+i.slice(1)} App`}return t.name!=="unknown"?`${t.name} Browser`:"Web Browser"}var Ge=["v1"],Je="buoy.gg/pro:9f3c1d7a4b2e:license-cache";function ne(e,t){let i=t>>>0;for(let r=0;r<e.length;r++)i^=e.charCodeAt(r),i=Math.imul(i,16777619)>>>0;return i>>>0}function Ye(e,t){let i=[t,e.licenseKey,e.licenseId,e.isPro?"1":"0",e.expiresAt??"",String(e.cachedAt)];return t!=="v1"&&i.push(e.tier??""),i.push(Je),i.join("\0")}function ae(e,t){let i=Ye(e,t),r=ne(i,2166136261),s=ne(i,2135587861);return`${t}.${r.toString(16)}${s.toString(16)}`}function oe(e){return ae(e,"v2")}function le(e){return{...e,sig:oe(e)}}function _(e){return!e||typeof e.sig!="string"||e.sig.length===0?false:e.sig===oe(e)?true:Ge.some(t=>e.sig.startsWith(`${t}.`)&&e.sig===ae(e,t))}import Xe from"tweetnacl";var We=1,qe=1,Ze="buoy-free-token-v1:",Qe=22,et=64,ce=/^BUOY1-([A-Z2-7]+)-([A-Z2-7]+)$/;function he(e){return ce.test(e.trim().toUpperCase())}var tt="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";function ue(e){let t=[],i=0,r=0;for(let s of e){let n=tt.indexOf(s);if(n===-1)return null;r=r<<5|n,i+=5,i>=8&&(t.push(r>>>i-8&255),i-=8)}return new Uint8Array(t)}function it(e){let t=e.trim().toLowerCase(),i=new Uint8Array(t.length/2);for(let r=0;r<i.length;r+=1)i[r]=parseInt(t.slice(r*2,r*2+2),16);return i}function rt(e){let t="";for(let i of e)t+=i.toString(16).padStart(2,"0");return t}function st(e){if(typeof TextEncoder<"u")return new TextEncoder().encode(e);let t=new Uint8Array(e.length);for(let i=0;i<e.length;i+=1)t[i]=e.charCodeAt(i)&255;return t}function nt(e,t){let i=new Uint8Array(e.length+t.length);return i.set(e,0),i.set(t,e.length),i}function at(e){return nt(st(Ze),e)}var ot=xe;function lt(e){let t=ce.exec(e.trim().toUpperCase());if(!t)return null;let i=ue(t[1]),r=ue(t[2]);if(!i||!r||i.length!==Qe||r.length!==et||i[0]!==We||i[1]!==qe)return null;try{if(!Xe.sign.detached.verify(at(i),r,it(ot)))return null}catch{return null}return{tier:"free",issuedAt:((i[2]<<24>>>0)+(i[3]<<16)+(i[4]<<8)+i[5])*1e3,accountHash:rt(i.slice(6,22))}}function ct(e){let t=e.relationships?.policy?.data?.id;return t===R.free?"free":t===R.solo||t===R.business?"pro":e.attributes?.metadata?.plan==="free"?"free":"pro"}function ht(e){if(!e)return false;let t=e.relationships?.product?.data?.id;if(t)return t===I.productId;let i=e.relationships?.policy?.data?.id;return Object.values(R).some(r=>r===i)}function de(e,t=h()){let i=e.verifiedAt!==null&&Number.isFinite(e.verifiedAt)&&e.verifiedAt<=t?e.verifiedAt+N:null;return e.initialized&&e.key&&e.tierSource!=="none"&&i!==null&&t<i?{status:"admitted",reason:null,validUntil:i}:i!==null&&t>=i?{status:"locked",reason:"verification_expired",validUntil:i}:!e.initialized||e.validating?{status:"initializing",reason:"checking",validUntil:i}:{status:"locked",reason:i!==null&&t>=i?"verification_expired":"account_required",validUntil:i}}function ut(e){if(typeof window>"u"||typeof window.addEventListener!="function")return()=>{};let t=()=>{document.hidden||e()};return window.addEventListener("focus",e),document.addEventListener("visibilitychange",t),()=>{window.removeEventListener("focus",e),document.removeEventListener("visibilitychange",t)}}import dt from"tweetnacl";var fe="buoys1",ft="buoy-session-v1:",pe=1,j=60,pt=64,mt=["free","pro","business"],g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";function B(e){let t="",i=0;for(;i+2<e.length;i+=3){let s=e[i]<<16|e[i+1]<<8|e[i+2];t+=g[s>>>18&63]+g[s>>>12&63]+g[s>>>6&63]+g[s&63]}let r=e.length-i;if(r===1){let s=e[i]<<16;t+=g[s>>>18&63]+g[s>>>12&63]}else if(r===2){let s=e[i]<<16|e[i+1]<<8;t+=g[s>>>18&63]+g[s>>>12&63]+g[s>>>6&63]}return t}function me(e){if(!/^[A-Za-z0-9_-]*$/.test(e)||e.length%4===1)return null;let t=[],i=0,r=0;for(let s of e)r=r<<6|g.indexOf(s),i+=6,i>=8&&(t.push(r>>>i-8&255),i-=8);return new Uint8Array(t)}function gt(e){if(typeof TextEncoder<"u")return new TextEncoder().encode(e);let t=unescape(encodeURIComponent(e)),i=new Uint8Array(t.length);for(let r=0;r<t.length;r+=1)i[r]=t.charCodeAt(r);return i}function yt(e){try{if(typeof TextDecoder<"u")return new TextDecoder("utf-8",{fatal:true}).decode(e);let t="";for(let i of e)t+=String.fromCharCode(i);return decodeURIComponent(escape(t))}catch{return null}}function wt(e){let t=e.trim().toLowerCase(),i=new Uint8Array(t.length/2);for(let r=0;r<i.length;r+=1)i[r]=parseInt(t.slice(r*2,r*2+2),16);return i}function vt(e){return gt(ft+e)}function k(e,t=256){return typeof e=="string"&&e.length>0&&e.length<=t}function ge(e){return typeof e=="number"&&Number.isInteger(e)&&e>0}function Tt(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;return!k(t.sid)||!k(t.sub)||!k(t.aud,512)||t.team!==null&&!k(t.team)||!mt.includes(t.tier)||t.role!==void 0&&!k(t.role,64)||t.tools!==void 0&&(!Array.isArray(t.tools)||t.tools.length>256||!t.tools.every(i=>k(i,64)))||!ge(t.iat)||!ge(t.exp)||t.exp<=t.iat?null:{v:pe,sid:t.sid,sub:t.sub,team:t.team,tier:t.tier,...t.role!==void 0?{role:t.role}:{},...t.tools!==void 0?{tools:[...t.tools]}:{},aud:t.aud,iat:t.iat,exp:t.exp}}var At=Le;function ye(e){return e.startsWith(`${fe}.`)}function z(e,t){let i=At;if(!i)return{ok:false,reason:"no-key"};let r=typeof e=="string"?e.split("."):[];if(r.length!==3||r[0]!==fe)return{ok:false,reason:"malformed"};let[,s,n]=r,c=me(s),o=me(n);if(!c||!o||o.length!==pt)return{ok:false,reason:"malformed"};try{if(!dt.sign.detached.verify(vt(s),o,wt(i)))return{ok:false,reason:"signature"}}catch{return{ok:false,reason:"signature"}}let a=yt(c),l;try{l=a===null?null:JSON.parse(a)}catch{return{ok:false,reason:"malformed"}}if(!l||typeof l!="object"||l.v!==pe)return{ok:false,reason:l&&typeof l=="object"?"version":"malformed"};let u=Tt(l);if(!u)return{ok:false,reason:"claims"};if(u.aud!==t.audience)return{ok:false,reason:"audience"};if(t.ignoreTime)return{ok:true,claims:u};let f=Math.floor((t.nowMs??h())/1e3);return f>=u.exp+j?{ok:false,reason:"expired"}:u.iat>f+j?{ok:false,reason:"not-yet-valid"}:{ok:true,claims:u}}var _t="@buoy/session:",C=10080*60*1e3,we=360*60*1e3,kt=300*1e3,Et=15e3,bt="https://buoy.gg",xt="buoy:signin",Lt=600*1e3,d=class extends Error{constructor(e,t){super(t);this.code=e;this.name="SessionError"}};function It(){let e=globalThis;return{fetch:(t,i)=>fetch(t,i),storage:y,now:h,random:t=>{let i=new Uint8Array(t);if(!e.crypto?.getRandomValues)throw new d("not_configured","This platform has no secure random source.");return e.crypto.getRandomValues(i)},sha256:async t=>{if(!e.crypto?.subtle)throw new d("not_configured","Sign-in needs a secure page (https or localhost).");return new Uint8Array(await e.crypto.subtle.digest("SHA-256",t))},openPopup:()=>{if(!e.window?.open)return null;let t=480,i=640,r=Math.max(0,(e.window.screenX??0)+((e.window.outerWidth??t)-t)/2),s=Math.max(0,(e.window.screenY??0)+((e.window.outerHeight??i)-i)/2);return e.window.open("about:blank","buoy-signin",`popup,width=${t},height=${i},left=${r},top=${s}`)},onMessage:t=>{if(!e.window?.addEventListener)return()=>{};let i=r=>t({origin:r.origin,data:r.data});return e.window.addEventListener("message",i),()=>e.window?.removeEventListener("message",i)},withLock:(t,i)=>e.navigator?.locks?e.navigator.locks.request(t,i):i(),watch:t=>{let i=e.window;if(!i?.addEventListener)return()=>{};let r=n=>t.storage(n.key),s=()=>{i.document?.visibilityState!=="hidden"&&t.wake()};return i.addEventListener("storage",r),i.addEventListener("online",t.wake),i.document?.addEventListener?.("visibilitychange",s),()=>{i.removeEventListener("storage",r),i.removeEventListener("online",t.wake),i.document?.removeEventListener?.("visibilitychange",s)}},setTimer:(t,i)=>setTimeout(t,Math.min(i,2147483647)),clearTimer:t=>clearTimeout(t)}}function Rt(){let e=globalThis.location;if(!(!e?.origin||!/^https?:$/.test(e.protocol??"")))return e.origin}var Nt=class{constructor(e){this.signinOrigin=bt;this.current=null;this.claims=null;this.listeners=new Set;this.timer=null;this.refreshing=null;this.loaded=null;this.unwatch=null;this.limitTimer=null;this.epoch=0;this.deps=e??It(),this.audience=Rt()}get origin(){return this.signinOrigin}configure(e){e.audience!==void 0&&(this.audience=e.audience),e.signinOrigin!==void 0&&(this.signinOrigin=e.signinOrigin.replace(/\/$/,"")),this.reset()}reset(){this.unwatch?.(),this.unwatch=null,this.epoch+=1,this.limitTimer!==null&&this.deps.clearTimer(this.limitTimer),this.limitTimer=null,this.timer!==null&&this.deps.clearTimer(this.timer),this.timer=null,this.current=null,this.claims=null,this.loaded=null,this.refreshing=null}get storageKey(){return _t+(this.audience??"")}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}notify(){for(let e of[...this.listeners])try{e()}catch(t){console.warn("[Buoy] sign-in listener error:",t)}}getAccessToken(){let e=this.getStatus();return e.state==="active"&&!e.grace?this.current?.accessToken??null:null}getStatus(){let e=this.claims;if(!e)return{state:"signed_out"};let t=e.exp*1e3,i=this.deps.now();return i<(e.iat-j)*1e3?{state:"signed_out"}:i<t?{state:"active",claims:e,grace:false,validUntil:t}:i<t+C?{state:"active",claims:e,grace:true,validUntil:t+C}:{state:"signed_out"}}load(){return this.loaded||(this.loaded=this.loadOnce()),this.loaded}async loadOnce(){if(!this.audience)return;this.unwatch??(this.unwatch=this.deps.watch?.({storage:t=>{(t===null||t===this.storageKey)&&this.sync()},wake:()=>{this.claims&&this.refresh()}})??null);let e=await this.read();e&&this.adopt(e)&&(this.notify(),this.schedule())}async sync(){if(!this.audience)return;let e=await this.read();if(!e){this.current&&this.clearLocal();return}e.refreshToken!==this.current?.refreshToken&&this.adopt(e)&&(this.notify(),this.schedule())}async read(){try{let e=await(await this.deps.storage()).getItem(this.storageKey);if(!e)return null;let t=JSON.parse(e);return t?.v===1&&typeof t.accessToken=="string"&&typeof t.refreshToken=="string"?t:null}catch{return null}}async write(e){let t=await this.deps.storage();e?await t.setItem(this.storageKey,JSON.stringify(e)):await t.removeItem(this.storageKey)}adopt(e){if(!this.audience)return false;let t=z(e.accessToken,{audience:this.audience,ignoreTime:true}),i=t.ok?t.claims:null;return i?(this.current=e,this.claims=i,true):false}armLimit(){if(this.limitTimer!==null&&this.deps.clearTimer(this.limitTimer),this.limitTimer=null,!this.claims)return;let e=this.claims.exp*1e3,t=this.deps.now(),i=t<e?e:t<e+C?e+C:null;i!==null&&(this.limitTimer=this.deps.setTimer(()=>{this.limitTimer=null,this.notify(),this.armLimit()},i-t))}call(e,t){return new Promise((i,r)=>{let s=this.deps.setTimer(()=>r(new Error("timeout")),Et);this.deps.fetch(e,t).then(n=>{this.deps.clearTimer(s),i(n)},n=>{this.deps.clearTimer(s),r(n)})})}schedule(){if(this.armLimit(),this.timer!==null&&this.deps.clearTimer(this.timer),this.timer=null,!this.claims)return;let e=this.claims.exp*1e3-we-this.deps.now();this.timer=this.deps.setTimer(()=>{this.timer=null,this.refresh()},Math.max(0,e))}refresh(e=false){return this.refreshing||(this.refreshing=this.deps.withLock(this.lockName,()=>this.refreshLocked(e)).catch(()=>this.retryLater()).finally(()=>{this.refreshing=null})),this.refreshing}get lockName(){return`buoy-session:${this.audience??""}`}async refreshLocked(e){let t=this.epoch,i=await this.read();if(!i){this.current&&this.clearLocal();return}if(i.refreshToken!==this.current?.refreshToken&&this.adopt(i)){this.notify(),this.schedule();return}if(!this.claims)return;if(!e&&this.claims.exp*1e3-this.deps.now()>we){this.schedule();return}let r,s;try{let n=await this.call(`${this.signinOrigin}/api/auth/refresh`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refresh_token:i.refreshToken,audience:this.audience})});r=n.status,s=await n.json().catch(()=>null)}catch{this.retryLater();return}if(t===this.epoch){if(r===200&&s&&typeof s.access_token=="string"&&typeof s.refresh_token=="string"){let n={v:1,accessToken:s.access_token,refreshToken:s.refresh_token};if(this.adopt(n)){await this.write(n),this.notify(),this.schedule();return}}if(r===400||r===401||r===403){await this.write(null),this.clearLocal();return}this.retryLater()}}retryLater(){this.armLimit(),this.timer!==null&&this.deps.clearTimer(this.timer),this.timer=this.deps.setTimer(()=>{this.timer=null,this.refresh(true)},kt),this.notify()}clearLocal(){this.timer!==null&&this.deps.clearTimer(this.timer),this.timer=null,this.limitTimer!==null&&this.deps.clearTimer(this.limitTimer),this.limitTimer=null,this.current=null,this.claims=null,this.notify()}async signIn(){if(!this.audience)throw new d("not_configured","Sign-in needs a web page or a configured app id.");let e=this.deps.openPopup();if(!e)throw new d("popup_blocked","The browser blocked the sign-in window. Allow pop-ups for this site and try again.");try{return await this.signInWith((t,i)=>new Promise((r,s)=>{e.location.href=t;let n=this.deps.now(),c=null,o=u=>{c!==null&&this.deps.clearTimer(c),a(),u()},a=this.deps.onMessage(u=>{if(u.origin!==this.signinOrigin)return;let f=u.data;!f||f.type!==xt||f.state!==i||(typeof f.code=="string"?o(()=>r(f.code)):o(()=>s(new d("access_denied","Sign-in was cancelled."))))}),l=()=>{if(e.closed)return o(()=>s(new d("popup_closed","The sign-in window was closed.")));if(this.deps.now()-n>Lt)return o(()=>s(new d("timeout","Sign-in took too long.")));c=this.deps.setTimer(l,500)};c=this.deps.setTimer(l,500)}))}finally{try{e.closed||e.close()}catch{}}}async signInWith(e){let t=this.audience;if(!t)throw new d("not_configured","Sign-in needs a web page or a configured app id.");let i=B(this.deps.random(32)),r=B(this.deps.random(16)),s=B(await this.deps.sha256(new TextEncoder().encode(i))),n=`${this.signinOrigin}/auth/authorize?audience=${encodeURIComponent(t)}&code_challenge=${s}&code_challenge_method=S256&state=${r}`,c=await e(n,r),o;try{o=await this.call(`${this.signinOrigin}/api/auth/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:c,code_verifier:i,audience:t})})}catch{throw new d("network","Buoy could not be reached. Check your connection and try again.")}let a=await o.json().catch(()=>null);if(o.status!==200||!a||typeof a.access_token!="string"||typeof a.refresh_token!="string"){let l=a&&typeof a.error_description=="string"?a.error_description:"Buoy did not accept this sign-in.";throw new d(o.status===503?"unavailable":"rejected",l)}return this.finishSignIn(a.access_token,a.refresh_token)}async finishSignIn(e,t){let i={v:1,accessToken:e,refreshToken:t};if(this.epoch+=1,!this.adopt(i))throw new d("rejected","Buoy sent a sign-in this app could not check.");return await this.write(i),await this.load(),this.notify(),this.schedule(),this.getStatus()}async signInWithCode(e,t={}){let i=this.audience;if(!i)throw new d("not_configured","Sign-in with a code needs this app's id (app:com.example.app).");let r=(a,l)=>this.call(`${this.signinOrigin}/api/auth/device/${a}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(l)}),s;try{s=await r("start",{audience:i})}catch{throw new d("network","Buoy could not be reached. Check your connection and try again.")}let n=await s.json().catch(()=>null);if(s.status!==200||!n||typeof n.device_code!="string"||typeof n.user_code!="string"||typeof n.verification_uri!="string"||typeof n.verification_uri_complete!="string"){let a=n&&typeof n.error_description=="string"?n.error_description:"Buoy could not start a sign-in.";throw new d(s.status===503?"unavailable":"rejected",a)}let c=this.deps.now()+(Number(n.expires_in)||600)*1e3,o=Math.max(5,Number(n.interval)||5)*1e3;for(e({userCode:n.user_code,verificationUri:n.verification_uri,verificationUriComplete:n.verification_uri_complete,expiresAt:c});;){if(await this.wait(o,t.signal),this.deps.now()>c)throw new d("timeout","The code ran out. Start again for a new one.");let a;try{a=await r("poll",{device_code:n.device_code})}catch{continue}let l=await a.json().catch(()=>null);if(a.status===200&&l&&typeof l.access_token=="string"&&typeof l.refresh_token=="string")return this.finishSignIn(l.access_token,l.refresh_token);let u=l&&typeof l.error=="string"?l.error:"";if(u==="authorization_pending"||a.status>=500)continue;if(u==="slow_down"||a.status===429){o+=5e3;continue}if(u==="access_denied")throw new d("access_denied","The sign-in was turned down on buoy.gg.");if(u==="expired_token")throw new d("timeout","The code ran out. Start again for a new one.");let f=l&&typeof l.error_description=="string"?l.error_description:"Buoy did not accept this sign-in.";throw new d("rejected",f)}}wait(e,t){return new Promise((i,r)=>{let s=()=>new d("access_denied","Sign-in was cancelled.");if(t?.aborted)return r(s());let n=()=>{this.deps.clearTimer(c),r(s())},c=this.deps.setTimer(()=>{t?.removeEventListener?.("abort",n),i()},e);t?.addEventListener?.("abort",n)})}async signOut(){this.epoch+=1;let e=this.current;this.clearLocal();let t=e;try{await this.deps.withLock(this.lockName,async()=>{t=await this.read()??e,await this.write(null)})}catch{await this.write(null).catch(()=>{})}if(t)try{await this.call(`${this.signinOrigin}/api/auth/revoke`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refresh_token:t.refreshToken})})}catch{}}},v=new Nt;var Ct="bsk1_",Pt="service",St=15e3;function H(e){return e.startsWith(Ct)}function b(e){let t=e.trim();return H(t)||ye(t)?t:t.toUpperCase()}function Kt(e,t){return b(e??"")===b(t??"")}async function Ot(e,t){let i=t.fetch??((a,l)=>fetch(a,l)),r=typeof AbortController<"u"?new AbortController:void 0,s=setTimeout(()=>r?.abort(),St),n,c;try{let a=await i(`${t.origin.replace(/\/$/,"")}/api/auth/service-token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:e}),signal:r?.signal});n=a.status,c=await a.json().catch(()=>null)}catch{return{ok:false,reason:"network",detail:"Buoy could not be reached to check the bot key."}}finally{clearTimeout(s)}if(n>=500||n===429)return{ok:false,reason:"network",detail:"Buoy is busy. The bot key will be checked again soon."};if(n!==200||typeof c?.access_token!="string")return{ok:false,reason:"rejected",detail:typeof c?.error_description=="string"?c.error_description:"This bot key was not accepted."};let o=z(c.access_token,{audience:Pt,nowMs:h()});return o.ok?{ok:true,claims:o.claims}:{ok:false,reason:"rejected",detail:"Buoy sent a token this app could not check."}}var Mt="dev";function ve(e){return ye(e)}function Te(e,t=h()){let i=z(e,{audience:Mt,ignoreTime:true});return i.ok?t>=i.claims.exp*1e3?{ok:false,reason:"expired",message:"Your dev token ran out. Run `npx --package=@buoy-gg/core buoy login` again."}:{ok:true,claims:i.claims}:{ok:false,reason:"invalid",message:"This dev token is not valid. Run `npx --package=@buoy-gg/core buoy login` again."}}var Vt="This is a dev token. It only works in dev builds. A live build turns on Buoy with Sign in with Buoy.";var Dt={role:null,tools:null};function Ae(e){return{role:e.role??null,tools:e.tools??null}}async function w(e,t){let i;try{return await Promise.race([e,new Promise(r=>{i=setTimeout(()=>r(t),15e3)})])}finally{i&&clearTimeout(i)}}function E(e){return e.tier==="pro"||e.tier==="free"?e.tier:e.isPro?"pro":"free"}var Ut=class{constructor(){this.state={isInitialized:false,isValidating:false,isPro:false,tier:"free",tierSource:"none",licenseKey:null,error:null,errorKind:null,expiresAt:null};this.listeners=new Set;this.revalidationTimer=null;this.cachedLicense=null;this.fingerprintPromise=null;this.initPromise=null;this.generation=0;this.persistence=Promise.resolve();this.verifiedAt=null;this.expiryTimer=null;this.removeForegroundListener=null;this.sessionUnsubscribe=null;this.devToken=null;this.retryTimer=null;this.retryAttempt=0;this.deviceRegistrationCallback=null;this.pendingRegistration=null}async initialize(){if(this.initPromise)return this.initPromise;if(!this.state.isInitialized)return this.initPromise=this._doInitialize(),this.initPromise}async _doInitialize(){if(this.state.isInitialized)return;let e=this.generation;this.sessionUnsubscribe||(this.sessionUnsubscribe=v.subscribe(()=>this.emit({type:"validated",isPro:this.isPro()}))),await w(v.load().catch(()=>{}),void 0);try{let t=await w(this.loadCachedLicense(),null);if(e!==this.generation){this.state.isInitialized=true,this.emit({type:"initialized",isPro:this.state.isPro}),this.startRevalidationTimer();return}if(t&&(this.configuredKey===void 0||t.licenseKey===this.configuredKey)){let i=_(t);this.cachedLicense=t,this.state.licenseKey=t.licenseKey,i&&this.isCacheValid(t)?this.applyTier(E(t)):this.lock(),this.state.expiresAt=t.expiresAt?new Date(t.expiresAt):null,i&&this.isCacheValid(t)&&this.setVerifiedAt(t.cachedAt),this.configuredKey===void 0&&t.licenseKey&&!(i&&this.isCacheValid(t)&&this.isCacheFresh(t))&&this.validateInBackground(t.licenseKey)}this.state.isInitialized=true,this.emit({type:"initialized",isPro:this.state.isPro}),this.startRevalidationTimer()}catch(t){console.warn("[Buoy]","[React Buoy] License initialization failed:",t),this.state.isInitialized=true,this.emit({type:"initialized",isPro:false})}}async configure(e){if(e===void 0)return await this.initialize(),this.hasAccountAccess();let t=b(e),i=++this.generation;return this.cancelRetry(),this.configuredKey=t||null,this.state.licenseKey!==this.configuredKey&&this.lock(),this.state.licenseKey=this.configuredKey,this.state.isValidating=!!t,this.emit({type:"validating",isPro:this.isPro()}),await this.initialize(),i!==this.generation?false:t?this.setLicenseKey(t):(await this.clearLicense(),false)}async setLicenseKey(e,t){if(!e||e.trim().length===0)return this.state.error="License key is required",this.state.errorKind="verdict",false;let i=b(e),r=++this.generation;if(this.cancelRetry(),t?.isRetry||(this.retryAttempt=0),this.state.licenseKey!==i&&this.lock(),this.state.licenseKey=i,this.state.isValidating=true,this.state.error=null,this.state.errorKind=null,this.emit({type:"validating",isPro:this.isPro()}),he(i))return this.admitToken(i,r);if(H(i))return this.admitServiceKey(i,r);if(ve(i))return this.admitDevToken(i);if(!this.cachedLicense){let a=await w(this.loadCachedLicense(),null);if(r!==this.generation)return false;a?.licenseKey===i&&(this.cachedLicense=a,_(a)&&this.isCacheValid(a)&&(this.applyTier(E(a)),this.state.expiresAt=a.expiresAt?new Date(a.expiresAt):null,this.setVerifiedAt(a.cachedAt),this.emit({type:"validating",isPro:this.isPro()})))}let s=this.cachedLicense;if(!t?.force&&s&&s.valid&&s.licenseKey===i&&s.fingerprint&&_(s)&&this.isCacheValid(s)&&this.isCacheFresh(s))return this.applyTier(E(s)),this.state.licenseKey=i,this.state.isValidating=false,this.state.error=null,this.state.errorKind=null,this.state.expiresAt=s.expiresAt?new Date(s.expiresAt):null,this.setVerifiedAt(s.cachedAt),this.emit({type:"validated",isPro:this.state.isPro}),true;let n=await w(this.loadHold(),null);if(r!==this.generation)return false;let c=(n?.backoffUntil??0)-h();if(c>0)return this.standDown(i,r,"License server is rate limited; retrying later.",c);if(!t?.force&&n?.key===i&&n.verdictAt!==void 0&&h()-n.verdictAt>=0&&h()-n.verdictAt<Pe)return this.lock(),this.state.isValidating=false,this.state.error=n.detail||"License could not be verified",this.state.errorKind="verdict",this.emit({type:"error",isPro:false,error:this.state.error}),false;let o;try{o=await Fe(i)}catch(a){let l=a instanceof Error?a.message:"Validation failed";if(r!==this.generation)return false;if(Q(a)){if(Oe(a)){let u=Math.min(Me(a,q,Ce)*2**this.retryAttempt,q);return this.retryAttempt+=1,await this.saveHold({...this.hold,backoffUntil:h()+u}),r!==this.generation?false:this.standDown(i,r,l,u)}return this.state.isValidating=false,this.cachedLicense&&this.cachedLicense.licenseKey===i&&_(this.cachedLicense)&&this.isCacheValid(this.cachedLicense)?(this.applyTier(E(this.cachedLicense)),this.state.error=null,this.state.errorKind=null,this.state.expiresAt=this.cachedLicense.expiresAt?new Date(this.cachedLicense.expiresAt):null,this.setVerifiedAt(this.cachedLicense.cachedAt),this.keyTier()!=="pro"&&this.scheduleRetry(i),this.emit({type:"validated",isPro:this.state.isPro}),true):(this.state.error=l,this.state.errorKind="transport",this.scheduleRetry(i),this.emit({type:"error",isPro:this.state.isPro,error:l}),false)}return this.state.isValidating=false,this.state.error=l,this.state.errorKind="verdict",this.emit({type:"error",isPro:false,error:l}),false}try{if(r!==this.generation)return false;let a=Be(o),l=o.data?.relationships?.product?.data?.id;if((!l||l===I.productId)&&a.code==="EXPIRED"&&(ht(o.data)||this.cachedLicense?.licenseKey===i&&_(this.cachedLicense)&&this.isCacheValid(this.cachedLicense))){let O=h(),W=await this.saveCache({licenseKey:i,licenseId:o.data?.id??"",valid:true,isPro:false,tier:"free",expiresAt:null,cachedAt:O,lastValidatedAt:O,fingerprint:this.cachedLicense?.licenseKey===i?this.cachedLicense.fingerprint:void 0},r);return r!==this.generation||!W?false:(this.cachedLicense=W,this.applyTier("free"),this.state.isValidating=false,this.state.expiresAt=null,this.setVerifiedAt(O),this.emit({type:"validated",isPro:false}),true)}if(ze(a.code)||!$e(o))return this.lock(),this.state.isValidating=false,this.state.error=a.detail||"License could not be verified",this.state.errorKind="verdict",this.emit({type:"error",isPro:false,error:this.state.error}),await this.clearCachedLicense(),await this.saveHold({key:i,code:a.code,detail:this.state.error,verdictAt:h()}),false;if(!o.data)return this.lock(),this.state.isValidating=false,this.state.error=a.detail||"License not found",this.state.errorKind="verdict",this.emit({type:"error",isPro:false,error:this.state.error}),await this.clearCachedLicense(),false;let u=ct(o.data),f=o.data.id,P=h(),G=je(o)>=Se,J=F(),_e=J&&!G,ke=u==="free"&&(G||!J),T=this.cachedLicense?.fingerprint,x=this.cachedLicense?.deviceName,Y=false;if(!T){if(T=await w(this.getOrCreateDeviceFingerprint(),U()),r!==this.generation)return false;x=$(),Y=_e}let S=false;Y&&(this.deviceRegistrationCallback?(this.pendingRegistration={licenseId:f,licenseKey:i,fingerprint:T},this.deviceRegistrationCallback({fingerprint:T,defaultName:x}),S=true):this.registerDeviceAsync(f,i,T,x));let K={licenseKey:i,licenseId:f,valid:true,isPro:u==="pro",tier:u,expiresAt:o.data.attributes.expiry??null,cachedAt:P,lastValidatedAt:P,fingerprint:S?void 0:T,deviceName:S?void 0:x,quiet:ke||void 0},X=await this.saveCache(K,r);return r!==this.generation||!X||(this.cachedLicense=X,this.applyTier(u),this.state.isValidating=false,this.state.expiresAt=K.expiresAt?new Date(K.expiresAt):null,this.setVerifiedAt(P),this.hold&&await this.saveHold(null),r!==this.generation)?false:(this.retryAttempt=0,this.emit({type:"validated",isPro:this.state.isPro}),true)}catch(a){let l=a instanceof Error?a.message:"Validation failed";return r!==this.generation||(this.state.isValidating=false,this.state.error=l,this.state.errorKind="verdict",this.emit({type:"error",isPro:false,error:l})),false}}scheduleRetry(e){this.cancelRetry();let t=Ne[this.retryAttempt];if(t===void 0)return;this.retryAttempt+=1;let i=this.generation;this.retryTimer=setTimeout(()=>{this.retryTimer=null,i===this.generation&&(this.state.isValidating||this.setLicenseKey(e,{force:true,isRetry:true}))},t),typeof p<"u"&&p&&(globalThis.__LICENSE_MANAGER_RETRY_TIMER__=this.retryTimer)}async admitServiceKey(e,t){let i=await Ot(e,{origin:v.origin});if(t!==this.generation)return false;if(!i.ok)return this.lock(),this.state.isValidating=false,this.state.error=i.detail,this.state.errorKind=i.reason==="network"?"transport":"verdict",this.emit({type:"error",isPro:false,error:i.detail}),i.reason==="network"&&this.scheduleRetry(e),false;let r=i.claims.exp*1e3;return this.applyTier(i.claims.tier==="free"?"free":"pro"),this.state.isValidating=false,this.state.expiresAt=new Date(r),this.setVerifiedAt(h()),this.retryAttempt=0,this.scheduleRetryIn(e,Math.max(6e4,r-3600*1e3-h())),this.emit({type:"validated",isPro:this.isPro()}),true}admitDevToken(e){let t=Te(e);if(!t.ok||!F()){let r=t.ok?Vt:t.message;return this.lock(),this.state.isValidating=false,this.state.error=r,this.state.errorKind="verdict",this.emit({type:"error",isPro:false,error:r}),false}let i=h();return this.devToken={token:e,claims:t.claims},this.applyTier(t.claims.tier==="free"?"free":"pro"),this.state.isValidating=false,this.state.expiresAt=new Date(t.claims.exp*1e3),this.setVerifiedAt(Math.min(i,t.claims.iat*1e3)),this.retryAttempt=0,this.emit({type:"validated",isPro:this.isPro()}),true}async admitToken(e,t){let i=lt(e);if(t!==this.generation)return false;if(!i)return this.lock(),this.state.isValidating=false,this.state.error="This key is not valid. Check that it was copied completely.",this.state.errorKind="verdict",this.emit({type:"error",isPro:false,error:this.state.error}),await this.clearCachedLicense(),false;let r=h(),s=this.cachedLicense?.fingerprint??await w(this.getOrCreateDeviceFingerprint(),U());if(t!==this.generation)return false;let n=await this.saveCache({licenseKey:e,licenseId:`token:${i.accountHash}`,valid:true,isPro:false,tier:"free",expiresAt:null,cachedAt:r,lastValidatedAt:r,fingerprint:s,deviceName:this.cachedLicense?.deviceName??$(),quiet:true},t);return t!==this.generation||!n?false:(this.cachedLicense=n,this.applyTier("free"),this.state.isValidating=false,this.state.expiresAt=null,this.setVerifiedAt(r),this.retryAttempt=0,this.emit({type:"validated",isPro:false}),true)}standDown(e,t,i,r){if(t!==this.generation)return false;this.state.isValidating=false;let s=this.cachedLicense;return s&&s.licenseKey===e&&_(s)&&this.isCacheValid(s)?(this.applyTier(E(s)),this.state.error=null,this.state.errorKind=null,this.state.expiresAt=s.expiresAt?new Date(s.expiresAt):null,this.setVerifiedAt(s.cachedAt),this.keyTier()!=="pro"&&this.scheduleRetryIn(e,r),this.emit({type:"validated",isPro:this.state.isPro}),true):(this.state.error=i,this.state.errorKind="transport",this.scheduleRetryIn(e,r),this.emit({type:"error",isPro:this.state.isPro,error:i}),false)}scheduleRetryIn(e,t){this.cancelRetry();let i=this.generation;this.retryTimer=setTimeout(()=>{this.retryTimer=null,i===this.generation&&(this.state.isValidating||this.setLicenseKey(e,{force:true,isRetry:true}))},Math.max(1,Math.min(t,2147483647))),typeof p<"u"&&p&&(m.__LICENSE_MANAGER_RETRY_TIMER__=this.retryTimer)}cancelRetry(){this.retryTimer&&(clearTimeout(this.retryTimer),this.retryTimer=null)}async clearLicense(){this.generation+=1,this.cancelRetry(),this.retryAttempt=0,this.configuredKey=null,this.state.licenseKey=null,this.lock(),this.state.expiresAt=null,this.state.error=null,this.state.errorKind=null,this.cachedLicense=null,this.pendingRegistration=null,this.state.isValidating=false,this.emit({type:"deactivated",isPro:false}),await this.clearCachedLicense(),this.hold?.verdictAt!==void 0&&await this.saveHold(this.hold.backoffUntil?{backoffUntil:this.hold.backoffUntil}:null)}applyTier(e){this.state.tier=e,this.state.tierSource="key",this.state.isPro=e==="pro"}lock(){this.state.tier="free",this.state.tierSource="none",this.state.isPro=false,this.verifiedAt=null,this.expiryTimer&&clearTimeout(this.expiryTimer),this.expiryTimer=null}getTier(){return this.credential().tier}credential(){let e=this.keyTier(),t=this.sessionTier();return t!==null&&(!this.hasKeyAccess()||t==="pro"&&e!=="pro")?{source:"session",tier:t}:{source:this.state.tierSource,tier:e}}keyTier(){return!this.hasKeyAccess()||this.state.expiresAt&&h()>=this.state.expiresAt.getTime()?"free":this.state.tier}sessionTier(){let e=v.getStatus();return e.state!=="active"?null:e.claims.tier==="free"?"free":"pro"}isPro(){return this.getTier()==="pro"}hasEntitlement(e){return this.isPro()}getState(){let{source:e,tier:t}=this.credential(),i=this.getTeamAccess();return{...this.state,tier:t,tierSource:e,isPro:t==="pro",access:this.getAccountAccess(),teamRole:i.role,allowedTools:i.tools}}getTeamAccess(){let e=v.getStatus();if(e.state==="active")return Ae(e.claims);let t=this.devToken;return t&&t.token===this.state.licenseKey&&this.state.tierSource==="key"&&h()<t.claims.exp*1e3&&this.hasKeyAccess()?Ae(t.claims):Dt}getAccountAccess(){let e=this.getKeyAccess();if(e.status==="admitted")return e;let t=v.getStatus();return t.state==="active"?{status:"admitted",reason:null,validUntil:t.validUntil}:e}getKeyAccess(){return de({initialized:this.state.isInitialized,validating:this.state.isValidating,key:this.state.licenseKey,tierSource:this.state.tierSource,verifiedAt:this.verifiedAt})}hasAccountAccess(){return this.getAccountAccess().status==="admitted"}hasKeyAccess(){return this.getKeyAccess().status==="admitted"}setVerifiedAt(e){this.verifiedAt=e,this.expiryTimer&&clearTimeout(this.expiryTimer);let t=e+N,i=this.state.expiresAt?.getTime(),r=(i&&i>h()?Math.min(t,i):t)-h();this.expiryTimer=setTimeout(()=>{this.expiryTimer=null,this.verifiedAt===e&&(this.emit({type:"validated",isPro:this.isPro()}),h()<t&&this.setVerifiedAt(e))},Math.max(1,Math.min(r,2147483647))),typeof p<"u"&&p&&(m.__LICENSE_MANAGER_EXPIRY_TIMER__=this.expiryTimer)}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}onDeviceRegistrationNeeded(e){return this.deviceRegistrationCallback=e,()=>{this.deviceRegistrationCallback=null}}async completeDeviceRegistration(e){if(!this.pendingRegistration){console.warn("[Buoy] No pending device registration");return}let{licenseId:t,licenseKey:i,fingerprint:r}=this.pendingRegistration,s=this.generation,n=e.trim()||$(),c=se();try{await te(t,i,r,n,c)}catch(o){let a=o instanceof Error?o.message:String(o);if(!(a==="FINGERPRINT_TAKEN"||a==="MACHINE_LIMIT_EXCEEDED"))throw console.warn("[Buoy] Device registration failed:",a),o}if(s===this.generation){if(this.cachedLicense?.licenseKey===i){let o=await this.saveCache({...this.cachedLicense,fingerprint:r,deviceName:n},s);if(s!==this.generation)return;o&&(this.cachedLicense=o)}this.pendingRegistration=null}}emit(e){[...this.listeners].forEach(t=>{try{t(e)}catch(i){console.warn("[Buoy]","[React Buoy] License listener error:",i)}})}isCacheValid(e){let t=h()-e.cachedAt;return!(!e.valid||!Number.isFinite(e.cachedAt)||t<0||t>=N)}isCacheFresh(e){let t=this.isQuiet(e)?Ke:Re;return h()-(e.lastValidatedAt??0)<t}isQuiet(e){return e.quiet!==void 0?e.quiet:E(e)==="free"&&!F()}async loadHold(){if(this.hold!==void 0)return this.hold;try{let e=await(await y()).getItem(D),t=e?JSON.parse(e):null;this.hold=t&&typeof t=="object"?t:null}catch{this.hold=null}return this.hold}async saveHold(e){this.hold=e;try{let t=await y();e?await t.setItem(D,JSON.stringify(e)):await t.removeItem(D)}catch{}}async persistCache(e){let t=le(e);return await(await y()).setItem(M,JSON.stringify(t)),t}saveCache(e,t){let i=this.persistence.catch(()=>{}).then(async()=>{if(t!==this.generation)return null;let r=await this.persistCache(e);return t===this.generation?r:null});return this.persistence=i,w(i,le(e))}async loadCachedLicense(){try{await this.persistence.catch(()=>{});let e=await(await y()).getItem(M);return e?JSON.parse(e):null}catch(e){return console.warn("[Buoy] Error loading cached license:",e),null}}getOrCreateDeviceFingerprint(){return this.fingerprintPromise||(this.fingerprintPromise=(async()=>{let e=await y(),t=await e.getItem(V);if(t)return t;let i=this.cachedLicense?.fingerprint||U();return await e.setItem(V,i),i})()),this.fingerprintPromise}async clearCachedLicense(){this.cachedLicense=null;let e=this.persistence.catch(()=>{}).then(async()=>{await(await y()).removeItem(M)});this.persistence=e,await w(e.catch(()=>{}),void 0)}registerDeviceAsync(e,t,i,r){let s=se();te(e,t,i,r,s).catch(n=>{n.message!=="FINGERPRINT_TAKEN"&&n.message!=="MACHINE_LIMIT_EXCEEDED"&&console.warn("[Buoy] Device registration failed (non-blocking):",n.message)})}validateInBackground(e){this.setLicenseKey(e,{force:true,isRetry:true})}refreshAccess(){this.emit({type:"validated",isPro:this.isPro()})}startRevalidationTimer(){this.removeForegroundListener||(this.removeForegroundListener=ut(()=>this.refreshAccess()),typeof p<"u"&&p&&(m.__LICENSE_MANAGER_FOREGROUND_OFF__=this.removeForegroundListener)),this.revalidationTimer&&clearInterval(this.revalidationTimer),this.revalidationTimer=setInterval(()=>{if(!this.state.licenseKey||this.state.isValidating)return;let e=this.cachedLicense;e&&e.licenseKey===this.state.licenseKey&&this.isCacheFresh(e)||this.validateInBackground(this.state.licenseKey)},Ie),typeof p<"u"&&p&&(globalThis.__LICENSE_MANAGER_TIMER__=this.revalidationTimer)}stopRevalidationTimer(){this.removeForegroundListener?.(),this.removeForegroundListener=null,this.expiryTimer&&clearTimeout(this.expiryTimer),this.expiryTimer=null,this.revalidationTimer&&(clearInterval(this.revalidationTimer),this.revalidationTimer=null),this.cancelRetry()}async forceReregister(){this.cachedLicense&&(this.cachedLicense.fingerprint=void 0,this.cachedLicense.deviceName=void 0),this.fingerprintPromise=null,await this.clearCachedLicense();try{await(await y()).removeItem(V)}catch{}}},Ft=new Ut,m=globalThis;typeof p<"u"&&p&&(m.__LICENSE_MANAGER_FOREGROUND_OFF__?.(),m.__LICENSE_MANAGER_FOREGROUND_OFF__=void 0,m.__LICENSE_MANAGER_EXPIRY_TIMER__&&clearTimeout(m.__LICENSE_MANAGER_EXPIRY_TIMER__),m.__LICENSE_MANAGER_TIMER__&&clearInterval(m.__LICENSE_MANAGER_TIMER__),m.__LICENSE_MANAGER_RETRY_TIMER__&&(clearTimeout(m.__LICENSE_MANAGER_RETRY_TIMER__),m.__LICENSE_MANAGER_RETRY_TIMER__=void 0));export{h as a,A as b,Q as c,he as d,de as e,d as f,v as g,H as h,b as i,Kt as j,ve as k,Te as l,Ft as m};/*!
2
+ * PROPRIETARY — Buoy Pro license enforcement. NOT open source.
3
+ *
4
+ * Copyright (c) Buoy. All rights reserved. Licensed under the Buoy EULA
5
+ * (https://buoy.gg/terms), not an OSS license.
6
+ *//*!
7
+ * PROPRIETARY — Buoy Pro license enforcement. NOT open source.
8
+ *
9
+ * Copyright (c) Buoy. All rights reserved. Licensed under the Buoy EULA
10
+ * (https://buoy.gg/terms), not an OSS license.
11
+ *
12
+ * This file configures the technological measure that controls access to paid
13
+ * Buoy Pro features. Modifying, patching, aliasing, stubbing, or otherwise
14
+ * altering it — including repointing `apiUrl` at a stand-in license server — so
15
+ * that Pro features unlock without a valid license is a breach of the EULA and,
16
+ * in the United States, circumvention of an access control under 17 U.S.C.
17
+ * § 1201, which applies whether or not any code is copied.
18
+ *
19
+ * Pro is $9/mo, and is free every weekend for anyone holding a key —
20
+ * including a free one (`npx --package=@buoy-gg/core buoy login`). Buy a key at
21
+ * https://buoy.gg or use it free on Saturday and Sunday.
22
+ *//*!
23
+ * PROPRIETARY — Buoy Pro license enforcement. NOT open source.
24
+ *
25
+ * Copyright (c) Buoy. All rights reserved. Licensed under the Buoy EULA
26
+ * (https://buoy.gg/terms), not an OSS license.
27
+ *
28
+ * This file is part of the technological measure that controls access to paid
29
+ * Buoy Pro features. Modifying, patching, aliasing, stubbing, or otherwise
30
+ * altering it so that Pro features unlock without a valid license is a breach
31
+ * of the EULA and, in the United States, circumvention of an access control
32
+ * under 17 U.S.C. § 1201 — which applies whether or not any code is copied.
33
+ *
34
+ * Pro is $9/mo, and is free every weekend for anyone holding a key —
35
+ * including a free one (`npx --package=@buoy-gg/core buoy login`). Buy a key at
36
+ * https://buoy.gg or use it free on Saturday and Sunday.
37
+ *//*!
38
+ * PROPRIETARY — Buoy Pro license enforcement. NOT open source.
39
+ *
40
+ * Copyright (c) Buoy. All rights reserved. Licensed under the Buoy EULA
41
+ * (https://buoy.gg/terms), not an OSS license.
42
+ *
43
+ * This file is part of the technological measure that controls access to paid
44
+ * Buoy Pro features: it decides which tier a validated key grants. Modifying,
45
+ * patching, aliasing, stubbing, or otherwise altering it so that Pro features
46
+ * unlock without a valid license is a breach of the EULA and, in the United
47
+ * States, circumvention of an access control under 17 U.S.C. § 1201 — which
48
+ * applies whether or not any code is copied.
49
+ *
50
+ * Pro is $9/mo, and is free every weekend for anyone holding a key —
51
+ * including a free one (`npx --package=@buoy-gg/core buoy login`). Buy a key at
52
+ * https://buoy.gg or use it free on Saturday and Sunday.
53
+ *//*!
54
+ * PROPRIETARY — Buoy license enforcement. NOT open source.
55
+ *
56
+ * Copyright (c) Buoy. All rights reserved. Licensed under the Buoy EULA
57
+ * (https://buoy.gg/terms), not an OSS license.
58
+ *//*!
59
+ * PROPRIETARY — Buoy Pro license enforcement. NOT open source.
60
+ *
61
+ * Copyright (c) Buoy. All rights reserved. Licensed under the Buoy EULA
62
+ * (https://buoy.gg/terms), not an OSS license.
63
+ *
64
+ * This file is the technological measure that controls access to paid Buoy Pro
65
+ * features. Modifying, patching, aliasing, stubbing, or otherwise altering it
66
+ * so that Pro features unlock without a valid license is a breach of the EULA
67
+ * and, in the United States, circumvention of an access control under
68
+ * 17 U.S.C. § 1201 — which applies whether or not any code is copied.
69
+ *
70
+ * Pro is $9/mo, and is free every weekend for anyone holding a key —
71
+ * including a free one (`npx --package=@buoy-gg/core buoy login`). Buy a key at
72
+ * https://buoy.gg or use it free on Saturday and Sunday.
73
+ */
package/lib/web/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- "use client";import{a as k,b as y,c as A,d as S,e as L,f as P,g as b,h,i as v,j as I,k as E,l as K,m as z,n as T,o as w,p as B,q as D,r as F,s as N}from"./chunks/chunk-D5RC3UOG.mjs";import{a as W,b as M,c as O,d as j,e as x,f as H,g as n,h as Q,i as V,j as _,k as f,l as q,m as t}from"./chunks/chunk-OP6QSLZS.mjs";import{b as G,c as J,d as R,e as U}from"./chunks/chunk-J7MW3NXU.mjs";import{useEffect as X,useState as Y}from"react";function l(s=new Date(W())){if(globalThis.__buoyWeekendPassOff===true)return false;let e=s.getDay();return e===0||e===6}function p(){let[s,e]=Y(()=>l());return X(()=>{let r=setInterval(()=>{let a=l();e(i=>i===a?i:a)},6e4);return()=>clearInterval(r)},[]),s}function g(s,e){return e&&s}import{useState as d,useEffect as C,useCallback as u}from"react";function c(){let[s,e]=d(t.getState());C(()=>{let i=t.subscribe(o=>{e(t.getState())});return t.initialize().then(()=>{e(t.getState())}),i},[]);let r=u(async i=>{let o=await t.setLicenseKey(i,{force:true});return e(t.getState()),o},[]),a=u(async()=>{await t.clearLicense(),e(t.getState())},[]);return{...s,setLicenseKey:r,clearLicense:a}}function Z(){return c().access}function $(){let{tier:s,isInitialized:e}=c();return e?s:"free"}function ee(s){let{isPro:e,isInitialized:r,isValidating:a}=c();return{hasAccess:e,isPro:e,isLoading:!r||a}}function se(){let{isPro:s,isInitialized:e,access:r}=c(),a=g(r.status==="admitted",p());return e&&s||a}function ae(){let{isPro:s,isInitialized:e,access:r}=c(),a=e&&s,i=g(r.status==="admitted",p())&&!a;return{isPro:a||i,isLicensed:a,isWeekendFree:i,reason:a?"licensed":i?"weekend":null}}function te(){let[s,e]=d(()=>n.getStatus());C(()=>{let i=()=>e(n.getStatus()),o=n.subscribe(i);return n.load().then(i,i),o},[]);let r=u(()=>n.signIn(),[]),a=u(()=>n.signOut(),[]);return{status:s,signIn:r,signOut:a}}function ie(){let s=n.getAccessToken();if(s)return{token:s,origin:n.origin};let e=t.getState().licenseKey;return e&&f(e)&&t.hasAccountAccess()&&q(e).ok?{token:e,origin:n.origin}:null}async function re(s){let{LicenseManager:e}=await import("./chunks/LicenseManager-G4PF6ILL.mjs");return await e.initialize(),e.setLicenseKey(s)}function m(){return g(t.hasAccountAccess(),l())}function ne(){return t.isPro()?true:m()}function ce(s){return t.hasEntitlement(s)?true:m()}export{t as LicenseManager,M as LicenseTransportError,H as SessionError,n as SessionManager,E as callCapacitorAsApp,I as callCapacitorNative,K as callCapacitorNativeCallback,R as capacitorDebug,h as capacitorListenerCount,J as capacitorPlatform,D as capacitorPlugin,w as clearCapacitorCalls,A as colorSchemeQueryValue,b as emitCapacitorEvent,N as getCapacitorAppHost,T as getCapacitorCalls,S as getColorSchemeQueries,ie as getSyncCredential,v as hasCapacitorPlugin,ce as hasEntitlement,y as installCapacitorBridge,P as interceptCapacitor,j as isBuoyToken,L as isCapacitorBridgeInstalled,G as isCapacitorNative,f as isDevToken,ne as isPro,Q as isServiceKey,O as isTransientLicenseError,l as isWeekendFreePro,z as listenCapacitorNative,F as loadCapacitorAppHost,k as makeCapacitorCallbackId,V as normalizeLicenseKey,x as resolveAccountAccess,U as resolveDevBuild,_ as sameLicenseKey,re as setLicenseKey,B as subscribeCapacitorCalls,Z as useAccountAccess,te as useBuoySession,ee as useFeatureAccess,se as useIsPro,c as useLicense,ae as useProAccess,$ as useTier,p as useWeekendFreePro};/*!
1
+ "use client";import{a as k,b as y,c as A,d as S,e as L,f as P,g as b,h,i as v,j as I,k as E,l as K,m as z,n as T,o as w,p as B,q as D,r as F,s as N}from"./chunks/chunk-D5RC3UOG.mjs";import{a as W,b as M,c as O,d as j,e as x,f as H,g as n,h as Q,i as V,j as _,k as f,l as q,m as t}from"./chunks/chunk-3RVGU64S.mjs";import{b as G,c as J,d as R,e as U}from"./chunks/chunk-J7MW3NXU.mjs";import{useEffect as X,useState as Y}from"react";function l(s=new Date(W())){if(globalThis.__buoyWeekendPassOff===true)return false;let e=s.getDay();return e===0||e===6}function p(){let[s,e]=Y(()=>l());return X(()=>{let r=setInterval(()=>{let a=l();e(i=>i===a?i:a)},6e4);return()=>clearInterval(r)},[]),s}function g(s,e){return e&&s}import{useState as d,useEffect as C,useCallback as u}from"react";function c(){let[s,e]=d(t.getState());C(()=>{let i=t.subscribe(o=>{e(t.getState())});return t.initialize().then(()=>{e(t.getState())}),i},[]);let r=u(async i=>{let o=await t.setLicenseKey(i,{force:true});return e(t.getState()),o},[]),a=u(async()=>{await t.clearLicense(),e(t.getState())},[]);return{...s,setLicenseKey:r,clearLicense:a}}function Z(){return c().access}function $(){let{tier:s,isInitialized:e}=c();return e?s:"free"}function ee(s){let{isPro:e,isInitialized:r,isValidating:a}=c();return{hasAccess:e,isPro:e,isLoading:!r||a}}function se(){let{isPro:s,isInitialized:e,access:r}=c(),a=g(r.status==="admitted",p());return e&&s||a}function ae(){let{isPro:s,isInitialized:e,access:r}=c(),a=e&&s,i=g(r.status==="admitted",p())&&!a;return{isPro:a||i,isLicensed:a,isWeekendFree:i,reason:a?"licensed":i?"weekend":null}}function te(){let[s,e]=d(()=>n.getStatus());C(()=>{let i=()=>e(n.getStatus()),o=n.subscribe(i);return n.load().then(i,i),o},[]);let r=u(()=>n.signIn(),[]),a=u(()=>n.signOut(),[]);return{status:s,signIn:r,signOut:a}}function ie(){let s=n.getAccessToken();if(s)return{token:s,origin:n.origin};let e=t.getState().licenseKey;return e&&f(e)&&t.hasAccountAccess()&&q(e).ok?{token:e,origin:n.origin}:null}async function re(s){let{LicenseManager:e}=await import("./chunks/LicenseManager-LOBHCMIJ.mjs");return await e.initialize(),e.setLicenseKey(s)}function m(){return g(t.hasAccountAccess(),l())}function ne(){return t.isPro()?true:m()}function ce(s){return t.hasEntitlement(s)?true:m()}export{t as LicenseManager,M as LicenseTransportError,H as SessionError,n as SessionManager,E as callCapacitorAsApp,I as callCapacitorNative,K as callCapacitorNativeCallback,R as capacitorDebug,h as capacitorListenerCount,J as capacitorPlatform,D as capacitorPlugin,w as clearCapacitorCalls,A as colorSchemeQueryValue,b as emitCapacitorEvent,N as getCapacitorAppHost,T as getCapacitorCalls,S as getColorSchemeQueries,ie as getSyncCredential,v as hasCapacitorPlugin,ce as hasEntitlement,y as installCapacitorBridge,P as interceptCapacitor,j as isBuoyToken,L as isCapacitorBridgeInstalled,G as isCapacitorNative,f as isDevToken,ne as isPro,Q as isServiceKey,O as isTransientLicenseError,l as isWeekendFreePro,z as listenCapacitorNative,F as loadCapacitorAppHost,k as makeCapacitorCallbackId,V as normalizeLicenseKey,x as resolveAccountAccess,U as resolveDevBuild,_ as sameLicenseKey,re as setLicenseKey,B as subscribeCapacitorCalls,Z as useAccountAccess,te as useBuoySession,ee as useFeatureAccess,se as useIsPro,c as useLicense,ae as useProAccess,$ as useTier,p as useWeekendFreePro};/*!
2
2
  * PROPRIETARY — Buoy Pro license enforcement. NOT open source.
3
3
  *
4
4
  * Copyright (c) Buoy. All rights reserved. Licensed under the Buoy EULA
@@ -13,7 +13,7 @@
13
13
  * whether or not any code is copied.
14
14
  *
15
15
  * Pro is $9/mo, and is free every weekend for anyone holding a key —
16
- * including a free one (`npx buoy login`). Buy a key at
16
+ * including a free one (`npx --package=@buoy-gg/core buoy login`). Buy a key at
17
17
  * https://buoy.gg or use it free on Saturday and Sunday.
18
18
  *//*!
19
19
  * PROPRIETARY — Buoy Pro license enforcement. NOT open source.
@@ -29,7 +29,7 @@
29
29
  * which applies whether or not any code is copied.
30
30
  *
31
31
  * Pro is $9/mo, and is free every weekend for anyone holding a key —
32
- * including a free one (`npx buoy login`). Buy a key at
32
+ * including a free one (`npx --package=@buoy-gg/core buoy login`). Buy a key at
33
33
  * https://buoy.gg or use it free on Saturday and Sunday.
34
34
  *//*!
35
35
  * PROPRIETARY — Buoy license enforcement. NOT open source.
@@ -51,6 +51,6 @@
51
51
  * copied.
52
52
  *
53
53
  * Pro is $9/mo, and is free every weekend for anyone holding a key —
54
- * including a free one (`npx buoy login`). Buy a key at
54
+ * including a free one (`npx --package=@buoy-gg/core buoy login`). Buy a key at
55
55
  * https://buoy.gg or use it free on Saturday and Sunday.
56
56
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buoy-gg/license",
3
- "version": "7.0.74",
3
+ "version": "7.0.76",
4
4
  "description": "License validation for React Buoy Pro features",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "main": "lib/commonjs/index.js",
@@ -1 +0,0 @@
1
- "use client";import{m as e}from"./chunk-OP6QSLZS.mjs";import"./chunk-J7MW3NXU.mjs";export{e as LicenseManager};