@budibase/pro 3.34.8 → 3.34.10

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 CHANGED
@@ -36,7 +36,7 @@ d/o3ZWE1TTj1zYwlCLN5qRKr3hU8nC3xEYNEbkB9SfTRaOq9Q7P8WmfLkoCPm3pR
36
36
  mwIDAQAB
37
37
  -----END PUBLIC KEY-----
38
38
  `;function pn(e){return Ei.default.verify(e,hE,{algorithms:["RS256"]})}n(pn,"verifyLicenseToken");function yE(e,t){return Ei.default.sign(t,e,{encoding:"utf-8",algorithm:"RS256"})}n(yE,"sign");var To={};F(To,{getOfflineFeatures:()=>Ri});var v=require("@budibase/types");var dd=[v.Feature.BUDIBASE_AI,v.Feature.SYNC_AUTOMATIONS],fd=[v.Feature.WORKSPACE_BACKUPS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PDF,v.Feature.BUDIBASE_AI],md=[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.BRANDING,v.Feature.ENFORCEABLE_SSO,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.SYNC_AUTOMATIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.VIEW_PERMISSIONS,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.CUSTOM_APP_SCRIPTS,v.Feature.PWA,v.Feature.PDF,v.Feature.BUDIBASE_AI,v.Feature.RECAPTCHA,v.Feature.PKCE_OIDC,v.Feature.TRANSLATIONS],vE={[v.PlanType.FREE]:[...It.SELF_FREE_LICENSE.features],[v.PlanType.PREMIUM]:[v.Feature.WORKSPACE_BACKUPS,v.Feature.BRANDING,v.Feature.VIEW_PERMISSIONS,v.Feature.PDF],[v.PlanType.PREMIUM_PLUS]:fd,[v.PlanType.PREMIUM_MAX]:fd,[v.PlanType.PREMIUM_PLUS_TRIAL]:[v.Feature.WORKSPACE_BACKUPS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PDF,v.Feature.BUDIBASE_AI],[v.PlanType.PRO]:dd,[v.PlanType.PRO_MAX]:dd,[v.PlanType.TEAM]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS],[v.PlanType.BUSINESS]:md,[v.PlanType.BUSINESS_PLUS]:md,[v.PlanType.ENTERPRISE_BASIC]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.ENFORCEABLE_SSO,v.Feature.AUDIT_LOGS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.OFFLINE,v.Feature.EXPANDED_PUBLIC_API,v.Feature.WORKSPACE_IMPORT_EXPORT,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.SCIM,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PWA,v.Feature.CUSTOM_APP_SCRIPTS,v.Feature.PDF,v.Feature.BUDIBASE_AI,v.Feature.RECAPTCHA,v.Feature.PKCE_OIDC,v.Feature.TRANSLATIONS],[v.PlanType.ENTERPRISE_BASIC_TRIAL]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.ENFORCEABLE_SSO,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.EXPANDED_PUBLIC_API,v.Feature.WORKSPACE_IMPORT_EXPORT,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.SCIM,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PWA,v.Feature.CUSTOM_APP_SCRIPTS,v.Feature.PDF,v.Feature.BUDIBASE_AI,v.Feature.RECAPTCHA,v.Feature.PKCE_OIDC,v.Feature.TRANSLATIONS],[v.PlanType.ENTERPRISE]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.ENFORCEABLE_SSO,v.Feature.AUDIT_LOGS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.OFFLINE,v.Feature.EXPANDED_PUBLIC_API,v.Feature.WORKSPACE_IMPORT_EXPORT,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.SCIM,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PWA,v.Feature.CUSTOM_APP_SCRIPTS,v.Feature.PDF,v.Feature.BUDIBASE_AI,v.Feature.RECAPTCHA,v.Feature.PKCE_OIDC,v.Feature.TRANSLATIONS]};function Ri(e){function t(r){let a=r[e];if(!a)throw new Error(`Features do not exist for planType=${e}`);return a}return n(t,"readFeatures"),t(vE)}n(Ri,"getOfflineFeatures");var So={};F(So,{UNLIMITED:()=>g,getQuotas:()=>Oi});var ne=require("@budibase/types");var p=zt,gd=It,g=-1,Tt=n(e=>e*1e6,"millions"),bE={[ne.PlanType.FREE]:{...gd.CLOUD_FREE_LICENSE.quotas},[ne.PlanType.PREMIUM]:{usage:{monthly:{...p.queries(g),...p.automations(1e3),...p.budibaseAICredits(0),...p.actions(5e3)},static:{...p.rows(1e4),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[ne.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(Tt(10)),...p.actions(2e4)},static:{...p.rows(25e4),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[ne.PlanType.PREMIUM_MAX]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(Tt(10)),...p.actions(5e4)},static:{...p.rows(25e4),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[ne.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(75e4),...p.actions(2e4)},static:{...p.rows(25e4),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[ne.PlanType.PRO]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(Tt(2)),...p.actions(5e3)},static:{...p.rows(5e4),...p.apps(g),...p.users(g),...p.creators(1),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(1),...p.automationLogRetentionDays(1),...p.appBackupRetentionDays(0)}},[ne.PlanType.PRO_MAX]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(Tt(2)),...p.actions(1e4)},static:{...p.rows(5e4),...p.apps(g),...p.users(g),...p.creators(1),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(1),...p.automationLogRetentionDays(1),...p.appBackupRetentionDays(0)}},[ne.PlanType.TEAM]:{usage:{monthly:{...p.queries(g),...p.automations(1e4),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(10),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(90)}},[ne.PlanType.BUSINESS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(Tt(50)),...p.actions(25e4)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(g)}},[ne.PlanType.BUSINESS_PLUS]:void 0,[ne.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(Tt(50)),...p.actions(25e4)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(g),...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}},[ne.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(75e4),...p.actions(25e4)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(1),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(15),...p.automationLogRetentionDays(15),...p.appBackupRetentionDays(15)}},[ne.PlanType.ENTERPRISE]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(Tt(50)),...p.actions(25e4)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(g),...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}}},wE={[ne.PlanType.FREE]:{...gd.SELF_FREE_LICENSE.quotas},[ne.PlanType.PREMIUM]:void 0,[ne.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(Tt(2)),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(1)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[ne.PlanType.PREMIUM_MAX]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(Tt(2)),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(1)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[ne.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(1)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[ne.PlanType.PRO]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(5),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[ne.PlanType.PRO_MAX]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(5),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[ne.PlanType.TEAM]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(10),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(90)}},[ne.PlanType.BUSINESS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(50),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(g),...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}},[ne.PlanType.BUSINESS_PLUS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(Tt(50)),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(g)}},[ne.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(Tt(50)),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(g),...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}},[ne.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(75e4),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(15),...p.automationLogRetentionDays(15),...p.appBackupRetentionDays(15)}},[ne.PlanType.ENTERPRISE]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(Tt(50)),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(g),...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}}};function Oi(e,t){let r;function a(o){let s=o[t];if(!s)throw new Error(`Quotas do not exist for planType=${t} and hosting=${e}`);return s}switch(n(a,"readQuotas"),e){case ne.Hosting.SELF:r=a(wE);break;case ne.Hosting.CLOUD:r=a(bE);break}return JSON.parse(JSON.stringify(r))}n(Oi,"getQuotas");var _o={};F(_o,{encoding:()=>Xr,workspaceExists:()=>IE});var hd=require("@budibase/backend-core");async function IE(e){return(await hd.db.getAllWorkspaces({all:!0,idsOnly:!0})).includes(e)}n(IE,"workspaceExists");var Xr={};F(Xr,{base64ToObject:()=>SE,objectToBase64:()=>TE});function TE(e){let t=JSON.stringify(e);return Buffer.from(t).toString("base64")}n(TE,"objectToBase64");function SE(e){let t=Buffer.from(e,"base64").toString();return JSON.parse(t)}n(SE,"base64ToObject");var th=require("@budibase/types"),pa=require("@budibase/backend-core"),rh=xe(km()),ah=xe(rl());async function ZP(e){await ft.save({offlineLicenseToken:e}),await kr()}n(ZP,"activateOfflineLicenseToken");async function XP(){await ft.save({offlineLicenseToken:void 0}),await kr()}n(XP,"deleteOfflineLicenseToken");async function nh(){return(await ft.get()).offlineLicenseToken}n(nh,"getOfflineLicenseToken");async function al(){let t=(await pa.installation.getInstall()).installId,r=pa.context.getTenantId(),a=await pa.events.identification.getUniqueTenantId(r);return{installId:t,tenantId:a}}n(al,"getIdentifier");async function ek(){let e=await al();return Xr.objectToBase64(e)}n(ek,"getIdentifierBase64");function tk(e){return Xr.base64ToObject(e)}n(tk,"getIdentifierFromBase64");function oh(e){let t=Date.now(),r=new Date(e.expireAt).getTime();if(t>r)throw new Error(`Offline license has expired. expireAt=${e.expireAt}`)}n(oh,"verifyExpiry");async function sh(e){let t=await al();if(e.identifier.installId!==t.installId||e.identifier.tenantId!==t.tenantId)throw new Error("Invalid offline license")}n(sh,"verifyInstallation");function ih(e){let t=e.plan.type,r=th.Hosting.SELF,a=Ri(t),o=Oi(r,t);return e.features=(0,rh.default)(e.features,a),e.quotas=(0,ah.default)(e.quotas,o),e}n(ih,"enrichLicense");async function nl(){try{let e=await nh();if(e){let t=await pn(e);return oh(t),await sh(t),ih(t)}}catch(e){console.error("Error retrieving offline license",e)}}n(nl,"getOfflineLicense");var Mn={};F(Mn,{deleteDevLicense:()=>sk,getOfflineLicense:()=>nk,writeDevLicenseToDisk:()=>ok});var lh=require("@budibase/backend-core"),sl=require("path"),uh=require("os"),Nr=xe(require("fs"));var rk=lh.env.isTest()?".budibase-test":".budibase",ol=(0,sl.join)((0,uh.tmpdir)(),rk),ak="dev_license.txt",Cn=(0,sl.join)(ol,ak);if(!Nr.default.existsSync(ol))try{Nr.default.mkdirSync(ol)}catch{}function nk(){try{if(Nr.default.existsSync(Cn)){let e=Nr.default.readFileSync(Cn,{encoding:"utf-8"});return pn(e)}}catch(e){console.error("Error retrieving offline license from disk",e)}}n(nk,"getOfflineLicense");function ok(e){console.log(`Writing license to: ${Cn}`),Nr.default.writeFileSync(Cn,e,{encoding:"utf-8"})}n(ok,"writeDevLicenseToDisk");function sk(){Nr.default.rmSync(Cn,{force:!0})}n(sk,"deleteDevLicense");var ch=require("dd-trace");var ll=n(async()=>await ch.tracer.trace("getLicense",async e=>{if(il.env.OFFLINE_MODE)return e.addTags({offline:!0}),nl();let t=await Zr();return t||(e.addTags({offlineFallback:!0}),t=Mn.getOfflineLicense()),t}),"getLicense"),ul=n(e=>xi(e),"getLicenseFromKey"),cl=n(()=>il.env.SELF_HOSTED?It.SELF_FREE_LICENSE:It.CLOUD_FREE_LICENSE,"getFreeLicense");var dl={};F(dl,{activateLicenseKey:()=>ik,deleteLicenseKey:()=>uk,getLicenseKey:()=>lk});var pl=xe(require("dd-trace"));async function ik(e){await Ai(e),await ft.save({licenseKey:e}),await kr()}n(ik,"activateLicenseKey");async function lk(){return await pl.default.trace("getLicenseKey",async e=>{let t=await ft.get();return e.addTags({licenseKey:t.licenseKey}),t.licenseKey})}n(lk,"getLicenseKey");async function uk(){return await pl.default.trace("deleteLicenseKey",async()=>{await ft.save({licenseKey:void 0}),await kr()})}n(uk,"deleteLicenseKey");var jo=require("@budibase/backend-core");var Pn,pk=n(async()=>{Pn=await jo.RedisClient.init(jo.redis.utils.Databases.LICENSES)},"init"),dk=n(async()=>{Pn&&await Pn.finish()},"shutdown");process.on("exit",async()=>{await dk()});var Go=n(async()=>(Pn||await pk(),Pn),"getClient");var dh=require("@budibase/shared-core");var ml=ht.Duration.fromHours(1).toSeconds(),fh=ht.Duration.fromHours(1).toSeconds(),mk=ml+fh,kr=n(async()=>{await hh(),await gh()},"refresh"),ph=n(async e=>{let{result:t}=await ht.locks.doWithLock({type:Wo.LockType.DEFAULT,name:Wo.LockName.SYNC_ACCOUNT_LICENSE,resource:e,ttl:ht.Duration.fromSeconds(10).toMs()},async()=>{let r=await Go(),a=await r.get(e);if(a&&!mh(a))return a;let o=await $o.default.trace("populateLicense",async()=>await ll());return o||(o=$o.default.trace("populateFreeLicense",()=>cl())),o.refreshedAt=new Date().toISOString(),await r.store(e,o,mk),o});return t},"populateAndStoreLicense"),mh=n(e=>{let t=e.refreshedAt?Date.parse(e.refreshedAt):0;return Date.now()-t>=ml*1e3},"shouldRefreshLicense"),fl=n(async()=>await $o.default.trace("getCachedLicense",async e=>{let t=ht.context.getLicense();if(t)return e.addTags({foundInContext:!0,features:t.features,plan:t.plan,quotas:t.quotas}),t;let r=ht.tenancy.getTenantId(),o=await(await Go()).get(r);return e.addTags({tenantId:r,foundInCache:!!o}),o?(e.addTags({foundInCache:!0,refreshedAt:o.refreshedAt,features:o.features,plan:o.plan,quotas:o.quotas}),mh(o)&&ph(r).catch(()=>{}),o):(o=await dh.helpers.retry(()=>ph(r)),e.addTags({refreshedAt:o.refreshedAt,features:o.features,plan:o.plan,quotas:o.quotas,expirySeconds:ml,staleGraceSeconds:fh}),o)}),"_getCachedLicense");ht.env.isJest()&&(fl=jest.fn().mockImplementation(fl));var gh=fl,hh=n(async()=>{let e=ht.tenancy.getTenantId();await(await Go()).delete(e)},"invalidate");async function qe(e,t){Array.isArray(e)||(e=[e]),t||(t=await Ot.getCachedLicense());for(let r of e)if(!t?.features.includes(r))return!1;return!0}n(qe,"areFeaturesEnabled");async function Vo(e,t){if(!await qe(e,t))throw new Zt.FeatureDisabledWarning(e)}n(Vo,"checkFeature");async function gl(e,t){if(!await qe(e,t)){let r=e.join(", ");throw new Zt.FeatureDisabledWarning(r)}}n(gl,"checkFeatures");function ze(e){return async(...t)=>(await Vo(Me.Feature.WORKSPACE_BACKUPS),e(...t))}n(ze,"checkBackups");async function hl(){return qe(Me.Feature.WORKSPACE_BACKUPS)}n(hl,"isBackupsEnabled");async function yl(){return qe(Me.Feature.BRANDING)}n(yl,"isBrandingEnabled");async function yh(){return qe(Me.Feature.ENFORCEABLE_SSO)}n(yh,"isEnforceableSSO");async function gk(){return qe(Me.Feature.SYNC_AUTOMATIONS)}n(gk,"isSyncAutomationsEnabled");async function hk(){return qe(Me.Feature.TRIGGER_AUTOMATION_RUN)}n(hk,"isTriggerAutomationRunEnabled");async function Ko(){return qe(Me.Feature.AUDIT_LOGS)}n(Ko,"isAuditLogsEnabled");async function vl(){return qe(Me.Feature.USER_GROUPS)}n(vl,"isUserGroupsEnabled");function yk(){return qe(Me.Feature.PWA)}n(yk,"isPWAEnabled");function vk(){return qe(Me.Feature.RECAPTCHA)}n(vk,"isRecaptchaEnabled");var bk=n(()=>qe(Me.Feature.PKCE_OIDC),"isPkceOidcEnabled");async function wk(){return qe(Me.Feature.TRANSLATIONS)}n(wk,"isTranslationsEnabled");async function da(){return qe(Me.Feature.EXPANDED_PUBLIC_API)}n(da,"isExpandedPublicApiEnabled");async function Ik(){return qe(Me.Feature.WORKSPACE_IMPORT_EXPORT)}n(Ik,"isWorkspaceImportExportEnabled");async function Qo(){return qe([Me.Feature.EXPANDED_PUBLIC_API,Me.Feature.WORKSPACE_IMPORT_EXPORT])}n(Qo,"isWorkspaceImportExportPublicApiEnabled");async function Tk(e){if(Zt.env.ENABLE_SSO_MAINTENANCE_MODE||!await yh())return!1;let r;return e?.config?r=e.config:r=await Zt.configs.getSettingsConfig(),!!r.isSSOEnforced}n(Tk,"isSSOEnforced");var bl=n(async()=>{let e=Me.Feature.SCIM,t=await qe(e),r=await Zt.configs.getSCIMConfig();if(!t||!r?.enabled)throw new Zt.FeatureDisabledWarning(e);return!0},"checkSCIM");async function Sk(){return qe(Me.Feature.VIEW_PERMISSIONS)}n(Sk,"isViewPermissionEnabled");async function _k(){return qe(Me.Feature.VIEW_READONLY_COLUMNS)}n(_k,"isViewReadonlyColumnsEnabled");var xk={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 Ak(e){return await yl()?{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}:xk}n(Ak,"getBrandingConfig");var Qt={};F(Qt,{addAction:()=>Ck,addApp:()=>Mk,addAutomation:()=>Uk,addGroup:()=>Il,addPlugin:()=>Sl,addRow:()=>kk,addRows:()=>Dk,addUsers:()=>Zo,bustCache:()=>hi,decrement:()=>Xt,decrementMany:()=>kn,getCurrentUsageValues:()=>Fp,getLicensedQuota:()=>Jo,getQuotaUsage:()=>Or,increment:()=>yt,incrementBudibaseAICredits:()=>Lk,incrementMany:()=>qr,removeApp:()=>Pk,removeGroup:()=>Tl,removePlugin:()=>_l,removeRow:()=>Nk,removeRows:()=>qk,removeUsers:()=>ha,set:()=>Nn,setAllUsage:()=>vi,setAppUsageValue:()=>yi,setBudibaseAICredits:()=>Ih,setUsage:()=>qp,setUsagePerApp:()=>Up,throwIfBudibaseAICreditsExceeded:()=>Bk,updatePluginCount:()=>xl,updateUsage:()=>fa,usageLimitIsExceeded:()=>wl,utils:()=>$a});var Yo=require("@budibase/types");var Pt=require("@budibase/backend-core"),Ue=require("@budibase/types"),Dr=require("dd-trace");var yt=n(async(e,t,r)=>await Dr.tracer.trace("quotas.increment",async a=>(a.addTags({name:e,type:t}),await vh({change:1,name:e,type:t,opts:r}))),"increment"),qr=n(e=>Dr.tracer.trace("quotas.incrementMany",async()=>vh(e)),"incrementMany"),vh=n(async e=>await Dr.tracer.trace("quotas.tryIncrement",async t=>{let r=Array.isArray(e)?e:[e];t.addTags({numActions:r.length}),await fa(r.map(o=>({usageChange:o.change,name:o.name,type:o.type,opts:{dryRun:!0,suppressErrorLog:o.opts?.suppressErrorLog,id:o.opts?.id}})));let a=[];for(let o of r)await Dr.tracer.trace("quotas.incrementMany.fn",async s=>{s.addTags({actionName:o.name,actionType:o.type,actionChange:o.change});let i=o.opts?.fn;i&&a.push(await i())});return await fa(r.map(o=>({usageChange:o.change,name:o.name,type:o.type,opts:{dryRun:!1,valueFn:o.opts?.valueFn,suppressErrorLog:o.opts?.suppressErrorLog,id:o.opts?.id}}))),a[0]}),"tryIncrement"),Xt=n((e,t,r={})=>fa({usageChange:-1,name:e,type:t,opts:r}),"decrement"),kn=n(e=>{let t=Array.isArray(e)?e:[e];return fa(t.map(r=>({usageChange:-r.change,name:r.name,type:r.type,opts:r.opts})))},"decrementMany"),Nn=n(async(e,t,r)=>wt.setUsage(r,e,t),"set"),Ek=n((e,t,r)=>{if(e==Ue.QuotaUsageType.STATIC){let a=r.usageQuota.triggers;return a?a[t]||{}:{}}else{let a=wt.utils.getCurrentMonthString(),o=r.monthly[a].triggers;return o?o[t]||{}:{}}},"getExistingTriggers"),Rk=n(async(e,t,r,a)=>{try{await Pt.locks.doWithLock({type:Ue.LockType.TRY_ONCE,name:Ue.LockName.TRIGGER_QUOTA,resource:e,ttl:1e4},async()=>{let o={percentage:r,name:t.name};a&&(o.resetDate=a),await vr.triggerQuota(o)})}catch(o){Pt.logging.logAlert("Error triggering quota",o)}},"triggerQuota"),Ok=n(async(e,t,r,a)=>{let o=await Or(),s=e===Ue.QuotaUsageType.MONTHLY?o.quotaReset:void 0,i=await Ek(e,t,o),l=a.triggers,u=r/a.value*100;u>100&&(u=100);for(let[c,d]of l.entries())if(u>=d&&a.value!==zt.UNLIMITED){if(!i[d]){i[d]=new Date().toISOString();let h=l[c+1]||100;(!(u>=h)||u===d)&&await Rk(t,a,u,s)}}else i[d]=void 0;return i},"checkTriggers"),fa=n(async e=>{await Dr.tracer.trace("quotas.updateUsage",async t=>{let r=Pt.tenancy.getTenantId(),a=Array.isArray(e)?e:[e];t.addTags({numActions:a.length,tenantId:r});let o,s,i=[],l={},u={},c={},d={};for(let h of a)await Dr.tracer.trace("quotas.updateUsage.action",async b=>{b.addTags({actionName:h.name,actionType:h.type,actionUsageChange:h.usageChange});try{o=Pt.context.getWorkspaceId()}catch{}if(Ue.APP_QUOTA_NAMES.includes(h.name)&&!o)throw new Error("App context required for quota update");try{s=await Jo(Ue.QuotaType.USAGE,h.name,h.type),i.push(s);let{total:w,app:S,breakdown:E}=await wt.getCurrentUsageValues(h.type,h.name,h.opts?.id);w+=h.usageChange,S!=null&&(S+=h.usageChange),E!=null&&(E+=h.usageChange);let U={};if(h.opts?.dryRun||(U=await Ok(h.type,h.name,w,s),d={...d,[h.name]:U}),s.value!==zt.UNLIMITED&&w>s.value&&h.usageChange>0)throw new Pt.UsageLimitWarning(`${h.name}`);if(w=Math.max(0,w),S&&(S=Math.max(0,S)),E&&(E=Math.max(0,E),c={...c,[h.name]:E}),!h.opts?.dryRun){let V=h.opts?.valueFn;V&&(w=await V(),S=w),l={...l,[h.name]:w},u={...u,[h.name]:S}}}catch(w){throw h.opts?.suppressErrorLog||console.warn(`Error updating usage quotas for ${h.name}`,w),w}});let y=a.filter(h=>!h.opts?.dryRun).map(h=>({name:h.name,type:h.type,values:{total:l[h.name],app:u[h.name],breakdown:c[h.name],triggers:d[h.name]},opts:{...h.opts,tenantId:r}}));y.length>0&&await wt.setAllUsage(y)})},"updateUsage"),Jo=n(async(e,t,r)=>{let a=await Ot.getCachedLicense();if(!a){let o=Pt.tenancy.getTenantId();throw new Error("License not found for tenant id "+o)}if(r&&(0,Ue.isStaticQuota)(e,r,t))return a.quotas[e][r][t];if(r&&(0,Ue.isMonthlyQuota)(e,r,t))return a.quotas[e][r][t];if((0,Ue.isConstantQuota)(e,t))return a.quotas[e][t];throw new Error("Invalid quota type")},"getLicensedQuota"),wl=n(async({name:e,type:t,usageChange:r})=>{try{return await fa({usageChange:r,name:e,type:t,opts:{dryRun:!0}}),!1}catch(a){if(a.code===Ue.APIWarningCode.USAGE_LIMIT_EXCEEDED)return!0;throw a}},"usageLimitIsExceeded");var Ck=n(async e=>yt(Yo.MonthlyQuotaName.ACTIONS,Yo.QuotaUsageType.MONTHLY,{fn:e}),"addAction");var bh=require("@budibase/backend-core"),ma=require("@budibase/types");var wh=n(async()=>{let e=await bh.db.getAllWorkspaces({dev:!0});return e?e.length:0},"getDevAppsCount"),Mk=n(async(e,{appId:t}={})=>yt(ma.StaticQuotaName.WORKSPACES,ma.QuotaUsageType.STATIC,{fn:e,valueFn:wh,id:t}),"addApp"),Pk=n(async({appId:e}={})=>Xt(ma.StaticQuotaName.WORKSPACES,ma.QuotaUsageType.STATIC,{valueFn:wh,id:e}),"removeApp");var Vt=require("@budibase/types");var kk=n(async(e,{tableId:t}={})=>yt(Vt.StaticQuotaName.ROWS,Vt.QuotaUsageType.STATIC,{fn:e,id:t}),"addRow"),Nk=n(async({tableId:e}={})=>Xt(Vt.StaticQuotaName.ROWS,Vt.QuotaUsageType.STATIC,{id:e}),"removeRow"),Dk=n(async(e,t,{tableId:r}={})=>qr({change:e,name:Vt.StaticQuotaName.ROWS,type:Vt.QuotaUsageType.STATIC,opts:{fn:t,id:r}}),"addRows"),qk=n(async(e,{tableId:t}={})=>kn({change:e,name:Vt.StaticQuotaName.ROWS,type:Vt.QuotaUsageType.STATIC,opts:{id:t}}),"removeRows");var zo=require("@budibase/types");var Uk=n(async(e,{automationId:t}={})=>yt(zo.MonthlyQuotaName.AUTOMATIONS,zo.QuotaUsageType.MONTHLY,{fn:e,id:t}),"addAutomation");var ga=require("@budibase/types");var Il=n(async e=>yt(ga.StaticQuotaName.USER_GROUPS,ga.QuotaUsageType.STATIC,{fn:e}),"addGroup"),Tl=n(async()=>Xt(ga.StaticQuotaName.USER_GROUPS,ga.QuotaUsageType.STATIC),"removeGroup");var Tr=require("@budibase/types");var Sl=n(async e=>yt(Tr.StaticQuotaName.PLUGINS,Tr.QuotaUsageType.STATIC,{fn:e}),"addPlugin"),_l=n(async()=>Xt(Tr.StaticQuotaName.PLUGINS,Tr.QuotaUsageType.STATIC),"removePlugin"),xl=n(async e=>Nn(Tr.StaticQuotaName.PLUGINS,Tr.QuotaUsageType.STATIC,e),"updatePluginCount");var Kt=require("@budibase/types"),Dn=require("@budibase/backend-core");var Zo=n(async(e,t,r)=>{if(e===0&&t===0)return r?await r():void 0;let a=[{change:e,name:Kt.StaticQuotaName.USERS,type:Kt.QuotaUsageType.STATIC,opts:{fn:r,valueFn:Dn.users.getUserCount}}];t>0&&a.push({change:t,name:Kt.StaticQuotaName.CREATORS,type:Kt.QuotaUsageType.STATIC,opts:{valueFn:Dn.users.getCreatorCount}});let o=await qr(a);return Promise.resolve(Zr()).catch(s=>{console.log("Failed to sync license after adding users",s)}),o},"addUsers"),ha=n(async(e,t)=>{let r=[{change:e,name:Kt.StaticQuotaName.USERS,type:Kt.QuotaUsageType.STATIC,opts:{valueFn:Dn.users.getUserCount}}];t>0&&r.push({change:t,name:Kt.StaticQuotaName.CREATORS,type:Kt.QuotaUsageType.STATIC,opts:{valueFn:Dn.users.getCreatorCount}}),await kn(r),Promise.resolve(Zr()).catch(a=>{console.log("Failed to sync license after removing users",a)})},"removeUsers");var nt=require("@budibase/types");var Al=require("@budibase/backend-core"),ts=require("@budibase/types");var Xo=class extends Al.HTTPError{static{n(this,"GroupNameUnavailableError")}constructor(t){super(`Group name "${t}" is unavailable`,409)}},es=class extends Al.HTTPError{static{n(this,"AICreditsExhaustedError")}constructor(){super("You have reached your Budibase AI Credits limit for this billing cycle.",402),this.code=ts.APIWarningCode.USAGE_LIMIT_EXCEEDED}getPublicError(){return{quota:ts.MonthlyQuotaName.BUDIBASE_AI_CREDITS}}};var Lk=n(async e=>{try{return await qr({change:e,name:nt.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:nt.QuotaUsageType.MONTHLY})}catch(t){throw t.code===nt.APIWarningCode.USAGE_LIMIT_EXCEEDED&&await Fk().catch(()=>{}),t}},"incrementBudibaseAICredits"),Fk=n(async()=>{let e=await Jo(nt.QuotaType.USAGE,nt.MonthlyQuotaName.BUDIBASE_AI_CREDITS,nt.QuotaUsageType.MONTHLY);e.value>=0&&await Ih(e.value)},"capBudibaseAICreditsAtLimit"),Bk=n(async()=>{if(await wl({name:nt.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:nt.QuotaUsageType.MONTHLY,usageChange:1}))throw new es},"throwIfBudibaseAICreditsExceeded"),Ih=n(async e=>Nn(nt.MonthlyQuotaName.BUDIBASE_AI_CREDITS,nt.QuotaUsageType.MONTHLY,e),"setBudibaseAICredits");var rs={};F(rs,{db:()=>Nt});var Ol=require("@budibase/backend-core");var kt={};F(kt,{addUsers:()=>Wk,adjustGroupCreatorsQuotas:()=>Hk,cleanupApp:()=>Qk,enrichUserRolesFromGroups:()=>Gk,fetch:()=>Rl,get:()=>Eh,getBulk:()=>Rh,getGroupBuilderAppIds:()=>Ah,getGroupRoleId:()=>jk,remove:()=>$k,removeUsers:()=>Vk,save:()=>Oh,updateGroupApps:()=>Kk});var K=require("@budibase/backend-core");async function El(e,t){try{let r=[];for(let l of e)if(l.roles){let u=l.roles[K.db.getProdWorkspaceID(t)];u&&r.push(u)}let a=await Promise.all(r.map(async l=>({[l]:await K.roles.roleToNumber(l)}))),o,s,i={};a.forEach(l=>{let[u,c]=Object.entries(l)[0];i[u]={roleId:u,roleNum:c}});for(let{roleId:l,roleNum:u}of Object.values(i))(s===void 0||u>s)&&(s=u,o=l);return o}catch(r){throw K.logging.logAlert(`Error finding higest role for ${e.length} on app ${t}`,r),r}}n(El,"findHighestRole");async function xh(e,t){return t?t=t.filter(r=>e.includes(r._id)):t=await ve.getBulk(e,{enriched:!1}),t}n(xh,"groupList");async function Ah(e,t){if(!e.userGroups)return[];let r=await xh(e.userGroups,t?.groups),a=t?.appId?K.db.getProdWorkspaceID(t?.appId):null,o=[];for(let s of r){let i=s.builder?.apps;a&&i?.includes(a)?o.push(a):a||(o=o.concat(i||[]))}return[...new Set(o)]}n(Ah,"getGroupBuilderAppIds");async function jk(e,t,r){if(!e.userGroups)return null;let a=await xh(e.userGroups,r?.groups),o=K.db.getProdWorkspaceID(t);return e.roles?.[o]?e.roles[o]:(a=a.filter(l=>l?.roles?Object.keys(l.roles).includes(o):!1),K.context.getCurrentContext()?.appId===t?El(a,t):await K.context.doInWorkspaceContext(t,async()=>El(a,t)))}n(jk,"getGroupRoleId");async function Gk(e){if(!e||!e.userGroups)return e;let t=await Rh(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 K.context.doInWorkspaceContext(o,async()=>{if(e.roles[o])return;let s=await El(t,o);s&&(e.roles[o]=s)});let a=await Ah(e,{groups:t});if(a.length&&!e.builder?.global){let o=e.builder?.apps||[];e.builder={...e.builder,apps:o.concat(a)}}return e}n(Gk,"enrichUserRolesFromGroups");async function Rl(){return await ve.fetch()}n(Rl,"fetch");async function Eh(e){return await ve.get(e)}n(Eh,"get");async function Rh(e,t={enriched:!0}){return ve.getBulk(e,t)}n(Rh,"getBulk");async function Th(e){if(await ve.getByName(e))throw new Xo(e)}n(Th,"guardNameAvailability");async function Sh(e){let t=await ve.getGroupUsers(e._id);if(!t.length)return 0;let a=await K.tenancy.getGlobalDB().getMultiple(t.map(s=>s._id));return(await K.userUtils.creatorsInList(a)).filter(s=>s).length}n(Sh,"getCreatorsCountInGroup");function _h(e){return Object.values(e.roles||{}).includes("CREATOR")}n(_h,"isCreatorGroup");async function Oh(e){let t=[],r=!e._id,a=0;if(!e._id)e._id=ve.generateUserGroupID(),await Th(e.name),t.push(K.events.group.created(e));else{let l=await ve.get(e._id);if(l.name!==e.name&&await Th(e.name),t.push(K.events.group.updated(e)),JSON.stringify(l.roles)!==JSON.stringify(e.roles)){let u=_h(l),c=_h(e);if(u!==c){let d=l.users?.length||0,y=0;d>0&&(y=await Sh(l)),c?a=d-y:a=-d}t.push(K.events.group.permissionsEdited(e))}}await Promise.all(t);let{users:o,...s}=e,i=n(()=>ve.save(s),"saveGroup");if(r)return await Il(i);{let l=await i();if(a>0)await Zo(0,a);else if(a<0){let u=await Sh(e),c=Math.abs(a)-u;c>0&&await ha(0,c)}return l}}n(Oh,"save");async function $k(e,t){let r;try{r=await ve.get(e)}catch{throw new Error("Group not found")}let a=Object.values(r.roles||{}).includes("CREATOR"),o=n(()=>{},"recalculateCreatorsQuotasFn");if(a){let i=K.tenancy.getGlobalDB(),l=await ve.getGroupUsers(e),c=(await Promise.all(l.map(b=>i.get(b._id)))).map(b=>({...b,userGroups:b.userGroups.filter(O=>O!==e)})),y=(await K.userUtils.creatorsInList(c)).filter(b=>b).length,h=l.length-y;h&&(o=n(()=>ha(0,h),"recalculateCreatorsQuotasFn"))}let s=await ve.destroy(e,t);return await K.events.group.deleted(r),await Tl(),await o(),s}n($k,"remove");async function Wk(e,t){let r=await ve.get(e),a=await K.users.bulkGetGlobalUsersById(t),o=[];for(let u of a)u.userGroups||(u.userGroups=[]),u.userGroups.includes(e)||o.push(u);if(!o.length)return o;let s=o.map(u=>({...u,userGroups:[...u?.userGroups||[],e]}));if(await K.users.bulkUpdateGlobalUsers(s),Object.values(r.roles||{}).includes("CREATOR")){let c=(await K.userUtils.creatorsInList(o)).filter(y=>y).length,d=o.length-c;d&&await Zo(0,d)}let l=[];for(let u of t)l.push(K.cache.user.invalidateUser(u));return await Promise.all(l),await K.events.group.usersAdded(s.length,r,t),s}n(Wk,"addUsers");async function Vk(e,t){let r=await ve.get(e),a=await K.users.bulkGetGlobalUsersById(t),o=[];for(let l of a){if(!l.userGroups||!l.userGroups.includes(e))continue;let u=l.userGroups.indexOf(e);l.userGroups.splice(u,1),o.push(l)}if(await K.users.bulkUpdateGlobalUsers(o),Object.values(r.roles||{}).includes("CREATOR")){let u=(await K.userUtils.creatorsInList(o)).filter(d=>d).length,c=o.length-u;c&&await ha(0,c)}let i=[];for(let l of t)i.push(K.cache.user.invalidateUser(l));return await Promise.all(i),o.length&&await K.events.group.usersDeleted(o.length,r,t),o}n(Vk,"removeUsers");async function Kk(e,t){let r=await Eh(e);if(r.roles||(r.roles={}),t.appsToAdd)for(let a of t.appsToAdd)r.roles[a.appId]=a.roleId;if(t.appsToRemove)for(let a of t.appsToRemove)delete r.roles[a.appId];return r.builder={apps:Object.entries(r.roles).filter(([a,o])=>o==="CREATOR").map(([a])=>a)},await Oh(r)}n(Kk,"updateGroupApps");async function Qk(e){let t=await Rl(),r=[];for(let a of t)!a.roles||!a.roles[e]||(delete a.roles[e],r.push(a));return await ve.bulkSave(r)}n(Qk,"cleanupApp");async function Hk(){if(!await vl()){let e=K.tenancy.getGlobalDB(),r=(await Rl()||[]).filter(a=>Object.values(a?.roles||{}).includes("CREATOR"));for(let a of r){let o=await ve.getGroupUsers(a._id),i=(await Promise.all(o.map(d=>e.get(d._id)))).map(d=>({...d,userGroups:d.userGroups.filter(y=>y!==a._id)})),u=(await K.userUtils.creatorsInList(i)).filter(d=>d).length,c=o.length-u;await ve.save({...a,roles:{}}),c&&await ha(0,c)}}}n(Hk,"adjustGroupCreatorsQuotas");Ol.users.UserDB.init(Qt,kt,Mt);var Nt=Ol.users.UserDB;var ss={};F(ss,{logs:()=>ql});var ql={};F(ql,{logSearch:()=>aN,oldestLogDate:()=>qh,storeLog:()=>nN});var os=require("@budibase/backend-core"),Dh=require("@budibase/types");var je=require("@budibase/backend-core"),ns=require("@budibase/types");var Ch=require("@budibase/backend-core");async function Mh(e,t){let r,a=5,o=!1,s,i=!0;for(;a>0;a--)try{i?s=await e():s=await exports.randomDelay(e),o=!0;break}catch(l){r=l}return o||Ch.logging.logWarn(`Failed to backoff: ${t}`,r),s}n(Mh,"backOff");var{SEPARATOR:er,UNICODE_MAX:Jk,DocumentType:Ph,AutomationViewMode:Cl,ViewName:Yk,getQueryIndex:zk}=je.db,Zk=new Date(0).toISOString(),Xk=100,as=10,Ml=n(async()=>vo(ns.ConstantQuotaName.AUTOMATION_LOG_RETENTION_DAYS),"oldestLogDate");function kh(e,t,{status:r,automationId:a}={},o={}){let s=a?`${a}${er}`:"",i=r?`${r}${er}`:"",l;return r&&a?l=`${Cl.ALL}${er}${i}${s}`:r?l=`${Cl.STATUS}${er}${i}`:a?l=`${Cl.AUTOMATION}${er}${s}`:l=`${Ph.AUTOMATION_LOG}${er}`,{...o,descending:!0,startkey:`${l}${t}${Jk}`,endkey:`${l}${e}`}}n(kh,"getAutomationLogParams");function eN(e,t,r){return`${Ph.AUTOMATION_LOG}${er}${e}${er}${r}${er}${t}`}n(eN,"generateAutomationLogID");async function Pl(e,t,r={docs:!0}){let a=je.context.getProdWorkspaceDB();await a.exists()||(a=je.context.getDevWorkspaceDB());let o={status:r.status},s=r?.limit?r.limit:r?.paginate?as+1:void 0,i=kh(e,t,o,{include_docs:r.docs,limit:s});r?.page&&(i.startkey=r.page);let l=await a.allDocs(i),u=cn(l,{paginate:r?.paginate,pageSize:as});return{...u,totalLogs:u.totalRows}}n(Pl,"getAllLogs");async function kl(e,t,r={}){let a=je.context.getProdWorkspaceDB();await a.exists()||(a=je.context.getDevWorkspaceDB());let o;try{let i={automationId:r?.automationId,status:r?.status},l=kh(e,t,i,{include_docs:!0,limit:as+1});r?.page&&(l.startkey=r.page),o=await a.query(zk(Yk.AUTOMATION_LOGS),l)}catch(i){if(i!=null&&(i.name==="not_found"||i.error==="not_found"))return await td(),kl(e,t,r);throw i}let s=cn(o,{paginate:!0,pageSize:as});return{...s,totalLogs:s.totalRows/3}}n(kl,"getLogsByView");async function Nh(e,t){let r=je.context.getProdWorkspaceDB(),a=e._id,o=e.name,s=new Date().toISOString(),i=eN(s,t.status,a),l={...t,automationId:a,status:t.status,automationName:o,createdAt:s,_id:i};return await r.put(l),i}n(Nh,"writeLog");async function Nl(e,{clearing:t}={clearing:!1}){let r=je.context.getProdWorkspaceDB();await Mh(async()=>{let a=await r.get(je.db.DocumentType.WORKSPACE_METADATA);for(let o of e){let s=o.split(je.db.SEPARATOR),i=`${s[s.length-3]}${je.db.SEPARATOR}${s[s.length-2]}`,l={};a.automationErrors&&(l=a.automationErrors),Array.isArray(l[i])||(l[i]=[]);let u=l[i].indexOf(o);t&&u!==-1?l[i].splice(u,1):l[i].push(o),l[i].length===0&&delete l[i],a.automationErrors=l}await r.put(a),await je.cache.workspace.invalidateWorkspaceMetadata(a.appId,a)},"Failed to update app metadata with automation log error")}n(Nl,"updateAppMetadataWithErrors");async function tN(){let e=await Ml();try{return await Pl(Zk,e,{docs:!1,paginate:!1,limit:Xk})}catch{return{data:[],hasNextPage:!1,totalLogs:0}}}n(tN,"getExpiredLogs");async function Dl(){let e=je.context.getProdWorkspaceDB();try{let t=await tN();if(!t.data||t.data.length===0)return;let r=t.data.map(o=>({_id:o.id,_rev:o.value.rev,_deleted:!0})),a=t.data.filter(o=>{let s=o.id.split(je.db.SEPARATOR);return s[s.length-1]===ns.AutomationStatus.ERROR}).map(o=>o.id);await e.bulkDocs(r),a.length&&await Nl(a,{clearing:!0})}catch(t){je.logging.logAlert(`Failed to cleanup automation log history - Database "${e.name}"`,t)}}n(Dl,"clearOldHistory");var qh=Ml;async function rN(e,t,r,a){let o,s=new Date().toISOString(),i=await qh();return(!e||e<i)&&(e=i),r||t?o=await kl(e,s,{automationId:r,status:t,page:a}):o=await Pl(e,s,{status:t,page:a,docs:!0,paginate:!0}),o}n(rN,"getLogs");async function aN(e){return await Dl(),await rN(e.startDate,e.status,e.automationId,e.page)}n(aN,"logSearch");async function nN(e,t){if(!os.db.isProdWorkspaceID(os.context.getWorkspaceId()))return;let r=await Nh(e,t);t.status===Dh.AutomationStatus.ERROR&&await Nl([r]),await Dl()}n(nN,"storeLog");var is={};F(is,{checkPluginQuotas:()=>iN,deletePlugin:()=>sN,storePlugin:()=>oN});var Bh=require("@budibase/types"),Le=require("@budibase/backend-core");var Uh=xe(require("fs")),Lh=require("path");function Fh(e,t){return Uh.default.readFileSync((0,Lh.join)(e,t),"utf8")}n(Fh,"loadJSFile");async function oN(metadata,directory,source,origin){let db=Le.tenancy.getGlobalDB(),version=metadata.package.version,name=metadata.package.name,description=metadata.package.description,hash=metadata.schema.hash,bucketPath=Le.objectStore.getPluginS3Dir(name),files=await Le.objectStore.uploadDirectory(Le.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===Bh.PluginType.DATASOURCE){let js=Fh(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=Le.db.generatePluginID(name),rev;try{rev=(await db.get(pluginId))._rev}catch(e){rev=void 0}let doc={_id:pluginId,_rev:rev,...metadata,name,version,hash,description,source};iconFileName&&(doc.iconFileName=iconFileName),source&&(doc={...doc,source}),origin&&origin.source==="github"&&(doc.origin=origin);let write=n(async()=>{let e=await db.put(doc);return await Le.events.plugin.imported(doc),{...doc,_rev:e.rev}},"write");return rev?await write():await Sl(write)}n(oN,"storePlugin");async function sN(e){let t=Le.tenancy.getGlobalDB();try{let r=await t.get(e),a=Le.objectStore.getPluginS3Dir(r.name);await Le.objectStore.deleteFolder(Le.objectStore.ObjectStoreBuckets.PLUGINS,a),await t.remove(e,r._rev),await Le.events.plugin.deleted(r),await _l()}catch(r){let a=r?.message?r?.message:r;throw new Error(`Failed to delete plugin: ${a}`)}}n(sN,"deletePlugin");async function iN(){let e=Le.tenancy.getGlobalDB();try{let r=(await e.allDocs(Le.db.getPluginParams())).rows.length;console.log(`Syncing plugin count: ${r}`),await xl(r)}catch(t){Le.logging.logAlert("Unable to retrieve plugins for quota check",t)}}n(iN,"checkPluginQuotas");var ls={};F(ls,{fetch:()=>uN,fetchValues:()=>cN,isEncryptionKeyAvailable:()=>lN,isValid:()=>$h,remove:()=>dN,update:()=>pN});var jh=require("@budibase/backend-core"),qn=require("@budibase/types");function lN(){return!!jh.env.ENCRYPTION_KEY}n(lN,"isEncryptionKeyAvailable");async function uN(){let e=await hr.get();return Object.keys(e.variables)}n(uN,"fetch");async function cN(e){let r=(await hr.get()).variables,a={};for(let[o,s]of Object.entries(r))switch(e){case qn.Environment.DEVELOPMENT:a[o]=s.development;break;case qn.Environment.PRODUCTION:default:a[o]=s.production;break}return a}n(cN,"fetchValues");async function Gh(e){if(!(await $t.cache.getCachedLicense()).features.includes(qn.Feature.ENVIRONMENT_VARIABLES))throw new Error("User does not have access to environment variables feature.");let r=await hr.get();r.variables=e(r.variables),await hr.update(r)}n(Gh,"changeValues");async function pN(e,t){if($h(e))await Gh(a=>(a[e]=t,a));else throw new Error("Variable name has characters that are not allowed")}n(pN,"update");async function dN(e){await Gh(t=>(delete t[e],t))}n(dN,"remove");function $h(e){return/^[a-zA-Z0-9-_]+$/.test(e)}n($h,"isValid");var ps={};F(ps,{definitions:()=>SN,download:()=>TN,fetch:()=>IN,write:()=>bN});var ot=require("@budibase/backend-core"),cs=require("@budibase/types");var Pe=require("@budibase/backend-core"),Dt=require("@budibase/types");var Wh=require("memorystream"),Vh=new Pe.sql.Sql(Dt.SqlClient.SQL_LITE);async function fN(e,t,r){let a={operation:Dt.Operation.READ,table:Jr.searchTable(),tables:{},paginate:{limit:r||9,page:t},filters:e,resource:{fields:[]},sort:{timestamp:{direction:Dt.SortOrder.DESCENDING,type:Dt.SortType.STRING}}},o=Vh._query(a);if(Array.isArray(o))throw new Error("Cannot execute multiple queries for audit log search");return{sql:o.sql,bindings:o.bindings}}n(fN,"getAuditLogSqlQuery");function mN(e){return`${Pe.DocumentType.AUDIT_LOG}${Pe.SEPARATOR}${e}${Pe.SEPARATOR}${Pe.utils.newid()}`}n(mN,"generateAuditLogID");async function Kh(e){e._id||(e._id=mN(e.timestamp)),e.type||(e.type=Dt.AUDIT_LOG_TYPE);try{let r=await Pe.context.getAuditLogsDB().put(e);return{...e,_rev:r.rev}}catch(t){Pe.logging.logAlert("Failed to write audit log",t)}}n(Kh,"save");async function Ul(e,t,r){t||(t=1);let a=Pe.context.getAuditLogsDB();try{let o=9+1,s=await fN(e,t,o),i=Jr.searchTable(),l=Vh.convertJsonStringColumns(i,await a.sql(s.sql,s.bindings)),u;l.length>o&&(u=l.pop());let c={rows:l,hasNextPage:!!u};return c.hasNextPage&&(c.bookmark=t+1),c}catch(o){if(o.status===404&&!r?.isRetry)return await gN(),await Bp(),await Ul(e,t,{isRetry:!0});throw o}}n(Ul,"searchSQL");async function gN(){let e=Pe.context.getAuditLogsDB(),r=(await e.allDocs(Pe.db.getDocParams(Pe.DocumentType.AUDIT_LOG,null,{include_docs:!0}))).rows.map(a=>a.doc).filter(a=>a&&!a.type).map(a=>({...a,type:Dt.AUDIT_LOG_TYPE}));await e.bulkDocs(r)}n(gN,"migrate");function Qh(e){let t=Pe.context.getAuditLogsDB(),r=new Wh,a=t.dump(r,{filter:s=>{let i=s;if(!i._id?.startsWith(Pe.DocumentType.AUDIT_LOG))return!1;let l=!0,u=n((c,d)=>{!c||c.length===0||(l=!!(l&&d&&c.includes(d)))},"matcher");if(u(e.userIds,i.userId),u(e.appIds,i.appId),u(e.events,i.event),(e.startDate||e.endDate)&&(l=l&&i.timestamp>=e.startDate&&i.timestamp<=e.endDate),e.fullSearch){let c=JSON.stringify(s);l=l&&c.includes(e.fullSearch)}return l}}),o=new Wh;return r.on("data",s=>{let i=JSON.parse(Buffer.from(s).toString());if(Array.isArray(i.docs)){let l="";for(let u of i.docs)l+=JSON.stringify(u)+`
