@buildbase/sdk 0.0.68 → 0.0.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +5 -2
- package/CHANGELOG.md +42 -0
- package/README.md +110 -5
- package/dist/css/styles.css +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +505 -14
- package/dist/index.mjs +1 -1
- package/dist/mcp/index.cjs +1 -1
- package/dist/mcp/index.d.ts +72 -0
- package/dist/mcp/index.mjs +1 -1
- package/dist/react/chunks/SettingsDialog-D5lLHG9-.cjs +2 -0
- package/dist/react/chunks/SettingsDialog-DiTnAWFt.mjs +2 -0
- package/dist/react/chunks/SubscriptionDialog-Bkue_qyM.cjs +2 -0
- package/dist/react/chunks/SubscriptionDialog-ZjdyTmxn.mjs +2 -0
- package/dist/react/chunks/ar-By_nJtJ6.mjs +2 -0
- package/dist/react/chunks/ar-D_agqxXa.cjs +2 -0
- package/dist/react/chunks/de-CQW2yLLr.mjs +2 -0
- package/dist/react/chunks/de-D7j-9T8u.cjs +2 -0
- package/dist/react/chunks/es-CggBj8dc.mjs +2 -0
- package/dist/react/chunks/es-DYtfnqFg.cjs +2 -0
- package/dist/react/chunks/fr-Bu6_05LA.cjs +2 -0
- package/dist/react/chunks/fr-CbvudRKC.mjs +2 -0
- package/dist/react/chunks/hi-DrJIuj_0.mjs +2 -0
- package/dist/react/chunks/hi-dKtSIE95.cjs +2 -0
- package/dist/react/chunks/ja-6AwwCaS_.cjs +2 -0
- package/dist/react/chunks/ja-BtZsSYAE.mjs +2 -0
- package/dist/react/chunks/react-BIZcTNos.mjs +2 -0
- package/dist/react/chunks/react-DM1nGVlR.cjs +2 -0
- package/dist/react/chunks/zh-BZsPG6yc.mjs +2 -0
- package/dist/react/chunks/zh-C6onHYpa.cjs +2 -0
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.d.ts +736 -20
- package/dist/react/index.mjs +1 -1
- package/docs/ERROR_CODES.md +24 -0
- package/docs/UI-CONFIG.md +1 -0
- package/package.json +2 -1
- package/dist/react/chunks/SettingsDialog-CmVCLPsu.cjs +0 -2
- package/dist/react/chunks/SettingsDialog-arrlxX6I.mjs +0 -2
- package/dist/react/chunks/SubscriptionDialog-C1diRL3y.mjs +0 -2
- package/dist/react/chunks/SubscriptionDialog-DklgwSWz.cjs +0 -2
- package/dist/react/chunks/ar-CHTRXlXt.mjs +0 -2
- package/dist/react/chunks/ar-DPJVNHJV.cjs +0 -2
- package/dist/react/chunks/de-CdPeKWZ2.mjs +0 -2
- package/dist/react/chunks/de-DPd09yf-.cjs +0 -2
- package/dist/react/chunks/es-BWGnjJKJ.mjs +0 -2
- package/dist/react/chunks/es-WdOYGt6G.cjs +0 -2
- package/dist/react/chunks/fr-Big5DFPB.mjs +0 -2
- package/dist/react/chunks/fr-LIbCvYeh.cjs +0 -2
- package/dist/react/chunks/hi-BoCY3pFe.cjs +0 -2
- package/dist/react/chunks/hi-jArNRknR.mjs +0 -2
- package/dist/react/chunks/ja-Cwdz0hCu.mjs +0 -2
- package/dist/react/chunks/ja-E0jqCiVq.cjs +0 -2
- package/dist/react/chunks/react-DoJBZJu7.cjs +0 -2
- package/dist/react/chunks/react-yio5IEhU.mjs +0 -2
- package/dist/react/chunks/zh-glRKcdia.mjs +0 -2
- package/dist/react/chunks/zh-tU-AqFYI.cjs +0 -2
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 s(e,t="Request failed"){if(!e.ok){let n=t;try{const t=await r(e);n=t.message||t.error||n}catch{n=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 new Error(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 i 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,i)}}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 s=e instanceof Error?e:new i("string"==typeof e?e:"An unknown error occurred","UNKNOWN_ERROR",r),a=s instanceof i?s:new i(s.message,"SDK_ERROR",r,s);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){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 d="saas-session-id",p="saas-device-id";function h(){return function(){if("undefined"==typeof window)return null;try{return c(d)}catch(e){return o(e,{component:"auth-utils",action:"getSessionId",metadata:{key:d}}),null}}()}function f(){const e=h(),t={};e&&(t["x-session-id"]=e);const n=function(){if("undefined"==typeof window)return null;try{return c(p)??null}catch(e){return o(e,{component:"auth-utils",action:"getOrCreateDeviceId",metadata:{key:p}}),null}}();return n&&(t["x-device-id"]=n),t}const g=new WeakSet,w=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),y="SDK is not ready (missing serverUrl, version, or orgId)";class m{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}:f()}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){g.has(e)||(g.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 s=()=>{clearTimeout(i),r(new DOMException("The operation was aborted.","AbortError"))};if(t?.aborted)return s();const i=setTimeout(()=>{t?.removeEventListener("abort",s),n()},e);t?.addEventListener("abort",s,{once:!0})})}async executeFetchUrl(e,t,n){const r=(t.method??"GET").toUpperCase(),s=n??e,i=this.buildHeaders(t),a={...t,headers:i},o=w.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,s=e=>{r.signal.aborted||r.abort(e.reason)};for(const n of[e,t]){if(n.aborted){s(n);break}n.addEventListener("abort",()=>s(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} ${s}`);return this.reportError(e,{method:r,path:s}),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),s=await n(e,a);if(this._debug&&console.log(`[BuildBase] ${r} ${e} → ${s.status}`),401===s.status&&this._onUnauthorized&&this._onUnauthorized(),s.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 m.delay(e,a.signal),d(t+1)}return s}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 m.delay(e,a.signal)}catch(e){throw l(e)}return d(t+1)}throw e instanceof Error&&this.reportError(e,{method:r,path:s}),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 s(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 k extends m{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 s=await r(e);if(400===s.status&&(e.trackingConsent||e.trackingIdentity)){const{trackingConsent:t,trackingIdentity:n,...i}=e;s=await r(i)}return s.ok||await this.throwResponseError(s,n),this.unwrapResponse(s,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""}}}class b extends m{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 v{constructor(e){this.api=new b(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),s=t?.timezone??("undefined"!=typeof Intl&&Intl.DateTimeFormat?Intl.DateTimeFormat().resolvedOptions().timeZone:void 0),i=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:s,currency:i}})}}class S extends m{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")}}class $ extends m{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 m{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 E extends m{constructor(e){super({...e,requireOrgId:!0})}async getSettings(e){return this.fetchJson(`${this.orgId}/settings`,{signal:e},"Failed to fetch settings")}}class P extends m{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:{}}}class C extends m{constructor(e){super({...e,requireOrgId:!0})}async getWorkspaces(e){return this.fetchJson("workspaces",{signal:e},"Failed to fetch workspaces")}async createWorkspace(e,t){return this.fetchJson("workspaces",{method:"POST",body:JSON.stringify(e),signal:t},"Failed to create workspace")}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 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 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 s=new URLSearchParams;return s.append("limit",t.toString()),n&&s.append("starting_after",n),this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/invoices`+`?${s.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 s=r.toString(),i=this.apiPath`workspaces/${e}/subscription/usage/logs`+(s?`?${s}`:"");return this.fetchUnwrapped(i,{signal:n},"Failed to fetch usage logs")}async sendNotification(e,t,n,r,s){const i={event:t};return n&&(i.userId=n),r&&(i.data=r),this.fetchJson(this.apiPath`workspaces/${e}/notifications/send`,{method:"POST",body:JSON.stringify(i),signal:s},"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 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 s=r.toString(),i=this.apiPath`workspaces/${e}/credits/transactions`+(s?`?${s}`:"");return this.fetchUnwrapped(i,{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 s=r.toString(),i=this.apiPath`workspaces/${e}/credits/buckets`+(s?`?${s}`:"");return this.fetchUnwrapped(i,{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 x;!function(e){e.V1="v1"}(x||(x={}));const T={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"};class _{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(T.UserCreated,{user:e})}async emitUserUpdated(e,t){await this.emit(T.UserUpdated,{user:e,previousUser:t})}async emitWorkspaceChanged(e,t){await this.emit(T.WorkspaceChanged,{workspace:e,previousWorkspace:t})}async emitWorkspaceUpdated(e){await this.emit(T.WorkspaceUpdated,{workspace:e})}async emitWorkspaceUserAdded(e,t,n){await this.emit(T.WorkspaceUserAdded,{userId:e,workspace:t,role:n})}async emitWorkspaceUserRemoved(e,t,n){await this.emit(T.WorkspaceUserRemoved,{userId:e,workspace:t,role:n})}async emitWorkspaceUserRoleChanged(e,t,n,r){await this.emit(T.WorkspaceUserRoleChanged,{userId:e,workspace:t,previousRole:n,newRole:r})}async emitWorkspaceCreated(e){await this.emit(T.WorkspaceCreated,{workspace:e})}async emitWorkspaceDeleted(e){await this.emit(T.WorkspaceDeleted,{workspace:e})}}const I=new _;function A(){const e=new Set;return{subscribe:t=>(e.add(t),()=>{e.delete(t)}),invalidate(){e.forEach(e=>e())},reset(){e.clear()}}}const R=A().invalidate,O=A().invalidate,W=A().invalidate,F="bb",N={Checkout:"checkout",Billing:"billing",SelectPlan:"selectPlan",CreditPurchase:"creditPurchase",OpenCreditStore:"openCreditStore",OpenConnectGuide:"openConnectGuide",Invite:"invite"},J={Success:"success",Cancel:"cancel",Error:"error"},L={Subscription:"subscription",Credits:"credits",Usage:"usage",Users:"users",Profile:"profile",General:"general",Features:"features",Notifications:"notifications",Permissions:"permissions",Danger:"danger"};function M(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(F,function(e){return Object.entries(e).filter(([,e])=>null!=e&&""!==e).map(([e,t])=>`${encodeURIComponent(e)}:${encodeURIComponent(t)}`).join(",")}(e)),r.toString()}function B(e,t){const n=t||("undefined"!=typeof window?window.location.href:void 0);return{successUrl:M({action:N.Checkout,status:J.Success,ws:e,screen:L.Subscription},n),cancelUrl:M({action:N.Checkout,status:J.Cancel,ws:e,screen:L.Subscription},n)}}function D(e,t){const n=t||("undefined"!=typeof window?window.location.href:void 0);return{successUrl:M({action:N.CreditPurchase,status:J.Success,ws:e,screen:L.Credits},n),cancelUrl:M({action:N.CreditPurchase,status:J.Cancel,ws:e,screen:L.Credits},n)}}function j(){if("undefined"==typeof window)return null;try{const e=new URLSearchParams(window.location.search).get(F);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)),s=decodeURIComponent(e.slice(n+1));r&&(t[r]=s)}return t}(e);return Object.keys(t).length>0?t:null}catch{return null}}function q(){if("undefined"!=typeof window)try{const e=new URL(window.location.href);e.searchParams.has(F)&&(e.searchParams.delete(F),window.history.replaceState({},"",e.toString()))}catch{}}const z="__buildbaseBeforeLeave",K=globalThis,V=K[z]??(K[z]=new Set);function G(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,s="http:"===n.protocol&&("localhost"===n.hostname||"127.0.0.1"===n.hostname||"[::1]"===n.hostname);if(!r&&!s)return null;const{sameOrigin:i,allowedOrigins:a}=t;return i||a?.length?i&&"undefined"!=typeof window&&window.location&&n.origin===window.location.origin||a?.some(e=>e.replace(/\/+$/,"")===n.origin)?e:null:e}function H(e,t="/",n={}){if("undefined"==typeof window||!window.location)return!1;const r=G(e,n)??G(t)??"/";return function(e){if("undefined"==typeof window||!window.location||0===V.size)return;let t;try{t=new URL(e,window.location.href).origin}catch{return}if(t!==window.location.origin)for(const e of V)try{e()}catch{}}(r),window.location.href=r,!0}const Q="saas-auth-intent";function Y(e){return"object"==typeof e&&null!==e&&"string"==typeof e.returnUrl&&"number"==typeof e.createdAt}function Z(e){G(e,{sameOrigin:!0})&&l(Q,{returnUrl:e,createdAt:Date.now()})}function X(){const e=function(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}}(Q,Y);return u(Q),e?Date.now()-e.createdAt>6e5?null:G(e.returnUrl,{sameOrigin:!0}):null}function ee(){u(Q)}const te={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:"฿"},ne={usd:"🇺🇸",eur:"🇪🇺",gbp:"🇬🇧",jpy:"🇯🇵",cad:"🇨🇦",aud:"🇦🇺",chf:"🇨🇭",cny:"🇨🇳",hkd:"🇭🇰",sgd:"🇸🇬",inr:"🇮🇳",mxn:"🇲🇽",brl:"🇧🇷",nzd:"🇳🇿",sek:"🇸🇪",nok:"🇳🇴",dkk:"🇩🇰",pln:"🇵🇱",thb:"🇹🇭"};function re(e){return e&&e.trim()?ne[e.trim().toLowerCase()]??"":""}function se(e){if(!e||!e.trim())return"";const t=e.trim().toLowerCase();return te[t]??t.toUpperCase()}const ie=["usd","eur","gbp","jpy","cad","aud","chf","cny","hkd","sgd","inr","mxn","brl","nzd","sek","nok","dkk","pln","thb"],ae=ie.map(e=>({value:e,label:`${e.toUpperCase()} (${se(e)})`})),oe=new Set(["bif","clp","djf","gnf","jpy","kmf","krw","mga","pyg","rwf","ugx","vnd","vuv","xaf","xof","xpf"]),ce=new Set(["bhd","jod","kwd","omr","tnd"]),ue=new Map;function le(e){const t=(e??"").trim().toLowerCase();if(!t)return 2;if(oe.has(t))return 0;if(ce.has(t))return 3;if("isk"===t)return 2;let n=ue.get(t);if(void 0===n){try{n=new Intl.NumberFormat("en-US",{style:"currency",currency:t.toUpperCase()}).resolvedOptions().maximumFractionDigits??2}catch{n=2}ue.set(t,n)}return n}function de(e){return""!==(e??"").trim()&&0===le(e)}function pe(e,t){const n=le(t);return 0===n?e.toLocaleString("en-US"):(e/10**n).toFixed(n)}function he(e,t,n="en-US"){const r=(t??"").trim(),s=le(r),i=e/10**s;if(!r)return i.toFixed(s);try{return new Intl.NumberFormat(n,{style:"currency",currency:r.toUpperCase(),minimumFractionDigits:s,maximumFractionDigits:s}).format(i)}catch{return se(r)+(0===s?i.toLocaleString("en-US"):i.toFixed(s))}}function fe(e,t){return se(t)+pe(e,t)}const ge={unit:"unit",units:"units",included:"Included",afterThat:"after that",afterIncluded:"After included",hardLimit:"hard limit"};function we(e,t,n,r,s){if(null==e||e<0)return null;const i={...ge,...r},a=null!=t&&t>=1?t:1,o=se(n),c=pe(e,n);return 1===a?`${o}${c}/${i.unit}`:`${o}${c}/${a.toLocaleString(s)} ${i.units}`}function ye(e,t,n,r,s,i,a){if(null==e||e<0)return null;const o={...ge,...i},c=null!=t&&t>=1?t:1,u=se(r),l=pe(e,r);if(n){const e=s??(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 me(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 ke(e,t,n,r,s,i,a,o,c){const u={...ge,...a};if(!1===o)return null!=e?`${u.included}: ${e.toLocaleString(c)} (${u.hardLimit})`:a?.hardLimit??"Hard limit";const l=i??(n.endsWith("s")?n:`${n}s`),d=null!=s&&s>=2?`${s.toLocaleString(c)} ${l}`:n;return null!=e&&null!=t?`${u.included}: ${e.toLocaleString(c)}, ${u.afterThat} ${fe(t,r)}/${d}`:null!=e?`${u.included}: ${e.toLocaleString(c)}`:null!=t?`${u.afterIncluded}: ${fe(t,r)}/${d}`:"—"}function be(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 ve={included:"included",then:"then",hardLimit:"hard limit"};function Se(e,t,n={}){const{overageInCents:r=!0,currency:s}=n,i={...ve,...n.labels},a=n.currencySymbol??se(s??"");if(null==e)return"—";const{included:o,overage:c}=e,u=`${o} ${i.included}`;if(!1===e.allowOverage)return`${u} (${i.hardLimit})`;if(null==c)return u;const l=le(s),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}, ${i.then} ${a}${p}${h}`}const $e={Monthly:"monthly",Yearly:"yearly",Quarterly:"quarterly"},Ue={Active:"active",Trialing:"trialing",Canceled:"canceled",PastDue:"past_due",Paused:"paused",Incomplete:"incomplete",Unpaid:"unpaid"},Ee={Draft:"draft",Open:"open",Paid:"paid",Uncollectible:"uncollectible",Void:"void"},Pe={Feature:"feature",Limit:"limit",Quota:"quota"},Ce={None:"none",Notified:"notified",Warning:"warning",Final:"final",Suspended:"suspended"},xe={PlanGrant:"plan_grant",CreditPackPurchase:"credit_pack_purchase",AdminGrant:"admin_grant",Refund:"refund"},Te={Pending:"pending",Active:"active",Expired:"expired",Consumed:"consumed"},_e={PlanGrant:"plan_grant",PackPurchased:"pack_purchased",Consumed:"consumed",Expired:"expired",AdminGrant:"admin_grant",AdminRevoke:"admin_revoke",Refund:"refund"};function Ie(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 Ae(e,t,n){const r=Ie(e,t);if(!r?.basePricing)return null;const s=r.basePricing[n];return null!=s?s:null}function Re(e,t,n){const r=Ie(e,t);if(!r?.stripePrices)return null;const s=n===$e.Monthly?"monthlyPriceId":n===$e.Yearly?"yearlyPriceId":"quarterlyPriceId",i=n===$e.Monthly?"monthly":n===$e.Yearly?"yearly":void 0;return r.stripePrices[s]??(i?r.stripePrices[i]:void 0)??null}function Oe(e,t,n,r){const s=Ie(e,t),i=s?.quotaOverages?.[n];if(i)return i[r]}function We(e,t){const n=Ie(e,t);return n?n.currency:e.plan?.currency??""}function Fe(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 Ne(e,t,n,r){const s=e.quotas?.[n];if(null==s)return null;const i=s[r];if(!i)return null;const a=Oe(e,t,n,r);return{included:i.included,...void 0!==i.unitSize&&{unitSize:i.unitSize},...void 0!==a&&{overage:a},allowOverage:!1!==s.allowOverage}}function Je(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 Le(e,t){const n=Ie(e,t);return n?.seatPricing?.enabled?n.seatPricing:null}function Me(e,t,n){const r=Le(e,t);return r?.perSeat?r.perSeat[n]??null:null}function Be(e,t){return Math.max(0,e-(t||0))}function De(e,t,n,r){const s=Le(e,t);if(!s)return null;return Be(r,s.includedSeats)*(Me(e,t,n)??0)}function je(e,t,n,r){const s=Ae(e,t,n);if(null===s)return null;if(void 0===r)return s;return s+(De(e,t,n,r)??0)}function qe(e){const{planVersion:t,currency:n="usd",settingsMaxUsers:r}=e;if(t){const e=Le(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 ze(e){const{memberCount:t,maxUsersConfig:n,hasSubscription:r=!0,requireSubscription:s=!1}=e;if(s&&!r)return{canInvite:!1,blockReason:"no_subscription",blockMessageKey:"users.subscriptionRequired",blockMessageValues:{}};const{maxUsers:i,source:a}=n;if(i<=0)return{canInvite:!0,blockReason:null,blockMessageKey:null,blockMessageValues:null};if(t>=i){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:i}}}return{canInvite:!0,blockReason:null,blockMessageKey:null,blockMessageValues:null}}const Ke={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"},Ve=Object.values(Ke),Ge={admin:Ve.filter(e=>e!==Ke.WORKSPACE_DELETE),member:[Ke.WORKSPACE_SETTINGS_VIEW,Ke.WORKSPACE_MEMBERS_VIEW,Ke.WORKSPACE_FEATURES_VIEW,Ke.WORKSPACE_BILLING_VIEW,Ke.WORKSPACE_USAGE_VIEW],viewer:[Ke.WORKSPACE_SETTINGS_VIEW,Ke.WORKSPACE_MEMBERS_VIEW]};function He(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 Qe(e){const{userId:t,workspace:n,settings:r,appPermissions:s}=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(Ve);if(s)for(const t of He(s))e.add(t);if(n.permissions)for(const t of He(n.permissions))e.add(t);if(r?.workspace?.permissions)for(const t of He(r.workspace.permissions))e.add(t);return e}const i=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);if(!i)return new Set;const a=n.permissions,o=r?.workspace?.permissions,c=e=>e.filter(e=>e.startsWith("workspace:")),u=e=>e.filter(e=>!e.startsWith("workspace:")),l=!!a&&i in a,d=!!o&&i in o,p=i in Ge;let h;if(l)h=c(a[i]);else if(d)h=c(o[i]);else if(p)h=Ge[i];else{const e=r?.workspace?.defaultRole;h=e&&e in Ge?Ge[e]:[]}const f=new Set(h),g=l?u(a[i]):[],w=s?.[i]?u(s[i]):[],y=l?g:w;for(const e of y)f.add(e);return function(e,t,n){if(!n?.workspace)return;const{canInviteMembers:r}=n.workspace;(!1===r||"admin-only"===r&&"admin"!==t)&&e.delete(Ke.WORKSPACE_MEMBERS_INVITE)}(f,i,r),f}function Ye(e,t){const n=Qe(t);return Array.isArray(e)?e.every(e=>n.has(e)):n.has(e)}const Ze="\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 Xe;!function(e){e.loading="loading",e.redirecting="redirecting",e.authenticated="authenticated",e.unauthenticated="unauthenticated",e.authenticating="authenticating"}(Xe||(Xe={}));const et=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]),tt=(e,t)=>e>>>t|e<<32-t;function nt(e){let t=1779033703,n=3144134277,r=1013904242,s=2773480762,i=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=tt(w[e-15],7)^tt(w[e-15],18)^w[e-15]>>>3,n=tt(w[e-2],17)^tt(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=s,f=i,g=a,y=o,m=c;for(let e=0;e<64;e++){const t=m+(tt(f,6)^tt(f,11)^tt(f,25))+(f&g^~f&y)+et[e]+w[e]>>>0,n=u&l^u&d^l&d;m=y,y=g,g=f,f=h+t>>>0,h=d,d=l,l=u,u=t+((tt(u,2)^tt(u,13)^tt(u,22))+n>>>0)>>>0}t=t+u>>>0,n=n+l>>>0,r=r+d>>>0,s=s+h>>>0,i=i+f>>>0,a=a+g>>>0,o=o+y>>>0,c=c+m>>>0}const y=new Uint8Array(32),m=[t,n,r,s,i,a,o,c];for(let e=0;e<8;e++)y[4*e]=m[e]>>>24&255,y[4*e+1]=m[e]>>>16&255,y[4*e+2]=m[e]>>>8&255,y[4*e+3]=255&m[e];return y}function rt(e){return(new TextEncoder).encode(e)}function st(e,t){let n=e;n.length>64&&(n=nt(n));const r=new Uint8Array(64),s=new Uint8Array(64);for(let e=0;e<64;e++){const t=e<n.length?n[e]:0;r[e]=54^t,s[e]=92^t}const i=nt(at(r,t));return nt(at(s,i))}function it(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 at(e,t){const n=new Uint8Array(e.length+t.length);return n.set(e,0),n.set(t,e.length),n}function ot(e){const{body:t,signature:n,timestamp:r,secret:s,maxAgeSeconds:i=300}=e;if(!(n&&r&&s&&t))return!1;const a="sha256=";if(!n.startsWith(a))return!1;const o=n.slice(7);if(i>0){const e=parseInt(r,10);if(isNaN(e))return!1;if(Math.abs(Math.floor(Date.now()/1e3)-e)>i)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=st(rt(s),rt(`${r}.${t}`));return c.length===u.length&&it(c,u)}function ct(e){if(!ot(e))return null;try{return JSON.parse(e.body)}catch{return null}}const ut=300,lt="/.well-known/oauth-protected-resource",dt="/.well-known/agent-skills",pt="/.well-known/api-catalog",ht="/.well-known/mcp/server-card.json",ft="/.well-known/agent-card.json",gt="application/json",wt="application/linkset+json",yt="text/markdown; charset=utf-8",mt="text/plain; charset=utf-8",kt="application/xml; charset=utf-8",bt=["GPTBot","OAI-SearchBot","ChatGPT-User","ClaudeBot","Claude-User","Claude-SearchBot","PerplexityBot","Perplexity-User","Google-Extended","Applebot-Extended","CCBot","Bytespider","meta-externalagent","Amazonbot"];function vt(e){return e.replace(/\/+$/,"")}function St(e){return`public, max-age=${e}, s-maxage=${e}`}function $t(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}(nt(rt(e)))}const Ut=new Map;async function Et(e,t,n,r){if(!r||r<=0)return e(t,n);const s=new AbortController,i=setTimeout(()=>s.abort(),r);try{return await e(t,{...n,signal:s.signal})}finally{clearTimeout(i)}}async function Pt(e){const t=e.cacheTtlSeconds??ut,n=`${vt(e.serverUrl)}::${e.orgId}`,r=Ut.get(n);if(r&&r.expiresAt>Date.now())return r.value;const s=e.fetch??fetch,i=`${vt(e.serverUrl)}/api/v1/public/${e.orgId}/agent-readiness`;let a={enabled:!1};try{const t=await Et(s,i,{headers:{Accept:gt}},e.fetchTimeoutMs??5e3);if(t.ok){const e=await t.json();e&&"object"==typeof e&&(a=e)}}catch{}return Ut.set(n,{value:a,expiresAt:Date.now()+1e3*t}),a}const Ct=new Map;function xt(){Ut.clear(),Ct.clear()}function Tt(e,t){const n=vt(e.siteUrl),r={llms_txt:"/llms.txt",sitemap:"/sitemap.xml",robots:"/robots.txt",oauth_protected_resource:lt};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=`${dt}/index.json`),e.apiCatalog?.length&&(r.api_catalog=pt),e.mcpServerCard&&(r.mcp_server_card=ht),!1!==e.a2aCard&&(r.a2a_agent_card=ft),e.llmsFullTxt&&(r.llms_full_txt="/llms-full.txt");return Vt({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 _t(e){let t="/";try{t=new URL(e).pathname}catch{t=e.startsWith("/")?e:`/${e}`}const n="/"===t?"":t.replace(/\/+$/,"");return lt+n}function It(e,t,n){const r=t.protectedResources??[];if(!r.length)return null;const s=e.replace(/\/+$/,"")||lt,i=n??`${vt(t.serverUrl)}/org/${t.orgId}`,a=t.scopes?.map(e=>e.name),o=r.map(e=>{const n=e.resource??vt(t.siteUrl),r=e.scopes??a;return{path:_t(n),metadata:{resource:n,authorization_servers:[i],bearer_methods_supported:e.bearerMethods??["header"],...r?.length?{scopes_supported:r}:{},...e.documentationUrl?{resource_documentation:e.documentationUrl}:{}}}}),c=o.find(e=>e.path===s);return c?Vt(c.metadata,t):s===lt&&1===o.length?Vt(o[0].metadata,t):null}function At(e){const t=e.skills??[];if(!t.length)return null;const n=vt(e.siteUrl);return Vt({$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}${Rt(e)}`,digest:$t(e.content)}))},e)}function Rt(e){return e.path??`${dt}/${e.name}/SKILL.md`}function Ot(e,t){const n=(t.skills??[]).find(t=>Rt(t)===e);return n?{status:200,contentType:"text/markdown; charset=utf-8",body:n.content,cacheControl:St(t.cacheTtlSeconds??ut)}:null}function Wt(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:mt,body:t.join("\n")+"\n",cacheControl:St(e.cacheTtlSeconds??ut)}}function Ft(e){return e.llmsTxt?{status:200,contentType:mt,body:e.llmsTxt,cacheControl:St(e.cacheTtlSeconds??ut)}:null}function Nt(e){return e.llmsFullTxt?{status:200,contentType:mt,body:e.llmsFullTxt,cacheControl:St(e.cacheTtlSeconds??ut)}:null}function Jt(e){if(!1===e.a2aCard)return null;const t=e.a2aCard??{},n=vt(e.siteUrl),r=t.serviceUrl??n,s=t.transportProtocol??"http",i=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 Vt({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:s,supportedInterfaces:[{serviceUrl:r,transportProtocol:s}],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:i,...e.site.documentationUrl?{documentationUrl:e.site.documentationUrl}:{}},e)}function Lt(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:St(e.cacheTtlSeconds??ut)}:null}function Mt(e){return e.endsWith(".json")||e.includes(".well-known/")?gt:e.endsWith(".md")?yt:e.endsWith(".xml")?kt:mt}function Bt(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 Dt(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:wt,body:JSON.stringify({linkset:n},null,2),cacheControl:St(e.cacheTtlSeconds??ut)}}function jt(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 qt(e){const t=e.mcpServerCard;return t?Vt({$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:jt(t.capabilities),...t.documentationUrl?{documentation_url:t.documentationUrl}:{}},e):null}function zt(e){const t=e.mcpServerCard;if(!t)return null;const n=vt(e.siteUrl);let r;try{r={type:"oauth2",protected_resource_metadata:`${new URL(t.endpoint).origin}${_t(t.endpoint)}`}}catch{}return Vt({$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:jt(t.capabilities),...t.documentationUrl?{documentation_url:t.documentationUrl}:{},server_card:`${n}${ht}`,...r?{authentication:r}:{}}]},e)}function Kt(e,t){const n=St(e.cacheTtlSeconds??ut);if(e.authMd)return{status:200,contentType:yt,body:e.authMd,cacheControl:n};const r=t.authorizationServer;if(!r)return null;const s=`# 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:yt,body:s,cacheControl:n}}function Vt(e,t){return{status:200,contentType:gt,body:JSON.stringify(e,null,2),cacheControl:St(t.cacheTtlSeconds??ut)}}function Gt(e){return String(e).replace(/[\x00-\x1f\x7f]/g,"")}function Ht(e,t){const n=(Array.isArray(e.userAgent)?e.userAgent:[e.userAgent]).map(e=>`User-agent: ${Gt(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: ${Gt(t)}`);for(const t of e.disallow??[])n.push(`Disallow: ${Gt(t)}`);return void 0!==e.crawlDelay&&n.push(`Crawl-delay: ${Gt(e.crawlDelay)}`),n.join("\n")}function Qt(e){const t=e.robots??{},n=vt(e.siteUrl),r=t.policies??[{userAgent:"*",allow:["/"]}],s=t.aiBots??"allow",i="allow"===s?[{userAgent:[...bt],allow:["/"]}]:"deny"===s?[{userAgent:[...bt],disallow:["/"]}]:s,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)=>Ht(e,0===n?t.contentSignals:void 0)),...i.map(e=>Ht(e)),...a.length?[a.map(e=>`Sitemap: ${Gt(e)}`).join("\n")]:[]];return{status:200,contentType:mt,body:o.join("\n\n")+"\n",cacheControl:St(e.cacheTtlSeconds??ut)}}function Yt(e){const t="number"==typeof e&&Number.isFinite(e)?e:.5;return String(Math.min(1,Math.max(0,t)))}function Zt(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function Xt(e){const t=e.sitemap?.urls;if(!t?.length)return null;const n=vt(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>${Zt(/^https?:\/\//.test(t.loc)?t.loc:`${n}${t.loc.startsWith("/")?"":"/"}${t.loc}`)}</loc>`,...t.lastmod?[` <lastmod>${Zt(t.lastmod)}</lastmod>`]:[],...t.changefreq?[` <changefreq>${Zt(String(t.changefreq))}</changefreq>`]:[],...void 0!==t.priority?[` <priority>${Yt(t.priority)}</priority>`]:[]].join("\n")}\n </url>`}).join("\n")+"\n</urlset>\n";return{status:200,contentType:kt,body:r,cacheControl:St(e.cacheTtlSeconds??ut)}}function en(e){if(!e)return!1;let t=0,n=0;for(const r of e.split(",")){const[e,...s]=r.trim().split(";"),i=e.trim().toLowerCase();let a=1;for(const e of s){const[t,n]=e.split("=").map(e=>e.trim());if("q"===t){const e=Number(n);Number.isNaN(e)||(a=e)}}"text/markdown"===i||"text/x-markdown"===i?t=Math.max(t,a):"text/html"!==i&&"text/*"!==i&&"*/*"!==i||(n=Math.max(n,a))}return t>0&&t>=n}function tn(e,t,n){const r=en(e);return{status:200,contentType:r?yt:"text/html; charset=utf-8",body:r?t.markdown:t.html,cacheControl:St(n?.cacheTtlSeconds??ut),vary:"Accept"}}function nn(e){const t=vt(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}${ft}>; 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}${pt}>; rel="api-catalog"; type="${wt}"`),e.mcpServerCard&&n.push(`<${t}${ht}>; rel="mcp-server"; type="application/json"`),n.join(", ")}async function rn(e,t){const n=e.replace(/\/+$/,"")||e;if("/.well-known/agent.json"===n){return Tt(t,await Pt(t))}if(n===ft)return Jt(t);if("/.well-known/http-message-signatures-directory"===n)return Lt(t);if("/.well-known/security.txt"===n)return Wt(t);if(n===`${dt}/index.json`)return At(t);if(n.startsWith(`${dt}/`)&&n.endsWith("SKILL.md"))return Ot(n,t);if("/.well-known/oauth-authorization-server"===n||"/.well-known/openid-configuration"===n){const e=(await Pt(t)).authorizationServer;if(!e?.metadataUrl)return null;const n=await async function(e,t){const n=t.cacheTtlSeconds??ut,r=Ct.get(e);if(r&&r.expiresAt>Date.now())return r.value;const s=t.fetch??fetch;let i=null;try{const n=await Et(s,e,{headers:{Accept:gt}},t.fetchTimeoutMs??5e3);if(n.ok){const e=await n.json();e&&"object"==typeof e&&(i=e)}}catch{}return Ct.set(e,{value:i,expiresAt:Date.now()+1e3*n}),i}(e.metadataUrl,t);return Vt(n?n:{...e.issuer?{issuer:e.issuer}:{},oauth_authorization_server_metadata:e.metadataUrl},t)}if(n===pt)return Dt(t);if(n===ht)return qt(t);if("/.well-known/mcp.json"===n)return zt(t);if(n.startsWith(lt)){const e=await Pt(t);return It(n,t,e.authorizationServer?.issuer)}return null}async function sn(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??Mt(e),body:r.body,cacheControl:r.cacheControl??St(t.cacheTtlSeconds??ut)}}(n,t);return r||("/robots.txt"===n?Qt(t):"/llms-full.txt"===n?Nt(t):"/sitemap.xml"===n?Xt(t):"/llms.txt"===n?Ft(t):"/auth.md"===n?Kt(t,await Pt(t)):"/security.txt"===n?Wt(t):n.startsWith("/.well-known")?rn(n,t):null)}function an(e){const t=globalThis.navigator;return!!t?.modelContext?.provideContext&&(t.modelContext.provideContext({tools:e}),!0)}function on(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 cn(e){const t=e.replace(/-/g,"+").replace(/_/g,"/"),n=t.length%4==0?"":"=".repeat(4-t.length%4),r=atob(t+n),s=new Uint8Array(r.length);for(let e=0;e<r.length;e++)s[e]=r.charCodeAt(e);return s}class un extends Error{constructor(e,t){super(t),this.name="AppBridgeError",this.code=e}}function ln(e){const t=JSON.parse((new TextDecoder).decode(cn(e)));if("object"!=typeof t||null===t||Array.isArray(t))throw new Error("JWT segment is not a JSON object");return t}function dn(e,t,n={}){const r=n.clockToleranceSec??60,s=n.requireExp??!0;if(!e||!t)throw new un("invalid_token","Missing token or client secret");const i=e.split(".");if(3!==i.length)throw new un("invalid_token","Malformed JWT");const[a,o,c]=i;let u,l;try{u=ln(a),l=ln(o)}catch{throw new un("invalid_token","Unreadable JWT segments")}if("HS256"!==u.alg)throw new un("invalid_algorithm",`Unexpected JWT alg: ${String(u.alg)}`);const d=st(rt(t),rt(`${a}.${o}`));let p;try{p=cn(c)}catch{throw new un("invalid_signature","Unreadable JWT signature")}if(!it(d,p))throw new un("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 un("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 un("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 un("invalid_token","JWT aud claim must be a string or string array")}(l);const h=Math.floor(Date.now()/1e3);if(s&&"number"!=typeof l.exp)throw new un("invalid_token","JWT is missing a numeric exp claim");if("number"==typeof l.exp&&h>l.exp+r)throw new un("token_expired","JWT has expired");if("number"==typeof l.nbf&&h+r<l.nbf)throw new un("token_not_yet_valid","JWT is not yet valid");if(void 0!==n.issuer&&l.iss!==n.issuer)throw new un("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 un("invalid_audience","JWT audience mismatch")}return l}function pn(e){if(!e)return null;const t=/^Bearer\s+(.+)$/i.exec(e.trim());return t?t[1].trim():null}function hn(e){return on(rt(JSON.stringify(e)))}function fn(e,t,n){if(!t)throw new un("invalid_secret","Missing signing secret");const r=Math.floor(Date.now()/1e3),s={iat:r,exp:r+(n?.expiresInSec??3600),...e},i=`${hn({alg:"HS256",typ:"JWT"})}.${hn(s)}`;return`${i}.${on(st(rt(t),rt(i)))}`}function gn(e){const t=pn(e.authorization);if(!t)throw new un("invalid_token","Missing Bearer token");return dn(t,e.clientSecret,{clockToleranceSec:e.clockToleranceSec})}function wn(e){const t=pn(e.authorization);if(!t)throw new un("invalid_token","Missing Bearer token");return dn(t,e.clientSecret,{clockToleranceSec:e.clockToleranceSec})}function yn(e){return{success:!0,token:e.token,message:e.message??"ok",..."number"==typeof e.expiresIn?{expiresIn:e.expiresIn}:{}}}function mn(e){return{success:!1,token:"",message:e}}async function kn(e){let t;try{t=gn(e)}catch(e){return{status:401,body:mn(e instanceof un?e.code:"invalid_token")}}return{status:200,body:yn(await e.mintToken(t))}}async function bn(e){let t;try{t=wn(e)}catch(e){return{status:401,body:{success:!1,message:e instanceof un?e.code:"invalid_token"}}}return await e.onRevoke(t),{status:200,body:{success:!0}}}function vn(e){return e.replace(/[\x00-\x1f\x7f]/g,"").replace(/([\\"])/g,"\\$1")}function Sn(e){const t=[`Bearer resource_metadata="${vn(e.resourceMetadataUrl)}"`];return e.error&&t.push(`error="${vn(e.error)}"`),e.errorDescription&&t.push(`error_description="${vn(e.errorDescription)}"`),{status:401,headers:{"WWW-Authenticate":t.join(", "),"Content-Type":"application/json"},body:JSON.stringify({error:e.error??"invalid_token"})}}const $n=12,Un=16;function En(){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 Pn=new Map;function Cn(e){let t=Pn.get(e);return t||(t=(async()=>{const t=await En().digest("SHA-256",(new TextEncoder).encode(`${e}:bb-session`));return En().importKey("raw",t,{name:"AES-GCM"},!1,["encrypt","decrypt"])})(),Pn.set(e,t)),t}function xn(e){if(!e)throw new Error("createSessionRefCrypto: missing secret");return{async encryptSessionRef(t){const n=globalThis.crypto.getRandomValues(new Uint8Array($n)),r=await Cn(e),s=new Uint8Array(await En().encrypt({name:"AES-GCM",iv:n},r,(new TextEncoder).encode(t))),i=s.subarray(s.length-Un),a=s.subarray(0,s.length-Un),o=new Uint8Array(28+a.length);return o.set(n,0),o.set(i,$n),o.set(a,28),on(o)},async decryptSessionRef(t){try{const n=cn(t);if(n.length<=28)return null;const r=n.slice(0,$n),s=n.subarray($n,28),i=n.subarray(28),a=new Uint8Array(i.length+Un);a.set(i,0),a.set(s,i.length);const o=await Cn(e),c=await En().decrypt({name:"AES-GCM",iv:r},o,a);return(new TextDecoder).decode(c)}catch{return null}}}}async function Tn(e){const{claims:t,secret:n}=e,r=e.expiresInSec??3600,s=t.resource&&t.resource.length?1===t.resource.length?t.resource[0]:t.resource:void 0,i=t.sessionId?await xn(n).encryptSessionRef(t.sessionId):void 0;return{token:fn({sub:t.id,userId:t.id,email:t.email,...t.name?{name:t.name}:{},...t.scope?{scope:t.scope}:{},...s?{aud:s}:{},...i?{sid:i}:{},...e.extraClaims},n,{expiresInSec:r}),expiresIn:r}}function _n(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 In(e){const{secret:t}=e;if(!t)throw new Error("buildbaseAuth: missing secret");const n=xn(t),r=e.resource?Array.isArray(e.resource)?e.resource:[e.resource]:[];let s=e.resourceMetadataUrl;if(!s&&r.length)try{const e=new URL(r[0]),t="/"===e.pathname?"":e.pathname.replace(/\/+$/,"");s=`${e.origin}/.well-known/oauth-protected-resource${t}`}catch{}return{resourceMetadataUrl:s,verify:async s=>{let i;try{i=dn(s,t,{...e.verify})}catch{return null}if(r.length){const t=i.aud?Array.isArray(i.aud)?i.aud:[i.aud]:[];if(!t.length&&e.requireAudience)return _n(t,r,"token carries no aud claim"),null;if(t.length&&!t.some(e=>r.includes(e)))return _n(t,r,"aud does not include this resource"),null}const a="string"==typeof i.sid?await n.decryptSessionRef(i.sid):null,o=Array.isArray(i.scope)?i.scope.filter(e=>"string"==typeof e):"string"==typeof i.scope?i.scope.split(" ").filter(Boolean):void 0;return{sessionId:a??"",userId:"string"==typeof i.userId?i.userId:"string"==typeof i.sub?i.sub:void 0,workspaceId:"string"==typeof i.workspaceId?i.workspaceId:void 0,scopes:o,claims:i}}}}function An(e){const{serverUrl:t,orgId:n,version:r="v1",getSessionId:s,timeout:i,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!==i&&{timeout:i},...void 0!==a&&{maxRetries:a},...void 0!==o&&{debug:o},...c&&{headers:c},...u&&{onError:u},...l&&{fetch:l}},p=e=>{const s={serverUrl:t,version:r,orgId:n,sessionId:e,...d};return{workspace:new C(s),user:new P(s),settings:new E(s),push:new $(s),devices:new S(s),sessions:new U(s)}},h=new C({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)},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,s)=>(await e()).workspace.sendNotification(t,n,r,s)},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 s=await e(),[i,a,o]=await Promise.all([s.workspace.getWorkspace(t),s.settings.getSettings(),s.workspace.getWorkspaceUsers(t)]),c=o.find(e=>("string"==typeof e.user?e.user:e.user._id)===n);return Ye(r,{userId:n,workspaceRole:c?.role??null,workspace:i,settings:a})},resolve:async(t,n)=>{const r=await e(),[s,i,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 Qe({userId:n,workspaceRole:o?.role??null,workspace:s,settings:i})}},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(!s)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 s();if(!e)throw new Error("BuildBase: Not authenticated (getSessionId returned null)");return e})()));return{auth:async()=>{if(!s)return null;const e=await s();return e?{sessionId:e}:null},withSession:e=>{const t=p(e);return f(async()=>t)},client:{forSession:p},...g}}export{bt as AI_BOT_USER_AGENTS,x as ApiVersion,un as AppBridgeError,k as AuthApi,Xe as AuthStatus,N as BBAction,L as BBScreen,J as BBStatus,F as BB_PARAM,m as BaseApi,v as BetaForm,$e as BillingIntervals,An as BuildBase,te as CURRENCY_DISPLAY,ne as CURRENCY_FLAG,xe as CreditBucketSource,Te as CreditBucketStatus,_e as CreditTransactionType,Ge as DEFAULT_ROLE_PERMISSIONS,Ce as DunningState,_ as EventEmitter,Ee as InvoiceStatuses,ie as PLAN_CURRENCY_CODES,ae as PLAN_CURRENCY_OPTIONS,Ze as PUSH_SERVICE_WORKER_SCRIPT,Ke as Permission,$ as PushApi,T as SDKEvent,E as SettingsApi,Pe as SubscriptionItemType,Ue as SubscriptionStatus,P as UserApi,C as WorkspaceApi,mn as appTokenFailure,yn as appTokenSuccess,Sn as bearerChallenge,Jt as buildA2AAgentCard,Tt as buildAgentCard,At as buildAgentSkillsIndex,Dt as buildApiCatalog,Kt as buildAuthMd,nn as buildDiscoveryLinkHeader,Bt as buildDnsAidRecords,Nt as buildLlmsFullTxt,Ft as buildLlmsTxt,zt as buildMcpDiscoveryManifest,qt as buildMcpServerCard,It as buildProtectedResourceMetadata,Qt as buildRobotsTxt,Wt as buildSecurityTxt,Xt as buildSitemap,Ot as buildSkillMd,Lt as buildWebBotAuthDirectory,In as buildbaseAuth,Be as calculateBillableSeats,De as calculateSeatOverageCents,je as calculateTotalSubscriptionCents,q as cleanBBParams,xt as clearAgentReadinessCache,ee as clearAuthIntent,X as consumeAuthIntent,M as createBBUrl,B as createCheckoutRedirectUrls,D as createCreditPurchaseRedirectUrls,xn as createSessionRefCrypto,An as default,I as eventEmitter,pn as extractBearerToken,Pt as fetchAgentReadiness,fe as formatCents,he as formatMinorAmountIntl,we as formatOverageRate,ye as formatOverageRateWithLabel,ke as formatQuotaIncludedOverage,Se as formatQuotaWithPrice,Fe as getAvailableCurrenciesFromPlans,Ae as getBasePriceCents,Je as getBillingIntervalAndCurrencyFromPriceId,le as getCurrencyDecimals,re as getCurrencyFlag,se as getCurrencySymbol,We as getDisplayCurrency,Me as getPerSeatPriceCents,Ie as getPricingVariant,be as getQuotaDisplayValue,Ne as getQuotaDisplayWithVariant,Oe as getQuotaOverageCents,me as getQuotaUnitLabelFromName,Le as getSeatPricing,Re as getStripePriceIdForInterval,bn as handleAppRevokeRequest,kn as handleAppTokenRequest,Ye as hasPermission,R as invalidateCreditBalance,O as invalidateQuotaUsage,W as invalidateSubscription,de as isZeroDecimalCurrency,pe as minorAmountToDisplay,Tn as mintAgentToken,tn as negotiateMarkdown,ct as parseWebhookEvent,an as provideWebMcpTools,j as readBBParams,sn as resolveAgentPath,qe as resolveMaxUsers,Qe as resolvePermissions,rn as resolveWellKnown,H as safeRedirect,Z as saveAuthIntent,$t as sha256Digest,fn as signClientJwt,ze as validateInvite,G as validateRedirectUrl,wn as verifyAppRevokeRequest,gn as verifyAppTokenRequest,dn as verifyClientJwt,ot as verifyWebhookSignature,en as wantsMarkdown};
|
|
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 s(e,t="Request failed"){if(!e.ok){let n=t;try{const t=await r(e);n=t.message||t.error||n}catch{n=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 new Error(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 i 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,i)}}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 s=e instanceof Error?e:new i("string"==typeof e?e:"An unknown error occurred","UNKNOWN_ERROR",r),a=s instanceof i?s:new i(s.message,"SDK_ERROR",r,s);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,y=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),m="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(m);if(this.requireOrgId&&!this.orgId?.trim())throw new Error(m)}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 s=()=>{clearTimeout(i),r(new DOMException("The operation was aborted.","AbortError"))};if(t?.aborted)return s();const i=setTimeout(()=>{t?.removeEventListener("abort",s),n()},e);t?.addEventListener("abort",s,{once:!0})})}async executeFetchUrl(e,t,n){const r=(t.method??"GET").toUpperCase(),s=n??e,i=this.buildHeaders(t),a={...t,headers:i},o=y.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,s=e=>{r.signal.aborted||r.abort(e.reason)};for(const n of[e,t]){if(n.aborted){s(n);break}n.addEventListener("abort",()=>s(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} ${s}`);return this.reportError(e,{method:r,path:s}),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),s=await n(e,a);if(this._debug&&console.log(`[BuildBase] ${r} ${e} → ${s.status}`),401===s.status&&this._onUnauthorized&&this._onUnauthorized(),s.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 s}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:s}),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 s(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 v 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 s=await r(e);if(400===s.status&&(e.trackingConsent||e.trackingIdentity)){const{trackingConsent:t,trackingIdentity:n,...i}=e;s=await r(i)}return s.ok||await this.throwResponseError(s,n),this.unwrapResponse(s,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 b 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 b(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),s=t?.timezone??("undefined"!=typeof Intl&&Intl.DateTimeFormat?Intl.DateTimeFormat().resolvedOptions().timeZone:void 0),i=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:s,currency:i}})}}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 I(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 $=e=>JSON.stringify(e?{workspaceId:e}:{});class P extends k{constructor(e){super(e)}async list(e={},t){const n=await this.fetchJson(`notifications${I({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${I({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:$(e)},"Failed to mark notifications read")}async markSeen(e){await this.fetchJson("notifications/seen",{method:"POST",body:$(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 U 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 T 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 _ 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:{},s=R(r.message)??R(r.error)??n,i={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(s),i)}(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){return this.fetchJson("workspaces",{method:"POST",body:JSON.stringify(e),signal:t},"Failed to create workspace")}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 s(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 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 s=new URLSearchParams;return s.append("limit",t.toString()),n&&s.append("starting_after",n),this.fetchUnwrapped(this.apiPath`workspaces/${e}/subscription/invoices`+`?${s.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 s=r.toString(),i=this.apiPath`workspaces/${e}/subscription/usage/logs`+(s?`?${s}`:"");return this.fetchUnwrapped(i,{signal:n},"Failed to fetch usage logs")}async sendNotification(e,t,n,r,s){const i={event:t};return n&&(i.userId=n),r&&(i.data=r),this.fetchJson(this.apiPath`workspaces/${e}/notifications/send`,{method:"POST",body:JSON.stringify(i),signal:s},"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 s=r.toString(),i=this.apiPath`workspaces/${e}/credits/transactions`+(s?`?${s}`:"");return this.fetchUnwrapped(i,{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 s=r.toString(),i=this.apiPath`workspaces/${e}/credits/buckets`+(s?`?${s}`:"");return this.fetchUnwrapped(i,{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 L;!function(e){e.V1="v1"}(L||(L={}));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 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(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 D,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,V=j("quota-usage").invalidate,z=j("subscription").invalidate,K="bb",H={Checkout:"checkout",Billing:"billing",SelectPlan:"selectPlan",CreditPurchase:"creditPurchase",OpenCreditStore:"openCreditStore",OpenConnectGuide:"openConnectGuide",Invite:"invite"},G={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:H.Checkout,status:G.Success,ws:e,screen:Q.Subscription},n),cancelUrl:Y({action:H.Checkout,status:G.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:H.CreditPurchase,status:G.Success,ws:e,screen:Q.Credits},n),cancelUrl:Y({action:H.CreditPurchase,status:G.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)),s=decodeURIComponent(e.slice(n+1));r&&(t[r]=s)}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,se=re[ne]??(re[ne]=new Set);function ie(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,s="http:"===n.protocol&&("localhost"===n.hostname||"127.0.0.1"===n.hostname||"[::1]"===n.hostname);if(!r&&!s)return null;const{sameOrigin:i,allowedOrigins:a}=t;return i||a?.length?i&&"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=ie(e,n)??ie(t)??"/";return function(e){if("undefined"==typeof window||!window.location||0===se.size)return;let t;try{t=new URL(e,window.location.href).origin}catch{return}if(t!==window.location.origin)for(const e of se)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){ie(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:ie(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"],ye=we.map(e=>({value:e,label:`${e.toUpperCase()} (${ge(e)})`})),me=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"]),ve=new Map;function be(e){const t=(e??"").trim().toLowerCase();if(!t)return 2;if(me.has(t))return 0;if(ke.has(t))return 3;if("isk"===t)return 2;let n=ve.get(t);if(void 0===n){try{n=new Intl.NumberFormat("en-US",{style:"currency",currency:t.toUpperCase()}).resolvedOptions().maximumFractionDigits??2}catch{n=2}ve.set(t,n)}return n}function Se(e){return""!==(e??"").trim()&&0===be(e)}function Ee(e,t){const n=be(t);return 0===n?e.toLocaleString("en-US"):(e/10**n).toFixed(n)}function Ie(e,t,n="en-US"){const r=(t??"").trim(),s=be(r),i=e/10**s;if(!r)return i.toFixed(s);try{return new Intl.NumberFormat(n,{style:"currency",currency:r.toUpperCase(),minimumFractionDigits:s,maximumFractionDigits:s}).format(i)}catch{return ge(r)+(0===s?i.toLocaleString("en-US"):i.toFixed(s))}}function $e(e,t){return ge(t)+Ee(e,t)}const Pe={unit:"unit",units:"units",included:"Included",afterThat:"after that",afterIncluded:"After included",hardLimit:"hard limit"};function Ue(e,t,n,r,s){if(null==e||e<0)return null;const i={...Pe,...r},a=null!=t&&t>=1?t:1,o=ge(n),c=Ee(e,n);return 1===a?`${o}${c}/${i.unit}`:`${o}${c}/${a.toLocaleString(s)} ${i.units}`}function Te(e,t,n,r,s,i,a){if(null==e||e<0)return null;const o={...Pe,...i},c=null!=t&&t>=1?t:1,u=ge(r),l=Ee(e,r);if(n){const e=s??(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 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 _e(e,t,n,r,s,i,a,o,c){const u={...Pe,...a};if(!1===o)return null!=e?`${u.included}: ${e.toLocaleString(c)} (${u.hardLimit})`:a?.hardLimit??"Hard limit";const l=i??(n.endsWith("s")?n:`${n}s`),d=null!=s&&s>=2?`${s.toLocaleString(c)} ${l}`:n;return null!=e&&null!=t?`${u.included}: ${e.toLocaleString(c)}, ${u.afterThat} ${$e(t,r)}/${d}`:null!=e?`${u.included}: ${e.toLocaleString(c)}`:null!=t?`${u.afterIncluded}: ${$e(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:s}=n,i={...xe,...n.labels},a=n.currencySymbol??ge(s??"");if(null==e)return"—";const{included:o,overage:c}=e,u=`${o} ${i.included}`;if(!1===e.allowOverage)return`${u} (${i.hardLimit})`;if(null==c)return u;const l=be(s),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}, ${i.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"},Le={None:"none",Notified:"notified",Warning:"warning",Final:"final",Suspended:"suspended"},Je={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 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 s=r.basePricing[n];return null!=s?s:null}function qe(e,t,n){const r=Be(e,t);if(!r?.stripePrices)return null;const s=n===Re.Monthly?"monthlyPriceId":n===Re.Yearly?"yearlyPriceId":"quarterlyPriceId",i=n===Re.Monthly?"monthly":n===Re.Yearly?"yearly":void 0;return r.stripePrices[s]??(i?r.stripePrices[i]:void 0)??null}function Ve(e,t,n,r){const s=Be(e,t),i=s?.quotaOverages?.[n];if(i)return i[r]}function ze(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 He(e,t,n,r){const s=e.quotas?.[n];if(null==s)return null;const i=s[r];if(!i)return null;const a=Ve(e,t,n,r);return{included:i.included,...void 0!==i.unitSize&&{unitSize:i.unitSize},...void 0!==a&&{overage:a},allowOverage:!1!==s.allowOverage}}function Ge(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 s=Qe(e,t);if(!s)return null;return Xe(r,s.includedSeats)*(Ye(e,t,n)??0)}function et(e,t,n,r){const s=je(e,t,n);if(null===s)return null;if(void 0===r)return s;return s+(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:s=!1}=e;if(s&&!r)return{canInvite:!1,blockReason:"no_subscription",blockMessageKey:"users.subscriptionRequired",blockMessageValues:{}};const{maxUsers:i,source:a}=n;if(i<=0)return{canInvite:!0,blockReason:null,blockMessageKey:null,blockMessageValues:null};if(t>=i){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:i}}}return{canInvite:!0,blockReason:null,blockMessageKey:null,blockMessageValues:null}}const rt={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"},st=Object.values(rt),it={admin:st.filter(e=>e!==rt.WORKSPACE_DELETE),member:[rt.WORKSPACE_SETTINGS_VIEW,rt.WORKSPACE_MEMBERS_VIEW,rt.WORKSPACE_FEATURES_VIEW,rt.WORKSPACE_BILLING_VIEW,rt.WORKSPACE_USAGE_VIEW],viewer:[rt.WORKSPACE_SETTINGS_VIEW,rt.WORKSPACE_MEMBERS_VIEW]};function at(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 ot(e){const{userId:t,workspace:n,settings:r,appPermissions:s}=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(s)for(const t of at(s))e.add(t);if(n.permissions)for(const t of at(n.permissions))e.add(t);if(r?.workspace?.permissions)for(const t of at(r.workspace.permissions))e.add(t);return e}const i=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);if(!i)return new Set;const a=n.permissions,o=r?.workspace?.permissions,c=e=>e.filter(e=>e.startsWith("workspace:")),u=e=>e.filter(e=>!e.startsWith("workspace:")),l=!!a&&i in a,d=!!o&&i in o,p=i in it;let h;if(l)h=c(a[i]);else if(d)h=c(o[i]);else if(p)h=it[i];else{const e=r?.workspace?.defaultRole;h=e&&e in it?it[e]:[]}const f=new Set(h),g=l?u(a[i]):[],w=s?.[i]?u(s[i]):[],y=l?g:w;for(const e of y)f.add(e);return function(e,t,n){if(!n?.workspace)return;const{canInviteMembers:r}=n.workspace;(!1===r||"admin-only"===r&&"admin"!==t)&&e.delete(rt.WORKSPACE_MEMBERS_INVITE)}(f,i,r),f}function ct(e,t){const n=ot(t);return Array.isArray(e)?e.every(e=>n.has(e)):n.has(e)}const ut="\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 lt;function dt(e){if(!e)return 0;const t=new Date(e).getTime();return Number.isNaN(t)?0:t}function pt(e){const t=e=>"invited"===e.status?0:1;return[...e].sort((e,n)=>t(e)-t(n)||dt(n.invitedAt)-dt(e.invitedAt))}function ht(e,t=new Date){return"invited"===e.status&&(null===e.validTill||void 0===e.validTill||dt(e.validTill)>t.getTime())}function ft(e,t=new Date){return pt(e.filter(e=>ht(e,t)))}function gt(e,t=new Date){return"expired"===e.status||"invited"===e.status&&!ht(e,t)}function wt(e){return"object"==typeof e.workspace&&e.workspace&&e.workspace.name||""}function yt(e){return"object"==typeof e.workspace&&e.workspace?e.workspace._id:e.workspace}function mt(e){const t=e.invitedBy;return t&&"string"!=typeof t&&(t.name||t.email)||null}function kt(e,t=new Date){const n=dt(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"}(lt||(lt={}));const vt="saas-pending-invite",bt=/^[0-9a-f]{64}$/;function St(e){return"object"==typeof e&&null!==e&&"string"==typeof e.token&&"string"==typeof e.orgId&&"number"==typeof e.createdAt}function Et(e,t){bt.test(e)&&t&&d(vt,{token:e,orgId:t,createdAt:Date.now()})}function It(e,t=Date.now()){const n=l(vt,St);return n?t-n.createdAt>864e5?(u(vt),null):n.orgId!==e?null:bt.test(n.token)?n.token:(u(vt),null):null}function $t(){u(vt)}const Pt=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]),Ut=(e,t)=>e>>>t|e<<32-t;function Tt(e){let t=1779033703,n=3144134277,r=1013904242,s=2773480762,i=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=Ut(w[e-15],7)^Ut(w[e-15],18)^w[e-15]>>>3,n=Ut(w[e-2],17)^Ut(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=s,f=i,g=a,y=o,m=c;for(let e=0;e<64;e++){const t=m+(Ut(f,6)^Ut(f,11)^Ut(f,25))+(f&g^~f&y)+Pt[e]+w[e]>>>0,n=u&l^u&d^l&d;m=y,y=g,g=f,f=h+t>>>0,h=d,d=l,l=u,u=t+((Ut(u,2)^Ut(u,13)^Ut(u,22))+n>>>0)>>>0}t=t+u>>>0,n=n+l>>>0,r=r+d>>>0,s=s+h>>>0,i=i+f>>>0,a=a+g>>>0,o=o+y>>>0,c=c+m>>>0}const y=new Uint8Array(32),m=[t,n,r,s,i,a,o,c];for(let e=0;e<8;e++)y[4*e]=m[e]>>>24&255,y[4*e+1]=m[e]>>>16&255,y[4*e+2]=m[e]>>>8&255,y[4*e+3]=255&m[e];return y}function At(e){return(new TextEncoder).encode(e)}function _t(e,t){let n=e;n.length>64&&(n=Tt(n));const r=new Uint8Array(64),s=new Uint8Array(64);for(let e=0;e<64;e++){const t=e<n.length?n[e]:0;r[e]=54^t,s[e]=92^t}const i=Tt(xt(r,t));return Tt(xt(s,i))}function Ct(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 xt(e,t){const n=new Uint8Array(e.length+t.length);return n.set(e,0),n.set(t,e.length),n}function Ot(e){const{body:t,signature:n,timestamp:r,secret:s,maxAgeSeconds:i=300}=e;if(!(n&&r&&s&&t))return!1;const a="sha256=";if(!n.startsWith(a))return!1;const o=n.slice(7);if(i>0){const e=parseInt(r,10);if(isNaN(e))return!1;if(Math.abs(Math.floor(Date.now()/1e3)-e)>i)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=_t(At(s),At(`${r}.${t}`));return c.length===u.length&&Ct(c,u)}function Rt(e){if(!Ot(e))return null;try{return JSON.parse(e.body)}catch{return null}}const Nt=300,Ft="/.well-known/oauth-protected-resource",Wt="/.well-known/agent-skills",Lt="/.well-known/api-catalog",Jt="/.well-known/mcp/server-card.json",Dt="/.well-known/agent-card.json",Mt="application/json",Bt="application/linkset+json",jt="text/markdown; charset=utf-8",qt="text/plain; charset=utf-8",Vt="application/xml; charset=utf-8",zt=["GPTBot","OAI-SearchBot","ChatGPT-User","ClaudeBot","Claude-User","Claude-SearchBot","PerplexityBot","Perplexity-User","Google-Extended","Applebot-Extended","CCBot","Bytespider","meta-externalagent","Amazonbot"];function Kt(e){return e.replace(/\/+$/,"")}function Ht(e){return`public, max-age=${e}, s-maxage=${e}`}function Gt(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}(Tt(At(e)))}const Qt=new Map;async function Yt(e,t,n,r){if(!r||r<=0)return e(t,n);const s=new AbortController,i=setTimeout(()=>s.abort(),r);try{return await e(t,{...n,signal:s.signal})}finally{clearTimeout(i)}}async function Xt(e){const t=e.cacheTtlSeconds??Nt,n=`${Kt(e.serverUrl)}::${e.orgId}`,r=Qt.get(n);if(r&&r.expiresAt>Date.now())return r.value;const s=e.fetch??fetch,i=`${Kt(e.serverUrl)}/api/v1/public/${e.orgId}/agent-readiness`;let a={enabled:!1};try{const t=await Yt(s,i,{headers:{Accept:Mt}},e.fetchTimeoutMs??5e3);if(t.ok){const e=await t.json();e&&"object"==typeof e&&(a=e)}}catch{}return Qt.set(n,{value:a,expiresAt:Date.now()+1e3*t}),a}const Zt=new Map;function en(){Qt.clear(),Zt.clear()}function tn(e,t){const n=Kt(e.siteUrl),r={llms_txt:"/llms.txt",sitemap:"/sitemap.xml",robots:"/robots.txt",oauth_protected_resource:Ft};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=`${Wt}/index.json`),e.apiCatalog?.length&&(r.api_catalog=Lt),e.mcpServerCard&&(r.mcp_server_card=Jt),!1!==e.a2aCard&&(r.a2a_agent_card=Dt),e.llmsFullTxt&&(r.llms_full_txt="/llms-full.txt");return vn({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 nn(e){let t="/";try{t=new URL(e).pathname}catch{t=e.startsWith("/")?e:`/${e}`}const n="/"===t?"":t.replace(/\/+$/,"");return Ft+n}function rn(e,t,n){const r=t.protectedResources??[];if(!r.length)return null;const s=e.replace(/\/+$/,"")||Ft,i=n??`${Kt(t.serverUrl)}/org/${t.orgId}`,a=t.scopes?.map(e=>e.name),o=r.map(e=>{const n=e.resource??Kt(t.siteUrl),r=e.scopes??a;return{path:nn(n),metadata:{resource:n,authorization_servers:[i],bearer_methods_supported:e.bearerMethods??["header"],...r?.length?{scopes_supported:r}:{},...e.documentationUrl?{resource_documentation:e.documentationUrl}:{}}}}),c=o.find(e=>e.path===s);return c?vn(c.metadata,t):s===Ft&&1===o.length?vn(o[0].metadata,t):null}function sn(e){const t=e.skills??[];if(!t.length)return null;const n=Kt(e.siteUrl);return vn({$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}${an(e)}`,digest:Gt(e.content)}))},e)}function an(e){return e.path??`${Wt}/${e.name}/SKILL.md`}function on(e,t){const n=(t.skills??[]).find(t=>an(t)===e);return n?{status:200,contentType:"text/markdown; charset=utf-8",body:n.content,cacheControl:Ht(t.cacheTtlSeconds??Nt)}:null}function cn(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:qt,body:t.join("\n")+"\n",cacheControl:Ht(e.cacheTtlSeconds??Nt)}}function un(e){return e.llmsTxt?{status:200,contentType:qt,body:e.llmsTxt,cacheControl:Ht(e.cacheTtlSeconds??Nt)}:null}function ln(e){return e.llmsFullTxt?{status:200,contentType:qt,body:e.llmsFullTxt,cacheControl:Ht(e.cacheTtlSeconds??Nt)}:null}function dn(e){if(!1===e.a2aCard)return null;const t=e.a2aCard??{},n=Kt(e.siteUrl),r=t.serviceUrl??n,s=t.transportProtocol??"http",i=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 vn({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:s,supportedInterfaces:[{serviceUrl:r,transportProtocol:s}],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:i,...e.site.documentationUrl?{documentationUrl:e.site.documentationUrl}:{}},e)}function pn(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:Ht(e.cacheTtlSeconds??Nt)}:null}function hn(e){return e.endsWith(".json")||e.includes(".well-known/")?Mt:e.endsWith(".md")?jt:e.endsWith(".xml")?Vt:qt}function fn(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 gn(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:Bt,body:JSON.stringify({linkset:n},null,2),cacheControl:Ht(e.cacheTtlSeconds??Nt)}}function wn(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 yn(e){const t=e.mcpServerCard;return t?vn({$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:wn(t.capabilities),...t.documentationUrl?{documentation_url:t.documentationUrl}:{}},e):null}function mn(e){const t=e.mcpServerCard;if(!t)return null;const n=Kt(e.siteUrl);let r;try{r={type:"oauth2",protected_resource_metadata:`${new URL(t.endpoint).origin}${nn(t.endpoint)}`}}catch{}return vn({$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:wn(t.capabilities),...t.documentationUrl?{documentation_url:t.documentationUrl}:{},server_card:`${n}${Jt}`,...r?{authentication:r}:{}}]},e)}function kn(e,t){const n=Ht(e.cacheTtlSeconds??Nt);if(e.authMd)return{status:200,contentType:jt,body:e.authMd,cacheControl:n};const r=t.authorizationServer;if(!r)return null;const s=`# 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:jt,body:s,cacheControl:n}}function vn(e,t){return{status:200,contentType:Mt,body:JSON.stringify(e,null,2),cacheControl:Ht(t.cacheTtlSeconds??Nt)}}function bn(e){return String(e).replace(/[\x00-\x1f\x7f]/g,"")}function Sn(e,t){const n=(Array.isArray(e.userAgent)?e.userAgent:[e.userAgent]).map(e=>`User-agent: ${bn(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: ${bn(t)}`);for(const t of e.disallow??[])n.push(`Disallow: ${bn(t)}`);return void 0!==e.crawlDelay&&n.push(`Crawl-delay: ${bn(e.crawlDelay)}`),n.join("\n")}function En(e){const t=e.robots??{},n=Kt(e.siteUrl),r=t.policies??[{userAgent:"*",allow:["/"]}],s=t.aiBots??"allow",i="allow"===s?[{userAgent:[...zt],allow:["/"]}]:"deny"===s?[{userAgent:[...zt],disallow:["/"]}]:s,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)=>Sn(e,0===n?t.contentSignals:void 0)),...i.map(e=>Sn(e)),...a.length?[a.map(e=>`Sitemap: ${bn(e)}`).join("\n")]:[]];return{status:200,contentType:qt,body:o.join("\n\n")+"\n",cacheControl:Ht(e.cacheTtlSeconds??Nt)}}function In(e){const t="number"==typeof e&&Number.isFinite(e)?e:.5;return String(Math.min(1,Math.max(0,t)))}function $n(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function Pn(e){const t=e.sitemap?.urls;if(!t?.length)return null;const n=Kt(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>${$n(/^https?:\/\//.test(t.loc)?t.loc:`${n}${t.loc.startsWith("/")?"":"/"}${t.loc}`)}</loc>`,...t.lastmod?[` <lastmod>${$n(t.lastmod)}</lastmod>`]:[],...t.changefreq?[` <changefreq>${$n(String(t.changefreq))}</changefreq>`]:[],...void 0!==t.priority?[` <priority>${In(t.priority)}</priority>`]:[]].join("\n")}\n </url>`}).join("\n")+"\n</urlset>\n";return{status:200,contentType:Vt,body:r,cacheControl:Ht(e.cacheTtlSeconds??Nt)}}function Un(e){if(!e)return!1;let t=0,n=0;for(const r of e.split(",")){const[e,...s]=r.trim().split(";"),i=e.trim().toLowerCase();let a=1;for(const e of s){const[t,n]=e.split("=").map(e=>e.trim());if("q"===t){const e=Number(n);Number.isNaN(e)||(a=e)}}"text/markdown"===i||"text/x-markdown"===i?t=Math.max(t,a):"text/html"!==i&&"text/*"!==i&&"*/*"!==i||(n=Math.max(n,a))}return t>0&&t>=n}function Tn(e,t,n){const r=Un(e);return{status:200,contentType:r?jt:"text/html; charset=utf-8",body:r?t.markdown:t.html,cacheControl:Ht(n?.cacheTtlSeconds??Nt),vary:"Accept"}}function An(e){const t=Kt(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}${Dt}>; 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}${Lt}>; rel="api-catalog"; type="${Bt}"`),e.mcpServerCard&&n.push(`<${t}${Jt}>; rel="mcp-server"; type="application/json"`),n.join(", ")}async function _n(e,t){const n=e.replace(/\/+$/,"")||e;if("/.well-known/agent.json"===n){return tn(t,await Xt(t))}if(n===Dt)return dn(t);if("/.well-known/http-message-signatures-directory"===n)return pn(t);if("/.well-known/security.txt"===n)return cn(t);if(n===`${Wt}/index.json`)return sn(t);if(n.startsWith(`${Wt}/`)&&n.endsWith("SKILL.md"))return on(n,t);if("/.well-known/oauth-authorization-server"===n||"/.well-known/openid-configuration"===n){const e=(await Xt(t)).authorizationServer;if(!e?.metadataUrl)return null;const n=await async function(e,t){const n=t.cacheTtlSeconds??Nt,r=Zt.get(e);if(r&&r.expiresAt>Date.now())return r.value;const s=t.fetch??fetch;let i=null;try{const n=await Yt(s,e,{headers:{Accept:Mt}},t.fetchTimeoutMs??5e3);if(n.ok){const e=await n.json();e&&"object"==typeof e&&(i=e)}}catch{}return Zt.set(e,{value:i,expiresAt:Date.now()+1e3*n}),i}(e.metadataUrl,t);return vn(n?n:{...e.issuer?{issuer:e.issuer}:{},oauth_authorization_server_metadata:e.metadataUrl},t)}if(n===Lt)return gn(t);if(n===Jt)return yn(t);if("/.well-known/mcp.json"===n)return mn(t);if(n.startsWith(Ft)){const e=await Xt(t);return rn(n,t,e.authorizationServer?.issuer)}return null}async function Cn(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??hn(e),body:r.body,cacheControl:r.cacheControl??Ht(t.cacheTtlSeconds??Nt)}}(n,t);return r||("/robots.txt"===n?En(t):"/llms-full.txt"===n?ln(t):"/sitemap.xml"===n?Pn(t):"/llms.txt"===n?un(t):"/auth.md"===n?kn(t,await Xt(t)):"/security.txt"===n?cn(t):n.startsWith("/.well-known")?_n(n,t):null)}function xn(e){const t=globalThis.navigator;return!!t?.modelContext?.provideContext&&(t.modelContext.provideContext({tools:e}),!0)}function On(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 Rn(e){const t=e.replace(/-/g,"+").replace(/_/g,"/"),n=t.length%4==0?"":"=".repeat(4-t.length%4),r=atob(t+n),s=new Uint8Array(r.length);for(let e=0;e<r.length;e++)s[e]=r.charCodeAt(e);return s}class Nn extends Error{constructor(e,t){super(t),this.name="AppBridgeError",this.code=e}}function Fn(e){const t=JSON.parse((new TextDecoder).decode(Rn(e)));if("object"!=typeof t||null===t||Array.isArray(t))throw new Error("JWT segment is not a JSON object");return t}function Wn(e,t,n={}){const r=n.clockToleranceSec??60,s=n.requireExp??!0;if(!e||!t)throw new Nn("invalid_token","Missing token or client secret");const i=e.split(".");if(3!==i.length)throw new Nn("invalid_token","Malformed JWT");const[a,o,c]=i;let u,l;try{u=Fn(a),l=Fn(o)}catch{throw new Nn("invalid_token","Unreadable JWT segments")}if("HS256"!==u.alg)throw new Nn("invalid_algorithm",`Unexpected JWT alg: ${String(u.alg)}`);const d=_t(At(t),At(`${a}.${o}`));let p;try{p=Rn(c)}catch{throw new Nn("invalid_signature","Unreadable JWT signature")}if(!Ct(d,p))throw new Nn("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 Nn("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 Nn("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 Nn("invalid_token","JWT aud claim must be a string or string array")}(l);const h=Math.floor(Date.now()/1e3);if(s&&"number"!=typeof l.exp)throw new Nn("invalid_token","JWT is missing a numeric exp claim");if("number"==typeof l.exp&&h>l.exp+r)throw new Nn("token_expired","JWT has expired");if("number"==typeof l.nbf&&h+r<l.nbf)throw new Nn("token_not_yet_valid","JWT is not yet valid");if(void 0!==n.issuer&&l.iss!==n.issuer)throw new Nn("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 Nn("invalid_audience","JWT audience mismatch")}return l}function Ln(e){if(!e)return null;const t=/^Bearer\s+(.+)$/i.exec(e.trim());return t?t[1].trim():null}function Jn(e){return On(At(JSON.stringify(e)))}function Dn(e,t,n){if(!t)throw new Nn("invalid_secret","Missing signing secret");const r=Math.floor(Date.now()/1e3),s={iat:r,exp:r+(n?.expiresInSec??3600),...e},i=`${Jn({alg:"HS256",typ:"JWT"})}.${Jn(s)}`;return`${i}.${On(_t(At(t),At(i)))}`}function Mn(e){const t=Ln(e.authorization);if(!t)throw new Nn("invalid_token","Missing Bearer token");return Wn(t,e.clientSecret,{clockToleranceSec:e.clockToleranceSec})}function Bn(e){const t=Ln(e.authorization);if(!t)throw new Nn("invalid_token","Missing Bearer token");return Wn(t,e.clientSecret,{clockToleranceSec:e.clockToleranceSec})}function jn(e){return{success:!0,token:e.token,message:e.message??"ok",..."number"==typeof e.expiresIn?{expiresIn:e.expiresIn}:{}}}function qn(e){return{success:!1,token:"",message:e}}async function Vn(e){let t;try{t=Mn(e)}catch(e){return{status:401,body:qn(e instanceof Nn?e.code:"invalid_token")}}return{status:200,body:jn(await e.mintToken(t))}}async function zn(e){let t;try{t=Bn(e)}catch(e){return{status:401,body:{success:!1,message:e instanceof Nn?e.code:"invalid_token"}}}return await e.onRevoke(t),{status:200,body:{success:!0}}}function Kn(e){return e.replace(/[\x00-\x1f\x7f]/g,"").replace(/([\\"])/g,"\\$1")}function Hn(e){const t=[`Bearer resource_metadata="${Kn(e.resourceMetadataUrl)}"`];return e.error&&t.push(`error="${Kn(e.error)}"`),e.errorDescription&&t.push(`error_description="${Kn(e.errorDescription)}"`),{status:401,headers:{"WWW-Authenticate":t.join(", "),"Content-Type":"application/json"},body:JSON.stringify({error:e.error??"invalid_token"})}}const Gn=12,Qn=16;function Yn(){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 Xn=new Map;function Zn(e){let t=Xn.get(e);return t||(t=(async()=>{const t=await Yn().digest("SHA-256",(new TextEncoder).encode(`${e}:bb-session`));return Yn().importKey("raw",t,{name:"AES-GCM"},!1,["encrypt","decrypt"])})(),Xn.set(e,t)),t}function er(e){if(!e)throw new Error("createSessionRefCrypto: missing secret");return{async encryptSessionRef(t){const n=globalThis.crypto.getRandomValues(new Uint8Array(Gn)),r=await Zn(e),s=new Uint8Array(await Yn().encrypt({name:"AES-GCM",iv:n},r,(new TextEncoder).encode(t))),i=s.subarray(s.length-Qn),a=s.subarray(0,s.length-Qn),o=new Uint8Array(28+a.length);return o.set(n,0),o.set(i,Gn),o.set(a,28),On(o)},async decryptSessionRef(t){try{const n=Rn(t);if(n.length<=28)return null;const r=n.slice(0,Gn),s=n.subarray(Gn,28),i=n.subarray(28),a=new Uint8Array(i.length+Qn);a.set(i,0),a.set(s,i.length);const o=await Zn(e),c=await Yn().decrypt({name:"AES-GCM",iv:r},o,a);return(new TextDecoder).decode(c)}catch{return null}}}}async function tr(e){const{claims:t,secret:n}=e,r=e.expiresInSec??3600,s=t.resource&&t.resource.length?1===t.resource.length?t.resource[0]:t.resource:void 0,i=t.sessionId?await er(n).encryptSessionRef(t.sessionId):void 0;return{token:Dn({sub:t.id,userId:t.id,email:t.email,...t.name?{name:t.name}:{},...t.scope?{scope:t.scope}:{},...s?{aud:s}:{},...i?{sid:i}:{},...e.extraClaims},n,{expiresInSec:r}),expiresIn:r}}function nr(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 rr(e){const{secret:t}=e;if(!t)throw new Error("buildbaseAuth: missing secret");const n=er(t),r=e.resource?Array.isArray(e.resource)?e.resource:[e.resource]:[];let s=e.resourceMetadataUrl;if(!s&&r.length)try{const e=new URL(r[0]),t="/"===e.pathname?"":e.pathname.replace(/\/+$/,"");s=`${e.origin}/.well-known/oauth-protected-resource${t}`}catch{}return{resourceMetadataUrl:s,verify:async s=>{let i;try{i=Wn(s,t,{...e.verify})}catch{return null}if(r.length){const t=i.aud?Array.isArray(i.aud)?i.aud:[i.aud]:[];if(!t.length&&e.requireAudience)return nr(t,r,"token carries no aud claim"),null;if(t.length&&!t.some(e=>r.includes(e)))return nr(t,r,"aud does not include this resource"),null}const a="string"==typeof i.sid?await n.decryptSessionRef(i.sid):null,o=Array.isArray(i.scope)?i.scope.filter(e=>"string"==typeof e):"string"==typeof i.scope?i.scope.split(" ").filter(Boolean):void 0;return{sessionId:a??"",userId:"string"==typeof i.userId?i.userId:"string"==typeof i.sub?i.sub:void 0,workspaceId:"string"==typeof i.workspaceId?i.workspaceId:void 0,scopes:o,claims:i}}}}function sr(e){const{serverUrl:t,orgId:n,version:r="v1",getSessionId:s,timeout:i,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!==i&&{timeout:i},...void 0!==a&&{maxRetries:a},...void 0!==o&&{debug:o},...c&&{headers:c},...u&&{onError:u},...l&&{fetch:l}},p=e=>{const s={serverUrl:t,version:r,orgId:n,sessionId:e,...d};return{workspace:new W(s),user:new _(s),settings:new A(s),push:new U(s),devices:new E(s),sessions:new T(s)}},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)},invitations:{list:async t=>(await e()).workspace.listInvitations(t),create:async(t,n,r,s)=>(await e()).workspace.inviteMember(t,{email:n,role:r,landingUrl:s}),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,s)=>(await e()).workspace.sendNotification(t,n,r,s)},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 s=await e(),[i,a,o]=await Promise.all([s.workspace.getWorkspace(t),s.settings.getSettings(),s.workspace.getWorkspaceUsers(t)]),c=o.find(e=>("string"==typeof e.user?e.user:e.user._id)===n);return ct(r,{userId:n,workspaceRole:c?.role??null,workspace:i,settings:a})},resolve:async(t,n)=>{const r=await e(),[s,i,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 ot({userId:n,workspaceRole:o?.role??null,workspace:s,settings:i})}},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(!s)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 s();if(!e)throw new Error("BuildBase: Not authenticated (getSessionId returned null)");return e})()));return{auth:async()=>{if(!s)return null;const e=await s();return e?{sessionId:e}:null},withSession:e=>{const t=p(e);return f(async()=>t)},client:{forSession:p},...g}}export{zt as AI_BOT_USER_AGENTS,L as ApiVersion,Nn as AppBridgeError,v as AuthApi,lt as AuthStatus,H as BBAction,Q as BBScreen,G as BBStatus,K as BB_PARAM,k as BaseApi,S as BetaForm,Re as BillingIntervals,sr as BuildBase,pe as CURRENCY_DISPLAY,he as CURRENCY_FLAG,Je as CreditBucketSource,De as CreditBucketStatus,Me as CreditTransactionType,it as DEFAULT_ROLE_PERMISSIONS,Le as DunningState,D as EventEmitter,C as INVITATION_ERROR_CODE,Fe as InvoiceStatuses,P as NotificationsApi,we as PLAN_CURRENCY_CODES,ye as PLAN_CURRENCY_OPTIONS,ut as PUSH_SERVICE_WORKER_SCRIPT,rt as Permission,U as PushApi,J as SDKEvent,A as SettingsApi,We as SubscriptionItemType,Ne as SubscriptionStatus,_ as UserApi,W as WorkspaceApi,ft as actionableInvitations,qn as appTokenFailure,jn as appTokenSuccess,Hn as bearerChallenge,dn as buildA2AAgentCard,tn as buildAgentCard,sn as buildAgentSkillsIndex,gn as buildApiCatalog,kn as buildAuthMd,An as buildDiscoveryLinkHeader,fn as buildDnsAidRecords,ln as buildLlmsFullTxt,un as buildLlmsTxt,mn as buildMcpDiscoveryManifest,yn as buildMcpServerCard,rn as buildProtectedResourceMetadata,En as buildRobotsTxt,cn as buildSecurityTxt,Pn as buildSitemap,on as buildSkillMd,pn as buildWebBotAuthDirectory,rr as buildbaseAuth,Xe as calculateBillableSeats,Ze as calculateSeatOverageCents,et as calculateTotalSubscriptionCents,te as cleanBBParams,en as clearAgentReadinessCache,de as clearAuthIntent,$t as clearPendingInvite,le as consumeAuthIntent,Y as createBBUrl,X as createCheckoutRedirectUrls,Z as createCreditPurchaseRedirectUrls,er as createSessionRefCrypto,sr as default,M as eventEmitter,Ln as extractBearerToken,Xt as fetchAgentReadiness,$e as formatCents,Ie as formatMinorAmountIntl,Ue as formatOverageRate,Te as formatOverageRateWithLabel,_e as formatQuotaIncludedOverage,Oe as formatQuotaWithPrice,Ke as getAvailableCurrenciesFromPlans,je as getBasePriceCents,Ge as getBillingIntervalAndCurrencyFromPriceId,be as getCurrencyDecimals,fe as getCurrencyFlag,ge as getCurrencySymbol,ze as getDisplayCurrency,Ye as getPerSeatPriceCents,Be as getPricingVariant,Ce as getQuotaDisplayValue,He as getQuotaDisplayWithVariant,Ve as getQuotaOverageCents,Ae as getQuotaUnitLabelFromName,Qe as getSeatPricing,qe as getStripePriceIdForInterval,zn as handleAppRevokeRequest,Vn as handleAppTokenRequest,ct as hasPermission,q as invalidateCreditBalance,V as invalidateQuotaUsage,z as invalidateSubscription,mt as inviterNameOf,ht as isInvitationActionable,F as isInvitationError,gt as isInvitationLapsed,Se as isZeroDecimalCurrency,Ee as minorAmountToDisplay,tr as mintAgentToken,Tn as negotiateMarkdown,Et as parkPendingInvite,Rt as parseWebhookEvent,xn as provideWebMcpTools,ee as readBBParams,It as readPendingInvite,kt as resendCooldownSeconds,Cn as resolveAgentPath,tt as resolveMaxUsers,ot as resolvePermissions,_n as resolveWellKnown,ae as safeRedirect,ue as saveAuthIntent,Gt as sha256Digest,Dn as signClientJwt,pt as sortInvitations,nt as validateInvite,ie as validateRedirectUrl,Bn as verifyAppRevokeRequest,Mn as verifyAppTokenRequest,Wn as verifyClientJwt,Ot as verifyWebhookSignature,Un as wantsMarkdown,yt as workspaceIdOf,wt as workspaceNameOf};
|