@budibase/pro 3.41.1 → 3.41.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -44,7 +44,7 @@ l2HXiAD1Q2rlHNW9wDaYyKb1F5f+v4RyqCAyzlkwRdksmkLeECTboojNnmRCrE3C
44
44
  d/o3ZWE1TTj1zYwlCLN5qRKr3hU8nC3xEYNEbkB9SfTRaOq9Q7P8WmfLkoCPm3pR
45
45
  mwIDAQAB
46
46
  -----END PUBLIC KEY-----
47
- `;function dn(e){return Ni.default.verify(e,CE,{algorithms:["RS256"]})}n(dn,"verifyLicenseToken");function ME(e,t){return Ni.default.sign(t,e,{encoding:"utf-8",algorithm:"RS256"})}n(ME,"sign");var _o={};F(_o,{getOfflineFeatures:()=>Di});var v=require("@budibase/types");var Td=[v.Feature.BUDIBASE_AI,v.Feature.SYNC_AUTOMATIONS],Sd=[v.Feature.WORKSPACE_BACKUPS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PDF,v.Feature.BUDIBASE_AI],_d=[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.BRANDING,v.Feature.ENFORCEABLE_SSO,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.SYNC_AUTOMATIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.VIEW_PERMISSIONS,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.CUSTOM_APP_SCRIPTS,v.Feature.PWA,v.Feature.PDF,v.Feature.BUDIBASE_AI,v.Feature.RECAPTCHA,v.Feature.PKCE_OIDC,v.Feature.TRANSLATIONS],PE={[v.PlanType.FREE]:[...St.SELF_FREE_LICENSE.features],[v.PlanType.PREMIUM]:[v.Feature.WORKSPACE_BACKUPS,v.Feature.BRANDING,v.Feature.VIEW_PERMISSIONS,v.Feature.PDF],[v.PlanType.PREMIUM_PLUS]:Sd,[v.PlanType.PREMIUM_MAX]:Sd,[v.PlanType.PREMIUM_PLUS_TRIAL]:[v.Feature.WORKSPACE_BACKUPS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PDF,v.Feature.BUDIBASE_AI],[v.PlanType.PRO]:Td,[v.PlanType.PRO_MAX]:Td,[v.PlanType.TEAM]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS],[v.PlanType.BUSINESS]:_d,[v.PlanType.BUSINESS_PLUS]:_d,[v.PlanType.ENTERPRISE_BASIC]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.ENFORCEABLE_SSO,v.Feature.AUDIT_LOGS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.OFFLINE,v.Feature.EXPANDED_PUBLIC_API,v.Feature.WORKSPACE_IMPORT_EXPORT,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.SCIM,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PWA,v.Feature.CUSTOM_APP_SCRIPTS,v.Feature.PDF,v.Feature.BUDIBASE_AI,v.Feature.RECAPTCHA,v.Feature.PKCE_OIDC,v.Feature.TRANSLATIONS,v.Feature.MICROFRONTEND],[v.PlanType.ENTERPRISE_BASIC_TRIAL]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.ENFORCEABLE_SSO,v.Feature.EMBED_AUTH,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.EXPANDED_PUBLIC_API,v.Feature.WORKSPACE_IMPORT_EXPORT,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.SCIM,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PWA,v.Feature.CUSTOM_APP_SCRIPTS,v.Feature.PDF,v.Feature.BUDIBASE_AI,v.Feature.RECAPTCHA,v.Feature.PKCE_OIDC,v.Feature.TRANSLATIONS,v.Feature.MICROFRONTEND],[v.PlanType.ENTERPRISE]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.ENFORCEABLE_SSO,v.Feature.EMBED_AUTH,v.Feature.AUDIT_LOGS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.OFFLINE,v.Feature.EXPANDED_PUBLIC_API,v.Feature.WORKSPACE_IMPORT_EXPORT,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.SCIM,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PWA,v.Feature.CUSTOM_APP_SCRIPTS,v.Feature.PDF,v.Feature.BUDIBASE_AI,v.Feature.RECAPTCHA,v.Feature.PKCE_OIDC,v.Feature.TRANSLATIONS,v.Feature.MICROFRONTEND]};function Di(e){function t(r){let a=r[e];if(!a)throw new Error(`Features do not exist for planType=${e}`);return a}return n(t,"readFeatures"),t(PE)}n(Di,"getOfflineFeatures");var xo={};F(xo,{UNLIMITED:()=>g,getQuotas:()=>qi});var se=require("@budibase/types");var p=Xt,xd=St,g=-1,_t=n(e=>e*1e6,"millions"),kE={[se.PlanType.FREE]:{...xd.CLOUD_FREE_LICENSE.quotas},[se.PlanType.PREMIUM]:{usage:{monthly:{...p.queries(g),...p.automations(1e3),...p.budibaseAICredits(0),...p.actions(5e3)},static:{...p.rows(1e4),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[se.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(10)),...p.actions(2e4)},static:{...p.rows(25e4),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[se.PlanType.PREMIUM_MAX]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(10)),...p.actions(5e4)},static:{...p.rows(25e4),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[se.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(75e4),...p.actions(2e4)},static:{...p.rows(25e4),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[se.PlanType.PRO]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(2)),...p.actions(5e3)},static:{...p.rows(5e4),...p.apps(g),...p.users(g),...p.creators(1),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(1),...p.automationLogRetentionDays(1),...p.appBackupRetentionDays(0)}},[se.PlanType.PRO_MAX]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(2)),...p.actions(1e4)},static:{...p.rows(5e4),...p.apps(g),...p.users(g),...p.creators(1),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(1),...p.automationLogRetentionDays(1),...p.appBackupRetentionDays(0)}},[se.PlanType.TEAM]:{usage:{monthly:{...p.queries(g),...p.automations(1e4),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(10),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(90)}},[se.PlanType.BUSINESS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(50)),...p.actions(25e4)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(g)}},[se.PlanType.BUSINESS_PLUS]:void 0,[se.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(50)),...p.actions(25e4)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(g),...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}},[se.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(75e4),...p.actions(25e4)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(1),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(15),...p.automationLogRetentionDays(15),...p.appBackupRetentionDays(15)}},[se.PlanType.ENTERPRISE]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(50)),...p.actions(25e4)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(g),...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}}},NE={[se.PlanType.FREE]:{...xd.SELF_FREE_LICENSE.quotas},[se.PlanType.PREMIUM]:void 0,[se.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(2)),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(1)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[se.PlanType.PREMIUM_MAX]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(2)),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(1)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[se.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(1)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[se.PlanType.PRO]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(5),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[se.PlanType.PRO_MAX]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(5),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[se.PlanType.TEAM]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(10),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(90)}},[se.PlanType.BUSINESS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(50),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(g),...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}},[se.PlanType.BUSINESS_PLUS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(50)),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(g)}},[se.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(50)),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(g),...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}},[se.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(75e4),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(15),...p.automationLogRetentionDays(15),...p.appBackupRetentionDays(15)}},[se.PlanType.ENTERPRISE]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(50)),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(g),...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}}};function qi(e,t){let r;function a(o){let s=o[t];if(!s)throw new Error(`Quotas do not exist for planType=${t} and hosting=${e}`);return s}switch(n(a,"readQuotas"),e){case se.Hosting.SELF:r=a(NE);break;case se.Hosting.CLOUD:r=a(kE);break}return JSON.parse(JSON.stringify(r))}n(qi,"getQuotas");var Ao={};F(Ao,{encoding:()=>ea,workspaceExists:()=>DE});var Ad=require("@budibase/backend-core");async function DE(e){return(await Ad.db.getAllWorkspaces({all:!0,idsOnly:!0})).includes(e)}n(DE,"workspaceExists");var ea={};F(ea,{base64ToObject:()=>UE,objectToBase64:()=>qE});function qE(e){let t=JSON.stringify(e);return Buffer.from(t).toString("base64")}n(qE,"objectToBase64");function UE(e){let t=Buffer.from(e,"base64").toString();return JSON.parse(t)}n(UE,"base64ToObject");var ph=require("@budibase/types"),Kt=require("@budibase/backend-core"),dh=Te($m()),fh=Te(ul());async function dk(e){await pl(e),await ot.save({offlineLicenseToken:e}),await qr()}n(dk,"activateOfflineLicenseToken");async function fk(){await ot.save({offlineLicenseToken:void 0}),await qr()}n(fk,"deleteOfflineLicenseToken");async function mh(){return(await ot.get()).offlineLicenseToken}n(mh,"getOfflineLicenseToken");async function cl(){let t=(await Kt.installation.getInstall()).installId,r=Kt.context.getTenantId(),a=await Kt.events.identification.getUniqueTenantId(r);return{installId:t,tenantId:a}}n(cl,"getIdentifier");async function mk(){let e=await cl();return ea.objectToBase64(e)}n(mk,"getIdentifierBase64");function gk(e){return ea.base64ToObject(e)}n(gk,"getIdentifierFromBase64");function gh(e){let t=Date.now(),r=new Date(e.expireAt).getTime();if(!Number.isFinite(r)||t>r)throw new Error(`Offline license has expired. expireAt=${e.expireAt}`)}n(gh,"verifyExpiry");var Mn=class extends Error{static{n(this,"OfflineLicenseMismatchError")}};async function hh(e){let t=await cl();if(e.identifier.installId!==t.installId||e.identifier.tenantId!==t.tenantId)throw new Mn("Invalid offline license")}n(hh,"verifyInstallation");function yh(e){let t=e.plan.type,r=ph.Hosting.SELF,a=Di(t),o=qi(r,t);return e.features=(0,dh.default)(e.features,a),e.quotas=(0,fh.default)(e.quotas,o),e}n(yh,"enrichLicense");async function pl(e){let t;try{t=await dn(e)}catch{throw new Kt.HTTPError("Invalid offline license token",400)}try{gh(t)}catch{throw new Kt.HTTPError("Offline license has expired",400)}try{await hh(t)}catch(r){throw r instanceof Mn?new Kt.HTTPError("Offline license does not match this installation",400):r}return t}n(pl,"verifyOfflineLicenseToken");async function dl(){try{let e=await mh();if(e){let t=await pl(e);return yh(t)}}catch(e){console.error("Error retrieving offline license",e)}}n(dl,"getOfflineLicense");var kn={};F(kn,{deleteDevLicense:()=>wk,getOfflineLicense:()=>vk,writeDevLicenseToDisk:()=>bk});var vh=require("@budibase/backend-core"),ml=require("path"),bh=require("os"),Ur=Te(require("fs"));var hk=vh.env.isTest()?".budibase-test":".budibase",fl=(0,ml.join)((0,bh.tmpdir)(),hk),yk="dev_license.txt",Pn=(0,ml.join)(fl,yk);if(!Ur.default.existsSync(fl))try{Ur.default.mkdirSync(fl)}catch{}function vk(){try{if(Ur.default.existsSync(Pn)){let e=Ur.default.readFileSync(Pn,{encoding:"utf-8"});return dn(e)}}catch(e){console.error("Error retrieving offline license from disk",e)}}n(vk,"getOfflineLicense");function bk(e){console.log(`Writing license to: ${Pn}`),Ur.default.writeFileSync(Pn,e,{encoding:"utf-8"})}n(bk,"writeDevLicenseToDisk");function wk(){Ur.default.rmSync(Pn,{force:!0})}n(wk,"deleteDevLicense");var wh=require("dd-trace");var hl=n(async()=>await wh.tracer.trace("getLicense",async e=>{if(gl.env.OFFLINE_MODE)return e.addTags({offline:!0}),dl();let t=await Xr();return t||(e.addTags({offlineFallback:!0}),t=kn.getOfflineLicense()),t}),"getLicense"),yl=n(e=>Pi(e),"getLicenseFromKey"),vl=n(()=>gl.env.SELF_HOSTED?St.SELF_FREE_LICENSE:St.CLOUD_FREE_LICENSE,"getFreeLicense");var wl={};F(wl,{activateLicenseKey:()=>Ik,deleteLicenseKey:()=>Sk,getLicenseKey:()=>Tk});var bl=Te(require("dd-trace"));async function Ik(e){await ki(e),await ot.save({licenseKey:e}),await qr()}n(Ik,"activateLicenseKey");async function Tk(){return await bl.default.trace("getLicenseKey",async e=>{let t=await ot.get();return e.addTags({licenseKey:t.licenseKey}),t.licenseKey})}n(Tk,"getLicenseKey");async function Sk(){return await bl.default.trace("deleteLicenseKey",async()=>{await ot.save({licenseKey:void 0}),await qr()})}n(Sk,"deleteLicenseKey");var $o=require("@budibase/backend-core");var Nn,xk=n(async()=>{Nn=await $o.RedisClient.init($o.redis.utils.Databases.LICENSES)},"init"),Ak=n(async()=>{Nn&&await Nn.finish()},"shutdown");process.on("exit",async()=>{await Ak()});var Wo=n(async()=>(Nn||await xk(),Nn),"getClient");var Th=require("@budibase/shared-core");var Tl=yt.Duration.fromHours(1).toSeconds(),Sh=yt.Duration.fromHours(1).toSeconds(),Rk=Tl+Sh,qr=n(async()=>{await Ah(),await xh()},"refresh"),Ih=n(async e=>{let{result:t}=await yt.locks.doWithLock({type:Ko.LockType.DEFAULT,name:Ko.LockName.SYNC_ACCOUNT_LICENSE,resource:e,ttl:yt.Duration.fromSeconds(10).toMs()},async()=>{let r=await Wo(),a=await r.get(e);if(a&&!_h(a))return a;let o=await Vo.default.trace("populateLicense",async()=>await hl());return o||(o=Vo.default.trace("populateFreeLicense",()=>vl())),o.refreshedAt=new Date().toISOString(),await r.store(e,o,Rk),o});return t},"populateAndStoreLicense"),_h=n(e=>{let t=e.refreshedAt?Date.parse(e.refreshedAt):0;return Date.now()-t>=Tl*1e3},"shouldRefreshLicense"),Il=n(async()=>await Vo.default.trace("getCachedLicense",async e=>{let t=yt.context.getLicense();if(t)return e.addTags({foundInContext:!0,features:t.features,plan:t.plan,quotas:t.quotas}),t;let r=yt.tenancy.getTenantId(),o=await(await Wo()).get(r);return e.addTags({tenantId:r,foundInCache:!!o}),o?(e.addTags({foundInCache:!0,refreshedAt:o.refreshedAt,features:o.features,plan:o.plan,quotas:o.quotas}),_h(o)&&Ih(r).catch(()=>{}),o):(o=await Th.helpers.retry(()=>Ih(r)),e.addTags({refreshedAt:o.refreshedAt,features:o.features,plan:o.plan,quotas:o.quotas,expirySeconds:Tl,staleGraceSeconds:Sh}),o)}),"_getCachedLicense");yt.env.isJest()&&(Il=jest.fn().mockImplementation(Il));var xh=Il,Ah=n(async()=>{let e=yt.tenancy.getTenantId();await(await Wo()).delete(e)},"invalidate");async function Me(e,t){Array.isArray(e)||(e=[e]),t||(t=await Ct.getCachedLicense());for(let r of e)if(!t?.features.includes(r))return!1;return!0}n(Me,"areFeaturesEnabled");async function Qo(e,t){if(!await Me(e,t))throw new er.FeatureDisabledWarning(e)}n(Qo,"checkFeature");async function Sl(e,t){if(!await Me(e,t)){let r=e.join(", ");throw new er.FeatureDisabledWarning(r)}}n(Sl,"checkFeatures");function He(e){return async(...t)=>(await Qo(Ee.Feature.WORKSPACE_BACKUPS),e(...t))}n(He,"checkBackups");async function _l(){return Me(Ee.Feature.WORKSPACE_BACKUPS)}n(_l,"isBackupsEnabled");async function xl(){return Me(Ee.Feature.BRANDING)}n(xl,"isBrandingEnabled");async function Ok(e){return Me(Ee.Feature.MICROFRONTEND,e)}n(Ok,"isMicrofrontendFeatureEnabled");async function Eh(){return Me(Ee.Feature.ENFORCEABLE_SSO)}n(Eh,"isEnforceableSSO");async function Ck(){return Me(Ee.Feature.EMBED_AUTH)}n(Ck,"isEmbedAuthEnabled");async function Mk(){return Me(Ee.Feature.SYNC_AUTOMATIONS)}n(Mk,"isSyncAutomationsEnabled");async function Pk(){return Me(Ee.Feature.TRIGGER_AUTOMATION_RUN)}n(Pk,"isTriggerAutomationRunEnabled");async function Ho(){return Me(Ee.Feature.AUDIT_LOGS)}n(Ho,"isAuditLogsEnabled");async function Al(){return Me(Ee.Feature.USER_GROUPS)}n(Al,"isUserGroupsEnabled");function kk(){return Me(Ee.Feature.PWA)}n(kk,"isPWAEnabled");function Nk(){return Me(Ee.Feature.RECAPTCHA)}n(Nk,"isRecaptchaEnabled");var Dk=n(()=>Me(Ee.Feature.PKCE_OIDC),"isPkceOidcEnabled");async function qk(){return Me(Ee.Feature.TRANSLATIONS)}n(qk,"isTranslationsEnabled");async function da(){return Me(Ee.Feature.EXPANDED_PUBLIC_API)}n(da,"isExpandedPublicApiEnabled");async function Uk(){return Me(Ee.Feature.WORKSPACE_IMPORT_EXPORT)}n(Uk,"isWorkspaceImportExportEnabled");async function Jo(){return Me([Ee.Feature.EXPANDED_PUBLIC_API,Ee.Feature.WORKSPACE_IMPORT_EXPORT])}n(Jo,"isWorkspaceImportExportPublicApiEnabled");async function Lk(e){if(er.env.ENABLE_SSO_MAINTENANCE_MODE||!await Eh())return!1;let r;return e?.config?r=e.config:r=await er.configs.getSettingsConfig(),!!r.isSSOEnforced}n(Lk,"isSSOEnforced");var El=n(async()=>{let e=Ee.Feature.SCIM,t=await Me(e),r=await er.configs.getSCIMConfig();if(!t||!r?.enabled)throw new er.FeatureDisabledWarning(e);return!0},"checkSCIM");async function Fk(){return Me(Ee.Feature.VIEW_PERMISSIONS)}n(Fk,"isViewPermissionEnabled");async function Bk(){return Me(Ee.Feature.VIEW_READONLY_COLUMNS)}n(Bk,"isViewReadonlyColumnsEnabled");var jk={faviconUrl:void 0,faviconUrlEtag:void 0,emailBrandingEnabled:!0,platformTitle:void 0,loginHeading:void 0,loginButton:void 0,metaDescription:void 0,metaImageUrl:void 0,metaTitle:void 0};async function Gk(e){return await xl()?{faviconUrl:e.faviconUrl,faviconUrlEtag:e.faviconUrlEtag,emailBrandingEnabled:e.emailBrandingEnabled,platformTitle:e.platformTitle,loginHeading:e.loginHeading,loginButton:e.loginButton,metaDescription:e.metaDescription,metaImageUrl:e.metaImageUrl,metaTitle:e.metaTitle}:jk}n(Gk,"getBrandingConfig");var Jt={};F(Jt,{addAction:()=>Kk,addApp:()=>Qk,addAutomation:()=>Xk,addGroup:()=>Ol,addPlugin:()=>Ml,addRow:()=>Jk,addRows:()=>zk,addUsers:()=>es,bustCache:()=>vi,decrement:()=>tr,decrementMany:()=>Dn,getCurrentUsageValues:()=>zp,getLicensedQuota:()=>zo,getQuotaUsage:()=>Mr,increment:()=>vt,incrementBudibaseAICredits:()=>eN,incrementMany:()=>Fr,removeApp:()=>Hk,removeGroup:()=>Cl,removePlugin:()=>Pl,removeRow:()=>Yk,removeRows:()=>Zk,removeUsers:()=>ha,set:()=>qn,setAllUsage:()=>wi,setAppUsageValue:()=>bi,setBudibaseAICredits:()=>Mh,setUsage:()=>Qp,setUsagePerApp:()=>Hp,throwIfBudibaseAICreditsExceeded:()=>rN,updatePluginCount:()=>kl,updateUsage:()=>fa,usageLimitIsExceeded:()=>Rl,utils:()=>Wa});var Zo=require("@budibase/types");var Nt=require("@budibase/backend-core"),Le=require("@budibase/types"),Lr=require("dd-trace");var vt=n(async(e,t,r)=>await Lr.tracer.trace("quotas.increment",async a=>(a.addTags({name:e,type:t}),await Rh({change:1,name:e,type:t,opts:r}))),"increment"),Fr=n(e=>Lr.tracer.trace("quotas.incrementMany",async()=>Rh(e)),"incrementMany"),Rh=n(async e=>await Lr.tracer.trace("quotas.tryIncrement",async t=>{let r=Array.isArray(e)?e:[e];t.addTags({numActions:r.length}),await fa(r.map(o=>({usageChange:o.change,name:o.name,type:o.type,opts:{dryRun:!0,suppressErrorLog:o.opts?.suppressErrorLog,id:o.opts?.id}})));let a=[];for(let o of r)await Lr.tracer.trace("quotas.incrementMany.fn",async s=>{s.addTags({actionName:o.name,actionType:o.type,actionChange:o.change});let i=o.opts?.fn;i&&a.push(await i())});return await fa(r.map(o=>({usageChange:o.change,name:o.name,type:o.type,opts:{dryRun:!1,valueFn:o.opts?.valueFn,suppressErrorLog:o.opts?.suppressErrorLog,id:o.opts?.id}}))),a[0]}),"tryIncrement"),tr=n((e,t,r={})=>fa({usageChange:-1,name:e,type:t,opts:r}),"decrement"),Dn=n(e=>{let t=Array.isArray(e)?e:[e];return fa(t.map(r=>({usageChange:-r.change,name:r.name,type:r.type,opts:r.opts})))},"decrementMany"),qn=n(async(e,t,r)=>Tt.setUsage(r,e,t),"set"),$k=n((e,t,r)=>{if(e==Le.QuotaUsageType.STATIC){let a=r.usageQuota.triggers;return a?a[t]||{}:{}}else{let a=Tt.utils.getCurrentMonthString(),o=r.monthly[a].triggers;return o?o[t]||{}:{}}},"getExistingTriggers"),Wk=n(async(e,t,r,a)=>{try{await Nt.locks.doWithLock({type:Le.LockType.TRY_ONCE,name:Le.LockName.TRIGGER_QUOTA,resource:e,ttl:1e4},async()=>{let o={percentage:r,name:t.name};a&&(o.resetDate=a),await br.triggerQuota(o)})}catch(o){Nt.logging.logAlert("Error triggering quota",o)}},"triggerQuota"),Vk=n(async(e,t,r,a)=>{let o=await Mr(),s=e===Le.QuotaUsageType.MONTHLY?o.quotaReset:void 0,i=await $k(e,t,o),l=a.triggers,u=r/a.value*100;u>100&&(u=100);for(let[c,d]of l.entries())if(u>=d&&a.value!==Xt.UNLIMITED){if(!i[d]){i[d]=new Date().toISOString();let h=l[c+1]||100;(!(u>=h)||u===d)&&await Wk(t,a,u,s)}}else i[d]=void 0;return i},"checkTriggers"),fa=n(async e=>{await Lr.tracer.trace("quotas.updateUsage",async t=>{let r=Nt.tenancy.getTenantId(),a=Array.isArray(e)?e:[e];t.addTags({numActions:a.length,tenantId:r});let o,s,i=[],l={},u={},c={},d={};for(let h of a)await Lr.tracer.trace("quotas.updateUsage.action",async b=>{b.addTags({actionName:h.name,actionType:h.type,actionUsageChange:h.usageChange});try{o=Nt.context.getWorkspaceId()}catch{}if(Le.APP_QUOTA_NAMES.includes(h.name)&&!o)throw new Error("App context required for quota update");try{s=await zo(Le.QuotaType.USAGE,h.name,h.type),i.push(s);let{total:w,app:S,breakdown:A}=await Tt.getCurrentUsageValues(h.type,h.name,h.opts?.id);w+=h.usageChange,S!=null&&(S+=h.usageChange),A!=null&&(A+=h.usageChange);let D={};if(h.opts?.dryRun||(D=await Vk(h.type,h.name,w,s),d={...d,[h.name]:D}),s.value!==Xt.UNLIMITED&&w>s.value&&h.usageChange>0)throw new Nt.UsageLimitWarning(`${h.name}`);if(w=Math.max(0,w),S&&(S=Math.max(0,S)),A!=null&&(A=Math.max(0,A),c={...c,[h.name]:A}),!h.opts?.dryRun){let W=h.opts?.valueFn;W&&(w=await W(),S=w),l={...l,[h.name]:w},u={...u,[h.name]:S}}}catch(w){throw h.opts?.suppressErrorLog||console.warn(`Error updating usage quotas for ${h.name}`,w),w}});let y=a.filter(h=>!h.opts?.dryRun).map(h=>({name:h.name,type:h.type,values:{total:l[h.name],app:u[h.name],breakdown:c[h.name],triggers:d[h.name]},opts:{...h.opts,tenantId:r}}));y.length>0&&await Tt.setAllUsage(y)})},"updateUsage"),zo=n(async(e,t,r)=>{let a=await Ct.getCachedLicense();if(!a){let o=Nt.tenancy.getTenantId();throw new Error("License not found for tenant id "+o)}if(r&&(0,Le.isStaticQuota)(e,r,t))return a.quotas[e][r][t];if(r&&(0,Le.isMonthlyQuota)(e,r,t))return a.quotas[e][r][t];if((0,Le.isConstantQuota)(e,t))return a.quotas[e][t];throw new Error("Invalid quota type")},"getLicensedQuota"),Rl=n(async({name:e,type:t,usageChange:r})=>{try{return await fa({usageChange:r,name:e,type:t,opts:{dryRun:!0}}),!1}catch(a){if(a.code===Le.APIWarningCode.USAGE_LIMIT_EXCEEDED)return!0;throw a}},"usageLimitIsExceeded");var Kk=n(async(e,t)=>vt(Zo.MonthlyQuotaName.ACTIONS,Zo.QuotaUsageType.MONTHLY,{fn:t,id:e}),"addAction");var Oh=require("@budibase/backend-core"),ma=require("@budibase/types");var Ch=n(async()=>{let e=await Oh.db.getAllWorkspaces({dev:!0});return e?e.length:0},"getDevAppsCount"),Qk=n(async(e,{appId:t}={})=>vt(ma.StaticQuotaName.WORKSPACES,ma.QuotaUsageType.STATIC,{fn:e,valueFn:Ch,id:t}),"addApp"),Hk=n(async({appId:e}={})=>tr(ma.StaticQuotaName.WORKSPACES,ma.QuotaUsageType.STATIC,{valueFn:Ch,id:e}),"removeApp");var Qt=require("@budibase/types");var Jk=n(async(e,{tableId:t}={})=>vt(Qt.StaticQuotaName.ROWS,Qt.QuotaUsageType.STATIC,{fn:e,id:t}),"addRow"),Yk=n(async({tableId:e}={})=>tr(Qt.StaticQuotaName.ROWS,Qt.QuotaUsageType.STATIC,{id:e}),"removeRow"),zk=n(async(e,t,{tableId:r}={})=>Fr({change:e,name:Qt.StaticQuotaName.ROWS,type:Qt.QuotaUsageType.STATIC,opts:{fn:t,id:r}}),"addRows"),Zk=n(async(e,{tableId:t}={})=>Dn({change:e,name:Qt.StaticQuotaName.ROWS,type:Qt.QuotaUsageType.STATIC,opts:{id:t}}),"removeRows");var Xo=require("@budibase/types");var Xk=n(async(e,{automationId:t}={})=>vt(Xo.MonthlyQuotaName.AUTOMATIONS,Xo.QuotaUsageType.MONTHLY,{fn:e,id:t}),"addAutomation");var ga=require("@budibase/types");var Ol=n(async e=>vt(ga.StaticQuotaName.USER_GROUPS,ga.QuotaUsageType.STATIC,{fn:e}),"addGroup"),Cl=n(async()=>tr(ga.StaticQuotaName.USER_GROUPS,ga.QuotaUsageType.STATIC),"removeGroup");var Sr=require("@budibase/types");var Ml=n(async e=>vt(Sr.StaticQuotaName.PLUGINS,Sr.QuotaUsageType.STATIC,{fn:e}),"addPlugin"),Pl=n(async()=>tr(Sr.StaticQuotaName.PLUGINS,Sr.QuotaUsageType.STATIC),"removePlugin"),kl=n(async e=>qn(Sr.StaticQuotaName.PLUGINS,Sr.QuotaUsageType.STATIC,e),"updatePluginCount");var Ht=require("@budibase/types"),Un=require("@budibase/backend-core");var es=n(async(e,t,r)=>{if(e===0&&t===0)return r?await r():void 0;let a=[{change:e,name:Ht.StaticQuotaName.USERS,type:Ht.QuotaUsageType.STATIC,opts:{fn:r,valueFn:Un.users.getUserCount}}];t>0&&a.push({change:t,name:Ht.StaticQuotaName.CREATORS,type:Ht.QuotaUsageType.STATIC,opts:{valueFn:Un.users.getCreatorCount}});let o=await Fr(a);return Promise.resolve(Xr()).catch(s=>{console.log("Failed to sync license after adding users",s)}),o},"addUsers"),ha=n(async(e,t)=>{let r=[{change:e,name:Ht.StaticQuotaName.USERS,type:Ht.QuotaUsageType.STATIC,opts:{valueFn:Un.users.getUserCount}}];t>0&&r.push({change:t,name:Ht.StaticQuotaName.CREATORS,type:Ht.QuotaUsageType.STATIC,opts:{valueFn:Un.users.getCreatorCount}}),await Dn(r),Promise.resolve(Xr()).catch(a=>{console.log("Failed to sync license after removing users",a)})},"removeUsers");var st=require("@budibase/types");var Nl=require("@budibase/backend-core"),as=require("@budibase/types");var ts=class extends Nl.HTTPError{static{n(this,"GroupNameUnavailableError")}constructor(t){super(`Group name "${t}" is unavailable`,409)}},rs=class extends Nl.HTTPError{static{n(this,"AICreditsExhaustedError")}constructor(){super("You have reached your Budibase AI Credits limit for this billing cycle.",402),this.code=as.APIWarningCode.USAGE_LIMIT_EXCEEDED}getPublicError(){return{quota:as.MonthlyQuotaName.BUDIBASE_AI_CREDITS}}};var eN=n(async e=>{try{return await Fr({change:e,name:st.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:st.QuotaUsageType.MONTHLY})}catch(t){throw t.code===st.APIWarningCode.USAGE_LIMIT_EXCEEDED&&await tN().catch(()=>{}),t}},"incrementBudibaseAICredits"),tN=n(async()=>{let e=await zo(st.QuotaType.USAGE,st.MonthlyQuotaName.BUDIBASE_AI_CREDITS,st.QuotaUsageType.MONTHLY);e.value>=0&&await Mh(e.value)},"capBudibaseAICreditsAtLimit"),rN=n(async()=>{if(await Rl({name:st.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:st.QuotaUsageType.MONTHLY,usageChange:1}))throw new rs},"throwIfBudibaseAICreditsExceeded"),Mh=n(async e=>qn(st.MonthlyQuotaName.BUDIBASE_AI_CREDITS,st.QuotaUsageType.MONTHLY,e),"setBudibaseAICredits");var ns={};F(ns,{db:()=>qt});var Ul=require("@budibase/backend-core");var Dt={};F(Dt,{addUsers:()=>uN,adjustGroupCreatorsQuotas:()=>fN,cleanupApp:()=>dN,enrichUserRolesFromGroups:()=>nN,fetch:()=>ql,get:()=>Uh,getBulk:()=>Lh,getDefaultGroup:()=>oN,getGroupBuilderAppIds:()=>qh,getGroupRoleId:()=>aN,remove:()=>lN,removeUsers:()=>cN,save:()=>Fh,updateGroupApps:()=>pN});var Q=require("@budibase/backend-core");async function Dl(e,t){try{let r=[];for(let l of e)if(l.roles){let u=l.roles[Q.db.getProdWorkspaceID(t)];u&&r.push(u)}let a=await Promise.all(r.map(async l=>({[l]:await Q.roles.roleToNumber(l)}))),o,s,i={};a.forEach(l=>{let[u,c]=Object.entries(l)[0];i[u]={roleId:u,roleNum:c}});for(let{roleId:l,roleNum:u}of Object.values(i))(s===void 0||u>s)&&(s=u,o=l);return o}catch(r){throw Q.logging.logAlert(`Error finding higest role for ${e.length} on app ${t}`,r),r}}n(Dl,"findHighestRole");async function Dh(e,t){return t?t=t.filter(r=>e.includes(r._id)):t=await oe.getBulk(e,{enriched:!1}),t}n(Dh,"groupList");async function qh(e,t){if(!e.userGroups)return[];let r=await Dh(e.userGroups,t?.groups),a=t?.appId?Q.db.getProdWorkspaceID(t?.appId):null,o=[];for(let s of r){let i=s.builder?.apps;a&&i?.includes(a)?o.push(a):a||(o=o.concat(i||[]))}return[...new Set(o)]}n(qh,"getGroupBuilderAppIds");async function aN(e,t,r){if(!e.userGroups)return null;let a=await Dh(e.userGroups,r?.groups),o=Q.db.getProdWorkspaceID(t);return e.roles?.[o]?e.roles[o]:(a=a.filter(l=>l?.roles?Object.keys(l.roles).includes(o):!1),Q.context.getCurrentContext()?.appId===t?Dl(a,t):await Q.context.doInWorkspaceContext(t,async()=>Dl(a,t)))}n(aN,"getGroupRoleId");async function nN(e){if(!e||!e.userGroups)return e;let t=await Lh(e.userGroups,{enriched:!1}),r=[];for(let o of t)o?.roles&&(r=r.concat(Object.keys(o.roles)));r=[...new Set(r)];for(let o of r)await Q.context.doInWorkspaceContext(o,async()=>{if(e.roles[o])return;let s=await Dl(t,o);s&&(e.roles[o]=s)});let a=await qh(e,{groups:t});if(a.length&&!e.builder?.global){let o=e.builder?.apps||[];e.builder={...e.builder,apps:o.concat(a)}}return e}n(nN,"enrichUserRolesFromGroups");async function ql(){return await oe.fetch()}n(ql,"fetch");async function Uh(e){return await oe.get(e)}n(Uh,"get");async function oN(){return(await oe.getAll()).find(t=>t.isDefault)}n(oN,"getDefaultGroup");async function Lh(e,t={enriched:!0}){return oe.getBulk(e,t)}n(Lh,"getBulk");async function Ph(e){if(await oe.getByName(e))throw new ts(e)}n(Ph,"guardNameAvailability");async function kh(e){let t=await oe.getGroupUsers(e._id);if(!t.length)return 0;let a=await Q.tenancy.getGlobalDB().getMultiple(t.map(s=>s._id));return(await Q.userUtils.creatorsInList(a)).filter(s=>s).length}n(kh,"getCreatorsCountInGroup");function Nh(e){return Object.values(e.roles||{}).includes("CREATOR")}n(Nh,"isCreatorGroup");function sN(e){let{users:t,...r}=e;return r}n(sN,"stripEnrichedFields");async function iN(e){if(!e.isDefault)return oe.save(e);let r=(await oe.getAll()).filter(i=>i._id!==e._id).filter(i=>i.isDefault);if(!r.length)return oe.save(e);let o=(await oe.bulkSave([...r.map(i=>({...i,isDefault:!1})),e])).find(i=>i.id===e._id);if(o?.rev)return{id:e._id,rev:o.rev};let s=await oe.get(e._id);return{id:s._id,rev:s._rev}}n(iN,"saveGroupWithDefaultUpdates");async function Fh(e){let t=[],r=!e._id,a=0;if(!e._id)e._id=oe.generateUserGroupID(),await Ph(e.name),t.push(Q.events.group.created(e));else{let i=await oe.get(e._id);if(i.name!==e.name&&await Ph(e.name),t.push(Q.events.group.updated(e)),JSON.stringify(i.roles)!==JSON.stringify(e.roles)){let l=Nh(i),u=Nh(e);if(l!==u){let c=i.users?.length||0,d=0;c>0&&(d=await kh(i)),u?a=c-d:a=-c}t.push(Q.events.group.permissionsEdited(e))}}await Promise.all(t);let o=sN(e),s=n(()=>iN(o),"saveGroup");if(r)return await Ol(s);{let i=await s();if(a>0)await es(0,a);else if(a<0){let l=await kh(e),u=Math.abs(a)-l;u>0&&await ha(0,u)}return i}}n(Fh,"save");async function lN(e,t){let r;try{r=await oe.get(e)}catch{throw new Error("Group not found")}let a=Object.values(r.roles||{}).includes("CREATOR"),o=n(()=>{},"recalculateCreatorsQuotasFn");if(a){let i=Q.tenancy.getGlobalDB(),l=await oe.getGroupUsers(e),c=(await Promise.all(l.map(b=>i.get(b._id)))).map(b=>({...b,userGroups:b.userGroups.filter(N=>N!==e)})),y=(await Q.userUtils.creatorsInList(c)).filter(b=>b).length,h=l.length-y;h&&(o=n(()=>ha(0,h),"recalculateCreatorsQuotasFn"))}let s=await oe.destroy(e,t);return await Q.events.group.deleted(r),await Cl(),await o(),s}n(lN,"remove");async function uN(e,t){let r=await oe.get(e),a=await Q.users.bulkGetGlobalUsersById(t),o=[];for(let u of a)u.userGroups||(u.userGroups=[]),u.userGroups.includes(e)||o.push(u);if(!o.length)return o;let s=o.map(u=>({...u,userGroups:[...u?.userGroups||[],e]}));if(await Q.users.bulkUpdateGlobalUsers(s),Object.values(r.roles||{}).includes("CREATOR")){let c=(await Q.userUtils.creatorsInList(o)).filter(y=>y).length,d=o.length-c;d&&await es(0,d)}let l=[];for(let u of t)l.push(Q.cache.user.invalidateUser(u));return await Promise.all(l),await Q.events.group.usersAdded(s.length,r,t),s}n(uN,"addUsers");async function cN(e,t){let r=await oe.get(e),a=await Q.users.bulkGetGlobalUsersById(t),o=[];for(let l of a){if(!l.userGroups||!l.userGroups.includes(e))continue;let u=l.userGroups.indexOf(e);l.userGroups.splice(u,1),o.push(l)}if(await Q.users.bulkUpdateGlobalUsers(o),Object.values(r.roles||{}).includes("CREATOR")){let u=(await Q.userUtils.creatorsInList(o)).filter(d=>d).length,c=o.length-u;c&&await ha(0,c)}let i=[];for(let l of t)i.push(Q.cache.user.invalidateUser(l));return await Promise.all(i),o.length&&await Q.events.group.usersDeleted(o.length,r,t),o}n(cN,"removeUsers");async function pN(e,t){let r=await Uh(e);if(r.roles||(r.roles={}),t.appsToAdd)for(let a of t.appsToAdd)r.roles[a.appId]=a.roleId;if(t.appsToRemove)for(let a of t.appsToRemove)delete r.roles[a.appId];return r.builder={apps:Object.entries(r.roles).filter(([a,o])=>o==="CREATOR").map(([a])=>a)},await Fh(r)}n(pN,"updateGroupApps");async function dN(e){let t=await ql(),r=[];for(let a of t)!a.roles||!a.roles[e]||(delete a.roles[e],r.push(a));return await oe.bulkSave(r)}n(dN,"cleanupApp");async function fN(){if(!await Al()){let e=Q.tenancy.getGlobalDB(),r=(await ql()||[]).filter(a=>Object.values(a?.roles||{}).includes("CREATOR"));for(let a of r){let o=await oe.getGroupUsers(a._id),i=(await Promise.all(o.map(d=>e.get(d._id)))).map(d=>({...d,userGroups:d.userGroups.filter(y=>y!==a._id)})),u=(await Q.userUtils.creatorsInList(i)).filter(d=>d).length,c=o.length-u;await oe.save({...a,roles:{}}),c&&await ha(0,c)}}}n(fN,"adjustGroupCreatorsQuotas");Ul.users.UserDB.init(Jt,Dt,kt);var qt=Ul.users.UserDB;var us={};F(us,{logs:()=>Vl});var Vl={};F(Vl,{logSearch:()=>TN,oldestLogDate:()=>Kh,storeLog:()=>SN});var ls=require("@budibase/backend-core"),is=require("@budibase/types");var $e=require("@budibase/backend-core"),ss=require("@budibase/types");var Bh=require("@budibase/backend-core");async function jh(e,t){let r,a=5,o=!1,s,i=!0;for(;a>0;a--)try{i?s=await e():s=await exports.randomDelay(e),o=!0;break}catch(l){r=l}return o||Bh.logging.logWarn(`Failed to backoff: ${t}`,r),s}n(jh,"backOff");var{SEPARATOR:rr,UNICODE_MAX:mN,DocumentType:Gh,AutomationViewMode:Ll,ViewName:gN,getQueryIndex:hN}=$e.db,yN=new Date(0).toISOString(),vN=100,os=10,Fl=n(async()=>bo(ss.ConstantQuotaName.AUTOMATION_LOG_RETENTION_DAYS),"oldestLogDate");function $h(e,t,{status:r,automationId:a}={},o={}){let s=a?`${a}${rr}`:"",i=r?`${r}${rr}`:"",l;return r&&a?l=`${Ll.ALL}${rr}${i}${s}`:r?l=`${Ll.STATUS}${rr}${i}`:a?l=`${Ll.AUTOMATION}${rr}${s}`:l=`${Gh.AUTOMATION_LOG}${rr}`,{...o,descending:!0,startkey:`${l}${t}${mN}`,endkey:`${l}${e}`}}n($h,"getAutomationLogParams");function bN(e,t,r){return`${Gh.AUTOMATION_LOG}${rr}${e}${rr}${r}${rr}${t}`}n(bN,"generateAutomationLogID");async function Bl(e,t,r={docs:!0}){let a=$e.context.getProdWorkspaceDB();await a.exists()||(a=$e.context.getDevWorkspaceDB());let o={status:r.status},s=r?.limit?r.limit:r?.paginate?os+1:void 0,i=$h(e,t,o,{include_docs:r.docs,limit:s});r?.page&&(i.startkey=r.page);let l=await a.allDocs(i),u=pn(l,{paginate:r?.paginate,pageSize:os});return{...u,totalLogs:u.totalRows}}n(Bl,"getAllLogs");async function jl(e,t,r={}){let a=$e.context.getProdWorkspaceDB();await a.exists()||(a=$e.context.getDevWorkspaceDB());let o;try{let i={automationId:r?.automationId,status:r?.status},l=$h(e,t,i,{include_docs:!0,limit:os+1});r?.page&&(l.startkey=r.page),o=await a.query(hN(gN.AUTOMATION_LOGS),l)}catch(i){if(i!=null&&(i.name==="not_found"||i.error==="not_found"))return await ud(),jl(e,t,r);throw i}let s=pn(o,{paginate:!0,pageSize:os});return{...s,totalLogs:s.totalRows/3}}n(jl,"getLogsByView");async function Wh(e,t){let r=$e.context.getProdWorkspaceDB(),a=e._id,o=e.name,s=new Date().toISOString(),i=bN(s,t.status,a),l={...t,automationId:a,status:t.status,automationName:o,createdAt:s,_id:i};return await r.put(l),i}n(Wh,"writeLog");async function Gl(e,{clearing:t}={clearing:!1}){await Vh({logIds:e,clearing:t,metadataKey:"automationErrors",failureMessage:"Failed to update app metadata with automation log error"})}n(Gl,"updateAppMetadataWithErrors");async function $l(e,{clearing:t}={clearing:!1}){await Vh({logIds:e,clearing:t,metadataKey:"automationStops",failureMessage:"Failed to update app metadata with automation log stop"})}n($l,"updateAppMetadataWithStops");async function Vh({logIds:e,clearing:t,metadataKey:r,failureMessage:a}){let o=$e.context.getProdWorkspaceDB();await jh(async()=>{let s=await o.get($e.db.DocumentType.WORKSPACE_METADATA);for(let i of e){let l=i.split($e.db.SEPARATOR),u=`${l[l.length-3]}${$e.db.SEPARATOR}${l[l.length-2]}`,c={};if(s[r]&&(c=s[r]),t&&!Array.isArray(c[u]))continue;c[u]||=[];let d=c[u].indexOf(i);if(t){if(d===-1)continue;c[u].splice(d,1)}else c[u].push(i);c[u].length===0&&delete c[u],s[r]=c}await o.put(s),await $e.cache.workspace.invalidateWorkspaceMetadata(s.appId,s)},a)}n(Vh,"updateAppMetadataWithLogIds");async function wN(){let e=await Fl();try{return await Bl(yN,e,{docs:!1,paginate:!1,limit:vN})}catch{return{data:[],hasNextPage:!1,totalLogs:0}}}n(wN,"getExpiredLogs");async function Wl(){let e=$e.context.getProdWorkspaceDB();try{let t=await wN();if(!t.data||t.data.length===0)return;let r=t.data.map(s=>({_id:s.id,_rev:s.value.rev,_deleted:!0})),a=t.data.map(s=>s.id),o=a.filter(s=>{let i=s.split($e.db.SEPARATOR);return i[i.length-1]===ss.AutomationStatus.ERROR});await e.bulkDocs(r),o.length&&await Gl(o,{clearing:!0}),a.length&&await $l(a,{clearing:!0})}catch(t){$e.logging.logAlert(`Failed to cleanup automation log history - Database "${e.name}"`,t)}}n(Wl,"clearOldHistory");var Kh=Fl;async function IN(e,t,r,a){let o,s=new Date().toISOString(),i=await Kh();return(!e||e<i)&&(e=i),r||t?o=await jl(e,s,{automationId:r,status:t,page:a}):o=await Bl(e,s,{status:t,page:a,docs:!0,paginate:!0}),o}n(IN,"getLogs");async function TN(e){return await Wl(),await IN(e.startDate,e.status,e.automationId,e.page)}n(TN,"logSearch");async function SN(e,t){if(!ls.db.isProdWorkspaceID(ls.context.getWorkspaceId()))return;let r=await Wh(e,t);t.status===is.AutomationStatus.ERROR&&await Gl([r]),t.status===is.AutomationStatus.STOPPED&&t.steps.some(a=>a.inputs?.notify===!0&&a.outputs.status===is.AutomationStatus.STOPPED)&&await $l([r]),await Wl()}n(SN,"storeLog");var cs={};F(cs,{checkPluginQuotas:()=>AN,deletePlugin:()=>xN,storePlugin:()=>_N});var Yh=require("@budibase/types"),Fe=require("@budibase/backend-core"),zh=Te(require("module")),Zh=Te(require("isolated-vm"));var Qh=Te(require("fs")),Hh=require("path");function Jh(e,t){return Qh.default.readFileSync((0,Hh.join)(e,t),"utf8")}n(Jh,"loadJSFile");async function _N(e,t,r,a){let o=Fe.tenancy.getGlobalDB(),s=e.package.version,i=e.package.name,l=e.package.description,u=e.schema.hash,c=Fe.objectStore.getPluginS3Dir(i),d=await Fe.objectStore.uploadDirectory(Fe.objectStore.ObjectStoreBuckets.PLUGINS,t,c),y=d.find(D=>D.name.endsWith(".js")),h=d.find(D=>D.name.endsWith(".svg"));if(!y)throw new Error("Plugin missing .js file.");if(e.schema.type===Yh.PluginType.DATASOURCE){let D=Jh(t,y.name),W=new Zh.default.Isolate({memoryLimit:8});try{W.compileScriptSync(zh.default.wrap(D),{filename:y.name})}catch(ne){let J=ne?.message?ne.message:JSON.stringify(ne);throw new Error(`JS invalid: ${J}`)}finally{W.dispose()}}let b=h?h.name:null,N=Fe.db.generatePluginID(i),w;try{w=(await o.get(N))._rev}catch{w=void 0}let S={_id:N,_rev:w,...e,name:i,version:s,hash:u,description:l,source:r};b&&(S.iconFileName=b),r&&(S={...S,source:r}),a&&a.source==="github"&&(S.origin=a);let A=n(async()=>{let D=await o.put(S);return await Fe.events.plugin.imported(S),{...S,_rev:D.rev}},"write");return w?await A():await Ml(A)}n(_N,"storePlugin");async function xN(e){let t=Fe.tenancy.getGlobalDB();try{let r=await t.get(e),a=Fe.objectStore.getPluginS3Dir(r.name);await Fe.objectStore.deleteFolder(Fe.objectStore.ObjectStoreBuckets.PLUGINS,a),await t.remove(e,r._rev),await Fe.events.plugin.deleted(r),await Pl()}catch(r){let a=r?.message?r?.message:r;throw new Error(`Failed to delete plugin: ${a}`)}}n(xN,"deletePlugin");async function AN(){let e=Fe.tenancy.getGlobalDB();try{let r=(await e.allDocs(Fe.db.getPluginParams())).rows.length;console.log(`Syncing plugin count: ${r}`),await kl(r)}catch(t){Fe.logging.logAlert("Unable to retrieve plugins for quota check",t)}}n(AN,"checkPluginQuotas");var ps={};F(ps,{fetch:()=>RN,fetchValues:()=>ON,isEncryptionKeyAvailable:()=>EN,isValid:()=>ty,remove:()=>MN,update:()=>CN});var Xh=require("@budibase/backend-core"),Ln=require("@budibase/types");function EN(){return!!Xh.env.ENCRYPTION_KEY}n(EN,"isEncryptionKeyAvailable");async function RN(){let e=await yr.get();return Object.keys(e.variables)}n(RN,"fetch");async function ON(e){let r=(await yr.get()).variables,a={};for(let[o,s]of Object.entries(r))switch(e){case Ln.Environment.DEVELOPMENT:a[o]=s.development;break;case Ln.Environment.PRODUCTION:default:a[o]=s.production;break}return a}n(ON,"fetchValues");async function ey(e){if(!(await Vt.cache.getCachedLicense()).features.includes(Ln.Feature.ENVIRONMENT_VARIABLES))throw new Error("User does not have access to environment variables feature.");let r=await yr.get();r.variables=e(r.variables),await yr.update(r)}n(ey,"changeValues");async function CN(e,t){if(ty(e))await ey(a=>(a[e]=t,a));else throw new Error("Variable name has characters that are not allowed")}n(CN,"update");async function MN(e){await ey(t=>(delete t[e],t))}n(MN,"remove");function ty(e){return/^[a-zA-Z0-9-_]+$/.test(e)}n(ty,"isValid");var ms={};F(ms,{definitions:()=>GN,download:()=>jN,fetch:()=>BN,write:()=>LN});var it=require("@budibase/backend-core"),fs=require("@budibase/types");var Ne=require("@budibase/backend-core"),Ut=require("@budibase/types");var ry=require("memorystream"),ay=new Ne.sql.Sql(Ut.SqlClient.SQL_LITE);async function PN(e,t,r){let a={operation:Ut.Operation.READ,table:zr.searchTable(),tables:{},paginate:{limit:r||9,page:t},filters:e,resource:{fields:[]},sort:{timestamp:{direction:Ut.SortOrder.DESCENDING,type:Ut.SortType.STRING}}},o=ay._query(a);if(Array.isArray(o))throw new Error("Cannot execute multiple queries for audit log search");return{sql:o.sql,bindings:o.bindings}}n(PN,"getAuditLogSqlQuery");function kN(e){return`${Ne.DocumentType.AUDIT_LOG}${Ne.SEPARATOR}${e}${Ne.SEPARATOR}${Ne.utils.newid()}`}n(kN,"generateAuditLogID");async function ny(e){e._id||(e._id=kN(e.timestamp)),e.type||(e.type=Ut.AUDIT_LOG_TYPE);try{let r=await Ne.context.getAuditLogsDB().put(e);return{...e,_rev:r.rev}}catch(t){Ne.logging.logAlert("Failed to write audit log",t)}}n(ny,"save");async function Kl(e,t,r){t||(t=1);let a=Ne.context.getAuditLogsDB();try{let o=10,s=await PN(e,t,o),i=zr.searchTable(),l=ay.convertJsonStringColumns(i,await a.sql(s.sql,s.bindings)),u;l.length>o&&(u=l.pop());let c={rows:l,hasNextPage:!!u};return c.hasNextPage&&(c.bookmark=t+1),c}catch(o){if(o.status===404&&!r?.isRetry)return await NN(),await Zp(),await Kl(e,t,{isRetry:!0});throw o}}n(Kl,"searchSQL");async function NN(){let e=Ne.context.getAuditLogsDB(),r=(await e.allDocs(Ne.db.getDocParams(Ne.DocumentType.AUDIT_LOG,null,{include_docs:!0}))).rows.map(a=>a.doc).filter(a=>a&&!a.type).map(a=>({...a,type:Ut.AUDIT_LOG_TYPE}));await e.bulkDocs(r)}n(NN,"migrate");function oy(e){let t=Ne.context.getAuditLogsDB(),r=new ry,a=t.dump(r,{filter:n(s=>{let i=s;if(!i._id?.startsWith(Ne.DocumentType.AUDIT_LOG))return!1;let l=!0,u=n((c,d)=>{!c||c.length===0||(l=!!(l&&d&&c.includes(d)))},"matcher");if(u(e.userIds,i.userId),u(e.appIds,i.appId),u(e.events,i.event),(e.startDate||e.endDate)&&(l=l&&i.timestamp>=e.startDate&&i.timestamp<=e.endDate),e.fullSearch){let c=JSON.stringify(s);l=l&&c.includes(e.fullSearch)}return l},"filter")}),o=new ry;return r.on("data",s=>{let i=JSON.parse(Buffer.from(s).toString());if(Array.isArray(i.docs)){let l="";for(let u of i.docs)l+=JSON.stringify(u)+`
47
+ `;function dn(e){return Ni.default.verify(e,CE,{algorithms:["RS256"]})}n(dn,"verifyLicenseToken");function ME(e,t){return Ni.default.sign(t,e,{encoding:"utf-8",algorithm:"RS256"})}n(ME,"sign");var _o={};F(_o,{getOfflineFeatures:()=>Di});var v=require("@budibase/types");var Td=[v.Feature.BUDIBASE_AI,v.Feature.SYNC_AUTOMATIONS],Sd=[v.Feature.WORKSPACE_BACKUPS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PDF,v.Feature.BUDIBASE_AI],_d=[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.BRANDING,v.Feature.ENFORCEABLE_SSO,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.SYNC_AUTOMATIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.VIEW_PERMISSIONS,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.CUSTOM_APP_SCRIPTS,v.Feature.PWA,v.Feature.PDF,v.Feature.BUDIBASE_AI,v.Feature.RECAPTCHA,v.Feature.PKCE_OIDC,v.Feature.TRANSLATIONS],PE={[v.PlanType.FREE]:[...St.SELF_FREE_LICENSE.features],[v.PlanType.PREMIUM]:[v.Feature.WORKSPACE_BACKUPS,v.Feature.BRANDING,v.Feature.VIEW_PERMISSIONS,v.Feature.PDF],[v.PlanType.PREMIUM_PLUS]:Sd,[v.PlanType.PREMIUM_MAX]:Sd,[v.PlanType.PREMIUM_PLUS_TRIAL]:[v.Feature.WORKSPACE_BACKUPS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PDF,v.Feature.BUDIBASE_AI],[v.PlanType.PRO]:Td,[v.PlanType.PRO_MAX]:Td,[v.PlanType.TEAM]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS],[v.PlanType.BUSINESS]:_d,[v.PlanType.BUSINESS_PLUS]:_d,[v.PlanType.ENTERPRISE_BASIC]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.ENFORCEABLE_SSO,v.Feature.EMBED_AUTH,v.Feature.AUDIT_LOGS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.OFFLINE,v.Feature.EXPANDED_PUBLIC_API,v.Feature.WORKSPACE_IMPORT_EXPORT,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.SCIM,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PWA,v.Feature.CUSTOM_APP_SCRIPTS,v.Feature.PDF,v.Feature.BUDIBASE_AI,v.Feature.RECAPTCHA,v.Feature.PKCE_OIDC,v.Feature.TRANSLATIONS,v.Feature.MICROFRONTEND],[v.PlanType.ENTERPRISE_BASIC_TRIAL]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.ENFORCEABLE_SSO,v.Feature.EMBED_AUTH,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.EXPANDED_PUBLIC_API,v.Feature.WORKSPACE_IMPORT_EXPORT,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.SCIM,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PWA,v.Feature.CUSTOM_APP_SCRIPTS,v.Feature.PDF,v.Feature.BUDIBASE_AI,v.Feature.RECAPTCHA,v.Feature.PKCE_OIDC,v.Feature.TRANSLATIONS,v.Feature.MICROFRONTEND],[v.PlanType.ENTERPRISE]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.ENFORCEABLE_SSO,v.Feature.EMBED_AUTH,v.Feature.AUDIT_LOGS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.OFFLINE,v.Feature.EXPANDED_PUBLIC_API,v.Feature.WORKSPACE_IMPORT_EXPORT,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.SCIM,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PWA,v.Feature.CUSTOM_APP_SCRIPTS,v.Feature.PDF,v.Feature.BUDIBASE_AI,v.Feature.RECAPTCHA,v.Feature.PKCE_OIDC,v.Feature.TRANSLATIONS,v.Feature.MICROFRONTEND]};function Di(e){function t(r){let a=r[e];if(!a)throw new Error(`Features do not exist for planType=${e}`);return a}return n(t,"readFeatures"),t(PE)}n(Di,"getOfflineFeatures");var xo={};F(xo,{UNLIMITED:()=>g,getQuotas:()=>qi});var se=require("@budibase/types");var p=Xt,xd=St,g=-1,_t=n(e=>e*1e6,"millions"),kE={[se.PlanType.FREE]:{...xd.CLOUD_FREE_LICENSE.quotas},[se.PlanType.PREMIUM]:{usage:{monthly:{...p.queries(g),...p.automations(1e3),...p.budibaseAICredits(0),...p.actions(5e3)},static:{...p.rows(1e4),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[se.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(10)),...p.actions(2e4)},static:{...p.rows(25e4),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[se.PlanType.PREMIUM_MAX]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(10)),...p.actions(5e4)},static:{...p.rows(25e4),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[se.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(75e4),...p.actions(2e4)},static:{...p.rows(25e4),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[se.PlanType.PRO]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(2)),...p.actions(5e3)},static:{...p.rows(5e4),...p.apps(g),...p.users(g),...p.creators(1),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(1),...p.automationLogRetentionDays(1),...p.appBackupRetentionDays(0)}},[se.PlanType.PRO_MAX]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(2)),...p.actions(1e4)},static:{...p.rows(5e4),...p.apps(g),...p.users(g),...p.creators(1),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(1),...p.automationLogRetentionDays(1),...p.appBackupRetentionDays(0)}},[se.PlanType.TEAM]:{usage:{monthly:{...p.queries(g),...p.automations(1e4),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(10),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(90)}},[se.PlanType.BUSINESS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(50)),...p.actions(25e4)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(g)}},[se.PlanType.BUSINESS_PLUS]:void 0,[se.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(50)),...p.actions(25e4)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(g),...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}},[se.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(75e4),...p.actions(25e4)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(1),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(15),...p.automationLogRetentionDays(15),...p.appBackupRetentionDays(15)}},[se.PlanType.ENTERPRISE]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(50)),...p.actions(25e4)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(g),...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}}},NE={[se.PlanType.FREE]:{...xd.SELF_FREE_LICENSE.quotas},[se.PlanType.PREMIUM]:void 0,[se.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(2)),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(1)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[se.PlanType.PREMIUM_MAX]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(2)),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(1)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[se.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(1)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[se.PlanType.PRO]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(5),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[se.PlanType.PRO_MAX]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(5),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[se.PlanType.TEAM]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(10),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(90)}},[se.PlanType.BUSINESS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(50),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(g),...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}},[se.PlanType.BUSINESS_PLUS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(50)),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(g)}},[se.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(50)),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(g),...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}},[se.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(75e4),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(15),...p.automationLogRetentionDays(15),...p.appBackupRetentionDays(15)}},[se.PlanType.ENTERPRISE]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(_t(50)),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(g),...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}}};function qi(e,t){let r;function a(o){let s=o[t];if(!s)throw new Error(`Quotas do not exist for planType=${t} and hosting=${e}`);return s}switch(n(a,"readQuotas"),e){case se.Hosting.SELF:r=a(NE);break;case se.Hosting.CLOUD:r=a(kE);break}return JSON.parse(JSON.stringify(r))}n(qi,"getQuotas");var Ao={};F(Ao,{encoding:()=>ea,workspaceExists:()=>DE});var Ad=require("@budibase/backend-core");async function DE(e){return(await Ad.db.getAllWorkspaces({all:!0,idsOnly:!0})).includes(e)}n(DE,"workspaceExists");var ea={};F(ea,{base64ToObject:()=>UE,objectToBase64:()=>qE});function qE(e){let t=JSON.stringify(e);return Buffer.from(t).toString("base64")}n(qE,"objectToBase64");function UE(e){let t=Buffer.from(e,"base64").toString();return JSON.parse(t)}n(UE,"base64ToObject");var ph=require("@budibase/types"),Kt=require("@budibase/backend-core"),dh=Te($m()),fh=Te(ul());async function dk(e){await pl(e),await ot.save({offlineLicenseToken:e}),await qr()}n(dk,"activateOfflineLicenseToken");async function fk(){await ot.save({offlineLicenseToken:void 0}),await qr()}n(fk,"deleteOfflineLicenseToken");async function mh(){return(await ot.get()).offlineLicenseToken}n(mh,"getOfflineLicenseToken");async function cl(){let t=(await Kt.installation.getInstall()).installId,r=Kt.context.getTenantId(),a=await Kt.events.identification.getUniqueTenantId(r);return{installId:t,tenantId:a}}n(cl,"getIdentifier");async function mk(){let e=await cl();return ea.objectToBase64(e)}n(mk,"getIdentifierBase64");function gk(e){return ea.base64ToObject(e)}n(gk,"getIdentifierFromBase64");function gh(e){let t=Date.now(),r=new Date(e.expireAt).getTime();if(!Number.isFinite(r)||t>r)throw new Error(`Offline license has expired. expireAt=${e.expireAt}`)}n(gh,"verifyExpiry");var Mn=class extends Error{static{n(this,"OfflineLicenseMismatchError")}};async function hh(e){let t=await cl();if(e.identifier.installId!==t.installId||e.identifier.tenantId!==t.tenantId)throw new Mn("Invalid offline license")}n(hh,"verifyInstallation");function yh(e){let t=e.plan.type,r=ph.Hosting.SELF,a=Di(t),o=qi(r,t);return e.features=(0,dh.default)(e.features,a),e.quotas=(0,fh.default)(e.quotas,o),e}n(yh,"enrichLicense");async function pl(e){let t;try{t=await dn(e)}catch{throw new Kt.HTTPError("Invalid offline license token",400)}try{gh(t)}catch{throw new Kt.HTTPError("Offline license has expired",400)}try{await hh(t)}catch(r){throw r instanceof Mn?new Kt.HTTPError("Offline license does not match this installation",400):r}return t}n(pl,"verifyOfflineLicenseToken");async function dl(){try{let e=await mh();if(e){let t=await pl(e);return yh(t)}}catch(e){console.error("Error retrieving offline license",e)}}n(dl,"getOfflineLicense");var kn={};F(kn,{deleteDevLicense:()=>wk,getOfflineLicense:()=>vk,writeDevLicenseToDisk:()=>bk});var vh=require("@budibase/backend-core"),ml=require("path"),bh=require("os"),Ur=Te(require("fs"));var hk=vh.env.isTest()?".budibase-test":".budibase",fl=(0,ml.join)((0,bh.tmpdir)(),hk),yk="dev_license.txt",Pn=(0,ml.join)(fl,yk);if(!Ur.default.existsSync(fl))try{Ur.default.mkdirSync(fl)}catch{}function vk(){try{if(Ur.default.existsSync(Pn)){let e=Ur.default.readFileSync(Pn,{encoding:"utf-8"});return dn(e)}}catch(e){console.error("Error retrieving offline license from disk",e)}}n(vk,"getOfflineLicense");function bk(e){console.log(`Writing license to: ${Pn}`),Ur.default.writeFileSync(Pn,e,{encoding:"utf-8"})}n(bk,"writeDevLicenseToDisk");function wk(){Ur.default.rmSync(Pn,{force:!0})}n(wk,"deleteDevLicense");var wh=require("dd-trace");var hl=n(async()=>await wh.tracer.trace("getLicense",async e=>{if(gl.env.OFFLINE_MODE)return e.addTags({offline:!0}),dl();let t=await Xr();return t||(e.addTags({offlineFallback:!0}),t=kn.getOfflineLicense()),t}),"getLicense"),yl=n(e=>Pi(e),"getLicenseFromKey"),vl=n(()=>gl.env.SELF_HOSTED?St.SELF_FREE_LICENSE:St.CLOUD_FREE_LICENSE,"getFreeLicense");var wl={};F(wl,{activateLicenseKey:()=>Ik,deleteLicenseKey:()=>Sk,getLicenseKey:()=>Tk});var bl=Te(require("dd-trace"));async function Ik(e){await ki(e),await ot.save({licenseKey:e}),await qr()}n(Ik,"activateLicenseKey");async function Tk(){return await bl.default.trace("getLicenseKey",async e=>{let t=await ot.get();return e.addTags({licenseKey:t.licenseKey}),t.licenseKey})}n(Tk,"getLicenseKey");async function Sk(){return await bl.default.trace("deleteLicenseKey",async()=>{await ot.save({licenseKey:void 0}),await qr()})}n(Sk,"deleteLicenseKey");var $o=require("@budibase/backend-core");var Nn,xk=n(async()=>{Nn=await $o.RedisClient.init($o.redis.utils.Databases.LICENSES)},"init"),Ak=n(async()=>{Nn&&await Nn.finish()},"shutdown");process.on("exit",async()=>{await Ak()});var Wo=n(async()=>(Nn||await xk(),Nn),"getClient");var Th=require("@budibase/shared-core");var Tl=yt.Duration.fromHours(1).toSeconds(),Sh=yt.Duration.fromHours(1).toSeconds(),Rk=Tl+Sh,qr=n(async()=>{await Ah(),await xh()},"refresh"),Ih=n(async e=>{let{result:t}=await yt.locks.doWithLock({type:Ko.LockType.DEFAULT,name:Ko.LockName.SYNC_ACCOUNT_LICENSE,resource:e,ttl:yt.Duration.fromSeconds(10).toMs()},async()=>{let r=await Wo(),a=await r.get(e);if(a&&!_h(a))return a;let o=await Vo.default.trace("populateLicense",async()=>await hl());return o||(o=Vo.default.trace("populateFreeLicense",()=>vl())),o.refreshedAt=new Date().toISOString(),await r.store(e,o,Rk),o});return t},"populateAndStoreLicense"),_h=n(e=>{let t=e.refreshedAt?Date.parse(e.refreshedAt):0;return Date.now()-t>=Tl*1e3},"shouldRefreshLicense"),Il=n(async()=>await Vo.default.trace("getCachedLicense",async e=>{let t=yt.context.getLicense();if(t)return e.addTags({foundInContext:!0,features:t.features,plan:t.plan,quotas:t.quotas}),t;let r=yt.tenancy.getTenantId(),o=await(await Wo()).get(r);return e.addTags({tenantId:r,foundInCache:!!o}),o?(e.addTags({foundInCache:!0,refreshedAt:o.refreshedAt,features:o.features,plan:o.plan,quotas:o.quotas}),_h(o)&&Ih(r).catch(()=>{}),o):(o=await Th.helpers.retry(()=>Ih(r)),e.addTags({refreshedAt:o.refreshedAt,features:o.features,plan:o.plan,quotas:o.quotas,expirySeconds:Tl,staleGraceSeconds:Sh}),o)}),"_getCachedLicense");yt.env.isJest()&&(Il=jest.fn().mockImplementation(Il));var xh=Il,Ah=n(async()=>{let e=yt.tenancy.getTenantId();await(await Wo()).delete(e)},"invalidate");async function Me(e,t){Array.isArray(e)||(e=[e]),t||(t=await Ct.getCachedLicense());for(let r of e)if(!t?.features.includes(r))return!1;return!0}n(Me,"areFeaturesEnabled");async function Qo(e,t){if(!await Me(e,t))throw new er.FeatureDisabledWarning(e)}n(Qo,"checkFeature");async function Sl(e,t){if(!await Me(e,t)){let r=e.join(", ");throw new er.FeatureDisabledWarning(r)}}n(Sl,"checkFeatures");function He(e){return async(...t)=>(await Qo(Ee.Feature.WORKSPACE_BACKUPS),e(...t))}n(He,"checkBackups");async function _l(){return Me(Ee.Feature.WORKSPACE_BACKUPS)}n(_l,"isBackupsEnabled");async function xl(){return Me(Ee.Feature.BRANDING)}n(xl,"isBrandingEnabled");async function Ok(e){return Me(Ee.Feature.MICROFRONTEND,e)}n(Ok,"isMicrofrontendFeatureEnabled");async function Eh(){return Me(Ee.Feature.ENFORCEABLE_SSO)}n(Eh,"isEnforceableSSO");async function Ck(){return Me(Ee.Feature.EMBED_AUTH)}n(Ck,"isEmbedAuthEnabled");async function Mk(){return Me(Ee.Feature.SYNC_AUTOMATIONS)}n(Mk,"isSyncAutomationsEnabled");async function Pk(){return Me(Ee.Feature.TRIGGER_AUTOMATION_RUN)}n(Pk,"isTriggerAutomationRunEnabled");async function Ho(){return Me(Ee.Feature.AUDIT_LOGS)}n(Ho,"isAuditLogsEnabled");async function Al(){return Me(Ee.Feature.USER_GROUPS)}n(Al,"isUserGroupsEnabled");function kk(){return Me(Ee.Feature.PWA)}n(kk,"isPWAEnabled");function Nk(){return Me(Ee.Feature.RECAPTCHA)}n(Nk,"isRecaptchaEnabled");var Dk=n(()=>Me(Ee.Feature.PKCE_OIDC),"isPkceOidcEnabled");async function qk(){return Me(Ee.Feature.TRANSLATIONS)}n(qk,"isTranslationsEnabled");async function da(){return Me(Ee.Feature.EXPANDED_PUBLIC_API)}n(da,"isExpandedPublicApiEnabled");async function Uk(){return Me(Ee.Feature.WORKSPACE_IMPORT_EXPORT)}n(Uk,"isWorkspaceImportExportEnabled");async function Jo(){return Me([Ee.Feature.EXPANDED_PUBLIC_API,Ee.Feature.WORKSPACE_IMPORT_EXPORT])}n(Jo,"isWorkspaceImportExportPublicApiEnabled");async function Lk(e){if(er.env.ENABLE_SSO_MAINTENANCE_MODE||!await Eh())return!1;let r;return e?.config?r=e.config:r=await er.configs.getSettingsConfig(),!!r.isSSOEnforced}n(Lk,"isSSOEnforced");var El=n(async()=>{let e=Ee.Feature.SCIM,t=await Me(e),r=await er.configs.getSCIMConfig();if(!t||!r?.enabled)throw new er.FeatureDisabledWarning(e);return!0},"checkSCIM");async function Fk(){return Me(Ee.Feature.VIEW_PERMISSIONS)}n(Fk,"isViewPermissionEnabled");async function Bk(){return Me(Ee.Feature.VIEW_READONLY_COLUMNS)}n(Bk,"isViewReadonlyColumnsEnabled");var jk={faviconUrl:void 0,faviconUrlEtag:void 0,emailBrandingEnabled:!0,platformTitle:void 0,loginHeading:void 0,loginButton:void 0,metaDescription:void 0,metaImageUrl:void 0,metaTitle:void 0};async function Gk(e){return await xl()?{faviconUrl:e.faviconUrl,faviconUrlEtag:e.faviconUrlEtag,emailBrandingEnabled:e.emailBrandingEnabled,platformTitle:e.platformTitle,loginHeading:e.loginHeading,loginButton:e.loginButton,metaDescription:e.metaDescription,metaImageUrl:e.metaImageUrl,metaTitle:e.metaTitle}:jk}n(Gk,"getBrandingConfig");var Jt={};F(Jt,{addAction:()=>Kk,addApp:()=>Qk,addAutomation:()=>Xk,addGroup:()=>Ol,addPlugin:()=>Ml,addRow:()=>Jk,addRows:()=>zk,addUsers:()=>es,bustCache:()=>vi,decrement:()=>tr,decrementMany:()=>Dn,getCurrentUsageValues:()=>zp,getLicensedQuota:()=>zo,getQuotaUsage:()=>Mr,increment:()=>vt,incrementBudibaseAICredits:()=>eN,incrementMany:()=>Fr,removeApp:()=>Hk,removeGroup:()=>Cl,removePlugin:()=>Pl,removeRow:()=>Yk,removeRows:()=>Zk,removeUsers:()=>ha,set:()=>qn,setAllUsage:()=>wi,setAppUsageValue:()=>bi,setBudibaseAICredits:()=>Mh,setUsage:()=>Qp,setUsagePerApp:()=>Hp,throwIfBudibaseAICreditsExceeded:()=>rN,updatePluginCount:()=>kl,updateUsage:()=>fa,usageLimitIsExceeded:()=>Rl,utils:()=>Wa});var Zo=require("@budibase/types");var Nt=require("@budibase/backend-core"),Le=require("@budibase/types"),Lr=require("dd-trace");var vt=n(async(e,t,r)=>await Lr.tracer.trace("quotas.increment",async a=>(a.addTags({name:e,type:t}),await Rh({change:1,name:e,type:t,opts:r}))),"increment"),Fr=n(e=>Lr.tracer.trace("quotas.incrementMany",async()=>Rh(e)),"incrementMany"),Rh=n(async e=>await Lr.tracer.trace("quotas.tryIncrement",async t=>{let r=Array.isArray(e)?e:[e];t.addTags({numActions:r.length}),await fa(r.map(o=>({usageChange:o.change,name:o.name,type:o.type,opts:{dryRun:!0,suppressErrorLog:o.opts?.suppressErrorLog,id:o.opts?.id}})));let a=[];for(let o of r)await Lr.tracer.trace("quotas.incrementMany.fn",async s=>{s.addTags({actionName:o.name,actionType:o.type,actionChange:o.change});let i=o.opts?.fn;i&&a.push(await i())});return await fa(r.map(o=>({usageChange:o.change,name:o.name,type:o.type,opts:{dryRun:!1,valueFn:o.opts?.valueFn,suppressErrorLog:o.opts?.suppressErrorLog,id:o.opts?.id}}))),a[0]}),"tryIncrement"),tr=n((e,t,r={})=>fa({usageChange:-1,name:e,type:t,opts:r}),"decrement"),Dn=n(e=>{let t=Array.isArray(e)?e:[e];return fa(t.map(r=>({usageChange:-r.change,name:r.name,type:r.type,opts:r.opts})))},"decrementMany"),qn=n(async(e,t,r)=>Tt.setUsage(r,e,t),"set"),$k=n((e,t,r)=>{if(e==Le.QuotaUsageType.STATIC){let a=r.usageQuota.triggers;return a?a[t]||{}:{}}else{let a=Tt.utils.getCurrentMonthString(),o=r.monthly[a].triggers;return o?o[t]||{}:{}}},"getExistingTriggers"),Wk=n(async(e,t,r,a)=>{try{await Nt.locks.doWithLock({type:Le.LockType.TRY_ONCE,name:Le.LockName.TRIGGER_QUOTA,resource:e,ttl:1e4},async()=>{let o={percentage:r,name:t.name};a&&(o.resetDate=a),await br.triggerQuota(o)})}catch(o){Nt.logging.logAlert("Error triggering quota",o)}},"triggerQuota"),Vk=n(async(e,t,r,a)=>{let o=await Mr(),s=e===Le.QuotaUsageType.MONTHLY?o.quotaReset:void 0,i=await $k(e,t,o),l=a.triggers,u=r/a.value*100;u>100&&(u=100);for(let[c,d]of l.entries())if(u>=d&&a.value!==Xt.UNLIMITED){if(!i[d]){i[d]=new Date().toISOString();let h=l[c+1]||100;(!(u>=h)||u===d)&&await Wk(t,a,u,s)}}else i[d]=void 0;return i},"checkTriggers"),fa=n(async e=>{await Lr.tracer.trace("quotas.updateUsage",async t=>{let r=Nt.tenancy.getTenantId(),a=Array.isArray(e)?e:[e];t.addTags({numActions:a.length,tenantId:r});let o,s,i=[],l={},u={},c={},d={};for(let h of a)await Lr.tracer.trace("quotas.updateUsage.action",async b=>{b.addTags({actionName:h.name,actionType:h.type,actionUsageChange:h.usageChange});try{o=Nt.context.getWorkspaceId()}catch{}if(Le.APP_QUOTA_NAMES.includes(h.name)&&!o)throw new Error("App context required for quota update");try{s=await zo(Le.QuotaType.USAGE,h.name,h.type),i.push(s);let{total:w,app:S,breakdown:A}=await Tt.getCurrentUsageValues(h.type,h.name,h.opts?.id);w+=h.usageChange,S!=null&&(S+=h.usageChange),A!=null&&(A+=h.usageChange);let D={};if(h.opts?.dryRun||(D=await Vk(h.type,h.name,w,s),d={...d,[h.name]:D}),s.value!==Xt.UNLIMITED&&w>s.value&&h.usageChange>0)throw new Nt.UsageLimitWarning(`${h.name}`);if(w=Math.max(0,w),S&&(S=Math.max(0,S)),A!=null&&(A=Math.max(0,A),c={...c,[h.name]:A}),!h.opts?.dryRun){let W=h.opts?.valueFn;W&&(w=await W(),S=w),l={...l,[h.name]:w},u={...u,[h.name]:S}}}catch(w){throw h.opts?.suppressErrorLog||console.warn(`Error updating usage quotas for ${h.name}`,w),w}});let y=a.filter(h=>!h.opts?.dryRun).map(h=>({name:h.name,type:h.type,values:{total:l[h.name],app:u[h.name],breakdown:c[h.name],triggers:d[h.name]},opts:{...h.opts,tenantId:r}}));y.length>0&&await Tt.setAllUsage(y)})},"updateUsage"),zo=n(async(e,t,r)=>{let a=await Ct.getCachedLicense();if(!a){let o=Nt.tenancy.getTenantId();throw new Error("License not found for tenant id "+o)}if(r&&(0,Le.isStaticQuota)(e,r,t))return a.quotas[e][r][t];if(r&&(0,Le.isMonthlyQuota)(e,r,t))return a.quotas[e][r][t];if((0,Le.isConstantQuota)(e,t))return a.quotas[e][t];throw new Error("Invalid quota type")},"getLicensedQuota"),Rl=n(async({name:e,type:t,usageChange:r})=>{try{return await fa({usageChange:r,name:e,type:t,opts:{dryRun:!0}}),!1}catch(a){if(a.code===Le.APIWarningCode.USAGE_LIMIT_EXCEEDED)return!0;throw a}},"usageLimitIsExceeded");var Kk=n(async(e,t)=>vt(Zo.MonthlyQuotaName.ACTIONS,Zo.QuotaUsageType.MONTHLY,{fn:t,id:e}),"addAction");var Oh=require("@budibase/backend-core"),ma=require("@budibase/types");var Ch=n(async()=>{let e=await Oh.db.getAllWorkspaces({dev:!0});return e?e.length:0},"getDevAppsCount"),Qk=n(async(e,{appId:t}={})=>vt(ma.StaticQuotaName.WORKSPACES,ma.QuotaUsageType.STATIC,{fn:e,valueFn:Ch,id:t}),"addApp"),Hk=n(async({appId:e}={})=>tr(ma.StaticQuotaName.WORKSPACES,ma.QuotaUsageType.STATIC,{valueFn:Ch,id:e}),"removeApp");var Qt=require("@budibase/types");var Jk=n(async(e,{tableId:t}={})=>vt(Qt.StaticQuotaName.ROWS,Qt.QuotaUsageType.STATIC,{fn:e,id:t}),"addRow"),Yk=n(async({tableId:e}={})=>tr(Qt.StaticQuotaName.ROWS,Qt.QuotaUsageType.STATIC,{id:e}),"removeRow"),zk=n(async(e,t,{tableId:r}={})=>Fr({change:e,name:Qt.StaticQuotaName.ROWS,type:Qt.QuotaUsageType.STATIC,opts:{fn:t,id:r}}),"addRows"),Zk=n(async(e,{tableId:t}={})=>Dn({change:e,name:Qt.StaticQuotaName.ROWS,type:Qt.QuotaUsageType.STATIC,opts:{id:t}}),"removeRows");var Xo=require("@budibase/types");var Xk=n(async(e,{automationId:t}={})=>vt(Xo.MonthlyQuotaName.AUTOMATIONS,Xo.QuotaUsageType.MONTHLY,{fn:e,id:t}),"addAutomation");var ga=require("@budibase/types");var Ol=n(async e=>vt(ga.StaticQuotaName.USER_GROUPS,ga.QuotaUsageType.STATIC,{fn:e}),"addGroup"),Cl=n(async()=>tr(ga.StaticQuotaName.USER_GROUPS,ga.QuotaUsageType.STATIC),"removeGroup");var Sr=require("@budibase/types");var Ml=n(async e=>vt(Sr.StaticQuotaName.PLUGINS,Sr.QuotaUsageType.STATIC,{fn:e}),"addPlugin"),Pl=n(async()=>tr(Sr.StaticQuotaName.PLUGINS,Sr.QuotaUsageType.STATIC),"removePlugin"),kl=n(async e=>qn(Sr.StaticQuotaName.PLUGINS,Sr.QuotaUsageType.STATIC,e),"updatePluginCount");var Ht=require("@budibase/types"),Un=require("@budibase/backend-core");var es=n(async(e,t,r)=>{if(e===0&&t===0)return r?await r():void 0;let a=[{change:e,name:Ht.StaticQuotaName.USERS,type:Ht.QuotaUsageType.STATIC,opts:{fn:r,valueFn:Un.users.getUserCount}}];t>0&&a.push({change:t,name:Ht.StaticQuotaName.CREATORS,type:Ht.QuotaUsageType.STATIC,opts:{valueFn:Un.users.getCreatorCount}});let o=await Fr(a);return Promise.resolve(Xr()).catch(s=>{console.log("Failed to sync license after adding users",s)}),o},"addUsers"),ha=n(async(e,t)=>{let r=[{change:e,name:Ht.StaticQuotaName.USERS,type:Ht.QuotaUsageType.STATIC,opts:{valueFn:Un.users.getUserCount}}];t>0&&r.push({change:t,name:Ht.StaticQuotaName.CREATORS,type:Ht.QuotaUsageType.STATIC,opts:{valueFn:Un.users.getCreatorCount}}),await Dn(r),Promise.resolve(Xr()).catch(a=>{console.log("Failed to sync license after removing users",a)})},"removeUsers");var st=require("@budibase/types");var Nl=require("@budibase/backend-core"),as=require("@budibase/types");var ts=class extends Nl.HTTPError{static{n(this,"GroupNameUnavailableError")}constructor(t){super(`Group name "${t}" is unavailable`,409)}},rs=class extends Nl.HTTPError{static{n(this,"AICreditsExhaustedError")}constructor(){super("You have reached your Budibase AI Credits limit for this billing cycle.",402),this.code=as.APIWarningCode.USAGE_LIMIT_EXCEEDED}getPublicError(){return{quota:as.MonthlyQuotaName.BUDIBASE_AI_CREDITS}}};var eN=n(async e=>{try{return await Fr({change:e,name:st.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:st.QuotaUsageType.MONTHLY})}catch(t){throw t.code===st.APIWarningCode.USAGE_LIMIT_EXCEEDED&&await tN().catch(()=>{}),t}},"incrementBudibaseAICredits"),tN=n(async()=>{let e=await zo(st.QuotaType.USAGE,st.MonthlyQuotaName.BUDIBASE_AI_CREDITS,st.QuotaUsageType.MONTHLY);e.value>=0&&await Mh(e.value)},"capBudibaseAICreditsAtLimit"),rN=n(async()=>{if(await Rl({name:st.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:st.QuotaUsageType.MONTHLY,usageChange:1}))throw new rs},"throwIfBudibaseAICreditsExceeded"),Mh=n(async e=>qn(st.MonthlyQuotaName.BUDIBASE_AI_CREDITS,st.QuotaUsageType.MONTHLY,e),"setBudibaseAICredits");var ns={};F(ns,{db:()=>qt});var Ul=require("@budibase/backend-core");var Dt={};F(Dt,{addUsers:()=>uN,adjustGroupCreatorsQuotas:()=>fN,cleanupApp:()=>dN,enrichUserRolesFromGroups:()=>nN,fetch:()=>ql,get:()=>Uh,getBulk:()=>Lh,getDefaultGroup:()=>oN,getGroupBuilderAppIds:()=>qh,getGroupRoleId:()=>aN,remove:()=>lN,removeUsers:()=>cN,save:()=>Fh,updateGroupApps:()=>pN});var Q=require("@budibase/backend-core");async function Dl(e,t){try{let r=[];for(let l of e)if(l.roles){let u=l.roles[Q.db.getProdWorkspaceID(t)];u&&r.push(u)}let a=await Promise.all(r.map(async l=>({[l]:await Q.roles.roleToNumber(l)}))),o,s,i={};a.forEach(l=>{let[u,c]=Object.entries(l)[0];i[u]={roleId:u,roleNum:c}});for(let{roleId:l,roleNum:u}of Object.values(i))(s===void 0||u>s)&&(s=u,o=l);return o}catch(r){throw Q.logging.logAlert(`Error finding higest role for ${e.length} on app ${t}`,r),r}}n(Dl,"findHighestRole");async function Dh(e,t){return t?t=t.filter(r=>e.includes(r._id)):t=await oe.getBulk(e,{enriched:!1}),t}n(Dh,"groupList");async function qh(e,t){if(!e.userGroups)return[];let r=await Dh(e.userGroups,t?.groups),a=t?.appId?Q.db.getProdWorkspaceID(t?.appId):null,o=[];for(let s of r){let i=s.builder?.apps;a&&i?.includes(a)?o.push(a):a||(o=o.concat(i||[]))}return[...new Set(o)]}n(qh,"getGroupBuilderAppIds");async function aN(e,t,r){if(!e.userGroups)return null;let a=await Dh(e.userGroups,r?.groups),o=Q.db.getProdWorkspaceID(t);return e.roles?.[o]?e.roles[o]:(a=a.filter(l=>l?.roles?Object.keys(l.roles).includes(o):!1),Q.context.getCurrentContext()?.appId===t?Dl(a,t):await Q.context.doInWorkspaceContext(t,async()=>Dl(a,t)))}n(aN,"getGroupRoleId");async function nN(e){if(!e||!e.userGroups)return e;let t=await Lh(e.userGroups,{enriched:!1}),r=[];for(let o of t)o?.roles&&(r=r.concat(Object.keys(o.roles)));r=[...new Set(r)];for(let o of r)await Q.context.doInWorkspaceContext(o,async()=>{if(e.roles[o])return;let s=await Dl(t,o);s&&(e.roles[o]=s)});let a=await qh(e,{groups:t});if(a.length&&!e.builder?.global){let o=e.builder?.apps||[];e.builder={...e.builder,apps:o.concat(a)}}return e}n(nN,"enrichUserRolesFromGroups");async function ql(){return await oe.fetch()}n(ql,"fetch");async function Uh(e){return await oe.get(e)}n(Uh,"get");async function oN(){return(await oe.getAll()).find(t=>t.isDefault)}n(oN,"getDefaultGroup");async function Lh(e,t={enriched:!0}){return oe.getBulk(e,t)}n(Lh,"getBulk");async function Ph(e){if(await oe.getByName(e))throw new ts(e)}n(Ph,"guardNameAvailability");async function kh(e){let t=await oe.getGroupUsers(e._id);if(!t.length)return 0;let a=await Q.tenancy.getGlobalDB().getMultiple(t.map(s=>s._id));return(await Q.userUtils.creatorsInList(a)).filter(s=>s).length}n(kh,"getCreatorsCountInGroup");function Nh(e){return Object.values(e.roles||{}).includes("CREATOR")}n(Nh,"isCreatorGroup");function sN(e){let{users:t,...r}=e;return r}n(sN,"stripEnrichedFields");async function iN(e){if(!e.isDefault)return oe.save(e);let r=(await oe.getAll()).filter(i=>i._id!==e._id).filter(i=>i.isDefault);if(!r.length)return oe.save(e);let o=(await oe.bulkSave([...r.map(i=>({...i,isDefault:!1})),e])).find(i=>i.id===e._id);if(o?.rev)return{id:e._id,rev:o.rev};let s=await oe.get(e._id);return{id:s._id,rev:s._rev}}n(iN,"saveGroupWithDefaultUpdates");async function Fh(e){let t=[],r=!e._id,a=0;if(!e._id)e._id=oe.generateUserGroupID(),await Ph(e.name),t.push(Q.events.group.created(e));else{let i=await oe.get(e._id);if(i.name!==e.name&&await Ph(e.name),t.push(Q.events.group.updated(e)),JSON.stringify(i.roles)!==JSON.stringify(e.roles)){let l=Nh(i),u=Nh(e);if(l!==u){let c=i.users?.length||0,d=0;c>0&&(d=await kh(i)),u?a=c-d:a=-c}t.push(Q.events.group.permissionsEdited(e))}}await Promise.all(t);let o=sN(e),s=n(()=>iN(o),"saveGroup");if(r)return await Ol(s);{let i=await s();if(a>0)await es(0,a);else if(a<0){let l=await kh(e),u=Math.abs(a)-l;u>0&&await ha(0,u)}return i}}n(Fh,"save");async function lN(e,t){let r;try{r=await oe.get(e)}catch{throw new Error("Group not found")}let a=Object.values(r.roles||{}).includes("CREATOR"),o=n(()=>{},"recalculateCreatorsQuotasFn");if(a){let i=Q.tenancy.getGlobalDB(),l=await oe.getGroupUsers(e),c=(await Promise.all(l.map(b=>i.get(b._id)))).map(b=>({...b,userGroups:b.userGroups.filter(N=>N!==e)})),y=(await Q.userUtils.creatorsInList(c)).filter(b=>b).length,h=l.length-y;h&&(o=n(()=>ha(0,h),"recalculateCreatorsQuotasFn"))}let s=await oe.destroy(e,t);return await Q.events.group.deleted(r),await Cl(),await o(),s}n(lN,"remove");async function uN(e,t){let r=await oe.get(e),a=await Q.users.bulkGetGlobalUsersById(t),o=[];for(let u of a)u.userGroups||(u.userGroups=[]),u.userGroups.includes(e)||o.push(u);if(!o.length)return o;let s=o.map(u=>({...u,userGroups:[...u?.userGroups||[],e]}));if(await Q.users.bulkUpdateGlobalUsers(s),Object.values(r.roles||{}).includes("CREATOR")){let c=(await Q.userUtils.creatorsInList(o)).filter(y=>y).length,d=o.length-c;d&&await es(0,d)}let l=[];for(let u of t)l.push(Q.cache.user.invalidateUser(u));return await Promise.all(l),await Q.events.group.usersAdded(s.length,r,t),s}n(uN,"addUsers");async function cN(e,t){let r=await oe.get(e),a=await Q.users.bulkGetGlobalUsersById(t),o=[];for(let l of a){if(!l.userGroups||!l.userGroups.includes(e))continue;let u=l.userGroups.indexOf(e);l.userGroups.splice(u,1),o.push(l)}if(await Q.users.bulkUpdateGlobalUsers(o),Object.values(r.roles||{}).includes("CREATOR")){let u=(await Q.userUtils.creatorsInList(o)).filter(d=>d).length,c=o.length-u;c&&await ha(0,c)}let i=[];for(let l of t)i.push(Q.cache.user.invalidateUser(l));return await Promise.all(i),o.length&&await Q.events.group.usersDeleted(o.length,r,t),o}n(cN,"removeUsers");async function pN(e,t){let r=await Uh(e);if(r.roles||(r.roles={}),t.appsToAdd)for(let a of t.appsToAdd)r.roles[a.appId]=a.roleId;if(t.appsToRemove)for(let a of t.appsToRemove)delete r.roles[a.appId];return r.builder={apps:Object.entries(r.roles).filter(([a,o])=>o==="CREATOR").map(([a])=>a)},await Fh(r)}n(pN,"updateGroupApps");async function dN(e){let t=await ql(),r=[];for(let a of t)!a.roles||!a.roles[e]||(delete a.roles[e],r.push(a));return await oe.bulkSave(r)}n(dN,"cleanupApp");async function fN(){if(!await Al()){let e=Q.tenancy.getGlobalDB(),r=(await ql()||[]).filter(a=>Object.values(a?.roles||{}).includes("CREATOR"));for(let a of r){let o=await oe.getGroupUsers(a._id),i=(await Promise.all(o.map(d=>e.get(d._id)))).map(d=>({...d,userGroups:d.userGroups.filter(y=>y!==a._id)})),u=(await Q.userUtils.creatorsInList(i)).filter(d=>d).length,c=o.length-u;await oe.save({...a,roles:{}}),c&&await ha(0,c)}}}n(fN,"adjustGroupCreatorsQuotas");Ul.users.UserDB.init(Jt,Dt,kt);var qt=Ul.users.UserDB;var us={};F(us,{logs:()=>Vl});var Vl={};F(Vl,{logSearch:()=>TN,oldestLogDate:()=>Kh,storeLog:()=>SN});var ls=require("@budibase/backend-core"),is=require("@budibase/types");var $e=require("@budibase/backend-core"),ss=require("@budibase/types");var Bh=require("@budibase/backend-core");async function jh(e,t){let r,a=5,o=!1,s,i=!0;for(;a>0;a--)try{i?s=await e():s=await exports.randomDelay(e),o=!0;break}catch(l){r=l}return o||Bh.logging.logWarn(`Failed to backoff: ${t}`,r),s}n(jh,"backOff");var{SEPARATOR:rr,UNICODE_MAX:mN,DocumentType:Gh,AutomationViewMode:Ll,ViewName:gN,getQueryIndex:hN}=$e.db,yN=new Date(0).toISOString(),vN=100,os=10,Fl=n(async()=>bo(ss.ConstantQuotaName.AUTOMATION_LOG_RETENTION_DAYS),"oldestLogDate");function $h(e,t,{status:r,automationId:a}={},o={}){let s=a?`${a}${rr}`:"",i=r?`${r}${rr}`:"",l;return r&&a?l=`${Ll.ALL}${rr}${i}${s}`:r?l=`${Ll.STATUS}${rr}${i}`:a?l=`${Ll.AUTOMATION}${rr}${s}`:l=`${Gh.AUTOMATION_LOG}${rr}`,{...o,descending:!0,startkey:`${l}${t}${mN}`,endkey:`${l}${e}`}}n($h,"getAutomationLogParams");function bN(e,t,r){return`${Gh.AUTOMATION_LOG}${rr}${e}${rr}${r}${rr}${t}`}n(bN,"generateAutomationLogID");async function Bl(e,t,r={docs:!0}){let a=$e.context.getProdWorkspaceDB();await a.exists()||(a=$e.context.getDevWorkspaceDB());let o={status:r.status},s=r?.limit?r.limit:r?.paginate?os+1:void 0,i=$h(e,t,o,{include_docs:r.docs,limit:s});r?.page&&(i.startkey=r.page);let l=await a.allDocs(i),u=pn(l,{paginate:r?.paginate,pageSize:os});return{...u,totalLogs:u.totalRows}}n(Bl,"getAllLogs");async function jl(e,t,r={}){let a=$e.context.getProdWorkspaceDB();await a.exists()||(a=$e.context.getDevWorkspaceDB());let o;try{let i={automationId:r?.automationId,status:r?.status},l=$h(e,t,i,{include_docs:!0,limit:os+1});r?.page&&(l.startkey=r.page),o=await a.query(hN(gN.AUTOMATION_LOGS),l)}catch(i){if(i!=null&&(i.name==="not_found"||i.error==="not_found"))return await ud(),jl(e,t,r);throw i}let s=pn(o,{paginate:!0,pageSize:os});return{...s,totalLogs:s.totalRows/3}}n(jl,"getLogsByView");async function Wh(e,t){let r=$e.context.getProdWorkspaceDB(),a=e._id,o=e.name,s=new Date().toISOString(),i=bN(s,t.status,a),l={...t,automationId:a,status:t.status,automationName:o,createdAt:s,_id:i};return await r.put(l),i}n(Wh,"writeLog");async function Gl(e,{clearing:t}={clearing:!1}){await Vh({logIds:e,clearing:t,metadataKey:"automationErrors",failureMessage:"Failed to update app metadata with automation log error"})}n(Gl,"updateAppMetadataWithErrors");async function $l(e,{clearing:t}={clearing:!1}){await Vh({logIds:e,clearing:t,metadataKey:"automationStops",failureMessage:"Failed to update app metadata with automation log stop"})}n($l,"updateAppMetadataWithStops");async function Vh({logIds:e,clearing:t,metadataKey:r,failureMessage:a}){let o=$e.context.getProdWorkspaceDB();await jh(async()=>{let s=await o.get($e.db.DocumentType.WORKSPACE_METADATA);for(let i of e){let l=i.split($e.db.SEPARATOR),u=`${l[l.length-3]}${$e.db.SEPARATOR}${l[l.length-2]}`,c={};if(s[r]&&(c=s[r]),t&&!Array.isArray(c[u]))continue;c[u]||=[];let d=c[u].indexOf(i);if(t){if(d===-1)continue;c[u].splice(d,1)}else c[u].push(i);c[u].length===0&&delete c[u],s[r]=c}await o.put(s),await $e.cache.workspace.invalidateWorkspaceMetadata(s.appId,s)},a)}n(Vh,"updateAppMetadataWithLogIds");async function wN(){let e=await Fl();try{return await Bl(yN,e,{docs:!1,paginate:!1,limit:vN})}catch{return{data:[],hasNextPage:!1,totalLogs:0}}}n(wN,"getExpiredLogs");async function Wl(){let e=$e.context.getProdWorkspaceDB();try{let t=await wN();if(!t.data||t.data.length===0)return;let r=t.data.map(s=>({_id:s.id,_rev:s.value.rev,_deleted:!0})),a=t.data.map(s=>s.id),o=a.filter(s=>{let i=s.split($e.db.SEPARATOR);return i[i.length-1]===ss.AutomationStatus.ERROR});await e.bulkDocs(r),o.length&&await Gl(o,{clearing:!0}),a.length&&await $l(a,{clearing:!0})}catch(t){$e.logging.logAlert(`Failed to cleanup automation log history - Database "${e.name}"`,t)}}n(Wl,"clearOldHistory");var Kh=Fl;async function IN(e,t,r,a){let o,s=new Date().toISOString(),i=await Kh();return(!e||e<i)&&(e=i),r||t?o=await jl(e,s,{automationId:r,status:t,page:a}):o=await Bl(e,s,{status:t,page:a,docs:!0,paginate:!0}),o}n(IN,"getLogs");async function TN(e){return await Wl(),await IN(e.startDate,e.status,e.automationId,e.page)}n(TN,"logSearch");async function SN(e,t){if(!ls.db.isProdWorkspaceID(ls.context.getWorkspaceId()))return;let r=await Wh(e,t);t.status===is.AutomationStatus.ERROR&&await Gl([r]),t.status===is.AutomationStatus.STOPPED&&t.steps.some(a=>a.inputs?.notify===!0&&a.outputs.status===is.AutomationStatus.STOPPED)&&await $l([r]),await Wl()}n(SN,"storeLog");var cs={};F(cs,{checkPluginQuotas:()=>AN,deletePlugin:()=>xN,storePlugin:()=>_N});var Yh=require("@budibase/types"),Fe=require("@budibase/backend-core"),zh=Te(require("module")),Zh=Te(require("isolated-vm"));var Qh=Te(require("fs")),Hh=require("path");function Jh(e,t){return Qh.default.readFileSync((0,Hh.join)(e,t),"utf8")}n(Jh,"loadJSFile");async function _N(e,t,r,a){let o=Fe.tenancy.getGlobalDB(),s=e.package.version,i=e.package.name,l=e.package.description,u=e.schema.hash,c=Fe.objectStore.getPluginS3Dir(i),d=await Fe.objectStore.uploadDirectory(Fe.objectStore.ObjectStoreBuckets.PLUGINS,t,c),y=d.find(D=>D.name.endsWith(".js")),h=d.find(D=>D.name.endsWith(".svg"));if(!y)throw new Error("Plugin missing .js file.");if(e.schema.type===Yh.PluginType.DATASOURCE){let D=Jh(t,y.name),W=new Zh.default.Isolate({memoryLimit:8});try{W.compileScriptSync(zh.default.wrap(D),{filename:y.name})}catch(ne){let J=ne?.message?ne.message:JSON.stringify(ne);throw new Error(`JS invalid: ${J}`)}finally{W.dispose()}}let b=h?h.name:null,N=Fe.db.generatePluginID(i),w;try{w=(await o.get(N))._rev}catch{w=void 0}let S={_id:N,_rev:w,...e,name:i,version:s,hash:u,description:l,source:r};b&&(S.iconFileName=b),r&&(S={...S,source:r}),a&&a.source==="github"&&(S.origin=a);let A=n(async()=>{let D=await o.put(S);return await Fe.events.plugin.imported(S),{...S,_rev:D.rev}},"write");return w?await A():await Ml(A)}n(_N,"storePlugin");async function xN(e){let t=Fe.tenancy.getGlobalDB();try{let r=await t.get(e),a=Fe.objectStore.getPluginS3Dir(r.name);await Fe.objectStore.deleteFolder(Fe.objectStore.ObjectStoreBuckets.PLUGINS,a),await t.remove(e,r._rev),await Fe.events.plugin.deleted(r),await Pl()}catch(r){let a=r?.message?r?.message:r;throw new Error(`Failed to delete plugin: ${a}`)}}n(xN,"deletePlugin");async function AN(){let e=Fe.tenancy.getGlobalDB();try{let r=(await e.allDocs(Fe.db.getPluginParams())).rows.length;console.log(`Syncing plugin count: ${r}`),await kl(r)}catch(t){Fe.logging.logAlert("Unable to retrieve plugins for quota check",t)}}n(AN,"checkPluginQuotas");var ps={};F(ps,{fetch:()=>RN,fetchValues:()=>ON,isEncryptionKeyAvailable:()=>EN,isValid:()=>ty,remove:()=>MN,update:()=>CN});var Xh=require("@budibase/backend-core"),Ln=require("@budibase/types");function EN(){return!!Xh.env.ENCRYPTION_KEY}n(EN,"isEncryptionKeyAvailable");async function RN(){let e=await yr.get();return Object.keys(e.variables)}n(RN,"fetch");async function ON(e){let r=(await yr.get()).variables,a={};for(let[o,s]of Object.entries(r))switch(e){case Ln.Environment.DEVELOPMENT:a[o]=s.development;break;case Ln.Environment.PRODUCTION:default:a[o]=s.production;break}return a}n(ON,"fetchValues");async function ey(e){if(!(await Vt.cache.getCachedLicense()).features.includes(Ln.Feature.ENVIRONMENT_VARIABLES))throw new Error("User does not have access to environment variables feature.");let r=await yr.get();r.variables=e(r.variables),await yr.update(r)}n(ey,"changeValues");async function CN(e,t){if(ty(e))await ey(a=>(a[e]=t,a));else throw new Error("Variable name has characters that are not allowed")}n(CN,"update");async function MN(e){await ey(t=>(delete t[e],t))}n(MN,"remove");function ty(e){return/^[a-zA-Z0-9-_]+$/.test(e)}n(ty,"isValid");var ms={};F(ms,{definitions:()=>GN,download:()=>jN,fetch:()=>BN,write:()=>LN});var it=require("@budibase/backend-core"),fs=require("@budibase/types");var Ne=require("@budibase/backend-core"),Ut=require("@budibase/types");var ry=require("memorystream"),ay=new Ne.sql.Sql(Ut.SqlClient.SQL_LITE);async function PN(e,t,r){let a={operation:Ut.Operation.READ,table:zr.searchTable(),tables:{},paginate:{limit:r||9,page:t},filters:e,resource:{fields:[]},sort:{timestamp:{direction:Ut.SortOrder.DESCENDING,type:Ut.SortType.STRING}}},o=ay._query(a);if(Array.isArray(o))throw new Error("Cannot execute multiple queries for audit log search");return{sql:o.sql,bindings:o.bindings}}n(PN,"getAuditLogSqlQuery");function kN(e){return`${Ne.DocumentType.AUDIT_LOG}${Ne.SEPARATOR}${e}${Ne.SEPARATOR}${Ne.utils.newid()}`}n(kN,"generateAuditLogID");async function ny(e){e._id||(e._id=kN(e.timestamp)),e.type||(e.type=Ut.AUDIT_LOG_TYPE);try{let r=await Ne.context.getAuditLogsDB().put(e);return{...e,_rev:r.rev}}catch(t){Ne.logging.logAlert("Failed to write audit log",t)}}n(ny,"save");async function Kl(e,t,r){t||(t=1);let a=Ne.context.getAuditLogsDB();try{let o=10,s=await PN(e,t,o),i=zr.searchTable(),l=ay.convertJsonStringColumns(i,await a.sql(s.sql,s.bindings)),u;l.length>o&&(u=l.pop());let c={rows:l,hasNextPage:!!u};return c.hasNextPage&&(c.bookmark=t+1),c}catch(o){if(o.status===404&&!r?.isRetry)return await NN(),await Zp(),await Kl(e,t,{isRetry:!0});throw o}}n(Kl,"searchSQL");async function NN(){let e=Ne.context.getAuditLogsDB(),r=(await e.allDocs(Ne.db.getDocParams(Ne.DocumentType.AUDIT_LOG,null,{include_docs:!0}))).rows.map(a=>a.doc).filter(a=>a&&!a.type).map(a=>({...a,type:Ut.AUDIT_LOG_TYPE}));await e.bulkDocs(r)}n(NN,"migrate");function oy(e){let t=Ne.context.getAuditLogsDB(),r=new ry,a=t.dump(r,{filter:n(s=>{let i=s;if(!i._id?.startsWith(Ne.DocumentType.AUDIT_LOG))return!1;let l=!0,u=n((c,d)=>{!c||c.length===0||(l=!!(l&&d&&c.includes(d)))},"matcher");if(u(e.userIds,i.userId),u(e.appIds,i.appId),u(e.events,i.event),(e.startDate||e.endDate)&&(l=l&&i.timestamp>=e.startDate&&i.timestamp<=e.endDate),e.fullSearch){let c=JSON.stringify(s);l=l&&c.includes(e.fullSearch)}return l},"filter")}),o=new ry;return r.on("data",s=>{let i=JSON.parse(Buffer.from(s).toString());if(Array.isArray(i.docs)){let l="";for(let u of i.docs)l+=JSON.stringify(u)+`
48
48
  `;o.write(l)}}),r.on("end",()=>{o.end()}),{promise:a,stream:o}}n(oy,"dump");var Fn=require("@budibase/backend-core"),Bn=require("@budibase/string-templates"),ds=require("@budibase/types");var qN=Fn.constants.MIN_VALID_DATE.toISOString(),UN=Fn.constants.MAX_VALID_DATE.toISOString();function Ql(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||qN,e.endDate=e.endDate||UN),e}n(Ql,"fillDates");async function sy(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(a=>Fn.db.getProdWorkspaceID(a)));let t={};function r(a,o){o?.length&&(t.oneOf={...t.oneOf,[a]:o})}return n(r,"addStringParams"),r("userId",e.userIds),r("appId",e.appIds),r("event",e.events),e.fullSearch&&(t.fuzzyOr=!0,t.fuzzy={name:e.fullSearch,fallback:e.fullSearch}),(e.startDate||e.endDate)&&(e=Ql(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}n(sy,"getSearchFilters");function Hl(e,t,r){let a={_id:e,status:ds.AuditLogResourceStatus.DELETED};switch(t){case"app":a.name=r?.appName;break;case"user":a.email=r?.email;break}return a}n(Hl,"deleted");function Jl(e){let t=(0,Bn.findHBSBlocks)(e);for(let r of t){let a=` "${r}"`;e=e.replace(e.includes(a)?a:` ${r}`,""),e=(0,Bn.processStringSync)(e,{})}return e}n(Jl,"removeTemplateStrings");function iy(e,t){let r=ds.AuditedEventFriendlyName[e];if(!r)throw new Error("No friendly name found.");let a=(0,Bn.processStringSync)(r,t);return a.includes('""')&&(a=Jl(r)),a}n(iy,"getEventFriendlyName");async function LN(e,t,r){if(!await Ho()||!it.utils.isAudited(e))return;let a=iy(e,t),o=new Date;r?.timestamp&&(o=new Date(r.timestamp));let s={timestamp:o.toISOString(),event:e,name:a,userId:r?.userId||fs.AuditLogSystemUser,metadata:{...t,...r?.hostInfo}},i={};try{if(r?.appId){s.appId=it.db.getProdWorkspaceID(r.appId);let l=await it.cache.workspace.getWorkspaceMetadata(r.appId);"name"in l&&(i.appName=l.name)}if(r?.userId){let l=await it.users.getById(r?.userId);i.email=l.email}}catch(l){it.logging.logAlert("Failed to retrieve fallback information for audit log",l)}return s.fallback=i,await ny(s)}n(LN,"write");async function FN(e){let t=e.map(l=>l.userId),a=e.filter(l=>l.appId).map(l=>it.db.getDevWorkspaceID(l.appId)),o=await it.users.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),s=await it.db.getWorkspacesByIDs([...new Set(a)]),i=[];for(let l of e){let u=o.find(y=>y?._id===l.userId),c=s.find(y=>it.db.isSameWorkspaceID(y?.appId,l.appId)),d={event:l.event,timestamp:l.timestamp,name:l.name,metadata:l.metadata,user:u||Hl(l.userId,"user",l.fallback)};l.appId&&(d.app=c||Hl(l.appId,"app",l.fallback)),i.push(d)}return i}n(FN,"enrich");async function BN(e){if(!await Ho())throw new Error("Audit logs not available - license required.");let t=await sy(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await Kl(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await FN(r.rows)}}n(BN,"fetch");function jN(e){return e=Ql(e),oy(e)}n(jN,"download");function GN(){let e=Object.entries(fs.AuditedEventFriendlyName).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=Jl(r[1]);return t}n(GN,"definitions");var gs={};F(gs,{applications:()=>Xl,roles:()=>zl,users:()=>Yl});var Yl={};F(Yl,{roleCheck:()=>WN});function $N(e,t){let r=e.request.body;return r.builder&&(r.builder=t?.builder||void 0),r.admin&&(r.admin=t?.admin||void 0),r.roles&&(r.roles=t?.roles||{}),e.request.body=r,e}n($N,"removeRoles");async function WN(e,t){return await da()||$N(e,t),e}n(WN,"roleCheck");var zl={};F(zl,{assign:()=>VN,unAssign:()=>KN});var jn=require("@budibase/backend-core");async function VN(e,t){if(!await da())throw new Error("Unable to assign roles - license required.");let r=await qt.bulkGet(e);for(let a of r){if(t.role&&t.role.roleId){let o=jn.db.getProdWorkspaceID(t.role.appId);a.roles[o]=t.role.roleId}if(t.appBuilder){let o=jn.db.getProdWorkspaceID(t.appBuilder.appId),s=a.builder?.apps||[];a.builder={apps:s.concat([o])}}t.builder&&(a.builder={global:!0}),t.admin&&(a.admin={global:!0}),a.roles}await qt.bulkUpdate(r)}n(VN,"assign");async function KN(e,t){if(!await da())throw new Error("Unable to un-assign roles - license required.");let r=await qt.bulkGet(e);for(let a of r){if(t.role){let o=jn.db.getProdWorkspaceID(t.role?.appId);a.roles[o]===t.role.roleId&&delete a.roles[o]}if(t.appBuilder&&a.builder?.apps){let o=jn.db.getProdWorkspaceID(t.appBuilder.appId);a.builder.apps=a.builder.apps.filter(s=>s!==o)}t.builder&&a.builder&&delete a.builder,t.admin&&a.admin&&delete a.admin}await qt.bulkUpdate(r)}n(KN,"unAssign");var Xl={};F(Xl,{buildExportFn:()=>JN,buildImportFn:()=>HN});var Zl=require("@budibase/backend-core");var QN=n(e=>{if(e){if(e.appExport)return e.appExport;if(e.file)return e.file}},"ensureAppExportFile");function HN(e){return async(t,r)=>{await Jo()||t.throw(403,"Endpoint unavailable, enterprise license required."),QN(t.request.files)||t.throw(400,"Must provide app export file for import."),await Zl.context.doInWorkspaceContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}n(HN,"buildImportFn");function JN(e){return async(t,r)=>{await Jo()||t.throw(403,"Endpoint unavailable, enterprise license required.");let{encryptPassword:a,excludeRows:o}=t.request.body;await Zl.context.doInWorkspaceContext(t.params.appId,async()=>{t.request.body={encryptPassword:a,excludeRows:o},t.query.appId=t.params.appId,await e(t),await r()})}}n(JN,"buildExportFn");var iu=require("@budibase/backend-core");var Be=require("@budibase/backend-core"),Ve=require("@budibase/types"),cy=Te(require("fs")),py=require("path");var eu=require("@budibase/backend-core");var ly;function uy(){ly=new eu.queue.BudibaseQueue(eu.queue.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}n(uy,"init");function _r(){return ly}n(_r,"getBackupQueue");async function tu(e,t={}){return Ye.storeWorkspaceBackupMetadata(e,t)}n(tu,"storeWorkspaceBackupMetadata");function dy(e){let t=new Date().toISOString();switch(e){case Ve.BackupStatus.COMPLETE:case Ve.BackupStatus.FAILED:return{timestamp:t,finishedAt:t};case Ve.BackupStatus.STARTED:return{timestamp:t,startedAt:t};case Ve.BackupStatus.PENDING:return{timestamp:t,createdAt:t}}}n(dy,"getTimestamps");async function YN(e,t,r,a){let o=await hs(e);return await Ye.storeWorkspaceBackupMetadata({...o,...dy(t),contents:r,status:t,type:Ve.BackupType.BACKUP},{filename:a,docId:e})}n(YN,"updateBackupStatus");async function zN(e,t,r){let a=await hs(e);return await Ye.storeWorkspaceBackupMetadata({...a,...dy(r),status:r,type:Ve.BackupType.RESTORE,trigger:Ve.BackupTrigger.MANUAL},{docId:e,docRev:t})}n(zN,"updateRestoreStatus");async function hs(e){return Ye.getWorkspaceBackupMetadata(e)}n(hs,"getWorkspaceBackup");async function ZN(e,t){return Ye.updateWorkspaceBackupMetadata(e,t)}n(ZN,"updateWorkspaceBackup");async function fy(e){return e.filename&&await Be.objectStore.deleteFile(Be.objectStore.ObjectStoreBuckets.BACKUPS,e.filename),Ye.deleteWorkspaceBackupMetadata(e)}n(fy,"deleteWorkspaceBackupMetadata");async function my(e){let t=await Ye.getWorkspaceBackupMetadata(e);return fy(t)}n(my,"deleteWorkspaceBackup");async function XN(e){let t=[];for(let r of e)try{await my(r),t.push({backupId:r,success:!0})}catch(a){t.push({backupId:r,success:!1,error:a instanceof Error?a.message:"Unknown error"})}return t}n(XN,"deleteWorkspaceBackups");async function eD(){let e={deleted:0,failed:0},t=await Ye.oldestBackupDate(),r;do{let a=await Ye.fetchExpiredWorkspaceBackups(t,r);for(let o of a.backups)try{await fy(o),e.deleted++}catch(s){e.failed++,Be.logging.logAlert(`Failed to cleanup expired backup ${o._id}`,s)}r=a.nextPage}while(r);return e}n(eD,"cleanupExpiredWorkspaceBackups");async function tD(e,t){return Ye.fetchWorkspaceBackups(e,t)}n(tD,"fetchWorkspaceBackups");async function gy(e){let t=await Ye.getWorkspaceBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let{stream:r}=await Be.objectStore.getReadStream(Be.objectStore.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}n(gy,"getBackupDownloadStream");async function rD(e){let{stream:t}=await gy(e),r=(0,py.join)(Be.objectStore.budibaseTempDir(),Be.utils.newid()),a=cy.default.createWriteStream(r);return new Promise((o,s)=>{t.on("error",s),a.on("error",s),t.pipe(a).on("close",()=>o(r))})}n(rD,"downloadWorkspaceBackup");async function aD(e,t,r={}){let a;try{a=await tu({appId:e,trigger:t,timestamp:new Date().toISOString(),status:Ve.BackupStatus.PENDING,type:Ve.BackupType.BACKUP,...r})}catch(o){if(o.status===409)return;throw o}return await _r().add({docId:a.id,docRev:a.rev,appId:e,export:{trigger:t,...r}}),await Be.events.backup.workspaceBackupTriggered(e,a.id,Ve.BackupType.BACKUP,t,r?.name),a.id}n(aD,"triggerWorkspaceBackup");async function nD(e,t,r,a){let o=await hs(t),s;try{s=await tu({appId:e,timestamp:new Date().toISOString(),status:Ve.BackupStatus.PENDING,type:Ve.BackupType.RESTORE,createdBy:a})}catch(i){if(i?.status===409)return;throw i}return await _r().add({appId:e,docId:s.id,docRev:s.rev,import:{nameForBackup:r,backupId:t,createdBy:a}}),{restoreId:s.id,metadata:o}}n(nD,"triggerWorkspaceRestore");async function oD(e,t,r){let a=Be.db.getProdWorkspaceID(e);await Be.context.doInWorkspaceContext(a,async()=>{let o=Be.context.getProdWorkspaceDB();if(!await o.exists())return;let i=await o.tryGet(Ve.DocumentType.WORKSPACE_METADATA);i&&(i.backupErrors||(i.backupErrors={}),i.backupErrors[t]||(i.backupErrors[t]=[]),i.backupErrors[t].push(r),await o.put(i),await Be.cache.workspace.invalidateWorkspaceMetadata(i.appId,i))})}n(oD,"trackBackupError");var sD={isEnabled:_l,triggerWorkspaceRestore:He(nD),triggerWorkspaceBackup:He(aD),getBackupDownloadStream:He(gy),downloadWorkspaceBackup:He(rD),fetchWorkspaceBackups:He(tD),storeWorkspaceBackupMetadata:He(tu),updateBackupStatus:He(YN),updateRestoreStatus:He(zN),getWorkspaceBackup:He(hs),updateWorkspaceBackup:He(ZN),deleteWorkspaceBackup:He(my),deleteWorkspaceBackups:He(XN),cleanupExpiredWorkspaceBackups:He(eD),trackBackupError:He(oD)},bt=sD;var su={};F(su,{init:()=>au,scheduleCleanup:()=>nu});var V=require("@budibase/backend-core"),Lt=require("@budibase/types"),ya=Te(require("fs"));var iD="workspace-backup-cleanup",lD=V.Duration.fromDays(1).toMs();async function au(e){_r().process(async t=>{let r=t.data;try{"cleanup"in r?(console.log("Cleaning up expired app backups"),await V.tenancy.doInTenant(r.tenantId,()=>bt.cleanupExpiredWorkspaceBackups())):"export"in r?(console.log("Exporting app backup:",r.appId,r.export.trigger),await mD(r,e)):"import"in r&&(console.log("Importing app backup:",r.appId,r.import.backupId),await fD(r,e))}catch(a){let o="appId"in r?r.appId:"system";V.logging.logAlert(`Failed to perform backup for app ID: ${o}`,a)}})}n(au,"init");async function nu(){await _r().add({cleanup:!0,tenantId:V.tenancy.getTenantId()},{jobId:iD,repeat:{every:lD}})}n(nu,"scheduleCleanup");async function uD(e){await V.db.getDB(e,{skip_setup:!0}).destroy()}n(uD,"removeExistingApp");var hy=1e3;async function ys(e){for(let t=0;t<e.length;t+=hy)await V.objectStore.deleteFiles(V.objectStore.ObjectStoreBuckets.APPS,e.slice(t,t+hy))}n(ys,"deleteAppFiles");async function ou(e){let t=[];for await(let r of V.objectStore.listAllObjects(V.objectStore.ObjectStoreBuckets.APPS,e))r.Key&&t.push(r.Key);return t}n(ou,"listAppFiles");async function cD(e){let t=V.db.getProdWorkspaceID(e),r=await ou(`${t}/`);r.length&&await ys(r)}n(cD,"clearWorkspaceFiles");async function ru(e,t){let{stream:r}=await V.objectStore.getReadStream(V.objectStore.ObjectStoreBuckets.APPS,e);await V.objectStore.streamUpload({bucket:V.objectStore.ObjectStoreBuckets.APPS,filename:t,stream:r})}n(ru,"copyAppFile");async function yy(e,t){let r=new Map;for(let o of t)r.set(o.targetKey,o.rollbackKey);let a=[];for(let o of e){let s=r.get(o);s?await ru(s,o):a.push(o)}a.length&&await ys(a)}n(yy,"rollbackPromotedWorkspaceFiles");async function pD(e,t){let r=V.db.getProdWorkspaceID(e),a=V.db.getProdWorkspaceID(t),o=`${r}/`,s=`${a}/`,i=`${o}__restore_rollback/${Date.now()}/`,l=await ou(o),u=new Set,c=[];try{for(let d of l){let y=d.startsWith(o)?d.slice(o.length):d,h=`${s}${y}`;if(await V.objectStore.objectExists(V.objectStore.ObjectStoreBuckets.APPS,h)){let N=`${i}${y}`;await ru(h,N),c.push({targetKey:h,rollbackKey:N})}await ru(d,h),u.add(h)}}catch(d){if(u.size)try{await yy([...u],c)}catch(y){console.log("Failed to rollback partially promoted restore files:",y)}throw d}return{sourceFileKeys:l,targetFileKeys:[...u],rollbackFiles:c}}n(pD,"promoteWorkspaceFiles");async function dD(e,t,r){let o=`${V.db.getProdWorkspaceID(r)}/`,s=await ou(o),i=new Set(t),l=s.filter(u=>!i.has(u));l.length&&await ys(l),e.length&&await ys(e)}n(dD,"cleanupPromotedWorkspaceFiles");async function vy(e,t,r,a){let o=V.db.getDevWorkspaceID(r),s=V.db.getProdWorkspaceID(r),i=new Date().toISOString(),l=n(async(u,c)=>{a?.doc?await bt.updateBackupStatus(a.doc.id,u,c?.contents,c?.filename):await bt.storeWorkspaceBackupMetadata({appId:s,timestamp:i,trigger:e,status:u,name:a?.name,type:Lt.BackupType.BACKUP,contents:c?.contents,createdBy:a?.createdBy},{filename:c?.filename})},"updateMetadata");try{let u=await a.processing.exportWorkspaceFn(o,{tar:!0}),c=await a.processing.statsFn(o),d=`${s}/backup-${i}.tar.gz`,y=V.objectStore.ObjectStoreBuckets.BACKUPS,h=ya.default.createReadStream(u);await V.objectStore.streamUpload({bucket:y,filename:d,stream:h,extra:{type:"application/gzip",metadata:{name:a?.name,trigger:e,timestamp:i,appId:s}}}),await l(Lt.BackupStatus.COMPLETE,{filename:d,contents:c}),ya.default.existsSync(u)&&ya.default.rmSync(u)}catch(u){V.logging.logAlert("App backup error",u),await l(Lt.BackupStatus.FAILED);let c=a?.doc?.id||`backup-${i}`,d=u instanceof Error?u.message:String(u);await bt.trackBackupError(s,c,`Backup export failed: ${d}`)}}n(vy,"runBackup");async function fD(e,t){let r=e.appId,a=e.import.backupId,o=e.import.nameForBackup,s=e.import.createdBy,i=V.tenancy.getTenantIDFromWorkspaceID(r);return V.tenancy.doInTenant(i,async()=>{let l=V.db.getDevWorkspaceID(r),u=`${l}_temp_${Date.now()}`,{rev:c}=await bt.updateRestoreStatus(e.docId,e.docRev,Lt.BackupStatus.STARTED);await vy(Lt.BackupTrigger.RESTORING,i,r,{processing:t,createdBy:s,name:o});let d=await bt.downloadWorkspaceBackup(a),y=Lt.BackupStatus.COMPLETE,h=null;try{await t.importWorkspaceFn(l,V.db.getDB(u),{file:{type:"application/gzip",path:d},key:d},{objectStoreAppId:u,preserveLiteLLMConfig:!0}),h=await pD(u,l),await uD(l),await new V.db.Replication({source:u,target:l}).replicate();try{await dD(h.sourceFileKeys,h.targetFileKeys,l)}catch(b){console.log("Failed to cleanup promoted restore files:",b)}}catch(b){if(h)try{await yy(h.targetFileKeys,h.rollbackFiles)}catch(w){console.log("Failed to rollback promoted restore files:",w)}V.logging.logAlert("App restore error",b),y=Lt.BackupStatus.FAILED;let N=b instanceof Error?b.message:String(b);await bt.trackBackupError(r,a,`Backup restore failed: ${N}`)}finally{try{await V.db.getDB(u,{skip_setup:!0}).destroy()}catch{}try{await cD(u)}catch{}}await bt.updateRestoreStatus(e.docId,c,y),ya.default.existsSync(d)&&ya.default.rmSync(d,{force:!0})})}n(fD,"importProcessor");async function mD(e,t){let r=e.appId,a=e.export.trigger,o=e.export.name,s=V.tenancy.getTenantIDFromWorkspaceID(r);await V.tenancy.doInTenant(s,async()=>{try{let{rev:i}=await bt.updateBackupStatus(e.docId,Lt.BackupStatus.STARTED);return vy(a,s,r,{processing:t,doc:{id:e.docId,rev:i},name:o})}catch(i){V.logging.logAlert("App backup error",i);let l=i instanceof Error?i.message:String(i);await bt.trackBackupError(r,e.docId,`Backup export failed: ${l}`)}})}n(mD,"exportProcessor");var gD=n(async e=>{uy(),await au(e.processing),!iu.env.isTest()&&!iu.env.MULTI_TENANCY&&await nu()},"init"),Gn={...bt,processing:su,init:gD,getBackupQueue:_r};var by=n(async e=>{e.backups&&await Gn.init(e.backups)},"init");var Cs={};F(Cs,{create:()=>l$,find:()=>i$,get:()=>s$,handleDisable:()=>d$,remove:()=>c$,update:()=>u$});var GI=Te(ec()),ut=require("@budibase/backend-core");var $I=require("@budibase/types");async function s$(e){let t=ut.tenancy.getGlobalDB(),r=new ut.db.QueryBuilder(t.name,$I.SearchIndex.USER);r.setIndexBuilder(ut.db.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[o,s]of Object.entries(e.filters?.equal??{}))r.addEqual(o,s);r.setSort("_id"),r.setSkip(e.skip);let a=await r.run();return{users:a.rows,total:a.totalRows}}n(s$,"get");async function i$(e){return await ut.users.getById(e)}n(i$,"find");async function l$(e){let t=await qt.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new ut.HTTPError("User is already synched",409);e={...t,scimInfo:(0,GI.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await qt.save(e,{requirePassword:!1})}n(l$,"create");async function u$(e,t){return await qt.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}n(u$,"update");async function c$(e){return await qt.destroy(e)}n(c$,"remove");async function p$(){return(await ut.users.getAllUsers()).filter(t=>t.scimInfo?.isSync)}n(p$,"getAllSCIMUsers");async function d$(e){let t=await p$();if(t.length)switch(e){case"remove":await ut.users.UserDB.bulkDelete(t.map(r=>({userId:r._id,email:r.email})));break;case"convert":{let r=await Promise.all(t.map(async a=>{let o={...a};return delete o.scimInfo,delete o.ssoId,o.password=await ut.utils.hash(crypto.randomUUID()),o}));await ut.users.bulkUpdateGlobalUsers(r);break}}}n(d$,"handleDisable");var Ms={};F(Ms,{create:()=>f$});var WI=Te(ec());var VI=require("@budibase/backend-core");async function f$(e){let t=await Si(e.name),r;if(!t)r=(await Dt.save(e)).id;else{if(t.scimInfo?.isSync)throw new VI.HTTPError("Group is already synched",409);r=t._id,t.users.length&&await Dt.removeUsers(r,t.users.map(o=>o._id)),t.scimInfo=(0,WI.default)(t.scimInfo,e.scimInfo),await Dt.save(t)}return await Dt.get(r)}n(f$,"create");var jr={};F(jr,{logRequest:()=>h$,logResponse:()=>y$});var Ft=require("@budibase/backend-core"),QI=Te(KI());var{DocWritethrough:m$}=Ft.cache.docWritethrough;function g$(){return`${Ft.db.DocumentType.SCIM_LOG}${Ft.db.SEPARATOR}${(0,QI.default)().format("YYYYMMDD")}`}n(g$,"getLogDocId");var HI=n(()=>{let e=Ft.context.getScimDBName();return new m$(Ft.db.getDB(e),g$())},"getDB");async function h$(e){Ft.logging.logWarn("SCIM request log",e);let t=Date.now().toString();return await HI().patch({[`${t}_request`]:{ts:new Date().toISOString(),...e}}),t}n(h$,"logRequest");async function y$(e,t){Ft.logging.logWarn("SCIM response",t),await HI().patch({[`${e}_response`]:{ts:new Date().toISOString(),...t}})}n(y$,"logResponse");var lc={};F(lc,{doInScimContext:()=>I$,feature:()=>nc,internalGroupOnly:()=>x$,licenseAuth:()=>ic,licensing:()=>JI,requireSCIM:()=>T$,scimGroupOnly:()=>_$,scimUserOnly:()=>S$});var xr=require("@budibase/backend-core");var Ps=require("@budibase/types");var v$=n((e={checkUsersLimit:!0})=>async(t,r)=>{if((e.licensingCheck?e.licensingCheck:()=>!!t.user)(t)){if(xr.env.SELF_HOSTED&&xr.env.DEFAULT_LICENSE)return t.user.license=_i,r();t.user.license=await Vt.cache.getCachedLicense(),e.checkUsersLimit&&(xr.utils.isServingApp(t)||xr.utils.isServingBuilder(t)||xr.utils.isServingBuilderPreview(t)||xr.utils.isPublicApiRequest(t))&&await Jt.usageLimitIsExceeded({name:Ps.StaticQuotaName.USERS,type:Ps.QuotaUsageType.STATIC,usageChange:0})}return r()},"licensing"),JI=v$;var nc={};F(nc,{requireFeature:()=>b$,requireFeatures:()=>w$});var b$=n(e=>async(t,r)=>{await Qo(e),await r()},"requireFeature"),w$=n((...e)=>async(t,r)=>{await Sl(e),await r()},"requireFeatures");var ks=require("@budibase/backend-core");var I$=n(async(e,t)=>{let r;return ks.env.ENABLE_SCIM_LOGGER&&(r=await jr.logRequest({...e.request.toJSON(),body:e.request.body})),await ks.context.doInScimContext(async()=>{let a=await t();return r&&await jr.logResponse(r,{...e.response.toJSON(),body:e.response.body}),a})},"doInScimContext");var T$=n(async(e,t)=>{await El(),await t()},"requireSCIM");var YI=require("@budibase/backend-core");var S$=n(e=>oc(YI.users.getById,e,!0),"scimUserOnly"),_$=n(e=>oc(oe.get,e,!0),"scimGroupOnly"),x$=n(e=>oc(oe.get,e,!1),"internalGroupOnly");function oc(e,t,r){return async(a,o)=>{let s=a.params[t];return typeof s!="string"&&a.throw(404),!!(await e(s)).scimInfo?.isSync!==r&&a.throw(404),o()}}n(oc,"scimSyncChecks");var Gr=require("@budibase/backend-core");var sc=require("dd-trace");async function ic(e,t){await sc.tracer.trace("licenseAuth",async r=>{let a=e.request.headers[Gr.constants.Header.LICENSE_KEY]||Gr.utils.getBearerToken(e);Array.isArray(a)&&(a=a[0]),a||e.throw(403,"License key not provided");let o=await yl(a);o||(r.addTags({licenseFound:!1}),e.throw(403,"License not found or invalid")),o.tenantId||e.throw(403,"License does not have a tenant ID"),sc.tracer.setUser({id:"anonymous",tenantId:o.tenantId}),await Gr.context.doInSelfHostTenantUsingCloud(o.tenantId,async()=>{await Gr.context.doInLicenseContext(o,async()=>{await t()})})})}n(ic,"default");var pc={};F(pc,{group:()=>cc,user:()=>uc});var uc={};F(uc,{fromScimUser:()=>C$,toScimUserResponse:()=>E$,userFilters:()=>M$});var zI=require("@budibase/backend-core"),ZI=require("@budibase/shared-core"),Ns=require("@budibase/types"),XI=require("scim2-parse-filter");var{unreachable:A$}=ZI.utils,E$=n(e=>{let{isSync:t,roles:r,...a}=e.scimInfo||{},o={...a,schemas:["urn:ietf:params:scim:schemas:core:2.0:User"],id:e._id,meta:{resourceType:"User",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},active:e.status===Ns.UserStatus.ACTIVE};(e.firstName||e.lastName)&&(o.name={formatted:[e.firstName,e.lastName].filter(i=>i).join(" "),familyName:e.lastName,givenName:e.firstName});let s="urn:ietf:params:scim:schemas:extension:enterprise:2.0:User";if(o[s]?.manager){let i=o[s].manager;typeof i=="string"&&(o[s].manager={value:i})}return o},"toScimUserResponse"),R$=n(e=>!!e?.id,"isScimUserResponse");function O$(e){if(zI.utils.validEmail(e.userName))return e.userName;if(e.emails)return e.emails.find(t=>t.primary)?.value||e.emails[0]?.value}n(O$,"tryGetEmail");var C$=n((e,t={})=>{let r=R$(e)?e:void 0,a=O$(e);if(!a)throw new Error("Email is required");let o;switch(e.active){case"True":case"true":case!0:o=!0;break;case"False":case"false":case!1:o=!1;break;default:A$(e.active)}let s,i;return e.name?.givenName?(s=e.name?.givenName,i=e.name?.familyName):s=e.displayName,{tenantId:"",_id:r?.id,userId:r?.id,email:a,firstName:s,lastName:i,scimInfo:{...e,isSync:!0},roles:t,status:o?Ns.UserStatus.ACTIVE:Ns.UserStatus.INACTIVE,createdAt:r?.meta.created.getTime(),updatedAt:r?.meta.lastModified.toISOString()}},"fromScimUser"),M$=n(e=>{let t={equal:{}},r=(0,XI.parse)(e);function a(o){switch(o.op){case"eq":{let s=o.attrPath,i;s==="emails.value"?i="email":i=`scimInfo.${s}`,t.equal[i]=o.compValue;break}case"and":for(let s of o.filters)a(s);break;default:console.warn("Filter not handled",{filter:o})}}return n(a,"parseFilters"),a(r),t},"userFilters");var cc={};F(cc,{fromScimGroup:()=>N$,toScimGroupResponse:()=>P$});var P$=n(e=>({schemas:["urn:ietf:params:scim:schemas:core:2.0:Group"],id:e._id,externalId:e.scimInfo.externalId,meta:{resourceType:"Group",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},displayName:e.name,members:e.users?.map(t=>({value:t._id}))}),"toScimGroupResponse"),k$=n(e=>!!e?.id,"isScimGroup"),N$=n(e=>{let t=k$(e)?e:void 0;return{_id:t?.id,name:e.displayName,scimInfo:{externalId:e.externalId,isSync:!0},icon:"UserGroup",color:"var(--spectrum-global-color-blue-600)",createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},"fromScimGroup");var pp={};F(pp,{LLMRequest:()=>Ke,TableGeneration:()=>cp,agentHistoryTitleSystemPrompt:()=>mQ,agentSystemPrompt:()=>fQ,aiColumnSchemas:()=>lp,aiTableResponseToTableSchema:()=>np,appendAIColumns:()=>op,classifyText:()=>rQ,cleanData:()=>aQ,composeAutomationAgentSystemPrompt:()=>cQ,composeAutomationAgentToolGuidelines:()=>pQ,generateAIColumns:()=>rp,generateCronExpression:()=>nQ,generateData:()=>ap,generateJs:()=>uQ,generateOperationInstructionsPrompt:()=>oQ,generateTables:()=>tp,generationStructure:()=>ip,normalizeContentType:()=>yQ,parseResponseFormat:()=>EA,sanitiseToolName:()=>hQ,searchWeb:()=>lQ,sentimentAnalysis:()=>iQ,summarizeText:()=>tQ,tableDataStructuredOutput:()=>up,translate:()=>sQ});var oi=require("@budibase/backend-core"),CA=require("@budibase/shared-core");var RT="vercel.ai.error",D$=Symbol.for(RT),eT,tT,C=class OT extends(tT=Error,eT=D$,tT){static{n(this,"_AISDKError")}constructor({name:t,message:r,cause:a}){super(r),this[eT]=!0,this.name=t,this.cause=a}static isInstance(t){return OT.hasMarker(t,RT)}static hasMarker(t,r){let a=Symbol.for(r);return t!=null&&typeof t=="object"&&a in t&&typeof t[a]=="boolean"&&t[a]===!0}},CT="AI_APICallError",MT=`vercel.ai.error.${CT}`,q$=Symbol.for(MT),rT,aT,me=class extends(aT=C,rT=q$,aT){static{n(this,"APICallError")}constructor({message:e,url:t,requestBodyValues:r,statusCode:a,responseHeaders:o,responseBody:s,cause:i,isRetryable:l=a!=null&&(a===408||a===409||a===429||a>=500),data:u}){super({name:CT,message:e,cause:i}),this[rT]=!0,this.url=t,this.requestBodyValues=r,this.statusCode=a,this.responseHeaders=o,this.responseBody=s,this.isRetryable=l,this.data=u}static isInstance(e){return C.hasMarker(e,MT)}},PT="AI_EmptyResponseBodyError",kT=`vercel.ai.error.${PT}`,U$=Symbol.for(kT),nT,oT,NT=class extends(oT=C,nT=U$,oT){static{n(this,"EmptyResponseBodyError")}constructor({message:e="Empty response body"}={}){super({name:PT,message:e}),this[nT]=!0}static isInstance(e){return C.hasMarker(e,kT)}};function Ar(e){return e==null?"unknown error":typeof e=="string"?e:e instanceof Error?e.message:JSON.stringify(e)}n(Ar,"getErrorMessage");var DT="AI_InvalidArgumentError",qT=`vercel.ai.error.${DT}`,L$=Symbol.for(qT),sT,iT,UT=class extends(iT=C,sT=L$,iT){static{n(this,"InvalidArgumentError")}constructor({message:e,cause:t,argument:r}){super({name:DT,message:e,cause:t}),this[sT]=!0,this.argument=r}static isInstance(e){return C.hasMarker(e,qT)}},LT="AI_InvalidPromptError",FT=`vercel.ai.error.${LT}`,F$=Symbol.for(FT),lT,uT,$r=class extends(uT=C,lT=F$,uT){static{n(this,"InvalidPromptError")}constructor({prompt:e,message:t,cause:r}){super({name:LT,message:`Invalid prompt: ${t}`,cause:r}),this[lT]=!0,this.prompt=e}static isInstance(e){return C.hasMarker(e,FT)}},BT="AI_InvalidResponseDataError",jT=`vercel.ai.error.${BT}`,B$=Symbol.for(jT),cT,pT,kte=class extends(pT=C,cT=B$,pT){static{n(this,"InvalidResponseDataError")}constructor({data:e,message:t=`Invalid response data: ${JSON.stringify(e)}.`}){super({name:BT,message:t}),this[cT]=!0,this.data=e}static isInstance(e){return C.hasMarker(e,jT)}},GT="AI_JSONParseError",$T=`vercel.ai.error.${GT}`,j$=Symbol.for($T),dT,fT,Kn=class extends(fT=C,dT=j$,fT){static{n(this,"JSONParseError")}constructor({text:e,cause:t}){super({name:GT,message:`JSON parsing failed: Text: ${e}.
