@budibase/pro 3.45.0 → 3.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- 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 Tn(e){return Yi.default.verify(e,hR,{algorithms:["RS256"]})}n(Tn,"verifyLicenseToken");function yR(e,t){return Yi.default.sign(t,e,{encoding:"utf-8",algorithm:"RS256"})}n(yR,"sign");var Bo={};H(Bo,{getOfflineFeatures:()=>Zi});var w=require("@budibase/types");var hf=[w.Feature.BUDIBASE_AI,w.Feature.SYNC_AUTOMATIONS],yf=[w.Feature.WORKSPACE_BACKUPS,w.Feature.BRANDING,w.Feature.SYNC_AUTOMATIONS,w.Feature.VIEW_PERMISSIONS,w.Feature.TRIGGER_AUTOMATION_RUN,w.Feature.VIEW_READONLY_COLUMNS,w.Feature.AI_CUSTOM_CONFIGS,w.Feature.PDF,w.Feature.BUDIBASE_AI],vf=[w.Feature.USER_GROUPS,w.Feature.WORKSPACE_BACKUPS,w.Feature.BRANDING,w.Feature.ENFORCEABLE_SSO,w.Feature.ENVIRONMENT_VARIABLES,w.Feature.SYNC_AUTOMATIONS,w.Feature.TRIGGER_AUTOMATION_RUN,w.Feature.VIEW_PERMISSIONS,w.Feature.VIEW_READONLY_COLUMNS,w.Feature.AI_CUSTOM_CONFIGS,w.Feature.CUSTOM_APP_SCRIPTS,w.Feature.PWA,w.Feature.PDF,w.Feature.BUDIBASE_AI,w.Feature.RECAPTCHA,w.Feature.PKCE_OIDC,w.Feature.TRANSLATIONS],vR={[w.PlanType.FREE]:[...Nt.SELF_FREE_LICENSE.features],[w.PlanType.PREMIUM]:[w.Feature.WORKSPACE_BACKUPS,w.Feature.BRANDING,w.Feature.VIEW_PERMISSIONS,w.Feature.PDF],[w.PlanType.PREMIUM_PLUS]:yf,[w.PlanType.PREMIUM_MAX]:yf,[w.PlanType.PREMIUM_PLUS_TRIAL]:[w.Feature.WORKSPACE_BACKUPS,w.Feature.BRANDING,w.Feature.SYNC_AUTOMATIONS,w.Feature.VIEW_PERMISSIONS,w.Feature.TRIGGER_AUTOMATION_RUN,w.Feature.VIEW_READONLY_COLUMNS,w.Feature.AI_CUSTOM_CONFIGS,w.Feature.PDF,w.Feature.BUDIBASE_AI],[w.PlanType.PRO]:hf,[w.PlanType.PRO_MAX]:hf,[w.PlanType.TEAM]:[w.Feature.USER_GROUPS,w.Feature.WORKSPACE_BACKUPS],[w.PlanType.BUSINESS]:vf,[w.PlanType.BUSINESS_PLUS]:vf,[w.PlanType.ENTERPRISE_BASIC]:[w.Feature.USER_GROUPS,w.Feature.WORKSPACE_BACKUPS,w.Feature.ENVIRONMENT_VARIABLES,w.Feature.ENFORCEABLE_SSO,w.Feature.EMBED_AUTH,w.Feature.AUDIT_LOGS,w.Feature.BRANDING,w.Feature.SYNC_AUTOMATIONS,w.Feature.OFFLINE,w.Feature.EXPANDED_PUBLIC_API,w.Feature.WORKSPACE_IMPORT_EXPORT,w.Feature.VIEW_PERMISSIONS,w.Feature.TRIGGER_AUTOMATION_RUN,w.Feature.SCIM,w.Feature.VIEW_READONLY_COLUMNS,w.Feature.AI_CUSTOM_CONFIGS,w.Feature.PWA,w.Feature.CUSTOM_APP_SCRIPTS,w.Feature.PDF,w.Feature.BUDIBASE_AI,w.Feature.RECAPTCHA,w.Feature.PKCE_OIDC,w.Feature.TRANSLATIONS,w.Feature.MICROFRONTEND],[w.PlanType.ENTERPRISE_BASIC_TRIAL]:[w.Feature.USER_GROUPS,w.Feature.WORKSPACE_BACKUPS,w.Feature.ENVIRONMENT_VARIABLES,w.Feature.ENFORCEABLE_SSO,w.Feature.EMBED_AUTH,w.Feature.BRANDING,w.Feature.SYNC_AUTOMATIONS,w.Feature.EXPANDED_PUBLIC_API,w.Feature.WORKSPACE_IMPORT_EXPORT,w.Feature.VIEW_PERMISSIONS,w.Feature.TRIGGER_AUTOMATION_RUN,w.Feature.SCIM,w.Feature.VIEW_READONLY_COLUMNS,w.Feature.AI_CUSTOM_CONFIGS,w.Feature.PWA,w.Feature.CUSTOM_APP_SCRIPTS,w.Feature.PDF,w.Feature.BUDIBASE_AI,w.Feature.RECAPTCHA,w.Feature.PKCE_OIDC,w.Feature.TRANSLATIONS,w.Feature.MICROFRONTEND],[w.PlanType.ENTERPRISE]:[w.Feature.USER_GROUPS,w.Feature.WORKSPACE_BACKUPS,w.Feature.ENVIRONMENT_VARIABLES,w.Feature.ENFORCEABLE_SSO,w.Feature.EMBED_AUTH,w.Feature.AUDIT_LOGS,w.Feature.BRANDING,w.Feature.SYNC_AUTOMATIONS,w.Feature.OFFLINE,w.Feature.EXPANDED_PUBLIC_API,w.Feature.WORKSPACE_IMPORT_EXPORT,w.Feature.VIEW_PERMISSIONS,w.Feature.TRIGGER_AUTOMATION_RUN,w.Feature.SCIM,w.Feature.VIEW_READONLY_COLUMNS,w.Feature.AI_CUSTOM_CONFIGS,w.Feature.PWA,w.Feature.CUSTOM_APP_SCRIPTS,w.Feature.PDF,w.Feature.BUDIBASE_AI,w.Feature.RECAPTCHA,w.Feature.PKCE_OIDC,w.Feature.TRANSLATIONS,w.Feature.MICROFRONTEND]};function Zi(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(vR)}n(Zi,"getOfflineFeatures");var Go={};H(Go,{UNLIMITED:()=>v,getQuotas:()=>Xi});var ce=require("@budibase/types");var g=fr,bf=Nt,v=-1,Ut=n(e=>e*1e6,"millions"),bR={[ce.PlanType.FREE]:{...bf.CLOUD_FREE_LICENSE.quotas},[ce.PlanType.PREMIUM]:{usage:{monthly:{...g.queries(v),...g.automations(1e3),...g.budibaseAICredits(0),...g.actions(5e3)},static:{...g.rows(1e4),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(0),...g.plugins(v),...g.customAIConfigurations(0)}},constant:{...g.agentLogRetentionDays(7),...g.automationLogRetentionDays(7),...g.appBackupRetentionDays(7)}},[ce.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(10)),...g.actions(2e4)},static:{...g.rows(25e4),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(0),...g.plugins(v),...g.customAIConfigurations(0)}},constant:{...g.agentLogRetentionDays(7),...g.automationLogRetentionDays(7),...g.appBackupRetentionDays(7)}},[ce.PlanType.PREMIUM_MAX]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(10)),...g.actions(5e4)},static:{...g.rows(25e4),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(0),...g.plugins(v),...g.customAIConfigurations(0)}},constant:{...g.agentLogRetentionDays(7),...g.automationLogRetentionDays(7),...g.appBackupRetentionDays(7)}},[ce.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(75e4),...g.actions(2e4)},static:{...g.rows(25e4),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(0),...g.plugins(v),...g.customAIConfigurations(0)}},constant:{...g.agentLogRetentionDays(7),...g.automationLogRetentionDays(7),...g.appBackupRetentionDays(7)}},[ce.PlanType.PRO]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(2)),...g.actions(5e3)},static:{...g.rows(5e4),...g.apps(v),...g.users(v),...g.creators(1),...g.userGroups(0),...g.plugins(v),...g.customAIConfigurations(0)}},constant:{...g.agentLogRetentionDays(1),...g.automationLogRetentionDays(1),...g.appBackupRetentionDays(0)}},[ce.PlanType.PRO_MAX]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(2)),...g.actions(1e4)},static:{...g.rows(5e4),...g.apps(v),...g.users(v),...g.creators(1),...g.userGroups(0),...g.plugins(v),...g.customAIConfigurations(0)}},constant:{...g.agentLogRetentionDays(1),...g.automationLogRetentionDays(1),...g.appBackupRetentionDays(0)}},[ce.PlanType.TEAM]:{usage:{monthly:{...g.queries(v),...g.automations(1e4),...g.budibaseAICredits(0),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(10),...g.plugins(v),...g.customAIConfigurations(0)}},constant:{...g.agentLogRetentionDays(30),...g.automationLogRetentionDays(30),...g.appBackupRetentionDays(90)}},[ce.PlanType.BUSINESS]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(50)),...g.actions(25e4)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(v),...g.plugins(v),...g.customAIConfigurations(v)}},constant:{...g.agentLogRetentionDays(30),...g.automationLogRetentionDays(30),...g.appBackupRetentionDays(v)}},[ce.PlanType.BUSINESS_PLUS]:void 0,[ce.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(50)),...g.actions(25e4)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(v),...g.plugins(v),...g.customAIConfigurations(v)}},constant:{...g.agentLogRetentionDays(v),...g.automationLogRetentionDays(v),...g.appBackupRetentionDays(v)}},[ce.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(75e4),...g.actions(25e4)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(1),...g.userGroups(v),...g.plugins(v),...g.customAIConfigurations(v)}},constant:{...g.agentLogRetentionDays(15),...g.automationLogRetentionDays(15),...g.appBackupRetentionDays(15)}},[ce.PlanType.ENTERPRISE]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(50)),...g.actions(25e4)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(v),...g.plugins(v),...g.customAIConfigurations(v)}},constant:{...g.agentLogRetentionDays(v),...g.automationLogRetentionDays(v),...g.appBackupRetentionDays(v)}}},wR={[ce.PlanType.FREE]:{...bf.SELF_FREE_LICENSE.quotas},[ce.PlanType.PREMIUM]:void 0,[ce.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(2)),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(0),...g.plugins(v),...g.customAIConfigurations(1)}},constant:{...g.agentLogRetentionDays(30),...g.automationLogRetentionDays(30),...g.appBackupRetentionDays(30)}},[ce.PlanType.PREMIUM_MAX]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(2)),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(0),...g.plugins(v),...g.customAIConfigurations(1)}},constant:{...g.agentLogRetentionDays(30),...g.automationLogRetentionDays(30),...g.appBackupRetentionDays(30)}},[ce.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(0),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(0),...g.plugins(v),...g.customAIConfigurations(1)}},constant:{...g.agentLogRetentionDays(30),...g.automationLogRetentionDays(30),...g.appBackupRetentionDays(30)}},[ce.PlanType.PRO]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(0),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(5),...g.plugins(v),...g.customAIConfigurations(0)}},constant:{...g.agentLogRetentionDays(7),...g.automationLogRetentionDays(7),...g.appBackupRetentionDays(7)}},[ce.PlanType.PRO_MAX]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(0),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(5),...g.plugins(v),...g.customAIConfigurations(0)}},constant:{...g.agentLogRetentionDays(7),...g.automationLogRetentionDays(7),...g.appBackupRetentionDays(7)}},[ce.PlanType.TEAM]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(0),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(10),...g.plugins(v),...g.customAIConfigurations(0)}},constant:{...g.agentLogRetentionDays(30),...g.automationLogRetentionDays(30),...g.appBackupRetentionDays(90)}},[ce.PlanType.BUSINESS]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(0),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(50),...g.plugins(v),...g.customAIConfigurations(0)}},constant:{...g.agentLogRetentionDays(v),...g.automationLogRetentionDays(v),...g.appBackupRetentionDays(v)}},[ce.PlanType.BUSINESS_PLUS]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(50)),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(v),...g.plugins(v),...g.customAIConfigurations(v)}},constant:{...g.agentLogRetentionDays(30),...g.automationLogRetentionDays(30),...g.appBackupRetentionDays(v)}},[ce.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(50)),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(v),...g.plugins(v),...g.customAIConfigurations(v)}},constant:{...g.agentLogRetentionDays(v),...g.automationLogRetentionDays(v),...g.appBackupRetentionDays(v)}},[ce.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(75e4),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(v),...g.plugins(v),...g.customAIConfigurations(v)}},constant:{...g.agentLogRetentionDays(15),...g.automationLogRetentionDays(15),...g.appBackupRetentionDays(15)}},[ce.PlanType.ENTERPRISE]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(50)),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(v),...g.plugins(v),...g.customAIConfigurations(v)}},constant:{...g.agentLogRetentionDays(v),...g.automationLogRetentionDays(v),...g.appBackupRetentionDays(v)}}};function Xi(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 ce.Hosting.SELF:r=a(wR);break;case ce.Hosting.CLOUD:r=a(bR);break}return JSON.parse(JSON.stringify(r))}n(Xi,"getQuotas");var $o={};H($o,{encoding:()=>ya,workspaceExists:()=>IR});var wf=require("@budibase/backend-core");async function IR(e){return(await wf.db.getAllWorkspaces({all:!0,idsOnly:!0})).includes(e)}n(IR,"workspaceExists");var ya={};H(ya,{base64ToObject:()=>SR,objectToBase64:()=>TR});function TR(e){let t=JSON.stringify(e);return Buffer.from(t).toString("base64")}n(TR,"objectToBase64");function SR(e){let t=Buffer.from(e,"base64").toString();return JSON.parse(t)}n(SR,"base64ToObject");var ny=require("@budibase/types"),nr=require("@budibase/backend-core"),oy=Re(Ug()),sy=Re(El());async function ZN(e){await Ml(e),await gt.save({offlineLicenseToken:e}),await Qr()}n(ZN,"activateOfflineLicenseToken");async function XN(){await gt.save({offlineLicenseToken:void 0}),await Qr()}n(XN,"deleteOfflineLicenseToken");async function iy(){return(await gt.get()).offlineLicenseToken}n(iy,"getOfflineLicenseToken");async function Al(){let t=(await nr.installation.getInstall()).installId,r=nr.context.getTenantId(),a=await nr.events.identification.getUniqueTenantId(r);return{installId:t,tenantId:a}}n(Al,"getIdentifier");async function eU(){let e=await Al();return ya.objectToBase64(e)}n(eU,"getIdentifierBase64");function tU(e){return ya.base64ToObject(e)}n(tU,"getIdentifierFromBase64");function ly(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(ly,"verifyExpiry");var Bn=class extends Error{static{n(this,"OfflineLicenseMismatchError")}};async function uy(e){let t=await Al();if(e.identifier.installId!==t.installId||e.identifier.tenantId!==t.tenantId)throw new Bn("Invalid offline license")}n(uy,"verifyInstallation");function cy(e){let t=e.plan.type,r=ny.Hosting.SELF,a=Zi(t),o=Xi(r,t);return e.features=(0,oy.default)(e.features,a),e.quotas=(0,sy.default)(e.quotas,o),e}n(cy,"enrichLicense");async function Ml(e){let t;try{t=await Tn(e)}catch{throw new nr.HTTPError("Invalid offline license token",400)}try{ly(t)}catch{throw new nr.HTTPError("Offline license has expired",400)}try{await uy(t)}catch(r){throw r instanceof Bn?new nr.HTTPError("Offline license does not match this installation",400):r}return t}n(Ml,"verifyOfflineLicenseToken");async function Rl(){try{let e=await iy();if(e){let t=await Ml(e);return cy(t)}}catch(e){console.error("Error retrieving offline license",e)}}n(Rl,"getOfflineLicense");var $n={};H($n,{deleteDevLicense:()=>sU,getOfflineLicense:()=>nU,writeDevLicenseToDisk:()=>oU});var dy=require("@budibase/backend-core"),Ol=require("path"),py=require("os"),zr=Re(require("fs"));var rU=dy.env.isTest()?".budibase-test":".budibase",Cl=(0,Ol.join)((0,py.tmpdir)(),rU),aU="dev_license.txt",Gn=(0,Ol.join)(Cl,aU);if(!zr.default.existsSync(Cl))try{zr.default.mkdirSync(Cl)}catch{}function nU(){try{if(zr.default.existsSync(Gn)){let e=zr.default.readFileSync(Gn,{encoding:"utf-8"});return Tn(e)}}catch(e){console.error("Error retrieving offline license from disk",e)}}n(nU,"getOfflineLicense");function oU(e){console.log(`Writing license to: ${Gn}`),zr.default.writeFileSync(Gn,e,{encoding:"utf-8"})}n(oU,"writeDevLicenseToDisk");function sU(){zr.default.rmSync(Gn,{force:!0})}n(sU,"deleteDevLicense");var fy=require("dd-trace");var kl=n(async()=>await fy.tracer.trace("getLicense",async e=>{if(Pl.env.OFFLINE_MODE)return e.addTags({offline:!0}),Rl();let t=await ha();return t||(e.addTags({offlineFallback:!0}),t=$n.getOfflineLicense()),t}),"getLicense"),Dl=n(e=>zi(e),"getLicenseFromKey"),Nl=n(()=>Pl.env.SELF_HOSTED?Nt.SELF_FREE_LICENSE:Nt.CLOUD_FREE_LICENSE,"getFreeLicense");var ql={};H(ql,{activateLicenseKey:()=>iU,deleteLicenseKey:()=>uU,getLicenseKey:()=>lU});var Ul=Re(require("dd-trace"));async function iU(e){await Ji(e),await gt.save({licenseKey:e}),await Qr()}n(iU,"activateLicenseKey");async function lU(){return await Ul.default.trace("getLicenseKey",async e=>{let t=await gt.get();return e.addTags({licenseKey:t.licenseKey}),t.licenseKey})}n(lU,"getLicenseKey");async function uU(){return await Ul.default.trace("deleteLicenseKey",async()=>{await gt.save({licenseKey:void 0}),await Qr()})}n(uU,"deleteLicenseKey");var ss=require("@budibase/backend-core");var Wn,dU=n(async()=>{Wn=await ss.RedisClient.init(ss.redis.utils.Databases.LICENSES)},"init"),pU=n(async()=>{Wn&&await Wn.finish()},"shutdown");process.on("exit",async()=>{await pU()});var is=n(async()=>(Wn||await dU(),Wn),"getClient");var gy=require("@budibase/shared-core");var jl=xt.Duration.fromHours(1).toSeconds(),hy=xt.Duration.fromHours(1).toSeconds(),mU=jl+hy,Qr=n(async()=>{await by(),await vy()},"refresh"),my=n(async e=>{let{result:t}=await xt.locks.doWithLock({type:us.LockType.DEFAULT,name:us.LockName.SYNC_ACCOUNT_LICENSE,resource:e,ttl:xt.Duration.fromSeconds(10).toMs()},async()=>{let r=await is(),a=await r.get(e);if(a&&!yy(a))return a;let o=await ls.default.trace("populateLicense",async()=>await kl());return o||(o=ls.default.trace("populateFreeLicense",()=>Nl())),o.refreshedAt=new Date().toISOString(),await r.store(e,o,mU),o});return t},"populateAndStoreLicense"),yy=n(e=>{let t=e.refreshedAt?Date.parse(e.refreshedAt):0;return Date.now()-t>=jl*1e3},"shouldRefreshLicense"),Ll=n(async()=>await ls.default.trace("getCachedLicense",async e=>{let t=xt.context.getLicense();if(t)return e.addTags({foundInContext:!0,features:t.features,plan:t.plan,quotas:t.quotas}),t;let r=xt.tenancy.getTenantId(),o=await(await is()).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}),yy(o)&&my(r).catch(()=>{}),o):(o=await gy.helpers.retry(()=>my(r)),e.addTags({refreshedAt:o.refreshedAt,features:o.features,plan:o.plan,quotas:o.quotas,expirySeconds:jl,staleGraceSeconds:hy}),o)}),"_getCachedLicense");xt.env.isJest()&&(Ll=jest.fn().mockImplementation(Ll));var vy=Ll,by=n(async()=>{let e=xt.tenancy.getTenantId();await(await is()).delete(e)},"invalidate");async function je(e,t){Array.isArray(e)||(e=[e]),t||(t=await jt.getCachedLicense());for(let r of e)if(!t?.features.includes(r))return!1;return!0}n(je,"areFeaturesEnabled");async function cs(e,t){if(!await je(e,t))throw new mr.FeatureDisabledWarning(e)}n(cs,"checkFeature");async function Fl(e,t){if(!await je(e,t)){let r=e.join(", ");throw new mr.FeatureDisabledWarning(r)}}n(Fl,"checkFeatures");function ot(e){return async(...t)=>(await cs(De.Feature.WORKSPACE_BACKUPS),e(...t))}n(ot,"checkBackups");async function Bl(){return je(De.Feature.WORKSPACE_BACKUPS)}n(Bl,"isBackupsEnabled");async function Gl(){return je(De.Feature.BRANDING)}n(Gl,"isBrandingEnabled");async function gU(e){return je(De.Feature.MICROFRONTEND,e)}n(gU,"isMicrofrontendFeatureEnabled");async function wy(){return je(De.Feature.ENFORCEABLE_SSO)}n(wy,"isEnforceableSSO");async function hU(){return je(De.Feature.EMBED_AUTH)}n(hU,"isEmbedAuthEnabled");async function yU(){return je(De.Feature.SYNC_AUTOMATIONS)}n(yU,"isSyncAutomationsEnabled");async function vU(){return je(De.Feature.TRIGGER_AUTOMATION_RUN)}n(vU,"isTriggerAutomationRunEnabled");async function ds(){return je(De.Feature.AUDIT_LOGS)}n(ds,"isAuditLogsEnabled");async function $l(){return je(De.Feature.USER_GROUPS)}n($l,"isUserGroupsEnabled");function bU(){return je(De.Feature.PWA)}n(bU,"isPWAEnabled");function wU(){return je(De.Feature.RECAPTCHA)}n(wU,"isRecaptchaEnabled");var IU=n(()=>je(De.Feature.PKCE_OIDC),"isPkceOidcEnabled");async function TU(){return je(De.Feature.TRANSLATIONS)}n(TU,"isTranslationsEnabled");async function Ra(){return je(De.Feature.EXPANDED_PUBLIC_API)}n(Ra,"isExpandedPublicApiEnabled");async function SU(){return je(De.Feature.WORKSPACE_IMPORT_EXPORT)}n(SU,"isWorkspaceImportExportEnabled");async function ps(){return je([De.Feature.EXPANDED_PUBLIC_API,De.Feature.WORKSPACE_IMPORT_EXPORT])}n(ps,"isWorkspaceImportExportPublicApiEnabled");async function xU(e){if(mr.env.ENABLE_SSO_MAINTENANCE_MODE||!await wy())return!1;let r;return e?.config?r=e.config:r=await mr.configs.getSettingsConfig(),!!r.isSSOEnforced}n(xU,"isSSOEnforced");var Wl=n(async()=>{let e=De.Feature.SCIM,t=await je(e),r=await mr.configs.getSCIMConfig();if(!t||!r?.enabled)throw new mr.FeatureDisabledWarning(e);return!0},"checkSCIM");async function _U(){return je(De.Feature.VIEW_PERMISSIONS)}n(_U,"isViewPermissionEnabled");async function EU(){return je(De.Feature.VIEW_READONLY_COLUMNS)}n(EU,"isViewReadonlyColumnsEnabled");var AU={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 MU(e){return await Gl()?{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}:AU}n(MU,"getBrandingConfig");var ir={};H(ir,{addAction:()=>PU,addApp:()=>kU,addAutomation:()=>jU,addGroup:()=>Hl,addPlugin:()=>Ql,addRow:()=>NU,addRows:()=>qU,addUsers:()=>ys,bustCache:()=>Ni,decrement:()=>gr,decrementMany:()=>Vn,getCurrentUsageValues:()=>Wp,getLicensedQuota:()=>ms,getQuotaUsage:()=>Gr,increment:()=>_t,incrementBudibaseAICredits:()=>FU,incrementMany:()=>Yr,removeApp:()=>DU,removeGroup:()=>Kl,removePlugin:()=>zl,removeRow:()=>UU,removeRows:()=>LU,removeUsers:()=>ka,set:()=>Hn,setAllUsage:()=>qi,setAppUsageValue:()=>Ui,setBudibaseAICredits:()=>xy,setUsage:()=>Fp,setUsagePerApp:()=>Bp,throwIfBudibaseAICreditsExceeded:()=>GU,updatePluginCount:()=>Jl,updateUsage:()=>Ca,usageLimitIsExceeded:()=>Vl,utils:()=>tn});var gs=require("@budibase/types");var $t=require("@budibase/backend-core"),$e=require("@budibase/types"),Jr=require("dd-trace");var _t=n(async(e,t,r)=>await Jr.tracer.trace("quotas.increment",async a=>(a.addTags({name:e,type:t}),await Iy({change:1,name:e,type:t,opts:r}))),"increment"),Yr=n(e=>Jr.tracer.trace("quotas.incrementMany",async()=>Iy(e)),"incrementMany"),Iy=n(async e=>await Jr.tracer.trace("quotas.tryIncrement",async t=>{let r=Array.isArray(e)?e:[e];t.addTags({numActions:r.length}),await Ca(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 Jr.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 Ca(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"),gr=n((e,t,r={})=>Ca({usageChange:-1,name:e,type:t,opts:r}),"decrement"),Vn=n(e=>{let t=Array.isArray(e)?e:[e];return Ca(t.map(r=>({usageChange:-r.change,name:r.name,type:r.type,opts:r.opts})))},"decrementMany"),Hn=n(async(e,t,r)=>Dt.setUsage(r,e,t),"set"),RU=n((e,t,r)=>{if(e==$e.QuotaUsageType.STATIC){let a=r.usageQuota.triggers;return a?a[t]||{}:{}}else{let a=Dt.utils.getCurrentMonthString(),o=r.monthly[a].triggers;return o?o[t]||{}:{}}},"getExistingTriggers"),CU=n(async(e,t,r,a)=>{try{await $t.locks.doWithLock({type:$e.LockType.TRY_ONCE,name:$e.LockName.TRIGGER_QUOTA,resource:e,ttl:1e4},async()=>{let o={percentage:r,name:t.name};a&&(o.resetDate=a),await Cr.triggerQuota(o)})}catch(o){$t.logging.logAlert("Error triggering quota",o)}},"triggerQuota"),OU=n(async(e,t,r,a)=>{let o=await Gr(),s=e===$e.QuotaUsageType.MONTHLY?o.quotaReset:void 0,i=await RU(e,t,o),l=a.triggers,d=r/a.value*100;d>100&&(d=100);for(let[f,p]of l.entries())if(d>=p&&a.value!==fr.UNLIMITED){if(!i[p]){i[p]=new Date().toISOString();let h=l[f+1]||100;(!(d>=h)||d===p)&&await CU(t,a,d,s)}}else i[p]=void 0;return i},"checkTriggers"),Ca=n(async e=>{await Jr.tracer.trace("quotas.updateUsage",async t=>{let r=$t.tenancy.getTenantId(),a=Array.isArray(e)?e:[e];t.addTags({numActions:a.length,tenantId:r});let o,s,i=[],l={},d={},f={},p={};for(let h of a)await Jr.tracer.trace("quotas.updateUsage.action",async b=>{b.addTags({actionName:h.name,actionType:h.type,actionUsageChange:h.usageChange});try{o=$t.context.getWorkspaceId()}catch{}if($e.APP_QUOTA_NAMES.includes(h.name)&&!o)throw new Error("App context required for quota update");try{s=await ms($e.QuotaType.USAGE,h.name,h.type),i.push(s);let{total:S,app:k,breakdown:_}=await Dt.getCurrentUsageValues(h.type,h.name,h.opts?.id);S+=h.usageChange,k!=null&&(k+=h.usageChange),_!=null&&(_+=h.usageChange);let x={};if(h.opts?.dryRun||(x=await OU(h.type,h.name,S,s),p={...p,[h.name]:x}),s.value!==fr.UNLIMITED&&S>s.value&&h.usageChange>0)throw new $t.UsageLimitWarning(`${h.name}`);if(S=Math.max(0,S),k&&(k=Math.max(0,k)),_!=null&&(_=Math.max(0,_),f={...f,[h.name]:_}),!h.opts?.dryRun){let W=h.opts?.valueFn;W&&(S=await W(),k=S),l={...l,[h.name]:S},d={...d,[h.name]:k}}}catch(S){throw h.opts?.suppressErrorLog||console.warn(`Error updating usage quotas for ${h.name}`,S),S}});let m=a.filter(h=>!h.opts?.dryRun).map(h=>({name:h.name,type:h.type,values:{total:l[h.name],app:d[h.name],breakdown:f[h.name],triggers:p[h.name]},opts:{...h.opts,tenantId:r}}));m.length>0&&await Dt.setAllUsage(m)})},"updateUsage"),ms=n(async(e,t,r)=>{let a=await jt.getCachedLicense();if(!a){let o=$t.tenancy.getTenantId();throw new Error("License not found for tenant id "+o)}if(r&&(0,$e.isStaticQuota)(e,r,t))return a.quotas[e][r][t];if(r&&(0,$e.isMonthlyQuota)(e,r,t))return a.quotas[e][r][t];if((0,$e.isConstantQuota)(e,t))return a.quotas[e][t];throw new Error("Invalid quota type")},"getLicensedQuota"),Vl=n(async({name:e,type:t,usageChange:r})=>{try{return await Ca({usageChange:r,name:e,type:t,opts:{dryRun:!0}}),!1}catch(a){if(a.code===$e.APIWarningCode.USAGE_LIMIT_EXCEEDED)return!0;throw a}},"usageLimitIsExceeded");var PU=n(async(e,t)=>_t(gs.MonthlyQuotaName.ACTIONS,gs.QuotaUsageType.MONTHLY,{fn:t,id:e}),"addAction");var Ty=require("@budibase/backend-core"),Oa=require("@budibase/types");var Sy=n(async()=>{let e=await Ty.db.getAllWorkspaces({dev:!0});return e?e.length:0},"getDevAppsCount"),kU=n(async(e,{appId:t}={})=>_t(Oa.StaticQuotaName.WORKSPACES,Oa.QuotaUsageType.STATIC,{fn:e,valueFn:Sy,id:t}),"addApp"),DU=n(async({appId:e}={})=>gr(Oa.StaticQuotaName.WORKSPACES,Oa.QuotaUsageType.STATIC,{valueFn:Sy,id:e}),"removeApp");var or=require("@budibase/types");var NU=n(async(e,{tableId:t}={})=>_t(or.StaticQuotaName.ROWS,or.QuotaUsageType.STATIC,{fn:e,id:t}),"addRow"),UU=n(async({tableId:e}={})=>gr(or.StaticQuotaName.ROWS,or.QuotaUsageType.STATIC,{id:e}),"removeRow"),qU=n(async(e,t,{tableId:r}={})=>Yr({change:e,name:or.StaticQuotaName.ROWS,type:or.QuotaUsageType.STATIC,opts:{fn:t,id:r}}),"addRows"),LU=n(async(e,{tableId:t}={})=>Vn({change:e,name:or.StaticQuotaName.ROWS,type:or.QuotaUsageType.STATIC,opts:{id:t}}),"removeRows");var hs=require("@budibase/types");var jU=n(async(e,{automationId:t}={})=>_t(hs.MonthlyQuotaName.AUTOMATIONS,hs.QuotaUsageType.MONTHLY,{fn:e,id:t}),"addAutomation");var Pa=require("@budibase/types");var Hl=n(async e=>_t(Pa.StaticQuotaName.USER_GROUPS,Pa.QuotaUsageType.STATIC,{fn:e}),"addGroup"),Kl=n(async()=>gr(Pa.StaticQuotaName.USER_GROUPS,Pa.QuotaUsageType.STATIC),"removeGroup");var Dr=require("@budibase/types");var Ql=n(async e=>_t(Dr.StaticQuotaName.PLUGINS,Dr.QuotaUsageType.STATIC,{fn:e}),"addPlugin"),zl=n(async()=>gr(Dr.StaticQuotaName.PLUGINS,Dr.QuotaUsageType.STATIC),"removePlugin"),Jl=n(async e=>Hn(Dr.StaticQuotaName.PLUGINS,Dr.QuotaUsageType.STATIC,e),"updatePluginCount");var sr=require("@budibase/types"),Kn=require("@budibase/backend-core");var ys=n(async(e,t,r)=>{if(e===0&&t===0)return r?await r():void 0;let a=[{change:e,name:sr.StaticQuotaName.USERS,type:sr.QuotaUsageType.STATIC,opts:{fn:r,valueFn:Kn.users.getUserCount}}];t>0&&a.push({change:t,name:sr.StaticQuotaName.CREATORS,type:sr.QuotaUsageType.STATIC,opts:{valueFn:Kn.users.getCreatorCount}});let o=await Yr(a);return Promise.resolve(ha()).catch(s=>{console.log("Failed to sync license after adding users",s)}),o},"addUsers"),ka=n(async(e,t)=>{let r=[{change:e,name:sr.StaticQuotaName.USERS,type:sr.QuotaUsageType.STATIC,opts:{valueFn:Kn.users.getUserCount}}];t>0&&r.push({change:t,name:sr.StaticQuotaName.CREATORS,type:sr.QuotaUsageType.STATIC,opts:{valueFn:Kn.users.getCreatorCount}}),await Vn(r),Promise.resolve(ha()).catch(a=>{console.log("Failed to sync license after removing users",a)})},"removeUsers");var ht=require("@budibase/types");var Yl=require("@budibase/backend-core"),ws=require("@budibase/types");var vs=class extends Yl.HTTPError{static{n(this,"GroupNameUnavailableError")}constructor(t){super(`Group name "${t}" is unavailable`,409)}},bs=class extends Yl.HTTPError{static{n(this,"AICreditsExhaustedError")}constructor(){super("You have reached your Budibase AI Credits limit for this billing cycle.",402),this.code=ws.APIWarningCode.USAGE_LIMIT_EXCEEDED}getPublicError(){return{quota:ws.MonthlyQuotaName.BUDIBASE_AI_CREDITS}}};var FU=n(async e=>{try{return await Yr({change:e,name:ht.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:ht.QuotaUsageType.MONTHLY})}catch(t){throw t.code===ht.APIWarningCode.USAGE_LIMIT_EXCEEDED&&await BU().catch(()=>{}),t}},"incrementBudibaseAICredits"),BU=n(async()=>{let e=await ms(ht.QuotaType.USAGE,ht.MonthlyQuotaName.BUDIBASE_AI_CREDITS,ht.QuotaUsageType.MONTHLY);e.value>=0&&await xy(e.value)},"capBudibaseAICreditsAtLimit"),GU=n(async()=>{if(await Vl({name:ht.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:ht.QuotaUsageType.MONTHLY,usageChange:1}))throw new bs},"throwIfBudibaseAICreditsExceeded"),xy=n(async e=>Hn(ht.MonthlyQuotaName.BUDIBASE_AI_CREDITS,ht.QuotaUsageType.MONTHLY,e),"setBudibaseAICredits");var Is={};H(Is,{db:()=>Vt});var eu=require("@budibase/backend-core");var Wt={};H(Wt,{addUsers:()=>zU,adjustGroupCreatorsQuotas:()=>XU,cleanupApp:()=>ZU,enrichUserRolesFromGroups:()=>WU,fetch:()=>Xl,get:()=>Cy,getBulk:()=>Oy,getDefaultGroup:()=>VU,getGroupBuilderAppIds:()=>Ry,getGroupRoleId:()=>$U,remove:()=>QU,removeUsers:()=>JU,save:()=>Py,updateGroupApps:()=>YU});var ee=require("@budibase/backend-core");async function Zl(e,t){try{let r=[];for(let l of e)if(l.roles){let d=l.roles[ee.db.getProdWorkspaceID(t)];d&&r.push(d)}let a=await Promise.all(r.map(async l=>({[l]:await ee.roles.roleToNumber(l)}))),o,s,i={};a.forEach(l=>{let[d,f]=Object.entries(l)[0];i[d]={roleId:d,roleNum:f}});for(let{roleId:l,roleNum:d}of Object.values(i))(s===void 0||d>s)&&(s=d,o=l);return o}catch(r){throw ee.logging.logAlert(`Error finding higest role for ${e.length} on app ${t}`,r),r}}n(Zl,"findHighestRole");async function My(e,t){return t?t=t.filter(r=>e.includes(r._id)):t=await ue.getBulk(e,{enriched:!1}),t}n(My,"groupList");async function Ry(e,t){if(!e.userGroups)return[];let r=await My(e.userGroups,t?.groups),a=t?.appId?ee.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(Ry,"getGroupBuilderAppIds");async function $U(e,t,r){if(!e.userGroups)return null;let a=await My(e.userGroups,r?.groups),o=ee.db.getProdWorkspaceID(t);return e.roles?.[o]?e.roles[o]:(a=a.filter(l=>l?.roles?Object.keys(l.roles).includes(o):!1),ee.context.getCurrentContext()?.appId===t?Zl(a,t):await ee.context.doInWorkspaceContext(t,async()=>Zl(a,t)))}n($U,"getGroupRoleId");async function WU(e){if(!e||!e.userGroups)return e;let t=await Oy(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 ee.context.doInWorkspaceContext(o,async()=>{if(e.roles[o])return;let s=await Zl(t,o);s&&(e.roles[o]=s)});let a=await Ry(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(WU,"enrichUserRolesFromGroups");async function Xl(){return await ue.fetch()}n(Xl,"fetch");async function Cy(e){return await ue.get(e)}n(Cy,"get");async function VU(){return(await ue.getAll()).find(t=>t.isDefault)}n(VU,"getDefaultGroup");async function Oy(e,t={enriched:!0}){return ue.getBulk(e,t)}n(Oy,"getBulk");async function _y(e){if(await ue.getByName(e))throw new vs(e)}n(_y,"guardNameAvailability");async function Ey(e){let t=await ue.getGroupUsers(e._id);if(!t.length)return 0;let a=await ee.tenancy.getGlobalDB().getMultiple(t.map(s=>s._id));return(await ee.userUtils.creatorsInList(a)).filter(s=>s).length}n(Ey,"getCreatorsCountInGroup");function Ay(e){return Object.values(e.roles||{}).includes("CREATOR")}n(Ay,"isCreatorGroup");function HU(e){let{users:t,...r}=e;return r}n(HU,"stripEnrichedFields");async function KU(e){if(!e.isDefault)return ue.save(e);let r=(await ue.getAll()).filter(i=>i._id!==e._id).filter(i=>i.isDefault);if(!r.length)return ue.save(e);let o=(await ue.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 ue.get(e._id);return{id:s._id,rev:s._rev}}n(KU,"saveGroupWithDefaultUpdates");async function Py(e){let t=[],r=!e._id,a=0;if(!e._id)e._id=ue.generateUserGroupID(),await _y(e.name),t.push(ee.events.group.created(e));else{let i=await ue.get(e._id);if(i.name!==e.name&&await _y(e.name),t.push(ee.events.group.updated(e)),JSON.stringify(i.roles)!==JSON.stringify(e.roles)){let l=Ay(i),d=Ay(e);if(l!==d){let f=i.users?.length||0,p=0;f>0&&(p=await Ey(i)),d?a=f-p:a=-f}t.push(ee.events.group.permissionsEdited(e))}}await Promise.all(t);let o=HU(e),s=n(()=>KU(o),"saveGroup");if(r)return await Hl(s);{let i=await s();if(a>0)await ys(0,a);else if(a<0){let l=await Ey(e),d=Math.abs(a)-l;d>0&&await ka(0,d)}return i}}n(Py,"save");async function QU(e,t){let r;try{r=await ue.get(e)}catch{throw new Error("Group not found")}let a=Object.values(r.roles||{}).includes("CREATOR"),o=n(()=>{},"recalculateCreatorsQuotasFn");if(a){let i=ee.tenancy.getGlobalDB(),l=await ue.getGroupUsers(e),f=(await Promise.all(l.map(b=>i.get(b._id)))).map(b=>({...b,userGroups:b.userGroups.filter(T=>T!==e)})),m=(await ee.userUtils.creatorsInList(f)).filter(b=>b).length,h=l.length-m;h&&(o=n(()=>ka(0,h),"recalculateCreatorsQuotasFn"))}let s=await ue.destroy(e,t);return await ee.events.group.deleted(r),await Kl(),await o(),s}n(QU,"remove");async function zU(e,t){let r=await ue.get(e),a=await ee.users.bulkGetGlobalUsersById(t),o=[];for(let d of a)d.userGroups||(d.userGroups=[]),d.userGroups.includes(e)||o.push(d);if(!o.length)return o;let s=o.map(d=>({...d,userGroups:[...d?.userGroups||[],e]}));if(await ee.users.bulkUpdateGlobalUsers(s),Object.values(r.roles||{}).includes("CREATOR")){let f=(await ee.userUtils.creatorsInList(o)).filter(m=>m).length,p=o.length-f;p&&await ys(0,p)}let l=[];for(let d of t)l.push(ee.cache.user.invalidateUser(d));return await Promise.all(l),await ee.events.group.usersAdded(s.length,r,t),s}n(zU,"addUsers");async function JU(e,t){let r=await ue.get(e),a=await ee.users.bulkGetGlobalUsersById(t),o=[];for(let l of a){if(!l.userGroups||!l.userGroups.includes(e))continue;let d=l.userGroups.indexOf(e);l.userGroups.splice(d,1),o.push(l)}if(await ee.users.bulkUpdateGlobalUsers(o),Object.values(r.roles||{}).includes("CREATOR")){let d=(await ee.userUtils.creatorsInList(o)).filter(p=>p).length,f=o.length-d;f&&await ka(0,f)}let i=[];for(let l of t)i.push(ee.cache.user.invalidateUser(l));return await Promise.all(i),o.length&&await ee.events.group.usersDeleted(o.length,r,t),o}n(JU,"removeUsers");async function YU(e,t){let r=await Cy(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 Py(r)}n(YU,"updateGroupApps");async function ZU(e){let t=await Xl(),r=[];for(let a of t)!a.roles||!a.roles[e]||(delete a.roles[e],r.push(a));return await ue.bulkSave(r)}n(ZU,"cleanupApp");async function XU(){if(!await $l()){let e=ee.tenancy.getGlobalDB(),r=(await Xl()||[]).filter(a=>Object.values(a?.roles||{}).includes("CREATOR"));for(let a of r){let o=await ue.getGroupUsers(a._id),i=(await Promise.all(o.map(p=>e.get(p._id)))).map(p=>({...p,userGroups:p.userGroups.filter(m=>m!==a._id)})),d=(await ee.userUtils.creatorsInList(i)).filter(p=>p).length,f=o.length-d;await ue.save({...a,roles:{}}),f&&await ka(0,f)}}}n(XU,"adjustGroupCreatorsQuotas");eu.users.UserDB.init(ir,Wt,Gt);var Vt=eu.users.UserDB;var Es={};H(Es,{logs:()=>lu});var lu={};H(lu,{logSearch:()=>lq,oldestLogDate:()=>jy,storeLog:()=>uq});var _s=require("@budibase/backend-core"),xs=require("@budibase/types");var ze=require("@budibase/backend-core"),Ss=require("@budibase/types");var ky=require("@budibase/backend-core");async function Dy(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||ky.logging.logWarn(`Failed to backoff: ${t}`,r),s}n(Dy,"backOff");var{SEPARATOR:hr,UNICODE_MAX:eq,DocumentType:Ny,AutomationViewMode:tu,ViewName:tq,getQueryIndex:rq}=ze.db,aq=new Date(0).toISOString(),nq=100,Ts=10,ru=n(async()=>Uo(Ss.ConstantQuotaName.AUTOMATION_LOG_RETENTION_DAYS),"oldestLogDate");function Uy(e,t,{status:r,automationId:a}={},o={}){let s=a?`${a}${hr}`:"",i=r?`${r}${hr}`:"",l;return r&&a?l=`${tu.ALL}${hr}${i}${s}`:r?l=`${tu.STATUS}${hr}${i}`:a?l=`${tu.AUTOMATION}${hr}${s}`:l=`${Ny.AUTOMATION_LOG}${hr}`,{...o,descending:!0,startkey:`${l}${t}${eq}`,endkey:`${l}${e}`}}n(Uy,"getAutomationLogParams");function oq(e,t,r){return`${Ny.AUTOMATION_LOG}${hr}${e}${hr}${r}${hr}${t}`}n(oq,"generateAutomationLogID");async function au(e,t,r={docs:!0}){let a=ze.context.getProdWorkspaceDB();await a.exists()||(a=ze.context.getDevWorkspaceDB());let o={status:r.status},s=r?.limit?r.limit:r?.paginate?Ts+1:void 0,i=Uy(e,t,o,{include_docs:r.docs,limit:s});r?.page&&(i.startkey=r.page);let l=await a.allDocs(i),d=In(l,{paginate:r?.paginate,pageSize:Ts});return{...d,totalLogs:d.totalRows}}n(au,"getAllLogs");async function nu(e,t,r={}){let a=ze.context.getProdWorkspaceDB();await a.exists()||(a=ze.context.getDevWorkspaceDB());let o;try{let i={automationId:r?.automationId,status:r?.status},l=Uy(e,t,i,{include_docs:!0,limit:Ts+1});r?.page&&(l.startkey=r.page),o=await a.query(rq(tq.AUTOMATION_LOGS),l)}catch(i){if(i!=null&&(i.name==="not_found"||i.error==="not_found"))return await rf(),nu(e,t,r);throw i}let s=In(o,{paginate:!0,pageSize:Ts});return{...s,totalLogs:s.totalRows/3}}n(nu,"getLogsByView");async function qy(e,t){let r=ze.context.getProdWorkspaceDB(),a=e._id,o=e.name,s=new Date().toISOString(),i=oq(s,t.status,a),l={...t,automationId:a,status:t.status,automationName:o,createdAt:s,_id:i};return await r.put(l),i}n(qy,"writeLog");async function ou(e,{clearing:t}={clearing:!1}){await Ly({logIds:e,clearing:t,metadataKey:"automationErrors",failureMessage:"Failed to update app metadata with automation log error"})}n(ou,"updateAppMetadataWithErrors");async function su(e,{clearing:t}={clearing:!1}){await Ly({logIds:e,clearing:t,metadataKey:"automationStops",failureMessage:"Failed to update app metadata with automation log stop"})}n(su,"updateAppMetadataWithStops");async function Ly({logIds:e,clearing:t,metadataKey:r,failureMessage:a}){let o=ze.context.getProdWorkspaceDB();await Dy(async()=>{let s=await o.get(ze.db.DocumentType.WORKSPACE_METADATA);for(let i of e){let l=i.split(ze.db.SEPARATOR),d=`${l[l.length-3]}${ze.db.SEPARATOR}${l[l.length-2]}`,f={};if(s[r]&&(f=s[r]),t&&!Array.isArray(f[d]))continue;f[d]||=[];let p=f[d].indexOf(i);if(t){if(p===-1)continue;f[d].splice(p,1)}else f[d].push(i);f[d].length===0&&delete f[d],s[r]=f}await o.put(s),await ze.cache.workspace.invalidateWorkspaceMetadata(s.appId,s)},a)}n(Ly,"updateAppMetadataWithLogIds");async function sq(){let e=await ru();try{return await au(aq,e,{docs:!1,paginate:!1,limit:nq})}catch{return{data:[],hasNextPage:!1,totalLogs:0}}}n(sq,"getExpiredLogs");async function iu(){let e=ze.context.getProdWorkspaceDB();try{let t=await sq();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(ze.db.SEPARATOR);return i[i.length-1]===Ss.AutomationStatus.ERROR});await e.bulkDocs(r),o.length&&await ou(o,{clearing:!0}),a.length&&await su(a,{clearing:!0})}catch(t){ze.logging.logAlert(`Failed to cleanup automation log history - Database "${e.name}"`,t)}}n(iu,"clearOldHistory");var jy=ru;async function iq(e,t,r,a){let o,s=new Date().toISOString(),i=await jy();return(!e||e<i)&&(e=i),r||t?o=await nu(e,s,{automationId:r,status:t,page:a}):o=await au(e,s,{status:t,page:a,docs:!0,paginate:!0}),o}n(iq,"getLogs");async function lq(e){return await iu(),await iq(e.startDate,e.status,e.automationId,e.page)}n(lq,"logSearch");async function uq(e,t){if(!_s.db.isProdWorkspaceID(_s.context.getWorkspaceId()))return;let r=await qy(e,t);t.status===xs.AutomationStatus.ERROR&&await ou([r]),t.status===xs.AutomationStatus.STOPPED&&t.steps.some(a=>a.inputs?.notify===!0&&a.outputs.status===xs.AutomationStatus.STOPPED)&&await su([r]),await iu()}n(uq,"storeLog");var As={};H(As,{checkPluginQuotas:()=>pq,deletePlugin:()=>dq,storePlugin:()=>cq});var $y=require("@budibase/types"),We=require("@budibase/backend-core"),Wy=Re(require("module")),Vy=Re(require("isolated-vm"));var Fy=Re(require("fs")),By=require("path");function Gy(e,t){return Fy.default.readFileSync((0,By.join)(e,t),"utf8")}n(Gy,"loadJSFile");async function cq(e,t,r,a){let o=We.tenancy.getGlobalDB(),s=e.package.version,i=e.package.name,l=e.package.description,d=e.schema.hash,f=We.objectStore.getPluginS3Dir(i),p=await We.objectStore.uploadDirectory(We.objectStore.ObjectStoreBuckets.PLUGINS,t,f),m=p.find(x=>x.name.endsWith(".js")),h=p.find(x=>x.name.endsWith(".svg"));if(!m)throw new Error("Plugin missing .js file.");if(e.schema.type===$y.PluginType.DATASOURCE){let x=Gy(t,m.name),W=new Vy.default.Isolate({memoryLimit:8});try{W.compileScriptSync(Wy.default.wrap(x),{filename:m.name})}catch(V){let M=V?.message?V.message:JSON.stringify(V);throw new Error(`JS invalid: ${M}`)}finally{W.dispose()}}let b=h?h.name:null,T=We.db.generatePluginID(i),S;try{S=(await o.get(T))._rev}catch{S=void 0}let k={_id:T,_rev:S,...e,name:i,version:s,hash:d,description:l,source:r};b&&(k.iconFileName=b),r&&(k={...k,source:r}),a&&a.source==="github"&&(k.origin=a);let _=n(async()=>{let x=await o.put(k);return await We.events.plugin.imported(k),{...k,_rev:x.rev}},"write");return S?await _():await Ql(_)}n(cq,"storePlugin");async function dq(e){let t=We.tenancy.getGlobalDB();try{let r=await t.get(e),a=We.objectStore.getPluginS3Dir(r.name);await We.objectStore.deleteFolder(We.objectStore.ObjectStoreBuckets.PLUGINS,a),await t.remove(e,r._rev),await We.events.plugin.deleted(r),await zl()}catch(r){let a=r?.message?r?.message:r;throw new Error(`Failed to delete plugin: ${a}`)}}n(dq,"deletePlugin");async function pq(){let e=We.tenancy.getGlobalDB();try{let r=(await e.allDocs(We.db.getPluginParams())).rows.length;console.log(`Syncing plugin count: ${r}`),await Jl(r)}catch(t){We.logging.logAlert("Unable to retrieve plugins for quota check",t)}}n(pq,"checkPluginQuotas");var Ms={};H(Ms,{fetch:()=>mq,fetchValues:()=>gq,isEncryptionKeyAvailable:()=>fq,isValid:()=>Qy,remove:()=>yq,update:()=>hq});var Hy=require("@budibase/backend-core"),Qn=require("@budibase/types");function fq(){return!!Hy.env.ENCRYPTION_KEY}n(fq,"isEncryptionKeyAvailable");async function mq(){let e=await Mr.get();return Object.keys(e.variables)}n(mq,"fetch");async function gq(e){let r=(await Mr.get()).variables,a={};for(let[o,s]of Object.entries(r))switch(e){case Qn.Environment.DEVELOPMENT:a[o]=s.development;break;case Qn.Environment.PRODUCTION:default:a[o]=s.production;break}return a}n(gq,"fetchValues");async function Ky(e){if(!(await ar.cache.getCachedLicense()).features.includes(Qn.Feature.ENVIRONMENT_VARIABLES))throw new Error("User does not have access to environment variables feature.");let r=await Mr.get();r.variables=e(r.variables),await Mr.update(r)}n(Ky,"changeValues");async function hq(e,t){if(Qy(e))await Ky(a=>(a[e]=t,a));else throw new Error("Variable name has characters that are not allowed")}n(hq,"update");async function yq(e){await Ky(t=>(delete t[e],t))}n(yq,"remove");function Qy(e){return/^[a-zA-Z0-9-_]+$/.test(e)}n(Qy,"isValid");var Os={};H(Os,{definitions:()=>Mq,download:()=>Aq,fetch:()=>Eq,write:()=>xq});var yt=require("@budibase/backend-core"),Cs=require("@budibase/types");var Fe=require("@budibase/backend-core"),Ht=require("@budibase/types");var zy=require("memorystream"),Jy=new Fe.sql.Sql(Ht.SqlClient.SQL_LITE);async function vq(e,t,r){let a={operation:Ht.Operation.READ,table:ma.searchTable(),tables:{},paginate:{limit:r||9,offset:(t-1)*9},filters:e,resource:{fields:[]},sort:{timestamp:{direction:Ht.SortOrder.DESCENDING,type:Ht.SortType.STRING}}},o=Jy._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(vq,"getAuditLogSqlQuery");function bq(e){return`${Fe.DocumentType.AUDIT_LOG}${Fe.SEPARATOR}${e}${Fe.SEPARATOR}${Fe.utils.newid()}`}n(bq,"generateAuditLogID");async function Yy(e){e._id||(e._id=bq(e.timestamp)),e.type||(e.type=Ht.AUDIT_LOG_TYPE);try{let r=await Fe.context.getAuditLogsDB().put(e);return{...e,_rev:r.rev}}catch(t){Fe.logging.logAlert("Failed to write audit log",t)}}n(Yy,"save");async function uu(e,t,r){t||(t=1);let a=Fe.context.getAuditLogsDB();try{let o=10,s=await vq(e,t,o),i=ma.searchTable(),l=Jy.convertJsonStringColumns(i,await a.sql(s.sql,s.bindings)),d;l.length>9&&(d=l.pop());let f={rows:l,hasNextPage:!!d};return f.hasNextPage&&(f.bookmark=t+1),f}catch(o){if(o.status===404&&!r?.isRetry)return await wq(),await Vp(),await uu(e,t,{isRetry:!0});throw o}}n(uu,"searchSQL");async function wq(){let e=Fe.context.getAuditLogsDB(),r=(await e.allDocs(Fe.db.getDocParams(Fe.DocumentType.AUDIT_LOG,null,{include_docs:!0}))).rows.map(a=>a.doc).filter(a=>a&&!a.type).map(a=>({...a,type:Ht.AUDIT_LOG_TYPE}));await e.bulkDocs(r)}n(wq,"migrate");function Zy(e){let t=Fe.context.getAuditLogsDB(),r=new zy,a=t.dump(r,{filter:n(s=>{let i=s;if(!i._id?.startsWith(Fe.DocumentType.AUDIT_LOG))return!1;let l=!0,d=n((f,p)=>{!f||f.length===0||(l=!!(l&&p&&f.includes(p)))},"matcher");if(d(e.userIds,i.userId),d(e.appIds,i.appId),d(e.events,i.event),(e.startDate||e.endDate)&&(l=l&&i.timestamp>=e.startDate&&i.timestamp<=e.endDate),e.fullSearch){let f=JSON.stringify(s);l=l&&f.includes(e.fullSearch)}return l},"filter")}),o=new zy;return r.on("data",s=>{let i=JSON.parse(Buffer.from(s).toString());if(Array.isArray(i.docs)){let l="";for(let d of i.docs)l+=JSON.stringify(d)+`
|
|
47
|
+
`;function Tn(e){return Yi.default.verify(e,hR,{algorithms:["RS256"]})}n(Tn,"verifyLicenseToken");function yR(e,t){return Yi.default.sign(t,e,{encoding:"utf-8",algorithm:"RS256"})}n(yR,"sign");var Bo={};H(Bo,{getOfflineFeatures:()=>Zi});var w=require("@budibase/types");var hf=[w.Feature.BUDIBASE_AI,w.Feature.SYNC_AUTOMATIONS],yf=[w.Feature.WORKSPACE_BACKUPS,w.Feature.BRANDING,w.Feature.SYNC_AUTOMATIONS,w.Feature.VIEW_PERMISSIONS,w.Feature.TRIGGER_AUTOMATION_RUN,w.Feature.VIEW_READONLY_COLUMNS,w.Feature.AI_CUSTOM_CONFIGS,w.Feature.PDF,w.Feature.BUDIBASE_AI],vf=[w.Feature.USER_GROUPS,w.Feature.WORKSPACE_BACKUPS,w.Feature.BRANDING,w.Feature.ENFORCEABLE_SSO,w.Feature.ENVIRONMENT_VARIABLES,w.Feature.SYNC_AUTOMATIONS,w.Feature.TRIGGER_AUTOMATION_RUN,w.Feature.VIEW_PERMISSIONS,w.Feature.VIEW_READONLY_COLUMNS,w.Feature.AI_CUSTOM_CONFIGS,w.Feature.CUSTOM_APP_SCRIPTS,w.Feature.PWA,w.Feature.PDF,w.Feature.BUDIBASE_AI,w.Feature.RECAPTCHA,w.Feature.PKCE_OIDC,w.Feature.TRANSLATIONS],vR={[w.PlanType.FREE]:[...Nt.SELF_FREE_LICENSE.features],[w.PlanType.PREMIUM]:[w.Feature.WORKSPACE_BACKUPS,w.Feature.BRANDING,w.Feature.VIEW_PERMISSIONS,w.Feature.PDF],[w.PlanType.PREMIUM_PLUS]:yf,[w.PlanType.PREMIUM_MAX]:yf,[w.PlanType.PREMIUM_PLUS_TRIAL]:[w.Feature.WORKSPACE_BACKUPS,w.Feature.BRANDING,w.Feature.SYNC_AUTOMATIONS,w.Feature.VIEW_PERMISSIONS,w.Feature.TRIGGER_AUTOMATION_RUN,w.Feature.VIEW_READONLY_COLUMNS,w.Feature.AI_CUSTOM_CONFIGS,w.Feature.PDF,w.Feature.BUDIBASE_AI],[w.PlanType.PRO]:hf,[w.PlanType.PRO_MAX]:hf,[w.PlanType.TEAM]:[w.Feature.USER_GROUPS,w.Feature.WORKSPACE_BACKUPS],[w.PlanType.BUSINESS]:vf,[w.PlanType.BUSINESS_PLUS]:vf,[w.PlanType.ENTERPRISE_BASIC]:[w.Feature.USER_GROUPS,w.Feature.WORKSPACE_BACKUPS,w.Feature.ENVIRONMENT_VARIABLES,w.Feature.ENFORCEABLE_SSO,w.Feature.EMBED_AUTH,w.Feature.AUDIT_LOGS,w.Feature.BRANDING,w.Feature.SYNC_AUTOMATIONS,w.Feature.OFFLINE,w.Feature.EXPANDED_PUBLIC_API,w.Feature.WORKSPACE_IMPORT_EXPORT,w.Feature.VIEW_PERMISSIONS,w.Feature.TRIGGER_AUTOMATION_RUN,w.Feature.SCIM,w.Feature.VIEW_READONLY_COLUMNS,w.Feature.AI_CUSTOM_CONFIGS,w.Feature.PWA,w.Feature.CUSTOM_APP_SCRIPTS,w.Feature.PDF,w.Feature.BUDIBASE_AI,w.Feature.RECAPTCHA,w.Feature.PKCE_OIDC,w.Feature.TRANSLATIONS,w.Feature.MICROFRONTEND],[w.PlanType.ENTERPRISE_BASIC_TRIAL]:[w.Feature.USER_GROUPS,w.Feature.WORKSPACE_BACKUPS,w.Feature.ENVIRONMENT_VARIABLES,w.Feature.ENFORCEABLE_SSO,w.Feature.EMBED_AUTH,w.Feature.BRANDING,w.Feature.SYNC_AUTOMATIONS,w.Feature.EXPANDED_PUBLIC_API,w.Feature.WORKSPACE_IMPORT_EXPORT,w.Feature.VIEW_PERMISSIONS,w.Feature.TRIGGER_AUTOMATION_RUN,w.Feature.SCIM,w.Feature.VIEW_READONLY_COLUMNS,w.Feature.AI_CUSTOM_CONFIGS,w.Feature.PWA,w.Feature.CUSTOM_APP_SCRIPTS,w.Feature.PDF,w.Feature.BUDIBASE_AI,w.Feature.RECAPTCHA,w.Feature.PKCE_OIDC,w.Feature.TRANSLATIONS,w.Feature.MICROFRONTEND],[w.PlanType.ENTERPRISE]:[w.Feature.USER_GROUPS,w.Feature.WORKSPACE_BACKUPS,w.Feature.ENVIRONMENT_VARIABLES,w.Feature.ENFORCEABLE_SSO,w.Feature.EMBED_AUTH,w.Feature.AUDIT_LOGS,w.Feature.BRANDING,w.Feature.SYNC_AUTOMATIONS,w.Feature.OFFLINE,w.Feature.EXPANDED_PUBLIC_API,w.Feature.WORKSPACE_IMPORT_EXPORT,w.Feature.VIEW_PERMISSIONS,w.Feature.TRIGGER_AUTOMATION_RUN,w.Feature.SCIM,w.Feature.VIEW_READONLY_COLUMNS,w.Feature.AI_CUSTOM_CONFIGS,w.Feature.PWA,w.Feature.CUSTOM_APP_SCRIPTS,w.Feature.PDF,w.Feature.BUDIBASE_AI,w.Feature.RECAPTCHA,w.Feature.PKCE_OIDC,w.Feature.TRANSLATIONS,w.Feature.MICROFRONTEND]};function Zi(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(vR)}n(Zi,"getOfflineFeatures");var Go={};H(Go,{UNLIMITED:()=>v,getQuotas:()=>Xi});var ce=require("@budibase/types");var g=fr,bf=Nt,v=-1,Ut=n(e=>e*1e6,"millions"),bR={[ce.PlanType.FREE]:{...bf.CLOUD_FREE_LICENSE.quotas},[ce.PlanType.PREMIUM]:{usage:{monthly:{...g.queries(v),...g.automations(1e3),...g.budibaseAICredits(0),...g.actions(5e3)},static:{...g.rows(1e4),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(0),...g.plugins(v),...g.customAIConfigurations(0)}},constant:{...g.agentLogRetentionDays(7),...g.automationLogRetentionDays(7),...g.appBackupRetentionDays(7)}},[ce.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(10)),...g.actions(2e4)},static:{...g.rows(25e4),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(0),...g.plugins(v),...g.customAIConfigurations(0)}},constant:{...g.agentLogRetentionDays(7),...g.automationLogRetentionDays(7),...g.appBackupRetentionDays(7)}},[ce.PlanType.PREMIUM_MAX]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(10)),...g.actions(5e4)},static:{...g.rows(25e4),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(0),...g.plugins(v),...g.customAIConfigurations(0)}},constant:{...g.agentLogRetentionDays(7),...g.automationLogRetentionDays(7),...g.appBackupRetentionDays(7)}},[ce.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(75e4),...g.actions(2e4)},static:{...g.rows(25e4),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(0),...g.plugins(v),...g.customAIConfigurations(0)}},constant:{...g.agentLogRetentionDays(7),...g.automationLogRetentionDays(7),...g.appBackupRetentionDays(7)}},[ce.PlanType.PRO]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(2)),...g.actions(5e3)},static:{...g.rows(5e4),...g.apps(v),...g.users(v),...g.creators(1),...g.userGroups(0),...g.plugins(v),...g.customAIConfigurations(0)}},constant:{...g.agentLogRetentionDays(1),...g.automationLogRetentionDays(1),...g.appBackupRetentionDays(0)}},[ce.PlanType.PRO_MAX]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(2)),...g.actions(1e4)},static:{...g.rows(5e4),...g.apps(v),...g.users(v),...g.creators(1),...g.userGroups(0),...g.plugins(v),...g.customAIConfigurations(0)}},constant:{...g.agentLogRetentionDays(1),...g.automationLogRetentionDays(1),...g.appBackupRetentionDays(0)}},[ce.PlanType.TEAM]:{usage:{monthly:{...g.queries(v),...g.automations(1e4),...g.budibaseAICredits(0),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(10),...g.plugins(v),...g.customAIConfigurations(0)}},constant:{...g.agentLogRetentionDays(30),...g.automationLogRetentionDays(30),...g.appBackupRetentionDays(90)}},[ce.PlanType.BUSINESS]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(50)),...g.actions(25e4)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(v),...g.plugins(v),...g.customAIConfigurations(v)}},constant:{...g.agentLogRetentionDays(30),...g.automationLogRetentionDays(30),...g.appBackupRetentionDays(v)}},[ce.PlanType.BUSINESS_PLUS]:void 0,[ce.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(50)),...g.actions(25e4)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(v),...g.plugins(v),...g.customAIConfigurations(v)}},constant:{...g.agentLogRetentionDays(v),...g.automationLogRetentionDays(v),...g.appBackupRetentionDays(v)}},[ce.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(75e4),...g.actions(25e4)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(1),...g.userGroups(v),...g.plugins(v),...g.customAIConfigurations(v)}},constant:{...g.agentLogRetentionDays(15),...g.automationLogRetentionDays(15),...g.appBackupRetentionDays(15)}},[ce.PlanType.ENTERPRISE]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(50)),...g.actions(25e4)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(v),...g.plugins(v),...g.customAIConfigurations(v)}},constant:{...g.agentLogRetentionDays(v),...g.automationLogRetentionDays(v),...g.appBackupRetentionDays(v)}}},wR={[ce.PlanType.FREE]:{...bf.SELF_FREE_LICENSE.quotas},[ce.PlanType.PREMIUM]:void 0,[ce.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(2)),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(0),...g.plugins(v),...g.customAIConfigurations(1)}},constant:{...g.agentLogRetentionDays(30),...g.automationLogRetentionDays(30),...g.appBackupRetentionDays(30)}},[ce.PlanType.PREMIUM_MAX]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(2)),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(0),...g.plugins(v),...g.customAIConfigurations(1)}},constant:{...g.agentLogRetentionDays(30),...g.automationLogRetentionDays(30),...g.appBackupRetentionDays(30)}},[ce.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(0),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(0),...g.plugins(v),...g.customAIConfigurations(1)}},constant:{...g.agentLogRetentionDays(30),...g.automationLogRetentionDays(30),...g.appBackupRetentionDays(30)}},[ce.PlanType.PRO]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(0),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(5),...g.plugins(v),...g.customAIConfigurations(0)}},constant:{...g.agentLogRetentionDays(7),...g.automationLogRetentionDays(7),...g.appBackupRetentionDays(7)}},[ce.PlanType.PRO_MAX]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(0),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(5),...g.plugins(v),...g.customAIConfigurations(0)}},constant:{...g.agentLogRetentionDays(7),...g.automationLogRetentionDays(7),...g.appBackupRetentionDays(7)}},[ce.PlanType.TEAM]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(0),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(10),...g.plugins(v),...g.customAIConfigurations(0)}},constant:{...g.agentLogRetentionDays(30),...g.automationLogRetentionDays(30),...g.appBackupRetentionDays(90)}},[ce.PlanType.BUSINESS]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(0),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(50),...g.plugins(v),...g.customAIConfigurations(0)}},constant:{...g.agentLogRetentionDays(v),...g.automationLogRetentionDays(v),...g.appBackupRetentionDays(v)}},[ce.PlanType.BUSINESS_PLUS]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(50)),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(v),...g.plugins(v),...g.customAIConfigurations(v)}},constant:{...g.agentLogRetentionDays(30),...g.automationLogRetentionDays(30),...g.appBackupRetentionDays(v)}},[ce.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(50)),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(v),...g.plugins(v),...g.customAIConfigurations(v)}},constant:{...g.agentLogRetentionDays(v),...g.automationLogRetentionDays(v),...g.appBackupRetentionDays(v)}},[ce.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(75e4),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(v),...g.plugins(v),...g.customAIConfigurations(v)}},constant:{...g.agentLogRetentionDays(15),...g.automationLogRetentionDays(15),...g.appBackupRetentionDays(15)}},[ce.PlanType.ENTERPRISE]:{usage:{monthly:{...g.queries(v),...g.automations(v),...g.budibaseAICredits(Ut(50)),...g.actions(v)},static:{...g.rows(v),...g.apps(v),...g.users(v),...g.creators(v),...g.userGroups(v),...g.plugins(v),...g.customAIConfigurations(v)}},constant:{...g.agentLogRetentionDays(v),...g.automationLogRetentionDays(v),...g.appBackupRetentionDays(v)}}};function Xi(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 ce.Hosting.SELF:r=a(wR);break;case ce.Hosting.CLOUD:r=a(bR);break}return JSON.parse(JSON.stringify(r))}n(Xi,"getQuotas");var $o={};H($o,{encoding:()=>ya,workspaceExists:()=>IR});var wf=require("@budibase/backend-core");async function IR(e){return(await wf.db.getAllWorkspaces({all:!0,idsOnly:!0})).includes(e)}n(IR,"workspaceExists");var ya={};H(ya,{base64ToObject:()=>SR,objectToBase64:()=>TR});function TR(e){let t=JSON.stringify(e);return Buffer.from(t).toString("base64")}n(TR,"objectToBase64");function SR(e){let t=Buffer.from(e,"base64").toString();return JSON.parse(t)}n(SR,"base64ToObject");var ny=require("@budibase/types"),nr=require("@budibase/backend-core"),oy=Re(Ug()),sy=Re(El());async function ZN(e){await Ml(e),await gt.save({offlineLicenseToken:e}),await Qr()}n(ZN,"activateOfflineLicenseToken");async function XN(){await gt.save({offlineLicenseToken:void 0}),await Qr()}n(XN,"deleteOfflineLicenseToken");async function iy(){return(await gt.get()).offlineLicenseToken}n(iy,"getOfflineLicenseToken");async function Al(){let t=(await nr.installation.getInstall()).installId,r=nr.context.getTenantId(),a=await nr.events.identification.getUniqueTenantId(r);return{installId:t,tenantId:a}}n(Al,"getIdentifier");async function eU(){let e=await Al();return ya.objectToBase64(e)}n(eU,"getIdentifierBase64");function tU(e){return ya.base64ToObject(e)}n(tU,"getIdentifierFromBase64");function ly(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(ly,"verifyExpiry");var Bn=class extends Error{static{n(this,"OfflineLicenseMismatchError")}};async function uy(e){let t=await Al();if(e.identifier.installId!==t.installId||e.identifier.tenantId!==t.tenantId)throw new Bn("Invalid offline license")}n(uy,"verifyInstallation");function cy(e){let t=e.plan.type,r=ny.Hosting.SELF,a=Zi(t),o=Xi(r,t);return e.features=(0,oy.default)(e.features,a),e.quotas=(0,sy.default)(e.quotas,o),e}n(cy,"enrichLicense");async function Ml(e){let t;try{t=await Tn(e)}catch{throw new nr.HTTPError("Invalid offline license token",400)}try{ly(t)}catch{throw new nr.HTTPError("Offline license has expired",400)}try{await uy(t)}catch(r){throw r instanceof Bn?new nr.HTTPError("Offline license does not match this installation",400):r}return t}n(Ml,"verifyOfflineLicenseToken");async function Rl(){try{let e=await iy();if(e){let t=await Ml(e);return cy(t)}}catch(e){console.error("Error retrieving offline license",e)}}n(Rl,"getOfflineLicense");var $n={};H($n,{deleteDevLicense:()=>sU,getOfflineLicense:()=>nU,writeDevLicenseToDisk:()=>oU});var dy=require("@budibase/backend-core"),Ol=require("path"),py=require("os"),zr=Re(require("fs"));var rU=dy.env.isTest()?".budibase-test":".budibase",Cl=(0,Ol.join)((0,py.tmpdir)(),rU),aU="dev_license.txt",Gn=(0,Ol.join)(Cl,aU);if(!zr.default.existsSync(Cl))try{zr.default.mkdirSync(Cl)}catch{}function nU(){try{if(zr.default.existsSync(Gn)){let e=zr.default.readFileSync(Gn,{encoding:"utf-8"});return Tn(e)}}catch(e){console.error("Error retrieving offline license from disk",e)}}n(nU,"getOfflineLicense");function oU(e){console.log(`Writing license to: ${Gn}`),zr.default.writeFileSync(Gn,e,{encoding:"utf-8"})}n(oU,"writeDevLicenseToDisk");function sU(){zr.default.rmSync(Gn,{force:!0})}n(sU,"deleteDevLicense");var fy=require("dd-trace");var kl=n(async()=>await fy.tracer.trace("getLicense",async e=>{if(Pl.env.OFFLINE_MODE)return e.addTags({offline:!0}),Rl();let t=await ha();return t||(e.addTags({offlineFallback:!0}),t=$n.getOfflineLicense()),t}),"getLicense"),Dl=n(e=>zi(e),"getLicenseFromKey"),Nl=n(()=>Pl.env.SELF_HOSTED?Nt.SELF_FREE_LICENSE:Nt.CLOUD_FREE_LICENSE,"getFreeLicense");var ql={};H(ql,{activateLicenseKey:()=>iU,deleteLicenseKey:()=>uU,getLicenseKey:()=>lU});var Ul=Re(require("dd-trace"));async function iU(e){await Ji(e),await gt.save({licenseKey:e}),await Qr()}n(iU,"activateLicenseKey");async function lU(){return await Ul.default.trace("getLicenseKey",async e=>{let t=await gt.get();return e.addTags({licenseKey:t.licenseKey}),t.licenseKey})}n(lU,"getLicenseKey");async function uU(){return await Ul.default.trace("deleteLicenseKey",async()=>{await gt.save({licenseKey:void 0}),await Qr()})}n(uU,"deleteLicenseKey");var ss=require("@budibase/backend-core");var Wn,dU=n(async()=>{Wn=await ss.RedisClient.init(ss.redis.utils.Databases.LICENSES)},"init"),pU=n(async()=>{Wn&&await Wn.finish()},"shutdown");process.on("exit",async()=>{await pU()});var is=n(async()=>(Wn||await dU(),Wn),"getClient");var gy=require("@budibase/shared-core");var jl=xt.Duration.fromHours(1).toSeconds(),hy=xt.Duration.fromDays(3).toSeconds(),mU=jl+hy,Qr=n(async()=>{await by(),await vy()},"refresh"),my=n(async e=>{let{result:t}=await xt.locks.doWithLock({type:us.LockType.DEFAULT,name:us.LockName.SYNC_ACCOUNT_LICENSE,resource:e,ttl:xt.Duration.fromSeconds(10).toMs()},async()=>{let r=await is(),a=await r.get(e);if(a&&!yy(a))return a;let o=await ls.default.trace("populateLicense",async()=>await kl());return o||(o=ls.default.trace("populateFreeLicense",()=>Nl())),o.refreshedAt=new Date().toISOString(),await r.store(e,o,mU),o});return t},"populateAndStoreLicense"),yy=n(e=>{let t=e.refreshedAt?Date.parse(e.refreshedAt):0;return Date.now()-t>=jl*1e3},"shouldRevalidateLicense"),Ll=n(async()=>await ls.default.trace("getCachedLicense",async e=>{let t=xt.context.getLicense();if(t)return e.addTags({foundInContext:!0,features:t.features,plan:t.plan,quotas:t.quotas}),t;let r=xt.tenancy.getTenantId(),o=await(await is()).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}),yy(o)&&my(r).catch(()=>{}),o):(o=await gy.helpers.retry(()=>my(r)),e.addTags({refreshedAt:o.refreshedAt,features:o.features,plan:o.plan,quotas:o.quotas,revalidateAfterSeconds:jl,offlineGraceSeconds:hy}),o)}),"_getCachedLicense");xt.env.isJest()&&(Ll=jest.fn().mockImplementation(Ll));var vy=Ll,by=n(async()=>{let e=xt.tenancy.getTenantId();await(await is()).delete(e)},"invalidate");async function je(e,t){Array.isArray(e)||(e=[e]),t||(t=await jt.getCachedLicense());for(let r of e)if(!t?.features.includes(r))return!1;return!0}n(je,"areFeaturesEnabled");async function cs(e,t){if(!await je(e,t))throw new mr.FeatureDisabledWarning(e)}n(cs,"checkFeature");async function Fl(e,t){if(!await je(e,t)){let r=e.join(", ");throw new mr.FeatureDisabledWarning(r)}}n(Fl,"checkFeatures");function ot(e){return async(...t)=>(await cs(De.Feature.WORKSPACE_BACKUPS),e(...t))}n(ot,"checkBackups");async function Bl(){return je(De.Feature.WORKSPACE_BACKUPS)}n(Bl,"isBackupsEnabled");async function Gl(){return je(De.Feature.BRANDING)}n(Gl,"isBrandingEnabled");async function gU(e){return je(De.Feature.MICROFRONTEND,e)}n(gU,"isMicrofrontendFeatureEnabled");async function wy(){return je(De.Feature.ENFORCEABLE_SSO)}n(wy,"isEnforceableSSO");async function hU(){return je(De.Feature.EMBED_AUTH)}n(hU,"isEmbedAuthEnabled");async function yU(){return je(De.Feature.SYNC_AUTOMATIONS)}n(yU,"isSyncAutomationsEnabled");async function vU(){return je(De.Feature.TRIGGER_AUTOMATION_RUN)}n(vU,"isTriggerAutomationRunEnabled");async function ds(){return je(De.Feature.AUDIT_LOGS)}n(ds,"isAuditLogsEnabled");async function $l(){return je(De.Feature.USER_GROUPS)}n($l,"isUserGroupsEnabled");function bU(){return je(De.Feature.PWA)}n(bU,"isPWAEnabled");function wU(){return je(De.Feature.RECAPTCHA)}n(wU,"isRecaptchaEnabled");var IU=n(()=>je(De.Feature.PKCE_OIDC),"isPkceOidcEnabled");async function TU(){return je(De.Feature.TRANSLATIONS)}n(TU,"isTranslationsEnabled");async function Ra(){return je(De.Feature.EXPANDED_PUBLIC_API)}n(Ra,"isExpandedPublicApiEnabled");async function SU(){return je(De.Feature.WORKSPACE_IMPORT_EXPORT)}n(SU,"isWorkspaceImportExportEnabled");async function ps(){return je([De.Feature.EXPANDED_PUBLIC_API,De.Feature.WORKSPACE_IMPORT_EXPORT])}n(ps,"isWorkspaceImportExportPublicApiEnabled");async function xU(e){if(mr.env.ENABLE_SSO_MAINTENANCE_MODE||!await wy())return!1;let r;return e?.config?r=e.config:r=await mr.configs.getSettingsConfig(),!!r.isSSOEnforced}n(xU,"isSSOEnforced");var Wl=n(async()=>{let e=De.Feature.SCIM,t=await je(e),r=await mr.configs.getSCIMConfig();if(!t||!r?.enabled)throw new mr.FeatureDisabledWarning(e);return!0},"checkSCIM");async function _U(){return je(De.Feature.VIEW_PERMISSIONS)}n(_U,"isViewPermissionEnabled");async function EU(){return je(De.Feature.VIEW_READONLY_COLUMNS)}n(EU,"isViewReadonlyColumnsEnabled");var AU={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 MU(e){return await Gl()?{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}:AU}n(MU,"getBrandingConfig");var ir={};H(ir,{addAction:()=>PU,addApp:()=>kU,addAutomation:()=>jU,addGroup:()=>Hl,addPlugin:()=>Ql,addRow:()=>NU,addRows:()=>qU,addUsers:()=>ys,bustCache:()=>Ni,decrement:()=>gr,decrementMany:()=>Vn,getCurrentUsageValues:()=>Wp,getLicensedQuota:()=>ms,getQuotaUsage:()=>Gr,increment:()=>_t,incrementBudibaseAICredits:()=>FU,incrementMany:()=>Yr,removeApp:()=>DU,removeGroup:()=>Kl,removePlugin:()=>zl,removeRow:()=>UU,removeRows:()=>LU,removeUsers:()=>ka,set:()=>Hn,setAllUsage:()=>qi,setAppUsageValue:()=>Ui,setBudibaseAICredits:()=>xy,setUsage:()=>Fp,setUsagePerApp:()=>Bp,throwIfBudibaseAICreditsExceeded:()=>GU,updatePluginCount:()=>Jl,updateUsage:()=>Ca,usageLimitIsExceeded:()=>Vl,utils:()=>tn});var gs=require("@budibase/types");var $t=require("@budibase/backend-core"),$e=require("@budibase/types"),Jr=require("dd-trace");var _t=n(async(e,t,r)=>await Jr.tracer.trace("quotas.increment",async a=>(a.addTags({name:e,type:t}),await Iy({change:1,name:e,type:t,opts:r}))),"increment"),Yr=n(e=>Jr.tracer.trace("quotas.incrementMany",async()=>Iy(e)),"incrementMany"),Iy=n(async e=>await Jr.tracer.trace("quotas.tryIncrement",async t=>{let r=Array.isArray(e)?e:[e];t.addTags({numActions:r.length}),await Ca(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 Jr.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 Ca(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"),gr=n((e,t,r={})=>Ca({usageChange:-1,name:e,type:t,opts:r}),"decrement"),Vn=n(e=>{let t=Array.isArray(e)?e:[e];return Ca(t.map(r=>({usageChange:-r.change,name:r.name,type:r.type,opts:r.opts})))},"decrementMany"),Hn=n(async(e,t,r)=>Dt.setUsage(r,e,t),"set"),RU=n((e,t,r)=>{if(e==$e.QuotaUsageType.STATIC){let a=r.usageQuota.triggers;return a?a[t]||{}:{}}else{let a=Dt.utils.getCurrentMonthString(),o=r.monthly[a].triggers;return o?o[t]||{}:{}}},"getExistingTriggers"),CU=n(async(e,t,r,a)=>{try{await $t.locks.doWithLock({type:$e.LockType.TRY_ONCE,name:$e.LockName.TRIGGER_QUOTA,resource:e,ttl:1e4},async()=>{let o={percentage:r,name:t.name};a&&(o.resetDate=a),await Cr.triggerQuota(o)})}catch(o){$t.logging.logAlert("Error triggering quota",o)}},"triggerQuota"),OU=n(async(e,t,r,a)=>{let o=await Gr(),s=e===$e.QuotaUsageType.MONTHLY?o.quotaReset:void 0,i=await RU(e,t,o),l=a.triggers,d=r/a.value*100;d>100&&(d=100);for(let[f,p]of l.entries())if(d>=p&&a.value!==fr.UNLIMITED){if(!i[p]){i[p]=new Date().toISOString();let h=l[f+1]||100;(!(d>=h)||d===p)&&await CU(t,a,d,s)}}else i[p]=void 0;return i},"checkTriggers"),Ca=n(async e=>{await Jr.tracer.trace("quotas.updateUsage",async t=>{let r=$t.tenancy.getTenantId(),a=Array.isArray(e)?e:[e];t.addTags({numActions:a.length,tenantId:r});let o,s,i=[],l={},d={},f={},p={};for(let h of a)await Jr.tracer.trace("quotas.updateUsage.action",async b=>{b.addTags({actionName:h.name,actionType:h.type,actionUsageChange:h.usageChange});try{o=$t.context.getWorkspaceId()}catch{}if($e.APP_QUOTA_NAMES.includes(h.name)&&!o)throw new Error("App context required for quota update");try{s=await ms($e.QuotaType.USAGE,h.name,h.type),i.push(s);let{total:S,app:k,breakdown:_}=await Dt.getCurrentUsageValues(h.type,h.name,h.opts?.id);S+=h.usageChange,k!=null&&(k+=h.usageChange),_!=null&&(_+=h.usageChange);let x={};if(h.opts?.dryRun||(x=await OU(h.type,h.name,S,s),p={...p,[h.name]:x}),s.value!==fr.UNLIMITED&&S>s.value&&h.usageChange>0)throw new $t.UsageLimitWarning(`${h.name}`);if(S=Math.max(0,S),k&&(k=Math.max(0,k)),_!=null&&(_=Math.max(0,_),f={...f,[h.name]:_}),!h.opts?.dryRun){let W=h.opts?.valueFn;W&&(S=await W(),k=S),l={...l,[h.name]:S},d={...d,[h.name]:k}}}catch(S){throw h.opts?.suppressErrorLog||console.warn(`Error updating usage quotas for ${h.name}`,S),S}});let m=a.filter(h=>!h.opts?.dryRun).map(h=>({name:h.name,type:h.type,values:{total:l[h.name],app:d[h.name],breakdown:f[h.name],triggers:p[h.name]},opts:{...h.opts,tenantId:r}}));m.length>0&&await Dt.setAllUsage(m)})},"updateUsage"),ms=n(async(e,t,r)=>{let a=await jt.getCachedLicense();if(!a){let o=$t.tenancy.getTenantId();throw new Error("License not found for tenant id "+o)}if(r&&(0,$e.isStaticQuota)(e,r,t))return a.quotas[e][r][t];if(r&&(0,$e.isMonthlyQuota)(e,r,t))return a.quotas[e][r][t];if((0,$e.isConstantQuota)(e,t))return a.quotas[e][t];throw new Error("Invalid quota type")},"getLicensedQuota"),Vl=n(async({name:e,type:t,usageChange:r})=>{try{return await Ca({usageChange:r,name:e,type:t,opts:{dryRun:!0}}),!1}catch(a){if(a.code===$e.APIWarningCode.USAGE_LIMIT_EXCEEDED)return!0;throw a}},"usageLimitIsExceeded");var PU=n(async(e,t)=>_t(gs.MonthlyQuotaName.ACTIONS,gs.QuotaUsageType.MONTHLY,{fn:t,id:e}),"addAction");var Ty=require("@budibase/backend-core"),Oa=require("@budibase/types");var Sy=n(async()=>{let e=await Ty.db.getAllWorkspaces({dev:!0});return e?e.length:0},"getDevAppsCount"),kU=n(async(e,{appId:t}={})=>_t(Oa.StaticQuotaName.WORKSPACES,Oa.QuotaUsageType.STATIC,{fn:e,valueFn:Sy,id:t}),"addApp"),DU=n(async({appId:e}={})=>gr(Oa.StaticQuotaName.WORKSPACES,Oa.QuotaUsageType.STATIC,{valueFn:Sy,id:e}),"removeApp");var or=require("@budibase/types");var NU=n(async(e,{tableId:t}={})=>_t(or.StaticQuotaName.ROWS,or.QuotaUsageType.STATIC,{fn:e,id:t}),"addRow"),UU=n(async({tableId:e}={})=>gr(or.StaticQuotaName.ROWS,or.QuotaUsageType.STATIC,{id:e}),"removeRow"),qU=n(async(e,t,{tableId:r}={})=>Yr({change:e,name:or.StaticQuotaName.ROWS,type:or.QuotaUsageType.STATIC,opts:{fn:t,id:r}}),"addRows"),LU=n(async(e,{tableId:t}={})=>Vn({change:e,name:or.StaticQuotaName.ROWS,type:or.QuotaUsageType.STATIC,opts:{id:t}}),"removeRows");var hs=require("@budibase/types");var jU=n(async(e,{automationId:t}={})=>_t(hs.MonthlyQuotaName.AUTOMATIONS,hs.QuotaUsageType.MONTHLY,{fn:e,id:t}),"addAutomation");var Pa=require("@budibase/types");var Hl=n(async e=>_t(Pa.StaticQuotaName.USER_GROUPS,Pa.QuotaUsageType.STATIC,{fn:e}),"addGroup"),Kl=n(async()=>gr(Pa.StaticQuotaName.USER_GROUPS,Pa.QuotaUsageType.STATIC),"removeGroup");var Dr=require("@budibase/types");var Ql=n(async e=>_t(Dr.StaticQuotaName.PLUGINS,Dr.QuotaUsageType.STATIC,{fn:e}),"addPlugin"),zl=n(async()=>gr(Dr.StaticQuotaName.PLUGINS,Dr.QuotaUsageType.STATIC),"removePlugin"),Jl=n(async e=>Hn(Dr.StaticQuotaName.PLUGINS,Dr.QuotaUsageType.STATIC,e),"updatePluginCount");var sr=require("@budibase/types"),Kn=require("@budibase/backend-core");var ys=n(async(e,t,r)=>{if(e===0&&t===0)return r?await r():void 0;let a=[{change:e,name:sr.StaticQuotaName.USERS,type:sr.QuotaUsageType.STATIC,opts:{fn:r,valueFn:Kn.users.getUserCount}}];t>0&&a.push({change:t,name:sr.StaticQuotaName.CREATORS,type:sr.QuotaUsageType.STATIC,opts:{valueFn:Kn.users.getCreatorCount}});let o=await Yr(a);return Promise.resolve(ha()).catch(s=>{console.log("Failed to sync license after adding users",s)}),o},"addUsers"),ka=n(async(e,t)=>{let r=[{change:e,name:sr.StaticQuotaName.USERS,type:sr.QuotaUsageType.STATIC,opts:{valueFn:Kn.users.getUserCount}}];t>0&&r.push({change:t,name:sr.StaticQuotaName.CREATORS,type:sr.QuotaUsageType.STATIC,opts:{valueFn:Kn.users.getCreatorCount}}),await Vn(r),Promise.resolve(ha()).catch(a=>{console.log("Failed to sync license after removing users",a)})},"removeUsers");var ht=require("@budibase/types");var Yl=require("@budibase/backend-core"),ws=require("@budibase/types");var vs=class extends Yl.HTTPError{static{n(this,"GroupNameUnavailableError")}constructor(t){super(`Group name "${t}" is unavailable`,409)}},bs=class extends Yl.HTTPError{static{n(this,"AICreditsExhaustedError")}constructor(){super("You have reached your Budibase AI Credits limit for this billing cycle.",402),this.code=ws.APIWarningCode.USAGE_LIMIT_EXCEEDED}getPublicError(){return{quota:ws.MonthlyQuotaName.BUDIBASE_AI_CREDITS}}};var FU=n(async e=>{try{return await Yr({change:e,name:ht.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:ht.QuotaUsageType.MONTHLY})}catch(t){throw t.code===ht.APIWarningCode.USAGE_LIMIT_EXCEEDED&&await BU().catch(()=>{}),t}},"incrementBudibaseAICredits"),BU=n(async()=>{let e=await ms(ht.QuotaType.USAGE,ht.MonthlyQuotaName.BUDIBASE_AI_CREDITS,ht.QuotaUsageType.MONTHLY);e.value>=0&&await xy(e.value)},"capBudibaseAICreditsAtLimit"),GU=n(async()=>{if(await Vl({name:ht.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:ht.QuotaUsageType.MONTHLY,usageChange:1}))throw new bs},"throwIfBudibaseAICreditsExceeded"),xy=n(async e=>Hn(ht.MonthlyQuotaName.BUDIBASE_AI_CREDITS,ht.QuotaUsageType.MONTHLY,e),"setBudibaseAICredits");var Is={};H(Is,{db:()=>Vt});var eu=require("@budibase/backend-core");var Wt={};H(Wt,{addUsers:()=>zU,adjustGroupCreatorsQuotas:()=>XU,cleanupApp:()=>ZU,enrichUserRolesFromGroups:()=>WU,fetch:()=>Xl,get:()=>Cy,getBulk:()=>Oy,getDefaultGroup:()=>VU,getGroupBuilderAppIds:()=>Ry,getGroupRoleId:()=>$U,remove:()=>QU,removeUsers:()=>JU,save:()=>Py,updateGroupApps:()=>YU});var ee=require("@budibase/backend-core");async function Zl(e,t){try{let r=[];for(let l of e)if(l.roles){let d=l.roles[ee.db.getProdWorkspaceID(t)];d&&r.push(d)}let a=await Promise.all(r.map(async l=>({[l]:await ee.roles.roleToNumber(l)}))),o,s,i={};a.forEach(l=>{let[d,f]=Object.entries(l)[0];i[d]={roleId:d,roleNum:f}});for(let{roleId:l,roleNum:d}of Object.values(i))(s===void 0||d>s)&&(s=d,o=l);return o}catch(r){throw ee.logging.logAlert(`Error finding higest role for ${e.length} on app ${t}`,r),r}}n(Zl,"findHighestRole");async function My(e,t){return t?t=t.filter(r=>e.includes(r._id)):t=await ue.getBulk(e,{enriched:!1}),t}n(My,"groupList");async function Ry(e,t){if(!e.userGroups)return[];let r=await My(e.userGroups,t?.groups),a=t?.appId?ee.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(Ry,"getGroupBuilderAppIds");async function $U(e,t,r){if(!e.userGroups)return null;let a=await My(e.userGroups,r?.groups),o=ee.db.getProdWorkspaceID(t);return e.roles?.[o]?e.roles[o]:(a=a.filter(l=>l?.roles?Object.keys(l.roles).includes(o):!1),ee.context.getCurrentContext()?.appId===t?Zl(a,t):await ee.context.doInWorkspaceContext(t,async()=>Zl(a,t)))}n($U,"getGroupRoleId");async function WU(e){if(!e||!e.userGroups)return e;let t=await Oy(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 ee.context.doInWorkspaceContext(o,async()=>{if(e.roles[o])return;let s=await Zl(t,o);s&&(e.roles[o]=s)});let a=await Ry(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(WU,"enrichUserRolesFromGroups");async function Xl(){return await ue.fetch()}n(Xl,"fetch");async function Cy(e){return await ue.get(e)}n(Cy,"get");async function VU(){return(await ue.getAll()).find(t=>t.isDefault)}n(VU,"getDefaultGroup");async function Oy(e,t={enriched:!0}){return ue.getBulk(e,t)}n(Oy,"getBulk");async function _y(e){if(await ue.getByName(e))throw new vs(e)}n(_y,"guardNameAvailability");async function Ey(e){let t=await ue.getGroupUsers(e._id);if(!t.length)return 0;let a=await ee.tenancy.getGlobalDB().getMultiple(t.map(s=>s._id));return(await ee.userUtils.creatorsInList(a)).filter(s=>s).length}n(Ey,"getCreatorsCountInGroup");function Ay(e){return Object.values(e.roles||{}).includes("CREATOR")}n(Ay,"isCreatorGroup");function HU(e){let{users:t,...r}=e;return r}n(HU,"stripEnrichedFields");async function KU(e){if(!e.isDefault)return ue.save(e);let r=(await ue.getAll()).filter(i=>i._id!==e._id).filter(i=>i.isDefault);if(!r.length)return ue.save(e);let o=(await ue.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 ue.get(e._id);return{id:s._id,rev:s._rev}}n(KU,"saveGroupWithDefaultUpdates");async function Py(e){let t=[],r=!e._id,a=0;if(!e._id)e._id=ue.generateUserGroupID(),await _y(e.name),t.push(ee.events.group.created(e));else{let i=await ue.get(e._id);if(i.name!==e.name&&await _y(e.name),t.push(ee.events.group.updated(e)),JSON.stringify(i.roles)!==JSON.stringify(e.roles)){let l=Ay(i),d=Ay(e);if(l!==d){let f=i.users?.length||0,p=0;f>0&&(p=await Ey(i)),d?a=f-p:a=-f}t.push(ee.events.group.permissionsEdited(e))}}await Promise.all(t);let o=HU(e),s=n(()=>KU(o),"saveGroup");if(r)return await Hl(s);{let i=await s();if(a>0)await ys(0,a);else if(a<0){let l=await Ey(e),d=Math.abs(a)-l;d>0&&await ka(0,d)}return i}}n(Py,"save");async function QU(e,t){let r;try{r=await ue.get(e)}catch{throw new Error("Group not found")}let a=Object.values(r.roles||{}).includes("CREATOR"),o=n(()=>{},"recalculateCreatorsQuotasFn");if(a){let i=ee.tenancy.getGlobalDB(),l=await ue.getGroupUsers(e),f=(await Promise.all(l.map(b=>i.get(b._id)))).map(b=>({...b,userGroups:b.userGroups.filter(T=>T!==e)})),m=(await ee.userUtils.creatorsInList(f)).filter(b=>b).length,h=l.length-m;h&&(o=n(()=>ka(0,h),"recalculateCreatorsQuotasFn"))}let s=await ue.destroy(e,t);return await ee.events.group.deleted(r),await Kl(),await o(),s}n(QU,"remove");async function zU(e,t){let r=await ue.get(e),a=await ee.users.bulkGetGlobalUsersById(t),o=[];for(let d of a)d.userGroups||(d.userGroups=[]),d.userGroups.includes(e)||o.push(d);if(!o.length)return o;let s=o.map(d=>({...d,userGroups:[...d?.userGroups||[],e]}));if(await ee.users.bulkUpdateGlobalUsers(s),Object.values(r.roles||{}).includes("CREATOR")){let f=(await ee.userUtils.creatorsInList(o)).filter(m=>m).length,p=o.length-f;p&&await ys(0,p)}let l=[];for(let d of t)l.push(ee.cache.user.invalidateUser(d));return await Promise.all(l),await ee.events.group.usersAdded(s.length,r,t),s}n(zU,"addUsers");async function JU(e,t){let r=await ue.get(e),a=await ee.users.bulkGetGlobalUsersById(t),o=[];for(let l of a){if(!l.userGroups||!l.userGroups.includes(e))continue;let d=l.userGroups.indexOf(e);l.userGroups.splice(d,1),o.push(l)}if(await ee.users.bulkUpdateGlobalUsers(o),Object.values(r.roles||{}).includes("CREATOR")){let d=(await ee.userUtils.creatorsInList(o)).filter(p=>p).length,f=o.length-d;f&&await ka(0,f)}let i=[];for(let l of t)i.push(ee.cache.user.invalidateUser(l));return await Promise.all(i),o.length&&await ee.events.group.usersDeleted(o.length,r,t),o}n(JU,"removeUsers");async function YU(e,t){let r=await Cy(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 Py(r)}n(YU,"updateGroupApps");async function ZU(e){let t=await Xl(),r=[];for(let a of t)!a.roles||!a.roles[e]||(delete a.roles[e],r.push(a));return await ue.bulkSave(r)}n(ZU,"cleanupApp");async function XU(){if(!await $l()){let e=ee.tenancy.getGlobalDB(),r=(await Xl()||[]).filter(a=>Object.values(a?.roles||{}).includes("CREATOR"));for(let a of r){let o=await ue.getGroupUsers(a._id),i=(await Promise.all(o.map(p=>e.get(p._id)))).map(p=>({...p,userGroups:p.userGroups.filter(m=>m!==a._id)})),d=(await ee.userUtils.creatorsInList(i)).filter(p=>p).length,f=o.length-d;await ue.save({...a,roles:{}}),f&&await ka(0,f)}}}n(XU,"adjustGroupCreatorsQuotas");eu.users.UserDB.init(ir,Wt,Gt);var Vt=eu.users.UserDB;var Es={};H(Es,{logs:()=>lu});var lu={};H(lu,{logSearch:()=>lq,oldestLogDate:()=>jy,storeLog:()=>uq});var _s=require("@budibase/backend-core"),xs=require("@budibase/types");var ze=require("@budibase/backend-core"),Ss=require("@budibase/types");var ky=require("@budibase/backend-core");async function Dy(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||ky.logging.logWarn(`Failed to backoff: ${t}`,r),s}n(Dy,"backOff");var{SEPARATOR:hr,UNICODE_MAX:eq,DocumentType:Ny,AutomationViewMode:tu,ViewName:tq,getQueryIndex:rq}=ze.db,aq=new Date(0).toISOString(),nq=100,Ts=10,ru=n(async()=>Uo(Ss.ConstantQuotaName.AUTOMATION_LOG_RETENTION_DAYS),"oldestLogDate");function Uy(e,t,{status:r,automationId:a}={},o={}){let s=a?`${a}${hr}`:"",i=r?`${r}${hr}`:"",l;return r&&a?l=`${tu.ALL}${hr}${i}${s}`:r?l=`${tu.STATUS}${hr}${i}`:a?l=`${tu.AUTOMATION}${hr}${s}`:l=`${Ny.AUTOMATION_LOG}${hr}`,{...o,descending:!0,startkey:`${l}${t}${eq}`,endkey:`${l}${e}`}}n(Uy,"getAutomationLogParams");function oq(e,t,r){return`${Ny.AUTOMATION_LOG}${hr}${e}${hr}${r}${hr}${t}`}n(oq,"generateAutomationLogID");async function au(e,t,r={docs:!0}){let a=ze.context.getProdWorkspaceDB();await a.exists()||(a=ze.context.getDevWorkspaceDB());let o={status:r.status},s=r?.limit?r.limit:r?.paginate?Ts+1:void 0,i=Uy(e,t,o,{include_docs:r.docs,limit:s});r?.page&&(i.startkey=r.page);let l=await a.allDocs(i),d=In(l,{paginate:r?.paginate,pageSize:Ts});return{...d,totalLogs:d.totalRows}}n(au,"getAllLogs");async function nu(e,t,r={}){let a=ze.context.getProdWorkspaceDB();await a.exists()||(a=ze.context.getDevWorkspaceDB());let o;try{let i={automationId:r?.automationId,status:r?.status},l=Uy(e,t,i,{include_docs:!0,limit:Ts+1});r?.page&&(l.startkey=r.page),o=await a.query(rq(tq.AUTOMATION_LOGS),l)}catch(i){if(i!=null&&(i.name==="not_found"||i.error==="not_found"))return await rf(),nu(e,t,r);throw i}let s=In(o,{paginate:!0,pageSize:Ts});return{...s,totalLogs:s.totalRows/3}}n(nu,"getLogsByView");async function qy(e,t){let r=ze.context.getProdWorkspaceDB(),a=e._id,o=e.name,s=new Date().toISOString(),i=oq(s,t.status,a),l={...t,automationId:a,status:t.status,automationName:o,createdAt:s,_id:i};return await r.put(l),i}n(qy,"writeLog");async function ou(e,{clearing:t}={clearing:!1}){await Ly({logIds:e,clearing:t,metadataKey:"automationErrors",failureMessage:"Failed to update app metadata with automation log error"})}n(ou,"updateAppMetadataWithErrors");async function su(e,{clearing:t}={clearing:!1}){await Ly({logIds:e,clearing:t,metadataKey:"automationStops",failureMessage:"Failed to update app metadata with automation log stop"})}n(su,"updateAppMetadataWithStops");async function Ly({logIds:e,clearing:t,metadataKey:r,failureMessage:a}){let o=ze.context.getProdWorkspaceDB();await Dy(async()=>{let s=await o.get(ze.db.DocumentType.WORKSPACE_METADATA);for(let i of e){let l=i.split(ze.db.SEPARATOR),d=`${l[l.length-3]}${ze.db.SEPARATOR}${l[l.length-2]}`,f={};if(s[r]&&(f=s[r]),t&&!Array.isArray(f[d]))continue;f[d]||=[];let p=f[d].indexOf(i);if(t){if(p===-1)continue;f[d].splice(p,1)}else f[d].push(i);f[d].length===0&&delete f[d],s[r]=f}await o.put(s),await ze.cache.workspace.invalidateWorkspaceMetadata(s.appId,s)},a)}n(Ly,"updateAppMetadataWithLogIds");async function sq(){let e=await ru();try{return await au(aq,e,{docs:!1,paginate:!1,limit:nq})}catch{return{data:[],hasNextPage:!1,totalLogs:0}}}n(sq,"getExpiredLogs");async function iu(){let e=ze.context.getProdWorkspaceDB();try{let t=await sq();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(ze.db.SEPARATOR);return i[i.length-1]===Ss.AutomationStatus.ERROR});await e.bulkDocs(r),o.length&&await ou(o,{clearing:!0}),a.length&&await su(a,{clearing:!0})}catch(t){ze.logging.logAlert(`Failed to cleanup automation log history - Database "${e.name}"`,t)}}n(iu,"clearOldHistory");var jy=ru;async function iq(e,t,r,a){let o,s=new Date().toISOString(),i=await jy();return(!e||e<i)&&(e=i),r||t?o=await nu(e,s,{automationId:r,status:t,page:a}):o=await au(e,s,{status:t,page:a,docs:!0,paginate:!0}),o}n(iq,"getLogs");async function lq(e){return await iu(),await iq(e.startDate,e.status,e.automationId,e.page)}n(lq,"logSearch");async function uq(e,t){if(!_s.db.isProdWorkspaceID(_s.context.getWorkspaceId()))return;let r=await qy(e,t);t.status===xs.AutomationStatus.ERROR&&await ou([r]),t.status===xs.AutomationStatus.STOPPED&&t.steps.some(a=>a.inputs?.notify===!0&&a.outputs.status===xs.AutomationStatus.STOPPED)&&await su([r]),await iu()}n(uq,"storeLog");var As={};H(As,{checkPluginQuotas:()=>pq,deletePlugin:()=>dq,storePlugin:()=>cq});var $y=require("@budibase/types"),We=require("@budibase/backend-core"),Wy=Re(require("module")),Vy=Re(require("isolated-vm"));var Fy=Re(require("fs")),By=require("path");function Gy(e,t){return Fy.default.readFileSync((0,By.join)(e,t),"utf8")}n(Gy,"loadJSFile");async function cq(e,t,r,a){let o=We.tenancy.getGlobalDB(),s=e.package.version,i=e.package.name,l=e.package.description,d=e.schema.hash,f=We.objectStore.getPluginS3Dir(i),p=await We.objectStore.uploadDirectory(We.objectStore.ObjectStoreBuckets.PLUGINS,t,f),m=p.find(x=>x.name.endsWith(".js")),h=p.find(x=>x.name.endsWith(".svg"));if(!m)throw new Error("Plugin missing .js file.");if(e.schema.type===$y.PluginType.DATASOURCE){let x=Gy(t,m.name),W=new Vy.default.Isolate({memoryLimit:8});try{W.compileScriptSync(Wy.default.wrap(x),{filename:m.name})}catch(V){let M=V?.message?V.message:JSON.stringify(V);throw new Error(`JS invalid: ${M}`)}finally{W.dispose()}}let b=h?h.name:null,T=We.db.generatePluginID(i),S;try{S=(await o.get(T))._rev}catch{S=void 0}let k={_id:T,_rev:S,...e,name:i,version:s,hash:d,description:l,source:r};b&&(k.iconFileName=b),r&&(k={...k,source:r}),a&&a.source==="github"&&(k.origin=a);let _=n(async()=>{let x=await o.put(k);return await We.events.plugin.imported(k),{...k,_rev:x.rev}},"write");return S?await _():await Ql(_)}n(cq,"storePlugin");async function dq(e){let t=We.tenancy.getGlobalDB();try{let r=await t.get(e),a=We.objectStore.getPluginS3Dir(r.name);await We.objectStore.deleteFolder(We.objectStore.ObjectStoreBuckets.PLUGINS,a),await t.remove(e,r._rev),await We.events.plugin.deleted(r),await zl()}catch(r){let a=r?.message?r?.message:r;throw new Error(`Failed to delete plugin: ${a}`)}}n(dq,"deletePlugin");async function pq(){let e=We.tenancy.getGlobalDB();try{let r=(await e.allDocs(We.db.getPluginParams())).rows.length;console.log(`Syncing plugin count: ${r}`),await Jl(r)}catch(t){We.logging.logAlert("Unable to retrieve plugins for quota check",t)}}n(pq,"checkPluginQuotas");var Ms={};H(Ms,{fetch:()=>mq,fetchValues:()=>gq,isEncryptionKeyAvailable:()=>fq,isValid:()=>Qy,remove:()=>yq,update:()=>hq});var Hy=require("@budibase/backend-core"),Qn=require("@budibase/types");function fq(){return!!Hy.env.ENCRYPTION_KEY}n(fq,"isEncryptionKeyAvailable");async function mq(){let e=await Mr.get();return Object.keys(e.variables)}n(mq,"fetch");async function gq(e){let r=(await Mr.get()).variables,a={};for(let[o,s]of Object.entries(r))switch(e){case Qn.Environment.DEVELOPMENT:a[o]=s.development;break;case Qn.Environment.PRODUCTION:default:a[o]=s.production;break}return a}n(gq,"fetchValues");async function Ky(e){if(!(await ar.cache.getCachedLicense()).features.includes(Qn.Feature.ENVIRONMENT_VARIABLES))throw new Error("User does not have access to environment variables feature.");let r=await Mr.get();r.variables=e(r.variables),await Mr.update(r)}n(Ky,"changeValues");async function hq(e,t){if(Qy(e))await Ky(a=>(a[e]=t,a));else throw new Error("Variable name has characters that are not allowed")}n(hq,"update");async function yq(e){await Ky(t=>(delete t[e],t))}n(yq,"remove");function Qy(e){return/^[a-zA-Z0-9-_]+$/.test(e)}n(Qy,"isValid");var Os={};H(Os,{definitions:()=>Mq,download:()=>Aq,fetch:()=>Eq,write:()=>xq});var yt=require("@budibase/backend-core"),Cs=require("@budibase/types");var Fe=require("@budibase/backend-core"),Ht=require("@budibase/types");var zy=require("memorystream"),Jy=new Fe.sql.Sql(Ht.SqlClient.SQL_LITE);async function vq(e,t,r){let a={operation:Ht.Operation.READ,table:ma.searchTable(),tables:{},paginate:{limit:r||9,offset:(t-1)*9},filters:e,resource:{fields:[]},sort:{timestamp:{direction:Ht.SortOrder.DESCENDING,type:Ht.SortType.STRING}}},o=Jy._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(vq,"getAuditLogSqlQuery");function bq(e){return`${Fe.DocumentType.AUDIT_LOG}${Fe.SEPARATOR}${e}${Fe.SEPARATOR}${Fe.utils.newid()}`}n(bq,"generateAuditLogID");async function Yy(e){e._id||(e._id=bq(e.timestamp)),e.type||(e.type=Ht.AUDIT_LOG_TYPE);try{let r=await Fe.context.getAuditLogsDB().put(e);return{...e,_rev:r.rev}}catch(t){Fe.logging.logAlert("Failed to write audit log",t)}}n(Yy,"save");async function uu(e,t,r){t||(t=1);let a=Fe.context.getAuditLogsDB();try{let o=10,s=await vq(e,t,o),i=ma.searchTable(),l=Jy.convertJsonStringColumns(i,await a.sql(s.sql,s.bindings)),d;l.length>9&&(d=l.pop());let f={rows:l,hasNextPage:!!d};return f.hasNextPage&&(f.bookmark=t+1),f}catch(o){if(o.status===404&&!r?.isRetry)return await wq(),await Vp(),await uu(e,t,{isRetry:!0});throw o}}n(uu,"searchSQL");async function wq(){let e=Fe.context.getAuditLogsDB(),r=(await e.allDocs(Fe.db.getDocParams(Fe.DocumentType.AUDIT_LOG,null,{include_docs:!0}))).rows.map(a=>a.doc).filter(a=>a&&!a.type).map(a=>({...a,type:Ht.AUDIT_LOG_TYPE}));await e.bulkDocs(r)}n(wq,"migrate");function Zy(e){let t=Fe.context.getAuditLogsDB(),r=new zy,a=t.dump(r,{filter:n(s=>{let i=s;if(!i._id?.startsWith(Fe.DocumentType.AUDIT_LOG))return!1;let l=!0,d=n((f,p)=>{!f||f.length===0||(l=!!(l&&p&&f.includes(p)))},"matcher");if(d(e.userIds,i.userId),d(e.appIds,i.appId),d(e.events,i.event),(e.startDate||e.endDate)&&(l=l&&i.timestamp>=e.startDate&&i.timestamp<=e.endDate),e.fullSearch){let f=JSON.stringify(s);l=l&&f.includes(e.fullSearch)}return l},"filter")}),o=new zy;return r.on("data",s=>{let i=JSON.parse(Buffer.from(s).toString());if(Array.isArray(i.docs)){let l="";for(let d of i.docs)l+=JSON.stringify(d)+`
|
|
48
48
|
`;o.write(l)}}),r.on("end",()=>{o.end()}),{promise:a,stream:o}}n(Zy,"dump");var zn=require("@budibase/backend-core"),Jn=require("@budibase/string-templates"),Rs=require("@budibase/types");var Tq=zn.constants.MIN_VALID_DATE.toISOString(),Sq=zn.constants.MAX_VALID_DATE.toISOString();function cu(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||Tq,e.endDate=e.endDate||Sq),e}n(cu,"fillDates");async function Xy(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(a=>zn.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=cu(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}n(Xy,"getSearchFilters");function du(e,t,r){let a={_id:e,status:Rs.AuditLogResourceStatus.DELETED};switch(t){case"app":a.name=r?.appName;break;case"user":a.email=r?.email;break}return a}n(du,"deleted");function pu(e){let t=(0,Jn.findHBSBlocks)(e);for(let r of t){let a=` "${r}"`;e=e.replace(e.includes(a)?a:` ${r}`,""),e=(0,Jn.processStringSync)(e,{})}return e}n(pu,"removeTemplateStrings");function ev(e,t){let r=Rs.AuditedEventFriendlyName[e];if(!r)throw new Error("No friendly name found.");let a=(0,Jn.processStringSync)(r,t);return a.includes('""')&&(a=pu(r)),a}n(ev,"getEventFriendlyName");async function xq(e,t,r){if(!await ds()||!yt.utils.isAudited(e))return;let a=ev(e,t),o=new Date;r?.timestamp&&(o=new Date(r.timestamp));let s={timestamp:o.toISOString(),event:e,name:a,userId:r?.userId||Cs.AuditLogSystemUser,metadata:{...t,...r?.hostInfo}},i={};try{if(r?.appId){s.appId=yt.db.getProdWorkspaceID(r.appId);let l=await yt.cache.workspace.getWorkspaceMetadata(r.appId);"name"in l&&(i.appName=l.name)}if(r?.userId){let l=await yt.users.getById(r?.userId);i.email=l.email}}catch(l){yt.logging.logAlert("Failed to retrieve fallback information for audit log",l)}return s.fallback=i,await Yy(s)}n(xq,"write");async function _q(e){let t=e.map(l=>l.userId),a=e.filter(l=>l.appId).map(l=>yt.db.getDevWorkspaceID(l.appId)),o=await yt.users.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),s=await yt.db.getWorkspacesByIDs([...new Set(a)]),i=[];for(let l of e){let d=o.find(m=>m?._id===l.userId),f=s.find(m=>yt.db.isSameWorkspaceID(m?.appId,l.appId)),p={event:l.event,timestamp:l.timestamp,name:l.name,metadata:l.metadata,user:d||du(l.userId,"user",l.fallback)};l.appId&&(p.app=f||du(l.appId,"app",l.fallback)),i.push(p)}return i}n(_q,"enrich");async function Eq(e){if(!await ds())throw new Error("Audit logs not available - license required.");let t=await Xy(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await uu(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await _q(r.rows)}}n(Eq,"fetch");function Aq(e){return e=cu(e),Zy(e)}n(Aq,"download");function Mq(){let e=Object.entries(Cs.AuditedEventFriendlyName).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=pu(r[1]);return t}n(Mq,"definitions");var Ps={};H(Ps,{applications:()=>hu,roles:()=>mu,users:()=>fu});var fu={};H(fu,{roleCheck:()=>Cq});function Rq(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(Rq,"removeRoles");async function Cq(e,t){return await Ra()||Rq(e,t),e}n(Cq,"roleCheck");var mu={};H(mu,{assign:()=>Oq,unAssign:()=>Pq});var Yn=require("@budibase/backend-core");async function Oq(e,t){if(!await Ra())throw new Error("Unable to assign roles - license required.");let r=await Vt.bulkGet(e);for(let a of r){if(t.role&&t.role.roleId){let o=Yn.db.getProdWorkspaceID(t.role.appId);a.roles[o]=t.role.roleId}if(t.appBuilder){let o=Yn.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 Vt.bulkUpdate(r)}n(Oq,"assign");async function Pq(e,t){if(!await Ra())throw new Error("Unable to un-assign roles - license required.");let r=await Vt.bulkGet(e);for(let a of r){if(t.role){let o=Yn.db.getProdWorkspaceID(t.role?.appId);a.roles[o]===t.role.roleId&&delete a.roles[o]}if(t.appBuilder&&a.builder?.apps){let o=Yn.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 Vt.bulkUpdate(r)}n(Pq,"unAssign");var hu={};H(hu,{buildExportFn:()=>Nq,buildImportFn:()=>Dq});var gu=require("@budibase/backend-core");var kq=n(e=>{if(e){if(e.appExport)return e.appExport;if(e.file)return e.file}},"ensureAppExportFile");function Dq(e){return async(t,r)=>{await ps()||t.throw(403,"Endpoint unavailable, enterprise license required."),kq(t.request.files)||t.throw(400,"Must provide app export file for import."),await gu.context.doInWorkspaceContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}n(Dq,"buildImportFn");function Nq(e){return async(t,r)=>{await ps()||t.throw(403,"Endpoint unavailable, enterprise license required.");let{encryptPassword:a,excludeRows:o}=t.request.body;await gu.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(Nq,"buildExportFn");var xu=require("@budibase/backend-core");var Ve=require("@budibase/backend-core"),et=require("@budibase/types"),av=Re(require("fs")),nv=require("path");var yu=require("@budibase/backend-core");var tv;function rv(){tv=new yu.queue.BudibaseQueue(yu.queue.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}n(rv,"init");function Nr(){return tv}n(Nr,"getBackupQueue");async function vu(e,t={}){return st.storeWorkspaceBackupMetadata(e,t)}n(vu,"storeWorkspaceBackupMetadata");function ov(e){let t=new Date().toISOString();switch(e){case et.BackupStatus.COMPLETE:case et.BackupStatus.FAILED:return{timestamp:t,finishedAt:t};case et.BackupStatus.STARTED:return{timestamp:t,startedAt:t};case et.BackupStatus.PENDING:return{timestamp:t,createdAt:t}}}n(ov,"getTimestamps");async function Uq(e,t,r,a){let o=await ks(e);return await st.storeWorkspaceBackupMetadata({...o,...ov(t),contents:r,status:t,type:et.BackupType.BACKUP},{filename:a,docId:e})}n(Uq,"updateBackupStatus");async function qq(e,t,r){let a=await ks(e);return await st.storeWorkspaceBackupMetadata({...a,...ov(r),status:r,type:et.BackupType.RESTORE,trigger:et.BackupTrigger.MANUAL},{docId:e,docRev:t})}n(qq,"updateRestoreStatus");async function ks(e){return st.getWorkspaceBackupMetadata(e)}n(ks,"getWorkspaceBackup");async function Lq(e,t){return st.updateWorkspaceBackupMetadata(e,t)}n(Lq,"updateWorkspaceBackup");async function sv(e){return e.filename&&await Ve.objectStore.deleteFile(Ve.objectStore.ObjectStoreBuckets.BACKUPS,e.filename),st.deleteWorkspaceBackupMetadata(e)}n(sv,"deleteWorkspaceBackupMetadata");async function iv(e){let t=await st.getWorkspaceBackupMetadata(e);return sv(t)}n(iv,"deleteWorkspaceBackup");async function jq(e){let t=[];for(let r of e)try{await iv(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(jq,"deleteWorkspaceBackups");async function Fq(){let e={deleted:0,failed:0},t=await st.oldestBackupDate(),r;do{let a=await st.fetchExpiredWorkspaceBackups(t,r);for(let o of a.backups)try{await sv(o),e.deleted++}catch(s){e.failed++,Ve.logging.logAlert(`Failed to cleanup expired backup ${o._id}`,s)}r=a.nextPage}while(r);return e}n(Fq,"cleanupExpiredWorkspaceBackups");async function Bq(e,t){return st.fetchWorkspaceBackups(e,t)}n(Bq,"fetchWorkspaceBackups");async function lv(e){let t=await st.getWorkspaceBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let{stream:r}=await Ve.objectStore.getReadStream(Ve.objectStore.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}n(lv,"getBackupDownloadStream");async function Gq(e){let{stream:t}=await lv(e),r=(0,nv.join)(Ve.objectStore.budibaseTempDir(),Ve.utils.newid()),a=av.default.createWriteStream(r);return new Promise((o,s)=>{t.on("error",s),a.on("error",s),t.pipe(a).on("close",()=>o(r))})}n(Gq,"downloadWorkspaceBackup");async function $q(e,t,r={}){let a;try{a=await vu({appId:e,trigger:t,timestamp:new Date().toISOString(),status:et.BackupStatus.PENDING,type:et.BackupType.BACKUP,...r})}catch(o){if(o.status===409)return;throw o}return await Nr().add({docId:a.id,docRev:a.rev,appId:e,export:{trigger:t,...r}}),await Ve.events.backup.workspaceBackupTriggered(e,a.id,et.BackupType.BACKUP,t,r?.name),a.id}n($q,"triggerWorkspaceBackup");async function Wq(e,t,r,a){let o=await ks(t),s;try{s=await vu({appId:e,timestamp:new Date().toISOString(),status:et.BackupStatus.PENDING,type:et.BackupType.RESTORE,createdBy:a})}catch(i){if(i?.status===409)return;throw i}return await Nr().add({appId:e,docId:s.id,docRev:s.rev,import:{nameForBackup:r,backupId:t,createdBy:a}}),{restoreId:s.id,metadata:o}}n(Wq,"triggerWorkspaceRestore");async function Vq(e,t,r){let a=Ve.db.getProdWorkspaceID(e);await Ve.context.doInWorkspaceContext(a,async()=>{let o=Ve.context.getProdWorkspaceDB();if(!await o.exists())return;let i=await o.tryGet(et.DocumentType.WORKSPACE_METADATA);i&&(i.backupErrors||(i.backupErrors={}),i.backupErrors[t]||(i.backupErrors[t]=[]),i.backupErrors[t].push(r),await o.put(i),await Ve.cache.workspace.invalidateWorkspaceMetadata(i.appId,i))})}n(Vq,"trackBackupError");var Hq={isEnabled:Bl,triggerWorkspaceRestore:ot(Wq),triggerWorkspaceBackup:ot($q),getBackupDownloadStream:ot(lv),downloadWorkspaceBackup:ot(Gq),fetchWorkspaceBackups:ot(Bq),storeWorkspaceBackupMetadata:ot(vu),updateBackupStatus:ot(Uq),updateRestoreStatus:ot(qq),getWorkspaceBackup:ot(ks),updateWorkspaceBackup:ot(Lq),deleteWorkspaceBackup:ot(iv),deleteWorkspaceBackups:ot(jq),cleanupExpiredWorkspaceBackups:ot(Fq),trackBackupError:ot(Vq)},Et=Hq;var Su={};H(Su,{init:()=>wu,scheduleCleanup:()=>Iu});var X=require("@budibase/backend-core"),Kt=require("@budibase/types"),Da=Re(require("fs"));var Kq="workspace-backup-cleanup",Qq=X.Duration.fromDays(1).toMs();async function wu(e){Nr().process(async t=>{let r=t.data;try{"cleanup"in r?(console.log("Cleaning up expired app backups"),await X.tenancy.doInTenant(r.tenantId,()=>Et.cleanupExpiredWorkspaceBackups())):"export"in r?(console.log("Exporting app backup:",r.appId,r.export.trigger),await eL(r,e)):"import"in r&&(console.log("Importing app backup:",r.appId,r.import.backupId),await Xq(r,e))}catch(a){let o="appId"in r?r.appId:"system";X.logging.logAlert(`Failed to perform backup for app ID: ${o}`,a)}})}n(wu,"init");async function Iu(){await Nr().add({cleanup:!0,tenantId:X.tenancy.getTenantId()},{jobId:Kq,repeat:{every:Qq}})}n(Iu,"scheduleCleanup");async function zq(e){await X.db.getDB(e,{skip_setup:!0}).destroy()}n(zq,"removeExistingApp");var uv=1e3;async function Ds(e){for(let t=0;t<e.length;t+=uv)await X.objectStore.deleteFiles(X.objectStore.ObjectStoreBuckets.APPS,e.slice(t,t+uv))}n(Ds,"deleteAppFiles");async function Tu(e){let t=[];for await(let r of X.objectStore.listAllObjects(X.objectStore.ObjectStoreBuckets.APPS,e))r.Key&&t.push(r.Key);return t}n(Tu,"listAppFiles");async function Jq(e){let t=X.db.getProdWorkspaceID(e),r=await Tu(`${t}/`);r.length&&await Ds(r)}n(Jq,"clearWorkspaceFiles");async function bu(e,t){let{stream:r}=await X.objectStore.getReadStream(X.objectStore.ObjectStoreBuckets.APPS,e);await X.objectStore.streamUpload({bucket:X.objectStore.ObjectStoreBuckets.APPS,filename:t,stream:r})}n(bu,"copyAppFile");async function cv(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 bu(s,o):a.push(o)}a.length&&await Ds(a)}n(cv,"rollbackPromotedWorkspaceFiles");async function Yq(e,t){let r=X.db.getProdWorkspaceID(e),a=X.db.getProdWorkspaceID(t),o=`${r}/`,s=`${a}/`,i=`${o}__restore_rollback/${Date.now()}/`,l=await Tu(o),d=new Set,f=[];try{for(let p of l){let m=p.startsWith(o)?p.slice(o.length):p,h=`${s}${m}`;if(await X.objectStore.objectExists(X.objectStore.ObjectStoreBuckets.APPS,h)){let T=`${i}${m}`;await bu(h,T),f.push({targetKey:h,rollbackKey:T})}await bu(p,h),d.add(h)}}catch(p){if(d.size)try{await cv([...d],f)}catch(m){console.log("Failed to rollback partially promoted restore files:",m)}throw p}return{sourceFileKeys:l,targetFileKeys:[...d],rollbackFiles:f}}n(Yq,"promoteWorkspaceFiles");async function Zq(e,t,r){let o=`${X.db.getProdWorkspaceID(r)}/`,s=await Tu(o),i=new Set(t),l=s.filter(d=>!i.has(d));l.length&&await Ds(l),e.length&&await Ds(e)}n(Zq,"cleanupPromotedWorkspaceFiles");async function dv(e,t,r,a){let o=X.db.getDevWorkspaceID(r),s=X.db.getProdWorkspaceID(r),i=new Date().toISOString(),l=n(async(d,f)=>{a?.doc?await Et.updateBackupStatus(a.doc.id,d,f?.contents,f?.filename):await Et.storeWorkspaceBackupMetadata({appId:s,timestamp:i,trigger:e,status:d,name:a?.name,type:Kt.BackupType.BACKUP,contents:f?.contents,createdBy:a?.createdBy},{filename:f?.filename})},"updateMetadata");try{let d=await a.processing.exportWorkspaceFn(o,{tar:!0}),f=await a.processing.statsFn(o),p=`${s}/backup-${i}.tar.gz`,m=X.objectStore.ObjectStoreBuckets.BACKUPS,h=Da.default.createReadStream(d);await X.objectStore.streamUpload({bucket:m,filename:p,stream:h,extra:{type:"application/gzip",metadata:{name:a?.name,trigger:e,timestamp:i,appId:s}}}),await l(Kt.BackupStatus.COMPLETE,{filename:p,contents:f}),Da.default.existsSync(d)&&Da.default.rmSync(d)}catch(d){X.logging.logAlert("App backup error",d),await l(Kt.BackupStatus.FAILED);let f=a?.doc?.id||`backup-${i}`,p=d instanceof Error?d.message:String(d);await Et.trackBackupError(s,f,`Backup export failed: ${p}`)}}n(dv,"runBackup");async function Xq(e,t){let r=e.appId,a=e.import.backupId,o=e.import.nameForBackup,s=e.import.createdBy,i=X.tenancy.getTenantIDFromWorkspaceID(r),l=X.db.getDevWorkspaceID(r);return X.context.doInWorkspaceContext(l,async()=>{let d=`${l}_temp_${Date.now()}`,{rev:f}=await Et.updateRestoreStatus(e.docId,e.docRev,Kt.BackupStatus.STARTED);await dv(Kt.BackupTrigger.RESTORING,i,r,{processing:t,createdBy:s,name:o});let p=await Et.downloadWorkspaceBackup(a),m=Kt.BackupStatus.COMPLETE,h=null;try{await t.importWorkspaceFn(l,X.db.getDB(d),{file:{type:"application/gzip",path:p},key:p},{objectStoreAppId:d,preserveLiteLLMConfig:!0}),h=await Yq(d,l),await zq(l),await new X.db.Replication({source:d,target:l}).replicate();try{await Zq(h.sourceFileKeys,h.targetFileKeys,l)}catch(b){console.log("Failed to cleanup promoted restore files:",b)}}catch(b){if(h)try{await cv(h.targetFileKeys,h.rollbackFiles)}catch(S){console.log("Failed to rollback promoted restore files:",S)}X.logging.logAlert("App restore error",b),m=Kt.BackupStatus.FAILED;let T=b instanceof Error?b.message:String(b);await Et.trackBackupError(r,a,`Backup restore failed: ${T}`)}finally{try{await X.db.getDB(d,{skip_setup:!0}).destroy()}catch{}try{await Jq(d)}catch{}}await Et.updateRestoreStatus(e.docId,f,m),Da.default.existsSync(p)&&Da.default.rmSync(p,{force:!0})})}n(Xq,"importProcessor");async function eL(e,t){let r=e.appId,a=e.export.trigger,o=e.export.name,s=X.tenancy.getTenantIDFromWorkspaceID(r);await X.tenancy.doInTenant(s,async()=>{try{let{rev:i}=await Et.updateBackupStatus(e.docId,Kt.BackupStatus.STARTED);return dv(a,s,r,{processing:t,doc:{id:e.docId,rev:i},name:o})}catch(i){X.logging.logAlert("App backup error",i);let l=i instanceof Error?i.message:String(i);await Et.trackBackupError(r,e.docId,`Backup export failed: ${l}`)}})}n(eL,"exportProcessor");var tL=n(async e=>{rv(),await wu(e.processing),!xu.env.isTest()&&!xu.env.MULTI_TENANCY&&await Iu()},"init"),Zn={...Et,processing:Su,init:tL,getBackupQueue:Nr};var pv=n(async e=>{e.backups&&await Zn.init(e.backups)},"init");var Ks={};H(Ks,{create:()=>QW,find:()=>KW,get:()=>HW,handleDisable:()=>ZW,remove:()=>JW,update:()=>zW});var NT=Re(yc()),bt=require("@budibase/backend-core");var UT=require("@budibase/types");async function HW(e){let t=bt.tenancy.getGlobalDB(),r=new bt.db.QueryBuilder(t.name,UT.SearchIndex.USER);r.setIndexBuilder(bt.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(HW,"get");async function KW(e){return await bt.users.getById(e)}n(KW,"find");async function QW(e){let t=await Vt.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new bt.HTTPError("User is already synched",409);e={...t,scimInfo:(0,NT.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await Vt.save(e,{requirePassword:!1})}n(QW,"create");async function zW(e,t){return await Vt.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}n(zW,"update");async function JW(e){return await Vt.destroy(e)}n(JW,"remove");async function YW(){return(await bt.users.getAllUsers()).filter(t=>t.scimInfo?.isSync)}n(YW,"getAllSCIMUsers");async function ZW(e){let t=await YW();if(t.length)switch(e){case"remove":await bt.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 bt.utils.hash(crypto.randomUUID()),o}));await bt.users.bulkUpdateGlobalUsers(r);break}}}n(ZW,"handleDisable");var Qs={};H(Qs,{create:()=>XW});var qT=Re(yc());var LT=require("@budibase/backend-core");async function XW(e){let t=await Fi(e.name),r;if(!t)r=(await Wt.save(e)).id;else{if(t.scimInfo?.isSync)throw new LT.HTTPError("Group is already synched",409);r=t._id,t.users.length&&await Wt.removeUsers(r,t.users.map(o=>o._id)),t.scimInfo=(0,qT.default)(t.scimInfo,e.scimInfo),await Wt.save(t)}return await Wt.get(r)}n(XW,"create");var Xr={};H(Xr,{logRequest:()=>r3,logResponse:()=>a3});var Qt=require("@budibase/backend-core"),FT=Re(jT());var{DocWritethrough:e3}=Qt.cache.docWritethrough;function t3(){return`${Qt.db.DocumentType.SCIM_LOG}${Qt.db.SEPARATOR}${(0,FT.default)().format("YYYYMMDD")}`}n(t3,"getLogDocId");var BT=n(()=>{let e=Qt.context.getScimDBName();return new e3(Qt.db.getDB(e),t3())},"getDB");async function r3(e){Qt.logging.logWarn("SCIM request log",e);let t=Date.now().toString();return await BT().patch({[`${t}_request`]:{ts:new Date().toISOString(),...e}}),t}n(r3,"logRequest");async function a3(e,t){Qt.logging.logWarn("SCIM response",t),await BT().patch({[`${e}_response`]:{ts:new Date().toISOString(),...t}})}n(a3,"logResponse");var _c={};H(_c,{doInScimContext:()=>i3,feature:()=>Ic,internalGroupOnly:()=>d3,licenseAuth:()=>xc,licensing:()=>GT,requireSCIM:()=>l3,scimGroupOnly:()=>c3,scimUserOnly:()=>u3});var Ur=require("@budibase/backend-core");var zs=require("@budibase/types");var n3=n((e={checkUsersLimit:!0})=>async(t,r)=>{if((e.licensingCheck?e.licensingCheck:()=>!!t.user)(t)){if(Ur.env.SELF_HOSTED&&Ur.env.DEFAULT_LICENSE)return t.user.license=Bi,r();t.user.license=await ar.cache.getCachedLicense(),e.checkUsersLimit&&(Ur.utils.isServingApp(t)||Ur.utils.isServingBuilder(t)||Ur.utils.isServingBuilderPreview(t)||Ur.utils.isPublicApiRequest(t))&&await ir.usageLimitIsExceeded({name:zs.StaticQuotaName.USERS,type:zs.QuotaUsageType.STATIC,usageChange:0})}return r()},"licensing"),GT=n3;var Ic={};H(Ic,{requireFeature:()=>o3,requireFeatures:()=>s3});var o3=n(e=>async(t,r)=>{await cs(e),await r()},"requireFeature"),s3=n((...e)=>async(t,r)=>{await Fl(e),await r()},"requireFeatures");var Js=require("@budibase/backend-core");var i3=n(async(e,t)=>{let r;return Js.env.ENABLE_SCIM_LOGGER&&(r=await Xr.logRequest({...e.request.toJSON(),body:e.request.body})),await Js.context.doInScimContext(async()=>{let a=await t();return r&&await Xr.logResponse(r,{...e.response.toJSON(),body:e.response.body}),a})},"doInScimContext");var l3=n(async(e,t)=>{await Wl(),await t()},"requireSCIM");var $T=require("@budibase/backend-core");var u3=n(e=>Tc($T.users.getById,e,!0),"scimUserOnly"),c3=n(e=>Tc(ue.get,e,!0),"scimGroupOnly"),d3=n(e=>Tc(ue.get,e,!1),"internalGroupOnly");function Tc(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(Tc,"scimSyncChecks");var ea=require("@budibase/backend-core");var Sc=require("dd-trace");async function xc(e,t){await Sc.tracer.trace("licenseAuth",async r=>{let a=e.request.headers[ea.constants.Header.LICENSE_KEY]||ea.utils.getBearerToken(e);Array.isArray(a)&&(a=a[0]),a||e.throw(403,"License key not provided");let o=await Dl(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 ea.context.doInSelfHostTenantUsingCloud(o.tenantId,async()=>{await ea.context.doInLicenseContext(o,async()=>{await t()})})})}n(xc,"default");var Mc={};H(Mc,{group:()=>Ac,user:()=>Ec});var Ec={};H(Ec,{fromScimUser:()=>h3,toScimUserResponse:()=>f3,userFilters:()=>y3});var WT=require("@budibase/backend-core"),VT=require("@budibase/shared-core"),Ys=require("@budibase/types"),HT=require("scim2-parse-filter");var{unreachable:p3}=VT.utils,f3=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===Ys.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"),m3=n(e=>!!e?.id,"isScimUserResponse");function g3(e){if(WT.utils.validEmail(e.userName))return e.userName;if(e.emails)return e.emails.find(t=>t.primary)?.value||e.emails[0]?.value}n(g3,"tryGetEmail");var h3=n((e,t={})=>{let r=m3(e)?e:void 0,a=g3(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:p3(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?Ys.UserStatus.ACTIVE:Ys.UserStatus.INACTIVE,createdAt:r?.meta.created.getTime(),updatedAt:r?.meta.lastModified.toISOString()}},"fromScimUser"),y3=n(e=>{let t={equal:{}},r=(0,HT.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 Ac={};H(Ac,{fromScimGroup:()=>w3,toScimGroupResponse:()=>v3});var v3=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"),b3=n(e=>!!e?.id,"isScimGroup"),w3=n(e=>{let t=b3(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 Gd={};H(Gd,{LLMRequest:()=>rt,TableGeneration:()=>Bd,agentHistoryTitleSystemPrompt:()=>YJ,agentSystemPrompt:()=>JJ,aiColumnSchemas:()=>jd,aiTableResponseToTableSchema:()=>Nd,appendAIColumns:()=>Ud,classifyText:()=>LJ,cleanData:()=>jJ,composeAutomationAgentSystemPrompt:()=>HJ,composeAutomationAgentToolGuidelines:()=>KJ,generateAIColumns:()=>kd,generateCronExpression:()=>FJ,generateData:()=>Dd,generateJs:()=>VJ,generateOperationInstructionsPrompt:()=>BJ,generateTables:()=>Pd,generationStructure:()=>Ld,normalizeContentType:()=>eY,parseResponseFormat:()=>LM,sanitiseToolName:()=>XJ,searchWeb:()=>WJ,sentimentAnalysis:()=>$J,summarizeText:()=>qJ,tableDataStructuredOutput:()=>Fd,translate:()=>GJ});var vi=require("@budibase/backend-core"),BM=require("@budibase/shared-core");var SS="vercel.ai.error",I3=Symbol.for(SS),KT,QT,O=class xS extends(QT=Error,KT=I3,QT){static{n(this,"_AISDKError")}constructor({name:t,message:r,cause:a}){super(r),this[KT]=!0,this.name=t,this.cause=a}static isInstance(t){return xS.hasMarker(t,SS)}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}},_S="AI_APICallError",ES=`vercel.ai.error.${_S}`,T3=Symbol.for(ES),zT,JT,le=class extends(JT=O,zT=T3,JT){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:d}){super({name:_S,message:e,cause:i}),this[zT]=!0,this.url=t,this.requestBodyValues=r,this.statusCode=a,this.responseHeaders=o,this.responseBody=s,this.isRetryable=l,this.data=d}static isInstance(e){return O.hasMarker(e,ES)}},AS="AI_EmptyResponseBodyError",MS=`vercel.ai.error.${AS}`,S3=Symbol.for(MS),YT,ZT,RS=class extends(ZT=O,YT=S3,ZT){static{n(this,"EmptyResponseBodyError")}constructor({message:e="Empty response body"}={}){super({name:AS,message:e}),this[YT]=!0}static isInstance(e){return O.hasMarker(e,MS)}};function Z(e){return e==null?"unknown error":typeof e=="string"?e:e instanceof Error?e.toString():JSON.stringify(e)}n(Z,"getErrorMessage");var CS="AI_InvalidArgumentError",OS=`vercel.ai.error.${CS}`,x3=Symbol.for(OS),XT,eS,PS=class extends(eS=O,XT=x3,eS){static{n(this,"InvalidArgumentError")}constructor({message:e,cause:t,argument:r}){super({name:CS,message:e,cause:t}),this[XT]=!0,this.argument=r}static isInstance(e){return O.hasMarker(e,OS)}},kS="AI_InvalidPromptError",DS=`vercel.ai.error.${kS}`,_3=Symbol.for(DS),tS,rS,qr=class extends(rS=O,tS=_3,rS){static{n(this,"InvalidPromptError")}constructor({prompt:e,message:t,cause:r}){super({name:kS,message:`Invalid prompt: ${t}`,cause:r}),this[tS]=!0,this.prompt=e}static isInstance(e){return O.hasMarker(e,DS)}},NS="AI_InvalidResponseDataError",US=`vercel.ai.error.${NS}`,E3=Symbol.for(US),aS,nS,vse=class extends(nS=O,aS=E3,nS){static{n(this,"InvalidResponseDataError")}constructor({data:e,message:t=`Invalid response data: ${JSON.stringify(e)}.`}){super({name:NS,message:t}),this[aS]=!0,this.data=e}static isInstance(e){return O.hasMarker(e,US)}},qS="AI_JSONParseError",LS=`vercel.ai.error.${qS}`,A3=Symbol.for(LS),oS,sS,ro=class extends(sS=O,oS=A3,sS){static{n(this,"JSONParseError")}constructor({text:e,cause:t}){super({name:qS,message:`JSON parsing failed: Text: ${e}.
|
|
49
49
|
Error message: ${Z(t)}`,cause:t}),this[oS]=!0,this.text=e}static isInstance(e){return O.hasMarker(e,LS)}},jS="AI_LoadAPIKeyError",FS=`vercel.ai.error.${jS}`,M3=Symbol.for(FS),iS,lS,bse=class extends(lS=O,iS=M3,lS){static{n(this,"LoadAPIKeyError")}constructor({message:e}){super({name:jS,message:e}),this[iS]=!0}static isInstance(e){return O.hasMarker(e,FS)}},BS="AI_LoadSettingError",GS=`vercel.ai.error.${BS}`,R3=Symbol.for(GS),uS,cS,wse=class extends(cS=O,uS=R3,cS){static{n(this,"LoadSettingError")}constructor({message:e}){super({name:BS,message:e}),this[uS]=!0}static isInstance(e){return O.hasMarker(e,GS)}},$S="AI_NoContentGeneratedError",WS=`vercel.ai.error.${$S}`,C3=Symbol.for(WS),dS,pS,Ise=class extends(pS=O,dS=C3,pS){static{n(this,"NoContentGeneratedError")}constructor({message:e="No content generated."}={}){super({name:$S,message:e}),this[dS]=!0}static isInstance(e){return O.hasMarker(e,WS)}},VS="AI_NoSuchModelError",HS=`vercel.ai.error.${VS}`,O3=Symbol.for(HS),fS,mS,Tse=class extends(mS=O,fS=O3,mS){static{n(this,"NoSuchModelError")}constructor({errorName:e=VS,modelId:t,modelType:r,message:a=`No such ${r}: ${t}`}){super({name:e,message:a}),this[fS]=!0,this.modelId=t,this.modelType=r}static isInstance(e){return O.hasMarker(e,HS)}},KS="AI_NoSuchProviderReferenceError",QS=`vercel.ai.error.${KS}`,P3=Symbol.for(QS),gS,hS,Sse=class extends(hS=O,gS=P3,hS){static{n(this,"NoSuchProviderReferenceError")}constructor({provider:e,reference:t,message:r=`No provider reference found for provider '${e}'. Available providers: ${Object.keys(t).join(", ")}`}){super({name:KS,message:r}),this[gS]=!0,this.provider=e,this.reference=t}static isInstance(e){return O.hasMarker(e,QS)}},zS="AI_TooManyEmbeddingValuesForCallError",JS=`vercel.ai.error.${zS}`,k3=Symbol.for(JS),yS,vS,xse=class extends(vS=O,yS=k3,vS){static{n(this,"TooManyEmbeddingValuesForCallError")}constructor(e){super({name:zS,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[yS]=!0,this.provider=e.provider,this.modelId=e.modelId,this.maxEmbeddingsPerCall=e.maxEmbeddingsPerCall,this.values=e.values}static isInstance(e){return O.hasMarker(e,JS)}},YS="AI_TypeValidationError",ZS=`vercel.ai.error.${YS}`,D3=Symbol.for(ZS),bS,wS,zt=class Rc extends(wS=O,bS=D3,wS){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:YS,message:`${o}: Value: ${JSON.stringify(t)}.
|
|
50
50
|
Error message: ${Z(r)}`,cause:r}),this[bS]=!0,this.value=t,this.context=a}static isInstance(t){return O.hasMarker(t,ZS)}static wrap({value:t,cause:r,context:a}){var o,s,i;return Rc.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 Rc({value:t,cause:r,context:a})}},XS="AI_UnsupportedFunctionalityError",ex=`vercel.ai.error.${XS}`,N3=Symbol.for(ex),IS,TS,_se=class extends(TS=O,IS=N3,TS){static{n(this,"UnsupportedFunctionalityError")}constructor({functionality:e,message:t=`'${e}' functionality not supported.`}){super({name:XS,message:t}),this[IS]=!0,this.functionality=e}static isInstance(e){return O.hasMarker(e,ex)}};var Ux=require("zod/v4"),qx=require("zod/v4/core");var ao=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}},tx=10,U3=13,ta=32;function Cc(e){}n(Cc,"noop");function nx(e){if(typeof e=="function")throw new TypeError("`config` must be an object, got a function instead. Did you mean `createParser({onEvent: fn})`?");let{onEvent:t=Cc,onError:r=Cc,onRetry:a=Cc,onComment:o,maxBufferSize:s}=e,i=[],l=0,d=!0,f,p="",m=0,h,b=!1;function T(M){if(b)throw new Error("Cannot feed parser: it was terminated after exceeding the configured max buffer size. Call `reset()` to resume parsing.");if(d&&(d=!1,M.charCodeAt(0)===239&&M.charCodeAt(1)===187&&M.charCodeAt(2)===191&&(M=M.slice(3))),i.length===0){let I=k(M);I!==""&&(i.push(I),l=I.length),S();return}if(M.indexOf(`
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"dist"
|
|
5
5
|
],
|
|
6
6
|
"license": "UNLICENSED",
|
|
7
|
-
"version": "v3.
|
|
7
|
+
"version": "v3.46.0",
|
|
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": "
|
|
69
|
+
"gitHead": "1444a702ce29cf158b10c31d3f205fc84c463169"
|
|
70
70
|
}
|