39
- `;o.write(l)}}),r.on("end",()=>{o.end()}),{promise:a,stream:o}}n(Qh,"dump");var Un=require("@budibase/backend-core"),Ln=require("@budibase/string-templates"),us=require("@budibase/types");var yN=Un.constants.MIN_VALID_DATE.toISOString(),vN=Un.constants.MAX_VALID_DATE.toISOString();function Ll(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||yN,e.endDate=e.endDate||vN),e}n(Ll,"fillDates");async function Hh(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(a=>Un.db.getProdWorkspaceID(a)));let t={};function r(a,o){o?.length&&(t.oneOf={...t.oneOf,[a]:o})}return n(r,"addStringParams"),r("userId",e.userIds),r("appId",e.appIds),r("event",e.events),e.fullSearch&&(t.fuzzyOr=!0,t.fuzzy={name:e.fullSearch,fallback:e.fullSearch}),(e.startDate||e.endDate)&&(e=Ll(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}n(Hh,"getSearchFilters");function Fl(e,t,r){let a={_id:e,status:us.AuditLogResourceStatus.DELETED};switch(t){case"app":a.name=r?.appName;break;case"user":a.email=r?.email;break}return a}n(Fl,"deleted");function Bl(e){let t=(0,Ln.findHBSBlocks)(e);for(let r of t){let a=` "${r}"`;e=e.replace(e.includes(a)?a:` ${r}`,""),e=(0,Ln.processStringSync)(e,{})}return e}n(Bl,"removeTemplateStrings");function Jh(e,t){let r=us.AuditedEventFriendlyName[e];if(!r)throw new Error("No friendly name found.");let a=(0,Ln.processStringSync)(r,t);return a.includes('""')&&(a=Bl(r)),a}n(Jh,"getEventFriendlyName");async function bN(e,t,r){if(!await Ko()||!ot.utils.isAudited(e))return;let a=Jh(e,t),o=new Date;r?.timestamp&&(o=new Date(r.timestamp));let s={timestamp:o.toISOString(),event:e,name:a,userId:r?.userId||cs.AuditLogSystemUser,metadata:{...t,...r?.hostInfo}},i={};try{if(r?.appId){s.appId=ot.db.getProdWorkspaceID(r.appId);let l=await ot.cache.workspace.getWorkspaceMetadata(r.appId);"name"in l&&(i.appName=l.name)}if(r?.userId){let l=await ot.users.getById(r?.userId);i.email=l.email}}catch(l){ot.logging.logAlert("Failed to retrieve fallback information for audit log",l)}return s.fallback=i,await Kh(s)}n(bN,"write");async function wN(e){let t=e.map(l=>l.userId),a=e.filter(l=>l.appId).map(l=>ot.db.getDevWorkspaceID(l.appId)),o=await ot.users.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),s=await ot.db.getWorkspacesByIDs([...new Set(a)]),i=[];for(let l of e){let u=o.find(y=>y?._id===l.userId),c=s.find(y=>ot.db.isSameWorkspaceID(y?.appId,l.appId)),d={event:l.event,timestamp:l.timestamp,name:l.name,metadata:l.metadata,user:u||Fl(l.userId,"user",l.fallback)};l.appId&&(d.app=c||Fl(l.appId,"app",l.fallback)),i.push(d)}return i}n(wN,"enrich");async function IN(e){if(!await Ko())throw new Error("Audit logs not available - license required.");let t=await Hh(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await Ul(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await wN(r.rows)}}n(IN,"fetch");function TN(e){return e=Ll(e),Qh(e)}n(TN,"download");function SN(){let e=Object.entries(cs.AuditedEventFriendlyName).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=Bl(r[1]);return t}n(SN,"definitions");var ds={};F(ds,{applications:()=>Wl,roles:()=>Gl,users:()=>jl});var jl={};F(jl,{roleCheck:()=>xN});function _N(e,t){let r=e.request.body;return r.builder&&(r.builder=t?.builder||void 0),r.admin&&(r.admin=t?.admin||void 0),r.roles&&(r.roles=t?.roles||{}),e.request.body=r,e}n(_N,"removeRoles");async function xN(e,t){return await da()||_N(e,t),e}n(xN,"roleCheck");var Gl={};F(Gl,{assign:()=>AN,unAssign:()=>EN});var Fn=require("@budibase/backend-core");async function AN(e,t){if(!await da())throw new Error("Unable to assign roles - license required.");let r=await Nt.bulkGet(e);for(let a of r){if(t.role&&t.role.roleId){let o=Fn.db.getProdWorkspaceID(t.role.appId);a.roles[o]=t.role.roleId}if(t.appBuilder){let o=Fn.db.getProdWorkspaceID(t.appBuilder.appId),s=a.builder?.apps||[];a.builder={apps:s.concat([o])}}t.builder&&(a.builder={global:!0}),t.admin&&(a.admin={global:!0}),a.roles}await Nt.bulkUpdate(r)}n(AN,"assign");async function EN(e,t){if(!await da())throw new Error("Unable to un-assign roles - license required.");let r=await Nt.bulkGet(e);for(let a of r){if(t.role){let o=Fn.db.getProdWorkspaceID(t.role?.appId);a.roles[o]===t.role.roleId&&delete a.roles[o]}if(t.appBuilder&&a.builder?.apps){let o=Fn.db.getProdWorkspaceID(t.appBuilder.appId);a.builder.apps=a.builder.apps.filter(s=>s!==o)}t.builder&&a.builder&&delete a.builder,t.admin&&a.admin&&delete a.admin}await Nt.bulkUpdate(r)}n(EN,"unAssign");var Wl={};F(Wl,{buildExportFn:()=>CN,buildImportFn:()=>ON});var $l=require("@budibase/backend-core");var RN=n(e=>{if(e){if(e.appExport)return e.appExport;if(e.file)return e.file}},"ensureAppExportFile");function ON(e){return async(t,r)=>{await Qo()||t.throw(403,"Endpoint unavailable, enterprise license required."),RN(t.request.files)||t.throw(400,"Must provide app export file for import."),await $l.context.doInWorkspaceContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}n(ON,"buildImportFn");function CN(e){return async(t,r)=>{await Qo()||t.throw(403,"Endpoint unavailable, enterprise license required.");let{encryptPassword:a,excludeRows:o}=t.request.body;await $l.context.doInWorkspaceContext(t.params.appId,async()=>{t.request.body={encryptPassword:a,excludeRows:o},t.query.appId=t.params.appId,await e(t),await r()})}}n(CN,"buildExportFn");var We=require("@budibase/backend-core"),$e=require("@budibase/types"),Zh=xe(require("fs")),Xh=require("path");var Vl=require("@budibase/backend-core");var Yh;function zh(){Yh=new Vl.queue.BudibaseQueue(Vl.queue.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}n(zh,"init");function Ur(){return Yh}n(Ur,"getBackupQueue");async function Kl(e,t={}){return mt.storeWorkspaceBackupMetadata(e,t)}n(Kl,"storeWorkspaceBackupMetadata");function ey(e){let t=new Date().toISOString();switch(e){case $e.BackupStatus.COMPLETE:case $e.BackupStatus.FAILED:return{timestamp:t,finishedAt:t};case $e.BackupStatus.STARTED:return{timestamp:t,startedAt:t};case $e.BackupStatus.PENDING:return{timestamp:t,createdAt:t}}}n(ey,"getTimestamps");async function MN(e,t,r,a){let o=await fs(e);return await mt.storeWorkspaceBackupMetadata({...o,...ey(t),contents:r,status:t,type:$e.BackupType.BACKUP},{filename:a,docId:e})}n(MN,"updateBackupStatus");async function PN(e,t,r){let a=await fs(e);return await mt.storeWorkspaceBackupMetadata({...a,...ey(r),status:r,type:$e.BackupType.RESTORE,trigger:$e.BackupTrigger.MANUAL},{docId:e,docRev:t})}n(PN,"updateRestoreStatus");async function fs(e){return mt.getWorkspaceBackupMetadata(e)}n(fs,"getWorkspaceBackup");async function kN(e,t){return mt.updateWorkspaceBackupMetadata(e,t)}n(kN,"updateWorkspaceBackup");async function ty(e){let t=await mt.getWorkspaceBackupMetadata(e);return t.filename&&await We.objectStore.deleteFile(We.objectStore.ObjectStoreBuckets.BACKUPS,t.filename),mt.deleteWorkspaceBackupMetadata(e)}n(ty,"deleteWorkspaceBackup");async function NN(e){let t=[];for(let r of e)try{await ty(r),t.push({backupId:r,success:!0})}catch(a){t.push({backupId:r,success:!1,error:a instanceof Error?a.message:"Unknown error"})}return t}n(NN,"deleteWorkspaceBackups");async function DN(e,t){return mt.fetchWorkspaceBackups(e,t)}n(DN,"fetchWorkspaceBackups");async function ry(e){let t=await mt.getWorkspaceBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let{stream:r}=await We.objectStore.getReadStream(We.objectStore.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}n(ry,"getBackupDownloadStream");async function qN(e){let{stream:t}=await ry(e),r=(0,Xh.join)(We.objectStore.budibaseTempDir(),We.utils.newid()),a=Zh.default.createWriteStream(r);return new Promise((o,s)=>{t.on("error",s),a.on("error",s),t.pipe(a).on("close",()=>o(r))})}n(qN,"downloadWorkspaceBackup");async function UN(e,t,r={}){let a;try{a=await Kl({appId:e,trigger:t,timestamp:new Date().toISOString(),status:$e.BackupStatus.PENDING,type:$e.BackupType.BACKUP,...r})}catch(o){if(o.status===409)return;throw o}return await Ur().add({docId:a.id,docRev:a.rev,appId:e,export:{trigger:t,...r}}),await We.events.backup.workspaceBackupTriggered(e,a.id,$e.BackupType.BACKUP,t,r?.name),a.id}n(UN,"triggerWorkspaceBackup");async function LN(e,t,r,a){let o=await fs(t),s;try{s=await Kl({appId:e,timestamp:new Date().toISOString(),status:$e.BackupStatus.PENDING,type:$e.BackupType.RESTORE,createdBy:a})}catch(i){if(i?.status===409)return;throw i}return await Ur().add({appId:e,docId:s.id,docRev:s.rev,import:{nameForBackup:r,backupId:t,createdBy:a}}),{restoreId:s.id,metadata:o}}n(LN,"triggerWorkspaceRestore");async function FN(e,t,r){let a=We.db.getProdWorkspaceID(e);await We.context.doInWorkspaceContext(a,async()=>{let o=We.context.getProdWorkspaceDB();if(!await o.exists())return;let i=await o.tryGet($e.DocumentType.WORKSPACE_METADATA);i&&(i.backupErrors||(i.backupErrors={}),i.backupErrors[t]||(i.backupErrors[t]=[]),i.backupErrors[t].push(r),await o.put(i),await We.cache.workspace.invalidateWorkspaceMetadata(i.appId,i))})}n(FN,"trackBackupError");var BN={isEnabled:hl,triggerWorkspaceRestore:ze(LN),triggerWorkspaceBackup:ze(UN),getBackupDownloadStream:ze(ry),downloadWorkspaceBackup:ze(qN),fetchWorkspaceBackups:ze(DN),storeWorkspaceBackupMetadata:ze(Kl),updateBackupStatus:ze(MN),updateRestoreStatus:ze(PN),getWorkspaceBackup:ze(fs),updateWorkspaceBackup:ze(kN),deleteWorkspaceBackup:ze(ty),deleteWorkspaceBackups:ze(NN),trackBackupError:ze(FN)},_t=BN;var Yl={};F(Yl,{init:()=>Hl});var Y=require("@budibase/backend-core"),qt=require("@budibase/types"),ya=xe(require("fs"));async function Hl(e){Ur().process(async t=>{let r=t.data;try{if(r.export)return console.log("Exporting app backup:",r.appId,r.export.trigger),KN(t,e);if(r.import)return console.log("Importing app backup:",r.appId,r.import.backupId),VN(t,e)}catch(a){Y.logging.logAlert(`Failed to perform backup for app ID: ${r.appId}`,a)}})}n(Hl,"init");async function jN(e){await Y.db.getDB(e,{skip_setup:!0}).destroy()}n(jN,"removeExistingApp");var ay=1e3;async function ms(e){for(let t=0;t<e.length;t+=ay)await Y.objectStore.deleteFiles(Y.objectStore.ObjectStoreBuckets.APPS,e.slice(t,t+ay))}n(ms,"deleteAppFiles");async function Jl(e){let t=[];for await(let r of Y.objectStore.listAllObjects(Y.objectStore.ObjectStoreBuckets.APPS,e))r.Key&&t.push(r.Key);return t}n(Jl,"listAppFiles");async function GN(e){let t=Y.db.getProdWorkspaceID(e),r=await Jl(`${t}/`);r.length&&await ms(r)}n(GN,"clearWorkspaceFiles");async function Ql(e,t){let{stream:r}=await Y.objectStore.getReadStream(Y.objectStore.ObjectStoreBuckets.APPS,e);await Y.objectStore.streamUpload({bucket:Y.objectStore.ObjectStoreBuckets.APPS,filename:t,stream:r})}n(Ql,"copyAppFile");async function ny(e,t){let r=new Map;for(let o of t)r.set(o.targetKey,o.rollbackKey);let a=[];for(let o of e){let s=r.get(o);s?await Ql(s,o):a.push(o)}a.length&&await ms(a)}n(ny,"rollbackPromotedWorkspaceFiles");async function $N(e,t){let r=Y.db.getProdWorkspaceID(e),a=Y.db.getProdWorkspaceID(t),o=`${r}/`,s=`${a}/`,i=`${o}__restore_rollback/${Date.now()}/`,l=await Jl(o),u=new Set,c=[];try{for(let d of l){let y=d.startsWith(o)?d.slice(o.length):d,h=`${s}${y}`;if(await Y.objectStore.objectExists(Y.objectStore.ObjectStoreBuckets.APPS,h)){let O=`${i}${y}`;await Ql(h,O),c.push({targetKey:h,rollbackKey:O})}await Ql(d,h),u.add(h)}}catch(d){if(u.size)try{await ny([...u],c)}catch(y){console.log("Failed to rollback partially promoted restore files:",y)}throw d}return{sourceFileKeys:l,targetFileKeys:[...u],rollbackFiles:c}}n($N,"promoteWorkspaceFiles");async function WN(e,t,r){let o=`${Y.db.getProdWorkspaceID(r)}/`,s=await Jl(o),i=new Set(t),l=s.filter(u=>!i.has(u));l.length&&await ms(l),e.length&&await ms(e)}n(WN,"cleanupPromotedWorkspaceFiles");async function oy(e,t,r,a){let o=Y.db.getDevWorkspaceID(r),s=Y.db.getProdWorkspaceID(r),i=new Date().toISOString(),l=n(async(u,c)=>{a?.doc?await _t.updateBackupStatus(a.doc.id,u,c?.contents,c?.filename):await _t.storeWorkspaceBackupMetadata({appId:s,timestamp:i,trigger:e,status:u,name:a?.name,type:qt.BackupType.BACKUP,contents:c?.contents,createdBy:a?.createdBy},{filename:c?.filename})},"updateMetadata");try{let u=await a.processing.exportWorkspaceFn(o,{tar:!0}),c=await a.processing.statsFn(o),d=`${s}/backup-${i}.tar.gz`,y=Y.objectStore.ObjectStoreBuckets.BACKUPS,h=ya.default.createReadStream(u);await Y.objectStore.streamUpload({bucket:y,filename:d,stream:h,extra:{type:"application/gzip",metadata:{name:a?.name,trigger:e,timestamp:i,appId:s}}}),await l(qt.BackupStatus.COMPLETE,{filename:d,contents:c}),ya.default.existsSync(u)&&ya.default.rmSync(u)}catch(u){Y.logging.logAlert("App backup error",u),await l(qt.BackupStatus.FAILED);let c=a?.doc?.id||`backup-${i}`,d=u instanceof Error?u.message:String(u);await _t.trackBackupError(s,c,`Backup export failed: ${d}`)}}n(oy,"runBackup");async function VN(e,t){let r=e.data,a=r.appId,o=r.import.backupId,s=r.import.nameForBackup,i=r.import.createdBy,l=Y.tenancy.getTenantIDFromWorkspaceID(a);return Y.tenancy.doInTenant(l,async()=>{let u=Y.db.getDevWorkspaceID(a),c=`${u}_temp_${Date.now()}`,{rev:d}=await _t.updateRestoreStatus(r.docId,r.docRev,qt.BackupStatus.STARTED);await oy(qt.BackupTrigger.RESTORING,l,a,{processing:t,createdBy:i,name:s});let y=await _t.downloadWorkspaceBackup(o),h=qt.BackupStatus.COMPLETE,b=null;try{await t.importWorkspaceFn(u,Y.db.getDB(c),{file:{type:"application/gzip",path:y},key:y},{objectStoreAppId:c}),b=await $N(c,u),await jN(u),await new Y.db.Replication({source:c,target:u}).replicate();try{await WN(b.sourceFileKeys,b.targetFileKeys,u)}catch(O){console.log("Failed to cleanup promoted restore files:",O)}}catch(O){if(b)try{await ny(b.targetFileKeys,b.rollbackFiles)}catch(S){console.log("Failed to rollback promoted restore files:",S)}Y.logging.logAlert("App restore error",O),h=qt.BackupStatus.FAILED;let w=O instanceof Error?O.message:String(O);await _t.trackBackupError(a,o,`Backup restore failed: ${w}`)}finally{try{await Y.db.getDB(c,{skip_setup:!0}).destroy()}catch{}try{await GN(c)}catch{}}await _t.updateRestoreStatus(r.docId,d,h),ya.default.existsSync(y)&&ya.default.rmSync(y,{force:!0})})}n(VN,"importProcessor");async function KN(e,t){let r=e.data,a=r.appId,o=r.export.trigger,s=r.export.name,i=Y.tenancy.getTenantIDFromWorkspaceID(a);await Y.tenancy.doInTenant(i,async()=>{try{let{rev:l}=await _t.updateBackupStatus(r.docId,qt.BackupStatus.STARTED);return oy(o,i,a,{processing:t,doc:{id:r.docId,rev:l},name:s})}catch(l){Y.logging.logAlert("App backup error",l);let u=l instanceof Error?l.message:String(l);await _t.trackBackupError(a,r.docId,`Backup export failed: ${u}`)}})}n(KN,"exportProcessor");var QN=n(async e=>{zh(),await Hl(e.processing)},"init"),Bn={..._t,processing:Yl,init:QN,getBackupQueue:Ur};var sy=n(async e=>{e.backups&&await Bn.init(e.backups)},"init");var Es={};F(Es,{create:()=>BG,find:()=>FG,get:()=>LG,remove:()=>GG,update:()=>jG});var CI=xe($u()),tr=require("@budibase/backend-core");var MI=require("@budibase/types");async function LG(e){let t=tr.tenancy.getGlobalDB(),r=new tr.db.QueryBuilder(t.name,MI.SearchIndex.USER);r.setIndexBuilder(tr.db.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[o,s]of Object.entries(e.filters?.equal??{}))r.addEqual(o,s);r.setSort("_id"),r.setSkip(e.skip);let a=await r.run();return{users:a.rows,total:a.totalRows}}n(LG,"get");async function FG(e){return await tr.users.getById(e)}n(FG,"find");async function BG(e){let t=await Nt.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new tr.HTTPError("User is already synched",409);e={...t,scimInfo:(0,CI.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await Nt.save(e,{requirePassword:!1})}n(BG,"create");async function jG(e,t){return await Nt.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}n(jG,"update");async function GG(e){return await Nt.destroy(e)}n(GG,"remove");var Rs={};F(Rs,{create:()=>$G});var PI=xe($u());var kI=require("@budibase/backend-core");async function $G(e){let t=await wi(e.name),r;if(!t)r=(await kt.save(e)).id;else{if(t.scimInfo?.isSync)throw new kI.HTTPError("Group is already synched",409);r=t._id,t.users.length&&await kt.removeUsers(r,t.users.map(o=>o._id)),t.scimInfo=(0,PI.default)(t.scimInfo,e.scimInfo),await kt.save(t)}return await kt.get(r)}n($G,"create");var Fr={};F(Fr,{logRequest:()=>KG,logResponse:()=>QG});var Ut=require("@budibase/backend-core"),DI=xe(NI());var{DocWritethrough:WG}=Ut.cache.docWritethrough;function VG(){return`${Ut.db.DocumentType.SCIM_LOG}${Ut.db.SEPARATOR}${(0,DI.default)().format("YYYYMMDD")}`}n(VG,"getLogDocId");var qI=n(()=>{let e=Ut.context.getScimDBName();return new WG(Ut.db.getDB(e),VG())},"getDB");async function KG(e){Ut.logging.logWarn("SCIM request log",e);let t=Date.now().toString();return await qI().patch({[`${t}_request`]:{ts:new Date().toISOString(),...e}}),t}n(KG,"logRequest");async function QG(e,t){Ut.logging.logWarn("SCIM response",t),await qI().patch({[`${e}_response`]:{ts:new Date().toISOString(),...t}})}n(QG,"logResponse");var zu={};F(zu,{doInScimContext:()=>zG,feature:()=>Qu,internalGroupOnly:()=>t$,licenseAuth:()=>Yu,licensing:()=>UI,requireSCIM:()=>ZG,scimGroupOnly:()=>e$,scimUserOnly:()=>XG});var Sr=require("@budibase/backend-core");var Os=require("@budibase/types");var HG=n((e={checkUsersLimit:!0})=>async(t,r)=>{if((e.licensingCheck?e.licensingCheck:()=>!!t.user)(t)){if(Sr.env.SELF_HOSTED&&Sr.env.DEFAULT_LICENSE)return t.user.license=Ii,r();t.user.license=await $t.cache.getCachedLicense(),e.checkUsersLimit&&(Sr.utils.isServingApp(t)||Sr.utils.isServingBuilder(t)||Sr.utils.isServingBuilderPreview(t)||Sr.utils.isPublicApiRequest(t))&&await Qt.usageLimitIsExceeded({name:Os.StaticQuotaName.USERS,type:Os.QuotaUsageType.STATIC,usageChange:0})}return r()},"licensing"),UI=HG;var Qu={};F(Qu,{requireFeature:()=>JG,requireFeatures:()=>YG});var JG=n(e=>async(t,r)=>{await Vo(e),await r()},"requireFeature"),YG=n((...e)=>async(t,r)=>{await gl(e),await r()},"requireFeatures");var Cs=require("@budibase/backend-core");var zG=n(async(e,t)=>{let r;return Cs.env.ENABLE_SCIM_LOGGER&&(r=await Fr.logRequest({...e.request.toJSON(),body:e.request.body})),await Cs.context.doInScimContext(async()=>{let a=await t();return r&&await Fr.logResponse(r,{...e.response.toJSON(),body:e.response.body}),a})},"doInScimContext");var ZG=n(async(e,t)=>{await bl(),await t()},"requireSCIM");var LI=require("@budibase/backend-core");var XG=n(e=>Hu(LI.users.getById,e,!0),"scimUserOnly"),e$=n(e=>Hu(ve.get,e,!0),"scimGroupOnly"),t$=n(e=>Hu(ve.get,e,!1),"internalGroupOnly");function Hu(e,t,r){return async(a,o)=>{let s=a.params[t];return typeof s!="string"&&a.throw(404),!!(await e(s)).scimInfo?.isSync!==r&&a.throw(404),o()}}n(Hu,"scimSyncChecks");var Br=require("@budibase/backend-core");var Ju=require("dd-trace");async function Yu(e,t){await Ju.tracer.trace("licenseAuth",async r=>{let a=e.request.headers[Br.constants.Header.LICENSE_KEY]||Br.utils.getBearerToken(e);Array.isArray(a)&&(a=a[0]),a||e.throw(403,"License key not provided");let o=await ul(a);o||(r.addTags({licenseFound:!1}),e.throw(403,"License not found or invalid")),o.tenantId||e.throw(403,"License does not have a tenant ID"),Ju.tracer.setUser({id:"anonymous",tenantId:o.tenantId}),await Br.context.doInSelfHostTenantUsingCloud(o.tenantId,async()=>{await Br.context.doInLicenseContext(o,async()=>{await t()})})})}n(Yu,"default");var ec={};F(ec,{group:()=>Xu,user:()=>Zu});var Zu={};F(Zu,{fromScimUser:()=>s$,toScimUserResponse:()=>a$,userFilters:()=>i$});var FI=require("@budibase/backend-core"),BI=require("@budibase/shared-core"),Ms=require("@budibase/types"),jI=require("scim2-parse-filter");var{unreachable:r$}=BI.utils,a$=n(e=>{let{isSync:t,roles:r,...a}=e.scimInfo||{},o={...a,schemas:["urn:ietf:params:scim:schemas:core:2.0:User"],id:e._id,meta:{resourceType:"User",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},active:e.status===Ms.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"),n$=n(e=>!!e?.id,"isScimUserResponse");function o$(e){if(FI.utils.validEmail(e.userName))return e.userName;if(e.emails)return e.emails.find(t=>t.primary)?.value||e.emails[0]?.value}n(o$,"tryGetEmail");var s$=n(e=>{let t=n$(e)?e:void 0,r=o$(e);if(!r)throw new Error("Email is required");let a;switch(e.active){case"True":case"true":case!0:a=!0;break;case"False":case"false":case!1:a=!1;break;default:r$(e.active)}let o,s;return e.name?.givenName?(o=e.name?.givenName,s=e.name?.familyName):o=e.displayName,{tenantId:"",_id:t?.id,userId:t?.id,email:r,firstName:o,lastName:s,scimInfo:{...e,isSync:!0},roles:{},status:a?Ms.UserStatus.ACTIVE:Ms.UserStatus.INACTIVE,createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},"fromScimUser"),i$=n(e=>{let t={equal:{}},r=(0,jI.parse)(e);function a(o){switch(o.op){case"eq":{let s=o.attrPath,i;switch(s){case"emails.value":i="email";break;default:i=`scimInfo.${s}`}t.equal[i]=o.compValue;break}case"and":for(let s of o.filters)a(s);break;default:console.warn("Filter not handled",{filter:o})}}return n(a,"parseFilters"),a(r),t},"userFilters");var Xu={};F(Xu,{fromScimGroup:()=>c$,toScimGroupResponse:()=>l$});var l$=n(e=>({schemas:["urn:ietf:params:scim:schemas:core:2.0:Group"],id:e._id,externalId:e.scimInfo.externalId,meta:{resourceType:"Group",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},displayName:e.name,members:e.users?.map(t=>({value:t._id}))}),"toScimGroupResponse"),u$=n(e=>!!e?.id,"isScimGroup"),c$=n(e=>{let t=u$(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 ep={};F(ep,{LLMRequest:()=>Ve,TableGeneration:()=>Xc,agentHistoryTitleSystemPrompt:()=>WK,agentSystemPrompt:()=>$K,aiColumnSchemas:()=>zc,aiTableResponseToTableSchema:()=>Qc,appendAIColumns:()=>Hc,classifyText:()=>PK,cleanData:()=>kK,composeAutomationAgentSystemPrompt:()=>BK,composeAutomationAgentToolGuidelines:()=>jK,generateAIColumns:()=>Vc,generateAgentInstructionsPrompt:()=>DK,generateCronExpression:()=>NK,generateData:()=>Kc,generateJs:()=>FK,generateTables:()=>Wc,generationStructure:()=>Yc,normalizeContentType:()=>QK,parseResponseFormat:()=>gA,sanitiseToolName:()=>KK,searchWeb:()=>LK,sentimentAnalysis:()=>UK,summarizeText:()=>MK,tableDataStructuredOutput:()=>Zc,translate:()=>qK});var ai=require("@budibase/backend-core"),vA=require("@budibase/shared-core");var hT="vercel.ai.error",p$=Symbol.for(hT),GI,$I,M=class yT extends($I=Error,GI=p$,$I){static{n(this,"_AISDKError")}constructor({name:t,message:r,cause:a}){super(r),this[GI]=!0,this.name=t,this.cause=a}static isInstance(t){return yT.hasMarker(t,hT)}static hasMarker(t,r){let a=Symbol.for(r);return t!=null&&typeof t=="object"&&a in t&&typeof t[a]=="boolean"&&t[a]===!0}},vT="AI_APICallError",bT=`vercel.ai.error.${vT}`,d$=Symbol.for(bT),WI,VI,de=class extends(VI=M,WI=d$,VI){static{n(this,"APICallError")}constructor({message:e,url:t,requestBodyValues:r,statusCode:a,responseHeaders:o,responseBody:s,cause:i,isRetryable:l=a!=null&&(a===408||a===409||a===429||a>=500),data:u}){super({name:vT,message:e,cause:i}),this[WI]=!0,this.url=t,this.requestBodyValues=r,this.statusCode=a,this.responseHeaders=o,this.responseBody=s,this.isRetryable=l,this.data=u}static isInstance(e){return M.hasMarker(e,bT)}},wT="AI_EmptyResponseBodyError",IT=`vercel.ai.error.${wT}`,f$=Symbol.for(IT),KI,QI,TT=class extends(QI=M,KI=f$,QI){static{n(this,"EmptyResponseBodyError")}constructor({message:e="Empty response body"}={}){super({name:wT,message:e}),this[KI]=!0}static isInstance(e){return M.hasMarker(e,IT)}};function _r(e){return e==null?"unknown error":typeof e=="string"?e:e instanceof Error?e.message:JSON.stringify(e)}n(_r,"getErrorMessage");var ST="AI_InvalidArgumentError",_T=`vercel.ai.error.${ST}`,m$=Symbol.for(_T),HI,JI,xT=class extends(JI=M,HI=m$,JI){static{n(this,"InvalidArgumentError")}constructor({message:e,cause:t,argument:r}){super({name:ST,message:e,cause:t}),this[HI]=!0,this.argument=r}static isInstance(e){return M.hasMarker(e,_T)}},AT="AI_InvalidPromptError",ET=`vercel.ai.error.${AT}`,g$=Symbol.for(ET),YI,zI,jr=class extends(zI=M,YI=g$,zI){static{n(this,"InvalidPromptError")}constructor({prompt:e,message:t,cause:r}){super({name:AT,message:`Invalid prompt: ${t}`,cause:r}),this[YI]=!0,this.prompt=e}static isInstance(e){return M.hasMarker(e,ET)}},RT="AI_InvalidResponseDataError",OT=`vercel.ai.error.${RT}`,h$=Symbol.for(OT),ZI,XI,ate=class extends(XI=M,ZI=h$,XI){static{n(this,"InvalidResponseDataError")}constructor({data:e,message:t=`Invalid response data: ${JSON.stringify(e)}.`}){super({name:RT,message:t}),this[ZI]=!0,this.data=e}static isInstance(e){return M.hasMarker(e,OT)}},CT="AI_JSONParseError",MT=`vercel.ai.error.${CT}`,y$=Symbol.for(MT),eT,tT,Wn=class extends(tT=M,eT=y$,tT){static{n(this,"JSONParseError")}constructor({text:e,cause:t}){super({name:CT,message:`JSON parsing failed: Text: ${e}.
39
+ `;o.write(l)}}),r.on("end",()=>{o.end()}),{promise:a,stream:o}}n(Qh,"dump");var Un=require("@budibase/backend-core"),Ln=require("@budibase/string-templates"),us=require("@budibase/types");var yN=Un.constants.MIN_VALID_DATE.toISOString(),vN=Un.constants.MAX_VALID_DATE.toISOString();function Ll(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||yN,e.endDate=e.endDate||vN),e}n(Ll,"fillDates");async function Hh(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(a=>Un.db.getProdWorkspaceID(a)));let t={};function r(a,o){o?.length&&(t.oneOf={...t.oneOf,[a]:o})}return n(r,"addStringParams"),r("userId",e.userIds),r("appId",e.appIds),r("event",e.events),e.fullSearch&&(t.fuzzyOr=!0,t.fuzzy={name:e.fullSearch,fallback:e.fullSearch}),(e.startDate||e.endDate)&&(e=Ll(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}n(Hh,"getSearchFilters");function Fl(e,t,r){let a={_id:e,status:us.AuditLogResourceStatus.DELETED};switch(t){case"app":a.name=r?.appName;break;case"user":a.email=r?.email;break}return a}n(Fl,"deleted");function Bl(e){let t=(0,Ln.findHBSBlocks)(e);for(let r of t){let a=` "${r}"`;e=e.replace(e.includes(a)?a:` ${r}`,""),e=(0,Ln.processStringSync)(e,{})}return e}n(Bl,"removeTemplateStrings");function Jh(e,t){let r=us.AuditedEventFriendlyName[e];if(!r)throw new Error("No friendly name found.");let a=(0,Ln.processStringSync)(r,t);return a.includes('""')&&(a=Bl(r)),a}n(Jh,"getEventFriendlyName");async function bN(e,t,r){if(!await Ko()||!ot.utils.isAudited(e))return;let a=Jh(e,t),o=new Date;r?.timestamp&&(o=new Date(r.timestamp));let s={timestamp:o.toISOString(),event:e,name:a,userId:r?.userId||cs.AuditLogSystemUser,metadata:{...t,...r?.hostInfo}},i={};try{if(r?.appId){s.appId=ot.db.getProdWorkspaceID(r.appId);let l=await ot.cache.workspace.getWorkspaceMetadata(r.appId);"name"in l&&(i.appName=l.name)}if(r?.userId){let l=await ot.users.getById(r?.userId);i.email=l.email}}catch(l){ot.logging.logAlert("Failed to retrieve fallback information for audit log",l)}return s.fallback=i,await Kh(s)}n(bN,"write");async function wN(e){let t=e.map(l=>l.userId),a=e.filter(l=>l.appId).map(l=>ot.db.getDevWorkspaceID(l.appId)),o=await ot.users.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),s=await ot.db.getWorkspacesByIDs([...new Set(a)]),i=[];for(let l of e){let u=o.find(y=>y?._id===l.userId),c=s.find(y=>ot.db.isSameWorkspaceID(y?.appId,l.appId)),d={event:l.event,timestamp:l.timestamp,name:l.name,metadata:l.metadata,user:u||Fl(l.userId,"user",l.fallback)};l.appId&&(d.app=c||Fl(l.appId,"app",l.fallback)),i.push(d)}return i}n(wN,"enrich");async function IN(e){if(!await Ko())throw new Error("Audit logs not available - license required.");let t=await Hh(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await Ul(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await wN(r.rows)}}n(IN,"fetch");function TN(e){return e=Ll(e),Qh(e)}n(TN,"download");function SN(){let e=Object.entries(cs.AuditedEventFriendlyName).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=Bl(r[1]);return t}n(SN,"definitions");var ds={};F(ds,{applications:()=>Wl,roles:()=>Gl,users:()=>jl});var jl={};F(jl,{roleCheck:()=>xN});function _N(e,t){let r=e.request.body;return r.builder&&(r.builder=t?.builder||void 0),r.admin&&(r.admin=t?.admin||void 0),r.roles&&(r.roles=t?.roles||{}),e.request.body=r,e}n(_N,"removeRoles");async function xN(e,t){return await da()||_N(e,t),e}n(xN,"roleCheck");var Gl={};F(Gl,{assign:()=>AN,unAssign:()=>EN});var Fn=require("@budibase/backend-core");async function AN(e,t){if(!await da())throw new Error("Unable to assign roles - license required.");let r=await Nt.bulkGet(e);for(let a of r){if(t.role&&t.role.roleId){let o=Fn.db.getProdWorkspaceID(t.role.appId);a.roles[o]=t.role.roleId}if(t.appBuilder){let o=Fn.db.getProdWorkspaceID(t.appBuilder.appId),s=a.builder?.apps||[];a.builder={apps:s.concat([o])}}t.builder&&(a.builder={global:!0}),t.admin&&(a.admin={global:!0}),a.roles}await Nt.bulkUpdate(r)}n(AN,"assign");async function EN(e,t){if(!await da())throw new Error("Unable to un-assign roles - license required.");let r=await Nt.bulkGet(e);for(let a of r){if(t.role){let o=Fn.db.getProdWorkspaceID(t.role?.appId);a.roles[o]===t.role.roleId&&delete a.roles[o]}if(t.appBuilder&&a.builder?.apps){let o=Fn.db.getProdWorkspaceID(t.appBuilder.appId);a.builder.apps=a.builder.apps.filter(s=>s!==o)}t.builder&&a.builder&&delete a.builder,t.admin&&a.admin&&delete a.admin}await Nt.bulkUpdate(r)}n(EN,"unAssign");var Wl={};F(Wl,{buildExportFn:()=>CN,buildImportFn:()=>ON});var $l=require("@budibase/backend-core");var RN=n(e=>{if(e){if(e.appExport)return e.appExport;if(e.file)return e.file}},"ensureAppExportFile");function ON(e){return async(t,r)=>{await Qo()||t.throw(403,"Endpoint unavailable, enterprise license required."),RN(t.request.files)||t.throw(400,"Must provide app export file for import."),await $l.context.doInWorkspaceContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}n(ON,"buildImportFn");function CN(e){return async(t,r)=>{await Qo()||t.throw(403,"Endpoint unavailable, enterprise license required.");let{encryptPassword:a,excludeRows:o}=t.request.body;await $l.context.doInWorkspaceContext(t.params.appId,async()=>{t.request.body={encryptPassword:a,excludeRows:o},t.query.appId=t.params.appId,await e(t),await r()})}}n(CN,"buildExportFn");var We=require("@budibase/backend-core"),$e=require("@budibase/types"),Zh=xe(require("fs")),Xh=require("path");var Vl=require("@budibase/backend-core");var Yh;function zh(){Yh=new Vl.queue.BudibaseQueue(Vl.queue.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}n(zh,"init");function Ur(){return Yh}n(Ur,"getBackupQueue");async function Kl(e,t={}){return mt.storeWorkspaceBackupMetadata(e,t)}n(Kl,"storeWorkspaceBackupMetadata");function ey(e){let t=new Date().toISOString();switch(e){case $e.BackupStatus.COMPLETE:case $e.BackupStatus.FAILED:return{timestamp:t,finishedAt:t};case $e.BackupStatus.STARTED:return{timestamp:t,startedAt:t};case $e.BackupStatus.PENDING:return{timestamp:t,createdAt:t}}}n(ey,"getTimestamps");async function MN(e,t,r,a){let o=await fs(e);return await mt.storeWorkspaceBackupMetadata({...o,...ey(t),contents:r,status:t,type:$e.BackupType.BACKUP},{filename:a,docId:e})}n(MN,"updateBackupStatus");async function PN(e,t,r){let a=await fs(e);return await mt.storeWorkspaceBackupMetadata({...a,...ey(r),status:r,type:$e.BackupType.RESTORE,trigger:$e.BackupTrigger.MANUAL},{docId:e,docRev:t})}n(PN,"updateRestoreStatus");async function fs(e){return mt.getWorkspaceBackupMetadata(e)}n(fs,"getWorkspaceBackup");async function kN(e,t){return mt.updateWorkspaceBackupMetadata(e,t)}n(kN,"updateWorkspaceBackup");async function ty(e){let t=await mt.getWorkspaceBackupMetadata(e);return t.filename&&await We.objectStore.deleteFile(We.objectStore.ObjectStoreBuckets.BACKUPS,t.filename),mt.deleteWorkspaceBackupMetadata(e)}n(ty,"deleteWorkspaceBackup");async function NN(e){let t=[];for(let r of e)try{await ty(r),t.push({backupId:r,success:!0})}catch(a){t.push({backupId:r,success:!1,error:a instanceof Error?a.message:"Unknown error"})}return t}n(NN,"deleteWorkspaceBackups");async function DN(e,t){return mt.fetchWorkspaceBackups(e,t)}n(DN,"fetchWorkspaceBackups");async function ry(e){let t=await mt.getWorkspaceBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let{stream:r}=await We.objectStore.getReadStream(We.objectStore.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}n(ry,"getBackupDownloadStream");async function qN(e){let{stream:t}=await ry(e),r=(0,Xh.join)(We.objectStore.budibaseTempDir(),We.utils.newid()),a=Zh.default.createWriteStream(r);return new Promise((o,s)=>{t.on("error",s),a.on("error",s),t.pipe(a).on("close",()=>o(r))})}n(qN,"downloadWorkspaceBackup");async function UN(e,t,r={}){let a;try{a=await Kl({appId:e,trigger:t,timestamp:new Date().toISOString(),status:$e.BackupStatus.PENDING,type:$e.BackupType.BACKUP,...r})}catch(o){if(o.status===409)return;throw o}return await Ur().add({docId:a.id,docRev:a.rev,appId:e,export:{trigger:t,...r}}),await We.events.backup.workspaceBackupTriggered(e,a.id,$e.BackupType.BACKUP,t,r?.name),a.id}n(UN,"triggerWorkspaceBackup");async function LN(e,t,r,a){let o=await fs(t),s;try{s=await Kl({appId:e,timestamp:new Date().toISOString(),status:$e.BackupStatus.PENDING,type:$e.BackupType.RESTORE,createdBy:a})}catch(i){if(i?.status===409)return;throw i}return await Ur().add({appId:e,docId:s.id,docRev:s.rev,import:{nameForBackup:r,backupId:t,createdBy:a}}),{restoreId:s.id,metadata:o}}n(LN,"triggerWorkspaceRestore");async function FN(e,t,r){let a=We.db.getProdWorkspaceID(e);await We.context.doInWorkspaceContext(a,async()=>{let o=We.context.getProdWorkspaceDB();if(!await o.exists())return;let i=await o.tryGet($e.DocumentType.WORKSPACE_METADATA);i&&(i.backupErrors||(i.backupErrors={}),i.backupErrors[t]||(i.backupErrors[t]=[]),i.backupErrors[t].push(r),await o.put(i),await We.cache.workspace.invalidateWorkspaceMetadata(i.appId,i))})}n(FN,"trackBackupError");var BN={isEnabled:hl,triggerWorkspaceRestore:ze(LN),triggerWorkspaceBackup:ze(UN),getBackupDownloadStream:ze(ry),downloadWorkspaceBackup:ze(qN),fetchWorkspaceBackups:ze(DN),storeWorkspaceBackupMetadata:ze(Kl),updateBackupStatus:ze(MN),updateRestoreStatus:ze(PN),getWorkspaceBackup:ze(fs),updateWorkspaceBackup:ze(kN),deleteWorkspaceBackup:ze(ty),deleteWorkspaceBackups:ze(NN),trackBackupError:ze(FN)},_t=BN;var Yl={};F(Yl,{init:()=>Hl});var Y=require("@budibase/backend-core"),qt=require("@budibase/types"),ya=xe(require("fs"));async function Hl(e){Ur().process(async t=>{let r=t.data;try{if(r.export)return console.log("Exporting app backup:",r.appId,r.export.trigger),KN(t,e);if(r.import)return console.log("Importing app backup:",r.appId,r.import.backupId),VN(t,e)}catch(a){Y.logging.logAlert(`Failed to perform backup for app ID: ${r.appId}`,a)}})}n(Hl,"init");async function jN(e){await Y.db.getDB(e,{skip_setup:!0}).destroy()}n(jN,"removeExistingApp");var ay=1e3;async function ms(e){for(let t=0;t<e.length;t+=ay)await Y.objectStore.deleteFiles(Y.objectStore.ObjectStoreBuckets.APPS,e.slice(t,t+ay))}n(ms,"deleteAppFiles");async function Jl(e){let t=[];for await(let r of Y.objectStore.listAllObjects(Y.objectStore.ObjectStoreBuckets.APPS,e))r.Key&&t.push(r.Key);return t}n(Jl,"listAppFiles");async function GN(e){let t=Y.db.getProdWorkspaceID(e),r=await Jl(`${t}/`);r.length&&await ms(r)}n(GN,"clearWorkspaceFiles");async function Ql(e,t){let{stream:r}=await Y.objectStore.getReadStream(Y.objectStore.ObjectStoreBuckets.APPS,e);await Y.objectStore.streamUpload({bucket:Y.objectStore.ObjectStoreBuckets.APPS,filename:t,stream:r})}n(Ql,"copyAppFile");async function ny(e,t){let r=new Map;for(let o of t)r.set(o.targetKey,o.rollbackKey);let a=[];for(let o of e){let s=r.get(o);s?await Ql(s,o):a.push(o)}a.length&&await ms(a)}n(ny,"rollbackPromotedWorkspaceFiles");async function $N(e,t){let r=Y.db.getProdWorkspaceID(e),a=Y.db.getProdWorkspaceID(t),o=`${r}/`,s=`${a}/`,i=`${o}__restore_rollback/${Date.now()}/`,l=await Jl(o),u=new Set,c=[];try{for(let d of l){let y=d.startsWith(o)?d.slice(o.length):d,h=`${s}${y}`;if(await Y.objectStore.objectExists(Y.objectStore.ObjectStoreBuckets.APPS,h)){let O=`${i}${y}`;await Ql(h,O),c.push({targetKey:h,rollbackKey:O})}await Ql(d,h),u.add(h)}}catch(d){if(u.size)try{await ny([...u],c)}catch(y){console.log("Failed to rollback partially promoted restore files:",y)}throw d}return{sourceFileKeys:l,targetFileKeys:[...u],rollbackFiles:c}}n($N,"promoteWorkspaceFiles");async function WN(e,t,r){let o=`${Y.db.getProdWorkspaceID(r)}/`,s=await Jl(o),i=new Set(t),l=s.filter(u=>!i.has(u));l.length&&await ms(l),e.length&&await ms(e)}n(WN,"cleanupPromotedWorkspaceFiles");async function oy(e,t,r,a){let o=Y.db.getDevWorkspaceID(r),s=Y.db.getProdWorkspaceID(r),i=new Date().toISOString(),l=n(async(u,c)=>{a?.doc?await _t.updateBackupStatus(a.doc.id,u,c?.contents,c?.filename):await _t.storeWorkspaceBackupMetadata({appId:s,timestamp:i,trigger:e,status:u,name:a?.name,type:qt.BackupType.BACKUP,contents:c?.contents,createdBy:a?.createdBy},{filename:c?.filename})},"updateMetadata");try{let u=await a.processing.exportWorkspaceFn(o,{tar:!0}),c=await a.processing.statsFn(o),d=`${s}/backup-${i}.tar.gz`,y=Y.objectStore.ObjectStoreBuckets.BACKUPS,h=ya.default.createReadStream(u);await Y.objectStore.streamUpload({bucket:y,filename:d,stream:h,extra:{type:"application/gzip",metadata:{name:a?.name,trigger:e,timestamp:i,appId:s}}}),await l(qt.BackupStatus.COMPLETE,{filename:d,contents:c}),ya.default.existsSync(u)&&ya.default.rmSync(u)}catch(u){Y.logging.logAlert("App backup error",u),await l(qt.BackupStatus.FAILED);let c=a?.doc?.id||`backup-${i}`,d=u instanceof Error?u.message:String(u);await _t.trackBackupError(s,c,`Backup export failed: ${d}`)}}n(oy,"runBackup");async function VN(e,t){let r=e.data,a=r.appId,o=r.import.backupId,s=r.import.nameForBackup,i=r.import.createdBy,l=Y.tenancy.getTenantIDFromWorkspaceID(a);return Y.tenancy.doInTenant(l,async()=>{let u=Y.db.getDevWorkspaceID(a),c=`${u}_temp_${Date.now()}`,{rev:d}=await _t.updateRestoreStatus(r.docId,r.docRev,qt.BackupStatus.STARTED);await oy(qt.BackupTrigger.RESTORING,l,a,{processing:t,createdBy:i,name:s});let y=await _t.downloadWorkspaceBackup(o),h=qt.BackupStatus.COMPLETE,b=null;try{await t.importWorkspaceFn(u,Y.db.getDB(c),{file:{type:"application/gzip",path:y},key:y},{objectStoreAppId:c,preserveLiteLLMConfig:!0}),b=await $N(c,u),await jN(u),await new Y.db.Replication({source:c,target:u}).replicate();try{await WN(b.sourceFileKeys,b.targetFileKeys,u)}catch(O){console.log("Failed to cleanup promoted restore files:",O)}}catch(O){if(b)try{await ny(b.targetFileKeys,b.rollbackFiles)}catch(S){console.log("Failed to rollback promoted restore files:",S)}Y.logging.logAlert("App restore error",O),h=qt.BackupStatus.FAILED;let w=O instanceof Error?O.message:String(O);await _t.trackBackupError(a,o,`Backup restore failed: ${w}`)}finally{try{await Y.db.getDB(c,{skip_setup:!0}).destroy()}catch{}try{await GN(c)}catch{}}await _t.updateRestoreStatus(r.docId,d,h),ya.default.existsSync(y)&&ya.default.rmSync(y,{force:!0})})}n(VN,"importProcessor");async function KN(e,t){let r=e.data,a=r.appId,o=r.export.trigger,s=r.export.name,i=Y.tenancy.getTenantIDFromWorkspaceID(a);await Y.tenancy.doInTenant(i,async()=>{try{let{rev:l}=await _t.updateBackupStatus(r.docId,qt.BackupStatus.STARTED);return oy(o,i,a,{processing:t,doc:{id:r.docId,rev:l},name:s})}catch(l){Y.logging.logAlert("App backup error",l);let u=l instanceof Error?l.message:String(l);await _t.trackBackupError(a,r.docId,`Backup export failed: ${u}`)}})}n(KN,"exportProcessor");var QN=n(async e=>{zh(),await Hl(e.processing)},"init"),Bn={..._t,processing:Yl,init:QN,getBackupQueue:Ur};var sy=n(async e=>{e.backups&&await Bn.init(e.backups)},"init");var Es={};F(Es,{create:()=>BG,find:()=>FG,get:()=>LG,remove:()=>GG,update:()=>jG});var CI=xe($u()),tr=require("@budibase/backend-core");var MI=require("@budibase/types");async function LG(e){let t=tr.tenancy.getGlobalDB(),r=new tr.db.QueryBuilder(t.name,MI.SearchIndex.USER);r.setIndexBuilder(tr.db.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[o,s]of Object.entries(e.filters?.equal??{}))r.addEqual(o,s);r.setSort("_id"),r.setSkip(e.skip);let a=await r.run();return{users:a.rows,total:a.totalRows}}n(LG,"get");async function FG(e){return await tr.users.getById(e)}n(FG,"find");async function BG(e){let t=await Nt.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new tr.HTTPError("User is already synched",409);e={...t,scimInfo:(0,CI.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await Nt.save(e,{requirePassword:!1})}n(BG,"create");async function jG(e,t){return await Nt.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}n(jG,"update");async function GG(e){return await Nt.destroy(e)}n(GG,"remove");var Rs={};F(Rs,{create:()=>$G});var PI=xe($u());var kI=require("@budibase/backend-core");async function $G(e){let t=await wi(e.name),r;if(!t)r=(await kt.save(e)).id;else{if(t.scimInfo?.isSync)throw new kI.HTTPError("Group is already synched",409);r=t._id,t.users.length&&await kt.removeUsers(r,t.users.map(o=>o._id)),t.scimInfo=(0,PI.default)(t.scimInfo,e.scimInfo),await kt.save(t)}return await kt.get(r)}n($G,"create");var Fr={};F(Fr,{logRequest:()=>KG,logResponse:()=>QG});var Ut=require("@budibase/backend-core"),DI=xe(NI());var{DocWritethrough:WG}=Ut.cache.docWritethrough;function VG(){return`${Ut.db.DocumentType.SCIM_LOG}${Ut.db.SEPARATOR}${(0,DI.default)().format("YYYYMMDD")}`}n(VG,"getLogDocId");var qI=n(()=>{let e=Ut.context.getScimDBName();return new WG(Ut.db.getDB(e),VG())},"getDB");async function KG(e){Ut.logging.logWarn("SCIM request log",e);let t=Date.now().toString();return await qI().patch({[`${t}_request`]:{ts:new Date().toISOString(),...e}}),t}n(KG,"logRequest");async function QG(e,t){Ut.logging.logWarn("SCIM response",t),await qI().patch({[`${e}_response`]:{ts:new Date().toISOString(),...t}})}n(QG,"logResponse");var zu={};F(zu,{doInScimContext:()=>zG,feature:()=>Qu,internalGroupOnly:()=>t$,licenseAuth:()=>Yu,licensing:()=>UI,requireSCIM:()=>ZG,scimGroupOnly:()=>e$,scimUserOnly:()=>XG});var Sr=require("@budibase/backend-core");var Os=require("@budibase/types");var HG=n((e={checkUsersLimit:!0})=>async(t,r)=>{if((e.licensingCheck?e.licensingCheck:()=>!!t.user)(t)){if(Sr.env.SELF_HOSTED&&Sr.env.DEFAULT_LICENSE)return t.user.license=Ii,r();t.user.license=await $t.cache.getCachedLicense(),e.checkUsersLimit&&(Sr.utils.isServingApp(t)||Sr.utils.isServingBuilder(t)||Sr.utils.isServingBuilderPreview(t)||Sr.utils.isPublicApiRequest(t))&&await Qt.usageLimitIsExceeded({name:Os.StaticQuotaName.USERS,type:Os.QuotaUsageType.STATIC,usageChange:0})}return r()},"licensing"),UI=HG;var Qu={};F(Qu,{requireFeature:()=>JG,requireFeatures:()=>YG});var JG=n(e=>async(t,r)=>{await Vo(e),await r()},"requireFeature"),YG=n((...e)=>async(t,r)=>{await gl(e),await r()},"requireFeatures");var Cs=require("@budibase/backend-core");var zG=n(async(e,t)=>{let r;return Cs.env.ENABLE_SCIM_LOGGER&&(r=await Fr.logRequest({...e.request.toJSON(),body:e.request.body})),await Cs.context.doInScimContext(async()=>{let a=await t();return r&&await Fr.logResponse(r,{...e.response.toJSON(),body:e.response.body}),a})},"doInScimContext");var ZG=n(async(e,t)=>{await bl(),await t()},"requireSCIM");var LI=require("@budibase/backend-core");var XG=n(e=>Hu(LI.users.getById,e,!0),"scimUserOnly"),e$=n(e=>Hu(ve.get,e,!0),"scimGroupOnly"),t$=n(e=>Hu(ve.get,e,!1),"internalGroupOnly");function Hu(e,t,r){return async(a,o)=>{let s=a.params[t];return typeof s!="string"&&a.throw(404),!!(await e(s)).scimInfo?.isSync!==r&&a.throw(404),o()}}n(Hu,"scimSyncChecks");var Br=require("@budibase/backend-core");var Ju=require("dd-trace");async function Yu(e,t){await Ju.tracer.trace("licenseAuth",async r=>{let a=e.request.headers[Br.constants.Header.LICENSE_KEY]||Br.utils.getBearerToken(e);Array.isArray(a)&&(a=a[0]),a||e.throw(403,"License key not provided");let o=await ul(a);o||(r.addTags({licenseFound:!1}),e.throw(403,"License not found or invalid")),o.tenantId||e.throw(403,"License does not have a tenant ID"),Ju.tracer.setUser({id:"anonymous",tenantId:o.tenantId}),await Br.context.doInSelfHostTenantUsingCloud(o.tenantId,async()=>{await Br.context.doInLicenseContext(o,async()=>{await t()})})})}n(Yu,"default");var ec={};F(ec,{group:()=>Xu,user:()=>Zu});var Zu={};F(Zu,{fromScimUser:()=>s$,toScimUserResponse:()=>a$,userFilters:()=>i$});var FI=require("@budibase/backend-core"),BI=require("@budibase/shared-core"),Ms=require("@budibase/types"),jI=require("scim2-parse-filter");var{unreachable:r$}=BI.utils,a$=n(e=>{let{isSync:t,roles:r,...a}=e.scimInfo||{},o={...a,schemas:["urn:ietf:params:scim:schemas:core:2.0:User"],id:e._id,meta:{resourceType:"User",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},active:e.status===Ms.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"),n$=n(e=>!!e?.id,"isScimUserResponse");function o$(e){if(FI.utils.validEmail(e.userName))return e.userName;if(e.emails)return e.emails.find(t=>t.primary)?.value||e.emails[0]?.value}n(o$,"tryGetEmail");var s$=n(e=>{let t=n$(e)?e:void 0,r=o$(e);if(!r)throw new Error("Email is required");let a;switch(e.active){case"True":case"true":case!0:a=!0;break;case"False":case"false":case!1:a=!1;break;default:r$(e.active)}let o,s;return e.name?.givenName?(o=e.name?.givenName,s=e.name?.familyName):o=e.displayName,{tenantId:"",_id:t?.id,userId:t?.id,email:r,firstName:o,lastName:s,scimInfo:{...e,isSync:!0},roles:{},status:a?Ms.UserStatus.ACTIVE:Ms.UserStatus.INACTIVE,createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},"fromScimUser"),i$=n(e=>{let t={equal:{}},r=(0,jI.parse)(e);function a(o){switch(o.op){case"eq":{let s=o.attrPath,i;switch(s){case"emails.value":i="email";break;default:i=`scimInfo.${s}`}t.equal[i]=o.compValue;break}case"and":for(let s of o.filters)a(s);break;default:console.warn("Filter not handled",{filter:o})}}return n(a,"parseFilters"),a(r),t},"userFilters");var Xu={};F(Xu,{fromScimGroup:()=>c$,toScimGroupResponse:()=>l$});var l$=n(e=>({schemas:["urn:ietf:params:scim:schemas:core:2.0:Group"],id:e._id,externalId:e.scimInfo.externalId,meta:{resourceType:"Group",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},displayName:e.name,members:e.users?.map(t=>({value:t._id}))}),"toScimGroupResponse"),u$=n(e=>!!e?.id,"isScimGroup"),c$=n(e=>{let t=u$(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 ep={};F(ep,{LLMRequest:()=>Ve,TableGeneration:()=>Xc,agentHistoryTitleSystemPrompt:()=>WK,agentSystemPrompt:()=>$K,aiColumnSchemas:()=>zc,aiTableResponseToTableSchema:()=>Qc,appendAIColumns:()=>Hc,classifyText:()=>PK,cleanData:()=>kK,composeAutomationAgentSystemPrompt:()=>BK,composeAutomationAgentToolGuidelines:()=>jK,generateAIColumns:()=>Vc,generateAgentInstructionsPrompt:()=>DK,generateCronExpression:()=>NK,generateData:()=>Kc,generateJs:()=>FK,generateTables:()=>Wc,generationStructure:()=>Yc,normalizeContentType:()=>QK,parseResponseFormat:()=>gA,sanitiseToolName:()=>KK,searchWeb:()=>LK,sentimentAnalysis:()=>UK,summarizeText:()=>MK,tableDataStructuredOutput:()=>Zc,translate:()=>qK});var ai=require("@budibase/backend-core"),vA=require("@budibase/shared-core");var hT="vercel.ai.error",p$=Symbol.for(hT),GI,$I,M=class yT extends($I=Error,GI=p$,$I){static{n(this,"_AISDKError")}constructor({name:t,message:r,cause:a}){super(r),this[GI]=!0,this.name=t,this.cause=a}static isInstance(t){return yT.hasMarker(t,hT)}static hasMarker(t,r){let a=Symbol.for(r);return t!=null&&typeof t=="object"&&a in t&&typeof t[a]=="boolean"&&t[a]===!0}},vT="AI_APICallError",bT=`vercel.ai.error.${vT}`,d$=Symbol.for(bT),WI,VI,de=class extends(VI=M,WI=d$,VI){static{n(this,"APICallError")}constructor({message:e,url:t,requestBodyValues:r,statusCode:a,responseHeaders:o,responseBody:s,cause:i,isRetryable:l=a!=null&&(a===408||a===409||a===429||a>=500),data:u}){super({name:vT,message:e,cause:i}),this[WI]=!0,this.url=t,this.requestBodyValues=r,this.statusCode=a,this.responseHeaders=o,this.responseBody=s,this.isRetryable=l,this.data=u}static isInstance(e){return M.hasMarker(e,bT)}},wT="AI_EmptyResponseBodyError",IT=`vercel.ai.error.${wT}`,f$=Symbol.for(IT),KI,QI,TT=class extends(QI=M,KI=f$,QI){static{n(this,"EmptyResponseBodyError")}constructor({message:e="Empty response body"}={}){super({name:wT,message:e}),this[KI]=!0}static isInstance(e){return M.hasMarker(e,IT)}};function _r(e){return e==null?"unknown error":typeof e=="string"?e:e instanceof Error?e.message:JSON.stringify(e)}n(_r,"getErrorMessage");var ST="AI_InvalidArgumentError",_T=`vercel.ai.error.${ST}`,m$=Symbol.for(_T),HI,JI,xT=class extends(JI=M,HI=m$,JI){static{n(this,"InvalidArgumentError")}constructor({message:e,cause:t,argument:r}){super({name:ST,message:e,cause:t}),this[HI]=!0,this.argument=r}static isInstance(e){return M.hasMarker(e,_T)}},AT="AI_InvalidPromptError",ET=`vercel.ai.error.${AT}`,g$=Symbol.for(ET),YI,zI,jr=class extends(zI=M,YI=g$,zI){static{n(this,"InvalidPromptError")}constructor({prompt:e,message:t,cause:r}){super({name:AT,message:`Invalid prompt: ${t}`,cause:r}),this[YI]=!0,this.prompt=e}static isInstance(e){return M.hasMarker(e,ET)}},RT="AI_InvalidResponseDataError",OT=`vercel.ai.error.${RT}`,h$=Symbol.for(OT),ZI,XI,ate=class extends(XI=M,ZI=h$,XI){static{n(this,"InvalidResponseDataError")}constructor({data:e,message:t=`Invalid response data: ${JSON.stringify(e)}.`}){super({name:RT,message:t}),this[ZI]=!0,this.data=e}static isInstance(e){return M.hasMarker(e,OT)}},CT="AI_JSONParseError",MT=`vercel.ai.error.${CT}`,y$=Symbol.for(MT),eT,tT,Wn=class extends(tT=M,eT=y$,tT){static{n(this,"JSONParseError")}constructor({text:e,cause:t}){super({name:CT,message:`JSON parsing failed: Text: ${e}.
40
40
  Error message: ${_r(t)}`,cause:t}),this[eT]=!0,this.text=e}static isInstance(e){return M.hasMarker(e,MT)}},PT="AI_LoadAPIKeyError",kT=`vercel.ai.error.${PT}`,v$=Symbol.for(kT),rT,aT,nte=class extends(aT=M,rT=v$,aT){static{n(this,"LoadAPIKeyError")}constructor({message:e}){super({name:PT,message:e}),this[rT]=!0}static isInstance(e){return M.hasMarker(e,kT)}},NT="AI_LoadSettingError",DT=`vercel.ai.error.${NT}`,b$=Symbol.for(DT),nT,oT,ote=class extends(oT=M,nT=b$,oT){static{n(this,"LoadSettingError")}constructor({message:e}){super({name:NT,message:e}),this[nT]=!0}static isInstance(e){return M.hasMarker(e,DT)}},qT="AI_NoContentGeneratedError",UT=`vercel.ai.error.${qT}`,w$=Symbol.for(UT),sT,iT,ste=class extends(iT=M,sT=w$,iT){static{n(this,"NoContentGeneratedError")}constructor({message:e="No content generated."}={}){super({name:qT,message:e}),this[sT]=!0}static isInstance(e){return M.hasMarker(e,UT)}},LT="AI_NoSuchModelError",FT=`vercel.ai.error.${LT}`,I$=Symbol.for(FT),lT,uT,ite=class extends(uT=M,lT=I$,uT){static{n(this,"NoSuchModelError")}constructor({errorName:e=LT,modelId:t,modelType:r,message:a=`No such ${r}: ${t}`}){super({name:e,message:a}),this[lT]=!0,this.modelId=t,this.modelType=r}static isInstance(e){return M.hasMarker(e,FT)}},BT="AI_TooManyEmbeddingValuesForCallError",jT=`vercel.ai.error.${BT}`,T$=Symbol.for(jT),cT,pT,lte=class extends(pT=M,cT=T$,pT){static{n(this,"TooManyEmbeddingValuesForCallError")}constructor(e){super({name:BT,message:`Too many values for a single embedding call. The ${e.provider} model "${e.modelId}" can only embed up to ${e.maxEmbeddingsPerCall} values per call, but ${e.values.length} values were provided.`}),this[cT]=!0,this.provider=e.provider,this.modelId=e.modelId,this.maxEmbeddingsPerCall=e.maxEmbeddingsPerCall,this.values=e.values}static isInstance(e){return M.hasMarker(e,jT)}},GT="AI_TypeValidationError",$T=`vercel.ai.error.${GT}`,S$=Symbol.for($T),dT,fT,Lt=class tc extends(fT=M,dT=S$,fT){static{n(this,"_TypeValidationError")}constructor({value:t,cause:r,context:a}){let o="Type validation failed";if(a?.field&&(o+=` for ${a.field}`),a?.entityName||a?.entityId){o+=" (";let s=[];a.entityName&&s.push(a.entityName),a.entityId&&s.push(`id: "${a.entityId}"`),o+=s.join(", "),o+=")"}super({name:GT,message:`${o}: Value: ${JSON.stringify(t)}.
