@budibase/pro 3.31.0 → 3.31.1
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
|
@@ -35,7 +35,7 @@ l2HXiAD1Q2rlHNW9wDaYyKb1F5f+v4RyqCAyzlkwRdksmkLeECTboojNnmRCrE3C
|
|
|
35
35
|
d/o3ZWE1TTj1zYwlCLN5qRKr3hU8nC3xEYNEbkB9SfTRaOq9Q7P8WmfLkoCPm3pR
|
|
36
36
|
mwIDAQAB
|
|
37
37
|
-----END PUBLIC KEY-----
|
|
38
|
-
`;function hn(e){return Hi.default.verify(e,$0,{algorithms:["RS256"]})}n(hn,"verifyLicenseToken");function G0(e,t){return Hi.default.sign(t,e,{encoding:"utf-8",algorithm:"RS256"})}n(G0,"sign");var Do={};L(Do,{getOfflineFeatures:()=>Ji});var v=require("@budibase/types");var W0={[v.PlanType.FREE]:[...At.SELF_FREE_LICENSE.features],[v.PlanType.PREMIUM]:[v.Feature.WORKSPACE_BACKUPS,v.Feature.BRANDING,v.Feature.VIEW_PERMISSIONS,v.Feature.PDF],[v.PlanType.PREMIUM_PLUS]:[v.Feature.WORKSPACE_BACKUPS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PDF,v.Feature.BUDIBASE_AI],[v.PlanType.PREMIUM_PLUS_TRIAL]:[v.Feature.WORKSPACE_BACKUPS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PDF,v.Feature.BUDIBASE_AI],[v.PlanType.PRO]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS],[v.PlanType.TEAM]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS],[v.PlanType.BUSINESS]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.AUDIT_LOGS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.EXPANDED_PUBLIC_API,v.Feature.VIEW_PERMISSIONS,v.Feature.PDF,v.Feature.BUDIBASE_AI],[v.PlanType.ENTERPRISE_BASIC]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.ENFORCEABLE_SSO,v.Feature.AUDIT_LOGS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.OFFLINE,v.Feature.EXPANDED_PUBLIC_API,v.Feature.WORKSPACE_IMPORT_EXPORT,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.SCIM,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PWA,v.Feature.CUSTOM_APP_SCRIPTS,v.Feature.PDF,v.Feature.BUDIBASE_AI,v.Feature.RECAPTCHA,v.Feature.PKCE_OIDC,v.Feature.TRANSLATIONS],[v.PlanType.ENTERPRISE_BASIC_TRIAL]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.ENFORCEABLE_SSO,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.EXPANDED_PUBLIC_API,v.Feature.WORKSPACE_IMPORT_EXPORT,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.SCIM,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PWA,v.Feature.CUSTOM_APP_SCRIPTS,v.Feature.PDF,v.Feature.BUDIBASE_AI,v.Feature.RECAPTCHA,v.Feature.PKCE_OIDC,v.Feature.TRANSLATIONS],[v.PlanType.ENTERPRISE]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.ENFORCEABLE_SSO,v.Feature.AUDIT_LOGS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.OFFLINE,v.Feature.EXPANDED_PUBLIC_API,v.Feature.WORKSPACE_IMPORT_EXPORT,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.SCIM,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PWA,v.Feature.CUSTOM_APP_SCRIPTS,v.Feature.PDF,v.Feature.BUDIBASE_AI,v.Feature.RECAPTCHA,v.Feature.PKCE_OIDC,v.Feature.TRANSLATIONS]};function Ji(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(W0)}n(Ji,"getOfflineFeatures");var qo={};L(qo,{UNLIMITED:()=>g,getQuotas:()=>Qi});var ye=require("@budibase/types");var f=ar,kd=At,g=-1,_t=n(e=>e*1e6,"millions"),V0={[ye.PlanType.FREE]:{...kd.CLOUD_FREE_LICENSE.quotas},[ye.PlanType.PREMIUM]:{usage:{monthly:{...f.queries(g),...f.automations(1e3),...f.budibaseAICredits(0),...f.actions(g)},static:{...f.rows(1e4),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(0),...f.plugins(g),...f.customAIConfigurations(0)}},constant:{...f.automationLogRetentionDays(7),...f.appBackupRetentionDays(7)}},[ye.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...f.queries(g),...f.automations(5e3),...f.budibaseAICredits(_t(2)),...f.actions(g)},static:{...f.rows(25e3),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(0),...f.plugins(g),...f.customAIConfigurations(1)}},constant:{...f.automationLogRetentionDays(30),...f.appBackupRetentionDays(30)}},[ye.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...f.queries(g),...f.automations(5e3),...f.budibaseAICredits(_t(2)),...f.actions(g)},static:{...f.rows(25e3),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(0),...f.plugins(g),...f.customAIConfigurations(1)}},constant:{...f.automationLogRetentionDays(30),...f.appBackupRetentionDays(30)}},[ye.PlanType.PRO]:{usage:{monthly:{...f.queries(g),...f.automations(1e3),...f.budibaseAICredits(_t(2)),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(5),...f.plugins(g),...f.customAIConfigurations(0)}},constant:{...f.automationLogRetentionDays(7),...f.appBackupRetentionDays(7)}},[ye.PlanType.TEAM]:{usage:{monthly:{...f.queries(g),...f.automations(5e3),...f.budibaseAICredits(0),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(10),...f.plugins(g),...f.customAIConfigurations(0)}},constant:{...f.automationLogRetentionDays(30),...f.appBackupRetentionDays(90)}},[ye.PlanType.BUSINESS]:{usage:{monthly:{...f.queries(g),...f.automations(1e4),...f.budibaseAICredits(_t(2)),...f.actions(g)},static:{...f.rows(5e4),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(50),...f.plugins(g),...f.customAIConfigurations(0)}},constant:{...f.automationLogRetentionDays(365),...f.appBackupRetentionDays(365)}},[ye.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...f.queries(g),...f.automations(g),...f.budibaseAICredits(_t(4)),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(g),...f.plugins(g),...f.customAIConfigurations(g)}},constant:{...f.automationLogRetentionDays(g),...f.appBackupRetentionDays(g)}},[ye.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...f.queries(g),...f.automations(g),...f.budibaseAICredits(_t(4)),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(g),...f.plugins(g),...f.customAIConfigurations(g)}},constant:{...f.automationLogRetentionDays(15),...f.appBackupRetentionDays(15)}},[ye.PlanType.ENTERPRISE]:{usage:{monthly:{...f.queries(g),...f.automations(g),...f.budibaseAICredits(_t(4)),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(g),...f.plugins(g),...f.customAIConfigurations(g)}},constant:{...f.automationLogRetentionDays(g),...f.appBackupRetentionDays(g)}}},K0={[ye.PlanType.FREE]:{...kd.SELF_FREE_LICENSE.quotas},[ye.PlanType.PREMIUM]:void 0,[ye.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...f.queries(g),...f.automations(g),...f.budibaseAICredits(_t(2)),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(0),...f.plugins(g),...f.customAIConfigurations(1)}},constant:{...f.automationLogRetentionDays(30),...f.appBackupRetentionDays(30)}},[ye.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...f.queries(g),...f.automations(g),...f.budibaseAICredits(_t(2)),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(0),...f.plugins(g),...f.customAIConfigurations(1)}},constant:{...f.automationLogRetentionDays(30),...f.appBackupRetentionDays(30)}},[ye.PlanType.PRO]:{usage:{monthly:{...f.queries(g),...f.automations(g),...f.budibaseAICredits(0),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(5),...f.plugins(g),...f.customAIConfigurations(0)}},constant:{...f.automationLogRetentionDays(7),...f.appBackupRetentionDays(7)}},[ye.PlanType.TEAM]:{usage:{monthly:{...f.queries(g),...f.automations(g),...f.budibaseAICredits(0),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(10),...f.plugins(g),...f.customAIConfigurations(0)}},constant:{...f.automationLogRetentionDays(30),...f.appBackupRetentionDays(90)}},[ye.PlanType.BUSINESS]:{usage:{monthly:{...f.queries(g),...f.automations(g),...f.budibaseAICredits(0),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(50),...f.plugins(g),...f.customAIConfigurations(0)}},constant:{...f.automationLogRetentionDays(90),...f.appBackupRetentionDays(365)}},[ye.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...f.queries(g),...f.automations(g),...f.budibaseAICredits(_t(4)),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(g),...f.plugins(g),...f.customAIConfigurations(g)}},constant:{...f.automationLogRetentionDays(g),...f.appBackupRetentionDays(g)}},[ye.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...f.queries(g),...f.automations(g),...f.budibaseAICredits(_t(4)),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(g),...f.plugins(g),...f.customAIConfigurations(g)}},constant:{...f.automationLogRetentionDays(15),...f.appBackupRetentionDays(15)}},[ye.PlanType.ENTERPRISE]:{usage:{monthly:{...f.queries(g),...f.automations(g),...f.budibaseAICredits(_t(4)),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(g),...f.plugins(g),...f.customAIConfigurations(g)}},constant:{...f.automationLogRetentionDays(g),...f.appBackupRetentionDays(g)}}};function Qi(e,t){let r;function a(o){let s=o[t];if(!s)throw new Error(`Quotas do not exist for planType=${t} and hosting=${e}`);return s}switch(n(a,"readQuotas"),e){case ye.Hosting.SELF:r=a(K0);break;case ye.Hosting.CLOUD:r=a(V0);break}return JSON.parse(JSON.stringify(r))}n(Qi,"getQuotas");var Lo={};L(Lo,{encoding:()=>sa,workspaceExists:()=>H0});var Nd=require("@budibase/backend-core");async function H0(e){return(await Nd.db.getAllWorkspaces({all:!0,idsOnly:!0})).includes(e)}n(H0,"workspaceExists");var sa={};L(sa,{base64ToObject:()=>Q0,objectToBase64:()=>J0});function J0(e){let t=JSON.stringify(e);return Buffer.from(t).toString("base64")}n(J0,"objectToBase64");function Q0(e){let t=Buffer.from(e,"base64").toString();return JSON.parse(t)}n(Q0,"base64ToObject");var bh=require("@budibase/types"),va=require("@budibase/backend-core"),wh=ue(Ym()),Ih=ue(Tu());async function _N(e){await dt.save({offlineLicenseToken:e}),await Lr()}n(_N,"activateOfflineLicenseToken");async function SN(){await dt.save({offlineLicenseToken:void 0}),await Lr()}n(SN,"deleteOfflineLicenseToken");async function Th(){return(await dt.get()).offlineLicenseToken}n(Th,"getOfflineLicenseToken");async function Au(){let t=(await va.installation.getInstall()).installId,r=va.context.getTenantId(),a=await va.events.identification.getUniqueTenantId(r);return{installId:t,tenantId:a}}n(Au,"getIdentifier");async function xN(){let e=await Au();return sa.objectToBase64(e)}n(xN,"getIdentifierBase64");function EN(e){return sa.base64ToObject(e)}n(EN,"getIdentifierFromBase64");function Ah(e){let t=Date.now(),r=new Date(e.expireAt).getTime();if(t>r)throw new Error(`Offline license has expired. expireAt=${e.expireAt}`)}n(Ah,"verifyExpiry");async function _h(e){let t=await Au();if(e.identifier.installId!==t.installId||e.identifier.tenantId!==t.tenantId)throw new Error("Invalid offline license")}n(_h,"verifyInstallation");function Sh(e){let t=e.plan.type,r=bh.Hosting.SELF,a=Ji(t),o=Qi(r,t);return e.features=(0,wh.default)(e.features,a),e.quotas=(0,Ih.default)(e.quotas,o),e}n(Sh,"enrichLicense");async function _u(){try{let e=await Th();if(e){let t=await hn(e);return Ah(t),await _h(t),Sh(t)}}catch(e){console.error("Error retrieving offline license",e)}}n(_u,"getOfflineLicense");var qn={};L(qn,{deleteDevLicense:()=>MN,getOfflineLicense:()=>CN,writeDevLicenseToDisk:()=>PN});var xh=require("@budibase/backend-core"),xu=require("path"),Eh=require("os"),Ur=ue(require("fs"));var RN=xh.env.isTest()?".budibase-test":".budibase",Su=(0,xu.join)((0,Eh.tmpdir)(),RN),ON="dev_license.txt",Dn=(0,xu.join)(Su,ON);if(!Ur.default.existsSync(Su))try{Ur.default.mkdirSync(Su)}catch{}function CN(){try{if(Ur.default.existsSync(Dn)){let e=Ur.default.readFileSync(Dn,{encoding:"utf-8"});return hn(e)}}catch(e){console.error("Error retrieving offline license from disk",e)}}n(CN,"getOfflineLicense");function PN(e){console.log(`Writing license to: ${Dn}`),Ur.default.writeFileSync(Dn,e,{encoding:"utf-8"})}n(PN,"writeDevLicenseToDisk");function MN(){Ur.default.rmSync(Dn,{force:!0})}n(MN,"deleteDevLicense");var Rh=require("dd-trace");var Ru=n(async()=>await Rh.tracer.trace("getLicense",async e=>{if(Eu.env.OFFLINE_MODE)return e.addTags({offline:!0}),_u();let t=await oa();return t||(e.addTags({offlineFallback:!0}),t=qn.getOfflineLicense()),t}),"getLicense"),Ou=n(e=>Vi(e),"getLicenseFromKey"),Cu=n(()=>Eu.env.SELF_HOSTED?At.SELF_FREE_LICENSE:At.CLOUD_FREE_LICENSE,"getFreeLicense");var Mu={};L(Mu,{activateLicenseKey:()=>kN,deleteLicenseKey:()=>NN,getLicenseKey:()=>es});var Pu=ue(require("dd-trace"));async function kN(e){await Ki(e),await dt.save({licenseKey:e}),await Lr()}n(kN,"activateLicenseKey");async function es(){return await Pu.default.trace("getLicenseKey",async e=>{let t=await dt.get();return e.addTags({licenseKey:t.licenseKey}),t.licenseKey})}n(es,"getLicenseKey");async function NN(){return await Pu.default.trace("deleteLicenseKey",async()=>{await dt.save({licenseKey:void 0}),await Lr()})}n(NN,"deleteLicenseKey");var ts=require("@budibase/backend-core");var Ln,qN=n(async()=>{Ln=await ts.RedisClient.init(ts.redis.utils.Databases.LICENSES)},"init"),LN=n(async()=>{Ln&&await Ln.finish()},"shutdown");process.on("exit",async()=>{await LN()});var rs=n(async()=>(Ln||await qN(),Ln),"getClient");var Ch=require("@budibase/shared-core");var Nu=gt.Duration.fromHours(1).toSeconds(),Ph=gt.Duration.fromHours(1).toSeconds(),FN=Nu+Ph,Lr=n(async()=>{await Nh(),await kh()},"refresh"),Oh=n(async e=>{let{result:t}=await gt.locks.doWithLock({type:ns.LockType.DEFAULT,name:ns.LockName.SYNC_ACCOUNT_LICENSE,resource:e,ttl:gt.Duration.fromSeconds(10).toMs()},async()=>{let r=await rs(),a=await r.get(e);if(a&&!Mh(a))return a;let o=await as.default.trace("populateLicense",async()=>await Ru());return o||(o=as.default.trace("populateFreeLicense",()=>Cu())),o.refreshedAt=new Date().toISOString(),await r.store(e,o,FN),o});return t},"populateAndStoreLicense"),Mh=n(e=>{let t=e.refreshedAt?Date.parse(e.refreshedAt):0;return Date.now()-t>=Nu*1e3},"shouldRefreshLicense"),ku=n(async()=>await as.default.trace("getCachedLicense",async e=>{let t=gt.context.getLicense();if(t)return e.addTags({foundInContext:!0,features:t.features,plan:t.plan,quotas:t.quotas}),t;let r=gt.tenancy.getTenantId(),o=await(await rs()).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}),Mh(o)&&Oh(r).catch(()=>{}),o):(o=await Ch.helpers.retry(()=>Oh(r)),e.addTags({refreshedAt:o.refreshedAt,features:o.features,plan:o.plan,quotas:o.quotas,expirySeconds:Nu,staleGraceSeconds:Ph}),o)}),"_getCachedLicense");gt.env.isJest()&&(ku=jest.fn().mockImplementation(ku));var kh=ku,Nh=n(async()=>{let e=gt.tenancy.getTenantId();await(await rs()).delete(e)},"invalidate");async function Oe(e,t){Array.isArray(e)||(e=[e]),t||(t=await Ct.getCachedLicense());for(let r of e)if(!t?.features.includes(r))return!1;return!0}n(Oe,"areFeaturesEnabled");async function os(e,t){if(!await Oe(e,t))throw new nr.FeatureDisabledWarning(e)}n(os,"checkFeature");async function Du(e,t){if(!await Oe(e,t)){let r=e.join(", ");throw new nr.FeatureDisabledWarning(r)}}n(Du,"checkFeatures");function Qe(e){return async(...t)=>(await os(Se.Feature.WORKSPACE_BACKUPS),e(...t))}n(Qe,"checkBackups");async function qu(){return Oe(Se.Feature.WORKSPACE_BACKUPS)}n(qu,"isBackupsEnabled");async function Lu(){return Oe(Se.Feature.BRANDING)}n(Lu,"isBrandingEnabled");async function Dh(){return Oe(Se.Feature.ENFORCEABLE_SSO)}n(Dh,"isEnforceableSSO");async function BN(){return Oe(Se.Feature.SYNC_AUTOMATIONS)}n(BN,"isSyncAutomationsEnabled");async function jN(){return Oe(Se.Feature.TRIGGER_AUTOMATION_RUN)}n(jN,"isTriggerAutomationRunEnabled");async function ss(){return Oe(Se.Feature.AUDIT_LOGS)}n(ss,"isAuditLogsEnabled");async function Uu(){return Oe(Se.Feature.USER_GROUPS)}n(Uu,"isUserGroupsEnabled");function $N(){return Oe(Se.Feature.PWA)}n($N,"isPWAEnabled");function GN(){return Oe(Se.Feature.RECAPTCHA)}n(GN,"isRecaptchaEnabled");var WN=n(()=>Oe(Se.Feature.PKCE_OIDC),"isPkceOidcEnabled");async function VN(){return Oe(Se.Feature.TRANSLATIONS)}n(VN,"isTranslationsEnabled");async function ba(){return Oe(Se.Feature.EXPANDED_PUBLIC_API)}n(ba,"isExpandedPublicApiEnabled");async function KN(){return Oe(Se.Feature.WORKSPACE_IMPORT_EXPORT)}n(KN,"isWorkspaceImportExportEnabled");async function is(){return Oe([Se.Feature.EXPANDED_PUBLIC_API,Se.Feature.WORKSPACE_IMPORT_EXPORT])}n(is,"isWorkspaceImportExportPublicApiEnabled");async function HN(e){if(nr.env.ENABLE_SSO_MAINTENANCE_MODE||!await Dh())return!1;let r;return e?.config?r=e.config:r=await nr.configs.getSettingsConfig(),!!r.isSSOEnforced}n(HN,"isSSOEnforced");var Fu=n(async()=>{let e=Se.Feature.SCIM,t=await Oe(e),r=await nr.configs.getSCIMConfig();if(!t||!r?.enabled)throw new nr.FeatureDisabledWarning(e);return!0},"checkSCIM");async function JN(){return Oe(Se.Feature.VIEW_PERMISSIONS)}n(JN,"isViewPermissionEnabled");async function QN(){return Oe(Se.Feature.VIEW_READONLY_COLUMNS)}n(QN,"isViewReadonlyColumnsEnabled");var zN={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 YN(e){return await Lu()?{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}:zN}n(YN,"getBrandingConfig");var ju={};L(ju,{enrichAIConfig:()=>Bu});var qh=require("@budibase/backend-core");var ZN="budibase_ai";async function Bu(e){if(qh.env.SELF_HOSTED)return e;for(let t of Object.values(e.config))if(t.provider==="BudibaseAI")return e;return e.config[ZN]={provider:"BudibaseAI",active:!0,isDefault:Object.keys(e.config).every(t=>!e.config[t].isDefault),defaultModel:process.env.BUDIBASE_AI_DEFAULT_MODEL||"gpt-5-mini",name:"Budibase AI"},e}n(Bu,"enrichAIConfig");var Qt={};L(Qt,{addAction:()=>rD,addApp:()=>aD,addAutomation:()=>lD,addGroup:()=>Gu,addPlugin:()=>Vu,addRow:()=>oD,addRows:()=>iD,addUsers:()=>ds,bustCache:()=>qi,decrement:()=>or,decrementMany:()=>Un,getCurrentUsageValues:()=>sd,getLicensedQuota:()=>ls,getQuotaUsage:()=>kr,increment:()=>ht,incrementBudibaseAICredits:()=>hs,incrementMany:()=>Br,removeApp:()=>nD,removeGroup:()=>Wu,removePlugin:()=>Ku,removeRow:()=>sD,removeRows:()=>uD,removeUsers:()=>Aa,set:()=>Fn,setAllUsage:()=>Ui,setAppUsageValue:()=>Li,setBudibaseAICredits:()=>Bh,setUsage:()=>ad,setUsagePerApp:()=>nd,throwIfBudibaseAICreditsExceeded:()=>ys,updatePluginCount:()=>Hu,updateUsage:()=>wa,usageLimitIsExceeded:()=>$u,utils:()=>Qa});var cs=require("@budibase/types");var kt=require("@budibase/backend-core"),Ce=require("@budibase/types"),Fr=require("dd-trace");var ht=n(async(e,t,r)=>await Fr.tracer.trace("quotas.increment",async a=>(a.addTags({name:e,type:t}),await Lh({change:1,name:e,type:t,opts:r}))),"increment"),Br=n(e=>Fr.tracer.trace("quotas.incrementMany",async()=>Lh(e)),"incrementMany"),Lh=n(async e=>await Fr.tracer.trace("quotas.tryIncrement",async t=>{let r=Array.isArray(e)?e:[e];t.addTags({numActions:r.length}),await wa(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 Fr.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 wa(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"),or=n((e,t,r={})=>wa({usageChange:-1,name:e,type:t,opts:r}),"decrement"),Un=n(e=>{let t=Array.isArray(e)?e:[e];return wa(t.map(r=>({usageChange:-r.change,name:r.name,type:r.type,opts:r.opts})))},"decrementMany"),Fn=n(async(e,t,r)=>Tt.setUsage(r,e,t),"set"),XN=n((e,t,r)=>{if(e==Ce.QuotaUsageType.STATIC){let a=r.usageQuota.triggers;return a?a[t]||{}:{}}else{let a=Tt.utils.getCurrentMonthString(),o=r.monthly[a].triggers;return o?o[t]||{}:{}}},"getExistingTriggers"),eD=n(async(e,t,r,a)=>{try{await kt.locks.doWithLock({type:Ce.LockType.TRY_ONCE,name:Ce.LockName.TRIGGER_QUOTA,resource:e,ttl:1e4},async()=>{let o={percentage:r,name:t.name};a&&(o.resetDate=a),await Tr.triggerQuota(o)})}catch(o){kt.logging.logAlert("Error triggering quota",o)}},"triggerQuota"),tD=n(async(e,t,r,a)=>{let o=await kr(),s=e===Ce.QuotaUsageType.MONTHLY?o.quotaReset:void 0,i=await XN(e,t,o),u=a.triggers,l=r/a.value*100;l>100&&(l=100);for(let[c,d]of u.entries())if(l>=d&&a.value!==ar.UNLIMITED){if(!i[d]){i[d]=new Date().toISOString();let y=u[c+1]||100;(!(l>=y)||l===d)&&await eD(t,a,l,s)}}else i[d]=void 0;return i},"checkTriggers"),wa=n(async e=>{await Fr.tracer.trace("quotas.updateUsage",async t=>{let r=kt.tenancy.getTenantId(),a=Array.isArray(e)?e:[e];t.addTags({numActions:a.length,tenantId:r});let o,s,i=[],u={},l={},c={},d={};for(let y of a)await Fr.tracer.trace("quotas.updateUsage.action",async T=>{T.addTags({actionName:y.name,actionType:y.type,actionUsageChange:y.usageChange});try{o=kt.context.getWorkspaceId()}catch{}if(Ce.APP_QUOTA_NAMES.includes(y.name)&&!o)throw new Error("App context required for quota update");try{s=await ls(Ce.QuotaType.USAGE,y.name,y.type),i.push(s);let{total:w,app:O,breakdown:k}=await Tt.getCurrentUsageValues(y.type,y.name,y.opts?.id);w+=y.usageChange,O!=null&&(O+=y.usageChange),k!=null&&(k+=y.usageChange);let G={};if(y.opts?.dryRun||(G=await tD(y.type,y.name,w,s),d={...d,[y.name]:G}),s.value!==ar.UNLIMITED&&w>s.value&&y.usageChange>0)throw new kt.UsageLimitWarning(`${y.name}`);if(w=Math.max(0,w),O&&(O=Math.max(0,O)),k&&(k=Math.max(0,k),c={...c,[y.name]:k}),!y.opts?.dryRun){let ae=y.opts?.valueFn;ae&&(w=await ae(),O=w),u={...u,[y.name]:w},l={...l,[y.name]:O}}}catch(w){throw y.opts?.suppressErrorLog||console.error(`Error updating usage quotas for ${y.name}`,w),w}});let h=a.filter(y=>!y.opts?.dryRun).map(y=>({name:y.name,type:y.type,values:{total:u[y.name],app:l[y.name],breakdown:c[y.name],triggers:d[y.name]},opts:{...y.opts,tenantId:r}}));h.length>0&&await Tt.setAllUsage(h)})},"updateUsage"),ls=n(async(e,t,r)=>{let a=await Ct.getCachedLicense();if(!a){let o=kt.tenancy.getTenantId();throw new Error("License not found for tenant id "+o)}if(r&&(0,Ce.isStaticQuota)(e,r,t))return a.quotas[e][r][t];if(r&&(0,Ce.isMonthlyQuota)(e,r,t))return a.quotas[e][r][t];if((0,Ce.isConstantQuota)(e,t))return a.quotas[e][t];throw new Error("Invalid quota type")},"getLicensedQuota"),$u=n(async({name:e,type:t,usageChange:r})=>{try{return await wa({usageChange:r,name:e,type:t,opts:{dryRun:!0}}),!1}catch(a){if(a.code===Ce.APIWarningCode.USAGE_LIMIT_EXCEEDED)return!0;throw a}},"usageLimitIsExceeded");var rD=n(async e=>ht(cs.MonthlyQuotaName.ACTIONS,cs.QuotaUsageType.MONTHLY,{fn:e}),"addAction");var Uh=require("@budibase/backend-core"),Ia=require("@budibase/types");var Fh=n(async()=>{let e=await Uh.db.getAllWorkspaces({dev:!0});return e?e.length:0},"getDevAppsCount"),aD=n(async(e,{appId:t}={})=>ht(Ia.StaticQuotaName.WORKSPACES,Ia.QuotaUsageType.STATIC,{fn:e,valueFn:Fh,id:t}),"addApp"),nD=n(async({appId:e}={})=>or(Ia.StaticQuotaName.WORKSPACES,Ia.QuotaUsageType.STATIC,{valueFn:Fh,id:e}),"removeApp");var Ht=require("@budibase/types");var oD=n(async(e,{tableId:t}={})=>ht(Ht.StaticQuotaName.ROWS,Ht.QuotaUsageType.STATIC,{fn:e,id:t}),"addRow"),sD=n(async({tableId:e}={})=>or(Ht.StaticQuotaName.ROWS,Ht.QuotaUsageType.STATIC,{id:e}),"removeRow"),iD=n(async(e,t,{tableId:r}={})=>Br({change:e,name:Ht.StaticQuotaName.ROWS,type:Ht.QuotaUsageType.STATIC,opts:{fn:t,id:r}}),"addRows"),uD=n(async(e,{tableId:t}={})=>Un({change:e,name:Ht.StaticQuotaName.ROWS,type:Ht.QuotaUsageType.STATIC,opts:{id:t}}),"removeRows");var ps=require("@budibase/types");var lD=n(async(e,{automationId:t}={})=>ht(ps.MonthlyQuotaName.AUTOMATIONS,ps.QuotaUsageType.MONTHLY,{fn:e,id:t}),"addAutomation");var Ta=require("@budibase/types");var Gu=n(async e=>ht(Ta.StaticQuotaName.USER_GROUPS,Ta.QuotaUsageType.STATIC,{fn:e}),"addGroup"),Wu=n(async()=>or(Ta.StaticQuotaName.USER_GROUPS,Ta.QuotaUsageType.STATIC),"removeGroup");var xr=require("@budibase/types");var Vu=n(async e=>ht(xr.StaticQuotaName.PLUGINS,xr.QuotaUsageType.STATIC,{fn:e}),"addPlugin"),Ku=n(async()=>or(xr.StaticQuotaName.PLUGINS,xr.QuotaUsageType.STATIC),"removePlugin"),Hu=n(async e=>Fn(xr.StaticQuotaName.PLUGINS,xr.QuotaUsageType.STATIC,e),"updatePluginCount");var Jt=require("@budibase/types"),Bn=require("@budibase/backend-core");var ds=n(async(e,t,r)=>{let a=[{change:e,name:Jt.StaticQuotaName.USERS,type:Jt.QuotaUsageType.STATIC,opts:{fn:r,valueFn:Bn.users.getUserCount}}];t>0&&a.push({change:t,name:Jt.StaticQuotaName.CREATORS,type:Jt.QuotaUsageType.STATIC,opts:{valueFn:Bn.users.getCreatorCount}});let o=await Br(a);return await oa(),o},"addUsers"),Aa=n(async(e,t)=>{let r=[{change:e,name:Jt.StaticQuotaName.USERS,type:Jt.QuotaUsageType.STATIC,opts:{valueFn:Bn.users.getUserCount}}];t>0&&r.push({change:t,name:Jt.StaticQuotaName.CREATORS,type:Jt.QuotaUsageType.STATIC,opts:{valueFn:Bn.users.getCreatorCount}}),await Un(r),await oa()},"removeUsers");var at=require("@budibase/types");var Ju=require("@budibase/backend-core"),gs=require("@budibase/types");var fs=class extends Ju.HTTPError{static{n(this,"GroupNameUnavailableError")}constructor(t){super(`Group name "${t}" is unavailable`,409)}},ms=class extends Ju.HTTPError{static{n(this,"AICreditsExhaustedError")}constructor(){super("You have reached your Budibase AI Credits limit for this billing cycle.",402),this.code=gs.APIWarningCode.USAGE_LIMIT_EXCEEDED}getPublicError(){return{quota:gs.MonthlyQuotaName.BUDIBASE_AI_CREDITS}}};var hs=n(async e=>{try{return await Br({change:e,name:at.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:at.QuotaUsageType.MONTHLY})}catch(t){throw t.code===at.APIWarningCode.USAGE_LIMIT_EXCEEDED&&await cD().catch(()=>{}),t}},"incrementBudibaseAICredits"),cD=n(async()=>{let e=await ls(at.QuotaType.USAGE,at.MonthlyQuotaName.BUDIBASE_AI_CREDITS,at.QuotaUsageType.MONTHLY);e.value>=0&&await Bh(e.value)},"capBudibaseAICreditsAtLimit"),ys=n(async()=>{if(await $u({name:at.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:at.QuotaUsageType.MONTHLY,usageChange:1}))throw new ms},"throwIfBudibaseAICreditsExceeded"),Bh=n(async e=>Fn(at.MonthlyQuotaName.BUDIBASE_AI_CREDITS,at.QuotaUsageType.MONTHLY,e),"setBudibaseAICredits");var vs={};L(vs,{db:()=>Dt});var Yu=require("@budibase/backend-core");var Nt={};L(Nt,{addUsers:()=>mD,adjustGroupCreatorsQuotas:()=>vD,cleanupApp:()=>yD,enrichUserRolesFromGroups:()=>dD,fetch:()=>zu,get:()=>Vh,getBulk:()=>Kh,getGroupBuilderAppIds:()=>Wh,getGroupRoleId:()=>pD,remove:()=>fD,removeUsers:()=>gD,save:()=>Hh,updateGroupApps:()=>hD});var V=require("@budibase/backend-core");async function Qu(e,t){try{let r=[];for(let u of e)if(u.roles){let l=u.roles[V.db.getProdWorkspaceID(t)];l&&r.push(l)}let a=await Promise.all(r.map(async u=>({[u]:await V.roles.roleToNumber(u)}))),o,s,i={};a.forEach(u=>{let[l,c]=Object.entries(u)[0];i[l]={roleId:l,roleNum:c}});for(let{roleId:u,roleNum:l}of Object.values(i))(s===void 0||l>s)&&(s=l,o=u);return o}catch(r){throw V.logging.logAlert(`Error finding higest role for ${e.length} on app ${t}`,r),r}}n(Qu,"findHighestRole");async function Gh(e,t){return t?t=t.filter(r=>e.includes(r._id)):t=await ce.getBulk(e,{enriched:!1}),t}n(Gh,"groupList");async function Wh(e,t){if(!e.userGroups)return[];let r=await Gh(e.userGroups,t?.groups),a=t?.appId?V.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(Wh,"getGroupBuilderAppIds");async function pD(e,t,r){if(!e.userGroups)return null;let a=await Gh(e.userGroups,r?.groups),o=V.db.getProdWorkspaceID(t);return e.roles?.[o]?e.roles[o]:(a=a.filter(u=>u?.roles?Object.keys(u.roles).includes(o):!1),V.context.getCurrentContext()?.appId===t?Qu(a,t):await V.context.doInWorkspaceContext(t,async()=>Qu(a,t)))}n(pD,"getGroupRoleId");async function dD(e){if(!e||!e.userGroups)return e;let t=await Kh(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 V.context.doInWorkspaceContext(o,async()=>{if(e.roles[o])return;let s=await Qu(t,o);s&&(e.roles[o]=s)});let a=await Wh(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(dD,"enrichUserRolesFromGroups");async function zu(){return await ce.fetch()}n(zu,"fetch");async function Vh(e){return await ce.get(e)}n(Vh,"get");async function Kh(e,t={enriched:!0}){return ce.getBulk(e,t)}n(Kh,"getBulk");async function jh(e){if(await ce.getByName(e))throw new fs(e)}n(jh,"guardNameAvailability");async function $h(e){let t=await ce.getGroupUsers(e._id);if(!t.length)return 0;let a=await V.tenancy.getGlobalDB().getMultiple(t.map(s=>s._id));return(await V.userUtils.creatorsInList(a)).filter(s=>s).length}n($h,"getCreatorsCountInGroup");async function Hh(e){let t=[],r=!e._id,a=0;if(!e._id)e._id=ce.generateUserGroupID(),await jh(e.name),t.push(V.events.group.created(e));else{let u=await ce.get(e._id);if(u.name!==e.name&&await jh(e.name),t.push(V.events.group.updated(e)),JSON.stringify(u.roles)!==JSON.stringify(e.roles)){let l=u.users?.length||0,c=0;l>0&&(c=await $h(u)),Object.values(e.roles).includes("CREATOR")?a=l-c:a=-l,t.push(V.events.group.permissionsEdited(e))}}await Promise.all(t);let{users:o,...s}=e,i=n(()=>ce.save(s),"saveGroup");if(r)return await Gu(i);{let u=await i();if(a>0)await ds(0,a);else if(a<0){let l=await $h(e),c=Math.abs(a)-l;c>0&&await Aa(0,c)}return u}}n(Hh,"save");async function fD(e,t){let r;try{r=await ce.get(e)}catch{throw new Error("Group not found")}let a=Object.values(r.roles||{}).includes("CREATOR"),o=n(()=>{},"recalculateCreatorsQuotasFn");if(a){let i=V.tenancy.getGlobalDB(),u=await ce.getGroupUsers(e),c=(await Promise.all(u.map(T=>i.get(T._id)))).map(T=>({...T,userGroups:T.userGroups.filter(q=>q!==e)})),h=(await V.userUtils.creatorsInList(c)).filter(T=>T).length,y=u.length-h;y&&(o=n(()=>Aa(0,y),"recalculateCreatorsQuotasFn"))}let s=await ce.destroy(e,t);return await V.events.group.deleted(r),await Wu(),await o(),s}n(fD,"remove");async function mD(e,t){let r=await ce.get(e),a=await V.users.bulkGetGlobalUsersById(t),o=[];for(let l of a)l.userGroups||(l.userGroups=[]),l.userGroups.includes(e)||o.push(l);if(!o.length)return o;let s=o.map(l=>({...l,userGroups:[...l?.userGroups||[],e]}));if(await V.users.bulkUpdateGlobalUsers(s),Object.values(r.roles||{}).includes("CREATOR")){let c=(await V.userUtils.creatorsInList(o)).filter(h=>h).length,d=o.length-c;d&&await ds(0,d)}let u=[];for(let l of t)u.push(V.cache.user.invalidateUser(l));return await Promise.all(u),await V.events.group.usersAdded(s.length,r,t),s}n(mD,"addUsers");async function gD(e,t){let r=await ce.get(e),a=await V.users.bulkGetGlobalUsersById(t),o=[];for(let u of a){if(!u.userGroups||!u.userGroups.includes(e))continue;let l=u.userGroups.indexOf(e);u.userGroups.splice(l,1),o.push(u)}if(await V.users.bulkUpdateGlobalUsers(o),Object.values(r.roles||{}).includes("CREATOR")){let l=(await V.userUtils.creatorsInList(o)).filter(d=>d).length,c=o.length-l;c&&await Aa(0,c)}let i=[];for(let u of t)i.push(V.cache.user.invalidateUser(u));return await Promise.all(i),o.length&&await V.events.group.usersDeleted(o.length,r,t),o}n(gD,"removeUsers");async function hD(e,t){let r=await Vh(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 Hh(r)}n(hD,"updateGroupApps");async function yD(e){let t=await zu(),r=[];for(let a of t)!a.roles||!a.roles[e]||(delete a.roles[e],r.push(a));return await ce.bulkSave(r)}n(yD,"cleanupApp");async function vD(){if(!await Uu()){let e=V.tenancy.getGlobalDB(),r=(await zu()||[]).filter(a=>Object.values(a?.roles||{}).includes("CREATOR"));for(let a of r){let o=await ce.getGroupUsers(a._id),i=(await Promise.all(o.map(d=>e.get(d._id)))).map(d=>({...d,userGroups:d.userGroups.filter(h=>h!==a._id)})),l=(await V.userUtils.creatorsInList(i)).filter(d=>d).length,c=o.length-l;await ce.save({...a,roles:{}}),c&&await Aa(0,c)}}}n(vD,"adjustGroupCreatorsQuotas");Yu.users.UserDB.init(Qt,Nt,Mt);var Dt=Yu.users.UserDB;var Ts={};L(Ts,{logs:()=>nl});var nl={};L(nl,{logSearch:()=>ED,oldestLogDate:()=>ey,storeLog:()=>RD});var Is=require("@budibase/backend-core"),Xh=require("@budibase/types");var Le=require("@budibase/backend-core"),ws=require("@budibase/types");var Jh=require("@budibase/backend-core");async function Qh(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(u){r=u}return o||Jh.logging.logWarn(`Failed to backoff: ${t}`,r),s}n(Qh,"backOff");var{SEPARATOR:sr,UNICODE_MAX:bD,DocumentType:zh,AutomationViewMode:Zu,ViewName:wD,getQueryIndex:ID}=Le.db,TD=new Date(0).toISOString(),AD=100,bs=10,Xu=n(async()=>Po(ws.ConstantQuotaName.AUTOMATION_LOG_RETENTION_DAYS),"oldestLogDate");function Yh(e,t,{status:r,automationId:a}={},o={}){let s=a?`${a}${sr}`:"",i=r?`${r}${sr}`:"",u;return r&&a?u=`${Zu.ALL}${sr}${i}${s}`:r?u=`${Zu.STATUS}${sr}${i}`:a?u=`${Zu.AUTOMATION}${sr}${s}`:u=`${zh.AUTOMATION_LOG}${sr}`,{...o,descending:!0,startkey:`${u}${t}${bD}`,endkey:`${u}${e}`}}n(Yh,"getAutomationLogParams");function _D(e,t,r){return`${zh.AUTOMATION_LOG}${sr}${e}${sr}${r}${sr}${t}`}n(_D,"generateAutomationLogID");async function el(e,t,r={docs:!0}){let a=Le.context.getProdWorkspaceDB();await a.exists()||(a=Le.context.getDevWorkspaceDB());let o={status:r.status},s=r?.limit?r.limit:r?.paginate?bs+1:void 0,i=Yh(e,t,o,{include_docs:r.docs,limit:s});r?.page&&(i.startkey=r.page);let u=await a.allDocs(i),l=gn(u,{paginate:r?.paginate,pageSize:bs});return{...l,totalLogs:l.totalRows}}n(el,"getAllLogs");async function tl(e,t,r={}){let a=Le.context.getProdWorkspaceDB();await a.exists()||(a=Le.context.getDevWorkspaceDB());let o;try{let i={automationId:r?.automationId,status:r?.status},u=Yh(e,t,i,{include_docs:!0,limit:bs+1});r?.page&&(u.startkey=r.page),o=await a.query(ID(wD.AUTOMATION_LOGS),u)}catch(i){if(i!=null&&(i.name==="not_found"||i.error==="not_found"))return await Td(),tl(e,t,r);throw i}let s=gn(o,{paginate:!0,pageSize:bs});return{...s,totalLogs:s.totalRows/3}}n(tl,"getLogsByView");async function Zh(e,t){let r=Le.context.getProdWorkspaceDB(),a=e._id,o=e.name,s=new Date().toISOString(),i=_D(s,t.status,a),u={...t,automationId:a,status:t.status,automationName:o,createdAt:s,_id:i};return await r.put(u),i}n(Zh,"writeLog");async function rl(e,{clearing:t}={clearing:!1}){let r=Le.context.getProdWorkspaceDB();await Qh(async()=>{let a=await r.get(Le.db.DocumentType.WORKSPACE_METADATA);for(let o of e){let s=o.split(Le.db.SEPARATOR),i=`${s[s.length-3]}${Le.db.SEPARATOR}${s[s.length-2]}`,u={};a.automationErrors&&(u=a.automationErrors),Array.isArray(u[i])||(u[i]=[]);let l=u[i].indexOf(o);t&&l!==-1?u[i].splice(l,1):u[i].push(o),u[i].length===0&&delete u[i],a.automationErrors=u}await r.put(a),await Le.cache.workspace.invalidateWorkspaceMetadata(a.appId,a)},"Failed to update app metadata with automation log error")}n(rl,"updateAppMetadataWithErrors");async function SD(){let e=await Xu();try{return await el(TD,e,{docs:!1,paginate:!1,limit:AD})}catch{return{data:[],hasNextPage:!1,totalLogs:0}}}n(SD,"getExpiredLogs");async function al(){let e=Le.context.getProdWorkspaceDB();try{let t=await SD();if(!t.data||t.data.length===0)return;let r=t.data.map(o=>({_id:o.id,_rev:o.value.rev,_deleted:!0})),a=t.data.filter(o=>{let s=o.id.split(Le.db.SEPARATOR);return s[s.length-1]===ws.AutomationStatus.ERROR}).map(o=>o.id);await e.bulkDocs(r),a.length&&await rl(a,{clearing:!0})}catch(t){Le.logging.logAlert(`Failed to cleanup automation log history - Database "${e.name}"`,t)}}n(al,"clearOldHistory");var ey=Xu;async function xD(e,t,r,a){let o,s=new Date().toISOString(),i=await ey();return(!e||e<i)&&(e=i),r||t?o=await tl(e,s,{automationId:r,status:t,page:a}):o=await el(e,s,{status:t,page:a,docs:!0,paginate:!0}),o}n(xD,"getLogs");async function ED(e){return await al(),await xD(e.startDate,e.status,e.automationId,e.page)}n(ED,"logSearch");async function RD(e,t){if(!Is.db.isProdWorkspaceID(Is.context.getWorkspaceId()))return;let r=await Zh(e,t);t.status===Xh.AutomationStatus.ERROR&&await rl([r]),await al()}n(RD,"storeLog");var As={};L(As,{checkPluginQuotas:()=>PD,deletePlugin:()=>CD,storePlugin:()=>OD});var ny=require("@budibase/types"),Pe=require("@budibase/backend-core");var ty=ue(require("fs")),ry=require("path");function ay(e,t){return ty.default.readFileSync((0,ry.join)(e,t),"utf8")}n(ay,"loadJSFile");async function OD(metadata,directory,source,origin){let db=Pe.tenancy.getGlobalDB(),version=metadata.package.version,name=metadata.package.name,description=metadata.package.description,hash=metadata.schema.hash,bucketPath=Pe.objectStore.getPluginS3Dir(name),files=await Pe.objectStore.uploadDirectory(Pe.objectStore.ObjectStoreBuckets.PLUGINS,directory,bucketPath),jsFile=files.find(e=>e.name.endsWith(".js")),iconFile=files.find(e=>e.name.endsWith(".svg"));if(!jsFile)throw new Error("Plugin missing .js file.");if(metadata.schema.type===ny.PluginType.DATASOURCE){let js=ay(directory,jsFile.name);try{eval(js)}catch(e){let t=e?.message?e.message:JSON.stringify(e);throw new Error(`JS invalid: ${t}`)}}let iconFileName=iconFile?iconFile.name:null,pluginId=Pe.db.generatePluginID(name),rev;try{rev=(await db.get(pluginId))._rev}catch(e){rev=void 0}let doc={_id:pluginId,_rev:rev,...metadata,name,version,hash,description,source};iconFileName&&(doc.iconFileName=iconFileName),source&&(doc={...doc,source}),origin&&origin.source==="github"&&(doc.origin=origin);let write=n(async()=>{let e=await db.put(doc);return await Pe.events.plugin.imported(doc),{...doc,_rev:e.rev}},"write");return rev?await write():await Vu(write)}n(OD,"storePlugin");async function CD(e){let t=Pe.tenancy.getGlobalDB();try{let r=await t.get(e),a=Pe.objectStore.getPluginS3Dir(r.name);await Pe.objectStore.deleteFolder(Pe.objectStore.ObjectStoreBuckets.PLUGINS,a),await t.remove(e,r._rev),await Pe.events.plugin.deleted(r),await Ku()}catch(r){let a=r?.message?r?.message:r;throw new Error(`Failed to delete plugin: ${a}`)}}n(CD,"deletePlugin");async function PD(){let e=Pe.tenancy.getGlobalDB();try{let r=(await e.allDocs(Pe.db.getPluginParams())).rows.length;console.log(`Syncing plugin count: ${r}`),await Hu(r)}catch(t){Pe.logging.logAlert("Unable to retrieve plugins for quota check",t)}}n(PD,"checkPluginQuotas");var _s={};L(_s,{fetch:()=>kD,fetchValues:()=>ND,isEncryptionKeyAvailable:()=>MD,isValid:()=>iy,remove:()=>qD,update:()=>DD});var oy=require("@budibase/backend-core"),jn=require("@budibase/types");function MD(){return!!oy.env.ENCRYPTION_KEY}n(MD,"isEncryptionKeyAvailable");async function kD(){let e=await wr.get();return Object.keys(e.variables)}n(kD,"fetch");async function ND(e){let r=(await wr.get()).variables,a={};for(let[o,s]of Object.entries(r))switch(e){case jn.Environment.DEVELOPMENT:a[o]=s.development;break;case jn.Environment.PRODUCTION:default:a[o]=s.production;break}return a}n(ND,"fetchValues");async function sy(e){if(!(await Vt.cache.getCachedLicense()).features.includes(jn.Feature.ENVIRONMENT_VARIABLES))throw new Error("User does not have access to environment variables feature.");let r=await wr.get();r.variables=e(r.variables),await wr.update(r)}n(sy,"changeValues");async function DD(e,t){if(iy(e))await sy(a=>(a[e]=t,a));else throw new Error("Variable name has characters that are not allowed")}n(DD,"update");async function qD(e){await sy(t=>(delete t[e],t))}n(qD,"remove");function iy(e){return/^[a-zA-Z0-9-_]+$/.test(e)}n(iy,"isValid");var Es={};L(Es,{definitions:()=>HD,download:()=>KD,fetch:()=>VD,write:()=>GD});var nt=require("@budibase/backend-core"),xs=require("@budibase/types");var xe=require("@budibase/backend-core"),qt=require("@budibase/types");var uy=require("memorystream"),ly=new xe.sql.Sql(qt.SqlClient.SQL_LITE);async function LD(e,t,r){let a={operation:qt.Operation.READ,table:ra.searchTable(),tables:{},paginate:{limit:r||9,page:t},filters:e,resource:{fields:[]},sort:{timestamp:{direction:qt.SortOrder.DESCENDING,type:qt.SortType.STRING}}},o=ly._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(LD,"getAuditLogSqlQuery");function UD(e){return`${xe.DocumentType.AUDIT_LOG}${xe.SEPARATOR}${e}${xe.SEPARATOR}${xe.utils.newid()}`}n(UD,"generateAuditLogID");async function cy(e){e._id||(e._id=UD(e.timestamp)),e.type||(e.type=qt.AUDIT_LOG_TYPE);try{let r=await xe.context.getAuditLogsDB().put(e);return{...e,_rev:r.rev}}catch(t){xe.logging.logAlert("Failed to write audit log",t)}}n(cy,"save");async function ol(e,t,r){t||(t=1);let a=xe.context.getAuditLogsDB();try{let o=9+1,s=await LD(e,t,o),i=ra.searchTable(),u=ly.convertJsonStringColumns(i,await a.sql(s.sql,s.bindings)),l;u.length>o&&(l=u.pop());let c={rows:u,hasNextPage:!!l};return c.hasNextPage&&(c.bookmark=t+1),c}catch(o){if(o.status===404&&!r?.isRetry)return await FD(),await id(),await ol(e,t,{isRetry:!0});throw o}}n(ol,"searchSQL");async function FD(){let e=xe.context.getAuditLogsDB(),r=(await e.allDocs(xe.db.getDocParams(xe.DocumentType.AUDIT_LOG,null,{include_docs:!0}))).rows.map(a=>a.doc).filter(a=>a&&!a.type).map(a=>({...a,type:qt.AUDIT_LOG_TYPE}));await e.bulkDocs(r)}n(FD,"migrate");function py(e){let t=xe.context.getAuditLogsDB(),r=new uy,a=t.dump(r,{filter:s=>{let i=s;if(!i._id?.startsWith(xe.DocumentType.AUDIT_LOG))return!1;let u=!0,l=n((c,d)=>{!c||c.length===0||(u=!!(u&&d&&c.includes(d)))},"matcher");if(l(e.userIds,i.userId),l(e.appIds,i.appId),l(e.events,i.event),(e.startDate||e.endDate)&&(u=u&&i.timestamp>=e.startDate&&i.timestamp<=e.endDate),e.fullSearch){let c=JSON.stringify(s);u=u&&c.includes(e.fullSearch)}return u}}),o=new uy;return r.on("data",s=>{let i=JSON.parse(Buffer.from(s).toString());if(Array.isArray(i.docs)){let u="";for(let l of i.docs)u+=JSON.stringify(l)+`
|
|
38
|
+
`;function hn(e){return Hi.default.verify(e,$0,{algorithms:["RS256"]})}n(hn,"verifyLicenseToken");function G0(e,t){return Hi.default.sign(t,e,{encoding:"utf-8",algorithm:"RS256"})}n(G0,"sign");var Do={};L(Do,{getOfflineFeatures:()=>Ji});var v=require("@budibase/types");var W0={[v.PlanType.FREE]:[...At.SELF_FREE_LICENSE.features],[v.PlanType.PREMIUM]:[v.Feature.WORKSPACE_BACKUPS,v.Feature.BRANDING,v.Feature.VIEW_PERMISSIONS,v.Feature.PDF],[v.PlanType.PREMIUM_PLUS]:[v.Feature.WORKSPACE_BACKUPS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PDF,v.Feature.BUDIBASE_AI],[v.PlanType.PREMIUM_PLUS_TRIAL]:[v.Feature.WORKSPACE_BACKUPS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PDF,v.Feature.BUDIBASE_AI],[v.PlanType.PRO]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS],[v.PlanType.TEAM]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS],[v.PlanType.BUSINESS]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.AUDIT_LOGS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.EXPANDED_PUBLIC_API,v.Feature.VIEW_PERMISSIONS,v.Feature.PDF,v.Feature.BUDIBASE_AI],[v.PlanType.ENTERPRISE_BASIC]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.ENFORCEABLE_SSO,v.Feature.AUDIT_LOGS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.OFFLINE,v.Feature.EXPANDED_PUBLIC_API,v.Feature.WORKSPACE_IMPORT_EXPORT,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.SCIM,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PWA,v.Feature.CUSTOM_APP_SCRIPTS,v.Feature.PDF,v.Feature.BUDIBASE_AI,v.Feature.RECAPTCHA,v.Feature.PKCE_OIDC,v.Feature.TRANSLATIONS],[v.PlanType.ENTERPRISE_BASIC_TRIAL]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.ENFORCEABLE_SSO,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.EXPANDED_PUBLIC_API,v.Feature.WORKSPACE_IMPORT_EXPORT,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.SCIM,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PWA,v.Feature.CUSTOM_APP_SCRIPTS,v.Feature.PDF,v.Feature.BUDIBASE_AI,v.Feature.RECAPTCHA,v.Feature.PKCE_OIDC,v.Feature.TRANSLATIONS],[v.PlanType.ENTERPRISE]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.ENFORCEABLE_SSO,v.Feature.AUDIT_LOGS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.OFFLINE,v.Feature.EXPANDED_PUBLIC_API,v.Feature.WORKSPACE_IMPORT_EXPORT,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.SCIM,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PWA,v.Feature.CUSTOM_APP_SCRIPTS,v.Feature.PDF,v.Feature.BUDIBASE_AI,v.Feature.RECAPTCHA,v.Feature.PKCE_OIDC,v.Feature.TRANSLATIONS]};function Ji(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(W0)}n(Ji,"getOfflineFeatures");var qo={};L(qo,{UNLIMITED:()=>g,getQuotas:()=>Qi});var ye=require("@budibase/types");var f=ar,kd=At,g=-1,_t=n(e=>e*1e6,"millions"),V0={[ye.PlanType.FREE]:{...kd.CLOUD_FREE_LICENSE.quotas},[ye.PlanType.PREMIUM]:{usage:{monthly:{...f.queries(g),...f.automations(1e3),...f.budibaseAICredits(0),...f.actions(g)},static:{...f.rows(1e4),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(0),...f.plugins(g),...f.customAIConfigurations(0)}},constant:{...f.automationLogRetentionDays(7),...f.appBackupRetentionDays(7)}},[ye.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...f.queries(g),...f.automations(5e3),...f.budibaseAICredits(_t(2)),...f.actions(g)},static:{...f.rows(25e3),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(0),...f.plugins(g),...f.customAIConfigurations(1)}},constant:{...f.automationLogRetentionDays(30),...f.appBackupRetentionDays(30)}},[ye.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...f.queries(g),...f.automations(5e3),...f.budibaseAICredits(_t(2)),...f.actions(g)},static:{...f.rows(25e3),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(0),...f.plugins(g),...f.customAIConfigurations(1)}},constant:{...f.automationLogRetentionDays(30),...f.appBackupRetentionDays(30)}},[ye.PlanType.PRO]:{usage:{monthly:{...f.queries(g),...f.automations(1e3),...f.budibaseAICredits(_t(2)),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(5),...f.plugins(g),...f.customAIConfigurations(0)}},constant:{...f.automationLogRetentionDays(7),...f.appBackupRetentionDays(7)}},[ye.PlanType.TEAM]:{usage:{monthly:{...f.queries(g),...f.automations(5e3),...f.budibaseAICredits(0),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(10),...f.plugins(g),...f.customAIConfigurations(0)}},constant:{...f.automationLogRetentionDays(30),...f.appBackupRetentionDays(90)}},[ye.PlanType.BUSINESS]:{usage:{monthly:{...f.queries(g),...f.automations(1e4),...f.budibaseAICredits(_t(2)),...f.actions(g)},static:{...f.rows(5e4),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(50),...f.plugins(g),...f.customAIConfigurations(0)}},constant:{...f.automationLogRetentionDays(365),...f.appBackupRetentionDays(365)}},[ye.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...f.queries(g),...f.automations(g),...f.budibaseAICredits(_t(4)),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(g),...f.plugins(g),...f.customAIConfigurations(g)}},constant:{...f.automationLogRetentionDays(g),...f.appBackupRetentionDays(g)}},[ye.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...f.queries(g),...f.automations(g),...f.budibaseAICredits(_t(4)),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(g),...f.plugins(g),...f.customAIConfigurations(g)}},constant:{...f.automationLogRetentionDays(15),...f.appBackupRetentionDays(15)}},[ye.PlanType.ENTERPRISE]:{usage:{monthly:{...f.queries(g),...f.automations(g),...f.budibaseAICredits(_t(4)),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(g),...f.plugins(g),...f.customAIConfigurations(g)}},constant:{...f.automationLogRetentionDays(g),...f.appBackupRetentionDays(g)}}},K0={[ye.PlanType.FREE]:{...kd.SELF_FREE_LICENSE.quotas},[ye.PlanType.PREMIUM]:void 0,[ye.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...f.queries(g),...f.automations(g),...f.budibaseAICredits(_t(2)),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(0),...f.plugins(g),...f.customAIConfigurations(1)}},constant:{...f.automationLogRetentionDays(30),...f.appBackupRetentionDays(30)}},[ye.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...f.queries(g),...f.automations(g),...f.budibaseAICredits(_t(2)),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(0),...f.plugins(g),...f.customAIConfigurations(1)}},constant:{...f.automationLogRetentionDays(30),...f.appBackupRetentionDays(30)}},[ye.PlanType.PRO]:{usage:{monthly:{...f.queries(g),...f.automations(g),...f.budibaseAICredits(0),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(5),...f.plugins(g),...f.customAIConfigurations(0)}},constant:{...f.automationLogRetentionDays(7),...f.appBackupRetentionDays(7)}},[ye.PlanType.TEAM]:{usage:{monthly:{...f.queries(g),...f.automations(g),...f.budibaseAICredits(0),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(10),...f.plugins(g),...f.customAIConfigurations(0)}},constant:{...f.automationLogRetentionDays(30),...f.appBackupRetentionDays(90)}},[ye.PlanType.BUSINESS]:{usage:{monthly:{...f.queries(g),...f.automations(g),...f.budibaseAICredits(0),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(50),...f.plugins(g),...f.customAIConfigurations(0)}},constant:{...f.automationLogRetentionDays(90),...f.appBackupRetentionDays(365)}},[ye.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...f.queries(g),...f.automations(g),...f.budibaseAICredits(_t(4)),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(g),...f.plugins(g),...f.customAIConfigurations(g)}},constant:{...f.automationLogRetentionDays(g),...f.appBackupRetentionDays(g)}},[ye.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...f.queries(g),...f.automations(g),...f.budibaseAICredits(_t(4)),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(g),...f.plugins(g),...f.customAIConfigurations(g)}},constant:{...f.automationLogRetentionDays(15),...f.appBackupRetentionDays(15)}},[ye.PlanType.ENTERPRISE]:{usage:{monthly:{...f.queries(g),...f.automations(g),...f.budibaseAICredits(_t(4)),...f.actions(g)},static:{...f.rows(g),...f.apps(g),...f.users(g),...f.creators(g),...f.userGroups(g),...f.plugins(g),...f.customAIConfigurations(g)}},constant:{...f.automationLogRetentionDays(g),...f.appBackupRetentionDays(g)}}};function Qi(e,t){let r;function a(o){let s=o[t];if(!s)throw new Error(`Quotas do not exist for planType=${t} and hosting=${e}`);return s}switch(n(a,"readQuotas"),e){case ye.Hosting.SELF:r=a(K0);break;case ye.Hosting.CLOUD:r=a(V0);break}return JSON.parse(JSON.stringify(r))}n(Qi,"getQuotas");var Lo={};L(Lo,{encoding:()=>sa,workspaceExists:()=>H0});var Nd=require("@budibase/backend-core");async function H0(e){return(await Nd.db.getAllWorkspaces({all:!0,idsOnly:!0})).includes(e)}n(H0,"workspaceExists");var sa={};L(sa,{base64ToObject:()=>Q0,objectToBase64:()=>J0});function J0(e){let t=JSON.stringify(e);return Buffer.from(t).toString("base64")}n(J0,"objectToBase64");function Q0(e){let t=Buffer.from(e,"base64").toString();return JSON.parse(t)}n(Q0,"base64ToObject");var bh=require("@budibase/types"),va=require("@budibase/backend-core"),wh=ue(Ym()),Ih=ue(Tu());async function _N(e){await dt.save({offlineLicenseToken:e}),await Lr()}n(_N,"activateOfflineLicenseToken");async function SN(){await dt.save({offlineLicenseToken:void 0}),await Lr()}n(SN,"deleteOfflineLicenseToken");async function Th(){return(await dt.get()).offlineLicenseToken}n(Th,"getOfflineLicenseToken");async function Au(){let t=(await va.installation.getInstall()).installId,r=va.context.getTenantId(),a=await va.events.identification.getUniqueTenantId(r);return{installId:t,tenantId:a}}n(Au,"getIdentifier");async function xN(){let e=await Au();return sa.objectToBase64(e)}n(xN,"getIdentifierBase64");function EN(e){return sa.base64ToObject(e)}n(EN,"getIdentifierFromBase64");function Ah(e){let t=Date.now(),r=new Date(e.expireAt).getTime();if(t>r)throw new Error(`Offline license has expired. expireAt=${e.expireAt}`)}n(Ah,"verifyExpiry");async function _h(e){let t=await Au();if(e.identifier.installId!==t.installId||e.identifier.tenantId!==t.tenantId)throw new Error("Invalid offline license")}n(_h,"verifyInstallation");function Sh(e){let t=e.plan.type,r=bh.Hosting.SELF,a=Ji(t),o=Qi(r,t);return e.features=(0,wh.default)(e.features,a),e.quotas=(0,Ih.default)(e.quotas,o),e}n(Sh,"enrichLicense");async function _u(){try{let e=await Th();if(e){let t=await hn(e);return Ah(t),await _h(t),Sh(t)}}catch(e){console.error("Error retrieving offline license",e)}}n(_u,"getOfflineLicense");var qn={};L(qn,{deleteDevLicense:()=>MN,getOfflineLicense:()=>CN,writeDevLicenseToDisk:()=>PN});var xh=require("@budibase/backend-core"),xu=require("path"),Eh=require("os"),Ur=ue(require("fs"));var RN=xh.env.isTest()?".budibase-test":".budibase",Su=(0,xu.join)((0,Eh.tmpdir)(),RN),ON="dev_license.txt",Dn=(0,xu.join)(Su,ON);if(!Ur.default.existsSync(Su))try{Ur.default.mkdirSync(Su)}catch{}function CN(){try{if(Ur.default.existsSync(Dn)){let e=Ur.default.readFileSync(Dn,{encoding:"utf-8"});return hn(e)}}catch(e){console.error("Error retrieving offline license from disk",e)}}n(CN,"getOfflineLicense");function PN(e){console.log(`Writing license to: ${Dn}`),Ur.default.writeFileSync(Dn,e,{encoding:"utf-8"})}n(PN,"writeDevLicenseToDisk");function MN(){Ur.default.rmSync(Dn,{force:!0})}n(MN,"deleteDevLicense");var Rh=require("dd-trace");var Ru=n(async()=>await Rh.tracer.trace("getLicense",async e=>{if(Eu.env.OFFLINE_MODE)return e.addTags({offline:!0}),_u();let t=await oa();return t||(e.addTags({offlineFallback:!0}),t=qn.getOfflineLicense()),t}),"getLicense"),Ou=n(e=>Vi(e),"getLicenseFromKey"),Cu=n(()=>Eu.env.SELF_HOSTED?At.SELF_FREE_LICENSE:At.CLOUD_FREE_LICENSE,"getFreeLicense");var Mu={};L(Mu,{activateLicenseKey:()=>kN,deleteLicenseKey:()=>NN,getLicenseKey:()=>es});var Pu=ue(require("dd-trace"));async function kN(e){await Ki(e),await dt.save({licenseKey:e}),await Lr()}n(kN,"activateLicenseKey");async function es(){return await Pu.default.trace("getLicenseKey",async e=>{let t=await dt.get();return e.addTags({licenseKey:t.licenseKey}),t.licenseKey})}n(es,"getLicenseKey");async function NN(){return await Pu.default.trace("deleteLicenseKey",async()=>{await dt.save({licenseKey:void 0}),await Lr()})}n(NN,"deleteLicenseKey");var ts=require("@budibase/backend-core");var Ln,qN=n(async()=>{Ln=await ts.RedisClient.init(ts.redis.utils.Databases.LICENSES)},"init"),LN=n(async()=>{Ln&&await Ln.finish()},"shutdown");process.on("exit",async()=>{await LN()});var rs=n(async()=>(Ln||await qN(),Ln),"getClient");var Ch=require("@budibase/shared-core");var Nu=gt.Duration.fromHours(1).toSeconds(),Ph=gt.Duration.fromHours(1).toSeconds(),FN=Nu+Ph,Lr=n(async()=>{await Nh(),await kh()},"refresh"),Oh=n(async e=>{let{result:t}=await gt.locks.doWithLock({type:ns.LockType.DEFAULT,name:ns.LockName.SYNC_ACCOUNT_LICENSE,resource:e,ttl:gt.Duration.fromSeconds(10).toMs()},async()=>{let r=await rs(),a=await r.get(e);if(a&&!Mh(a))return a;let o=await as.default.trace("populateLicense",async()=>await Ru());return o||(o=as.default.trace("populateFreeLicense",()=>Cu())),o.refreshedAt=new Date().toISOString(),await r.store(e,o,FN),o});return t},"populateAndStoreLicense"),Mh=n(e=>{let t=e.refreshedAt?Date.parse(e.refreshedAt):0;return Date.now()-t>=Nu*1e3},"shouldRefreshLicense"),ku=n(async()=>await as.default.trace("getCachedLicense",async e=>{let t=gt.context.getLicense();if(t)return e.addTags({foundInContext:!0,features:t.features,plan:t.plan,quotas:t.quotas}),t;let r=gt.tenancy.getTenantId(),o=await(await rs()).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}),Mh(o)&&Oh(r).catch(()=>{}),o):(o=await Ch.helpers.retry(()=>Oh(r)),e.addTags({refreshedAt:o.refreshedAt,features:o.features,plan:o.plan,quotas:o.quotas,expirySeconds:Nu,staleGraceSeconds:Ph}),o)}),"_getCachedLicense");gt.env.isJest()&&(ku=jest.fn().mockImplementation(ku));var kh=ku,Nh=n(async()=>{let e=gt.tenancy.getTenantId();await(await rs()).delete(e)},"invalidate");async function Oe(e,t){Array.isArray(e)||(e=[e]),t||(t=await Ct.getCachedLicense());for(let r of e)if(!t?.features.includes(r))return!1;return!0}n(Oe,"areFeaturesEnabled");async function os(e,t){if(!await Oe(e,t))throw new nr.FeatureDisabledWarning(e)}n(os,"checkFeature");async function Du(e,t){if(!await Oe(e,t)){let r=e.join(", ");throw new nr.FeatureDisabledWarning(r)}}n(Du,"checkFeatures");function Qe(e){return async(...t)=>(await os(Se.Feature.WORKSPACE_BACKUPS),e(...t))}n(Qe,"checkBackups");async function qu(){return Oe(Se.Feature.WORKSPACE_BACKUPS)}n(qu,"isBackupsEnabled");async function Lu(){return Oe(Se.Feature.BRANDING)}n(Lu,"isBrandingEnabled");async function Dh(){return Oe(Se.Feature.ENFORCEABLE_SSO)}n(Dh,"isEnforceableSSO");async function BN(){return Oe(Se.Feature.SYNC_AUTOMATIONS)}n(BN,"isSyncAutomationsEnabled");async function jN(){return Oe(Se.Feature.TRIGGER_AUTOMATION_RUN)}n(jN,"isTriggerAutomationRunEnabled");async function ss(){return Oe(Se.Feature.AUDIT_LOGS)}n(ss,"isAuditLogsEnabled");async function Uu(){return Oe(Se.Feature.USER_GROUPS)}n(Uu,"isUserGroupsEnabled");function $N(){return Oe(Se.Feature.PWA)}n($N,"isPWAEnabled");function GN(){return Oe(Se.Feature.RECAPTCHA)}n(GN,"isRecaptchaEnabled");var WN=n(()=>Oe(Se.Feature.PKCE_OIDC),"isPkceOidcEnabled");async function VN(){return Oe(Se.Feature.TRANSLATIONS)}n(VN,"isTranslationsEnabled");async function ba(){return Oe(Se.Feature.EXPANDED_PUBLIC_API)}n(ba,"isExpandedPublicApiEnabled");async function KN(){return Oe(Se.Feature.WORKSPACE_IMPORT_EXPORT)}n(KN,"isWorkspaceImportExportEnabled");async function is(){return Oe([Se.Feature.EXPANDED_PUBLIC_API,Se.Feature.WORKSPACE_IMPORT_EXPORT])}n(is,"isWorkspaceImportExportPublicApiEnabled");async function HN(e){if(nr.env.ENABLE_SSO_MAINTENANCE_MODE||!await Dh())return!1;let r;return e?.config?r=e.config:r=await nr.configs.getSettingsConfig(),!!r.isSSOEnforced}n(HN,"isSSOEnforced");var Fu=n(async()=>{let e=Se.Feature.SCIM,t=await Oe(e),r=await nr.configs.getSCIMConfig();if(!t||!r?.enabled)throw new nr.FeatureDisabledWarning(e);return!0},"checkSCIM");async function JN(){return Oe(Se.Feature.VIEW_PERMISSIONS)}n(JN,"isViewPermissionEnabled");async function QN(){return Oe(Se.Feature.VIEW_READONLY_COLUMNS)}n(QN,"isViewReadonlyColumnsEnabled");var zN={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 YN(e){return await Lu()?{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}:zN}n(YN,"getBrandingConfig");var ju={};L(ju,{enrichAIConfig:()=>Bu});var qh=require("@budibase/backend-core");var ZN="budibase_ai";async function Bu(e){if(qh.env.SELF_HOSTED)return e;for(let t of Object.values(e.config))if(t.provider==="BudibaseAI")return e;return e.config[ZN]={provider:"BudibaseAI",active:!0,isDefault:Object.keys(e.config).every(t=>!e.config[t].isDefault),defaultModel:process.env.BUDIBASE_AI_DEFAULT_MODEL||"gpt-5-mini",name:"Budibase AI"},e}n(Bu,"enrichAIConfig");var Qt={};L(Qt,{addAction:()=>rD,addApp:()=>aD,addAutomation:()=>lD,addGroup:()=>Gu,addPlugin:()=>Vu,addRow:()=>oD,addRows:()=>iD,addUsers:()=>ds,bustCache:()=>qi,decrement:()=>or,decrementMany:()=>Un,getCurrentUsageValues:()=>sd,getLicensedQuota:()=>ls,getQuotaUsage:()=>kr,increment:()=>ht,incrementBudibaseAICredits:()=>hs,incrementMany:()=>Br,removeApp:()=>nD,removeGroup:()=>Wu,removePlugin:()=>Ku,removeRow:()=>sD,removeRows:()=>uD,removeUsers:()=>Aa,set:()=>Fn,setAllUsage:()=>Ui,setAppUsageValue:()=>Li,setBudibaseAICredits:()=>Bh,setUsage:()=>ad,setUsagePerApp:()=>nd,throwIfBudibaseAICreditsExceeded:()=>ys,updatePluginCount:()=>Hu,updateUsage:()=>wa,usageLimitIsExceeded:()=>$u,utils:()=>Qa});var cs=require("@budibase/types");var kt=require("@budibase/backend-core"),Ce=require("@budibase/types"),Fr=require("dd-trace");var ht=n(async(e,t,r)=>await Fr.tracer.trace("quotas.increment",async a=>(a.addTags({name:e,type:t}),await Lh({change:1,name:e,type:t,opts:r}))),"increment"),Br=n(e=>Fr.tracer.trace("quotas.incrementMany",async()=>Lh(e)),"incrementMany"),Lh=n(async e=>await Fr.tracer.trace("quotas.tryIncrement",async t=>{let r=Array.isArray(e)?e:[e];t.addTags({numActions:r.length}),await wa(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 Fr.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 wa(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"),or=n((e,t,r={})=>wa({usageChange:-1,name:e,type:t,opts:r}),"decrement"),Un=n(e=>{let t=Array.isArray(e)?e:[e];return wa(t.map(r=>({usageChange:-r.change,name:r.name,type:r.type,opts:r.opts})))},"decrementMany"),Fn=n(async(e,t,r)=>Tt.setUsage(r,e,t),"set"),XN=n((e,t,r)=>{if(e==Ce.QuotaUsageType.STATIC){let a=r.usageQuota.triggers;return a?a[t]||{}:{}}else{let a=Tt.utils.getCurrentMonthString(),o=r.monthly[a].triggers;return o?o[t]||{}:{}}},"getExistingTriggers"),eD=n(async(e,t,r,a)=>{try{await kt.locks.doWithLock({type:Ce.LockType.TRY_ONCE,name:Ce.LockName.TRIGGER_QUOTA,resource:e,ttl:1e4},async()=>{let o={percentage:r,name:t.name};a&&(o.resetDate=a),await Tr.triggerQuota(o)})}catch(o){kt.logging.logAlert("Error triggering quota",o)}},"triggerQuota"),tD=n(async(e,t,r,a)=>{let o=await kr(),s=e===Ce.QuotaUsageType.MONTHLY?o.quotaReset:void 0,i=await XN(e,t,o),u=a.triggers,l=r/a.value*100;l>100&&(l=100);for(let[c,d]of u.entries())if(l>=d&&a.value!==ar.UNLIMITED){if(!i[d]){i[d]=new Date().toISOString();let y=u[c+1]||100;(!(l>=y)||l===d)&&await eD(t,a,l,s)}}else i[d]=void 0;return i},"checkTriggers"),wa=n(async e=>{await Fr.tracer.trace("quotas.updateUsage",async t=>{let r=kt.tenancy.getTenantId(),a=Array.isArray(e)?e:[e];t.addTags({numActions:a.length,tenantId:r});let o,s,i=[],u={},l={},c={},d={};for(let y of a)await Fr.tracer.trace("quotas.updateUsage.action",async T=>{T.addTags({actionName:y.name,actionType:y.type,actionUsageChange:y.usageChange});try{o=kt.context.getWorkspaceId()}catch{}if(Ce.APP_QUOTA_NAMES.includes(y.name)&&!o)throw new Error("App context required for quota update");try{s=await ls(Ce.QuotaType.USAGE,y.name,y.type),i.push(s);let{total:w,app:O,breakdown:k}=await Tt.getCurrentUsageValues(y.type,y.name,y.opts?.id);w+=y.usageChange,O!=null&&(O+=y.usageChange),k!=null&&(k+=y.usageChange);let G={};if(y.opts?.dryRun||(G=await tD(y.type,y.name,w,s),d={...d,[y.name]:G}),s.value!==ar.UNLIMITED&&w>s.value&&y.usageChange>0)throw new kt.UsageLimitWarning(`${y.name}`);if(w=Math.max(0,w),O&&(O=Math.max(0,O)),k&&(k=Math.max(0,k),c={...c,[y.name]:k}),!y.opts?.dryRun){let ae=y.opts?.valueFn;ae&&(w=await ae(),O=w),u={...u,[y.name]:w},l={...l,[y.name]:O}}}catch(w){throw y.opts?.suppressErrorLog||console.warn(`Error updating usage quotas for ${y.name}`,w),w}});let h=a.filter(y=>!y.opts?.dryRun).map(y=>({name:y.name,type:y.type,values:{total:u[y.name],app:l[y.name],breakdown:c[y.name],triggers:d[y.name]},opts:{...y.opts,tenantId:r}}));h.length>0&&await Tt.setAllUsage(h)})},"updateUsage"),ls=n(async(e,t,r)=>{let a=await Ct.getCachedLicense();if(!a){let o=kt.tenancy.getTenantId();throw new Error("License not found for tenant id "+o)}if(r&&(0,Ce.isStaticQuota)(e,r,t))return a.quotas[e][r][t];if(r&&(0,Ce.isMonthlyQuota)(e,r,t))return a.quotas[e][r][t];if((0,Ce.isConstantQuota)(e,t))return a.quotas[e][t];throw new Error("Invalid quota type")},"getLicensedQuota"),$u=n(async({name:e,type:t,usageChange:r})=>{try{return await wa({usageChange:r,name:e,type:t,opts:{dryRun:!0}}),!1}catch(a){if(a.code===Ce.APIWarningCode.USAGE_LIMIT_EXCEEDED)return!0;throw a}},"usageLimitIsExceeded");var rD=n(async e=>ht(cs.MonthlyQuotaName.ACTIONS,cs.QuotaUsageType.MONTHLY,{fn:e}),"addAction");var Uh=require("@budibase/backend-core"),Ia=require("@budibase/types");var Fh=n(async()=>{let e=await Uh.db.getAllWorkspaces({dev:!0});return e?e.length:0},"getDevAppsCount"),aD=n(async(e,{appId:t}={})=>ht(Ia.StaticQuotaName.WORKSPACES,Ia.QuotaUsageType.STATIC,{fn:e,valueFn:Fh,id:t}),"addApp"),nD=n(async({appId:e}={})=>or(Ia.StaticQuotaName.WORKSPACES,Ia.QuotaUsageType.STATIC,{valueFn:Fh,id:e}),"removeApp");var Ht=require("@budibase/types");var oD=n(async(e,{tableId:t}={})=>ht(Ht.StaticQuotaName.ROWS,Ht.QuotaUsageType.STATIC,{fn:e,id:t}),"addRow"),sD=n(async({tableId:e}={})=>or(Ht.StaticQuotaName.ROWS,Ht.QuotaUsageType.STATIC,{id:e}),"removeRow"),iD=n(async(e,t,{tableId:r}={})=>Br({change:e,name:Ht.StaticQuotaName.ROWS,type:Ht.QuotaUsageType.STATIC,opts:{fn:t,id:r}}),"addRows"),uD=n(async(e,{tableId:t}={})=>Un({change:e,name:Ht.StaticQuotaName.ROWS,type:Ht.QuotaUsageType.STATIC,opts:{id:t}}),"removeRows");var ps=require("@budibase/types");var lD=n(async(e,{automationId:t}={})=>ht(ps.MonthlyQuotaName.AUTOMATIONS,ps.QuotaUsageType.MONTHLY,{fn:e,id:t}),"addAutomation");var Ta=require("@budibase/types");var Gu=n(async e=>ht(Ta.StaticQuotaName.USER_GROUPS,Ta.QuotaUsageType.STATIC,{fn:e}),"addGroup"),Wu=n(async()=>or(Ta.StaticQuotaName.USER_GROUPS,Ta.QuotaUsageType.STATIC),"removeGroup");var xr=require("@budibase/types");var Vu=n(async e=>ht(xr.StaticQuotaName.PLUGINS,xr.QuotaUsageType.STATIC,{fn:e}),"addPlugin"),Ku=n(async()=>or(xr.StaticQuotaName.PLUGINS,xr.QuotaUsageType.STATIC),"removePlugin"),Hu=n(async e=>Fn(xr.StaticQuotaName.PLUGINS,xr.QuotaUsageType.STATIC,e),"updatePluginCount");var Jt=require("@budibase/types"),Bn=require("@budibase/backend-core");var ds=n(async(e,t,r)=>{let a=[{change:e,name:Jt.StaticQuotaName.USERS,type:Jt.QuotaUsageType.STATIC,opts:{fn:r,valueFn:Bn.users.getUserCount}}];t>0&&a.push({change:t,name:Jt.StaticQuotaName.CREATORS,type:Jt.QuotaUsageType.STATIC,opts:{valueFn:Bn.users.getCreatorCount}});let o=await Br(a);return await oa(),o},"addUsers"),Aa=n(async(e,t)=>{let r=[{change:e,name:Jt.StaticQuotaName.USERS,type:Jt.QuotaUsageType.STATIC,opts:{valueFn:Bn.users.getUserCount}}];t>0&&r.push({change:t,name:Jt.StaticQuotaName.CREATORS,type:Jt.QuotaUsageType.STATIC,opts:{valueFn:Bn.users.getCreatorCount}}),await Un(r),await oa()},"removeUsers");var at=require("@budibase/types");var Ju=require("@budibase/backend-core"),gs=require("@budibase/types");var fs=class extends Ju.HTTPError{static{n(this,"GroupNameUnavailableError")}constructor(t){super(`Group name "${t}" is unavailable`,409)}},ms=class extends Ju.HTTPError{static{n(this,"AICreditsExhaustedError")}constructor(){super("You have reached your Budibase AI Credits limit for this billing cycle.",402),this.code=gs.APIWarningCode.USAGE_LIMIT_EXCEEDED}getPublicError(){return{quota:gs.MonthlyQuotaName.BUDIBASE_AI_CREDITS}}};var hs=n(async e=>{try{return await Br({change:e,name:at.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:at.QuotaUsageType.MONTHLY})}catch(t){throw t.code===at.APIWarningCode.USAGE_LIMIT_EXCEEDED&&await cD().catch(()=>{}),t}},"incrementBudibaseAICredits"),cD=n(async()=>{let e=await ls(at.QuotaType.USAGE,at.MonthlyQuotaName.BUDIBASE_AI_CREDITS,at.QuotaUsageType.MONTHLY);e.value>=0&&await Bh(e.value)},"capBudibaseAICreditsAtLimit"),ys=n(async()=>{if(await $u({name:at.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:at.QuotaUsageType.MONTHLY,usageChange:1}))throw new ms},"throwIfBudibaseAICreditsExceeded"),Bh=n(async e=>Fn(at.MonthlyQuotaName.BUDIBASE_AI_CREDITS,at.QuotaUsageType.MONTHLY,e),"setBudibaseAICredits");var vs={};L(vs,{db:()=>Dt});var Yu=require("@budibase/backend-core");var Nt={};L(Nt,{addUsers:()=>mD,adjustGroupCreatorsQuotas:()=>vD,cleanupApp:()=>yD,enrichUserRolesFromGroups:()=>dD,fetch:()=>zu,get:()=>Vh,getBulk:()=>Kh,getGroupBuilderAppIds:()=>Wh,getGroupRoleId:()=>pD,remove:()=>fD,removeUsers:()=>gD,save:()=>Hh,updateGroupApps:()=>hD});var V=require("@budibase/backend-core");async function Qu(e,t){try{let r=[];for(let u of e)if(u.roles){let l=u.roles[V.db.getProdWorkspaceID(t)];l&&r.push(l)}let a=await Promise.all(r.map(async u=>({[u]:await V.roles.roleToNumber(u)}))),o,s,i={};a.forEach(u=>{let[l,c]=Object.entries(u)[0];i[l]={roleId:l,roleNum:c}});for(let{roleId:u,roleNum:l}of Object.values(i))(s===void 0||l>s)&&(s=l,o=u);return o}catch(r){throw V.logging.logAlert(`Error finding higest role for ${e.length} on app ${t}`,r),r}}n(Qu,"findHighestRole");async function Gh(e,t){return t?t=t.filter(r=>e.includes(r._id)):t=await ce.getBulk(e,{enriched:!1}),t}n(Gh,"groupList");async function Wh(e,t){if(!e.userGroups)return[];let r=await Gh(e.userGroups,t?.groups),a=t?.appId?V.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(Wh,"getGroupBuilderAppIds");async function pD(e,t,r){if(!e.userGroups)return null;let a=await Gh(e.userGroups,r?.groups),o=V.db.getProdWorkspaceID(t);return e.roles?.[o]?e.roles[o]:(a=a.filter(u=>u?.roles?Object.keys(u.roles).includes(o):!1),V.context.getCurrentContext()?.appId===t?Qu(a,t):await V.context.doInWorkspaceContext(t,async()=>Qu(a,t)))}n(pD,"getGroupRoleId");async function dD(e){if(!e||!e.userGroups)return e;let t=await Kh(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 V.context.doInWorkspaceContext(o,async()=>{if(e.roles[o])return;let s=await Qu(t,o);s&&(e.roles[o]=s)});let a=await Wh(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(dD,"enrichUserRolesFromGroups");async function zu(){return await ce.fetch()}n(zu,"fetch");async function Vh(e){return await ce.get(e)}n(Vh,"get");async function Kh(e,t={enriched:!0}){return ce.getBulk(e,t)}n(Kh,"getBulk");async function jh(e){if(await ce.getByName(e))throw new fs(e)}n(jh,"guardNameAvailability");async function $h(e){let t=await ce.getGroupUsers(e._id);if(!t.length)return 0;let a=await V.tenancy.getGlobalDB().getMultiple(t.map(s=>s._id));return(await V.userUtils.creatorsInList(a)).filter(s=>s).length}n($h,"getCreatorsCountInGroup");async function Hh(e){let t=[],r=!e._id,a=0;if(!e._id)e._id=ce.generateUserGroupID(),await jh(e.name),t.push(V.events.group.created(e));else{let u=await ce.get(e._id);if(u.name!==e.name&&await jh(e.name),t.push(V.events.group.updated(e)),JSON.stringify(u.roles)!==JSON.stringify(e.roles)){let l=u.users?.length||0,c=0;l>0&&(c=await $h(u)),Object.values(e.roles).includes("CREATOR")?a=l-c:a=-l,t.push(V.events.group.permissionsEdited(e))}}await Promise.all(t);let{users:o,...s}=e,i=n(()=>ce.save(s),"saveGroup");if(r)return await Gu(i);{let u=await i();if(a>0)await ds(0,a);else if(a<0){let l=await $h(e),c=Math.abs(a)-l;c>0&&await Aa(0,c)}return u}}n(Hh,"save");async function fD(e,t){let r;try{r=await ce.get(e)}catch{throw new Error("Group not found")}let a=Object.values(r.roles||{}).includes("CREATOR"),o=n(()=>{},"recalculateCreatorsQuotasFn");if(a){let i=V.tenancy.getGlobalDB(),u=await ce.getGroupUsers(e),c=(await Promise.all(u.map(T=>i.get(T._id)))).map(T=>({...T,userGroups:T.userGroups.filter(q=>q!==e)})),h=(await V.userUtils.creatorsInList(c)).filter(T=>T).length,y=u.length-h;y&&(o=n(()=>Aa(0,y),"recalculateCreatorsQuotasFn"))}let s=await ce.destroy(e,t);return await V.events.group.deleted(r),await Wu(),await o(),s}n(fD,"remove");async function mD(e,t){let r=await ce.get(e),a=await V.users.bulkGetGlobalUsersById(t),o=[];for(let l of a)l.userGroups||(l.userGroups=[]),l.userGroups.includes(e)||o.push(l);if(!o.length)return o;let s=o.map(l=>({...l,userGroups:[...l?.userGroups||[],e]}));if(await V.users.bulkUpdateGlobalUsers(s),Object.values(r.roles||{}).includes("CREATOR")){let c=(await V.userUtils.creatorsInList(o)).filter(h=>h).length,d=o.length-c;d&&await ds(0,d)}let u=[];for(let l of t)u.push(V.cache.user.invalidateUser(l));return await Promise.all(u),await V.events.group.usersAdded(s.length,r,t),s}n(mD,"addUsers");async function gD(e,t){let r=await ce.get(e),a=await V.users.bulkGetGlobalUsersById(t),o=[];for(let u of a){if(!u.userGroups||!u.userGroups.includes(e))continue;let l=u.userGroups.indexOf(e);u.userGroups.splice(l,1),o.push(u)}if(await V.users.bulkUpdateGlobalUsers(o),Object.values(r.roles||{}).includes("CREATOR")){let l=(await V.userUtils.creatorsInList(o)).filter(d=>d).length,c=o.length-l;c&&await Aa(0,c)}let i=[];for(let u of t)i.push(V.cache.user.invalidateUser(u));return await Promise.all(i),o.length&&await V.events.group.usersDeleted(o.length,r,t),o}n(gD,"removeUsers");async function hD(e,t){let r=await Vh(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 Hh(r)}n(hD,"updateGroupApps");async function yD(e){let t=await zu(),r=[];for(let a of t)!a.roles||!a.roles[e]||(delete a.roles[e],r.push(a));return await ce.bulkSave(r)}n(yD,"cleanupApp");async function vD(){if(!await Uu()){let e=V.tenancy.getGlobalDB(),r=(await zu()||[]).filter(a=>Object.values(a?.roles||{}).includes("CREATOR"));for(let a of r){let o=await ce.getGroupUsers(a._id),i=(await Promise.all(o.map(d=>e.get(d._id)))).map(d=>({...d,userGroups:d.userGroups.filter(h=>h!==a._id)})),l=(await V.userUtils.creatorsInList(i)).filter(d=>d).length,c=o.length-l;await ce.save({...a,roles:{}}),c&&await Aa(0,c)}}}n(vD,"adjustGroupCreatorsQuotas");Yu.users.UserDB.init(Qt,Nt,Mt);var Dt=Yu.users.UserDB;var Ts={};L(Ts,{logs:()=>nl});var nl={};L(nl,{logSearch:()=>ED,oldestLogDate:()=>ey,storeLog:()=>RD});var Is=require("@budibase/backend-core"),Xh=require("@budibase/types");var Le=require("@budibase/backend-core"),ws=require("@budibase/types");var Jh=require("@budibase/backend-core");async function Qh(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(u){r=u}return o||Jh.logging.logWarn(`Failed to backoff: ${t}`,r),s}n(Qh,"backOff");var{SEPARATOR:sr,UNICODE_MAX:bD,DocumentType:zh,AutomationViewMode:Zu,ViewName:wD,getQueryIndex:ID}=Le.db,TD=new Date(0).toISOString(),AD=100,bs=10,Xu=n(async()=>Po(ws.ConstantQuotaName.AUTOMATION_LOG_RETENTION_DAYS),"oldestLogDate");function Yh(e,t,{status:r,automationId:a}={},o={}){let s=a?`${a}${sr}`:"",i=r?`${r}${sr}`:"",u;return r&&a?u=`${Zu.ALL}${sr}${i}${s}`:r?u=`${Zu.STATUS}${sr}${i}`:a?u=`${Zu.AUTOMATION}${sr}${s}`:u=`${zh.AUTOMATION_LOG}${sr}`,{...o,descending:!0,startkey:`${u}${t}${bD}`,endkey:`${u}${e}`}}n(Yh,"getAutomationLogParams");function _D(e,t,r){return`${zh.AUTOMATION_LOG}${sr}${e}${sr}${r}${sr}${t}`}n(_D,"generateAutomationLogID");async function el(e,t,r={docs:!0}){let a=Le.context.getProdWorkspaceDB();await a.exists()||(a=Le.context.getDevWorkspaceDB());let o={status:r.status},s=r?.limit?r.limit:r?.paginate?bs+1:void 0,i=Yh(e,t,o,{include_docs:r.docs,limit:s});r?.page&&(i.startkey=r.page);let u=await a.allDocs(i),l=gn(u,{paginate:r?.paginate,pageSize:bs});return{...l,totalLogs:l.totalRows}}n(el,"getAllLogs");async function tl(e,t,r={}){let a=Le.context.getProdWorkspaceDB();await a.exists()||(a=Le.context.getDevWorkspaceDB());let o;try{let i={automationId:r?.automationId,status:r?.status},u=Yh(e,t,i,{include_docs:!0,limit:bs+1});r?.page&&(u.startkey=r.page),o=await a.query(ID(wD.AUTOMATION_LOGS),u)}catch(i){if(i!=null&&(i.name==="not_found"||i.error==="not_found"))return await Td(),tl(e,t,r);throw i}let s=gn(o,{paginate:!0,pageSize:bs});return{...s,totalLogs:s.totalRows/3}}n(tl,"getLogsByView");async function Zh(e,t){let r=Le.context.getProdWorkspaceDB(),a=e._id,o=e.name,s=new Date().toISOString(),i=_D(s,t.status,a),u={...t,automationId:a,status:t.status,automationName:o,createdAt:s,_id:i};return await r.put(u),i}n(Zh,"writeLog");async function rl(e,{clearing:t}={clearing:!1}){let r=Le.context.getProdWorkspaceDB();await Qh(async()=>{let a=await r.get(Le.db.DocumentType.WORKSPACE_METADATA);for(let o of e){let s=o.split(Le.db.SEPARATOR),i=`${s[s.length-3]}${Le.db.SEPARATOR}${s[s.length-2]}`,u={};a.automationErrors&&(u=a.automationErrors),Array.isArray(u[i])||(u[i]=[]);let l=u[i].indexOf(o);t&&l!==-1?u[i].splice(l,1):u[i].push(o),u[i].length===0&&delete u[i],a.automationErrors=u}await r.put(a),await Le.cache.workspace.invalidateWorkspaceMetadata(a.appId,a)},"Failed to update app metadata with automation log error")}n(rl,"updateAppMetadataWithErrors");async function SD(){let e=await Xu();try{return await el(TD,e,{docs:!1,paginate:!1,limit:AD})}catch{return{data:[],hasNextPage:!1,totalLogs:0}}}n(SD,"getExpiredLogs");async function al(){let e=Le.context.getProdWorkspaceDB();try{let t=await SD();if(!t.data||t.data.length===0)return;let r=t.data.map(o=>({_id:o.id,_rev:o.value.rev,_deleted:!0})),a=t.data.filter(o=>{let s=o.id.split(Le.db.SEPARATOR);return s[s.length-1]===ws.AutomationStatus.ERROR}).map(o=>o.id);await e.bulkDocs(r),a.length&&await rl(a,{clearing:!0})}catch(t){Le.logging.logAlert(`Failed to cleanup automation log history - Database "${e.name}"`,t)}}n(al,"clearOldHistory");var ey=Xu;async function xD(e,t,r,a){let o,s=new Date().toISOString(),i=await ey();return(!e||e<i)&&(e=i),r||t?o=await tl(e,s,{automationId:r,status:t,page:a}):o=await el(e,s,{status:t,page:a,docs:!0,paginate:!0}),o}n(xD,"getLogs");async function ED(e){return await al(),await xD(e.startDate,e.status,e.automationId,e.page)}n(ED,"logSearch");async function RD(e,t){if(!Is.db.isProdWorkspaceID(Is.context.getWorkspaceId()))return;let r=await Zh(e,t);t.status===Xh.AutomationStatus.ERROR&&await rl([r]),await al()}n(RD,"storeLog");var As={};L(As,{checkPluginQuotas:()=>PD,deletePlugin:()=>CD,storePlugin:()=>OD});var ny=require("@budibase/types"),Pe=require("@budibase/backend-core");var ty=ue(require("fs")),ry=require("path");function ay(e,t){return ty.default.readFileSync((0,ry.join)(e,t),"utf8")}n(ay,"loadJSFile");async function OD(metadata,directory,source,origin){let db=Pe.tenancy.getGlobalDB(),version=metadata.package.version,name=metadata.package.name,description=metadata.package.description,hash=metadata.schema.hash,bucketPath=Pe.objectStore.getPluginS3Dir(name),files=await Pe.objectStore.uploadDirectory(Pe.objectStore.ObjectStoreBuckets.PLUGINS,directory,bucketPath),jsFile=files.find(e=>e.name.endsWith(".js")),iconFile=files.find(e=>e.name.endsWith(".svg"));if(!jsFile)throw new Error("Plugin missing .js file.");if(metadata.schema.type===ny.PluginType.DATASOURCE){let js=ay(directory,jsFile.name);try{eval(js)}catch(e){let t=e?.message?e.message:JSON.stringify(e);throw new Error(`JS invalid: ${t}`)}}let iconFileName=iconFile?iconFile.name:null,pluginId=Pe.db.generatePluginID(name),rev;try{rev=(await db.get(pluginId))._rev}catch(e){rev=void 0}let doc={_id:pluginId,_rev:rev,...metadata,name,version,hash,description,source};iconFileName&&(doc.iconFileName=iconFileName),source&&(doc={...doc,source}),origin&&origin.source==="github"&&(doc.origin=origin);let write=n(async()=>{let e=await db.put(doc);return await Pe.events.plugin.imported(doc),{...doc,_rev:e.rev}},"write");return rev?await write():await Vu(write)}n(OD,"storePlugin");async function CD(e){let t=Pe.tenancy.getGlobalDB();try{let r=await t.get(e),a=Pe.objectStore.getPluginS3Dir(r.name);await Pe.objectStore.deleteFolder(Pe.objectStore.ObjectStoreBuckets.PLUGINS,a),await t.remove(e,r._rev),await Pe.events.plugin.deleted(r),await Ku()}catch(r){let a=r?.message?r?.message:r;throw new Error(`Failed to delete plugin: ${a}`)}}n(CD,"deletePlugin");async function PD(){let e=Pe.tenancy.getGlobalDB();try{let r=(await e.allDocs(Pe.db.getPluginParams())).rows.length;console.log(`Syncing plugin count: ${r}`),await Hu(r)}catch(t){Pe.logging.logAlert("Unable to retrieve plugins for quota check",t)}}n(PD,"checkPluginQuotas");var _s={};L(_s,{fetch:()=>kD,fetchValues:()=>ND,isEncryptionKeyAvailable:()=>MD,isValid:()=>iy,remove:()=>qD,update:()=>DD});var oy=require("@budibase/backend-core"),jn=require("@budibase/types");function MD(){return!!oy.env.ENCRYPTION_KEY}n(MD,"isEncryptionKeyAvailable");async function kD(){let e=await wr.get();return Object.keys(e.variables)}n(kD,"fetch");async function ND(e){let r=(await wr.get()).variables,a={};for(let[o,s]of Object.entries(r))switch(e){case jn.Environment.DEVELOPMENT:a[o]=s.development;break;case jn.Environment.PRODUCTION:default:a[o]=s.production;break}return a}n(ND,"fetchValues");async function sy(e){if(!(await Vt.cache.getCachedLicense()).features.includes(jn.Feature.ENVIRONMENT_VARIABLES))throw new Error("User does not have access to environment variables feature.");let r=await wr.get();r.variables=e(r.variables),await wr.update(r)}n(sy,"changeValues");async function DD(e,t){if(iy(e))await sy(a=>(a[e]=t,a));else throw new Error("Variable name has characters that are not allowed")}n(DD,"update");async function qD(e){await sy(t=>(delete t[e],t))}n(qD,"remove");function iy(e){return/^[a-zA-Z0-9-_]+$/.test(e)}n(iy,"isValid");var Es={};L(Es,{definitions:()=>HD,download:()=>KD,fetch:()=>VD,write:()=>GD});var nt=require("@budibase/backend-core"),xs=require("@budibase/types");var xe=require("@budibase/backend-core"),qt=require("@budibase/types");var uy=require("memorystream"),ly=new xe.sql.Sql(qt.SqlClient.SQL_LITE);async function LD(e,t,r){let a={operation:qt.Operation.READ,table:ra.searchTable(),tables:{},paginate:{limit:r||9,page:t},filters:e,resource:{fields:[]},sort:{timestamp:{direction:qt.SortOrder.DESCENDING,type:qt.SortType.STRING}}},o=ly._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(LD,"getAuditLogSqlQuery");function UD(e){return`${xe.DocumentType.AUDIT_LOG}${xe.SEPARATOR}${e}${xe.SEPARATOR}${xe.utils.newid()}`}n(UD,"generateAuditLogID");async function cy(e){e._id||(e._id=UD(e.timestamp)),e.type||(e.type=qt.AUDIT_LOG_TYPE);try{let r=await xe.context.getAuditLogsDB().put(e);return{...e,_rev:r.rev}}catch(t){xe.logging.logAlert("Failed to write audit log",t)}}n(cy,"save");async function ol(e,t,r){t||(t=1);let a=xe.context.getAuditLogsDB();try{let o=9+1,s=await LD(e,t,o),i=ra.searchTable(),u=ly.convertJsonStringColumns(i,await a.sql(s.sql,s.bindings)),l;u.length>o&&(l=u.pop());let c={rows:u,hasNextPage:!!l};return c.hasNextPage&&(c.bookmark=t+1),c}catch(o){if(o.status===404&&!r?.isRetry)return await FD(),await id(),await ol(e,t,{isRetry:!0});throw o}}n(ol,"searchSQL");async function FD(){let e=xe.context.getAuditLogsDB(),r=(await e.allDocs(xe.db.getDocParams(xe.DocumentType.AUDIT_LOG,null,{include_docs:!0}))).rows.map(a=>a.doc).filter(a=>a&&!a.type).map(a=>({...a,type:qt.AUDIT_LOG_TYPE}));await e.bulkDocs(r)}n(FD,"migrate");function py(e){let t=xe.context.getAuditLogsDB(),r=new uy,a=t.dump(r,{filter:s=>{let i=s;if(!i._id?.startsWith(xe.DocumentType.AUDIT_LOG))return!1;let u=!0,l=n((c,d)=>{!c||c.length===0||(u=!!(u&&d&&c.includes(d)))},"matcher");if(l(e.userIds,i.userId),l(e.appIds,i.appId),l(e.events,i.event),(e.startDate||e.endDate)&&(u=u&&i.timestamp>=e.startDate&&i.timestamp<=e.endDate),e.fullSearch){let c=JSON.stringify(s);u=u&&c.includes(e.fullSearch)}return u}}),o=new uy;return r.on("data",s=>{let i=JSON.parse(Buffer.from(s).toString());if(Array.isArray(i.docs)){let u="";for(let l of i.docs)u+=JSON.stringify(l)+`
|
|
39
39
|
`;o.write(u)}}),r.on("end",()=>{o.end()}),{promise:a,stream:o}}n(py,"dump");var $n=require("@budibase/backend-core"),Gn=require("@budibase/string-templates"),Ss=require("@budibase/types");var jD=$n.constants.MIN_VALID_DATE.toISOString(),$D=$n.constants.MAX_VALID_DATE.toISOString();function sl(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||jD,e.endDate=e.endDate||$D),e}n(sl,"fillDates");async function dy(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(a=>$n.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=sl(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}n(dy,"getSearchFilters");function il(e,t,r){let a={_id:e,status:Ss.AuditLogResourceStatus.DELETED};switch(t){case"app":a.name=r?.appName;break;case"user":a.email=r?.email;break}return a}n(il,"deleted");function ul(e){let t=(0,Gn.findHBSBlocks)(e);for(let r of t){let a=` "${r}"`;e=e.replace(e.includes(a)?a:` ${r}`,""),e=(0,Gn.processStringSync)(e,{})}return e}n(ul,"removeTemplateStrings");function fy(e,t){let r=Ss.AuditedEventFriendlyName[e];if(!r)throw new Error("No friendly name found.");let a=(0,Gn.processStringSync)(r,t);return a.includes('""')&&(a=ul(r)),a}n(fy,"getEventFriendlyName");async function GD(e,t,r){if(!await ss()||!nt.utils.isAudited(e))return;let a=fy(e,t),o=new Date;r?.timestamp&&(o=new Date(r.timestamp));let s={timestamp:o.toISOString(),event:e,name:a,userId:r?.userId||xs.AuditLogSystemUser,metadata:{...t,...r?.hostInfo}},i={};try{if(r?.appId){s.appId=nt.db.getProdWorkspaceID(r.appId);let u=await nt.cache.workspace.getWorkspaceMetadata(r.appId);"name"in u&&(i.appName=u.name)}if(r?.userId){let u=await nt.users.getById(r?.userId);i.email=u.email}}catch(u){nt.logging.logAlert("Failed to retrieve fallback information for audit log",u)}return s.fallback=i,await cy(s)}n(GD,"write");async function WD(e){let t=e.map(u=>u.userId),a=e.filter(u=>u.appId).map(u=>nt.db.getDevWorkspaceID(u.appId)),o=await nt.users.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),s=await nt.db.getWorkspacesByIDs([...new Set(a)]),i=[];for(let u of e){let l=o.find(h=>h?._id===u.userId),c=s.find(h=>nt.db.isSameWorkspaceID(h?.appId,u.appId)),d={event:u.event,timestamp:u.timestamp,name:u.name,metadata:u.metadata,user:l||il(u.userId,"user",u.fallback)};u.appId&&(d.app=c||il(u.appId,"app",u.fallback)),i.push(d)}return i}n(WD,"enrich");async function VD(e){if(!await ss())throw new Error("Audit logs not available - license required.");let t=await dy(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await ol(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await WD(r.rows)}}n(VD,"fetch");function KD(e){return e=sl(e),py(e)}n(KD,"download");function HD(){let e=Object.entries(xs.AuditedEventFriendlyName).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=ul(r[1]);return t}n(HD,"definitions");var Rs={};L(Rs,{applications:()=>dl,roles:()=>cl,users:()=>ll});var ll={};L(ll,{roleCheck:()=>QD});function JD(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(JD,"removeRoles");async function QD(e,t){return await ba()||JD(e,t),e}n(QD,"roleCheck");var cl={};L(cl,{assign:()=>zD,unAssign:()=>YD});var Wn=require("@budibase/backend-core");async function zD(e,t){if(!await ba())throw new Error("Unable to assign roles - license required.");let r=await Dt.bulkGet(e);for(let a of r){if(t.role&&t.role.roleId){let o=Wn.db.getProdWorkspaceID(t.role.appId);a.roles[o]=t.role.roleId}if(t.appBuilder){let o=Wn.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 Dt.bulkUpdate(r)}n(zD,"assign");async function YD(e,t){if(!await ba())throw new Error("Unable to un-assign roles - license required.");let r=await Dt.bulkGet(e);for(let a of r){if(t.role){let o=Wn.db.getProdWorkspaceID(t.role?.appId);a.roles[o]===t.role.roleId&&delete a.roles[o]}if(t.appBuilder&&a.builder?.apps){let o=Wn.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 Dt.bulkUpdate(r)}n(YD,"unAssign");var dl={};L(dl,{buildExportFn:()=>eq,buildImportFn:()=>XD});var pl=require("@budibase/backend-core");var ZD=n(e=>{if(e){if(e.appExport)return e.appExport;if(e.file)return e.file}},"ensureAppExportFile");function XD(e){return async(t,r)=>{await is()||t.throw(403,"Endpoint unavailable, enterprise license required."),ZD(t.request.files)||t.throw(400,"Must provide app export file for import."),await pl.context.doInWorkspaceContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}n(XD,"buildImportFn");function eq(e){return async(t,r)=>{await is()||t.throw(403,"Endpoint unavailable, enterprise license required.");let{encryptPassword:a,excludeRows:o}=t.request.body;await pl.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(eq,"buildExportFn");var Fe=require("@budibase/backend-core"),Ue=require("@budibase/types"),hy=ue(require("fs")),yy=require("path");var fl=require("@budibase/backend-core");var my;function gy(){my=new fl.queue.BudibaseQueue(fl.queue.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}n(gy,"init");function jr(){return my}n(jr,"getBackupQueue");async function ml(e,t={}){return ft.storeAppBackupMetadata(e,t)}n(ml,"storeAppBackupMetadata");function vy(e){let t=new Date().toISOString();switch(e){case Ue.BackupStatus.COMPLETE:case Ue.BackupStatus.FAILED:return{timestamp:t,finishedAt:t};case Ue.BackupStatus.STARTED:return{timestamp:t,startedAt:t};case Ue.BackupStatus.PENDING:return{timestamp:t,createdAt:t}}}n(vy,"getTimestamps");async function tq(e,t,r,a){let o=await Os(e);return await ft.storeAppBackupMetadata({...o,...vy(t),contents:r,status:t,type:Ue.BackupType.BACKUP},{filename:a,docId:e})}n(tq,"updateBackupStatus");async function rq(e,t,r){let a=await Os(e);return await ft.storeAppBackupMetadata({...a,...vy(r),status:r,type:Ue.BackupType.RESTORE,trigger:Ue.BackupTrigger.MANUAL},{docId:e,docRev:t})}n(rq,"updateRestoreStatus");async function Os(e){return ft.getAppBackupMetadata(e)}n(Os,"getAppBackup");async function aq(e,t){return ft.updateAppBackupMetadata(e,t)}n(aq,"updateAppBackup");async function by(e){let t=await ft.getAppBackupMetadata(e);return t.filename&&await Fe.objectStore.deleteFile(Fe.objectStore.ObjectStoreBuckets.BACKUPS,t.filename),ft.deleteAppBackupMetadata(e)}n(by,"deleteAppBackup");async function nq(e){let t=[];for(let r of e)try{await by(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(nq,"deleteAppBackups");async function oq(e,t){return ft.fetchAppBackups(e,t)}n(oq,"fetchAppBackups");async function wy(e){let t=await ft.getAppBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let{stream:r}=await Fe.objectStore.getReadStream(Fe.objectStore.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}n(wy,"getBackupDownloadStream");async function sq(e){let{stream:t}=await wy(e),r=(0,yy.join)(Fe.objectStore.budibaseTempDir(),Fe.utils.newid()),a=hy.default.createWriteStream(r);return new Promise((o,s)=>{t.on("error",s),a.on("error",s),t.pipe(a).on("close",()=>o(r))})}n(sq,"downloadAppBackup");async function iq(e,t,r={}){let a;try{a=await ml({appId:e,trigger:t,timestamp:new Date().toISOString(),status:Ue.BackupStatus.PENDING,type:Ue.BackupType.BACKUP,...r})}catch(o){if(o.status===409)return;throw o}return await jr().add({docId:a.id,docRev:a.rev,appId:e,export:{trigger:t,...r}}),await Fe.events.backup.appBackupTriggered(e,a.id,Ue.BackupType.BACKUP,t,r?.name),a.id}n(iq,"triggerAppBackup");async function uq(e,t,r,a){let o=await Os(t),s;try{s=await ml({appId:e,timestamp:new Date().toISOString(),status:Ue.BackupStatus.PENDING,type:Ue.BackupType.RESTORE,createdBy:a})}catch(i){if(i?.status===409)return;throw i}return await jr().add({appId:e,docId:s.id,docRev:s.rev,import:{nameForBackup:r,backupId:t,createdBy:a}}),{restoreId:s.id,metadata:o}}n(uq,"triggerAppRestore");async function lq(e,t,r){let a=Fe.db.getProdWorkspaceID(e);await Fe.context.doInWorkspaceContext(a,async()=>{let o=Fe.context.getProdWorkspaceDB();if(!await o.exists())return;let i=await o.tryGet(Ue.DocumentType.WORKSPACE_METADATA);i&&(i.backupErrors||(i.backupErrors={}),i.backupErrors[t]||(i.backupErrors[t]=[]),i.backupErrors[t].push(r),await o.put(i),await Fe.cache.workspace.invalidateWorkspaceMetadata(i.appId,i))})}n(lq,"trackBackupError");var cq={isEnabled:qu,triggerAppRestore:Qe(uq),triggerAppBackup:Qe(iq),getBackupDownloadStream:Qe(wy),downloadAppBackup:Qe(sq),fetchAppBackups:Qe(oq),storeAppBackupMetadata:Qe(ml),updateBackupStatus:Qe(tq),updateRestoreStatus:Qe(rq),getAppBackup:Qe(Os),updateAppBackup:Qe(aq),deleteAppBackup:Qe(by),deleteAppBackups:Qe(nq),trackBackupError:Qe(lq)},xt=cq;var hl={};L(hl,{init:()=>gl});var Ie=require("@budibase/backend-core"),Lt=require("@budibase/types"),_a=ue(require("fs"));async function gl(e){jr().process(async t=>{let r=t.data;try{if(r.export)return console.log("Exporting app backup:",r.appId,r.export.trigger),fq(t,e);if(r.import)return console.log("Importing app backup:",r.appId,r.import.backupId),dq(t,e)}catch(a){Ie.logging.logAlert(`Failed to perform backup for app ID: ${r.appId}`,a)}})}n(gl,"init");async function pq(e){await Ie.db.getDB(e,{skip_setup:!0}).destroy()}n(pq,"removeExistingApp");async function Iy(e,t,r,a){let o=Ie.db.getDevWorkspaceID(r),s=Ie.db.getProdWorkspaceID(r),i=new Date().toISOString(),u=n(async(l,c)=>{a?.doc?await xt.updateBackupStatus(a.doc.id,l,c?.contents,c?.filename):await xt.storeAppBackupMetadata({appId:s,timestamp:i,trigger:e,status:l,name:a?.name,type:Lt.BackupType.BACKUP,contents:c?.contents,createdBy:a?.createdBy},{filename:c?.filename})},"updateMetadata");try{let l=await a.processing.exportAppFn(o,{tar:!0}),c=await a.processing.statsFn(o),d=`${s}/backup-${i}.tar.gz`,h=Ie.objectStore.ObjectStoreBuckets.BACKUPS,y=_a.default.createReadStream(l);await Ie.objectStore.streamUpload({bucket:h,filename:d,stream:y,extra:{type:"application/gzip",metadata:{name:a?.name,trigger:e,timestamp:i,appId:s}}}),await u(Lt.BackupStatus.COMPLETE,{filename:d,contents:c}),_a.default.existsSync(l)&&_a.default.rmSync(l)}catch(l){Ie.logging.logAlert("App backup error",l),await u(Lt.BackupStatus.FAILED);let c=a?.doc?.id||`backup-${i}`,d=l instanceof Error?l.message:String(l);await xt.trackBackupError(s,c,`Backup export failed: ${d}`)}}n(Iy,"runBackup");async function dq(e,t){let r=e.data,a=r.appId,o=r.import.backupId,s=r.import.nameForBackup,i=r.import.createdBy,u=Ie.tenancy.getTenantIDFromWorkspaceID(a);return Ie.tenancy.doInTenant(u,async()=>{let l=Ie.db.getDevWorkspaceID(a),c=`${l}_temp_${Date.now()}`,{rev:d}=await xt.updateRestoreStatus(r.docId,r.docRev,Lt.BackupStatus.STARTED);await Iy(Lt.BackupTrigger.RESTORING,u,a,{processing:t,createdBy:i,name:s});let h=await xt.downloadAppBackup(o),y=Lt.BackupStatus.COMPLETE;try{await t.importAppFn(c,Ie.db.getDB(c),{file:{type:"application/gzip",path:h},key:h}),await pq(l),await new Ie.db.Replication({source:c,target:l}).replicate()}catch(T){Ie.logging.logAlert("App restore error",T),y=Lt.BackupStatus.FAILED;let q=T instanceof Error?T.message:String(T);await xt.trackBackupError(a,o,`Backup restore failed: ${q}`)}finally{try{await Ie.db.getDB(c,{skip_setup:!0}).destroy()}catch{}}await xt.updateRestoreStatus(r.docId,d,y),_a.default.existsSync(h)&&_a.default.rmSync(h,{force:!0})})}n(dq,"importProcessor");async function fq(e,t){let r=e.data,a=r.appId,o=r.export.trigger,s=r.export.name,i=Ie.tenancy.getTenantIDFromWorkspaceID(a);await Ie.tenancy.doInTenant(i,async()=>{try{let{rev:u}=await xt.updateBackupStatus(r.docId,Lt.BackupStatus.STARTED);return Iy(o,i,a,{processing:t,doc:{id:r.docId,rev:u},name:s})}catch(u){Ie.logging.logAlert("App backup error",u);let l=u instanceof Error?u.message:String(u);await xt.trackBackupError(a,r.docId,`Backup export failed: ${l}`)}})}n(fq,"exportProcessor");var mq=n(async e=>{gy(),await gl(e.processing)},"init"),Vn={...xt,processing:hl,init:mq,getBackupQueue:jr};var Ty=n(async e=>{e.backups&&await Vn.init(e.backups)},"init");var Gs={};L(Gs,{create:()=>i2,find:()=>s2,get:()=>o2,remove:()=>l2,update:()=>u2});var KI=ue(lc()),ir=require("@budibase/backend-core");var HI=require("@budibase/types");async function o2(e){let t=ir.tenancy.getGlobalDB(),r=new ir.db.QueryBuilder(t.name,HI.SearchIndex.USER);r.setIndexBuilder(ir.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(o2,"get");async function s2(e){return await ir.users.getById(e)}n(s2,"find");async function i2(e){let t=await Dt.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new ir.HTTPError("User is already synched",409);e={...t,scimInfo:(0,KI.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await Dt.save(e,{requirePassword:!1})}n(i2,"create");async function u2(e,t){return await Dt.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}n(u2,"update");async function l2(e){return await Dt.destroy(e)}n(l2,"remove");var Ws={};L(Ws,{create:()=>c2});var JI=ue(lc());var QI=require("@budibase/backend-core");async function c2(e){let t=await Bi(e.name),r;if(!t)r=(await Nt.save(e)).id;else{if(t.scimInfo?.isSync)throw new QI.HTTPError("Group is already synched",409);r=t._id,t.users.length&&await Nt.removeUsers(r,t.users.map(o=>o._id)),t.scimInfo=(0,JI.default)(t.scimInfo,e.scimInfo),await Nt.save(t)}return await Nt.get(r)}n(c2,"create");var Gr={};L(Gr,{logRequest:()=>f2,logResponse:()=>m2});var Ut=require("@budibase/backend-core"),YI=ue(zI());var{DocWritethrough:p2}=Ut.cache.docWritethrough;function d2(){return`${Ut.db.DocumentType.SCIM_LOG}${Ut.db.SEPARATOR}${(0,YI.default)().format("YYYYMMDD")}`}n(d2,"getLogDocId");var ZI=n(()=>{let e=Ut.context.getScimDBName();return new p2(Ut.db.getDB(e),d2())},"getDB");async function f2(e){Ut.logging.logWarn("SCIM request log",e);let t=Date.now().toString();return await ZI().patch({[`${t}_request`]:{ts:new Date().toISOString(),...e}}),t}n(f2,"logRequest");async function m2(e,t){Ut.logging.logWarn("SCIM response",t),await ZI().patch({[`${e}_response`]:{ts:new Date().toISOString(),...t}})}n(m2,"logResponse");var yc={};L(yc,{doInScimContext:()=>v2,feature:()=>fc,internalGroupOnly:()=>T2,licenseAuth:()=>hc,licensing:()=>XI,requireSCIM:()=>b2,scimGroupOnly:()=>I2,scimUserOnly:()=>w2});var Er=require("@budibase/backend-core");var Vs=require("@budibase/types");var g2=n((e={checkUsersLimit:!0})=>async(t,r)=>{if((e.licensingCheck?e.licensingCheck:()=>!!t.user)(t)){if(Er.env.SELF_HOSTED&&Er.env.DEFAULT_LICENSE)return t.user.license=ji,r();t.user.license=await Vt.cache.getCachedLicense(),e.checkUsersLimit&&(Er.utils.isServingApp(t)||Er.utils.isServingBuilder(t)||Er.utils.isServingBuilderPreview(t)||Er.utils.isPublicApiRequest(t))&&await Qt.usageLimitIsExceeded({name:Vs.StaticQuotaName.USERS,type:Vs.QuotaUsageType.STATIC,usageChange:0})}return r()},"licensing"),XI=g2;var fc={};L(fc,{requireFeature:()=>h2,requireFeatures:()=>y2});var h2=n(e=>async(t,r)=>{await os(e),await r()},"requireFeature"),y2=n((...e)=>async(t,r)=>{await Du(e),await r()},"requireFeatures");var Ks=require("@budibase/backend-core");var v2=n(async(e,t)=>{let r;return Ks.env.ENABLE_SCIM_LOGGER&&(r=await Gr.logRequest({...e.request.toJSON(),body:e.request.body})),await Ks.context.doInScimContext(async()=>{let a=await t();return r&&await Gr.logResponse(r,{...e.response.toJSON(),body:e.response.body}),a})},"doInScimContext");var b2=n(async(e,t)=>{await Fu(),await t()},"requireSCIM");var eT=require("@budibase/backend-core");var w2=n(e=>mc(eT.users.getById,e,!0),"scimUserOnly"),I2=n(e=>mc(ce.get,e,!0),"scimGroupOnly"),T2=n(e=>mc(ce.get,e,!1),"internalGroupOnly");function mc(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(mc,"scimSyncChecks");var Wr=require("@budibase/backend-core");var gc=require("dd-trace");async function hc(e,t){await gc.tracer.trace("licenseAuth",async r=>{let a=e.request.headers[Wr.constants.Header.LICENSE_KEY]||Wr.utils.getBearerToken(e);Array.isArray(a)&&(a=a[0]),a||e.throw(403,"License key not provided");let o=await Ou(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"),gc.tracer.setUser({id:"anonymous",tenantId:o.tenantId}),await Wr.context.doInSelfHostTenantUsingCloud(o.tenantId,async()=>{await Wr.context.doInLicenseContext(o,async()=>{await t()})})})}n(hc,"default");var wc={};L(wc,{group:()=>bc,user:()=>vc});var vc={};L(vc,{fromScimUser:()=>E2,toScimUserResponse:()=>_2,userFilters:()=>R2});var tT=require("@budibase/backend-core"),rT=require("@budibase/shared-core"),Hs=require("@budibase/types"),aT=require("scim2-parse-filter");var{unreachable:A2}=rT.utils,_2=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===Hs.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"),S2=n(e=>!!e?.id,"isScimUserResponse");function x2(e){if(tT.utils.validEmail(e.userName))return e.userName;if(e.emails)return e.emails.find(t=>t.primary)?.value||e.emails[0]?.value}n(x2,"tryGetEmail");var E2=n(e=>{let t=S2(e)?e:void 0,r=x2(e);if(!r)throw new Error("Email is required");let a;switch(e.active){case"True":case"true":case!0:a=!0;break;case"False":case"false":case!1:a=!1;break;default:A2(e.active)}let o,s;return e.name?.givenName?(o=e.name?.givenName,s=e.name?.familyName):o=e.displayName,{tenantId:"",_id:t?.id,userId:t?.id,email:r,firstName:o,lastName:s,scimInfo:{...e,isSync:!0},roles:{},status:a?Hs.UserStatus.ACTIVE:Hs.UserStatus.INACTIVE,createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},"fromScimUser"),R2=n(e=>{let t={equal:{}},r=(0,aT.parse)(e);function a(o){switch(o.op){case"eq":{let s=o.attrPath,i;switch(s){case"emails.value":i="email";break;default: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 bc={};L(bc,{fromScimGroup:()=>P2,toScimGroupResponse:()=>O2});var O2=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"),C2=n(e=>!!e?.id,"isScimGroup"),P2=n(e=>{let t=C2(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 kp={};L(kp,{LLM:()=>zt,LLMRequest:()=>ke,TableGeneration:()=>Mp,agentHistoryTitleSystemPrompt:()=>z2,agentSystemPrompt:()=>Q2,aiColumnSchemas:()=>Cp,aiTableResponseToTableSchema:()=>xp,appendAIColumns:()=>Ep,classifyText:()=>B2,cleanData:()=>j2,composeAutomationAgentSystemPrompt:()=>H2,composeAutomationAgentToolGuidelines:()=>J2,extractFileData:()=>U2,generateAIColumns:()=>Oc,generateCronExpression:()=>$2,generateData:()=>Cc,generateJs:()=>K2,generateTables:()=>Rc,generationStructure:()=>Op,getLLM:()=>Ec,getLLMConfig:()=>xc,getLLMOrThrow:()=>cT,normalizeContentType:()=>Ic,parseResponseFormat:()=>Ac,sanitiseToolName:()=>M2,searchWeb:()=>V2,sentimentAnalysis:()=>W2,summarizeText:()=>Tc,tableDataStructuredOutput:()=>Pp,translate:()=>G2});var Qn=require("@budibase/types");function M2(e){if(e.length>64)throw new Error("Tool name must be under 64 characters long");return e.replace(/[^a-zA-Z0-9_-]/g,"_")}n(M2,"sanitiseToolName");function Ic(e){return e?e.includes("/")?e:{[Qn.SupportedFileType.PDF]:"application/pdf",[Qn.SupportedFileType.JPG]:"image/jpeg",[Qn.SupportedFileType.JPEG]:"image/jpeg",[Qn.SupportedFileType.PNG]:"image/png"}[e.toLowerCase()]||"application/octet-stream":"application/octet-stream"}n(Ic,"normalizeContentType");var Zs=require("@budibase/types");var Yt=require("@budibase/backend-core"),iT=require("@budibase/types"),Zn=require("dd-trace"),uT=require("zod");var nT=require("@budibase/types"),Js=ue(require("openai"));var zn=ue(require("dd-trace"));var zt=class{static{n(this,"LLM")}constructor({model:t,apiKey:r,maxTokens:a}){this._model=t,this._apiKey=r,this._maxTokens=a??parseInt(process.env.BUDIBASE_AI_MAX_PROMPT_TOKENS||"1000")}get model(){return this._model}get apiKey(){return this._apiKey}get maxTokens(){return this._maxTokens}async prompt(t){return await zn.default.trace("prompt",async()=>{let r=typeof t=="string"?new ke().addUserMessage(t):t,{messages:a,tokensUsed:o}=await zn.default.trace("chatCompletion",()=>this.chatCompletion(r));return!a||a.length===0?{message:"",tokensUsed:o}:{message:a[a.length-1].content||"",tokensUsed:o}})}async chat(t){return await zn.default.trace("chat",async()=>await this.chatCompletion(t))}async summarizeText(t){return zn.default.trace("summarizeText",()=>this.prompt(Tc(t)))}};var Yn=(a=>(a.GPT_5_MINI="gpt-5-mini",a.GPT_5="gpt-5",a.GPT_5_NANO="gpt-5-nano",a))(Yn||{});function Ac(e){if(e)return e==="text"?{type:"text"}:e==="json"?{type:"json_object"}:e}n(Ac,"parseResponseFormat");function k2(e){if(!e)return 0;let t=e.prompt_tokens;return e.completion_tokens*3+t}n(k2,"calculateBudibaseAICredits");var Ft=class extends zt{constructor(r){super(r);this.supportsFiles=!0;this.client=this.getClient(r)}static{n(this,"OpenAI")}getVerbosityForModel(){if(Object.values(Yn).includes(this.model))return"low"}getClient(r){if(!r.apiKey)throw new Error("No OpenAI API key found");return new Js.default({apiKey:r.apiKey})}async uploadFile(r,a,o){let s=Ic(o);if(nT.ImageContentTypes.includes(s.toLowerCase())){let l;if(Buffer.isBuffer(r))l=r;else{let d=[];for await(let h of r)d.push(new Uint8Array(h));l=Buffer.concat(d)}let c=l.toString("base64");return`data:${s};base64,${c}`}let i=await(0,Js.toFile)(r,a);return(await this.client.files.create({file:i,purpose:"assistants"})).id}async chatCompletion(r){let a={model:this.model,messages:r.messages,max_completion_tokens:this._maxTokens,response_format:Ac(r.format)};if(Object.values(Yn).includes(this.model)){let i=this.getVerbosityForModel();i&&(a.verbosity=i),a.reasoning_effort="minimal"}let o=await this.client.chat.completions.create(a),s=o?.choices?.[0]?.message;if(s?.content)return{messages:[...r.messages,{role:s.role,content:s.content}],tokensUsed:k2(o.usage)};throw new Error("No response found")}};var _c=ue(require("@anthropic-ai/sdk"));function N2(e){if(!e)return 0;let t=e.input_tokens;return e.output_tokens*3+t}n(N2,"calculateBudibaseAICredits");var Qs=class extends zt{constructor(r){super(r);this.supportsFiles=!1;this.client=new _c.default({apiKey:r.apiKey})}static{n(this,"Anthropic")}firstTextBlock(r){for(let a of r.content)if(a.type==="text")return a.text}async uploadFile(r,a,o){throw new Error("File upload not supported for this LLM provider")}async chatCompletion(r){try{let a=await this.client.messages.create({model:this.model,messages:r.messages.map(({content:s})=>{if(s==null)return{role:"user",content:""};if(typeof s=="string")return{role:"user",content:s};let i="";for(let u of s)u.type==="text"?i+=u.text:["image_url","input_audio","file"].includes(u.type);return{role:"user",content:i}}),max_tokens:this.maxTokens}),o=this.firstTextBlock(a)||"";return{messages:[...r.messages,{role:"assistant",content:o}],tokensUsed:N2(a.usage)}}catch(a){throw a instanceof _c.default.APIError&&console.error(`Anthropic Prompt failed with error ${a.name} and status: ${a.status}`),a}}};var oT=require("openai");var zs=class extends Ft{constructor(){super(...arguments);this.supportsFiles=!1}static{n(this,"AzureOpenAI")}getClient(r){if(!r.apiKey)throw new Error("No Azure OpenAI API key found");if(!r.model)throw new Error("No Azure OpenAI model specified");return new oT.AzureOpenAI({apiKey:r.apiKey,apiVersion:"2024-10-01-preview",baseURL:r.baseUrl})}getVerbosityForModel(){return Object.values(Yn).includes(this.model)?"medium":void 0}};var Ge=require("@budibase/backend-core"),sT=require("@budibase/types"),Sc=require("dd-trace");var Ys=class extends zt{constructor(){super(...arguments);this.supportsFiles=!0}static{n(this,"BudibaseAI")}async prompt(r){await ys();let a=await super.prompt(r);return a.tokensUsed&&await hs(a.tokensUsed),a}async chat(r){await ys();let a=await super.chat(r);return a.tokensUsed&&await hs(a.tokensUsed),a}async uploadFile(r,a,o){return Ge.env.SELF_HOSTED?this.uploadFileSelfHost(r,a,o):this.uploadFileCloud(r,a,o)}async uploadFileCloud(r,a,o){return new Ft({apiKey:Ge.env.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).uploadFile(r,a,o)}async uploadFileSelfHost(r,a,o){let s;if(Buffer.isBuffer(r))s=r;else{let h=[];for await(let y of r)h.push(new Uint8Array(y));s=Buffer.concat(h)}let i=s.toString("base64");if(o&&sT.ImageContentTypes.includes(o.toLowerCase()))return`data:image/jpeg;base64,${i}`;if(!Ge.env.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(!this._apiKey){let h=await es();if(!h)throw new Error("No license key found");this._apiKey=h}let u=`${Ge.env.BUDICLOUD_URL}/api/ai/upload-file`,l={method:"POST",headers:{"Content-Type":"application/json",[Ge.constants.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify({data:i,filename:a,contentType:o})};console.debug("[BudibaseAI] uploadFileSelfHost - Making network call",{url:u,method:l.method,headers:l.headers,bodyKeys:["data","filename","contentType"],filename:a,contentType:o});let c=await Ao(u,l);if(console.debug("[BudibaseAI] uploadFileSelfHost - Network response",{url:u,status:c.status,statusText:c.statusText,ok:c.ok}),!c.ok)throw await Ge.HTTPError.fromResponse(c);return(await c.json()).file}async chatCompletion(r){return Ge.env.SELF_HOSTED?this.chatCompletionSelfHost(r):this.chatCompletionCloud(r)}async chatCompletionCloud(r){return await Sc.tracer.trace("chatCompletionCloud",async()=>await new Ft({apiKey:Ge.env.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletion(r))}async chatCompletionSelfHost(r){return await Sc.tracer.trace("chatCompletionSelfHost",async a=>{if(!Ge.env.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(a.addTags({budicloudUrl:Ge.env.BUDICLOUD_URL}),!this._apiKey){let c=await es();if(!c)throw new Error("No license key found");this._apiKey=c}let o={messages:r.messages,format:r.format},s=`${Ge.env.BUDICLOUD_URL}/api/ai/chat`,i={method:"POST",headers:{"Content-Type":"application/json",[Ge.constants.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify(o)};console.debug("[BudibaseAI] chatCompletionSelfHost - Making network call",{url:s,method:i.method,headers:i.headers,bodyKeys:Object.keys(o),messagesCount:r.messages.length,format:o.format});let u=await Ao(s,i);if(console.debug("[BudibaseAI] chatCompletionSelfHost - Network response",{url:s,status:u.status,statusText:u.statusText,ok:u.ok}),!u.ok)throw await Ge.HTTPError.fromResponse(u);let l=await u.json();return console.debug("[BudibaseAI] chatCompletionSelfHost - Response data",{url:s,tokensUsed:l.tokensUsed,messagesCount:l.messages?.length}),l})}};var lT={OpenAI:"gpt-5-mini",TogetherAI:"gpt-5-mini",AzureOpenAI:"gpt-4.1",Custom:"gpt-5-mini",Anthropic:"claude-3-5-sonnet-20240620",BudibaseAI:"gpt-5-mini"},D2={OpenAI:Ft,TogetherAI:Ft,AzureOpenAI:zs,Custom:Ft,Anthropic:Qs,BudibaseAI:Ys};async function q2(){return await Zn.tracer.trace("getAIConfig",async e=>{let t={type:iT.ConfigType.AI,config:{}};if(!Yt.context.isSelfHostUsingCloud()){let a=await Yt.configs.getAIConfig();a&&(t=a)}await Bu(t);let r=Object.values(t.config).find(a=>a.active&&a.isDefault);if(!r){e.addTags({enabled:!1,reason:"no provider found"});return}return e.addTags({enabled:!0}),{provider:r.provider,model:r.defaultModel||lT[r.provider],apiKey:r.apiKey,baseUrl:r.baseUrl}})}n(q2,"getAIConfig");async function L2(){return Zn.tracer.trace("getSelfHostOpenAIKeyConfig",e=>{if(!Yt.env.SELF_HOSTED){e.addTags({enabled:!1,reason:"not self host"});return}if(!Yt.env.OPENAI_API_KEY){e.addTags({enabled:!1,reason:"no OPENAI_API_KEY"});return}return e.addTags({enabled:!0}),{provider:"OpenAI",model:lT.OpenAI,apiKey:Yt.env.OPENAI_API_KEY}})}n(L2,"getSelfHostOpenAIKeyConfig");async function xc(){return Zn.tracer.trace("getLLMConfig",async()=>await q2()||await L2())}n(xc,"getLLMConfig");async function Ec(e){return await Zn.tracer.trace("getLLM",async t=>{let{model:r,maxTokens:a}=e||{},o=await xc();if(!o){t.addTags({enabled:!1,reason:"no config found"});return}r&&(o.model=r),a&&(o.maxTokens=a);let s=D2[o.provider];if(!s){t.addTags({enabled:!1,reason:"no provider found",provider:o.provider});return}return new s(o)})}n(Ec,"getLLM");async function cT(){let e=await Ec();if(!e)throw new Yt.HTTPError("No available LLM configurations",500);return e}n(cT,"getLLMOrThrow");var ke=class e{constructor(){this.messages=[]}static{n(this,"LLMRequest")}withFormat(t){return t instanceof uT.z.ZodType?this.format={type:"json_schema",json_schema:{name:"response",strict:!1,schema:t.toJSONSchema({target:"draft-7"})}}:this.format=t,this}addMessage(t){return this.messages.push(t),this}addMessages(t){return this.messages.push(...t),this}addUserMessage(t){return this.messages.push({role:"user",content:t}),this}addSystemMessage(t){return this.messages.push({role:"system",content:t}),this}static fromRequest(t){let r=new e;return t.messages&&r.addMessages(t.messages),t.format&&r.withFormat(t.format),r}};var ur=require("zod");function Tc(e,t){let r=`Summarize this text:
|
|
40
40
|
${e}`,a="";if(t)switch(t){case Zs.SummariseLength.SHORT:a="In 1-2 concise sentences, ";break;case Zs.SummariseLength.MEDIUM:a="In 2-3 paragraphs, ";break;case Zs.SummariseLength.LONG:a="In multiple detailed paragraphs, ";break}return new ke().addUserMessage(`${a}${r}.
|
|
41
41
|
Only return the summary.`)}n(Tc,"summarizeText");function U2(e,t,r){if(typeof t!="string"||!t.trim())throw new Error("Invalid file reference returned from uploadFile");let a=["You are a data extraction assistant.","Extract data from the attached document/image that matches the provided schema.","The schema defines the structure where values like 'string', 'number', 'boolean' indicate the expected data types.","Extract all items that match the schema from the document.","Return the data in json format. This array should never have more than 1 element.","If no matching data is found, return an empty data array."].join(`
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"dist"
|
|
5
5
|
],
|
|
6
6
|
"license": "UNLICENSED",
|
|
7
|
-
"version": "3.31.
|
|
7
|
+
"version": "3.31.1",
|
|
8
8
|
"description": "Budibase Pro (Backend)",
|
|
9
9
|
"main": "dist/index.js",
|
|
10
10
|
"types": "dist/index.d.ts",
|
|
@@ -69,5 +69,5 @@
|
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
},
|
|
72
|
-
"gitHead": "
|
|
72
|
+
"gitHead": "9de72ce9dd1c290eb3d16fd22693192923f46f06"
|
|
73
73
|
}
|