49
49
  Error message: ${Ar(t)}`,cause:t}),this[dT]=!0,this.text=e}static isInstance(e){return C.hasMarker(e,$T)}},WT="AI_LoadAPIKeyError",VT=`vercel.ai.error.${WT}`,G$=Symbol.for(VT),mT,gT,Nte=class extends(gT=C,mT=G$,gT){static{n(this,"LoadAPIKeyError")}constructor({message:e}){super({name:WT,message:e}),this[mT]=!0}static isInstance(e){return C.hasMarker(e,VT)}},KT="AI_LoadSettingError",QT=`vercel.ai.error.${KT}`,$$=Symbol.for(QT),hT,yT,Dte=class extends(yT=C,hT=$$,yT){static{n(this,"LoadSettingError")}constructor({message:e}){super({name:KT,message:e}),this[hT]=!0}static isInstance(e){return C.hasMarker(e,QT)}},HT="AI_NoContentGeneratedError",JT=`vercel.ai.error.${HT}`,W$=Symbol.for(JT),vT,bT,qte=class extends(bT=C,vT=W$,bT){static{n(this,"NoContentGeneratedError")}constructor({message:e="No content generated."}={}){super({name:HT,message:e}),this[vT]=!0}static isInstance(e){return C.hasMarker(e,JT)}},YT="AI_NoSuchModelError",zT=`vercel.ai.error.${YT}`,V$=Symbol.for(zT),wT,IT,Ute=class extends(IT=C,wT=V$,IT){static{n(this,"NoSuchModelError")}constructor({errorName:e=YT,modelId:t,modelType:r,message:a=`No such ${r}: ${t}`}){super({name:e,message:a}),this[wT]=!0,this.modelId=t,this.modelType=r}static isInstance(e){return C.hasMarker(e,zT)}},ZT="AI_TooManyEmbeddingValuesForCallError",XT=`vercel.ai.error.${ZT}`,K$=Symbol.for(XT),TT,ST,Lte=class extends(ST=C,TT=K$,ST){static{n(this,"TooManyEmbeddingValuesForCallError")}constructor(e){super({name:ZT,message:`Too many values for a single embedding call. The ${e.provider} model "${e.modelId}" can only embed up to ${e.maxEmbeddingsPerCall} values per call, but ${e.values.length} values were provided.`}),this[TT]=!0,this.provider=e.provider,this.modelId=e.modelId,this.maxEmbeddingsPerCall=e.maxEmbeddingsPerCall,this.values=e.values}static isInstance(e){return C.hasMarker(e,XT)}},eS="AI_TypeValidationError",tS=`vercel.ai.error.${eS}`,Q$=Symbol.for(tS),_T,xT,Bt=class dc extends(xT=C,_T=Q$,xT){static{n(this,"_TypeValidationError")}constructor({value:t,cause:r,context:a}){let o="Type validation failed";if(a?.field&&(o+=` for ${a.field}`),a?.entityName||a?.entityId){o+=" (";let s=[];a.entityName&&s.push(a.entityName),a.entityId&&s.push(`id: "${a.entityId}"`),o+=s.join(", "),o+=")"}super({name:eS,message:`${o}: Value: ${JSON.stringify(t)}.
