@budibase/pro 3.20.12 → 3.20.14
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
|
@@ -34,7 +34,7 @@ l2HXiAD1Q2rlHNW9wDaYyKb1F5f+v4RyqCAyzlkwRdksmkLeECTboojNnmRCrE3C
|
|
|
34
34
|
d/o3ZWE1TTj1zYwlCLN5qRKr3hU8nC3xEYNEbkB9SfTRaOq9Q7P8WmfLkoCPm3pR
|
|
35
35
|
mwIDAQAB
|
|
36
36
|
-----END PUBLIC KEY-----
|
|
37
|
-
`;function sa(e){return Wo.default.verify(e,SS,{algorithms:["RS256"]})}a(sa,"verifyLicenseToken");function wS(e,t){return Wo.default.sign(t,e,{encoding:"utf-8",algorithm:"RS256"})}a(wS,"sign");var ln={};x(ln,{getFeatures:()=>$o});var l=require("@budibase/types");var TS={[l.PlanType.FREE]:[...De.SELF_FREE_LICENSE.features],[l.PlanType.PREMIUM]:void 0,[l.PlanType.PREMIUM_PLUS]:[l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PDF,l.Feature.BUDIBASE_AI],[l.PlanType.PREMIUM_PLUS_TRIAL]:[l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PDF,l.Feature.BUDIBASE_AI],[l.PlanType.PRO]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS],[l.PlanType.TEAM]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS],[l.PlanType.BUSINESS]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.PDF,l.Feature.BUDIBASE_AI],[l.PlanType.ENTERPRISE_BASIC]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.BUDIBASE_AI,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC],[l.PlanType.ENTERPRISE_BASIC_TRIAL]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.BUDIBASE_AI,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC],[l.PlanType.ENTERPRISE]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.BUDIBASE_AI,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC]},ES={[l.PlanType.FREE]:[...De.CLOUD_FREE_LICENSE.features],[l.PlanType.PREMIUM]:[l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.PDF],[l.PlanType.PREMIUM_PLUS]:[l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.BUDIBASE_AI,l.Feature.PDF],[l.PlanType.PREMIUM_PLUS_TRIAL]:[l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.BUDIBASE_AI,l.Feature.PDF],[l.PlanType.PRO]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING],[l.PlanType.TEAM]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING],[l.PlanType.BUSINESS]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.BUDIBASE_AI,l.Feature.PDF],[l.PlanType.ENTERPRISE_BASIC]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC],[l.PlanType.ENTERPRISE_BASIC_TRIAL]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC],[l.PlanType.ENTERPRISE]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC]};function $o(e,t){let r=[];function n(o){let s=o[t];if(!s)throw new Error(`Features do not exist for planType=${t} and hosting=${e}`);return s}switch(a(n,"readFeatures"),e){case l.Hosting.SELF:r=n(TS);break;case l.Hosting.CLOUD:r=n(ES);break}return r}a($o,"getFeatures");var dn={};x(dn,{UNLIMITED:()=>m,getQuotas:()=>jo});var J=require("@budibase/types");var d=At,Pc=De,m=-1,ua=a(e=>e*1e6,"millions"),vS={[J.PlanType.FREE]:{...Pc.CLOUD_FREE_LICENSE.quotas},[J.PlanType.PREMIUM]:{usage:{monthly:{...d.queries(m),...d.automations(1e3),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(1e4),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(0),...d.plugins(m),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(7),...d.appBackupRetentionDays(7)}},[J.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...d.queries(m),...d.automations(5e3),...d.budibaseAICredits(ua(2)),...d.actions(m)},static:{...d.rows(25e3),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(0),...d.plugins(m),...d.customAIConfigurations(1)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(30)}},[J.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...d.queries(m),...d.automations(5e3),...d.budibaseAICredits(ua(2)),...d.actions(m)},static:{...d.rows(25e3),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(0),...d.plugins(m),...d.customAIConfigurations(1)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(30)}},[J.PlanType.PRO]:{usage:{monthly:{...d.queries(m),...d.automations(1e3),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(5),...d.plugins(m),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(7),...d.appBackupRetentionDays(7)}},[J.PlanType.TEAM]:{usage:{monthly:{...d.queries(m),...d.automations(5e3),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(10),...d.plugins(m),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(90)}},[J.PlanType.BUSINESS]:{usage:{monthly:{...d.queries(m),...d.automations(1e4),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(5e4),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(50),...d.plugins(m),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(365),...d.appBackupRetentionDays(365)}},[J.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(ua(4)),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(m),...d.plugins(m),...d.customAIConfigurations(m)}},constant:{...d.automationLogRetentionDays(m),...d.appBackupRetentionDays(m)}},[J.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(ua(4)),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(m),...d.plugins(m),...d.customAIConfigurations(m)}},constant:{...d.automationLogRetentionDays(15),...d.appBackupRetentionDays(15)}},[J.PlanType.ENTERPRISE]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(ua(4)),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(m),...d.plugins(m),...d.customAIConfigurations(m)}},constant:{...d.automationLogRetentionDays(m),...d.appBackupRetentionDays(m)}}},RS={[J.PlanType.FREE]:{...Pc.SELF_FREE_LICENSE.quotas},[J.PlanType.PREMIUM]:void 0,[J.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(0),...d.plugins(m),...d.customAIConfigurations(1)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(30)}},[J.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(0),...d.plugins(m),...d.customAIConfigurations(1)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(30)}},[J.PlanType.PRO]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(5),...d.plugins(m),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(7),...d.appBackupRetentionDays(7)}},[J.PlanType.TEAM]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(10),...d.plugins(m),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(90)}},[J.PlanType.BUSINESS]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(50),...d.plugins(m),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(90),...d.appBackupRetentionDays(365)}},[J.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(m),...d.plugins(m),...d.customAIConfigurations(m)}},constant:{...d.automationLogRetentionDays(m),...d.appBackupRetentionDays(m)}},[J.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(m),...d.plugins(m),...d.customAIConfigurations(m)}},constant:{...d.automationLogRetentionDays(15),...d.appBackupRetentionDays(15)}},[J.PlanType.ENTERPRISE]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(m),...d.plugins(m),...d.customAIConfigurations(m)}},constant:{...d.automationLogRetentionDays(m),...d.appBackupRetentionDays(m)}}};function jo(e,t){let r;function n(o){let s=o[t];if(!s)throw new Error(`Quotas do not exist for planType=${t} and hosting=${e}`);return s}switch(a(n,"readQuotas"),e){case J.Hosting.SELF:r=n(RS);break;case J.Hosting.CLOUD:r=n(vS);break}return JSON.parse(JSON.stringify(r))}a(jo,"getQuotas");var cr={};x(cr,{encoding:()=>ur,workspaceExists:()=>_S});var Uc=require("@budibase/backend-core");async function _S(e){return(await Uc.db.getAllWorkspaces({all:!0,idsOnly:!0})).includes(e)}a(_S,"workspaceExists");var ur={};x(ur,{base64ToObject:()=>CS,objectToBase64:()=>xS});function xS(e){let t=JSON.stringify(e);return Buffer.from(t).toString("base64")}a(xS,"objectToBase64");function CS(e){let t=Buffer.from(e,"base64").toString();return JSON.parse(t)}a(CS,"base64ToObject");var yf=require("@budibase/types"),wr=require("@budibase/backend-core"),Af=F(Yl()),bf=F(As());async function nx(e){await We.save({offlineLicenseToken:e}),await Kt()}a(nx,"activateOfflineLicenseToken");async function ox(){await We.save({offlineLicenseToken:void 0}),await Kt()}a(ox,"deleteOfflineLicenseToken");async function If(){return(await We.get()).offlineLicenseToken}a(If,"getOfflineLicenseToken");async function bs(){let t=(await wr.installation.getInstall()).installId,r=wr.context.getTenantId(),n=await wr.events.identification.getUniqueTenantId(r);return{installId:t,tenantId:n}}a(bs,"getIdentifier");async function sx(){let e=await bs();return ur.objectToBase64(e)}a(sx,"getIdentifierBase64");function ix(e){return ur.base64ToObject(e)}a(ix,"getIdentifierFromBase64");function Sf(e){let t=Date.now(),r=new Date(e.expireAt).getTime();if(t>r)throw new Error(`Offline license has expired. expireAt=${e.expireAt}`)}a(Sf,"verifyExpiry");async function wf(e){let t=await bs();if(e.identifier.installId!==t.installId||e.identifier.tenantId!==t.tenantId)throw new Error("Invalid offline license")}a(wf,"verifyInstallation");function Tf(e){let t=e.plan.type,r=yf.Hosting.SELF,n=$o(r,t),o=jo(r,t);return e.features=(0,Af.default)(e.features,n),e.quotas=(0,bf.default)(e.quotas,o),e}a(Tf,"enrichLicense");async function Is(){try{let e=await If();if(e){let t=await sa(e);return Sf(t),await wf(t),Tf(t)}}catch(e){console.error("Error retrieving offline license",e)}}a(Is,"getOfflineLicense");var _a={};x(_a,{deleteDevLicense:()=>dx,getOfflineLicense:()=>px,writeDevLicenseToDisk:()=>lx});var Ef=require("@budibase/backend-core"),ws=require("path"),vf=require("os"),Vt=F(require("fs"));var ux=Ef.env.isTest()?".budibase-test":".budibase",Ss=(0,ws.join)((0,vf.tmpdir)(),ux),cx="dev_license.txt",Ra=(0,ws.join)(Ss,cx);if(!Vt.default.existsSync(Ss))try{Vt.default.mkdirSync(Ss)}catch{}function px(){try{if(Vt.default.existsSync(Ra)){let e=Vt.default.readFileSync(Ra,{encoding:"utf-8"});return sa(e)}}catch(e){console.error("Error retrieving offline license from disk",e)}}a(px,"getOfflineLicense");function lx(e){console.log(`Writing license to: ${Ra}`),Vt.default.writeFileSync(Ra,e,{encoding:"utf-8"})}a(lx,"writeDevLicenseToDisk");function dx(){Vt.default.rmSync(Ra,{force:!0})}a(dx,"deleteDevLicense");var Rf=require("dd-trace");var Es=a(async()=>await Rf.tracer.trace("getLicense",async e=>{if(Ts.env.OFFLINE_MODE)return e.addTags({offline:!0}),Is();let t=await ir();return t||(e.addTags({offlineFallback:!0}),t=_a.getOfflineLicense()),t}),"getLicense"),vs=a(e=>Go(e),"getLicenseFromKey"),Rs=a(()=>Ts.env.SELF_HOSTED?De.SELF_FREE_LICENSE:De.CLOUD_FREE_LICENSE,"getFreeLicense");var xs={};x(xs,{activateLicenseKey:()=>fx,deleteLicenseKey:()=>mx,getLicenseKey:()=>xn});var _s=F(require("dd-trace"));async function fx(e){await Fo(e),await We.save({licenseKey:e}),await Kt()}a(fx,"activateLicenseKey");async function xn(){return await _s.default.trace("getLicenseKey",async e=>{let t=await We.get();return e.addTags({licenseKey:t.licenseKey}),t.licenseKey})}a(xn,"getLicenseKey");async function mx(){return await _s.default.trace("deleteLicenseKey",async()=>{await We.save({licenseKey:void 0}),await Kt()})}a(mx,"deleteLicenseKey");var Ht=require("@budibase/backend-core"),Cn=F(require("dd-trace"));var _f=3600,Kt=a(async()=>{await Of(),await Cf()},"refresh"),xf=a(async(e,t)=>{let{populateLicense:r=Es,populateFreeLicense:n=Rs}=t||{};return await Cn.default.trace("getCachedLicense",async o=>{let s=Ht.context.getLicense();if(s)return o.addTags({foundInContext:!0,features:s.features,plan:s.plan,quotas:s.quotas}),s;let i=Ht.tenancy.getTenantId(),u=await vo(),c=await u.get(i);return o.addTags({tenantId:i,foundInCache:!!c}),c?(o.addTags({foundInCache:!0,refreshedAt:c.refreshedAt,features:c.features,plan:c.plan,quotas:c.quotas}),c):(c=await Cn.default.trace("populateLicense",async()=>await r(i)),o.addTags({populatedLicense:!!c}),c||(c=Cn.default.trace("populateFreeLicense",()=>n(e,i)),o.addTags({populatedFreeLicense:!!c})),c.refreshedAt=new Date().toISOString(),o.addTags({refreshedAt:c.refreshedAt,features:c.features,plan:c.plan,quotas:c.quotas,expirySeconds:_f}),await u.store(i,c,_f),c)})},"_getCachedLicense");Ht.env.isJest()&&(xf=jest.fn());var Cf=xf,Of=a(async()=>{let e=Ht.tenancy.getTenantId();await(await vo()).delete(e)},"invalidate");async function be(e,t){Array.isArray(e)||(e=[e]),t||(t=await Je.getCachedLicense());for(let r of e)if(!t?.features.includes(r))return!1;return!0}a(be,"areFeaturesEnabled");async function On(e,t){if(!await be(e,t))throw new bt.FeatureDisabledError(`${e} is not currently enabled`,e)}a(On,"checkFeature");async function Cs(e,t){if(!await be(e,t)){let r=e.join(", ");throw new bt.FeatureDisabledError(`${r} are not currently enabled`,r)}}a(Cs,"checkFeatures");function xe(e){return async(...t)=>(await On(Ae.Feature.WORKSPACE_BACKUPS),e(...t))}a(xe,"checkBackups");async function Os(){return be(Ae.Feature.WORKSPACE_BACKUPS)}a(Os,"isBackupsEnabled");async function Ls(){return be(Ae.Feature.BRANDING)}a(Ls,"isBrandingEnabled");async function Lf(){return be(Ae.Feature.ENFORCEABLE_SSO)}a(Lf,"isEnforceableSSO");async function hx(){return be(Ae.Feature.SYNC_AUTOMATIONS)}a(hx,"isSyncAutomationsEnabled");async function yx(){return be(Ae.Feature.TRIGGER_AUTOMATION_RUN)}a(yx,"isTriggerAutomationRunEnabled");async function Ps(){return be(Ae.Feature.APP_BUILDERS)}a(Ps,"isAppBuildersEnabled");async function Ln(){return be(Ae.Feature.AUDIT_LOGS)}a(Ln,"isAuditLogsEnabled");async function Us(){return be(Ae.Feature.USER_GROUPS)}a(Us,"isUserGroupsEnabled");function Ax(){return be(Ae.Feature.PWA)}a(Ax,"isPWAEnabled");function bx(){return be(Ae.Feature.RECAPTCHA)}a(bx,"isRecaptchaEnabled");var Ix=a(()=>be(Ae.Feature.PKCE_OIDC),"isPkceOidcEnabled");async function It(){return be(Ae.Feature.EXPANDED_PUBLIC_API)}a(It,"isExpandedPublicApiEnabled");async function Sx(e){if(bt.env.ENABLE_SSO_MAINTENANCE_MODE||!await Lf())return!1;let r;return e?.config?r=e.config:r=await bt.configs.getSettingsConfig(),!!r.isSSOEnforced}a(Sx,"isSSOEnforced");var qs=a(async()=>{let e=Ae.Feature.SCIM,t=await be(e),r=await bt.configs.getSCIMConfig();if(!t||!r?.enabled)throw new bt.FeatureDisabledError(`${e} is not currently enabled`,e);return!0},"checkSCIM");async function wx(){return be(Ae.Feature.VIEW_PERMISSIONS)}a(wx,"isViewPermissionEnabled");async function Tx(){return be(Ae.Feature.VIEW_READONLY_COLUMNS)}a(Tx,"isViewReadonlyColumnsEnabled");var Ex={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 vx(e){return await Ls()?{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}:Ex}a(vx,"getBrandingConfig");var ks={};x(ks,{enrichAIConfig:()=>Ds});var Pf=require("@budibase/backend-core");var Rx="budibase_ai";async function Ds(e){if(Pf.env.SELF_HOSTED)return e;for(let t of Object.values(e.config))if(t.provider==="BudibaseAI")return e;return e.config[Rx]={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}a(Ds,"enrichAIConfig");var ft={};x(ft,{addAction:()=>Lx,addApp:()=>Px,addAutomation:()=>Nx,addGroup:()=>Ns,addPlugin:()=>Gs,addRow:()=>qx,addRows:()=>kx,addUsers:()=>Dn,bustCache:()=>Lo,decrement:()=>St,decrementMany:()=>xa,getCurrentUsageValues:()=>sc,getLicensedQuota:()=>qf,getQuotaUsage:()=>Ft,increment:()=>Me,incrementBudibaseAICredits:()=>Mn,incrementMany:()=>zt,removeApp:()=>Ux,removeGroup:()=>Bs,removePlugin:()=>Fs,removeRow:()=>Dx,removeRows:()=>Mx,removeUsers:()=>Rr,set:()=>Ms,setAllUsage:()=>Uo,setAppUsageValue:()=>Po,setUsage:()=>ac,setUsagePerApp:()=>nc,updatePluginCount:()=>Ws,updateUsage:()=>Tr,usageLimitIsExceeded:()=>Ox,utils:()=>Gr});var Un=require("@budibase/types");var et=require("@budibase/backend-core"),de=require("@budibase/types"),Yt=require("dd-trace");var Me=a(async(e,t,r)=>await Yt.tracer.trace("quotas.increment",async n=>(n.addTags({name:e,type:t}),await Uf({change:1,name:e,type:t,opts:r}))),"increment"),zt=a(e=>Yt.tracer.trace("quotas.incrementMany",async()=>Uf(e)),"incrementMany"),Uf=a(async e=>await Yt.tracer.trace("quotas.tryIncrement",async t=>{let r=Array.isArray(e)?e:[e];t.addTags({numActions:r.length}),await Tr(r.map(o=>({usageChange:o.change,name:o.name,type:o.type,opts:{dryRun:!0,suppressErrorLog:o.opts?.suppressErrorLog,id:o.opts?.id}})));let n=[];for(let o of r)await Yt.tracer.trace("quotas.incrementMany.fn",async s=>{s.addTags({actionName:o.name,actionType:o.type,actionChange:o.change});let i=o.opts?.fn;i&&n.push(await i())});return await Tr(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}}))),n[0]}),"tryIncrement"),St=a((e,t,r={})=>Tr({usageChange:-1,name:e,type:t,opts:r}),"decrement"),xa=a(e=>{let t=Array.isArray(e)?e:[e];return Tr(t.map(r=>({usageChange:-r.change,name:r.name,type:r.type,opts:r.opts})))},"decrementMany"),Ms=a(async(e,t,r)=>it.setUsage(r,e,t),"set"),_x=a((e,t,r)=>{if(e==de.QuotaUsageType.STATIC){let n=r.usageQuota.triggers;return n?n[t]||{}:{}}else{let n=it.utils.getCurrentMonthString(),o=r.monthly[n].triggers;return o?o[t]||{}:{}}},"getExistingTriggers"),xx=a(async(e,t,r,n)=>{try{await et.locks.doWithLock({type:de.LockType.TRY_ONCE,name:de.LockName.TRIGGER_QUOTA,resource:e,ttl:1e4},async()=>{let o={percentage:r,name:t.name};n&&(o.resetDate=n),await Lt.triggerQuota(o)})}catch(o){et.logging.logAlert("Error triggering quota",o)}},"triggerQuota"),Cx=a(async(e,t,r,n)=>{let o=await Ft(),s=e===de.QuotaUsageType.MONTHLY?o.quotaReset:void 0,i=await _x(e,t,o),u=n.triggers,c=r/n.value*100;c>100&&(c=100);for(let[f,g]of u.entries())if(c>=g&&n.value!==At.UNLIMITED){if(!i[g]){i[g]=new Date().toISOString();let y=u[f+1]||100;(!(c>=y)||c===g)&&await xx(t,n,c,s)}}else i[g]=void 0;return i},"checkTriggers"),Tr=a(async e=>{await Yt.tracer.trace("quotas.updateUsage",async t=>{let r=et.tenancy.getTenantId(),n=Array.isArray(e)?e:[e];t.addTags({numActions:n.length,tenantId:r});let o,s,i=[],u={},c={},f={},g={};for(let y of n)await Yt.tracer.trace("quotas.updateUsage.action",async E=>{E.addTags({actionName:y.name,actionType:y.type,actionUsageChange:y.usageChange});try{o=et.context.getWorkspaceId()}catch{}if(de.APP_QUOTA_NAMES.includes(y.name)&&!o)throw new Error("App context required for quota update");try{s=await qf(de.QuotaType.USAGE,y.name,y.type),i.push(s);let{total:k,app:D,breakdown:C}=await it.getCurrentUsageValues(y.type,y.name,y.opts?.id);k+=y.usageChange,D!=null&&(D+=y.usageChange),C!=null&&(C+=y.usageChange);let W={};if(y.opts?.dryRun||(W=await Cx(y.type,y.name,k,s),g={...g,[y.name]:W}),s.value!==At.UNLIMITED&&k>s.value&&y.usageChange>0)throw new et.UsageLimitError(`Licensed ${s.name} of ${s.value} has been exceeded`,s.name);if(k=Math.max(0,k),D&&(D=Math.max(0,D)),C&&(C=Math.max(0,C),f={...f,[y.name]:C}),!y.opts?.dryRun){let ye=y.opts?.valueFn;ye&&(k=await ye(),D=k),u={...u,[y.name]:k},c={...c,[y.name]:D}}}catch(k){throw y.opts?.suppressErrorLog||console.error(`Error updating usage quotas for ${y.name}`,k),k}});let h=n.filter(y=>!y.opts?.dryRun).map(y=>({name:y.name,type:y.type,values:{total:u[y.name],app:c[y.name],breakdown:f[y.name],triggers:g[y.name]},opts:{...y.opts,tenantId:r}}));h.length>0&&await it.setAllUsage(h)})},"updateUsage"),qf=a(async(e,t,r)=>{let n=await Je.getCachedLicense();if(!n){let o=et.tenancy.getTenantId();throw new Error("License not found for tenant id "+o)}if(r&&(0,de.isStaticQuota)(e,r,t))return n.quotas[e][r][t];if(r&&(0,de.isMonthlyQuota)(e,r,t))return n.quotas[e][r][t];if((0,de.isConstantQuota)(e,t))return n.quotas[e][t];throw new Error("Invalid quota type")},"getLicensedQuota"),Ox=a(async({name:e,type:t,usageChange:r})=>{try{return await Tr({usageChange:r,name:e,type:t,opts:{dryRun:!0}}),!1}catch(n){if(n.code===de.ErrorCode.USAGE_LIMIT_EXCEEDED)return!0;throw n}},"usageLimitIsExceeded");var Lx=a(async e=>Me(Un.MonthlyQuotaName.ACTIONS,Un.QuotaUsageType.MONTHLY,{fn:e}),"addAction");var Df=require("@budibase/backend-core"),Er=require("@budibase/types");var kf=a(async()=>{let e=await Df.db.getAllWorkspaces({dev:!0});return e?e.length:0},"getDevAppsCount"),Px=a(async(e,{appId:t}={})=>Me(Er.StaticQuotaName.WORKSPACES,Er.QuotaUsageType.STATIC,{fn:e,valueFn:kf,id:t}),"addApp"),Ux=a(async({appId:e}={})=>St(Er.StaticQuotaName.WORKSPACES,Er.QuotaUsageType.STATIC,{valueFn:kf,id:e}),"removeApp");var lt=require("@budibase/types");var qx=a(async(e,{tableId:t}={})=>Me(lt.StaticQuotaName.ROWS,lt.QuotaUsageType.STATIC,{fn:e,id:t}),"addRow"),Dx=a(async({tableId:e}={})=>St(lt.StaticQuotaName.ROWS,lt.QuotaUsageType.STATIC,{id:e}),"removeRow"),kx=a(async(e,t,{tableId:r}={})=>zt({change:e,name:lt.StaticQuotaName.ROWS,type:lt.QuotaUsageType.STATIC,opts:{fn:t,id:r}}),"addRows"),Mx=a(async(e,{tableId:t}={})=>xa({change:e,name:lt.StaticQuotaName.ROWS,type:lt.QuotaUsageType.STATIC,opts:{id:t}}),"removeRows");var qn=require("@budibase/types");var Nx=a(async(e,{automationId:t}={})=>Me(qn.MonthlyQuotaName.AUTOMATIONS,qn.QuotaUsageType.MONTHLY,{fn:e,id:t}),"addAutomation");var vr=require("@budibase/types");var Ns=a(async e=>Me(vr.StaticQuotaName.USER_GROUPS,vr.QuotaUsageType.STATIC,{fn:e}),"addGroup"),Bs=a(async()=>St(vr.StaticQuotaName.USER_GROUPS,vr.QuotaUsageType.STATIC),"removeGroup");var Dt=require("@budibase/types");var Gs=a(async e=>Me(Dt.StaticQuotaName.PLUGINS,Dt.QuotaUsageType.STATIC,{fn:e}),"addPlugin"),Fs=a(async()=>St(Dt.StaticQuotaName.PLUGINS,Dt.QuotaUsageType.STATIC),"removePlugin"),Ws=a(async e=>Ms(Dt.StaticQuotaName.PLUGINS,Dt.QuotaUsageType.STATIC,e),"updatePluginCount");var dt=require("@budibase/types"),Ca=require("@budibase/backend-core");var Dn=a(async(e,t,r)=>{let n=[{change:e,name:dt.StaticQuotaName.USERS,type:dt.QuotaUsageType.STATIC,opts:{fn:r,valueFn:Ca.users.getUserCount}}];t>0&&n.push({change:t,name:dt.StaticQuotaName.CREATORS,type:dt.QuotaUsageType.STATIC,opts:{valueFn:Ca.users.getCreatorCount}});let o=await zt(n);return await ir(),o},"addUsers"),Rr=a(async(e,t)=>{let r=[{change:e,name:dt.StaticQuotaName.USERS,type:dt.QuotaUsageType.STATIC,opts:{valueFn:Ca.users.getUserCount}}];t>0&&r.push({change:t,name:dt.StaticQuotaName.CREATORS,type:dt.QuotaUsageType.STATIC,opts:{valueFn:Ca.users.getCreatorCount}}),await xa(r),await ir()},"removeUsers");var kn=require("@budibase/types");var Mn=a(async e=>zt({change:e,name:kn.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:kn.QuotaUsageType.MONTHLY}),"incrementBudibaseAICredits");var Fn={};x(Fn,{db:()=>Qe});var Vs=require("@budibase/backend-core");var re={};x(re,{addUsers:()=>Gn,adjustGroupCreatorsQuotas:()=>Wx,cleanupApp:()=>Fx,enrichUserRolesFromGroups:()=>Gx,fetch:()=>Oa,get:()=>_r,getBulk:()=>$f,getGroupBuilderAppIds:()=>Wf,getGroupRoleId:()=>Bx,remove:()=>$s,removeUsers:()=>Qs,save:()=>Bn,updateGroupApps:()=>Ks});var N=require("@budibase/backend-core");var Mf=require("@budibase/backend-core");var Nn=class extends Mf.HTTPError{static{a(this,"GroupNameUnavailableError")}constructor(t){super(`Group name "${t}" is unavailable`,409)}};async function Gf(e,t){try{let r=[];for(let u of e)if(u.roles){let c=u.roles[N.db.getProdWorkspaceID(t)];c&&r.push(c)}let n=await Promise.all(r.map(async u=>({[u]:await N.roles.roleToNumber(u)}))),o,s,i={};n.forEach(u=>{let[c,f]=Object.entries(u)[0];i[c]={roleId:c,roleNum:f}});for(let{roleId:u,roleNum:c}of Object.values(i))(s===void 0||c>s)&&(s=c,o=u);return o}catch(r){throw N.logging.logAlert(`Error finding higest role for ${e.length} on app ${t}`,r),r}}a(Gf,"findHighestRole");async function Ff(e,t){return t?t=t.filter(r=>e.includes(r._id)):t=await z.getBulk(e,{enriched:!1}),t}a(Ff,"groupList");async function Wf(e,t){if(!e.userGroups)return[];let r=await Ff(e.userGroups,t?.groups),n=t?.appId?N.db.getProdWorkspaceID(t?.appId):null,o=[];for(let s of r){let i=s.builder?.apps;n&&i?.includes(n)?o.push(n):n||(o=o.concat(i||[]))}return[...new Set(o)]}a(Wf,"getGroupBuilderAppIds");async function Bx(e,t,r){if(!e.userGroups)return null;let n=await Ff(e.userGroups,r?.groups),o=N.db.getProdWorkspaceID(t);return e.roles?.[o]?e.roles[o]:(n=n.filter(s=>s?.roles?Object.keys(s.roles).includes(o):!1),await Gf(n,t))}a(Bx,"getGroupRoleId");async function Gx(e){if(!e||!e.userGroups)return e;let t=await $f(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 N.context.doInWorkspaceContext(o,async()=>{if(e.roles[o])return;let s=await Gf(t,o);s&&(e.roles[o]=s)});let n=await Wf(e,{groups:t});if(n.length&&!e.builder?.global){let o=e.builder?.apps||[];e.builder={apps:o.concat(n)}}return e}a(Gx,"enrichUserRolesFromGroups");async function Oa(){return await z.fetch()}a(Oa,"fetch");async function _r(e){return await z.get(e)}a(_r,"get");async function $f(e,t={enriched:!0}){return await z.getBulk(e,t)}a($f,"getBulk");async function Nf(e){if(await z.getByName(e))throw new Nn(e)}a(Nf,"guardNameAvailability");async function Bf(e){let t=await z.getGroupUsers(e._id);if(!t.length)return 0;let n=await N.tenancy.getGlobalDB().getMultiple(t.map(s=>s._id));return(await N.userUtils.creatorsInList(n)).filter(s=>s).length}a(Bf,"getCreatorsCountInGroup");async function Bn(e){let t=[],r=!e._id,n=0;if(delete e.users,!e._id)e._id=z.generateUserGroupID(),await Nf(e.name),t.push(N.events.group.created(e));else{let s=await z.get(e._id);if(s.name!==e.name&&await Nf(e.name),t.push(N.events.group.updated(e)),JSON.stringify(s.roles)!==JSON.stringify(e.roles)){let i=s.users?.length||0,u=0;i>0&&(u=await Bf(s)),Object.values(e.roles).includes("CREATOR")?n=i-u:n=-i,t.push(N.events.group.permissionsEdited(e))}}await Promise.all(t);let o=a(()=>z.save(e),"saveGroup");if(r)return await Ns(o);{let s=await o();if(n>0)await Dn(0,n);else if(n<0){let i=await Bf(e),u=Math.abs(n)-i;u>0&&await Rr(0,u)}return s}}a(Bn,"save");async function $s(e,t){let r;try{r=await z.get(e)}catch{throw new Error("Group not found")}let n=Object.values(r.roles||{}).includes("CREATOR"),o=a(()=>{},"recalculateCreatorsQuotasFn");if(n){let i=N.tenancy.getGlobalDB(),u=await z.getGroupUsers(e),f=(await Promise.all(u.map(E=>i.get(E._id)))).map(E=>({...E,userGroups:E.userGroups.filter(M=>M!==e)})),h=(await N.userUtils.creatorsInList(f)).filter(E=>E).length,y=u.length-h;y&&(o=a(()=>Rr(0,y),"recalculateCreatorsQuotasFn"))}let s=await z.destroy(e,t);return await N.events.group.deleted(r),await Bs(),await o(),s}a($s,"remove");async function Gn(e,t){let r=await z.get(e),n=await N.users.bulkGetGlobalUsersById(t),o=[];for(let c of n)c.userGroups||(c.userGroups=[]),c.userGroups.includes(e)||o.push(c);if(!o.length)return o;let s=o.map(c=>({...c,userGroups:[...c?.userGroups||[],e]}));if(await N.users.bulkUpdateGlobalUsers(s),Object.values(r.roles||{}).includes("CREATOR")){let f=(await N.userUtils.creatorsInList(o)).filter(h=>h).length,g=o.length-f;g&&await Dn(0,g)}let u=[];for(let c of t)u.push(N.cache.user.invalidateUser(c));return await Promise.all(u),await N.events.group.usersAdded(s.length,r,t),s}a(Gn,"addUsers");async function Qs(e,t){let r=await z.get(e),n=await N.users.bulkGetGlobalUsersById(t),o=[];for(let u of n){if(!u.userGroups||!u.userGroups.includes(e))continue;let c=u.userGroups.indexOf(e);u.userGroups.splice(c,1),o.push(u)}if(await N.users.bulkUpdateGlobalUsers(o),Object.values(r.roles||{}).includes("CREATOR")){let c=(await N.userUtils.creatorsInList(o)).filter(g=>g).length,f=o.length-c;f&&await Rr(0,f)}let i=[];for(let u of t)i.push(N.cache.user.invalidateUser(u));return await Promise.all(i),o.length&&await N.events.group.usersDeleted(o.length,r,t),o}a(Qs,"removeUsers");async function Ks(e,t){let r=await _r(e);if(r.roles||(r.roles={}),t.appsToAdd)for(let n of t.appsToAdd)r.roles[n.appId]=n.roleId;if(t.appsToRemove)for(let n of t.appsToRemove)delete r.roles[n.appId];if(r.builder={apps:Object.entries(r.roles).filter(([n,o])=>o==="CREATOR").map(([n])=>n)},r.builder.apps.length&&!Ps())throw new N.HTTPError("Feature not enabled, please check license",400);return await Bn(r)}a(Ks,"updateGroupApps");async function Fx(e){let t=await Oa(),r=[];for(let n of t)!n.roles||!n.roles[e]||(delete n.roles[e],r.push(n));return await z.bulkSave(r)}a(Fx,"cleanupApp");async function Wx(){if(!await Us()){let e=N.tenancy.getGlobalDB(),r=(await Oa()||[]).filter(n=>Object.values(n?.roles||{}).includes("CREATOR"));for(let n of r){let o=await z.getGroupUsers(n._id),i=(await Promise.all(o.map(g=>e.get(g._id)))).map(g=>({...g,userGroups:g.userGroups.filter(h=>h!==n._id)})),c=(await N.userUtils.creatorsInList(i)).filter(g=>g).length,f=o.length-c;await z.save({...n,roles:{}}),f&&await Rr(0,f)}}}a(Wx,"adjustGroupCreatorsQuotas");Vs.users.UserDB.init(ft,re,Ze);var Qe=Vs.users.UserDB;var jn={};x(jn,{logs:()=>ei});var ei={};x(ei,{logSearch:()=>Jx,oldestLogDate:()=>zf,storeLog:()=>Xx});var $n=require("@budibase/backend-core"),Yf=require("@budibase/types");var ge=require("@budibase/backend-core"),Wn=require("@budibase/types");var jf=require("@budibase/backend-core");async function Qf(e,t){let r,n=5,o=!1,s,i=!0;for(;n>0;n--)try{i?s=await e():s=await exports.randomDelay(e),o=!0;break}catch(u){r=u}return o||jf.logging.logWarn(`Failed to backoff: ${t}`,r),s}a(Qf,"backOff");var{SEPARATOR:wt,UNICODE_MAX:$x,DocumentType:Kf,AutomationViewMode:Hs,ViewName:jx,getQueryIndex:Qx}=ge.db,Kx=new Date(0).toISOString(),Vx=100,Ys=a(async()=>on(Wn.ConstantQuotaName.AUTOMATION_LOG_RETENTION_DAYS),"oldestLogDate");function Vf(e,t,{status:r,automationId:n}={},o={}){let s=n?`${n}${wt}`:"",i=r?`${r}${wt}`:"",u;return r&&n?u=`${Hs.ALL}${wt}${i}${s}`:r?u=`${Hs.STATUS}${wt}${i}`:n?u=`${Hs.AUTOMATION}${wt}${s}`:u=`${Kf.AUTOMATION_LOG}${wt}`,{...o,descending:!0,startkey:`${u}${t}${$x}`,endkey:`${u}${e}`}}a(Vf,"getAutomationLogParams");function Hx(e,t,r){return`${Kf.AUTOMATION_LOG}${wt}${e}${wt}${r}${wt}${t}`}a(Hx,"generateAutomationLogID");async function zs(e,t,r={docs:!0}){let n=ge.context.getProdWorkspaceDB();await n.exists()||(n=ge.context.getDevWorkspaceDB());let o={status:r.status},s=r?.limit?r.limit:r?.paginate?9+1:void 0,i=Vf(e,t,o,{include_docs:r.docs,limit:s});r?.page&&(i.startkey=r.page);let u=await n.allDocs(i);return na(u,{paginate:r?.paginate,pageSize:9})}a(zs,"getAllLogs");async function Js(e,t,r={}){let n=ge.context.getProdWorkspaceDB();await n.exists()||(n=ge.context.getDevWorkspaceDB());let o;try{let s={automationId:r?.automationId,status:r?.status},i=Vf(e,t,s,{include_docs:!0,limit:9+1});r?.page&&(i.startkey=r.page),o=await n.query(Qx(jx.AUTOMATION_LOGS),i)}catch(s){if(s!=null&&(s.name==="not_found"||s.error==="not_found"))return await Sc(),Js(e,t,r);throw s}return na(o,{paginate:!0,pageSize:9})}a(Js,"getLogsByView");async function Hf(e,t){let r=ge.context.getProdWorkspaceDB(),n=e._id,o=e.name,s=new Date().toISOString(),i=Hx(s,t.status,n),u={...t,automationId:n,status:t.status,automationName:o,createdAt:s,_id:i};return await r.put(u),i}a(Hf,"writeLog");async function Xs(e,{clearing:t}={clearing:!1}){let r=ge.context.getProdWorkspaceDB();await Qf(async()=>{let n=await r.get(ge.db.DocumentType.WORKSPACE_METADATA);for(let o of e){let s=o.split(ge.db.SEPARATOR),i=`${s[s.length-3]}${ge.db.SEPARATOR}${s[s.length-2]}`,u={};n.automationErrors&&(u=n.automationErrors),Array.isArray(u[i])||(u[i]=[]);let c=u[i].indexOf(o);t&&c!==-1?u[i].splice(c,1):u[i].push(o),u[i].length===0&&delete u[i],n.automationErrors=u}await r.put(n),await ge.cache.workspace.invalidateWorkspaceMetadata(n.appId,n)},"Failed to update app metadata with automation log error")}a(Xs,"updateAppMetadataWithErrors");async function Yx(){let e=await Ys();try{return await zs(Kx,e,{docs:!1,paginate:!1,limit:Vx})}catch{return{data:[],hasNextPage:!1}}}a(Yx,"getExpiredLogs");async function Zs(){let e=ge.context.getProdWorkspaceDB();try{let t=await Yx();if(!t.data||t.data.length===0)return;let r=t.data.map(o=>({_id:o.id,_rev:o.value.rev,_deleted:!0})),n=t.data.filter(o=>{let s=o.id.split(ge.db.SEPARATOR);return s[s.length-1]===Wn.AutomationStatus.ERROR}).map(o=>o.id);await e.bulkDocs(r),n.length&&await Xs(n,{clearing:!0})}catch(t){ge.logging.logAlert(`Failed to cleanup automation log history - Database "${e.name}"`,t)}}a(Zs,"clearOldHistory");var zf=Ys;async function zx(e,t,r,n){let o,s=new Date().toISOString(),i=await zf();return(!e||e<i)&&(e=i),r||t?o=await Js(e,s,{automationId:r,status:t,page:n}):o=await zs(e,s,{status:t,page:n,docs:!0,paginate:!0}),o}a(zx,"getLogs");async function Jx(e){return await Zs(),await zx(e.startDate,e.status,e.automationId,e.page)}a(Jx,"logSearch");async function Xx(e,t){if(!$n.db.isProdWorkspaceID($n.context.getWorkspaceId()))return;let r=await Hf(e,t);t.status===Yf.AutomationStatus.ERROR&&await Xs([r]),await Zs()}a(Xx,"storeLog");var Qn={};x(Qn,{checkPluginQuotas:()=>tC,deletePlugin:()=>eC,storePlugin:()=>Zx});var em=require("@budibase/types"),fe=require("@budibase/backend-core");var Jf=F(require("fs")),Xf=require("path");function Zf(e,t){return Jf.default.readFileSync((0,Xf.join)(e,t),"utf8")}a(Zf,"loadJSFile");async function Zx(metadata,directory,source){let db=fe.tenancy.getGlobalDB(),version=metadata.package.version,name=metadata.package.name,description=metadata.package.description,hash=metadata.schema.hash,bucketPath=fe.objectStore.getPluginS3Dir(name),files=await fe.objectStore.uploadDirectory(fe.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===em.PluginType.DATASOURCE){let js=Zf(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=fe.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});let write=a(async()=>{let e=await db.put(doc);return await fe.events.plugin.imported(doc),{...doc,_rev:e.rev}},"write");return rev?await write():await Gs(write)}a(Zx,"storePlugin");async function eC(e){let t=fe.tenancy.getGlobalDB();try{let r=await t.get(e),n=fe.objectStore.getPluginS3Dir(r.name);await fe.objectStore.deleteFolder(fe.objectStore.ObjectStoreBuckets.PLUGINS,n),await t.remove(e,r._rev),await fe.events.plugin.deleted(r),await Fs()}catch(r){let n=r?.message?r?.message:r;throw new Error(`Failed to delete plugin: ${n}`)}}a(eC,"deletePlugin");async function tC(){let e=fe.tenancy.getGlobalDB();try{let r=(await e.allDocs(fe.db.getPluginParams())).rows.length;console.log(`Syncing plugin count: ${r}`),await Ws(r)}catch(t){fe.logging.logAlert("Unable to retrieve plugins for quota check",t)}}a(tC,"checkPluginQuotas");var mt={};x(mt,{fetch:()=>aC,fetchValues:()=>nC,isEncryptionKeyAvailable:()=>rC,isValid:()=>am,remove:()=>sC,update:()=>oC});var tm=require("@budibase/backend-core"),La=require("@budibase/types");function rC(){return!!tm.env.ENCRYPTION_KEY}a(rC,"isEncryptionKeyAvailable");async function aC(){let e=await jt.get();return Object.keys(e.variables)}a(aC,"fetch");async function nC(e){let r=(await jt.get()).variables,n={};for(let[o,s]of Object.entries(r))switch(e){case La.Environment.DEVELOPMENT:n[o]=s.development;break;case La.Environment.PRODUCTION:default:n[o]=s.production;break}return n}a(nC,"fetchValues");async function rm(e){if(!(await ct.cache.getCachedLicense()).features.includes(La.Feature.ENVIRONMENT_VARIABLES))throw new Error("User does not have access to environment variables feature.");let r=await jt.get();r.variables=e(r.variables),await jt.update(r)}a(rm,"changeValues");async function oC(e,t){if(am(e))await rm(n=>(n[e]=t,n));else throw new Error("Variable name has characters that are not allowed")}a(oC,"update");async function sC(e){await rm(t=>(delete t[e],t))}a(sC,"remove");function am(e){return/^[a-zA-Z0-9-_]+$/.test(e)}a(am,"isValid");var kt={};x(kt,{definitions:()=>yC,download:()=>hC,fetch:()=>gC,write:()=>fC});var Pe=require("@budibase/backend-core"),Vn=require("@budibase/types");var ue=require("@budibase/backend-core"),tt=require("@budibase/types");var nm=require("memorystream"),om=new ue.sql.Sql(tt.SqlClient.SQL_LITE);async function iC(e,t,r){let n={operation:tt.Operation.READ,table:or.searchTable(),tables:{},paginate:{limit:r||9,page:t},filters:e,resource:{fields:[]},sort:{timestamp:{direction:tt.SortOrder.DESCENDING,type:tt.SortType.STRING}}},o=om._query(n);if(Array.isArray(o))throw new Error("Cannot execute multiple queries for audit log search");return{sql:o.sql,bindings:o.bindings}}a(iC,"getAuditLogSqlQuery");function uC(e){return`${ue.DocumentType.AUDIT_LOG}${ue.SEPARATOR}${e}${ue.SEPARATOR}${ue.utils.newid()}`}a(uC,"generateAuditLogID");async function sm(e){e._id||(e._id=uC(e.timestamp)),e.type||(e.type=tt.AUDIT_LOG_TYPE);try{let r=await ue.context.getAuditLogsDB().put(e);return{...e,_rev:r.rev}}catch(t){ue.logging.logAlert("Failed to write audit log",t)}}a(sm,"save");async function ti(e,t,r){t||(t=1);let n=ue.context.getAuditLogsDB();try{let o=9+1,s=await iC(e,t,o),i=or.searchTable(),u=om.convertJsonStringColumns(i,await n.sql(s.sql,s.bindings)),c;u.length>o&&(c=u.pop());let f={rows:u,hasNextPage:!!c};return f.hasNextPage&&(f.bookmark=t+1),f}catch(o){if(o.status===404&&!r?.isRetry)return await cC(),await ic(),await ti(e,t,{isRetry:!0});throw o}}a(ti,"searchSQL");async function cC(){let e=ue.context.getAuditLogsDB(),r=(await e.allDocs(ue.db.getDocParams(ue.DocumentType.AUDIT_LOG,null,{include_docs:!0}))).rows.map(n=>n.doc).filter(n=>n&&!n.type).map(n=>({...n,type:tt.AUDIT_LOG_TYPE}));await e.bulkDocs(r)}a(cC,"migrate");function im(e){let t=ue.context.getAuditLogsDB(),r=new nm,n=t.dump(r,{filter:s=>{let i=s;if(!i._id?.startsWith(ue.DocumentType.AUDIT_LOG))return!1;let u=!0,c=a((f,g)=>{!f||f.length===0||(u=!!(u&&g&&f.includes(g)))},"matcher");if(c(e.userIds,i.userId),c(e.appIds,i.appId),c(e.events,i.event),(e.startDate||e.endDate)&&(u=u&&i.timestamp>=e.startDate&&i.timestamp<=e.endDate),e.fullSearch){let f=JSON.stringify(s);u=u&&f.includes(e.fullSearch)}return u}}),o=new nm;return r.on("data",s=>{let i=JSON.parse(Buffer.from(s).toString());if(Array.isArray(i.docs)){let u="";for(let c of i.docs)u+=JSON.stringify(c)+`
|
|
37
|
+
`;function sa(e){return Wo.default.verify(e,SS,{algorithms:["RS256"]})}a(sa,"verifyLicenseToken");function wS(e,t){return Wo.default.sign(t,e,{encoding:"utf-8",algorithm:"RS256"})}a(wS,"sign");var ln={};x(ln,{getFeatures:()=>$o});var l=require("@budibase/types");var TS={[l.PlanType.FREE]:[...De.SELF_FREE_LICENSE.features],[l.PlanType.PREMIUM]:[l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.PDF],[l.PlanType.PREMIUM_PLUS]:[l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PDF,l.Feature.BUDIBASE_AI],[l.PlanType.PREMIUM_PLUS_TRIAL]:[l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PDF,l.Feature.BUDIBASE_AI],[l.PlanType.PRO]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS],[l.PlanType.TEAM]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS],[l.PlanType.BUSINESS]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.PDF,l.Feature.BUDIBASE_AI],[l.PlanType.ENTERPRISE_BASIC]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.BUDIBASE_AI,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC],[l.PlanType.ENTERPRISE_BASIC_TRIAL]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.BUDIBASE_AI,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC],[l.PlanType.ENTERPRISE]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.BUDIBASE_AI,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC]},ES={[l.PlanType.FREE]:[...De.CLOUD_FREE_LICENSE.features],[l.PlanType.PREMIUM]:[l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.PDF],[l.PlanType.PREMIUM_PLUS]:[l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.BUDIBASE_AI,l.Feature.PDF],[l.PlanType.PREMIUM_PLUS_TRIAL]:[l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.BUDIBASE_AI,l.Feature.PDF],[l.PlanType.PRO]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING],[l.PlanType.TEAM]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING],[l.PlanType.BUSINESS]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.BUDIBASE_AI,l.Feature.PDF],[l.PlanType.ENTERPRISE_BASIC]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC],[l.PlanType.ENTERPRISE_BASIC_TRIAL]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC],[l.PlanType.ENTERPRISE]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC]};function $o(e,t){let r=[];function n(o){let s=o[t];if(!s)throw new Error(`Features do not exist for planType=${t} and hosting=${e}`);return s}switch(a(n,"readFeatures"),e){case l.Hosting.SELF:r=n(TS);break;case l.Hosting.CLOUD:r=n(ES);break}return r}a($o,"getFeatures");var dn={};x(dn,{UNLIMITED:()=>m,getQuotas:()=>jo});var J=require("@budibase/types");var d=At,Pc=De,m=-1,ua=a(e=>e*1e6,"millions"),vS={[J.PlanType.FREE]:{...Pc.CLOUD_FREE_LICENSE.quotas},[J.PlanType.PREMIUM]:{usage:{monthly:{...d.queries(m),...d.automations(1e3),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(1e4),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(0),...d.plugins(m),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(7),...d.appBackupRetentionDays(7)}},[J.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...d.queries(m),...d.automations(5e3),...d.budibaseAICredits(ua(2)),...d.actions(m)},static:{...d.rows(25e3),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(0),...d.plugins(m),...d.customAIConfigurations(1)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(30)}},[J.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...d.queries(m),...d.automations(5e3),...d.budibaseAICredits(ua(2)),...d.actions(m)},static:{...d.rows(25e3),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(0),...d.plugins(m),...d.customAIConfigurations(1)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(30)}},[J.PlanType.PRO]:{usage:{monthly:{...d.queries(m),...d.automations(1e3),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(5),...d.plugins(m),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(7),...d.appBackupRetentionDays(7)}},[J.PlanType.TEAM]:{usage:{monthly:{...d.queries(m),...d.automations(5e3),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(10),...d.plugins(m),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(90)}},[J.PlanType.BUSINESS]:{usage:{monthly:{...d.queries(m),...d.automations(1e4),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(5e4),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(50),...d.plugins(m),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(365),...d.appBackupRetentionDays(365)}},[J.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(ua(4)),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(m),...d.plugins(m),...d.customAIConfigurations(m)}},constant:{...d.automationLogRetentionDays(m),...d.appBackupRetentionDays(m)}},[J.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(ua(4)),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(m),...d.plugins(m),...d.customAIConfigurations(m)}},constant:{...d.automationLogRetentionDays(15),...d.appBackupRetentionDays(15)}},[J.PlanType.ENTERPRISE]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(ua(4)),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(m),...d.plugins(m),...d.customAIConfigurations(m)}},constant:{...d.automationLogRetentionDays(m),...d.appBackupRetentionDays(m)}}},RS={[J.PlanType.FREE]:{...Pc.SELF_FREE_LICENSE.quotas},[J.PlanType.PREMIUM]:void 0,[J.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(0),...d.plugins(m),...d.customAIConfigurations(1)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(30)}},[J.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(0),...d.plugins(m),...d.customAIConfigurations(1)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(30)}},[J.PlanType.PRO]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(5),...d.plugins(m),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(7),...d.appBackupRetentionDays(7)}},[J.PlanType.TEAM]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(10),...d.plugins(m),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(90)}},[J.PlanType.BUSINESS]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(50),...d.plugins(m),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(90),...d.appBackupRetentionDays(365)}},[J.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(m),...d.plugins(m),...d.customAIConfigurations(m)}},constant:{...d.automationLogRetentionDays(m),...d.appBackupRetentionDays(m)}},[J.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(m),...d.plugins(m),...d.customAIConfigurations(m)}},constant:{...d.automationLogRetentionDays(15),...d.appBackupRetentionDays(15)}},[J.PlanType.ENTERPRISE]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(m),...d.plugins(m),...d.customAIConfigurations(m)}},constant:{...d.automationLogRetentionDays(m),...d.appBackupRetentionDays(m)}}};function jo(e,t){let r;function n(o){let s=o[t];if(!s)throw new Error(`Quotas do not exist for planType=${t} and hosting=${e}`);return s}switch(a(n,"readQuotas"),e){case J.Hosting.SELF:r=n(RS);break;case J.Hosting.CLOUD:r=n(vS);break}return JSON.parse(JSON.stringify(r))}a(jo,"getQuotas");var cr={};x(cr,{encoding:()=>ur,workspaceExists:()=>_S});var Uc=require("@budibase/backend-core");async function _S(e){return(await Uc.db.getAllWorkspaces({all:!0,idsOnly:!0})).includes(e)}a(_S,"workspaceExists");var ur={};x(ur,{base64ToObject:()=>CS,objectToBase64:()=>xS});function xS(e){let t=JSON.stringify(e);return Buffer.from(t).toString("base64")}a(xS,"objectToBase64");function CS(e){let t=Buffer.from(e,"base64").toString();return JSON.parse(t)}a(CS,"base64ToObject");var yf=require("@budibase/types"),wr=require("@budibase/backend-core"),Af=F(Yl()),bf=F(As());async function nx(e){await We.save({offlineLicenseToken:e}),await Kt()}a(nx,"activateOfflineLicenseToken");async function ox(){await We.save({offlineLicenseToken:void 0}),await Kt()}a(ox,"deleteOfflineLicenseToken");async function If(){return(await We.get()).offlineLicenseToken}a(If,"getOfflineLicenseToken");async function bs(){let t=(await wr.installation.getInstall()).installId,r=wr.context.getTenantId(),n=await wr.events.identification.getUniqueTenantId(r);return{installId:t,tenantId:n}}a(bs,"getIdentifier");async function sx(){let e=await bs();return ur.objectToBase64(e)}a(sx,"getIdentifierBase64");function ix(e){return ur.base64ToObject(e)}a(ix,"getIdentifierFromBase64");function Sf(e){let t=Date.now(),r=new Date(e.expireAt).getTime();if(t>r)throw new Error(`Offline license has expired. expireAt=${e.expireAt}`)}a(Sf,"verifyExpiry");async function wf(e){let t=await bs();if(e.identifier.installId!==t.installId||e.identifier.tenantId!==t.tenantId)throw new Error("Invalid offline license")}a(wf,"verifyInstallation");function Tf(e){let t=e.plan.type,r=yf.Hosting.SELF,n=$o(r,t),o=jo(r,t);return e.features=(0,Af.default)(e.features,n),e.quotas=(0,bf.default)(e.quotas,o),e}a(Tf,"enrichLicense");async function Is(){try{let e=await If();if(e){let t=await sa(e);return Sf(t),await wf(t),Tf(t)}}catch(e){console.error("Error retrieving offline license",e)}}a(Is,"getOfflineLicense");var _a={};x(_a,{deleteDevLicense:()=>dx,getOfflineLicense:()=>px,writeDevLicenseToDisk:()=>lx});var Ef=require("@budibase/backend-core"),ws=require("path"),vf=require("os"),Vt=F(require("fs"));var ux=Ef.env.isTest()?".budibase-test":".budibase",Ss=(0,ws.join)((0,vf.tmpdir)(),ux),cx="dev_license.txt",Ra=(0,ws.join)(Ss,cx);if(!Vt.default.existsSync(Ss))try{Vt.default.mkdirSync(Ss)}catch{}function px(){try{if(Vt.default.existsSync(Ra)){let e=Vt.default.readFileSync(Ra,{encoding:"utf-8"});return sa(e)}}catch(e){console.error("Error retrieving offline license from disk",e)}}a(px,"getOfflineLicense");function lx(e){console.log(`Writing license to: ${Ra}`),Vt.default.writeFileSync(Ra,e,{encoding:"utf-8"})}a(lx,"writeDevLicenseToDisk");function dx(){Vt.default.rmSync(Ra,{force:!0})}a(dx,"deleteDevLicense");var Rf=require("dd-trace");var Es=a(async()=>await Rf.tracer.trace("getLicense",async e=>{if(Ts.env.OFFLINE_MODE)return e.addTags({offline:!0}),Is();let t=await ir();return t||(e.addTags({offlineFallback:!0}),t=_a.getOfflineLicense()),t}),"getLicense"),vs=a(e=>Go(e),"getLicenseFromKey"),Rs=a(()=>Ts.env.SELF_HOSTED?De.SELF_FREE_LICENSE:De.CLOUD_FREE_LICENSE,"getFreeLicense");var xs={};x(xs,{activateLicenseKey:()=>fx,deleteLicenseKey:()=>mx,getLicenseKey:()=>xn});var _s=F(require("dd-trace"));async function fx(e){await Fo(e),await We.save({licenseKey:e}),await Kt()}a(fx,"activateLicenseKey");async function xn(){return await _s.default.trace("getLicenseKey",async e=>{let t=await We.get();return e.addTags({licenseKey:t.licenseKey}),t.licenseKey})}a(xn,"getLicenseKey");async function mx(){return await _s.default.trace("deleteLicenseKey",async()=>{await We.save({licenseKey:void 0}),await Kt()})}a(mx,"deleteLicenseKey");var Ht=require("@budibase/backend-core"),Cn=F(require("dd-trace"));var _f=3600,Kt=a(async()=>{await Of(),await Cf()},"refresh"),xf=a(async(e,t)=>{let{populateLicense:r=Es,populateFreeLicense:n=Rs}=t||{};return await Cn.default.trace("getCachedLicense",async o=>{let s=Ht.context.getLicense();if(s)return o.addTags({foundInContext:!0,features:s.features,plan:s.plan,quotas:s.quotas}),s;let i=Ht.tenancy.getTenantId(),u=await vo(),c=await u.get(i);return o.addTags({tenantId:i,foundInCache:!!c}),c?(o.addTags({foundInCache:!0,refreshedAt:c.refreshedAt,features:c.features,plan:c.plan,quotas:c.quotas}),c):(c=await Cn.default.trace("populateLicense",async()=>await r(i)),o.addTags({populatedLicense:!!c}),c||(c=Cn.default.trace("populateFreeLicense",()=>n(e,i)),o.addTags({populatedFreeLicense:!!c})),c.refreshedAt=new Date().toISOString(),o.addTags({refreshedAt:c.refreshedAt,features:c.features,plan:c.plan,quotas:c.quotas,expirySeconds:_f}),await u.store(i,c,_f),c)})},"_getCachedLicense");Ht.env.isJest()&&(xf=jest.fn());var Cf=xf,Of=a(async()=>{let e=Ht.tenancy.getTenantId();await(await vo()).delete(e)},"invalidate");async function be(e,t){Array.isArray(e)||(e=[e]),t||(t=await Je.getCachedLicense());for(let r of e)if(!t?.features.includes(r))return!1;return!0}a(be,"areFeaturesEnabled");async function On(e,t){if(!await be(e,t))throw new bt.FeatureDisabledError(`${e} is not currently enabled`,e)}a(On,"checkFeature");async function Cs(e,t){if(!await be(e,t)){let r=e.join(", ");throw new bt.FeatureDisabledError(`${r} are not currently enabled`,r)}}a(Cs,"checkFeatures");function xe(e){return async(...t)=>(await On(Ae.Feature.WORKSPACE_BACKUPS),e(...t))}a(xe,"checkBackups");async function Os(){return be(Ae.Feature.WORKSPACE_BACKUPS)}a(Os,"isBackupsEnabled");async function Ls(){return be(Ae.Feature.BRANDING)}a(Ls,"isBrandingEnabled");async function Lf(){return be(Ae.Feature.ENFORCEABLE_SSO)}a(Lf,"isEnforceableSSO");async function hx(){return be(Ae.Feature.SYNC_AUTOMATIONS)}a(hx,"isSyncAutomationsEnabled");async function yx(){return be(Ae.Feature.TRIGGER_AUTOMATION_RUN)}a(yx,"isTriggerAutomationRunEnabled");async function Ps(){return be(Ae.Feature.APP_BUILDERS)}a(Ps,"isAppBuildersEnabled");async function Ln(){return be(Ae.Feature.AUDIT_LOGS)}a(Ln,"isAuditLogsEnabled");async function Us(){return be(Ae.Feature.USER_GROUPS)}a(Us,"isUserGroupsEnabled");function Ax(){return be(Ae.Feature.PWA)}a(Ax,"isPWAEnabled");function bx(){return be(Ae.Feature.RECAPTCHA)}a(bx,"isRecaptchaEnabled");var Ix=a(()=>be(Ae.Feature.PKCE_OIDC),"isPkceOidcEnabled");async function It(){return be(Ae.Feature.EXPANDED_PUBLIC_API)}a(It,"isExpandedPublicApiEnabled");async function Sx(e){if(bt.env.ENABLE_SSO_MAINTENANCE_MODE||!await Lf())return!1;let r;return e?.config?r=e.config:r=await bt.configs.getSettingsConfig(),!!r.isSSOEnforced}a(Sx,"isSSOEnforced");var qs=a(async()=>{let e=Ae.Feature.SCIM,t=await be(e),r=await bt.configs.getSCIMConfig();if(!t||!r?.enabled)throw new bt.FeatureDisabledError(`${e} is not currently enabled`,e);return!0},"checkSCIM");async function wx(){return be(Ae.Feature.VIEW_PERMISSIONS)}a(wx,"isViewPermissionEnabled");async function Tx(){return be(Ae.Feature.VIEW_READONLY_COLUMNS)}a(Tx,"isViewReadonlyColumnsEnabled");var Ex={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 vx(e){return await Ls()?{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}:Ex}a(vx,"getBrandingConfig");var ks={};x(ks,{enrichAIConfig:()=>Ds});var Pf=require("@budibase/backend-core");var Rx="budibase_ai";async function Ds(e){if(Pf.env.SELF_HOSTED)return e;for(let t of Object.values(e.config))if(t.provider==="BudibaseAI")return e;return e.config[Rx]={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}a(Ds,"enrichAIConfig");var ft={};x(ft,{addAction:()=>Lx,addApp:()=>Px,addAutomation:()=>Nx,addGroup:()=>Ns,addPlugin:()=>Gs,addRow:()=>qx,addRows:()=>kx,addUsers:()=>Dn,bustCache:()=>Lo,decrement:()=>St,decrementMany:()=>xa,getCurrentUsageValues:()=>sc,getLicensedQuota:()=>qf,getQuotaUsage:()=>Ft,increment:()=>Me,incrementBudibaseAICredits:()=>Mn,incrementMany:()=>zt,removeApp:()=>Ux,removeGroup:()=>Bs,removePlugin:()=>Fs,removeRow:()=>Dx,removeRows:()=>Mx,removeUsers:()=>Rr,set:()=>Ms,setAllUsage:()=>Uo,setAppUsageValue:()=>Po,setUsage:()=>ac,setUsagePerApp:()=>nc,updatePluginCount:()=>Ws,updateUsage:()=>Tr,usageLimitIsExceeded:()=>Ox,utils:()=>Gr});var Un=require("@budibase/types");var et=require("@budibase/backend-core"),de=require("@budibase/types"),Yt=require("dd-trace");var Me=a(async(e,t,r)=>await Yt.tracer.trace("quotas.increment",async n=>(n.addTags({name:e,type:t}),await Uf({change:1,name:e,type:t,opts:r}))),"increment"),zt=a(e=>Yt.tracer.trace("quotas.incrementMany",async()=>Uf(e)),"incrementMany"),Uf=a(async e=>await Yt.tracer.trace("quotas.tryIncrement",async t=>{let r=Array.isArray(e)?e:[e];t.addTags({numActions:r.length}),await Tr(r.map(o=>({usageChange:o.change,name:o.name,type:o.type,opts:{dryRun:!0,suppressErrorLog:o.opts?.suppressErrorLog,id:o.opts?.id}})));let n=[];for(let o of r)await Yt.tracer.trace("quotas.incrementMany.fn",async s=>{s.addTags({actionName:o.name,actionType:o.type,actionChange:o.change});let i=o.opts?.fn;i&&n.push(await i())});return await Tr(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}}))),n[0]}),"tryIncrement"),St=a((e,t,r={})=>Tr({usageChange:-1,name:e,type:t,opts:r}),"decrement"),xa=a(e=>{let t=Array.isArray(e)?e:[e];return Tr(t.map(r=>({usageChange:-r.change,name:r.name,type:r.type,opts:r.opts})))},"decrementMany"),Ms=a(async(e,t,r)=>it.setUsage(r,e,t),"set"),_x=a((e,t,r)=>{if(e==de.QuotaUsageType.STATIC){let n=r.usageQuota.triggers;return n?n[t]||{}:{}}else{let n=it.utils.getCurrentMonthString(),o=r.monthly[n].triggers;return o?o[t]||{}:{}}},"getExistingTriggers"),xx=a(async(e,t,r,n)=>{try{await et.locks.doWithLock({type:de.LockType.TRY_ONCE,name:de.LockName.TRIGGER_QUOTA,resource:e,ttl:1e4},async()=>{let o={percentage:r,name:t.name};n&&(o.resetDate=n),await Lt.triggerQuota(o)})}catch(o){et.logging.logAlert("Error triggering quota",o)}},"triggerQuota"),Cx=a(async(e,t,r,n)=>{let o=await Ft(),s=e===de.QuotaUsageType.MONTHLY?o.quotaReset:void 0,i=await _x(e,t,o),u=n.triggers,c=r/n.value*100;c>100&&(c=100);for(let[f,g]of u.entries())if(c>=g&&n.value!==At.UNLIMITED){if(!i[g]){i[g]=new Date().toISOString();let y=u[f+1]||100;(!(c>=y)||c===g)&&await xx(t,n,c,s)}}else i[g]=void 0;return i},"checkTriggers"),Tr=a(async e=>{await Yt.tracer.trace("quotas.updateUsage",async t=>{let r=et.tenancy.getTenantId(),n=Array.isArray(e)?e:[e];t.addTags({numActions:n.length,tenantId:r});let o,s,i=[],u={},c={},f={},g={};for(let y of n)await Yt.tracer.trace("quotas.updateUsage.action",async E=>{E.addTags({actionName:y.name,actionType:y.type,actionUsageChange:y.usageChange});try{o=et.context.getWorkspaceId()}catch{}if(de.APP_QUOTA_NAMES.includes(y.name)&&!o)throw new Error("App context required for quota update");try{s=await qf(de.QuotaType.USAGE,y.name,y.type),i.push(s);let{total:k,app:D,breakdown:C}=await it.getCurrentUsageValues(y.type,y.name,y.opts?.id);k+=y.usageChange,D!=null&&(D+=y.usageChange),C!=null&&(C+=y.usageChange);let W={};if(y.opts?.dryRun||(W=await Cx(y.type,y.name,k,s),g={...g,[y.name]:W}),s.value!==At.UNLIMITED&&k>s.value&&y.usageChange>0)throw new et.UsageLimitError(`Licensed ${s.name} of ${s.value} has been exceeded`,s.name);if(k=Math.max(0,k),D&&(D=Math.max(0,D)),C&&(C=Math.max(0,C),f={...f,[y.name]:C}),!y.opts?.dryRun){let ye=y.opts?.valueFn;ye&&(k=await ye(),D=k),u={...u,[y.name]:k},c={...c,[y.name]:D}}}catch(k){throw y.opts?.suppressErrorLog||console.error(`Error updating usage quotas for ${y.name}`,k),k}});let h=n.filter(y=>!y.opts?.dryRun).map(y=>({name:y.name,type:y.type,values:{total:u[y.name],app:c[y.name],breakdown:f[y.name],triggers:g[y.name]},opts:{...y.opts,tenantId:r}}));h.length>0&&await it.setAllUsage(h)})},"updateUsage"),qf=a(async(e,t,r)=>{let n=await Je.getCachedLicense();if(!n){let o=et.tenancy.getTenantId();throw new Error("License not found for tenant id "+o)}if(r&&(0,de.isStaticQuota)(e,r,t))return n.quotas[e][r][t];if(r&&(0,de.isMonthlyQuota)(e,r,t))return n.quotas[e][r][t];if((0,de.isConstantQuota)(e,t))return n.quotas[e][t];throw new Error("Invalid quota type")},"getLicensedQuota"),Ox=a(async({name:e,type:t,usageChange:r})=>{try{return await Tr({usageChange:r,name:e,type:t,opts:{dryRun:!0}}),!1}catch(n){if(n.code===de.ErrorCode.USAGE_LIMIT_EXCEEDED)return!0;throw n}},"usageLimitIsExceeded");var Lx=a(async e=>Me(Un.MonthlyQuotaName.ACTIONS,Un.QuotaUsageType.MONTHLY,{fn:e}),"addAction");var Df=require("@budibase/backend-core"),Er=require("@budibase/types");var kf=a(async()=>{let e=await Df.db.getAllWorkspaces({dev:!0});return e?e.length:0},"getDevAppsCount"),Px=a(async(e,{appId:t}={})=>Me(Er.StaticQuotaName.WORKSPACES,Er.QuotaUsageType.STATIC,{fn:e,valueFn:kf,id:t}),"addApp"),Ux=a(async({appId:e}={})=>St(Er.StaticQuotaName.WORKSPACES,Er.QuotaUsageType.STATIC,{valueFn:kf,id:e}),"removeApp");var lt=require("@budibase/types");var qx=a(async(e,{tableId:t}={})=>Me(lt.StaticQuotaName.ROWS,lt.QuotaUsageType.STATIC,{fn:e,id:t}),"addRow"),Dx=a(async({tableId:e}={})=>St(lt.StaticQuotaName.ROWS,lt.QuotaUsageType.STATIC,{id:e}),"removeRow"),kx=a(async(e,t,{tableId:r}={})=>zt({change:e,name:lt.StaticQuotaName.ROWS,type:lt.QuotaUsageType.STATIC,opts:{fn:t,id:r}}),"addRows"),Mx=a(async(e,{tableId:t}={})=>xa({change:e,name:lt.StaticQuotaName.ROWS,type:lt.QuotaUsageType.STATIC,opts:{id:t}}),"removeRows");var qn=require("@budibase/types");var Nx=a(async(e,{automationId:t}={})=>Me(qn.MonthlyQuotaName.AUTOMATIONS,qn.QuotaUsageType.MONTHLY,{fn:e,id:t}),"addAutomation");var vr=require("@budibase/types");var Ns=a(async e=>Me(vr.StaticQuotaName.USER_GROUPS,vr.QuotaUsageType.STATIC,{fn:e}),"addGroup"),Bs=a(async()=>St(vr.StaticQuotaName.USER_GROUPS,vr.QuotaUsageType.STATIC),"removeGroup");var Dt=require("@budibase/types");var Gs=a(async e=>Me(Dt.StaticQuotaName.PLUGINS,Dt.QuotaUsageType.STATIC,{fn:e}),"addPlugin"),Fs=a(async()=>St(Dt.StaticQuotaName.PLUGINS,Dt.QuotaUsageType.STATIC),"removePlugin"),Ws=a(async e=>Ms(Dt.StaticQuotaName.PLUGINS,Dt.QuotaUsageType.STATIC,e),"updatePluginCount");var dt=require("@budibase/types"),Ca=require("@budibase/backend-core");var Dn=a(async(e,t,r)=>{let n=[{change:e,name:dt.StaticQuotaName.USERS,type:dt.QuotaUsageType.STATIC,opts:{fn:r,valueFn:Ca.users.getUserCount}}];t>0&&n.push({change:t,name:dt.StaticQuotaName.CREATORS,type:dt.QuotaUsageType.STATIC,opts:{valueFn:Ca.users.getCreatorCount}});let o=await zt(n);return await ir(),o},"addUsers"),Rr=a(async(e,t)=>{let r=[{change:e,name:dt.StaticQuotaName.USERS,type:dt.QuotaUsageType.STATIC,opts:{valueFn:Ca.users.getUserCount}}];t>0&&r.push({change:t,name:dt.StaticQuotaName.CREATORS,type:dt.QuotaUsageType.STATIC,opts:{valueFn:Ca.users.getCreatorCount}}),await xa(r),await ir()},"removeUsers");var kn=require("@budibase/types");var Mn=a(async e=>zt({change:e,name:kn.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:kn.QuotaUsageType.MONTHLY}),"incrementBudibaseAICredits");var Fn={};x(Fn,{db:()=>Qe});var Vs=require("@budibase/backend-core");var re={};x(re,{addUsers:()=>Gn,adjustGroupCreatorsQuotas:()=>Wx,cleanupApp:()=>Fx,enrichUserRolesFromGroups:()=>Gx,fetch:()=>Oa,get:()=>_r,getBulk:()=>$f,getGroupBuilderAppIds:()=>Wf,getGroupRoleId:()=>Bx,remove:()=>$s,removeUsers:()=>Qs,save:()=>Bn,updateGroupApps:()=>Ks});var N=require("@budibase/backend-core");var Mf=require("@budibase/backend-core");var Nn=class extends Mf.HTTPError{static{a(this,"GroupNameUnavailableError")}constructor(t){super(`Group name "${t}" is unavailable`,409)}};async function Gf(e,t){try{let r=[];for(let u of e)if(u.roles){let c=u.roles[N.db.getProdWorkspaceID(t)];c&&r.push(c)}let n=await Promise.all(r.map(async u=>({[u]:await N.roles.roleToNumber(u)}))),o,s,i={};n.forEach(u=>{let[c,f]=Object.entries(u)[0];i[c]={roleId:c,roleNum:f}});for(let{roleId:u,roleNum:c}of Object.values(i))(s===void 0||c>s)&&(s=c,o=u);return o}catch(r){throw N.logging.logAlert(`Error finding higest role for ${e.length} on app ${t}`,r),r}}a(Gf,"findHighestRole");async function Ff(e,t){return t?t=t.filter(r=>e.includes(r._id)):t=await z.getBulk(e,{enriched:!1}),t}a(Ff,"groupList");async function Wf(e,t){if(!e.userGroups)return[];let r=await Ff(e.userGroups,t?.groups),n=t?.appId?N.db.getProdWorkspaceID(t?.appId):null,o=[];for(let s of r){let i=s.builder?.apps;n&&i?.includes(n)?o.push(n):n||(o=o.concat(i||[]))}return[...new Set(o)]}a(Wf,"getGroupBuilderAppIds");async function Bx(e,t,r){if(!e.userGroups)return null;let n=await Ff(e.userGroups,r?.groups),o=N.db.getProdWorkspaceID(t);return e.roles?.[o]?e.roles[o]:(n=n.filter(s=>s?.roles?Object.keys(s.roles).includes(o):!1),await Gf(n,t))}a(Bx,"getGroupRoleId");async function Gx(e){if(!e||!e.userGroups)return e;let t=await $f(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 N.context.doInWorkspaceContext(o,async()=>{if(e.roles[o])return;let s=await Gf(t,o);s&&(e.roles[o]=s)});let n=await Wf(e,{groups:t});if(n.length&&!e.builder?.global){let o=e.builder?.apps||[];e.builder={apps:o.concat(n)}}return e}a(Gx,"enrichUserRolesFromGroups");async function Oa(){return await z.fetch()}a(Oa,"fetch");async function _r(e){return await z.get(e)}a(_r,"get");async function $f(e,t={enriched:!0}){return await z.getBulk(e,t)}a($f,"getBulk");async function Nf(e){if(await z.getByName(e))throw new Nn(e)}a(Nf,"guardNameAvailability");async function Bf(e){let t=await z.getGroupUsers(e._id);if(!t.length)return 0;let n=await N.tenancy.getGlobalDB().getMultiple(t.map(s=>s._id));return(await N.userUtils.creatorsInList(n)).filter(s=>s).length}a(Bf,"getCreatorsCountInGroup");async function Bn(e){let t=[],r=!e._id,n=0;if(delete e.users,!e._id)e._id=z.generateUserGroupID(),await Nf(e.name),t.push(N.events.group.created(e));else{let s=await z.get(e._id);if(s.name!==e.name&&await Nf(e.name),t.push(N.events.group.updated(e)),JSON.stringify(s.roles)!==JSON.stringify(e.roles)){let i=s.users?.length||0,u=0;i>0&&(u=await Bf(s)),Object.values(e.roles).includes("CREATOR")?n=i-u:n=-i,t.push(N.events.group.permissionsEdited(e))}}await Promise.all(t);let o=a(()=>z.save(e),"saveGroup");if(r)return await Ns(o);{let s=await o();if(n>0)await Dn(0,n);else if(n<0){let i=await Bf(e),u=Math.abs(n)-i;u>0&&await Rr(0,u)}return s}}a(Bn,"save");async function $s(e,t){let r;try{r=await z.get(e)}catch{throw new Error("Group not found")}let n=Object.values(r.roles||{}).includes("CREATOR"),o=a(()=>{},"recalculateCreatorsQuotasFn");if(n){let i=N.tenancy.getGlobalDB(),u=await z.getGroupUsers(e),f=(await Promise.all(u.map(E=>i.get(E._id)))).map(E=>({...E,userGroups:E.userGroups.filter(M=>M!==e)})),h=(await N.userUtils.creatorsInList(f)).filter(E=>E).length,y=u.length-h;y&&(o=a(()=>Rr(0,y),"recalculateCreatorsQuotasFn"))}let s=await z.destroy(e,t);return await N.events.group.deleted(r),await Bs(),await o(),s}a($s,"remove");async function Gn(e,t){let r=await z.get(e),n=await N.users.bulkGetGlobalUsersById(t),o=[];for(let c of n)c.userGroups||(c.userGroups=[]),c.userGroups.includes(e)||o.push(c);if(!o.length)return o;let s=o.map(c=>({...c,userGroups:[...c?.userGroups||[],e]}));if(await N.users.bulkUpdateGlobalUsers(s),Object.values(r.roles||{}).includes("CREATOR")){let f=(await N.userUtils.creatorsInList(o)).filter(h=>h).length,g=o.length-f;g&&await Dn(0,g)}let u=[];for(let c of t)u.push(N.cache.user.invalidateUser(c));return await Promise.all(u),await N.events.group.usersAdded(s.length,r,t),s}a(Gn,"addUsers");async function Qs(e,t){let r=await z.get(e),n=await N.users.bulkGetGlobalUsersById(t),o=[];for(let u of n){if(!u.userGroups||!u.userGroups.includes(e))continue;let c=u.userGroups.indexOf(e);u.userGroups.splice(c,1),o.push(u)}if(await N.users.bulkUpdateGlobalUsers(o),Object.values(r.roles||{}).includes("CREATOR")){let c=(await N.userUtils.creatorsInList(o)).filter(g=>g).length,f=o.length-c;f&&await Rr(0,f)}let i=[];for(let u of t)i.push(N.cache.user.invalidateUser(u));return await Promise.all(i),o.length&&await N.events.group.usersDeleted(o.length,r,t),o}a(Qs,"removeUsers");async function Ks(e,t){let r=await _r(e);if(r.roles||(r.roles={}),t.appsToAdd)for(let n of t.appsToAdd)r.roles[n.appId]=n.roleId;if(t.appsToRemove)for(let n of t.appsToRemove)delete r.roles[n.appId];if(r.builder={apps:Object.entries(r.roles).filter(([n,o])=>o==="CREATOR").map(([n])=>n)},r.builder.apps.length&&!Ps())throw new N.HTTPError("Feature not enabled, please check license",400);return await Bn(r)}a(Ks,"updateGroupApps");async function Fx(e){let t=await Oa(),r=[];for(let n of t)!n.roles||!n.roles[e]||(delete n.roles[e],r.push(n));return await z.bulkSave(r)}a(Fx,"cleanupApp");async function Wx(){if(!await Us()){let e=N.tenancy.getGlobalDB(),r=(await Oa()||[]).filter(n=>Object.values(n?.roles||{}).includes("CREATOR"));for(let n of r){let o=await z.getGroupUsers(n._id),i=(await Promise.all(o.map(g=>e.get(g._id)))).map(g=>({...g,userGroups:g.userGroups.filter(h=>h!==n._id)})),c=(await N.userUtils.creatorsInList(i)).filter(g=>g).length,f=o.length-c;await z.save({...n,roles:{}}),f&&await Rr(0,f)}}}a(Wx,"adjustGroupCreatorsQuotas");Vs.users.UserDB.init(ft,re,Ze);var Qe=Vs.users.UserDB;var jn={};x(jn,{logs:()=>ei});var ei={};x(ei,{logSearch:()=>Jx,oldestLogDate:()=>zf,storeLog:()=>Xx});var $n=require("@budibase/backend-core"),Yf=require("@budibase/types");var ge=require("@budibase/backend-core"),Wn=require("@budibase/types");var jf=require("@budibase/backend-core");async function Qf(e,t){let r,n=5,o=!1,s,i=!0;for(;n>0;n--)try{i?s=await e():s=await exports.randomDelay(e),o=!0;break}catch(u){r=u}return o||jf.logging.logWarn(`Failed to backoff: ${t}`,r),s}a(Qf,"backOff");var{SEPARATOR:wt,UNICODE_MAX:$x,DocumentType:Kf,AutomationViewMode:Hs,ViewName:jx,getQueryIndex:Qx}=ge.db,Kx=new Date(0).toISOString(),Vx=100,Ys=a(async()=>on(Wn.ConstantQuotaName.AUTOMATION_LOG_RETENTION_DAYS),"oldestLogDate");function Vf(e,t,{status:r,automationId:n}={},o={}){let s=n?`${n}${wt}`:"",i=r?`${r}${wt}`:"",u;return r&&n?u=`${Hs.ALL}${wt}${i}${s}`:r?u=`${Hs.STATUS}${wt}${i}`:n?u=`${Hs.AUTOMATION}${wt}${s}`:u=`${Kf.AUTOMATION_LOG}${wt}`,{...o,descending:!0,startkey:`${u}${t}${$x}`,endkey:`${u}${e}`}}a(Vf,"getAutomationLogParams");function Hx(e,t,r){return`${Kf.AUTOMATION_LOG}${wt}${e}${wt}${r}${wt}${t}`}a(Hx,"generateAutomationLogID");async function zs(e,t,r={docs:!0}){let n=ge.context.getProdWorkspaceDB();await n.exists()||(n=ge.context.getDevWorkspaceDB());let o={status:r.status},s=r?.limit?r.limit:r?.paginate?9+1:void 0,i=Vf(e,t,o,{include_docs:r.docs,limit:s});r?.page&&(i.startkey=r.page);let u=await n.allDocs(i);return na(u,{paginate:r?.paginate,pageSize:9})}a(zs,"getAllLogs");async function Js(e,t,r={}){let n=ge.context.getProdWorkspaceDB();await n.exists()||(n=ge.context.getDevWorkspaceDB());let o;try{let s={automationId:r?.automationId,status:r?.status},i=Vf(e,t,s,{include_docs:!0,limit:9+1});r?.page&&(i.startkey=r.page),o=await n.query(Qx(jx.AUTOMATION_LOGS),i)}catch(s){if(s!=null&&(s.name==="not_found"||s.error==="not_found"))return await Sc(),Js(e,t,r);throw s}return na(o,{paginate:!0,pageSize:9})}a(Js,"getLogsByView");async function Hf(e,t){let r=ge.context.getProdWorkspaceDB(),n=e._id,o=e.name,s=new Date().toISOString(),i=Hx(s,t.status,n),u={...t,automationId:n,status:t.status,automationName:o,createdAt:s,_id:i};return await r.put(u),i}a(Hf,"writeLog");async function Xs(e,{clearing:t}={clearing:!1}){let r=ge.context.getProdWorkspaceDB();await Qf(async()=>{let n=await r.get(ge.db.DocumentType.WORKSPACE_METADATA);for(let o of e){let s=o.split(ge.db.SEPARATOR),i=`${s[s.length-3]}${ge.db.SEPARATOR}${s[s.length-2]}`,u={};n.automationErrors&&(u=n.automationErrors),Array.isArray(u[i])||(u[i]=[]);let c=u[i].indexOf(o);t&&c!==-1?u[i].splice(c,1):u[i].push(o),u[i].length===0&&delete u[i],n.automationErrors=u}await r.put(n),await ge.cache.workspace.invalidateWorkspaceMetadata(n.appId,n)},"Failed to update app metadata with automation log error")}a(Xs,"updateAppMetadataWithErrors");async function Yx(){let e=await Ys();try{return await zs(Kx,e,{docs:!1,paginate:!1,limit:Vx})}catch{return{data:[],hasNextPage:!1}}}a(Yx,"getExpiredLogs");async function Zs(){let e=ge.context.getProdWorkspaceDB();try{let t=await Yx();if(!t.data||t.data.length===0)return;let r=t.data.map(o=>({_id:o.id,_rev:o.value.rev,_deleted:!0})),n=t.data.filter(o=>{let s=o.id.split(ge.db.SEPARATOR);return s[s.length-1]===Wn.AutomationStatus.ERROR}).map(o=>o.id);await e.bulkDocs(r),n.length&&await Xs(n,{clearing:!0})}catch(t){ge.logging.logAlert(`Failed to cleanup automation log history - Database "${e.name}"`,t)}}a(Zs,"clearOldHistory");var zf=Ys;async function zx(e,t,r,n){let o,s=new Date().toISOString(),i=await zf();return(!e||e<i)&&(e=i),r||t?o=await Js(e,s,{automationId:r,status:t,page:n}):o=await zs(e,s,{status:t,page:n,docs:!0,paginate:!0}),o}a(zx,"getLogs");async function Jx(e){return await Zs(),await zx(e.startDate,e.status,e.automationId,e.page)}a(Jx,"logSearch");async function Xx(e,t){if(!$n.db.isProdWorkspaceID($n.context.getWorkspaceId()))return;let r=await Hf(e,t);t.status===Yf.AutomationStatus.ERROR&&await Xs([r]),await Zs()}a(Xx,"storeLog");var Qn={};x(Qn,{checkPluginQuotas:()=>tC,deletePlugin:()=>eC,storePlugin:()=>Zx});var em=require("@budibase/types"),fe=require("@budibase/backend-core");var Jf=F(require("fs")),Xf=require("path");function Zf(e,t){return Jf.default.readFileSync((0,Xf.join)(e,t),"utf8")}a(Zf,"loadJSFile");async function Zx(metadata,directory,source){let db=fe.tenancy.getGlobalDB(),version=metadata.package.version,name=metadata.package.name,description=metadata.package.description,hash=metadata.schema.hash,bucketPath=fe.objectStore.getPluginS3Dir(name),files=await fe.objectStore.uploadDirectory(fe.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===em.PluginType.DATASOURCE){let js=Zf(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=fe.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});let write=a(async()=>{let e=await db.put(doc);return await fe.events.plugin.imported(doc),{...doc,_rev:e.rev}},"write");return rev?await write():await Gs(write)}a(Zx,"storePlugin");async function eC(e){let t=fe.tenancy.getGlobalDB();try{let r=await t.get(e),n=fe.objectStore.getPluginS3Dir(r.name);await fe.objectStore.deleteFolder(fe.objectStore.ObjectStoreBuckets.PLUGINS,n),await t.remove(e,r._rev),await fe.events.plugin.deleted(r),await Fs()}catch(r){let n=r?.message?r?.message:r;throw new Error(`Failed to delete plugin: ${n}`)}}a(eC,"deletePlugin");async function tC(){let e=fe.tenancy.getGlobalDB();try{let r=(await e.allDocs(fe.db.getPluginParams())).rows.length;console.log(`Syncing plugin count: ${r}`),await Ws(r)}catch(t){fe.logging.logAlert("Unable to retrieve plugins for quota check",t)}}a(tC,"checkPluginQuotas");var mt={};x(mt,{fetch:()=>aC,fetchValues:()=>nC,isEncryptionKeyAvailable:()=>rC,isValid:()=>am,remove:()=>sC,update:()=>oC});var tm=require("@budibase/backend-core"),La=require("@budibase/types");function rC(){return!!tm.env.ENCRYPTION_KEY}a(rC,"isEncryptionKeyAvailable");async function aC(){let e=await jt.get();return Object.keys(e.variables)}a(aC,"fetch");async function nC(e){let r=(await jt.get()).variables,n={};for(let[o,s]of Object.entries(r))switch(e){case La.Environment.DEVELOPMENT:n[o]=s.development;break;case La.Environment.PRODUCTION:default:n[o]=s.production;break}return n}a(nC,"fetchValues");async function rm(e){if(!(await ct.cache.getCachedLicense()).features.includes(La.Feature.ENVIRONMENT_VARIABLES))throw new Error("User does not have access to environment variables feature.");let r=await jt.get();r.variables=e(r.variables),await jt.update(r)}a(rm,"changeValues");async function oC(e,t){if(am(e))await rm(n=>(n[e]=t,n));else throw new Error("Variable name has characters that are not allowed")}a(oC,"update");async function sC(e){await rm(t=>(delete t[e],t))}a(sC,"remove");function am(e){return/^[a-zA-Z0-9-_]+$/.test(e)}a(am,"isValid");var kt={};x(kt,{definitions:()=>yC,download:()=>hC,fetch:()=>gC,write:()=>fC});var Pe=require("@budibase/backend-core"),Vn=require("@budibase/types");var ue=require("@budibase/backend-core"),tt=require("@budibase/types");var nm=require("memorystream"),om=new ue.sql.Sql(tt.SqlClient.SQL_LITE);async function iC(e,t,r){let n={operation:tt.Operation.READ,table:or.searchTable(),tables:{},paginate:{limit:r||9,page:t},filters:e,resource:{fields:[]},sort:{timestamp:{direction:tt.SortOrder.DESCENDING,type:tt.SortType.STRING}}},o=om._query(n);if(Array.isArray(o))throw new Error("Cannot execute multiple queries for audit log search");return{sql:o.sql,bindings:o.bindings}}a(iC,"getAuditLogSqlQuery");function uC(e){return`${ue.DocumentType.AUDIT_LOG}${ue.SEPARATOR}${e}${ue.SEPARATOR}${ue.utils.newid()}`}a(uC,"generateAuditLogID");async function sm(e){e._id||(e._id=uC(e.timestamp)),e.type||(e.type=tt.AUDIT_LOG_TYPE);try{let r=await ue.context.getAuditLogsDB().put(e);return{...e,_rev:r.rev}}catch(t){ue.logging.logAlert("Failed to write audit log",t)}}a(sm,"save");async function ti(e,t,r){t||(t=1);let n=ue.context.getAuditLogsDB();try{let o=9+1,s=await iC(e,t,o),i=or.searchTable(),u=om.convertJsonStringColumns(i,await n.sql(s.sql,s.bindings)),c;u.length>o&&(c=u.pop());let f={rows:u,hasNextPage:!!c};return f.hasNextPage&&(f.bookmark=t+1),f}catch(o){if(o.status===404&&!r?.isRetry)return await cC(),await ic(),await ti(e,t,{isRetry:!0});throw o}}a(ti,"searchSQL");async function cC(){let e=ue.context.getAuditLogsDB(),r=(await e.allDocs(ue.db.getDocParams(ue.DocumentType.AUDIT_LOG,null,{include_docs:!0}))).rows.map(n=>n.doc).filter(n=>n&&!n.type).map(n=>({...n,type:tt.AUDIT_LOG_TYPE}));await e.bulkDocs(r)}a(cC,"migrate");function im(e){let t=ue.context.getAuditLogsDB(),r=new nm,n=t.dump(r,{filter:s=>{let i=s;if(!i._id?.startsWith(ue.DocumentType.AUDIT_LOG))return!1;let u=!0,c=a((f,g)=>{!f||f.length===0||(u=!!(u&&g&&f.includes(g)))},"matcher");if(c(e.userIds,i.userId),c(e.appIds,i.appId),c(e.events,i.event),(e.startDate||e.endDate)&&(u=u&&i.timestamp>=e.startDate&&i.timestamp<=e.endDate),e.fullSearch){let f=JSON.stringify(s);u=u&&f.includes(e.fullSearch)}return u}}),o=new nm;return r.on("data",s=>{let i=JSON.parse(Buffer.from(s).toString());if(Array.isArray(i.docs)){let u="";for(let c of i.docs)u+=JSON.stringify(c)+`
|
|
38
38
|
`;o.write(u)}}),r.on("end",()=>{o.end()}),{promise:n,stream:o}}a(im,"dump");var Pa=require("@budibase/backend-core"),Ua=require("@budibase/string-templates"),Kn=require("@budibase/types");var lC=Pa.constants.MIN_VALID_DATE.toISOString(),dC=Pa.constants.MAX_VALID_DATE.toISOString();function ri(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||lC,e.endDate=e.endDate||dC),e}a(ri,"fillDates");async function um(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(n=>Pa.db.getProdWorkspaceID(n)));let t={};function r(n,o){o?.length&&(t.oneOf={...t.oneOf,[n]:o})}return a(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=ri(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}a(um,"getSearchFilters");function ai(e,t,r){let n={_id:e,status:Kn.AuditLogResourceStatus.DELETED};switch(t){case"app":n.name=r?.appName;break;case"user":n.email=r?.email;break}return n}a(ai,"deleted");function ni(e){let t=(0,Ua.findHBSBlocks)(e);for(let r of t){let n=` "${r}"`;e=e.replace(e.includes(n)?n:` ${r}`,""),e=(0,Ua.processStringSync)(e,{})}return e}a(ni,"removeTemplateStrings");function cm(e,t){let r=Kn.AuditedEventFriendlyName[e];if(!r)throw new Error("No friendly name found.");let n=(0,Ua.processStringSync)(r,t);return n.includes('""')&&(n=ni(r)),n}a(cm,"getEventFriendlyName");async function fC(e,t,r){if(!await Ln()||!Pe.utils.isAudited(e))return;let n=cm(e,t),o=new Date;r?.timestamp&&(o=new Date(r.timestamp));let s={timestamp:o.toISOString(),event:e,name:n,userId:r?.userId||Vn.AuditLogSystemUser,metadata:{...t,...r?.hostInfo}},i={};try{if(r?.appId){s.appId=Pe.db.getProdWorkspaceID(r.appId);let u=await Pe.cache.workspace.getWorkspaceMetadata(r.appId);"name"in u&&(i.appName=u.name)}if(r?.userId){let u=await Pe.users.getById(r?.userId);i.email=u.email}}catch(u){Pe.logging.logAlert("Failed to retrieve fallback information for audit log",u)}return s.fallback=i,await sm(s)}a(fC,"write");async function mC(e){let t=e.map(u=>u.userId),n=e.filter(u=>u.appId).map(u=>Pe.db.getDevWorkspaceID(u.appId)),o=await Pe.users.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),s=await Pe.db.getWorkspacesByIDs([...new Set(n)]),i=[];for(let u of e){let c=o.find(h=>h?._id===u.userId),f=s.find(h=>Pe.db.isSameWorkspaceID(h?.appId,u.appId)),g={event:u.event,timestamp:u.timestamp,name:u.name,metadata:u.metadata,user:c||ai(u.userId,"user",u.fallback)};u.appId&&(g.app=f||ai(u.appId,"app",u.fallback)),i.push(g)}return i}a(mC,"enrich");async function gC(e){if(!await Ln())throw new Error("Audit logs not available - license required.");let t=await um(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await ti(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await mC(r.rows)}}a(gC,"fetch");function hC(e){return e=ri(e),im(e)}a(hC,"download");function yC(){let e=Object.entries(Vn.AuditedEventFriendlyName).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=ni(r[1]);return t}a(yC,"definitions");var Hn={};x(Hn,{applications:()=>ui,roles:()=>si,users:()=>oi});var oi={};x(oi,{roleCheck:()=>bC});function AC(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}a(AC,"removeRoles");async function bC(e,t){return await It()||AC(e,t),e}a(bC,"roleCheck");var si={};x(si,{assign:()=>IC,unAssign:()=>SC});var qa=require("@budibase/backend-core");async function IC(e,t){if(!await It())throw new Error("Unable to assign roles - license required.");let r=await Qe.bulkGet(e);for(let n of r){if(t.role&&t.role.roleId){let o=qa.db.getProdWorkspaceID(t.role.appId);n.roles[o]=t.role.roleId}if(t.appBuilder){let o=qa.db.getProdWorkspaceID(t.appBuilder.appId),s=n.builder?.apps||[];n.builder={apps:s.concat([o])}}t.builder&&(n.builder={global:!0}),t.admin&&(n.admin={global:!0}),n.roles}await Qe.bulkUpdate(r)}a(IC,"assign");async function SC(e,t){if(!await It())throw new Error("Unable to un-assign roles - license required.");let r=await Qe.bulkGet(e);for(let n of r){if(t.role){let o=qa.db.getProdWorkspaceID(t.role?.appId);n.roles[o]===t.role.roleId&&delete n.roles[o]}if(t.appBuilder&&n.builder?.apps){let o=qa.db.getProdWorkspaceID(t.appBuilder.appId);n.builder.apps=n.builder.apps.filter(s=>s!==o)}t.builder&&n.builder&&delete n.builder,t.admin&&n.admin&&delete n.admin}}a(SC,"unAssign");var ui={};x(ui,{buildExportFn:()=>TC,buildImportFn:()=>wC});var ii=require("@budibase/backend-core");function wC(e){return async(t,r)=>{await It()||t.throw(403,"Endpoint unavailable, license required."),t.request.files?.appExport||t.throw(400,"Must provide app export file for import."),await ii.context.doInWorkspaceContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}a(wC,"buildImportFn");function TC(e){return async(t,r)=>{await It()||t.throw(403,"Endpoint unavailable, license required.");let{encryptPassword:n,excludeRows:o}=t.request.body;await ii.context.doInWorkspaceContext(t.params.appId,async()=>{t.request.body={encryptPassword:n,excludeRows:o},t.query.appId=t.params.appId,await e(t),await r()})}}a(TC,"buildExportFn");var Se=require("@budibase/backend-core"),Ie=require("@budibase/types"),dm=F(require("fs")),fm=require("path");var ci=require("@budibase/backend-core");var pm;function lm(){pm=new ci.queue.BudibaseQueue(ci.queue.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}a(lm,"init");function Jt(){return pm}a(Jt,"getBackupQueue");async function pi(e,t={}){return $e.storeAppBackupMetadata(e,t)}a(pi,"storeAppBackupMetadata");function mm(e){let t=new Date().toISOString();switch(e){case Ie.BackupStatus.COMPLETE:case Ie.BackupStatus.FAILED:return{timestamp:t,finishedAt:t};case Ie.BackupStatus.STARTED:return{timestamp:t,startedAt:t};case Ie.BackupStatus.PENDING:return{timestamp:t,createdAt:t}}}a(mm,"getTimestamps");async function EC(e,t,r,n){let o=await Yn(e);return await $e.storeAppBackupMetadata({...o,...mm(t),contents:r,status:t,type:Ie.BackupType.BACKUP},{filename:n,docId:e})}a(EC,"updateBackupStatus");async function vC(e,t,r){let n=await Yn(e);return await $e.storeAppBackupMetadata({...n,...mm(r),status:r,type:Ie.BackupType.RESTORE,trigger:Ie.BackupTrigger.MANUAL},{docId:e,docRev:t})}a(vC,"updateRestoreStatus");async function Yn(e){return $e.getAppBackupMetadata(e)}a(Yn,"getAppBackup");async function RC(e,t){return $e.updateAppBackupMetadata(e,t)}a(RC,"updateAppBackup");async function gm(e){let t=await $e.getAppBackupMetadata(e);return t.filename&&await Se.objectStore.deleteFile(Se.objectStore.ObjectStoreBuckets.BACKUPS,t.filename),$e.deleteAppBackupMetadata(e)}a(gm,"deleteAppBackup");async function _C(e){let t=[];for(let r of e)try{await gm(r),t.push({backupId:r,success:!0})}catch(n){t.push({backupId:r,success:!1,error:n instanceof Error?n.message:"Unknown error"})}return t}a(_C,"deleteAppBackups");async function xC(e,t){return $e.fetchAppBackups(e,t)}a(xC,"fetchAppBackups");async function hm(e){let t=await $e.getAppBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let{stream:r}=await Se.objectStore.getReadStream(Se.objectStore.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}a(hm,"getBackupDownloadStream");async function CC(e){let{stream:t}=await hm(e),r=(0,fm.join)(Se.objectStore.budibaseTempDir(),Se.utils.newid()),n=dm.default.createWriteStream(r);return new Promise((o,s)=>{t.on("error",s),n.on("error",s),t.pipe(n).on("close",()=>o(r))})}a(CC,"downloadAppBackup");async function OC(e,t,r={}){let n;try{n=await pi({appId:e,trigger:t,timestamp:new Date().toISOString(),status:Ie.BackupStatus.PENDING,type:Ie.BackupType.BACKUP,...r})}catch(o){if(o.status===409)return;throw o}return await Jt().add({docId:n.id,docRev:n.rev,appId:e,export:{trigger:t,...r}}),await Se.events.backup.appBackupTriggered(e,n.id,Ie.BackupType.BACKUP,t,r?.name),n.id}a(OC,"triggerAppBackup");async function LC(e,t,r,n){let o=await Yn(t),s;try{s=await pi({appId:e,timestamp:new Date().toISOString(),status:Ie.BackupStatus.PENDING,type:Ie.BackupType.RESTORE,createdBy:n})}catch(i){if(i?.status===409)return;throw i}return await Jt().add({appId:e,docId:s.id,docRev:s.rev,import:{nameForBackup:r,backupId:t,createdBy:n}}),{restoreId:s.id,metadata:o}}a(LC,"triggerAppRestore");async function PC(e,t,r){let n=Se.db.getProdWorkspaceID(e);await Se.context.doInWorkspaceContext(n,async()=>{let o=Se.context.getProdWorkspaceDB();if(!await o.exists())return;let i=await o.tryGet(Ie.DocumentType.WORKSPACE_METADATA);i&&(i.backupErrors||(i.backupErrors={}),i.backupErrors[t]||(i.backupErrors[t]=[]),i.backupErrors[t].push(r),await o.put(i),await Se.cache.workspace.invalidateWorkspaceMetadata(i.appId,i))})}a(PC,"trackBackupError");var UC={isEnabled:Os,triggerAppRestore:xe(LC),triggerAppBackup:xe(OC),getBackupDownloadStream:xe(hm),downloadAppBackup:xe(CC),fetchAppBackups:xe(xC),storeAppBackupMetadata:xe(pi),updateBackupStatus:xe(EC),updateRestoreStatus:xe(vC),getAppBackup:xe(Yn),updateAppBackup:xe(RC),deleteAppBackup:xe(gm),deleteAppBackups:xe(_C),trackBackupError:xe(PC)},Ke=UC;var di={};x(di,{init:()=>li});var ae=require("@budibase/backend-core"),rt=require("@budibase/types"),xr=F(require("fs"));async function li(e){Jt().process(async t=>{let r=t.data;try{if(r.export)return console.log("Exporting app backup:",r.appId,r.export.trigger),kC(t,e);if(r.import)return console.log("Importing app backup:",r.appId,r.import.backupId),DC(t,e)}catch(n){ae.logging.logAlert(`Failed to perform backup for app ID: ${r.appId}`,n)}})}a(li,"init");async function qC(e){await ae.db.getDB(e,{skip_setup:!0}).destroy()}a(qC,"removeExistingApp");async function ym(e,t,r,n){let o=ae.db.getDevWorkspaceID(r),s=ae.db.getProdWorkspaceID(r),i=new Date().toISOString(),u=a(async(c,f)=>{n?.doc?await Ke.updateBackupStatus(n.doc.id,c,f?.contents,f?.filename):await Ke.storeAppBackupMetadata({appId:s,timestamp:i,trigger:e,status:c,name:n?.name,type:rt.BackupType.BACKUP,contents:f?.contents,createdBy:n?.createdBy},{filename:f?.filename})},"updateMetadata");try{let c=await n.processing.exportAppFn(o,{tar:!0}),f=await n.processing.statsFn(o),g=`${s}/backup-${i}.tar.gz`,h=ae.objectStore.ObjectStoreBuckets.BACKUPS,y=xr.default.createReadStream(c);await ae.objectStore.streamUpload({bucket:h,filename:g,stream:y,extra:{type:"application/gzip",metadata:{name:n?.name,trigger:e,timestamp:i,appId:s}}}),await u(rt.BackupStatus.COMPLETE,{filename:g,contents:f}),xr.default.existsSync(c)&&xr.default.rmSync(c)}catch(c){ae.logging.logAlert("App backup error",c),await u(rt.BackupStatus.FAILED);let f=n?.doc?.id||`backup-${i}`,g=c instanceof Error?c.message:String(c);await Ke.trackBackupError(s,f,`Backup export failed: ${g}`)}}a(ym,"runBackup");async function DC(e,t){let r=e.data,n=r.appId,o=r.import.backupId,s=r.import.nameForBackup,i=r.import.createdBy,u=ae.tenancy.getTenantIDFromWorkspaceID(n);return ae.tenancy.doInTenant(u,async()=>{let c=ae.db.getDevWorkspaceID(n),f=`${c}_temp_${Date.now()}`,{rev:g}=await Ke.updateRestoreStatus(r.docId,r.docRev,rt.BackupStatus.STARTED);await ym(rt.BackupTrigger.RESTORING,u,n,{processing:t,createdBy:i,name:s});let h=await Ke.downloadAppBackup(o),y=rt.BackupStatus.COMPLETE;try{await t.importAppFn(f,ae.db.getDB(f),{file:{type:"application/gzip",path:h},key:h}),await qC(c),await new ae.db.Replication({source:f,target:c}).replicate()}catch(E){ae.logging.logAlert("App restore error",E),y=rt.BackupStatus.FAILED;let M=E instanceof Error?E.message:String(E);await Ke.trackBackupError(n,o,`Backup restore failed: ${M}`)}finally{try{await ae.db.getDB(f,{skip_setup:!0}).destroy()}catch{}}await Ke.updateRestoreStatus(r.docId,g,y),xr.default.existsSync(h)&&xr.default.rmSync(h,{force:!0})})}a(DC,"importProcessor");async function kC(e,t){let r=e.data,n=r.appId,o=r.export.trigger,s=r.export.name,i=ae.tenancy.getTenantIDFromWorkspaceID(n);await ae.tenancy.doInTenant(i,async()=>{try{let{rev:u}=await Ke.updateBackupStatus(r.docId,rt.BackupStatus.STARTED);return ym(o,i,n,{processing:t,doc:{id:r.docId,rev:u},name:s})}catch(u){ae.logging.logAlert("App backup error",u);let c=u instanceof Error?u.message:String(u);await Ke.trackBackupError(n,r.docId,`Backup export failed: ${c}`)}})}a(kC,"exportProcessor");var MC=a(async e=>{lm(),await li(e.processing)},"init"),Ne={...Ke,processing:di,init:MC,getBackupQueue:Jt};var Am=a(async e=>{e.backups&&await Ne.init(e.backups)},"init");var qe={};x(qe,{create:()=>ON,find:()=>CN,get:()=>xN,remove:()=>PN,update:()=>LN});var GA=F(su()),Tt=require("@budibase/backend-core");var FA=require("@budibase/types");async function xN(e){let t=Tt.tenancy.getGlobalDB(),r=new Tt.db.QueryBuilder(t.name,FA.SearchIndex.USER);r.setIndexBuilder(Tt.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 n=await r.run();return{users:n.rows,total:n.totalRows}}a(xN,"get");async function CN(e){return await Tt.users.getById(e)}a(CN,"find");async function ON(e){let t=await Qe.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new Tt.HTTPError("User is already synched",409);e={...t,scimInfo:(0,GA.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await Qe.save(e,{requirePassword:!1})}a(ON,"create");async function LN(e,t){return await Qe.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}a(LN,"update");async function PN(e){return await Qe.destroy(e)}a(PN,"remove");var qr={};x(qr,{create:()=>UN});var WA=F(su());var $A=require("@budibase/backend-core");async function UN(e){let t=await Do(e.name),r;if(!t)r=(await re.save(e)).id;else{if(t.scimInfo?.isSync)throw new $A.HTTPError("Group is already synched",409);r=t._id,t.users&&(await re.removeUsers(r,t.users.map(o=>o._id)),delete t.users),t.scimInfo=(0,WA.default)(t.scimInfo,e.scimInfo),await re.save(t)}return await re.get(r)}a(UN,"create");var Zt={};x(Zt,{logRequest:()=>kN,logResponse:()=>MN});var at=require("@budibase/backend-core"),QA=F(jA());var{DocWritethrough:qN}=at.cache.docWritethrough;function DN(){return`${at.db.DocumentType.SCIM_LOG}${at.db.SEPARATOR}${(0,QA.default)().format("YYYYMMDD")}`}a(DN,"getLogDocId");var KA=a(()=>{let e=at.context.getScimDBName();return new qN(at.db.getDB(e),DN())},"getDB");async function kN(e){at.logging.logWarn("SCIM request log",e);let t=Date.now().toString();return await KA().patch({[`${t}_request`]:{ts:new Date().toISOString(),...e}}),t}a(kN,"logRequest");async function MN(e,t){at.logging.logWarn("SCIM response",t),await KA().patch({[`${e}_response`]:{ts:new Date().toISOString(),...t}})}a(MN,"logResponse");var gu={};x(gu,{doInScimContext:()=>pu,feature:()=>we,internalGroupOnly:()=>Ba,licenseAuth:()=>mu,licensing:()=>VA,requireSCIM:()=>lu,scimGroupOnly:()=>Na,scimUserOnly:()=>Ma});var Mt=require("@budibase/backend-core");var uo=require("@budibase/types");var NN=a((e={checkUsersLimit:!0})=>async(t,r)=>{if((e.licensingCheck?e.licensingCheck:()=>!!t.user)(t)){if(Mt.env.SELF_HOSTED&&Mt.env.DEFAULT_LICENSE)return t.user.license=ko,r();t.user.license=await ct.cache.getCachedLicense(t,{populateLicense:e.populateLicense,populateFreeLicense:e.populateFreeLicense}),e.checkUsersLimit&&(Mt.utils.isServingApp(t)||Mt.utils.isServingBuilder(t)||Mt.utils.isServingBuilderPreview(t)||Mt.utils.isPublicApiRequest(t))&&await ft.usageLimitIsExceeded({name:uo.StaticQuotaName.USERS,type:uo.QuotaUsageType.STATIC,usageChange:0})}return r()},"licensing"),VA=NN;var we={};x(we,{requireFeature:()=>BN,requireFeatures:()=>GN});var BN=a(e=>async(t,r)=>{await On(e),await r()},"requireFeature"),GN=a((...e)=>async(t,r)=>{await Cs(e),await r()},"requireFeatures");var co=require("@budibase/backend-core");var pu=a(async(e,t)=>{let r;return co.env.ENABLE_SCIM_LOGGER&&(r=await Zt.logRequest({...e.request.toJSON(),body:e.request.body})),await co.context.doInScimContext(async()=>{let n=await t();return r&&await Zt.logResponse(r,{...e.response.toJSON(),body:e.response.body}),n})},"doInScimContext");var lu=a(async(e,t)=>{await qs(),await t()},"requireSCIM");var HA=require("@budibase/backend-core");var Ma=a(e=>du(HA.users.getById,e,!0),"scimUserOnly"),Na=a(e=>du(z.get,e,!0),"scimGroupOnly"),Ba=a(e=>du(z.get,e,!1),"internalGroupOnly");function du(e,t,r){return async(n,o)=>{let s=n.params[t];return typeof s!="string"&&n.throw(404),!!(await e(s)).scimInfo?.isSync!==r&&n.throw(404),o()}}a(du,"scimSyncChecks");var Ga=require("@budibase/backend-core");var fu=require("dd-trace");async function mu(e,t){await fu.tracer.trace("licenseAuth",async r=>{let n=e.request.headers[Ga.constants.Header.LICENSE_KEY];Array.isArray(n)&&(n=n[0]),r.addTags({licenseKey:n}),n||e.throw(403,"License key not provided");let o=await vs(n);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"),fu.tracer.setUser({id:"anonymous",tenantId:o.tenantId}),await Ga.context.doInSelfHostTenantUsingCloud(o.tenantId,async()=>{await Ga.context.doInLicenseContext(o,async()=>{await t()})})})}a(mu,"default");var Su={};x(Su,{appBackups:()=>nb,auditLogs:()=>fb,environmentVariables:()=>wb,groups:()=>qb,scim:()=>pI});var Et=require("@budibase/backend-core"),lo=require("@budibase/types"),rb=F(require("@koa/router")),tr=F(require("joi"));var po=require("@budibase/backend-core"),hu=require("@budibase/types");async function er(e,t){t||e.throw(400,"App ID missing"),await cr.workspaceExists(t)||e.throw(400,`Provided app ID: ${t} - is invalid.`)}a(er,"checkAppID");async function YA(e){let t=e.params.appId;await er(e,t);let{body:r}=e.request,n=e.user?._id,o=await Ne.triggerAppBackup(t,hu.BackupTrigger.MANUAL,{name:r.name,createdBy:n});o||e.throw(500,"Unable to start backup."),e.body={backupId:o,message:"Backup triggered - process starting."}}a(YA,"manualBackup");async function zA(e){let t=e.params.appId;await er(e,t);let r=e.params.backupId,n=e.request.body.name,o=await Ne.triggerAppRestore(t,r,n,e.user?._id);o||e.throw(500,"Unable to start restore."),await po.events.backup.appBackupRestored(o.metadata),e.body={restoreId:o?.restoreId,message:"Restore triggered - process starting."}}a(zA,"importBackup");async function JA(e){let t=e.params.appId;await er(e,t);let r=e.params.backupId;await Ne.deleteAppBackup(r),e.body={message:"Backup deleted successfully."}}a(JA,"deleteBackup");async function XA(e){let t=po.context.getWorkspaceId();await er(e,t);let{backupIds:r}=e.request.body;(!Array.isArray(r)||r.length===0)&&e.throw(400,"backupIds must be a non-empty array");let n=await Ne.deleteAppBackups(r),o=n.filter(i=>i.success).length,s=n.length-o;e.body={message:`${o} backups deleted successfully${s>0?`, ${s} failed`:""}.`,results:n,successCount:o,failureCount:s}}a(XA,"deleteBackups");async function ZA(e){let t=e.params.appId;await er(e,t);let r=e.request.body;r?.trigger&&(r.trigger=r.trigger.toLowerCase(),Object.values(hu.BackupTrigger).includes(r.trigger)||e.throw(400,"Provided trigger is not a valid option.")),e.body=await Ne.fetchAppBackups(t,{paginate:!0,...r})}a(ZA,"fetchBackups");async function eb(e){let t=e.params.appId;await er(e,t);let r=e.params.backupId,n=e.request.body;e.body=await Ne.updateAppBackup(r,n.name)}a(eb,"updateBackup");async function tb(e){let t=e.params.appId;await er(e,t);let r=e.params.backupId,{metadata:n,stream:o}=await Ne.getBackupDownloadStream(r);e.attachment(`backup-${n.timestamp}.tar.gz`),e.body=o}a(tb,"downloadBackup");var ab=new rb.default;function WN(){return Et.auth.joiValidator.body(tr.default.object({trigger:tr.default.string().valid(...Object.values(lo.BackupTrigger)),type:tr.default.string().valid(...Object.values(lo.BackupType)),startDate:tr.default.date(),endDate:tr.default.date(),page:tr.default.string()}))}a(WN,"validateBackupSearch");ab.post("/api/apps/:appId/backups",Et.auth.builderOrAdmin,YA).post("/api/apps/:appId/backups/search",Et.auth.builderOrAdmin,WN(),ZA).get("/api/apps/:appId/backups/:backupId/file",Et.auth.builderOrAdmin,tb).patch("/api/apps/:appId/backups/:backupId",Et.auth.builderOrAdmin,eb).delete("/api/apps/:appId/backups/:backupId",Et.auth.builderOrAdmin,JA).delete("/api/apps/:appId/backups",Et.auth.builderOrAdmin,XA).post("/api/apps/:appId/backups/:backupId/import",Et.auth.builderOrAdmin,zA);var nb=ab;var yu=require("@budibase/backend-core");async function ob(e){let t=e.request.body,r=await kt.fetch(t);await yu.events.auditLog.filtered(t),e.body=r}a(ob,"search");async function sb(e){let t=e.request.body,{stream:r}=kt.download(t);await yu.events.auditLog.downloaded(t),e.attachment(`audit-logs-${Date.now()}.log`),e.body=r}a(sb,"download");async function ib(e){e.body={events:kt.definitions()}}a(ib,"definitions");var cb=require("@budibase/types"),rr=require("@budibase/backend-core"),pb=F(require("@koa/router")),Ve=F(require("joi"));function ub(){return rr.auth.joiValidator.body(Ve.default.object({userIds:Ve.default.array().items(Ve.default.string()).optional(),appIds:Ve.default.array().items(Ve.default.string()).optional(),events:Ve.default.array().items(Ve.default.string().valid(...Object.values(cb.Event))).optional(),startDate:Ve.default.string().optional().allow(""),endDate:Ve.default.string().optional().allow(""),fullSearch:Ve.default.string().optional().allow(""),bookmark:Ve.default.number()}))}a(ub,"buildAuditLogSearchValidator");var lb=new pb.default;lb.post("/api/global/auditlogs/search",rr.auth.adminOnly,ub(),ob).get("/api/global/auditlogs/download",rr.auth.adminOnly,rr.middleware.querystringToBody,ub(),sb).get("/api/global/auditlogs/definitions",rr.auth.adminOnly,ib);var fb=lb;var bu=require("@budibase/backend-core"),Au=require("@budibase/types");async function mb(e){e.body={encryptionKeyAvailable:mt.isEncryptionKeyAvailable()}}a(mb,"status");async function gb(e){e.body={variables:await mt.fetch()}}a(gb,"fetch");async function hb(e){let{name:t,production:r,development:n}=e.request.body;await mt.update(t,{production:r,development:n});let o=[Au.Environment.PRODUCTION];r!==n&&o.push(Au.Environment.DEVELOPMENT),await bu.events.environmentVariable.created(t,o),e.body={message:`Environment variable "${t}" created.`}}a(hb,"create");async function yb(e){let{production:t,development:r}=e.request.body,n=e.params.varName;await mt.update(n,{production:t,development:r}),e.body={message:`Environment variable "${n}" updated.`}}a(yb,"update");async function Ab(e){let t=e.params.varName;await mt.remove(t),await bu.events.environmentVariable.deleted(t),e.body={message:`Environment variable "${t}" deleted.`}}a(Ab,"destroy");var ar=require("@budibase/backend-core"),Ib=F(require("@koa/router")),Fa=F(require("joi"));var Sb=new Ib.default;function bb(){return ar.auth.joiValidator.body(Fa.default.object({name:Fa.default.string().optional(),production:Fa.default.string().required(),development:Fa.default.string().required()}))}a(bb,"buildEnvVarUpdateValidator");Sb.get("/api/env/variables/status",ar.auth.builderOrAdmin,mb).get("/api/env/variables",ar.auth.builderOrAdmin,gb).post("/api/env/variables",ar.auth.builderOrAdmin,bb(),hb).patch("/api/env/variables/:varName",ar.auth.builderOrAdmin,bb(),yb).delete("/api/env/variables/:varName",ar.auth.builderOrAdmin,Ab);var wb=Sb;var gt=require("@budibase/backend-core"),vt=require("@budibase/types"),Pb=F(require("@koa/router")),Ce=F(require("joi"));var Tb=require("@budibase/backend-core");async function Eb(e){let t=e.request.body;if(t.name=t.name.trim(),delete t.roles,t._id){let n=await _r(t._id);t.roles=n.roles,t.scimInfo=n.scimInfo}let r=await Bn(t);e.body={_id:r.id,_rev:r.rev}}a(Eb,"save");async function vb(e){let t=e.params.groupId,r=e.request.body.add,n=e.request.body.remove;(r&&!Array.isArray(r)||n&&!Array.isArray(n))&&e.throw(400,"Must supply a list of users to add or to remove");let o,s;r&&(o=await Gn(t,r)),n&&(s=await Qs(t,n)),e.body={added:o,removed:s}}a(vb,"updateGroupUsers");async function Rb(e){let t=e.params.groupId,r=e.request.body.add,n=e.request.body.remove;(r&&!Array.isArray(r)||n&&!Array.isArray(n))&&e.throw(400,"Must supply a list of objects, with appId and roleId to add or remove"),e.body=await Ks(t,{appsToAdd:r,appsToRemove:n})}a(Rb,"updateGroupApps");async function _b(e){e.body={data:await Oa()}}a(_b,"fetch");async function xb(e){let{groupId:t,rev:r}=e.params;try{await $s(t,r),e.body={message:"Group deleted successfully"}}catch(n){e.throw(n.status,n)}}a(xb,"destroy");async function Cb(e){try{e.body=await _r(e.params.groupId)}catch(t){e.throw(t.status,t)}}a(Cb,"find");async function Ob(e){let{pageSize:t=10,bookmark:r,emailSearch:n}=e.request.query,o=e.params.groupId,s={limit:t+1},i=await an(o,{...s,emailSearch:n,bookmark:r}),u=n?i[t]?.email:i[t]?._id,c=!!u;e.body={users:i.slice(0,t),bookmark:u,hasNextPage:c}}a(Ob,"searchUsers");async function Lb(e){let{groupId:t}=e.params,{csvContent:r}=e.request.body;(r===void 0||r.trim().length===0)&&e.throw(400,"CSV is empty");let n=await Tb.csv.jsonFromCsvString(r,{allowSingleColumn:!0});(!n||n.length===0)&&e.throw(400,"CSV file is invalid");let s=Object.keys(n[0]).find(h=>/^(email|e-mail|email address|mail|e_mail)$/i.test(h.trim()));s||e.throw(400,"CSV file must contain an email column");let i=Array.from(new Set(n.map(h=>h[s]).filter(h=>h&&typeof h=="string"&&h.trim().length>0).map(h=>h.trim())));i.length===0&&e.throw(400,"No valid email addresses found in CSV");try{await _r(t)}catch(h){if(h.status===404)e.throw(404,"Group not found");else throw h}let u=[],c=[],f=[],g=await Promise.all(i.map(h=>Qe.getUserByEmail(h)));for(let h of i){let y=g.find(E=>E?.email===h);y?(u.push({_id:y._id,email:y.email}),f.push(y._id)):c.push({email:h,reason:"User not found"})}f.length>0&&await Gn(t,f),e.body={added:u,skipped:c}}a(Lb,"bulkAddUsersFromCsv");var Ub=new Pb.default;function KN(){return gt.auth.joiValidator.body(Ce.default.object({_id:Ce.default.string().optional(),_rev:Ce.default.string().optional(),color:Ce.default.string().required(),icon:Ce.default.string().required(),name:Ce.default.string().trim().required().max(50),role:Ce.default.string().optional(),users:Ce.default.array().optional(),apps:Ce.default.array().optional(),roles:Ce.default.object().optional(),createdAt:Ce.default.string().optional(),updatedAt:Ce.default.string().optional()}).required())}a(KN,"buildGroupSaveValidation");Ub.post("/api/global/groups",gt.auth.adminOnly,we.requireFeature(vt.Feature.USER_GROUPS),KN(),Eb).get("/api/global/groups",we.requireFeature(vt.Feature.USER_GROUPS),_b).delete("/api/global/groups/:groupId/:rev",we.requireFeature(vt.Feature.USER_GROUPS),gt.auth.adminOnly,Ba("groupId"),xb).get("/api/global/groups/:groupId",we.requireFeature(vt.Feature.USER_GROUPS),gt.auth.builderOrAdmin,Cb).get("/api/global/groups/:groupId/users",we.requireFeature(vt.Feature.USER_GROUPS),gt.auth.builderOrAdmin,Ob).post("/api/global/groups/:groupId/users",gt.auth.adminOnly,we.requireFeature(vt.Feature.USER_GROUPS),Ba("groupId"),vb).post("/api/global/groups/:groupId/users/bulk",gt.auth.adminOnly,we.requireFeature(vt.Feature.USER_GROUPS),Ba("groupId"),gt.auth.joiValidator.body(Ce.default.object({csvContent:Ce.default.string().required()}).required()),Lb).post("/api/global/groups/:groupId/apps",gt.auth.builderOrAdmin,we.requireFeature(vt.Feature.USER_GROUPS),Rb);var qb=Ub;var cI=F(require("@koa/router"));var fo=require("scim-patch");var kb=require("@budibase/backend-core");function Db(e,t){let r=e.request.query[t];if(r!==void 0)return+r}a(Db,"tryGetQueryAsNumber");var Mb=a(async e=>{let t=Db(e,"pageSize")??20,r=Db(e,"startIndex"),n;e.request.query.filter&&(n=ce.user.userFilters(e.request.query.filter));let o=await qe.get({pageSize:t,skip:r,filters:n});e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:o.total,Resources:o.users.map(ce.user.toScimUserResponse),startIndex:(r||0)+1,itemsPerPage:t}},"get"),Nb=a(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404);let r=await qe.find(t);e.body=ce.user.toScimUserResponse(r)},"find"),Bb=a(async e=>{let t=ce.user.fromScimUser(e.request.body);try{let r=await qe.create(t);e.body=ce.user.toScimUserResponse(r)}catch(r){throw r instanceof kb.EmailUnavailableError&&e.throw(409,"Email already in use"),r}},"create");function VN(e){let t=e.Operations.find(r=>(r.op==="Replace"||r.op==="replace")&&r.path==="active");return t?t.value===!1||t.value?.toLowerCase?.()==="false":!1}a(VN,"isDeactivation");var Gb=a(async e=>{let t=await qe.find(e.params.id);t||e.throw(404);let r=ce.user.toScimUserResponse(t),n=e.request.body;try{(0,fo.patchBodyValidation)(n)}catch{}if(VN(n))return Iu(e);let o;try{o=(0,fo.scimPatch)(r,n.Operations)}catch{}o||e.throw(500);let s=ce.user.fromScimUser(o);await qe.update(s,{allowChangingEmail:!0}),e.body=ce.user.toScimUserResponse(s)},"update"),Iu=a(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404),await qe.remove(t),e.status=204},"remove");var tI=F(eI()),rI=require("@budibase/shared-core"),mo=require("scim-patch");var go=require("scim2-parse-filter");function aI(e,t){for(let r of t.split(","))delete e[r]}a(aI,"cleanResponse");var nI=a(async e=>{let r=(await re.fetch()).filter(s=>s.scimInfo?.isSync).map(ce.group.toScimGroupResponse),{filter:n,excludedAttributes:o}=e.request.query;if(n){let s=(0,go.filter)((0,go.parse)(n));r=r.filter(s)}o&&r.forEach(s=>{aI(s,o)}),e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:r.length,Resources:r,startIndex:1,itemsPerPage:r.length}},"get"),oI=a(async e=>{let t=ce.group.fromScimGroup(e.request.body),r=await qr.create(t);e.body=ce.group.toScimGroupResponse(r)},"create"),sI=a(async e=>{let{id:t}=e.params,r=await re.get(t),n=ce.group.toScimGroupResponse(r),{excludedAttributes:o}=e.request.query;o&&aI(n,o),e.body=n},"find"),iI=a(async e=>{let{id:t}=e.params,r=await re.get(t);await re.remove(t,r._rev),e.status=204},"remove"),uI=a(async e=>{let{id:t}=e.params,r=await re.get(t),n=ce.group.toScimGroupResponse(r),o=e.request.body;try{(0,mo.patchBodyValidation)(o)}catch{e.throw(400)}let{true:s,false:i}=(0,tI.default)(o.Operations,u=>u.path==="members");if(i?.length){let u=(0,mo.scimPatch)(n,i);u||e.throw(500);let c={...ce.group.fromScimGroup(u),_rev:r._rev};await re.save(c)}if(s?.length){let u=[],c=[];for(let{op:f,value:g}of s)switch(f){case"add":case"Add":for(let h of g)u.push(await qe.find(h.value));break;case"remove":case"Remove":for(let h of g)c.push(await qe.find(h.value));break;case"replace":case"Replace":throw new Error("Replacing members is not allowed");default:rI.utils.unreachable(f)}u.length&&await re.addUsers(t,u.map(f=>f._id)),c.length&&await re.removeUsers(t,c.map(f=>f._id))}e.body=ce.group.toScimGroupResponse(await re.get(t))},"update");var Wa=require("@budibase/types"),Be=new cI.default({prefix:"/api/global/scim/v2"});Be.use(lu);Be.use(pu);Be.get("/users",Mb);Be.get("/users/:id",Ma("id"),Nb);Be.post("/users",Bb);Be.patch("/users/:id",Ma("id"),Gb);Be.delete("/users/:id",Ma("id"),Iu);Be.get("/groups",nI);Be.post("/groups",we.requireFeature(Wa.Feature.USER_GROUPS),oI);Be.get("/groups/:id",we.requireFeature(Wa.Feature.USER_GROUPS),Na("id"),sI);Be.delete("/groups/:id",we.requireFeature(Wa.Feature.USER_GROUPS),Na("id"),iI);Be.patch("/groups/:id",we.requireFeature(Wa.Feature.USER_GROUPS),Na("id"),uI);var pI=Be;var ce={};x(ce,{group:()=>Tu,user:()=>wu});var wu={};x(wu,{fromScimUser:()=>SB,toScimUserResponse:()=>AB,userFilters:()=>wB});var lI=require("@budibase/backend-core"),dI=require("@budibase/shared-core"),ho=require("@budibase/types"),fI=require("scim2-parse-filter");var{unreachable:yB}=dI.utils,AB=a(e=>{let{isSync:t,roles:r,...n}=e.scimInfo||{},o={...n,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===ho.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"),bB=a(e=>!!e?.id,"isScimUserResponse");function IB(e){if(lI.utils.validEmail(e.userName))return e.userName;if(e.emails)return e.emails.find(t=>t.primary)?.value||e.emails[0]?.value}a(IB,"tryGetEmail");var SB=a(e=>{let t=bB(e)?e:void 0,r=IB(e);if(!r)throw new Error("Email is required");let n;switch(e.active){case"True":case"true":case!0:n=!0;break;case"False":case"false":case!1:n=!1;break;default:yB(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:n?ho.UserStatus.ACTIVE:ho.UserStatus.INACTIVE,createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},"fromScimUser"),wB=a(e=>{let t={equal:{}},r=(0,fI.parse)(e);function n(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)n(s);break;default:console.warn("Filter not handled",{filter:o})}}return a(n,"parseFilters"),n(r),t},"userFilters");var Tu={};x(Tu,{fromScimGroup:()=>vB,toScimGroupResponse:()=>TB});var TB=a(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"),EB=a(e=>!!e?.id,"isScimGroup"),vB=a(e=>{let t=EB(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 Vu={};x(Vu,{LLM:()=>ht,LLMRequest:()=>se,TableGeneration:()=>Ku,agentHistoryTitleSystemPrompt:()=>kB,agentSystemPrompt:()=>DB,aiColumnSchemas:()=>ju,aiTableResponseToTableSchema:()=>Gu,appendAIColumns:()=>Fu,classifyText:()=>Ru,cleanData:()=>_u,extractFileData:()=>LB,generateAIColumns:()=>Nu,generateCode:()=>qB,generateCronExpression:()=>xu,generateData:()=>Bu,generateJs:()=>Pu,generateSQL:()=>UB,generateTables:()=>Mu,generationStructure:()=>$u,getLLM:()=>Ka,getLLMConfig:()=>ku,getLLMOrThrow:()=>TI,normalizeContentType:()=>Eu,parseResponseFormat:()=>Ao,sanitiseToolName:()=>RB,searchWeb:()=>Lu,sentimentAnalysis:()=>Ou,summarizeText:()=>yo,tableDataStructuredOutput:()=>Qu,translate:()=>Cu});var $a=require("@budibase/types");function RB(e){if(e.length>64)throw new Error("Tool name must be under 64 characters long");return e.replace(/[^a-zA-Z0-9_-]/g,"_")}a(RB,"sanitiseToolName");function Eu(e){return e?e.includes("/")?e:{[$a.SupportedFileType.PDF]:"application/pdf",[$a.SupportedFileType.JPG]:"image/jpeg",[$a.SupportedFileType.JPEG]:"image/jpeg",[$a.SupportedFileType.PNG]:"image/png"}[e.toLowerCase()]||"application/octet-stream":"application/octet-stream"}a(Eu,"normalizeContentType");var To=require("@budibase/types");var yt=require("@budibase/backend-core"),bI=require("@budibase/types");var bo=F(require("openai"));var Nt=require("@budibase/types");var mI=require("@budibase/shared-core");var Bt=F(require("dd-trace"));function vu(e,t){return t.map(r=>e[r]).join(" ")}a(vu,"extractTextFromColumns");var ht=class{static{a(this,"LLM")}constructor({model:t,apiKey:r,maxTokens:n}){this._model=t,this._apiKey=r,this._maxTokens=n??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 Bt.default.trace("prompt",async()=>{let r=typeof t=="string"?new se().addUserMessage(t):t,{messages:n,tokensUsed:o}=await Bt.default.trace("chatCompletion",()=>this.chatCompletion(r));return!n||n.length===0?{message:"",tokensUsed:o}:{message:n[n.length-1].content||"",tokensUsed:o}})}async chat(t){return await Bt.default.trace("chat",async()=>await this.chatCompletion(t))}async*chatStream(t){yield*this.chatCompletionStream(t)}async summarizeText(t){return Bt.default.trace("summarizeText",()=>this.prompt(yo(t)))}async generateCronExpression(t){return Bt.default.trace("generateCronExpression",()=>this.prompt(xu(t)))}async operation(t,r){return Bt.default.trace("operation",n=>{n.addTags({operation:t.operation,rowId:r.id});let o=this.promptForOperation(t,r);return this.prompt(o)})}promptForOperation(t,r){let{operation:n,column:o,columns:s,language:i,categories:u,prompt:c}=t;switch(n){case Nt.AIOperationEnum.SUMMARISE_TEXT:return yo(vu(r,s));case Nt.AIOperationEnum.CLEAN_DATA:return _u(r[o]);case Nt.AIOperationEnum.TRANSLATE:return Cu(r[o],i);case Nt.AIOperationEnum.CATEGORISE_TEXT:if(!u)throw Error("No categories provided for categorise text operation. Please provide categories.");return Ru(vu(r,s),u.split(","));case Nt.AIOperationEnum.SENTIMENT_ANALYSIS:return Ou(r[o]);case Nt.AIOperationEnum.PROMPT:return c;case Nt.AIOperationEnum.SEARCH_WEB:return Lu(vu(r,s));default:throw mI.utils.unreachable(n)}}async generateJs(t,r){return await Bt.default.trace("generateJs",async()=>{let{bindings:n=[],snippets:o=[]}=r||{};return await this.prompt(Pu(n,o).addUserMessage(t))})}};var hI=require("@budibase/types"),Uu=require("openai/helpers/zod");var ja=(n=>(n.GPT_5_MINI="gpt-5-mini",n.GPT_5="gpt-5",n.GPT_5_NANO="gpt-5-nano",n))(ja||{});function Ao(e){if(e)return e==="text"?{type:"text"}:e==="json"?{type:"json_object"}:e}a(Ao,"parseResponseFormat");function gI(e){if(!e)return 0;let t=e.prompt_tokens;return e.completion_tokens*3+t}a(gI,"calculateBudibaseAICredits");var He=class extends ht{constructor(r){super(r);this.client=this.getClient(r)}static{a(this,"OpenAI")}getVerbosityForModel(){if(Object.values(ja).includes(this.model))return"low"}getClient(r){if(!r.apiKey)throw new Error("No OpenAI API key found");return new bo.default({apiKey:r.apiKey})}async uploadFile(r,n,o){let s=Eu(o);if(hI.ImageContentTypes.includes(s.toLowerCase())){let c;if(Buffer.isBuffer(r))c=r;else{let g=[];for await(let h of r)g.push(new Uint8Array(h));c=Buffer.concat(g)}let f=c.toString("base64");return`data:${s};base64,${f}`}let i=await(0,bo.toFile)(r,n);return(await this.client.files.create({file:i,purpose:"assistants"})).id}async chatCompletion(r){let n={model:this.model,messages:r.messages,max_completion_tokens:this._maxTokens,response_format:Ao(r.format)};if(Object.values(ja).includes(this.model)){let i=this.getVerbosityForModel();i&&(n.verbosity=i),n.reasoning_effort="minimal"}r.tools&&r.tools.length>0&&(n.tool_choice="auto",n.tools=r.tools.map(Uu.zodFunction));let o=await this.client.chat.completions.create(n),s=o?.choices?.[0]?.message;if(s?.tool_calls){r.addMessage(s);let i=[];for(let u of s.tool_calls){if(u.type!=="function"||!u.function){console.warn(`[OPENAI TOOL WARN] Unsupported tool call type: ${u.type}`);continue}let c=u.function.name,f=r.findTool(c);if(!f)throw new Error(`Tool ${c} not found in prompt tools`);let g=JSON.parse(u.function.arguments);i.push(f.handler(g).then(h=>({role:"tool",tool_call_id:u.id,content:h})).catch(h=>(console.error(`[OPENAI TOOL ERROR] Tool ${c} failed in OpenAI handler:`,h),{role:"tool",tool_call_id:u.id,content:`Error: ${h.message}`})))}return r.addMessages(await Promise.all(i)),this.chatCompletion(r)}else{if(s?.content)return{messages:[...r.messages,{role:s.role,content:s.content}],tokensUsed:gI(o.usage)};throw new Error("No response found")}}async*chatCompletionStream(r){let n={model:this.model,messages:r.messages,max_tokens:this.maxTokens,response_format:Ao(r.format),stream:!0};r.tools&&r.tools.length>0&&(n.tool_choice="auto",n.tools=r.tools.map(Uu.zodFunction));try{let o=await this.client.chat.completions.create(n),s=null,i="",u=null;for await(let f of o){let g=f?.choices?.[0]?.delta;if(g){if(g.content&&(i+=g.content,yield{type:"content",content:g.content}),g.tool_calls&&g.tool_calls.length>0){let h=g.tool_calls[0];h.id?(s={id:h.id,name:h.function?.name||"",arguments:h.function?.arguments||""},yield{type:"tool_call_start",toolCall:{id:s.id,name:s.name,arguments:s.arguments}}):s&&h.function?.arguments&&(s.arguments+=h.function.arguments,yield{type:"tool_call_start",toolCall:{id:s.id,name:s.name,arguments:s.arguments}})}f.usage&&(u=f.usage)}}let c=u?gI(u):0;if(s){r.addMessage({role:"assistant",content:"",tool_calls:[{id:s.id,type:"function",function:{name:s.name,arguments:s.arguments}}]});let f=r.findTool(s.name);if(f)try{let g=JSON.parse(s.arguments),h=await f.handler(g);yield{type:"tool_call_result",toolResult:{id:s.id,result:h}},r.addMessage({role:"tool",tool_call_id:s.id,content:h}),yield*this.chatCompletionStream(r);return}catch(g){yield{type:"tool_call_result",toolResult:{id:s.id,result:`Error: ${g.message}`,error:g.message}},r.addMessage({role:"tool",tool_call_id:s.id,content:`Error: ${g.message}`}),yield*this.chatCompletionStream(r);return}else{let g=`Tool '${s.name}' not found`;yield{type:"tool_call_result",toolResult:{id:s.id,result:g,error:g}},r.addMessage({role:"tool",tool_call_id:s.id,content:g}),yield*this.chatCompletionStream(r);return}}i&&r.addMessage({role:"assistant",content:i}),yield{type:"done",messages:r.messages,tokensUsed:c}}catch(o){yield{type:"error",content:o.message}}}};var he=require("@budibase/backend-core"),yI=require("@budibase/types");var qu=require("dd-trace");var Io=class extends ht{static{a(this,"BudibaseAI")}async prompt(t){let r=await super.prompt(t);return r.tokensUsed&&await Mn(r.tokensUsed),r}async chat(t){let r=await super.chat(t);return r.tokensUsed&&await Mn(r.tokensUsed),r}async uploadFile(t,r,n){return he.env.SELF_HOSTED?this.uploadFileSelfHost(t,r,n):this.uploadFileCloud(t,r,n)}async uploadFileCloud(t,r,n){return new He({apiKey:he.env.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).uploadFile(t,r,n)}async uploadFileSelfHost(t,r,n){let o;if(Buffer.isBuffer(t))o=t;else{let g=[];for await(let h of t)g.push(new Uint8Array(h));o=Buffer.concat(g)}let s=o.toString("base64");if(n&&yI.ImageContentTypes.includes(n.toLowerCase()))return`data:image/jpeg;base64,${s}`;if(!he.env.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(!this._apiKey){let g=await xn();if(!g)throw new Error("No license key found");this._apiKey=g}let i=`${he.env.BUDICLOUD_URL}/api/ai/upload-file`,u={method:"POST",headers:{"Content-Type":"application/json",[he.constants.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify({data:s,filename:r,contentType:n})};console.debug("[BudibaseAI] uploadFileSelfHost - Making network call",{url:i,method:u.method,headers:u.headers,bodyKeys:["data","filename","contentType"],filename:r,contentType:n});let c=await fetch(i,u);if(console.debug("[BudibaseAI] uploadFileSelfHost - Network response",{url:i,status:c.status,statusText:c.statusText,ok:c.ok}),!c.ok)throw await he.HTTPError.fromResponse(c);return(await c.json()).fileId}async chatCompletion(t){return he.env.SELF_HOSTED?this.chatCompletionSelfHost(t):this.chatCompletionCloud(t)}async chatCompletionCloud(t){return await qu.tracer.trace("chatCompletionCloud",async()=>await new He({apiKey:he.env.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletion(t))}async chatCompletionSelfHost(t){return await qu.tracer.trace("chatCompletionSelfHost",async r=>{if(!he.env.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(r.addTags({budicloudUrl:he.env.BUDICLOUD_URL}),!this._apiKey){let c=await xn();if(!c)throw new Error("No license key found");this._apiKey=c,r.addTags({licenseKey:this._apiKey})}let n={messages:t.messages,format:t.format,useTools:t.tools.length>0},o=`${he.env.BUDICLOUD_URL}/api/ai/chat`,s={method:"POST",headers:{"Content-Type":"application/json",[he.constants.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify(n)};console.debug("[BudibaseAI] chatCompletionSelfHost - Making network call",{url:o,method:s.method,headers:s.headers,bodyKeys:Object.keys(n),messagesCount:t.messages.length,useTools:n.useTools,format:n.format});let i=await fetch(o,s);if(console.debug("[BudibaseAI] chatCompletionSelfHost - Network response",{url:o,status:i.status,statusText:i.statusText,ok:i.ok}),!i.ok)throw await he.HTTPError.fromResponse(i);let u=await i.json();return console.debug("[BudibaseAI] chatCompletionSelfHost - Response data",{url:o,tokensUsed:u.tokensUsed,messagesCount:u.messages?.length}),u})}async*chatCompletionStream(t){he.env.SELF_HOSTED?yield*this.chatCompletionStreamSelfHost(t):yield*this.chatCompletionStreamCloud(t)}async*chatCompletionStreamCloud(t){yield*new He({apiKey:he.env.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletionStream(t)}async*chatCompletionStreamSelfHost(t){console.debug("[BudibaseAI] chatCompletionStreamSelfHost - Starting streaming (fallback to non-streaming)",{messagesCount:t.messages.length,toolsCount:t.tools.length});try{let r=await this.chatCompletionSelfHost(t);if(console.debug("[BudibaseAI] chatCompletionStreamSelfHost - Yielding response chunks",{responseMessagesCount:r.messages.length,tokensUsed:r.tokensUsed}),r.messages.length>0){let n=r.messages[r.messages.length-1];n.content&&(yield{type:"content",content:n.content})}yield{type:"done",messages:r.messages,tokensUsed:r.tokensUsed}}catch(r){console.debug("[BudibaseAI] chatCompletionStreamSelfHost - Error occurred",{error:r.message}),yield{type:"error",content:r.message}}}};var Qa=require("dd-trace");var Du=F(require("@anthropic-ai/sdk"));function _B(e){if(!e)return 0;let t=e.input_tokens;return e.output_tokens*3+t}a(_B,"calculateBudibaseAICredits");var So=class extends ht{constructor(r){super(r);this.client=new Du.default({apiKey:r.apiKey})}static{a(this,"Anthropic")}firstTextBlock(r){for(let n of r.content)if(n.type==="text")return n.text}async uploadFile(r,n,o){throw new Error("File upload not supported for this LLM provider")}async chatCompletion(r){try{let n=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(n)||"";return{messages:[...r.messages,{role:"assistant",content:o}],tokensUsed:_B(n.usage)}}catch(n){throw n instanceof Du.default.APIError&&console.error(`Anthropic Prompt failed with error ${n.name} and status: ${n.status}`),n}}async*chatCompletionStream(r){try{let n=await this.chatCompletion(r);if(n.messages.length>0){let o=n.messages[n.messages.length-1];o.content&&(yield{type:"content",content:o.content})}yield{type:"done",messages:n.messages,tokensUsed:n.tokensUsed}}catch(n){yield{type:"error",content:n.message}}}};var II=require("zod"),SI=require("openai/helpers/zod");var AI=require("openai");var wo=class extends He{static{a(this,"AzureOpenAI")}getClient(t){if(!t.apiKey)throw new Error("No Azure OpenAI API key found");if(!t.model)throw new Error("No Azure OpenAI model specified");return new AI.AzureOpenAI({apiKey:t.apiKey,apiVersion:"2024-10-01-preview",baseURL:t.baseUrl})}getVerbosityForModel(){return Object.values(ja).includes(this.model)?"medium":void 0}};var wI={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"},xB={OpenAI:He,TogetherAI:He,AzureOpenAI:wo,Custom:He,Anthropic:So,BudibaseAI:Io};async function CB(){return await Qa.tracer.trace("getAIConfig",async e=>{let t={type:bI.ConfigType.AI,config:{}};if(!yt.context.isSelfHostUsingCloud()){let n=await yt.configs.getAIConfig();n&&(t=n)}await Ds(t);let r=Object.values(t.config).find(n=>n.active&&n.isDefault);if(!r){e.addTags({enabled:!1,reason:"no provider found"});return}return e.addTags({enabled:!0}),{provider:r.provider,model:r.defaultModel||wI[r.provider],apiKey:r.apiKey,baseUrl:r.baseUrl}})}a(CB,"getAIConfig");async function OB(){return Qa.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:wI.OpenAI,apiKey:yt.env.OPENAI_API_KEY}})}a(OB,"getSelfHostOpenAIKeyConfig");async function ku(){return Qa.tracer.trace("getLLMConfig",async()=>await CB()||await OB())}a(ku,"getLLMConfig");async function Ka(e){return await Qa.tracer.trace("getLLM",async t=>{let{model:r,maxTokens:n}=e||{},o=await ku();if(!o){t.addTags({enabled:!1,reason:"no config found"});return}r&&(o.model=r),n&&(o.maxTokens=n);let s=xB[o.provider];if(!s){t.addTags({enabled:!1,reason:"no provider found",provider:o.provider});return}return new s(o)})}a(Ka,"getLLM");async function TI(){let e=await Ka();if(!e)throw new yt.HTTPError("No available LLM configurations",500);return e}a(TI,"getLLMOrThrow");var se=class e{constructor(){this.messages=[];this.tools=[]}static{a(this,"LLMRequest")}addTool(t){return this.tools.push(t),this}addTools(t){return this.tools.push(...t),this}findTool(t){return this.tools.find(r=>r.name===t)}withFormat(t){return t instanceof II.z.ZodType?this.format=(0,SI.zodResponseFormat)(t,"key"):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 Rt=require("zod");function yo(e,t){let r=`Summarize this text:
|
|
39
39
|
${e}`,n="";if(t)switch(t){case To.SummariseLength.SHORT:n="In 1-2 concise sentences, ";break;case To.SummariseLength.MEDIUM:n="In 2-3 paragraphs, ";break;case To.SummariseLength.LONG:n="In multiple detailed paragraphs, ";break}return new se().addUserMessage(`${n}${r}.
|
|
40
40
|
Only return the summary.`)}a(yo,"summarizeText");function LB(e,t){let r=["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","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.20.
|
|
7
|
+
"version": "3.20.14",
|
|
8
8
|
"description": "Budibase Pro (Backend)",
|
|
9
9
|
"main": "dist/index.js",
|
|
10
10
|
"types": "dist/index.d.ts",
|
|
@@ -70,5 +70,5 @@
|
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
72
|
},
|
|
73
|
-
"gitHead": "
|
|
73
|
+
"gitHead": "722993643f9b1df9b424e04b8e4bc2a8705b3849"
|
|
74
74
|
}
|