41
41
  Error message: ${_r(r)}`,cause:r}),this[dT]=!0,this.value=t,this.context=a}static isInstance(t){return M.hasMarker(t,$T)}static wrap({value:t,cause:r,context:a}){var o,s,i;return tc.isInstance(r)&&r.value===t&&((o=r.context)==null?void 0:o.field)===a?.field&&((s=r.context)==null?void 0:s.entityName)===a?.entityName&&((i=r.context)==null?void 0:i.entityId)===a?.entityId?r:new tc({value:t,cause:r,context:a})}},WT="AI_UnsupportedFunctionalityError",VT=`vercel.ai.error.${WT}`,_$=Symbol.for(VT),mT,gT,ute=class extends(gT=M,mT=_$,gT){static{n(this,"UnsupportedFunctionalityError")}constructor({functionality:e,message:t=`'${e}' functionality not supported.`}){super({name:WT,message:t}),this[mT]=!0,this.functionality=e}static isInstance(e){return M.hasMarker(e,VT)}};var qs=xe(require("zod/v4"),1),Q=require("zod/v3"),uS=require("zod/v3"),Vn=require("zod/v3");var Ps=class extends Error{static{n(this,"ParseError")}constructor(t,r){super(t),this.name="ParseError",this.type=r.type,this.field=r.field,this.value=r.value,this.line=r.line}};function rc(e){}n(rc,"noop");function KT(e){if(typeof e=="function")throw new TypeError("`callbacks` must be an object, got a function instead. Did you mean `{onEvent: fn}`?");let{onEvent:t=rc,onError:r=rc,onRetry:a=rc,onComment:o}=e,s="",i=!0,l,u="",c="";function d(w){let S=i?w.replace(/^\xEF\xBB\xBF/,""):w,[E,U]=x$(`${s}${S}`);for(let V of E)y(V);s=U,i=!1}n(d,"feed");function y(w){if(w===""){b();return}if(w.startsWith(":")){o&&o(w.slice(w.startsWith(": ")?2:1));return}let S=w.indexOf(":");if(S!==-1){let E=w.slice(0,S),U=w[S+1]===" "?2:1,V=w.slice(S+U);h(E,V,w);return}h(w,"",w)}n(y,"parseLine");function h(w,S,E){switch(w){case"event":c=S;break;case"data":u=`${u}${S}
