@buildbase/sdk 0.0.60 → 0.0.62
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/CHANGELOG.md +32 -0
- package/README.md +95 -0
- package/dist/css/styles.css +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +84 -0
- package/dist/index.mjs +1 -1
- package/dist/mcp/index.cjs +1 -1
- package/dist/mcp/index.d.ts +23 -0
- package/dist/mcp/index.mjs +1 -1
- package/dist/react/chunks/SettingsDialog-CKwldz7y.mjs +2 -0
- package/dist/react/chunks/{SettingsDialog-DzcwBYsg.cjs → SettingsDialog-D4FCwpN7.cjs} +1 -1
- package/dist/react/chunks/SubscriptionDialog-DJmrU0r1.cjs +2 -0
- package/dist/react/chunks/SubscriptionDialog-DoWnS_JD.mjs +2 -0
- package/dist/react/chunks/react-Be1VMiVO.mjs +2 -0
- package/dist/react/chunks/react-ClieHJPH.cjs +2 -0
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.d.ts +186 -26
- package/dist/react/index.mjs +1 -1
- package/dist/tracking/index.cjs +2 -0
- package/dist/tracking/index.d.ts +657 -0
- package/dist/tracking/index.mjs +2 -0
- package/package.json +12 -2
- package/dist/react/chunks/SettingsDialog-4yk6t4tT.mjs +0 -2
- package/dist/react/chunks/SubscriptionDialog-COw79gAi.cjs +0 -2
- package/dist/react/chunks/SubscriptionDialog-DLM_WA84.mjs +0 -2
- package/dist/react/chunks/react-D6q1fjoE.cjs +0 -2
- package/dist/react/chunks/react-DX2YGh4O.mjs +0 -2
- /package/dist/react/chunks/{ar-DHxjPtfZ.mjs → ar-CHTRXlXt.mjs} +0 -0
- /package/dist/react/chunks/{ar-D7uaSur2.cjs → ar-DPJVNHJV.cjs} +0 -0
- /package/dist/react/chunks/{de-D_xfGk1N.mjs → de-CdPeKWZ2.mjs} +0 -0
- /package/dist/react/chunks/{de-CBzx6NJq.cjs → de-DPd09yf-.cjs} +0 -0
- /package/dist/react/chunks/{es-D4-Dv2t5.mjs → es-BWGnjJKJ.mjs} +0 -0
- /package/dist/react/chunks/{es-WVRwuj-e.cjs → es-WdOYGt6G.cjs} +0 -0
- /package/dist/react/chunks/{fr-DurP7qkZ.mjs → fr-Big5DFPB.mjs} +0 -0
- /package/dist/react/chunks/{fr-CEpK52jT.cjs → fr-LIbCvYeh.cjs} +0 -0
- /package/dist/react/chunks/{hi-CVqVRSoy.cjs → hi-BoCY3pFe.cjs} +0 -0
- /package/dist/react/chunks/{hi-7roM83DB.mjs → hi-jArNRknR.mjs} +0 -0
- /package/dist/react/chunks/{ja-DT8x4SW1.mjs → ja-Cwdz0hCu.mjs} +0 -0
- /package/dist/react/chunks/{ja-BrDXec_v.cjs → ja-E0jqCiVq.cjs} +0 -0
- /package/dist/react/chunks/{zh-CH1Z55Je.mjs → zh-glRKcdia.mjs} +0 -0
- /package/dist/react/chunks/{zh-CdCzcD53.cjs → zh-tU-AqFYI.cjs} +0 -0
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)}async function n(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 r(e,t="Request failed"){if(!e.ok){let r=t;try{const t=await n(e);r=t.message||t.error||r}catch{r=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(r)}try{return await n(e)}catch(e){if(e instanceof Error&&e.message.includes("Invalid JSON"))throw e;throw new Error("Failed to parse response as JSON")}}class s extends Error{constructor(e,t,n,r){super(e),this.code=t,this.context=n,this.originalError=r,this.name="SDKError","undefined"!=typeof Error&&"captureStackTrace"in Error&&Error.captureStackTrace(this,s)}}const i=new class{constructor(){this.config={enableConsoleLogging:!0,showUserNotifications:!1}}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,n={}){if(function(e){return e instanceof Error&&("AbortError"===e.name||"ERR_CANCELED"===e.code)}(e))return;const r=e instanceof Error?e:new s("string"==typeof e?e:"An unknown error occurred","UNKNOWN_ERROR",n),i=r instanceof s?r:new s(r.message,"SDK_ERROR",n,r);if(this.config.enableConsoleLogging&&t(`[SDK Error] ${n.component||"Unknown"}:`,{message:i.message,code:i.code,context:i.context,originalError:i.originalError,stack:i.stack}),this.config.onError)try{this.config.onError(i,n)}catch(e){!function(e,...t){console.error(e,...t)}("[SDK Error Handler] Error in custom error callback:",e)}this.config.showUserNotifications&&this.notifyUser(i,n)}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 a(e,t={}){i.handleError(e,t)}function o(e){if("undefined"==typeof window)return null;try{return localStorage.getItem(e)}catch(t){return a(t,{component:"storage",action:"getStorageItem",metadata:{key:e}}),null}}function c(e){if("undefined"!=typeof window)try{localStorage.removeItem(e)}catch(t){a(t,{component:"storage",action:"removeStorageItem",metadata:{key:e}})}}function u(e,t){try{!function(e,t){if("undefined"!=typeof window)try{localStorage.setItem(e,t)}catch(t){a(t,{component:"storage",action:"setStorageItem",metadata:{key:e}})}}(e,JSON.stringify(t))}catch(t){a(t,{component:"storage",action:"setStorageJSON",metadata:{key:e}})}}const l="saas-session-id",d="saas-device-id";function p(){return function(){if("undefined"==typeof window)return null;try{return o(l)}catch(e){return a(e,{component:"auth-utils",action:"getSessionId",metadata:{key:l}}),null}}()}function h(){const e=p(),t={};e&&(t["x-session-id"]=e);const n=function(){if("undefined"==typeof window)return null;try{return o(d)??null}catch(e){return a(e,{component:"auth-utils",action:"getOrCreateDeviceId",metadata:{key:d}}),null}}();return n&&(t["x-device-id"]=n),t}const f=new WeakSet,g=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),w="SDK is not ready (missing serverUrl, version, or orgId)";class y{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(w);if(this.requireOrgId&&!this.orgId?.trim())throw new Error(w)}get baseUrl(){return this.ensureReady(),`${this.serverUrl}/api/${this.version}/${this.basePath}`}getAuthHeaders(){return this._sessionId?{"x-session-id":this._sessionId}:h()}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){f.has(e)||(f.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=g.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 y.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 y.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 s=await this.executeFetch(e,t);return await r(s,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 new Error(n)}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 m extends y{constructor(e){super(e)}async requestAuth(e){const t=`${this.serverUrl}/api/${this.version}/auth/request`,n="Failed to initiate authentication",r=await this.fetchAbsoluteUrl(t,{method:"POST",body:JSON.stringify(e)});return r.ok||await this.throwResponseError(r,n),this.unwrapResponse(r,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 k extends y{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 b{constructor(e){this.api=new k(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 v extends y{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 S extends y{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 $ extends y{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 U extends y{constructor(e){super({...e,requireOrgId:!0})}async getSettings(e){return this.fetchJson(`${this.orgId}/settings`,{signal:e},"Failed to fetch settings")}}class E extends y{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 P extends y{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 C;!function(e){e.V1="v1"}(C||(C={}));const x={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 T{constructor(){this.callbacks=null}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){a(t,{component:"EventEmitter",action:"emit",metadata:{eventType:e}})}}async emitUserCreated(e){await this.emit(x.UserCreated,{user:e})}async emitUserUpdated(e,t){await this.emit(x.UserUpdated,{user:e,previousUser:t})}async emitWorkspaceChanged(e,t){await this.emit(x.WorkspaceChanged,{workspace:e,previousWorkspace:t})}async emitWorkspaceUpdated(e){await this.emit(x.WorkspaceUpdated,{workspace:e})}async emitWorkspaceUserAdded(e,t,n){await this.emit(x.WorkspaceUserAdded,{userId:e,workspace:t,role:n})}async emitWorkspaceUserRemoved(e,t,n){await this.emit(x.WorkspaceUserRemoved,{userId:e,workspace:t,role:n})}async emitWorkspaceUserRoleChanged(e,t,n,r){await this.emit(x.WorkspaceUserRoleChanged,{userId:e,workspace:t,previousRole:n,newRole:r})}async emitWorkspaceCreated(e){await this.emit(x.WorkspaceCreated,{workspace:e})}async emitWorkspaceDeleted(e){await this.emit(x.WorkspaceDeleted,{workspace:e})}}const _=new T;function I(){const e=new Set;return{subscribe:t=>(e.add(t),()=>{e.delete(t)}),invalidate(){e.forEach(e=>e())},reset(){e.clear()}}}const A=I().invalidate,R=I().invalidate,O=I().invalidate,W="bb",F={Checkout:"checkout",Billing:"billing",SelectPlan:"selectPlan",CreditPurchase:"creditPurchase",OpenCreditStore:"openCreditStore",OpenConnectGuide:"openConnectGuide",Invite:"invite"},N={Success:"success",Cancel:"cancel",Error:"error"},J={Subscription:"subscription",Credits:"credits",Usage:"usage",Users:"users",Profile:"profile",General:"general",Features:"features",Notifications:"notifications",Permissions:"permissions",Danger:"danger"};function L(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(W,function(e){return Object.entries(e).filter(([,e])=>null!=e&&""!==e).map(([e,t])=>`${encodeURIComponent(e)}:${encodeURIComponent(t)}`).join(",")}(e)),r.toString()}function M(e,t){const n=t||("undefined"!=typeof window?window.location.href:void 0);return{successUrl:L({action:F.Checkout,status:N.Success,ws:e,screen:J.Subscription},n),cancelUrl:L({action:F.Checkout,status:N.Cancel,ws:e,screen:J.Subscription},n)}}function B(e,t){const n=t||("undefined"!=typeof window?window.location.href:void 0);return{successUrl:L({action:F.CreditPurchase,status:N.Success,ws:e,screen:J.Credits},n),cancelUrl:L({action:F.CreditPurchase,status:N.Cancel,ws:e,screen:J.Credits},n)}}function D(){if("undefined"==typeof window)return null;try{const e=new URLSearchParams(window.location.search).get(W);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 j(){if("undefined"!=typeof window)try{const e=new URL(window.location.href);e.searchParams.has(W)&&(e.searchParams.delete(W),window.history.replaceState({},"",e.toString()))}catch{}}function q(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 z(e,t="/",n={}){if("undefined"==typeof window||!window.location)return!1;const r=q(e,n);return window.location.href=r??q(t)??"/",!0}const K="saas-auth-intent";function V(e){return"object"==typeof e&&null!==e&&"string"==typeof e.returnUrl&&"number"==typeof e.createdAt}function G(e){q(e,{sameOrigin:!0})&&u(K,{returnUrl:e,createdAt:Date.now()})}function H(){const e=function(e,t){const n=o(e);if(!n)return null;try{const r=JSON.parse(n);return t&&!t(r)?(a(new Error("Storage data failed validation"),{component:"storage",action:"getStorageJSON",metadata:{key:e}}),c(e),null):r}catch(t){return a(t,{component:"storage",action:"getStorageJSON",metadata:{key:e}}),c(e),null}}(K,V);return c(K),e?Date.now()-e.createdAt>6e5?null:q(e.returnUrl,{sameOrigin:!0}):null}function Q(){c(K)}const Y={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:"฿"},Z={usd:"🇺🇸",eur:"🇪🇺",gbp:"🇬🇧",jpy:"🇯🇵",cad:"🇨🇦",aud:"🇦🇺",chf:"🇨🇭",cny:"🇨🇳",hkd:"🇭🇰",sgd:"🇸🇬",inr:"🇮🇳",mxn:"🇲🇽",brl:"🇧🇷",nzd:"🇳🇿",sek:"🇸🇪",nok:"🇳🇴",dkk:"🇩🇰",pln:"🇵🇱",thb:"🇹🇭"};function X(e){return e&&e.trim()?Z[e.trim().toLowerCase()]??"":""}function ee(e){if(!e||!e.trim())return"";const t=e.trim().toLowerCase();return Y[t]??t.toUpperCase()}const te=["usd","eur","gbp","jpy","cad","aud","chf","cny","hkd","sgd","inr","mxn","brl","nzd","sek","nok","dkk","pln","thb"],ne=te.map(e=>({value:e,label:`${e.toUpperCase()} (${ee(e)})`})),re=new Set(["bif","clp","djf","gnf","jpy","kmf","krw","mga","pyg","rwf","ugx","vnd","vuv","xaf","xof","xpf"]),se=new Set(["bhd","jod","kwd","omr","tnd"]),ie=new Map;function ae(e){const t=(e??"").trim().toLowerCase();if(!t)return 2;if(re.has(t))return 0;if(se.has(t))return 3;if("isk"===t)return 2;let n=ie.get(t);if(void 0===n){try{n=new Intl.NumberFormat("en-US",{style:"currency",currency:t.toUpperCase()}).resolvedOptions().maximumFractionDigits??2}catch{n=2}ie.set(t,n)}return n}function oe(e){return""!==(e??"").trim()&&0===ae(e)}function ce(e,t){const n=ae(t);return 0===n?e.toLocaleString("en-US"):(e/10**n).toFixed(n)}function ue(e,t,n="en-US"){const r=(t??"").trim(),s=ae(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 ee(r)+(0===s?i.toLocaleString("en-US"):i.toFixed(s))}}function le(e,t){return ee(t)+ce(e,t)}const de={unit:"unit",units:"units",included:"Included",afterThat:"after that",afterIncluded:"After included",hardLimit:"hard limit"};function pe(e,t,n,r,s){if(null==e||e<0)return null;const i={...de,...r},a=null!=t&&t>=1?t:1,o=ee(n),c=ce(e,n);return 1===a?`${o}${c}/${i.unit}`:`${o}${c}/${a.toLocaleString(s)} ${i.units}`}function he(e,t,n,r,s,i,a){if(null==e||e<0)return null;const o={...de,...i},c=null!=t&&t>=1?t:1,u=ee(r),l=ce(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 fe(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 ge(e,t,n,r,s,i,a,o,c){const u={...de,...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} ${le(t,r)}/${d}`:null!=e?`${u.included}: ${e.toLocaleString(c)}`:null!=t?`${u.afterIncluded}: ${le(t,r)}/${d}`:"—"}function we(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 ye={included:"included",then:"then",hardLimit:"hard limit"};function me(e,t,n={}){const{overageInCents:r=!0,currency:s}=n,i={...ye,...n.labels},a=n.currencySymbol??ee(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=ae(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 ke={Monthly:"monthly",Yearly:"yearly",Quarterly:"quarterly"},be={Active:"active",Trialing:"trialing",Canceled:"canceled",PastDue:"past_due",Paused:"paused",Incomplete:"incomplete",Unpaid:"unpaid"},ve={Draft:"draft",Open:"open",Paid:"paid",Uncollectible:"uncollectible",Void:"void"},Se={Feature:"feature",Limit:"limit",Quota:"quota"},$e={None:"none",Notified:"notified",Warning:"warning",Final:"final",Suspended:"suspended"},Ue={PlanGrant:"plan_grant",CreditPackPurchase:"credit_pack_purchase",AdminGrant:"admin_grant",Refund:"refund"},Ee={Pending:"pending",Active:"active",Expired:"expired",Consumed:"consumed"},Pe={PlanGrant:"plan_grant",PackPurchased:"pack_purchased",Consumed:"consumed",Expired:"expired",AdminGrant:"admin_grant",AdminRevoke:"admin_revoke",Refund:"refund"};function Ce(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 xe(e,t,n){const r=Ce(e,t);if(!r?.basePricing)return null;const s=r.basePricing[n];return null!=s?s:null}function Te(e,t,n){const r=Ce(e,t);if(!r?.stripePrices)return null;const s=n===ke.Monthly?"monthlyPriceId":n===ke.Yearly?"yearlyPriceId":"quarterlyPriceId",i=n===ke.Monthly?"monthly":n===ke.Yearly?"yearly":void 0;return r.stripePrices[s]??(i?r.stripePrices[i]:void 0)??null}function _e(e,t,n,r){const s=Ce(e,t),i=s?.quotaOverages?.[n];if(i)return i[r]}function Ie(e,t){const n=Ce(e,t);return n?n.currency:e.plan?.currency??""}function Ae(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 Re(e,t,n,r){const s=e.quotas?.[n];if(null==s)return null;const i=s[r];if(!i)return null;const a=_e(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 Oe(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 We(e,t){const n=Ce(e,t);return n?.seatPricing?.enabled?n.seatPricing:null}function Fe(e,t,n){const r=We(e,t);return r?.perSeat?r.perSeat[n]??null:null}function Ne(e,t){return Math.max(0,e-(t||0))}function Je(e,t,n,r){const s=We(e,t);if(!s)return null;return Ne(r,s.includedSeats)*(Fe(e,t,n)??0)}function Le(e,t,n,r){const s=xe(e,t,n);if(null===s)return null;if(void 0===r)return s;return s+(Je(e,t,n,r)??0)}function Me(e){const{planVersion:t,currency:n="usd",settingsMaxUsers:r}=e;if(t){const e=We(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 Be(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 De={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"},je=Object.values(De),qe={admin:je.filter(e=>e!==De.WORKSPACE_DELETE),member:[De.WORKSPACE_SETTINGS_VIEW,De.WORKSPACE_MEMBERS_VIEW,De.WORKSPACE_FEATURES_VIEW,De.WORKSPACE_BILLING_VIEW,De.WORKSPACE_USAGE_VIEW],viewer:[De.WORKSPACE_SETTINGS_VIEW,De.WORKSPACE_MEMBERS_VIEW]};function ze(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 Ke(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(je);if(s)for(const t of ze(s))e.add(t);if(n.permissions)for(const t of ze(n.permissions))e.add(t);if(r?.workspace?.permissions)for(const t of ze(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 qe;let h;if(l)h=c(a[i]);else if(d)h=c(o[i]);else if(p)h=qe[i];else{const e=r?.workspace?.defaultRole;h=e&&e in qe?qe[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(De.WORKSPACE_MEMBERS_INVITE)}(f,i,r),f}function Ve(e,t){const n=Ke(t);return Array.isArray(e)?e.every(e=>n.has(e)):n.has(e)}const Ge="\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 He;!function(e){e.loading="loading",e.redirecting="redirecting",e.authenticated="authenticated",e.unauthenticated="unauthenticated",e.authenticating="authenticating"}(He||(He={}));const Qe=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]),Ye=(e,t)=>e>>>t|e<<32-t;function Ze(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=Ye(w[e-15],7)^Ye(w[e-15],18)^w[e-15]>>>3,n=Ye(w[e-2],17)^Ye(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+(Ye(f,6)^Ye(f,11)^Ye(f,25))+(f&g^~f&y)+Qe[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+((Ye(u,2)^Ye(u,13)^Ye(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 Xe(e){return(new TextEncoder).encode(e)}function et(e,t){let n=e;n.length>64&&(n=Ze(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=Ze(nt(r,t));return Ze(nt(s,i))}function tt(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 nt(e,t){const n=new Uint8Array(e.length+t.length);return n.set(e,0),n.set(t,e.length),n}function rt(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=et(Xe(s),Xe(`${r}.${t}`));return c.length===u.length&&tt(c,u)}function st(e){if(!rt(e))return null;try{return JSON.parse(e.body)}catch{return null}}const it=300,at="/.well-known/oauth-protected-resource",ot="/.well-known/agent-skills",ct="/.well-known/api-catalog",ut="/.well-known/mcp/server-card.json",lt="/.well-known/agent-card.json",dt="application/json",pt="application/linkset+json",ht="text/markdown; charset=utf-8",ft="text/plain; charset=utf-8",gt="application/xml; charset=utf-8",wt=["GPTBot","OAI-SearchBot","ChatGPT-User","ClaudeBot","Claude-User","Claude-SearchBot","PerplexityBot","Perplexity-User","Google-Extended","Applebot-Extended","CCBot","Bytespider","meta-externalagent","Amazonbot"];function yt(e){return e.replace(/\/+$/,"")}function mt(e){return`public, max-age=${e}, s-maxage=${e}`}function kt(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}(Ze(Xe(e)))}const bt=new Map;async function vt(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 St(e){const t=e.cacheTtlSeconds??it,n=`${yt(e.serverUrl)}::${e.orgId}`,r=bt.get(n);if(r&&r.expiresAt>Date.now())return r.value;const s=e.fetch??fetch,i=`${yt(e.serverUrl)}/api/v1/public/${e.orgId}/agent-readiness`;let a={enabled:!1};try{const t=await vt(s,i,{headers:{Accept:dt}},e.fetchTimeoutMs??5e3);if(t.ok){const e=await t.json();e&&"object"==typeof e&&(a=e)}}catch{}return bt.set(n,{value:a,expiresAt:Date.now()+1e3*t}),a}const $t=new Map;function Ut(){bt.clear(),$t.clear()}function Et(e,t){const n=yt(e.siteUrl),r={llms_txt:"/llms.txt",sitemap:"/sitemap.xml",robots:"/robots.txt",oauth_protected_resource:at};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=`${ot}/index.json`),e.apiCatalog?.length&&(r.api_catalog=ct),e.mcpServerCard&&(r.mcp_server_card=ut),!1!==e.a2aCard&&(r.a2a_agent_card=lt),e.llmsFullTxt&&(r.llms_full_txt="/llms-full.txt");return jt({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 Pt(e){let t="/";try{t=new URL(e).pathname}catch{t=e.startsWith("/")?e:`/${e}`}const n="/"===t?"":t.replace(/\/+$/,"");return at+n}function Ct(e,t,n){const r=t.protectedResources??[];if(!r.length)return null;const s=e.replace(/\/+$/,"")||at,i=n??`${yt(t.serverUrl)}/org/${t.orgId}`,a=t.scopes?.map(e=>e.name),o=r.map(e=>{const n=e.resource??yt(t.siteUrl),r=e.scopes??a;return{path:Pt(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?jt(c.metadata,t):s===at&&1===o.length?jt(o[0].metadata,t):null}function xt(e){const t=e.skills??[];if(!t.length)return null;const n=yt(e.siteUrl);return jt({$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}${Tt(e)}`,digest:kt(e.content)}))},e)}function Tt(e){return e.path??`${ot}/${e.name}/SKILL.md`}function _t(e,t){const n=(t.skills??[]).find(t=>Tt(t)===e);return n?{status:200,contentType:"text/markdown; charset=utf-8",body:n.content,cacheControl:mt(t.cacheTtlSeconds??it)}:null}function It(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:ft,body:t.join("\n")+"\n",cacheControl:mt(e.cacheTtlSeconds??it)}}function At(e){return e.llmsTxt?{status:200,contentType:ft,body:e.llmsTxt,cacheControl:mt(e.cacheTtlSeconds??it)}:null}function Rt(e){return e.llmsFullTxt?{status:200,contentType:ft,body:e.llmsFullTxt,cacheControl:mt(e.cacheTtlSeconds??it)}:null}function Ot(e){if(!1===e.a2aCard)return null;const t=e.a2aCard??{},n=yt(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 jt({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 Wt(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:mt(e.cacheTtlSeconds??it)}:null}function Ft(e){return e.endsWith(".json")||e.includes(".well-known/")?dt:e.endsWith(".md")?ht:e.endsWith(".xml")?gt:ft}function Nt(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 Jt(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:pt,body:JSON.stringify({linkset:n},null,2),cacheControl:mt(e.cacheTtlSeconds??it)}}function Lt(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 Mt(e){const t=e.mcpServerCard;return t?jt({$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:Lt(t.capabilities),...t.documentationUrl?{documentation_url:t.documentationUrl}:{}},e):null}function Bt(e){const t=e.mcpServerCard;if(!t)return null;const n=yt(e.siteUrl);let r;try{r={type:"oauth2",protected_resource_metadata:`${new URL(t.endpoint).origin}${Pt(t.endpoint)}`}}catch{}return jt({$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:Lt(t.capabilities),...t.documentationUrl?{documentation_url:t.documentationUrl}:{},server_card:`${n}${ut}`,...r?{authentication:r}:{}}]},e)}function Dt(e,t){const n=mt(e.cacheTtlSeconds??it);if(e.authMd)return{status:200,contentType:ht,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:ht,body:s,cacheControl:n}}function jt(e,t){return{status:200,contentType:dt,body:JSON.stringify(e,null,2),cacheControl:mt(t.cacheTtlSeconds??it)}}function qt(e){return String(e).replace(/[\x00-\x1f\x7f]/g,"")}function zt(e,t){const n=(Array.isArray(e.userAgent)?e.userAgent:[e.userAgent]).map(e=>`User-agent: ${qt(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: ${qt(t)}`);for(const t of e.disallow??[])n.push(`Disallow: ${qt(t)}`);return void 0!==e.crawlDelay&&n.push(`Crawl-delay: ${qt(e.crawlDelay)}`),n.join("\n")}function Kt(e){const t=e.robots??{},n=yt(e.siteUrl),r=t.policies??[{userAgent:"*",allow:["/"]}],s=t.aiBots??"allow",i="allow"===s?[{userAgent:[...wt],allow:["/"]}]:"deny"===s?[{userAgent:[...wt],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)=>zt(e,0===n?t.contentSignals:void 0)),...i.map(e=>zt(e)),...a.length?[a.map(e=>`Sitemap: ${qt(e)}`).join("\n")]:[]];return{status:200,contentType:ft,body:o.join("\n\n")+"\n",cacheControl:mt(e.cacheTtlSeconds??it)}}function Vt(e){const t="number"==typeof e&&Number.isFinite(e)?e:.5;return String(Math.min(1,Math.max(0,t)))}function Gt(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function Ht(e){const t=e.sitemap?.urls;if(!t?.length)return null;const n=yt(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>${Gt(/^https?:\/\//.test(t.loc)?t.loc:`${n}${t.loc.startsWith("/")?"":"/"}${t.loc}`)}</loc>`,...t.lastmod?[` <lastmod>${Gt(t.lastmod)}</lastmod>`]:[],...t.changefreq?[` <changefreq>${Gt(String(t.changefreq))}</changefreq>`]:[],...void 0!==t.priority?[` <priority>${Vt(t.priority)}</priority>`]:[]].join("\n")}\n </url>`}).join("\n")+"\n</urlset>\n";return{status:200,contentType:gt,body:r,cacheControl:mt(e.cacheTtlSeconds??it)}}function Qt(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 Yt(e,t,n){const r=Qt(e);return{status:200,contentType:r?ht:"text/html; charset=utf-8",body:r?t.markdown:t.html,cacheControl:mt(n?.cacheTtlSeconds??it),vary:"Accept"}}function Zt(e){const t=yt(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}${lt}>; 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}${ct}>; rel="api-catalog"; type="${pt}"`),e.mcpServerCard&&n.push(`<${t}${ut}>; rel="mcp-server"; type="application/json"`),n.join(", ")}async function Xt(e,t){const n=e.replace(/\/+$/,"")||e;if("/.well-known/agent.json"===n){return Et(t,await St(t))}if(n===lt)return Ot(t);if("/.well-known/http-message-signatures-directory"===n)return Wt(t);if("/.well-known/security.txt"===n)return It(t);if(n===`${ot}/index.json`)return xt(t);if(n.startsWith(`${ot}/`)&&n.endsWith("SKILL.md"))return _t(n,t);if("/.well-known/oauth-authorization-server"===n||"/.well-known/openid-configuration"===n){const e=(await St(t)).authorizationServer;if(!e?.metadataUrl)return null;const n=await async function(e,t){const n=t.cacheTtlSeconds??it,r=$t.get(e);if(r&&r.expiresAt>Date.now())return r.value;const s=t.fetch??fetch;let i=null;try{const n=await vt(s,e,{headers:{Accept:dt}},t.fetchTimeoutMs??5e3);if(n.ok){const e=await n.json();e&&"object"==typeof e&&(i=e)}}catch{}return $t.set(e,{value:i,expiresAt:Date.now()+1e3*n}),i}(e.metadataUrl,t);return jt(n?n:{...e.issuer?{issuer:e.issuer}:{},oauth_authorization_server_metadata:e.metadataUrl},t)}if(n===ct)return Jt(t);if(n===ut)return Mt(t);if("/.well-known/mcp.json"===n)return Bt(t);if(n.startsWith(at)){const e=await St(t);return Ct(n,t,e.authorizationServer?.issuer)}return null}async function en(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??Ft(e),body:r.body,cacheControl:r.cacheControl??mt(t.cacheTtlSeconds??it)}}(n,t);return r||("/robots.txt"===n?Kt(t):"/llms-full.txt"===n?Rt(t):"/sitemap.xml"===n?Ht(t):"/llms.txt"===n?At(t):"/auth.md"===n?Dt(t,await St(t)):"/security.txt"===n?It(t):n.startsWith("/.well-known")?Xt(n,t):null)}function tn(e){const t=globalThis.navigator;return!!t?.modelContext?.provideContext&&(t.modelContext.provideContext({tools:e}),!0)}function nn(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 sn extends Error{constructor(e,t){super(t),this.name="AppBridgeError",this.code=e}}function an(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 on(e,t,n={}){const r=n.clockToleranceSec??60,s=n.requireExp??!0;if(!e||!t)throw new sn("invalid_token","Missing token or client secret");const i=e.split(".");if(3!==i.length)throw new sn("invalid_token","Malformed JWT");const[a,o,c]=i;let u,l;try{u=an(a),l=an(o)}catch{throw new sn("invalid_token","Unreadable JWT segments")}if("HS256"!==u.alg)throw new sn("invalid_algorithm",`Unexpected JWT alg: ${String(u.alg)}`);const d=et(Xe(t),Xe(`${a}.${o}`));let p;try{p=rn(c)}catch{throw new sn("invalid_signature","Unreadable JWT signature")}if(!tt(d,p))throw new sn("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 sn("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 sn("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 sn("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 sn("invalid_token","JWT is missing a numeric exp claim");if("number"==typeof l.exp&&h>l.exp+r)throw new sn("token_expired","JWT has expired");if("number"==typeof l.nbf&&h+r<l.nbf)throw new sn("token_not_yet_valid","JWT is not yet valid");if(void 0!==n.issuer&&l.iss!==n.issuer)throw new sn("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 sn("invalid_audience","JWT audience mismatch")}return l}function cn(e){if(!e)return null;const t=/^Bearer\s+(.+)$/i.exec(e.trim());return t?t[1].trim():null}function un(e){return nn(Xe(JSON.stringify(e)))}function ln(e,t,n){if(!t)throw new sn("invalid_secret","Missing signing secret");const r=Math.floor(Date.now()/1e3),s={iat:r,exp:r+(n?.expiresInSec??3600),...e},i=`${un({alg:"HS256",typ:"JWT"})}.${un(s)}`;return`${i}.${nn(et(Xe(t),Xe(i)))}`}function dn(e){const t=cn(e.authorization);if(!t)throw new sn("invalid_token","Missing Bearer token");return on(t,e.clientSecret,{clockToleranceSec:e.clockToleranceSec})}function pn(e){const t=cn(e.authorization);if(!t)throw new sn("invalid_token","Missing Bearer token");return on(t,e.clientSecret,{clockToleranceSec:e.clockToleranceSec})}function hn(e){return{success:!0,token:e.token,message:e.message??"ok",..."number"==typeof e.expiresIn?{expiresIn:e.expiresIn}:{}}}function fn(e){return{success:!1,token:"",message:e}}async function gn(e){let t;try{t=dn(e)}catch(e){return{status:401,body:fn(e instanceof sn?e.code:"invalid_token")}}return{status:200,body:hn(await e.mintToken(t))}}async function wn(e){let t;try{t=pn(e)}catch(e){return{status:401,body:{success:!1,message:e instanceof sn?e.code:"invalid_token"}}}return await e.onRevoke(t),{status:200,body:{success:!0}}}function yn(e){return e.replace(/[\x00-\x1f\x7f]/g,"").replace(/([\\"])/g,"\\$1")}function mn(e){const t=[`Bearer resource_metadata="${yn(e.resourceMetadataUrl)}"`];return e.error&&t.push(`error="${yn(e.error)}"`),e.errorDescription&&t.push(`error_description="${yn(e.errorDescription)}"`),{status:401,headers:{"WWW-Authenticate":t.join(", "),"Content-Type":"application/json"},body:JSON.stringify({error:e.error??"invalid_token"})}}const kn=12,bn=16;function vn(){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 Sn=new Map;function $n(e){let t=Sn.get(e);return t||(t=(async()=>{const t=await vn().digest("SHA-256",(new TextEncoder).encode(`${e}:bb-session`));return vn().importKey("raw",t,{name:"AES-GCM"},!1,["encrypt","decrypt"])})(),Sn.set(e,t)),t}function Un(e){if(!e)throw new Error("createSessionRefCrypto: missing secret");return{async encryptSessionRef(t){const n=globalThis.crypto.getRandomValues(new Uint8Array(kn)),r=await $n(e),s=new Uint8Array(await vn().encrypt({name:"AES-GCM",iv:n},r,(new TextEncoder).encode(t))),i=s.subarray(s.length-bn),a=s.subarray(0,s.length-bn),o=new Uint8Array(28+a.length);return o.set(n,0),o.set(i,kn),o.set(a,28),nn(o)},async decryptSessionRef(t){try{const n=rn(t);if(n.length<=28)return null;const r=n.slice(0,kn),s=n.subarray(kn,28),i=n.subarray(28),a=new Uint8Array(i.length+bn);a.set(i,0),a.set(s,i.length);const o=await $n(e),c=await vn().decrypt({name:"AES-GCM",iv:r},o,a);return(new TextDecoder).decode(c)}catch{return null}}}}async function En(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 Un(n).encryptSessionRef(t.sessionId):void 0;return{token:ln({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 Pn(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 Cn(e){const{secret:t}=e;if(!t)throw new Error("buildbaseAuth: missing secret");const n=Un(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=on(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 Pn(t,r,"token carries no aud claim"),null;if(t.length&&!t.some(e=>r.includes(e)))return Pn(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 xn(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 P(s),user:new E(s),settings:new U(s),push:new S(s),devices:new v(s),sessions:new $(s)}},h=new P({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 Ve(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 Ke({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{wt as AI_BOT_USER_AGENTS,C as ApiVersion,sn as AppBridgeError,m as AuthApi,He as AuthStatus,F as BBAction,J as BBScreen,N as BBStatus,W as BB_PARAM,y as BaseApi,b as BetaForm,ke as BillingIntervals,xn as BuildBase,Y as CURRENCY_DISPLAY,Z as CURRENCY_FLAG,Ue as CreditBucketSource,Ee as CreditBucketStatus,Pe as CreditTransactionType,qe as DEFAULT_ROLE_PERMISSIONS,$e as DunningState,T as EventEmitter,ve as InvoiceStatuses,te as PLAN_CURRENCY_CODES,ne as PLAN_CURRENCY_OPTIONS,Ge as PUSH_SERVICE_WORKER_SCRIPT,De as Permission,S as PushApi,x as SDKEvent,U as SettingsApi,Se as SubscriptionItemType,be as SubscriptionStatus,E as UserApi,P as WorkspaceApi,fn as appTokenFailure,hn as appTokenSuccess,mn as bearerChallenge,Ot as buildA2AAgentCard,Et as buildAgentCard,xt as buildAgentSkillsIndex,Jt as buildApiCatalog,Dt as buildAuthMd,Zt as buildDiscoveryLinkHeader,Nt as buildDnsAidRecords,Rt as buildLlmsFullTxt,At as buildLlmsTxt,Bt as buildMcpDiscoveryManifest,Mt as buildMcpServerCard,Ct as buildProtectedResourceMetadata,Kt as buildRobotsTxt,It as buildSecurityTxt,Ht as buildSitemap,_t as buildSkillMd,Wt as buildWebBotAuthDirectory,Cn as buildbaseAuth,Ne as calculateBillableSeats,Je as calculateSeatOverageCents,Le as calculateTotalSubscriptionCents,j as cleanBBParams,Ut as clearAgentReadinessCache,Q as clearAuthIntent,H as consumeAuthIntent,L as createBBUrl,M as createCheckoutRedirectUrls,B as createCreditPurchaseRedirectUrls,Un as createSessionRefCrypto,xn as default,_ as eventEmitter,cn as extractBearerToken,St as fetchAgentReadiness,le as formatCents,ue as formatMinorAmountIntl,pe as formatOverageRate,he as formatOverageRateWithLabel,ge as formatQuotaIncludedOverage,me as formatQuotaWithPrice,Ae as getAvailableCurrenciesFromPlans,xe as getBasePriceCents,Oe as getBillingIntervalAndCurrencyFromPriceId,ae as getCurrencyDecimals,X as getCurrencyFlag,ee as getCurrencySymbol,Ie as getDisplayCurrency,Fe as getPerSeatPriceCents,Ce as getPricingVariant,we as getQuotaDisplayValue,Re as getQuotaDisplayWithVariant,_e as getQuotaOverageCents,fe as getQuotaUnitLabelFromName,We as getSeatPricing,Te as getStripePriceIdForInterval,wn as handleAppRevokeRequest,gn as handleAppTokenRequest,Ve as hasPermission,A as invalidateCreditBalance,R as invalidateQuotaUsage,O as invalidateSubscription,oe as isZeroDecimalCurrency,ce as minorAmountToDisplay,En as mintAgentToken,Yt as negotiateMarkdown,st as parseWebhookEvent,tn as provideWebMcpTools,D as readBBParams,en as resolveAgentPath,Me as resolveMaxUsers,Ke as resolvePermissions,Xt as resolveWellKnown,z as safeRedirect,G as saveAuthIntent,kt as sha256Digest,ln as signClientJwt,Be as validateInvite,q as validateRedirectUrl,pn as verifyAppRevokeRequest,dn as verifyAppTokenRequest,on as verifyClientJwt,rt as verifyWebhookSignature,Qt 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){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 I{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 _=new I;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{}}function z(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 K(e,t="/",n={}){if("undefined"==typeof window||!window.location)return!1;const r=z(e,n);return window.location.href=r??z(t)??"/",!0}const V="saas-auth-intent";function G(e){return"object"==typeof e&&null!==e&&"string"==typeof e.returnUrl&&"number"==typeof e.createdAt}function H(e){z(e,{sameOrigin:!0})&&l(V,{returnUrl:e,createdAt:Date.now()})}function Q(){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}}(V,G);return u(V),e?Date.now()-e.createdAt>6e5?null:z(e.returnUrl,{sameOrigin:!0}):null}function Y(){u(V)}const Z={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:"฿"},X={usd:"🇺🇸",eur:"🇪🇺",gbp:"🇬🇧",jpy:"🇯🇵",cad:"🇨🇦",aud:"🇦🇺",chf:"🇨🇭",cny:"🇨🇳",hkd:"🇭🇰",sgd:"🇸🇬",inr:"🇮🇳",mxn:"🇲🇽",brl:"🇧🇷",nzd:"🇳🇿",sek:"🇸🇪",nok:"🇳🇴",dkk:"🇩🇰",pln:"🇵🇱",thb:"🇹🇭"};function ee(e){return e&&e.trim()?X[e.trim().toLowerCase()]??"":""}function te(e){if(!e||!e.trim())return"";const t=e.trim().toLowerCase();return Z[t]??t.toUpperCase()}const ne=["usd","eur","gbp","jpy","cad","aud","chf","cny","hkd","sgd","inr","mxn","brl","nzd","sek","nok","dkk","pln","thb"],re=ne.map(e=>({value:e,label:`${e.toUpperCase()} (${te(e)})`})),se=new Set(["bif","clp","djf","gnf","jpy","kmf","krw","mga","pyg","rwf","ugx","vnd","vuv","xaf","xof","xpf"]),ie=new Set(["bhd","jod","kwd","omr","tnd"]),ae=new Map;function oe(e){const t=(e??"").trim().toLowerCase();if(!t)return 2;if(se.has(t))return 0;if(ie.has(t))return 3;if("isk"===t)return 2;let n=ae.get(t);if(void 0===n){try{n=new Intl.NumberFormat("en-US",{style:"currency",currency:t.toUpperCase()}).resolvedOptions().maximumFractionDigits??2}catch{n=2}ae.set(t,n)}return n}function ce(e){return""!==(e??"").trim()&&0===oe(e)}function ue(e,t){const n=oe(t);return 0===n?e.toLocaleString("en-US"):(e/10**n).toFixed(n)}function le(e,t,n="en-US"){const r=(t??"").trim(),s=oe(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 te(r)+(0===s?i.toLocaleString("en-US"):i.toFixed(s))}}function de(e,t){return te(t)+ue(e,t)}const pe={unit:"unit",units:"units",included:"Included",afterThat:"after that",afterIncluded:"After included",hardLimit:"hard limit"};function he(e,t,n,r,s){if(null==e||e<0)return null;const i={...pe,...r},a=null!=t&&t>=1?t:1,o=te(n),c=ue(e,n);return 1===a?`${o}${c}/${i.unit}`:`${o}${c}/${a.toLocaleString(s)} ${i.units}`}function fe(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=te(r),l=ue(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 ge(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 we(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} ${de(t,r)}/${d}`:null!=e?`${u.included}: ${e.toLocaleString(c)}`:null!=t?`${u.afterIncluded}: ${de(t,r)}/${d}`:"—"}function ye(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 me={included:"included",then:"then",hardLimit:"hard limit"};function ke(e,t,n={}){const{overageInCents:r=!0,currency:s}=n,i={...me,...n.labels},a=n.currencySymbol??te(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=oe(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 be={Monthly:"monthly",Yearly:"yearly",Quarterly:"quarterly"},ve={Active:"active",Trialing:"trialing",Canceled:"canceled",PastDue:"past_due",Paused:"paused",Incomplete:"incomplete",Unpaid:"unpaid"},Se={Draft:"draft",Open:"open",Paid:"paid",Uncollectible:"uncollectible",Void:"void"},$e={Feature:"feature",Limit:"limit",Quota:"quota"},Ue={None:"none",Notified:"notified",Warning:"warning",Final:"final",Suspended:"suspended"},Ee={PlanGrant:"plan_grant",CreditPackPurchase:"credit_pack_purchase",AdminGrant:"admin_grant",Refund:"refund"},Pe={Pending:"pending",Active:"active",Expired:"expired",Consumed:"consumed"},Ce={PlanGrant:"plan_grant",PackPurchased:"pack_purchased",Consumed:"consumed",Expired:"expired",AdminGrant:"admin_grant",AdminRevoke:"admin_revoke",Refund:"refund"};function xe(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 Te(e,t,n){const r=xe(e,t);if(!r?.basePricing)return null;const s=r.basePricing[n];return null!=s?s:null}function Ie(e,t,n){const r=xe(e,t);if(!r?.stripePrices)return null;const s=n===be.Monthly?"monthlyPriceId":n===be.Yearly?"yearlyPriceId":"quarterlyPriceId",i=n===be.Monthly?"monthly":n===be.Yearly?"yearly":void 0;return r.stripePrices[s]??(i?r.stripePrices[i]:void 0)??null}function _e(e,t,n,r){const s=xe(e,t),i=s?.quotaOverages?.[n];if(i)return i[r]}function Ae(e,t){const n=xe(e,t);return n?n.currency:e.plan?.currency??""}function Re(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 Oe(e,t,n,r){const s=e.quotas?.[n];if(null==s)return null;const i=s[r];if(!i)return null;const a=_e(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 We(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 Fe(e,t){const n=xe(e,t);return n?.seatPricing?.enabled?n.seatPricing:null}function Ne(e,t,n){const r=Fe(e,t);return r?.perSeat?r.perSeat[n]??null:null}function Je(e,t){return Math.max(0,e-(t||0))}function Le(e,t,n,r){const s=Fe(e,t);if(!s)return null;return Je(r,s.includedSeats)*(Ne(e,t,n)??0)}function Me(e,t,n,r){const s=Te(e,t,n);if(null===s)return null;if(void 0===r)return s;return s+(Le(e,t,n,r)??0)}function Be(e){const{planVersion:t,currency:n="usd",settingsMaxUsers:r}=e;if(t){const e=Fe(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 De(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 je={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"},qe=Object.values(je),ze={admin:qe.filter(e=>e!==je.WORKSPACE_DELETE),member:[je.WORKSPACE_SETTINGS_VIEW,je.WORKSPACE_MEMBERS_VIEW,je.WORKSPACE_FEATURES_VIEW,je.WORKSPACE_BILLING_VIEW,je.WORKSPACE_USAGE_VIEW],viewer:[je.WORKSPACE_SETTINGS_VIEW,je.WORKSPACE_MEMBERS_VIEW]};function Ke(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 Ve(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(qe);if(s)for(const t of Ke(s))e.add(t);if(n.permissions)for(const t of Ke(n.permissions))e.add(t);if(r?.workspace?.permissions)for(const t of Ke(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 ze;let h;if(l)h=c(a[i]);else if(d)h=c(o[i]);else if(p)h=ze[i];else{const e=r?.workspace?.defaultRole;h=e&&e in ze?ze[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(je.WORKSPACE_MEMBERS_INVITE)}(f,i,r),f}function Ge(e,t){const n=Ve(t);return Array.isArray(e)?e.every(e=>n.has(e)):n.has(e)}const He="\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 Qe;!function(e){e.loading="loading",e.redirecting="redirecting",e.authenticated="authenticated",e.unauthenticated="unauthenticated",e.authenticating="authenticating"}(Qe||(Qe={}));const Ye=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]),Ze=(e,t)=>e>>>t|e<<32-t;function Xe(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=Ze(w[e-15],7)^Ze(w[e-15],18)^w[e-15]>>>3,n=Ze(w[e-2],17)^Ze(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+(Ze(f,6)^Ze(f,11)^Ze(f,25))+(f&g^~f&y)+Ye[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+((Ze(u,2)^Ze(u,13)^Ze(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 et(e){return(new TextEncoder).encode(e)}function tt(e,t){let n=e;n.length>64&&(n=Xe(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=Xe(rt(r,t));return Xe(rt(s,i))}function nt(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 rt(e,t){const n=new Uint8Array(e.length+t.length);return n.set(e,0),n.set(t,e.length),n}function st(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=tt(et(s),et(`${r}.${t}`));return c.length===u.length&&nt(c,u)}function it(e){if(!st(e))return null;try{return JSON.parse(e.body)}catch{return null}}const at=300,ot="/.well-known/oauth-protected-resource",ct="/.well-known/agent-skills",ut="/.well-known/api-catalog",lt="/.well-known/mcp/server-card.json",dt="/.well-known/agent-card.json",pt="application/json",ht="application/linkset+json",ft="text/markdown; charset=utf-8",gt="text/plain; charset=utf-8",wt="application/xml; charset=utf-8",yt=["GPTBot","OAI-SearchBot","ChatGPT-User","ClaudeBot","Claude-User","Claude-SearchBot","PerplexityBot","Perplexity-User","Google-Extended","Applebot-Extended","CCBot","Bytespider","meta-externalagent","Amazonbot"];function mt(e){return e.replace(/\/+$/,"")}function kt(e){return`public, max-age=${e}, s-maxage=${e}`}function bt(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}(Xe(et(e)))}const vt=new Map;async function St(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 $t(e){const t=e.cacheTtlSeconds??at,n=`${mt(e.serverUrl)}::${e.orgId}`,r=vt.get(n);if(r&&r.expiresAt>Date.now())return r.value;const s=e.fetch??fetch,i=`${mt(e.serverUrl)}/api/v1/public/${e.orgId}/agent-readiness`;let a={enabled:!1};try{const t=await St(s,i,{headers:{Accept:pt}},e.fetchTimeoutMs??5e3);if(t.ok){const e=await t.json();e&&"object"==typeof e&&(a=e)}}catch{}return vt.set(n,{value:a,expiresAt:Date.now()+1e3*t}),a}const Ut=new Map;function Et(){vt.clear(),Ut.clear()}function Pt(e,t){const n=mt(e.siteUrl),r={llms_txt:"/llms.txt",sitemap:"/sitemap.xml",robots:"/robots.txt",oauth_protected_resource:ot};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=`${ct}/index.json`),e.apiCatalog?.length&&(r.api_catalog=ut),e.mcpServerCard&&(r.mcp_server_card=lt),!1!==e.a2aCard&&(r.a2a_agent_card=dt),e.llmsFullTxt&&(r.llms_full_txt="/llms-full.txt");return qt({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 Ct(e){let t="/";try{t=new URL(e).pathname}catch{t=e.startsWith("/")?e:`/${e}`}const n="/"===t?"":t.replace(/\/+$/,"");return ot+n}function xt(e,t,n){const r=t.protectedResources??[];if(!r.length)return null;const s=e.replace(/\/+$/,"")||ot,i=n??`${mt(t.serverUrl)}/org/${t.orgId}`,a=t.scopes?.map(e=>e.name),o=r.map(e=>{const n=e.resource??mt(t.siteUrl),r=e.scopes??a;return{path:Ct(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?qt(c.metadata,t):s===ot&&1===o.length?qt(o[0].metadata,t):null}function Tt(e){const t=e.skills??[];if(!t.length)return null;const n=mt(e.siteUrl);return qt({$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}${It(e)}`,digest:bt(e.content)}))},e)}function It(e){return e.path??`${ct}/${e.name}/SKILL.md`}function _t(e,t){const n=(t.skills??[]).find(t=>It(t)===e);return n?{status:200,contentType:"text/markdown; charset=utf-8",body:n.content,cacheControl:kt(t.cacheTtlSeconds??at)}:null}function At(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:gt,body:t.join("\n")+"\n",cacheControl:kt(e.cacheTtlSeconds??at)}}function Rt(e){return e.llmsTxt?{status:200,contentType:gt,body:e.llmsTxt,cacheControl:kt(e.cacheTtlSeconds??at)}:null}function Ot(e){return e.llmsFullTxt?{status:200,contentType:gt,body:e.llmsFullTxt,cacheControl:kt(e.cacheTtlSeconds??at)}:null}function Wt(e){if(!1===e.a2aCard)return null;const t=e.a2aCard??{},n=mt(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 qt({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 Ft(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:kt(e.cacheTtlSeconds??at)}:null}function Nt(e){return e.endsWith(".json")||e.includes(".well-known/")?pt:e.endsWith(".md")?ft:e.endsWith(".xml")?wt:gt}function Jt(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 Lt(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:ht,body:JSON.stringify({linkset:n},null,2),cacheControl:kt(e.cacheTtlSeconds??at)}}function Mt(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 Bt(e){const t=e.mcpServerCard;return t?qt({$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:Mt(t.capabilities),...t.documentationUrl?{documentation_url:t.documentationUrl}:{}},e):null}function Dt(e){const t=e.mcpServerCard;if(!t)return null;const n=mt(e.siteUrl);let r;try{r={type:"oauth2",protected_resource_metadata:`${new URL(t.endpoint).origin}${Ct(t.endpoint)}`}}catch{}return qt({$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:Mt(t.capabilities),...t.documentationUrl?{documentation_url:t.documentationUrl}:{},server_card:`${n}${lt}`,...r?{authentication:r}:{}}]},e)}function jt(e,t){const n=kt(e.cacheTtlSeconds??at);if(e.authMd)return{status:200,contentType:ft,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:ft,body:s,cacheControl:n}}function qt(e,t){return{status:200,contentType:pt,body:JSON.stringify(e,null,2),cacheControl:kt(t.cacheTtlSeconds??at)}}function zt(e){return String(e).replace(/[\x00-\x1f\x7f]/g,"")}function Kt(e,t){const n=(Array.isArray(e.userAgent)?e.userAgent:[e.userAgent]).map(e=>`User-agent: ${zt(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: ${zt(t)}`);for(const t of e.disallow??[])n.push(`Disallow: ${zt(t)}`);return void 0!==e.crawlDelay&&n.push(`Crawl-delay: ${zt(e.crawlDelay)}`),n.join("\n")}function Vt(e){const t=e.robots??{},n=mt(e.siteUrl),r=t.policies??[{userAgent:"*",allow:["/"]}],s=t.aiBots??"allow",i="allow"===s?[{userAgent:[...yt],allow:["/"]}]:"deny"===s?[{userAgent:[...yt],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)=>Kt(e,0===n?t.contentSignals:void 0)),...i.map(e=>Kt(e)),...a.length?[a.map(e=>`Sitemap: ${zt(e)}`).join("\n")]:[]];return{status:200,contentType:gt,body:o.join("\n\n")+"\n",cacheControl:kt(e.cacheTtlSeconds??at)}}function Gt(e){const t="number"==typeof e&&Number.isFinite(e)?e:.5;return String(Math.min(1,Math.max(0,t)))}function Ht(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function Qt(e){const t=e.sitemap?.urls;if(!t?.length)return null;const n=mt(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>${Ht(/^https?:\/\//.test(t.loc)?t.loc:`${n}${t.loc.startsWith("/")?"":"/"}${t.loc}`)}</loc>`,...t.lastmod?[` <lastmod>${Ht(t.lastmod)}</lastmod>`]:[],...t.changefreq?[` <changefreq>${Ht(String(t.changefreq))}</changefreq>`]:[],...void 0!==t.priority?[` <priority>${Gt(t.priority)}</priority>`]:[]].join("\n")}\n </url>`}).join("\n")+"\n</urlset>\n";return{status:200,contentType:wt,body:r,cacheControl:kt(e.cacheTtlSeconds??at)}}function Yt(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 Zt(e,t,n){const r=Yt(e);return{status:200,contentType:r?ft:"text/html; charset=utf-8",body:r?t.markdown:t.html,cacheControl:kt(n?.cacheTtlSeconds??at),vary:"Accept"}}function Xt(e){const t=mt(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}${ut}>; rel="api-catalog"; type="${ht}"`),e.mcpServerCard&&n.push(`<${t}${lt}>; rel="mcp-server"; type="application/json"`),n.join(", ")}async function en(e,t){const n=e.replace(/\/+$/,"")||e;if("/.well-known/agent.json"===n){return Pt(t,await $t(t))}if(n===dt)return Wt(t);if("/.well-known/http-message-signatures-directory"===n)return Ft(t);if("/.well-known/security.txt"===n)return At(t);if(n===`${ct}/index.json`)return Tt(t);if(n.startsWith(`${ct}/`)&&n.endsWith("SKILL.md"))return _t(n,t);if("/.well-known/oauth-authorization-server"===n||"/.well-known/openid-configuration"===n){const e=(await $t(t)).authorizationServer;if(!e?.metadataUrl)return null;const n=await async function(e,t){const n=t.cacheTtlSeconds??at,r=Ut.get(e);if(r&&r.expiresAt>Date.now())return r.value;const s=t.fetch??fetch;let i=null;try{const n=await St(s,e,{headers:{Accept:pt}},t.fetchTimeoutMs??5e3);if(n.ok){const e=await n.json();e&&"object"==typeof e&&(i=e)}}catch{}return Ut.set(e,{value:i,expiresAt:Date.now()+1e3*n}),i}(e.metadataUrl,t);return qt(n?n:{...e.issuer?{issuer:e.issuer}:{},oauth_authorization_server_metadata:e.metadataUrl},t)}if(n===ut)return Lt(t);if(n===lt)return Bt(t);if("/.well-known/mcp.json"===n)return Dt(t);if(n.startsWith(ot)){const e=await $t(t);return xt(n,t,e.authorizationServer?.issuer)}return null}async function tn(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??Nt(e),body:r.body,cacheControl:r.cacheControl??kt(t.cacheTtlSeconds??at)}}(n,t);return r||("/robots.txt"===n?Vt(t):"/llms-full.txt"===n?Ot(t):"/sitemap.xml"===n?Qt(t):"/llms.txt"===n?Rt(t):"/auth.md"===n?jt(t,await $t(t)):"/security.txt"===n?At(t):n.startsWith("/.well-known")?en(n,t):null)}function nn(e){const t=globalThis.navigator;return!!t?.modelContext?.provideContext&&(t.modelContext.provideContext({tools:e}),!0)}function rn(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 sn(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 an extends Error{constructor(e,t){super(t),this.name="AppBridgeError",this.code=e}}function on(e){const t=JSON.parse((new TextDecoder).decode(sn(e)));if("object"!=typeof t||null===t||Array.isArray(t))throw new Error("JWT segment is not a JSON object");return t}function cn(e,t,n={}){const r=n.clockToleranceSec??60,s=n.requireExp??!0;if(!e||!t)throw new an("invalid_token","Missing token or client secret");const i=e.split(".");if(3!==i.length)throw new an("invalid_token","Malformed JWT");const[a,o,c]=i;let u,l;try{u=on(a),l=on(o)}catch{throw new an("invalid_token","Unreadable JWT segments")}if("HS256"!==u.alg)throw new an("invalid_algorithm",`Unexpected JWT alg: ${String(u.alg)}`);const d=tt(et(t),et(`${a}.${o}`));let p;try{p=sn(c)}catch{throw new an("invalid_signature","Unreadable JWT signature")}if(!nt(d,p))throw new an("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 an("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 an("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 an("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 an("invalid_token","JWT is missing a numeric exp claim");if("number"==typeof l.exp&&h>l.exp+r)throw new an("token_expired","JWT has expired");if("number"==typeof l.nbf&&h+r<l.nbf)throw new an("token_not_yet_valid","JWT is not yet valid");if(void 0!==n.issuer&&l.iss!==n.issuer)throw new an("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 an("invalid_audience","JWT audience mismatch")}return l}function un(e){if(!e)return null;const t=/^Bearer\s+(.+)$/i.exec(e.trim());return t?t[1].trim():null}function ln(e){return rn(et(JSON.stringify(e)))}function dn(e,t,n){if(!t)throw new an("invalid_secret","Missing signing secret");const r=Math.floor(Date.now()/1e3),s={iat:r,exp:r+(n?.expiresInSec??3600),...e},i=`${ln({alg:"HS256",typ:"JWT"})}.${ln(s)}`;return`${i}.${rn(tt(et(t),et(i)))}`}function pn(e){const t=un(e.authorization);if(!t)throw new an("invalid_token","Missing Bearer token");return cn(t,e.clientSecret,{clockToleranceSec:e.clockToleranceSec})}function hn(e){const t=un(e.authorization);if(!t)throw new an("invalid_token","Missing Bearer token");return cn(t,e.clientSecret,{clockToleranceSec:e.clockToleranceSec})}function fn(e){return{success:!0,token:e.token,message:e.message??"ok",..."number"==typeof e.expiresIn?{expiresIn:e.expiresIn}:{}}}function gn(e){return{success:!1,token:"",message:e}}async function wn(e){let t;try{t=pn(e)}catch(e){return{status:401,body:gn(e instanceof an?e.code:"invalid_token")}}return{status:200,body:fn(await e.mintToken(t))}}async function yn(e){let t;try{t=hn(e)}catch(e){return{status:401,body:{success:!1,message:e instanceof an?e.code:"invalid_token"}}}return await e.onRevoke(t),{status:200,body:{success:!0}}}function mn(e){return e.replace(/[\x00-\x1f\x7f]/g,"").replace(/([\\"])/g,"\\$1")}function kn(e){const t=[`Bearer resource_metadata="${mn(e.resourceMetadataUrl)}"`];return e.error&&t.push(`error="${mn(e.error)}"`),e.errorDescription&&t.push(`error_description="${mn(e.errorDescription)}"`),{status:401,headers:{"WWW-Authenticate":t.join(", "),"Content-Type":"application/json"},body:JSON.stringify({error:e.error??"invalid_token"})}}const bn=12,vn=16;function Sn(){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 $n=new Map;function Un(e){let t=$n.get(e);return t||(t=(async()=>{const t=await Sn().digest("SHA-256",(new TextEncoder).encode(`${e}:bb-session`));return Sn().importKey("raw",t,{name:"AES-GCM"},!1,["encrypt","decrypt"])})(),$n.set(e,t)),t}function En(e){if(!e)throw new Error("createSessionRefCrypto: missing secret");return{async encryptSessionRef(t){const n=globalThis.crypto.getRandomValues(new Uint8Array(bn)),r=await Un(e),s=new Uint8Array(await Sn().encrypt({name:"AES-GCM",iv:n},r,(new TextEncoder).encode(t))),i=s.subarray(s.length-vn),a=s.subarray(0,s.length-vn),o=new Uint8Array(28+a.length);return o.set(n,0),o.set(i,bn),o.set(a,28),rn(o)},async decryptSessionRef(t){try{const n=sn(t);if(n.length<=28)return null;const r=n.slice(0,bn),s=n.subarray(bn,28),i=n.subarray(28),a=new Uint8Array(i.length+vn);a.set(i,0),a.set(s,i.length);const o=await Un(e),c=await Sn().decrypt({name:"AES-GCM",iv:r},o,a);return(new TextDecoder).decode(c)}catch{return null}}}}async function Pn(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 En(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 Cn(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 xn(e){const{secret:t}=e;if(!t)throw new Error("buildbaseAuth: missing secret");const n=En(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=cn(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 Cn(t,r,"token carries no aud claim"),null;if(t.length&&!t.some(e=>r.includes(e)))return Cn(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 Tn(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 Ge(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 Ve({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{yt as AI_BOT_USER_AGENTS,x as ApiVersion,an as AppBridgeError,k as AuthApi,Qe as AuthStatus,N as BBAction,L as BBScreen,J as BBStatus,F as BB_PARAM,m as BaseApi,v as BetaForm,be as BillingIntervals,Tn as BuildBase,Z as CURRENCY_DISPLAY,X as CURRENCY_FLAG,Ee as CreditBucketSource,Pe as CreditBucketStatus,Ce as CreditTransactionType,ze as DEFAULT_ROLE_PERMISSIONS,Ue as DunningState,I as EventEmitter,Se as InvoiceStatuses,ne as PLAN_CURRENCY_CODES,re as PLAN_CURRENCY_OPTIONS,He as PUSH_SERVICE_WORKER_SCRIPT,je as Permission,$ as PushApi,T as SDKEvent,E as SettingsApi,$e as SubscriptionItemType,ve as SubscriptionStatus,P as UserApi,C as WorkspaceApi,gn as appTokenFailure,fn as appTokenSuccess,kn as bearerChallenge,Wt as buildA2AAgentCard,Pt as buildAgentCard,Tt as buildAgentSkillsIndex,Lt as buildApiCatalog,jt as buildAuthMd,Xt as buildDiscoveryLinkHeader,Jt as buildDnsAidRecords,Ot as buildLlmsFullTxt,Rt as buildLlmsTxt,Dt as buildMcpDiscoveryManifest,Bt as buildMcpServerCard,xt as buildProtectedResourceMetadata,Vt as buildRobotsTxt,At as buildSecurityTxt,Qt as buildSitemap,_t as buildSkillMd,Ft as buildWebBotAuthDirectory,xn as buildbaseAuth,Je as calculateBillableSeats,Le as calculateSeatOverageCents,Me as calculateTotalSubscriptionCents,q as cleanBBParams,Et as clearAgentReadinessCache,Y as clearAuthIntent,Q as consumeAuthIntent,M as createBBUrl,B as createCheckoutRedirectUrls,D as createCreditPurchaseRedirectUrls,En as createSessionRefCrypto,Tn as default,_ as eventEmitter,un as extractBearerToken,$t as fetchAgentReadiness,de as formatCents,le as formatMinorAmountIntl,he as formatOverageRate,fe as formatOverageRateWithLabel,we as formatQuotaIncludedOverage,ke as formatQuotaWithPrice,Re as getAvailableCurrenciesFromPlans,Te as getBasePriceCents,We as getBillingIntervalAndCurrencyFromPriceId,oe as getCurrencyDecimals,ee as getCurrencyFlag,te as getCurrencySymbol,Ae as getDisplayCurrency,Ne as getPerSeatPriceCents,xe as getPricingVariant,ye as getQuotaDisplayValue,Oe as getQuotaDisplayWithVariant,_e as getQuotaOverageCents,ge as getQuotaUnitLabelFromName,Fe as getSeatPricing,Ie as getStripePriceIdForInterval,yn as handleAppRevokeRequest,wn as handleAppTokenRequest,Ge as hasPermission,R as invalidateCreditBalance,O as invalidateQuotaUsage,W as invalidateSubscription,ce as isZeroDecimalCurrency,ue as minorAmountToDisplay,Pn as mintAgentToken,Zt as negotiateMarkdown,it as parseWebhookEvent,nn as provideWebMcpTools,j as readBBParams,tn as resolveAgentPath,Be as resolveMaxUsers,Ve as resolvePermissions,en as resolveWellKnown,K as safeRedirect,H as saveAuthIntent,bt as sha256Digest,dn as signClientJwt,De as validateInvite,z as validateRedirectUrl,hn as verifyAppRevokeRequest,pn as verifyAppTokenRequest,cn as verifyClientJwt,st as verifyWebhookSignature,Yt as wantsMarkdown};
|