@buildbase/sdk 0.0.81 → 0.0.83

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 (47) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.md +16 -39
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.d.ts +8 -4
  5. package/dist/index.mjs +1 -1
  6. package/dist/react/chunks/{SettingsDialog-CUBciXwN.cjs → SettingsDialog-Bm5N3G9q.cjs} +1 -1
  7. package/dist/react/chunks/{SettingsDialog-BOCot3J_.mjs → SettingsDialog-BzKi7eOI.mjs} +1 -1
  8. package/dist/react/chunks/SubscriptionDialog-Bs5J1bDH.mjs +2 -0
  9. package/dist/react/chunks/SubscriptionDialog-DNuJHptx.cjs +2 -0
  10. package/dist/react/chunks/ar-4O9xrkV6.mjs +2 -0
  11. package/dist/react/chunks/ar-Dcph0Rl-.cjs +2 -0
  12. package/dist/react/chunks/de-D0wYkKfr.cjs +2 -0
  13. package/dist/react/chunks/de-ITC4I4gE.mjs +2 -0
  14. package/dist/react/chunks/es-D4d7IQzB.cjs +2 -0
  15. package/dist/react/chunks/es-DDUCoxrg.mjs +2 -0
  16. package/dist/react/chunks/fr-BomsBzOa.cjs +2 -0
  17. package/dist/react/chunks/fr-BsWwwise.mjs +2 -0
  18. package/dist/react/chunks/hi-BmpRGcI3.cjs +2 -0
  19. package/dist/react/chunks/hi-D5uXZGQc.mjs +2 -0
  20. package/dist/react/chunks/ja-D5amIGZT.cjs +2 -0
  21. package/dist/react/chunks/ja-DkMcdOxv.mjs +2 -0
  22. package/dist/react/chunks/react-7Ot04crv.mjs +2 -0
  23. package/dist/react/chunks/react-BwS8YQQF.cjs +2 -0
  24. package/dist/react/chunks/zh-BRYcvEMm.cjs +2 -0
  25. package/dist/react/chunks/zh-C8cgAVXA.mjs +2 -0
  26. package/dist/react/index.cjs +1 -1
  27. package/dist/react/index.d.ts +8 -4
  28. package/dist/react/index.mjs +1 -1
  29. package/package.json +1 -1
  30. package/dist/react/chunks/SubscriptionDialog-0FsCZJTS.cjs +0 -2
  31. package/dist/react/chunks/SubscriptionDialog-DLAas784.mjs +0 -2
  32. package/dist/react/chunks/ar-CY5Dq0by.cjs +0 -2
  33. package/dist/react/chunks/ar-Dex5Ufml.mjs +0 -2
  34. package/dist/react/chunks/de-3FhmseQO.mjs +0 -2
  35. package/dist/react/chunks/de-DNxAYrVz.cjs +0 -2
  36. package/dist/react/chunks/es-CkPgg0z3.cjs +0 -2
  37. package/dist/react/chunks/es-D24eERya.mjs +0 -2
  38. package/dist/react/chunks/fr-BFy3cJkq.mjs +0 -2
  39. package/dist/react/chunks/fr-CtjhOWPB.cjs +0 -2
  40. package/dist/react/chunks/hi-B_O-ka_f.cjs +0 -2
  41. package/dist/react/chunks/hi-B_enIYaV.mjs +0 -2
  42. package/dist/react/chunks/ja-DvcJc9aC.mjs +0 -2
  43. package/dist/react/chunks/ja-DxP_yPZv.cjs +0 -2
  44. package/dist/react/chunks/react-BE4DCscY.cjs +0 -2
  45. package/dist/react/chunks/react-CDLs_iVH.mjs +0 -2
  46. package/dist/react/chunks/zh-Ca0rUF4N.cjs +0 -2
  47. package/dist/react/chunks/zh-CsEL_Cc6.mjs +0 -2