42
42
  `;break;case"id":l=S.includes("\0")?void 0:S;break;case"retry":/^\d+$/.test(S)?a(parseInt(S,10)):r(new Ps(`Invalid \`retry\` value: "${S}"`,{type:"invalid-retry",value:S,line:E}));break;default:r(new Ps(`Unknown field "${w.length>20?`${w.slice(0,20)}\u2026`:w}"`,{type:"unknown-field",field:w,value:S,line:E}));break}}n(h,"processField");function b(){u.length>0&&t({id:l,event:c||void 0,data:u.endsWith(`
@@ -17,6 +17,7 @@ export interface ImportWorkspaceOpts {
17
17
  updateAttachmentColumns?: boolean;
18
18
  importObjStoreContents?: boolean;
19
19
  objectStoreAppId?: string;
20
+ preserveLiteLLMConfig?: boolean;
20
21
  }
21
22
  export type ExportWorkspaceFn = (devWorkspaceId: string, opts: {
22
23
  tar: boolean;
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "dist"
5
5
  ],
6
6
  "license": "UNLICENSED",
7
- "version": "3.34.8",
7
+ "version": "3.34.10",
8
8
  "description": "Budibase Pro (Backend)",
9
9
  "main": "dist/index.js",
10
10
  "types": "dist/index.d.ts",
@@ -19,7 +19,7 @@
19
19
  "@budibase/types": "*",
20
20
  "@koa/router": "15.3.0",
21
21
  "bull": "4.10.1",
22
- "dd-trace": "5.92.0",
22
+ "dd-trace": "5.56.0",
23
23
  "jsonwebtoken": "9.0.2",
24
24
  "lru-cache": "^7.14.1",
25
25
  "memorystream": "^0.3.1",
@@ -65,5 +65,5 @@
65
65
  }
66
66
  }
67
67
  },
68
- "gitHead": "b38f54cbb3f525f81e98f287b9ee080570a1b874"
68
+ "gitHead": "289b51f9ffc43fcaa3bba5f0ab953665940610c0"
69
69
  }