50
50
  Error message: ${Ar(r)}`,cause:r}),this[_T]=!0,this.value=t,this.context=a}static isInstance(t){return C.hasMarker(t,tS)}static wrap({value:t,cause:r,context:a}){var o,s,i;return dc.isInstance(r)&&r.value===t&&((o=r.context)==null?void 0:o.field)===a?.field&&((s=r.context)==null?void 0:s.entityName)===a?.entityName&&((i=r.context)==null?void 0:i.entityId)===a?.entityId?r:new dc({value:t,cause:r,context:a})}},rS="AI_UnsupportedFunctionalityError",aS=`vercel.ai.error.${rS}`,H$=Symbol.for(aS),AT,ET,Fte=class extends(ET=C,AT=H$,ET){static{n(this,"UnsupportedFunctionalityError")}constructor({functionality:e,message:t=`'${e}' functionality not supported.`}){super({name:rS,message:t}),this[AT]=!0,this.functionality=e}static isInstance(e){return C.hasMarker(e,aS)}};var Fs=Te(require("zod/v4"),1),H=require("zod/v3"),IS=require("zod/v3"),Qn=require("zod/v3");var Ds=class extends Error{static{n(this,"ParseError")}constructor(t,r){super(t),this.name="ParseError",this.type=r.type,this.field=r.field,this.value=r.value,this.line=r.line}};function fc(e){}n(fc,"noop");function nS(e){if(typeof e=="function")throw new TypeError("`callbacks` must be an object, got a function instead. Did you mean `{onEvent: fn}`?");let{onEvent:t=fc,onError:r=fc,onRetry:a=fc,onComment:o}=e,s="",i=!0,l,u="",c="";function d(w){let S=i?w.replace(/^\xEF\xBB\xBF/,""):w,[A,D]=J$(`${s}${S}`);for(let W of A)y(W);s=D,i=!1}n(d,"feed");function y(w){if(w===""){b();return}if(w.startsWith(":")){o&&o(w.slice(w.startsWith(": ")?2:1));return}let S=w.indexOf(":");if(S!==-1){let A=w.slice(0,S),D=w[S+1]===" "?2:1,W=w.slice(S+D);h(A,W,w);return}h(w,"",w)}n(y,"parseLine");function h(w,S,A){switch(w){case"event":c=S;break;case"data":u=`${u}${S}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "dist"
5
5
  ],
6
6
  "license": "UNLICENSED",
7
- "version": "3.41.1",
7
+ "version": "3.41.3",
8
8
  "description": "Budibase Pro (Backend)",
9
9
  "main": "dist/index.js",
10
10
  "types": "dist/index.d.ts",
@@ -66,5 +66,5 @@
66
66
  }
67
67
  }
68
68
  },
69
- "gitHead": "fc94728bc509937e374c5d38f47f8858a1f405c9"
69
+ "gitHead": "dd1b8d888c49ad09b82b00fc5b93ceff707bbd6a"
70
70
  }