package/dist/index.d.ts CHANGED
@@ -2896,19 +2896,21 @@ declare function appPermissionCatalogue(settings?: SettingsLike | null, appPermi
2896
2896
 
2897
2897
  /**
2898
2898
  * Push notification service worker source code.
2899
- * Export this string and write it to a file in your app's `public/` directory.
2899
+ * Write this string to your app's `public/` directory in a prebuild step, so
2900
+ * the worker updates whenever the SDK does.
2900
2901
  *
2901
2902
  * @example
2902
2903
  * ```ts
2903
- * // scripts/generate-sw.ts
2904
+ * // scripts/write-push-sw.mjs, run as "prebuild" in package.json
2904
2905
  * import { PUSH_SERVICE_WORKER_SCRIPT } from '@buildbase/sdk';
2905
2906
  * import fs from 'fs';
2906
2907
  * fs.writeFileSync('public/push-sw.js', PUSH_SERVICE_WORKER_SCRIPT);
2907
2908
  * ```
2908
2909
  *
2909
- * Or manually create `public/push-sw.js` with this content.
2910
+ * Do not paste a copy into `public/` by hand: a copy never picks up the
2911
+ * fixes a later SDK release makes to the worker.
2910
2912
  */
2911
- declare const PUSH_SERVICE_WORKER_SCRIPT = "\n// BuildBase Push Notification Service Worker\n// Place this file in your app's public directory (e.g. public/push-sw.js)\n\nself.addEventListener('push', function(event) {\n if (!event.data) return;\n\n try {\n const payload = event.data.json();\n // i18n exception: service workers run outside the SDK's translation\n // provider, so this last-resort fallback stays English. The server should\n // always send a localized payload.title.\n const title = payload.title || 'Notification';\n const options = {\n body: payload.body || '',\n icon: payload.icon || undefined,\n badge: payload.icon || undefined,\n data: { url: payload.url, ...(payload.data || {}) },\n tag: 'buildbase-push-' + Date.now(),\n };\n\n event.waitUntil(\n self.registration.showNotification(title, options)\n );\n } catch (e) {\n console.error('[PushSW] Failed to show notification:', e);\n }\n});\n\nself.addEventListener('notificationclick', function(event) {\n event.notification.close();\n\n const url = event.notification.data && event.notification.data.url;\n if (url) {\n event.waitUntil(\n clients.matchAll({ type: 'window', includeUncontrolled: true }).then(function(clientList) {\n for (let i = 0; i < clientList.length; i++) {\n const client = clientList[i];\n if (client.url === url && 'focus' in client) {\n return client.focus();\n }\n }\n if (clients.openWindow) {\n return clients.openWindow(url);\n }\n })\n );\n }\n});\n";
2913
+ declare const PUSH_SERVICE_WORKER_SCRIPT = "\n// BuildBase Push Notification Service Worker\n// Place this file in your app's public directory (e.g. public/push-sw.js)\n\nself.addEventListener('push', function(event) {\n if (!event.data) return;\n\n let payload;\n try {\n payload = event.data.json();\n } catch (e) {\n console.error('[PushSW] Push payload is not JSON:', e);\n return;\n }\n if (!payload || typeof payload !== 'object') return;\n\n // i18n exception: service workers run outside the SDK's translation\n // provider, so this last-resort fallback stays English. The server should\n // always send a localized payload.title.\n const title = payload.title || 'Notification';\n // The tracked click URL (/api/push-track/link/...) wins over any url in\n // payload.data, so a click is always counted.\n const data = Object.assign({}, payload.data && typeof payload.data === 'object' ? payload.data : {});\n if (payload.url) data.url = payload.url;\n // A notification with the same tag replaces the earlier one instead of\n // stacking. No tag means every notification is shown on its own.\n const tag = payload.tag ? String(payload.tag) : undefined;\n const actions = Array.isArray(payload.actions)\n ? payload.actions.filter(function(a) {\n return a && typeof a.action === 'string' && typeof a.title === 'string';\n })\n : undefined;\n\n const options = {\n body: payload.body || '',\n icon: payload.icon || undefined,\n badge: payload.badge || payload.icon || undefined,\n image: payload.image || undefined,\n tag: tag,\n // The browser rejects renotify without a tag.\n renotify: tag ? !!payload.renotify : false,\n actions: actions && actions.length ? actions : undefined,\n silent: !!payload.silent,\n requireInteraction: !!payload.requireInteraction,\n timestamp: typeof payload.timestamp === 'number' ? payload.timestamp : undefined,\n dir: payload.dir === 'ltr' || payload.dir === 'rtl' ? payload.dir : 'auto',\n data: data,\n };\n\n event.waitUntil(\n Promise.resolve()\n .then(function() {\n return self.registration.showNotification(title, options);\n })\n .catch(function(e) {\n // A field this browser refuses must not cost the user the\n // notification: show it again with the basics only.\n console.error('[PushSW] Failed to show notification, retrying without rich options:', e);\n return self.registration.showNotification(title, {\n body: options.body,\n icon: options.icon,\n tag: tag,\n data: data,\n });\n })\n );\n});\n\nself.addEventListener('notificationclick', function(event) {\n event.notification.close();\n\n // A click on an action button (event.action is its id) opens the same\n // tracked URL as a click on the notification body.\n const url = event.notification.data && event.notification.data.url;\n if (url) {\n event.waitUntil(\n clients.matchAll({ type: 'window', includeUncontrolled: true }).then(function(clientList) {\n for (let i = 0; i < clientList.length; i++) {\n const client = clientList[i];\n if (client.url === url && 'focus' in client) {\n return client.focus();\n }\n }\n if (clients.openWindow) {\n return clients.openWindow(url);\n }\n })\n );\n }\n});\n";
2912
2914
 
2913
2915
  interface BetaFormData {
2914
2916
  name?: string;
@@ -3123,6 +3125,8 @@ interface SDKMessages {
3123
3125
  unlimited: string;
3124
3126
  };
3125
3127
  items: {
3128
+ /** A limit with no ceiling. The catalog stores -1. */
3129
+ unlimited: string;
3126
3130
  features: string;
3127
3131
  limits: string;
3128
3132
  quotas: string;
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- let e=!0;function t(t,...n){e&&function(){try{const e="undefined"!=typeof globalThis?globalThis:null;return"development"===e?.process?.env?.NODE_ENV}catch{return!1}}()&&console.error(t,...n)}function n(e,...t){console.error(e,...t)}async function r(e){const t=await e.text();if(!t)throw new Error("Empty response body");try{return JSON.parse(t)}catch(e){throw new Error(`Invalid JSON response: ${t.substring(0,100)}${t.length>100?"...":""}`)}}async function i(e,t="Request failed"){if(!e.ok){let n,i=t;try{const t=await r(e);i=t.message||t.error||i,"string"==typeof t.code&&(n=t.code)}catch{i=function(e,t){const n={400:"Bad Request",401:"Unauthorized - Please check your session",403:"Forbidden - You do not have permission",404:"Resource not found",500:"Internal server error",502:"Bad Gateway",503:"Service unavailable"}[e.status]||e.statusText||t;return new Error(`${t} (${e.status}: ${n})`)}(e,t).message}throw Object.assign(new Error(i),{status:e.status,...n?{code:n}:{}})}try{return await r(e)}catch(e){if(e instanceof Error&&e.message.includes("Invalid JSON"))throw e;throw new Error("Failed to parse response as JSON")}}class s extends Error{constructor(e,t,n,r){super(e),this.code=t,this.context=n,this.originalError=r,this.name="SDKError","undefined"!=typeof Error&&"captureStackTrace"in Error&&Error.captureStackTrace(this,s)}}const a=new class{constructor(){this.config={enableConsoleLogging:!0,showUserNotifications:!1},this.listeners=new Set}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}configure(t){this.config={...this.config,...t},void 0!==t.enableConsoleLogging&&function(t){void 0!==t.enableLogging&&(e=t.enableLogging)}({enableLogging:t.enableConsoleLogging})}handleError(e,r={}){if(function(e){return e instanceof Error&&("AbortError"===e.name||"ERR_CANCELED"===e.code)}(e))return;const i=e instanceof Error?e:new s("string"==typeof e?e:"An unknown error occurred","UNKNOWN_ERROR",r),a=i instanceof s?i:new s(i.message,"SDK_ERROR",r,i);if(this.config.enableConsoleLogging&&t(`[SDK Error] ${r.component||"Unknown"}:`,{message:a.message,code:a.code,context:a.context,originalError:a.originalError,stack:a.stack}),this.config.onError)try{this.config.onError(a,r)}catch(e){n("[SDK Error Handler] Error in custom error callback:",e)}for(const e of this.listeners)try{e(a,r)}catch(e){n("[SDK Error Handler] Error in error listener:",e)}this.config.showUserNotifications&&this.notifyUser(a,r)}notifyUser(e,t){"undefined"!=typeof window&&window.dispatchEvent&&window.dispatchEvent(new CustomEvent("sdk-error",{detail:{error:e,context:t}}))}wrapAsync(e,t){return(...n)=>e(...n).catch(e=>{throw this.handleError(e,t),e})}wrapSync(e,t){return(...n)=>{try{return e(...n)}catch(e){throw this.handleError(e,t),e}}}};function o(e,t={}){a.handleError(e,t)}function c(e){if("undefined"==typeof window)return null;try{return localStorage.getItem(e)}catch(t){return o(t,{component:"storage",action:"getStorageItem",metadata:{key:e}}),null}}function u(e){if("undefined"!=typeof window)try{localStorage.removeItem(e)}catch(t){o(t,{component:"storage",action:"removeStorageItem",metadata:{key:e}})}}function l(e,t){const n=c(e);if(!n)return null;try{const r=JSON.parse(n);return t&&!t(r)?(o(new Error("Storage data failed validation"),{component:"storage",action:"getStorageJSON",metadata:{key:e}}),u(e),null):r}catch(t){return o(t,{component:"storage",action:"getStorageJSON",metadata:{key:e}}),u(e),null}}function d(e,t){try{!function(e,t){if("undefined"!=typeof window)try{localStorage.setItem(e,t)}catch(t){o(t,{component:"storage",action:"setStorageItem",metadata:{key:e}})}}(e,JSON.stringify(t))}catch(t){o(t,{component:"storage",action:"setStorageJSON",metadata:{key:e}})}}const p="saas-session-id",h="saas-device-id";function f(){return function(){if("undefined"==typeof window)return null;try{return c(p)}catch(e){return o(e,{component:"auth-utils",action:"getSessionId",metadata:{key:p}}),null}}()}function g(){const e=f(),t={};e&&(t["x-session-id"]=e);const n=function(){if("undefined"==typeof window)return null;try{return c(h)??null}catch(e){return o(e,{component:"auth-utils",action:"getOrCreateDeviceId",metadata:{key:h}}),null}}();return n&&(t["x-device-id"]=n),t}const w=new WeakSet,m=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),y="SDK is not ready (missing serverUrl, version, or orgId)";class k{constructor(e){this.serverUrl=e.serverUrl,this.version=e.version,this.orgId=e.orgId,this.requireOrgId=e.requireOrgId??!1,this.basePath=e.basePath??"public",this._sessionId=e.sessionId,this._timeout=e.timeout??3e4,this._maxRetries=e.maxRetries??0,this._debug=e.debug??!1,this._customHeaders=e.headers??{},this._onError=e.onError,this._onUnauthorized=e.onUnauthorized,this._fetch=e.fetch??globalThis.fetch}ensureReady(){if(!this.serverUrl?.trim()||!this.version)throw new Error(y);if(this.requireOrgId&&!this.orgId?.trim())throw new Error(y)}get baseUrl(){return this.ensureReady(),`${this.serverUrl}/api/${this.version}/${this.basePath}`}getAuthHeaders(){return this._sessionId?{"x-session-id":this._sessionId}:g()}url(e){const t=e.startsWith("/")?e.slice(1):e;return`${this.baseUrl.endsWith("/")?this.baseUrl.slice(0,-1):this.baseUrl}/${t}`}buildHeaders(e){const t={...this._customHeaders,...this.getAuthHeaders()};return e.headers&&Object.assign(t,e.headers),null==e.body||t["Content-Type"]||(t["Content-Type"]="application/json"),t}reportError(e,t){w.has(e)||(w.add(e),this._onError?.(e,t))}async executeFetch(e,t){return this.executeFetchUrl(this.url(e),t,e)}static delay(e,t){return new Promise((n,r)=>{const i=()=>{clearTimeout(s),r(new DOMException("The operation was aborted.","AbortError"))};if(t?.aborted)return i();const s=setTimeout(()=>{t?.removeEventListener("abort",i),n()},e);t?.addEventListener("abort",i,{once:!0})})}async executeFetchUrl(e,t,n){const r=(t.method??"GET").toUpperCase(),i=n??e,s=this.buildHeaders(t),a={...t,headers:s},o=m.has(r);let c,u;if(this._timeout>0){u=new AbortController;const e=u;c=setTimeout(()=>e.abort(),this._timeout),a.signal=t.signal?function(e,t){const n=AbortSignal.any;if("function"==typeof n)return n([e,t]);const r=new AbortController,i=e=>{r.signal.aborted||r.abort(e.reason)};for(const n of[e,t]){if(n.aborted){i(n);break}n.addEventListener("abort",()=>i(n),{once:!0})}return r.signal}(t.signal,e.signal):e.signal}const l=e=>{if(u?.signal.aborted&&!t.signal?.aborted){const e=new Error(`Request timeout after ${this._timeout}ms: ${r} ${i}`);return this.reportError(e,{method:r,path:i}),e}return e},d=async t=>{try{if("function"!=typeof this._fetch)throw new Error("No fetch implementation available. Global fetch requires Node 18+; on older runtimes pass a `fetch` in the SDK config (e.g. from `undici` or `node-fetch`).");const n=this._fetch.bind(globalThis),i=await n(e,a);if(this._debug&&console.log(`[BuildBase] ${r} ${e} → ${i.status}`),401===i.status&&this._onUnauthorized&&this._onUnauthorized(),i.status>=500&&o&&t<this._maxRetries){const e=Math.min(1e3*Math.pow(2,t),1e4);return this._debug&&console.log(`[BuildBase] Retrying in ${e}ms (attempt ${t+1}/${this._maxRetries})`),await k.delay(e,a.signal),d(t+1)}return i}catch(e){if(e instanceof Error&&"AbortError"===e.name)throw l(e);if(o&&t<this._maxRetries){const e=Math.min(1e3*Math.pow(2,t),1e4);this._debug&&console.log(`[BuildBase] Network error, retrying in ${e}ms (attempt ${t+1}/${this._maxRetries})`);try{await k.delay(e,a.signal)}catch(e){throw l(e)}return d(t+1)}throw e instanceof Error&&this.reportError(e,{method:r,path:i}),e}};try{return await d(0)}finally{void 0!==c&&clearTimeout(c)}}async fetchJson(e,t={},n="Request failed"){this.ensureReady();try{const r=await this.executeFetch(e,t);return await i(r,n)}catch(n){throw n instanceof Error&&this.reportError(n,{method:(t.method??"GET").toUpperCase(),path:e}),n}}async fetchResponse(e,t={}){return this.ensureReady(),this.executeFetch(e,t)}async fetchUnwrapped(e,t={},n="Request failed"){const r=await this.fetchResponse(e,t);return r.ok||await this.throwResponseError(r,n),this.unwrapResponse(r,n)}async fetchAbsoluteUrl(e,t={}){return this.ensureReady(),this.executeFetchUrl(e,t)}async throwResponseError(e,t){let n=t;try{n=(await e.json()).message||n}catch{n=`${t} (${e.status}: ${e.statusText})`}throw Object.assign(new Error(n),{status:e.status})}apiPath(e,...t){return e.reduce((e,n,r)=>e+n+(r<t.length?encodeURIComponent(String(t[r])):""),"")}async unwrapResponse(e,t){const n=await e.json();if(void 0!==n.success){if(!n.success)throw new Error(n.message||t);return void 0!==n.data?n.data:n}return n}}class b extends k{constructor(e){super(e)}async requestAuth(e){const t=`${this.serverUrl}/api/${this.version}/auth/request`,n="Failed to initiate authentication",r=e=>this.fetchAbsoluteUrl(t,{method:"POST",body:JSON.stringify(e)});let i=await r(e);if(400===i.status&&(e.trackingConsent||e.trackingIdentity||e.trackingAttribution||e.invitationToken)){const{trackingConsent:t,trackingIdentity:n,trackingAttribution:s,invitationToken:a,...o}=e;i=await r(o)}return i.ok||await this.throwResponseError(i,n),this.unwrapResponse(i,n)}async getProfile(e,t){return this.fetchJson("profile",{headers:{"x-session-id":e},signal:t},"Failed to fetch user profile")}async getDeviceToken(e,t){try{const n=await this.fetchUnwrapped("device-token",{headers:{"x-session-id":e},signal:t},"Failed to fetch device token");return n?.deviceToken??""}catch{return""}}async logout(e,t,n){await this.fetchJson("logout",{method:"POST",...e?{headers:{"x-session-id":e}}:{},...t?.all?{body:JSON.stringify({all:!0})}:{},signal:n},"Failed to sign out")}}class v extends k{constructor(e){super({...e,basePath:"beta",requireOrgId:!0})}getAuthHeaders(){return{}}async fetchConfig(){return this.fetchJson(`config?orgId=${encodeURIComponent(this.orgId)}`,{},"Failed to fetch beta form configuration")}async submitBetaUser(e){return this.fetchJson("submit",{method:"POST",body:JSON.stringify(e)},"Failed to submit beta user request")}}class S{constructor(e){this.api=new v(e),this.orgId=e.orgId}async fetchConfig(){return this.api.fetchConfig()}async submitBetaUser(e){const t=e?.context??{},n=t?.country??("undefined"!=typeof navigator&&navigator.language?navigator.language.split("-")[1]:void 0),r=t?.language??("undefined"!=typeof navigator&&navigator.language?navigator.language.split("-")[0]:void 0),i=t?.timezone??("undefined"!=typeof Intl&&Intl.DateTimeFormat?Intl.DateTimeFormat().resolvedOptions().timeZone:void 0),s=t?.currency??("undefined"!=typeof Intl&&Intl.NumberFormat&&Intl.NumberFormat().resolvedOptions().currency?Intl.NumberFormat().resolvedOptions().currency:void 0);return this.api.submitBetaUser({orgId:this.orgId,formData:{...e,country:n,language:r,timezone:i,currency:s}})}}class E extends k{constructor(e){super(e)}async list(e){const t=await this.fetchJson("devices",{signal:e},"Failed to load devices");return t?.devices??[]}async rename(e,t,n){await this.fetchJson(this.apiPath`devices/${e}`,{method:"PATCH",body:JSON.stringify({name:t}),signal:n},"Failed to rename device")}async signOut(e,t){return this.fetchJson(this.apiPath`devices/${e}`,{method:"DELETE",signal:t},"Failed to sign out device")}async forget(e,t){return this.fetchJson(`${this.apiPath`devices/${e}`}?forget=true`,{method:"DELETE",signal:t},"Failed to forget device")}}function _(e){const t=new URLSearchParams;for(const[n,r]of Object.entries(e))void 0!==r&&""!==r&&!1!==r&&t.set(n,String(r));const n=t.toString();return n?`?${n}`:""}const I=e=>JSON.stringify(e?{workspaceId:e}:{});class $ extends k{constructor(e){super(e)}async list(e={},t){const n=await this.fetchJson(`notifications${_({workspaceId:e.workspaceId,unread:e.unread,archived:e.archived,page:e.page,limit:e.limit})}`,{signal:t},"Failed to load notifications");return{notifications:n?.notifications??[],page:n?.page??e.page??1,limit:n?.limit??e.limit??20,total:n?.total??0,hasNextPage:Boolean(n?.hasNextPage)}}async counts(e,t){const n=await this.fetchJson(`notifications/unread-count${_({workspaceId:e})}`,{signal:t},"Failed to load notification count");return{unread:n?.unread??0,unseen:n?.unseen??0}}markRead(e){return this.itemAction(this.apiPath`notifications/${e}/read`,"POST",!0)}markUnread(e){return this.itemAction(this.apiPath`notifications/${e}/unread`,"POST")}archive(e){return this.itemAction(this.apiPath`notifications/${e}/archive`,"POST")}unarchive(e){return this.itemAction(this.apiPath`notifications/${e}/archive`,"DELETE")}async markAllRead(e){await this.fetchJson("notifications/read-all",{method:"POST",body:I(e)},"Failed to mark notifications read")}async markSeen(e){await this.fetchJson("notifications/seen",{method:"POST",body:I(e)},"Failed to mark notifications seen")}async itemAction(e,t,n=!1){return this.fetchJson(e,n?{method:t,keepalive:n}:{method:t},"Failed to update notification")}}class P extends k{constructor(e){super({...e,requireOrgId:!0})}async getVapidPublicKey(){return this.fetchJson("push/vapid-public-key")}async subscribe(e,t){await this.fetchJson("push/subscribe",{method:"POST",body:JSON.stringify({endpoint:e.endpoint,keys:e.keys,userAgent:t})})}async unsubscribe(e){await this.fetchJson("push/unsubscribe",{method:"DELETE",body:JSON.stringify({endpoint:e})})}}class U extends k{constructor(e){super(e)}async list(e){const t=await this.fetchJson("sessions",{signal:e},"Failed to load sessions");return t?.sessions??[]}async revoke(e,t){await this.fetchJson(this.apiPath`sessions/${e}`,{method:"DELETE",signal:t},"Failed to sign out session")}}class T extends k{constructor(e){super({...e,requireOrgId:!0})}async getSettings(e){return this.fetchJson(`${this.orgId}/settings`,{signal:e},"Failed to fetch settings")}}class A extends k{constructor(e){super(e)}async getAttributes(e){const t=await this.fetchResponse("users/attributes",{signal:e});t.ok||await this.throwResponseError(t,"Failed to fetch user attributes");const n=await this.unwrapResponse(t,"Failed to fetch user attributes");return n&&"object"==typeof n&&!Array.isArray(n)?n:{}}async updateAttributes(e){return this.fetchJson("users/attributes",{method:"PATCH",body:JSON.stringify({attributes:e})},"Failed to update user attributes")}async updateAttribute(e,t){return this.fetchJson(this.apiPath`users/attributes/${e}`,{method:"PATCH",body:JSON.stringify({value:t})},"Failed to update user attribute")}async getFeatures(e){const t=await this.fetchResponse("users/features",{signal:e});t.ok||await this.throwResponseError(t,"Failed to fetch user features");const n=await this.unwrapResponse(t,"Failed to fetch user features");return"object"==typeof n&&null!==n?n:{}}}const C={NOT_FOUND:"INVITATION_NOT_FOUND",EXPIRED:"INVITATION_EXPIRED",ALREADY_HANDLED:"INVITATION_ALREADY_HANDLED",EMAIL_MISMATCH:"INVITATION_EMAIL_MISMATCH",EMAIL_NOT_VERIFIED:"EMAIL_NOT_VERIFIED",INVITES_DISABLED:"WORKSPACE_INVITES_DISABLED",RATE_LIMITED:"INVITATION_RATE_LIMITED",EMAIL_FAILED:"INVITATION_EMAIL_FAILED",SEAT_LIMIT:"SEAT_LIMIT_REACHED",USER_BLOCKED:"USER_BLOCKED",NO_SENDER_CONFIGURED:"NO_SENDER_CONFIGURED"},x={402:C.SEAT_LIMIT,404:C.NOT_FOUND,409:C.ALREADY_HANDLED,410:C.EXPIRED,429:C.RATE_LIMITED,502:C.EMAIL_FAILED,503:C.NO_SENDER_CONFIGURED};function O(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function R(e){return"string"==typeof e&&e?e:void 0}async function N(e,t){let n=null;try{n=await e.json()}catch{n=null}return function(e,t,n){const r=t&&"object"==typeof t?t:{},i=R(r.message)??R(r.error)??n,s={status:e,code:R(r.code)??x[e]??`HTTP_${e}`,currentUserCount:O(r.currentUserCount),limit:O(r.limit),retryAfterSeconds:O(r.retryAfterSeconds),invitedEmail:R(r.invitedEmail),invitationId:R(r.invitationId),invitationStatus:R(r.status)};return Object.assign(new Error(i),s)}(e.status,n,t)}function F(e){return e instanceof Error&&"number"==typeof e.status}class W extends k{constructor(e){super({...e,requireOrgId:!0})}async getWorkspaces(e){return this.fetchJson("workspaces",{signal:e},"Failed to fetch workspaces")}async createWorkspace(e,t){try{return await this.fetchJson("workspaces",{method:"POST",body:JSON.stringify(e),signal:t},"Failed to create workspace")}catch(n){const r=n?.status;if(400===r&&e.trackingAttribution){const{trackingAttribution:n,...r}=e;return this.fetchJson("workspaces",{method:"POST",body:JSON.stringify(r),signal:t},"Failed to create workspace")}throw n}}async updateWorkspace(e,t,n){return this.fetchJson(this.apiPath`workspaces/${e}`,{method:"PUT",body:JSON.stringify(t),signal:n},"Failed to update workspace")}async deleteWorkspace(e,t){return this.fetchJson(this.apiPath`workspaces/${e}`,{method:"DELETE",signal:t},"Failed to delete workspace")}async getWorkspaceUsers(e,t){return this.fetchJson(this.apiPath`workspaces/${e}/users`,{signal:t},"Failed to fetch workspace users")}async addUser(e,t,n){return this.fetchJson(this.apiPath`workspaces/${e}/users/add`,{method:"POST",body:JSON.stringify(t),signal:n},"Failed to invite member")}async fetchInvitation(e,t={},n="Request failed"){const r=await this.fetchResponse(e,t);if(!r.ok)throw await N(r,n);return i(r,n)}async listInvitations(e,t){return this.fetchInvitation(this.apiPath`workspaces/${e}/invitations`,{signal:t},"Failed to fetch invitations")}async inviteMember(e,t,n){const r={email:t.email,role:t.role};return t.landingUrl&&(r.landingUrl=t.landingUrl),this.fetchInvitation(this.apiPath`workspaces/${e}/invitations`,{method:"POST",body:JSON.stringify(r),signal:n},"Failed to send invitation")}async resendInvitation(e,t,n){return this.fetchInvitation(this.apiPath`workspaces/${e}/invitations/${t}/resend`,{method:"POST",signal:n},"Failed to resend invitation")}async revokeInvitation(e,t,n){return this.fetchInvitation(this.apiPath`workspaces/${e}/invitations/${t}`,{method:"DELETE",signal:n},"Failed to revoke invitation")}async myInvitations(e){return this.fetchInvitation("invitations",{signal:e},"Failed to fetch your invitations")}async acceptInvitation(e,t,n){return this.fetchInvitation(this.apiPath`invitations/${e}/accept`,{method:"PATCH",signal:n,...t?.token?{body:JSON.stringify({token:t.token})}:{}},"Failed to accept invitation")}async declineInvitation(e,t){return this.fetchInvitation(this.apiPath`invitations/${e}/reject`,{method:"PATCH",signal:t},"Failed to decline invitation")}async previewInvitation(e,t){if(!this.orgId)throw new Error("orgId is required for previewInvitation");return this.fetchInvitation(this.apiPath`${this.orgId}/invitations/preview/${e}`,{signal:t},"Failed to load invitation")}async removeUser(e,t,n){return this.fetchJson(this.apiPath`workspaces/${e}/users/${t}`,{method:"DELETE",signal:n},"Failed to remove user")}async updateUser(e,t,n,r){return this.fetchJson(this.apiPath`workspaces/${e}/users/${t}`,{method:"PATCH",body:JSON.stringify(n),signal:r},"Failed to update user")}async updateSettings(e,t){return this.fetchJson("workspaces/settings",{method:"PATCH",body:JSON.stringify(e),signal:t},"Failed to update workspace settings")}async updateWorkspacePermissions(e,t,n){return this.fetchJson(this.apiPath`workspaces/${e}/permissions`,{method:"PATCH",body:JSON.stringify({permissions:t}),signal:n},"Failed to update workspace permissions")}async getMyPermissions(e,t){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/permissions/me`,{signal:t},"Failed to fetch workspace permissions")}async getFeatures(e){return this.fetchJson("workspaces/features",{signal:e},"Failed to fetch features")}async updateFeature(e,t,n,r){return this.fetchJson(this.apiPath`workspaces/${e}/features`,{method:"PATCH",body:JSON.stringify({features:{[t]:n}}),signal:r},"Failed to update feature")}async getWorkspace(e,t){return this.fetchJson(this.apiPath`workspaces/${e}`,{signal:t},"Failed to fetch workspace")}async getProfile(e){return this.fetchJson("profile",{signal:e},"Failed to fetch profile")}async updateUserProfile(e,t){return this.fetchJson("profile",{method:"PATCH",body:JSON.stringify(e),signal:t},"Failed to update user profile")}async getPasskeys(e){const t=await this.fetchJson("passkeys",{signal:e},"Failed to fetch passkeys");return t?.passkeys??[]}async renamePasskey(e,t,n){await this.fetchJson(this.apiPath`passkeys/${e}`,{method:"PATCH",body:JSON.stringify({name:t}),signal:n},"Failed to rename passkey")}async deletePasskey(e,t){await this.fetchJson(this.apiPath`passkeys/${e}`,{method:"DELETE",signal:t},"Failed to remove passkey")}async getCurrentSubscription(e,t){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription`,{signal:t},"Failed to fetch subscription")}async getPlanGroup(e,t){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/plan-group`,{signal:t},"Failed to fetch plan group")}async getPlanGroupByVersion(e,t,n){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/plan-group`+`?groupVersionId=${encodeURIComponent(t)}`,{signal:n},"Failed to fetch plan group version")}async getPlanGroupVersions(e,t){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/plan-group/versions`,{signal:t},"Failed to fetch plan group versions")}async getPublicPlans(e,t){if(!this.orgId)throw new Error("orgId is required for getPublicPlans");return this.fetchUnwrapped(this.apiPath`${this.orgId}/plans/${encodeURIComponent(e)}`,{signal:t},"Failed to fetch plans")}async getPublicCreditPackages(e){if(!this.orgId)throw new Error("orgId is required for getPublicCreditPackages");return this.fetchUnwrapped(this.apiPath`${this.orgId}/credit-packages`,{signal:e},"Failed to fetch credit packages")}async getPlanGroupVersion(e,t){return this.fetchUnwrapped(this.apiPath`plan-group-versions/${e}`,{signal:t},"Failed to fetch plan group version")}async createCheckoutSession(e,t,n){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/checkout`,{method:"POST",body:JSON.stringify(t),signal:n},"Failed to create checkout session")}async selectFreePlan(e,t,n){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/select-free-plan`,{method:"POST",body:JSON.stringify({planVersionId:t}),signal:n},"Failed to select free plan")}async updateSubscription(e,t,n){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription`,{method:"PATCH",body:JSON.stringify(t),signal:n},"Failed to update subscription")}async createBillingPortalSession(e,t,n){return this.fetchJson(this.apiPath`workspaces/${e}/subscription/billing-portal`,{method:"POST",body:JSON.stringify(t?{returnUrl:t}:{}),signal:n})}async listInvoices(e,t=10,n,r){const i=new URLSearchParams;return i.append("limit",t.toString()),n&&i.append("starting_after",n),this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/invoices`+`?${i.toString()}`,{signal:r},"Failed to fetch invoices")}async getInvoice(e,t,n){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/invoices/${t}`,{signal:n},"Failed to fetch invoice")}async cancelSubscriptionAtPeriodEnd(e,t){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/cancel-at-period-end`,{method:"POST",signal:t},"Failed to cancel subscription")}async resumeSubscription(e,t){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/resume`,{method:"POST",signal:t},"Failed to resume subscription")}async recordUsage(e,t,n){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/usage`,{method:"POST",body:JSON.stringify(t),signal:n},"Failed to record usage")}async recordUsageBatch(e,t,n){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/usage/batch`,{method:"POST",body:JSON.stringify(t),signal:n},"Failed to record batch usage")}async getQuotaUsageStatus(e,t,n){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/usage/status`+`?quotaSlug=${encodeURIComponent(t)}`,{signal:n},"Failed to fetch quota usage status")}async getAllQuotaUsage(e,t){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/usage/all`,{signal:t},"Failed to fetch all quota usage")}async getUsageLogs(e,t,n){const r=new URLSearchParams;t?.quotaSlug&&r.append("quotaSlug",t.quotaSlug),t?.from&&r.append("from",t.from),t?.to&&r.append("to",t.to),t?.source&&r.append("source",t.source),t?.page&&r.append("page",t.page.toString()),t?.limit&&r.append("limit",t.limit.toString());const i=r.toString(),s=this.apiPath`workspaces/${e}/subscription/usage/logs`+(i?`?${i}`:"");return this.fetchUnwrapped(s,{signal:n},"Failed to fetch usage logs")}async sendNotification(e,t,n,r,i){const s={event:t};return n&&(s.userId=n),r&&(s.data=r),this.fetchJson(this.apiPath`workspaces/${e}/notifications/send`,{method:"POST",body:JSON.stringify(s),signal:i},"Failed to send notification")}async getNotificationEvents(e,t){return this.fetchJson(this.apiPath`workspaces/${e}/notification-events`,{signal:t},"Failed to fetch notification events")}async getNotificationPreferences(e,t){return(await this.fetchJson(this.apiPath`workspaces/${e}/notification-preferences`,{signal:t},"Failed to fetch notification preferences")).notificationPreferences??{}}async updateNotificationPreferences(e,t,n){return(await this.fetchJson(this.apiPath`workspaces/${e}/notification-preferences`,{method:"PATCH",body:JSON.stringify({notificationPreferences:t}),signal:n},"Failed to update notification preferences")).notificationPreferences??{}}async getMyNotificationPreferences(e,t){const n=await this.fetchJson(this.apiPath`workspaces/${e}/notification-preferences/me`,{signal:t},"Failed to fetch your notification preferences");return{defaults:n?.defaults??{},mine:n?.mine??{}}}async updateMyNotificationPreferences(e,t,n){const r=await this.fetchJson(this.apiPath`workspaces/${e}/notification-preferences/me`,{method:"PATCH",body:JSON.stringify({notificationPreferences:t}),signal:n},"Failed to update your notification preferences");return{defaults:r?.defaults??{},mine:r?.mine??{}}}async getCreditBalance(e,t){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/credits`,{signal:t},"Failed to fetch credit balance")}async consumeCredits(e,t,n){const r=await this.fetchResponse(this.apiPath`workspaces/${e}/credits/consume`,{method:"POST",body:JSON.stringify(t),signal:n});if(!r.ok){if(402===r.status){const e=await r.json().catch(()=>({})),t=new Error(e.message||"Insufficient credits");throw t.available=e.available,t.requested=e.requested,t.code="INSUFFICIENT_CREDITS",t}await this.throwResponseError(r,"Failed to consume credits")}return this.unwrapResponse(r,"Failed to consume credits")}async purchaseCredits(e,t,n){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/credits/purchase`,{method:"POST",body:JSON.stringify(t),signal:n},"Failed to create credit purchase checkout")}async getCreditPackages(e,t){const n=await this.fetchUnwrapped(this.apiPath`workspaces/${e}/credits/packages`,{signal:t},"Failed to fetch credit packages");return n.docs??n}async getCreditTransactions(e,t,n){const r=new URLSearchParams;t?.type&&r.append("type",t.type),t?.page&&r.append("page",t.page.toString()),t?.limit&&r.append("limit",t.limit.toString());const i=r.toString(),s=this.apiPath`workspaces/${e}/credits/transactions`+(i?`?${i}`:"");return this.fetchUnwrapped(s,{signal:n},"Failed to fetch credit transactions")}async getCreditBuckets(e,t,n){const r=new URLSearchParams;t?.status&&r.append("status",t.status),t?.source&&r.append("source",t.source),t?.page&&r.append("page",t.page.toString()),t?.limit&&r.append("limit",t.limit.toString());const i=r.toString(),s=this.apiPath`workspaces/${e}/credits/buckets`+(i?`?${i}`:"");return this.fetchUnwrapped(s,{signal:n},"Failed to fetch credit buckets")}async getExpiringCredits(e,t,n){const r=t?`?days=${t}`:"";return this.fetchUnwrapped(this.apiPath`workspaces/${e}/credits/expiring`+r,{signal:n},"Failed to fetch expiring credits")}}var D;!function(e){e.V1="v1"}(D||(D={}));const J={UserCreated:"user:created",UserUpdated:"user:updated",WorkspaceChanged:"workspace:changed",WorkspaceUpdated:"workspace:updated",WorkspaceUserAdded:"workspace:user-added",WorkspaceUserRemoved:"workspace:user-removed",WorkspaceUserRoleChanged:"workspace:user-role-changed",WorkspaceCreated:"workspace:created",WorkspaceDeleted:"workspace:deleted",WorkspaceInvitationSent:"workspace:invitation-sent",WorkspaceInvitationAccepted:"workspace:invitation-accepted",WorkspaceInvitationDeclined:"workspace:invitation-declined",WorkspaceInvitationRevoked:"workspace:invitation-revoked"};class L{constructor(){this.callbacks=null,this.listeners=new Map}setCallbacks(e){this.callbacks=e}getCallbacks(){return this.callbacks}async emit(e,t){if(this.callbacks?.handleEvent)try{await this.callbacks.handleEvent(e,t)}catch(t){o(t,{component:"EventEmitter",action:"emit",metadata:{eventType:e}})}const n=this.listeners.get(e);if(n)for(const r of[...n])try{r(t)}catch(t){o(t,{component:"EventEmitter",action:"notifyListener",metadata:{eventType:e}})}}on(e,t){const n=this.listeners.get(e)??new Set;return n.add(t),this.listeners.set(e,n),()=>{this.listeners.get(e)?.delete(t)}}async emitUserCreated(e){await this.emit(J.UserCreated,{user:e})}async emitUserUpdated(e,t){await this.emit(J.UserUpdated,{user:e,previousUser:t})}async emitWorkspaceChanged(e,t){await this.emit(J.WorkspaceChanged,{workspace:e,previousWorkspace:t})}async emitWorkspaceUpdated(e){await this.emit(J.WorkspaceUpdated,{workspace:e})}async emitWorkspaceUserAdded(e,t,n){await this.emit(J.WorkspaceUserAdded,{userId:e,workspace:t,role:n})}async emitWorkspaceInvitationSent(e,t){await this.emit(J.WorkspaceInvitationSent,{invitation:e,workspaceId:t})}async emitWorkspaceInvitationAccepted(e,t){await this.emit(J.WorkspaceInvitationAccepted,{invitation:e,workspace:t})}async emitWorkspaceInvitationDeclined(e){await this.emit(J.WorkspaceInvitationDeclined,{invitation:e})}async emitWorkspaceInvitationRevoked(e,t){await this.emit(J.WorkspaceInvitationRevoked,{invitationId:e,workspaceId:t})}async emitWorkspaceUserRemoved(e,t,n){await this.emit(J.WorkspaceUserRemoved,{userId:e,workspace:t,role:n})}async emitWorkspaceUserRoleChanged(e,t,n,r){await this.emit(J.WorkspaceUserRoleChanged,{userId:e,workspace:t,previousRole:n,newRole:r})}async emitWorkspaceCreated(e){await this.emit(J.WorkspaceCreated,{workspace:e})}async emitWorkspaceDeleted(e){await this.emit(J.WorkspaceDeleted,{workspace:e})}}const M=new L,B=globalThis;function j(e){const t=Symbol.for(`@buildbase/sdk.invalidation.${e}`),n=B[t]??(B[t]=new Set);return{subscribe:e=>(n.add(e),()=>{n.delete(e)}),invalidate(){n.forEach(e=>e())},reset(){n.clear()}}}const q=j("credit-balance").invalidate,z=j("quota-usage").invalidate,V=j("subscription").invalidate,K="bb",G={Checkout:"checkout",Billing:"billing",SelectPlan:"selectPlan",CreditPurchase:"creditPurchase",OpenCreditStore:"openCreditStore",OpenConnectGuide:"openConnectGuide",Invite:"invite"},H={Success:"success",Cancel:"cancel",Error:"error"},Q={Subscription:"subscription",Credits:"credits",Usage:"usage",Users:"users",Profile:"profile",General:"general",Features:"features",Notifications:"notifications",Permissions:"permissions",Danger:"danger"};function Y(e,t){const n=t??("undefined"!=typeof window?window.location.href:"https://localhost");let r;try{r=new URL(n)}catch{throw new Error(`createBBUrl: invalid base URL: ${JSON.stringify(n)}`)}return r.search="",r.searchParams.set(K,function(e){return Object.entries(e).filter(([,e])=>null!=e&&""!==e).map(([e,t])=>`${encodeURIComponent(e)}:${encodeURIComponent(t)}`).join(",")}(e)),r.toString()}function X(e,t){const n=t||("undefined"!=typeof window?window.location.href:void 0);return{successUrl:Y({action:G.Checkout,status:H.Success,ws:e,screen:Q.Subscription},n),cancelUrl:Y({action:G.Checkout,status:H.Cancel,ws:e,screen:Q.Subscription},n)}}function Z(e,t){const n=t||("undefined"!=typeof window?window.location.href:void 0);return{successUrl:Y({action:G.CreditPurchase,status:H.Success,ws:e,screen:Q.Credits},n),cancelUrl:Y({action:G.CreditPurchase,status:H.Cancel,ws:e,screen:Q.Credits},n)}}function ee(){if("undefined"==typeof window)return null;try{const e=new URLSearchParams(window.location.search).get(K);if(!e)return null;const t=function(e){const t={};if(!e)return t;const n=e.split(",");for(const e of n){const n=e.indexOf(":");if(-1===n)continue;const r=decodeURIComponent(e.slice(0,n)),i=decodeURIComponent(e.slice(n+1));r&&(t[r]=i)}return t}(e);return Object.keys(t).length>0?t:null}catch{return null}}function te(){if("undefined"!=typeof window)try{const e=new URL(window.location.href);e.searchParams.has(K)&&(e.searchParams.delete(K),window.history.replaceState({},"",e.toString()))}catch{}}const ne="__buildbaseBeforeLeave",re=globalThis,ie=re[ne]??(re[ne]=new Set);function se(e,t={}){if(!e||"string"!=typeof e)return null;if(/^\/(?![/\\])/.test(e))return e;let n;try{n=new URL(e)}catch{return null}const r="https:"===n.protocol,i="http:"===n.protocol&&("localhost"===n.hostname||"127.0.0.1"===n.hostname||"[::1]"===n.hostname);if(!r&&!i)return null;const{sameOrigin:s,allowedOrigins:a}=t;return s||a?.length?s&&"undefined"!=typeof window&&window.location&&n.origin===window.location.origin||a?.some(e=>e.replace(/\/+$/,"")===n.origin)?e:null:e}function ae(e,t="/",n={}){if("undefined"==typeof window||!window.location)return!1;const r=se(e,n)??se(t)??"/";return function(e){if("undefined"==typeof window||!window.location||0===ie.size)return;let t;try{t=new URL(e,window.location.href).origin}catch{return}if(t!==window.location.origin)for(const e of ie)try{e()}catch{}}(r),window.location.href=r,!0}const oe="saas-auth-intent";function ce(e){return"object"==typeof e&&null!==e&&"string"==typeof e.returnUrl&&"number"==typeof e.createdAt}function ue(e){se(e,{sameOrigin:!0})&&d(oe,{returnUrl:e,createdAt:Date.now()})}function le(){const e=l(oe,ce);return u(oe),e?Date.now()-e.createdAt>6e5?null:se(e.returnUrl,{sameOrigin:!0}):null}function de(){u(oe)}const pe={usd:"$",eur:"€",gbp:"£",jpy:"¥",cad:"CA$",aud:"A$",chf:"CHF",cny:"¥",hkd:"HK$",sgd:"S$",inr:"₹",mxn:"MX$",brl:"R$",nzd:"NZ$",sek:"kr",nok:"kr",dkk:"kr",pln:"zł",thb:"฿"},he={usd:"🇺🇸",eur:"🇪🇺",gbp:"🇬🇧",jpy:"🇯🇵",cad:"🇨🇦",aud:"🇦🇺",chf:"🇨🇭",cny:"🇨🇳",hkd:"🇭🇰",sgd:"🇸🇬",inr:"🇮🇳",mxn:"🇲🇽",brl:"🇧🇷",nzd:"🇳🇿",sek:"🇸🇪",nok:"🇳🇴",dkk:"🇩🇰",pln:"🇵🇱",thb:"🇹🇭"};function fe(e){return e&&e.trim()?he[e.trim().toLowerCase()]??"":""}function ge(e){if(!e||!e.trim())return"";const t=e.trim().toLowerCase();return pe[t]??t.toUpperCase()}const we=["usd","eur","gbp","jpy","cad","aud","chf","cny","hkd","sgd","inr","mxn","brl","nzd","sek","nok","dkk","pln","thb"],me=we.map(e=>({value:e,label:`${e.toUpperCase()} (${ge(e)})`})),ye=new Set(["bif","clp","djf","gnf","jpy","kmf","krw","mga","pyg","rwf","ugx","vnd","vuv","xaf","xof","xpf"]),ke=new Set(["bhd","jod","kwd","omr","tnd"]),be=new Map;function ve(e){const t=(e??"").trim().toLowerCase();if(!t)return 2;if(ye.has(t))return 0;if(ke.has(t))return 3;if("isk"===t)return 2;let n=be.get(t);if(void 0===n){try{n=new Intl.NumberFormat("en-US",{style:"currency",currency:t.toUpperCase()}).resolvedOptions().maximumFractionDigits??2}catch{n=2}be.set(t,n)}return n}function Se(e){return""!==(e??"").trim()&&0===ve(e)}function Ee(e,t){const n=ve(t);return 0===n?e.toLocaleString("en-US"):(e/10**n).toFixed(n)}function _e(e,t,n="en-US"){const r=(t??"").trim(),i=ve(r),s=e/10**i;if(!r)return s.toFixed(i);try{return new Intl.NumberFormat(n,{style:"currency",currency:r.toUpperCase(),minimumFractionDigits:i,maximumFractionDigits:i}).format(s)}catch{return ge(r)+(0===i?s.toLocaleString("en-US"):s.toFixed(i))}}function Ie(e,t){return ge(t)+Ee(e,t)}const $e={unit:"unit",units:"units",included:"Included",afterThat:"after that",afterIncluded:"After included",hardLimit:"hard limit"};function Pe(e,t,n,r,i){if(null==e||e<0)return null;const s={...$e,...r},a=null!=t&&t>=1?t:1,o=ge(n),c=Ee(e,n);return 1===a?`${o}${c}/${s.unit}`:`${o}${c}/${a.toLocaleString(i)} ${s.units}`}function Ue(e,t,n,r,i,s,a){if(null==e||e<0)return null;const o={...$e,...s},c=null!=t&&t>=1?t:1,u=ge(r),l=Ee(e,r);if(n){const e=i??(n.endsWith("s")?n:`${n}s`);return c>=2?`${u}${l}/${c.toLocaleString(a)} ${e}`:`${u}${l}/${n}`}return 1===c?`${u}${l}/${o.unit}`:`${u}${l}/${c.toLocaleString(a)} ${o.units}`}function Te(e,t="unit"){const n=(e||"").trim().toLowerCase();if(!n)return t;const r=n.split(/\s+/)[0]??n;return new Set(["series","species","status","analysis","basis","bus","campus","corpus","axis"]).has(r)?r:r.endsWith("ies")&&r.length>3?r.slice(0,-3)+"y":r.endsWith("ses")||r.endsWith("xes")||r.endsWith("zes")||r.endsWith("ches")||r.endsWith("shes")?r.slice(0,-2):r.endsWith("s")&&!r.endsWith("ss")&&r.length>1?r.slice(0,-1):r||t}function Ae(e,t,n,r,i,s,a,o,c){const u={...$e,...a};if(!1===o)return null!=e?`${u.included}: ${e.toLocaleString(c)} (${u.hardLimit})`:a?.hardLimit??"Hard limit";const l=s??(n.endsWith("s")?n:`${n}s`),d=null!=i&&i>=2?`${i.toLocaleString(c)} ${l}`:n;return null!=e&&null!=t?`${u.included}: ${e.toLocaleString(c)}, ${u.afterThat} ${Ie(t,r)}/${d}`:null!=e?`${u.included}: ${e.toLocaleString(c)}`:null!=t?`${u.afterIncluded}: ${Ie(t,r)}/${d}`:"—"}function Ce(e,t){if(null==e)return null;const n=e[t??"monthly"];return n?{included:n.included,...void 0!==n.overage&&{overage:n.overage},...void 0!==n.unitSize&&{unitSize:n.unitSize},allowOverage:!1!==e.allowOverage}:null}const xe={included:"included",then:"then",hardLimit:"hard limit"};function Oe(e,t,n={}){const{overageInCents:r=!0,currency:i}=n,s={...xe,...n.labels},a=n.currencySymbol??ge(i??"");if(null==e)return"—";const{included:o,overage:c}=e,u=`${o} ${s.included}`;if(!1===e.allowOverage)return`${u} (${s.hardLimit})`;if(null==c)return u;const l=ve(i),d=r&&l>0?c/10**l:c,p="number"==typeof d&&Number.isFinite(d)?0===l?d.toLocaleString("en-US"):d.toFixed(l):String(c),h=t&&"unitSize"in e&&null!=e.unitSize&&e.unitSize>0?` / ${e.unitSize.toLocaleString()} ${t}`:t?` / ${t}`:"";return`${u}, ${s.then} ${a}${p}${h}`}const Re={Monthly:"monthly",Yearly:"yearly",Quarterly:"quarterly"},Ne={Active:"active",Trialing:"trialing",Canceled:"canceled",PastDue:"past_due",Paused:"paused",Incomplete:"incomplete",Unpaid:"unpaid"},Fe={Draft:"draft",Open:"open",Paid:"paid",Uncollectible:"uncollectible",Void:"void"},We={Feature:"feature",Limit:"limit",Quota:"quota"},De={None:"none",Notified:"notified",Warning:"warning",Final:"final",Suspended:"suspended"},Je={PlanGrant:"plan_grant",CreditPackPurchase:"credit_pack_purchase",AdminGrant:"admin_grant",Refund:"refund"},Le={Pending:"pending",Active:"active",Expired:"expired",Consumed:"consumed"},Me={PlanGrant:"plan_grant",PackPurchased:"pack_purchased",Consumed:"consumed",Expired:"expired",AdminGrant:"admin_grant",AdminRevoke:"admin_revoke",Refund:"refund"};function Be(e,t){const n=e.pricingVariants;if(!n?.length)return null;const r=t.toLowerCase();return n.find(e=>e.currency?.toLowerCase()===r)??null}function je(e,t,n){const r=Be(e,t);if(!r?.basePricing)return null;const i=r.basePricing[n];return null!=i?i:null}function qe(e,t,n){const r=Be(e,t);if(!r?.stripePrices)return null;const i=n===Re.Monthly?"monthlyPriceId":n===Re.Yearly?"yearlyPriceId":"quarterlyPriceId",s=n===Re.Monthly?"monthly":n===Re.Yearly?"yearly":void 0;return r.stripePrices[i]??(s?r.stripePrices[s]:void 0)??null}function ze(e,t,n,r){const i=Be(e,t),s=i?.quotaOverages?.[n];if(s)return s[r]}function Ve(e,t){const n=Be(e,t);return n?n.currency:e.plan?.currency??""}function Ke(e){const t=new Set;for(const n of e)n.pricingVariants?.forEach(e=>{e.currency&&t.add(e.currency.toLowerCase())});return Array.from(t).sort()}function Ge(e,t,n,r){const i=e.quotas?.[n];if(null==i)return null;const s=i[r];if(!s)return null;const a=ze(e,t,n,r);return{included:s.included,...void 0!==s.unitSize&&{unitSize:s.unitSize},...void 0!==a&&{overage:a},allowOverage:!1!==i.allowOverage}}function He(e,t){if(!e)return null;for(const n of t){const t=n.pricingVariants;if(t?.length)for(const n of t){const t=n.stripePrices;if(t){if(t.monthlyPriceId===e||t.monthly===e)return{interval:"monthly",currency:n.currency};if(t.yearlyPriceId===e||t.yearly===e)return{interval:"yearly",currency:n.currency};if(t.quarterlyPriceId===e)return{interval:"quarterly",currency:n.currency}}}}return null}function Qe(e,t){const n=Be(e,t);return n?.seatPricing?.enabled?n.seatPricing:null}function Ye(e,t,n){const r=Qe(e,t);return r?.perSeat?r.perSeat[n]??null:null}function Xe(e,t){return Math.max(0,e-(t||0))}function Ze(e,t,n,r){const i=Qe(e,t);if(!i)return null;return Xe(r,i.includedSeats)*(Ye(e,t,n)??0)}function et(e,t,n,r){const i=je(e,t,n);if(null===i)return null;if(void 0===r)return i;return i+(Ze(e,t,n,r)??0)}function tt(e){const{planVersion:t,currency:n="usd",settingsMaxUsers:r}=e;if(t){const e=Qe(t,n);if(e)return{maxUsers:e.maxSeats??0,source:"seat_pricing",includedSeats:e.includedSeats??0,hasSeatPricing:!0}}return null!=r&&r>0?{maxUsers:r,source:"settings",includedSeats:0,hasSeatPricing:!1}:{maxUsers:0,source:"none",includedSeats:0,hasSeatPricing:!1}}function nt(e){const{memberCount:t,maxUsersConfig:n,hasSubscription:r=!0,requireSubscription:i=!1}=e;if(i&&!r)return{canInvite:!1,blockReason:"no_subscription",blockMessageKey:"users.subscriptionRequired",blockMessageValues:{}};const{maxUsers:s,source:a}=n;if(s<=0)return{canInvite:!0,blockReason:null,blockMessageKey:null,blockMessageValues:null};if(t>=s){return{canInvite:!1,blockReason:{seat_pricing:"seat_limit_reached",settings:"settings_user_limit_reached"}[a]??"seat_limit_reached",blockMessageKey:{seat_pricing:"users.seatLimitMessage",settings:"users.settingsLimitMessage"}[a]??"users.memberLimitMessage",blockMessageValues:{maxUsers:s}}}return{canInvite:!0,blockReason:null,blockMessageKey:null,blockMessageValues:null}}function rt(e,t){return[Re.Monthly,Re.Quarterly,Re.Yearly].filter(n=>n===Re.Monthly||e.some(e=>null!=je(e,t,n)))}const it={WORKSPACE_SETTINGS_VIEW:"workspace:settings:view",WORKSPACE_SETTINGS_EDIT:"workspace:settings:edit",WORKSPACE_DELETE:"workspace:delete",WORKSPACE_MEMBERS_VIEW:"workspace:members:view",WORKSPACE_MEMBERS_INVITE:"workspace:members:invite",WORKSPACE_MEMBERS_REMOVE:"workspace:members:remove",WORKSPACE_MEMBERS_ROLE_CHANGE:"workspace:members:role-change",WORKSPACE_FEATURES_VIEW:"workspace:features:view",WORKSPACE_FEATURES_EDIT:"workspace:features:edit",WORKSPACE_BILLING_VIEW:"workspace:billing:view",WORKSPACE_BILLING_MANAGE:"workspace:billing:manage",WORKSPACE_USAGE_VIEW:"workspace:usage:view",WORKSPACE_USAGE_RECORD:"workspace:usage:record"},st=Object.values(it),at={admin:st.filter(e=>e!==it.WORKSPACE_DELETE),editor:[it.WORKSPACE_SETTINGS_VIEW,it.WORKSPACE_MEMBERS_VIEW,it.WORKSPACE_FEATURES_VIEW,it.WORKSPACE_BILLING_VIEW,it.WORKSPACE_USAGE_VIEW,it.WORKSPACE_USAGE_RECORD],viewer:[it.WORKSPACE_SETTINGS_VIEW,it.WORKSPACE_MEMBERS_VIEW]},ot="viewer";function ct(e,t){return t&&"admin"!==t&&e.includes(t)?t:e.includes(ot)?ot:e.find(e=>"admin"!==e)??""}function ut(e){const t=new Set;for(const n of Object.values(e))for(const e of n)t.add(e);return Array.from(t)}function lt(e){const{userId:t,workspace:n,settings:r,appPermissions:i}=e;if(!n||!t)return new Set;if(function(e,t){if(!t)return!1;const n=(r=e.createdBy)?"string"==typeof r?r:"object"==typeof r&&"_id"in r&&"string"==typeof r._id?r._id:null:null;var r;return null!==n&&n===t}(n,t)){const e=new Set(st);if(i)for(const t of ut(i))e.add(t);if(n.permissions)for(const t of ut(n.permissions))e.add(t);if(r?.workspace?.permissions)for(const t of ut(r.workspace.permissions))e.add(t);return e}const s=e.workspaceRole??function(e,t){if(!t||!e.users||!Array.isArray(e.users))return null;const n=e.users.find(e=>"string"==typeof e?e===t:"object"==typeof e&&null!==e&&"_id"in e&&e._id===t);return n&&"object"==typeof n&&"role"in n&&"string"==typeof n.role?n.role:null}(n,t);return s?dt(s,e):new Set}function dt(e,t,n={}){const{workspace:r,settings:i,appPermissions:s}=t;if(!r)return new Set;const a=r.permissions,o=i?.workspace?.permissions,c=e=>e.filter(e=>e.startsWith("workspace:")),u=e=>e.filter(e=>!e.startsWith("workspace:")),l=e=>!!a&&e in a,d=e=>!!o&&e in o,p=e=>l(e)||d(e)||e in at;let h,f=e;if(!p(e)){const e=i?.workspace?.defaultRole;if(!e||"admin"===e||!p(e))return new Set;f=e}h=l(f)?c(a[f]):d(f)?c(o[f]):at[f]??[];const g=new Set(h),w=new Set((i?.workspace?.customPermissions??[]).map(e=>e.key)),m=s?.[f]?u(s[f]).filter(e=>!w.has(e)):[];let y;y=l(f)?u(a[f]):d(f)?[...u(o[f]),...m]:s?.[f]?u(s[f]):[];for(const e of y)g.add(e);if("admin"===f){for(const e of at.admin)g.add(e);for(const e of w)g.add(e);if(s)for(const e of u(ut(s)))g.add(e)}return!1!==n.applyRestrictions&&function(e,t,n){if(!n?.workspace)return;const{canInviteMembers:r}=n.workspace;(!1===r||"admin-only"===r&&"admin"!==t)&&e.delete(it.WORKSPACE_MEMBERS_INVITE)}(g,f,i),g}function pt(e,t){const n=lt(t);return Array.isArray(e)?e.every(e=>n.has(e)):n.has(e)}const ht="App";function ft(e,t){const n=e?.workspace?.customPermissions??[],r=new Map;for(const e of n)e?.key&&!e.key.startsWith("workspace:")&&r.set(e.key,{key:e.key,label:e.label||e.key,group:e.group||ht});for(const e of Object.values(t??{}))for(const t of e??[])t.startsWith("workspace:")||r.has(t)||r.set(t,{key:t,label:t,group:ht});return[...r.values()].sort((e,t)=>(e.group??"").localeCompare(t.group??"")||e.key.localeCompare(t.key))}const gt="\n// BuildBase Push Notification Service Worker\n// Place this file in your app's public directory (e.g. public/push-sw.js)\n\nself.addEventListener('push', function(event) {\n if (!event.data) return;\n\n try {\n const payload = event.data.json();\n // i18n exception: service workers run outside the SDK's translation\n // provider, so this last-resort fallback stays English. The server should\n // always send a localized payload.title.\n const title = payload.title || 'Notification';\n const options = {\n body: payload.body || '',\n icon: payload.icon || undefined,\n badge: payload.icon || undefined,\n data: { url: payload.url, ...(payload.data || {}) },\n tag: 'buildbase-push-' + Date.now(),\n };\n\n event.waitUntil(\n self.registration.showNotification(title, options)\n );\n } catch (e) {\n console.error('[PushSW] Failed to show notification:', e);\n }\n});\n\nself.addEventListener('notificationclick', function(event) {\n event.notification.close();\n\n const url = event.notification.data && event.notification.data.url;\n if (url) {\n event.waitUntil(\n clients.matchAll({ type: 'window', includeUncontrolled: true }).then(function(clientList) {\n for (let i = 0; i < clientList.length; i++) {\n const client = clientList[i];\n if (client.url === url && 'focus' in client) {\n return client.focus();\n }\n }\n if (clients.openWindow) {\n return clients.openWindow(url);\n }\n })\n );\n }\n});\n";var wt;function mt(e){if(!e)return 0;const t=new Date(e).getTime();return Number.isNaN(t)?0:t}function yt(e){const t=e=>"invited"===e.status?0:1;return[...e].sort((e,n)=>t(e)-t(n)||mt(n.invitedAt)-mt(e.invitedAt))}function kt(e,t=new Date){return"invited"===e.status&&(null===e.validTill||void 0===e.validTill||mt(e.validTill)>t.getTime())}function bt(e,t=new Date){return yt(e.filter(e=>kt(e,t)))}function vt(e,t=new Date){return"expired"===e.status||"invited"===e.status&&!kt(e,t)}function St(e){return"object"==typeof e.workspace&&e.workspace&&e.workspace.name||""}function Et(e){return"object"==typeof e.workspace&&e.workspace?e.workspace._id:e.workspace}function _t(e){const t=e.invitedBy;return t&&"string"!=typeof t&&(t.name||t.email)||null}function It(e,t=new Date){const n=mt(e.resendAvailableAt);return n?Math.max(0,Math.ceil((n-t.getTime())/1e3)):0}!function(e){e.loading="loading",e.redirecting="redirecting",e.authenticated="authenticated",e.unauthenticated="unauthenticated",e.authenticating="authenticating"}(wt||(wt={}));const $t="saas-pending-invite",Pt=/^[0-9a-f]{64}$/;function Ut(e){return"object"==typeof e&&null!==e&&"string"==typeof e.token&&"string"==typeof e.orgId&&"number"==typeof e.createdAt}function Tt(e,t){Pt.test(e)&&t&&d($t,{token:e,orgId:t,createdAt:Date.now()})}function At(e,t=Date.now()){const n=l($t,Ut);return n?t-n.createdAt>864e5?(u($t),null):n.orgId!==e?null:Pt.test(n.token)?n.token:(u($t),null):null}function Ct(){u($t)}const xt={User:["user.registered","user.logged_in","user.new_device_login","user.email_verified","user.password_changed","user.password_reset_requested","user.profile_updated","user.tag_added","user.tag_removed","user.blocked","user.unblocked"],Organization:["organization.member_invited","organization.member_accepted","organization.member_role_changed","organization.member_removed","organization.public_write_limit_reached","organization.end_user_ceiling_reached"],Workspace:["workspace.created","workspace.updated","workspace.deleted","workspace.settings_updated","workspace.features_updated","workspace.member_added","workspace.member_removed","workspace.member_role_changed","workspace.member_invited","workspace.invitation_accepted","workspace.invitation_declined","workspace.invitation_revoked","workspace.invitation_expired"],Subscription:["subscription.created","subscription.updated","subscription.upgraded","subscription.canceled","subscription.cancel_scheduled","subscription.resumed","subscription.suspended","subscription.trial_started","subscription.trial_will_end","subscription.trial_expired","subscription.downgraded"],Payment:["payment.succeeded","payment.failed","payment.action_required","payment.refunded"],Quota:["quota.limit_exceeded"],Credit:["credit.purchased","credit.consumed","credit.expired","credit.granted","credit.revoked","credit.low_balance"],Workflow:["workflow.created","workflow.deleted","workflow.published","workflow.paused","workflow.resumed","workflow.instance_completed","workflow.instance_failed"],Audience:["audience.member_created","audience.member_updated","audience.added_to_list","audience.removed_from_list","audience.attribute_changed","audience.tag_added","audience.tag_removed","audience.unsubscribed","audience.resubscribed","audience.email_invalidated","audience.blocked","audience.unblocked","audience.import_completed","audience.list_created","audience.list_updated","audience.list_deleted"],Email:["email.domain_added","email.domain_verified","email.sent","email.opened","email.clicked","email.bounced","email.unsubscribed","email.campaign_sent"],Push:["push.campaign_sent"],Auth:["auth.method_deleted","auth.domain_added","auth.domain_verified","auth.domain_deleted","auth.client_self_registered"],Token:["token.created","token.updated","token.revoked"],"Group version":["group_version.published"],Form:["form.submitted"],Blog:["blog.published","blog.updated","blog.unpublished","blog.deleted"],Doc:["doc.published","doc.updated","doc.unpublished","doc.deleted"],FAQ:["faq.updated"],"FAQ collection":["faq_collection.updated"],Testimonial:["testimonial.updated","testimonial.deleted"],"Rich content":["rich_content.updated","rich_content.deleted"],Collection:["collection.version_published","collection.record_created","collection.record_updated","collection.record_deleted"]},Ot=Object.values(xt).flat(),Rt=new Set(Ot);function Nt(e){return Rt.has(e)}const Ft=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),Wt=(e,t)=>e>>>t|e<<32-t;function Dt(e){let t=1779033703,n=3144134277,r=1013904242,i=2773480762,s=1359893119,a=2600822924,o=528734635,c=1541459225;const u=e.length,l=u+1,d=l+(56-l%64+64)%64+8,p=new Uint8Array(d);p.set(e,0),p[u]=128;const h=8*u,f=Math.floor(h/4294967296),g=h>>>0;p[d-8]=f>>>24&255,p[d-7]=f>>>16&255,p[d-6]=f>>>8&255,p[d-5]=255&f,p[d-4]=g>>>24&255,p[d-3]=g>>>16&255,p[d-2]=g>>>8&255,p[d-1]=255&g;const w=new Uint32Array(64);for(let e=0;e<d;e+=64){for(let t=0;t<16;t++){const n=e+4*t;w[t]=p[n]<<24|p[n+1]<<16|p[n+2]<<8|p[n+3]}for(let e=16;e<64;e++){const t=Wt(w[e-15],7)^Wt(w[e-15],18)^w[e-15]>>>3,n=Wt(w[e-2],17)^Wt(w[e-2],19)^w[e-2]>>>10;w[e]=w[e-16]+t+w[e-7]+n>>>0}let u=t,l=n,d=r,h=i,f=s,g=a,m=o,y=c;for(let e=0;e<64;e++){const t=y+(Wt(f,6)^Wt(f,11)^Wt(f,25))+(f&g^~f&m)+Ft[e]+w[e]>>>0,n=u&l^u&d^l&d;y=m,m=g,g=f,f=h+t>>>0,h=d,d=l,l=u,u=t+((Wt(u,2)^Wt(u,13)^Wt(u,22))+n>>>0)>>>0}t=t+u>>>0,n=n+l>>>0,r=r+d>>>0,i=i+h>>>0,s=s+f>>>0,a=a+g>>>0,o=o+m>>>0,c=c+y>>>0}const m=new Uint8Array(32),y=[t,n,r,i,s,a,o,c];for(let e=0;e<8;e++)m[4*e]=y[e]>>>24&255,m[4*e+1]=y[e]>>>16&255,m[4*e+2]=y[e]>>>8&255,m[4*e+3]=255&y[e];return m}function Jt(e){return(new TextEncoder).encode(e)}function Lt(e,t){let n=e;n.length>64&&(n=Dt(n));const r=new Uint8Array(64),i=new Uint8Array(64);for(let e=0;e<64;e++){const t=e<n.length?n[e]:0;r[e]=54^t,i[e]=92^t}const s=Dt(Bt(r,t));return Dt(Bt(i,s))}function Mt(e,t){if(e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r++)n|=e[r]^t[r];return 0===n}function Bt(e,t){const n=new Uint8Array(e.length+t.length);return n.set(e,0),n.set(t,e.length),n}function jt(e){const{body:t,signature:n,timestamp:r,secret:i,maxAgeSeconds:s=300}=e;if(!(n&&r&&i&&t))return!1;const a="sha256=";if(!n.startsWith(a))return!1;const o=n.slice(7);if(s>0){const e=parseInt(r,10);if(isNaN(e))return!1;if(Math.abs(Math.floor(Date.now()/1e3)-e)>s)return!1}const c=function(e){if(e.length%2!=0)return null;const t=new Uint8Array(e.length/2);for(let n=0;n<t.length;n++){const r=parseInt(e.slice(2*n,2*n+2),16);if(Number.isNaN(r))return null;t[n]=r}return t}(o);if(!c)return!1;const u=Lt(Jt(i),Jt(`${r}.${t}`));return c.length===u.length&&Mt(c,u)}function qt(e){if(!jt(e))return null;try{return JSON.parse(e.body)}catch{return null}}const zt=300,Vt="/.well-known/oauth-protected-resource",Kt="/.well-known/agent-skills",Gt="/.well-known/api-catalog",Ht="/.well-known/mcp/server-card.json",Qt="/.well-known/agent-card.json",Yt="application/json",Xt="application/linkset+json",Zt="text/markdown; charset=utf-8",en="text/plain; charset=utf-8",tn="application/xml; charset=utf-8",nn=["GPTBot","OAI-SearchBot","ChatGPT-User","ClaudeBot","Claude-User","Claude-SearchBot","PerplexityBot","Perplexity-User","Google-Extended","Applebot-Extended","CCBot","Bytespider","meta-externalagent","Amazonbot"];function rn(e){return e.replace(/\/+$/,"")}function sn(e){return`public, max-age=${e}, s-maxage=${e}`}function an(e){return"sha256:"+function(e){let t="";for(let n=0;n<e.length;n++)t+=e[n].toString(16).padStart(2,"0");return t}(Dt(Jt(e)))}const on=new Map;async function cn(e,t,n,r){if(!r||r<=0)return e(t,n);const i=new AbortController,s=setTimeout(()=>i.abort(),r);try{return await e(t,{...n,signal:i.signal})}finally{clearTimeout(s)}}async function un(e){const t=e.cacheTtlSeconds??zt,n=`${rn(e.serverUrl)}::${e.orgId}`,r=on.get(n);if(r&&r.expiresAt>Date.now())return r.value;const i=e.fetch??fetch,s=`${rn(e.serverUrl)}/api/v1/public/${e.orgId}/agent-readiness`;let a={enabled:!1};try{const t=await cn(i,s,{headers:{Accept:Yt}},e.fetchTimeoutMs??5e3);if(t.ok){const e=await t.json();e&&"object"==typeof e&&(a=e)}}catch{}return on.set(n,{value:a,expiresAt:Date.now()+1e3*t}),a}const ln=new Map;function dn(){on.clear(),ln.clear()}function pn(e,t){const n=rn(e.siteUrl),r={llms_txt:"/llms.txt",sitemap:"/sitemap.xml",robots:"/robots.txt",oauth_protected_resource:Vt};t.authorizationServer?.metadataUrl&&(r.oauth_authorization_server=t.authorizationServer.metadataUrl,r.openid_configuration="/.well-known/openid-configuration"),(t.authorizationServer||e.authMd)&&(r.auth="/auth.md"),e.skills?.length&&(r.agent_skills=`${Kt}/index.json`),e.apiCatalog?.length&&(r.api_catalog=Gt),e.mcpServerCard&&(r.mcp_server_card=Ht),!1!==e.a2aCard&&(r.a2a_agent_card=Qt),e.llmsFullTxt&&(r.llms_full_txt="/llms-full.txt");return An({schema_version:"1.0",name:e.site.name,...e.site.description?{description:e.site.description}:{},url:n,...e.site.documentationUrl?{documentation_url:e.site.documentationUrl}:{},provider:e.site.provider??{name:e.site.name,url:n},capabilities:r,...e.site.contactEmail?{contact:{email:e.site.contactEmail}}:{}},e)}function hn(e){let t="/";try{t=new URL(e).pathname}catch{t=e.startsWith("/")?e:`/${e}`}const n="/"===t?"":t.replace(/\/+$/,"");return Vt+n}function fn(e,t,n){const r=t.protectedResources??[];if(!r.length)return null;const i=e.replace(/\/+$/,"")||Vt,s=n??`${rn(t.serverUrl)}/org/${t.orgId}`,a=t.scopes?.map(e=>e.name),o=r.map(e=>{const n=e.resource??rn(t.siteUrl),r=e.scopes??a;return{path:hn(n),metadata:{resource:n,authorization_servers:[s],bearer_methods_supported:e.bearerMethods??["header"],...r?.length?{scopes_supported:r}:{},...e.documentationUrl?{resource_documentation:e.documentationUrl}:{}}}}),c=o.find(e=>e.path===i);return c?An(c.metadata,t):i===Vt&&1===o.length?An(o[0].metadata,t):null}function gn(e){const t=e.skills??[];if(!t.length)return null;const n=rn(e.siteUrl);return An({$schema:"https://schemas.agentskills.io/discovery/0.2.0/schema.json",skills:t.map(e=>({name:e.name,type:e.type??"skill-md",description:e.description,url:`${n}${wn(e)}`,digest:an(e.content)}))},e)}function wn(e){return e.path??`${Kt}/${e.name}/SKILL.md`}function mn(e,t){const n=(t.skills??[]).find(t=>wn(t)===e);return n?{status:200,contentType:"text/markdown; charset=utf-8",body:n.content,cacheControl:sn(t.cacheTtlSeconds??zt)}:null}function yn(e){if(!e.security)return null;const t=(Array.isArray(e.security.contact)?e.security.contact:[e.security.contact]).map(e=>`Contact: ${e}`);return e.security.expires&&t.push(`Expires: ${e.security.expires}`),e.security.policy&&t.push(`Policy: ${e.security.policy}`),{status:200,contentType:en,body:t.join("\n")+"\n",cacheControl:sn(e.cacheTtlSeconds??zt)}}function kn(e){return e.llmsTxt?{status:200,contentType:en,body:e.llmsTxt,cacheControl:sn(e.cacheTtlSeconds??zt)}:null}function bn(e){return e.llmsFullTxt?{status:200,contentType:en,body:e.llmsFullTxt,cacheControl:sn(e.cacheTtlSeconds??zt)}:null}function vn(e){if(!1===e.a2aCard)return null;const t=e.a2aCard??{},n=rn(e.siteUrl),r=t.serviceUrl??n,i=t.transportProtocol??"http",s=t.skills??((e.skills??[]).length?(e.skills??[]).map(e=>({id:e.name,name:e.name,description:e.description,tags:["discovery"]})):[{id:"site-content",name:"Site content",description:`Read ${e.site.name}'s public content and machine-readable discovery documents (llms.txt, sitemap, API catalog).`,tags:["content"]}]);return An({protocolVersion:"0.3.0",name:t.name??e.site.name,version:t.version??"1.0.0",description:t.description??e.site.description??`${e.site.name} — agent-accessible web application.`,url:r,preferredTransport:i,supportedInterfaces:[{serviceUrl:r,transportProtocol:i}],provider:e.site.provider?{organization:e.site.provider.name,url:e.site.provider.url}:{organization:e.site.name,url:n},capabilities:t.capabilities??{streaming:!1,pushNotifications:!1},defaultInputModes:["text/plain","application/json"],defaultOutputModes:["text/plain","application/json"],skills:s,...e.site.documentationUrl?{documentationUrl:e.site.documentationUrl}:{}},e)}function Sn(e){const t=e.webBotAuth?.keys;return t?.length?{status:200,contentType:"application/http-message-signatures-directory+json",body:JSON.stringify({keys:t},null,2),cacheControl:sn(e.cacheTtlSeconds??zt)}:null}function En(e){return e.endsWith(".json")||e.includes(".well-known/")?Yt:e.endsWith(".md")?Zt:e.endsWith(".xml")?tn:en}function _n(e){let t;try{t=new URL(e.siteUrl).hostname}catch{return[]}const n=[{name:`_index._agents.${t}`,type:"HTTPS",ttl:3600,data:`1 ${t}. alpn="h2" port=443`}];if(!1!==e.a2aCard&&n.push({name:`_a2a._agents.${t}`,type:"HTTPS",ttl:3600,data:`1 ${t}. alpn="h2" port=443`}),e.mcpServerCard){let r=t;try{r=new URL(e.mcpServerCard.endpoint).hostname}catch{}n.push({name:`_mcp._agents.${t}`,type:"HTTPS",ttl:3600,data:`1 ${r}. alpn="h2" port=443`})}return n}function In(e){const t=e.apiCatalog??[];if(!t.length)return null;const n=t.map(e=>({anchor:e.anchor,...e.title?{title:e.title}:{},...e.serviceDesc?{"service-desc":[{href:e.serviceDesc}]}:{},...e.serviceDoc?{"service-doc":[{href:e.serviceDoc}]}:{},...e.status?{status:[{href:e.status}]}:{}}));return{status:200,contentType:Xt,body:JSON.stringify({linkset:n},null,2),cacheControl:sn(e.cacheTtlSeconds??zt)}}function $n(e){const t=e??{tools:!0},n={tools:!1,resources:!1,prompts:!1};for(const[e,r]of Object.entries(t))n[e]=!1!==r&&null!=r;return n}function Pn(e){const t=e.mcpServerCard;return t?An({$schema:"https://modelcontextprotocol.io/schemas/server-card/v1.0",version:"1.0",protocolVersion:t.protocolVersion??"2025-11-25",serverInfo:{name:t.name,version:t.version},...t.description?{description:t.description}:{},transport:{type:t.transport??"streamable-http",url:t.endpoint},capabilities:$n(t.capabilities),...t.documentationUrl?{documentation_url:t.documentationUrl}:{}},e):null}function Un(e){const t=e.mcpServerCard;if(!t)return null;const n=rn(e.siteUrl);let r;try{r={type:"oauth2",protected_resource_metadata:`${new URL(t.endpoint).origin}${hn(t.endpoint)}`}}catch{}return An({$schema:"https://modelcontextprotocol.io/schemas/mcp-discovery/v1.0",version:"1.0",servers:[{name:t.name,...t.description?{description:t.description}:{},transport:{type:t.transport??"streamable-http",url:t.endpoint},version:t.version,capabilities:$n(t.capabilities),...t.documentationUrl?{documentation_url:t.documentationUrl}:{},server_card:`${n}${Ht}`,...r?{authentication:r}:{}}]},e)}function Tn(e,t){const n=sn(e.cacheTtlSeconds??zt);if(e.authMd)return{status:200,contentType:Zt,body:e.authMd,cacheControl:n};const r=t.authorizationServer;if(!r)return null;const i=`# Agent Authentication\n\n${e.site.name} supports AI-agent access via OAuth 2.0 (authorization code + PKCE).\n\n## Authorization server\n- Issuer: \`${r.issuer}\`\n- Metadata (RFC 8414): ${r.metadataUrl}\n\nFetch the metadata document above for the \`authorization_endpoint\`, \`token_endpoint\`, supported grant types / PKCE methods, and — when the app allows it — the dynamic client \`registration_endpoint\` (RFC 7591).\n\n## Protected resources (RFC 9728)\nSee \`/.well-known/oauth-protected-resource\`, which lists the resource, its supported scopes, and the authorization server(s) that can issue tokens for it.\n\n## How an agent authenticates\n1. Discover this document and \`/.well-known/oauth-protected-resource\`.\n2. Fetch the authorization-server metadata for the endpoints.\n3. Register a client (dynamic registration) or use a pre-issued client_id.\n4. Run the authorization-code flow with PKCE (S256), requesting the scopes and target \`resource\`.\n5. Exchange the code for an access token and call the API with \`Authorization: Bearer <token>\`.\n\nDocumentation: ${e.site.documentationUrl??e.siteUrl}\n`;return{status:200,contentType:Zt,body:i,cacheControl:n}}function An(e,t){return{status:200,contentType:Yt,body:JSON.stringify(e,null,2),cacheControl:sn(t.cacheTtlSeconds??zt)}}function Cn(e){return String(e).replace(/[\x00-\x1f\x7f]/g,"")}function xn(e,t){const n=(Array.isArray(e.userAgent)?e.userAgent:[e.userAgent]).map(e=>`User-agent: ${Cn(e)}`);if(t){const e=[...void 0!==t.search?["search="+(t.search?"yes":"no")]:[],...void 0!==t.aiInput?["ai-input="+(t.aiInput?"yes":"no")]:[],...void 0!==t.aiTrain?["ai-train="+(t.aiTrain?"yes":"no")]:[]];e.length&&n.push(`Content-Signal: ${e.join(", ")}`)}for(const t of e.allow??[])n.push(`Allow: ${Cn(t)}`);for(const t of e.disallow??[])n.push(`Disallow: ${Cn(t)}`);return void 0!==e.crawlDelay&&n.push(`Crawl-delay: ${Cn(e.crawlDelay)}`),n.join("\n")}function On(e){const t=e.robots??{},n=rn(e.siteUrl),r=t.policies??[{userAgent:"*",allow:["/"]}],i=t.aiBots??"allow",s="allow"===i?[{userAgent:[...nn],allow:["/"]}]:"deny"===i?[{userAgent:[...nn],disallow:["/"]}]:i,a=t.sitemaps??(e.sitemap?[`${n}/sitemap.xml`]:[]),o=[`# robots.txt — agent-ready. See ${n}/llms.txt and ${n}/.well-known/agent.json`,...r.map((e,n)=>xn(e,0===n?t.contentSignals:void 0)),...s.map(e=>xn(e)),...a.length?[a.map(e=>`Sitemap: ${Cn(e)}`).join("\n")]:[]];return{status:200,contentType:en,body:o.join("\n\n")+"\n",cacheControl:sn(e.cacheTtlSeconds??zt)}}function Rn(e){const t="number"==typeof e&&Number.isFinite(e)?e:.5;return String(Math.min(1,Math.max(0,t)))}function Nn(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}function Fn(e){const t=e.sitemap?.urls;if(!t?.length)return null;const n=rn(e.siteUrl),r='<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n'+t.map(e=>{const t="string"==typeof e?{loc:e}:e;return` <url>\n${[` <loc>${Nn(/^https?:\/\//.test(t.loc)?t.loc:`${n}${t.loc.startsWith("/")?"":"/"}${t.loc}`)}</loc>`,...t.lastmod?[` <lastmod>${Nn(t.lastmod)}</lastmod>`]:[],...t.changefreq?[` <changefreq>${Nn(String(t.changefreq))}</changefreq>`]:[],...void 0!==t.priority?[` <priority>${Rn(t.priority)}</priority>`]:[]].join("\n")}\n </url>`}).join("\n")+"\n</urlset>\n";return{status:200,contentType:tn,body:r,cacheControl:sn(e.cacheTtlSeconds??zt)}}function Wn(e){if(!e)return!1;let t=0,n=0;for(const r of e.split(",")){const[e,...i]=r.trim().split(";"),s=e.trim().toLowerCase();let a=1;for(const e of i){const[t,n]=e.split("=").map(e=>e.trim());if("q"===t){const e=Number(n);Number.isNaN(e)||(a=e)}}"text/markdown"===s||"text/x-markdown"===s?t=Math.max(t,a):"text/html"!==s&&"text/*"!==s&&"*/*"!==s||(n=Math.max(n,a))}return t>0&&t>=n}function Dn(e,t,n){const r=Wn(e);return{status:200,contentType:r?Zt:"text/html; charset=utf-8",body:r?t.markdown:t.html,cacheControl:sn(n?.cacheTtlSeconds??zt),vary:"Accept"}}function Jn(e){const t=rn(e.siteUrl),n=[`<${t}/llms.txt>; rel="describedby"; type="text/plain"`,`<${t}/.well-known/agent.json>; rel="describedby"; type="application/json"`];if(!1!==e.a2aCard&&n.push(`<${t}${Qt}>; rel="describedby"; type="application/json"`),e.sitemap||e.robots?.sitemaps?.length){const r=e.robots?.sitemaps?.[0]??`${t}/sitemap.xml`;n.push(`<${r}>; rel="sitemap"; type="application/xml"`)}return e.apiCatalog?.length&&n.push(`<${t}${Gt}>; rel="api-catalog"; type="${Xt}"`),e.mcpServerCard&&n.push(`<${t}${Ht}>; rel="mcp-server"; type="application/json"`),n.join(", ")}async function Ln(e,t){const n=e.replace(/\/+$/,"")||e;if("/.well-known/agent.json"===n){return pn(t,await un(t))}if(n===Qt)return vn(t);if("/.well-known/http-message-signatures-directory"===n)return Sn(t);if("/.well-known/security.txt"===n)return yn(t);if(n===`${Kt}/index.json`)return gn(t);if(n.startsWith(`${Kt}/`)&&n.endsWith("SKILL.md"))return mn(n,t);if("/.well-known/oauth-authorization-server"===n||"/.well-known/openid-configuration"===n){const e=(await un(t)).authorizationServer;if(!e?.metadataUrl)return null;const n=await async function(e,t){const n=t.cacheTtlSeconds??zt,r=ln.get(e);if(r&&r.expiresAt>Date.now())return r.value;const i=t.fetch??fetch;let s=null;try{const n=await cn(i,e,{headers:{Accept:Yt}},t.fetchTimeoutMs??5e3);if(n.ok){const e=await n.json();e&&"object"==typeof e&&(s=e)}}catch{}return ln.set(e,{value:s,expiresAt:Date.now()+1e3*n}),s}(e.metadataUrl,t);return An(n?n:{...e.issuer?{issuer:e.issuer}:{},oauth_authorization_server_metadata:e.metadataUrl},t)}if(n===Gt)return In(t);if(n===Ht)return Pn(t);if("/.well-known/mcp.json"===n)return Un(t);if(n.startsWith(Vt)){const e=await un(t);return fn(n,t,e.authorizationServer?.issuer)}return null}async function Mn(e,t){const n=e.replace(/\/+$/,"")||e,r=function(e,t){const n=t.extraPaths?.[e];if(void 0===n)return null;const r="string"==typeof n?{body:n}:n;return{status:r.status??200,contentType:r.contentType??En(e),body:r.body,cacheControl:r.cacheControl??sn(t.cacheTtlSeconds??zt)}}(n,t);return r||("/robots.txt"===n?On(t):"/llms-full.txt"===n?bn(t):"/sitemap.xml"===n?Fn(t):"/llms.txt"===n?kn(t):"/auth.md"===n?Tn(t,await un(t)):"/security.txt"===n?yn(t):n.startsWith("/.well-known")?Ln(n,t):null)}function Bn(e){const t=globalThis.navigator;return!!t?.modelContext?.provideContext&&(t.modelContext.provideContext({tools:e}),!0)}function jn(e){let t="";for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function qn(e){const t=e.replace(/-/g,"+").replace(/_/g,"/"),n=t.length%4==0?"":"=".repeat(4-t.length%4),r=atob(t+n),i=new Uint8Array(r.length);for(let e=0;e<r.length;e++)i[e]=r.charCodeAt(e);return i}class zn extends Error{constructor(e,t){super(t),this.name="AppBridgeError",this.code=e}}function Vn(e){const t=JSON.parse((new TextDecoder).decode(qn(e)));if("object"!=typeof t||null===t||Array.isArray(t))throw new Error("JWT segment is not a JSON object");return t}function Kn(e,t,n={}){const r=n.clockToleranceSec??60,i=n.requireExp??!0;if(!e||!t)throw new zn("invalid_token","Missing token or client secret");const s=e.split(".");if(3!==s.length)throw new zn("invalid_token","Malformed JWT");const[a,o,c]=s;let u,l;try{u=Vn(a),l=Vn(o)}catch{throw new zn("invalid_token","Unreadable JWT segments")}if("HS256"!==u.alg)throw new zn("invalid_algorithm",`Unexpected JWT alg: ${String(u.alg)}`);const d=Lt(Jt(t),Jt(`${a}.${o}`));let p;try{p=qn(c)}catch{throw new zn("invalid_signature","Unreadable JWT signature")}if(!Mt(d,p))throw new zn("invalid_signature","JWT signature verification failed");!function(e){for(const t of["iss","sub","jti"])if(void 0!==e[t]&&"string"!=typeof e[t])throw new zn("invalid_token",`JWT ${t} claim must be a string`);for(const t of["exp","nbf","iat"]){const n=e[t];if(void 0!==n&&("number"!=typeof n||!Number.isFinite(n)))throw new zn("invalid_token",`JWT ${t} claim must be a finite number`)}const t=e.aud;if(!(void 0===t||"string"==typeof t||Array.isArray(t)&&t.every(e=>"string"==typeof e)))throw new zn("invalid_token","JWT aud claim must be a string or string array")}(l);const h=Math.floor(Date.now()/1e3);if(i&&"number"!=typeof l.exp)throw new zn("invalid_token","JWT is missing a numeric exp claim");if("number"==typeof l.exp&&h>l.exp+r)throw new zn("token_expired","JWT has expired");if("number"==typeof l.nbf&&h+r<l.nbf)throw new zn("token_not_yet_valid","JWT is not yet valid");if(void 0!==n.issuer&&l.iss!==n.issuer)throw new zn("invalid_issuer","JWT issuer mismatch");if(void 0!==n.audience){const e=l.aud;if(!(Array.isArray(e)?e.includes(n.audience):e===n.audience))throw new zn("invalid_audience","JWT audience mismatch")}return l}function Gn(e){if(!e)return null;const t=/^Bearer\s+(.+)$/i.exec(e.trim());return t?t[1].trim():null}function Hn(e){return jn(Jt(JSON.stringify(e)))}function Qn(e,t,n){if(!t)throw new zn("invalid_secret","Missing signing secret");const r=Math.floor(Date.now()/1e3),i={iat:r,exp:r+(n?.expiresInSec??3600),...e},s=`${Hn({alg:"HS256",typ:"JWT"})}.${Hn(i)}`;return`${s}.${jn(Lt(Jt(t),Jt(s)))}`}function Yn(e){const t=Gn(e.authorization);if(!t)throw new zn("invalid_token","Missing Bearer token");return Kn(t,e.clientSecret,{clockToleranceSec:e.clockToleranceSec})}function Xn(e){const t=Gn(e.authorization);if(!t)throw new zn("invalid_token","Missing Bearer token");return Kn(t,e.clientSecret,{clockToleranceSec:e.clockToleranceSec})}function Zn(e){return{success:!0,token:e.token,message:e.message??"ok",..."number"==typeof e.expiresIn?{expiresIn:e.expiresIn}:{}}}function er(e){return{success:!1,token:"",message:e}}async function tr(e){let t;try{t=Yn(e)}catch(e){return{status:401,body:er(e instanceof zn?e.code:"invalid_token")}}return{status:200,body:Zn(await e.mintToken(t))}}async function nr(e){let t;try{t=Xn(e)}catch(e){return{status:401,body:{success:!1,message:e instanceof zn?e.code:"invalid_token"}}}return await e.onRevoke(t),{status:200,body:{success:!0}}}function rr(e){return e.replace(/[\x00-\x1f\x7f]/g,"").replace(/([\\"])/g,"\\$1")}function ir(e){const t=[`Bearer resource_metadata="${rr(e.resourceMetadataUrl)}"`];return e.error&&t.push(`error="${rr(e.error)}"`),e.errorDescription&&t.push(`error_description="${rr(e.errorDescription)}"`),{status:401,headers:{"WWW-Authenticate":t.join(", "),"Content-Type":"application/json"},body:JSON.stringify({error:e.error??"invalid_token"})}}const sr=12,ar=16;function or(){const e=globalThis.crypto;if(!e?.subtle)throw new Error("WebCrypto is unavailable in this runtime — agent-auth session encryption requires globalThis.crypto.subtle (Node 18+, Bun, Deno, edge, browsers).");return e.subtle}const cr=new Map;function ur(e){let t=cr.get(e);return t||(t=(async()=>{const t=await or().digest("SHA-256",(new TextEncoder).encode(`${e}:bb-session`));return or().importKey("raw",t,{name:"AES-GCM"},!1,["encrypt","decrypt"])})(),cr.set(e,t)),t}function lr(e){if(!e)throw new Error("createSessionRefCrypto: missing secret");return{async encryptSessionRef(t){const n=globalThis.crypto.getRandomValues(new Uint8Array(sr)),r=await ur(e),i=new Uint8Array(await or().encrypt({name:"AES-GCM",iv:n},r,(new TextEncoder).encode(t))),s=i.subarray(i.length-ar),a=i.subarray(0,i.length-ar),o=new Uint8Array(28+a.length);return o.set(n,0),o.set(s,sr),o.set(a,28),jn(o)},async decryptSessionRef(t){try{const n=qn(t);if(n.length<=28)return null;const r=n.slice(0,sr),i=n.subarray(sr,28),s=n.subarray(28),a=new Uint8Array(s.length+ar);a.set(s,0),a.set(i,s.length);const o=await ur(e),c=await or().decrypt({name:"AES-GCM",iv:r},o,a);return(new TextDecoder).decode(c)}catch{return null}}}}async function dr(e){const{claims:t,secret:n}=e,r=e.expiresInSec??3600,i=t.resource&&t.resource.length?1===t.resource.length?t.resource[0]:t.resource:void 0,s=t.sessionId?await lr(n).encryptSessionRef(t.sessionId):void 0;return{token:Qn({sub:t.id,userId:t.id,email:t.email,...t.name?{name:t.name}:{},...t.scope?{scope:t.scope}:{},...i?{aud:i}:{},...s?{sid:s}:{},...e.extraClaims},n,{expiresInSec:r}),expiresIn:r}}function pr(e,t,n){const r=globalThis.process?.env;"1"===r?.MCP_AUTH_DEBUG&&console.warn(`[buildbase/mcp-auth] audience rejected (${n}): received aud=${JSON.stringify(e)} expected one of ${JSON.stringify(t)}`)}function hr(e){const{secret:t}=e;if(!t)throw new Error("buildbaseAuth: missing secret");const n=lr(t),r=e.resource?Array.isArray(e.resource)?e.resource:[e.resource]:[];let i=e.resourceMetadataUrl;if(!i&&r.length)try{const e=new URL(r[0]),t="/"===e.pathname?"":e.pathname.replace(/\/+$/,"");i=`${e.origin}/.well-known/oauth-protected-resource${t}`}catch{}return{resourceMetadataUrl:i,verify:async i=>{let s;try{s=Kn(i,t,{...e.verify})}catch{return null}if(r.length){const t=s.aud?Array.isArray(s.aud)?s.aud:[s.aud]:[];if(!t.length&&e.requireAudience)return pr(t,r,"token carries no aud claim"),null;if(t.length&&!t.some(e=>r.includes(e)))return pr(t,r,"aud does not include this resource"),null}const a="string"==typeof s.sid?await n.decryptSessionRef(s.sid):null,o=Array.isArray(s.scope)?s.scope.filter(e=>"string"==typeof e):"string"==typeof s.scope?s.scope.split(" ").filter(Boolean):void 0;return{sessionId:a??"",userId:"string"==typeof s.userId?s.userId:"string"==typeof s.sub?s.sub:void 0,workspaceId:"string"==typeof s.workspaceId?s.workspaceId:void 0,scopes:o,claims:s}}}}function fr(e){const{serverUrl:t,orgId:n,version:r="v1",getSessionId:i,timeout:s,maxRetries:a,debug:o,headers:c,onError:u,fetch:l}=e;if(!t)throw new Error("BuildBase: serverUrl is required");if(!n)throw new Error("BuildBase: orgId is required");const d={...void 0!==s&&{timeout:s},...void 0!==a&&{maxRetries:a},...void 0!==o&&{debug:o},...c&&{headers:c},...u&&{onError:u},...l&&{fetch:l}},p=e=>{const i={serverUrl:t,version:r,orgId:n,sessionId:e,...d};return{workspace:new W(i),user:new A(i),settings:new T(i),push:new P(i),devices:new E(i),sessions:new U(i)}},h=new W({serverUrl:t,version:r,orgId:n,...d}),f=e=>({workspace:{list:async()=>(await e()).workspace.getWorkspaces(),get:async t=>(await e()).workspace.getWorkspace(t),create:async t=>(await e()).workspace.createWorkspace(t),update:async(t,n)=>(await e()).workspace.updateWorkspace(t,n),delete:async t=>(await e()).workspace.deleteWorkspace(t),permissions:async t=>(await e()).workspace.getMyPermissions(t),can:async(t,n)=>{const{permissions:r}=await(await e()).workspace.getMyPermissions(t),i=new Set(r);return(Array.isArray(n)?n:[n]).every(e=>i.has(e))}},invitations:{list:async t=>(await e()).workspace.listInvitations(t),create:async(t,n,r,i)=>(await e()).workspace.inviteMember(t,{email:n,role:r,landingUrl:i}),resend:async(t,n)=>(await e()).workspace.resendInvitation(t,n),revoke:async(t,n)=>(await e()).workspace.revokeInvitation(t,n)},users:{list:async t=>(await e()).workspace.getWorkspaceUsers(t),invite:async(t,n,r)=>(await e()).workspace.addUser(t,{email:n,role:r}),remove:async(t,n)=>(await e()).workspace.removeUser(t,n),updateRole:async(t,n,r)=>(await e()).workspace.updateUser(t,n,{role:r}),getProfile:async()=>(await e()).workspace.getProfile(),updateProfile:async t=>(await e()).workspace.updateUserProfile(t)},subscription:{get:async t=>(await e()).workspace.getCurrentSubscription(t),checkout:async(t,n)=>(await e()).workspace.createCheckoutSession(t,n),update:async(t,n)=>(await e()).workspace.updateSubscription(t,n),cancel:async t=>(await e()).workspace.cancelSubscriptionAtPeriodEnd(t),resume:async t=>(await e()).workspace.resumeSubscription(t),getBillingPortalUrl:async(t,n)=>(await e()).workspace.createBillingPortalSession(t,n)},plans:{getGroup:async t=>(await e()).workspace.getPlanGroup(t),getVersions:async t=>(await e()).workspace.getPlanGroupVersions(t),getPublic:e=>h.getPublicPlans(e),getVersion:e=>h.getPlanGroupVersion(e)},invoices:{list:async(t,n,r)=>(await e()).workspace.listInvoices(t,n,r),get:async(t,n)=>(await e()).workspace.getInvoice(t,n)},usage:{record:async(t,n)=>(await e()).workspace.recordUsage(t,n),recordBatch:async(t,n)=>(await e()).workspace.recordUsageBatch(t,n),getQuota:async(t,n)=>(await e()).workspace.getQuotaUsageStatus(t,n),getAll:async t=>(await e()).workspace.getAllQuotaUsage(t),getLogs:async(t,n)=>(await e()).workspace.getUsageLogs(t,n)},settings:{get:async()=>(await e()).settings.getSettings()},features:{list:async()=>(await e()).workspace.getFeatures(),update:async(t,n,r)=>(await e()).workspace.updateFeature(t,n,r)},notification:{send:async(t,n,r,i)=>(await e()).workspace.sendNotification(t,n,r,i)},credits:{getBalance:async t=>(await e()).workspace.getCreditBalance(t),consume:async(t,n)=>(await e()).workspace.consumeCredits(t,n),purchase:async(t,n)=>(await e()).workspace.purchaseCredits(t,n),getPackages:async t=>(await e()).workspace.getCreditPackages(t),getTransactions:async(t,n)=>(await e()).workspace.getCreditTransactions(t,n),getBuckets:async(t,n)=>(await e()).workspace.getCreditBuckets(t,n),getExpiring:async(t,n)=>(await e()).workspace.getExpiringCredits(t,n),getPublicPackages:()=>h.getPublicCreditPackages()},permissions:{check:async(t,n,r)=>{const i=await e(),[s,a,o]=await Promise.all([i.workspace.getWorkspace(t),i.settings.getSettings(),i.workspace.getWorkspaceUsers(t)]),c=o.find(e=>("string"==typeof e.user?e.user:e.user._id)===n);return pt(r,{userId:n,workspaceRole:c?.role??null,workspace:s,settings:a})},resolve:async(t,n)=>{const r=await e(),[i,s,a]=await Promise.all([r.workspace.getWorkspace(t),r.settings.getSettings(),r.workspace.getWorkspaceUsers(t)]),o=a.find(e=>("string"==typeof e.user?e.user:e.user._id)===n);return lt({userId:n,workspaceRole:o?.role??null,workspace:i,settings:s})}},devices:{list:async()=>(await e()).devices.list(),rename:async(t,n)=>(await e()).devices.rename(t,n),signOut:async t=>(await e()).devices.signOut(t),forget:async t=>(await e()).devices.forget(t)},sessions:{list:async()=>(await e()).sessions.list(),revoke:async t=>(await e()).sessions.revoke(t)}}),g=f(async()=>p(await(async()=>{if(!i)throw new Error("BuildBase: getSessionId callback is required for authenticated calls. Pass it in BuildBase({ getSessionId: ... }) or use withSession(id) / client.forSession(id).");const e=await i();if(!e)throw new Error("BuildBase: Not authenticated (getSessionId returned null)");return e})()));return{auth:async()=>{if(!i)return null;const e=await i();return e?{sessionId:e}:null},withSession:e=>{const t=p(e);return f(async()=>t)},client:{forSession:p},...g}}export{nn as AI_BOT_USER_AGENTS,ht as APP_PERMISSION_FALLBACK_GROUP,D as ApiVersion,zn as AppBridgeError,b as AuthApi,wt as AuthStatus,G as BBAction,Q as BBScreen,H as BBStatus,K as BB_PARAM,k as BaseApi,S as BetaForm,Re as BillingIntervals,fr as BuildBase,pe as CURRENCY_DISPLAY,he as CURRENCY_FLAG,Je as CreditBucketSource,Le as CreditBucketStatus,Me as CreditTransactionType,at as DEFAULT_ROLE_PERMISSIONS,De as DunningState,L as EventEmitter,ot as FALLBACK_WORKSPACE_ROLE,C as INVITATION_ERROR_CODE,Fe as InvoiceStatuses,$ as NotificationsApi,we as PLAN_CURRENCY_CODES,me as PLAN_CURRENCY_OPTIONS,gt as PUSH_SERVICE_WORKER_SCRIPT,it as Permission,P as PushApi,J as SDKEvent,T as SettingsApi,We as SubscriptionItemType,Ne as SubscriptionStatus,A as UserApi,Ot as WEBHOOK_EVENTS,xt as WEBHOOK_EVENTS_BY_CATEGORY,W as WorkspaceApi,bt as actionableInvitations,ft as appPermissionCatalogue,er as appTokenFailure,Zn as appTokenSuccess,ir as bearerChallenge,vn as buildA2AAgentCard,pn as buildAgentCard,gn as buildAgentSkillsIndex,In as buildApiCatalog,Tn as buildAuthMd,Jn as buildDiscoveryLinkHeader,_n as buildDnsAidRecords,bn as buildLlmsFullTxt,kn as buildLlmsTxt,Un as buildMcpDiscoveryManifest,Pn as buildMcpServerCard,fn as buildProtectedResourceMetadata,On as buildRobotsTxt,yn as buildSecurityTxt,Fn as buildSitemap,mn as buildSkillMd,Sn as buildWebBotAuthDirectory,hr as buildbaseAuth,Xe as calculateBillableSeats,Ze as calculateSeatOverageCents,et as calculateTotalSubscriptionCents,te as cleanBBParams,dn as clearAgentReadinessCache,de as clearAuthIntent,Ct as clearPendingInvite,le as consumeAuthIntent,Y as createBBUrl,X as createCheckoutRedirectUrls,Z as createCreditPurchaseRedirectUrls,lr as createSessionRefCrypto,fr as default,M as eventEmitter,Gn as extractBearerToken,un as fetchAgentReadiness,Ie as formatCents,_e as formatMinorAmountIntl,Pe as formatOverageRate,Ue as formatOverageRateWithLabel,Ae as formatQuotaIncludedOverage,Oe as formatQuotaWithPrice,rt as getAvailableBillingIntervals,Ke as getAvailableCurrenciesFromPlans,je as getBasePriceCents,He as getBillingIntervalAndCurrencyFromPriceId,ve as getCurrencyDecimals,fe as getCurrencyFlag,ge as getCurrencySymbol,Ve as getDisplayCurrency,Ye as getPerSeatPriceCents,Be as getPricingVariant,Ce as getQuotaDisplayValue,Ge as getQuotaDisplayWithVariant,ze as getQuotaOverageCents,Te as getQuotaUnitLabelFromName,Qe as getSeatPricing,qe as getStripePriceIdForInterval,nr as handleAppRevokeRequest,tr as handleAppTokenRequest,pt as hasPermission,q as invalidateCreditBalance,z as invalidateQuotaUsage,V as invalidateSubscription,_t as inviterNameOf,kt as isInvitationActionable,F as isInvitationError,vt as isInvitationLapsed,Nt as isWebhookEvent,Se as isZeroDecimalCurrency,Ee as minorAmountToDisplay,dr as mintAgentToken,Dn as negotiateMarkdown,Tt as parkPendingInvite,qt as parseWebhookEvent,ct as pickDefaultRole,Bn as provideWebMcpTools,ee as readBBParams,At as readPendingInvite,It as resendCooldownSeconds,Mn as resolveAgentPath,tt as resolveMaxUsers,lt as resolvePermissions,dt as resolveRolePermissions,Ln as resolveWellKnown,ae as safeRedirect,ue as saveAuthIntent,an as sha256Digest,Qn as signClientJwt,yt as sortInvitations,nt as validateInvite,se as validateRedirectUrl,Xn as verifyAppRevokeRequest,Yn as verifyAppTokenRequest,Kn as verifyClientJwt,jt as verifyWebhookSignature,Wn as wantsMarkdown,Et as workspaceIdOf,St as workspaceNameOf};
1
+ let e=!0;function t(t,...n){e&&function(){try{const e="undefined"!=typeof globalThis?globalThis:null;return"development"===e?.process?.env?.NODE_ENV}catch{return!1}}()&&console.error(t,...n)}function n(e,...t){console.error(e,...t)}async function r(e){const t=await e.text();if(!t)throw new Error("Empty response body");try{return JSON.parse(t)}catch(e){throw new Error(`Invalid JSON response: ${t.substring(0,100)}${t.length>100?"...":""}`)}}async function i(e,t="Request failed"){if(!e.ok){let n,i=t;try{const t=await r(e);i=t.message||t.error||i,"string"==typeof t.code&&(n=t.code)}catch{i=function(e,t){const n={400:"Bad Request",401:"Unauthorized - Please check your session",403:"Forbidden - You do not have permission",404:"Resource not found",500:"Internal server error",502:"Bad Gateway",503:"Service unavailable"}[e.status]||e.statusText||t;return new Error(`${t} (${e.status}: ${n})`)}(e,t).message}throw Object.assign(new Error(i),{status:e.status,...n?{code:n}:{}})}try{return await r(e)}catch(e){if(e instanceof Error&&e.message.includes("Invalid JSON"))throw e;throw new Error("Failed to parse response as JSON")}}class s extends Error{constructor(e,t,n,r){super(e),this.code=t,this.context=n,this.originalError=r,this.name="SDKError","undefined"!=typeof Error&&"captureStackTrace"in Error&&Error.captureStackTrace(this,s)}}const a=new class{constructor(){this.config={enableConsoleLogging:!0,showUserNotifications:!1},this.listeners=new Set}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}configure(t){this.config={...this.config,...t},void 0!==t.enableConsoleLogging&&function(t){void 0!==t.enableLogging&&(e=t.enableLogging)}({enableLogging:t.enableConsoleLogging})}handleError(e,r={}){if(function(e){return e instanceof Error&&("AbortError"===e.name||"ERR_CANCELED"===e.code)}(e))return;const i=e instanceof Error?e:new s("string"==typeof e?e:"An unknown error occurred","UNKNOWN_ERROR",r),a=i instanceof s?i:new s(i.message,"SDK_ERROR",r,i);if(this.config.enableConsoleLogging&&t(`[SDK Error] ${r.component||"Unknown"}:`,{message:a.message,code:a.code,context:a.context,originalError:a.originalError,stack:a.stack}),this.config.onError)try{this.config.onError(a,r)}catch(e){n("[SDK Error Handler] Error in custom error callback:",e)}for(const e of this.listeners)try{e(a,r)}catch(e){n("[SDK Error Handler] Error in error listener:",e)}this.config.showUserNotifications&&this.notifyUser(a,r)}notifyUser(e,t){"undefined"!=typeof window&&window.dispatchEvent&&window.dispatchEvent(new CustomEvent("sdk-error",{detail:{error:e,context:t}}))}wrapAsync(e,t){return(...n)=>e(...n).catch(e=>{throw this.handleError(e,t),e})}wrapSync(e,t){return(...n)=>{try{return e(...n)}catch(e){throw this.handleError(e,t),e}}}};function o(e,t={}){a.handleError(e,t)}function c(e){if("undefined"==typeof window)return null;try{return localStorage.getItem(e)}catch(t){return o(t,{component:"storage",action:"getStorageItem",metadata:{key:e}}),null}}function l(e){if("undefined"!=typeof window)try{localStorage.removeItem(e)}catch(t){o(t,{component:"storage",action:"removeStorageItem",metadata:{key:e}})}}function u(e,t){const n=c(e);if(!n)return null;try{const r=JSON.parse(n);return t&&!t(r)?(o(new Error("Storage data failed validation"),{component:"storage",action:"getStorageJSON",metadata:{key:e}}),l(e),null):r}catch(t){return o(t,{component:"storage",action:"getStorageJSON",metadata:{key:e}}),l(e),null}}function d(e,t){try{!function(e,t){if("undefined"!=typeof window)try{localStorage.setItem(e,t)}catch(t){o(t,{component:"storage",action:"setStorageItem",metadata:{key:e}})}}(e,JSON.stringify(t))}catch(t){o(t,{component:"storage",action:"setStorageJSON",metadata:{key:e}})}}const p="saas-session-id",h="saas-device-id";function f(){return function(){if("undefined"==typeof window)return null;try{return c(p)}catch(e){return o(e,{component:"auth-utils",action:"getSessionId",metadata:{key:p}}),null}}()}function g(){const e=f(),t={};e&&(t["x-session-id"]=e);const n=function(){if("undefined"==typeof window)return null;try{return c(h)??null}catch(e){return o(e,{component:"auth-utils",action:"getOrCreateDeviceId",metadata:{key:h}}),null}}();return n&&(t["x-device-id"]=n),t}const w=new WeakSet,m=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),y="SDK is not ready (missing serverUrl, version, or orgId)";class k{constructor(e){this.serverUrl=e.serverUrl,this.version=e.version,this.orgId=e.orgId,this.requireOrgId=e.requireOrgId??!1,this.basePath=e.basePath??"public",this._sessionId=e.sessionId,this._timeout=e.timeout??3e4,this._maxRetries=e.maxRetries??0,this._debug=e.debug??!1,this._customHeaders=e.headers??{},this._onError=e.onError,this._onUnauthorized=e.onUnauthorized,this._fetch=e.fetch??globalThis.fetch}ensureReady(){if(!this.serverUrl?.trim()||!this.version)throw new Error(y);if(this.requireOrgId&&!this.orgId?.trim())throw new Error(y)}get baseUrl(){return this.ensureReady(),`${this.serverUrl}/api/${this.version}/${this.basePath}`}getAuthHeaders(){return this._sessionId?{"x-session-id":this._sessionId}:g()}url(e){const t=e.startsWith("/")?e.slice(1):e;return`${this.baseUrl.endsWith("/")?this.baseUrl.slice(0,-1):this.baseUrl}/${t}`}buildHeaders(e){const t={...this._customHeaders,...this.getAuthHeaders()};return e.headers&&Object.assign(t,e.headers),null==e.body||t["Content-Type"]||(t["Content-Type"]="application/json"),t}reportError(e,t){w.has(e)||(w.add(e),this._onError?.(e,t))}async executeFetch(e,t){return this.executeFetchUrl(this.url(e),t,e)}static delay(e,t){return new Promise((n,r)=>{const i=()=>{clearTimeout(s),r(new DOMException("The operation was aborted.","AbortError"))};if(t?.aborted)return i();const s=setTimeout(()=>{t?.removeEventListener("abort",i),n()},e);t?.addEventListener("abort",i,{once:!0})})}async executeFetchUrl(e,t,n){const r=(t.method??"GET").toUpperCase(),i=n??e,s=this.buildHeaders(t),a={...t,headers:s},o=m.has(r);let c,l;if(this._timeout>0){l=new AbortController;const e=l;c=setTimeout(()=>e.abort(),this._timeout),a.signal=t.signal?function(e,t){const n=AbortSignal.any;if("function"==typeof n)return n([e,t]);const r=new AbortController,i=e=>{r.signal.aborted||r.abort(e.reason)};for(const n of[e,t]){if(n.aborted){i(n);break}n.addEventListener("abort",()=>i(n),{once:!0})}return r.signal}(t.signal,e.signal):e.signal}const u=e=>{if(l?.signal.aborted&&!t.signal?.aborted){const e=new Error(`Request timeout after ${this._timeout}ms: ${r} ${i}`);return this.reportError(e,{method:r,path:i}),e}return e},d=async t=>{try{if("function"!=typeof this._fetch)throw new Error("No fetch implementation available. Global fetch requires Node 18+; on older runtimes pass a `fetch` in the SDK config (e.g. from `undici` or `node-fetch`).");const n=this._fetch.bind(globalThis),i=await n(e,a);if(this._debug&&console.log(`[BuildBase] ${r} ${e} → ${i.status}`),401===i.status&&this._onUnauthorized&&this._onUnauthorized(),i.status>=500&&o&&t<this._maxRetries){const e=Math.min(1e3*Math.pow(2,t),1e4);return this._debug&&console.log(`[BuildBase] Retrying in ${e}ms (attempt ${t+1}/${this._maxRetries})`),await k.delay(e,a.signal),d(t+1)}return i}catch(e){if(e instanceof Error&&"AbortError"===e.name)throw u(e);if(o&&t<this._maxRetries){const e=Math.min(1e3*Math.pow(2,t),1e4);this._debug&&console.log(`[BuildBase] Network error, retrying in ${e}ms (attempt ${t+1}/${this._maxRetries})`);try{await k.delay(e,a.signal)}catch(e){throw u(e)}return d(t+1)}throw e instanceof Error&&this.reportError(e,{method:r,path:i}),e}};try{return await d(0)}finally{void 0!==c&&clearTimeout(c)}}async fetchJson(e,t={},n="Request failed"){this.ensureReady();try{const r=await this.executeFetch(e,t);return await i(r,n)}catch(n){throw n instanceof Error&&this.reportError(n,{method:(t.method??"GET").toUpperCase(),path:e}),n}}async fetchResponse(e,t={}){return this.ensureReady(),this.executeFetch(e,t)}async fetchUnwrapped(e,t={},n="Request failed"){const r=await this.fetchResponse(e,t);return r.ok||await this.throwResponseError(r,n),this.unwrapResponse(r,n)}async fetchAbsoluteUrl(e,t={}){return this.ensureReady(),this.executeFetchUrl(e,t)}async throwResponseError(e,t){let n=t;try{n=(await e.json()).message||n}catch{n=`${t} (${e.status}: ${e.statusText})`}throw Object.assign(new Error(n),{status:e.status})}apiPath(e,...t){return e.reduce((e,n,r)=>e+n+(r<t.length?encodeURIComponent(String(t[r])):""),"")}async unwrapResponse(e,t){const n=await e.json();if(void 0!==n.success){if(!n.success)throw new Error(n.message||t);return void 0!==n.data?n.data:n}return n}}class b extends k{constructor(e){super(e)}async requestAuth(e){const t=`${this.serverUrl}/api/${this.version}/auth/request`,n="Failed to initiate authentication",r=e=>this.fetchAbsoluteUrl(t,{method:"POST",body:JSON.stringify(e)});let i=await r(e);if(400===i.status&&(e.trackingConsent||e.trackingIdentity||e.trackingAttribution||e.invitationToken)){const{trackingConsent:t,trackingIdentity:n,trackingAttribution:s,invitationToken:a,...o}=e;i=await r(o)}return i.ok||await this.throwResponseError(i,n),this.unwrapResponse(i,n)}async getProfile(e,t){return this.fetchJson("profile",{headers:{"x-session-id":e},signal:t},"Failed to fetch user profile")}async getDeviceToken(e,t){try{const n=await this.fetchUnwrapped("device-token",{headers:{"x-session-id":e},signal:t},"Failed to fetch device token");return n?.deviceToken??""}catch{return""}}async logout(e,t,n){await this.fetchJson("logout",{method:"POST",...e?{headers:{"x-session-id":e}}:{},...t?.all?{body:JSON.stringify({all:!0})}:{},signal:n},"Failed to sign out")}}class v extends k{constructor(e){super({...e,basePath:"beta",requireOrgId:!0})}getAuthHeaders(){return{}}async fetchConfig(){return this.fetchJson(`config?orgId=${encodeURIComponent(this.orgId)}`,{},"Failed to fetch beta form configuration")}async submitBetaUser(e){return this.fetchJson("submit",{method:"POST",body:JSON.stringify(e)},"Failed to submit beta user request")}}class S{constructor(e){this.api=new v(e),this.orgId=e.orgId}async fetchConfig(){return this.api.fetchConfig()}async submitBetaUser(e){const t=e?.context??{},n=t?.country??("undefined"!=typeof navigator&&navigator.language?navigator.language.split("-")[1]:void 0),r=t?.language??("undefined"!=typeof navigator&&navigator.language?navigator.language.split("-")[0]:void 0),i=t?.timezone??("undefined"!=typeof Intl&&Intl.DateTimeFormat?Intl.DateTimeFormat().resolvedOptions().timeZone:void 0),s=t?.currency??("undefined"!=typeof Intl&&Intl.NumberFormat&&Intl.NumberFormat().resolvedOptions().currency?Intl.NumberFormat().resolvedOptions().currency:void 0);return this.api.submitBetaUser({orgId:this.orgId,formData:{...e,country:n,language:r,timezone:i,currency:s}})}}class E extends k{constructor(e){super(e)}async list(e){const t=await this.fetchJson("devices",{signal:e},"Failed to load devices");return t?.devices??[]}async rename(e,t,n){await this.fetchJson(this.apiPath`devices/${e}`,{method:"PATCH",body:JSON.stringify({name:t}),signal:n},"Failed to rename device")}async signOut(e,t){return this.fetchJson(this.apiPath`devices/${e}`,{method:"DELETE",signal:t},"Failed to sign out device")}async forget(e,t){return this.fetchJson(`${this.apiPath`devices/${e}`}?forget=true`,{method:"DELETE",signal:t},"Failed to forget device")}}function _(e){const t=new URLSearchParams;for(const[n,r]of Object.entries(e))void 0!==r&&""!==r&&!1!==r&&t.set(n,String(r));const n=t.toString();return n?`?${n}`:""}const I=e=>JSON.stringify(e?{workspaceId:e}:{});class $ extends k{constructor(e){super(e)}async list(e={},t){const n=await this.fetchJson(`notifications${_({workspaceId:e.workspaceId,unread:e.unread,archived:e.archived,page:e.page,limit:e.limit})}`,{signal:t},"Failed to load notifications");return{notifications:n?.notifications??[],page:n?.page??e.page??1,limit:n?.limit??e.limit??20,total:n?.total??0,hasNextPage:Boolean(n?.hasNextPage)}}async counts(e,t){const n=await this.fetchJson(`notifications/unread-count${_({workspaceId:e})}`,{signal:t},"Failed to load notification count");return{unread:n?.unread??0,unseen:n?.unseen??0}}markRead(e){return this.itemAction(this.apiPath`notifications/${e}/read`,"POST",!0)}markUnread(e){return this.itemAction(this.apiPath`notifications/${e}/unread`,"POST")}archive(e){return this.itemAction(this.apiPath`notifications/${e}/archive`,"POST")}unarchive(e){return this.itemAction(this.apiPath`notifications/${e}/archive`,"DELETE")}async markAllRead(e){await this.fetchJson("notifications/read-all",{method:"POST",body:I(e)},"Failed to mark notifications read")}async markSeen(e){await this.fetchJson("notifications/seen",{method:"POST",body:I(e)},"Failed to mark notifications seen")}async itemAction(e,t,n=!1){return this.fetchJson(e,n?{method:t,keepalive:n}:{method:t},"Failed to update notification")}}class P extends k{constructor(e){super({...e,requireOrgId:!0})}async getVapidPublicKey(){return this.fetchJson("push/vapid-public-key")}async subscribe(e,t){await this.fetchJson("push/subscribe",{method:"POST",body:JSON.stringify({endpoint:e.endpoint,keys:e.keys,userAgent:t})})}async unsubscribe(e){await this.fetchJson("push/unsubscribe",{method:"DELETE",body:JSON.stringify({endpoint:e})})}}class U extends k{constructor(e){super(e)}async list(e){const t=await this.fetchJson("sessions",{signal:e},"Failed to load sessions");return t?.sessions??[]}async revoke(e,t){await this.fetchJson(this.apiPath`sessions/${e}`,{method:"DELETE",signal:t},"Failed to sign out session")}}class A extends k{constructor(e){super({...e,requireOrgId:!0})}async getSettings(e){return this.fetchJson(`${this.orgId}/settings`,{signal:e},"Failed to fetch settings")}}class T extends k{constructor(e){super(e)}async getAttributes(e){const t=await this.fetchResponse("users/attributes",{signal:e});t.ok||await this.throwResponseError(t,"Failed to fetch user attributes");const n=await this.unwrapResponse(t,"Failed to fetch user attributes");return n&&"object"==typeof n&&!Array.isArray(n)?n:{}}async updateAttributes(e){return this.fetchJson("users/attributes",{method:"PATCH",body:JSON.stringify({attributes:e})},"Failed to update user attributes")}async updateAttribute(e,t){return this.fetchJson(this.apiPath`users/attributes/${e}`,{method:"PATCH",body:JSON.stringify({value:t})},"Failed to update user attribute")}async getFeatures(e){const t=await this.fetchResponse("users/features",{signal:e});t.ok||await this.throwResponseError(t,"Failed to fetch user features");const n=await this.unwrapResponse(t,"Failed to fetch user features");return"object"==typeof n&&null!==n?n:{}}}const C={NOT_FOUND:"INVITATION_NOT_FOUND",EXPIRED:"INVITATION_EXPIRED",ALREADY_HANDLED:"INVITATION_ALREADY_HANDLED",EMAIL_MISMATCH:"INVITATION_EMAIL_MISMATCH",EMAIL_NOT_VERIFIED:"EMAIL_NOT_VERIFIED",INVITES_DISABLED:"WORKSPACE_INVITES_DISABLED",RATE_LIMITED:"INVITATION_RATE_LIMITED",EMAIL_FAILED:"INVITATION_EMAIL_FAILED",SEAT_LIMIT:"SEAT_LIMIT_REACHED",USER_BLOCKED:"USER_BLOCKED",NO_SENDER_CONFIGURED:"NO_SENDER_CONFIGURED"},x={402:C.SEAT_LIMIT,404:C.NOT_FOUND,409:C.ALREADY_HANDLED,410:C.EXPIRED,429:C.RATE_LIMITED,502:C.EMAIL_FAILED,503:C.NO_SENDER_CONFIGURED};function O(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function R(e){return"string"==typeof e&&e?e:void 0}async function N(e,t){let n=null;try{n=await e.json()}catch{n=null}return function(e,t,n){const r=t&&"object"==typeof t?t:{},i=R(r.message)??R(r.error)??n,s={status:e,code:R(r.code)??x[e]??`HTTP_${e}`,currentUserCount:O(r.currentUserCount),limit:O(r.limit),retryAfterSeconds:O(r.retryAfterSeconds),invitedEmail:R(r.invitedEmail),invitationId:R(r.invitationId),invitationStatus:R(r.status)};return Object.assign(new Error(i),s)}(e.status,n,t)}function F(e){return e instanceof Error&&"number"==typeof e.status}class W extends k{constructor(e){super({...e,requireOrgId:!0})}async getWorkspaces(e){return this.fetchJson("workspaces",{signal:e},"Failed to fetch workspaces")}async createWorkspace(e,t){try{return await this.fetchJson("workspaces",{method:"POST",body:JSON.stringify(e),signal:t},"Failed to create workspace")}catch(n){const r=n?.status;if(400===r&&e.trackingAttribution){const{trackingAttribution:n,...r}=e;return this.fetchJson("workspaces",{method:"POST",body:JSON.stringify(r),signal:t},"Failed to create workspace")}throw n}}async updateWorkspace(e,t,n){return this.fetchJson(this.apiPath`workspaces/${e}`,{method:"PUT",body:JSON.stringify(t),signal:n},"Failed to update workspace")}async deleteWorkspace(e,t){return this.fetchJson(this.apiPath`workspaces/${e}`,{method:"DELETE",signal:t},"Failed to delete workspace")}async getWorkspaceUsers(e,t){return this.fetchJson(this.apiPath`workspaces/${e}/users`,{signal:t},"Failed to fetch workspace users")}async addUser(e,t,n){return this.fetchJson(this.apiPath`workspaces/${e}/users/add`,{method:"POST",body:JSON.stringify(t),signal:n},"Failed to invite member")}async fetchInvitation(e,t={},n="Request failed"){const r=await this.fetchResponse(e,t);if(!r.ok)throw await N(r,n);return i(r,n)}async listInvitations(e,t){return this.fetchInvitation(this.apiPath`workspaces/${e}/invitations`,{signal:t},"Failed to fetch invitations")}async inviteMember(e,t,n){const r={email:t.email,role:t.role};return t.landingUrl&&(r.landingUrl=t.landingUrl),this.fetchInvitation(this.apiPath`workspaces/${e}/invitations`,{method:"POST",body:JSON.stringify(r),signal:n},"Failed to send invitation")}async resendInvitation(e,t,n){return this.fetchInvitation(this.apiPath`workspaces/${e}/invitations/${t}/resend`,{method:"POST",signal:n},"Failed to resend invitation")}async revokeInvitation(e,t,n){return this.fetchInvitation(this.apiPath`workspaces/${e}/invitations/${t}`,{method:"DELETE",signal:n},"Failed to revoke invitation")}async myInvitations(e){return this.fetchInvitation("invitations",{signal:e},"Failed to fetch your invitations")}async acceptInvitation(e,t,n){return this.fetchInvitation(this.apiPath`invitations/${e}/accept`,{method:"PATCH",signal:n,...t?.token?{body:JSON.stringify({token:t.token})}:{}},"Failed to accept invitation")}async declineInvitation(e,t){return this.fetchInvitation(this.apiPath`invitations/${e}/reject`,{method:"PATCH",signal:t},"Failed to decline invitation")}async previewInvitation(e,t){if(!this.orgId)throw new Error("orgId is required for previewInvitation");return this.fetchInvitation(this.apiPath`${this.orgId}/invitations/preview/${e}`,{signal:t},"Failed to load invitation")}async removeUser(e,t,n){return this.fetchJson(this.apiPath`workspaces/${e}/users/${t}`,{method:"DELETE",signal:n},"Failed to remove user")}async updateUser(e,t,n,r){return this.fetchJson(this.apiPath`workspaces/${e}/users/${t}`,{method:"PATCH",body:JSON.stringify(n),signal:r},"Failed to update user")}async updateSettings(e,t){return this.fetchJson("workspaces/settings",{method:"PATCH",body:JSON.stringify(e),signal:t},"Failed to update workspace settings")}async updateWorkspacePermissions(e,t,n){return this.fetchJson(this.apiPath`workspaces/${e}/permissions`,{method:"PATCH",body:JSON.stringify({permissions:t}),signal:n},"Failed to update workspace permissions")}async getMyPermissions(e,t){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/permissions/me`,{signal:t},"Failed to fetch workspace permissions")}async getFeatures(e){return this.fetchJson("workspaces/features",{signal:e},"Failed to fetch features")}async updateFeature(e,t,n,r){return this.fetchJson(this.apiPath`workspaces/${e}/features`,{method:"PATCH",body:JSON.stringify({features:{[t]:n}}),signal:r},"Failed to update feature")}async getWorkspace(e,t){return this.fetchJson(this.apiPath`workspaces/${e}`,{signal:t},"Failed to fetch workspace")}async getProfile(e){return this.fetchJson("profile",{signal:e},"Failed to fetch profile")}async updateUserProfile(e,t){return this.fetchJson("profile",{method:"PATCH",body:JSON.stringify(e),signal:t},"Failed to update user profile")}async getPasskeys(e){const t=await this.fetchJson("passkeys",{signal:e},"Failed to fetch passkeys");return t?.passkeys??[]}async renamePasskey(e,t,n){await this.fetchJson(this.apiPath`passkeys/${e}`,{method:"PATCH",body:JSON.stringify({name:t}),signal:n},"Failed to rename passkey")}async deletePasskey(e,t){await this.fetchJson(this.apiPath`passkeys/${e}`,{method:"DELETE",signal:t},"Failed to remove passkey")}async getCurrentSubscription(e,t){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription`,{signal:t},"Failed to fetch subscription")}async getPlanGroup(e,t){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/plan-group`,{signal:t},"Failed to fetch plan group")}async getPlanGroupByVersion(e,t,n){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/plan-group`+`?groupVersionId=${encodeURIComponent(t)}`,{signal:n},"Failed to fetch plan group version")}async getPlanGroupVersions(e,t){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/plan-group/versions`,{signal:t},"Failed to fetch plan group versions")}async getPublicPlans(e,t){if(!this.orgId)throw new Error("orgId is required for getPublicPlans");return this.fetchUnwrapped(this.apiPath`${this.orgId}/plans/${encodeURIComponent(e)}`,{signal:t},"Failed to fetch plans")}async getPublicCreditPackages(e){if(!this.orgId)throw new Error("orgId is required for getPublicCreditPackages");return this.fetchUnwrapped(this.apiPath`${this.orgId}/credit-packages`,{signal:e},"Failed to fetch credit packages")}async getPlanGroupVersion(e,t){return this.fetchUnwrapped(this.apiPath`plan-group-versions/${e}`,{signal:t},"Failed to fetch plan group version")}async createCheckoutSession(e,t,n){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/checkout`,{method:"POST",body:JSON.stringify(t),signal:n},"Failed to create checkout session")}async selectFreePlan(e,t,n){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/select-free-plan`,{method:"POST",body:JSON.stringify({planVersionId:t}),signal:n},"Failed to select free plan")}async updateSubscription(e,t,n){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription`,{method:"PATCH",body:JSON.stringify(t),signal:n},"Failed to update subscription")}async createBillingPortalSession(e,t,n){return this.fetchJson(this.apiPath`workspaces/${e}/subscription/billing-portal`,{method:"POST",body:JSON.stringify(t?{returnUrl:t}:{}),signal:n})}async listInvoices(e,t=10,n,r){const i=new URLSearchParams;return i.append("limit",t.toString()),n&&i.append("starting_after",n),this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/invoices`+`?${i.toString()}`,{signal:r},"Failed to fetch invoices")}async getInvoice(e,t,n){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/invoices/${t}`,{signal:n},"Failed to fetch invoice")}async cancelSubscriptionAtPeriodEnd(e,t){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/cancel-at-period-end`,{method:"POST",signal:t},"Failed to cancel subscription")}async resumeSubscription(e,t){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/resume`,{method:"POST",signal:t},"Failed to resume subscription")}async recordUsage(e,t,n){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/usage`,{method:"POST",body:JSON.stringify(t),signal:n},"Failed to record usage")}async recordUsageBatch(e,t,n){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/usage/batch`,{method:"POST",body:JSON.stringify(t),signal:n},"Failed to record batch usage")}async getQuotaUsageStatus(e,t,n){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/usage/status`+`?quotaSlug=${encodeURIComponent(t)}`,{signal:n},"Failed to fetch quota usage status")}async getAllQuotaUsage(e,t){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/usage/all`,{signal:t},"Failed to fetch all quota usage")}async getUsageLogs(e,t,n){const r=new URLSearchParams;t?.quotaSlug&&r.append("quotaSlug",t.quotaSlug),t?.from&&r.append("from",t.from),t?.to&&r.append("to",t.to),t?.source&&r.append("source",t.source),t?.page&&r.append("page",t.page.toString()),t?.limit&&r.append("limit",t.limit.toString());const i=r.toString(),s=this.apiPath`workspaces/${e}/subscription/usage/logs`+(i?`?${i}`:"");return this.fetchUnwrapped(s,{signal:n},"Failed to fetch usage logs")}async sendNotification(e,t,n,r,i){const s={event:t};return n&&(s.userId=n),r&&(s.data=r),this.fetchJson(this.apiPath`workspaces/${e}/notifications/send`,{method:"POST",body:JSON.stringify(s),signal:i},"Failed to send notification")}async getNotificationEvents(e,t){return this.fetchJson(this.apiPath`workspaces/${e}/notification-events`,{signal:t},"Failed to fetch notification events")}async getNotificationPreferences(e,t){return(await this.fetchJson(this.apiPath`workspaces/${e}/notification-preferences`,{signal:t},"Failed to fetch notification preferences")).notificationPreferences??{}}async updateNotificationPreferences(e,t,n){return(await this.fetchJson(this.apiPath`workspaces/${e}/notification-preferences`,{method:"PATCH",body:JSON.stringify({notificationPreferences:t}),signal:n},"Failed to update notification preferences")).notificationPreferences??{}}async getMyNotificationPreferences(e,t){const n=await this.fetchJson(this.apiPath`workspaces/${e}/notification-preferences/me`,{signal:t},"Failed to fetch your notification preferences");return{defaults:n?.defaults??{},mine:n?.mine??{}}}async updateMyNotificationPreferences(e,t,n){const r=await this.fetchJson(this.apiPath`workspaces/${e}/notification-preferences/me`,{method:"PATCH",body:JSON.stringify({notificationPreferences:t}),signal:n},"Failed to update your notification preferences");return{defaults:r?.defaults??{},mine:r?.mine??{}}}async getCreditBalance(e,t){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/credits`,{signal:t},"Failed to fetch credit balance")}async consumeCredits(e,t,n){const r=await this.fetchResponse(this.apiPath`workspaces/${e}/credits/consume`,{method:"POST",body:JSON.stringify(t),signal:n});if(!r.ok){if(402===r.status){const e=await r.json().catch(()=>({})),t=new Error(e.message||"Insufficient credits");throw t.available=e.available,t.requested=e.requested,t.code="INSUFFICIENT_CREDITS",t}await this.throwResponseError(r,"Failed to consume credits")}return this.unwrapResponse(r,"Failed to consume credits")}async purchaseCredits(e,t,n){return this.fetchUnwrapped(this.apiPath`workspaces/${e}/credits/purchase`,{method:"POST",body:JSON.stringify(t),signal:n},"Failed to create credit purchase checkout")}async getCreditPackages(e,t){const n=await this.fetchUnwrapped(this.apiPath`workspaces/${e}/credits/packages`,{signal:t},"Failed to fetch credit packages");return n.docs??n}async getCreditTransactions(e,t,n){const r=new URLSearchParams;t?.type&&r.append("type",t.type),t?.page&&r.append("page",t.page.toString()),t?.limit&&r.append("limit",t.limit.toString());const i=r.toString(),s=this.apiPath`workspaces/${e}/credits/transactions`+(i?`?${i}`:"");return this.fetchUnwrapped(s,{signal:n},"Failed to fetch credit transactions")}async getCreditBuckets(e,t,n){const r=new URLSearchParams;t?.status&&r.append("status",t.status),t?.source&&r.append("source",t.source),t?.page&&r.append("page",t.page.toString()),t?.limit&&r.append("limit",t.limit.toString());const i=r.toString(),s=this.apiPath`workspaces/${e}/credits/buckets`+(i?`?${i}`:"");return this.fetchUnwrapped(s,{signal:n},"Failed to fetch credit buckets")}async getExpiringCredits(e,t,n){const r=t?`?days=${t}`:"";return this.fetchUnwrapped(this.apiPath`workspaces/${e}/credits/expiring`+r,{signal:n},"Failed to fetch expiring credits")}}var J;!function(e){e.V1="v1"}(J||(J={}));const L={UserCreated:"user:created",UserUpdated:"user:updated",WorkspaceChanged:"workspace:changed",WorkspaceUpdated:"workspace:updated",WorkspaceUserAdded:"workspace:user-added",WorkspaceUserRemoved:"workspace:user-removed",WorkspaceUserRoleChanged:"workspace:user-role-changed",WorkspaceCreated:"workspace:created",WorkspaceDeleted:"workspace:deleted",WorkspaceInvitationSent:"workspace:invitation-sent",WorkspaceInvitationAccepted:"workspace:invitation-accepted",WorkspaceInvitationDeclined:"workspace:invitation-declined",WorkspaceInvitationRevoked:"workspace:invitation-revoked"};class D{constructor(){this.callbacks=null,this.listeners=new Map}setCallbacks(e){this.callbacks=e}getCallbacks(){return this.callbacks}async emit(e,t){if(this.callbacks?.handleEvent)try{await this.callbacks.handleEvent(e,t)}catch(t){o(t,{component:"EventEmitter",action:"emit",metadata:{eventType:e}})}const n=this.listeners.get(e);if(n)for(const r of[...n])try{r(t)}catch(t){o(t,{component:"EventEmitter",action:"notifyListener",metadata:{eventType:e}})}}on(e,t){const n=this.listeners.get(e)??new Set;return n.add(t),this.listeners.set(e,n),()=>{this.listeners.get(e)?.delete(t)}}async emitUserCreated(e){await this.emit(L.UserCreated,{user:e})}async emitUserUpdated(e,t){await this.emit(L.UserUpdated,{user:e,previousUser:t})}async emitWorkspaceChanged(e,t){await this.emit(L.WorkspaceChanged,{workspace:e,previousWorkspace:t})}async emitWorkspaceUpdated(e){await this.emit(L.WorkspaceUpdated,{workspace:e})}async emitWorkspaceUserAdded(e,t,n){await this.emit(L.WorkspaceUserAdded,{userId:e,workspace:t,role:n})}async emitWorkspaceInvitationSent(e,t){await this.emit(L.WorkspaceInvitationSent,{invitation:e,workspaceId:t})}async emitWorkspaceInvitationAccepted(e,t){await this.emit(L.WorkspaceInvitationAccepted,{invitation:e,workspace:t})}async emitWorkspaceInvitationDeclined(e){await this.emit(L.WorkspaceInvitationDeclined,{invitation:e})}async emitWorkspaceInvitationRevoked(e,t){await this.emit(L.WorkspaceInvitationRevoked,{invitationId:e,workspaceId:t})}async emitWorkspaceUserRemoved(e,t,n){await this.emit(L.WorkspaceUserRemoved,{userId:e,workspace:t,role:n})}async emitWorkspaceUserRoleChanged(e,t,n,r){await this.emit(L.WorkspaceUserRoleChanged,{userId:e,workspace:t,previousRole:n,newRole:r})}async emitWorkspaceCreated(e){await this.emit(L.WorkspaceCreated,{workspace:e})}async emitWorkspaceDeleted(e){await this.emit(L.WorkspaceDeleted,{workspace:e})}}const M=new D,j=globalThis;function B(e){const t=Symbol.for(`@buildbase/sdk.invalidation.${e}`),n=j[t]??(j[t]=new Set);return{subscribe:e=>(n.add(e),()=>{n.delete(e)}),invalidate(){n.forEach(e=>e())},reset(){n.clear()}}}const q=B("credit-balance").invalidate,z=B("quota-usage").invalidate,V=B("subscription").invalidate,K="bb",G={Checkout:"checkout",Billing:"billing",SelectPlan:"selectPlan",CreditPurchase:"creditPurchase",OpenCreditStore:"openCreditStore",OpenConnectGuide:"openConnectGuide",Invite:"invite"},H={Success:"success",Cancel:"cancel",Error:"error"},Q={Subscription:"subscription",Credits:"credits",Usage:"usage",Users:"users",Profile:"profile",General:"general",Features:"features",Notifications:"notifications",Permissions:"permissions",Danger:"danger"};function Y(e,t){const n=t??("undefined"!=typeof window?window.location.href:"https://localhost");let r;try{r=new URL(n)}catch{throw new Error(`createBBUrl: invalid base URL: ${JSON.stringify(n)}`)}return r.search="",r.searchParams.set(K,function(e){return Object.entries(e).filter(([,e])=>null!=e&&""!==e).map(([e,t])=>`${encodeURIComponent(e)}:${encodeURIComponent(t)}`).join(",")}(e)),r.toString()}function X(e,t){const n=t||("undefined"!=typeof window?window.location.href:void 0);return{successUrl:Y({action:G.Checkout,status:H.Success,ws:e,screen:Q.Subscription},n),cancelUrl:Y({action:G.Checkout,status:H.Cancel,ws:e,screen:Q.Subscription},n)}}function Z(e,t){const n=t||("undefined"!=typeof window?window.location.href:void 0);return{successUrl:Y({action:G.CreditPurchase,status:H.Success,ws:e,screen:Q.Credits},n),cancelUrl:Y({action:G.CreditPurchase,status:H.Cancel,ws:e,screen:Q.Credits},n)}}function ee(){if("undefined"==typeof window)return null;try{const e=new URLSearchParams(window.location.search).get(K);if(!e)return null;const t=function(e){const t={};if(!e)return t;const n=e.split(",");for(const e of n){const n=e.indexOf(":");if(-1===n)continue;const r=decodeURIComponent(e.slice(0,n)),i=decodeURIComponent(e.slice(n+1));r&&(t[r]=i)}return t}(e);return Object.keys(t).length>0?t:null}catch{return null}}function te(){if("undefined"!=typeof window)try{const e=new URL(window.location.href);e.searchParams.has(K)&&(e.searchParams.delete(K),window.history.replaceState({},"",e.toString()))}catch{}}const ne="__buildbaseBeforeLeave",re=globalThis,ie=re[ne]??(re[ne]=new Set);function se(e,t={}){if(!e||"string"!=typeof e)return null;if(/^\/(?![/\\])/.test(e))return e;let n;try{n=new URL(e)}catch{return null}const r="https:"===n.protocol,i="http:"===n.protocol&&("localhost"===n.hostname||"127.0.0.1"===n.hostname||"[::1]"===n.hostname);if(!r&&!i)return null;const{sameOrigin:s,allowedOrigins:a}=t;return s||a?.length?s&&"undefined"!=typeof window&&window.location&&n.origin===window.location.origin||a?.some(e=>e.replace(/\/+$/,"")===n.origin)?e:null:e}function ae(e,t="/",n={}){if("undefined"==typeof window||!window.location)return!1;const r=se(e,n)??se(t)??"/";return function(e){if("undefined"==typeof window||!window.location||0===ie.size)return;let t;try{t=new URL(e,window.location.href).origin}catch{return}if(t!==window.location.origin)for(const e of ie)try{e()}catch{}}(r),window.location.href=r,!0}const oe="saas-auth-intent";function ce(e){return"object"==typeof e&&null!==e&&"string"==typeof e.returnUrl&&"number"==typeof e.createdAt}function le(e){se(e,{sameOrigin:!0})&&d(oe,{returnUrl:e,createdAt:Date.now()})}function ue(){const e=u(oe,ce);return l(oe),e?Date.now()-e.createdAt>6e5?null:se(e.returnUrl,{sameOrigin:!0}):null}function de(){l(oe)}const pe={usd:"$",eur:"€",gbp:"£",jpy:"¥",cad:"CA$",aud:"A$",chf:"CHF",cny:"¥",hkd:"HK$",sgd:"S$",inr:"₹",mxn:"MX$",brl:"R$",nzd:"NZ$",sek:"kr",nok:"kr",dkk:"kr",pln:"zł",thb:"฿"},he={usd:"🇺🇸",eur:"🇪🇺",gbp:"🇬🇧",jpy:"🇯🇵",cad:"🇨🇦",aud:"🇦🇺",chf:"🇨🇭",cny:"🇨🇳",hkd:"🇭🇰",sgd:"🇸🇬",inr:"🇮🇳",mxn:"🇲🇽",brl:"🇧🇷",nzd:"🇳🇿",sek:"🇸🇪",nok:"🇳🇴",dkk:"🇩🇰",pln:"🇵🇱",thb:"🇹🇭"};function fe(e){return e&&e.trim()?he[e.trim().toLowerCase()]??"":""}function ge(e){if(!e||!e.trim())return"";const t=e.trim().toLowerCase();return pe[t]??t.toUpperCase()}const we=["usd","eur","gbp","jpy","cad","aud","chf","cny","hkd","sgd","inr","mxn","brl","nzd","sek","nok","dkk","pln","thb"],me=we.map(e=>({value:e,label:`${e.toUpperCase()} (${ge(e)})`})),ye=new Set(["bif","clp","djf","gnf","jpy","kmf","krw","mga","pyg","rwf","ugx","vnd","vuv","xaf","xof","xpf"]),ke=new Set(["bhd","jod","kwd","omr","tnd"]),be=new Map;function ve(e){const t=(e??"").trim().toLowerCase();if(!t)return 2;if(ye.has(t))return 0;if(ke.has(t))return 3;if("isk"===t)return 2;let n=be.get(t);if(void 0===n){try{n=new Intl.NumberFormat("en-US",{style:"currency",currency:t.toUpperCase()}).resolvedOptions().maximumFractionDigits??2}catch{n=2}be.set(t,n)}return n}function Se(e){return""!==(e??"").trim()&&0===ve(e)}function Ee(e,t){const n=ve(t);return 0===n?e.toLocaleString("en-US"):(e/10**n).toFixed(n)}function _e(e,t,n="en-US"){const r=(t??"").trim(),i=ve(r),s=e/10**i;if(!r)return s.toFixed(i);try{return new Intl.NumberFormat(n,{style:"currency",currency:r.toUpperCase(),minimumFractionDigits:i,maximumFractionDigits:i}).format(s)}catch{return ge(r)+(0===i?s.toLocaleString("en-US"):s.toFixed(i))}}function Ie(e,t){return ge(t)+Ee(e,t)}const $e={unit:"unit",units:"units",included:"Included",afterThat:"after that",afterIncluded:"After included",hardLimit:"hard limit"};function Pe(e,t,n,r,i){if(null==e||e<0)return null;const s={...$e,...r},a=null!=t&&t>=1?t:1,o=ge(n),c=Ee(e,n);return 1===a?`${o}${c}/${s.unit}`:`${o}${c}/${a.toLocaleString(i)} ${s.units}`}function Ue(e,t,n,r,i,s,a){if(null==e||e<0)return null;const o={...$e,...s},c=null!=t&&t>=1?t:1,l=ge(r),u=Ee(e,r);if(n){const e=i??(n.endsWith("s")?n:`${n}s`);return c>=2?`${l}${u}/${c.toLocaleString(a)} ${e}`:`${l}${u}/${n}`}return 1===c?`${l}${u}/${o.unit}`:`${l}${u}/${c.toLocaleString(a)} ${o.units}`}function Ae(e,t="unit"){const n=(e||"").trim().toLowerCase();if(!n)return t;const r=n.split(/\s+/)[0]??n;return new Set(["series","species","status","analysis","basis","bus","campus","corpus","axis"]).has(r)?r:r.endsWith("ies")&&r.length>3?r.slice(0,-3)+"y":r.endsWith("ses")||r.endsWith("xes")||r.endsWith("zes")||r.endsWith("ches")||r.endsWith("shes")?r.slice(0,-2):r.endsWith("s")&&!r.endsWith("ss")&&r.length>1?r.slice(0,-1):r||t}function Te(e,t,n,r,i,s,a,o,c){const l={...$e,...a};if(!1===o)return null!=e?`${l.included}: ${e.toLocaleString(c)} (${l.hardLimit})`:a?.hardLimit??"Hard limit";const u=s??(n.endsWith("s")?n:`${n}s`),d=null!=i&&i>=2?`${i.toLocaleString(c)} ${u}`:n;return null!=e&&null!=t?`${l.included}: ${e.toLocaleString(c)}, ${l.afterThat} ${Ie(t,r)}/${d}`:null!=e?`${l.included}: ${e.toLocaleString(c)}`:null!=t?`${l.afterIncluded}: ${Ie(t,r)}/${d}`:"—"}function Ce(e,t){if(null==e)return null;const n=e[t??"monthly"];return n?{included:n.included,...void 0!==n.overage&&{overage:n.overage},...void 0!==n.unitSize&&{unitSize:n.unitSize},allowOverage:!1!==e.allowOverage}:null}const xe={included:"included",then:"then",hardLimit:"hard limit"};function Oe(e,t,n={}){const{overageInCents:r=!0,currency:i}=n,s={...xe,...n.labels},a=n.currencySymbol??ge(i??"");if(null==e)return"—";const{included:o,overage:c}=e,l=`${o} ${s.included}`;if(!1===e.allowOverage)return`${l} (${s.hardLimit})`;if(null==c)return l;const u=ve(i),d=r&&u>0?c/10**u:c,p="number"==typeof d&&Number.isFinite(d)?0===u?d.toLocaleString("en-US"):d.toFixed(u):String(c),h=t&&"unitSize"in e&&null!=e.unitSize&&e.unitSize>0?` / ${e.unitSize.toLocaleString()} ${t}`:t?` / ${t}`:"";return`${l}, ${s.then} ${a}${p}${h}`}const Re={Monthly:"monthly",Yearly:"yearly",Quarterly:"quarterly"},Ne={Active:"active",Trialing:"trialing",Canceled:"canceled",PastDue:"past_due",Paused:"paused",Incomplete:"incomplete",Unpaid:"unpaid"},Fe={Draft:"draft",Open:"open",Paid:"paid",Uncollectible:"uncollectible",Void:"void"},We={Feature:"feature",Limit:"limit",Quota:"quota"},Je={None:"none",Notified:"notified",Warning:"warning",Final:"final",Suspended:"suspended"},Le={PlanGrant:"plan_grant",CreditPackPurchase:"credit_pack_purchase",AdminGrant:"admin_grant",Refund:"refund"},De={Pending:"pending",Active:"active",Expired:"expired",Consumed:"consumed"},Me={PlanGrant:"plan_grant",PackPurchased:"pack_purchased",Consumed:"consumed",Expired:"expired",AdminGrant:"admin_grant",AdminRevoke:"admin_revoke",Refund:"refund"};function je(e,t){const n=e.pricingVariants;if(!n?.length)return null;const r=t.toLowerCase();return n.find(e=>e.currency?.toLowerCase()===r)??null}function Be(e,t,n){const r=je(e,t);if(!r?.basePricing)return null;const i=r.basePricing[n];return null!=i?i:null}function qe(e,t,n){const r=je(e,t);if(!r?.stripePrices)return null;const i=n===Re.Monthly?"monthlyPriceId":n===Re.Yearly?"yearlyPriceId":"quarterlyPriceId",s=n===Re.Monthly?"monthly":n===Re.Yearly?"yearly":void 0;return r.stripePrices[i]??(s?r.stripePrices[s]:void 0)??null}function ze(e,t,n,r){const i=je(e,t),s=i?.quotaOverages?.[n];if(s)return s[r]}function Ve(e,t){const n=je(e,t);return n?n.currency:e.plan?.currency??""}function Ke(e){const t=new Set;for(const n of e)n.pricingVariants?.forEach(e=>{e.currency&&t.add(e.currency.toLowerCase())});return Array.from(t).sort()}function Ge(e,t,n,r){const i=e.quotas?.[n];if(null==i)return null;const s=i[r];if(!s)return null;const a=ze(e,t,n,r);return{included:s.included,...void 0!==s.unitSize&&{unitSize:s.unitSize},...void 0!==a&&{overage:a},allowOverage:!1!==i.allowOverage}}function He(e,t){if(!e)return null;for(const n of t){const t=n.pricingVariants;if(t?.length)for(const n of t){const t=n.stripePrices;if(t){if(t.monthlyPriceId===e||t.monthly===e)return{interval:"monthly",currency:n.currency};if(t.yearlyPriceId===e||t.yearly===e)return{interval:"yearly",currency:n.currency};if(t.quarterlyPriceId===e)return{interval:"quarterly",currency:n.currency}}}}return null}function Qe(e,t){const n=je(e,t);return n?.seatPricing?.enabled?n.seatPricing:null}function Ye(e,t,n){const r=Qe(e,t);return r?.perSeat?r.perSeat[n]??null:null}function Xe(e,t){return Math.max(0,e-(t||0))}function Ze(e,t,n,r){const i=Qe(e,t);if(!i)return null;return Xe(r,i.includedSeats)*(Ye(e,t,n)??0)}function et(e,t,n,r){const i=Be(e,t,n);if(null===i)return null;if(void 0===r)return i;return i+(Ze(e,t,n,r)??0)}function tt(e){const{planVersion:t,currency:n="usd",settingsMaxUsers:r}=e;if(t){const e=Qe(t,n);if(e)return{maxUsers:e.maxSeats??0,source:"seat_pricing",includedSeats:e.includedSeats??0,hasSeatPricing:!0}}return null!=r&&r>0?{maxUsers:r,source:"settings",includedSeats:0,hasSeatPricing:!1}:{maxUsers:0,source:"none",includedSeats:0,hasSeatPricing:!1}}function nt(e){const{memberCount:t,maxUsersConfig:n,hasSubscription:r=!0,requireSubscription:i=!1}=e;if(i&&!r)return{canInvite:!1,blockReason:"no_subscription",blockMessageKey:"users.subscriptionRequired",blockMessageValues:{}};const{maxUsers:s,source:a}=n;if(s<=0)return{canInvite:!0,blockReason:null,blockMessageKey:null,blockMessageValues:null};if(t>=s){return{canInvite:!1,blockReason:{seat_pricing:"seat_limit_reached",settings:"settings_user_limit_reached"}[a]??"seat_limit_reached",blockMessageKey:{seat_pricing:"users.seatLimitMessage",settings:"users.settingsLimitMessage"}[a]??"users.memberLimitMessage",blockMessageValues:{maxUsers:s}}}return{canInvite:!0,blockReason:null,blockMessageKey:null,blockMessageValues:null}}function rt(e,t){return[Re.Monthly,Re.Quarterly,Re.Yearly].filter(n=>n===Re.Monthly||e.some(e=>null!=Be(e,t,n)))}const it={WORKSPACE_SETTINGS_VIEW:"workspace:settings:view",WORKSPACE_SETTINGS_EDIT:"workspace:settings:edit",WORKSPACE_DELETE:"workspace:delete",WORKSPACE_MEMBERS_VIEW:"workspace:members:view",WORKSPACE_MEMBERS_INVITE:"workspace:members:invite",WORKSPACE_MEMBERS_REMOVE:"workspace:members:remove",WORKSPACE_MEMBERS_ROLE_CHANGE:"workspace:members:role-change",WORKSPACE_FEATURES_VIEW:"workspace:features:view",WORKSPACE_FEATURES_EDIT:"workspace:features:edit",WORKSPACE_BILLING_VIEW:"workspace:billing:view",WORKSPACE_BILLING_MANAGE:"workspace:billing:manage",WORKSPACE_USAGE_VIEW:"workspace:usage:view",WORKSPACE_USAGE_RECORD:"workspace:usage:record"},st=Object.values(it),at={admin:st.filter(e=>e!==it.WORKSPACE_DELETE),editor:[it.WORKSPACE_SETTINGS_VIEW,it.WORKSPACE_MEMBERS_VIEW,it.WORKSPACE_FEATURES_VIEW,it.WORKSPACE_BILLING_VIEW,it.WORKSPACE_USAGE_VIEW,it.WORKSPACE_USAGE_RECORD],viewer:[it.WORKSPACE_SETTINGS_VIEW,it.WORKSPACE_MEMBERS_VIEW]},ot="viewer";function ct(e,t){return t&&"admin"!==t&&e.includes(t)?t:e.includes(ot)?ot:e.find(e=>"admin"!==e)??""}function lt(e){const t=new Set;for(const n of Object.values(e))for(const e of n)t.add(e);return Array.from(t)}function ut(e){const{userId:t,workspace:n,settings:r,appPermissions:i}=e;if(!n||!t)return new Set;if(function(e,t){if(!t)return!1;const n=(r=e.createdBy)?"string"==typeof r?r:"object"==typeof r&&"_id"in r&&"string"==typeof r._id?r._id:null:null;var r;return null!==n&&n===t}(n,t)){const e=new Set(st);if(i)for(const t of lt(i))e.add(t);if(n.permissions)for(const t of lt(n.permissions))e.add(t);if(r?.workspace?.permissions)for(const t of lt(r.workspace.permissions))e.add(t);return e}const s=e.workspaceRole??function(e,t){if(!t||!e.users||!Array.isArray(e.users))return null;const n=e.users.find(e=>"string"==typeof e?e===t:"object"==typeof e&&null!==e&&"_id"in e&&e._id===t);return n&&"object"==typeof n&&"role"in n&&"string"==typeof n.role?n.role:null}(n,t);return s?dt(s,e):new Set}function dt(e,t,n={}){const{workspace:r,settings:i,appPermissions:s}=t;if(!r)return new Set;const a=r.permissions,o=i?.workspace?.permissions,c=e=>e.filter(e=>e.startsWith("workspace:")),l=e=>e.filter(e=>!e.startsWith("workspace:")),u=e=>!!a&&e in a,d=e=>!!o&&e in o,p=e=>u(e)||d(e)||e in at;let h,f=e;if(!p(e)){const e=i?.workspace?.defaultRole;if(!e||"admin"===e||!p(e))return new Set;f=e}h=u(f)?c(a[f]):d(f)?c(o[f]):at[f]??[];const g=new Set(h),w=new Set((i?.workspace?.customPermissions??[]).map(e=>e.key)),m=s?.[f]?l(s[f]).filter(e=>!w.has(e)):[];let y;y=u(f)?l(a[f]):d(f)?[...l(o[f]),...m]:s?.[f]?l(s[f]):[];for(const e of y)g.add(e);if("admin"===f){for(const e of at.admin)g.add(e);for(const e of w)g.add(e);if(s)for(const e of l(lt(s)))g.add(e)}return!1!==n.applyRestrictions&&function(e,t,n){if(!n?.workspace)return;const{canInviteMembers:r}=n.workspace;(!1===r||"admin-only"===r&&"admin"!==t)&&e.delete(it.WORKSPACE_MEMBERS_INVITE)}(g,f,i),g}function pt(e,t){const n=ut(t);return Array.isArray(e)?e.every(e=>n.has(e)):n.has(e)}const ht="App";function ft(e,t){const n=e?.workspace?.customPermissions??[],r=new Map;for(const e of n)e?.key&&!e.key.startsWith("workspace:")&&r.set(e.key,{key:e.key,label:e.label||e.key,group:e.group||ht});for(const e of Object.values(t??{}))for(const t of e??[])t.startsWith("workspace:")||r.has(t)||r.set(t,{key:t,label:t,group:ht});return[...r.values()].sort((e,t)=>(e.group??"").localeCompare(t.group??"")||e.key.localeCompare(t.key))}const gt="\n// BuildBase Push Notification Service Worker\n// Place this file in your app's public directory (e.g. public/push-sw.js)\n\nself.addEventListener('push', function(event) {\n if (!event.data) return;\n\n let payload;\n try {\n payload = event.data.json();\n } catch (e) {\n console.error('[PushSW] Push payload is not JSON:', e);\n return;\n }\n if (!payload || typeof payload !== 'object') return;\n\n // i18n exception: service workers run outside the SDK's translation\n // provider, so this last-resort fallback stays English. The server should\n // always send a localized payload.title.\n const title = payload.title || 'Notification';\n // The tracked click URL (/api/push-track/link/...) wins over any url in\n // payload.data, so a click is always counted.\n const data = Object.assign({}, payload.data && typeof payload.data === 'object' ? payload.data : {});\n if (payload.url) data.url = payload.url;\n // A notification with the same tag replaces the earlier one instead of\n // stacking. No tag means every notification is shown on its own.\n const tag = payload.tag ? String(payload.tag) : undefined;\n const actions = Array.isArray(payload.actions)\n ? payload.actions.filter(function(a) {\n return a && typeof a.action === 'string' && typeof a.title === 'string';\n })\n : undefined;\n\n const options = {\n body: payload.body || '',\n icon: payload.icon || undefined,\n badge: payload.badge || payload.icon || undefined,\n image: payload.image || undefined,\n tag: tag,\n // The browser rejects renotify without a tag.\n renotify: tag ? !!payload.renotify : false,\n actions: actions && actions.length ? actions : undefined,\n silent: !!payload.silent,\n requireInteraction: !!payload.requireInteraction,\n timestamp: typeof payload.timestamp === 'number' ? payload.timestamp : undefined,\n dir: payload.dir === 'ltr' || payload.dir === 'rtl' ? payload.dir : 'auto',\n data: data,\n };\n\n event.waitUntil(\n Promise.resolve()\n .then(function() {\n return self.registration.showNotification(title, options);\n })\n .catch(function(e) {\n // A field this browser refuses must not cost the user the\n // notification: show it again with the basics only.\n console.error('[PushSW] Failed to show notification, retrying without rich options:', e);\n return self.registration.showNotification(title, {\n body: options.body,\n icon: options.icon,\n tag: tag,\n data: data,\n });\n })\n );\n});\n\nself.addEventListener('notificationclick', function(event) {\n event.notification.close();\n\n // A click on an action button (event.action is its id) opens the same\n // tracked URL as a click on the notification body.\n const url = event.notification.data && event.notification.data.url;\n if (url) {\n event.waitUntil(\n clients.matchAll({ type: 'window', includeUncontrolled: true }).then(function(clientList) {\n for (let i = 0; i < clientList.length; i++) {\n const client = clientList[i];\n if (client.url === url && 'focus' in client) {\n return client.focus();\n }\n }\n if (clients.openWindow) {\n return clients.openWindow(url);\n }\n })\n );\n }\n});\n";var wt;function mt(e){if(!e)return 0;const t=new Date(e).getTime();return Number.isNaN(t)?0:t}function yt(e){const t=e=>"invited"===e.status?0:1;return[...e].sort((e,n)=>t(e)-t(n)||mt(n.invitedAt)-mt(e.invitedAt))}function kt(e,t=new Date){return"invited"===e.status&&(null===e.validTill||void 0===e.validTill||mt(e.validTill)>t.getTime())}function bt(e,t=new Date){return yt(e.filter(e=>kt(e,t)))}function vt(e,t=new Date){return"expired"===e.status||"invited"===e.status&&!kt(e,t)}function St(e){return"object"==typeof e.workspace&&e.workspace&&e.workspace.name||""}function Et(e){return"object"==typeof e.workspace&&e.workspace?e.workspace._id:e.workspace}function _t(e){const t=e.invitedBy;return t&&"string"!=typeof t&&(t.name||t.email)||null}function It(e,t=new Date){const n=mt(e.resendAvailableAt);return n?Math.max(0,Math.ceil((n-t.getTime())/1e3)):0}!function(e){e.loading="loading",e.redirecting="redirecting",e.authenticated="authenticated",e.unauthenticated="unauthenticated",e.authenticating="authenticating"}(wt||(wt={}));const $t="saas-pending-invite",Pt=/^[0-9a-f]{64}$/;function Ut(e){return"object"==typeof e&&null!==e&&"string"==typeof e.token&&"string"==typeof e.orgId&&"number"==typeof e.createdAt}function At(e,t){Pt.test(e)&&t&&d($t,{token:e,orgId:t,createdAt:Date.now()})}function Tt(e,t=Date.now()){const n=u($t,Ut);return n?t-n.createdAt>864e5?(l($t),null):n.orgId!==e?null:Pt.test(n.token)?n.token:(l($t),null):null}function Ct(){l($t)}const xt={User:["user.registered","user.logged_in","user.new_device_login","user.email_verified","user.password_changed","user.password_reset_requested","user.profile_updated","user.tag_added","user.tag_removed","user.blocked","user.unblocked"],Organization:["organization.member_invited","organization.member_accepted","organization.member_role_changed","organization.member_removed","organization.public_write_limit_reached","organization.end_user_ceiling_reached"],Workspace:["workspace.created","workspace.updated","workspace.deleted","workspace.settings_updated","workspace.features_updated","workspace.member_added","workspace.member_removed","workspace.member_role_changed","workspace.member_invited","workspace.invitation_accepted","workspace.invitation_declined","workspace.invitation_revoked","workspace.invitation_expired"],Subscription:["subscription.created","subscription.updated","subscription.upgraded","subscription.canceled","subscription.cancel_scheduled","subscription.resumed","subscription.suspended","subscription.trial_started","subscription.trial_will_end","subscription.trial_expired","subscription.downgraded"],Payment:["payment.succeeded","payment.failed","payment.action_required","payment.refunded"],Quota:["quota.limit_exceeded"],Credit:["credit.purchased","credit.consumed","credit.expired","credit.granted","credit.revoked","credit.low_balance"],Workflow:["workflow.created","workflow.deleted","workflow.published","workflow.paused","workflow.resumed","workflow.instance_completed","workflow.instance_failed"],Audience:["audience.member_created","audience.member_updated","audience.added_to_list","audience.removed_from_list","audience.attribute_changed","audience.tag_added","audience.tag_removed","audience.unsubscribed","audience.resubscribed","audience.email_invalidated","audience.blocked","audience.unblocked","audience.import_completed","audience.list_created","audience.list_updated","audience.list_deleted"],Email:["email.domain_added","email.domain_verified","email.sent","email.opened","email.clicked","email.bounced","email.unsubscribed","email.campaign_sent"],Push:["push.campaign_sent"],Auth:["auth.method_deleted","auth.domain_added","auth.domain_verified","auth.domain_deleted","auth.client_self_registered"],Token:["token.created","token.updated","token.revoked"],"Group version":["group_version.published"],Form:["form.submitted"],Blog:["blog.published","blog.updated","blog.unpublished","blog.deleted"],Doc:["doc.published","doc.updated","doc.unpublished","doc.deleted"],FAQ:["faq.updated"],"FAQ collection":["faq_collection.updated"],Testimonial:["testimonial.updated","testimonial.deleted"],"Rich content":["rich_content.updated","rich_content.deleted"],Collection:["collection.version_published","collection.record_created","collection.record_updated","collection.record_deleted"]},Ot=Object.values(xt).flat(),Rt=new Set(Ot);function Nt(e){return Rt.has(e)}const Ft=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),Wt=(e,t)=>e>>>t|e<<32-t;function Jt(e){let t=1779033703,n=3144134277,r=1013904242,i=2773480762,s=1359893119,a=2600822924,o=528734635,c=1541459225;const l=e.length,u=l+1,d=u+(56-u%64+64)%64+8,p=new Uint8Array(d);p.set(e,0),p[l]=128;const h=8*l,f=Math.floor(h/4294967296),g=h>>>0;p[d-8]=f>>>24&255,p[d-7]=f>>>16&255,p[d-6]=f>>>8&255,p[d-5]=255&f,p[d-4]=g>>>24&255,p[d-3]=g>>>16&255,p[d-2]=g>>>8&255,p[d-1]=255&g;const w=new Uint32Array(64);for(let e=0;e<d;e+=64){for(let t=0;t<16;t++){const n=e+4*t;w[t]=p[n]<<24|p[n+1]<<16|p[n+2]<<8|p[n+3]}for(let e=16;e<64;e++){const t=Wt(w[e-15],7)^Wt(w[e-15],18)^w[e-15]>>>3,n=Wt(w[e-2],17)^Wt(w[e-2],19)^w[e-2]>>>10;w[e]=w[e-16]+t+w[e-7]+n>>>0}let l=t,u=n,d=r,h=i,f=s,g=a,m=o,y=c;for(let e=0;e<64;e++){const t=y+(Wt(f,6)^Wt(f,11)^Wt(f,25))+(f&g^~f&m)+Ft[e]+w[e]>>>0,n=l&u^l&d^u&d;y=m,m=g,g=f,f=h+t>>>0,h=d,d=u,u=l,l=t+((Wt(l,2)^Wt(l,13)^Wt(l,22))+n>>>0)>>>0}t=t+l>>>0,n=n+u>>>0,r=r+d>>>0,i=i+h>>>0,s=s+f>>>0,a=a+g>>>0,o=o+m>>>0,c=c+y>>>0}const m=new Uint8Array(32),y=[t,n,r,i,s,a,o,c];for(let e=0;e<8;e++)m[4*e]=y[e]>>>24&255,m[4*e+1]=y[e]>>>16&255,m[4*e+2]=y[e]>>>8&255,m[4*e+3]=255&y[e];return m}function Lt(e){return(new TextEncoder).encode(e)}function Dt(e,t){let n=e;n.length>64&&(n=Jt(n));const r=new Uint8Array(64),i=new Uint8Array(64);for(let e=0;e<64;e++){const t=e<n.length?n[e]:0;r[e]=54^t,i[e]=92^t}const s=Jt(jt(r,t));return Jt(jt(i,s))}function Mt(e,t){if(e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r++)n|=e[r]^t[r];return 0===n}function jt(e,t){const n=new Uint8Array(e.length+t.length);return n.set(e,0),n.set(t,e.length),n}function Bt(e){const{body:t,signature:n,timestamp:r,secret:i,maxAgeSeconds:s=300}=e;if(!(n&&r&&i&&t))return!1;const a="sha256=";if(!n.startsWith(a))return!1;const o=n.slice(7);if(s>0){const e=parseInt(r,10);if(isNaN(e))return!1;if(Math.abs(Math.floor(Date.now()/1e3)-e)>s)return!1}const c=function(e){if(e.length%2!=0)return null;const t=new Uint8Array(e.length/2);for(let n=0;n<t.length;n++){const r=parseInt(e.slice(2*n,2*n+2),16);if(Number.isNaN(r))return null;t[n]=r}return t}(o);if(!c)return!1;const l=Dt(Lt(i),Lt(`${r}.${t}`));return c.length===l.length&&Mt(c,l)}function qt(e){if(!Bt(e))return null;try{return JSON.parse(e.body)}catch{return null}}const zt=300,Vt="/.well-known/oauth-protected-resource",Kt="/.well-known/agent-skills",Gt="/.well-known/api-catalog",Ht="/.well-known/mcp/server-card.json",Qt="/.well-known/agent-card.json",Yt="application/json",Xt="application/linkset+json",Zt="text/markdown; charset=utf-8",en="text/plain; charset=utf-8",tn="application/xml; charset=utf-8",nn=["GPTBot","OAI-SearchBot","ChatGPT-User","ClaudeBot","Claude-User","Claude-SearchBot","PerplexityBot","Perplexity-User","Google-Extended","Applebot-Extended","CCBot","Bytespider","meta-externalagent","Amazonbot"];function rn(e){return e.replace(/\/+$/,"")}function sn(e){return`public, max-age=${e}, s-maxage=${e}`}function an(e){return"sha256:"+function(e){let t="";for(let n=0;n<e.length;n++)t+=e[n].toString(16).padStart(2,"0");return t}(Jt(Lt(e)))}const on=new Map;async function cn(e,t,n,r){if(!r||r<=0)return e(t,n);const i=new AbortController,s=setTimeout(()=>i.abort(),r);try{return await e(t,{...n,signal:i.signal})}finally{clearTimeout(s)}}async function ln(e){const t=e.cacheTtlSeconds??zt,n=`${rn(e.serverUrl)}::${e.orgId}`,r=on.get(n);if(r&&r.expiresAt>Date.now())return r.value;const i=e.fetch??fetch,s=`${rn(e.serverUrl)}/api/v1/public/${e.orgId}/agent-readiness`;let a={enabled:!1};try{const t=await cn(i,s,{headers:{Accept:Yt}},e.fetchTimeoutMs??5e3);if(t.ok){const e=await t.json();e&&"object"==typeof e&&(a=e)}}catch{}return on.set(n,{value:a,expiresAt:Date.now()+1e3*t}),a}const un=new Map;function dn(){on.clear(),un.clear()}function pn(e,t){const n=rn(e.siteUrl),r={llms_txt:"/llms.txt",sitemap:"/sitemap.xml",robots:"/robots.txt",oauth_protected_resource:Vt};t.authorizationServer?.metadataUrl&&(r.oauth_authorization_server=t.authorizationServer.metadataUrl,r.openid_configuration="/.well-known/openid-configuration"),(t.authorizationServer||e.authMd)&&(r.auth="/auth.md"),e.skills?.length&&(r.agent_skills=`${Kt}/index.json`),e.apiCatalog?.length&&(r.api_catalog=Gt),e.mcpServerCard&&(r.mcp_server_card=Ht),!1!==e.a2aCard&&(r.a2a_agent_card=Qt),e.llmsFullTxt&&(r.llms_full_txt="/llms-full.txt");return Tn({schema_version:"1.0",name:e.site.name,...e.site.description?{description:e.site.description}:{},url:n,...e.site.documentationUrl?{documentation_url:e.site.documentationUrl}:{},provider:e.site.provider??{name:e.site.name,url:n},capabilities:r,...e.site.contactEmail?{contact:{email:e.site.contactEmail}}:{}},e)}function hn(e){let t="/";try{t=new URL(e).pathname}catch{t=e.startsWith("/")?e:`/${e}`}const n="/"===t?"":t.replace(/\/+$/,"");return Vt+n}function fn(e,t,n){const r=t.protectedResources??[];if(!r.length)return null;const i=e.replace(/\/+$/,"")||Vt,s=n??`${rn(t.serverUrl)}/org/${t.orgId}`,a=t.scopes?.map(e=>e.name),o=r.map(e=>{const n=e.resource??rn(t.siteUrl),r=e.scopes??a;return{path:hn(n),metadata:{resource:n,authorization_servers:[s],bearer_methods_supported:e.bearerMethods??["header"],...r?.length?{scopes_supported:r}:{},...e.documentationUrl?{resource_documentation:e.documentationUrl}:{}}}}),c=o.find(e=>e.path===i);return c?Tn(c.metadata,t):i===Vt&&1===o.length?Tn(o[0].metadata,t):null}function gn(e){const t=e.skills??[];if(!t.length)return null;const n=rn(e.siteUrl);return Tn({$schema:"https://schemas.agentskills.io/discovery/0.2.0/schema.json",skills:t.map(e=>({name:e.name,type:e.type??"skill-md",description:e.description,url:`${n}${wn(e)}`,digest:an(e.content)}))},e)}function wn(e){return e.path??`${Kt}/${e.name}/SKILL.md`}function mn(e,t){const n=(t.skills??[]).find(t=>wn(t)===e);return n?{status:200,contentType:"text/markdown; charset=utf-8",body:n.content,cacheControl:sn(t.cacheTtlSeconds??zt)}:null}function yn(e){if(!e.security)return null;const t=(Array.isArray(e.security.contact)?e.security.contact:[e.security.contact]).map(e=>`Contact: ${e}`);return e.security.expires&&t.push(`Expires: ${e.security.expires}`),e.security.policy&&t.push(`Policy: ${e.security.policy}`),{status:200,contentType:en,body:t.join("\n")+"\n",cacheControl:sn(e.cacheTtlSeconds??zt)}}function kn(e){return e.llmsTxt?{status:200,contentType:en,body:e.llmsTxt,cacheControl:sn(e.cacheTtlSeconds??zt)}:null}function bn(e){return e.llmsFullTxt?{status:200,contentType:en,body:e.llmsFullTxt,cacheControl:sn(e.cacheTtlSeconds??zt)}:null}function vn(e){if(!1===e.a2aCard)return null;const t=e.a2aCard??{},n=rn(e.siteUrl),r=t.serviceUrl??n,i=t.transportProtocol??"http",s=t.skills??((e.skills??[]).length?(e.skills??[]).map(e=>({id:e.name,name:e.name,description:e.description,tags:["discovery"]})):[{id:"site-content",name:"Site content",description:`Read ${e.site.name}'s public content and machine-readable discovery documents (llms.txt, sitemap, API catalog).`,tags:["content"]}]);return Tn({protocolVersion:"0.3.0",name:t.name??e.site.name,version:t.version??"1.0.0",description:t.description??e.site.description??`${e.site.name} — agent-accessible web application.`,url:r,preferredTransport:i,supportedInterfaces:[{serviceUrl:r,transportProtocol:i}],provider:e.site.provider?{organization:e.site.provider.name,url:e.site.provider.url}:{organization:e.site.name,url:n},capabilities:t.capabilities??{streaming:!1,pushNotifications:!1},defaultInputModes:["text/plain","application/json"],defaultOutputModes:["text/plain","application/json"],skills:s,...e.site.documentationUrl?{documentationUrl:e.site.documentationUrl}:{}},e)}function Sn(e){const t=e.webBotAuth?.keys;return t?.length?{status:200,contentType:"application/http-message-signatures-directory+json",body:JSON.stringify({keys:t},null,2),cacheControl:sn(e.cacheTtlSeconds??zt)}:null}function En(e){return e.endsWith(".json")||e.includes(".well-known/")?Yt:e.endsWith(".md")?Zt:e.endsWith(".xml")?tn:en}function _n(e){let t;try{t=new URL(e.siteUrl).hostname}catch{return[]}const n=[{name:`_index._agents.${t}`,type:"HTTPS",ttl:3600,data:`1 ${t}. alpn="h2" port=443`}];if(!1!==e.a2aCard&&n.push({name:`_a2a._agents.${t}`,type:"HTTPS",ttl:3600,data:`1 ${t}. alpn="h2" port=443`}),e.mcpServerCard){let r=t;try{r=new URL(e.mcpServerCard.endpoint).hostname}catch{}n.push({name:`_mcp._agents.${t}`,type:"HTTPS",ttl:3600,data:`1 ${r}. alpn="h2" port=443`})}return n}function In(e){const t=e.apiCatalog??[];if(!t.length)return null;const n=t.map(e=>({anchor:e.anchor,...e.title?{title:e.title}:{},...e.serviceDesc?{"service-desc":[{href:e.serviceDesc}]}:{},...e.serviceDoc?{"service-doc":[{href:e.serviceDoc}]}:{},...e.status?{status:[{href:e.status}]}:{}}));return{status:200,contentType:Xt,body:JSON.stringify({linkset:n},null,2),cacheControl:sn(e.cacheTtlSeconds??zt)}}function $n(e){const t=e??{tools:!0},n={tools:!1,resources:!1,prompts:!1};for(const[e,r]of Object.entries(t))n[e]=!1!==r&&null!=r;return n}function Pn(e){const t=e.mcpServerCard;return t?Tn({$schema:"https://modelcontextprotocol.io/schemas/server-card/v1.0",version:"1.0",protocolVersion:t.protocolVersion??"2025-11-25",serverInfo:{name:t.name,version:t.version},...t.description?{description:t.description}:{},transport:{type:t.transport??"streamable-http",url:t.endpoint},capabilities:$n(t.capabilities),...t.documentationUrl?{documentation_url:t.documentationUrl}:{}},e):null}function Un(e){const t=e.mcpServerCard;if(!t)return null;const n=rn(e.siteUrl);let r;try{r={type:"oauth2",protected_resource_metadata:`${new URL(t.endpoint).origin}${hn(t.endpoint)}`}}catch{}return Tn({$schema:"https://modelcontextprotocol.io/schemas/mcp-discovery/v1.0",version:"1.0",servers:[{name:t.name,...t.description?{description:t.description}:{},transport:{type:t.transport??"streamable-http",url:t.endpoint},version:t.version,capabilities:$n(t.capabilities),...t.documentationUrl?{documentation_url:t.documentationUrl}:{},server_card:`${n}${Ht}`,...r?{authentication:r}:{}}]},e)}function An(e,t){const n=sn(e.cacheTtlSeconds??zt);if(e.authMd)return{status:200,contentType:Zt,body:e.authMd,cacheControl:n};const r=t.authorizationServer;if(!r)return null;const i=`# Agent Authentication\n\n${e.site.name} supports AI-agent access via OAuth 2.0 (authorization code + PKCE).\n\n## Authorization server\n- Issuer: \`${r.issuer}\`\n- Metadata (RFC 8414): ${r.metadataUrl}\n\nFetch the metadata document above for the \`authorization_endpoint\`, \`token_endpoint\`, supported grant types / PKCE methods, and — when the app allows it — the dynamic client \`registration_endpoint\` (RFC 7591).\n\n## Protected resources (RFC 9728)\nSee \`/.well-known/oauth-protected-resource\`, which lists the resource, its supported scopes, and the authorization server(s) that can issue tokens for it.\n\n## How an agent authenticates\n1. Discover this document and \`/.well-known/oauth-protected-resource\`.\n2. Fetch the authorization-server metadata for the endpoints.\n3. Register a client (dynamic registration) or use a pre-issued client_id.\n4. Run the authorization-code flow with PKCE (S256), requesting the scopes and target \`resource\`.\n5. Exchange the code for an access token and call the API with \`Authorization: Bearer <token>\`.\n\nDocumentation: ${e.site.documentationUrl??e.siteUrl}\n`;return{status:200,contentType:Zt,body:i,cacheControl:n}}function Tn(e,t){return{status:200,contentType:Yt,body:JSON.stringify(e,null,2),cacheControl:sn(t.cacheTtlSeconds??zt)}}function Cn(e){return String(e).replace(/[\x00-\x1f\x7f]/g,"")}function xn(e,t){const n=(Array.isArray(e.userAgent)?e.userAgent:[e.userAgent]).map(e=>`User-agent: ${Cn(e)}`);if(t){const e=[...void 0!==t.search?["search="+(t.search?"yes":"no")]:[],...void 0!==t.aiInput?["ai-input="+(t.aiInput?"yes":"no")]:[],...void 0!==t.aiTrain?["ai-train="+(t.aiTrain?"yes":"no")]:[]];e.length&&n.push(`Content-Signal: ${e.join(", ")}`)}for(const t of e.allow??[])n.push(`Allow: ${Cn(t)}`);for(const t of e.disallow??[])n.push(`Disallow: ${Cn(t)}`);return void 0!==e.crawlDelay&&n.push(`Crawl-delay: ${Cn(e.crawlDelay)}`),n.join("\n")}function On(e){const t=e.robots??{},n=rn(e.siteUrl),r=t.policies??[{userAgent:"*",allow:["/"]}],i=t.aiBots??"allow",s="allow"===i?[{userAgent:[...nn],allow:["/"]}]:"deny"===i?[{userAgent:[...nn],disallow:["/"]}]:i,a=t.sitemaps??(e.sitemap?[`${n}/sitemap.xml`]:[]),o=[`# robots.txt — agent-ready. See ${n}/llms.txt and ${n}/.well-known/agent.json`,...r.map((e,n)=>xn(e,0===n?t.contentSignals:void 0)),...s.map(e=>xn(e)),...a.length?[a.map(e=>`Sitemap: ${Cn(e)}`).join("\n")]:[]];return{status:200,contentType:en,body:o.join("\n\n")+"\n",cacheControl:sn(e.cacheTtlSeconds??zt)}}function Rn(e){const t="number"==typeof e&&Number.isFinite(e)?e:.5;return String(Math.min(1,Math.max(0,t)))}function Nn(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}function Fn(e){const t=e.sitemap?.urls;if(!t?.length)return null;const n=rn(e.siteUrl),r='<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n'+t.map(e=>{const t="string"==typeof e?{loc:e}:e;return` <url>\n${[` <loc>${Nn(/^https?:\/\//.test(t.loc)?t.loc:`${n}${t.loc.startsWith("/")?"":"/"}${t.loc}`)}</loc>`,...t.lastmod?[` <lastmod>${Nn(t.lastmod)}</lastmod>`]:[],...t.changefreq?[` <changefreq>${Nn(String(t.changefreq))}</changefreq>`]:[],...void 0!==t.priority?[` <priority>${Rn(t.priority)}</priority>`]:[]].join("\n")}\n </url>`}).join("\n")+"\n</urlset>\n";return{status:200,contentType:tn,body:r,cacheControl:sn(e.cacheTtlSeconds??zt)}}function Wn(e){if(!e)return!1;let t=0,n=0;for(const r of e.split(",")){const[e,...i]=r.trim().split(";"),s=e.trim().toLowerCase();let a=1;for(const e of i){const[t,n]=e.split("=").map(e=>e.trim());if("q"===t){const e=Number(n);Number.isNaN(e)||(a=e)}}"text/markdown"===s||"text/x-markdown"===s?t=Math.max(t,a):"text/html"!==s&&"text/*"!==s&&"*/*"!==s||(n=Math.max(n,a))}return t>0&&t>=n}function Jn(e,t,n){const r=Wn(e);return{status:200,contentType:r?Zt:"text/html; charset=utf-8",body:r?t.markdown:t.html,cacheControl:sn(n?.cacheTtlSeconds??zt),vary:"Accept"}}function Ln(e){const t=rn(e.siteUrl),n=[`<${t}/llms.txt>; rel="describedby"; type="text/plain"`,`<${t}/.well-known/agent.json>; rel="describedby"; type="application/json"`];if(!1!==e.a2aCard&&n.push(`<${t}${Qt}>; rel="describedby"; type="application/json"`),e.sitemap||e.robots?.sitemaps?.length){const r=e.robots?.sitemaps?.[0]??`${t}/sitemap.xml`;n.push(`<${r}>; rel="sitemap"; type="application/xml"`)}return e.apiCatalog?.length&&n.push(`<${t}${Gt}>; rel="api-catalog"; type="${Xt}"`),e.mcpServerCard&&n.push(`<${t}${Ht}>; rel="mcp-server"; type="application/json"`),n.join(", ")}async function Dn(e,t){const n=e.replace(/\/+$/,"")||e;if("/.well-known/agent.json"===n){return pn(t,await ln(t))}if(n===Qt)return vn(t);if("/.well-known/http-message-signatures-directory"===n)return Sn(t);if("/.well-known/security.txt"===n)return yn(t);if(n===`${Kt}/index.json`)return gn(t);if(n.startsWith(`${Kt}/`)&&n.endsWith("SKILL.md"))return mn(n,t);if("/.well-known/oauth-authorization-server"===n||"/.well-known/openid-configuration"===n){const e=(await ln(t)).authorizationServer;if(!e?.metadataUrl)return null;const n=await async function(e,t){const n=t.cacheTtlSeconds??zt,r=un.get(e);if(r&&r.expiresAt>Date.now())return r.value;const i=t.fetch??fetch;let s=null;try{const n=await cn(i,e,{headers:{Accept:Yt}},t.fetchTimeoutMs??5e3);if(n.ok){const e=await n.json();e&&"object"==typeof e&&(s=e)}}catch{}return un.set(e,{value:s,expiresAt:Date.now()+1e3*n}),s}(e.metadataUrl,t);return Tn(n?n:{...e.issuer?{issuer:e.issuer}:{},oauth_authorization_server_metadata:e.metadataUrl},t)}if(n===Gt)return In(t);if(n===Ht)return Pn(t);if("/.well-known/mcp.json"===n)return Un(t);if(n.startsWith(Vt)){const e=await ln(t);return fn(n,t,e.authorizationServer?.issuer)}return null}async function Mn(e,t){const n=e.replace(/\/+$/,"")||e,r=function(e,t){const n=t.extraPaths?.[e];if(void 0===n)return null;const r="string"==typeof n?{body:n}:n;return{status:r.status??200,contentType:r.contentType??En(e),body:r.body,cacheControl:r.cacheControl??sn(t.cacheTtlSeconds??zt)}}(n,t);return r||("/robots.txt"===n?On(t):"/llms-full.txt"===n?bn(t):"/sitemap.xml"===n?Fn(t):"/llms.txt"===n?kn(t):"/auth.md"===n?An(t,await ln(t)):"/security.txt"===n?yn(t):n.startsWith("/.well-known")?Dn(n,t):null)}function jn(e){const t=globalThis.navigator;return!!t?.modelContext?.provideContext&&(t.modelContext.provideContext({tools:e}),!0)}function Bn(e){let t="";for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function qn(e){const t=e.replace(/-/g,"+").replace(/_/g,"/"),n=t.length%4==0?"":"=".repeat(4-t.length%4),r=atob(t+n),i=new Uint8Array(r.length);for(let e=0;e<r.length;e++)i[e]=r.charCodeAt(e);return i}class zn extends Error{constructor(e,t){super(t),this.name="AppBridgeError",this.code=e}}function Vn(e){const t=JSON.parse((new TextDecoder).decode(qn(e)));if("object"!=typeof t||null===t||Array.isArray(t))throw new Error("JWT segment is not a JSON object");return t}function Kn(e,t,n={}){const r=n.clockToleranceSec??60,i=n.requireExp??!0;if(!e||!t)throw new zn("invalid_token","Missing token or client secret");const s=e.split(".");if(3!==s.length)throw new zn("invalid_token","Malformed JWT");const[a,o,c]=s;let l,u;try{l=Vn(a),u=Vn(o)}catch{throw new zn("invalid_token","Unreadable JWT segments")}if("HS256"!==l.alg)throw new zn("invalid_algorithm",`Unexpected JWT alg: ${String(l.alg)}`);const d=Dt(Lt(t),Lt(`${a}.${o}`));let p;try{p=qn(c)}catch{throw new zn("invalid_signature","Unreadable JWT signature")}if(!Mt(d,p))throw new zn("invalid_signature","JWT signature verification failed");!function(e){for(const t of["iss","sub","jti"])if(void 0!==e[t]&&"string"!=typeof e[t])throw new zn("invalid_token",`JWT ${t} claim must be a string`);for(const t of["exp","nbf","iat"]){const n=e[t];if(void 0!==n&&("number"!=typeof n||!Number.isFinite(n)))throw new zn("invalid_token",`JWT ${t} claim must be a finite number`)}const t=e.aud;if(!(void 0===t||"string"==typeof t||Array.isArray(t)&&t.every(e=>"string"==typeof e)))throw new zn("invalid_token","JWT aud claim must be a string or string array")}(u);const h=Math.floor(Date.now()/1e3);if(i&&"number"!=typeof u.exp)throw new zn("invalid_token","JWT is missing a numeric exp claim");if("number"==typeof u.exp&&h>u.exp+r)throw new zn("token_expired","JWT has expired");if("number"==typeof u.nbf&&h+r<u.nbf)throw new zn("token_not_yet_valid","JWT is not yet valid");if(void 0!==n.issuer&&u.iss!==n.issuer)throw new zn("invalid_issuer","JWT issuer mismatch");if(void 0!==n.audience){const e=u.aud;if(!(Array.isArray(e)?e.includes(n.audience):e===n.audience))throw new zn("invalid_audience","JWT audience mismatch")}return u}function Gn(e){if(!e)return null;const t=/^Bearer\s+(.+)$/i.exec(e.trim());return t?t[1].trim():null}function Hn(e){return Bn(Lt(JSON.stringify(e)))}function Qn(e,t,n){if(!t)throw new zn("invalid_secret","Missing signing secret");const r=Math.floor(Date.now()/1e3),i={iat:r,exp:r+(n?.expiresInSec??3600),...e},s=`${Hn({alg:"HS256",typ:"JWT"})}.${Hn(i)}`;return`${s}.${Bn(Dt(Lt(t),Lt(s)))}`}function Yn(e){const t=Gn(e.authorization);if(!t)throw new zn("invalid_token","Missing Bearer token");return Kn(t,e.clientSecret,{clockToleranceSec:e.clockToleranceSec})}function Xn(e){const t=Gn(e.authorization);if(!t)throw new zn("invalid_token","Missing Bearer token");return Kn(t,e.clientSecret,{clockToleranceSec:e.clockToleranceSec})}function Zn(e){return{success:!0,token:e.token,message:e.message??"ok",..."number"==typeof e.expiresIn?{expiresIn:e.expiresIn}:{}}}function er(e){return{success:!1,token:"",message:e}}async function tr(e){let t;try{t=Yn(e)}catch(e){return{status:401,body:er(e instanceof zn?e.code:"invalid_token")}}return{status:200,body:Zn(await e.mintToken(t))}}async function nr(e){let t;try{t=Xn(e)}catch(e){return{status:401,body:{success:!1,message:e instanceof zn?e.code:"invalid_token"}}}return await e.onRevoke(t),{status:200,body:{success:!0}}}function rr(e){return e.replace(/[\x00-\x1f\x7f]/g,"").replace(/([\\"])/g,"\\$1")}function ir(e){const t=[`Bearer resource_metadata="${rr(e.resourceMetadataUrl)}"`];return e.error&&t.push(`error="${rr(e.error)}"`),e.errorDescription&&t.push(`error_description="${rr(e.errorDescription)}"`),{status:401,headers:{"WWW-Authenticate":t.join(", "),"Content-Type":"application/json"},body:JSON.stringify({error:e.error??"invalid_token"})}}const sr=12,ar=16;function or(){const e=globalThis.crypto;if(!e?.subtle)throw new Error("WebCrypto is unavailable in this runtime — agent-auth session encryption requires globalThis.crypto.subtle (Node 18+, Bun, Deno, edge, browsers).");return e.subtle}const cr=new Map;function lr(e){let t=cr.get(e);return t||(t=(async()=>{const t=await or().digest("SHA-256",(new TextEncoder).encode(`${e}:bb-session`));return or().importKey("raw",t,{name:"AES-GCM"},!1,["encrypt","decrypt"])})(),cr.set(e,t)),t}function ur(e){if(!e)throw new Error("createSessionRefCrypto: missing secret");return{async encryptSessionRef(t){const n=globalThis.crypto.getRandomValues(new Uint8Array(sr)),r=await lr(e),i=new Uint8Array(await or().encrypt({name:"AES-GCM",iv:n},r,(new TextEncoder).encode(t))),s=i.subarray(i.length-ar),a=i.subarray(0,i.length-ar),o=new Uint8Array(28+a.length);return o.set(n,0),o.set(s,sr),o.set(a,28),Bn(o)},async decryptSessionRef(t){try{const n=qn(t);if(n.length<=28)return null;const r=n.slice(0,sr),i=n.subarray(sr,28),s=n.subarray(28),a=new Uint8Array(s.length+ar);a.set(s,0),a.set(i,s.length);const o=await lr(e),c=await or().decrypt({name:"AES-GCM",iv:r},o,a);return(new TextDecoder).decode(c)}catch{return null}}}}async function dr(e){const{claims:t,secret:n}=e,r=e.expiresInSec??3600,i=t.resource&&t.resource.length?1===t.resource.length?t.resource[0]:t.resource:void 0,s=t.sessionId?await ur(n).encryptSessionRef(t.sessionId):void 0;return{token:Qn({sub:t.id,userId:t.id,email:t.email,...t.name?{name:t.name}:{},...t.scope?{scope:t.scope}:{},...i?{aud:i}:{},...s?{sid:s}:{},...e.extraClaims},n,{expiresInSec:r}),expiresIn:r}}function pr(e,t,n){const r=globalThis.process?.env;"1"===r?.MCP_AUTH_DEBUG&&console.warn(`[buildbase/mcp-auth] audience rejected (${n}): received aud=${JSON.stringify(e)} expected one of ${JSON.stringify(t)}`)}function hr(e){const{secret:t}=e;if(!t)throw new Error("buildbaseAuth: missing secret");const n=ur(t),r=e.resource?Array.isArray(e.resource)?e.resource:[e.resource]:[];let i=e.resourceMetadataUrl;if(!i&&r.length)try{const e=new URL(r[0]),t="/"===e.pathname?"":e.pathname.replace(/\/+$/,"");i=`${e.origin}/.well-known/oauth-protected-resource${t}`}catch{}return{resourceMetadataUrl:i,verify:async i=>{let s;try{s=Kn(i,t,{...e.verify})}catch{return null}if(r.length){const t=s.aud?Array.isArray(s.aud)?s.aud:[s.aud]:[];if(!t.length&&e.requireAudience)return pr(t,r,"token carries no aud claim"),null;if(t.length&&!t.some(e=>r.includes(e)))return pr(t,r,"aud does not include this resource"),null}const a="string"==typeof s.sid?await n.decryptSessionRef(s.sid):null,o=Array.isArray(s.scope)?s.scope.filter(e=>"string"==typeof e):"string"==typeof s.scope?s.scope.split(" ").filter(Boolean):void 0;return{sessionId:a??"",userId:"string"==typeof s.userId?s.userId:"string"==typeof s.sub?s.sub:void 0,workspaceId:"string"==typeof s.workspaceId?s.workspaceId:void 0,scopes:o,claims:s}}}}function fr(e){const{serverUrl:t,orgId:n,version:r="v1",getSessionId:i,timeout:s,maxRetries:a,debug:o,headers:c,onError:l,fetch:u}=e;if(!t)throw new Error("BuildBase: serverUrl is required");if(!n)throw new Error("BuildBase: orgId is required");const d={...void 0!==s&&{timeout:s},...void 0!==a&&{maxRetries:a},...void 0!==o&&{debug:o},...c&&{headers:c},...l&&{onError:l},...u&&{fetch:u}},p=e=>{const i={serverUrl:t,version:r,orgId:n,sessionId:e,...d};return{workspace:new W(i),user:new T(i),settings:new A(i),push:new P(i),devices:new E(i),sessions:new U(i)}},h=new W({serverUrl:t,version:r,orgId:n,...d}),f=e=>({workspace:{list:async()=>(await e()).workspace.getWorkspaces(),get:async t=>(await e()).workspace.getWorkspace(t),create:async t=>(await e()).workspace.createWorkspace(t),update:async(t,n)=>(await e()).workspace.updateWorkspace(t,n),delete:async t=>(await e()).workspace.deleteWorkspace(t),permissions:async t=>(await e()).workspace.getMyPermissions(t),can:async(t,n)=>{const{permissions:r}=await(await e()).workspace.getMyPermissions(t),i=new Set(r);return(Array.isArray(n)?n:[n]).every(e=>i.has(e))}},invitations:{list:async t=>(await e()).workspace.listInvitations(t),create:async(t,n,r,i)=>(await e()).workspace.inviteMember(t,{email:n,role:r,landingUrl:i}),resend:async(t,n)=>(await e()).workspace.resendInvitation(t,n),revoke:async(t,n)=>(await e()).workspace.revokeInvitation(t,n)},users:{list:async t=>(await e()).workspace.getWorkspaceUsers(t),invite:async(t,n,r)=>(await e()).workspace.addUser(t,{email:n,role:r}),remove:async(t,n)=>(await e()).workspace.removeUser(t,n),updateRole:async(t,n,r)=>(await e()).workspace.updateUser(t,n,{role:r}),getProfile:async()=>(await e()).workspace.getProfile(),updateProfile:async t=>(await e()).workspace.updateUserProfile(t)},subscription:{get:async t=>(await e()).workspace.getCurrentSubscription(t),checkout:async(t,n)=>(await e()).workspace.createCheckoutSession(t,n),update:async(t,n)=>(await e()).workspace.updateSubscription(t,n),cancel:async t=>(await e()).workspace.cancelSubscriptionAtPeriodEnd(t),resume:async t=>(await e()).workspace.resumeSubscription(t),getBillingPortalUrl:async(t,n)=>(await e()).workspace.createBillingPortalSession(t,n)},plans:{getGroup:async t=>(await e()).workspace.getPlanGroup(t),getVersions:async t=>(await e()).workspace.getPlanGroupVersions(t),getPublic:e=>h.getPublicPlans(e),getVersion:e=>h.getPlanGroupVersion(e)},invoices:{list:async(t,n,r)=>(await e()).workspace.listInvoices(t,n,r),get:async(t,n)=>(await e()).workspace.getInvoice(t,n)},usage:{record:async(t,n)=>(await e()).workspace.recordUsage(t,n),recordBatch:async(t,n)=>(await e()).workspace.recordUsageBatch(t,n),getQuota:async(t,n)=>(await e()).workspace.getQuotaUsageStatus(t,n),getAll:async t=>(await e()).workspace.getAllQuotaUsage(t),getLogs:async(t,n)=>(await e()).workspace.getUsageLogs(t,n)},settings:{get:async()=>(await e()).settings.getSettings()},features:{list:async()=>(await e()).workspace.getFeatures(),update:async(t,n,r)=>(await e()).workspace.updateFeature(t,n,r)},notification:{send:async(t,n,r,i)=>(await e()).workspace.sendNotification(t,n,r,i)},credits:{getBalance:async t=>(await e()).workspace.getCreditBalance(t),consume:async(t,n)=>(await e()).workspace.consumeCredits(t,n),purchase:async(t,n)=>(await e()).workspace.purchaseCredits(t,n),getPackages:async t=>(await e()).workspace.getCreditPackages(t),getTransactions:async(t,n)=>(await e()).workspace.getCreditTransactions(t,n),getBuckets:async(t,n)=>(await e()).workspace.getCreditBuckets(t,n),getExpiring:async(t,n)=>(await e()).workspace.getExpiringCredits(t,n),getPublicPackages:()=>h.getPublicCreditPackages()},permissions:{check:async(t,n,r)=>{const i=await e(),[s,a,o]=await Promise.all([i.workspace.getWorkspace(t),i.settings.getSettings(),i.workspace.getWorkspaceUsers(t)]),c=o.find(e=>("string"==typeof e.user?e.user:e.user._id)===n);return pt(r,{userId:n,workspaceRole:c?.role??null,workspace:s,settings:a})},resolve:async(t,n)=>{const r=await e(),[i,s,a]=await Promise.all([r.workspace.getWorkspace(t),r.settings.getSettings(),r.workspace.getWorkspaceUsers(t)]),o=a.find(e=>("string"==typeof e.user?e.user:e.user._id)===n);return ut({userId:n,workspaceRole:o?.role??null,workspace:i,settings:s})}},devices:{list:async()=>(await e()).devices.list(),rename:async(t,n)=>(await e()).devices.rename(t,n),signOut:async t=>(await e()).devices.signOut(t),forget:async t=>(await e()).devices.forget(t)},sessions:{list:async()=>(await e()).sessions.list(),revoke:async t=>(await e()).sessions.revoke(t)}}),g=f(async()=>p(await(async()=>{if(!i)throw new Error("BuildBase: getSessionId callback is required for authenticated calls. Pass it in BuildBase({ getSessionId: ... }) or use withSession(id) / client.forSession(id).");const e=await i();if(!e)throw new Error("BuildBase: Not authenticated (getSessionId returned null)");return e})()));return{auth:async()=>{if(!i)return null;const e=await i();return e?{sessionId:e}:null},withSession:e=>{const t=p(e);return f(async()=>t)},client:{forSession:p},...g}}export{nn as AI_BOT_USER_AGENTS,ht as APP_PERMISSION_FALLBACK_GROUP,J as ApiVersion,zn as AppBridgeError,b as AuthApi,wt as AuthStatus,G as BBAction,Q as BBScreen,H as BBStatus,K as BB_PARAM,k as BaseApi,S as BetaForm,Re as BillingIntervals,fr as BuildBase,pe as CURRENCY_DISPLAY,he as CURRENCY_FLAG,Le as CreditBucketSource,De as CreditBucketStatus,Me as CreditTransactionType,at as DEFAULT_ROLE_PERMISSIONS,Je as DunningState,D as EventEmitter,ot as FALLBACK_WORKSPACE_ROLE,C as INVITATION_ERROR_CODE,Fe as InvoiceStatuses,$ as NotificationsApi,we as PLAN_CURRENCY_CODES,me as PLAN_CURRENCY_OPTIONS,gt as PUSH_SERVICE_WORKER_SCRIPT,it as Permission,P as PushApi,L as SDKEvent,A as SettingsApi,We as SubscriptionItemType,Ne as SubscriptionStatus,T as UserApi,Ot as WEBHOOK_EVENTS,xt as WEBHOOK_EVENTS_BY_CATEGORY,W as WorkspaceApi,bt as actionableInvitations,ft as appPermissionCatalogue,er as appTokenFailure,Zn as appTokenSuccess,ir as bearerChallenge,vn as buildA2AAgentCard,pn as buildAgentCard,gn as buildAgentSkillsIndex,In as buildApiCatalog,An as buildAuthMd,Ln as buildDiscoveryLinkHeader,_n as buildDnsAidRecords,bn as buildLlmsFullTxt,kn as buildLlmsTxt,Un as buildMcpDiscoveryManifest,Pn as buildMcpServerCard,fn as buildProtectedResourceMetadata,On as buildRobotsTxt,yn as buildSecurityTxt,Fn as buildSitemap,mn as buildSkillMd,Sn as buildWebBotAuthDirectory,hr as buildbaseAuth,Xe as calculateBillableSeats,Ze as calculateSeatOverageCents,et as calculateTotalSubscriptionCents,te as cleanBBParams,dn as clearAgentReadinessCache,de as clearAuthIntent,Ct as clearPendingInvite,ue as consumeAuthIntent,Y as createBBUrl,X as createCheckoutRedirectUrls,Z as createCreditPurchaseRedirectUrls,ur as createSessionRefCrypto,fr as default,M as eventEmitter,Gn as extractBearerToken,ln as fetchAgentReadiness,Ie as formatCents,_e as formatMinorAmountIntl,Pe as formatOverageRate,Ue as formatOverageRateWithLabel,Te as formatQuotaIncludedOverage,Oe as formatQuotaWithPrice,rt as getAvailableBillingIntervals,Ke as getAvailableCurrenciesFromPlans,Be as getBasePriceCents,He as getBillingIntervalAndCurrencyFromPriceId,ve as getCurrencyDecimals,fe as getCurrencyFlag,ge as getCurrencySymbol,Ve as getDisplayCurrency,Ye as getPerSeatPriceCents,je as getPricingVariant,Ce as getQuotaDisplayValue,Ge as getQuotaDisplayWithVariant,ze as getQuotaOverageCents,Ae as getQuotaUnitLabelFromName,Qe as getSeatPricing,qe as getStripePriceIdForInterval,nr as handleAppRevokeRequest,tr as handleAppTokenRequest,pt as hasPermission,q as invalidateCreditBalance,z as invalidateQuotaUsage,V as invalidateSubscription,_t as inviterNameOf,kt as isInvitationActionable,F as isInvitationError,vt as isInvitationLapsed,Nt as isWebhookEvent,Se as isZeroDecimalCurrency,Ee as minorAmountToDisplay,dr as mintAgentToken,Jn as negotiateMarkdown,At as parkPendingInvite,qt as parseWebhookEvent,ct as pickDefaultRole,jn as provideWebMcpTools,ee as readBBParams,Tt as readPendingInvite,It as resendCooldownSeconds,Mn as resolveAgentPath,tt as resolveMaxUsers,ut as resolvePermissions,dt as resolveRolePermissions,Dn as resolveWellKnown,ae as safeRedirect,le as saveAuthIntent,an as sha256Digest,Qn as signClientJwt,yt as sortInvitations,nt as validateInvite,se as validateRedirectUrl,Xn as verifyAppRevokeRequest,Yn as verifyAppTokenRequest,Kn as verifyClientJwt,Bt as verifyWebhookSignature,Wn as wantsMarkdown,Et as workspaceIdOf,St as workspaceNameOf};